๐ŸŒŸ DataFormsJS ๐ŸŒŸ A minimal JavaScript Framework and standalone React and Web Components for rapid development of high quality websites and single page applications.

Overview

๐ŸŒŸ Welcome to DataFormsJS!

Thanks for visiting! ๐ŸŒ  ๐Ÿ‘

๐ŸŒ   ๐ŸŒŽ   ๐ŸŒ   ๐ŸŒ
ไธญๆ–‡ (็ฎ€ไฝ“) ๆฌข่ฟŽๆฅๅˆฐ DataFormsJS
Espaรฑol Bienvenido a DataFormsJS
Portuguรชs (do Brasil) Bem vindo ao DataFormsJS
ๆ—ฅๆœฌ่ชž DataFormsJSใธใ‚ˆใ†ใ“ใ

DataFormsJS is a JavaScript Framework and Standalone React and Web Components. DataFormsJS is small in size, easy to learn, designed for fast development, and to make for a great experience for both developers and end-users. DataFormsJS was first published in November of 2019 however was written and used over many years and is extremely stable containing a large number of unit tests.

This repository contains DataFormsJSโ€™s Framework, Example Pages, and Unit Tests. The main website exists on another repository.

๐Ÿ’ซ Why use DataFormsJS?

Faster Development Small Size Easy to Learn
Faster Development Display data from Web and GraphQL Services using only HTML Markup and define App and Site features using HTML Attributes. Small Size All files are small in size and downloaded only when used allowing for greater performance and a smaller site. Easy to Learn DataFormsJS is built around HTML, CSS, JavaScript, Templating and has a minimal JavaScript and HTML API so you can get started immediately.
Stability Flexibility Better Sites
Stability Designed for long term use; a site developed with DataFormsJS today will work great and be easy to maintain decades from now. Flexibility Works well with other code and the API is designed for flexibility and custom features. If you can think it, you can build it with DataFormsJS. Better Sites DataFormsJS is designed to be a great experience for both developers and end users allowing you to create better sites.
Works with React
React
Vue
Vue
Handlebars
Handlebars
GraphQL
GraphQL
Preact
Preact
and more!
Learn something new!
Web Components
Web Components

๐Ÿš€ Getting Started

Getting started with DataFormsJS is extremely easy.

Install from npm, this option works great if you are using create-react-app or want a copy of all files locally:

npm install dataformsjs

Download this Repository. Itโ€™s small to download because this repository has no dependencies and loads HandlebarsJS, Vue, and React from a CDN. To view example pages locally Node needs to be installed and then you can start the local server using:

npm start

The start screen allows you to quickly filter and view many different examples and resources.

DataFormsJS npm start page

JavaScript files for the Framework and standalone React and Web Components exist under the js directory. Full Directory Structure:

dataformsjs
โ”œโ”€โ”€ docs
โ”œโ”€โ”€ examples
โ”‚   โ”œโ”€โ”€ *.htm
โ”‚   โ””โ”€โ”€ server.js
โ””โ”€โ”€ js
โ”‚   โ”œโ”€โ”€ DataFormsJS.js
โ”‚   โ”œโ”€โ”€ react\*.js
โ”‚   โ”œโ”€โ”€ web-components\*.js
โ”‚   โ””โ”€โ”€ *\*.js
โ”œโ”€โ”€ scripts\*.js
โ”œโ”€โ”€ server\app.js
โ””โ”€โ”€ test
    โ”œโ”€โ”€ *.htm
    โ””โ”€โ”€ server.js

Develop online using the code playground: https://www.dataformsjs.com/en/playground

Code Playground

Download a template file using scripts from a CDN: https://www.dataformsjs.com/en/getting-started

Getting Started Templates

๐Ÿ“„ Example Code - Vue with DataFormsJS Framework

This example uses Vue for templating. If you save it with a text editor you can view it locally in your browser. Additionally the main site contains many templates and examples. DataFormsJS works with both Vue 2 and Vue 3.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>DataFormsJS Example using Vue</title>
    </head>
    <body>
        <header>
            <nav>
                <a href="#/">Home</a>
                <a href="#/data">Data Example</a>
            </nav>
        </header>

        <main id="view"></main>

        <template data-route="/">
            <h1>Hello World!</h1>
        </template>

        <template id="loading-screen">
            <h2>Loading...</h2>
        </template>

        <script
            type="text/x-template"
            data-engine="vue"
            data-route="/data"
            data-page="jsonData"
            data-url="https://www.dataformsjs.com/data/geonames/countries"
            data-load-only-once
            data-lazy-load="jsonData, flags"
            data-countries>

            <h2 v-if="isLoading" class="loading">Loading...</h2>
            <h2 v-if="hasError" class="error">{{ errorMessage }}</h2>
            <div v-if="isLoaded">
                <h1>Countries</h1>
                <ul>
                    <li v-for="country in countries">
                        <i v-bind:class="country.iso.toLowerCase() + ' flag'"></i>
                        <span>{{ country.country }}<span>
                    </li>
                </ul>
            </div>
        </script>

        <!-- Vue 2 -->
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>

        <!-- Vue 3 -->
        <!-- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js"></script> -->

        <!-- DataFormsJS -->
        <script src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/DataFormsJS.min.js"></script>
        <script>
            app.lazyLoad = {
                jsonData: 'https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/pages/jsonData.min.js',
                flags: 'https://cdn.jsdelivr.net/npm/[email protected]/flag.min.css',
            };
            app.settings.lazyTemplateSelector = '#loading-screen';
        </script>
    </body>
</html>

๐Ÿ“„ Example Code - React

