Vanilla Javascript plugin for manage kanban boards

Overview

jKanban

Javascript plugin for Kanban boards

jKanban allow you to create and manage Kanban Board in your project!

Please try out the live demo!

Install

Clone the repo and use the javascript and the css files in the dist folder.

You have to include

<link rel="stylesheet" href="path/to/jkanban.min.css">

and

<script src="path/to/jkanban.min.js"></script>

in your page and you are done.

Usage

Init jKanban is a piece of cake!

var kanban = new jKanban(options)

Here's an overview of the default values.

var kanban = new jKanban({
    element          : '',                                           // selector of the kanban container
    gutter           : '15px',                                       // gutter of the board
    widthBoard       : '250px',                                      // width of the board
    responsivePercentage: false,                                    // if it is true I use percentage in the width of the boards and it is not necessary gutter and widthBoard
    dragItems        : true,                                         // if false, all items are not draggable
    boards           : [],                                           // json of boards
    dragBoards       : true,                                         // the boards are draggable, if false only item can be dragged
    itemAddOptions: {
        enabled: false,                                              // add a button to board for easy item creation
        content: '+',                                                // text or html content of the board button   
        class: 'kanban-title-button btn btn-default btn-xs',         // default class of the button
        footer: false                                                // position the button on footer
    },    
    itemHandleOptions: {
        enabled             : false,                                 // if board item handle is enabled or not
        handleClass         : "item_handle",                         // css class for your custom item handle
        customCssHandler    : "drag_handler",                        // when customHandler is undefined, jKanban will use this property to set main handler class
        customCssIconHandler: "drag_handler_icon",                   // when customHandler is undefined, jKanban will use this property to set main icon handler class. If you want, you can use font icon libraries here
        customHandler       : "<span class='item_handle'>+</span> %title% "  // your entirely customized handler. Use %title% to position item title 
                                                                             // any key's value included in item collection can be replaced with %key%
    },
    click            : function (el) {},                             // callback when any board's item are clicked
    context          : function (el, event) {},                      // callback when any board's item are right clicked
    dragEl           : function (el, source) {},                     // callback when any board's item are dragged
    dragendEl        : function (el) {},                             // callback when any board's item stop drag
    dropEl           : function (el, target, source, sibling) {},    // callback when any board's item drop in a board
    dragBoard        : function (el, source) {},                     // callback when any board stop drag
    dragendBoard     : function (el) {},                             // callback when any board stop drag
    buttonClick      : function(el, boardId) {},                     // callback when the board's button is clicked
    propagationHandlers: [],                                         // the specified callback does not cancel the browser event. possible values: "click", "context"
})

Now take a look to the boards object

[
    {
        "id"    : "board-id-1",               // id of the board
        "title" : "Board Title",              // title of the board
        "class" : "class1,class2,...",        // css classes to add at the title
        "dragTo": ['another-board-id',...],   // array of ids of boards where items can be dropped (default: [])
        "item"  : [                           // item of this board
            {
                "id"    : "item-id-1",        // id of the item
                "title" : "Item 1"            // title of the item
                "class" : ["myClass",...]     // array of additional classes
            },
            {
                "id"    : "item-id-2",
                "title" : "Item 2"
            }
        ]
    },
    {
        "id"    : "board-id-2",
        "title" : "Board Title 2"
    }
]

WARNING: all ids are unique!

About custom properties

jKanban also support custom properties on items to improve your applications with html data- properties. You can define them at like:

[
    {
        "id"    : "board-id-1",
        "title" : "Board Title",
        "item"  : [
            {
                "id"      : "item-id-1",
                "title"   : "Item 1",
                "username": "username1"
            },
            {
                "id"      : "item-id-2",
                "title"   : "Item 2",
                "username": "username2"
            }
        ]
    }
]

Which jKanban will convert to:

<main class="kanban-drag">
    <div class="kanban-item" data-eid="item-id-1" data-username="username1">Item 1</div>
    <div class="kanban-item" data-eid="item-id-2" data-username="username2">Item 2</div>
