@webqit/webflo 0.11.7 → 0.11.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +153 -25
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@ Ok, we've put all of that up for a straight read!
|
|
|
22
22
|
+ [Webflo Applications](#webflo-applications)
|
|
23
23
|
+ [Workflow API](#workflow-api)
|
|
24
24
|
+ [Webflo Config](#webflo-config)
|
|
25
|
+
+ [Technology Stack](#technology-stack)
|
|
25
26
|
+ [Getting Started](#getting-started)
|
|
26
27
|
+ [Getting Involved](#getting-involved)
|
|
27
28
|
|
|
@@ -137,9 +138,9 @@ For when your application involves routing:
|
|
|
137
138
|
For when your application involves pages and a UI:
|
|
138
139
|
+ [The HTML Standard](https://html.spec.whatwg.org/) is held for all things *markup* - across client, server, and Service Worker environments! Webflo is all about using conventional `.html`-based pages and templates, valid HTML syntax, etc. You are able to get away with a "zero-JavaScript" proposition, or a *Progressive Enhancement* proposition that makes do with "just-enough JavaScript"!
|
|
139
140
|
|
|
140
|
-
> Your markup is also easily extendable with [OOHTML](
|
|
141
|
+
> Your markup is also easily extendable with [OOHTML](#oohtml) - a set of new features for HTML that makes it fun to hand-author your UI! Within OOHTML are [HTML Modules](https://github.com/webqit/oohtml#html-modules) and [HTML Imports](https://github.com/webqit/oohtml#html-imports), [Reactive Scripts](https://github.com/webqit/oohtml#subscript) and more!
|
|
141
142
|
|
|
142
|
-
+ [WHATWG DOM](https://dom.spec.whatwg.org/) is universally available - not only on the client-side, but also on the server-side via [OOHTML-SSR](
|
|
143
|
+
+ [WHATWG DOM](https://dom.spec.whatwg.org/) is universally available - not only on the client-side, but also on the server-side via [OOHTML-SSR](#oohtml-ssr) - for all things *dynamic pages*: rendering, manipulation, interactivity, etc.
|
|
143
144
|
|
|
144
145
|
> Your DOM is also easily enrichable with [Custom Elements](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements), plus [Subscript Elements](https://github.com/webqit/oohtml#subscript) and [The State API](https://github.com/webqit/oohtml#state-api) from OOHTML.
|
|
145
146
|
|
|
@@ -249,7 +250,10 @@ export default function(event, context, next) {
|
|
|
249
250
|
}
|
|
250
251
|
```
|
|
251
252
|
|
|
252
|
-
|
|
253
|
+
> **Note**
|
|
254
|
+
> <br>Other [*method*](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)-specific function names may be used: `get`, `post`, `put`, `patch`, `del` (for *delete*), `options`, `head`, etc.
|
|
255
|
+
|
|
256
|
+
Each function receives an `event` object representing details - e.g. `event.request`, `event.url`, `event.session` - about the current request. ([Details ahead](#workflow-api).)
|
|
253
257
|
|
|
254
258
|
For *server-based* applications (e.g. traditional web apps and API backends), server-side handlers go into a directory named `server`.
|
|
255
259
|
|
|
@@ -562,7 +566,7 @@ But, we can also access the route in a way that gets the data rendered into the
|
|
|
562
566
|
Now, for Single Page Applications, subsequent navigations, after the initial page load, just ask for the data on destination URLs and perform [Client-Side Rendering](#client-and-server-side-rendering) on the same running document. Navigation is sleek and instant!
|
|
563
567
|
|
|
564
568
|
> **Note**
|
|
565
|
-
> <br>Unless disabled
|
|
569
|
+
> <br>Unless disabled, [SPA Routing](#spa_routing) is automatically built into your app's JS bundle from the `npm run generate` command. So, it just works!
|
|
566
570
|
|
|
567
571
|
With no extra work, your application can function as either a *Multi Page App (MPA)* or a *Single Page App (SPA)*!
|
|
568
572
|
|
|
@@ -596,7 +600,7 @@ my-app
|
|
|
596
600
|
|
|
597
601
|
This, in both cases, is templating - the ability to define HTML *partials* once, and have them reused multiple times. Webflo just concerns itself with templating, and the choice of a Multi Page Application or Single Page Application becomes yours! And heck, you can even have the best of both worlds in the same application - with an architecture we'll call [Multi SPA](#in-a-multi-spa-layout)! It's all a *layout* thing!
|
|
598
602
|
|
|
599
|
-
Now, with pages in Webflo being [DOM-based](#overview) (both client-side and [server-side](
|
|
603
|
+
Now, with pages in Webflo being [DOM-based](#overview) (both client-side and [server-side](#oohtml-ssr)), documents can be manipulated directly with DOM APIs, e.g. to replace or insert nodes, attributes, etc. But even better, templating in Webflo is based on the [HTML Modules](https://github.com/webqit/oohtml#html-modules) and [HTML Imports](https://github.com/webqit/oohtml#html-imports) features in [OOHTML](#oohtml) - unless disabled in config. These features provide a powerful declarative templating system on top of the standard [HTML `<template>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template) element - with a *module*, *export* and *import* paradigm.
|
|
600
604
|
|
|
601
605
|
Here, you are able to define reusable contents in a `<template>` element...
|
|
602
606
|
|
|
@@ -817,7 +821,7 @@ The Webflo `generate` command automatically figures out a given architecture and
|
|
|
817
821
|
|
|
818
822
|
#### Bundling
|
|
819
823
|
|
|
820
|
-
Template `.html` files are bundled from the filesystem into a single file using the [OOHTML CLI](
|
|
824
|
+
Template `.html` files are bundled from the filesystem into a single file using the [OOHTML CLI](#oohtml-cli) utility. On installing this utility, you may want to add the following to your npm scripts in `package.json`.
|
|
821
825
|
|
|
822
826
|
```json
|
|
823
827
|
"scripts": {
|
|
@@ -830,11 +834,11 @@ The `--recursive` flag gets the bundler to recursively bundle *subroots* in a [M
|
|
|
830
834
|
The `--auto-embed` flag gets the bundler to automatically embed the generated `bundle.html` file on the matched `index.html` document. A value of `routes` for the flag ends up as the name of the *embed* template: `<template name="routes" src="/bundle.html"></template>`.
|
|
831
835
|
|
|
832
836
|
> **Note**
|
|
833
|
-
> <br>If your HTML files are actually based off the `public` directory, you'll need to tell the above command to run in the `public` directory, either by [configuring the bundler](https://github.com/webqit/oohtml-cli#other-options), or by rewriting the command with a prefix: `cd public && oohtml bundle --recursive --auto-embed=routes`.
|
|
837
|
+
> <br>If your HTML files are actually based off the `public` directory, you'll need to tell the above command to run in the `public` directory, either by [configuring the bundler](https://github.com/webqit/oohtml-cli#other-options), or by rewriting the command with a prefix: `cd public && oohtml bundle --recursive --auto-embed=routes`.
|
|
834
838
|
|
|
835
839
|
### Client and Server-Side Rendering
|
|
836
840
|
|
|
837
|
-
With pages in Webflo being [DOM-based](#overview) (both client-side and [server-side](
|
|
841
|
+
With pages in Webflo being [DOM-based](#overview) (both client-side and [server-side](#oohtml-ssr)), we are able to access and manipulate documents and elements using familiar DOM APIs - e.g. to replace or insert contents, attributes, etc. Rendering in Webflo is based on this concept!
|
|
838
842
|
|
|
839
843
|
Here, Webflo simply makes sure that the data obtained from each route is available as part of the `document` object, such that it is accessible to our rendering logic as a `data` property on the [`document.state`](#the-idea-of-state) object - [`document.state.data`](#the-documentstatedata-object).
|
|
840
844
|
|
|
@@ -880,7 +884,7 @@ public
|
|
|
880
884
|
|
|
881
885
|
From here, even the most-rudimentary form of rendering (using vanilla HTML and native DOM methods) becomes possible, and this is a good thing: you get away with less tooling until you absolutely need to add up on tooling!
|
|
882
886
|
|
|
883
|
-
However, since the `document` objects in Webflo natively support [OOHTML](
|
|
887
|
+
However, since the `document` objects in Webflo natively support [OOHTML](#oohtml) - unless disabled in config, we are able to write reactive UI logic! Here, OOHTML makes it possible to embed reactive `<script>` elements (called [Subscript](https://github.com/webqit/oohtml#subscript)) right within HTML elements - where each expression automatically self-updates whenever references to data, or its properties, get an update!
|
|
884
888
|
|
|
885
889
|
```html
|
|
886
890
|
<!--
|
|
@@ -1060,10 +1064,10 @@ Observer.observe(state, propertyName, change => {
|
|
|
1060
1064
|
|
|
1061
1065
|
This way, all the moving parts of your application remain coordinated, and can easily be rendered to reflect them on the UI!
|
|
1062
1066
|
|
|
1063
|
-
For all things application state, Webflo leverages the [State API](https://github.com/webqit/oohtml#state-api) that's natively available in OOHTML-based documents - both client-side and server-side. This API exposes an application-wide `document.state` object and a per-element `element.state` object. And these are *live* read/write objects that can be observed for property changes using the [Observer API](
|
|
1067
|
+
For all things application state, Webflo leverages the [State API](https://github.com/webqit/oohtml#state-api) that's natively available in OOHTML-based documents - both client-side and server-side. This API exposes an application-wide `document.state` object and a per-element `element.state` object. And these are *live* read/write objects that can be observed for property changes using the [Observer API](#the-observer-api). It comes off as the simplest approach to state and reactivity!
|
|
1064
1068
|
|
|
1065
1069
|
> **Note**
|
|
1066
|
-
> <br>The State API is not available when the OOHTML support level in config is switched away from `full` and `scripting`.
|
|
1070
|
+
> <br>The State API is not available when the [OOHTML support level](#oohtml) in config is switched away from `full` and `scripting`.
|
|
1067
1071
|
|
|
1068
1072
|
#### The `document.state.data` Object
|
|
1069
1073
|
|
|
@@ -1084,7 +1088,7 @@ Observer.observe(document.state, 'data', e => {
|
|
|
1084
1088
|
|
|
1085
1089
|
#### The `document.state.url` Object
|
|
1086
1090
|
|
|
1087
|
-
This is a *live* object that reperesents the properties of the application URL at any point in time. The object exposes the same URL properties as with the [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) API, but as *live* properties that can be observed as navigation happens, and modified to initiate navigation - all using the [Observer API](
|
|
1091
|
+
This is a *live* object that reperesents the properties of the application URL at any point in time. The object exposes the same URL properties as with the [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) API, but as *live* properties that can be observed as navigation happens, and modified to initiate navigation - all using the [Observer API](#the-observer-api).
|
|
1088
1092
|
|
|
1089
1093
|
```js
|
|
1090
1094
|
console.log(document.state.url) // { hash, host, hostname, href, origin, password, pathname, port, protocol, search, searchParams, username }
|
|
@@ -1247,13 +1251,21 @@ On being loaded, the state of the application is initialized, or is restored thr
|
|
|
1247
1251
|
|
|
1248
1252
|
##### SPA Navigation
|
|
1249
1253
|
|
|
1250
|
-
Unless disabled in
|
|
1254
|
+
Unless disabled in config, it is factored-in at build time for the application client JS to be able to automatially figure out when to intercept a navigation event and prevent a full page reload, and when not to. It follows the following rules:
|
|
1251
1255
|
+ When it ascertains that the destination URL is based on the current running `index.html` document in the browser (an SPA architecture), a full page reload is prevented for *soft* navigation. But where the destination URL points out of the current document root (a [Multi SPA](#in-a-multi-spa-layout) architecture), navigation is allowed as a normal page load, and a new page root is loaded.
|
|
1252
1256
|
+ If navigation is initiated with any of the following keys pressed: Meta Key, Alt Key, Shift Key, Ctrl Key, navigation is allowed to work the default way - regardless of the first rule above.
|
|
1253
1257
|
+ If navigation is initiated from a link element that has the `target` attribute, or the `download` attribute, navigation is allowed to work the default way - regardless of the first rule above.
|
|
1254
1258
|
+ If navigation is initiated from a form element that has the `target` attribute, navigation is allowed to work the default way - regardless of the first rule above.
|
|
1255
1259
|
|
|
1256
|
-
>
|
|
1260
|
+
<details>
|
|
1261
|
+
<summary>Default Config</summary>
|
|
1262
|
+
|
|
1263
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client spa_navigation=TRUE`
|
|
1264
|
+
|
|
1265
|
+
```json
|
|
1266
|
+
{ "spa_navigation": true }
|
|
1267
|
+
```
|
|
1268
|
+
<details>
|
|
1257
1269
|
|
|
1258
1270
|
##### SPA State
|
|
1259
1271
|
|
|
@@ -1334,7 +1346,7 @@ console.log(document.state.network) // { requesting, remote, error, redirecting,
|
|
|
1334
1346
|
</body>
|
|
1335
1347
|
```
|
|
1336
1348
|
|
|
1337
|
-
Here are some additional examples with the [Observer API](
|
|
1349
|
+
Here are some additional examples with the [Observer API](#the-observer-api).
|
|
1338
1350
|
|
|
1339
1351
|
```js
|
|
1340
1352
|
// Visualize the network state
|
|
@@ -1391,17 +1403,98 @@ One more thing: HTML forms can only accept two HTTP methods on their `method` at
|
|
|
1391
1403
|
|
|
1392
1404
|
#### Progressive Web Apps
|
|
1393
1405
|
|
|
1394
|
-
Webflo client-side applications are intended to provide an app-like-first experience. So unless disabled in
|
|
1406
|
+
Webflo client-side applications are intended to provide an app-like-first experience. So unless disabled in config, a [Service Worker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) is built as part of your application on running the `npm run generate` command. You may define [route handlers in the `/worker` directory](#handler-functions-and-layout) of your application, and these will be built into the service worker to handle Same-Origin requests of the application. Where there are no *worker* handlers, or where these forward incoming requests, requests are fetched, either from the cache, or from the network, depending on the fetching strategy built into the Service Worker.
|
|
1407
|
+
|
|
1408
|
+
<details>
|
|
1409
|
+
<summary>Default Config</summary>
|
|
1410
|
+
|
|
1411
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client enable_service_worker=TRUE`
|
|
1412
|
+
|
|
1413
|
+
```json
|
|
1414
|
+
{ "enable_service_worker": true }
|
|
1415
|
+
```
|
|
1416
|
+
<details>
|
|
1395
1417
|
|
|
1396
1418
|
##### Fetching Strategy
|
|
1397
1419
|
|
|
1398
|
-
+ **Network First** - This strategy tells the Service Worker to always attempt fetching from the network first for given resources, before fetching from the cache. On every successful network fetch, a copy of the response is saved to the cache for next time. (This is good for resources that need to be fresh to the user on a "best effort" basis.) Unless
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1420
|
+
+ **Network First** - This strategy tells the Service Worker to always attempt fetching from the network first for given resources, before fetching from the cache. On every successful network fetch, a copy of the response is saved to the cache for next time. (This is good for resources that need to be fresh to the user on a "best effort" basis.) Unless changed, this is Webflo's default fetching strategy. When not the default strategy, a list of specific URLs that should be fetched this way can be configured.
|
|
1421
|
+
|
|
1422
|
+
<details>
|
|
1423
|
+
<summary>Default Config</summary>
|
|
1424
|
+
|
|
1425
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client default_fetching_strategy=network-first`
|
|
1426
|
+
|
|
1427
|
+
```json
|
|
1428
|
+
{ "default_fetching_strategy": "network-first" }
|
|
1429
|
+
```
|
|
1430
|
+
|
|
1431
|
+
*To list specific URLs...*
|
|
1432
|
+
|
|
1433
|
+
```json
|
|
1434
|
+
{ "network_first_urls": [ "/logo.png" ] }
|
|
1435
|
+
```
|
|
1436
|
+
<details>
|
|
1437
|
+
|
|
1438
|
+
+ **Cache First** - This strategy tells the Service Worker to always attempt fetching from the cache first for given resources, before fetching from the network. After serving a cached response, or where not found in cache, a network fetch happens and a copy of the response is saved to the cache for next time. (This is good for resources that do not critially need to be fresh to the user.) When not the default strategy, a list of specific URLs that should be fetched this way can be configured.
|
|
1439
|
+
|
|
1440
|
+
<details>
|
|
1441
|
+
<summary>Default Config</summary>
|
|
1442
|
+
|
|
1443
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client default_fetching_strategy=cache-first`
|
|
1444
|
+
|
|
1445
|
+
```json
|
|
1446
|
+
{ "default_fetching_strategy": "cache-first" }
|
|
1447
|
+
```
|
|
1448
|
+
|
|
1449
|
+
*To list specific URLs...*
|
|
1450
|
+
|
|
1451
|
+
```json
|
|
1452
|
+
{ "cache_first_urls": [ "/logo.png" ] }
|
|
1453
|
+
```
|
|
1454
|
+
<details>
|
|
1455
|
+
|
|
1456
|
+
+ **Network Only** - This strategy tells the Service Worker to always fetch given resources from the network only. They are simply not available when offline. (This is good for resources that critially need to be fresh to the user.) When not the default strategy, a list of specific URLs that should be fetched this way can be configured.
|
|
1457
|
+
|
|
1458
|
+
<details>
|
|
1459
|
+
<summary>Default Config</summary>
|
|
1460
|
+
|
|
1461
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client default_fetching_strategy=network-only`
|
|
1462
|
+
|
|
1463
|
+
```json
|
|
1464
|
+
{ "default_fetching_strategy": "network-only" }
|
|
1465
|
+
```
|
|
1466
|
+
|
|
1467
|
+
*To list specific URLs...*
|
|
1468
|
+
|
|
1469
|
+
```json
|
|
1470
|
+
{ "network_only_urls": [ "/logo.png" ] }
|
|
1471
|
+
```
|
|
1472
|
+
<details>
|
|
1473
|
+
|
|
1474
|
+
+ **Cache Only** - This strategy tells the Service Worker to always fetch given resources from the cache only. (This is good for resources that do not change often.) When not the default strategy, a list of specific URLs that should be fetched this way can be configured. The listed resources are pre-cached ahead of when they'll be needed - and are served from the cache each time. (Pre-caching happens on the one-time `install` event of the Service Worker.)
|
|
1475
|
+
|
|
1476
|
+
<details>
|
|
1477
|
+
<summary>Default Config</summary>
|
|
1478
|
+
|
|
1479
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client default_fetching_strategy=cache-only`
|
|
1480
|
+
|
|
1481
|
+
```json
|
|
1482
|
+
{ "default_fetching_strategy": "cache-only" }
|
|
1483
|
+
```
|
|
1484
|
+
|
|
1485
|
+
*To list specific URLs...*
|
|
1486
|
+
|
|
1487
|
+
```json
|
|
1488
|
+
{ "cache_only_urls": [ "/logo.png" ] }
|
|
1489
|
+
```
|
|
1490
|
+
<details>
|
|
1402
1491
|
|
|
1403
1492
|
In all cases above, the convention for specifying URLs for a strategy accepts [URL patterns](https://developer.mozilla.org/en-US/docs/Web/API/URLPattern) - against which URLs can be matched on the fly. For example, to place all files in an `/image` directory (and subdirectories) on the *Cache First* strategy, the pattern `/image/*` can be used. To place all `.svg` files in an `/icons` directory (including subdirectories) on the *Cache Only* strategy, the pattern `/icons/*.svg` can be used. (Specifically for the *Cache Only* strategy, patterns are resolved at Service Worker build-time, and each pattern must match, at least, a file.)
|
|
1404
1493
|
|
|
1494
|
+
```json
|
|
1495
|
+
{ "cache_only_urls": [ "/icons/*.svg" ] }
|
|
1496
|
+
```
|
|
1497
|
+
|
|
1405
1498
|
##### Cross-Thread Communications
|
|
1406
1499
|
|
|
1407
1500
|
A couple APIs exists in browsers for establishing a two-way communication channel between a page and its Service Worker, for firing UI Notifications from either ends, and for implementing Push Notifications. Webflo offers to simply this with a unifying set of conventions:
|
|
@@ -1612,7 +1705,46 @@ You have a static site!
|
|
|
1612
1705
|
|
|
1613
1706
|
### Webflo Config
|
|
1614
1707
|
|
|
1615
|
-
|
|
1708
|
+
Webflo comes *convention-first*! But it is entirely configurable for when you need it! The easiest way to do this is to run the command `webflo config` and follow the walkthrough. To simply get an overview, use the command `webflo config help`, and all commands and their description are shown.
|
|
1709
|
+
|
|
1710
|
+
## Technology Stack
|
|
1711
|
+
|
|
1712
|
+
Webflo applications are often built on/with the following technologies.
|
|
1713
|
+
|
|
1714
|
+
### OOHTML
|
|
1715
|
+
|
|
1716
|
+
[OOHTML](https://github.com/webqit/oohtml) is a proposed set of new features for HTML that makes it fun to hand-author your UI! Within OOHTML are [HTML Modules](https://github.com/webqit/oohtml#html-modules) and [HTML Imports](https://github.com/webqit/oohtml#html-imports), [Reactive Scripts](https://github.com/webqit/oohtml#subscript) and more!
|
|
1717
|
+
|
|
1718
|
+
Webflo natively supports OOHTML in full! But it is also possible to switch this to none, or to partial support - when specific features aren't needed anywhere in your application. Server-side and client-side support for OOHTML exist independently. This is good when, for example, your application places more importance on SSR, and less on CSR, in which case a reduced support for OOHTML can reduce the overall client JS bundle size.
|
|
1719
|
+
|
|
1720
|
+
<details>
|
|
1721
|
+
<summary>Default Config</summary>
|
|
1722
|
+
|
|
1723
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config client oohtml_support=full`
|
|
1724
|
+
|
|
1725
|
+
> File: `.webqit/webflo/client.json` | Command: `webflo config server oohtml_support=full`
|
|
1726
|
+
|
|
1727
|
+
```json
|
|
1728
|
+
{ "oohtml_support": "full" }
|
|
1729
|
+
```
|
|
1730
|
+
|
|
1731
|
+
*Values: `full`, `namespacing`, `scripting`, `templating`, `none` - See [details at OOHTML SSR](https://github.com/webqit/oohtml-ssr#options)*
|
|
1732
|
+
<details>
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
### OOHTML SSR
|
|
1736
|
+
|
|
1737
|
+
[OOHTML SSR](https://github.com/webqit/oohtml-ssr) is a server-side DOM implementation with native support for OOHTML. This is internally used by Webflo as the Server-Side Rendering engine, and it it what gives Webflo its native support for OOHTML.
|
|
1738
|
+
|
|
1739
|
+
### OOHTML CLI
|
|
1740
|
+
|
|
1741
|
+
[OOHTML CLI](https://github.com/webqit/oohtml-cli) is a small Command Line utility that automates certain aspects of hand-authored OOHTML-based documents.
|
|
1742
|
+
|
|
1743
|
+
### The Observer API
|
|
1744
|
+
|
|
1745
|
+
[The Observer API](https://github.com/webqit/observer) is a simple set of functions for intercepting and observing JavaScript objects and arrays. (Reflection, Interception, and Events.)
|
|
1746
|
+
|
|
1747
|
+
This is part of OOHTML's reactivity system, and it is made available on OOHTML-based documents as `window.WebQit.Observer`.
|
|
1616
1748
|
|
|
1617
1749
|
## Getting Started
|
|
1618
1750
|
|
|
@@ -1627,10 +1759,6 @@ You could soon be taking all your ideas to Webflo! 😃
|
|
|
1627
1759
|
|
|
1628
1760
|
All forms of contributions and PR are welcome! To report bugs or request features, please submit an [issue](https://github.com/webqit/webflo/issues). For general discussions, ideation or community help, please join our github [Discussions](https://github.com/webqit/webflo/discussions).
|
|
1629
1761
|
|
|
1630
|
-
## Getting Involved
|
|
1631
|
-
|
|
1632
|
-
All forms of contributions and PR are welcome! To report bugs or request features, please submit an [issue](https://github.com/webqit/webflo/issues).
|
|
1633
|
-
|
|
1634
1762
|
## License
|
|
1635
1763
|
|
|
1636
1764
|
MIT.
|