This example uses React with the jsxLoader.min.js script for converting JSX to JS directly in the browser and it includes DataFormsJS React Components from DataFormsJS.min.js. If you copy the contents of this code it will also work in a browser. All React Components are also compatible with Preact when using jsxLoader.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>DataFormsJS Example using React</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/flag.min.css">
    </head>
    <body>
        <div id="root"></div>

        <script type="text/babel">
            function ShowLoading() {
                return <div className="loading">Loading...</div>;
            }

            function ShowError(props) {
                return <div className="error">{props.error}</div>;
            }

            function ShowCountries(props) {
                return (
                    <React.Fragment>
                        <h1>Countries</h1>
                        <ul>
                            {props.data && props.data.countries && props.data.countries.map(country => {
                                return (
                                    <li key={country.iso}>
                                        <i className={country.iso.toLowerCase() + ' flag'}></i>
                                        <span>{country.country}</span>
                                    </li>
                                )
                            })}
                        </ul>
                    </React.Fragment>
                )
            }

            class App extends React.Component {
                render() {
                    return (
                        <ErrorBoundary>
                            <JsonData
                                url="https://www.dataformsjs.com/data/geonames/countries"
                                isLoading={<ShowLoading />}
                                hasError={<ShowError />}
                                isLoaded={<ShowCountries />}
                                loadOnlyOnce={true} />
                        </ErrorBoundary>
                    )
                }
            }

            ReactDOM.render(
                <App />,
                document.getElementById('root')
            );
        </script>

        <script crossorigin="anonymous" src="https://unpkg.com/[email protected]/umd/react.production.min.js"></script>
        <script crossorigin="anonymous" src="https://unpkg.com/[email protected]/umd/react-dom.production.min.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/react/jsxLoader.min.js"></script>
        <script type="module" src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/react/es6/DataFormsJS.min.js"></script>
        <script nomodule src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/react/es5/DataFormsJS.min.js"></script>
    </body>
</html>

When working with node or webpack you will typically import Libraries using an import statement:

// Use React Hooks
import React, { useState, useReducer } from 'react';

// Use React Router
import {
  BrowserRouter as Router,
  Route,
  Link,
  NavLink
} from "react-router-dom";

// Use Redux
import { createStore } from 'redux'
import { Provider, connect } from 'react-redux';

When working with the jsxLoader and compiling JSX directly in a browser the recommend method for importing is to simply reference the global classes or functions of the libraries that you need for your app:

// Use React Hooks
const useState = React.useState;
const useReducer = React.useReducer;

// Use React Router
const Router = ReactRouterDOM.HashRouter;
const Route = ReactRouterDOM.Route;
const NavLink = ReactRouterDOM.NavLink;
const Link = ReactRouterDOM.Link;

// Use Redux
const Provider = ReactRedux.Provider;
const connect = ReactRedux.connect;
const createStore = Redux.createStore;

Many examples exist for popular React Libraries using jsxLoader at the following site:

https://awesome-web-react.js.org/

Awesome Web React

๐Ÿ“„ Example Code - Web Components

This example uses DataFormsJS Web Components. Web Components are well defined standard and provide for functionally similar to JavaScript Frameworks while using less JavaScript code.

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>DataFormsJS Example using Web Components</title>
    </head>
    <body>
        <header>
            <nav>
                <a href="#/">Home</a>
                <a href="#/data">Data Example</a>
            </nav>
        </header>

        <main id="view"></main>

        <template id="loading-screen">
            <h2>Loading...</h2>
        </template>

        <!--
            <url-router> and <url-route> will be used to define #hash routes
        -->
        <url-router view-selector="#view" loading-template-selector="#loading-screen">
            <!-- Home Page -->
            <url-route path="/">
                <template>
                    <h1>Hello World!</h1>
                </template>
            </url-route>

            <!--
                Display a list of Countries from a JSON Service. Elements
                with [data-bind] are populated with data from the Web Service.

                [lazy-load] is used along with `window.lazyLoad` near the bottom
                of this file to dynamically load scripts only if they will be used.
            -->
            <url-route path="/data" lazy-load="json_data, data_list, flags">
                <template>
                    <json-data url="https://www.dataformsjs.com/data/geonames/countries">
                        <is-loading>
                            <div>Loading...</div>
                        </is-loading>
                        <has-error>
                            <div data-bind="errorMessage"></div>
                        </has-error>
                        <is-loaded>
                            <data-list
                                data-bind="countries"
                                template-selector="#country"
                                root-element="ul">
                            </data-list>
                        </is-loaded>
                    </json-data>
                </template>
            </url-route>
        </url-router>

        <!--
            Template for <data-list> using Template literals (Template strings)
        -->
        <template id="country">
            <li>
                <i class="${iso.toLowerCase() + ' flag'}"></i>
                <span>${country}<span>
            </li>
        </template>

        <!-- DataFormsJS Web Components -->
        <script type="module" src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/web-components/url-router.min.js"></script>
        <script nomodule src="https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/web-components/polyfill.min.js"></script>
        <script>
            window.lazyLoad = {
                json_data: { module: 'https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/web-components/json-data.min.js' },
                data_list: { module: 'https://cdn.jsdelivr.net/npm/dataformsjs@latest/js/web-components/data-list.min.js' },
                flags: 'https://cdn.jsdelivr.net/npm/[email protected]/flag.min.css',
            };
        </script>
    </body>
</html>

๐Ÿค Contributing

All contributions are welcome. For major changes including breaking changes to existing code or updating existing graphics and files, please open an issue first to discuss what you would like to change. Some examples of items to contribute:

  • Typos and Grammar Mistakes - If you see any please fix and submit.
  • Documentation and Tutorials. Currently most documentation is in the quick reference section and code comments so a lot of documentation will be needed and written over time.
  • Many more examples will be developed in the future. If you have ideas please submit.
  • Additional Unit Tests and Testing Methods - Core Framework files and features are Unit Tested however every line of code should be Unit Tested in all files. Currently there is are no Unit Tests for Vue, React, and Web Components.
  • Additional Scripts, React Components, Web Components, and Features.
  • New Ideas - If you have ideas on how to improve then please open an issue to discuss.

