{
	"functions": {
		"anime": {
			"requires": ["animejs"],
			"js": "let args = arguments[0]; if (!args.duration) {args.duration = 1000;} for (const callback of ['begin','complete','update']) {if (args[callback]) {var jsonCallback = args[callback]; args[callback] = function(anim) {js.callback({do:jsonCallback});} } }; anime(args);",
			"ref": "https://animejs.com/documentation/"
		},
		"RevealFx": {
			"requires": ["animejs", "revealFx"],
			"js": "let selector = arguments[0]; let args = arguments[1]; let rev = new RevealFx(document.querySelector(selector),args);"
		},
		"loadSVG": {
			"requires": ["snapsvg"],
			"js": "let args = arguments[0]; Snap.load(args.url, function (svgData) {Snap(args.selector).append(svgData); js.do(args.on.success)});"
		},
		"loadSVGImage": {
			"requires": ["snapsvg"],
			"js": "let args = arguments[0]; Snap.load(args.url, function (svgData) {Snap(args.selector).append(svgData); js.do(args.on.success)});"
		},
		"animateSVG": {
			"requires": ["snapsvg"],
			"js": "let args = arguments[0]; if(!args.engine || args.engine=='snap') {Snap.select(args.selector).animate(args.attrs, args.duration, mina[args.easing]);}"
		},
		"qrcode-svg": {
			"requires": ["qrcode-svg"],
			"js": "let args = arguments[0]; var qrcode = new QRCode(args.config); document.querySelector(args.selector).innerHTML = qrcode.svg();"
		},
		"sound": {
			"requires": ["howler.js"],
			"js": "let args = arguments[0]; let method = arguments[1] ||'play'; if (args.onend) {args.onend = js.do(args.onend)} var sound = new Howl(args); sound[method]();"
		},
		"rxjs": {
			"requires": ["rxjs"],
			"js": "let args = arguments[0]; const clicks = rxjs.fromEvent(document, args.event); clicks.subscribe(ev => { js.callback({do:args.do, var:'target', value: {x: ev.x, y:ev.y, el: ev.target} }) });"
		}
	},
	"parts": {
		"ui": {
			"hide": {
				"do": [
					{
						"console warn": "hide {arguments}"
					},
					{
						"attr": {
							"selector": "{arguments}",
							"addClass": "hidden"
						}
					}
				]
			},
			"show": {
				"do": [
					{
						"console warn": "show {arguments}"
					},
					{
						"attr": {
							"selector": "{arguments}",
							"removeClass": "hidden"
						}
					}
				]
			},
			"out": {
				"do": [
					{
                  "anime": {
                    "targets": "{arguments:selector}",
                    "opacity": 0,
                    "duration": "{arguments:duration}",
                    "easing": "{arguments:easing}",
                    "complete": [
                    ]
                  }
                }
				]
			},
			"in": {
				"do": [
					{
                  "anime": {
                    "targets": "{arguments:selector}",
                    "opacity": 1,
                    "duration": "{arguments:duration}",
                    "easing": "{arguments:easing}",
                    "begin": [
                    ]
                  }
                }
				]
			},
			"icon": {
				"do": [
					{
						"html": [
							{
								"if": "'{arguments:name}' !== ''",
								"span": {
									"attr": {
										"data-icon": "{arguments:name}",
										"class": "iconify text-[{arguments:size}px] m-[{arguments:margin}px] aspect-square"
									}
								}
							}
						]
					}
				]
			},
			"icon2": {
				"plugins": [
				{
					"name": "iconify",
					"type": "script", 
					"version": "3.1.1",
					"url": "https://cdnjs.cloudflare.com/ajax/libs/iconify/3.1.1/iconify.min.js"
				}
				],
				"div inline-block text-center": {
					"html": [
						{
							"div": {
								"attr": {
									"class": "mx-auto rounded-full {arguments:class}",
									"style": {
										"background": "{arguments:background}",
										"width": "{arguments:width}px",
										"height": "{arguments:height}px",
										"padding": "{js:{arguments:padding} ? '{arguments:padding}' : '5px'}",
										"box-sizing": "content-box"
									}
								},
								"style": "{arguments:style}",
								"span": {
									"attr": {
										"class": "{js:{arguments:inline} ? 'iconify-inline' : 'iconify'}",
										"data-icon": "{arguments:name}",
										"data-flip": "{arguments:flip}",
										"data-width": "{js:{arguments:width} ? {arguments:width} : 64}",
										"data-height": "{js:{arguments:height}  ? {arguments:height} : 64}",
										"data-rotate": "{js:{arguments:rotate} ? '{arguments:rotate}deg' : ''}"
									},
									"style": {
										"float": "none",
										"color": "{arguments:color}"
									}
								}
							}
						},
						{
							"span": {
								"html": "{arguments:text}",
								"style": "{arguments:textStyle}"
							}
						}
					]
				}
			},
			"buttonOld": {
				"plugins": [
					{
						"name": "iconify",
						"type": "script", 
						"version": "3.1.1",
						"url": "https://cdnjs.cloudflare.com/ajax/libs/iconify/3.1.1/iconify.min.js"
					}
				],
				"div": {
					"attr": {
						"class": "mx-1 my-auto py-0 px-[8px] h-[40px] rounded-full cursor-pointer inline-flex align-center items-center bg-[{arguments:background}] border-solid border-[1px] border-[{arguments:color}] text-[17px] text-[{arguments:color}] {arguments:class}",
						"id": "{arguments:id}",
						"data-value": "{arguments:data-value}"
					},
					"html": [
						{
							"i": {
								"if": "{arguments:icon}",
								"attr": {
									"class": "iconify text-[{arguments:size}] mx-0",
									"data-icon": "{arguments:icon}"
								}
							}
						},
						{
							"span hidden sm:block mx-0 px-[5px]": {
								"if": "'{arguments:text}' !== ''",
								"text": "{arguments:text}"
							}
						}
					],
					"on": "{arguments:on}"
				}
			},
			"socialIcons": [
				{
					"html": [
							{
								"div id=socialIcons text-center pt-[30px]": {
									"for": {
											"name": "socialIcons",
											"of": "{arguments:icons}",
											"html": [
												{
													"span p-[10px]": {
															"html": [
																{
																	"elio:icon": {
																			"setup": {
																				"width": 64,
																				"height": 64,
																				"inline": true,
																				"name": "{socialIcons:icon}",
																				"text": " ",
																				"padding": "30px"
																			}
																	}
																}
															]  ,
															"on": {
																"mousedown": [
																	{
																			"js": "window.open('{socialIcons:url}', '_blank')"
																	}
																]
															}          
													}
												}
											]
									}
								}
							}
					]
				}
			],
			"headerIcons": [
				{
					"div id=headerIconUser mx-[5px]": {
						"html": [
							{
								"selector": "#headerIconUser",
								"elio:icon": {
									"setup": {
										"width": 40,
										"height": 40,
										"inline": true,
										"name": "jsonic:user",
										"text": " "
									}
								}
							}
						],
						"on": {
							"mousedown": {
								"link": "/account"
							}
						}
					}
				},
				{
					"div mx-[5px]": {
						"attr": {
							"class": "currentLang",
							"data-value": "currentLang"
						},
						"elio:icon": {
							"setup": {
								"width": 32,
								"height": 32,
								"inline": true,
								"name": "jsonic:lang{setup.language}",
								"text": " "
							}
						},
						"on": {
							"mousedown": {
								"alert": {
									"title": "Select language",
									"showConfirmButton": false,
									"html": {
										"div": {
											"style": {
												"margin": "6px 10px 6px 0px",
												"text-align": "center"
											},
											"for": {
												"name": "langId",
												"of": "{setup.languages}",
												"html": {
													"div": {
														"attr": {
															"class": "langIcons inline-block",
															"data-value": "{langId}"
														},
														"elio:icon": {
															"setup": {
																"width": 64,
																"height": 64,
																"inline": true,
																"name": "jsonic:lang{langId}",
																"text": " "
															}
														},
														"on": {
															"mousedown": [
																{
																	"do": {
																		"selector": ".currentLang[data-value='currentLang']",
																		"attr": {
																			"data-icon": "jsonic:lang{on:target.dataset.value}"
																		}
																	}
																},
																{
																	"data ext": "{js:('{langId}'=='en') ? 'com' : '{langId}'}"
																},
																{
																	"link": "https://elioiot.{data ext}{window:location pathname}"
																},
																{
																	"lang": "{on:target.dataset.value}"
																},
																{
																	"alert": {
																		"do": "close"
																	}
																}
															]
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			],
			"hamburger": {
			 "div": {
				 "attr": {
					 "class": "jsonic-menu-btn hamburger z-[999]"
				 },
				 "a": {
					 "i": {
						 "attr": {
							 "class": "iconify block text-[{arguments:colorhamburger}] dark:text-[{arguments:colorhamburgerdark}] bg-[transparent] text-[50px] w-[50px] h-[50px] cursor-pointer lg:hidden",
							 "data-icon": "jsonic:menu",
							 "data-inline": "false"
						 }
					 }
				 },
				 "on": {
					 "mousedown": [
								  {
										"attr": {
											 "selector": ".jsonic-menu",
											 "toggleClass": "left-[100%]"
										}
								  },
								  {
										"attr": {
											 "selector": "nav",
											 "toggleClass": "fixed"
										}
								  }
							 ]
				 }
			 }
			}
		},
		"slider": {
			"do": [
				{
					"div": {
						"attr": {
							"class": "swiper",
							"data-value": "{arguments:name}"
						},
						"style": {
							"--swiper-navigation-color": "#FFF",
							"--swiper-pagination-color": "#FFF",
							"--swiper-pagination-bullet-inactive-color": "#ccc",
							"width": "100%",
							"max-width": "1000px"
						},
						"div": [
							{
								"attr": {
									"class": "swiper-wrapper",
									"data-value": "{arguments:name}"
								},
								"for": {
									"name": "slide",
									"of": "{arguments:slides}",
									"html": {
										"div": {
											"attr": {
												"class": "swiper-slide"
											},
											"html": "{slide}"
										}
									}
								}
							},
							{
								"attr": {
									"class": "swiper-pagination"
								}
							},
							{
								"attr": {
									"class": "swiper-button-prev"
								}
							},
							{
								"attr": {
									"class": "swiper-button-next"
								}
							}
						],
						"swiper init": "{setup}"
					}
				}
			]				
		}
	},
	"plugins": [
		{
			"name": "tailwindcss",
			"description": "A utility-first CSS framework for rapidly building custom user interfaces",
			"type": "script", 
			"version": "4.1.12",
			"ondemand": false,
			"files": [
				{
					"type": "script",
					"url": "assets/plugins/tailwindcss.min.js",
					"cdn": "https://unpkg.com/@tailwindcss/browser@4"
				}
			]
		},
		{
			"name": "iconify",
			"version": "3.1.1",
			"description": "Utility for using SVG images as icons on the web with pure CSS and/or DOM injection",
			"ondemand": false,
			"files": [
				{
					"type": "script",
					"url": "assets/plugins/iconify.min.js",
					"cdn": "https://cdnjs.cloudflare.com/ajax/libs/iconify/3.1.1/iconify.min.js"
				}
			]
		},
		{
			"name": "animate.css",
			"description": "A cross-browser library of CSS animations",
			"version": "4.1.1",
			"ondemand": false,
			"files": [
				{
					"type": "link",
					"url": "assets/plugins/animate.min.css",
					"cdn": "https://cdn.jsdelivr.net/npm/animate.css@4.1.1/animate.min.css"
				}
			]
		},
		{
			"name": "animejs",
			"description": "JavaScript animation engine",
			"version": "3.2.2",
			"ondemand": false,
			"files": [
				{
					"type": "script",
					"url": "assets/plugins/anime.min.js",
					"cdn": "https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.2/anime.min.js"
				}
			]
		},
		{
			"name": "swiper",
			"description": "Most modern mobile touch slider and framework with hardware accelerated transitions",
			"version": "11.0.5",
			"ondemand": false,
			"files": [
				{
					 "type": "script",
					 "url": "assets/plugins/swiper-bundle.min.js",
					 "cdn": "https://cdnjs.cloudflare.com/ajax/libs/Swiper/11.0.5/swiper-bundle.min.js"
				},
				{
					 "type": "link",
					 "url": "assets/plugins/swiper-bundle.min.css",
					 "cdn": "https://cdnjs.cloudflare.com/ajax/libs/Swiper/11.0.5/swiper-bundle.min.css"
				}
			],
			"ref": "https://swiperjs.com/swiper-api"
		},
		{
			"name": "cally",
			"version": "0.8.0",
			"description": "Small, feature-rich calendar components",
			"ondemand": true,
			"files": [
				{
					 "type": "module",
					 "url": "https://unpkg.com/cally"
				}
			]
		},
		{
			"name": "revealFx",
			"description": "This is a micro animation library based on anime.js to achieve smooth block reveal effects and has a simple API",
			"version": "0.0.2",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdn.jsdelivr.net/npm/revealfx@0.0.2/src/revealFx.min.js"
				}
			],
			"ref": "https://github.com/akhil0001/RevealFx"
		},
		{
			"name": "snapsvg",
			"description": "JavaScript Vector Library",
			"version": "0.5.1",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdnjs.cloudflare.com/ajax/libs/snap.svg/0.5.1/snap.svg-min.js"
				}
			]
		},
		{
			"name": "qrcode-svg",
			"description": "A simple QR Code generator in pure JavaScript",
			"version": "1.1.0",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdn.jsdelivr.net/npm/qrcode-svg@1.1.0/lib/qrcode.min.js"
				}
			],
			"ref": "https://papnkukn.github.io/qrcode-svg/"
		},
		{
			"name": "swup",
			"description": "Versatile and extensible page transition library for server-rendered websites",
			"version": "4.8.1",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://unpkg.com/swup@4.8.1/dist/Swup.umd.js"
				}
			]
		},
		{
			"name": "reveal.js",
			"description": "The HTML Presentation Framework",
			"version": "5.1.0",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdnjs.cloudflare.com/ajax/libs/reveal.js/5.1.0/reveal.js"
				}
			],
			"ref": "https://revealjs.com"
		},
		{
			"name": "video.js",
			"description": "An HTML5 video player that supports HLS and DASH with a common API and skin",
			"version": "8.21.0",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdnjs.cloudflare.com/ajax/libs/video.js/8.21.1/video.min.js"
				}
			],
			"ref": "https://docs.videojs.com"
		},
		{
			"name": "hls.js",
			"description": "JavaScript HLS client using MediaSourceExtension",
			"version": "1.5.18",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.5.18/hls.min.js"
				}
			],
			"ref": "https://github.com/video-dev/hls.js/blob/master/docs/API.md"
		},
		{
			"name": "howler.js",
			"description": "Javascript audio library for the modern web",
			"version": "2.2.4",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdn.jsdelivr.net/npm/howler@2.2.4/dist/howler.min.js"
				}
			],
			"ref": "https://github.com/goldfire/howler.js#documentation"
		},
		{
			"name": "rxjs",
			"description": "Reactive Extensions For JavaScript",
			"version": "7.8.1",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					"url": "https://cdnjs.cloudflare.com/ajax/libs/rxjs/7.8.1/rxjs.umd.min.js"
				}
			],
			"ref": "https://rxjs.dev/api"
		},
		{
			"name": "cloudinary",
			"description": "",
			"version": "2.6.0",
			"ondemand": true,
			"files": [
				{
					 "type": "script",
					 "url": "https://cdn.jsdelivr.net/npm/cloudinary@2.6.0/cloudinary.min.js"
				}
			],
			"ref": ""
		}
	]
}