versoly-ui 2.1.1 → 2.2.0

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.
@@ -0,0 +1,28 @@
1
+ {
2
+ // Use IntelliSense to learn about possible attributes.
3
+ // Hover to view descriptions of existing attributes.
4
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5
+ "version": "0.2.0",
6
+ "configurations": [
7
+ {
8
+ "name": "Debug with TSX",
9
+ "type": "node",
10
+ "request": "launch",
11
+ "program": "${file}",
12
+ "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/tsx",
13
+ "cwd": "${workspaceRoot}",
14
+ "skipFiles": ["<node_internals>/**", "node_modules/**"],
15
+ },
16
+ {
17
+ "name": "Debug Current Test File",
18
+ "type": "node",
19
+ "request": "launch",
20
+ "autoAttachChildProcesses": true,
21
+ "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs",
22
+ "args": ["run", "${relativeFile}"],
23
+ "smartStep": true,
24
+ "console": "integratedTerminal",
25
+ "skipFiles": ["<node_internals>/**", "**/node_modules/**"],
26
+ },
27
+ ],
28
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "editor.formatOnSave": true,
3
+ "eslint.experimental.useFlatConfig": true,
4
+ }
package/README.md CHANGED
@@ -27,7 +27,29 @@ For full documentation, visit [versoly.com/versoly-ui](https://versoly.com/verso
27
27
 
28
28
  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.
29
29
 
30
- To view all the components go to [versoly.com/versoly-ui/components/alert](https://versoly.com/versoly-ui/components/alert).
30
+ - **Components**
31
+ - [Accordion](https://versoly.com/versoly-ui/components/accordion)
32
+ - [Alert](https://versoly.com/versoly-ui/components/alert)
33
+ - [Badge](https://versoly.com/versoly-ui/components/badge)
34
+ - [Button](https://versoly.com/versoly-ui/components/button)
35
+ - [Button Group](https://versoly.com/versoly-ui/components/button-group)
36
+ - [Card](https://versoly.com/versoly-ui/components/card)
37
+ - [Footer](https://versoly.com/versoly-ui/components/footer)
38
+ - [Icon](https://versoly.com/versoly-ui/components/icon)
39
+ - [Modal](https://versoly.com/versoly-ui/components/modal)
40
+ - [Navbar](https://versoly.com/versoly-ui/components/navbar)
41
+ - [Pagination](https://versoly.com/versoly-ui/components/pagination)
42
+ - [Parallax](https://versoly.com/versoly-ui/components/parallax)
43
+ - [Progress](https://versoly.com/versoly-ui/components/progress)
44
+ - [Tab](https://versoly.com/versoly-ui/components/tab)
45
+ - [Table](https://versoly.com/versoly-ui/components/table)
46
+
47
+ - **Forms**
48
+ - [Inputs](https://versoly.com/versoly-ui/forms/inputs)
49
+ - [Select](https://versoly.com/versoly-ui/forms/select)
50
+ - [Checkbox](https://versoly.com/versoly-ui/forms/checkbox)
51
+ - [Radio](https://versoly.com/versoly-ui/forms/radio)
52
+ - [Layout](https://versoly.com/versoly-ui/forms/layout)
31
53
 
32
54
  ## Getting started
33
55
 
@@ -0,0 +1,12 @@
1
+ (function(){let e=e=>document.querySelector(e),t=(e,t=document)=>Array.from(t.querySelectorAll(e)),n=t=>{let n=t.dataset.target;return n?e(n):null},r=e=>{let t=window.getComputedStyle(e).getPropertyValue(`transition-duration`);return t?parseInt(t.replace(`s`,``))*1e3+1:0},i=e=>e.getAttribute(`aria-expanded`)===`true`,a=(e,t,n)=>{t.forEach(t=>{e.addEventListener(t,n)})},o=e=>{document.addEventListener(`keydown`,t=>{t.key===`Escape`&&e()})},s=(e,n,r)=>()=>t(e).forEach(e=>{e.addEventListener(n,()=>r(e))}),c=()=>window.addEventListener(`resize`,()=>{t(`[data-toggle="collapse"]`).forEach(e=>{let t=n(e);t&&(e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),t.classList.remove(`block`),t.style.height=`auto`,t.style.overflow=``)})}),l=t=>new Promise(n=>{if(e(t))return n(e(t));let r=new MutationObserver(()=>{e(t)&&(n(e(t)),r.disconnect())});r.observe(document.body,{childList:!0,subtree:!0})}),u=e=>{let t=e.dataset.options;if(!t)return{};try{return JSON.parse(t.replaceAll(`'`,`"`))}catch(e){return{}}},d=e=>{let n=`[data-toggle="${e}"]`;return t(n)};function f(e){"@babel/helpers - typeof";return f=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},f(e)}function p(e,t){if(f(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(f(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function m(e){var t=p(e,`string`);return f(t)==`symbol`?t:t+``}function h(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?g(Object(n),!0).forEach(function(t){h(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):g(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}let v=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),t.classList.remove(`hidden`),window.setTimeout(()=>{t.style.height=`${t.scrollHeight}px`},33),window.setTimeout(()=>{t.style.overflow=``},n)},y=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>{t.classList.remove(`block`),t.classList.add(`hidden`)},n)},b=e=>{let{min:n,max:o}=_({min:0,max:null},u(e)),s=o===null,c=t(`.accordion-item [aria-expanded]`,e).reduce((e,t)=>{let n=t.closest(`.accordion-item`),r=n==null?void 0:n.querySelector(`.accordion-collapse`);return n&&r instanceof HTMLElement&&e.push({trigger:t,target:r}),e},[]),l=()=>c.filter(({trigger:e})=>i(e)).length,d=({trigger:e,target:t})=>{let a=i(e),o=r(t);s===!1&&l()===n&&a||(a||v(e,t,o),s===!1?c.forEach(t=>{!a&&t.trigger===e||y(t.trigger,t.target,o)}):a&&y(e,t,o))};c.forEach(e=>{a(e.trigger,[`click`],()=>d(e))}),n===1&&l()===0&&c.length>0&&c[0].trigger.click()},x=()=>{t(`.accordion-header[data-toggle=accordion]`).forEach(e=>{console.log(e);let t=e.closest(`.accordion`);if(t){t.setAttribute(`data-toggle`,`accordion`),e.hasAttribute(`data-parent`)&&!t.hasAttribute(`data-options`)&&t.setAttribute(`data-options`,`{'min': 1, 'max': 1}`);return}e.removeAttribute(`data-toggle`)}),d(`accordion`).forEach(b)},S=s(`[data-dismiss]`,`click`,e=>{let t=n(e);t||(t=e.closest(`.${e.getAttribute(`data-dismiss`)}`)),t&&(t.classList.add(`opacity-0`),setTimeout(()=>t.remove(),r(t)))}),C=s(`[data-toggle="collapse"]`,`click`,e=>{let t=n(e);if(!t)return;let i=r(t);if(t.style.overflow=`hidden`,t.style.height=`0px`,e.getAttribute(`aria-expanded`)===`true`){e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>t.classList.remove(`block`),i);return}e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),window.setTimeout(()=>{t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.add(`hidden`));let e=t.scrollHeight;t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.remove(`hidden`)),t.style.height=`${e}px`},32),window.setTimeout(()=>t.style.overflow=``,i)}),w=e=>{let{computePosition:t,shift:n,offset:r}=window.FloatingUIDOM,i=e.nextElementSibling,s=e.parentElement;if(!i||!s||!(i instanceof HTMLElement)||!(s instanceof HTMLElement))return;let c=u(e),l=[r(6),n({padding:5})];function d(){t(e,i,{placement:c.placement||`bottom`,middleware:l}).then(({x:e,y:t})=>{Object.assign(i.style,{left:`${e}px`,top:`${t}px`})})}let f=()=>{i.style.display=`block`,window.requestAnimationFrame(()=>{i.classList.add(`opacity-100`,`visible`)}),d()},p=()=>{i.style.display=``,i.classList.remove(`opacity-100`,`visible`)};s.addEventListener(`focusout`,e=>{e!=null&&e.relatedTarget&&(s.contains(e.relatedTarget)||!document.hasFocus()||p())}),a(e,[`click`],()=>{if(i.style.display===`block`){p();return}f()}),o(p)},T=()=>d(`dropdown`).forEach(w),E={closeButton:`fixed right-0 top-0 z-50 text-white px-5 close`},D=e=>{let{size:t,beforeShown:n,id:r,imgSrc:i,iframeSrc:a}=_({id:`v-modal`,size:void 0,beforeShown:void 0,imgSrc:void 0,iframeSrc:void 0},u(e)),s=e.dataset.html||``;i&&(s=`<img src="${i}">`),a&&(s=`<iframe allow="autoplay" class="aspect-video w-full" src="${a}" allowfullscreen="" autoplay=""></iframe>`);let c=`<div class="modal" id="${r}">
2
+ <div class="modal-content ${t?`modal-${t}`:``}">
3
+ ${s}
4
+ </div>
5
+
6
+ <button onclick="removeModal('${r}')" type="button" class="${E.closeButton}" data-dismiss="modal" aria-label="Close">
7
+ <span class="text-4xl" aria-hidden="true">&times;</span>
8
+ </button>
9
+
10
+ <div class="modal-bg" onclick="removeModal('${r}')"></div>
11
+ </div>
12
+ `;o(()=>window.removeModal(r)),document.body.style.overflow=`hidden`,document.body.insertAdjacentHTML(`beforeend`,c),l(`#${r}`).then(e=>{n&&window[n](),window.setTimeout(()=>e.classList.add(`opacity-100`),32)})},O=(e=`v-modal`)=>{let t=document.getElementById(e);t&&(t.classList.remove(`opacity-100`),window.setTimeout(()=>{t.remove(),document.body.style.overflow=``},500))};window.removeModal=O;let k=s(`[data-toggle="modal"]`,`click`,D),A=s(`[role="tab"]`,`click`,t=>{if(t.getAttribute(`aria-selected`)===`true`)return null;let n=e(`[aria-labelledby="${t.getAttribute(`aria-controls`)}"]`);if(!n)return null;let r=t.classList.value,i=t.parentNode;for(;i&&(!(i instanceof HTMLElement)||i.getAttribute(`role`)!==`tablist`);)i=i.parentNode;if(!(i instanceof HTMLElement))return null;let a=i.querySelectorAll(`[aria-selected="true"]`);if(!a||a.length===0)return null;let o=a[0].classList.value;if(i.querySelectorAll(`[role="tab"]`).forEach(e=>{e.classList=r,e.setAttribute(`aria-selected`,`false`)}),t.classList=o,t.setAttribute(`aria-selected`,`true`),n.getAttribute(`role`)===`tabcontent`){Array.from(n.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.remove(`hidden`)});return}if(!n.parentNode)return null;Array.from(n.parentNode.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.add(`hidden`)}),n.classList.remove(`hidden`)});(function(){window.vInitialized=!1,window.initializeVUI=()=>{window.vInitialized||(window.vInitialized=!0,x(),C(),S(),T(),k(),A(),c())},document.addEventListener(`DOMContentLoaded`,window.initializeVUI),document.readyState!==`loading`&&window.initializeVUI()})()})();
@@ -1 +1,12 @@
1
- (function(){"use strict";const getTarget=t=>t.getAttribute("data-target")&&document.getElementById(t.getAttribute("data-target").replace("#","")),getDuration=t=>window.getComputedStyle(t).getPropertyValue("transition-duration").replace("s","")*1e3+1,addEventListeners=(t,e,s)=>{e.forEach(o=>{t.addEventListener(o,s)})},addEscapeListener=t=>{document.addEventListener("keydown",e=>{e.key==="Escape"&&t()})},addEventListenerToSelector=(t,e,s)=>()=>document.querySelectorAll(t).forEach(o=>{o.addEventListener(e,()=>s(o))}),handleResize=()=>window.addEventListener("resize",()=>{document.querySelectorAll('[data-toggle="collapse"]').forEach(t=>{let e=getTarget(t);e&&(t.setAttribute("aria-expanded","false"),e.classList.remove("show"),e.classList.remove("block"),e.style.height="auto",e.style.overflow="")})}),waitForElement=t=>{let e=document;return new Promise(s=>{if(e.querySelector(t))return s(e.querySelector(t));const o=new MutationObserver(i=>{e.querySelector(t)&&(s(e.querySelector(t)),o.disconnect())});o.observe(e.body,{childList:!0,subtree:!0})})},parseElementOptions=t=>{let e=t.dataset.options;return e?JSON.parse(e.replaceAll("'",'"')):{}},handleOpen=(t,e,s)=>{e.style.overflow="hidden",e.style.height=0,t.setAttribute("aria-expanded","true"),e.classList.add("block"),e.classList.add("show"),e.classList.remove("hidden"),window.setTimeout(()=>{e.style.height=e.scrollHeight+"px"},33),window.setTimeout(()=>{e.style.overflow=""},s)},handleClose=(t,e,s)=>{e.style.overflow="hidden",e.style.height=0,t.setAttribute("aria-expanded","false"),e.classList.remove("show"),window.setTimeout(()=>{e.classList.remove("block"),e.classList.add("hidden")},s)},Accordion=t=>{let e=t.closest(".accordion-item").querySelector(".accordion-collapse");const s=getDuration(e);if(t.getAttribute("aria-expanded")==="true"){handleClose(t,e,s);return}handleOpen(t,e,s),t.hasAttribute("data-parent")&&t.closest(".accordion").querySelectorAll(".accordion-collapse").forEach(o=>{o!==e&&handleClose(o.closest(".accordion-item").querySelector("[aria-expanded]"),o,s)})},accordion=addEventListenerToSelector('[data-toggle="accordion"]',"click",Accordion),Dismiss=t=>{let e=getTarget(t);e||(e=t.closest(".".concat(t.getAttribute("data-dismiss")))),e.classList.add("opacity-0"),setTimeout(()=>e.remove(),getDuration(e))},dismiss=addEventListenerToSelector("[data-dismiss]","click",Dismiss),Collapse=t=>{let e=getTarget(t);if(!e)return;const s=getDuration(e);if(e.style.overflow="hidden",e.style.height=0,t.getAttribute("aria-expanded")==="true"){t.setAttribute("aria-expanded","false"),e.classList.remove("show"),window.setTimeout(()=>e.classList.remove("block"),s);return}t.setAttribute("aria-expanded","true"),e.classList.add("block"),e.classList.add("show"),window.setTimeout(()=>{e.querySelectorAll(".dropdown-menu").forEach(i=>i.classList.add("hidden"));let o=e.scrollHeight;e.querySelectorAll(".dropdown-menu").forEach(i=>i.classList.remove("hidden")),e.style.height=o+"px"},32),window.setTimeout(()=>e.style.overflow="",s)},collapse=addEventListenerToSelector('[data-toggle="collapse"]',"click",Collapse),Dropdown=trigger=>{const{computePosition,shift,offset}=window.FloatingUIDOM,target=trigger.nextElementSibling,parent=trigger.parentElement,options=eval("("+trigger.dataset.options+")"||"")||{};let middleware=[offset(6),shift({padding:5})];function update(){computePosition(trigger,target,{placement:options.placement||"bottom",middleware}).then(({x:t,y:e})=>{Object.assign(target.style,{left:"".concat(t,"px"),top:"".concat(e,"px")})})}const show=()=>{target.style.display="block",requestAnimationFrame(()=>{target.classList.add("opacity-100","visible")}),update()},hide=()=>{target.style.display="",target.classList.remove("opacity-100","visible")},toggle=()=>{if(target.style.display==="block"){hide();return}show()};parent.addEventListener("focusout",t=>{parent.contains(t.relatedTarget)||!document.hasFocus()||hide()}),addEventListeners(trigger,["click"],toggle),addEscapeListener(hide)},dropdown=()=>document.querySelectorAll('[data-toggle="dropdown"]').forEach(Dropdown),defaults={closeButton:"fixed right-0 top-0 z-50 text-white px-5 close"},Modal=t=>{const e=parseElementOptions(t),{size:s,beforeShown:o}=e,i=e.id||"v-modal";let r=t.dataset.html||"";e.imgSrc&&(r='<img src="'.concat(e.imgSrc,'">')),e.iframeSrc&&(r='<iframe allow="autoplay" class="aspect-video w-full" src="'.concat(e.iframeSrc,'" allowfullscreen="" autoplay=""></iframe>'));let a='<div class="modal" id="'.concat(i,'">\n <div class="modal-content ').concat(s?"modal-".concat(s):"",'">\n ').concat(r,"\n </div>\n\n <button onclick=\"removeModal('").concat(i,'\')" type="button" class="').concat(defaults.closeButton,'" data-dismiss="modal" aria-label="Close">\n <span class="text-4xl" aria-hidden="true">&times;</span>\n </button>\n\n <div class="modal-bg" onclick="removeModal(\'').concat(i,"')\"></div>\n</div>\n");document.addEventListener("keydown",l=>l.keyCode==27&&window.removeModal(i)),document.body.style.overflow="hidden",document.body.insertAdjacentHTML("beforeend",a),waitForElement("#"+i).then(l=>{o&&window[o](),window.setTimeout(()=>l.classList.add("opacity-100"),32)})},removeModal=(t="v-modal")=>{let e=document.getElementById(t);e.classList.remove("opacity-100"),window.setTimeout(()=>{e.remove(),document.body.style.overflow=""},500)};window.removeModal=removeModal;const modal=addEventListenerToSelector('[data-toggle="modal"]',"click",Modal),Tabs=t=>{if(t.getAttribute("aria-selected")==="true")return null;let e=document.querySelector('[aria-labelledby="'.concat(t.getAttribute("aria-controls"),'"]'));if(!e)return null;let s=t.classList.value,o=t.parentNode;for(;o&&o.getAttribute("role")!=="tablist";)o=o.parentNode;let i=o.querySelectorAll('[aria-selected="true"]');if(!i||i.length===0)return null;let r=i[0].classList.value;if(o.querySelectorAll('[role="tab"]').forEach(a=>{a.classList=s,a.setAttribute("aria-selected","false")}),t.classList=r,t.setAttribute("aria-selected","true"),e.getAttribute("role")==="tabcontent"){[...e.children].forEach(a=>{a.getAttribute("role")==="tabpanel"&&a.classList.remove("hidden")});return}[...e.parentNode.children].forEach(a=>{a.getAttribute("role")==="tabpanel"&&a.classList.add("hidden")}),e.classList.remove("hidden")},tabs=addEventListenerToSelector('[role="tab"]',"click",Tabs);(function(){window.vInitialized=!1,window.initializeVUI=()=>{window.vInitialized||(window.vInitialized=!0,accordion(),collapse(),dismiss(),dropdown(),modal(),tabs(),handleResize())},document.addEventListener("DOMContentLoaded",initializeVUI),document.readyState!=="loading"&&initializeVUI()})()})();
1
+ const e=e=>document.querySelector(e),t=(e,t=document)=>Array.from(t.querySelectorAll(e)),n=t=>{let n=t.dataset.target;return n?e(n):null},r=e=>{let t=window.getComputedStyle(e).getPropertyValue(`transition-duration`);return t?parseInt(t.replace(`s`,``))*1e3+1:0},i=e=>e.getAttribute(`aria-expanded`)===`true`,a=(e,t,n)=>{t.forEach(t=>{e.addEventListener(t,n)})},o=e=>{document.addEventListener(`keydown`,t=>{t.key===`Escape`&&e()})},s=(e,n,r)=>()=>t(e).forEach(e=>{e.addEventListener(n,()=>r(e))}),c=()=>window.addEventListener(`resize`,()=>{t(`[data-toggle="collapse"]`).forEach(e=>{let t=n(e);t&&(e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),t.classList.remove(`block`),t.style.height=`auto`,t.style.overflow=``)})}),l=t=>new Promise(n=>{if(e(t))return n(e(t));let r=new MutationObserver(()=>{e(t)&&(n(e(t)),r.disconnect())});r.observe(document.body,{childList:!0,subtree:!0})}),u=e=>{let t=e.dataset.options;if(!t)return{};try{return JSON.parse(t.replaceAll(`'`,`"`))}catch(e){return{}}},d=e=>{let n=`[data-toggle="${e}"]`;return t(n)};function f(e){"@babel/helpers - typeof";return f=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},f(e)}function p(e,t){if(f(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(f(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function m(e){var t=p(e,`string`);return f(t)==`symbol`?t:t+``}function h(e,t,n){return(t=m(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?g(Object(n),!0).forEach(function(t){h(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):g(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}const v=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),t.classList.remove(`hidden`),window.setTimeout(()=>{t.style.height=`${t.scrollHeight}px`},33),window.setTimeout(()=>{t.style.overflow=``},n)},y=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>{t.classList.remove(`block`),t.classList.add(`hidden`)},n)},b=e=>{let{min:n,max:o}=_({min:0,max:null},u(e)),s=o===null,c=t(`.accordion-item [aria-expanded]`,e).reduce((e,t)=>{let n=t.closest(`.accordion-item`),r=n==null?void 0:n.querySelector(`.accordion-collapse`);return n&&r instanceof HTMLElement&&e.push({trigger:t,target:r}),e},[]),l=()=>c.filter(({trigger:e})=>i(e)).length,d=({trigger:e,target:t})=>{let a=i(e),o=r(t);s===!1&&l()===n&&a||(a||v(e,t,o),s===!1?c.forEach(t=>{!a&&t.trigger===e||y(t.trigger,t.target,o)}):a&&y(e,t,o))};c.forEach(e=>{a(e.trigger,[`click`],()=>d(e))}),n===1&&l()===0&&c.length>0&&c[0].trigger.click()},x=()=>{t(`.accordion-header[data-toggle=accordion]`).forEach(e=>{console.log(e);let t=e.closest(`.accordion`);if(t){t.setAttribute(`data-toggle`,`accordion`),e.hasAttribute(`data-parent`)&&!t.hasAttribute(`data-options`)&&t.setAttribute(`data-options`,`{'min': 1, 'max': 1}`);return}e.removeAttribute(`data-toggle`)}),d(`accordion`).forEach(b)},S=e=>{let t=n(e);t||(t=e.closest(`.${e.getAttribute(`data-dismiss`)}`)),t&&(t.classList.add(`opacity-0`),setTimeout(()=>t.remove(),r(t)))},C=s(`[data-dismiss]`,`click`,S),w=e=>{let t=n(e);if(!t)return;let i=r(t);if(t.style.overflow=`hidden`,t.style.height=`0px`,e.getAttribute(`aria-expanded`)===`true`){e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>t.classList.remove(`block`),i);return}e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),window.setTimeout(()=>{t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.add(`hidden`));let e=t.scrollHeight;t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.remove(`hidden`)),t.style.height=`${e}px`},32),window.setTimeout(()=>t.style.overflow=``,i)},T=s(`[data-toggle="collapse"]`,`click`,w),E=e=>{let{computePosition:t,shift:n,offset:r}=window.FloatingUIDOM,i=e.nextElementSibling,s=e.parentElement;if(!i||!s||!(i instanceof HTMLElement)||!(s instanceof HTMLElement))return;let c=u(e),l=[r(6),n({padding:5})];function d(){t(e,i,{placement:c.placement||`bottom`,middleware:l}).then(({x:e,y:t})=>{Object.assign(i.style,{left:`${e}px`,top:`${t}px`})})}let f=()=>{i.style.display=`block`,window.requestAnimationFrame(()=>{i.classList.add(`opacity-100`,`visible`)}),d()},p=()=>{i.style.display=``,i.classList.remove(`opacity-100`,`visible`)};s.addEventListener(`focusout`,e=>{e!=null&&e.relatedTarget&&(s.contains(e.relatedTarget)||!document.hasFocus()||p())}),a(e,[`click`],()=>{if(i.style.display===`block`){p();return}f()}),o(p)},D=()=>d(`dropdown`).forEach(E),O={closeButton:`fixed right-0 top-0 z-50 text-white px-5 close`},k=e=>{let{size:t,beforeShown:n,id:r,imgSrc:i,iframeSrc:a}=_({id:`v-modal`,size:void 0,beforeShown:void 0,imgSrc:void 0,iframeSrc:void 0},u(e)),s=e.dataset.html||``;i&&(s=`<img src="${i}">`),a&&(s=`<iframe allow="autoplay" class="aspect-video w-full" src="${a}" allowfullscreen="" autoplay=""></iframe>`);let c=`<div class="modal" id="${r}">
2
+ <div class="modal-content ${t?`modal-${t}`:``}">
3
+ ${s}
4
+ </div>
5
+
6
+ <button onclick="removeModal('${r}')" type="button" class="${O.closeButton}" data-dismiss="modal" aria-label="Close">
7
+ <span class="text-4xl" aria-hidden="true">&times;</span>
8
+ </button>
9
+
10
+ <div class="modal-bg" onclick="removeModal('${r}')"></div>
11
+ </div>
12
+ `;o(()=>window.removeModal(r)),document.body.style.overflow=`hidden`,document.body.insertAdjacentHTML(`beforeend`,c),l(`#${r}`).then(e=>{n&&window[n](),window.setTimeout(()=>e.classList.add(`opacity-100`),32)})},A=(e=`v-modal`)=>{let t=document.getElementById(e);t&&(t.classList.remove(`opacity-100`),window.setTimeout(()=>{t.remove(),document.body.style.overflow=``},500))};window.removeModal=A;const j=s(`[data-toggle="modal"]`,`click`,k),M=t=>{if(t.getAttribute(`aria-selected`)===`true`)return null;let n=e(`[aria-labelledby="${t.getAttribute(`aria-controls`)}"]`);if(!n)return null;let r=t.classList.value,i=t.parentNode;for(;i&&(!(i instanceof HTMLElement)||i.getAttribute(`role`)!==`tablist`);)i=i.parentNode;if(!(i instanceof HTMLElement))return null;let a=i.querySelectorAll(`[aria-selected="true"]`);if(!a||a.length===0)return null;let o=a[0].classList.value;if(i.querySelectorAll(`[role="tab"]`).forEach(e=>{e.classList=r,e.setAttribute(`aria-selected`,`false`)}),t.classList=o,t.setAttribute(`aria-selected`,`true`),n.getAttribute(`role`)===`tabcontent`){Array.from(n.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.remove(`hidden`)});return}if(!n.parentNode)return null;Array.from(n.parentNode.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.add(`hidden`)}),n.classList.remove(`hidden`)},N=s(`[role="tab"]`,`click`,M);(function(){window.vInitialized=!1,window.initializeVUI=()=>{window.vInitialized||(window.vInitialized=!0,x(),T(),C(),D(),j(),N(),c())},document.addEventListener(`DOMContentLoaded`,window.initializeVUI),document.readyState!==`loading`&&window.initializeVUI()})();
@@ -1,172 +1,12 @@
1
- const getTarget = (t) => t.getAttribute("data-target") && document.getElementById(t.getAttribute("data-target").replace("#", "")), getDuration = (t) => window.getComputedStyle(t).getPropertyValue("transition-duration").replace("s", "") * 1e3 + 1, addEventListeners = (t, e, s) => {
2
- e.forEach((o) => {
3
- t.addEventListener(o, s);
4
- });
5
- }, addEscapeListener = (t) => {
6
- document.addEventListener("keydown", (e) => {
7
- e.key === "Escape" && t();
8
- });
9
- }, addEventListenerToSelector = (t, e, s) => () => document.querySelectorAll(t).forEach((o) => {
10
- o.addEventListener(e, () => s(o));
11
- }), handleResize = () => window.addEventListener("resize", () => {
12
- document.querySelectorAll('[data-toggle="collapse"]').forEach((t) => {
13
- let e = getTarget(t);
14
- e && (t.setAttribute("aria-expanded", "false"), e.classList.remove("show"), e.classList.remove("block"), e.style.height = "auto", e.style.overflow = "");
15
- });
16
- }), waitForElement = (t) => {
17
- let e = document;
18
- return new Promise((s) => {
19
- if (e.querySelector(t))
20
- return s(e.querySelector(t));
21
- const o = new MutationObserver((i) => {
22
- e.querySelector(t) && (s(e.querySelector(t)), o.disconnect());
23
- });
24
- o.observe(e.body, { childList: !0, subtree: !0 });
25
- });
26
- }, parseElementOptions = (t) => {
27
- let e = t.dataset.options;
28
- return e ? JSON.parse(e.replaceAll("'", '"')) : {};
29
- }, handleOpen = (t, e, s) => {
30
- e.style.overflow = "hidden", e.style.height = 0, t.setAttribute("aria-expanded", "true"), e.classList.add("block"), e.classList.add("show"), e.classList.remove("hidden"), window.setTimeout(() => {
31
- e.style.height = e.scrollHeight + "px";
32
- }, 33), window.setTimeout(() => {
33
- e.style.overflow = "";
34
- }, s);
35
- }, handleClose = (t, e, s) => {
36
- e.style.overflow = "hidden", e.style.height = 0, t.setAttribute("aria-expanded", "false"), e.classList.remove("show"), window.setTimeout(() => {
37
- e.classList.remove("block"), e.classList.add("hidden");
38
- }, s);
39
- }, Accordion = (t) => {
40
- let e = t.closest(".accordion-item").querySelector(".accordion-collapse");
41
- const s = getDuration(e);
42
- if (t.getAttribute("aria-expanded") === "true") {
43
- handleClose(t, e, s);
44
- return;
45
- }
46
- handleOpen(t, e, s), t.hasAttribute("data-parent") && t.closest(".accordion").querySelectorAll(".accordion-collapse").forEach((o) => {
47
- o !== e && handleClose(
48
- o.closest(".accordion-item").querySelector("[aria-expanded]"),
49
- o,
50
- s
51
- );
52
- });
53
- }, accordion = addEventListenerToSelector(
54
- '[data-toggle="accordion"]',
55
- "click",
56
- Accordion
57
- ), Dismiss = (t) => {
58
- let e = getTarget(t);
59
- e || (e = t.closest(".".concat(t.getAttribute("data-dismiss")))), e.classList.add("opacity-0"), setTimeout(() => e.remove(), getDuration(e));
60
- }, dismiss = addEventListenerToSelector(
61
- "[data-dismiss]",
62
- "click",
63
- Dismiss
64
- ), Collapse = (t) => {
65
- let e = getTarget(t);
66
- if (!e)
67
- return;
68
- const s = getDuration(e);
69
- if (e.style.overflow = "hidden", e.style.height = 0, t.getAttribute("aria-expanded") === "true") {
70
- t.setAttribute("aria-expanded", "false"), e.classList.remove("show"), window.setTimeout(() => e.classList.remove("block"), s);
71
- return;
72
- }
73
- t.setAttribute("aria-expanded", "true"), e.classList.add("block"), e.classList.add("show"), window.setTimeout(() => {
74
- e.querySelectorAll(".dropdown-menu").forEach((i) => i.classList.add("hidden"));
75
- let o = e.scrollHeight;
76
- e.querySelectorAll(".dropdown-menu").forEach((i) => i.classList.remove("hidden")), e.style.height = o + "px";
77
- }, 32), window.setTimeout(() => e.style.overflow = "", s);
78
- }, collapse = addEventListenerToSelector(
79
- '[data-toggle="collapse"]',
80
- "click",
81
- Collapse
82
- ), Dropdown = (trigger) => {
83
- const { computePosition, shift, offset } = window.FloatingUIDOM, target = trigger.nextElementSibling, parent = trigger.parentElement, options = eval("(" + trigger.dataset.options + ")" || "") || {};
84
- let middleware = [
85
- offset(6),
86
- shift({
87
- padding: 5
88
- })
89
- ];
90
- function update() {
91
- computePosition(trigger, target, {
92
- placement: options.placement || "bottom",
93
- middleware
94
- }).then(({ x: t, y: e }) => {
95
- Object.assign(target.style, {
96
- left: "".concat(t, "px"),
97
- top: "".concat(e, "px")
98
- });
99
- });
100
- }
101
- const show = () => {
102
- target.style.display = "block", requestAnimationFrame(() => {
103
- target.classList.add("opacity-100", "visible");
104
- }), update();
105
- }, hide = () => {
106
- target.style.display = "", target.classList.remove("opacity-100", "visible");
107
- }, toggle = () => {
108
- if (target.style.display === "block") {
109
- hide();
110
- return;
111
- }
112
- show();
113
- };
114
- parent.addEventListener("focusout", (t) => {
115
- parent.contains(t.relatedTarget) || !document.hasFocus() || hide();
116
- }), addEventListeners(trigger, ["click"], toggle), addEscapeListener(hide);
117
- }, dropdown = () => document.querySelectorAll('[data-toggle="dropdown"]').forEach(Dropdown), defaults = {
118
- closeButton: "fixed right-0 top-0 z-50 text-white px-5 close"
119
- }, Modal = (t) => {
120
- const e = parseElementOptions(t), { size: s, beforeShown: o } = e, i = e.id || "v-modal";
121
- let r = t.dataset.html || "";
122
- e.imgSrc && (r = '<img src="'.concat(e.imgSrc, '">')), e.iframeSrc && (r = '<iframe allow="autoplay" class="aspect-video w-full" src="'.concat(e.iframeSrc, '" allowfullscreen="" autoplay=""></iframe>'));
123
- let a = '<div class="modal" id="'.concat(i, '">\n <div class="modal-content ').concat(s ? "modal-".concat(s) : "", '">\n ').concat(r, "\n </div>\n\n <button onclick=\"removeModal('").concat(i, '\')" type="button" class="').concat(defaults.closeButton, '" data-dismiss="modal" aria-label="Close">\n <span class="text-4xl" aria-hidden="true">&times;</span>\n </button>\n\n <div class="modal-bg" onclick="removeModal(\'').concat(i, "')\"></div>\n</div>\n");
124
- document.addEventListener(
125
- "keydown",
126
- (l) => l.keyCode == 27 && window.removeModal(i)
127
- ), document.body.style.overflow = "hidden", document.body.insertAdjacentHTML("beforeend", a), waitForElement("#" + i).then((l) => {
128
- o && window[o](), window.setTimeout(() => l.classList.add("opacity-100"), 32);
129
- });
130
- }, removeModal = (t = "v-modal") => {
131
- let e = document.getElementById(t);
132
- e.classList.remove("opacity-100"), window.setTimeout(() => {
133
- e.remove(), document.body.style.overflow = "";
134
- }, 500);
135
- };
136
- window.removeModal = removeModal;
137
- const modal = addEventListenerToSelector(
138
- '[data-toggle="modal"]',
139
- "click",
140
- Modal
141
- ), Tabs = (t) => {
142
- if (t.getAttribute("aria-selected") === "true")
143
- return null;
144
- let e = document.querySelector(
145
- '[aria-labelledby="'.concat(t.getAttribute("aria-controls"), '"]')
146
- );
147
- if (!e)
148
- return null;
149
- let s = t.classList.value, o = t.parentNode;
150
- for (; o && o.getAttribute("role") !== "tablist"; )
151
- o = o.parentNode;
152
- let i = o.querySelectorAll('[aria-selected="true"]');
153
- if (!i || i.length === 0)
154
- return null;
155
- let r = i[0].classList.value;
156
- if (o.querySelectorAll('[role="tab"]').forEach((a) => {
157
- a.classList = s, a.setAttribute("aria-selected", "false");
158
- }), t.classList = r, t.setAttribute("aria-selected", "true"), e.getAttribute("role") === "tabcontent") {
159
- [...e.children].forEach((a) => {
160
- a.getAttribute("role") === "tabpanel" && a.classList.remove("hidden");
161
- });
162
- return;
163
- }
164
- [...e.parentNode.children].forEach((a) => {
165
- a.getAttribute("role") === "tabpanel" && a.classList.add("hidden");
166
- }), e.classList.remove("hidden");
167
- }, tabs = addEventListenerToSelector('[role="tab"]', "click", Tabs);
168
- (function() {
169
- window.vInitialized = !1, window.initializeVUI = () => {
170
- window.vInitialized || (window.vInitialized = !0, accordion(), collapse(), dismiss(), dropdown(), modal(), tabs(), handleResize());
171
- }, document.addEventListener("DOMContentLoaded", initializeVUI), document.readyState !== "loading" && initializeVUI();
172
- })();
1
+ const e=e=>document.querySelector(e),t=(e,t=document)=>Array.from(t.querySelectorAll(e)),n=t=>{let n=t.dataset.target;return n?e(n):null},r=e=>{let t=window.getComputedStyle(e).getPropertyValue(`transition-duration`);return t?parseInt(t.replace(`s`,``))*1e3+1:0},i=e=>e.getAttribute(`aria-expanded`)===`true`,a=(e,t,n)=>{t.forEach(t=>{e.addEventListener(t,n)})},o=e=>{document.addEventListener(`keydown`,t=>{t.key===`Escape`&&e()})},s=(e,n,r)=>()=>t(e).forEach(e=>{e.addEventListener(n,()=>r(e))}),c=()=>window.addEventListener(`resize`,()=>{t(`[data-toggle="collapse"]`).forEach(e=>{let t=n(e);t&&(e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),t.classList.remove(`block`),t.style.height=`auto`,t.style.overflow=``)})}),l=t=>new Promise(n=>{if(e(t))return n(e(t));let r=new MutationObserver(()=>{e(t)&&(n(e(t)),r.disconnect())});r.observe(document.body,{childList:!0,subtree:!0})}),u=e=>{let t=e.dataset.options;if(!t)return{};try{return JSON.parse(t.replaceAll(`'`,`"`))}catch{return{}}},d=e=>{let n=`[data-toggle="${e}"]`;return t(n)},f=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),t.classList.remove(`hidden`),window.setTimeout(()=>{t.style.height=`${t.scrollHeight}px`},33),window.setTimeout(()=>{t.style.overflow=``},n)},p=(e,t,n)=>{t.style.overflow=`hidden`,t.style.height=`0`,e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>{t.classList.remove(`block`),t.classList.add(`hidden`)},n)},m=e=>{let{min:n,max:o}={min:0,max:null,...u(e)},s=o===null,c=t(`.accordion-item [aria-expanded]`,e).reduce((e,t)=>{let n=t.closest(`.accordion-item`),r=n?.querySelector(`.accordion-collapse`);return n&&r instanceof HTMLElement&&e.push({trigger:t,target:r}),e},[]),l=()=>c.filter(({trigger:e})=>i(e)).length,d=({trigger:e,target:t})=>{let a=i(e),o=r(t);s===!1&&l()===n&&a||(a||f(e,t,o),s===!1?c.forEach(t=>{!a&&t.trigger===e||p(t.trigger,t.target,o)}):a&&p(e,t,o))};c.forEach(e=>{a(e.trigger,[`click`],()=>d(e))}),n===1&&l()===0&&c.length>0&&c[0].trigger.click()},h=()=>{t(`.accordion-header[data-toggle=accordion]`).forEach(e=>{console.log(e);let t=e.closest(`.accordion`);if(t){t.setAttribute(`data-toggle`,`accordion`),e.hasAttribute(`data-parent`)&&!t.hasAttribute(`data-options`)&&t.setAttribute(`data-options`,`{'min': 1, 'max': 1}`);return}e.removeAttribute(`data-toggle`)}),d(`accordion`).forEach(m)},g=s(`[data-dismiss]`,`click`,e=>{let t=n(e);t||=e.closest(`.${e.getAttribute(`data-dismiss`)}`),t&&(t.classList.add(`opacity-0`),setTimeout(()=>t.remove(),r(t)))}),_=s(`[data-toggle="collapse"]`,`click`,e=>{let t=n(e);if(!t)return;let i=r(t);if(t.style.overflow=`hidden`,t.style.height=`0px`,e.getAttribute(`aria-expanded`)===`true`){e.setAttribute(`aria-expanded`,`false`),t.classList.remove(`show`),window.setTimeout(()=>t.classList.remove(`block`),i);return}e.setAttribute(`aria-expanded`,`true`),t.classList.add(`block`),t.classList.add(`show`),window.setTimeout(()=>{t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.add(`hidden`));let e=t.scrollHeight;t.querySelectorAll(`.dropdown-menu`).forEach(e=>e.classList.remove(`hidden`)),t.style.height=`${e}px`},32),window.setTimeout(()=>t.style.overflow=``,i)}),v=e=>{let{computePosition:t,shift:n,offset:r}=window.FloatingUIDOM,i=e.nextElementSibling,s=e.parentElement;if(!i||!s||!(i instanceof HTMLElement)||!(s instanceof HTMLElement))return;let c=u(e),l=[r(6),n({padding:5})];function d(){t(e,i,{placement:c.placement||`bottom`,middleware:l}).then(({x:e,y:t})=>{Object.assign(i.style,{left:`${e}px`,top:`${t}px`})})}let f=()=>{i.style.display=`block`,window.requestAnimationFrame(()=>{i.classList.add(`opacity-100`,`visible`)}),d()},p=()=>{i.style.display=``,i.classList.remove(`opacity-100`,`visible`)};s.addEventListener(`focusout`,e=>{e?.relatedTarget&&(s.contains(e.relatedTarget)||!document.hasFocus()||p())}),a(e,[`click`],()=>{if(i.style.display===`block`){p();return}f()}),o(p)},y=()=>d(`dropdown`).forEach(v),b={closeButton:`fixed right-0 top-0 z-50 text-white px-5 close`},x=e=>{let{size:t,beforeShown:n,id:r,imgSrc:i,iframeSrc:a}={id:`v-modal`,size:void 0,beforeShown:void 0,imgSrc:void 0,iframeSrc:void 0,...u(e)},s=e.dataset.html||``;i&&(s=`<img src="${i}">`),a&&(s=`<iframe allow="autoplay" class="aspect-video w-full" src="${a}" allowfullscreen="" autoplay=""></iframe>`);let c=`<div class="modal" id="${r}">
2
+ <div class="modal-content ${t?`modal-${t}`:``}">
3
+ ${s}
4
+ </div>
5
+
6
+ <button onclick="removeModal('${r}')" type="button" class="${b.closeButton}" data-dismiss="modal" aria-label="Close">
7
+ <span class="text-4xl" aria-hidden="true">&times;</span>
8
+ </button>
9
+
10
+ <div class="modal-bg" onclick="removeModal('${r}')"></div>
11
+ </div>
12
+ `;o(()=>window.removeModal(r)),document.body.style.overflow=`hidden`,document.body.insertAdjacentHTML(`beforeend`,c),l(`#${r}`).then(e=>{n&&window[n](),window.setTimeout(()=>e.classList.add(`opacity-100`),32)})},S=(e=`v-modal`)=>{let t=document.getElementById(e);t&&(t.classList.remove(`opacity-100`),window.setTimeout(()=>{t.remove(),document.body.style.overflow=``},500))};window.removeModal=S;const C=s(`[data-toggle="modal"]`,`click`,x),w=s(`[role="tab"]`,`click`,t=>{if(t.getAttribute(`aria-selected`)===`true`)return null;let n=e(`[aria-labelledby="${t.getAttribute(`aria-controls`)}"]`);if(!n)return null;let r=t.classList.value,i=t.parentNode;for(;i&&(!(i instanceof HTMLElement)||i.getAttribute(`role`)!==`tablist`);)i=i.parentNode;if(!(i instanceof HTMLElement))return null;let a=i.querySelectorAll(`[aria-selected="true"]`);if(!a||a.length===0)return null;let o=a[0].classList.value;if(i.querySelectorAll(`[role="tab"]`).forEach(e=>{e.classList=r,e.setAttribute(`aria-selected`,`false`)}),t.classList=o,t.setAttribute(`aria-selected`,`true`),n.getAttribute(`role`)===`tabcontent`){Array.from(n.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.remove(`hidden`)});return}if(!n.parentNode)return null;Array.from(n.parentNode.children).forEach(e=>{e.getAttribute(`role`)===`tabpanel`&&e.classList.add(`hidden`)}),n.classList.remove(`hidden`)});(function(){window.vInitialized=!1,window.initializeVUI=()=>{window.vInitialized||(window.vInitialized=!0,h(),_(),g(),y(),C(),w(),c())},document.addEventListener(`DOMContentLoaded`,window.initializeVUI),document.readyState!==`loading`&&window.initializeVUI()})();
@@ -0,0 +1,11 @@
1
+ import { combine, javascript, typescript, prettier } from '@kainstar/eslint-config';
2
+
3
+ export default combine(
4
+ javascript(),
5
+ typescript({
6
+ overrides: {
7
+ 'ts/ban-ts-comment': 'off',
8
+ },
9
+ }),
10
+ prettier(true),
11
+ );
package/index.html CHANGED
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
@@ -9,6 +9,7 @@
9
9
  </head>
10
10
 
11
11
  <body>
12
+ <script src="https://d1pnnwteuly8z3.cloudfront.net/libs/floating-ui/1.0.1/floating-ui.min.js"></script>
12
13
  <script src="./dist/versoly-ui.js"></script>
13
14
  </body>
14
15
  </html>
package/package.json CHANGED
@@ -1,35 +1,26 @@
1
1
  {
2
2
  "name": "versoly-ui",
3
- "version": "2.1.1",
3
+ "version": "2.2.0",
4
4
  "description": "Versoly UI - Tailwind CSS framework based on Bootstrap",
5
5
  "author": "Versoly",
6
6
  "keywords": [
7
- "versoly",
8
- "versoly ui",
9
- "tailwind",
10
7
  "tailwind components",
11
8
  "tailwind elements",
12
9
  "tailwind library",
13
10
  "tailwind sections",
14
- "tailwind css",
15
11
  "tailwind ui",
16
12
  "ui kit",
17
13
  "bootstrap to tailwind",
18
- "html",
19
- "css",
20
- "javascript",
21
14
  "dropdown Floating UI"
22
15
  ],
23
16
  "license": "MIT",
24
- "main": "dist/versoly-ui.umd.cjs",
17
+ "main": "./dist/versoly-ui.js",
25
18
  "unpkg": "dist/versoly-ui.iife.js",
26
19
  "jsdelivr": "dist/versoly-ui.iife.js",
27
- "module": "./dist/versoly-ui.js",
20
+ "module": "./dist/versoly-ui.mjs",
28
21
  "exports": {
29
- ".": {
30
- "import": "./dist/versoly-ui.js",
31
- "require": "./dist/versoly-ui.umd.cjs"
32
- }
22
+ ".": "./dist/versoly-ui.js",
23
+ "./package.json": "./package.json"
33
24
  },
34
25
  "repository": {
35
26
  "type": "git",
@@ -44,12 +35,17 @@
44
35
  ],
45
36
  "scripts": {
46
37
  "dev": "vite",
47
- "build": "vite build"
38
+ "build": "tsdown",
39
+ "build:watch": "tsdown --watch"
48
40
  },
49
41
  "devDependencies": {
50
- "vite": "^5.0.10"
51
- },
52
- "dependencies": {
53
- "@floating-ui/dom": "^1.0.1"
42
+ "@kainstar/eslint-config": "^2.0.0",
43
+ "eslint": "^9.35.0",
44
+ "eslint-plugin-prettier": "^5.5.4",
45
+ "prettier": "^3.6.2",
46
+ "tsdown": "^0.15.1",
47
+ "type-fest": "^4.41.0",
48
+ "typescript": "^5.9.2",
49
+ "vite": "^7.1.5"
54
50
  }
55
51
  }
@@ -0,0 +1,20 @@
1
+ /** @type {import('prettier').Config} */
2
+ export default {
3
+ printWidth: 120,
4
+ singleQuote: true,
5
+ proseWrap: 'never',
6
+ overrides: [
7
+ {
8
+ files: '**/*.json',
9
+ options: {
10
+ parser: 'json-stringify',
11
+ },
12
+ },
13
+ {
14
+ files: ['.vscode/*.json', '**/tsconfig.json'],
15
+ options: {
16
+ parser: 'jsonc',
17
+ },
18
+ },
19
+ ],
20
+ };
@@ -1,12 +1,4 @@
1
- import {
2
- accordion,
3
- collapse,
4
- dismiss,
5
- dropdown,
6
- modal,
7
- tabs,
8
- handleResize,
9
- } from "./components";
1
+ import { accordion, collapse, dismiss, dropdown, modal, tabs, handleResize } from './plugins/index';
10
2
 
11
3
  (function () {
12
4
  window.vInitialized = false;
@@ -26,8 +18,8 @@ import {
26
18
  handleResize();
27
19
  };
28
20
 
29
- document.addEventListener("DOMContentLoaded", initializeVUI);
30
- if (document.readyState !== "loading") {
31
- initializeVUI();
21
+ document.addEventListener('DOMContentLoaded', window.initializeVUI);
22
+ if (document.readyState !== 'loading') {
23
+ window.initializeVUI();
32
24
  }
33
25
  })();
@@ -0,0 +1,121 @@
1
+ import type { IAccordionOptions } from 'src/types';
2
+ import {
3
+ addEventListeners,
4
+ getDuration,
5
+ getElementsBySelectors,
6
+ getElementsByToggle,
7
+ getIsAriaExpanded,
8
+ parseElementOptions,
9
+ } from '../utils/index';
10
+
11
+ interface IAccordionItem {
12
+ trigger: HTMLElement;
13
+ target: HTMLElement;
14
+ }
15
+
16
+ const handleOpen = (trigger: HTMLElement, target: HTMLElement, duration: number) => {
17
+ target.style.overflow = 'hidden';
18
+ target.style.height = '0';
19
+
20
+ trigger.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 handleClose = (trigger: HTMLElement, target: HTMLElement, duration: number) => {
35
+ target.style.overflow = 'hidden';
36
+ target.style.height = '0';
37
+
38
+ trigger.setAttribute('aria-expanded', 'false');
39
+ target.classList.remove('show');
40
+
41
+ window.setTimeout(() => {
42
+ target.classList.remove('block');
43
+ target.classList.add('hidden');
44
+ }, duration);
45
+ };
46
+
47
+ const Accordion = (element: HTMLElement) => {
48
+ const options: IAccordionOptions = {
49
+ min: 0,
50
+ max: null,
51
+ ...parseElementOptions(element),
52
+ };
53
+ const { min, max } = options;
54
+
55
+ const canOpenMultiple = max === null;
56
+
57
+ const items: IAccordionItem[] = getElementsBySelectors('.accordion-item [aria-expanded]', element).reduce(
58
+ (acc: IAccordionItem[], trigger) => {
59
+ const item = trigger.closest('.accordion-item');
60
+ const target = item?.querySelector('.accordion-collapse');
61
+ if (item && target instanceof HTMLElement) {
62
+ acc.push({ trigger, target });
63
+ }
64
+ return acc;
65
+ },
66
+ [],
67
+ );
68
+
69
+ const getOpenCount = () => items.filter(({ trigger }) => getIsAriaExpanded(trigger)).length;
70
+
71
+ const toggle = ({ trigger, target }: IAccordionItem) => {
72
+ const isOpen = getIsAriaExpanded(trigger);
73
+ const duration = getDuration(target);
74
+
75
+ if (canOpenMultiple === false && getOpenCount() === min && isOpen) {
76
+ return;
77
+ }
78
+
79
+ if (!isOpen) {
80
+ handleOpen(trigger, target, duration);
81
+ }
82
+
83
+ if (canOpenMultiple === false) {
84
+ items.forEach((item) => {
85
+ if (!isOpen && item.trigger === trigger) {
86
+ return;
87
+ }
88
+ handleClose(item.trigger, item.target, duration);
89
+ });
90
+ } else if (isOpen) {
91
+ handleClose(trigger, target, duration);
92
+ }
93
+ };
94
+
95
+ items.forEach((item) => {
96
+ addEventListeners(item.trigger, ['click'], () => toggle(item));
97
+ });
98
+
99
+ if (min === 1 && getOpenCount() === 0 && items.length > 0) {
100
+ items[0].trigger.click();
101
+ }
102
+ };
103
+
104
+ export const accordion = () => {
105
+ // legacy support for accordion via data attributes on headers
106
+ getElementsBySelectors('.accordion-header[data-toggle=accordion]').forEach((element) => {
107
+ const parentAccordion = element.closest('.accordion');
108
+ if (parentAccordion) {
109
+ parentAccordion.setAttribute('data-toggle', 'accordion');
110
+
111
+ if (element.hasAttribute('data-parent') && !parentAccordion.hasAttribute('data-options')) {
112
+ parentAccordion.setAttribute('data-options', "{'min': 1, 'max': 1}");
113
+ }
114
+ return;
115
+ }
116
+
117
+ element.removeAttribute('data-toggle');
118
+ });
119
+
120
+ getElementsByToggle('accordion').forEach(Accordion);
121
+ };