safir

1.2.17 • Public • Published

SAFIR [1.1.20]

Tech: Based on ECMA6 programming paradigms builded on Template Literals, CustomEvents, Custom Tags.

Alternative software - High Performace

Safir use browserify for building final pack script.

Objective:

  • Must be simple and usefull. Performace must be 100% with full PWA support.For any platform adapted.
  • Integrate account system using RocketCraftingServer [REST API].

There are two way for creating web components:

  • Safir Component
  • Vanilla component

NPM users

There is no profesional documentation about safir so best way is to see examples from:

Basic Example

Main instance script

In main file use app.loadComponent to load your layout/component. After that use you imagination.

import { Safir, On } from "safir";
import MyHeader from "./layouts/heder";
import Layout from "./layouts/body";

let app  = new Safir();
app.loadVanillaComp("vanilla-components/footer.html");

On("app.ready", () => {
  let myHeader = app.loadComponent(new MyHeader('my-header'));
  let myLayout = app.loadComponent(new Layout('my-layout'));
  console.info("App running [ready]...", Date.now());
});

console.info("App running [sync]...", Date.now());

After in program you no need to use always app.loadComponent just use this.mySubCom = new MYCOMP() and put in render ${MYCOMP.renderById()}.

In index.html header add:

  <link rel="stylesheet" href="./style.css">

If you wanna use themes.

Add main dom holder:

  <div id="app" class="theme-light app fill"></div>

Create component from code

SIMPLE BUTTON COMPONENT:

import {BaseComponent} from "../../index";

export default class SimpleBtn extends BaseComponent {

  id = '';
  text = '';
  ready = () => {};

  constructor(arg, arg2 = '') {
    super(arg);
    this.initial(arg, arg2);
  }
  onClick = this.clickBind;

  render = () => `
    <button class="fill bg-transparent" onclick="(${this.onClick})('${this.id}')">
      ${this.text}
    </button>
  `;
}

How works app updates?

[Recommended for end point components] When you create Safir Component use class MyNewClass extends BaseComponent. BaseComponent will handle situation. Safir have only function set for updating class props. Calling the set function will cause a rerender and dispach event with on-<name_of_prop>.

To create props just add it normally intro class eg. `counter = 0'.

  set(arg, newValue, extraData?)
    - arg -> name of prop eg. counter
    - newValue -> New value / what ever
    - extraData -> it is object with only `{ emit: true }`
                   it is optimal arg.
    [rerender]

  Usage:
  mySybCompBtnNoEmit.set('counter', newValue, { emit: false });

  Catch it any where you want:
  On('on-counter', (data) => {
    console.info('[on-counter] Trigger Btn Yes [catched from body] ', data.detail);
    let t = data.detail;
    // Because we use multiply same component with also same prop name
    // you can use `detail.emitter` to determinate by id who made dispach.
    if (t.emitter === "yes") {
      this.set('statusCounterYes', t.newValue);
    } else if (t.emitter === "no") {
      this.set('statusCounterNo', t.newValue);
    }
    // local tbn (no-emit) never emitted!
  });
Best way is to use this function only for end component.

@Note About direct update [no rerender] Recommented

Rerender DOM method is ok for simple[pages] tasks. Safir need to handle massive or deep structure. In that point rerendering is bad praticle. I use very simple checking in component for props then looking for DOMs whos have the same id [equal with propName].

This is most recemmended function for calling setPropById. Take a look at the demo3.

  // LEVEL 0 - no storage / simple props
  // After refresh default value will be used
  this.myInput2.setPropById('value', r.detail.value);

  // LEVEL 1 - sessionStorage level
  // After refresh value comes from session storage
  // but if you close browser tab or open in new one then default value will be used.
  this.myInput2.setPropById('value', r.detail.value, 1);

  // LEVEL 2 - localStorage level
  // Even if you close browser tab you will get value from localStorage.
  // YOU CAN DO RESET WITH CLEAR CACHE - ALSO IT IS A DOMAIN SHARED INFO
  this.myInput2.setPropById('value', r.detail.value, 2);

VANILLA COMPONENT

WEB/HTML/JS/CSS (ecma6)

It is not focus on vanilla component but it is good to use any js code.

  • Perfect for async app flow.
  • Css is local scoped (loaded only when the vanilla component is loaded).
  - Only role is `put tag <script> after <style> and <html>`

Style

Style can be used with props [from code]. Safir use scss with themed integrated but don't include dev tools for it. You need to use Visual Code Exstension Live Sass.

Add intro .vscode\settings.json

{
  "liveSassCompile.settings.formats": [{
    "format": "expanded",
    "extensionName": ".css",
    "savePath": "/PREX_ROOT_FOLDER/dist"
  }],
  "liveSassCompile.settings.excludeList": [
    "PREX_ROOT_FOLDER/test/**",
    "**/node_modules/**",
    ".vscode/**"
  ]
}

If you use in VisualCode root folder of project no need for PREX_ROOT_FOLDER. If you put whole project intro prefix folder then add PREX_ROOT_FOLDER/. This folder must be intro root of visualCode workspace .vscode\ also can be autogenerated from VisualCode.

Help for ./test [using safir direct from npm service]

If you are using this git repo and you wanna use Safir from npm not from source then you need to change scss settings:

{
  "liveSassCompile.settings.formats": [{
    "format": "expanded",
    "extensionName": ".css",
    "savePath": "/safir/dist/css/"
  }],
  "liveSassCompile.settings.excludeList": [
    "**/node_modules/**",
    ".vscode/**",
    "./dist/**"
  ]
}

Role:

 Any other (except scss) changes in assets/ folder need run `build-assets.sh`

Hosting/build

For localhost (http) web server:

  npm run host

For localhost watch: Run watch:

  npm run demo1

For production (https) web server: Run command:

  npm run build.demo1

Build Library [option]

If you don't wanna use npm service or you dont wanna use module type and compiling js code then you can build empty lib like javascript ES5 or ES6.

  "build.lib": "browserify lib.js -p esmify > dist/safir.lib.js",

Import intro HTML direct:

  <script defer src="safir.lib.js"></script>

Adaptation

  • For codesandbox.

Edit and contribute direct online: https://codesandbox.io/p/github/zlatnaspirala/safir/main?file=%2Fpackage.json

Links

Basic examples:

Where is used

Kickstart is full standalone web app platform based on Safir vs RocketCraftingServer.

Changes

  • from ver[1.1.20] fixed double call of ready() callback function.

Credits

Used for css animation: -> https://webcode.tools/generators/css/keyframe-animation

Readme

Keywords

none

Package Sidebar

Install

npm i safir

Weekly Downloads

2

Version

1.2.17

License

MIT

Unpacked Size

1.38 MB

Total Files

103

Last publish

Collaborators

  • zlatnaspirala