@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.
Files changed (108) hide show
  1. package/dist/chunks/_arrayPush.js +325 -108
  2. package/dist/chunks/_arrayPush.js.map +1 -1
  3. package/dist/chunks/_baseRest.js +155 -60
  4. package/dist/chunks/_baseRest.js.map +1 -1
  5. package/dist/chunks/_baseUnary.js +463 -0
  6. package/dist/chunks/_baseUnary.js.map +1 -0
  7. package/dist/chunks/_getPrototype.js +292 -100
  8. package/dist/chunks/_getPrototype.js.map +1 -1
  9. package/dist/chunks/alert-adapter.js +29 -0
  10. package/dist/chunks/alert-adapter.js.map +1 -0
  11. package/dist/chunks/alert.js +21 -0
  12. package/dist/chunks/alert.js.map +1 -0
  13. package/dist/chunks/arr.js +24 -0
  14. package/dist/chunks/arr.js.map +1 -0
  15. package/dist/chunks/button-radio.js +127 -145
  16. package/dist/chunks/button-radio.js.map +1 -1
  17. package/dist/chunks/checkboxes-multi-select.js +44 -43
  18. package/dist/chunks/checkboxes-multi-select.js.map +1 -1
  19. package/dist/chunks/chunk.js +24 -0
  20. package/dist/chunks/cloneDeep.js +679 -212
  21. package/dist/chunks/cloneDeep.js.map +1 -1
  22. package/dist/chunks/cropper.min.js +6 -5
  23. package/dist/chunks/cropper.min.js.map +1 -1
  24. package/dist/chunks/crypto.js +26 -0
  25. package/dist/chunks/crypto.js.map +1 -0
  26. package/dist/chunks/data.js +49 -0
  27. package/dist/chunks/data.js.map +1 -0
  28. package/dist/chunks/dom.js +128 -0
  29. package/dist/chunks/dom.js.map +1 -0
  30. package/dist/chunks/events.js +270 -0
  31. package/dist/chunks/events.js.map +1 -0
  32. package/dist/chunks/field-cascade-select.js +207 -250
  33. package/dist/chunks/field-cascade-select.js.map +1 -1
  34. package/dist/chunks/field-file-drag.js +175 -209
  35. package/dist/chunks/field-file-drag.js.map +1 -1
  36. package/dist/chunks/field-flatpickr.js +94 -898
  37. package/dist/chunks/field-flatpickr.js.map +1 -1
  38. package/dist/chunks/field-modal-select.js +728 -467
  39. package/dist/chunks/field-modal-select.js.map +1 -1
  40. package/dist/chunks/field-modal-tree.js +771 -766
  41. package/dist/chunks/field-modal-tree.js.map +1 -1
  42. package/dist/chunks/field-multi-uploader.js +249 -256
  43. package/dist/chunks/field-multi-uploader.js.map +1 -1
  44. package/dist/chunks/field-repeatable.js +111 -127
  45. package/dist/chunks/field-repeatable.js.map +1 -1
  46. package/dist/chunks/field-single-image-drag.js +286 -338
  47. package/dist/chunks/field-single-image-drag.js.map +1 -1
  48. package/dist/chunks/form.js +146 -159
  49. package/dist/chunks/form.js.map +1 -1
  50. package/dist/chunks/grid.js +349 -418
  51. package/dist/chunks/grid.js.map +1 -1
  52. package/dist/chunks/helper.js +39 -0
  53. package/dist/chunks/helper.js.map +1 -0
  54. package/dist/chunks/http-client.js +221 -211
  55. package/dist/chunks/http-client.js.map +1 -1
  56. package/dist/chunks/iframe-modal.js +95 -115
  57. package/dist/chunks/iframe-modal.js.map +1 -1
  58. package/dist/chunks/keep-tab.js +92 -101
  59. package/dist/chunks/keep-tab.js.map +1 -1
  60. package/dist/chunks/lang.js +250 -0
  61. package/dist/chunks/lang.js.map +1 -0
  62. package/dist/chunks/legacy.js +197 -201
  63. package/dist/chunks/legacy.js.map +1 -1
  64. package/dist/chunks/list-dependent.js +195 -228
  65. package/dist/chunks/list-dependent.js.map +1 -1
  66. package/dist/chunks/loader.js +106 -0
  67. package/dist/chunks/loader.js.map +1 -0
  68. package/dist/chunks/monthSelect.js +251 -0
  69. package/dist/chunks/monthSelect.js.map +1 -0
  70. package/dist/chunks/router.js +111 -0
  71. package/dist/chunks/router.js.map +1 -0
  72. package/dist/chunks/s3-multipart-uploader.js +183 -210
  73. package/dist/chunks/s3-multipart-uploader.js.map +1 -1
  74. package/dist/chunks/s3-uploader.js +106 -128
  75. package/dist/chunks/s3-uploader.js.map +1 -1
  76. package/dist/chunks/show-on.js +358 -205
  77. package/dist/chunks/show-on.js.map +1 -1
  78. package/dist/chunks/timing.js +10 -0
  79. package/dist/chunks/timing.js.map +1 -0
  80. package/dist/chunks/tinymce.js +153 -203
  81. package/dist/chunks/tinymce.js.map +1 -1
  82. package/dist/chunks/ui-bootstrap5.js +58 -72
  83. package/dist/chunks/ui-bootstrap5.js.map +1 -1
  84. package/dist/chunks/ui.js +320 -0
  85. package/dist/chunks/ui.js.map +1 -0
  86. package/dist/chunks/unicorn.js.map +1 -1
  87. package/dist/chunks/useQueue.js +111 -0
  88. package/dist/chunks/useQueue.js.map +1 -0
  89. package/dist/chunks/useStack.js +76 -0
  90. package/dist/chunks/useStack.js.map +1 -0
  91. package/dist/chunks/validation.js +761 -853
  92. package/dist/chunks/validation.js.map +1 -1
  93. package/dist/editor.css +1 -1
  94. package/dist/index.d.ts +27 -15
  95. package/dist/multi-level-menu.css +1 -1
  96. package/dist/switcher.css +1 -1
  97. package/dist/unicorn.js +805 -130
  98. package/dist/unicorn.js.map +1 -1
  99. package/package.json +3 -3
  100. package/src/composable/useBsModalAlert.ts +92 -12
  101. package/src/composable/useHttp.ts +13 -1
  102. package/src/module/s3-uploader.ts +1 -1
  103. package/src/service/ui.ts +31 -15
  104. package/vite.config.ts +5 -1
  105. package/dist/chunks/_commonjsHelpers.js +0 -7
  106. package/dist/chunks/index.js +0 -314
  107. package/dist/chunks/isArguments.js +0 -146
  108. package/dist/chunks/unicorn.js +0 -2580