The docs/to-do-list.txt file contains the full list of items that are currently pending and is good place to start.

โ“ FAQ

Why was DataFormsJS Created?

Initial development and use of DataFormsJS occurred privately in 2013 to allow for rapid development of high quality and bug free Single Page Applications (SPA). DataFormsJS was designed to have a small size, great performance, and to be much faster for development compared to other Frameworks. A few of the reasons for fast development include displaying JSON services using only Markup and Templating (Handlebars, Underscore, etc.) and defining App and Site features using HTML attributes and small JavaScript Plugins.

Early versions of DataFormsJS were used a number of companies in many different types of apps.

Now that both React and Vue have become very popular separate React Components have been developed to help with React Development and the Framework has been expanded to support Vue. Additionally separate Web Components have been developed to allow for similar functionality in modern browsers without using a JavaScript framework.

Why did it take so long to release?

The author of DataFormsJS had a number of busy jobs at the time and was also working on another large project at the same time FastSitePHP.

How large is DataFormsJS?

All sizes are based on minified scripts and gzip compression from the web server.

  • DataFormsJS Framework โ€“ 10.8 kB (149 kB full version uncompressed)

  • Additional files (controllers, plugins, etc) are typically only 1-3 kB each.

  • In general when using the Framework expect about 15 kB for the initial page load, and then several kB for additional pages that load extra plugins, pages, controllers, etc.

  • React JSX Loader โ€“ 6.2 kB (86 kB full version uncompressed)

  • React (Core Components) โ€“ 5.7 kB

  • Individual React Components are between 3 and 12 kB when uncompressed and including comments.

  • Web Components are typically around 1 to 3 kB each, typically you will use a number of components so in the example apps this adds up to about 15 kB for each app.

While the DataFormsJS Framework is small it will generally be used with a larger Templating or View Engine:

  • React: ~ 40 kB
  • Handlebars: ~ 22 kB
  • Vue 2: ~ 33 kB
  • Vue 3: ~ 40 kB
  • Underscore: ~ 6 kB
  • Nunjucks - ~ 25 kB

Additionally in a complex or large site third-party code is expected to account for the largest amount of JavaScript. For example CodeMirror Text Editor used on the Playground site is around 250 kB, however DataFormsJS has the ability to download third-party code only when it will be needed based on the URL.

How do I use the JSX Loader for React?

See the main document: https://github.com/dataformsjs/dataformsjs/blob/master/docs/jsx-loader.md

What are the future plans for DataFormsJS?

DataFormsJS is here for the long run and will be developed indefinitely with new features, components, examples, docs, etc. While DataFormsJS is a Framework it also includes standalone web components which can be used without the Framework. Over time many additional framework plugins and web components will be developed.

DataFormsJS will continue to be developed in a manner that allows for web based development (for example: the playground site) and will be kept small in size loading scripts only when needed.

What does the logo represent and where is the source?

DataFormsJS

The main DataFormsJS logo is a drawing of a hash symbol in a URL and it uses colors from the main DataFormsJS website. The logo was chosen because the DataFormsJS Framework was originally created for Single Page Applications (SPA).

๐Ÿ“ License

This project is licensed under the MIT License - see the LICENSE file for details.

