joopjs 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +678 -0
- package/README.md +583 -0
- package/dist/a11y.service-C-DQQfgO.d.mts +143 -0
- package/dist/a11y.service-CauEJrJe.d.ts +143 -0
- package/dist/adapters-B6slG6hQ.d.mts +84 -0
- package/dist/adapters-B6slG6hQ.d.ts +84 -0
- package/dist/aes.service-CkoupAww.d.mts +95 -0
- package/dist/aes.service-CkoupAww.d.ts +95 -0
- package/dist/ai/index.d.mts +99 -0
- package/dist/ai/index.d.ts +99 -0
- package/dist/ai/index.js +307 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/index.mjs +304 -0
- package/dist/ai/index.mjs.map +1 -0
- package/dist/analytics/index.d.mts +42 -0
- package/dist/analytics/index.d.ts +42 -0
- package/dist/analytics/index.js +139 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +136 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/angular/index.d.mts +148 -0
- package/dist/angular/index.d.ts +148 -0
- package/dist/angular/index.js +122 -0
- package/dist/angular/index.js.map +1 -0
- package/dist/angular/index.mjs +101 -0
- package/dist/angular/index.mjs.map +1 -0
- package/dist/api/index.d.mts +128 -0
- package/dist/api/index.d.ts +128 -0
- package/dist/api/index.js +1358 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +1332 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +105 -0
- package/dist/auth/index.d.ts +105 -0
- package/dist/auth/index.js +989 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +979 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth.service-DNVB-L4U.d.mts +16 -0
- package/dist/auth.service-PjUUSUIt.d.ts +16 -0
- package/dist/banking/index.d.mts +1530 -0
- package/dist/banking/index.d.ts +1530 -0
- package/dist/banking/index.js +4739 -0
- package/dist/banking/index.js.map +1 -0
- package/dist/banking/index.mjs +4661 -0
- package/dist/banking/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +174 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +172 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/client-profile.service-BuPeXVp5.d.mts +28 -0
- package/dist/client-profile.service-D5bRRYQp.d.ts +28 -0
- package/dist/config.models-Cqg04fAQ.d.mts +84 -0
- package/dist/config.models-Cqg04fAQ.d.ts +84 -0
- package/dist/config.service-CrCvI-JS.d.ts +31 -0
- package/dist/config.service-Cz4QQLlf.d.mts +31 -0
- package/dist/core/index.d.mts +4 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +631 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +619 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/crypto-utils-DriNhLdx.d.mts +30 -0
- package/dist/crypto-utils-DriNhLdx.d.ts +30 -0
- package/dist/data-storage.service-DT6xaTxE.d.ts +51 -0
- package/dist/data-storage.service-LvhGRCmw.d.mts +51 -0
- package/dist/deeplink/index.d.mts +39 -0
- package/dist/deeplink/index.d.ts +39 -0
- package/dist/deeplink/index.js +268 -0
- package/dist/deeplink/index.js.map +1 -0
- package/dist/deeplink/index.mjs +265 -0
- package/dist/deeplink/index.mjs.map +1 -0
- package/dist/deeplink.service-Ctd5u243.d.mts +35 -0
- package/dist/deeplink.service-uUuTnY9_.d.ts +35 -0
- package/dist/dev/index.d.mts +20 -0
- package/dist/dev/index.d.ts +20 -0
- package/dist/dev/index.js +51 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/index.mjs +49 -0
- package/dist/dev/index.mjs.map +1 -0
- package/dist/device/index.d.mts +108 -0
- package/dist/device/index.d.ts +108 -0
- package/dist/device/index.js +960 -0
- package/dist/device/index.js.map +1 -0
- package/dist/device/index.mjs +951 -0
- package/dist/device/index.mjs.map +1 -0
- package/dist/differential-privacy-BcAv1G80.d.mts +210 -0
- package/dist/differential-privacy-C8mAUjZr.d.ts +210 -0
- package/dist/encryption/index.d.mts +75 -0
- package/dist/encryption/index.d.ts +75 -0
- package/dist/encryption/index.js +605 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/index.mjs +598 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/form-validator-3tkmzr_o.d.mts +72 -0
- package/dist/form-validator-3tkmzr_o.d.ts +72 -0
- package/dist/forms/index.d.mts +59 -0
- package/dist/forms/index.d.ts +59 -0
- package/dist/forms/index.js +446 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +442 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +37 -0
- package/dist/i18n/index.d.ts +37 -0
- package/dist/i18n/index.js +147 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +145 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/idempotency.service-_6LqhivP.d.mts +372 -0
- package/dist/idempotency.service-eOKoISRD.d.ts +372 -0
- package/dist/index-B_ksKpS1.d.mts +202 -0
- package/dist/index-CqDKWTUP.d.mts +28 -0
- package/dist/index-CqDKWTUP.d.ts +28 -0
- package/dist/index-DFqEoX_l.d.ts +202 -0
- package/dist/index-Dz0gOur2.d.mts +36 -0
- package/dist/index-Dz0gOur2.d.ts +36 -0
- package/dist/index.d.mts +1336 -0
- package/dist/index.d.ts +1336 -0
- package/dist/index.js +19464 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +19155 -0
- package/dist/index.mjs.map +1 -0
- package/dist/india/index.d.mts +75 -0
- package/dist/india/index.d.ts +75 -0
- package/dist/india/index.js +325 -0
- package/dist/india/index.js.map +1 -0
- package/dist/india/index.mjs +303 -0
- package/dist/india/index.mjs.map +1 -0
- package/dist/joop-Bx7Iwj5p.d.mts +155 -0
- package/dist/joop-CA3DMeOO.d.ts +155 -0
- package/dist/native-bridge/index.d.mts +27 -0
- package/dist/native-bridge/index.d.ts +27 -0
- package/dist/native-bridge/index.js +98 -0
- package/dist/native-bridge/index.js.map +1 -0
- package/dist/native-bridge/index.mjs +96 -0
- package/dist/native-bridge/index.mjs.map +1 -0
- package/dist/network/index.d.mts +85 -0
- package/dist/network/index.d.ts +85 -0
- package/dist/network/index.js +454 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/index.mjs +451 -0
- package/dist/network/index.mjs.map +1 -0
- package/dist/network-monitor-BIwPSXme.d.mts +179 -0
- package/dist/network-monitor-Bqp2hvZr.d.ts +179 -0
- package/dist/notification.service-Dm4fvfZf.d.mts +25 -0
- package/dist/notification.service-tEMKatWJ.d.ts +25 -0
- package/dist/observability/index.d.mts +179 -0
- package/dist/observability/index.d.ts +179 -0
- package/dist/observability/index.js +559 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/index.mjs +552 -0
- package/dist/observability/index.mjs.map +1 -0
- package/dist/oidc-client-DIJcClmB.d.mts +190 -0
- package/dist/oidc-client-DxhyE59t.d.ts +190 -0
- package/dist/platform/index.d.mts +73 -0
- package/dist/platform/index.d.ts +73 -0
- package/dist/platform/index.js +127 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/index.mjs +125 -0
- package/dist/platform/index.mjs.map +1 -0
- package/dist/pwa/index.d.mts +31 -0
- package/dist/pwa/index.d.ts +31 -0
- package/dist/pwa/index.js +247 -0
- package/dist/pwa/index.js.map +1 -0
- package/dist/pwa/index.mjs +244 -0
- package/dist/pwa/index.mjs.map +1 -0
- package/dist/react/index.d.mts +133 -0
- package/dist/react/index.d.ts +133 -0
- package/dist/react/index.js +632 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +630 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/router/index.d.mts +39 -0
- package/dist/router/index.d.ts +39 -0
- package/dist/router/index.js +168 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/index.mjs +166 -0
- package/dist/router/index.mjs.map +1 -0
- package/dist/security/index.d.mts +206 -0
- package/dist/security/index.d.ts +206 -0
- package/dist/security/index.js +1297 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/index.mjs +1285 -0
- package/dist/security/index.mjs.map +1 -0
- package/dist/session/index.d.mts +115 -0
- package/dist/session/index.d.ts +115 -0
- package/dist/session/index.js +297 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/index.mjs +292 -0
- package/dist/session/index.mjs.map +1 -0
- package/dist/state/index.d.mts +43 -0
- package/dist/state/index.d.ts +43 -0
- package/dist/state/index.js +156 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/index.mjs +152 -0
- package/dist/state/index.mjs.map +1 -0
- package/dist/statement-parser-BHQtXwCM.d.ts +260 -0
- package/dist/statement-parser-C2qNmb49.d.mts +260 -0
- package/dist/storage/index.d.mts +40 -0
- package/dist/storage/index.d.ts +40 -0
- package/dist/storage/index.js +256 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +252 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/sync/index.d.mts +69 -0
- package/dist/sync/index.d.ts +69 -0
- package/dist/sync/index.js +330 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/index.mjs +323 -0
- package/dist/sync/index.mjs.map +1 -0
- package/dist/sync-engine-DCIMRG5s.d.ts +61 -0
- package/dist/sync-engine-DZqyKHkK.d.mts +61 -0
- package/dist/theme/index.d.mts +53 -0
- package/dist/theme/index.d.ts +53 -0
- package/dist/theme/index.js +169 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +167 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/ui/index.d.mts +66 -0
- package/dist/ui/index.d.ts +66 -0
- package/dist/ui/index.js +811 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.mjs +803 -0
- package/dist/ui/index.mjs.map +1 -0
- package/dist/utilities/index.d.mts +199 -0
- package/dist/utilities/index.d.ts +199 -0
- package/dist/utilities/index.js +1991 -0
- package/dist/utilities/index.js.map +1 -0
- package/dist/utilities/index.mjs +1923 -0
- package/dist/utilities/index.mjs.map +1 -0
- package/dist/validation/index.d.mts +60 -0
- package/dist/validation/index.d.ts +60 -0
- package/dist/validation/index.js +460 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.mjs +455 -0
- package/dist/validation/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +135 -0
- package/dist/vue/index.d.ts +135 -0
- package/dist/vue/index.js +621 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +619 -0
- package/dist/vue/index.mjs.map +1 -0
- package/dist/watermark.service-Detur5tq.d.ts +235 -0
- package/dist/watermark.service-QNegMeQZ.d.mts +235 -0
- package/dist/workers/index.d.mts +42 -0
- package/dist/workers/index.d.ts +42 -0
- package/dist/workers/index.js +359 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/index.mjs +356 -0
- package/dist/workers/index.mjs.map +1 -0
- package/dist/workflow/index.d.mts +99 -0
- package/dist/workflow/index.d.ts +99 -0
- package/dist/workflow/index.js +282 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/index.mjs +279 -0
- package/dist/workflow/index.mjs.map +1 -0
- package/package.json +226 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/events/index.ts","../../src/ui/loader.service.ts","../../src/ui/alert.service.ts","../../src/ui/pagination.service.ts","../../src/ui/print.service.ts","../../src/ui/a11y.service.ts","../../src/ui/virtual-scroll.ts","../../src/ui/banking-keyboard.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type Unsubscribe = () => void;\nexport type Listener<T> = (value: T) => void;\n\n/**\n * Lightweight pub/sub subject — emits to all current subscribers.\n * Replaces RxJS Subject without pulling in the full RxJS dependency.\n */\nexport class JoopSubject<T> {\n private _listeners: Listener<T>[] = [];\n\n subscribe(listener: Listener<T>): Unsubscribe {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter(l => l !== listener);\n };\n }\n\n next(value: T): void {\n for (const listener of this._listeners) {\n listener(value);\n }\n }\n\n asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Stateful subject — replays the current value to any new subscriber immediately.\n * Replaces RxJS BehaviorSubject.\n */\nexport class JoopBehaviorSubject<T> extends JoopSubject<T> {\n private _value: T;\n\n constructor(initialValue: T) {\n super();\n this._value = initialValue;\n }\n\n getValue(): T {\n return this._value;\n }\n\n override next(value: T): void {\n this._value = value;\n super.next(value);\n }\n\n override subscribe(listener: Listener<T>): Unsubscribe {\n listener(this._value);\n return super.subscribe(listener);\n }\n\n override asObservable(): JoopObservable<T> {\n return new JoopObservable<T>(listener => this.subscribe(listener));\n }\n}\n\n/**\n * Read-only observable handle returned from asObservable().\n */\nexport class JoopObservable<T> {\n constructor(private _subscribeFn: (listener: Listener<T>) => Unsubscribe) {}\n\n subscribe(listener: Listener<T>): Unsubscribe {\n return this._subscribeFn(listener);\n }\n\n /** Returns the current value without subscribing (only meaningful for BehaviorSubject-backed observables). */\n getOnce(): T | undefined {\n let result: T | undefined;\n const unsub = this.subscribe(v => { result = v; });\n unsub();\n return result;\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopLoaderConfig {\n delayMs?: number;\n}\n\nexport class JoopLoaderService {\n private _count = 0;\n private _loading$ = new JoopBehaviorSubject<boolean>(false);\n private _delayTimer: ReturnType<typeof setTimeout> | null = null;\n private _cfg: JoopLoaderConfig;\n\n constructor(config: JoopLoaderConfig = {}) {\n this._cfg = config;\n }\n\n /** Increment loader counter — shows loader when count goes 0 → 1 */\n show(): void {\n this._count++;\n if (this._count === 1) {\n if (this._cfg.delayMs && this._cfg.delayMs > 0) {\n this._delayTimer = setTimeout(() => this._loading$.next(true), this._cfg.delayMs);\n } else {\n this._loading$.next(true);\n }\n }\n }\n\n /** Decrement loader counter — hides loader when count reaches 0 */\n hide(): void {\n if (this._count > 0) this._count--;\n if (this._count === 0) {\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n }\n\n /** Force-show regardless of count */\n forceShow(): void {\n this._count = Math.max(this._count, 1);\n this._loading$.next(true);\n }\n\n /** Force-hide and reset counter */\n reset(): void {\n this._count = 0;\n if (this._delayTimer) { clearTimeout(this._delayTimer); this._delayTimer = null; }\n this._loading$.next(false);\n }\n\n isLoading(): boolean { return this._loading$.getValue(); }\n isLoading$() { return this._loading$.asObservable(); }\n get pendingCount(): number { return this._count; }\n}\n","import { JoopSubject, JoopBehaviorSubject } from '../events';\n\nexport type JoopAlertType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface JoopToastOptions {\n type?: JoopAlertType;\n duration?: number;\n position?: 'top' | 'bottom' | 'top-right' | 'bottom-right';\n closeable?: boolean;\n}\n\nexport interface JoopDialogButton {\n label: string;\n action: string;\n style?: 'primary' | 'secondary' | 'danger';\n}\n\nexport interface JoopDialogOptions {\n title?: string;\n message: string;\n type?: JoopAlertType;\n buttons?: JoopDialogButton[];\n closeable?: boolean;\n htmlContent?: boolean;\n}\n\nexport interface JoopInlineAlert {\n message: string;\n type: JoopAlertType;\n closeable?: boolean;\n}\n\nconst COLORS: Record<JoopAlertType, { bg: string; border: string; icon: string }> = {\n success: { bg: '#d4edda', border: '#28a745', icon: '✓' },\n error: { bg: '#f8d7da', border: '#dc3545', icon: '✕' },\n warning: { bg: '#fff3cd', border: '#ffc107', icon: '⚠' },\n info: { bg: '#d1ecf1', border: '#17a2b8', icon: 'ℹ' },\n};\n\nconst TOAST_CONTAINER_ID = '__joop_toast_container__';\nconst OVERLAY_ID = '__joop_dialog_overlay__';\n\nexport class JoopAlertService {\n private _inline$ = new JoopBehaviorSubject<JoopInlineAlert | null>(null);\n private _open$ = new JoopSubject<string>();\n\n inline$() { return this._inline$.asObservable(); }\n open$() { return this._open$.asObservable(); }\n\n showInline(data: JoopInlineAlert): void { this._inline$.next(data); }\n hideInline(): void { this._inline$.next(null); }\n\n toast(message: string, options: JoopToastOptions = {}): void {\n if (typeof document === 'undefined') return;\n const { type = 'info', duration = 3000, position = 'bottom', closeable = false } = options;\n const c = COLORS[type];\n\n const container = this._getToastContainer(position);\n const toast = document.createElement('div');\n toast.setAttribute('role', 'alert');\n Object.assign(toast.style, {\n background: c.bg,\n borderLeft: `4px solid ${c.border}`,\n padding: '12px 16px',\n marginBottom: '8px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n fontSize: '14px',\n maxWidth: '320px',\n opacity: '0',\n transition: 'opacity 0.2s ease',\n cursor: closeable ? 'pointer' : 'default',\n });\n\n const icon = document.createElement('span');\n icon.textContent = c.icon;\n icon.style.fontWeight = 'bold';\n\n const text = document.createElement('span');\n text.textContent = message;\n text.style.flex = '1';\n\n toast.appendChild(icon);\n toast.appendChild(text);\n\n if (closeable) {\n const btn = document.createElement('button');\n btn.textContent = '×';\n Object.assign(btn.style, { background: 'none', border: 'none', cursor: 'pointer', fontSize: '16px', padding: '0 4px' });\n btn.onclick = () => this._removeToast(toast);\n toast.appendChild(btn);\n }\n\n container.appendChild(toast);\n requestAnimationFrame(() => { toast.style.opacity = '1'; });\n\n if (duration > 0) {\n setTimeout(() => this._removeToast(toast), duration);\n }\n\n this._open$.next('toast');\n }\n\n dialog(options: JoopDialogOptions): Promise<string> {\n return new Promise(resolve => {\n if (typeof document === 'undefined') { resolve('close'); return; }\n\n const { title, message, type = 'info', closeable = true, htmlContent = false } = options;\n const buttons: JoopDialogButton[] = options.buttons ?? [{ label: 'OK', action: 'ok', style: 'primary' }];\n const c = COLORS[type];\n\n const overlay = document.createElement('div');\n overlay.id = OVERLAY_ID;\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', background: 'rgba(0,0,0,0.5)',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: '99999',\n });\n\n const dialog = document.createElement('div');\n Object.assign(dialog.style, {\n background: '#fff', borderRadius: '8px', padding: '24px', minWidth: '280px', maxWidth: '480px',\n boxShadow: '0 8px 24px rgba(0,0,0,0.2)', position: 'relative',\n });\n\n if (title) {\n const h = document.createElement('h3');\n h.textContent = title;\n Object.assign(h.style, { margin: '0 0 12px', fontSize: '18px', color: c.border });\n dialog.appendChild(h);\n }\n\n const msg = document.createElement('div');\n if (htmlContent) { msg.innerHTML = message; } else { msg.textContent = message; }\n Object.assign(msg.style, { marginBottom: '20px', fontSize: '14px', lineHeight: '1.5' });\n dialog.appendChild(msg);\n\n const btnRow = document.createElement('div');\n Object.assign(btnRow.style, { display: 'flex', gap: '8px', justifyContent: 'flex-end' });\n\n const finish = (action: string) => { overlay.remove(); resolve(action); };\n\n for (const btn of buttons) {\n const el = document.createElement('button');\n el.textContent = btn.label;\n const isPrimary = btn.style === 'primary';\n const isDanger = btn.style === 'danger';\n Object.assign(el.style, {\n padding: '8px 16px', borderRadius: '4px', cursor: 'pointer', fontSize: '14px',\n border: 'none',\n background: isDanger ? '#dc3545' : isPrimary ? c.border : '#e9ecef',\n color: isPrimary || isDanger ? '#fff' : '#333',\n });\n el.onclick = () => finish(btn.action);\n btnRow.appendChild(el);\n }\n dialog.appendChild(btnRow);\n\n if (closeable) {\n const closeBtn = document.createElement('button');\n closeBtn.textContent = '×';\n Object.assign(closeBtn.style, {\n position: 'absolute', top: '12px', right: '16px', background: 'none', border: 'none',\n cursor: 'pointer', fontSize: '20px', color: '#666',\n });\n closeBtn.onclick = () => finish('close');\n overlay.addEventListener('click', (e) => { if (e.target === overlay) finish('close'); });\n dialog.appendChild(closeBtn);\n }\n\n overlay.appendChild(dialog);\n document.body.appendChild(overlay);\n this._open$.next('dialog');\n });\n }\n\n dismiss(): void {\n document.getElementById(OVERLAY_ID)?.remove();\n document.getElementById(TOAST_CONTAINER_ID)?.remove();\n this._inline$.next(null);\n }\n\n private _getToastContainer(position: string): HTMLElement {\n const existing = document.getElementById(TOAST_CONTAINER_ID);\n if (existing) return existing;\n const container = document.createElement('div');\n container.id = TOAST_CONTAINER_ID;\n const top = position.startsWith('top');\n const right = position.endsWith('right');\n Object.assign(container.style, {\n position: 'fixed',\n [top ? 'top' : 'bottom']: '16px',\n [right ? 'right' : 'left']: right ? '16px' : '50%',\n transform: right ? 'none' : 'translateX(-50%)',\n zIndex: '99998',\n display: 'flex',\n flexDirection: top ? 'column' : 'column-reverse',\n alignItems: right ? 'flex-end' : 'center',\n });\n document.body.appendChild(container);\n return container;\n }\n\n private _removeToast(el: HTMLElement): void {\n el.style.opacity = '0';\n setTimeout(() => el.remove(), 200);\n }\n}\n","import { JoopBehaviorSubject } from '../events';\n\nexport interface JoopPageState {\n page: number;\n pageSize: number;\n total: number;\n totalPages: number;\n hasPrev: boolean;\n hasNext: boolean;\n from: number;\n to: number;\n}\n\nexport class JoopPaginationService {\n private _state$ = new JoopBehaviorSubject<JoopPageState>(this._compute(1, 10, 0));\n\n private _compute(page: number, pageSize: number, total: number): JoopPageState {\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const clamped = Math.min(Math.max(1, page), totalPages);\n const from = total === 0 ? 0 : (clamped - 1) * pageSize + 1;\n const to = Math.min(clamped * pageSize, total);\n return { page: clamped, pageSize, total, totalPages, hasPrev: clamped > 1, hasNext: clamped < totalPages, from, to };\n }\n\n private _update(patch: Partial<{ page: number; pageSize: number; total: number }>): void {\n const { page, pageSize, total } = this._state$.getValue();\n const next = { page, pageSize, total, ...patch };\n this._state$.next(this._compute(next.page, next.pageSize, next.total));\n }\n\n setTotal(total: number): void { this._update({ total, page: 1 }); }\n setPage(page: number): void { this._update({ page }); }\n setPageSize(size: number): void { this._update({ pageSize: size, page: 1 }); }\n\n nextPage(): void { const s = this._state$.getValue(); if (s.hasNext) this._update({ page: s.page + 1 }); }\n prevPage(): void { const s = this._state$.getValue(); if (s.hasPrev) this._update({ page: s.page - 1 }); }\n firstPage(): void { this._update({ page: 1 }); }\n lastPage(): void { this._update({ page: this._state$.getValue().totalPages }); }\n\n getState(): JoopPageState { return this._state$.getValue(); }\n state$() { return this._state$.asObservable(); }\n\n /** Returns page numbers for pagination UI — with ellipsis as -1 */\n getPages(maxVisible = 7): number[] {\n const { page, totalPages } = this._state$.getValue();\n if (totalPages <= maxVisible) return Array.from({ length: totalPages }, (_, i) => i + 1);\n\n const pages: number[] = [];\n const half = Math.floor(maxVisible / 2);\n let start = Math.max(2, page - half);\n let end = Math.min(totalPages - 1, page + half);\n\n if (page - half < 2) end = Math.min(totalPages - 1, maxVisible - 1);\n if (page + half > totalPages - 1) start = Math.max(2, totalPages - maxVisible + 2);\n\n pages.push(1);\n if (start > 2) pages.push(-1); // ellipsis\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < totalPages - 1) pages.push(-1); // ellipsis\n pages.push(totalPages);\n return pages;\n }\n\n reset(): void { this._state$.next(this._compute(1, this._state$.getValue().pageSize, 0)); }\n}\n","export interface JoopPrintOptions {\n styles?: string;\n title?: string;\n bodyClass?: string;\n}\n\nexport class JoopPrintService {\n /** Print the current page */\n print(): void { window.print(); }\n\n /** Print a specific element by ID or reference */\n printElement(elementOrId: HTMLElement | string, options: JoopPrintOptions = {}): void {\n const el = typeof elementOrId === 'string' ? document.getElementById(elementOrId) : elementOrId;\n if (!el) return;\n this.printHtml(el.outerHTML, options);\n }\n\n /** Open a new window with custom HTML and print it */\n printHtml(html: string, options: JoopPrintOptions = {}): void {\n const win = window.open('', '_blank', 'width=800,height=600');\n if (!win) return;\n\n const { styles = '', title = document.title, bodyClass = '' } = options;\n const defaultStyles = `\n body { font-family: Arial, sans-serif; font-size: 12pt; margin: 20mm; }\n @media print { body { margin: 0; } }\n table { border-collapse: collapse; width: 100%; }\n th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: left; }\n th { background: #f5f5f5; font-weight: bold; }\n `;\n\n win.document.write(`<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${title}</title>\n <style>${defaultStyles}${styles}</style>\n</head>\n<body class=\"${bodyClass}\">${html}</body>\n</html>`);\n win.document.close();\n win.focus();\n setTimeout(() => { win.print(); win.close(); }, 300);\n }\n\n /** Print a plain-text receipt in a monospace layout */\n printReceipt(lines: string[], options: JoopPrintOptions = {}): void {\n const html = `<pre style=\"font-family:monospace;font-size:11pt;white-space:pre-wrap\">${lines.join('\\n')}</pre>`;\n this.printHtml(html, { ...options, styles: `${options.styles ?? ''}body{margin:10mm;}` });\n }\n\n /** Build a receipt-style text block for printing */\n buildReceiptText(\n title: string,\n rows: Array<[label: string, value: string]>,\n width = 42,\n ): string[] {\n const line = '─'.repeat(width);\n const center = (s: string) => s.padStart(Math.floor((width + s.length) / 2)).padEnd(width);\n const row = ([l, v]: [string, string]) => `${l.padEnd(width - v.length - 2)} ${v}`;\n return [center(title), line, ...rows.map(row), line];\n }\n}\n","export type JoopAriaLivePoliteness = 'assertive' | 'polite' | 'off';\n\nexport interface JoopFocusTrapOptions {\n initialFocus?: string; // CSS selector\n returnFocusOnDeactivate?: boolean;\n}\n\nexport class JoopA11yService {\n private _liveRegions = new Map<JoopAriaLivePoliteness, HTMLElement>();\n private _trapStack: Array<{ el: HTMLElement; prev: Element | null; release: () => void }> = [];\n private _skipLink: HTMLElement | null = null;\n private _focusHandlers: Array<(el: Element) => void> = [];\n private _focusListener: ((e: FocusEvent) => void) | null = null;\n\n // ── ARIA Live Regions ────────────────────────────────────────────────────\n\n announce(message: string, politeness: JoopAriaLivePoliteness = 'polite'): void {\n const region = this._getOrCreateLiveRegion(politeness);\n // Clear and re-set to force screen reader re-announcement\n region.textContent = '';\n setTimeout(() => { region.textContent = message; }, 50);\n }\n\n private _getOrCreateLiveRegion(politeness: JoopAriaLivePoliteness): HTMLElement {\n if (!this._liveRegions.has(politeness)) {\n const el = document.createElement('div');\n el.setAttribute('aria-live', politeness);\n el.setAttribute('aria-atomic', 'true');\n el.setAttribute('aria-relevant', 'additions text');\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n document.body.appendChild(el);\n this._liveRegions.set(politeness, el);\n }\n return this._liveRegions.get(politeness)!;\n }\n\n clearAnnouncements(): void {\n for (const el of this._liveRegions.values()) el.textContent = '';\n }\n\n // ── Focus Trap ───────────────────────────────────────────────────────────\n\n trapFocus(container: HTMLElement, opts: JoopFocusTrapOptions = {}): () => void {\n const prev = document.activeElement;\n const focusable = (): NodeListOf<HTMLElement> =>\n container.querySelectorAll<HTMLElement>('a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])');\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const elements = Array.from(focusable());\n if (!elements.length) { e.preventDefault(); return; }\n const first = elements[0], last = elements[elements.length - 1];\n if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n };\n\n container.addEventListener('keydown', handleKeydown);\n\n const initialEl = opts.initialFocus\n ? container.querySelector<HTMLElement>(opts.initialFocus)\n : focusable()[0];\n initialEl?.focus();\n\n const release = () => {\n container.removeEventListener('keydown', handleKeydown);\n if (opts.returnFocusOnDeactivate !== false && prev instanceof HTMLElement) prev.focus();\n };\n\n this._trapStack.push({ el: container, prev, release });\n return release;\n }\n\n releaseFocus(): void {\n const entry = this._trapStack.pop();\n entry?.release();\n }\n\n releaseAllTraps(): void {\n while (this._trapStack.length) this.releaseFocus();\n }\n\n // ── Skip Link ────────────────────────────────────────────────────────────\n\n createSkipLink(targetId: string, label = 'Skip to main content'): HTMLElement {\n const link = document.createElement('a');\n link.href = `#${targetId}`;\n link.textContent = label;\n link.className = 'joop-skip-link';\n Object.assign(link.style, {\n position: 'absolute', top: '-9999px', left: '0',\n zIndex: '9999', padding: '8px 16px',\n background: '#fff', color: '#000', textDecoration: 'underline',\n });\n link.addEventListener('focus', () => { link.style.top = '0'; });\n link.addEventListener('blur', () => { link.style.top = '-9999px'; });\n document.body.insertBefore(link, document.body.firstChild);\n this._skipLink = link;\n return link;\n }\n\n removeSkipLink(): void { this._skipLink?.remove(); this._skipLink = null; }\n\n // ── Keyboard helpers ─────────────────────────────────────────────────────\n\n /** Start tracking focus changes */\n trackFocus(): () => void {\n const handler = (e: FocusEvent) => {\n if (e.target instanceof Element) this._focusHandlers.forEach(h => h(e.target as Element));\n };\n document.addEventListener('focusin', handler);\n this._focusListener = handler;\n return () => { document.removeEventListener('focusin', handler); this._focusListener = null; };\n }\n\n onFocusChange(handler: (el: Element) => void): () => void {\n this._focusHandlers.push(handler);\n return () => { this._focusHandlers = this._focusHandlers.filter(h => h !== handler); };\n }\n\n /** Set visible page title + meta description */\n setPageTitle(title: string, suffix?: string): void {\n document.title = suffix ? `${title} — ${suffix}` : title;\n }\n\n /** Make an element visually hidden but accessible */\n visuallyHide(el: HTMLElement): void {\n Object.assign(el.style, { position: 'absolute', width: '1px', height: '1px', padding: '0', overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', border: '0' });\n }\n\n /** Get all focusable elements within a container */\n getFocusable(container: HTMLElement = document.body): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ));\n }\n\n /** Check whether an element is visible and not hidden from accessibility */\n isAccessible(el: HTMLElement): boolean {\n const style = window.getComputedStyle(el);\n return style.display !== 'none' && style.visibility !== 'hidden' && el.getAttribute('aria-hidden') !== 'true';\n }\n\n destroy(): void {\n for (const el of this._liveRegions.values()) el.remove();\n this._liveRegions.clear();\n this.releaseAllTraps();\n this.removeSkipLink();\n if (this._focusListener) document.removeEventListener('focusin', this._focusListener);\n }\n}\n","export interface JoopVirtualScrollOptions {\n itemHeight: number;\n overscan?: number; // extra rows to render above/below visible area\n}\n\nexport interface JoopVirtualRange {\n start: number;\n end: number;\n offsetTop: number;\n}\n\nexport type JoopRenderFn<T> = (item: T, index: number) => HTMLElement;\n\nexport class JoopVirtualScroll<T = unknown> {\n private _container: HTMLElement | null = null;\n private _items: T[] = [];\n private _renderFn: JoopRenderFn<T> | null = null;\n private _opts: Required<JoopVirtualScrollOptions> = { itemHeight: 40, overscan: 3 };\n private _scrollListener: (() => void) | null = null;\n private _rangeHandlers: Array<(range: JoopVirtualRange) => void> = [];\n private _innerEl: HTMLElement | null = null;\n private _spacerTop: HTMLElement | null = null;\n private _spacerBottom: HTMLElement | null = null;\n private _rendered: HTMLElement[] = [];\n private _lastRange: JoopVirtualRange = { start: 0, end: 0, offsetTop: 0 };\n\n attach(container: HTMLElement, items: T[], renderFn: JoopRenderFn<T>, opts?: Partial<JoopVirtualScrollOptions>): void {\n this.detach();\n this._container = container;\n this._items = items;\n this._renderFn = renderFn;\n if (opts) Object.assign(this._opts, opts);\n\n container.style.overflow = 'auto';\n container.style.position = 'relative';\n\n this._spacerTop = _spacer();\n this._innerEl = document.createElement('div');\n this._spacerBottom = _spacer();\n\n container.appendChild(this._spacerTop);\n container.appendChild(this._innerEl);\n container.appendChild(this._spacerBottom);\n\n const render = () => this._render();\n container.addEventListener('scroll', render);\n this._scrollListener = () => container.removeEventListener('scroll', render);\n this._render();\n }\n\n detach(): void {\n this._scrollListener?.();\n this._spacerTop?.remove();\n this._innerEl?.remove();\n this._spacerBottom?.remove();\n this._scrollListener = null;\n this._container = null;\n this._rendered = [];\n }\n\n updateItems(items: T[]): void {\n this._items = items;\n this._render();\n }\n\n scrollTo(index: number): void {\n if (!this._container) return;\n this._container.scrollTop = index * this._opts.itemHeight;\n }\n\n getVisibleRange(): JoopVirtualRange { return { ...this._lastRange }; }\n\n onRangeChange(handler: (range: JoopVirtualRange) => void): () => void {\n this._rangeHandlers.push(handler);\n return () => { this._rangeHandlers = this._rangeHandlers.filter(h => h !== handler); };\n }\n\n private _render(): void {\n if (!this._container || !this._innerEl || !this._spacerTop || !this._spacerBottom || !this._renderFn) return;\n\n const scrollTop = this._container.scrollTop;\n const viewHeight = this._container.clientHeight;\n const { itemHeight, overscan } = this._opts;\n const total = this._items.length;\n\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const end = Math.min(total, Math.ceil((scrollTop + viewHeight) / itemHeight) + overscan);\n\n this._lastRange = { start, end, offsetTop: start * itemHeight };\n this._rangeHandlers.forEach(h => h(this._lastRange));\n\n this._spacerTop.style.height = `${start * itemHeight}px`;\n this._spacerBottom.style.height = `${(total - end) * itemHeight}px`;\n\n this._innerEl.innerHTML = '';\n this._rendered = [];\n for (let i = start; i < end; i++) {\n const el = this._renderFn(this._items[i], i);\n el.style.height = `${itemHeight}px`;\n this._innerEl.appendChild(el);\n this._rendered.push(el);\n }\n }\n}\n\nfunction _spacer(): HTMLElement {\n const el = document.createElement('div');\n el.style.height = '0';\n el.style.pointerEvents = 'none';\n return el;\n}\n","export type JoopKeyboardMode = 'pin' | 'amount' | 'otp' | 'numeric';\n\nexport interface JoopBankingKeyboardConfig {\n mode?: JoopKeyboardMode;\n scramble?: boolean; // shuffle key layout on each render, default true\n haptic?: boolean; // trigger vibration on key press, default true\n maskInput?: boolean; // show dots instead of digits, default true for pin/otp\n maxLength?: number;\n theme?: 'light' | 'dark';\n}\n\nexport interface JoopBankingKeyboardOptions extends JoopBankingKeyboardConfig {\n onInput?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onClear?: () => void;\n}\n\nfunction shuffle<T>(arr: T[]): T[] {\n const a = [...arr];\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [a[i], a[j]] = [a[j], a[i]];\n }\n return a;\n}\n\nexport class JoopBankingKeyboard {\n private _container: HTMLElement | null = null;\n private _value = '';\n private readonly _config: Required<Omit<JoopBankingKeyboardConfig, 'maxLength'>> & { maxLength?: number };\n private readonly _opts: JoopBankingKeyboardOptions;\n\n constructor(opts: JoopBankingKeyboardOptions = {}) {\n this._opts = opts;\n this._config = {\n mode: opts.mode ?? 'pin',\n scramble: opts.scramble ?? true,\n haptic: opts.haptic ?? true,\n maskInput: opts.maskInput ?? (opts.mode === 'amount' ? false : true),\n maxLength: opts.maxLength,\n theme: opts.theme ?? 'light',\n };\n }\n\n render(container: HTMLElement): void {\n this._container = container;\n this._container.innerHTML = '';\n this._container.setAttribute('role', 'application');\n this._container.setAttribute('aria-label', 'Secure keyboard');\n this._container.style.cssText = `\n display: grid; gap: 8px; padding: 12px;\n background: ${this._config.theme === 'dark' ? '#1a1a2e' : '#f8f9fa'};\n border-radius: 12px; user-select: none; touch-action: manipulation;\n `;\n this._renderDisplay();\n this._renderKeys();\n }\n\n getValue(): string { return this._value; }\n\n clear(): void {\n this._value = '';\n this._opts.onClear?.();\n this._opts.onInput?.('');\n this._refresh();\n }\n\n destroy(): void {\n if (this._container) { this._container.innerHTML = ''; this._container = null; }\n }\n\n private _renderDisplay(): void {\n if (!this._container) return;\n const display = document.createElement('div');\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : 16);\n const dots = this._config.maskInput\n ? Array.from({ length: maxLen }, (_, i) => `<span style=\"\n display:inline-block; width:12px; height:12px; border-radius:50%; margin:0 4px;\n background:${i < this._value.length ? '#2563eb' : '#d1d5db'};\n transition:background .15s;\n \"></span>`).join('')\n : `<span style=\"font-size:24px;font-weight:700;letter-spacing:4px;color:${this._config.theme === 'dark' ? '#fff' : '#111'}\">${this._value || ' '}</span>`;\n\n display.style.cssText = 'text-align:center; padding:12px 0; min-height:40px;';\n display.innerHTML = dots;\n this._container.appendChild(display);\n }\n\n private _renderKeys(): void {\n if (!this._container) return;\n let digits = ['1','2','3','4','5','6','7','8','9','0'];\n if (this._config.scramble) {\n const numericPart = shuffle(['1','2','3','4','5','6','7','8','9']);\n digits = [...numericPart, '0'];\n }\n\n const grid = document.createElement('div');\n grid.style.cssText = 'display:grid; grid-template-columns: repeat(3,1fr); gap:8px;';\n\n const btnStyle = (bg: string, color: string) =>\n `background:${bg}; color:${color}; border:none; border-radius:10px; font-size:22px;\n font-weight:600; padding:16px; cursor:pointer; transition:opacity .1s;\n -webkit-tap-highlight-color:transparent;`;\n\n const keyColor = this._config.theme === 'dark' ? '#2a2a3e' : '#ffffff';\n const textColor = this._config.theme === 'dark' ? '#e2e8f0' : '#1a202c';\n\n // Render digit keys\n digits.slice(0, 9).forEach(d => {\n const btn = this._makeKey(d, btnStyle(keyColor, textColor));\n grid.appendChild(btn);\n });\n\n // Bottom row: clear | 0 | backspace\n if (this._config.mode === 'amount' || this._config.mode === 'numeric') {\n const decBtn = this._makeKey('.', btnStyle(keyColor, textColor));\n grid.appendChild(decBtn);\n } else {\n grid.appendChild(this._makeSpacer());\n }\n\n const zeroBtn = this._makeKey('0', btnStyle(keyColor, textColor));\n grid.appendChild(zeroBtn);\n\n const backBtn = this._makeKey('⌫', btnStyle('#ef4444', '#fff'));\n backBtn.setAttribute('aria-label', 'Backspace');\n backBtn.addEventListener('click', () => {\n this._value = this._value.slice(0, -1);\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n grid.appendChild(backBtn);\n\n this._container.appendChild(grid);\n\n // Submit / clear row\n const actionRow = document.createElement('div');\n actionRow.style.cssText = 'display:flex; gap:8px; margin-top:4px;';\n\n const clearBtn = document.createElement('button');\n clearBtn.textContent = 'Clear';\n clearBtn.style.cssText = btnStyle('#6b7280', '#fff') + 'flex:1; font-size:14px; padding:12px;';\n clearBtn.addEventListener('click', () => this.clear());\n\n const submitBtn = document.createElement('button');\n submitBtn.textContent = 'Submit';\n submitBtn.style.cssText = btnStyle('#2563eb', '#fff') + 'flex:2; font-size:14px; padding:12px;';\n submitBtn.addEventListener('click', () => {\n this._opts.onSubmit?.(this._value);\n });\n\n actionRow.appendChild(clearBtn);\n actionRow.appendChild(submitBtn);\n this._container.appendChild(actionRow);\n }\n\n private _makeKey(label: string, style: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.textContent = label;\n btn.style.cssText = style;\n btn.addEventListener('click', () => {\n const maxLen = this._config.maxLength ?? (this._config.mode === 'pin' ? 6 : (this._config.mode === 'otp' ? 6 : 16));\n if (this._value.length >= maxLen) return;\n if (this._config.haptic && navigator.vibrate) navigator.vibrate(10);\n this._value += label;\n this._opts.onInput?.(this._value);\n this._refresh();\n });\n return btn;\n }\n\n private _makeSpacer(): HTMLDivElement {\n const el = document.createElement('div');\n return el;\n }\n\n private _refresh(): void {\n if (!this._container) return;\n this.render(this._container);\n }\n}\n"]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
export { J as JoopClipboardService, f as JoopCompressOptions, g as JoopGeoOptions, h as JoopGeoPosition, c as JoopGeoService, i as JoopImageInfo, a as JoopImageService, j as JoopImageValidation, k as JoopMediaConstraints, l as JoopMediaRecorder, d as JoopMediaService, m as JoopPdfLineOptions, n as JoopPdfOptions, b as JoopPdfService, o as JoopPdfTableColumn, p as JoopPdfTextOptions, q as JoopReceiptLine, r as JoopRecorderOptions, s as JoopWatermarkOptions, e as JoopWatermarkService, t as clipboard } from '../watermark.service-QNegMeQZ.mjs';
|
|
2
|
+
export { a as JoopNotificationOptions, b as JoopNotificationPermission, J as JoopNotificationService } from '../notification.service-Dm4fvfZf.mjs';
|
|
3
|
+
export { J as JoopCryptoUtils, a as JoopPasswordHash } from '../crypto-utils-DriNhLdx.mjs';
|
|
4
|
+
import '../index-Dz0gOur2.mjs';
|
|
5
|
+
|
|
6
|
+
/** Remove a trailing slash from a URL string. */
|
|
7
|
+
declare function removeTrailingSlash(url: string): string;
|
|
8
|
+
/** Serialize a plain object to a URL-encoded query string. */
|
|
9
|
+
declare function objectToQueryString(obj: Record<string, any>): string;
|
|
10
|
+
/** Deep-clone a JSON-serializable object. */
|
|
11
|
+
declare function deepClone<T>(obj: T): T;
|
|
12
|
+
/** Check if a value is a plain object (not an array, not null). */
|
|
13
|
+
declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
14
|
+
/** Generate a random alphanumeric string of a given length. */
|
|
15
|
+
declare function randomString(length: number, charset?: string): string;
|
|
16
|
+
/** Convert a string to its hex representation. */
|
|
17
|
+
declare function stringToHex(input: string): string;
|
|
18
|
+
/** Convert an ArrayBuffer to a lowercase hex string. */
|
|
19
|
+
declare function bufferToHex(buffer: ArrayBuffer | Uint8Array): string;
|
|
20
|
+
/** Serialize a nested object into flat form-data-style string segments. */
|
|
21
|
+
declare function flattenObject(obj: Record<string, any>, prefix?: string): Record<string, string>;
|
|
22
|
+
|
|
23
|
+
interface JoopDeviceInfo {
|
|
24
|
+
userAgent: string;
|
|
25
|
+
platform: string;
|
|
26
|
+
isIOS: boolean;
|
|
27
|
+
isAndroid: boolean;
|
|
28
|
+
isMobile: boolean;
|
|
29
|
+
isDesktop: boolean;
|
|
30
|
+
language: string;
|
|
31
|
+
}
|
|
32
|
+
declare function getDeviceInfo(): JoopDeviceInfo;
|
|
33
|
+
declare function isBrowser(): boolean;
|
|
34
|
+
declare function isSSR(): boolean;
|
|
35
|
+
|
|
36
|
+
declare function escapeHtml(input: string): string;
|
|
37
|
+
declare function stripHtml(input: string): string;
|
|
38
|
+
declare function sanitizeInput(input: string): string;
|
|
39
|
+
declare function stripSqlKeywords(input: string): string;
|
|
40
|
+
declare function sanitizeFileName(name: string): string;
|
|
41
|
+
declare function isValidUrl(url: string): boolean;
|
|
42
|
+
declare function isValidEmail(email: string): boolean;
|
|
43
|
+
declare function isValidPhone(phone: string): boolean;
|
|
44
|
+
declare function isAlphanumeric(value: string): boolean;
|
|
45
|
+
declare function truncate(value: string, maxLength: number, suffix?: string): string;
|
|
46
|
+
|
|
47
|
+
/** Recursively flatten a nested object — { a: { b: 1 } } → { 'a.b': 1 } */
|
|
48
|
+
declare function flattenObj(obj: Record<string, unknown>, prefix?: string, result?: Record<string, string>): Record<string, string>;
|
|
49
|
+
/** Build a URL query string from a flat or nested object */
|
|
50
|
+
declare function buildQueryString(params: Record<string, unknown>, encode?: boolean): string;
|
|
51
|
+
/** Build a FormData object from a flat or nested object, with optional file attachments */
|
|
52
|
+
declare function buildFormData(params: Record<string, unknown>, files?: {
|
|
53
|
+
field: string;
|
|
54
|
+
file: File | Blob;
|
|
55
|
+
name?: string;
|
|
56
|
+
}[]): FormData;
|
|
57
|
+
/** Encode query params using encodeURIComponent — replaces space with %20 (not +) */
|
|
58
|
+
declare function urlEncode(params: Record<string, string>): string;
|
|
59
|
+
/** Generate a random integer in [min, max] inclusive */
|
|
60
|
+
declare function getRandomNum(min: number, max: number): number;
|
|
61
|
+
|
|
62
|
+
type JoopWeekend = [number, number];
|
|
63
|
+
declare function isBusinessDay(date: Date, holidays?: Date[], weekend?: JoopWeekend): boolean;
|
|
64
|
+
declare function addBusinessDays(date: Date, days: number, holidays?: Date[], weekend?: JoopWeekend): Date;
|
|
65
|
+
declare function getBusinessDaysBetween(start: Date, end: Date, holidays?: Date[], weekend?: JoopWeekend): number;
|
|
66
|
+
declare function daysBetween(a: Date, b: Date): number;
|
|
67
|
+
declare function isDateInRange(date: Date, start: Date, end: Date): boolean;
|
|
68
|
+
declare function parseDate(value: string | number): Date | null;
|
|
69
|
+
declare function formatDate(date: Date, format: string, locale?: string): string;
|
|
70
|
+
interface JoopHijriDate {
|
|
71
|
+
year: number;
|
|
72
|
+
month: number;
|
|
73
|
+
day: number;
|
|
74
|
+
monthName: string;
|
|
75
|
+
}
|
|
76
|
+
/** Convert Gregorian date to Hijri (algorithmic approximation — accurate ±1 day) */
|
|
77
|
+
declare function toHijri(date: Date): JoopHijriDate;
|
|
78
|
+
/** Convert Hijri date back to Gregorian */
|
|
79
|
+
declare function fromHijri(year: number, month: number, day: number): Date;
|
|
80
|
+
declare function formatHijri(date: JoopHijriDate, includeMonthName?: boolean): string;
|
|
81
|
+
declare function timeAgo(date: Date, locale?: string): string;
|
|
82
|
+
|
|
83
|
+
type JoopQrEcLevel = 'L' | 'M' | 'Q' | 'H';
|
|
84
|
+
interface JoopQrOptions {
|
|
85
|
+
ecLevel?: JoopQrEcLevel;
|
|
86
|
+
size?: number;
|
|
87
|
+
margin?: number;
|
|
88
|
+
foreground?: string;
|
|
89
|
+
background?: string;
|
|
90
|
+
}
|
|
91
|
+
/** Generate a QR code SVG string */
|
|
92
|
+
declare function generateQr(text: string, options?: JoopQrOptions): string;
|
|
93
|
+
/** Generate a QR code as a base64 SVG data URL */
|
|
94
|
+
declare function generateQrDataUrl(text: string, options?: JoopQrOptions): string;
|
|
95
|
+
/** Generate QR for a payment (wraps text with standard payment URI) */
|
|
96
|
+
declare function generatePaymentQr(amount: number, currency: string, reference: string, options?: JoopQrOptions): string;
|
|
97
|
+
|
|
98
|
+
interface JoopBarcodeOptions {
|
|
99
|
+
width?: number;
|
|
100
|
+
height?: number;
|
|
101
|
+
margin?: number;
|
|
102
|
+
foreground?: string;
|
|
103
|
+
background?: string;
|
|
104
|
+
showText?: boolean;
|
|
105
|
+
fontSize?: number;
|
|
106
|
+
}
|
|
107
|
+
declare function generateCode128(text: string, opts?: JoopBarcodeOptions): string;
|
|
108
|
+
declare function validateEan13(digits: string): boolean;
|
|
109
|
+
declare function generateEan13(digits: string, opts?: JoopBarcodeOptions): string;
|
|
110
|
+
declare function generateCode39(text: string, opts?: JoopBarcodeOptions): string;
|
|
111
|
+
declare function generateBarcodeDataUrl(svg: string): string;
|
|
112
|
+
|
|
113
|
+
interface JoopChartBucket {
|
|
114
|
+
label: string;
|
|
115
|
+
value: number;
|
|
116
|
+
count: number;
|
|
117
|
+
start: number;
|
|
118
|
+
end: number;
|
|
119
|
+
}
|
|
120
|
+
interface JoopCategoryAgg {
|
|
121
|
+
category: string;
|
|
122
|
+
total: number;
|
|
123
|
+
count: number;
|
|
124
|
+
average: number;
|
|
125
|
+
min: number;
|
|
126
|
+
max: number;
|
|
127
|
+
}
|
|
128
|
+
type JoopTimeInterval = 'hour' | 'day' | 'week' | 'month' | 'year';
|
|
129
|
+
/** Aggregate time-series data into fixed-width time buckets */
|
|
130
|
+
declare function bucketByTime(data: Record<string, unknown>[], interval: JoopTimeInterval, valueKey: string, dateKey?: string): JoopChartBucket[];
|
|
131
|
+
/** Rolling/moving average over an array of numbers */
|
|
132
|
+
declare function rollingAverage(data: number[], window: number): number[];
|
|
133
|
+
/** Normalize values to [0,1] range */
|
|
134
|
+
declare function normalize(data: number[], min?: number, max?: number): number[];
|
|
135
|
+
/** Cumulative sum */
|
|
136
|
+
declare function cumulative(data: number[]): number[];
|
|
137
|
+
/** Moving sum over a window */
|
|
138
|
+
declare function movingSum(data: number[], window: number): number[];
|
|
139
|
+
/** Group by category and compute aggregates */
|
|
140
|
+
declare function aggregateByCategory(data: Record<string, unknown>[], categoryKey: string, valueKey: string): JoopCategoryAgg[];
|
|
141
|
+
/** Percent change between consecutive values */
|
|
142
|
+
declare function percentChange(values: number[]): number[];
|
|
143
|
+
/** Simple linear trend: 'up' | 'down' | 'flat' */
|
|
144
|
+
declare function detectTrend(data: number[], threshold?: number): 'up' | 'down' | 'flat';
|
|
145
|
+
/** Generate SVG polyline points for a sparkline */
|
|
146
|
+
declare function sparklinePoints(data: number[], width: number, height: number): string;
|
|
147
|
+
/** Generate a full sparkline SVG element */
|
|
148
|
+
declare function sparklineSvg(data: number[], width?: number, height?: number, color?: string): string;
|
|
149
|
+
|
|
150
|
+
type JoopQrDecoder = (data: Uint8ClampedArray, width: number, height: number) => string | null | undefined;
|
|
151
|
+
interface JoopQrScannerConfig {
|
|
152
|
+
/** Canvas-based QR decoder function. Inject jsQR or a similar library. */
|
|
153
|
+
decoder: JoopQrDecoder;
|
|
154
|
+
/** Camera facing mode, default 'environment' (rear camera) */
|
|
155
|
+
facingMode?: 'environment' | 'user';
|
|
156
|
+
/** Scan frequency in Hz (frames per second), default 10 */
|
|
157
|
+
fps?: number;
|
|
158
|
+
/** If true, stop scanning after first successful decode, default true */
|
|
159
|
+
stopOnScan?: boolean;
|
|
160
|
+
/** Video element constraints */
|
|
161
|
+
width?: number;
|
|
162
|
+
height?: number;
|
|
163
|
+
}
|
|
164
|
+
interface JoopQrScanResult {
|
|
165
|
+
text: string;
|
|
166
|
+
timestamp: number;
|
|
167
|
+
}
|
|
168
|
+
declare class JoopQrScanner {
|
|
169
|
+
private _stream;
|
|
170
|
+
private _video;
|
|
171
|
+
private _canvas;
|
|
172
|
+
private _ctx;
|
|
173
|
+
private _timer;
|
|
174
|
+
private _active;
|
|
175
|
+
private _onResult;
|
|
176
|
+
private _onError;
|
|
177
|
+
private readonly _cfg;
|
|
178
|
+
constructor(config: JoopQrScannerConfig);
|
|
179
|
+
onResult(fn: (r: JoopQrScanResult) => void): this;
|
|
180
|
+
onError(fn: (e: Error) => void): this;
|
|
181
|
+
start(container?: HTMLElement): Promise<void>;
|
|
182
|
+
stop(): void;
|
|
183
|
+
isActive(): boolean;
|
|
184
|
+
/** Scan a static image File / Blob instead of the camera. */
|
|
185
|
+
scanFile(file: File | Blob): Promise<JoopQrScanResult | null>;
|
|
186
|
+
private _scheduleFrames;
|
|
187
|
+
private _processFrame;
|
|
188
|
+
}
|
|
189
|
+
/** Generate an otpauth:// TOTP enrollment URI (for authenticator app QR codes) */
|
|
190
|
+
declare function generateTotpUri(options: {
|
|
191
|
+
secret: string;
|
|
192
|
+
account: string;
|
|
193
|
+
issuer: string;
|
|
194
|
+
period?: number;
|
|
195
|
+
digits?: number;
|
|
196
|
+
algorithm?: 'SHA1' | 'SHA256' | 'SHA512';
|
|
197
|
+
}): string;
|
|
198
|
+
|
|
199
|
+
export { type JoopBarcodeOptions, type JoopCategoryAgg, type JoopChartBucket, type JoopDeviceInfo, type JoopHijriDate, type JoopQrDecoder, type JoopQrEcLevel, type JoopQrOptions, type JoopQrScanResult, JoopQrScanner, type JoopQrScannerConfig, type JoopTimeInterval, type JoopWeekend, addBusinessDays, aggregateByCategory, bucketByTime, bufferToHex, buildFormData, buildQueryString, cumulative, daysBetween, deepClone, detectTrend, escapeHtml, flattenObj, flattenObject, formatDate, formatHijri, fromHijri, generateBarcodeDataUrl, generateCode128, generateCode39, generateEan13, generatePaymentQr, generateQr, generateQrDataUrl, generateTotpUri, getBusinessDaysBetween, getDeviceInfo, getRandomNum, isAlphanumeric, isBrowser, isBusinessDay, isDateInRange, isPlainObject, isSSR, isValidEmail, isValidPhone, isValidUrl, movingSum, normalize, objectToQueryString, parseDate, percentChange, randomString, removeTrailingSlash, rollingAverage, sanitizeFileName, sanitizeInput, sparklinePoints, sparklineSvg, stringToHex, stripHtml, stripSqlKeywords, timeAgo, toHijri, truncate, urlEncode, validateEan13 };
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
export { J as JoopClipboardService, f as JoopCompressOptions, g as JoopGeoOptions, h as JoopGeoPosition, c as JoopGeoService, i as JoopImageInfo, a as JoopImageService, j as JoopImageValidation, k as JoopMediaConstraints, l as JoopMediaRecorder, d as JoopMediaService, m as JoopPdfLineOptions, n as JoopPdfOptions, b as JoopPdfService, o as JoopPdfTableColumn, p as JoopPdfTextOptions, q as JoopReceiptLine, r as JoopRecorderOptions, s as JoopWatermarkOptions, e as JoopWatermarkService, t as clipboard } from '../watermark.service-Detur5tq.js';
|
|
2
|
+
export { a as JoopNotificationOptions, b as JoopNotificationPermission, J as JoopNotificationService } from '../notification.service-tEMKatWJ.js';
|
|
3
|
+
export { J as JoopCryptoUtils, a as JoopPasswordHash } from '../crypto-utils-DriNhLdx.js';
|
|
4
|
+
import '../index-Dz0gOur2.js';
|
|
5
|
+
|
|
6
|
+
/** Remove a trailing slash from a URL string. */
|
|
7
|
+
declare function removeTrailingSlash(url: string): string;
|
|
8
|
+
/** Serialize a plain object to a URL-encoded query string. */
|
|
9
|
+
declare function objectToQueryString(obj: Record<string, any>): string;
|
|
10
|
+
/** Deep-clone a JSON-serializable object. */
|
|
11
|
+
declare function deepClone<T>(obj: T): T;
|
|
12
|
+
/** Check if a value is a plain object (not an array, not null). */
|
|
13
|
+
declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
14
|
+
/** Generate a random alphanumeric string of a given length. */
|
|
15
|
+
declare function randomString(length: number, charset?: string): string;
|
|
16
|
+
/** Convert a string to its hex representation. */
|
|
17
|
+
declare function stringToHex(input: string): string;
|
|
18
|
+
/** Convert an ArrayBuffer to a lowercase hex string. */
|
|
19
|
+
declare function bufferToHex(buffer: ArrayBuffer | Uint8Array): string;
|
|
20
|
+
/** Serialize a nested object into flat form-data-style string segments. */
|
|
21
|
+
declare function flattenObject(obj: Record<string, any>, prefix?: string): Record<string, string>;
|
|
22
|
+
|
|
23
|
+
interface JoopDeviceInfo {
|
|
24
|
+
userAgent: string;
|
|
25
|
+
platform: string;
|
|
26
|
+
isIOS: boolean;
|
|
27
|
+
isAndroid: boolean;
|
|
28
|
+
isMobile: boolean;
|
|
29
|
+
isDesktop: boolean;
|
|
30
|
+
language: string;
|
|
31
|
+
}
|
|
32
|
+
declare function getDeviceInfo(): JoopDeviceInfo;
|
|
33
|
+
declare function isBrowser(): boolean;
|
|
34
|
+
declare function isSSR(): boolean;
|
|
35
|
+
|
|
36
|
+
declare function escapeHtml(input: string): string;
|
|
37
|
+
declare function stripHtml(input: string): string;
|
|
38
|
+
declare function sanitizeInput(input: string): string;
|
|
39
|
+
declare function stripSqlKeywords(input: string): string;
|
|
40
|
+
declare function sanitizeFileName(name: string): string;
|
|
41
|
+
declare function isValidUrl(url: string): boolean;
|
|
42
|
+
declare function isValidEmail(email: string): boolean;
|
|
43
|
+
declare function isValidPhone(phone: string): boolean;
|
|
44
|
+
declare function isAlphanumeric(value: string): boolean;
|
|
45
|
+
declare function truncate(value: string, maxLength: number, suffix?: string): string;
|
|
46
|
+
|
|
47
|
+
/** Recursively flatten a nested object — { a: { b: 1 } } → { 'a.b': 1 } */
|
|
48
|
+
declare function flattenObj(obj: Record<string, unknown>, prefix?: string, result?: Record<string, string>): Record<string, string>;
|
|
49
|
+
/** Build a URL query string from a flat or nested object */
|
|
50
|
+
declare function buildQueryString(params: Record<string, unknown>, encode?: boolean): string;
|
|
51
|
+
/** Build a FormData object from a flat or nested object, with optional file attachments */
|
|
52
|
+
declare function buildFormData(params: Record<string, unknown>, files?: {
|
|
53
|
+
field: string;
|
|
54
|
+
file: File | Blob;
|
|
55
|
+
name?: string;
|
|
56
|
+
}[]): FormData;
|
|
57
|
+
/** Encode query params using encodeURIComponent — replaces space with %20 (not +) */
|
|
58
|
+
declare function urlEncode(params: Record<string, string>): string;
|
|
59
|
+
/** Generate a random integer in [min, max] inclusive */
|
|
60
|
+
declare function getRandomNum(min: number, max: number): number;
|
|
61
|
+
|
|
62
|
+
type JoopWeekend = [number, number];
|
|
63
|
+
declare function isBusinessDay(date: Date, holidays?: Date[], weekend?: JoopWeekend): boolean;
|
|
64
|
+
declare function addBusinessDays(date: Date, days: number, holidays?: Date[], weekend?: JoopWeekend): Date;
|
|
65
|
+
declare function getBusinessDaysBetween(start: Date, end: Date, holidays?: Date[], weekend?: JoopWeekend): number;
|
|
66
|
+
declare function daysBetween(a: Date, b: Date): number;
|
|
67
|
+
declare function isDateInRange(date: Date, start: Date, end: Date): boolean;
|
|
68
|
+
declare function parseDate(value: string | number): Date | null;
|
|
69
|
+
declare function formatDate(date: Date, format: string, locale?: string): string;
|
|
70
|
+
interface JoopHijriDate {
|
|
71
|
+
year: number;
|
|
72
|
+
month: number;
|
|
73
|
+
day: number;
|
|
74
|
+
monthName: string;
|
|
75
|
+
}
|
|
76
|
+
/** Convert Gregorian date to Hijri (algorithmic approximation — accurate ±1 day) */
|
|
77
|
+
declare function toHijri(date: Date): JoopHijriDate;
|
|
78
|
+
/** Convert Hijri date back to Gregorian */
|
|
79
|
+
declare function fromHijri(year: number, month: number, day: number): Date;
|
|
80
|
+
declare function formatHijri(date: JoopHijriDate, includeMonthName?: boolean): string;
|
|
81
|
+
declare function timeAgo(date: Date, locale?: string): string;
|
|
82
|
+
|
|
83
|
+
type JoopQrEcLevel = 'L' | 'M' | 'Q' | 'H';
|
|
84
|
+
interface JoopQrOptions {
|
|
85
|
+
ecLevel?: JoopQrEcLevel;
|
|
86
|
+
size?: number;
|
|
87
|
+
margin?: number;
|
|
88
|
+
foreground?: string;
|
|
89
|
+
background?: string;
|
|
90
|
+
}
|
|
91
|
+
/** Generate a QR code SVG string */
|
|
92
|
+
declare function generateQr(text: string, options?: JoopQrOptions): string;
|
|
93
|
+
/** Generate a QR code as a base64 SVG data URL */
|
|
94
|
+
declare function generateQrDataUrl(text: string, options?: JoopQrOptions): string;
|
|
95
|
+
/** Generate QR for a payment (wraps text with standard payment URI) */
|
|
96
|
+
declare function generatePaymentQr(amount: number, currency: string, reference: string, options?: JoopQrOptions): string;
|
|
97
|
+
|
|
98
|
+
interface JoopBarcodeOptions {
|
|
99
|
+
width?: number;
|
|
100
|
+
height?: number;
|
|
101
|
+
margin?: number;
|
|
102
|
+
foreground?: string;
|
|
103
|
+
background?: string;
|
|
104
|
+
showText?: boolean;
|
|
105
|
+
fontSize?: number;
|
|
106
|
+
}
|
|
107
|
+
declare function generateCode128(text: string, opts?: JoopBarcodeOptions): string;
|
|
108
|
+
declare function validateEan13(digits: string): boolean;
|
|
109
|
+
declare function generateEan13(digits: string, opts?: JoopBarcodeOptions): string;
|
|
110
|
+
declare function generateCode39(text: string, opts?: JoopBarcodeOptions): string;
|
|
111
|
+
declare function generateBarcodeDataUrl(svg: string): string;
|
|
112
|
+
|
|
113
|
+
interface JoopChartBucket {
|
|
114
|
+
label: string;
|
|
115
|
+
value: number;
|
|
116
|
+
count: number;
|
|
117
|
+
start: number;
|
|
118
|
+
end: number;
|
|
119
|
+
}
|
|
120
|
+
interface JoopCategoryAgg {
|
|
121
|
+
category: string;
|
|
122
|
+
total: number;
|
|
123
|
+
count: number;
|
|
124
|
+
average: number;
|
|
125
|
+
min: number;
|
|
126
|
+
max: number;
|
|
127
|
+
}
|
|
128
|
+
type JoopTimeInterval = 'hour' | 'day' | 'week' | 'month' | 'year';
|
|
129
|
+
/** Aggregate time-series data into fixed-width time buckets */
|
|
130
|
+
declare function bucketByTime(data: Record<string, unknown>[], interval: JoopTimeInterval, valueKey: string, dateKey?: string): JoopChartBucket[];
|
|
131
|
+
/** Rolling/moving average over an array of numbers */
|
|
132
|
+
declare function rollingAverage(data: number[], window: number): number[];
|
|
133
|
+
/** Normalize values to [0,1] range */
|
|
134
|
+
declare function normalize(data: number[], min?: number, max?: number): number[];
|
|
135
|
+
/** Cumulative sum */
|
|
136
|
+
declare function cumulative(data: number[]): number[];
|
|
137
|
+
/** Moving sum over a window */
|
|
138
|
+
declare function movingSum(data: number[], window: number): number[];
|
|
139
|
+
/** Group by category and compute aggregates */
|
|
140
|
+
declare function aggregateByCategory(data: Record<string, unknown>[], categoryKey: string, valueKey: string): JoopCategoryAgg[];
|
|
141
|
+
/** Percent change between consecutive values */
|
|
142
|
+
declare function percentChange(values: number[]): number[];
|
|
143
|
+
/** Simple linear trend: 'up' | 'down' | 'flat' */
|
|
144
|
+
declare function detectTrend(data: number[], threshold?: number): 'up' | 'down' | 'flat';
|
|
145
|
+
/** Generate SVG polyline points for a sparkline */
|
|
146
|
+
declare function sparklinePoints(data: number[], width: number, height: number): string;
|
|
147
|
+
/** Generate a full sparkline SVG element */
|
|
148
|
+
declare function sparklineSvg(data: number[], width?: number, height?: number, color?: string): string;
|
|
149
|
+
|
|
150
|
+
type JoopQrDecoder = (data: Uint8ClampedArray, width: number, height: number) => string | null | undefined;
|
|
151
|
+
interface JoopQrScannerConfig {
|
|
152
|
+
/** Canvas-based QR decoder function. Inject jsQR or a similar library. */
|
|
153
|
+
decoder: JoopQrDecoder;
|
|
154
|
+
/** Camera facing mode, default 'environment' (rear camera) */
|
|
155
|
+
facingMode?: 'environment' | 'user';
|
|
156
|
+
/** Scan frequency in Hz (frames per second), default 10 */
|
|
157
|
+
fps?: number;
|
|
158
|
+
/** If true, stop scanning after first successful decode, default true */
|
|
159
|
+
stopOnScan?: boolean;
|
|
160
|
+
/** Video element constraints */
|
|
161
|
+
width?: number;
|
|
162
|
+
height?: number;
|
|
163
|
+
}
|
|
164
|
+
interface JoopQrScanResult {
|
|
165
|
+
text: string;
|
|
166
|
+
timestamp: number;
|
|
167
|
+
}
|
|
168
|
+
declare class JoopQrScanner {
|
|
169
|
+
private _stream;
|
|
170
|
+
private _video;
|
|
171
|
+
private _canvas;
|
|
172
|
+
private _ctx;
|
|
173
|
+
private _timer;
|
|
174
|
+
private _active;
|
|
175
|
+
private _onResult;
|
|
176
|
+
private _onError;
|
|
177
|
+
private readonly _cfg;
|
|
178
|
+
constructor(config: JoopQrScannerConfig);
|
|
179
|
+
onResult(fn: (r: JoopQrScanResult) => void): this;
|
|
180
|
+
onError(fn: (e: Error) => void): this;
|
|
181
|
+
start(container?: HTMLElement): Promise<void>;
|
|
182
|
+
stop(): void;
|
|
183
|
+
isActive(): boolean;
|
|
184
|
+
/** Scan a static image File / Blob instead of the camera. */
|
|
185
|
+
scanFile(file: File | Blob): Promise<JoopQrScanResult | null>;
|
|
186
|
+
private _scheduleFrames;
|
|
187
|
+
private _processFrame;
|
|
188
|
+
}
|
|
189
|
+
/** Generate an otpauth:// TOTP enrollment URI (for authenticator app QR codes) */
|
|
190
|
+
declare function generateTotpUri(options: {
|
|
191
|
+
secret: string;
|
|
192
|
+
account: string;
|
|
193
|
+
issuer: string;
|
|
194
|
+
period?: number;
|
|
195
|
+
digits?: number;
|
|
196
|
+
algorithm?: 'SHA1' | 'SHA256' | 'SHA512';
|
|
197
|
+
}): string;
|
|
198
|
+
|
|
199
|
+
export { type JoopBarcodeOptions, type JoopCategoryAgg, type JoopChartBucket, type JoopDeviceInfo, type JoopHijriDate, type JoopQrDecoder, type JoopQrEcLevel, type JoopQrOptions, type JoopQrScanResult, JoopQrScanner, type JoopQrScannerConfig, type JoopTimeInterval, type JoopWeekend, addBusinessDays, aggregateByCategory, bucketByTime, bufferToHex, buildFormData, buildQueryString, cumulative, daysBetween, deepClone, detectTrend, escapeHtml, flattenObj, flattenObject, formatDate, formatHijri, fromHijri, generateBarcodeDataUrl, generateCode128, generateCode39, generateEan13, generatePaymentQr, generateQr, generateQrDataUrl, generateTotpUri, getBusinessDaysBetween, getDeviceInfo, getRandomNum, isAlphanumeric, isBrowser, isBusinessDay, isDateInRange, isPlainObject, isSSR, isValidEmail, isValidPhone, isValidUrl, movingSum, normalize, objectToQueryString, parseDate, percentChange, randomString, removeTrailingSlash, rollingAverage, sanitizeFileName, sanitizeInput, sparklinePoints, sparklineSvg, stringToHex, stripHtml, stripSqlKeywords, timeAgo, toHijri, truncate, urlEncode, validateEan13 };
|