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.
- package/.vscode/launch.json +28 -0
- package/.vscode/settings.template.json +4 -0
- package/README.md +23 -1
- package/dist/versoly-ui.iife.js +12 -0
- package/dist/versoly-ui.js +12 -1
- package/dist/versoly-ui.mjs +12 -172
- package/eslint.config.ts +11 -0
- package/index.html +2 -1
- package/package.json +15 -19
- package/prettier.config.js +20 -0
- package/src/{index.js → index.ts} +4 -12
- package/src/plugins/accordion.ts +121 -0
- package/src/plugins/collapse.ts +35 -0
- package/src/plugins/dismiss.ts +17 -0
- package/src/plugins/dropdown.ts +67 -0
- package/src/plugins/index.ts +7 -0
- package/src/plugins/modal.ts +73 -0
- package/src/plugins/tabs.ts +59 -0
- package/src/types.d.ts +22 -0
- package/src/utils/index.ts +105 -0
- package/tsconfig.json +14 -0
- package/tsdown.config.ts +22 -0
- package/vite.config.js +8 -8
- package/.babelrc +0 -7
- package/dist/versoly-ui.cjs +0 -1
- package/src/components/accordion.js +0 -69
- package/src/components/collapse.js +0 -43
- package/src/components/dismiss.js +0 -16
- package/src/components/dropdown.js +0 -60
- package/src/components/index.js +0 -7
- package/src/components/modal.js +0 -72
- package/src/components/tabs.js +0 -54
- package/src/utils/index.js +0 -68
|
@@ -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
|
+
}
|
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
|
-
|
|
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">×</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()})()})();
|
package/dist/versoly-ui.js
CHANGED
|
@@ -1 +1,12 @@
|
|
|
1
|
-
|
|
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">×</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()})();
|
package/dist/versoly-ui.mjs
CHANGED
|
@@ -1,172 +1,12 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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">×</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">×</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()})();
|
package/eslint.config.ts
ADDED
package/index.html
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!
|
|
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.
|
|
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.
|
|
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.
|
|
20
|
+
"module": "./dist/versoly-ui.mjs",
|
|
28
21
|
"exports": {
|
|
29
|
-
".":
|
|
30
|
-
|
|
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": "
|
|
38
|
+
"build": "tsdown",
|
|
39
|
+
"build:watch": "tsdown --watch"
|
|
48
40
|
},
|
|
49
41
|
"devDependencies": {
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
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(
|
|
30
|
-
if (document.readyState !==
|
|
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
|
+
};
|