Comments
  • Add an API to JSX Loader

    Add an API to JSX Loader

    Hello!

    What an incredible product you have here. I know forms are a pain to produce, and this will help.

    What caught my eye more than anything is the jsxLoader.

    I really like it and would love to use it to make react-styleguidist faster.

    • Do you think it could be made into a separate npm package?
    • Do you think one could ask for a specific pragma to package the jsx?
      • for mercurial it's mercurial.h, for vue simply h
    • Most importantly, do you think that this transformation could be done without running the code?

    I was thinking of an api like this

    import { transform } from '@dataformjs/jsx-loader'
    
    const desugarizedCode = transform('<Comp>hello mama</Comp>', {pragma: 'h'})
    console.log(desugarizedCode)
    // "h(Comp, , ['hello mama'])"
    
    opened by elevatebart 17
  • Can not debug when using jsx loader

    Can not debug when using jsx loader

    Hi @ConradSollitt,

    First of all thank you so much for building this awesome 20k library (babel standalone 2m) so developing react app without built tools is a breeze, highly appreciated!!!

    I noticed a difference that the react jsx(or js) file was not shown in chrome dev tools when using jsx loader instead of babel, so debugging is not possible. See attached screenshots. jsxloader babel

    This is the test project to reproduce this issue. Clone the project, run npm install, and test the two links in chrome:

    • JSX loader: http://localhost:3000/index.html
    • Babel standalone: http://localhost:3000/index-babel.html

    Thanks again for your great work, look forward to your response. :-)

    Best, Yang

    opened by yangzhaox 8
  • remove hashtag from url?

    remove hashtag from url?

    if i have root url / then /data for data page. in example, i need to move to #/data instead of /data. is it possible to remove it? i think spa can have pretty url without hashtag

    opened by sprabowo 7
  • wrong compile result in jsx

    wrong compile result in jsx

    source

    const Ob = (props) => {
    
      return <div>{props.r()}</div>
    }
    
    const App = () => {
      return <h2>
        hello
        <Ob r={() => {
          return <h1>zzzz</h1>
        }}/>
      </h2>
    }
    
    ReactDOM.render(
      <App/>,
      document.getElementById('root')
    );
    

    output:

    "use strict";
    const Ob = (props) => {
    
      return React.createElement("div", null, props.r())
    }
    
    const App = () => {
      return React.createElement("h2", null, "hello\r\n    ", 
                React.createElement(Ob, {r: true},    // =================> why ?
                    React.createElement("h1", null, "zzzz")))
    }
    
    ReactDOM.render(
      React.createElement(App, null),
      document.getElementById('root')
    );
    
    opened by ilovedesert001 5
  • jsxLoader: Uncaught SyntaxError: Unexpected token ','

    jsxLoader: Uncaught SyntaxError: Unexpected token ','

    <html>
      <head>
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/js/react/jsxLoader.js"></script>
        <script src="https://unpkg.com/[email protected]/umd/react.production.min.js"></script>
      </head>
      <body>
        <script data-type="module" type="text/babel">
          console.log(
            <div>
              <div />
              {[].map(() => <div />)}
            </div>
          );
        </script>
      </body>
    </html>
    

    gives error

    lovejoy.html:5 Uncaught SyntaxError: Unexpected token ','
        at addToPage (jsxLoader.js:389)
        at jsxLoader.js:396
        at new Promise (<anonymous>)
        at Object.loadScript (jsxLoader.js:393)
        at Object.setup (jsxLoader.js:273)
        at HTMLDocument.<anonymous> (jsxLoader.js:1715)
    addToPage @ jsxLoader.js:389
    (anonymous) @ jsxLoader.js:396
    loadScript @ jsxLoader.js:393
    setup @ jsxLoader.js:273
    (anonymous) @ jsxLoader.js:1715
    
    opened by nifgraup 3
  • jsxLoader: Less than operator assumed to be an open element

    jsxLoader: Less than operator assumed to be an open element

    <html>
      <head>
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/js/react/jsxLoader.min.js"></script>
      </head>
    <body>
        <script type="text/babel" data-type="module">
          const n = 2;
          1<n;
        </script>
      </body>
    </html>
    
    jsxLoader.min.js:5 Error: The number of opening elements (for example: "<div>") does not match the number closing elements ("</div>").
        at Object.parser (jsxLoader.min.js:5)
        at Object.compile (jsxLoader.min.js:5)
        at r (jsxLoader.min.js:5)
        at jsxLoader.min.js:5
        at new Promise (<anonymous>)
        at Object.loadScript (jsxLoader.min.js:5)
        at Object.setup (jsxLoader.min.js:5)
        at HTMLDocument.<anonymous> (jsxLoader.min.js:5)
    r @ jsxLoader.min.js:5
    (anonymous) @ jsxLoader.min.js:5
    loadScript @ jsxLoader.min.js:5
    setup @ jsxLoader.min.js:5
    (anonymous) @ jsxLoader.min.js:5
    

    Perhaps it's best to skip this test altogether?

    opened by nifgraup 3
  • Add Support for Vue 3

    Add Support for Vue 3

    DataFormsJS currently only works with Vue 2 and not yet the beta version of Vue 3. This is now in active development but not yet fully working. Once DataFormsJS supports both Vue 2 and Vue 3 then changes will be published to npm and CDN's.

    If you would like to help with this feel free to ask questions here. No build process is needed and using browser DevTools is recommended as the main DataFormsJS framework is in a single JS file and Vue 3 downloads to a single un-minimized file as well.

    Since Vue 3 is still in beta there is no timeline for this but hopefully it will be ready soon.

    Currently all affected code has TODO comments.

    Vue 3 (Beta) https://github.com/vuejs/vue-next

    DataFormsJS Fork for Vue 3 Development Once ready this will be sent via pull request to the main project (or files will simply be copied) https://github.com/ConradSollitt/dataformsjs

    Example of changes needed https://github.com/ConradSollitt/dataformsjs/commit/c4e45592b8f7916c46724230244564d82cc5718c

    enhancement help wanted 
    opened by ConradSollitt 2
