versoly-ui 2.0.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 +25 -4
- package/dist/versoly-ui.iife.js +12 -0
- package/dist/versoly-ui.js +12 -2
- package/dist/versoly-ui.mjs +12 -0
- package/eslint.config.ts +11 -0
- package/index.html +15 -0
- package/package.json +21 -33
- package/prettier.config.js +20 -0
- package/src/index.ts +25 -0
- 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 +35 -0
- package/.babelrc +0 -7
- package/.env +0 -3
- package/dist/versoly-ui.js.map +0 -1
- package/src/js/components/accordion.js +0 -35
- package/src/js/components/collapse.js +0 -36
- package/src/js/components/common.js +0 -30
- package/src/js/components/dismiss.js +0 -13
- package/src/js/components/dropdown.js +0 -58
- package/src/js/components/modal.js +0 -60
- package/src/js/components/tabs.js +0 -53
- package/src/js/utils/index.js +0 -68
- package/src/js/versoly-ui.js +0 -1
- package/webpack.config.js +0 -53
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { IModalOptions } from 'src/types';
|
|
2
|
+
import { waitForElement, parseElementOptions, addEventListenerToSelector, addEscapeListener } from '../utils';
|
|
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 Modal = (element: HTMLElement) => {
|
|
14
|
+
const options: IModalOptions = {
|
|
15
|
+
id: 'v-modal',
|
|
16
|
+
size: undefined,
|
|
17
|
+
beforeShown: undefined,
|
|
18
|
+
imgSrc: undefined,
|
|
19
|
+
iframeSrc: undefined,
|
|
20
|
+
...parseElementOptions(element),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const { size, beforeShown, id, imgSrc, iframeSrc } = options;
|
|
24
|
+
|
|
25
|
+
let content = element.dataset.html || '';
|
|
26
|
+
|
|
27
|
+
if (imgSrc) {
|
|
28
|
+
content = `<img src="${imgSrc}">`;
|
|
29
|
+
}
|
|
30
|
+
if (iframeSrc) {
|
|
31
|
+
content = `<iframe allow="autoplay" class="aspect-video w-full" src="${iframeSrc}" allowfullscreen="" autoplay=""></iframe>`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const modalHTML = `<div class="modal" id="${id}">
|
|
35
|
+
<div class="modal-content ${size ? `modal-${size}` : ''}">
|
|
36
|
+
${content}
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<button class="${defaults.closeButton}" onclick="removeModal('${id}')" type="button" data-dismiss="modal" aria-label="Close">
|
|
40
|
+
<span class="text-4xl" aria-hidden="true">×</span>
|
|
41
|
+
</button>
|
|
42
|
+
|
|
43
|
+
<div class="modal-bg" onclick="removeModal('${id}')"></div>
|
|
44
|
+
</div>
|
|
45
|
+
`;
|
|
46
|
+
|
|
47
|
+
addEscapeListener(() => window.removeModal(id));
|
|
48
|
+
document.body.style.overflow = 'hidden';
|
|
49
|
+
document.body.insertAdjacentHTML('beforeend', modalHTML);
|
|
50
|
+
|
|
51
|
+
waitForElement(`#${id}`).then((ele) => {
|
|
52
|
+
beforeShown && (window as any)[beforeShown]();
|
|
53
|
+
window.setTimeout(() => ele.classList.add('opacity-100'), 32);
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const removeModal = (id = 'v-modal') => {
|
|
58
|
+
const modal = document.getElementById(id);
|
|
59
|
+
|
|
60
|
+
if (!modal) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
modal.classList.remove('opacity-100');
|
|
65
|
+
window.setTimeout(() => {
|
|
66
|
+
modal.remove();
|
|
67
|
+
document.body.style.overflow = '';
|
|
68
|
+
}, 500);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
window.removeModal = removeModal;
|
|
72
|
+
|
|
73
|
+
export const modal = addEventListenerToSelector('[data-toggle="modal"]', 'click', Modal);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { addEventListenerToSelector, getElementBySelector } from '../utils/index';
|
|
2
|
+
|
|
3
|
+
const Tabs = (element: HTMLElement) => {
|
|
4
|
+
if (element.getAttribute('aria-selected') === 'true') {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const target = getElementBySelector(`[aria-labelledby="${element.getAttribute('aria-controls')}"]`);
|
|
9
|
+
if (!target) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const inactiveClass = element.classList.value;
|
|
14
|
+
|
|
15
|
+
let tablist: ParentNode | null = element.parentNode;
|
|
16
|
+
while (tablist && (!(tablist instanceof HTMLElement) || tablist.getAttribute('role') !== 'tablist')) {
|
|
17
|
+
tablist = tablist.parentNode;
|
|
18
|
+
}
|
|
19
|
+
if (!(tablist instanceof HTMLElement)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const activeTabs = tablist.querySelectorAll('[aria-selected="true"]');
|
|
24
|
+
if (!activeTabs || activeTabs.length === 0) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const activeClass = activeTabs[0].classList.value;
|
|
28
|
+
|
|
29
|
+
tablist.querySelectorAll('[role="tab"]').forEach((tab) => {
|
|
30
|
+
tab.classList = inactiveClass;
|
|
31
|
+
tab.setAttribute('aria-selected', 'false');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
element.classList = activeClass;
|
|
35
|
+
element.setAttribute('aria-selected', 'true');
|
|
36
|
+
|
|
37
|
+
if (target.getAttribute('role') === 'tabcontent') {
|
|
38
|
+
Array.from(target.children).forEach((n) => {
|
|
39
|
+
if (n.getAttribute('role') === 'tabpanel') {
|
|
40
|
+
n.classList.remove('hidden');
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!target.parentNode) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
Array.from(target.parentNode.children).forEach((n) => {
|
|
51
|
+
if (n.getAttribute('role') === 'tabpanel') {
|
|
52
|
+
n.classList.add('hidden');
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
target.classList.remove('hidden');
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export const tabs = addEventListenerToSelector('[role="tab"]', 'click', Tabs);
|
package/src/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
vInitialized: boolean;
|
|
4
|
+
initializeVUI: () => void;
|
|
5
|
+
removeModal: (id?: string) => void;
|
|
6
|
+
FloatingUIDOM: any;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface IAccordionOptions {
|
|
11
|
+
min?: number;
|
|
12
|
+
max?: number | null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface IModalOptions {
|
|
16
|
+
id: string;
|
|
17
|
+
size?: 'sm' | 'lg' | 'xl';
|
|
18
|
+
beforeShown?: string;
|
|
19
|
+
imgSrc?: string;
|
|
20
|
+
iframeSrc?: string;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export const getElementBySelector = (selector: string) => document.querySelector(selector) as HTMLElement;
|
|
2
|
+
export const getElementsBySelectors = (selector: string, element: Document | HTMLElement = document) =>
|
|
3
|
+
Array.from(element.querySelectorAll(selector)) as HTMLElement[];
|
|
4
|
+
|
|
5
|
+
export const getTarget = (element: HTMLElement) => {
|
|
6
|
+
const attrValue = element.dataset.target;
|
|
7
|
+
if (!attrValue) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return getElementBySelector(attrValue);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const getDuration = (element: HTMLElement) => {
|
|
14
|
+
const duration = window.getComputedStyle(element).getPropertyValue('transition-duration');
|
|
15
|
+
|
|
16
|
+
if (!duration) {
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return parseInt(duration.replace('s', '')) * 1000 + 1;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const getIsAriaExpanded = (element: HTMLElement) => element.getAttribute('aria-expanded') === 'true';
|
|
24
|
+
|
|
25
|
+
export const addEventListeners = (
|
|
26
|
+
element: HTMLElement,
|
|
27
|
+
events: (keyof HTMLElementEventMap)[],
|
|
28
|
+
callback: EventListenerOrEventListenerObject,
|
|
29
|
+
) => {
|
|
30
|
+
events.forEach((event) => {
|
|
31
|
+
element.addEventListener(event, callback);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export const addEscapeListener = (callback: () => void) => {
|
|
36
|
+
document.addEventListener('keydown', (e) => {
|
|
37
|
+
if (e.key === 'Escape') {
|
|
38
|
+
callback();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const addEventListenerToSelector = (
|
|
44
|
+
selector: string,
|
|
45
|
+
eventListener: keyof HTMLElementEventMap,
|
|
46
|
+
callback: (element: HTMLElement) => void,
|
|
47
|
+
) => {
|
|
48
|
+
return () =>
|
|
49
|
+
getElementsBySelectors(selector).forEach((element) => {
|
|
50
|
+
element.addEventListener(eventListener, () => callback(element));
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export const handleResize = () =>
|
|
55
|
+
window.addEventListener('resize', () => {
|
|
56
|
+
getElementsBySelectors('[data-toggle="collapse"]').forEach((element) => {
|
|
57
|
+
const target = getTarget(element);
|
|
58
|
+
|
|
59
|
+
if (!target) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
element.setAttribute('aria-expanded', 'false');
|
|
64
|
+
target.classList.remove('show');
|
|
65
|
+
target.classList.remove('block');
|
|
66
|
+
target.style.height = 'auto';
|
|
67
|
+
target.style.overflow = '';
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
export const waitForElement = (s: string): Promise<HTMLElement> => {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
if (getElementBySelector(s)) {
|
|
74
|
+
return resolve(getElementBySelector(s));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const observer = new MutationObserver(() => {
|
|
78
|
+
if (getElementBySelector(s)) {
|
|
79
|
+
resolve(getElementBySelector(s));
|
|
80
|
+
observer.disconnect();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const parseElementOptions = (element: HTMLElement): Record<string, any> => {
|
|
88
|
+
// eval('(' + trigger.dataset.options + ')' || '') || {};
|
|
89
|
+
const t = element.dataset.options;
|
|
90
|
+
if (!t) {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
return JSON.parse(t.replaceAll("'", '"'));
|
|
96
|
+
} catch {
|
|
97
|
+
return {};
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const getElementsByToggle = (toggleName: string) => {
|
|
102
|
+
const query = `[data-toggle="${toggleName}"]`;
|
|
103
|
+
const elements = getElementsBySelectors(query);
|
|
104
|
+
return elements;
|
|
105
|
+
};
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2015",
|
|
4
|
+
"baseUrl": ".",
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["esnext", "dom"],
|
|
7
|
+
"moduleResolution": "Bundler",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
},
|
|
13
|
+
"include": ["src"],
|
|
14
|
+
}
|
package/tsdown.config.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineConfig } from 'tsdown';
|
|
2
|
+
|
|
3
|
+
const sharedConfig = {
|
|
4
|
+
exports: true,
|
|
5
|
+
minify: true,
|
|
6
|
+
entry: {
|
|
7
|
+
'versoly-ui': './src/index.ts',
|
|
8
|
+
},
|
|
9
|
+
platform: 'browser',
|
|
10
|
+
} as const;
|
|
11
|
+
|
|
12
|
+
export default defineConfig([
|
|
13
|
+
{
|
|
14
|
+
...sharedConfig,
|
|
15
|
+
target: ['chrome58', 'firefox57', 'safari11', 'edge79'],
|
|
16
|
+
format: ['cjs', 'iife'],
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
...sharedConfig,
|
|
20
|
+
format: ['esm'],
|
|
21
|
+
},
|
|
22
|
+
]);
|
package/vite.config.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { name } from './package.json';
|
|
3
|
+
|
|
4
|
+
const getPackageName = () => {
|
|
5
|
+
return (name.includes('@') ? name.split('/')[1] : name).replace('.', '-');
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
const NAME = 'VersolyUI';
|
|
9
|
+
|
|
10
|
+
const fileName = {
|
|
11
|
+
es: `${getPackageName()}.mjs`,
|
|
12
|
+
cjs: `${getPackageName()}.cjs`,
|
|
13
|
+
iife: `${getPackageName()}.js`,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const config = {
|
|
17
|
+
build: {
|
|
18
|
+
target: ['chrome58', 'firefox57', 'safari11', 'edge79'],
|
|
19
|
+
lib: {
|
|
20
|
+
entry: resolve(__dirname, 'src/index.js'),
|
|
21
|
+
name: NAME,
|
|
22
|
+
formats: ['es', 'cjs', 'iife'],
|
|
23
|
+
fileName: (format) => fileName[format],
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
server: {
|
|
27
|
+
port: 3005,
|
|
28
|
+
hmr: true,
|
|
29
|
+
watch: {
|
|
30
|
+
usePolling: true,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default config;
|
package/.babelrc
DELETED
package/.env
DELETED
package/dist/versoly-ui.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"versoly-ui.js","mappings":"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","sources":["webpack:///./src/js/components/dropdown.js","webpack:///./src/js/utils/index.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/js/components/accordion.js","webpack:///./src/js/components/dismiss.js","webpack:///./src/js/components/collapse.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":["import { addEventListeners, addEscapeListener } from '../utils'\n\nexport default () => document.querySelectorAll('[data-toggle=\"dropdown\"]').forEach(trigger => {\n\n const {computePosition, shift, offset} = window.FloatingUIDOM;\n const target = trigger.nextElementSibling;\n const parent = trigger.parentElement;\n const options = eval('(' + trigger.dataset.options + ')' || '') || {};\n\n let middleware = [\n offset(6),\n shift({\n padding: 5,\n }),\n ];\n\n function update() {\n computePosition(trigger, target, {\n placement: options.placement || 'bottom',\n middleware,\n }).then(({ x, y }) => {\n Object.assign(target.style, {\n left: `${x}px`,\n top: `${y}px`,\n });\n });\n }\n\n const show = () => {\n target.style.display = 'block';\n requestAnimationFrame(() => {\n target.classList.add('opacity-100', 'visible');\n });\n update();\n };\n\n const hide = () => {\n target.style.display = '';\n target.classList.remove('opacity-100', 'visible');\n };\n\n const toggle = () => {\n if (target.style.display === 'block') {\n hide();\n return;\n }\n show();\n };\n\n parent.addEventListener('focusout', (e) => {\n if (parent.contains(e.relatedTarget) || !document.hasFocus()) {\n return\n };\n hide()\n });\n addEventListeners(trigger, ['click'], toggle)\n addEscapeListener(hide)\n})\n","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","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","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 { 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\n(function() {\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":["document","querySelectorAll","forEach","trigger","window","FloatingUIDOM","computePosition","shift","offset","target","nextElementSibling","parent","parentElement","options","eval","dataset","middleware","padding","update","placement","then","x","y","Object","assign","style","left","top","show","display","requestAnimationFrame","classList","add","hide","remove","toggle","addEventListener","e","contains","relatedTarget","hasFocus","addEventListeners","addEscapeListener","getTarget","element","getAttribute","getElementById","replace","getDuration","getComputedStyle","getPropertyValue","events","listenerFunction","event","key","addEventListenerToSelector","selector","eventListener","handleResize","setAttribute","height","overflow","waitForElement","s","d","Promise","resolve","querySelector","observer","MutationObserver","mutations","disconnect","observe","body","childList","subtree","parseElementOptions","t","JSON","parse","replaceAll","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","definition","o","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","closest","duration","setTimeout","scrollHeight","m","navHeight","defaults","removeModal","id","modal","size","beforeShown","content","html","imgSrc","iframeSrc","modalHTML","keyCode","insertAdjacentHTML","ele","_arrayLikeToArray","arr","len","length","i","arr2","Array","_toConsumableArray","isArray","iter","Symbol","iterator","from","minLen","n","toString","slice","constructor","name","test","TypeError","inactiveClass","value","tablist","parentNode","activeTabs","activeClass","tab","children","vInitialized","initializeVUI","accordion","collapse","dismiss","dropdown","tabs","readyState"],"sourceRoot":""}
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
|
@@ -1,36 +0,0 @@
|
|
|
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
|
|
@@ -1,30 +0,0 @@
|
|
|
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
|
-
(function() {
|
|
10
|
-
window.vInitialized = false
|
|
11
|
-
window.initializeVUI = () => {
|
|
12
|
-
if (window.vInitialized) {
|
|
13
|
-
return
|
|
14
|
-
}
|
|
15
|
-
window.vInitialized = true
|
|
16
|
-
accordion()
|
|
17
|
-
collapse()
|
|
18
|
-
dismiss()
|
|
19
|
-
dropdown()
|
|
20
|
-
modal()
|
|
21
|
-
tabs()
|
|
22
|
-
|
|
23
|
-
handleResize()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
document.addEventListener('DOMContentLoaded', initializeVUI)
|
|
27
|
-
if (document.readyState !== "loading") {
|
|
28
|
-
initializeVUI()
|
|
29
|
-
}
|
|
30
|
-
})();
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { addEventListeners, addEscapeListener } from '../utils'
|
|
2
|
-
|
|
3
|
-
export default () => document.querySelectorAll('[data-toggle="dropdown"]').forEach(trigger => {
|
|
4
|
-
|
|
5
|
-
const {computePosition, shift, offset} = window.FloatingUIDOM;
|
|
6
|
-
const target = trigger.nextElementSibling;
|
|
7
|
-
const parent = trigger.parentElement;
|
|
8
|
-
const options = eval('(' + trigger.dataset.options + ')' || '') || {};
|
|
9
|
-
|
|
10
|
-
let middleware = [
|
|
11
|
-
offset(6),
|
|
12
|
-
shift({
|
|
13
|
-
padding: 5,
|
|
14
|
-
}),
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
function update() {
|
|
18
|
-
computePosition(trigger, target, {
|
|
19
|
-
placement: options.placement || 'bottom',
|
|
20
|
-
middleware,
|
|
21
|
-
}).then(({ x, y }) => {
|
|
22
|
-
Object.assign(target.style, {
|
|
23
|
-
left: `${x}px`,
|
|
24
|
-
top: `${y}px`,
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const show = () => {
|
|
30
|
-
target.style.display = 'block';
|
|
31
|
-
requestAnimationFrame(() => {
|
|
32
|
-
target.classList.add('opacity-100', 'visible');
|
|
33
|
-
});
|
|
34
|
-
update();
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const hide = () => {
|
|
38
|
-
target.style.display = '';
|
|
39
|
-
target.classList.remove('opacity-100', 'visible');
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const toggle = () => {
|
|
43
|
-
if (target.style.display === 'block') {
|
|
44
|
-
hide();
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
show();
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
parent.addEventListener('focusout', (e) => {
|
|
51
|
-
if (parent.contains(e.relatedTarget) || !document.hasFocus()) {
|
|
52
|
-
return
|
|
53
|
-
};
|
|
54
|
-
hide()
|
|
55
|
-
});
|
|
56
|
-
addEventListeners(trigger, ['click'], toggle)
|
|
57
|
-
addEscapeListener(hide)
|
|
58
|
-
})
|
|
@@ -1,60 +0,0 @@
|
|
|
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
|