versoly-ui 1.0.6
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/.babelrc +7 -0
- package/.env +3 -0
- package/LICENSE.md +21 -0
- package/README.md +59 -0
- package/dist/versoly-ui.js +2 -0
- package/dist/versoly-ui.js.map +1 -0
- package/package.json +59 -0
- package/src/js/components/accordion.js +35 -0
- package/src/js/components/collapse.js +36 -0
- package/src/js/components/common.js +28 -0
- package/src/js/components/dismiss.js +13 -0
- package/src/js/components/dropdown.js +88 -0
- package/src/js/components/modal.js +60 -0
- package/src/js/components/tabs.js +53 -0
- package/src/js/utils/index.js +68 -0
- package/src/js/versoly-ui.js +1 -0
- package/webpack.config.js +53 -0
package/.babelrc
ADDED
package/.env
ADDED
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Versoly UI (Versoly Limited) <volkan@versoly.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<div align="">
|
|
2
|
+
<a href="https://versoly.com/versoly-ui" >
|
|
3
|
+
<img alt="Versoly UI - Tailwind CSS component library based on Bootstrap" width="50" src="https://d1pnnwteuly8z3.cloudfront.net/images/dafc1e05-b0e8-4c6d-b375-4a62333bbd5a/5a71ada3-f5e4-4de1-bda2-75396a148365.png">
|
|
4
|
+
</a>
|
|
5
|
+
<a href="https://versoly.com/versoly-ui" align=""><h1>Versoly UI</h1></a>
|
|
6
|
+
<p>Tailwind CSS components library based on Bootstrap, build websites without reinventing the wheel.</p>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<p>
|
|
10
|
+
<a href="https://discord.versoly.com"><img src="https://img.shields.io/discord/711811980482314310?color=%237289da&label=Discord" alt="Discord"></a>
|
|
11
|
+
<a href="https://versoly.com/versoly-ui/getting-started/license/"><img src="https://img.shields.io/badge/license-MIT-blue" alt="Licenese"></a>
|
|
12
|
+
<a href="https://bundlephobia.com/result?p=versoly-ui">
|
|
13
|
+
<img src="https://flat.badgen.net/bundlephobia/minzip/versoly-ui?icon=packagephobia&label&color=blue&cache=10800" alt="gzip bundle size">
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://unpkg.com/versoly/versoly-ui.js">
|
|
16
|
+
<img src="https://flat.badgen.net/badgesize/brotli/https://cdn.jsdelivr.net/npm/versoly/versoly-ui.js?icon=jsdelivr&label&color=blue&cache=10800" alt="brotli bundle size">
|
|
17
|
+
</a>
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
------
|
|
22
|
+
|
|
23
|
+
## Documentation
|
|
24
|
+
|
|
25
|
+
For full documentation, visit [versoly.com/versoly-ui](https://versoly.com/versoly-ui).
|
|
26
|
+
|
|
27
|
+
## Components
|
|
28
|
+
|
|
29
|
+
Versoly UI is an open source components library built on Tailwind CSS and based on Bootstrap classes and components. Websites usually always include a small number of the same components such as buttons, cards and navbars. Versoly UI provides these components similar to Bootstrap and allows for developers to easily swap styling between projects without the manual work.
|
|
30
|
+
|
|
31
|
+
To view all the components go to [versoly.com/versoly-ui/components/alert](versoly.com/versoly-ui/components/alert).
|
|
32
|
+
|
|
33
|
+
## Getting started
|
|
34
|
+
|
|
35
|
+
Versoly UI can be included as a plugin into an existing Tailwind CSS project and will help you build websites faster by having a set of components to work with.
|
|
36
|
+
|
|
37
|
+
For installation instructions go to [versoly.com/versoly-ui/getting-started/quickstart](versoly.com/versoly-ui/getting-started/quickstart).
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
## 💡 Inspiration
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
- [Tailwind](https://tailwindcss.com/): created an easy to use utility library that is easily extendable and flexible. Their variant and just in time compiler changed the game for developers.
|
|
44
|
+
- [Bootstrap](https://getbootstrap.com/): built so many useful components and saved developers billions of hours recreating the wheel.
|
|
45
|
+
- [Daisy UI](https://daisyui.com/): an interesting approach to building a Tailwind CSS library.
|
|
46
|
+
- [Flowbite](https://flowbite.com/): clean Tailwind CSS components built with only Tailwind classes.
|
|
47
|
+
- [Twind](https://github.com/tw-in-js/twind): is a tiny Tailwind-in-JS that makes working with multiple themes very easy.
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## Community
|
|
51
|
+
|
|
52
|
+
If you need help or just want to discuss about the library join the community on Github:
|
|
53
|
+
|
|
54
|
+
[Discuss about Versoly on GitHub](https://github.com/versoly/versoly-ui/discussions)
|
|
55
|
+
|
|
56
|
+
For casual chatting with others using the library:
|
|
57
|
+
|
|
58
|
+
[Join the Versoly Discord Server](https://discord.versoly.com)
|
|
59
|
+
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=function(e){return e.getAttribute("data-target")&&document.getElementById(e.getAttribute("data-target").replace("#",""))},t=function(e){return 1e3*window.getComputedStyle(e).getPropertyValue("transition-duration").replace("s","")+1},o=function(e,t,o){t.forEach((function(t){e.addEventListener(t,o)}))},n=function(e,t,o){return function(){return document.querySelectorAll(e).forEach((function(e){e.addEventListener(t,(function(){return o(e)}))}))}};const i=n('[data-toggle="accordion"]',"click",(function(e){var o=e.closest(".accordion-item").querySelector(".accordion-collapse"),n=t(o);if(o.style.overflow="hidden",o.style.height=0,"true"===e.getAttribute("aria-expanded"))return e.setAttribute("aria-expanded","false"),o.classList.remove("show"),void window.setTimeout((function(){o.classList.remove("block"),o.classList.add("hidden")}),n);e.setAttribute("aria-expanded","true"),o.classList.add("block"),o.classList.add("show"),o.classList.remove("hidden"),window.setTimeout((function(){o.style.height=o.scrollHeight+"px"}),33),window.setTimeout((function(){o.style.overflow=""}),n)}));const r=n("[data-dismiss]","click",(function(o){var n=e(o);n||(n=o.closest(".".concat(o.getAttribute("data-dismiss")))),n.classList.add("opacity-0"),setTimeout((function(){return n.remove()}),t(n))}));const a=n('[data-toggle="collapse"]',"click",(function(o){var n=e(o);if(n){var i=t(n);if(n.style.overflow="hidden",n.style.height=0,"true"===o.getAttribute("aria-expanded"))return o.setAttribute("aria-expanded","false"),n.classList.remove("show"),void window.setTimeout((function(){return n.classList.remove("block")}),i);o.setAttribute("aria-expanded","true"),n.classList.add("block"),n.classList.add("show"),window.setTimeout((function(){n.querySelectorAll(".dropdown-menu").forEach((function(e){return e.classList.add("hidden")}));var e=n.scrollHeight;n.querySelectorAll(".dropdown-menu").forEach((function(e){return e.classList.remove("hidden")})),n.style.height=e+"px"}),32),window.setTimeout((function(){return n.style.overflow=""}),i)}})),c=function(){return document.querySelectorAll('[data-toggle="dropdown"]').forEach((function(e){var t,n=e.nextSibling.nextSibling;function i(){n.classList.remove("show"),window.setTimeout((function(){n.classList.remove("block")}),300)}o(e,["click"],(function(){n.className.includes("show")?i():(n.classList.add("block"),window.setTimeout((function(){n.classList.toggle("show")}),50))})),o(e,["focus","mouseenter"],(function(){var t=Popper.createPopper(e,n,{placement:"bottom-start",modifiers:[{name:"offset",options:{offset:[0,10]}}]});n.classList.add("block"),t.forceUpdate(),t.update(),window.setTimeout((function(){n.getAttribute("class").includes("show")||n.classList.remove("block")}),50)})),o(e,["blur","mouseleave"],(function(){n.getAttribute("class").includes("show")||n.classList.remove("block")})),t=i,document.addEventListener("keydown",(function(e){"Escape"===e.key&&t()}));document.body.addEventListener("click",(function(t){var o=t.target;o===n||o===e||e.contains(o)||i()}))}))};var s="fixed right-0 top-0 z-50 text-white px-5 close";window.removeModal=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"v-modal",t=document.getElementById(e);t.classList.remove("opacity-100"),window.setTimeout((function(){t.remove(),document.body.style.overflow=""}),500)};const l=n('[data-toggle="modal"]',"click",(function(e){var t=function(e){var t=e.dataset.options;return t?JSON.parse(t.replaceAll("'",'"')):{}}(e),o=t.size,n=t.beforeShown,i=t.id||"v-modal",r=e.dataset.html||"";t.imgSrc&&(r='<img src="'.concat(t.imgSrc,'">')),t.iframeSrc&&(r='<iframe allow="autoplay" class="aspect-video w-full" src="'.concat(t.iframeSrc,'" allowfullscreen="" autoplay=""></iframe>'));var a,c,l='<div class="modal" id="'.concat(i,'">\n <div class="modal-content ').concat(o?"modal-".concat(o):"",'">\n ').concat(r,"\n </div>\n\n <button onclick=\"removeModal('").concat(i,'\')" type="button" class="').concat(s,'" data-dismiss="modal" aria-label="Close">\n <span class="text-4xl" aria-hidden="true">×</span>\n </button>\n\n <div class="modal-bg" onclick="removeModal(\'').concat(i,"')\"></div>\n</div>\n");document.addEventListener("keydown",(function(e){return 27==e.keyCode&&window.removeModal(i)})),document.body.style.overflow="hidden",document.body.insertAdjacentHTML("beforeend",l),(a="#"+i,c=document,new Promise((function(e){if(c.querySelector(a))return e(c.querySelector(a));var t=new MutationObserver((function(o){c.querySelector(a)&&(e(c.querySelector(a)),t.disconnect())}));t.observe(c.body,{childList:!0,subtree:!0})}))).then((function(e){n&&window[n](),window.setTimeout((function(){return e.classList.add("opacity-100")}),32)}))}));function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,n=new Array(t);o<t;o++)n[o]=e[o];return n}function u(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return d(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?d(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const f=n('[role="tab"]',"click",(function(e){if("true"===e.getAttribute("aria-selected"))return null;var t=document.querySelector('[aria-labelledby="'.concat(e.getAttribute("aria-controls"),'"]'));if(!t)return null;for(var o=e.classList.value,n=e.parentNode;n&&"tablist"!==n.getAttribute("role");)n=n.parentNode;var i=n.querySelectorAll('[aria-selected="true"]');if(!i||0===i.length)return null;var r=i[0].classList.value;n.querySelectorAll('[role="tab"]').forEach((function(e){e.classList=o,e.setAttribute("aria-selected","false")})),e.classList=r,e.setAttribute("aria-selected","true"),"tabcontent"!==t.getAttribute("role")?(u(t.parentNode.children).forEach((function(e){"tabpanel"===e.getAttribute("role")&&e.classList.add("hidden")})),t.classList.remove("hidden")):u(t.children).forEach((function(e){"tabpanel"===e.getAttribute("role")&&e.classList.remove("hidden")}))}));window.vInitialized=!1,window.initializeVUI=function(){window.vInitialized||(window.vInitialized=!0,i(),a(),r(),c(),l(),f(),window.addEventListener("resize",(function(){document.querySelectorAll('[data-toggle="collapse"]').forEach((function(t){var o=e(t);o&&(t.setAttribute("aria-expanded","false"),o.classList.remove("show"),o.classList.remove("block"),o.style.height="auto",o.style.overflow="")}))})))},document.addEventListener("DOMContentLoaded",initializeVUI),"loading"!==document.readyState&&initializeVUI();
|
|
2
|
+
//# sourceMappingURL=versoly-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versoly-ui.js","mappings":"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","sources":["webpack:///./src/js/utils/index.js","webpack:///./src/js/components/accordion.js","webpack:///./src/js/components/dismiss.js","webpack:///./src/js/components/collapse.js","webpack:///./src/js/components/dropdown.js","webpack:///./src/js/components/modal.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./src/js/components/tabs.js","webpack:///./src/js/components/common.js"],"sourcesContent":["export const getTarget = element => element.getAttribute('data-target') && document.getElementById(element.getAttribute('data-target').replace('#', ''))\n\nexport const getDuration = element => window.getComputedStyle(element).getPropertyValue('transition-duration').replace('s', '') * 1000 + 1\n\nexport const addEventListeners = (element, events, listenerFunction) => {\n events.forEach(event => {\n element.addEventListener(event, listenerFunction);\n });\n}\n\nexport const addEscapeListener = listenerFunction => {\n document.addEventListener('keydown', e => {\n if (e.key === \"Escape\") {\n listenerFunction()\n }\n })\n}\n\nexport const addEventListenerToSelector = (selector, eventListener, listenerFunction) => {\n return () => document.querySelectorAll(selector).forEach(element => {\n element.addEventListener(eventListener, () => listenerFunction(element))\n })\n}\n\nexport const handleResize = () => window.addEventListener('resize', () => {\n document.querySelectorAll('[data-toggle=\"collapse\"]').forEach(element => {\n let target = getTarget(element)\n\n if (!target) {\n return\n }\n\n element.setAttribute('aria-expanded', 'false');\n target.classList.remove('show');\n target.classList.remove('block');\n target.style.height = 'auto'\n target.style.overflow = ''\n })\n})\n\n\nexport const waitForElement = (s) => {\n let d = document\n return new Promise(resolve => {\n if (d.querySelector(s)) {\n return resolve(d.querySelector(s));\n }\n const observer = new MutationObserver(mutations => {\n if (d.querySelector(s)) {\n resolve(d.querySelector(s));\n observer.disconnect();\n }\n });\n observer.observe(d.body, {childList: true,subtree: true});\n });\n}\n\nexport const parseElementOptions = element => {\n let t = element.dataset.options\n return t ? JSON.parse(t.replaceAll(\"'\", '\"')) : {};\n}\n\nexport const triggerEvent = (element, eventName) => {\n let event = document.createEvent(\"HTMLEvents\");\n event.initEvent(eventName, true, true);\n event.eventName = eventName;\n element.dispatchEvent(event);\n}\n","import { getTarget, getDuration, addEventListeners, addEscapeListener, addEventListenerToSelector } from '../utils'\n\nconst accordion = (element) => {\n let target = element.closest('.accordion-item').querySelector('.accordion-collapse')\n const duration = getDuration(target)\n\n target.style.overflow = 'hidden'\n target.style.height = 0\n\n if (element.getAttribute('aria-expanded') === 'true') {\n element.setAttribute('aria-expanded', 'false');\n target.classList.remove('show');\n\n window.setTimeout(() => {\n target.classList.remove('block');\n target.classList.add('hidden');\n }, duration)\n return\n }\n element.setAttribute('aria-expanded', 'true');\n target.classList.add('block');\n target.classList.add('show');\n target.classList.remove('hidden');\n\n window.setTimeout(() => {\n target.style.height = target.scrollHeight + 'px'\n }, 33)\n\n window.setTimeout(() => {\n target.style.overflow = ''\n }, duration)\n}\n\nconst Accordion = addEventListenerToSelector('[data-toggle=\"accordion\"]', 'click', accordion)\nexport default Accordion\n","import { getDuration, getTarget, addEventListenerToSelector } from '../utils'\n\nconst dismiss = element => {\n let target = getTarget(element)\n if (!target) {\n target = element.closest(`.${element.getAttribute('data-dismiss')}`)\n }\n target.classList.add('opacity-0')\n setTimeout(() => target.remove(), getDuration(target))\n}\n\nconst Dismiss = addEventListenerToSelector('[data-dismiss]', 'click', dismiss)\nexport default Dismiss\n","import { getDuration, getTarget, addEventListenerToSelector } from '../utils'\n\nconst collapse = (element) => {\n let target = getTarget(element)\n if (!target) {\n return\n }\n\n const duration = getDuration(target)\n target.style.overflow = 'hidden'\n target.style.height = 0\n\n if (element.getAttribute('aria-expanded') === 'true') {\n element.setAttribute('aria-expanded', 'false');\n target.classList.remove('show');\n\n window.setTimeout(() => target.classList.remove('block'), duration)\n return\n }\n\n element.setAttribute('aria-expanded', 'true');\n target.classList.add('block');\n target.classList.add('show');\n\n window.setTimeout(() => {\n target.querySelectorAll('.dropdown-menu').forEach(m => m.classList.add('hidden'));\n let navHeight = target.scrollHeight\n target.querySelectorAll('.dropdown-menu').forEach(m => m.classList.remove('hidden'));\n target.style.height = navHeight + 'px'\n }, 32)\n\n window.setTimeout(() => target.style.overflow = '', duration)\n}\n\nconst Collapse = addEventListenerToSelector('[data-toggle=\"collapse\"]', 'click', collapse)\nexport default Collapse\n","import { addEventListeners, addEscapeListener } from '../utils'\n\nexport default () => document.querySelectorAll('[data-toggle=\"dropdown\"]').forEach(element => {\n let dropdown = element.nextSibling.nextSibling\n // let dropdownHeight = dropdown && dropdown.offsetHeight\n // console.log(dropdown)\n\n function toggle() {\n if (dropdown.className.includes('show')) {\n hide()\n return\n }\n dropdown.classList.add('block')\n // dropdown.classList.remove('hidden')\n\n window.setTimeout(() => {\n dropdown.classList.toggle('show')\n }, 50)\n\n // if (dropdown.getAttribute('class').includes('show')) {\n // document.getElementById('nav').style.height = document.getElementById('nav').offsetHeight + dropdownHeight + 'px'\n // dropdown.style.height = dropdownHeight + 'px'\n // }\n // else {\n // dropdown.style.height = '0px'\n // }\n // setTimeout(() => dropdown.classList.toggle('block'), 1000)\n // dropdown.style.position = 'absolute';\n }\n\n function hide() {\n dropdown.classList.remove('show');\n\n window.setTimeout(() => {\n // dropdown.classList.add('hidden');\n dropdown.classList.remove('block')\n }, 300)\n\n // if (dropdown.getAttribute('class').includes('show')) {\n // document.getElementById('nav').style.height = document.getElementById('nav').offsetHeight - dropdownHeight + 'px'\n // dropdown.style.height = '0px'\n // dropdown.style.padding = 0\n // dropdown.style.width = '0px'\n // }\n }\n\n addEventListeners(element, ['click'], toggle);\n // addEventListeners(element, ['blur'], hide);\n\n addEventListeners(element, ['focus', 'mouseenter'], () => {\n let popperInstance = Popper.createPopper(element, dropdown, {\n placement: 'bottom-start',\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: [0, 10],\n },\n },\n ]\n });\n dropdown.classList.add('block')\n popperInstance.forceUpdate()\n popperInstance.update()\n\n window.setTimeout(() => {\n if (!dropdown.getAttribute('class').includes('show')) {\n dropdown.classList.remove('block')\n }\n }, 50)\n });\n\n addEventListeners(element, ['blur', 'mouseleave'], () => {\n if (!dropdown.getAttribute('class').includes('show')) {\n dropdown.classList.remove('block')\n }\n });\n addEscapeListener(hide)\n\n const handleDropdownOutsideClick = (event) => {\n const targetElement = event.target; // clicked element\n if (targetElement !== dropdown && targetElement !== element && !element.contains(targetElement)) {\n hide()\n }\n }\n\n document.body.addEventListener('click', handleDropdownOutsideClick);\n})\n","import { waitForElement, parseElementOptions, addEventListenerToSelector } from '../utils'\n\n\nconst defaults = {\n closeButton: 'fixed right-0 top-0 z-50 text-white px-5 close'\n}\n\n // if (element.getAttribute('aria-label')) {\n // return\n // }\n // element.setAttribute('aria-label', 'modal')\n\nconst addModal = (element) => {\n const options = parseElementOptions(element)\n const {size, beforeShown} = options\n const id = options.id || 'v-modal'\n let content = element.dataset.html || ''\n\n if (options.imgSrc) {\n content = `<img src=\"${options.imgSrc}\">`\n }\n if (options.iframeSrc) {\n content = `<iframe allow=\"autoplay\" class=\"aspect-video w-full\" src=\"${options.iframeSrc}\" allowfullscreen=\"\" autoplay=\"\"></iframe>`\n }\n\n let modalHTML = `<div class=\"modal\" id=\"${id}\">\n <div class=\"modal-content ${size ? `modal-${size}` : ''}\">\n ${content}\n </div>\n\n <button onclick=\"removeModal('${id}')\" type=\"button\" class=\"${defaults.closeButton}\" data-dismiss=\"modal\" aria-label=\"Close\">\n <span class=\"text-4xl\" aria-hidden=\"true\">×</span>\n </button>\n\n <div class=\"modal-bg\" onclick=\"removeModal('${id}')\"></div>\n</div>\n`;\n\n document.addEventListener('keydown', e => e.keyCode == 27 && window.removeModal(id))\n document.body.style.overflow = 'hidden'\n document.body.insertAdjacentHTML('beforeend', modalHTML)\n\n waitForElement('#' + id).then(ele => {\n beforeShown && window[beforeShown]()\n window.setTimeout(() => ele.classList.add('opacity-100'), 32)\n })\n}\n\nconst removeModal = (id='v-modal') => {\n let modal = document.getElementById(id)\n modal.classList.remove('opacity-100')\n window.setTimeout(() => {\n modal.remove()\n document.body.style.overflow = ''\n }, 500)\n}\n\nwindow.removeModal = removeModal\nconst Modals = addEventListenerToSelector('[data-toggle=\"modal\"]', 'click', addModal)\nexport default Modals\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import { addEventListenerToSelector } from '../utils'\n\nconst tabs = element => {\n if (element.getAttribute(\"aria-selected\") === 'true') {\n return null\n }\n\n let target = document.querySelector(`[aria-labelledby=\"${element.getAttribute('aria-controls')}\"]`)\n if (!target) {\n return null\n }\n\n let inactiveClass = element.classList.value\n\n let tablist = element.parentNode\n while (tablist && tablist.getAttribute('role') !== 'tablist') {\n tablist = tablist.parentNode\n }\n\n let activeTabs = tablist.querySelectorAll('[aria-selected=\"true\"]')\n if (!activeTabs || activeTabs.length === 0) {\n return null\n }\n let activeClass = activeTabs[0].classList.value;\n\n tablist.querySelectorAll('[role=\"tab\"]').forEach(tab => {\n tab.classList = inactiveClass\n tab.setAttribute('aria-selected', 'false')\n });\n\n element.classList = activeClass;\n element.setAttribute('aria-selected', 'true');\n\n if (target.getAttribute('role') === 'tabcontent') {\n [...target.children].forEach(n => {\n if (n.getAttribute('role') === 'tabpanel') {\n n.classList.remove('hidden')\n }\n })\n return\n }\n\n [...target.parentNode.children].forEach(n => {\n if (n.getAttribute('role') === 'tabpanel') {\n n.classList.add('hidden')\n }\n })\n\n target.classList.remove('hidden')\n}\n\nconst Tabs = addEventListenerToSelector('[role=\"tab\"]', 'click', tabs)\nexport default Tabs\n","import accordion from './accordion'\nimport dismiss from './dismiss'\nimport collapse from './collapse'\nimport dropdown from './dropdown'\nimport modal from './modal'\nimport tabs from './tabs'\nimport { handleResize } from '../utils'\n\nwindow.vInitialized = false\nwindow.initializeVUI = () => {\n if (window.vInitialized) {\n return\n }\n window.vInitialized = true\n accordion()\n collapse()\n dismiss()\n dropdown()\n modal()\n tabs()\n\n handleResize()\n}\n\ndocument.addEventListener('DOMContentLoaded', initializeVUI)\nif (document.readyState !== \"loading\") {\n initializeVUI()\n}\n"],"names":["getTarget","element","getAttribute","document","getElementById","replace","getDuration","window","getComputedStyle","getPropertyValue","addEventListeners","events","listenerFunction","forEach","event","addEventListener","addEventListenerToSelector","selector","eventListener","querySelectorAll","target","closest","querySelector","duration","style","overflow","height","setAttribute","classList","remove","setTimeout","add","scrollHeight","m","navHeight","dropdown","nextSibling","hide","className","includes","toggle","popperInstance","Popper","createPopper","placement","modifiers","name","options","offset","forceUpdate","update","e","key","body","targetElement","contains","defaults","removeModal","id","modal","t","dataset","JSON","parse","replaceAll","parseElementOptions","size","beforeShown","content","html","imgSrc","iframeSrc","s","d","modalHTML","keyCode","insertAdjacentHTML","Promise","resolve","observer","MutationObserver","mutations","disconnect","observe","childList","subtree","then","ele","_arrayLikeToArray","arr","len","length","i","arr2","Array","_toConsumableArray","isArray","iter","Symbol","iterator","from","o","minLen","n","Object","prototype","toString","call","slice","constructor","test","TypeError","inactiveClass","value","tablist","parentNode","activeTabs","activeClass","tab","children","vInitialized","initializeVUI","accordion","collapse","dismiss","tabs","readyState"],"sourceRoot":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "versoly-ui",
|
|
3
|
+
"version": "1.0.6",
|
|
4
|
+
"description": "Versoly UI - Tailwind CSS framework based on Bootstrap",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"versoly",
|
|
7
|
+
"versoly ui",
|
|
8
|
+
"tailwind",
|
|
9
|
+
"tailwind components",
|
|
10
|
+
"tailwind elements",
|
|
11
|
+
"tailwind library",
|
|
12
|
+
"tailwind sections",
|
|
13
|
+
"tailwind css",
|
|
14
|
+
"tailwind ui",
|
|
15
|
+
"ui kit",
|
|
16
|
+
"bootstrap to tailwind",
|
|
17
|
+
"html",
|
|
18
|
+
"css",
|
|
19
|
+
"javascript"
|
|
20
|
+
],
|
|
21
|
+
"license": "MIT",
|
|
22
|
+
"main": "dist/versoly-ui.js",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "git+https://github.com/versoly/versoly-ui.git"
|
|
26
|
+
},
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/versoly/versoly-ui/issues"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://versoly.com/versoly-ui",
|
|
31
|
+
"contributors": [
|
|
32
|
+
"Volkan Kaya <volkan@versoly.com>"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"start": "NODE_ENV=development && npm run start:*",
|
|
36
|
+
"build": "NODE_ENV=production && run-s build:webpack",
|
|
37
|
+
"build:webpack": "webpack --mode=production",
|
|
38
|
+
"build:js": "run-s build:webpack"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@babel/core": "^7.14.8",
|
|
42
|
+
"@babel/plugin-transform-runtime": "^7.17.0",
|
|
43
|
+
"@babel/polyfill": "^7.12.1",
|
|
44
|
+
"@babel/preset-env": "^7.14.8",
|
|
45
|
+
"autoprefixer": "^10.3.3",
|
|
46
|
+
"babel-loader": "^8.2.2",
|
|
47
|
+
"babel-plugin-transform-runtime": "^6.23.0",
|
|
48
|
+
"copyfiles": "^2.4.1",
|
|
49
|
+
"core-js": "^3.8.1",
|
|
50
|
+
"file-loader": "^6.2.0",
|
|
51
|
+
"npm-run-all": "^4.1.5",
|
|
52
|
+
"source-map-loader": "^2.0.0",
|
|
53
|
+
"webpack": "^5.47.0",
|
|
54
|
+
"webpack-cli": "^4.7.2",
|
|
55
|
+
"webpack-dev-server": "^3.11.2",
|
|
56
|
+
"terser-webpack-plugin": "^5.3.1"
|
|
57
|
+
},
|
|
58
|
+
"author": "Versoly"
|
|
59
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getTarget, getDuration, addEventListeners, addEscapeListener, addEventListenerToSelector } from '../utils'
|
|
2
|
+
|
|
3
|
+
const accordion = (element) => {
|
|
4
|
+
let target = element.closest('.accordion-item').querySelector('.accordion-collapse')
|
|
5
|
+
const duration = getDuration(target)
|
|
6
|
+
|
|
7
|
+
target.style.overflow = 'hidden'
|
|
8
|
+
target.style.height = 0
|
|
9
|
+
|
|
10
|
+
if (element.getAttribute('aria-expanded') === 'true') {
|
|
11
|
+
element.setAttribute('aria-expanded', 'false');
|
|
12
|
+
target.classList.remove('show');
|
|
13
|
+
|
|
14
|
+
window.setTimeout(() => {
|
|
15
|
+
target.classList.remove('block');
|
|
16
|
+
target.classList.add('hidden');
|
|
17
|
+
}, duration)
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
element.setAttribute('aria-expanded', 'true');
|
|
21
|
+
target.classList.add('block');
|
|
22
|
+
target.classList.add('show');
|
|
23
|
+
target.classList.remove('hidden');
|
|
24
|
+
|
|
25
|
+
window.setTimeout(() => {
|
|
26
|
+
target.style.height = target.scrollHeight + 'px'
|
|
27
|
+
}, 33)
|
|
28
|
+
|
|
29
|
+
window.setTimeout(() => {
|
|
30
|
+
target.style.overflow = ''
|
|
31
|
+
}, duration)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const Accordion = addEventListenerToSelector('[data-toggle="accordion"]', 'click', accordion)
|
|
35
|
+
export default Accordion
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getDuration, getTarget, addEventListenerToSelector } from '../utils'
|
|
2
|
+
|
|
3
|
+
const collapse = (element) => {
|
|
4
|
+
let target = getTarget(element)
|
|
5
|
+
if (!target) {
|
|
6
|
+
return
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const duration = getDuration(target)
|
|
10
|
+
target.style.overflow = 'hidden'
|
|
11
|
+
target.style.height = 0
|
|
12
|
+
|
|
13
|
+
if (element.getAttribute('aria-expanded') === 'true') {
|
|
14
|
+
element.setAttribute('aria-expanded', 'false');
|
|
15
|
+
target.classList.remove('show');
|
|
16
|
+
|
|
17
|
+
window.setTimeout(() => target.classList.remove('block'), duration)
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
element.setAttribute('aria-expanded', 'true');
|
|
22
|
+
target.classList.add('block');
|
|
23
|
+
target.classList.add('show');
|
|
24
|
+
|
|
25
|
+
window.setTimeout(() => {
|
|
26
|
+
target.querySelectorAll('.dropdown-menu').forEach(m => m.classList.add('hidden'));
|
|
27
|
+
let navHeight = target.scrollHeight
|
|
28
|
+
target.querySelectorAll('.dropdown-menu').forEach(m => m.classList.remove('hidden'));
|
|
29
|
+
target.style.height = navHeight + 'px'
|
|
30
|
+
}, 32)
|
|
31
|
+
|
|
32
|
+
window.setTimeout(() => target.style.overflow = '', duration)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const Collapse = addEventListenerToSelector('[data-toggle="collapse"]', 'click', collapse)
|
|
36
|
+
export default Collapse
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import accordion from './accordion'
|
|
2
|
+
import dismiss from './dismiss'
|
|
3
|
+
import collapse from './collapse'
|
|
4
|
+
import dropdown from './dropdown'
|
|
5
|
+
import modal from './modal'
|
|
6
|
+
import tabs from './tabs'
|
|
7
|
+
import { handleResize } from '../utils'
|
|
8
|
+
|
|
9
|
+
window.vInitialized = false
|
|
10
|
+
window.initializeVUI = () => {
|
|
11
|
+
if (window.vInitialized) {
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
window.vInitialized = true
|
|
15
|
+
accordion()
|
|
16
|
+
collapse()
|
|
17
|
+
dismiss()
|
|
18
|
+
dropdown()
|
|
19
|
+
modal()
|
|
20
|
+
tabs()
|
|
21
|
+
|
|
22
|
+
handleResize()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
document.addEventListener('DOMContentLoaded', initializeVUI)
|
|
26
|
+
if (document.readyState !== "loading") {
|
|
27
|
+
initializeVUI()
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getDuration, getTarget, addEventListenerToSelector } from '../utils'
|
|
2
|
+
|
|
3
|
+
const dismiss = element => {
|
|
4
|
+
let target = getTarget(element)
|
|
5
|
+
if (!target) {
|
|
6
|
+
target = element.closest(`.${element.getAttribute('data-dismiss')}`)
|
|
7
|
+
}
|
|
8
|
+
target.classList.add('opacity-0')
|
|
9
|
+
setTimeout(() => target.remove(), getDuration(target))
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const Dismiss = addEventListenerToSelector('[data-dismiss]', 'click', dismiss)
|
|
13
|
+
export default Dismiss
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { addEventListeners, addEscapeListener } from '../utils'
|
|
2
|
+
|
|
3
|
+
export default () => document.querySelectorAll('[data-toggle="dropdown"]').forEach(element => {
|
|
4
|
+
let dropdown = element.nextSibling.nextSibling
|
|
5
|
+
// let dropdownHeight = dropdown && dropdown.offsetHeight
|
|
6
|
+
// console.log(dropdown)
|
|
7
|
+
|
|
8
|
+
function toggle() {
|
|
9
|
+
if (dropdown.className.includes('show')) {
|
|
10
|
+
hide()
|
|
11
|
+
return
|
|
12
|
+
}
|
|
13
|
+
dropdown.classList.add('block')
|
|
14
|
+
// dropdown.classList.remove('hidden')
|
|
15
|
+
|
|
16
|
+
window.setTimeout(() => {
|
|
17
|
+
dropdown.classList.toggle('show')
|
|
18
|
+
}, 50)
|
|
19
|
+
|
|
20
|
+
// if (dropdown.getAttribute('class').includes('show')) {
|
|
21
|
+
// document.getElementById('nav').style.height = document.getElementById('nav').offsetHeight + dropdownHeight + 'px'
|
|
22
|
+
// dropdown.style.height = dropdownHeight + 'px'
|
|
23
|
+
// }
|
|
24
|
+
// else {
|
|
25
|
+
// dropdown.style.height = '0px'
|
|
26
|
+
// }
|
|
27
|
+
// setTimeout(() => dropdown.classList.toggle('block'), 1000)
|
|
28
|
+
// dropdown.style.position = 'absolute';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function hide() {
|
|
32
|
+
dropdown.classList.remove('show');
|
|
33
|
+
|
|
34
|
+
window.setTimeout(() => {
|
|
35
|
+
// dropdown.classList.add('hidden');
|
|
36
|
+
dropdown.classList.remove('block')
|
|
37
|
+
}, 300)
|
|
38
|
+
|
|
39
|
+
// if (dropdown.getAttribute('class').includes('show')) {
|
|
40
|
+
// document.getElementById('nav').style.height = document.getElementById('nav').offsetHeight - dropdownHeight + 'px'
|
|
41
|
+
// dropdown.style.height = '0px'
|
|
42
|
+
// dropdown.style.padding = 0
|
|
43
|
+
// dropdown.style.width = '0px'
|
|
44
|
+
// }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
addEventListeners(element, ['click'], toggle);
|
|
48
|
+
// addEventListeners(element, ['blur'], hide);
|
|
49
|
+
|
|
50
|
+
addEventListeners(element, ['focus', 'mouseenter'], () => {
|
|
51
|
+
let popperInstance = Popper.createPopper(element, dropdown, {
|
|
52
|
+
placement: 'bottom-start',
|
|
53
|
+
modifiers: [
|
|
54
|
+
{
|
|
55
|
+
name: 'offset',
|
|
56
|
+
options: {
|
|
57
|
+
offset: [0, 10],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
dropdown.classList.add('block')
|
|
63
|
+
popperInstance.forceUpdate()
|
|
64
|
+
popperInstance.update()
|
|
65
|
+
|
|
66
|
+
window.setTimeout(() => {
|
|
67
|
+
if (!dropdown.getAttribute('class').includes('show')) {
|
|
68
|
+
dropdown.classList.remove('block')
|
|
69
|
+
}
|
|
70
|
+
}, 50)
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
addEventListeners(element, ['blur', 'mouseleave'], () => {
|
|
74
|
+
if (!dropdown.getAttribute('class').includes('show')) {
|
|
75
|
+
dropdown.classList.remove('block')
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
addEscapeListener(hide)
|
|
79
|
+
|
|
80
|
+
const handleDropdownOutsideClick = (event) => {
|
|
81
|
+
const targetElement = event.target; // clicked element
|
|
82
|
+
if (targetElement !== dropdown && targetElement !== element && !element.contains(targetElement)) {
|
|
83
|
+
hide()
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
document.body.addEventListener('click', handleDropdownOutsideClick);
|
|
88
|
+
})
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { waitForElement, parseElementOptions, addEventListenerToSelector } from '../utils'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const defaults = {
|
|
5
|
+
closeButton: 'fixed right-0 top-0 z-50 text-white px-5 close'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// if (element.getAttribute('aria-label')) {
|
|
9
|
+
// return
|
|
10
|
+
// }
|
|
11
|
+
// element.setAttribute('aria-label', 'modal')
|
|
12
|
+
|
|
13
|
+
const addModal = (element) => {
|
|
14
|
+
const options = parseElementOptions(element)
|
|
15
|
+
const {size, beforeShown} = options
|
|
16
|
+
const id = options.id || 'v-modal'
|
|
17
|
+
let content = element.dataset.html || ''
|
|
18
|
+
|
|
19
|
+
if (options.imgSrc) {
|
|
20
|
+
content = `<img src="${options.imgSrc}">`
|
|
21
|
+
}
|
|
22
|
+
if (options.iframeSrc) {
|
|
23
|
+
content = `<iframe allow="autoplay" class="aspect-video w-full" src="${options.iframeSrc}" allowfullscreen="" autoplay=""></iframe>`
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let modalHTML = `<div class="modal" id="${id}">
|
|
27
|
+
<div class="modal-content ${size ? `modal-${size}` : ''}">
|
|
28
|
+
${content}
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<button onclick="removeModal('${id}')" type="button" class="${defaults.closeButton}" data-dismiss="modal" aria-label="Close">
|
|
32
|
+
<span class="text-4xl" aria-hidden="true">×</span>
|
|
33
|
+
</button>
|
|
34
|
+
|
|
35
|
+
<div class="modal-bg" onclick="removeModal('${id}')"></div>
|
|
36
|
+
</div>
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
document.addEventListener('keydown', e => e.keyCode == 27 && window.removeModal(id))
|
|
40
|
+
document.body.style.overflow = 'hidden'
|
|
41
|
+
document.body.insertAdjacentHTML('beforeend', modalHTML)
|
|
42
|
+
|
|
43
|
+
waitForElement('#' + id).then(ele => {
|
|
44
|
+
beforeShown && window[beforeShown]()
|
|
45
|
+
window.setTimeout(() => ele.classList.add('opacity-100'), 32)
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const removeModal = (id='v-modal') => {
|
|
50
|
+
let modal = document.getElementById(id)
|
|
51
|
+
modal.classList.remove('opacity-100')
|
|
52
|
+
window.setTimeout(() => {
|
|
53
|
+
modal.remove()
|
|
54
|
+
document.body.style.overflow = ''
|
|
55
|
+
}, 500)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
window.removeModal = removeModal
|
|
59
|
+
const Modals = addEventListenerToSelector('[data-toggle="modal"]', 'click', addModal)
|
|
60
|
+
export default Modals
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { addEventListenerToSelector } from '../utils'
|
|
2
|
+
|
|
3
|
+
const tabs = element => {
|
|
4
|
+
if (element.getAttribute("aria-selected") === 'true') {
|
|
5
|
+
return null
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let target = document.querySelector(`[aria-labelledby="${element.getAttribute('aria-controls')}"]`)
|
|
9
|
+
if (!target) {
|
|
10
|
+
return null
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
let inactiveClass = element.classList.value
|
|
14
|
+
|
|
15
|
+
let tablist = element.parentNode
|
|
16
|
+
while (tablist && tablist.getAttribute('role') !== 'tablist') {
|
|
17
|
+
tablist = tablist.parentNode
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let activeTabs = tablist.querySelectorAll('[aria-selected="true"]')
|
|
21
|
+
if (!activeTabs || activeTabs.length === 0) {
|
|
22
|
+
return null
|
|
23
|
+
}
|
|
24
|
+
let activeClass = activeTabs[0].classList.value;
|
|
25
|
+
|
|
26
|
+
tablist.querySelectorAll('[role="tab"]').forEach(tab => {
|
|
27
|
+
tab.classList = inactiveClass
|
|
28
|
+
tab.setAttribute('aria-selected', 'false')
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
element.classList = activeClass;
|
|
32
|
+
element.setAttribute('aria-selected', 'true');
|
|
33
|
+
|
|
34
|
+
if (target.getAttribute('role') === 'tabcontent') {
|
|
35
|
+
[...target.children].forEach(n => {
|
|
36
|
+
if (n.getAttribute('role') === 'tabpanel') {
|
|
37
|
+
n.classList.remove('hidden')
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
[...target.parentNode.children].forEach(n => {
|
|
44
|
+
if (n.getAttribute('role') === 'tabpanel') {
|
|
45
|
+
n.classList.add('hidden')
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
target.classList.remove('hidden')
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const Tabs = addEventListenerToSelector('[role="tab"]', 'click', tabs)
|
|
53
|
+
export default Tabs
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export const getTarget = element => element.getAttribute('data-target') && document.getElementById(element.getAttribute('data-target').replace('#', ''))
|
|
2
|
+
|
|
3
|
+
export const getDuration = element => window.getComputedStyle(element).getPropertyValue('transition-duration').replace('s', '') * 1000 + 1
|
|
4
|
+
|
|
5
|
+
export const addEventListeners = (element, events, listenerFunction) => {
|
|
6
|
+
events.forEach(event => {
|
|
7
|
+
element.addEventListener(event, listenerFunction);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const addEscapeListener = listenerFunction => {
|
|
12
|
+
document.addEventListener('keydown', e => {
|
|
13
|
+
if (e.key === "Escape") {
|
|
14
|
+
listenerFunction()
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const addEventListenerToSelector = (selector, eventListener, listenerFunction) => {
|
|
20
|
+
return () => document.querySelectorAll(selector).forEach(element => {
|
|
21
|
+
element.addEventListener(eventListener, () => listenerFunction(element))
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const handleResize = () => window.addEventListener('resize', () => {
|
|
26
|
+
document.querySelectorAll('[data-toggle="collapse"]').forEach(element => {
|
|
27
|
+
let target = getTarget(element)
|
|
28
|
+
|
|
29
|
+
if (!target) {
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
element.setAttribute('aria-expanded', 'false');
|
|
34
|
+
target.classList.remove('show');
|
|
35
|
+
target.classList.remove('block');
|
|
36
|
+
target.style.height = 'auto'
|
|
37
|
+
target.style.overflow = ''
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
export const waitForElement = (s) => {
|
|
43
|
+
let d = document
|
|
44
|
+
return new Promise(resolve => {
|
|
45
|
+
if (d.querySelector(s)) {
|
|
46
|
+
return resolve(d.querySelector(s));
|
|
47
|
+
}
|
|
48
|
+
const observer = new MutationObserver(mutations => {
|
|
49
|
+
if (d.querySelector(s)) {
|
|
50
|
+
resolve(d.querySelector(s));
|
|
51
|
+
observer.disconnect();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
observer.observe(d.body, {childList: true,subtree: true});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const parseElementOptions = element => {
|
|
59
|
+
let t = element.dataset.options
|
|
60
|
+
return t ? JSON.parse(t.replaceAll("'", '"')) : {};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const triggerEvent = (element, eventName) => {
|
|
64
|
+
let event = document.createEvent("HTMLEvents");
|
|
65
|
+
event.initEvent(eventName, true, true);
|
|
66
|
+
event.eventName = eventName;
|
|
67
|
+
element.dispatchEvent(event);
|
|
68
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './components/common'
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const { SourceMapDevToolPlugin } = require("webpack");
|
|
2
|
+
const TerserPlugin = require("terser-webpack-plugin");
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
entry: {
|
|
7
|
+
"versoly-ui": path.resolve(__dirname, 'src/js/versoly-ui.js')
|
|
8
|
+
},
|
|
9
|
+
output: {
|
|
10
|
+
filename: 'versoly-ui.js',
|
|
11
|
+
library: {
|
|
12
|
+
type: 'module',
|
|
13
|
+
},
|
|
14
|
+
// prevent error: `Uncaught ReferenceError: self is not define`
|
|
15
|
+
globalObject: 'this',
|
|
16
|
+
},
|
|
17
|
+
module: {
|
|
18
|
+
rules: [
|
|
19
|
+
{
|
|
20
|
+
test: /\.js$/,
|
|
21
|
+
enforce: 'pre',
|
|
22
|
+
use: ['source-map-loader'],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
test: /\.js$/,
|
|
26
|
+
exclude: /node_modules/,
|
|
27
|
+
use: {
|
|
28
|
+
loader: 'babel-loader',
|
|
29
|
+
options: {
|
|
30
|
+
presets: ['@babel/preset-env']
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
resolve: {
|
|
37
|
+
extensions: ['', '.js', '.jsx']
|
|
38
|
+
},
|
|
39
|
+
plugins: [
|
|
40
|
+
new SourceMapDevToolPlugin({
|
|
41
|
+
filename: "[file].map"
|
|
42
|
+
}),
|
|
43
|
+
],
|
|
44
|
+
optimization: {
|
|
45
|
+
minimize: true,
|
|
46
|
+
minimizer: [new TerserPlugin({
|
|
47
|
+
test: /\.js(\?.*)?$/i,
|
|
48
|
+
})],
|
|
49
|
+
},
|
|
50
|
+
experiments: {
|
|
51
|
+
outputModule: true,
|
|
52
|
+
},
|
|
53
|
+
};
|