Releases(5.14.1)
  • 5.14.1(Dec 7, 2022)

    • Fixed a bug in Web Component <json-data> that was introduced on the previous build where format.{func} was not working in [data-show] attributes.
    Source code(tar.gz)
    Source code(zip)
  • 5.14.0(Nov 28, 2022)

    • Added ability to use HTML Attribute [data-format] from Web Component <url-router> when using attribute [url-param]. The same functionality when using Web Component <json-data> with attribute [data-bind] is provided.
      • This includes using data-format="number|date|dateTime|time|{function}" and custom functions.
      • js/web-components/url-router.js https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/url-router.js
    • Updated Image Gallery Controls/Components:
      • Fixed issue where pinch-to-zoom on mobile devices would cause previous/next image navigation to occur.
      • js/web-components/image-gallery.js https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/image-gallery.js
      • js/plugins/imageGallery.js https://github.com/dataformsjs/dataformsjs/blob/master/js/plugins/imageGallery.js
      • js/react/es6/ImageGallery.js https://github.com/dataformsjs/dataformsjs/blob/master/js/react/es6/ImageGallery.js
    Source code(tar.gz)
    Source code(zip)
  • 5.13.1(May 2, 2022)

    • Update Code Comments on React Component <JsonData>
      • Previously @license was included in the main comment which resulted in Vite including about 5 kB (uncompressed) and about 1.5 kB of extra code on the build process.
      • Comments were updated so that they are not included on build resulting in smaller files.
    • Update Framework, React, and Web Components for Date/Time formatting:
      • Update for en-US to use format {date} {time} instead of {date}, {time} because most people in the US (and software programs) do not use the comma while Chrome uses the comma.
    Source code(tar.gz)
    Source code(zip)
  • 5.13.0(Feb 25, 2022)

    • DataFormsJS App Object
      • ~/js/DataFormsJS.js
      • New Feature - Pass HTML Attributes as Properties to HTML Controls
        • This is similar in concept to passing props with React or Vue and allows easy and quick customization of content in the HTML control.
      • Update - When manually calling app.refreshHtmlControl() nested HTML controls are now rendered
      • Fix typo in error message
      • Example of the new features is being published on the Handlebars Places Demo:
        • https://dataformsjs.com/examples/places-demo-hbs.htm
        • All pages with Excel and CSV export pass prop to a HTML Control
        • Search Screen renders nested HTML control when app.refreshHtmlControl() is called from the JS Control <json-data>
    • Web Components - Component Class
      • ~/js/web-components/Component.js
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/Component.js
      • Update so that props defined with camelCase will be available as dashed-case from HTML Observable Attributes
      • Update HTML Observable Attributes to convert strings to correct type for true, false, null and empty values
      • Example is being published with the Web Components Places Demo:
        • https://www.dataformsjs.com/examples/places-demo-web.htm
    • Framework Plugins - Excel and CSV Export
      • ~/js/plugins/exportToCsv.js
      • ~/js/plugins/exportToExcel.js
      • Add support so that elements using the plugin are refreshed when app.refreshHtmlControl() is called.
      • Minor fix handled by using onRendered(rootElement) instead of onRendered().
      • For Excel text columns were the the max character width is less than 20 an extra 2 pixels of space will be added so content better fits.
    • I18N update
      • Framework Plugin ~/js/plugins/i18n.js
      • Web Component ~/js/web-components/i18n-service.js
      • Added ability to find and replace i18n keys inside of an attribute string by using syntax [[key]]
        • Example data-export-file-name="[[Countries]].xlsx" data-i18n-attr="data-export-file-name"
        • Previously both Countries and Countries.xlsx would have had to be defined for each language
        • Now only Countries has to be defined
        • For Vue apps this applies to the v-i18n-attr directive
    Source code(tar.gz)
    Source code(zip)
  • 5.12.1(Feb 19, 2022)

    • Excel Export (Web Component and Framework Plugin)
      • Default data-worksheet-name to data-export-file-name excluding file extension .xlsx if the attribute is not included
      • Trim spaces for text fields
      • Set header style (gray fill color, bold, etc) only on the cells used rather than the entire row
    • CSV Export (Web Component and Framework Plugin)
      • Trim spaces for text fields
    Source code(tar.gz)
    Source code(zip)
  • 5.12.0(Feb 16, 2022)

    • Add Excel Export functionality
      • Web Component:
        • ~/js/web-components/export-to-excel-service.js
        • https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/export-to-excel-service.js
      • Framework Plugin:
        • ~/js/plugins/exportToExcel.js
        • https://github.com/dataformsjs/dataformsjs/blob/master/js/plugins/exportToExcel.js
      • Both Web Component and Framework Plugin have the same behavior
      • Exports happen directly in the browser through JavaScript and no server-side calls are made which makes the export/download appear almost instantly to the user.
      • The script uses the external library ExcelJS and the first time the user exports an Excel file this service will download ExcelJS from a CDN. The generated Excel file contains a fixed header row using a gray and bold style and a filter set. The width of columns is based on the data. ExcelJS has many formatting options so if you need something similar or a custom version of this script then this file provides a good starting point for custom Excel Development.
      • https://github.com/exceljs/exceljs/
    • Update CSV Export to export only visible rows by default
      • A new HTML attribute [data-export-all] was added to always export all rows regardless of filter.
    • Add and updated Examples for this:
      • Log Demos
        • https://dataformsjs.com/examples/log-table-vue.htm#/10
        • And all other Log demos
      • New Export Table Demo - Web Components
        • https://dataformsjs.com/examples/export-table-web.htm
        • ~/examples/export-table-web.htm
        • https://github.com/dataformsjs/dataformsjs/blob/master/examples/export-table-web.htm
      • New Export Table Demo - Framework
        • https://dataformsjs.com/examples/export-table-js.htm
        • ~/examples/export-table-js.htm
        • https://github.com/dataformsjs/dataformsjs/blob/master/examples/export-table-js.htm
    • Updated Framework dataBind plugin to bind global window.* variables for a basic webpage if not using SPA
    • Updated Framework Control data-table to not show an error when an empty table is displayed without data-bind
    Source code(tar.gz)
    Source code(zip)
  • 5.11.0(Feb 9, 2022)

    • Updated DataFormsJS Framework to support JavaScript classes
      • Originally the DataFormsJS Framework was designed and developed prior to ES6 being supported among Web Browsers. Because of this custom app code was designed around ES5. This update allows for custom app code (Pages and Plugins) to use classes rather than objects which allows for modern style JavaScript development.
      • Functions updated and added for the main App object:
        • https://github.com/dataformsjs/dataformsjs/blob/master/js/DataFormsJS.js
        • app.addPage()
        • app.addPlugin()
        • app.getClassFunctionNames() - New function
      • Bug fix with Chosen Plugin for IE
        • https://github.com/dataformsjs/dataformsjs/blob/master/js/plugins/chosen.js
      • New class version of the core jsonData page object:
        • js/pages/classes/JsonData.js
        • All variables and functions from the original file exist in the new one. The purpose of the new file is so that an app can extend it for custom page logic when defining pages as ES6 classes rather than ES5 objects.
      • Replaces all occurrences of String.prototype.substr() with String.prototype.substring(). IDE's such as VS Code show substr() as depreciated because it is a non-standard function.
      • Updated package.json to use the latest and specific versions of @babel/standalone, terser, and uglify-js for the build process. This makes the build process work across systems as expected.
      // Framework updates to support Classes
      
      app.addPage('name', class Page {
          onRouteLoad() {}
          onBeforeRender() {}
          onRendered() {}
          onRouteUnload() {}
      })
      
      app.addPlugin('name', class Plugin {
          onRouteLoad() {}
          onBeforeRender() {}
          onRendered() {}
          onRouteUnload() {}
      })
      
      class MyPage extends JsonData {
          onRendered() {
              console.log('MyPage.onRendered()')
          }
      }
      app.addPage('MyPage', MyPage);
      
    Source code(tar.gz)
    Source code(zip)
  • 5.10.6(Jan 7, 2022)

    • Updated jsxLoader to for additional JSX syntax from issues 20 and 21.
      • jsxLoader: Less than operator assumed to be an open element - https://github.com/dataformsjs/dataformsjs/issues/20
      • jsxLoader: Uncaught SyntaxError: Unexpected token ',' - https://github.com/dataformsjs/dataformsjs/issues/21
      • Special Thanks to Bjรถrgvin Ragnarsson (nifgraup) for opening these issues and providing great examples to show the error https://github.com/nifgraup
    Source code(tar.gz)
    Source code(zip)
  • 5.10.5(Nov 13, 2021)

    • Updates for DataFormsJS Markdown Components
      • All 3 versions updated:
        • Web Component <markdown-content>
        • Framework Control <markdown-content>
        • React Component <Markdown>
      • Add support for marked version 4.# which was released earlier this month. Previously version 3 was supported.
      • Both versions 3 and 4 are now supported.
    Source code(tar.gz)
    Source code(zip)
  • 5.10.4(Sep 30, 2021)

    • No code changes however two .DS_Store where accidentally published to npm so this release excludes them
      • These are Mac system files created automatically by finder when viewing a folder
      • They are excluded from Github using rules from .gitignore, however npm published them
      • In general these files cause no issues but they are binary files so malicious authors can use them for attacks which is why they do not belong in npm or git
    Source code(tar.gz)
    Source code(zip)
  • 5.10.3(Sep 28, 2021)

    • Updated jsxLoader to support functions that return JSX elements inside of props.
      • This is related to https://github.com/dataformsjs/dataformsjs/issues/19
      • Special Thanks to ilovedesert001 for opening this issue and providing a great example and for helping with testing https://github.com/ilovedesert001
    Source code(tar.gz)
    Source code(zip)
  • 5.10.2(Sep 25, 2021)

    • Updated <json-data> Web Component
      • Added HTML Attribute manual-fetch-mode, that if defined on an element prevents the web service from running when the page first loads. This allows for scenarios where one user may need to see the data and another user may not based on permissions. When this attribute is defined the fetch() method can be used to download the data.
      <json-data url="..." manual-fetch-mode>
      
      document.querySelector('json-data[manual-fetch-mode]').fetch()
      
    Source code(tar.gz)
    Source code(zip)
  • 5.10.1(Sep 4, 2021)

    • Updated the new Animation Service and Plugin to include an optional property for specifying intersectionRatio *
      <animation-service intersection-ratio="0.3"></animation-service>
      
      <script>
        // Framework Plugin Property
        app.plugins.animation.intersectionRatio = 0.3
      </script>
      
    Source code(tar.gz)
    Source code(zip)
  • 5.10.0(Sep 3, 2021)

    • Added new sourceMaps property to jsxLoader
      • This allows for easier debugging from Browser DevTools. This has been tested and confirmed to work with recent versions of Chrome/Edge, Firefox, and Safari.
      • Requires isSupportedBrowser set to false so that Babel Standalone is used as the compiler.
      • Example usage:
      jsxLoader.isSupportedBrowser = false;
      jsxLoader.sourceMaps = true;
      
      • This is related to issue https://github.com/dataformsjs/dataformsjs/issues/18
      • Special Thanks to Yang Zhao for opening this issue https://github.com/yangzhaox This issue helped improved how debugging works with the JSX Loader
    • Added Animation Plugin and Web Component
      • js/plugins/animation.js https://github.com/dataformsjs/dataformsjs/blob/master/js/plugins/animation.js
      • js/web-components/animation-service.js https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/animation-service.js
      • js/web-components/animation-service.css https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/animation-service.css
    Source code(tar.gz)
    Source code(zip)
  • 5.9.1(Aug 6, 2021)

    • Web Component <json-data>
      • Updated logic related to the HTML onready event attribute to only run JavaScript code if the <json-data> is still connected to the page when the web service completes.
      • For SPA if the user clicks of the page on a long running task then fetch will still be running but the element will not longer be connected.
      • This would result in an error being shown to the user if an expected element or other item is missing from the page.
      • In the example below if the user clicked of the page quickly an error alert would be displayed by default, this update prevents the code from running so the end user has a better and expected experience.
        <json-data onready="() => { document.getElementById('element1').textContent = document.getElementById('element2').textContent; }"
      
    Source code(tar.gz)
    Source code(zip)
  • 5.9.0(Jun 6, 2021)

    • Added a Generic base Component class for Web Components that extends HTMLElement
      • js/web-components/Component.js
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/Component.js
      • This class can be used to speed development of custom Web Components by reducing the amount of code needed to create components.
      • https://www.dataformsjs.com/examples/custom-web-components.htm
    Source code(tar.gz)
    Source code(zip)
  • 5.8.1(Apr 29, 2021)

    • Update <data-list> Web Component to clear innerHTML when an empty list is passed to the value property.
      • This matches the intended behavior for applications and matches the Framework JavaScript <data-list> Control
      • An example of when this would happen is on a search screen. If the previous search returned data and the next search returns an error then both error and past data would show. This fixes the issue.
    • Update functions format.date(), format.dateTime(), format.time() to handle null or empty strings
      • Update affects related code for all version:
        • Web Components: js/web-components/utils-format.js
        • React Class: js/react/es6/Format.js
        • Framework: js/extensions/format.js
      • Example of the issue
        • If Web Component <data-table> or other templating code called <td>${format.date(startDate)}</td> and startDate was null then the value 12/31/1969 would be displayed because it's the starting Unix time.
        • The previous work-around was to use logic in the templating code like this: <td>${startDate === null ? '' : format.date(startDate)}</td>
    Source code(tar.gz)
    Source code(zip)
  • 5.8.0(Mar 25, 2021)

    • JSX Loader Updates
      • Improvements for Legacy Browsers (IE, UC Browser, Legacy Edge, etc)
        • Add default support for destructuring assignment using spread operator, previously this was available but required extra config. This is commonly used with reducers (both Redux and native React Hooks).
        • Updated version of @babel/standalone from 7.12.9 to 7.12.12. At the time of release Babel is update to version 7.13.12 however builds starting at 7.12.13 have a broken regex for IE
      • Add support for <hr/>. With previous releases <hr/> caused a compiler error while including the space <hr /> worked.
    • DataFormsJS Framework app
      • Updated CDN Version for css-vars-ponyfill from 2.4.2 to 2.4.3 and added support for CSS Ponyfill/Polyfill on inline <style> elements that include the attribute data-css-vars-ponyfill
    • Added Class CssVars for React
      • Allows for ability to define CSS Variable Polyfill/Ponyfill automatically for older browsers.
      • Previously some of the examples had custom code included directly on each page to make this happen.
      • Now a [data-css-vars-ponyfill] attribute simply needs to be included on the style sheet, example:
      <link rel="stylesheet" href="css/site.css" data-css-vars-ponyfill>
      
      • Then call CssVars.ponyfill() from JavaScript
      • This class is available in the root DataFormsJS React Namespace
      • When used this automatically downloads and runs css-vars-ponyfill one time when the page is first loaded.
      • https://github.com/jhildenbiddle/css-vars-ponyfill
      • As of 2021 this will mostly used on sites that support IE 11. Unless a very old version of Mobile Safari or Android Device is used they will typically support CSS Variables.
    Source code(tar.gz)
    Source code(zip)
  • 5.7.1(Mar 6, 2021)

    • Updated Framework filter.js Plugin to handle sort.js classes data-sort-class-odd and data-sort-class-even when using table column filters (typically for a click to filter event). Previously the classes were handled for general table filters.
    Source code(tar.gz)
    Source code(zip)
  • 5.7.0(Feb 3, 2021)

    • Added Features to <data-table> Web Component and Framework Control
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/data-table.js
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/controls/data-table.js
      • Added support for Footer templates when using new attribute data-footer with either <template data-footer> or <script type="text/x-template" data-footer>
      • A <tfoot> element will be rendered and it allows for summary functions to report off of table details:
        • count()
        • sum('field')
        • min('field')
        • max('field')
        • avg('field')
      • Try demo http://127.0.0.1:8080/web-components-data-table and view source https://github.com/dataformsjs/dataformsjs/blob/master/examples/web-components-data-table.htm
    • Added format.round(number, decimalPlaces), function added for Web Components, Framework, and React Class:
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/web-components/utils-format.js
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/extensions/format.js
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/react/es6/Format.js
    • React <JsonData> Component
      • Added new property childProps which can be used to pass props from a higher level component to the child components in the isLoaded property. This can be used to pass hook functions and data needed by the child component that doesn't come from the Web Service.
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/react/es6/JsonData.js
    • Updated app.jsTemplate.compile() to support an array for the first parameter.
      • This was added for new features related to <data-table>
      • https://github.com/dataformsjs/dataformsjs/blob/master/js/extensions/jsTemplate.js
    Source code(tar.gz)
    Source code(zip)
  • 5.6.1(Jan 5, 2021)

    5.6.1 (January 4, 2021)

    • Fix to load CSS Variable Polyfill/Ponyfill from Web Components polyfill.js for basic Web Pages when not SPA

    5.6.0 (January 4, 2021)

    • Web Components
      • Added new Web Components based on Framework Plugins
        • <export-to-csv-service> based on js/plugins/exportToCsv.js
        • <highlighter-service> based on js/plugins/highlighter.js
        • <filter-service> based on js/plugins/filter.js. This service Web Component would be used instead of <input is="input-filter"> for apps that use clickable elements to filter and other advanced functionality not included in the smaller input-filter Component.
        • Example for all new Components is provided in http://127.0.0.1:8080/log-table-web-services#/10
      • Updated <nav is="spa-links"> to include new option [data-nav-match="start"]
      • Bug Fix for function setElementText() from file js/web-components/utils.js
        • Elements input, select, textarea were having the innerText set rather than the value property to to a string compare error
        • Affected <json-data> for [data-bind] and <url-router> for [url-param]
    • Framework Updates
      • Added ability to define CSS Variable Polyfill/Ponyfill automatically for older browsers.
        • Previously the main site and a number of examples had custom code included directly on each page to make this happen.
        • Now a [data-css-vars-ponyfill] attribute simply needs to be included on the style sheet, example:
        <link rel="stylesheet" href="css/site.css" data-css-vars-ponyfill>
        
        • When used this automatically downloads and runs css-vars-ponyfill one time when the page is first loaded.
        • https://github.com/jhildenbiddle/css-vars-ponyfill
        • As of 2021 this will mostly used on sites that support IE 11. Unless a very old version of Mobile Safari or Android Device is used they will typically support CSS Variables.
        • This feature includes new a function app.cssVarsPonyfill() and a new property app.settings.cssPonyfillUrl
      • js/plugins/exportToCsv.js - Added support to export using [data-value] attributes if they exist. data-value is used for Sorting and if used contains the expected number or date format needed for exporting.
      • Updated js/plugins/navLinks.js to include new option [data-nav-match="start"]
    • Set enumerable: true for the version property. Affects two files:
      • Main DataFormsJS.js file
      • React jsxLoader.js file
    Source code(tar.gz)
    Source code(zip)
  • 5.5.0(Dec 13, 2020)

    5.5.0 (December 13, 2020)

    • Web Component <json-data>
      • Added setter properties for url and urlParams. Previously only getters were defined and this resulted in the Component not working with Preact.
      • With this release DataFormsJS Web Components now work with Preact in addition to React
      • Demo:
        • https://www.dataformsjs.com/examples/web-components-with-preact.htm
    • Started including version property for two files:
      • Main DataFormsJS.js file
      • React jsxLoader.js file
      • The version property is updated automatically from scripts/build.js using the value from package.json when the version changes. Version is included in the full source DataFormsJS.js, jsxLoader.js and in the *.min.js files.
      // Framework
      DataFormsJS.version === '5.5.0'
      app.version === '5.5.0'
      
      // JSX Loader
      jsxLoader.version === '5.5.0'
      
    • JSX Loader
      • Added default fetch options for fetching JSX Templates
      • To use different options set this as soon as the script is loaded and before the document DOMContentLoaded event runs.
      • The default options provide for flexibility with 'cors', prevention of caching issues with 'no-store', and security by using 'same-origin' for credentials.
      // New default options
      jsxLoader.fetchOptions = {
        mode: 'cors',
        cache: 'no-store',
        credentials: 'same-origin',
      };
      
      // Previously `null` was used for `fetch(url, null)` so the following
      // can be used if needed or `fetchOptions` can be customized for apps
      // that need to use security to fetch JSX Templates:
      jsxLoader.fetchOptions = null;
      
    • React Components
      • Updated the ES5 build for all React Components so that the compiled code from Babel is enclosed in Immediately Invoked Function Expressions (IIFE) and only needed Component and Classes are assigned to the global window object.
      • The resulting code is slightly smaller for each Component and variables intended for private module scope are no longer made available globally.
    Source code(tar.gz)
    Source code(zip)
  • 5.4.1(Dec 10, 2020)

    • Web Component <markdown-content>
      • Fix so that loading screen shows when using url, show-source, loading-selector attributes together.
      • DOM event order would trigger the loading screen to clear when using show-source while content from url was still being downloaded.
      • Example Code:
      <markdown-content
        url="https://raw.githubusercontent.com/dataformsjs/dataformsjs/master/README.md"
        show-source
        loading-selector="#loading-screen">
      </markdown-content>
      
      • Online basic example:
        • https://dataformsjs.com/examples/markdown-web.htm
    Source code(tar.gz)
    Source code(zip)
  • 5.4.0(Dec 4, 2020)

    • React jsxLoader
      • Added support for data-type="module" on scripts. This feature was added on Babel Standalone 7.10.0
        • See Babel Standalone Docs: https://babeljs.io/docs/en/babel-standalone
      • Updated Babel Standalone CDN Version used for old browsers from 7.12.6 to the latest version 7.12.9.
    • Updated all NPM Dev Dependencies to use latest version for Build and Minification
    Source code(tar.gz)
    Source code(zip)
  • 5.3.1(Dec 3, 2020)

    • Web Component <input is="input-filter"> could previously run too soon for long running web services when the content was waiting on data downloaded from <json-data>. The result was 0 Records Found message depending on the app. This has now been fixed.
    • Web Component Polyfill File now sets window.usingWebComponentsPolyfill = true as soon as the file will be used. This allows for apps to handle logic much quicker when DOMContentLoaded is handled.
    • Framework Control <markdown-content> has an added value property to match the API of the related Web Component.
    Source code(tar.gz)
    Source code(zip)
  • v5.3.0(Nov 24, 2020)

    There have been a total of 56 versions of DataFormsJS published on npm since it was first published a little over a year ago: https://www.npmjs.com/package/dataformsjs

    However starting today with release 5.3.0 each version will also be published with a Github release.

    Details of all past releases are documented in the CHANGELOG: https://github.com/dataformsjs/dataformsjs/blob/master/CHANGELOG.md

    Source code(tar.gz)
    Source code(zip)
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
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
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 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
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
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
JavaScript UI library for data-driven web applications

