From 5c864197a501ce1b96fddc5ede07764c99271fb5 Mon Sep 17 00:00:00 2001 From: Vladimir Kosmala Date: Wed, 31 Jan 2018 16:29:37 +0100 Subject: [PATCH] Improved docs --- README.md | 26 +++++-- css/README.md | 27 -------- {js/docs => docs}/API.md | 0 docs/architecture.jpeg | Bin 0 -> 98429 bytes {js/docs => docs}/firefox-modules.md | 0 .../concepts => docs/guides}/components.md | 2 +- docs/guides/debug.md | 9 +++ {js/docs/concepts => docs/guides}/keys.md | 2 +- docs/guides/reactive-programming.md | 24 ++++++- docs/guides/scale-app.md | 65 +++++++++++++++++- {js/docs/concepts => docs/guides}/vnodes.md | 0 {css/docs => docs}/showroom.html | 2 +- .../tutorials}/hello-world.html | 2 +- .../tutorials}/hello-world.md | 4 +- docs/tutorials/pasta-timer.md | 2 +- js/README.md | 64 ----------------- js/docs/README.md | 16 ----- 17 files changed, 122 insertions(+), 123 deletions(-) delete mode 100644 css/README.md rename {js/docs => docs}/API.md (100%) create mode 100644 docs/architecture.jpeg rename {js/docs => docs}/firefox-modules.md (100%) rename {js/docs/concepts => docs/guides}/components.md (97%) create mode 100644 docs/guides/debug.md rename {js/docs/concepts => docs/guides}/keys.md (98%) rename {js/docs/concepts => docs/guides}/vnodes.md (100%) rename {css/docs => docs}/showroom.html (99%) rename {js/docs/introduction => docs/tutorials}/hello-world.html (91%) rename {js/docs/introduction => docs/tutorials}/hello-world.md (95%) delete mode 100644 js/README.md delete mode 100644 js/docs/README.md diff --git a/README.md b/README.md index 97f0fc8..812e2cc 100644 --- a/README.md +++ b/README.md @@ -46,27 +46,39 @@ mount(document.body, view, new Model()); The reference is split in half: CSS and JS. -- [CSS for designing a web page or application](./css) -- [JS for a dynamic web application](./js) +- [CSS showroom](https://vladimirkosmala.github.io/FrontEndKit/docs/showroom.html) +- [JS API](./docs/API.md) +- [Javascript ES6 and the DOM API](https://developer.mozilla.org) ### Tutorials -Create mini applications step by step with explanations. +Create mini applications with explanations. -- Wikipedia API + Interface -- [Pasta Timer using CSS + JS](./docs/tutorials/pasta-timer.md) +- [Hello World - quick start copy/paste](./docs/tutorials/hello-world.md) +- [Pasta Timer - step by step](./docs/tutorials/pasta-timer.md) ### Guides - [Async calls (ajax)](./docs/guides/async-calls.md) - [Scale the code of your application (architecture)](./docs/guides/scale-app.md) -- [From imperative to reactive programming (jQuery to React)](./docs/guides/reactive-programming.md) +- [Write DOM with Javascript without HTML](./docs/guides/reactive-programming.md) +- [What are hyperscript and virtual nodes](./docs/guides/vnodes.md) +- [Handle sorted list with keys](./docs/guides/keys.md) +- [Reuse parts of a view as Components](./docs/guides/components.md) +- [Debugging with the inspector](./docs/guides/debug.md) ### Compatibility - Chrome 62 (end 2017) -- Firefox 54 (end 2017 - [must activate modules](./js/docs/firefox-modules.md)) +- Firefox 54 (end 2017 - [must activate modules](./docs/firefox-modules.md)) - EDGE 16 (end 2017) - Safari 10.1 (2017) - iOS Safari (2017) - Chrome Android 62 + +* https://caniuse.com/#feat=es6-module +* https://caniuse.com/#feat=template-literals +* https://caniuse.com/#feat=es6-class +* https://caniuse.com/#feat=arrow-functions +* https://caniuse.com/#feat=promises +* https://caniuse.com/#feat=async-functions diff --git a/css/README.md b/css/README.md deleted file mode 100644 index 109078f..0000000 --- a/css/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# FrontEndKit CSS - -This CSS Kit contains reusable tools and components to create a web page or a web application. - -The API is inspired of Bootstrap Twitter and Foundation but with desktop/tablet in mind with a focus on the 80% most used functionalities to keep the API small and maintainable for years. - -[Demo showroom](https://vladimirkosmala.github.io/FrontEndKit/css/docs/showroom.html) - -### Usage - -Not published on NPM yet. Just copy the CSS file in your public folder. - -```html - -``` - -### Compatibility - -It was made with "recent browsers" in mind, starting from EDGE. - -### Documentation - -```bash -cd FrontEndKit -node serve-folder.js -open http://localhost:9000/css/docs/showroom.html -``` diff --git a/js/docs/API.md b/docs/API.md similarity index 100% rename from js/docs/API.md rename to docs/API.md diff --git a/docs/architecture.jpeg b/docs/architecture.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b0a3201bda0533dc3fc07cd945bc2cc2dfbd5e81 GIT binary patch literal 98429 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¢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 CWX=Zw literal 0 HcmV?d00001 diff --git a/js/docs/firefox-modules.md b/docs/firefox-modules.md similarity index 100% rename from js/docs/firefox-modules.md rename to docs/firefox-modules.md diff --git a/js/docs/concepts/components.md b/docs/guides/components.md similarity index 97% rename from js/docs/concepts/components.md rename to docs/guides/components.md index 8eb603c..9b4dc75 100644 --- a/js/docs/concepts/components.md +++ b/docs/guides/components.md @@ -1,4 +1,4 @@ -# Components +# Guide - Components Components are pieces of UI like a menu, a form, etc. Thanks to Hyperscript a component is a pure function which returns a vnode tree. diff --git a/docs/guides/debug.md b/docs/guides/debug.md new file mode 100644 index 0000000..171a896 --- /dev/null +++ b/docs/guides/debug.md @@ -0,0 +1,9 @@ +# Guide - Debugging with the inspector + +A good tool will always help you for good work. In the web development, the inspector is the right choice. It is included in most browsers and accessible by a right-click. + +The two most useful tabs are *Console* and *Network*. The first one allows you to communicate with the Javascript engine of the current page, for example to manipulate a model or view its data. The second one allows you to check all files loaded with their status and all calls to the server (ajax and websocket). + +When things get wrong, the script stops and the error is shown in the *Console*. Click on it to show the source code with the associated error. You can also force the third tab *Source code* to be shown at some point by inserting the statement `debugger;` inside your Javascript code. You wil then be able to see the stack and values. + +Finally, a fourth tab *Element* or *DOM* shown the DOM tree of the current page. You can see with it if the view is renderer as expected but also modify it on the fly to see what happens before coding it in your code. For example you can see if a layout is well by changing a class element or directly the CSS values of the page. diff --git a/js/docs/concepts/keys.md b/docs/guides/keys.md similarity index 98% rename from js/docs/concepts/keys.md rename to docs/guides/keys.md index 374a5ec..02ef70c 100644 --- a/js/docs/concepts/keys.md +++ b/docs/guides/keys.md @@ -1,4 +1,4 @@ -# Keys +# Guide - Keys When a list is re-ordered, the `key attribute` allows the engine to recognize the items and to sort them rather than destroying it. diff --git a/docs/guides/reactive-programming.md b/docs/guides/reactive-programming.md index 8c0d02f..84f0ba4 100644 --- a/docs/guides/reactive-programming.md +++ b/docs/guides/reactive-programming.md @@ -1 +1,23 @@ -# Guide +# Guide - Write DOM with Javascript without HTML + +The foundamental part of a browser is the view, it is defined by the *DOM* and *HTML* is the langage to express it. + +The DOM can be manipulated with Javascript like this: + +```js +const div = document.createElement('div'); +div.textContent = 'Hello'; +document.body.append(div); +``` + +This way, you can build everything you want for the user to interact with it, it uses the imperative programming paradigm. But in a large application this can leads to inconsistencies because a human is in charge of synchronizing the data model with the view by removing, updating and inserting DOM elements. This was done like this for years within the area of jQuery. + +More recently in the area of AngularJS and ReactJS, a new paradigm has been used, the declarative programming. The principal is to *declare* the view depending on the data model, just like a function. For one input, we always have one view output. The magic is done by a diff algorithm which will take care of the updates of the DOM according to the new "view output" generated by your declared view. Let's take a simple example: + +```js +h('div', model.name) +``` + +This declare the equivalent of `
Hello
` with `model.name = 'Hello'`. When we modify the name attribute, the `h` function will produce a new view because the argument has changed. In the background the div element will *not be recreated but updated*. + +This way of declaring the DOM is called Hyperscript, more information in [this guide](./vnodes.md). diff --git a/docs/guides/scale-app.md b/docs/guides/scale-app.md index 8c0d02f..24eb0a6 100644 --- a/docs/guides/scale-app.md +++ b/docs/guides/scale-app.md @@ -1 +1,64 @@ -# Guide +# Guide - How to scale and architecture + +### Files + +In the tutorials you can see a single model and a single view. But a large application cannot be made as a large file. A good way is to split the code into module like this: + +``` +- user (folder, camelCase) + - User.js (model, PascalCase) + - userList.js (view, camelCase) + - userItem.js (view, camelCase) + - userAvatar.js (view, camelCase) + - user.css (facultative style, camelCase) +``` + +This allows you to have everything concerning a module in the same place. You can have as many modules as you want. At some point you can ever create a super-module as a folder for some parts of your application. + +For common things like a `header.js` or `alert.js`, a `common` folder can be made. + +### View + +Inside the view files, avoid to have a big function containing all your page. Try to split in smaller functions and pass the model as parameter each time. + +```js +export function userList(model) { + return h('ul', model.user.list.map(user => userListRow(model, user))); +} + +function userListRow(model, user) { + return h('li', user.name); +} +``` + +### Model + +The `Observable` model can be, like the view, a tree and all notification event can be bubbled to the root model like this: + +```js +class Model extends Observable { + constructor() { + super(); + this.submodel = new SubModel(); + this.submodel.bubbleTo(this); + } +} + +class SubModel extends Observable { + constructor() { + super(); + this.count = 0; + } + + increment() { + this.count++; + this.notify(); + } +} + +const model = new Model(); +``` + +When a call to `model.submodel.increment()` is made, `model` will be notified and will call all callbacks registered via `model.observe(callbackFunction)`. + +[Global view of the architecture](../architecture.jpeg) diff --git a/js/docs/concepts/vnodes.md b/docs/guides/vnodes.md similarity index 100% rename from js/docs/concepts/vnodes.md rename to docs/guides/vnodes.md diff --git a/css/docs/showroom.html b/docs/showroom.html similarity index 99% rename from css/docs/showroom.html rename to docs/showroom.html index 1347f83..3c461fe 100644 --- a/css/docs/showroom.html +++ b/docs/showroom.html @@ -1,6 +1,6 @@ Alice Bootstrap Gui - +
diff --git a/js/docs/introduction/hello-world.html b/docs/tutorials/hello-world.html similarity index 91% rename from js/docs/introduction/hello-world.html rename to docs/tutorials/hello-world.html index ea99083..f9ed968 100644 --- a/js/docs/introduction/hello-world.html +++ b/docs/tutorials/hello-world.html @@ -3,7 +3,7 @@ -``` - -### Compatibility - -It was made with "recent browsers" in mind, Firefox could not work (ES6 modules). See the following links: - -* https://caniuse.com/#feat=es6-module -* https://caniuse.com/#feat=template-literals -* https://caniuse.com/#feat=es6-class -* https://caniuse.com/#feat=arrow-functions -* https://caniuse.com/#feat=promises -* https://caniuse.com/#feat=async-functions - -### Documentation - -See the [docs folder](./docs). diff --git a/js/docs/README.md b/js/docs/README.md deleted file mode 100644 index 3bdb240..0000000 --- a/js/docs/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Documentation - -We assume here that you know Javascript ES6 and the DOM API. Particularly Javascript modules, arrow functions, template strings and classes. - -This library relies mainly on this tools which are well documented, just Google it if you find something tricky. - -### Introduction - -* [Hello World](introduction/hello-world.md) -* [API](API.md) - -### Concepts - -* [Virtual Nodes](concepts/vnodes.md) -* [Keys](concepts/keys.md) -* [Components](concepts/components.md)