</main>

API

jKanban provides the easiest possible API to make your boards awesome!

Method Name Arguments Description
addElement boardID, element, position Add element in the board with ID boardID, element is the standard format. If position is set, inserts at position starting from 0
addForm boardID, formItem Add formItem as html element into the board with ID boardID
addBoards boards Add one or more boards in the kanban, boards are in the standard format
findElement id Find board's item by id
replaceElement id, element Replace item by id with element JSON standard format
getParentBoardID id Get board ID of item id passed
findBoard id Find board by id
getBoardElements id Get all item of a board
removeElement id Remove a board's element by id
removeBoard id Remove a board by id

Example

Clone the repo and look in the example folder

Thanks

jKanban use dragula for drag&drop

Develop

Clone the repo then use npm install for download all the dependencies then launch npm run build for build the project

Pull Requests?

I'd love them!

Comments?

Let's hear them! (The nice ones please!)

Me?

In case you're interested I'm @riktarweb

Comments
  • Add a link input into item

    Add a link input into item

    Hello, First, I'd like to thank you so much for this amazing package. Please, How can I set a link into item div, so I can click on it and go to link page.

    Something like this :

    'item': [{
                                'title': `
                                    <div class="d-flex align-items-center">
                            	        <div class="symbol symbol-success mr-3">
                            	            <img alt="Pic" src="assets/media/users/300_24.jpg" />
                            	        </div>
                            	        <div class="d-flex flex-column align-items-start">
                            	            <span class="text-dark-50 font-weight-bold mb-1">SEO Optimization</span>
                            	            <span class="label label-inline label-light-success font-weight-bold">In progress</span>
                            	        </div>
                                             **<div> <a href="link"> View </a>**
                            	    </div>
                                `,
                            },
    

    Thanks.

    opened by AEK-BKF 9
  • Footer button to add items on a specific board

    Footer button to add items on a specific board

    Hi, i use following function to add a footer button. I want this to add a new item for that specific board but i don't have the board ID. If it can add an onclick like onclick=\"add_item('"+boardId+"') to the button it would be nice.

              itemAddOptions: {
                  enabled: true,                                              // add a button to board for easy item creation
                  content: '+',                                                // text or html content of the board button   
                  class: 'kanban-title-button btn-block',         // default class of the button
                  footer: true                                                // position the button on footer
              },
    

    Maybe i can use this to add a footer button but this script shows only buttons in the header of the boards.

    function add_title_buttons() {
      var titles = document.getElementsByClassName("kanban-title-board");
      if (titles.length == 0) {
      	return;
      }
      
      for (var column = 0; column < titles.length; column++) {
      	var currentColumn = titles[column];
        if (currentColumn.innerHTML.includes('button-add-item')) {
    	    continue;
        }
        
    		let boardId = currentColumn.parentElement.parentElement.dataset.id;
        let buttonAddText = "<button type=\"button\" class=\"button-add-item\" onclick=\"add_item('"+boardId+"')\">+</button>";
        currentColumn.innerHTML = currentColumn.innerHTML + buttonAddText;
      }
    }
    
    opened by Brecht272727 8
  • Item callback

    Item callback "drop" firing event ignoring the "dragTo" board values

    When I set the dragTo value to a board, the item callbackdrop is ignoring dragTo possible limitations. In my project, I'm allowing the items to move through the boards one at once. It's working fine, but when this is done, I have to change the status_id of this item I dragged to the next board. To accomplish this, I created an $.ajax to post the new id to that Item. The problem is: the drop callback is firing this $.ajax dispite of the board limitations (which is visually showing that the dropping are not allowed in certain boards), changing the item ID, which is not the expected behaviour. Can you help me with this? What can I be doing wrong on here? Sorry if this is not an Issue. Tell me if it's not. Thanks for this amazing work!

    Regards, Jhon

    bug 
    opened by jhonatanjunio 7
  • Howto read DropTo option value for a specific board?

    Howto read DropTo option value for a specific board?

    Hello and thank you for your awesome library. As I can see dropEl callback fires even if item cannot be dragged to the target board (DragTo option of the source board doesn't have target board Id in it). I need to identify such situations (and don't perform all logic that is called in case of "allowed" drag). I've started with the following code but I have no idea howto read DropTo option value here (I pass an extra jKanban value in my function because I need it to find a board):

    function onDropEl(jKanban, el, target, source, sibling) {
        //FIRST variant to get targetBoardId
        var targetBoardId = target.parentElement.getAttribute('data-id');
    
        //SECOND variant to get targetBoardId - which of two is the correct one???
        var targetBoardId2 = target.parentElement.dataset.id;
    
        var targetBoard = jKanban.findBoard(targetBoardId);
       //Howto read DropTo option value here??? 
      
    }
    
    question 
    opened by bairog 6
  • Is there an example of an item with a card layout with multiple fields?

    Is there an example of an item with a card layout with multiple fields?

    How would I create a kanban item with the following structure:

    Title: Present delivery
    Owner: rouilj  <avatar image of rouilj>
    Due date: 2020-12-25
    

    It looks like the title property is a single line text string. I can add the owner, dueDate ownerAvatar as custom properties, but how do I get them displayed in the item/card?

    Can the

    customHandler       : "<span class='item_handle'>+</span> %s"// your entirely customized handler. Use %s to position item title
    

    property be used in some way to format the item? I don't see any doc on the customHander but I assume it is meant to provide a handle to click on to start drag and drop. Otherwise the whole item/card accepts a click to drag and drop.

    question 
    opened by rouilj 6
  • ADD getALLBoards!

    ADD getALLBoards!

    Hello. I have a suggestion. how about provided getALLBoards? input boardID then return all boards by JSON standard format.

    When I add/update board and board's item end then update this result into API input parameter, If getALLBoards function supported, It'll be cool.

    Thanks.

    opened by GoodWorkerKwang 6
  • Drag does not work in mobile mode

    Drag does not work in mobile mode

    Hi,

    Thanks for the great plugin.

    We encountered a little issue. Could you please check our test video here; https://www.loom.com/share/05daa5de83c940bf9c7da306fa08e65f

    We used your official example file; jkanban-1.2.0/example/index.html for this test. It will work only when page initializes in desktop mode, but not in mobile mode.

    Thanks

    opened by KeenthemesHub 6
  • Cancel Drop after async function

    Cancel Drop after async function

    Hi,

    In our business, our items inside a board have different dragTo boards. In this case, what's the approach to use ? We've used the dropEl event to validate if user can drop using an async function but in this case, the kanban.drake.cancel(true) will not work in the callback.

    Our code:

    const mergedConfig = {
               ...new KanbanConfiguration(),
               ...this.configuration,
               dropEl: (el, target, source, sibling) => {
                   const currentStatusId = el.getAttribute("data-boardid");
                   const targetStatusId = target.parentElement.getAttribute("data-id");
                  this.workflowService.getWorkflowStateTransition(currentStatusId,targetStatusId).subscribe(
                       transition => {
                            /// post to server ...............
                       },
                       error => {
                            // tried this to undo   
                           const copy = el.cloneNode(true);
                           this.kanban.addElement(currentStatusId, copy);
                           this.kanban.removeElement(el);
                       }
                   );
               }
           };
           this.kanban = new jKanban(mergedConfig);
    

    We tried to undo the drag and drop by removing and adding element to previous board but it does not work.

    Thank you.

    opened by jandresampaio 6
  • Every boards duplicate in the board list given as parameter

    Every boards duplicate in the board list given as parameter

    Hi !

    We have to give a list of boards in order to create our jkanban. I see that this list have 2x more elements after jkanban creation than before.

    For instance, if I have 5 elements in the boardJson given as "boards" parameter, after creation of jkanban I have boardJson.lenght = 10. This is not good for me because I need this list for other purpose. Duplicate boards are boring the handle.

    Looking into the code, I see this " self.options.boards.push(board);" in the "addBoards" function. As boards are already in options, I think that this is unusefull and the root of my trouble.

    I comment this line, and everything "seems" to work fine without this line.

    Can I have your opinion on this?

    Thank you!

    opened by Adioud 6
  • Cancel drag

    Cancel drag

    I'm trying to cancel a drag event in order to prevent moving cards on a automatic board, but when I call jkanban.drake.cancel(true) the dragula raises an exception saying "el is null" on touchy function. Do you have any suggestion to implement a "beforeDrag" event in order to validate if a card can be moved? I'm intended to develop that on jKanban.

    opened by marcosrocha85 6
  • DragTo when no card moved

    DragTo when no card moved

    I noticed that when I set the dragTo property and start dragging an item, the boards not allowed to drop became brighter. But when I drop the card in the same position it was, intending to cancel move to another board, the entire kanban doesn't repaint those disabled boards. The kanban is set to dragBoards: false

    captura de tela de 2018-05-28 13-02-30

    bug 
    opened by marcosrocha85 6
  • Bump qs from 6.5.2 to 6.5.3

    Bump qs from 6.5.2 to 6.5.3

    Bumps qs from 6.5.2 to 6.5.3.

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 298bfa5 v6.5.3
    • ed0f5dc [Fix] parse: ignore __proto__ keys (#428)
    • 691e739 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 1072d57 [readme] remove travis badge; add github actions/codecov badges; update URLs
    • 12ac1c4 [meta] fix README.md (#399)
    • 0338716 [actions] backport actions from main
    • 5639c20 Clean up license text so it’s properly detected as BSD-3-Clause
    • 51b8a0b add FUNDING.yml
    • 45f6759 [Fix] fix for an impossible situation: when the formatter is called with a no...
    • f814a7f [Dev Deps] backport from main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Checkbox is not working on board

    Checkbox is not working on board

    I think this is good kanban plugin, but there is an issue. I added checkbox on each card of boards. image

    I can check/uncheck these checkbox but checkbox status is not changed. It is always showing unchecked. image

    please help me. thank you

    opened by zhagnyu 15
  • Is there a method to refresh/reload the kanban items?

    Is there a method to refresh/reload the kanban items?

    When a new content that should display on the kanban is saved to db or a content on the kanban is updated, I wand to be able to trigger a function to reload the kanban items so that updated data is displayed.

    Is there an available method for this or a know method to get this done?

    opened by eazuka 2
  • Can i get a callback whenever the user scrolled to the bottom of a board

    Can i get a callback whenever the user scrolled to the bottom of a board

    Basically I just want to know, whenever the user has scrolled through all the items in the board and has reached to the bottom of the board. For example if you scrolled to the bottom of this board as shown in this image. https://user-images.githubusercontent.com/7257227/47652284-483d7580-db64-11e8-8444-a07ac2c81690.png

    opened by parascodejudge 1
Releases(v1.3.1)
Owner
Riccardo Tartaglia
Full Stack Developer at @webeetle - Make stuff on the web
Riccardo Tartaglia
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
A custom element that aims to make it easier to embed Spring '83 boards

<spring-board> element A custom element that makes it simple to embed Spring '83 boards! Usage If you are using <spring-board> in a client-side framew

Ryan Murphy 11 Jan 1, 2023
Use real-time computing technology and web technology to build a big data Kanban l to solve the problem. Among them, practical technologies include MySQL, Kafka, Flink, Redis, Flask and Echarts

实时计算(English Version) 运用实时计算技术、Web 技术构建一个大数据看板来解决问题。其中实用技术包括Mysql、Kafka、Flink、Redis、Flask和Echarts 目录 1.问题需求 2.方案分析 3.安装环境 4.环境启动命令和运行代码的方法 5.代码目录结构说明

Serendipity 2 Jan 8, 2022
Use Kanban board with filled-in tasks that have categories and time estimations to assign work in group.

javascript-capstone 456movies 456movies is the home of amazing original programs that you can’t find anywhere else. Movies, TV shows, specials and mor

Oybek Kayumov 12 Dec 27, 2022
Front-End do projeto Kanban utilizando Vite e Redux

?? Informações sobre o projeto Eu sempre busquei usar tanto o Trello como o Notion para planejar meus projetos. Entretanto, andei observando alguns ou

Bruno Matos Silva 15 Nov 25, 2022
This app helps manage a bookstore. It comes in handy when you need to manage a personal book store or library. Entirely built on es6.

Awesome Books A Microverse project on learnong javascript. Additional description about the project and its features. Built With HTML5 CSS3 Javascript

Atugonza ( Billions ) Joel 13 Apr 22, 2022
App to manage maintenance calls. App to manage maintenance calls. This application was created for the purpose of studies.

App to manage maintenance calls. App to manage maintenance calls. This application was created for the purpose of studies.

Rodrigo Gonçalves 112 Dec 26, 2022
A JavaScript plugin for creating a tickerboard effect. Plugin for React or vanilla JS.

ticker-board A JavaScript plugin for creating a tickerboard effect. See the Ticker Board page for more info. Importing it There are basically two ways

Robin James Kerrison 6 Aug 11, 2022
This is a vanilla Node.js rest API created to show that it is possible to create a rest API using only vanilla Node.js

This is a vanilla Node.js rest API created to show that it is possible to create a rest API using only vanilla Node.js. But in most cases, I would recommend you to use something like Express in a production project for productivity purposes.

Eduardo Dantas 7 Jul 19, 2022
A magical vite plugin that helps you to generate and manage documentation website.

vite-plugin-book A magical vite plugin that helps you to generate and manage documentation website. ⚠️ This project is still WIP. It's a MVP now. A bu

Mirone 89 Dec 20, 2022
This is a plugin for Obsidian to manage your frequently used links.

obsidian-links-keeper This is a plugin for Obsidian to manage your frequently used links. Install Prerequisites To install this plugin, you will need:

null 9 Nov 23, 2022
A small, lightweight JavaScript plugin for placing items in straight rows (jQuery and vanilla JS version) – Demo:

rowGrid.js rowGrid.js is a small, lightweight (~1000 bytes gzipped) jQuery plugin for placing images (or other items) in straight rows. The grid is si

Bruno Joseph 669 Jul 22, 2022
Vanilla JavaScript plugin for lazyloading images

Lazy Load Remastered Lazy Load delays loading of images in long web pages. Images outside of viewport will not be loaded before user scrolls to them.

Mika Tuupola 8.7k Dec 31, 2022
Accordion Plugin written in Vanilla JavaScript.

Easy Accordion Accordion plugin written purely in JavaScript. Setup So, to start using the Easy Accordion plugin in your project, you can include the

Farhan Halai 1 Dec 16, 2020
Jspreadsheet is a lightweight vanilla javascript plugin to create amazing web-based interactive tables and spreadsheets compatible with other spreadsheet software.

Jspreadsheet CE v4: The JavaScript spreadsheet Jexcel CE has been renamed to Jspreadsheet CE News Important: Please import jspreadsheet.css (jexcel.cs

null 6.2k Dec 19, 2022
Superlight vanilla javascript plugin, for modern web dropdowns. Supporting multi-options, search and images. Designed to be seamlessly themed

Superlight vanilla javascript dropdowns by LCweb Need to jump off of jQuery (or any other) dependency? Other packages are too heavy to just tweak sele

Luca 10 Dec 26, 2022
Superlight vanilla javascript plugin improving forms look and functionality

Superlight pure javascript form switch plugin by LCweb Give a modern look to your applications and take advantage of javascript events and public func

Luca 31 Mar 9, 2022