Road to 2.0 The master branch has new, in-progress version of w2ui. You might want to consider 1.5 branch that is stable and supports older browsers.

Vitali Malinouski 2.4k Jan 3, 2023
A JavaScript implementation of SOM, a minimal Smalltalk for teaching and research.

ohm-som A JavaScript implementation of SOM, a minimal Smalltalk for teaching and research. Just a hobby, won't be big and professional like TruffleSOM

Patrick Dubroy 16 Jun 25, 2021
โš›๏ธ Fast 3kB React alternative with the same modern API. Components & Virtual DOM.

Fast 3kB alternative to React with the same modern API. All the power of Virtual DOM components, without the overhead: Familiar React API & patterns:

Preact 33.5k Dec 31, 2022
Plain functions for a more functional Deku approach to creating stateless React components, with functional goodies such as compose, memoize, etc... for free.

"Keo" is the Vietnamese translation for glue. Plain functions for a more functional Deku approach to creating stateless React components, with functio

Adam Timberlake 225 Sep 24, 2022
Super minimal MVC library

Espresso.js Espresso.js is a tiny MVC library inspired by Backbone and React with a focus on simplicity and speed. We've aimed to bring the ideas of u

TechLayer 534 Dec 11, 2022
Blazing fast Apple TV application development using pure JavaScript

atvjs Blazing fast Apple TV application development using pure JavaScript. Philosophy What's included Getting Started Basic Examples Creating Pages Ad

Emad Alam 292 Dec 14, 2022
Lightweight MVC library for building JavaScript applications

Spine Spine is a lightweight MVC library for building JavaScript web applications. Spine gives you structure and then gets out of your way, allowing y

Spine JS Project 3.6k Jan 4, 2023
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
๐Ÿ–– 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
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
Brail is a framework built on NextJS for developing email templates in React, and returning HTML that is compatible with major email clients.

Brail is a framework built on NextJS for developing email templates in React, and returning HTML that is compatible with major email clients. It aims to seperate the concerns of generating the emails and delivering them.

null 121 Jan 2, 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
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