@windwalker-io/unicorn-next 0.1.18 → 0.1.21
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/dist/chunks/_arrayPush.js +325 -108
- package/dist/chunks/_arrayPush.js.map +1 -1
- package/dist/chunks/_baseRest.js +155 -60
- package/dist/chunks/_baseRest.js.map +1 -1
- package/dist/chunks/_baseUnary.js +463 -0
- package/dist/chunks/_baseUnary.js.map +1 -0
- package/dist/chunks/_getPrototype.js +292 -100
- package/dist/chunks/_getPrototype.js.map +1 -1
- package/dist/chunks/alert-adapter.js +29 -0
- package/dist/chunks/alert-adapter.js.map +1 -0
- package/dist/chunks/alert.js +21 -0
- package/dist/chunks/alert.js.map +1 -0
- package/dist/chunks/arr.js +24 -0
- package/dist/chunks/arr.js.map +1 -0
- package/dist/chunks/button-radio.js +127 -145
- package/dist/chunks/button-radio.js.map +1 -1
- package/dist/chunks/checkboxes-multi-select.js +44 -43
- package/dist/chunks/checkboxes-multi-select.js.map +1 -1
- package/dist/chunks/chunk.js +24 -0
- package/dist/chunks/cloneDeep.js +679 -212
- package/dist/chunks/cloneDeep.js.map +1 -1
- package/dist/chunks/cropper.min.js +6 -5
- package/dist/chunks/cropper.min.js.map +1 -1
- package/dist/chunks/crypto.js +26 -0
- package/dist/chunks/crypto.js.map +1 -0
- package/dist/chunks/data.js +49 -0
- package/dist/chunks/data.js.map +1 -0
- package/dist/chunks/dom.js +128 -0
- package/dist/chunks/dom.js.map +1 -0
- package/dist/chunks/events.js +270 -0
- package/dist/chunks/events.js.map +1 -0
- package/dist/chunks/field-cascade-select.js +207 -250
- package/dist/chunks/field-cascade-select.js.map +1 -1
- package/dist/chunks/field-file-drag.js +175 -209
- package/dist/chunks/field-file-drag.js.map +1 -1
- package/dist/chunks/field-flatpickr.js +94 -898
- package/dist/chunks/field-flatpickr.js.map +1 -1
- package/dist/chunks/field-modal-select.js +728 -467
- package/dist/chunks/field-modal-select.js.map +1 -1
- package/dist/chunks/field-modal-tree.js +771 -766
- package/dist/chunks/field-modal-tree.js.map +1 -1
- package/dist/chunks/field-multi-uploader.js +249 -256
- package/dist/chunks/field-multi-uploader.js.map +1 -1
- package/dist/chunks/field-repeatable.js +111 -127
- package/dist/chunks/field-repeatable.js.map +1 -1
- package/dist/chunks/field-single-image-drag.js +286 -338
- package/dist/chunks/field-single-image-drag.js.map +1 -1
- package/dist/chunks/form.js +146 -159
- package/dist/chunks/form.js.map +1 -1
- package/dist/chunks/grid.js +349 -418
- package/dist/chunks/grid.js.map +1 -1
- package/dist/chunks/helper.js +39 -0
- package/dist/chunks/helper.js.map +1 -0
- package/dist/chunks/http-client.js +221 -211
- package/dist/chunks/http-client.js.map +1 -1
- package/dist/chunks/iframe-modal.js +95 -115
- package/dist/chunks/iframe-modal.js.map +1 -1
- package/dist/chunks/keep-tab.js +92 -101
- package/dist/chunks/keep-tab.js.map +1 -1
- package/dist/chunks/lang.js +250 -0
- package/dist/chunks/lang.js.map +1 -0
- package/dist/chunks/legacy.js +197 -201
- package/dist/chunks/legacy.js.map +1 -1
- package/dist/chunks/list-dependent.js +195 -228
- package/dist/chunks/list-dependent.js.map +1 -1
- package/dist/chunks/loader.js +106 -0
- package/dist/chunks/loader.js.map +1 -0
- package/dist/chunks/monthSelect.js +251 -0
- package/dist/chunks/monthSelect.js.map +1 -0
- package/dist/chunks/router.js +111 -0
- package/dist/chunks/router.js.map +1 -0
- package/dist/chunks/s3-multipart-uploader.js +183 -210
- package/dist/chunks/s3-multipart-uploader.js.map +1 -1
- package/dist/chunks/s3-uploader.js +106 -128
- package/dist/chunks/s3-uploader.js.map +1 -1
- package/dist/chunks/show-on.js +358 -205
- package/dist/chunks/show-on.js.map +1 -1
- package/dist/chunks/timing.js +10 -0
- package/dist/chunks/timing.js.map +1 -0
- package/dist/chunks/tinymce.js +153 -203
- package/dist/chunks/tinymce.js.map +1 -1
- package/dist/chunks/ui-bootstrap5.js +58 -72
- package/dist/chunks/ui-bootstrap5.js.map +1 -1
- package/dist/chunks/ui.js +320 -0
- package/dist/chunks/ui.js.map +1 -0
- package/dist/chunks/unicorn.js.map +1 -1
- package/dist/chunks/useQueue.js +111 -0
- package/dist/chunks/useQueue.js.map +1 -0
- package/dist/chunks/useStack.js +76 -0
- package/dist/chunks/useStack.js.map +1 -0
- package/dist/chunks/validation.js +761 -853
- package/dist/chunks/validation.js.map +1 -1
- package/dist/editor.css +1 -1
- package/dist/index.d.ts +27 -15
- package/dist/multi-level-menu.css +1 -1
- package/dist/switcher.css +1 -1
- package/dist/unicorn.js +805 -130
- package/dist/unicorn.js.map +1 -1
- package/package.json +3 -3
- package/src/composable/useBsModalAlert.ts +92 -12
- package/src/composable/useHttp.ts +13 -1
- package/src/module/s3-uploader.ts +1 -1
- package/src/service/ui.ts +31 -15
- package/vite.config.ts +5 -1
- package/dist/chunks/_commonjsHelpers.js +0 -7
- package/dist/chunks/index.js +0 -314
- package/dist/chunks/isArguments.js +0 -146
- package/dist/chunks/unicorn.js +0 -2580
package/dist/unicorn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicorn.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"unicorn.js","names":[],"sources":["../src/service/crypto.ts","../src/service/dom-watcher.ts","../src/composable/useUIBootstrap5.ts","../src/composable/useBsModalAlert.ts","../src/composable/useCheckboxesMultiSelect.ts","../src/composable/useFieldCascadeSelect.ts","../src/composable/useFieldFileDrag.ts","../src/composable/useFieldFlatpickr.ts","../src/composable/useFieldModalSelect.ts","../src/composable/useFieldModalTree.ts","../src/composable/useFieldRepeatable.ts","../src/composable/useFieldSingleImageDrag.ts","../src/composable/useForm.ts","../src/composable/useGrid.ts","../src/composable/useHttp.ts","../src/composable/useIframeModal.ts","../src/composable/useListDependent.ts","../src/composable/useS3Uploader.ts","../src/composable/useShowOn.ts","../src/composable/useTomSelect.ts","../src/composable/useTinymce.ts","../src/composable/useUniDirective.ts","../src/composable/useValidation.ts","../src/service/uri.ts","../src/utilities/base.ts","../src/app.ts","../src/polyfill/form-request-submit.ts","../src/polyfill/index.ts","../src/composable/useFieldMultiUploader.ts","../src/plugin/php-adapter.ts","../src/unicorn.ts"],"sourcesContent":["import { uid, tid, randomBytes, randomBytesString } from '@lyrasoft/ts-toolkit/generic';\n\nexport function base64UrlEncode(string: string): string {\n return btoa(String(string))\n .replace(/\\+/, '-')\n .replace(new RegExp('\\\\/'), '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64 URL decode\n */\nexport function base64UrlDecode(string: string): string {\n return atob(\n String(string)\n .replace(/-/, '+')\n .replace(/_/, '/')\n );\n}\n\nexport { uid, tid, randomBytes, randomBytesString };\n\nlet globalSerial = 1;\n\nexport function serial(): number {\n return globalSerial++;\n}\n","export function watchAttributes<T extends HTMLElement>(el: T, callback?: AttributeMutationCallback<T>) {\n return new AttributeMutationObserver<T>(el, callback);\n}\n\nexport type AttributeMutationCallback<T extends HTMLElement = HTMLElement> = (el: T, name: string, value: any, oldValue: any) => void;\nexport type AttributeWatcher<T extends HTMLElement = HTMLElement> = (el: T, value: any, oldValue: any) => void;\n\nexport class AttributeMutationObserver<T extends HTMLElement> {\n observer: MutationObserver;\n watches: Record<string, (AttributeWatcher<T>)[]> = {};\n\n constructor(protected element: T, public callback?: (el: T, name: string, value: any, oldValue: any) => void) {\n this.element = element;\n\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes') {\n const attrName = mutation.attributeName!;\n const target = mutation.target as T;\n const value = target.getAttribute(attrName);\n\n this.callback?.(\n target,\n attrName,\n value,\n mutation.oldValue\n );\n\n if (this.watches[attrName]) {\n for (const watch of this.watches[attrName]) {\n watch(target, value, mutation.oldValue);\n }\n }\n }\n }\n });\n\n this.observe();\n }\n\n watch(name: string, callback: AttributeWatcher<T>): () => void {\n this.watches[name] ??= [];\n this.watches[name].push(callback);\n\n return () => {\n this.watches[name] = this.watches[name].filter(fn => fn !== callback);\n };\n }\n\n observe() {\n this.observer.observe(this.element, {\n attributes: true,\n attributeOldValue: true,\n });\n }\n\n disconnect() {\n this.observer.disconnect();\n }\n}\n\n\n","import type { Tooltip } from 'bootstrap';\nimport { ButtonRadioOptions } from '../bootstrap/button-radio';\nimport type { KeepTabOptions } from '../bootstrap/keep-tab';\nimport type { UIBootstrap5 } from '../module/ui-bootstrap5';\nimport { useUITheme } from '../service';\n\nexport async function useUIBootstrap5(install = false, pushToGlobal = false): Promise<UIBootstrap5> {\n const { UIBootstrap5 } = await import('../module/ui-bootstrap5');\n\n const theme = UIBootstrap5.get();\n\n if (install) {\n useUITheme(theme);\n\n if (pushToGlobal) {\n theme.pushBootstrapToGlobal();\n }\n }\n\n return theme;\n}\n\nexport async function useBs5Tooltip(\n selector: NodeListOf<Element> | Element | string = '[data-bs-toggle=\"tooltip\"]',\n config: Partial<Tooltip.Options> = {}\n): Promise<Tooltip[]> {\n const bs5 = await useUIBootstrap5();\n\n return bs5.tooltip(selector, config);\n}\n\nexport const useBs5KeepTab: typeof UIBootstrap5.prototype.keepTab = async (\n selector?: string | HTMLElement,\n options: KeepTabOptions = {}\n): Promise<any> => {\n const bs5 = await useUIBootstrap5();\n\n return bs5.keepTab(selector, options);\n};\n\nexport const useBs5ButtonRadio: typeof UIBootstrap5.prototype.buttonRadio = async (\n selector?: string | HTMLElement,\n options: ButtonRadioOptions = {}\n): Promise<any> => {\n const bs5 = await useUIBootstrap5();\n\n return bs5.buttonRadio(selector, options);\n};\n\n\n","import { Modal } from 'bootstrap';\nimport { html } from '../service';\nimport { useUIBootstrap5 } from './useUIBootstrap5';\nimport { promiseWithResolvers } from '@lyrasoft/ts-toolkit/generic';\n\nexport interface BsModalAlertOptions {\n header?: string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);\n title?: string;\n text?: string;\n icon?: string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);\n content?: string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);\n size?: 'sm' | 'lg' | 'xl' | 'xxl';\n relatedTarget?: HTMLElement;\n buttons?: BsModalButton[];\n configure?: (el: HTMLElement) => HTMLElement | undefined;\n}\n\nexport type BsModalButton = {\n text?: string | ((button: HTMLElement) => void);\n class?: string;\n attrs?: Record<string, string>;\n styles?: Record<string, string>;\n dismiss?: boolean;\n value?: any;\n href?: string;\n target?: string;\n onClick?: (value?: any, e?: MouseEvent) => any;\n} | string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);\n\nlet currentOpenedModals: Record<string, BsModalAlertInstance> = {};\n\nexport interface BsModalAlertInstance {\n show(options: BsModalAlertOptions): Promise<any>;\n\n show(title: string, text?: string, icon?: string, options?: BsModalAlertOptions): Promise<any>;\n\n show(title: BsModalAlertOptions | string, text?: string, icon?: string, options?: BsModalAlertOptions): Promise<any>;\n\n hide: () => void;\n toggle: (relatedTarget?: HTMLElement) => void;\n dispose: () => void;\n destroy: () => void;\n instance: Modal;\n el: HTMLElement;\n on: (event: string, handler: (e: Event) => void) => () => void;\n off: (event: string, handler: (e: Event) => void) => void;\n}\n\nconst defaultOptions = {\n buttons: [\n 'OK'\n ],\n};\n\nexport async function useBsModalAlert(\n options: Partial<Modal.Options>\n): Promise<BsModalAlertInstance>\nexport async function useBsModalAlert(\n id?: string | HTMLElement,\n options?: Partial<Modal.Options>\n): Promise<BsModalAlertInstance>;\nexport async function useBsModalAlert(\n id?: string | HTMLElement | Partial<Modal.Options>,\n options?: Partial<Modal.Options>\n): Promise<BsModalAlertInstance> {\n await useUIBootstrap5();\n\n let modalElement: HTMLElement | null | undefined = undefined;\n\n if (typeof id !== 'string' && !(id instanceof HTMLElement)) {\n options = id;\n id = 'uni-modal-alert';\n modalElement = document.getElementById(id);\n } else {\n modalElement = typeof id === 'string' ? document.getElementById(id) : id;\n }\n\n if (!modalElement) {\n modalElement = html<HTMLDivElement>(`<div id=\"${id}\" class=\"uni-modal-alert modal fade\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-dialog-centered\" role=\"document\">\n <div class=\"modal-content\">\n <div class=\"modal-body text-center p-4\"></div>\n <div class=\"modal-footer\"></div>\n </div>\n </div>\n</div>`);\n\n document.body.appendChild(modalElement);\n }\n\n const bsModal = Modal.getOrCreateInstance(modalElement, options);\n\n modalElement.addEventListener('show.bs.modal', () => {\n currentOpenedModals[modalElement.id] = instance;\n });\n\n modalElement.addEventListener('hidden.bs.modal', () => {\n delete currentOpenedModals[modalElement.id];\n });\n\n const instance = {\n show: async (\n title: BsModalAlertOptions | string,\n text?: string,\n icon?: string,\n options?: BsModalAlertOptions\n ): Promise<any> => {\n if (typeof title === 'string') {\n options = options || {};\n options.title = title;\n options.text = text;\n options.icon = icon;\n } else {\n options = title;\n }\n\n await closeCurrentOpened(modalElement);\n\n return new Promise((resolve) => {\n prepareModalElement(modalElement, resolve, options);\n\n bsModal.show(options?.relatedTarget);\n });\n },\n hide: () => {\n bsModal.hide();\n },\n dispose: () => {\n bsModal.dispose();\n },\n toggle: (relatedTarget?: HTMLElement) => {\n bsModal.toggle(relatedTarget);\n },\n destroy: () => {\n bsModal.dispose();\n modalElement.remove();\n },\n instance: bsModal,\n el: modalElement,\n on: (event: string, handler: (e: Event) => void) => {\n modalElement.addEventListener(event, handler);\n\n return () => {\n modalElement.removeEventListener(event, handler);\n };\n },\n off: (event: string, handler: (e: Event) => void) => {\n modalElement.removeEventListener(event, handler);\n }\n };\n\n return instance;\n}\n\nasync function closeCurrentOpened(modalElement: HTMLElement) {\n return new Promise<void>((resolve) => {\n let currentOpenedModal = currentOpenedModals[modalElement.id];\n\n if (!currentOpenedModal) {\n resolve();\n return;\n }\n\n currentOpenedModal.el.addEventListener('hidden.bs.modal', () => {\n resolve();\n }, { once: true });\n\n currentOpenedModal.hide();\n });\n}\n\nasync function prepareModalElement(\n modalElement: HTMLElement,\n handler: (value?: any) => any,\n options?: BsModalAlertOptions\n) {\n options = Object.assign({}, defaultOptions, options || {});\n\n let header = options.header;\n const content = options.content;\n\n modalElement.querySelector('.modal-header')?.remove();\n modalElement.querySelector('.modal-body')!.innerHTML = '';\n modalElement.querySelector('.modal-footer')!.innerHTML = '';\n\n const dialog = modalElement.querySelector('.modal-dialog');\n\n dialog?.classList.remove('modal-sm', 'modal-lg', 'modal-xl', 'modal-xxl');\n\n if (header) {\n if (typeof header === 'string') {\n header = `<div class=\"modal-header\">\n <h5 class=\"modal-title\">${header}</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>`;\n }\n\n header = await anyToElement(header);\n\n // Remove existing header if exists\n modalElement.querySelector('.modal-header')?.remove();\n\n modalElement.querySelector('.modal-content')!.insertAdjacentElement('afterbegin', header);\n }\n\n if (content) {\n let contentElement = await anyToElement(content);\n\n modalElement.querySelector('.modal-body')!.appendChild(contentElement);\n } else {\n const title = options.title;\n const text = options.text;\n let icon = options.icon;\n\n if (icon) {\n if (typeof icon === 'string') {\n icon = `<div class=\"uni-modal-alert__icon text-center mb-3\"><span class=\"${icon}\" style=\"font-size: 64px;\"></span></div>`;\n }\n\n icon = await anyToElement(icon);\n\n modalElement.querySelector('.modal-body')!.appendChild(icon);\n }\n\n if (title) {\n const titleEl = html(`<h4 class=\"uni-modal-alert__title\">${title}</h4>`);\n\n modalElement.querySelector('.modal-body')!.appendChild(titleEl);\n }\n\n if (text) {\n const textEl = html(`<div class=\"uni-modal-alert__text\">${text}</div>`);\n\n modalElement.querySelector('.modal-body')!.appendChild(textEl);\n }\n }\n\n const buttons = options.buttons!;\n const { resolve: resolveClosed, promise: valueSelected } = promiseWithResolvers();\n\n for (const i in buttons) {\n const button = buttons[i];\n const isConfirm = buttons.length === 1 || (buttons.length === 2 && Number(i) === 1);\n\n const buttonElement = createButton(\n button,\n handler,\n isConfirm\n );\n\n modalElement.querySelector('.modal-footer')!.appendChild(await buttonElement);\n }\n\n if (options.size) {\n modalElement.querySelector('.modal-dialog')!.classList.add(`modal-${options.size}`);\n }\n\n if (options.configure) {\n modalElement = options.configure(modalElement) ?? modalElement;\n }\n\n let isUserDismiss = false;\n let clickListener: (e: PointerEvent) => void;\n let keydownListener: (e: KeyboardEvent) => void;\n\n modalElement.addEventListener('click', clickListener = (e) => {\n const target = e.target as HTMLElement;\n\n if (target.matches('.modal') && target.dataset.bsBackdrop !== 'static') {\n isUserDismiss = true;\n }\n }, { capture: true });\n\n modalElement.addEventListener('keydown', keydownListener = (e) => {\n if (e.key === 'Escape') {\n isUserDismiss = true;\n }\n }, { capture: true });\n\n modalElement.addEventListener('hide.bs.modal', (e) => {\n if (isUserDismiss) {\n handler(undefined);\n }\n\n modalElement.removeEventListener('click', clickListener);\n modalElement.removeEventListener('keydown', keydownListener);\n }, { once: true });\n\n return modalElement;\n}\n\nasync function anyToElement(content: string | HTMLElement | (() => (HTMLElement | Promise<HTMLElement>))) {\n if (typeof content === 'function') {\n return content();\n }\n\n return typeof content === 'string' ? html(content) : content;\n}\n\nasync function createButton(\n buttonOption: BsModalButton,\n handler: (value?: any) => any,\n isConfirm?: boolean): Promise<HTMLElement> {\n if (typeof buttonOption === 'function') {\n return await buttonOption();\n }\n\n if (typeof buttonOption === 'string') {\n buttonOption = {\n text: buttonOption,\n value: isConfirm ?? false,\n class: isConfirm ? 'btn btn-primary is-confirm' : 'btn btn-outline-secondary',\n styles: isConfirm ? { width: '150px' } : {},\n dismiss: true,\n };\n }\n\n // if not HTMLElement\n let button: HTMLElement;\n\n if (buttonOption instanceof HTMLElement) {\n button = buttonOption;\n } else {\n const {\n text,\n class: className = 'btn btn-secondary',\n attrs = {},\n styles = {},\n dismiss = true,\n value,\n href,\n target,\n onClick\n } = buttonOption;\n\n const tag = href ? 'a' : 'button';\n\n const el = document.createElement(tag);\n\n if (el instanceof HTMLAnchorElement) {\n el.href = href!;\n el.target = target || '_self';\n }\n\n if (el instanceof HTMLButtonElement) {\n el.type = 'button';\n }\n\n el.setAttribute('class', className);\n\n for (let attr in attrs) {\n el.setAttribute(attr, attrs[attr]);\n }\n\n for (let style in styles) {\n (el.style as any)[style] = styles[style];\n }\n\n if (dismiss) {\n el.setAttribute('data-bs-dismiss', 'modal');\n }\n\n if (typeof text === 'string') {\n el.textContent = text;\n } else if (typeof text === 'function') {\n text(el);\n }\n\n el.addEventListener('click', (e) => {\n onClick?.(value, e as MouseEvent);\n handler(value);\n });\n\n button = el;\n }\n\n return button;\n}\n\n","import type { CheckboxesMultiSelect } from '../module/checkboxes-multi-select';\nimport type { Nullable } from '../types';\n\nexport async function useCheckboxesMultiSelect(): Promise<any>;\n\nexport async function useCheckboxesMultiSelect(\n selector?: Nullable<string | HTMLElement>,\n options?: Record<string, any>\n): Promise<CheckboxesMultiSelect>;\n\nexport async function useCheckboxesMultiSelect(\n selector?: Nullable<string | HTMLElement>,\n options: Record<string, any> = {}\n): Promise<any> {\n const m = await import('../module/checkboxes-multi-select');\n\n if (selector) {\n m.CheckboxesMultiSelect.handle(selector, options);\n }\n\n return m;\n}\n","import { CascadeSelectModule } from '../module/field-cascade-select';\n\nexport async function useFieldCascadeSelect(): Promise<CascadeSelectModule> {\n const module = await import('../module/field-cascade-select');\n\n await module.ready;\n\n return module;\n}\n","import { FileDragModule } from '../module/field-file-drag';\n\nexport async function useFieldFileDrag(): Promise<FileDragModule> {\n const module = await import('../module/field-file-drag');\n\n await module.ready;\n\n return module;\n}\n","export function useFieldFlatpickr(): Promise<any> {\n return import('../module/field-flatpickr');\n}\n","import type { ModalSelectModule } from '../module/field-modal-select';\n\nexport function useFieldModalSelect(): Promise<ModalSelectModule> {\n // Modal select has no exports now\n return import('../module/field-modal-select');\n}\n","export function useFieldModalTree(): Promise<any> {\n return import('../module/field-modal-tree');\n}\n","import { RepeatableModule } from '../module/field-repeatable';\n\nexport async function useFieldRepeatable(): Promise<RepeatableModule> {\n const module = await import('../module/field-repeatable');\n\n await module.ready;\n\n return module;\n}\n","import { SingleImageDragModule } from '../module/field-single-image-drag';\n\nexport async function useFieldSingleImageDrag(): Promise<SingleImageDragModule> {\n const module = await import('../module/field-single-image-drag');\n\n await module.ready;\n\n return module;\n}\n","import type { UnicornFormElement } from '../module/form';\nimport { module, selectOne } from '../service';\n\nlet formElement: typeof UnicornFormElement;\n\ntype FormProxy = {\n submit: (...args: Parameters<UnicornFormElement['submit']>) => Promise<ReturnType<UnicornFormElement['submit']> | undefined>;\n get: (...args: Parameters<UnicornFormElement['get']>) => Promise<ReturnType<UnicornFormElement['get']> | undefined>;\n post: (...args: Parameters<UnicornFormElement['post']>) => Promise<ReturnType<UnicornFormElement['post']> | undefined>;\n put: (...args: Parameters<UnicornFormElement['put']>) => Promise<ReturnType<UnicornFormElement['put']> | undefined>;\n patch: (...args: Parameters<UnicornFormElement['patch']>) => Promise<ReturnType<UnicornFormElement['patch']> | undefined>;\n delete: (...args: Parameters<UnicornFormElement['delete']>) => Promise<ReturnType<UnicornFormElement['delete']> | undefined>;\n};\n\nexport function useFormAsync(): FormProxy & Promise<UnicornFormElement>;\nexport function useFormAsync(\n ele?: string | Element,\n options?: Record<string, any>): FormProxy & Promise<UnicornFormElement | null>;\nexport function useFormAsync(\n ele?: string | Element,\n options: Record<string, any> = {}\n): FormProxy & Promise<UnicornFormElement | null> {\n const promise = import('../module/form').then(({ UnicornFormElement }) => {\n formElement ??= UnicornFormElement;\n\n return useForm(ele, options);\n });\n\n const proxy = new Proxy({} as FormProxy, {\n get(target, prop) {\n return (...args: any[]) => {\n if (prop === 'then' || prop === 'catch') {\n return (promise as any)[prop].apply(promise, args);\n }\n\n return promise.then((form) => {\n const p = (form as any)[prop];\n\n if (typeof p === 'function') {\n return p.apply(form, args);\n }\n\n return p;\n });\n };\n },\n });\n\n return proxy as FormProxy & Promise<UnicornFormElement | null>;\n}\n\nexport function useForm(): UnicornFormElement;\nexport function useForm(ele?: string | Element, options?: Record<string, any>): UnicornFormElement | null;\nexport function useForm(ele?: string | Element, options: Record<string, any> = {}): UnicornFormElement | null {\n if (!formElement) {\n throw new Error('Form module is not loaded. Please use useFormAsync() to load the module before using useForm().');\n }\n\n if (ele == null) {\n return new formElement(undefined, undefined, options);\n }\n\n let selector: string | undefined = undefined;\n let el: HTMLFormElement | undefined = undefined;\n\n if (typeof ele === 'string') {\n selector = ele;\n el = selectOne<HTMLFormElement>(ele) ?? undefined;\n } else {\n el = ele as HTMLFormElement;\n }\n\n if (!el) {\n return new formElement(selector, el, options);\n }\n\n return module(\n el,\n 'unicorn.form',\n () => new formElement(selector, el, options)\n );\n}\n\nexport async function useFormComponent(ele?: string | Element, options: Record<string, any> = {}) {\n const form = await useFormAsync(ele, options);\n\n await form?.initComponent();\n\n return form;\n}\n\nexport interface FormSubmitOptions {\n form?: string | Element;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n url?: string;\n data?: Record<string, any>;\n}\n\nexport async function useFormSubmit(options: FormSubmitOptions = {}) {\n const form = (await useFormAsync(options.form)) as UnicornFormElement;\n\n // fun type should be method of form\n const func = (options.method?.toLowerCase() || 'post') as 'get' | 'post' | 'put' | 'delete' | 'patch';\n\n return form[func](options.url, options.data);\n}\n","import type { UnicornGridElement } from '../module/grid';\nimport { useForm, useFormAsync } from './useForm';\nimport { selectOne, module } from '../service';\n\nlet gridElement: typeof UnicornGridElement;\n\nexport async function useGridAsync(\n ele?: string | HTMLElement,\n options: Record<string, any> | undefined = {}\n): Promise<UnicornGridElement | null> {\n await useFormAsync();\n\n const { UnicornGridElement } = await import('../module/grid');\n\n gridElement ??= UnicornGridElement;\n\n if (!ele) {\n return null;\n }\n\n return useGrid(ele, options);\n}\n\nexport function useGrid(\n ele: string | HTMLElement,\n options: Record<string, any> | undefined = {}\n): UnicornGridElement | null {\n const selector = typeof ele === 'string' ? ele : '';\n const element = selectOne(ele);\n\n if (!element) {\n throw new Error('Element is empty');\n }\n\n const form = useForm(selector || element);\n\n if (!form) {\n throw new Error('UnicornGrid is depends on UnicornForm');\n }\n\n return module(\n element,\n 'grid.plugin',\n () => new gridElement(selector, element, form, options)\n );\n}\n\nexport async function useGridComponent(\n ele: string | HTMLElement,\n options: Record<string, any> | undefined = {}\n): Promise<UnicornGridElement | null> {\n const grid = await useGridAsync(ele, options);\n\n await grid?.initComponent();\n\n return grid;\n}\n","import type { UnicornHttpClient } from '../module/http-client';\nimport { AxiosError, AxiosInstance, CanceledError, CreateAxiosDefaults, isAxiosError, isCancel } from 'axios';\nexport type { ApiReturn, UnicornHttpClient } from '../module/http-client';\n\ntype UnicornHttpClientProxy = {\n request: UnicornHttpClient['request'];\n get: UnicornHttpClient['get'];\n post: UnicornHttpClient['post'];\n put: UnicornHttpClient['put'];\n patch: UnicornHttpClient['patch'];\n delete: UnicornHttpClient['delete'];\n head: UnicornHttpClient['head'];\n options: UnicornHttpClient['options'];\n http: Promise<UnicornHttpClient>;\n isAxiosError: typeof isAxiosError;\n isCancel: typeof isCancel;\n};\n\nexport function useHttpClient(config?: CreateAxiosDefaults | AxiosInstance): UnicornHttpClientProxy & Promise<UnicornHttpClient> {\n const promise = import('../module/http-client').then(({ createHttpClient }) => {\n return createHttpClient(config as CreateAxiosDefaults | undefined);\n });\n\n const data: UnicornHttpClientProxy = {\n request: (options) => {\n return promise.then((client) => client.request(options));\n },\n get: (url, options) => {\n return promise.then((client) => client.get(url, options));\n },\n post: (url, data, options) => {\n return promise.then((client) => client.post(url, data, options));\n },\n put: (url, data, options) => {\n return promise.then((client) => client.put(url, data, options));\n },\n patch: (url, data, options) => {\n return promise.then((client) => client.patch(url, data, options));\n },\n delete: (url, data, options) => {\n return promise.then((client) => client.delete(url, data, options));\n },\n head: (url, options) => {\n return promise.then((client) => client.head(url, options));\n },\n options: (url, options) => {\n return promise.then((client) => client.options(url, options));\n },\n isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D> {\n if (payload == null) {\n return false;\n }\n\n return typeof payload === 'object' && payload.isAxiosError === true;\n },\n isCancel<T = any>(value: any): value is CanceledError<T> {\n return !!(value && value.__CANCEL__);\n },\n http: promise,\n };\n\n Object.assign(data, {\n then: promise.then.bind(promise),\n catch: promise.catch.bind(promise),\n });\n\n return data as UnicornHttpClientProxy & Promise<UnicornHttpClient>;\n}\n","import { IFrameModalModule } from '../module/iframe-modal';\nexport type { IFrameModalElement } from '../module/iframe-modal';\n\nexport async function useIframeModal(): Promise<IFrameModalModule> {\n const module = await import('../module/iframe-modal');\n\n await module.ready;\n\n return module;\n}\n","import type { ListDependent, ListDependentModule, ListDependentOptions } from '../module/list-dependent';\nimport { Nullable } from '../types';\n\nexport async function useListDependent(): Promise<ListDependentModule>;\nexport async function useListDependent(\n element: string | HTMLSelectElement,\n dependent?: Nullable<string | HTMLSelectElement>,\n options?: Partial<ListDependentOptions>\n): Promise<ListDependent>;\nexport async function useListDependent(\n element?: Nullable<string | HTMLSelectElement>,\n dependent?: Nullable<string | HTMLSelectElement>,\n options: Partial<ListDependentOptions> = {}\n): Promise<any> {\n const module = await import('../module/list-dependent');\n\n await module.ready;\n\n if (element) {\n const { ListDependent } = module;\n\n return ListDependent.handle(element, dependent ?? undefined, options);\n }\n\n return module;\n}\n","import {\n S3MultipartUploader,\n S3MultipartUploaderModule,\n S3MultipartUploaderOptions\n} from '../module/s3-multipart-uploader';\nimport type { S3Uploader, S3UploaderGlobalOptions, S3UploaderModule } from '../module/s3-uploader';\n\nexport async function useS3Uploader(): Promise<S3UploaderModule>;\nexport async function useS3Uploader(name: string, options?: Partial<S3UploaderGlobalOptions>): Promise<S3Uploader>;\nexport async function useS3Uploader(name?: string, options: Partial<S3UploaderGlobalOptions> = {}): Promise<any> {\n const module = await import('../module/s3-uploader');\n\n if (!name) {\n return module;\n }\n\n const { get } = module;\n\n return get(name, options);\n}\n\nexport async function useS3MultipartUploader(): Promise<S3MultipartUploaderModule>;\nexport async function useS3MultipartUploader(options: Partial<S3MultipartUploaderOptions>): Promise<S3MultipartUploader>;\nexport async function useS3MultipartUploader(options?: Partial<S3MultipartUploaderOptions>): Promise<any> {\n const module = await import('../module/s3-multipart-uploader');\n\n if (options != null) {\n return new module.S3MultipartUploader(options);\n }\n\n return module;\n}\n","import { ShowOnModule } from '../module/show-on';\n\nexport async function useShowOn(): Promise<ShowOnModule> {\n const module = await import('../module/show-on');\n\n await module.ready;\n\n return module;\n}\n","import { module, useCssImport, useCssIncludes, useImport, wait } from '../service';\nimport type { Nullable } from '../types';\nimport { mergeDeep } from '../utilities';\n\n/**\n * @see https://tom-select.js.org/\n */\nexport async function useTomSelect(\n selector?: Nullable<string | HTMLElement | NodeListOf<HTMLElement>>,\n options: Record<string, any> = {},\n theme: string = 'bootstrap5'\n) {\n const [m] = await wait(\n useImport('@vendor/tom-select/dist/js/tom-select.complete.min.js'),\n useCssImport(`@vendor/tom-select/dist/css/tom-select.${theme}.min.css`)\n );\n\n if (selector) {\n module<any, HTMLSelectElement>(\n selector,\n 'tom.select',\n (ele) => {\n options = mergeDeep({\n allowEmptyOption: true,\n maxOptions: null,\n plugins: {\n caret_position: {},\n clear_button: {},\n }\n }, options);\n\n if ((ele as HTMLSelectElement).multiple) {\n options.plugins.remove_button = {};\n } else {\n options.plugins.dropdown_input = {};\n }\n\n // Auto select first if options changed.\n // @see https://github.com/orchidjs/tom-select/issues/362\n class UnicornTomSelect extends TomSelect {\n syncOptionsWithoutKeepSelected() {\n const oldValue = ele.value;\n\n this.clear();\n this.clearOptions();\n this.sync();\n\n if (ele.value !== oldValue) {\n this.setValue(\n ele.querySelector<HTMLOptionElement>(`option[value=\"${oldValue}\"]`)?.value\n ?? ele.querySelector<HTMLOptionElement>('option')?.value\n ?? '',\n true\n );\n }\n }\n }\n\n // @ts-ignore\n const t = new UnicornTomSelect(ele as TomInput, options);\n\n ele.addEventListener('list:updated', () => {\n t.syncOptionsWithoutKeepSelected();\n });\n\n return t;\n }\n );\n }\n\n return m;\n}\n","import type { TinymceController, TinymceModule } from '../module/tinymce';\nimport type { MaybePromise } from '../types';\nimport type { TinyMCE } from 'tinymce';\n\nexport async function useTinymce(): Promise<TinymceModule>\nexport async function useTinymce(\n selector?: string,\n options?: Record<string, any>\n): Promise<TinymceController>;\nexport async function useTinymce(\n selector?: string,\n options: Record<string, any> = {}\n): Promise<any> {\n const module = await import('../module/tinymce');\n\n if (selector) {\n return module.get(selector, options);\n }\n\n return module;\n}\n\nexport async function useTinymceHook(\n handler: ((tinymce: TinyMCE) => MaybePromise<any>)\n): Promise<void> {\n const { addHook } = await import('../module/tinymce');\n\n return addHook(handler);\n}\n","import type { default as WebDirective, WebDirectiveHandler, WebDirectiveOptions } from 'web-directive';\nimport { Dictionary } from '../types';\n\nlet instances: Dictionary<WebDirective> = {};\n\nexport async function useWebDirective(\n name: string,\n options: false\n): Promise<void>;\nexport async function useWebDirective(\n name: string,\n options?: Partial<WebDirectiveOptions>\n): Promise<WebDirective>;\nexport async function useWebDirective(\n name: string = 'unicorn',\n options: Partial<WebDirectiveOptions> | false = {}\n): Promise<WebDirective | void> {\n if (options === false) {\n delete instances[name];\n return;\n }\n\n return instances[name] ??= await createWebDirective(Object.assign({}, options, { prefix: 'uni-' }));\n}\n\nexport async function useUniDirective<T extends Element = HTMLElement, M extends Record<string, boolean> = Record<string, boolean>>(\n name: string,\n handler: WebDirectiveHandler<T, M>,\n wdInstance: WebDirective | string = 'unicorn'\n): Promise<void> {\n const wd = typeof wdInstance === 'string' ? await useWebDirective(wdInstance) : wdInstance;\n\n wd.register<T, M>(name, handler);\n}\n\nasync function createWebDirective(options: Partial<WebDirectiveOptions> = {}): Promise<WebDirective> {\n const WebDirective = (await import('web-directive')).default;\n\n const wd = new WebDirective(options);\n wd.listen();\n\n return wd;\n}\n","import type {\n UnicornFieldValidation,\n UnicornFormValidation,\n ValidationHandler,\n ValidationModule,\n ValidatorOptions,\n} from '../module/validation';\nimport { getBoundedInstance } from '../service';\n\nexport type {\n ValidationHandler,\n ValidationModule,\n Validator,\n ValidatorOptions,\n ValidatorNoticeFunction,\n FieldValidationOptions,\n FormValidationOptions\n} from '../module/validation';\n\nexport async function useFormValidation(): Promise<ValidationModule>;\nexport async function useFormValidation(selector: string | Element): Promise<UnicornFormValidation | null>;\nexport async function useFormValidation(selector?: string | Element): Promise<any> {\n const module = await import('../module/validation');\n\n await module.ready;\n\n if (!selector) {\n return module;\n }\n\n return useFormValidationInstance(selector);\n}\n\nexport function useFormValidationInstance(selector: string | Element): UnicornFormValidation | null {\n return getBoundedInstance<UnicornFormValidation>(selector, 'form.validation');\n}\n\nexport function useFieldValidationInstance(selector: string | Element): UnicornFieldValidation | null {\n return getBoundedInstance<UnicornFieldValidation>(selector, 'field.validation');\n}\n\nexport async function addGlobalValidator<T extends any, E extends HTMLElement, P = Record<string, any>>(\n name: string,\n validator: ValidationHandler<T, E, P>,\n options: ValidatorOptions<E, P> = {}\n): Promise<void> {\n const { UnicornFormValidation } = await useFormValidation();\n\n UnicornFormValidation.addGlobalValidator<T, E, P>(name, validator, options);\n}\n","import { data } from '../data';\n\ntype UriTypes = 'full' | 'path' | 'root' | 'current' | 'route' | 'script';\ntype AssetTypes = 'root' | 'path';\n\nexport function useSystemUri(): UnicornSystemUri;\nexport function useSystemUri(type: UriTypes): string;\nexport function useSystemUri(type?: UriTypes, path?: string): UnicornSystemUri | string {\n const uri = UnicornSystemUri.get();\n\n if (type) {\n return uri[type](path);\n }\n\n return uri;\n}\n\nexport function useAssetUri(): UnicornAssetUri;\nexport function useAssetUri(type?: AssetTypes, path?: string): string;\nexport function useAssetUri(type?: AssetTypes, path?: string): UnicornAssetUri | string {\n const asset = UnicornAssetUri.get();\n\n if (type) {\n return asset[type](path);\n }\n\n return asset;\n}\n\nfunction uri(type: string) {\n return data('unicorn.uri')[type];\n}\n\nfunction asset(type: string) {\n return uri('asset')[type];\n}\n\nexport function addUriBase(uri: string, type = 'path') {\n if (uri.substring(0, 2) === '/\\/' || uri.substring(0, 4) === 'http') {\n return uri;\n }\n\n return asset(type) + '/' + uri;\n}\n\nexport class UnicornSystemUri extends URL {\n static instance: UnicornSystemUri;\n\n static get() {\n return this.instance ??= new this(uri('full'));\n }\n\n path(path: string = ''): string {\n return uri('path') + path;\n }\n\n root(path: string = ''): string {\n return uri('root') + path;\n }\n\n current(): string {\n return uri('current') || '';\n }\n\n full(): string {\n return uri('full') || '';\n }\n\n route(): string {\n return uri('route') || '';\n }\n\n script(): string {\n return uri('script') || '';\n }\n\n routeWithQuery() {\n const route = this.route();\n const query = this.searchParams.toString();\n\n return query ? `${route}?${query}` : route;\n }\n\n routeAndQuery() {\n const route = this.route();\n const query = this.searchParams.toString();\n\n return [route, query];\n }\n}\n\nexport class UnicornAssetUri {\n static instance: UnicornAssetUri;\n\n static get() {\n return this.instance ??= new this();\n }\n\n path(path: string = ''): string {\n return asset('path') + path;\n }\n\n root(path: string = ''): string {\n return asset('root') + path;\n }\n}\n","import { selectAll } from '../service';\n\nexport function removeCloak() {\n if (globalThis.document == null) {\n return;\n }\n\n selectAll('[uni-cloak]', (el) => el.removeAttribute('uni-cloak'));\n}\n","\nimport { Mixin } from 'ts-mixer';\nimport { data } from './data';\nimport { EventAwareInterface, EventMixin } from './events';\nimport { domready } from './service';\nimport { Constructor, UnicornPlugin } from './types';\n\nexport type InjectionKey<T = any> = string | symbol | Constructor<T>;\n\nexport interface UnicornApp extends EventAwareInterface {}\n\nexport class UnicornApp extends Mixin(EventMixin) implements EventAwareInterface {\n registry = new Map();\n plugins = new Map();\n // _listeners = {};\n waits: Promise<any>[] = [];\n options: Record<string, any>;\n defaultOptions: Record<string, any> = {};\n domready = domready;\n data = data;\n\n constructor(options = {}) {\n super();\n this.options = Object.assign({}, this.defaultOptions, options);\n\n // Wait dom ready\n if (typeof document !== 'undefined') {\n this.wait((resolve: Function) => {\n document.addEventListener('DOMContentLoaded', () => resolve());\n });\n\n // Ready\n document.addEventListener('DOMContentLoaded', () => {\n this.completed().then(() => this.trigger('loaded'));\n });\n }\n }\n\n use(plugin: UnicornPlugin, options: Record<string, any> = {}) {\n if (Array.isArray(plugin)) {\n plugin.forEach(p => this.use(p));\n return this;\n }\n\n // if (plugin.is === undefined) {\n // throw new Error(`Plugin: ${plugin.name} must instance of : ${Plugin.name}`);\n // }\n\n plugin?.install?.(this, options);\n\n this.trigger('plugin.installed', plugin);\n\n this.plugins.set(plugin, plugin);\n\n return this;\n }\n\n detach(plugin: any) {\n if (plugin.uninstall) {\n plugin.uninstall(this);\n }\n\n this.trigger('plugin.uninstalled', plugin);\n\n return this;\n }\n\n inject<T>(id: InjectionKey<T>): T;\n inject<T>(id: InjectionKey<T>, def: T): T;\n inject<T>(id: InjectionKey<T>, def?: T): T;\n inject<T>(id: InjectionKey<T>, def?: T): T | undefined {\n if (!this.registry.has(id)) {\n if (def !== undefined) {\n return def;\n }\n\n throw new Error(`Injectable: \"${(id as any).name ?? id}\" not found.`);\n }\n\n return this.registry.get(id);\n }\n\n provide<T>(id: InjectionKey<T>, value: any) {\n this.registry.set(id, value);\n\n return this;\n }\n\n // trigger(event, ...args) {\n // return this.tap(super.trigger(event, ...args), () => {\n // if (this.data('windwalker.debug')) {\n // console.debug(`[Unicorn Event] ${event}`, args, this.listeners(event));\n // }\n // });\n // }\n\n wait(callback: Function): Promise<any> {\n const p = new Promise((resolve, reject) => {\n const promise = callback(resolve, reject);\n\n if (promise && 'then' in promise) {\n promise.then(resolve).catch(reject);\n }\n });\n\n this.waits.push(p);\n\n return p;\n }\n\n completed(): Promise<any[]> {\n const promise = Promise.all(this.waits);\n\n this.waits = [];\n\n return promise;\n }\n\n macro(name: string, prop: any) {\n if ((this as any)[name]) {\n throw new Error(`Macro: ${name} already exists.`);\n }\n\n (this as any)[name] = prop;\n\n return this;\n }\n}\n","// @ts-nocheck\n// @see https://github.com/javan/form-request-submit-polyfill\nexport function formRequestSubmit(prototype) {\n if (typeof prototype.requestSubmit == 'function') {\n return;\n }\n\n prototype.requestSubmit = function (submitter) {\n if (submitter) {\n validateSubmitter(submitter, this);\n submitter.click();\n } else {\n submitter = document.createElement('input');\n submitter.type = 'submit';\n submitter.hidden = true;\n this.appendChild(submitter);\n submitter.click();\n this.removeChild(submitter);\n }\n };\n\n function validateSubmitter(submitter, form) {\n submitter instanceof HTMLElement || raise(TypeError, 'parameter 1 is not of type \\'HTMLElement\\'');\n submitter.type == 'submit' || raise(TypeError, 'The specified element is not a submit button');\n submitter.form == form || raise(DOMException, 'The specified element is not owned by this form element', 'NotFoundError');\n }\n\n function raise(errorConstructor, message, name) {\n throw new errorConstructor('Failed to execute \\'requestSubmit\\' on \\'HTMLFormElement\\': ' + message + '.', name);\n }\n}\n","\nimport { formRequestSubmit } from './form-request-submit';\n\nexport function polyfill() {\n // If in browser\n if (typeof window !== 'undefined') {\n formRequestSubmit(HTMLFormElement.prototype);\n }\n}\n","import { MultiUploaderModule } from '../module/field-multi-uploader';\n\nexport async function useFieldMultiUploader(): Promise<MultiUploaderModule> {\n const module = await import('../module/field-multi-uploader');\n\n await module.ready;\n\n return module;\n}\n","import type { UnicornApp } from '../app';\nimport {\n useBs5ButtonRadio, useBs5KeepTab,\n useBs5Tooltip,\n useFieldCascadeSelect,\n useFieldFileDrag,\n useFieldFlatpickr,\n useFieldModalSelect, useFieldModalTree,\n useFieldRepeatable,\n useFieldSingleImageDrag,\n useIframeModal, useListDependent, useS3Uploader,\n useShowOn, useTomSelect,\n} from '../composable';\nimport { useFieldMultiUploader } from '../composable/useFieldMultiUploader';\nimport { useTinymce } from '../composable/useTinymce';\nimport { useUnicorn } from '../unicorn';\n\ndeclare module '../app' {\n export interface UnicornApp {\n /** @deprecated Only for code generator use. */\n $ui: typeof methods;\n }\n}\n\n// @ts-ignore\ndeclare module '@windwalker-io/unicorn-next' {\n export interface UnicornApp {\n /** @deprecated Only for code generator use. */\n $ui: typeof methods;\n }\n}\n\nexport function useUnicornPhpAdapter(app?: UnicornApp) {\n app ??= useUnicorn();\n\n app.use(UnicornPhpAdapter);\n\n return app.$ui;\n}\n\nconst methods = {\n repeatable: useFieldRepeatable,\n flatpickr: useFieldFlatpickr,\n fileDrag: useFieldFileDrag,\n modalField: useFieldModalSelect,\n cascadeSelect: useFieldCascadeSelect,\n sid: useFieldSingleImageDrag,\n tinymce: {\n init: useTinymce\n },\n s3Uploader: useS3Uploader,\n iframeModal: useIframeModal,\n initShowOn: useShowOn,\n modalTree: useFieldModalTree,\n multiUploader: useFieldMultiUploader,\n tomSelect: useTomSelect,\n listDependent: useListDependent,\n bootstrap: {\n tooltip: useBs5Tooltip,\n buttonRadio: useBs5ButtonRadio,\n keepTab: useBs5KeepTab,\n }\n};\n\nexport class UnicornPhpAdapter {\n static install(app: UnicornApp) {\n if (app.$ui) {\n app.$ui = { ...app.$ui, ...methods };\n } else {\n app.$ui = methods;\n }\n }\n}\n","import { InjectionKey, UnicornApp } from './app';\nimport { polyfill } from './polyfill';\nimport { Dictionary } from './types';\nimport { removeCloak } from './utilities';\n\nexport * from './data';\nexport * from './events';\nexport * from './service';\nexport * from './composable';\nexport * from './plugin';\n\nexport type { UnicornApp };\n\nlet app: UnicornApp;\n\nexport function createUnicorn(): UnicornApp {\n polyfill();\n removeCloak();\n\n return app = new UnicornApp();\n}\n\nexport function createUnicornWithPlugins(): UnicornApp {\n const app = createUnicorn();\n\n // app.use(UnicornUI);\n\n // app.use(UnicornDom);\n\n return app;\n}\n\nexport function useUnicorn(instance?: UnicornApp): UnicornApp {\n if (instance) {\n app = instance;\n }\n\n return app ??= createUnicorn();\n}\n\nexport const useInject: typeof UnicornApp.prototype.inject = <T = any>(id: InjectionKey<T>, def?: T): T => {\n return useUnicorn().inject<T>(id, def);\n}\n\nexport function pushUnicornToGlobal(app?: UnicornApp) {\n // @ts-ignore\n window.u = app ?? useUnicorn();\n}\n\nexport function useMacro<T extends Dictionary>(name: T): T;\nexport function useMacro<N extends string, T extends any>(\n name: N,\n prop: T\n): { [K in N]: T };\nexport function useMacro(name: string | Dictionary, prop?: any): any {\n const app = useUnicorn();\n\n if (typeof name === 'string') {\n app.macro(name, prop!);\n } else {\n for (const k in name) {\n app.macro(k, name[k]!);\n }\n }\n\n return app;\n}\n\nexport async function useLegacy(app?: UnicornApp) {\n app ??= useUnicorn();\n\n pushUnicornToGlobal(app);\n\n const { useLegacyMethods } = await import('./legacy/legacy');\n\n await useLegacyMethods(app);\n\n return app;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@windwalker-io/unicorn-next",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "Unicorn framework js library",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -63,7 +63,6 @@
|
|
|
63
63
|
]
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
|
-
"@lyrasoft/ts-toolkit": "^0.2.4",
|
|
67
66
|
"@rubenbimmel/alpine-class-component": "^0.0.4",
|
|
68
67
|
"@types/alpinejs": "^3",
|
|
69
68
|
"@types/bootstrap": "^5",
|
|
@@ -83,11 +82,12 @@
|
|
|
83
82
|
"tsdoc-markdown": "^1.4.1",
|
|
84
83
|
"unplugin-dts": "^1.0.0-beta.6",
|
|
85
84
|
"url-template": "^3.1.1",
|
|
86
|
-
"vite": "^
|
|
85
|
+
"vite": "^8.0",
|
|
87
86
|
"vite-plugin-dts": "^4.5.4",
|
|
88
87
|
"vue3-slide-up-down": "^2.1.0"
|
|
89
88
|
},
|
|
90
89
|
"dependencies": {
|
|
90
|
+
"@lyrasoft/ts-toolkit": "^0.2.4",
|
|
91
91
|
"alpinejs": "^3.15.0",
|
|
92
92
|
"axios": "^1.12.2",
|
|
93
93
|
"bigint-toolkit": "^0.2.0",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Modal } from 'bootstrap';
|
|
2
2
|
import { html } from '../service';
|
|
3
3
|
import { useUIBootstrap5 } from './useUIBootstrap5';
|
|
4
|
+
import { promiseWithResolvers } from '@lyrasoft/ts-toolkit/generic';
|
|
4
5
|
|
|
5
6
|
export interface BsModalAlertOptions {
|
|
6
7
|
header?: string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);
|
|
@@ -11,6 +12,7 @@ export interface BsModalAlertOptions {
|
|
|
11
12
|
size?: 'sm' | 'lg' | 'xl' | 'xxl';
|
|
12
13
|
relatedTarget?: HTMLElement;
|
|
13
14
|
buttons?: BsModalButton[];
|
|
15
|
+
configure?: (el: HTMLElement) => HTMLElement | undefined;
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
export type BsModalButton = {
|
|
@@ -25,8 +27,10 @@ export type BsModalButton = {
|
|
|
25
27
|
onClick?: (value?: any, e?: MouseEvent) => any;
|
|
26
28
|
} | string | HTMLElement | (() => HTMLElement | Promise<HTMLElement>);
|
|
27
29
|
|
|
30
|
+
let currentOpenedModals: Record<string, BsModalAlertInstance> = {};
|
|
31
|
+
|
|
28
32
|
export interface BsModalAlertInstance {
|
|
29
|
-
show(
|
|
33
|
+
show(options: BsModalAlertOptions): Promise<any>;
|
|
30
34
|
|
|
31
35
|
show(title: string, text?: string, icon?: string, options?: BsModalAlertOptions): Promise<any>;
|
|
32
36
|
|
|
@@ -38,6 +42,8 @@ export interface BsModalAlertInstance {
|
|
|
38
42
|
destroy: () => void;
|
|
39
43
|
instance: Modal;
|
|
40
44
|
el: HTMLElement;
|
|
45
|
+
on: (event: string, handler: (e: Event) => void) => () => void;
|
|
46
|
+
off: (event: string, handler: (e: Event) => void) => void;
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
const defaultOptions = {
|
|
@@ -71,7 +77,7 @@ export async function useBsModalAlert(
|
|
|
71
77
|
|
|
72
78
|
if (!modalElement) {
|
|
73
79
|
modalElement = html<HTMLDivElement>(`<div id="${id}" class="uni-modal-alert modal fade" tabindex="-1" role="dialog">
|
|
74
|
-
<div class="modal-dialog" role="document">
|
|
80
|
+
<div class="modal-dialog modal-dialog-centered" role="document">
|
|
75
81
|
<div class="modal-content">
|
|
76
82
|
<div class="modal-body text-center p-4"></div>
|
|
77
83
|
<div class="modal-footer"></div>
|
|
@@ -82,10 +88,18 @@ export async function useBsModalAlert(
|
|
|
82
88
|
document.body.appendChild(modalElement);
|
|
83
89
|
}
|
|
84
90
|
|
|
85
|
-
const
|
|
91
|
+
const bsModal = Modal.getOrCreateInstance(modalElement, options);
|
|
92
|
+
|
|
93
|
+
modalElement.addEventListener('show.bs.modal', () => {
|
|
94
|
+
currentOpenedModals[modalElement.id] = instance;
|
|
95
|
+
});
|
|
86
96
|
|
|
87
|
-
|
|
88
|
-
|
|
97
|
+
modalElement.addEventListener('hidden.bs.modal', () => {
|
|
98
|
+
delete currentOpenedModals[modalElement.id];
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const instance = {
|
|
102
|
+
show: async (
|
|
89
103
|
title: BsModalAlertOptions | string,
|
|
90
104
|
text?: string,
|
|
91
105
|
icon?: string,
|
|
@@ -100,28 +114,59 @@ export async function useBsModalAlert(
|
|
|
100
114
|
options = title;
|
|
101
115
|
}
|
|
102
116
|
|
|
117
|
+
await closeCurrentOpened(modalElement);
|
|
118
|
+
|
|
103
119
|
return new Promise((resolve) => {
|
|
104
120
|
prepareModalElement(modalElement, resolve, options);
|
|
105
121
|
|
|
106
|
-
|
|
122
|
+
bsModal.show(options?.relatedTarget);
|
|
107
123
|
});
|
|
108
124
|
},
|
|
109
125
|
hide: () => {
|
|
110
|
-
|
|
126
|
+
bsModal.hide();
|
|
111
127
|
},
|
|
112
128
|
dispose: () => {
|
|
113
|
-
|
|
129
|
+
bsModal.dispose();
|
|
114
130
|
},
|
|
115
131
|
toggle: (relatedTarget?: HTMLElement) => {
|
|
116
|
-
|
|
132
|
+
bsModal.toggle(relatedTarget);
|
|
117
133
|
},
|
|
118
134
|
destroy: () => {
|
|
119
|
-
|
|
135
|
+
bsModal.dispose();
|
|
120
136
|
modalElement.remove();
|
|
121
137
|
},
|
|
122
|
-
instance:
|
|
138
|
+
instance: bsModal,
|
|
123
139
|
el: modalElement,
|
|
140
|
+
on: (event: string, handler: (e: Event) => void) => {
|
|
141
|
+
modalElement.addEventListener(event, handler);
|
|
142
|
+
|
|
143
|
+
return () => {
|
|
144
|
+
modalElement.removeEventListener(event, handler);
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
off: (event: string, handler: (e: Event) => void) => {
|
|
148
|
+
modalElement.removeEventListener(event, handler);
|
|
149
|
+
}
|
|
124
150
|
};
|
|
151
|
+
|
|
152
|
+
return instance;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function closeCurrentOpened(modalElement: HTMLElement) {
|
|
156
|
+
return new Promise<void>((resolve) => {
|
|
157
|
+
let currentOpenedModal = currentOpenedModals[modalElement.id];
|
|
158
|
+
|
|
159
|
+
if (!currentOpenedModal) {
|
|
160
|
+
resolve();
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
currentOpenedModal.el.addEventListener('hidden.bs.modal', () => {
|
|
165
|
+
resolve();
|
|
166
|
+
}, { once: true });
|
|
167
|
+
|
|
168
|
+
currentOpenedModal.hide();
|
|
169
|
+
});
|
|
125
170
|
}
|
|
126
171
|
|
|
127
172
|
async function prepareModalElement(
|
|
@@ -152,6 +197,9 @@ async function prepareModalElement(
|
|
|
152
197
|
|
|
153
198
|
header = await anyToElement(header);
|
|
154
199
|
|
|
200
|
+
// Remove existing header if exists
|
|
201
|
+
modalElement.querySelector('.modal-header')?.remove();
|
|
202
|
+
|
|
155
203
|
modalElement.querySelector('.modal-content')!.insertAdjacentElement('afterbegin', header);
|
|
156
204
|
}
|
|
157
205
|
|
|
@@ -166,7 +214,7 @@ async function prepareModalElement(
|
|
|
166
214
|
|
|
167
215
|
if (icon) {
|
|
168
216
|
if (typeof icon === 'string') {
|
|
169
|
-
icon = `<div class="uni-modal-alert__icon text-center mb-
|
|
217
|
+
icon = `<div class="uni-modal-alert__icon text-center mb-3"><span class="${icon}" style="font-size: 64px;"></span></div>`;
|
|
170
218
|
}
|
|
171
219
|
|
|
172
220
|
icon = await anyToElement(icon);
|
|
@@ -188,6 +236,7 @@ async function prepareModalElement(
|
|
|
188
236
|
}
|
|
189
237
|
|
|
190
238
|
const buttons = options.buttons!;
|
|
239
|
+
const { resolve: resolveClosed, promise: valueSelected } = promiseWithResolvers();
|
|
191
240
|
|
|
192
241
|
for (const i in buttons) {
|
|
193
242
|
const button = buttons[i];
|
|
@@ -206,6 +255,37 @@ async function prepareModalElement(
|
|
|
206
255
|
modalElement.querySelector('.modal-dialog')!.classList.add(`modal-${options.size}`);
|
|
207
256
|
}
|
|
208
257
|
|
|
258
|
+
if (options.configure) {
|
|
259
|
+
modalElement = options.configure(modalElement) ?? modalElement;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
let isUserDismiss = false;
|
|
263
|
+
let clickListener: (e: PointerEvent) => void;
|
|
264
|
+
let keydownListener: (e: KeyboardEvent) => void;
|
|
265
|
+
|
|
266
|
+
modalElement.addEventListener('click', clickListener = (e) => {
|
|
267
|
+
const target = e.target as HTMLElement;
|
|
268
|
+
|
|
269
|
+
if (target.matches('.modal') && target.dataset.bsBackdrop !== 'static') {
|
|
270
|
+
isUserDismiss = true;
|
|
271
|
+
}
|
|
272
|
+
}, { capture: true });
|
|
273
|
+
|
|
274
|
+
modalElement.addEventListener('keydown', keydownListener = (e) => {
|
|
275
|
+
if (e.key === 'Escape') {
|
|
276
|
+
isUserDismiss = true;
|
|
277
|
+
}
|
|
278
|
+
}, { capture: true });
|
|
279
|
+
|
|
280
|
+
modalElement.addEventListener('hide.bs.modal', (e) => {
|
|
281
|
+
if (isUserDismiss) {
|
|
282
|
+
handler(undefined);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
modalElement.removeEventListener('click', clickListener);
|
|
286
|
+
modalElement.removeEventListener('keydown', keydownListener);
|
|
287
|
+
}, { once: true });
|
|
288
|
+
|
|
209
289
|
return modalElement;
|
|
210
290
|
}
|
|
211
291
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { UnicornHttpClient } from '../module/http-client';
|
|
2
|
-
import
|
|
2
|
+
import { AxiosError, AxiosInstance, CanceledError, CreateAxiosDefaults, isAxiosError, isCancel } from 'axios';
|
|
3
3
|
export type { ApiReturn, UnicornHttpClient } from '../module/http-client';
|
|
4
4
|
|
|
5
5
|
type UnicornHttpClientProxy = {
|
|
@@ -12,6 +12,8 @@ type UnicornHttpClientProxy = {
|
|
|
12
12
|
head: UnicornHttpClient['head'];
|
|
13
13
|
options: UnicornHttpClient['options'];
|
|
14
14
|
http: Promise<UnicornHttpClient>;
|
|
15
|
+
isAxiosError: typeof isAxiosError;
|
|
16
|
+
isCancel: typeof isCancel;
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
export function useHttpClient(config?: CreateAxiosDefaults | AxiosInstance): UnicornHttpClientProxy & Promise<UnicornHttpClient> {
|
|
@@ -44,6 +46,16 @@ export function useHttpClient(config?: CreateAxiosDefaults | AxiosInstance): Uni
|
|
|
44
46
|
options: (url, options) => {
|
|
45
47
|
return promise.then((client) => client.options(url, options));
|
|
46
48
|
},
|
|
49
|
+
isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D> {
|
|
50
|
+
if (payload == null) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return typeof payload === 'object' && payload.isAxiosError === true;
|
|
55
|
+
},
|
|
56
|
+
isCancel<T = any>(value: any): value is CanceledError<T> {
|
|
57
|
+
return !!(value && value.__CANCEL__);
|
|
58
|
+
},
|
|
47
59
|
http: promise,
|
|
48
60
|
};
|
|
49
61
|
|
|
@@ -73,7 +73,7 @@ export class S3Uploader extends Mixin(EventMixin) implements EventAwareInterface
|
|
|
73
73
|
file = new Blob([file], { type: options['Content-Type'] || 'text/plain' });
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
if (file instanceof Blob && path.endsWith('.{ext}')) {
|
|
76
|
+
if (file instanceof Blob && !(file instanceof File) && path.endsWith('.{ext}')) {
|
|
77
77
|
throw new Error('If using Blob or file data string, you must provide a valid file extension in the path.');
|
|
78
78
|
}
|
|
79
79
|
|
package/src/service/ui.ts
CHANGED
|
@@ -411,10 +411,17 @@ export async function useColorPicker(
|
|
|
411
411
|
return m;
|
|
412
412
|
}
|
|
413
413
|
|
|
414
|
+
export interface DisableOnSubmitOptions {
|
|
415
|
+
event?: string;
|
|
416
|
+
spinnerClass?: string;
|
|
417
|
+
loadingCass?: string;
|
|
418
|
+
iconSelector?: string;
|
|
419
|
+
}
|
|
420
|
+
|
|
414
421
|
export function useDisableOnSubmit(
|
|
415
422
|
formSelector: string | HTMLFormElement = '#admin-form',
|
|
416
423
|
buttonSelector: string = '',
|
|
417
|
-
options:
|
|
424
|
+
options: DisableOnSubmitOptions = {}
|
|
418
425
|
) {
|
|
419
426
|
// Todo: Use object to handle it
|
|
420
427
|
buttonSelector = buttonSelector || [
|
|
@@ -433,7 +440,7 @@ export function useDisableOnSubmit(
|
|
|
433
440
|
|
|
434
441
|
const event = options.event || 'submit';
|
|
435
442
|
const spinnerClass = options.spinnerClass || 'spinner-border spinner-border-sm';
|
|
436
|
-
const loadingClass = options.loadingCass || 'is-loading';
|
|
443
|
+
const loadingClass = options.loadingCass || 'is-uni-loading';
|
|
437
444
|
|
|
438
445
|
selectAll<HTMLElement>(buttonSelector, (button) => {
|
|
439
446
|
button.addEventListener('click', (e) => {
|
|
@@ -446,7 +453,8 @@ export function useDisableOnSubmit(
|
|
|
446
453
|
});
|
|
447
454
|
|
|
448
455
|
const form = selectOne<HTMLFormElement>(formSelector);
|
|
449
|
-
|
|
456
|
+
|
|
457
|
+
form?.addEventListener(event, (e: Event) => {
|
|
450
458
|
setTimeout(() => {
|
|
451
459
|
if (!form.checkValidity()) {
|
|
452
460
|
return;
|
|
@@ -458,22 +466,30 @@ export function useDisableOnSubmit(
|
|
|
458
466
|
button.classList.add('disabled');
|
|
459
467
|
|
|
460
468
|
if (button.dataset.clicked) {
|
|
461
|
-
|
|
462
|
-
button.classList.add(loadingClass);
|
|
463
|
-
|
|
464
|
-
if (icon) {
|
|
465
|
-
const i = html('<i></i>');
|
|
466
|
-
icon.parentNode.replaceChild(i, icon);
|
|
467
|
-
|
|
468
|
-
i.setAttribute('class', spinnerClass);
|
|
469
|
-
// icon.styles.width = '1em';
|
|
470
|
-
// icon.styles.height = '1em';
|
|
471
|
-
// icon.styles.borderWith = '.15em';
|
|
472
|
-
}
|
|
469
|
+
makeButtonLoading(button);
|
|
473
470
|
}
|
|
474
471
|
});
|
|
472
|
+
|
|
473
|
+
if (e instanceof SubmitEvent && e.submitter) {
|
|
474
|
+
makeButtonLoading(e.submitter);
|
|
475
|
+
}
|
|
475
476
|
}, 0);
|
|
476
477
|
});
|
|
478
|
+
|
|
479
|
+
function makeButtonLoading(button: HTMLElement) {
|
|
480
|
+
let icon = button.querySelector(iconSelector);
|
|
481
|
+
button.classList.add(loadingClass);
|
|
482
|
+
|
|
483
|
+
if (icon) {
|
|
484
|
+
const i = html('<i></i>');
|
|
485
|
+
icon.parentNode?.replaceChild(i, icon);
|
|
486
|
+
|
|
487
|
+
i.setAttribute('class', spinnerClass);
|
|
488
|
+
// icon.styles.width = '1em';
|
|
489
|
+
// icon.styles.height = '1em';
|
|
490
|
+
// icon.styles.borderWith = '.15em';
|
|
491
|
+
}
|
|
492
|
+
}
|
|
477
493
|
}
|
|
478
494
|
|
|
479
495
|
export function useDisableIfStackNotEmpty(buttonSelector: string = '[data-task=save]',
|
package/vite.config.ts
CHANGED
|
@@ -66,6 +66,10 @@ export default defineConfig(({ mode }) => {
|
|
|
66
66
|
'bootstrap',
|
|
67
67
|
'sortablejs',
|
|
68
68
|
'@asika32764/vue-animate',
|
|
69
|
+
// Seems still not excludes,
|
|
70
|
+
// Maybe we need to compile @lyrasoft/ts-toolkit to js
|
|
71
|
+
'@lyrasoft/ts-toolkit',
|
|
72
|
+
'@lyrasoft/ts-toolkit/*',
|
|
69
73
|
'alpinejs',
|
|
70
74
|
'cropperjs',
|
|
71
75
|
'cropperjs/*',
|
|
@@ -81,7 +85,7 @@ export default defineConfig(({ mode }) => {
|
|
|
81
85
|
},
|
|
82
86
|
outDir: 'dist',
|
|
83
87
|
emptyOutDir: false,
|
|
84
|
-
sourcemap:
|
|
88
|
+
sourcemap: true,
|
|
85
89
|
minify: false,
|
|
86
90
|
},
|
|
87
91
|
plugins: [
|