Better MV-ish Framework

Overview

jsblocks    Build Status

I started working on this project in 2012. React didn't exist, Angular didn't have a stable 1.0 release, Internet Explorer 7, 8, 9 was used by 35% of users worldwide, I was 20 years old. I am proud of what I did then but it was overly ambitious for a single person. The repo is now a showcase of my early skills. More about my current work here.

🤔 I am using React (if you are wondering). In my opinion it's the best UI framework by a huge margin. I believe I can call a vote as I have a lot experience on the topic.

Better MV-ish Framework

From simple user interfaces to complex single-page applications using faster, server-side rendered and easy to learn framework.

[ official website ]

Features

Getting started

Just copy and paste the code below for your first jsblocks application. Continue with the documentation and the jsblocks starter template project

<!DOCTYPE html>
<html>
  <head>
    <script src="http://jsblocks.com/blocks/0.3.2/blocks.js"></script>
    <script>
      blocks.query({
        firstName: blocks.observable()
      });
    </script>
  </head>
  <body>
    Name:
    <input data-query="val(firstName)" placeholder="Enter your name here" />
    <hr />
    <h1>Hello {{firstName}}!</h1>
  </body>
</html>

Example projects

Ask a question

Contribute


Comments
  • Travis releases

    Travis releases

    With the graphql api it's possible to fetch everything we need. The api is still early access/alpha and so has some bugs I needed to work arround and some things that don't work as smooth as I hoped. But that's okay. Because it's an alpha version some things could go wrong with a release, but nothing I shouldn't be able to fix within a few minutes. So I guess that's fine. GraphQL is nicer than normal REST APIs (previously I hit the limit of github api calls) and now it's maybe a couple dozen of calls instead of a couple hundred. I would like it to have more options to query or to set vars within an query (SQL subselect-ish) but I guess it's a start.

    Detection before it tries to publish anything:

    • checks if GIT_KEY, GIT_USER and GIT_EMAIL are set in the env.
    • checks if the package.jsons version property in the project root has been changed in the last commit.
    • checks if there is yet a release on github with the same version (prevents errorss if somehow a travis build is triggert twice for one commit).

    Github releases work fine. It tags, commits and then pushes to the repo. After that it fetches the issues, prs, build a release log and publishes it with the github release (currently via the REST api the GraphQL API can't create releases (yet)).

    With the last commit it also publishes/updates the npm package between pushing the tag&commit and publishing the release. It's not tested, but it just needs the NPM_TOKEN env var set and after switching the processes cwd to the dist/npm dir the npm-utils node module does the rest.

    Here the test github release on my jsblocks fork. And here the tavis log of the build.

    The release will be availble on:

    • github
    • bower
    • npm
    • jsdelivr (because there bot also fetches github)

    Tell me if I missed something.

    This add 3 new dev dependencies:

    1. node-fetch: just a pure-js dependency, I just like fetch more than the node-api and because it's just a small dependencie I took it
    2. npm-utils: a wrapper for the npm cli that also handles auth via env vars.
    3. nodegit: that's the heavy one, it requires a c++ 11 compiler on exotic node versions (for lts and current versions it just downloads binaries on the supported platforms). It also required me to let travis fetch a current c++ 11 stdlib, makes travis builds a little slower. If you whish we can move that dependencies to an other package.json and only install them if we need them. I also updated the nodejs version travis uses to tha last LTS, I think the last LTS is the version we should focus on and also some of the dependencies required a current release.

    I also created a JSBlocks-CI github and npm user. [edit:] These two have currently the email address: [email protected] running on my mailserver if you wish we can change that to some other address (e.g. a @jsblocks.com address) otherwise I'm fine with leaving them running on my mail-server. [/edit] Once these two have access and I added the env-vars to travis we should be ready to go.

    Tell me what you think.

    opened by Kanaye 16
  • updates in view from other frameworks

    updates in view from other frameworks

    I'm trying to combine jsblock with websockets using socket.io, however I can't figure out how to update a view from outside (from the callback of the socket) any ideas on how to get about this?

    EDIT: I forgot to include to code I'm using

    'use strict';
    var App = blocks.Application();
    
    var Message = App.Model({
        author: App.Property({
            defaultValue: 'anonymous'
        }),
        message: blocks.observable()
    });
    
    var Messages = App.Collection(Message, {
        even: blocks.observable(function () {
            return this().length % 2 == 0;
        })
    });
    
    App.View('Chat', {
    
        name: 'Wannes Gennar',
        newMessage: Message(),
    
        init: function () {
            this.socket = io('http://localhost:3000');
            this.messages = Messages();
    
            var service = this;
            console.log(service);
    
            this.socket.on('chat message', function (msg) {
                service.messages.push({
                    message: msg
                });
            });
        },
    
        addMessage: function () {
    
            this.socket.emit('chat message', { author: this.newMessage.author, message: this.newMessage.message });
            this.newMessage.reset();
        },
    
        up: function(e)
        {
            if (e.which === 13)
                this.addMessage();
        }
    });
    
    help wanted question 
    opened by dealloc 14
  • Cannot set property '$this' of undefined.

    Cannot set property '$this' of undefined.

    Found in the shopping example. Steps to reproduce:

    • open the shopping-example
    • click under "CATEGORIES" on "UNDERWEAR"
    • click under "BRANDS" on "RACH"
    • click under "CATEGORIES" on "ALL"

    I have no time to spend on this today but I can look into this later this week.

    bug 
    opened by Kanaye 11
  • Slow initial load / rendering

    Slow initial load / rendering

    My first my example app

    https://github.com/SubKit/sk-todo-app/tree/master/src/jsblocks

    the initial load and rendering time is slow. It flickers when starting. Any ideas?

    opened by MikeBild 11
  • {{expressions syntax}} does not work with the style attribute.

    {{expressions syntax}} does not work with the style attribute.

    The values doesn't seem to be interpolated in the style attribute. However, it works on other attributes (even with a misspelled stye attribute).

    <!doctype html>
    <html>
      <head>
        <script src="http://jsblocks.com/jsblocks/blocks.js"></script>
        <script>
          window.box = {};
          box.height = blocks.observable("250");
          box.width = blocks.observable("250");
          box.backgroundColor = blocks.observable("#fff");
          blocks.query(box);
        </script>
      </head>
      <body>
        Enter Height: <input type="text" data-query="val(height)" />
        Enter Width: <input type="text" data-query="val(width)" />
        Enter Background Color: <input type="text" data-query="val(backgroundColor)" />
        <h2>Height: {{height}}</h2>
        <h2>Width: {{width}}</h2>
        <h2>Background Color: {{backgroundColor}}</h2>
        <div style="background-color: {{backgroundColor}}; height: {{height}}px; width: {{width}}px;"></div>
      </body>
    </html>
    
    
    bug 
    opened by jpanganiban 10
  • Model could not accept null value. It will throw up error.

    Model could not accept null value. It will throw up error.

    Hi,

    I got this API return:

    
    json = {"id":2,"name":"Future Labs","address":null,"city":null,"state":null,"country":null,"website":null,"postal_code":null,"time_zone":null,"activated":null,"number_of_employees":null,"parent_company_id":null,"sales_rep_id":null,"customer_success_rep_id":null,"created_at":"2015-12-08T04:15:53 +0000"}
    
    

    My model:

    
    var Account = App.Model({
      id: App.Property(),
      name: App.Property(),
      address: App.Property(),
      city: App.Property(),
      state: App.Property(),
      country: App.Property(),
      postal_code: App.Property(),
      website: App.Property(),
      time_zone: App.Property(),
      activated: App.Property(),
      number_of_employees: App.Property(),
      parent_company_id: App.Property(),
      sales_rep_id: App.Property(),
      customer_success_rep_id: App.Property(),
      created_at: App.Property()
    });
    
    

    I got error of Argument mismatch for the value that contain null.

    question 
    opened by chardy 9
  • Dynamic View URL

    Dynamic View URL

    Current view query gets only one parameter, which is name of view:

    <div data-query="view('ViewName')"> </div>
    

    Which means View init function gets no parameter. What if we want to decide template URL at init? I mean what about this:

    App.View('Svg', {
      init: function (file) {
        this.options.url = 'my_img_folder/' + file + '.svg';
      }
    });
    
    <svg data-query="view('Svg', 'icon_name')" />
    

    Or any other way to decide url on init. Is it possible anyway?

    opened by mstdokumaci 8
  • Subviews how works?

    Subviews how works?

    I've trying to build an simple app, but the lack of third party examples / documentation makes it difficult, I saw that there are nested views, but how it works? I just have a simple view like:

    div(data-query="view(Campaigns)")
      //- ... some random stuff, tables, etc
      div(data-qery="view(Form)")
    

    and the js:

    App.View('Campaigns', {....});
    App.View('Campaigns', 'Form', {....});
    

    As can see there, form is a nested view, so I thought it need to be inside campaings view, but the view isn't loaded, how can I load this view, its b/c I don't want to have fat views so want to break into pieces, if not possible will try in server side with includes and all thats stuffs.

    Also I can see that the view is loaded from the server with their html, but isn't showing even when I change their url.

    PD: im using jade for templates, thats why the html is this way, but it renders ok on browser so isn't the problem there

    Regards

    bug help wanted 
    opened by norman784 7
  • strange behaviour of observable array

    strange behaviour of observable array

    var data = blocks.observable([
        {
            title : 'One',
            nested : [
                1,
                2,
                3
            ]
        },
        {
            title : 'Two',
            nested : [
                111,
                222,
                333
            ]
        }
    ]);
    
    App.View('Contact', {
      options: {
        route: '/contact',
        url: 'views/contact.html'
      },
        data : data
    });
    
    setTimeout(function () {
         // works fine
         data.add({
            title : 'Three',
            nested : [
                33,
                2,
                333123
            ]
        });
            // does not works
            data([some data with new elements]);
            data.reset([some data with new elements]);
    }, 2000);
    

    without server rendering i get on client

    Uncaught TypeError: Cannot read property 'childNodes' of undefined on 7989

    // error line
     var childNodes = domElement.childNodes;
    
    bug 
    opened by oncesk 7
  • i18n

    i18n

    Hi Antonio, thanks for this elegant framework. Can you show me a quick way to add

    • i18next
    • auth checks

    centrally without breaking antyhing?

    Regards, E.D.

    opened by derkan 7
  • The push state is not working when I press back button from my browser.

    The push state is not working when I press back button from my browser.

    Hi,

    Just want to check this: The push state is not working when I press back button from my browser. It seems like the routed function did not pick this up, but when I am on blank screen, and I refresh, it picked up and display properly. I tried many times, it has the same result when I press browser back button.

    Any mis configuration that I might miss out?

    Anyway to fix this issue?

    Thanks.

    opened by chardy 6
  • "Cannot read property 'children' of undefined" if static file have no dom

    i want to response plain string from a static file for ssl verify, however virtual ( in \node_modules\blocks\node\blocks-node.js:11829:51 ) is null if static file have no dom, its a bug or i mess something up?

    _setContents: function (contents) {
          var _this = this;
          var virtual = blocks.first(parseToVirtual(contents), function (child) {
            return VirtualElement.Is(child);
          });
          this._contents = contents;
          this._elementsById = getElementsById(virtual.children());
          findPageScripts(virtual, this._options.static, function (scripts) {
            _this._scripts = scripts;
            _this._initialized = true;
          });
        },
    
    cannot reproduce 
    opened by wlekin 1
  • How can we use asset pipeline library with jsblocks server.

    How can we use asset pipeline library with jsblocks server.

    Hi,

    Could we use this: https://github.com/adunkman/connect-assets with jsblocks server?

    Or https://github.com/nodeca/mincer ? Any other alternatives?

    Could you give me the example to do that?

    Thanks.

    question feature request 
    opened by chardy 3
  • error handling for failed ajax request with the Model/Collection functions

    error handling for failed ajax request with the Model/Collection functions

    I think jsblocks should provide an api for the user for handling failed request. I see some possible ways to register such a handler: The often in nodejs used way:

    myCollection.read(function(data, err) {
       // err here as the second argument to not break compatibility
    });
    

    Or the event way:

    myCollection.on('error' /* or maybe ajax error  */, function (err) {...});
    

    Or when creating the Model/Collection:

    var MyModel = App.Model({...}, {
        options: {
            read: {
                url: '...',
                error: function(err) {...}
            }
        }
    });
    

    What do you think ?

    enhancement 
    opened by Kanaye 4
  • Dynamically generated templates/views/components

    Dynamically generated templates/views/components

    Hi,

    I would like to make an app, that will contain a page builder (HTML builder). The user selects some module (products, gallery, slider, ...) and inserts it into the page and somehow modifies it. The problem is, that I haven't found any way to create a working template or a View at runtime. (And I don't know what modules the user will be using, so I can not predefine them.) The next thing is, that these modules should be sortable, so I will need to be able to remove a module from the page and insert it somewhere else (and obsarvables must still work). (I have not tried this yet.) Is there any way to do this with jsblocks, or could be in the near future?

    Thanks.

    help wanted 
    opened by michaljerabek 2