@@ -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.18",
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": "^7.1.7",
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(title: BsModalAlertOptions): Promise<any>;
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 modal = Modal.getOrCreateInstance(modalElement, options);
91
+ const bsModal = Modal.getOrCreateInstance(modalElement, options);
92
+
93
+ modalElement.addEventListener('show.bs.modal', () => {
94
+ currentOpenedModals[modalElement.id] = instance;
95
+ });
86
96
 
87
- return {
88
- show: (
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
- modal.show(options?.relatedTarget);
122
+ bsModal.show(options?.relatedTarget);
107
123
  });
108
124
  },
109
125
  hide: () => {
110
- modal.hide();
126
+ bsModal.hide();
111
127
  },
112
128
  dispose: () => {
113
- modal.dispose();
129
+ bsModal.dispose();
114
130
  },
115
131
  toggle: (relatedTarget?: HTMLElement) => {
116
- modal.toggle(relatedTarget);
132
+ bsModal.toggle(relatedTarget);
117
133
  },
118
134
  destroy: () => {
119
- modal.dispose();
135
+ bsModal.dispose();
120
136
  modalElement.remove();
121
137
  },
122
- instance: modal,
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-4"><span class="${icon}" style="font-size: 48px;"></span></div>`;
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 type { AxiosInstance, CreateAxiosDefaults } from 'axios';
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: Record<string, any> = {}
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
- form?.addEventListener(event, (e: SubmitEvent) => {
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
- let icon = button.querySelector(iconSelector);
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: 'external',
88
+ sourcemap: true,
85
89
  minify: false,
86
90
  },
87
91
  plugins: [
@@ -1,7 +0,0 @@
1
- function getDefaultExportFromCjs(x) {
2
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
3
- }
4
- export {
5
- getDefaultExportFromCjs as g
6
- };
7
- //# sourceMappingURL=_commonjsHelpers.js.map