@joloh/jspattern

1.0.70 • Public • Published

How To Use

**INSTALL WITH NPM or YARN **

npm install @joloh/jspattern

or

yarn add @joloh/jspattern

*** With auto-reload. Thanks to design patterns**

HTML Components

  1. Figure
  2. Form
  3. Header
  4. Table
  5. Canvas
  6. TableHeader
  7. TableBody
  8. TableFooter
  9. TableHead
  10. TableRow
  11. DataCell
  12. Icon
  13. Image
  14. Input
  15. Paragraph
  16. Section
  17. Article
  18. List
  19. ListItem
  20. Mark
  21. Span
  22. Button
  23. DefinitionList
  24. DefinitionListTerme
  25. DefinitionListDescription
  26. Grid
  27. Main
  28. IconButton

Each class has a component that use it. EX : Form component uses FormClass and Each Input uses InputClass

Start in 5 steps.

1 - Create an index.html file

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<main id="root"></main>
<script type="module" src="index.js"></script>
</body>
</html>

2 - create the index.js file

import {App} from "@joloh/jspattern";
import {Home} from "./views";
new App({
    home: Home,
});

3 - Create your first page. It should look like this**.

import {Header, Paragraph, Section} from "@joloh/jspattern";

export const Home = (params)  => {
    
    return Section({
        children: [
            Header({textContent: "Home"}),
            Section({
                children: [
                    Paragraph({text : " Lorem ipsum dolor sit amet."}),
                ]
            })
        ]
    })
}

4 - please add google font link in your index.html file or use another library

    <link href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp" rel="stylesheet">

5 - To build the project I use PARCEL. PAGE Once you're done. create a symbolic link for PARCEL or just run this command in the terminal from the root of your project :

node_modules/.bin/parcel index.html

You will have the project running on http://localhost:1234

PAGE EXEMPLE