Releases(0.3.5)
  • 0.3.5(Feb 19, 2017)

    jsblocks release 0.3.5

    Closed issues:

    • [#74] - options query do not replace option value in some situations
    • [#86] - observable cannot survive JSON.stringify
    • [#93] - Uncaught TypeError: Cannot read property '_serverData' of undefined
    • [#104] - Blocks is inserting the wrong text in the wrong node
    • [#111] - Cannot set property '$this' of undefined.
    • [#113] - expressions not updating in nested observables
    • [#119] - each-query not updating the dom with dependency-obervable
    • [#123] - Select to map to Model with options data-query
    • [#126] - side effects of 'each' and 'options' together
    • [#129] - observable event handle not binding correctly to DOM
    • [#132] - Issues with the 'sort'-extender.

    Merged pull requests:

    • [#106] - Updating/Insetring of wrong nodes fixed. Closes #104
    • [#107] - Added toJSON to observable and tests for it.
    • [#109] - Added update function to options-query fixes #74.
    • [#110] - Moved 'View._bindContext' to src/mv/bindContext.js.
    • [#112] - Fixed some issues with template data-query.
    • [#114] - Added check if observable._expressions has current expression. Fixes #113.
    • [#115] - Fixed the serverside template-data-query I broke in a previous change.
    • [#118] - Added Blocks.middleware...
    • [#127] - Added 'null' to the valid params for the 'val'-query.
    • [#128] - Implements checkbox groups and fixes false negative select multple attribute check.
    • [#130] - Now cloning props and changed order in 'with'
    • [#133] - Fixed issues with the sort-extender described in #132.
    • [#139] - Fixed bug in observable._expressionKeys.
    • [#140] - Removed context.childs.
    • [#141] - Implemented Serverside comment query parsing.
    • [#143] - Fix #93
    • [#144] - Better support for module loaders & libaries in serverside rendering.
    • [#145] - Reverted one change from #143 that broke collections.
    • [#149] - Fixed / Implemented debug messages for "normal" methods.
    • [#150] - Debugging enhancments (custom Messages and more )
    • [#157] - Travis releases

    Commits:

    • [a12d5fd6fd] - :tada: 0.3.5
    • [9d1efefb7f] - Updated jscore to 16e21b0c4e and jsvalue to 44af1b33d8.
    • [ef8550ba04] - Merge pull request #157 from astoilkov/travis-builds
    • [8d43cb75d0] - Fixed wrong prerelease detection regex
    • [ef0ee6a487] - Added npm publish step.
    • [b6a91baf18] - Replaced (most) REST-Calls to github with GraphQL.
    • [cace01d77c] - Added dev-dependencie "github" for easy github api access.
    • [a89cd5d05a] - First steps for commit logs on the release page :)
    • [878093b591] - Fixed wrong type in params in tag creation.
    • [ec809e047a] - Even more logs for CI Builds.
    • [56b073f749] - Fixed wrong date in commits, add missing param "force" for Tag creation.
    • [e0fb0730c6] - Initial NPM publish function.
    • [3c0135aeb3] - Changed tag creation method to apply a valid creator/author to the tag.
    • [461ea16bfd] - Now checking out master before building.
    • [1cf9455284] - Added master commit detection.
    • [8ff3e918d4] - added c++ 11 toolchain (for nodegit) to travis.yml and fixed typo
    • [f5c08e9221] - Travis: Added after_success hook for testing, set node_js version to the
    • [88d67bab51] - First (git) actions for CI build releases.
    • [844cd09ad4] - Updated jscore to fcf951d
    • [1fbbb8dca0] - Fixes for nested each/option queries.
    • [f9ce47cf1e] - Implemented clone for Expression.
    • [4358bfb00e] - Implemented clone for VirtualElement.
    • [d39d6e8b14] - Updated jscore to f8ced57.
    • [5de343e452] - Observable in model prototype will now be wrapped when it's not an
    • [e87d5c0eb8] - Added blocks.executeExpression().
    • [67c32c71d1] - Whoops: Added changes I forgot to commit.
    • [0ddd24945f] - Changed behavior of not-defined properties to not be wrapped within an
    • [2082eef7ca] - Added condition to remove invalud use of view.removeAt().
    • [8c9152eef9] - Fixed bug in on query applying wrong events.
    • [cc420dca04] - Fixed "document is not defined" in node in serverData.js
    • [eee38e307c] - Added return statements to modules, previously not returning their ex…
    • [2f643c017f] - WIP: Changed build process to generate self executing closures arroun…
    • [b324a83bfa] - Fixed bug in ElementData.clear()
    • [9b6e157962] - Removed unused default value/option in node-Middleware.
    • [6002545ad0] - Changed "on"-data-query to be able to accept unlimited "args".
    • [f5ae8428e8] - Fixed misstake in refactoring.
    • [8937239035] - Changed observables attribute-update logic to use dom.attr
    • [df176f044d] - Implemented update for dependency observable arrays.
    • [4ec1c25b16] - Fixed extenders for depencie observables.
    • [1da54849ad] - Fixed sorting in chained extenders by keeping track of chages.
    • [8450a986ae] - query/ExtenderHelper Fixed positioning issue when reinserting previously
    • [2f2c57fdb1] - query/ExtenderHelper: Changed if-else-constructs to switch statements.
    • [9fe340d8e0] - Changed opertation types from strings to an "enum".
    • [05f57d2419] - query/observable: removed duplicated code
    • [69ae8d8f52] - Moved the inline script tag for the server data to a data attribute o…
    • [d5acc8a9e7] - Added escaping in VirtualComments.
    • [7e2cf5c867] - Moved escape regex to modules/Escape.
    • [cc1e93ff0f] - Added modules/Escaping with the first useful methods.
    • [310249425c] - Merge pull request #150 from Kanaye/master
    • [0b44441d91] - Added check to make sure that blocks.debug is active, ready and would
    • [cfe1c78a15] - Optimized performance of the debug build.
    • [fb75852959] - Changed the manual throwDebugMessage to the debug macro.
    • [c0115f1e20] - Implemented a aimple debug macro to throw custom debug messages.
    • [43c6ccd14f] - Now reversing the parsed debug code (defining __DEBUG_METHOD) in the
    • [10d4a4eca8] - Modified Asnyc-View-Error Message to be more clear to:
    • [335b756f05] - Added sourceURL for expressions.
    • [bccf7ba2c6] - Added custom debug messages for async view init, wrong
    • [bdcd08918f] - Added custom debug methods, kinda.
    • [8fe09d4816] - Added method throwMessage to blocks.debug which outputs a custom error
    • [5dc25a49fa] - Moved jsdebug default styles to an object.
    • [bc129d7b5b] - Added/renamed more style-names from the highlightjs update.
    • [4d6a7303b6] - Updated node-rendering dependencies (express & parse5).
    • [8d2b5b37b6] - Updated dev-dependencies.
    • [29b4ac27d2] - Merge pull request #149 from Kanaye/master
    • [c4300f419c] - Updated jscore to commit c7e46b7cd639b5d093fc8bc6eae8760a33c7ce8e.
    • [25396846aa] - Added debug types for Model and ModelInstance Fixed some jsdocs.
    • [37985958b1] - jsdebug now treats undefined as "not specified" in optional parameters.
    • [6667249870] - Some jsdoc fixes and implemented "blocks.debug.pause()" and
    • [0345b25bd3] - jsdebugs "less-args" error is now printing param-names and is not pri…
    • [0871c4bdc8] - Stopped jsdebug printing "Usage exmple" if there is no usage example for
    • [da3c09d875] - Fixed some jsdocs and parameter type missmatches inside the library.
    • [fbb8831753] - Fixed bug in checkArgs of jsdebug showing wrong error.
    • [b11a50dd68] - Mostly adding (or fixing) jsdoc param description.
    • [fd1bc32b06] - Temporary workarround in observables because jsdebug will try to unwr…
    • [7f337f7eed] - Initial fixes/impl for method-debug-messages.
    • [f0e77b8b5b] - Fixed expression in jsdebug#checkArgsTypes for non query methods.
    • [7e841841e7] - Removed unnecessary method (stub?) for adding images.
    • [4373827383] - Merge pull request #144 from Kanaye/master
    • [2ecd5673a6] - Merge pull request #145 from Kanaye/collection-fix
    • [703f0d7c2d] - Reverted one change from #143 that broke collections.
    • [5e844b5fcf] - Better support for module loaders & libaries in serverside rendering.
    • [dddbd0a5c3] - Merge pull request #143 from Kanaye/fix-#93
    • [a3099edb3b] - Implemented clone for App and View.
    • [4adedb5e85] - Updated lib/blocks/core.js to version in astoilkov/jscore#3.
    • [bb5b85c6de] - Merge pull request #141 from Kanaye/serverside-comment-expressions
    • [a6acd83c63] - Merge pull request #140 from Kanaye/bug-#111
    • [7127ed36e0] - Implemented Serverside comment query parsing.
    • [085ee01f85] - Removed context.childs.
    • [c17f2627d4] - Merge pull request #139 from Kanaye/bug#138
    • [fae22bbac5] - Fixed bug in observable._expressionKeys.
    • [8e602c324b] - Merge pull request #133 from Kanaye/fix-#132
    • [19a4bd3ec7] - Fixed some bugs in the sort-extender.
    • [36e9e5cdb3] - Added bind to sort-extender.
    • [4c4ccbc126] - Merge pull request #130 from Kanaye/bug-#129
    • [f0488a4d07] - Now cloning props and changed order in 'with'
    • [b72e8cc484] - Merge pull request #128 from Kanaye/bug-#123
    • [547d934379] - Implementation of checkbox groups.
    • [acf58c9bf7] - Multi-Selects 'val' now work when only 'multiple' is written.
    • [5156b16fc4] - Merge pull request #127 from Kanaye/issue#122
    • [6b9fd4510e] - Added 'null' to the valid params for the 'val'-query.
    • [1123d4f6ef] - Merge pull request #118 from Kanaye/blocks.middleware
    • [54b6ecc851] - Added baseTag and options.
    • [2af9161c4d] - Added baseUrl to Router for blocks.middleware()
    • [cdc74eaa68] - Added blocks.middleware.
    • [9bd1f1d7df] - Merge pull request #115 from Kanaye/template-fix-v2
    • [ac8190dd22] - Merge pull request #114 from Kanaye/bug-#113
    • [55d9a335a6] - Fixed missing condition and .rawValue from a previous change on serve…
    • [c72c83b9a7] - Added check if observable._expressions has current expression and add…
    • [6e967969d2] - Merge pull request #112 from Kanaye/template-query-fixes
    • [c14b0999d0] - Added test for finding correct script in template query.
    • [90db83bedc] - Modified node-override of temlate-query for passDetailValues also fixed
    • [dfe269b1d3] - Added 'parameterName' in DomQuery.executeMethods.
    • [107b09cdd4] - Merge pull request #109 from Kanaye/bug-#74
    • [1fce71c0b4] - Removed unnecessary update-call.
    • [d2c786d80c] - Added Tests for new options behaviour.
    • [a43764d6f1] - Fixed bug in new Expression.NodeWise rendering.
    • [0339a968c6] - Added update function to options-query.
    • [487eb803bd] - observable.update now not subscribes.
    • [43a3fc6ee4] - Added observable._getValue().
    • [ba2a9aac9e] - Added call to observable.update().
    • [25ed83b44c] - Fixed attributes not get synced in some cases.
    • [7d0e448d14] - Merge pull request #110 from Kanaye/master
    • [852a3ca3ea] - Moved 'View._bindContext' to src/mv/bindContext.js.
    • [90163bdd73] - Merge pull request #106 from Kanaye/VE-sync-ffixes
    • [cb5f88622c] - update wrong refs
    • [6fdcd4e67f] - update ref to jsblocks
    • [3a003642ec] - Fixed bad typo in new implementation.
    • [1d484566b7] - Cleaned up unnecessary stuff of originaly planed implementation.
    • [1f736b4c2f] - add a ref to link
    • [6a5890c14f] - add Caret to README
    • [743bea5fe8] - Merge pull request #107 from Kanaye/observable-to-json
    • [d34d60d845] - Added toJSON to observable and tests for it.
    • [0ba643e68b] - Added tests.
    • [1ebe48e276] - Updating/Insetring of wrong nodes fixed. Closes #104.
    • [c552b7d204] - 0.3.4 release
    Source code(tar.gz)
    Source code(zip)
  • 0.3.4(Oct 16, 2015)

  • 0.3.3(Jul 20, 2015)

  • 0.3.2(May 26, 2015)

  • 0.3.1(May 12, 2015)

    • Performance improvements and fixes
    • Server-side rendering improvements and fixes
    • DataSource class refactoring
    • Couple of small fixes and little improvements
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Apr 24, 2015)

Owner
Antonio Stoilkov
Trying to do high-quality open-source work
Antonio Stoilkov
The worlds smallest fully-responsive css framework

FLUIDITY A fully responsive css framework that is impossibly small HTML is almost 100% responsive out of the box. This stylesheet patches the remainin

murmurs 1.1k Sep 24, 2022
An HTML5/CSS3 framework used at SAPO for fast and efficient website design and prototyping

Welcome to Ink Ink is an interface kit for quick development of web interfaces, simple to use and expand on. It uses a combination of HTML, CSS and Ja

SAPO 1.9k Dec 15, 2022
🌟 DataFormsJS 🌟 A minimal JavaScript Framework and standalone React and Web Components for rapid development of high quality websites and single page applications.

?? Welcome to DataFormsJS! Thanks for visiting! ?? ?? ?? ?? ?? ?? 中文 (简体) 欢迎来到 DataFormsJS Español Bienvenido a DataFormsJS Português (do Brasil) Bem

DataFormsJS 156 Dec 8, 2022
HTML Framework that allows you not to write JavaScript code.

EHTML (or Extended HTML) can be described as a set of custom elements that you can put on HTML page for different purposes and use cases. The main ide

Guseyn Ismayylov 171 Dec 29, 2022
One framework. Mobile & desktop.

Angular - One framework. Mobile & desktop. Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScr

Angular 85.7k Jan 4, 2023
Ember.js - A JavaScript framework for creating ambitious web applications

Ember.js is a JavaScript framework that greatly reduces the time, effort and resources needed to build any web application. It is focused on making yo

Ember.js 22.4k Jan 8, 2023
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Supporting Vue.js Vue.js is an MIT-licensed open source project with its ongoing development made possible entirely by the support of these awesome ba

vuejs 201.7k Jan 8, 2023
The tiny framework for building hypertext applications.

Hyperapp The tiny framework for building hypertext applications. Do more with less—We have minimized the concepts you need to learn to get stuff done.

Jorge Bucaran 18.9k Jan 4, 2023
A framework for building native apps with React.

React Native Learn once, write anywhere: Build mobile apps with React. Getting Started · Learn the Basics · Showcase · Contribute · Community · Suppor

Facebook 106.8k Jan 3, 2023
The Backbone Framework

Marionette.js The Backbone Framework Marionette v5 Marionette is dropping its dependency on Backbone. That library is available here: https://github.c

Marionette.js 7.1k Jan 5, 2023
MVC framework making it easy to write realtime, collaborative applications that run in both Node.js and browsers

Derby The Derby MVC framework makes it easy to write realtime, collaborative applications that run in both Node.js and browsers. Derby includes a powe

DerbyJS 4.7k Dec 31, 2022
A JavaScript Framework for Building Brilliant Applications

mithril.js What is Mithril? Installation Documentation Getting Help Contributing What is Mithril? A modern client-side JavaScript framework for buildi

null 13.5k Dec 26, 2022
A framework for real-time applications and REST APIs with JavaScript and TypeScript

A framework for real-time applications and REST APIs with JavaScript and TypeScript Feathers is a lightweight web-framework for creating real-time app

Feathers 14.2k Dec 28, 2022
A rugged, minimal framework for composing JavaScript behavior in your markup.

Alpine.js Alpine.js offers you the reactive and declarative nature of big frameworks like Vue or React at a much lower cost. You get to keep your DOM,

Alpine.js 22.5k Dec 30, 2022
The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.

Bootstrap Sleek, intuitive, and powerful front-end framework for faster and easier web development. Explore Bootstrap docs » Report bug · Request feat

Bootstrap 161.1k Jan 4, 2023
Semantic is a UI component framework based around useful principles from natural language.

Semantic UI Semantic is a UI framework designed for theming. Key Features 50+ UI elements 3000 + CSS variables 3 Levels of variable inheritance (simil

Semantic Org 50.3k Jan 3, 2023
Materialize, a CSS Framework based on Material Design

MaterializeCSS Materialize, a CSS Framework based on material design. -- Browse the docs -- Table of Contents Quickstart Documentation Supported Brows

Alvin Wang 38.8k Dec 28, 2022
A no-dependency, intuitive web framework from scratch in Javascript

Poseidon ?? Intro Poseidon is, to use a nice description by Reef, an anti-framework. It's a a no-dependency, component-based Javascript framework for

Amir Bolous 45 Nov 14, 2022
An open-source, self-hosted, low-code framework to build internal tools, web apps, admin panels, BI dashboards, workflows, and CRUD apps with YAML or JSON.

An open-source, self-hosted, low-code framework to build internal tools, web apps, admin panels, BI dashboards, workflows, and CRUD apps with YAML or JSON.

Lowdefy 2k Jan 4, 2023