import {
    Article,
    Button, DefinitionList, DefinitionListDescription, DefinitionListTerme,
    Figure,
    Form,
    Grid,
    Header,
    Icon,
    List,
    ListItem,
    Paragraph,
    Section, Image
} from "@joloh/jspattern";
import {_console} from "@joloh/jspattern";
// ASSUMING YOU HAVE AN EXPORTABLE CONST CALLED actionsTypes somewhere
import {actionsTypes} from "../redux/redux";
// ASSUMING YOU HAVE AN IMAGE CALLED img.png somewhere
import * as img from "../assets/img.png"
// ASSUMING YOU HAVE A PAGE CALLED Contact somewhere
import {Contact} from "./Contact";
export const Home = (params) => {
    const {stateObserver, useState, navigation, useReduxProvider, updateDom} = params({
        text: "text",
        image: null
    });

    const setText = useState("text");
    const setImage = useState('image');
    const [store, dispatch] = useReduxProvider();

    const formItems = {
        fields: [
            {name: "name", tagName: "input", attributes: {placeholder: "Name", type: "text", className: "input", style: {background: "aliceblue"}, onkeydown: okKeydown}},
            {name: "placeholder", tagName: "input", attributes: {placeholder: "Placeholder", type: "text", className: "input", style: {background: "aliceblue"}, onkeydown: okKeydown}},
            {name: "type",tagName: "input", attributes: {placeholder: "Type", type: "text", className: "input", style: {background: "aliceblue"}, onkeydown: okKeydown}},
            {name: "content", tagName: "input", attributes: {placeholder: "Content", type: "text", className: "input", style: {background: "aliceblue"}, onkeydown: okKeydown}},
        ],
    }
    
    return Section({
        style: {margin: "1rem 2rem"},
        children: [
            Section({children: [
                    Header({textContent: "Custom Form"}),
                    Form({className: "custom-table-form", items: formItems.fields}),
                ]
            }),
            Section({
                className: "custom-table-form__icon",
                style: {marginTop: "10px"},
                children: [
                    Icon({
                        className: "custom-table-form__icon",
                        textContent: "remove_circle_outline",
                        onclick: function (e) {
                            _console("remove_circle_outline click", e);
                        }
                    }),
                    Icon({
                        className: "custom-table-form__icon",
                        textContent: "add_circle_outline",
                        id: "abcd",
                        onclick: function (e) {
                            _console("add_circle_outline click", e);
                            const prods = store.products || [];
                            // demo
                            [{id: 1, name: "iphone",},
                                {id: 2, name: "samsung",},
                                {id: 3, name: "huawei",},
                            ].forEach(p => prods.push(p));

                            dispatch({
                                type: actionsTypes.PRODUCTS,
                                products: prods
                            });

                            updateDom({element: e.target, data: {style: {backgroundColor: "red"}}});

                            _console("add_circle_outline store", store);
                        }
                    })
                ]
            }),
            Figure({className: "home-image-easy", style: { position: "relative" }, children: [
                    Image({src : img, style: {width: "10%", objectFit: "cover"}}),
                ]}),
            Article({className: "home-image-easy", style: { position: "relative" }, children: [
                    Article({textContent: "HELLO"}),
                ]}),
            Grid({
                gtc: "1fr 1fr",
                children: [
                    Section({
                        children: [
                            Paragraph({textContent: "Shamamal"})
                        ]
                    }),
                    Section({
                        children: [
                            Paragraph({textContent: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quis, voluptates"}),
                            Paragraph({textContent: "Lorem ipsum dolor sit"})
                        ]
                    }),
                ]
            }),
            Section({
                children: [
                    List({
                        children: [
                            ListItem({textContent: "Hey"}),
                            ListItem({textContent: "Ho"}),
                            ListItem({textContent: "Hu"}),
                            ListItem({textContent: "Ha"}),
                        ]
                    }),
                    Button({
                        textContent: "Contact Us",
                        onclick: function (e) {
                            console.log(e);
                            navigation.goToUrl({url: "/contact", title: "Contact", stateObserver, useState, navigation, nextPage: Contact});
                        }
                    }),
                    DefinitionList({
                        children : [
                            DefinitionListTerme({textContent: "Denim (semigloss finish"}),
                            DefinitionListDescription({textContent: "Ceiling"}),
                            DefinitionListTerme({textContent: "Denim (eggshell finish)"}),
                            DefinitionListTerme({textContent: "Evening Sky (eggshell finish)"}),
                            DefinitionListDescription({textContent: "Layered on the walls"})
                        ]
                    })
                ]
            }),
        ]
    });
};

TABLE

Table({
    children: [
        TableHeader({
            children: [
                TableRow({
                    children: [
                        DataCell({textContent: "ID"}),
                        DataCell({textContent: "Email"}),
                        DataCell({textContent: "Full name"}),
                    ]
                }),
            ]
        }),
        TableBody({
            children: [
                TableRow({
                    children: [
                        DataCell({textContent: "1"}),
                        DataCell({textContent: "buzz@foo.com"}),
                        DataCell({textContent: "Fuz Buzz"}),
                    ]
                }),
            ]
        }),
        TableFooter({
            children: [
                TableRow({
                    children: [
                        DataCell({textContent: "Nice table"}),
                    ]
                }),
            ]
        }),
    ]
})

BUTTONS

 IconButton({
    textContent: 'perception',
    icon: "content_copy",
    attributes: {
        icon: {},
        text: {style: {color: "red"}},
    }
})
IconButton({
    children: [
        Span({textContent: "easy"}),
        Icon({textContent: "person"}),
    ],
})
Button({textContent: "GitLab"})

Google Font Icons

Icon({textContent: "person"})

Headings Default is H1 is no tagName specified. Check your browser inspecter tool to see.

Section({
  children: [
    Header({tagName: "h1", textContent: "Heading"}),
    Header({tagName: "h2", textContent: "Heading"}),
    Header({tagName: "h3", textContent: "Heading"}),
    Header({tagName: "h4", textContent: "Heading"}),
    Header({tagName: "h5", textContent: "Heading"}),
    Header({tagName: "h6", textContent: "Heading"}),
  ]
})

Override html tag name

If you want to use another tag name and override the one given by the class. Just add property tagName ex: tagName: "span" HTML Attributes you can set html attributes using attributes object like so

Button({textContent: "Save", attributes: {style: {background: "purple",color: "white"}, type: "submit"}})

Use Context Provider Create a single file a paste this inside as a starter.

export const initialState = {
  products: [],
};

export const actionsTypes = {
  PRODUCTS: "PRODUCTS",
};

const reducer = (state = {}, action = {}) => {
  switch (action.type) {
    case actionsTypes.PRODUCTS:
      return {
        ...state,
        products: action.products,
      };
    default:
      return state;
  }
};

Then provide arguments from entrypoint App

return new App(routes, initialState, reducer);

useContextProvider, useState, useArgs, Arg, ArgList...and more to come

const CustomPage = (params) => {
  const {stateObserver, useState, navigation, useReduxProvider, updateDom, componentArgs} = params({
    text: "text",
    image: null
  });

  const setText = useState("text");
  const setImage = useState('image');
  const [store, dispatch] = useReduxProvider();
  const [args, setArgs, addElement] = useArgs();

  setArgs("tableItems", [
    { id: 1, name: "ok", title: "jack", unit_price: 25, price: 125, qty: 1 },
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
    { id: 3, name: "oeuf", title: "jaune", unit_price: 12, total: 25, qty: 1 },
  ]);

  setArgs("momto", [
    { id: 1, name: "ok", title: "jack", unit_price: 25, price: 125, qty: 1 },
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
    { id: 3, name: "oeuf", title: "jaune", unit_price: 12, total: 25, qty: 1 },
  ]);

  addElement("tableItems", { id: 1, name: "ok", title: "jack", unit_price: 25, price: 125, qty: 1 });

  Arg("userId", "2");
  Arg("quatre", 4);
  Arg("douze", 2);
  Arg("cent", 100);
  Arg("dix", 10);
  Arg("quarante5", 45);

  ArgList("products", [
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
    { id: 2, name: "tomate", title: "same", unit_price: 25, total: 25, qty: 1 },
  ]);

  console.log(args);

}

Update dom element on click

1 - Element

Header({
    id: "hide-me",
    textContent: "Lorem ipsum"
})

2 - The button

 Button({
    textContent: "GitLab", className: ["button", "fw-600"],
    onclick: (e) => {
        setArgs("isOn", !args.isOn);
        updateDom({element: "hide-me", show: !args.isOn, data: {style: {background: "blue", borderRadius: "30px"}}});
        updateDom({element: e.target, data: {style: {background: "blue", borderRadius: "30px"}}});
    }
})

Package Sidebar

Install

npm i @joloh/jspattern

Weekly Downloads

0

Version

1.0.70

License

ISC

Unpacked Size

92.5 kB

Total Files

113

Last publish

Collaborators

  • joloh