vex-ui-kit 1.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.
Files changed (44) hide show
  1. package/README.md +830 -0
  2. package/dist/adapters/react.cjs.js +17 -0
  3. package/dist/adapters/react.cjs.js.map +1 -0
  4. package/dist/adapters/react.d.mts +37 -0
  5. package/dist/adapters/react.d.ts +37 -0
  6. package/dist/adapters/react.esm.js +17 -0
  7. package/dist/adapters/react.esm.js.map +1 -0
  8. package/dist/adapters/react.umd.js +63 -0
  9. package/dist/adapters/react.umd.js.map +1 -0
  10. package/dist/adapters/svelte.cjs.js +17 -0
  11. package/dist/adapters/svelte.cjs.js.map +1 -0
  12. package/dist/adapters/svelte.d.mts +21 -0
  13. package/dist/adapters/svelte.d.ts +21 -0
  14. package/dist/adapters/svelte.esm.js +17 -0
  15. package/dist/adapters/svelte.esm.js.map +1 -0
  16. package/dist/adapters/svelte.umd.js +44 -0
  17. package/dist/adapters/svelte.umd.js.map +1 -0
  18. package/dist/adapters/vue.cjs.js +17 -0
  19. package/dist/adapters/vue.cjs.js.map +1 -0
  20. package/dist/adapters/vue.d.mts +35 -0
  21. package/dist/adapters/vue.d.ts +35 -0
  22. package/dist/adapters/vue.esm.js +17 -0
  23. package/dist/adapters/vue.esm.js.map +1 -0
  24. package/dist/adapters/vue.umd.js +147 -0
  25. package/dist/adapters/vue.umd.js.map +1 -0
  26. package/dist/index-CpFq7Lxe.d.mts +213 -0
  27. package/dist/index-CpFq7Lxe.d.ts +213 -0
  28. package/dist/themes/flat.css +47 -0
  29. package/dist/themes/glass.css +22 -0
  30. package/dist/themes/minimal.css +35 -0
  31. package/dist/themes/neon.css +45 -0
  32. package/dist/themes/outline.css +18 -0
  33. package/dist/themes/pastel.css +21 -0
  34. package/dist/themes/tokens.css +329 -0
  35. package/dist/vex-ui-kit.css +329 -0
  36. package/dist/vexui.cjs.js +17 -0
  37. package/dist/vexui.cjs.js.map +1 -0
  38. package/dist/vexui.d.mts +1 -0
  39. package/dist/vexui.d.ts +1 -0
  40. package/dist/vexui.esm.js +17 -0
  41. package/dist/vexui.esm.js.map +1 -0
  42. package/dist/vexui.umd.js +17 -0
  43. package/dist/vexui.umd.js.map +1 -0
  44. package/package.json +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/vue.ts","../../src/core/queue.ts","../../src/core/history.ts","../../src/core/a11y.ts","../../src/core/alert.ts","../../src/core/modal.ts","../../src/core/drawer.ts","../../src/core/flow.ts","../../src/core/theme.ts","../../src/index.ts"],"sourcesContent":["import { getCurrentInstance, onUnmounted } from 'vue'\nimport vex from '../index'\n\nexport const VexUI = {\n install(app: any) {\n app.config.globalProperties.$vex = vex\n }\n}\n\nexport function useVex() {\n // In Vue composition API, we can track too\n const ids: string[] = [];\n \n const wrappedAlert = {\n ...vex.alert,\n success: (msg: string, opts?: any) => { const id = vex.alert.success(msg, opts); ids.push(id); return id; },\n error: (msg: string, opts?: any) => { const id = vex.alert.error(msg, opts); ids.push(id); return id; },\n warning: (msg: string, opts?: any) => { const id = vex.alert.warning(msg, opts); ids.push(id); return id; },\n info: (msg: string, opts?: any) => { const id = vex.alert.info(msg, opts); ids.push(id); return id; },\n neutral: (msg: string, opts?: any) => { const id = vex.alert.neutral(msg, opts); ids.push(id); return id; },\n loading: (msg: string, opts?: any) => { const id = vex.alert.loading(msg, opts); ids.push(id); return id; },\n upload: (msg: string, opts?: any) => { const id = vex.alert.upload(msg, opts); ids.push(id); return id; },\n inline: (selector: any, opts: any) => { const id = vex.alert.inline(selector, opts); ids.push(id); return id; },\n fixed: (opts: any) => { const id = vex.alert.fixed(opts); ids.push(id); return id; },\n attach: (selector: any, opts: any) => { const id = vex.alert.attach(selector, opts); ids.push(id); return id; },\n show: (opts: any) => { const id = vex.alert.show(opts); ids.push(id); return id; }\n };\n\n onUnmounted(() => {\n ids.forEach(id => vex.dismiss(id));\n })\n\n return {\n ...vex,\n alert: wrappedAlert\n }\n}\n","export type Priority = 'critical' | 'high' | 'normal' | 'low';\n\nexport interface QueueItem {\n id: string;\n priority: Priority;\n show: () => void;\n close: () => void;\n}\n\nexport class AlertQueue {\n private active: QueueItem[] = [];\n private pending: QueueItem[] = [];\n private maxStack: number = 5;\n\n public setMaxStack(max: number) {\n this.maxStack = max;\n }\n\n public add(item: QueueItem) {\n // If we have space, show immediately\n if (this.active.length < this.maxStack) {\n this.active.push(item);\n item.show();\n return;\n }\n\n // If full, check priority\n if (item.priority === 'critical') {\n // Find the oldest item with lower priority\n // We sort active by arrival (index) and filter by priority < critical\n const victimIndex = this.active.findIndex(i => this.getPriorityValue(i.priority) < this.getPriorityValue('critical'));\n \n if (victimIndex !== -1) {\n const victim = this.active[victimIndex];\n victim.close();\n \n // Optimistically remove from active to allow immediate show of critical alert\n this.active.splice(victimIndex, 1);\n \n this.pending.unshift(item);\n } else {\n this.pending.unshift(item);\n }\n } else if (item.priority === 'high') {\n // Enqueue at front of pending\n this.pending.unshift(item);\n } else {\n // Enqueue at end\n this.pending.push(item);\n }\n \n // Sort pending to ensure high/critical are always first if multiple are waiting\n this.sortPending();\n this.process();\n }\n\n public remove(id: string) {\n const index = this.active.findIndex(i => i.id === id);\n if (index !== -1) {\n this.active.splice(index, 1);\n this.process();\n }\n }\n\n private process() {\n if (this.active.length < this.maxStack && this.pending.length > 0) {\n const next = this.pending.shift();\n if (next) {\n this.active.push(next);\n next.show();\n }\n }\n }\n \n private sortPending() {\n this.pending.sort((a, b) => this.getPriorityValue(b.priority) - this.getPriorityValue(a.priority));\n }\n\n private getPriorityValue(p: Priority): number {\n switch (p) {\n case 'critical': return 4;\n case 'high': return 3;\n case 'normal': return 2;\n case 'low': return 1;\n default: return 2;\n }\n }\n}\n","export interface HistoryEntry {\n id: string;\n type: string;\n title?: string;\n message: string;\n timestamp: Date;\n read: boolean;\n}\n\nexport class HistoryManager {\n private entries: HistoryEntry[] = [];\n private limit = 100;\n private storageKey = 'vex_history';\n\n constructor() {\n this.load();\n }\n\n public add(entry: Omit<HistoryEntry, 'timestamp' | 'read'>) {\n const fullEntry: HistoryEntry = {\n ...entry,\n timestamp: new Date(),\n read: false\n };\n \n this.entries.unshift(fullEntry);\n if (this.entries.length > this.limit) {\n this.entries = this.entries.slice(0, this.limit);\n }\n this.save();\n }\n\n public get(): HistoryEntry[] {\n return this.entries;\n }\n\n public clear() {\n this.entries = [];\n this.save();\n }\n\n public markAllRead() {\n this.entries.forEach(e => e.read = true);\n this.save();\n }\n\n public markRead(id: string) {\n const entry = this.entries.find(e => e.id === id);\n if (entry) {\n entry.read = true;\n this.save();\n }\n }\n \n // Basic implementation of open - renders a dropdown\n public open(anchorSelector: string) {\n if (typeof document === 'undefined') return;\n \n const anchor = document.querySelector(anchorSelector);\n if (!anchor) {\n console.warn(`VexUI: History anchor ${anchorSelector} not found`);\n return;\n }\n\n // Remove existing if any\n const existing = document.getElementById('vex-history-dropdown');\n if (existing) existing.remove();\n\n const dropdown = document.createElement('div');\n dropdown.id = 'vex-history-dropdown';\n dropdown.className = 'vex-history-dropdown';\n \n // Position it relative to anchor\n const rect = anchor.getBoundingClientRect();\n dropdown.style.position = 'absolute';\n dropdown.style.top = `${rect.bottom + 8 + window.scrollY}px`;\n dropdown.style.left = `${rect.left + window.scrollX}px`;\n dropdown.style.zIndex = '9999';\n \n // Content\n const list = this.entries.map(e => `\n <div class=\"vex-hist-item ${e.read ? 'read' : 'unread'}\" data-id=\"${e.id}\">\n <div class=\"vex-hist-icon ${e.type}\"></div>\n <div class=\"vex-hist-content\">\n <div class=\"vex-hist-title\">${e.title || e.type}</div>\n <div class=\"vex-hist-msg\">${e.message}</div>\n <div class=\"vex-hist-time\">${e.timestamp.toLocaleTimeString()}</div>\n </div>\n </div>\n `).join('') || '<div class=\"vex-hist-empty\">No notifications</div>';\n\n dropdown.innerHTML = `\n <div class=\"vex-hist-header\">\n <span>Notifications</span>\n <button id=\"vex-hist-clear\">Clear</button>\n </div>\n <div class=\"vex-hist-list\">${list}</div>\n `;\n\n document.body.appendChild(dropdown);\n \n // Close on click outside\n const closeHandler = (e: MouseEvent) => {\n if (!dropdown.contains(e.target as Node) && e.target !== anchor) {\n dropdown.remove();\n document.removeEventListener('click', closeHandler);\n }\n };\n setTimeout(() => document.addEventListener('click', closeHandler), 0);\n \n // Clear handler\n dropdown.querySelector('#vex-hist-clear')?.addEventListener('click', () => {\n this.clear();\n dropdown.remove();\n });\n }\n\n private save() {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.entries));\n } catch (e) {\n // ignore quota errors\n }\n }\n }\n\n private load() {\n if (typeof localStorage !== 'undefined') {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n try {\n this.entries = JSON.parse(stored, (key, value) => {\n if (key === 'timestamp') return new Date(value);\n return value;\n });\n } catch (e) {\n console.error('Failed to load VexUI history', e);\n }\n }\n }\n }\n}\n\nexport const historyManager = new HistoryManager();\n","/**\n * VexUI Accessibility Utilities\n *\n * Implements focus trapping, focus restoration, and ARIA attributes management\n * for modals, drawers, and alerts.\n */\n\n// Helper to get all focusable elements within a container\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n const selector = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n return Array.from(container.querySelectorAll<HTMLElement>(selector)).filter(\n (el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden')\n );\n}\n\n// Trap focus within a container\nexport function trapFocus(container: HTMLElement, event: KeyboardEvent): void {\n const focusable = getFocusableElements(container);\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === first) {\n last.focus();\n event.preventDefault();\n }\n } else {\n if (document.activeElement === last) {\n first.focus();\n event.preventDefault();\n }\n }\n}\n\n// Store previously focused element to restore later\nlet previousFocus: HTMLElement | null = null;\n\nexport function saveFocus(): void {\n if (typeof document !== 'undefined' && document.activeElement) {\n previousFocus = document.activeElement as HTMLElement;\n }\n}\n\nexport function restoreFocus(): void {\n if (previousFocus && typeof document !== 'undefined' && document.body.contains(previousFocus)) {\n previousFocus.focus();\n previousFocus = null;\n }\n}\n\n// Set ARIA attributes for alerts\nexport function setupAlertA11y(element: HTMLElement, priority: 'critical' | 'high' | 'normal' | 'low'): void {\n element.setAttribute('role', 'alert');\n // Critical/High should be assertive, others polite\n const liveMode = (priority === 'critical' || priority === 'high') ? 'assertive' : 'polite';\n element.setAttribute('aria-live', liveMode);\n element.setAttribute('aria-atomic', 'true');\n}\n\n// Set ARIA attributes for modals\nexport function setupModalA11y(element: HTMLElement, titleId: string, descId?: string): void {\n element.setAttribute('role', 'dialog');\n element.setAttribute('aria-modal', 'true');\n element.setAttribute('aria-labelledby', titleId);\n if (descId) {\n element.setAttribute('aria-describedby', descId);\n }\n}\n","import { AlertQueue, QueueItem } from './queue';\nimport { historyManager } from './history';\nimport { setupAlertA11y } from './a11y';\nimport { themeManager, ThemeTokens } from './theme';\n\nexport interface AlertAction {\n label: string;\n variant?: 'primary' | 'danger' | 'default';\n onClick?: (close: () => void) => void;\n}\n\nexport interface AlertOptions {\n type?: 'success' | 'error' | 'warning' | 'info' | 'neutral' | 'loading' | 'upload';\n title?: string;\n message: string;\n duration?: number; // ms, 0 = permanent\n dismissible?: boolean;\n icon?: string | null;\n progress?: boolean; // time bar\n actions?: AlertAction[];\n priority?: 'critical' | 'high' | 'normal' | 'low';\n position?: 'top' | 'bottom';\n align?: 'center' | 'left' | 'right';\n animate?: 'slide' | 'fade' | 'scale' | 'bounce';\n maxStack?: number;\n theme?: Partial<ThemeTokens>;\n onClose?: () => void;\n // Internal/Advanced\n renderer?: 'fixed' | 'inline' | 'attach';\n selector?: string | HTMLElement;\n placement?: 'top' | 'bottom' | 'left' | 'right' | 'auto';\n // Upload specific\n total?: number;\n}\n\nexport class AlertEngine {\n private queue = new AlertQueue();\n private activeAlerts = new Map<string, { element: HTMLElement, options: AlertOptions }>();\n\n constructor() {\n // Lazy init\n }\n\n // Public API methods\n public success(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'success', message }); }\n public error(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'error', message }); }\n public warning(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'warning', message }); }\n public info(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'info', message }); }\n public neutral(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'neutral', message }); }\n public loading(message: string, opts?: Partial<AlertOptions>) { return this.create({ ...opts, type: 'loading', message, duration: 0 }); }\n \n public upload(message: string, opts?: Partial<AlertOptions>) {\n return this.create({ ...opts, type: 'loading', message, duration: 0, icon: 'upload' });\n }\n\n public inline(selector: string | HTMLElement, opts: AlertOptions) {\n return this.create({ ...opts, renderer: 'inline', selector });\n }\n\n public fixed(opts: AlertOptions) {\n return this.create({ ...opts, renderer: 'fixed' });\n }\n\n public attach(selector: string | HTMLElement, opts: AlertOptions) {\n return this.create({ ...opts, renderer: 'attach', selector });\n }\n \n public show(opts: AlertOptions) {\n return this.create(opts);\n }\n\n // Main create method\n private create(opts: AlertOptions): string {\n const id = this.generateId();\n const fullOpts = this.processOptions(opts);\n \n // Add to queue\n this.queue.add({\n id,\n priority: fullOpts.priority || 'normal',\n show: () => this.render(id, fullOpts),\n close: () => this.dismiss(id)\n });\n\n // Log to history\n historyManager.add({\n id,\n type: fullOpts.type || 'info',\n title: fullOpts.title,\n message: fullOpts.message\n });\n\n return id;\n }\n\n private processOptions(opts: AlertOptions): AlertOptions {\n return {\n type: 'info',\n duration: 6000,\n dismissible: true,\n position: 'top',\n align: 'center',\n animate: 'slide',\n priority: 'normal',\n maxStack: 5,\n progress: true,\n ...opts\n };\n }\n\n private render(id: string, opts: AlertOptions) {\n if (typeof document === 'undefined') return;\n\n // Create element\n const el = document.createElement('div');\n el.setAttribute('data-id', id);\n el.className = `vex-alert vex-${opts.type}`;\n setupAlertA11y(el, opts.priority || 'normal');\n \n // Icon\n const iconEl = document.createElement('div');\n iconEl.className = 'vx-icon';\n if (opts.type === 'loading') {\n iconEl.innerHTML = '<div class=\"vx-spinner\"></div>';\n } else {\n iconEl.innerHTML = this.getIcon(opts.type || 'info', opts.icon);\n }\n el.appendChild(iconEl);\n\n // Body\n const body = document.createElement('div');\n body.className = 'vx-body';\n \n if (opts.title) {\n const title = document.createElement('div');\n title.className = 'vx-title';\n title.textContent = opts.title;\n body.appendChild(title);\n }\n\n const msg = document.createElement('div');\n msg.className = 'vx-msg';\n msg.textContent = opts.message;\n body.appendChild(msg);\n\n // Actions\n if (opts.actions && opts.actions.length > 0) {\n const actionsEl = document.createElement('div');\n actionsEl.className = 'vx-actions';\n opts.actions.forEach(action => {\n const btn = document.createElement('button');\n btn.className = `vx-act-btn vx-${action.variant || 'default'}`;\n btn.textContent = action.label;\n btn.onclick = (e) => {\n e.stopPropagation();\n if (action.onClick) action.onClick(() => this.dismiss(id));\n else this.dismiss(id);\n };\n actionsEl.appendChild(btn);\n });\n body.appendChild(actionsEl);\n }\n el.appendChild(body);\n\n // Close button\n if (opts.dismissible) {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'vx-close';\n closeBtn.ariaLabel = 'Fechar';\n closeBtn.innerHTML = '✕';\n closeBtn.onclick = (e) => {\n e.stopPropagation();\n this.dismiss(id);\n };\n el.appendChild(closeBtn);\n }\n\n // Progress bar (duration)\n if (opts.progress && opts.duration && opts.duration > 0) {\n const prog = document.createElement('div');\n prog.className = 'vx-progress';\n prog.style.animationDuration = `${opts.duration}ms`;\n el.appendChild(prog);\n }\n \n // Upload progress placeholder\n if (opts.type === 'loading' && opts.icon === 'upload') {\n const upProg = document.createElement('div');\n upProg.className = 'vx-upload-bar';\n // hidden initially until updated\n el.appendChild(upProg);\n }\n\n // Theme overrides\n if (opts.theme) {\n Object.entries(opts.theme).forEach(([k, v]) => {\n if (v) el.style.setProperty(k, v);\n });\n }\n\n // Mount\n this.mount(el, opts);\n this.activeAlerts.set(id, { element: el, options: opts });\n\n // Auto dismiss\n if (opts.duration && opts.duration > 0) {\n setTimeout(() => this.dismiss(id), opts.duration);\n }\n }\n\n private mount(el: HTMLElement, opts: AlertOptions) {\n if (opts.renderer === 'inline' && opts.selector) {\n const container = typeof opts.selector === 'string' \n ? document.querySelector(opts.selector) \n : opts.selector;\n if (container instanceof HTMLElement) {\n // Remove previous if needed? Prompt: \"Alerts inline removem o anterior do mesmo container antes de inserir\"\n const existing = container.querySelector('.vex-alert');\n if (existing) existing.remove();\n container.appendChild(el);\n }\n } else if (opts.renderer === 'attach' && opts.selector) {\n const target = typeof opts.selector === 'string' \n ? document.querySelector(opts.selector) \n : opts.selector;\n \n if (target instanceof HTMLElement) {\n document.body.appendChild(el);\n this.positionAttached(el, target, opts.placement || 'top');\n // Handle resize?\n }\n } else {\n // Fixed\n const pos = opts.position || 'top';\n let container = document.getElementById(`vex-fixed-${pos}`);\n if (!container) {\n container = document.createElement('div');\n container.id = `vex-fixed-${pos}`;\n container.className = 'vex-fixed-container'; // For easier styling if needed\n // Inline styles for zero-config\n container.style.position = 'fixed';\n container.style.zIndex = '9000';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.gap = '10px';\n container.style.pointerEvents = 'none';\n container.style.width = '100%';\n container.style.maxWidth = '420px';\n container.style.left = '50%';\n container.style.transform = 'translateX(-50%)';\n \n if (pos === 'top') {\n container.style.top = '20px';\n } else {\n container.style.bottom = '20px';\n }\n document.body.appendChild(container);\n }\n \n el.style.pointerEvents = 'all';\n \n if (pos === 'top') {\n container.appendChild(el);\n } else {\n // For bottom, usually we want new items at the bottom pushing up, or at top of stack?\n // Standard toast behavior: append.\n container.appendChild(el);\n }\n }\n }\n \n private positionAttached(el: HTMLElement, target: HTMLElement, placement: string) {\n const rect = target.getBoundingClientRect();\n const elRect = el.getBoundingClientRect(); // Might be 0 if not rendered yet\n \n el.style.position = 'absolute';\n el.style.zIndex = '9000';\n el.style.width = 'max-content';\n el.style.maxWidth = '300px';\n \n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n \n // Simple positioning logic\n let top = 0;\n let left = 0;\n \n // We might need to wait for render to get el width/height\n // For now, approximate or assume loaded\n \n switch (placement) {\n case 'top':\n top = rect.top + scrollY - el.offsetHeight - 8;\n left = rect.left + scrollX + (rect.width - el.offsetWidth) / 2;\n break;\n case 'bottom':\n top = rect.bottom + scrollY + 8;\n left = rect.left + scrollX + (rect.width - el.offsetWidth) / 2;\n break;\n // ... others\n default: // auto/top\n top = rect.top + scrollY - 50; // approximate\n left = rect.left + scrollX;\n }\n \n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n }\n\n public dismiss(id: string) {\n const alert = this.activeAlerts.get(id);\n if (alert) {\n const { element, options } = alert;\n element.classList.add('removing');\n \n const onRemove = () => {\n if (element.parentNode) element.parentNode.removeChild(element);\n this.activeAlerts.delete(id);\n this.queue.remove(id);\n if (options.onClose) options.onClose();\n };\n\n element.addEventListener('animationend', onRemove);\n // Fallback\n setTimeout(() => {\n if (this.activeAlerts.has(id)) onRemove();\n }, 400);\n }\n }\n\n public dismissAll(filter?: { type?: string, position?: string }) {\n // Collect IDs first to avoid iteration issues\n const idsToRemove: string[] = [];\n this.activeAlerts.forEach((val, id) => {\n if (filter) {\n if (filter.type && val.options.type !== filter.type) return;\n if (filter.position && val.options.position !== filter.position) return;\n }\n idsToRemove.push(id);\n });\n idsToRemove.forEach(id => this.dismiss(id));\n }\n\n public update(id: string, opts: Partial<AlertOptions>) {\n const alert = this.activeAlerts.get(id);\n if (!alert) return;\n \n const { element, options } = alert;\n const newOpts = { ...options, ...opts };\n \n // Update classes\n if (opts.type && opts.type !== options.type) {\n element.classList.remove(`vex-${options.type}`);\n element.classList.add(`vex-${opts.type}`);\n \n const iconEl = element.querySelector('.vx-icon');\n if (iconEl) {\n if (opts.type === 'loading') {\n iconEl.innerHTML = '<div class=\"vx-spinner\"></div>';\n } else {\n iconEl.innerHTML = this.getIcon(opts.type, opts.icon);\n }\n }\n }\n \n if (opts.message) {\n const msgEl = element.querySelector('.vx-msg');\n if (msgEl) msgEl.textContent = opts.message;\n }\n \n if (opts.title) {\n let titleEl = element.querySelector('.vx-title');\n if (!titleEl) {\n titleEl = document.createElement('div');\n titleEl.className = 'vx-title';\n element.querySelector('.vx-body')?.prepend(titleEl);\n }\n if (titleEl) titleEl.textContent = opts.title;\n }\n \n this.activeAlerts.set(id, { element, options: newOpts });\n }\n \n public progress(id: string, value: number | { loaded: number, total: number }) {\n const alert = this.activeAlerts.get(id);\n if (!alert) return;\n \n let percent = 0;\n if (typeof value === 'number') percent = value;\n else if (value.total > 0) percent = (value.loaded / value.total) * 100;\n \n let prog = alert.element.querySelector('.vx-upload-prog') as HTMLElement;\n if (!prog) {\n const wrapper = document.createElement('div');\n wrapper.className = 'vx-upload-bar';\n // Style needs to be defined in CSS or here\n wrapper.style.height = '4px';\n wrapper.style.width = '100%';\n wrapper.style.backgroundColor = 'rgba(255,255,255,0.1)';\n wrapper.style.borderRadius = '2px';\n wrapper.style.marginTop = '8px';\n wrapper.style.overflow = 'hidden';\n \n prog = document.createElement('div');\n prog.className = 'vx-upload-prog';\n prog.style.height = '100%';\n prog.style.backgroundColor = 'var(--vex-info-accent, #6366f1)'; // Default color\n prog.style.transition = 'width 0.2s linear';\n \n wrapper.appendChild(prog);\n \n // Append to body or main element?\n // Prompt says \"barra de progresso de upload\".\n // Let's put it in body.\n const body = alert.element.querySelector('.vx-body');\n if (body) body.appendChild(wrapper);\n else alert.element.appendChild(wrapper);\n }\n prog.style.width = `${percent}%`;\n }\n\n private generateId(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return Math.random().toString(36).slice(2, 9);\n }\n\n private getIcon(type: string, custom?: string | null): string {\n if (custom) return custom;\n switch (type) {\n case 'success': return '✓';\n case 'error': return '✕';\n case 'warning': return '⚠';\n case 'info': return 'ℹ';\n case 'neutral': return '·';\n default: return '';\n }\n }\n}\n","import { setupModalA11y, trapFocus, saveFocus, restoreFocus } from './a11y';\nimport { themeManager } from './theme';\n\nexport interface ModalOptions {\n type?: 'danger' | 'warning' | 'info' | 'success';\n title?: string;\n message?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmDelay?: number; // ms\n closeOnBackdrop?: boolean;\n closeOnEscape?: boolean;\n width?: number;\n animate?: 'scale' | 'slide' | 'fade';\n showClose?: boolean;\n stackable?: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n \n // Internal/Custom\n content?: string | HTMLElement;\n footer?: boolean; // false to hide footer\n}\n\nexport interface FormField {\n name: string;\n label: string;\n type: 'text'|'email'|'password'|'number'|'textarea'|'select'|'radio'|'checkbox'|'date'|'file'|'range'|'color';\n options?: string[];\n required?: boolean;\n placeholder?: string;\n defaultValue?: any;\n validate?: (value: any) => string | null;\n}\n\nexport interface FormOptions extends ModalOptions {\n fields: FormField[];\n submitLabel?: string;\n validate?: (data: Record<string, any>) => Record<string, string> | null;\n}\n\ntype ConfirmCallback = () => boolean | Promise<boolean> | void;\n\nexport class ModalEngine {\n private activeModals: HTMLElement[] = [];\n \n public confirm(opts: ModalOptions): Promise<boolean> {\n return new Promise((resolve) => {\n this.create({\n type: 'warning',\n ...opts,\n confirmLabel: opts.confirmLabel || 'Confirmar',\n cancelLabel: opts.cancelLabel || 'Cancelar',\n }, () => resolve(true), () => resolve(false));\n });\n }\n\n public alert(opts: ModalOptions): Promise<void> {\n return new Promise((resolve) => {\n this.create({\n type: 'info',\n ...opts,\n confirmLabel: opts.confirmLabel || 'OK',\n cancelLabel: undefined,\n }, () => resolve(), () => resolve());\n });\n }\n\n public async form(opts: FormOptions): Promise<Record<string, any> | null> {\n return new Promise((resolve) => {\n const inputs: Record<string, HTMLElement> = {};\n \n const formContent = document.createElement('div');\n formContent.className = 'modal-form';\n \n opts.fields.forEach(field => {\n const grp = document.createElement('div');\n grp.className = 'form-grp';\n \n const lbl = document.createElement('label');\n lbl.className = 'form-lbl';\n lbl.textContent = field.label;\n grp.appendChild(lbl);\n \n let input: HTMLElement;\n \n if (field.type === 'select') {\n input = document.createElement('select');\n input.className = 'form-sel';\n // (input as HTMLSelectElement).required = !!field.required;\n if (field.options) {\n field.options.forEach(opt => {\n const op = document.createElement('option');\n op.value = opt;\n op.textContent = opt;\n (input as HTMLSelectElement).appendChild(op);\n });\n }\n if (field.defaultValue) (input as HTMLSelectElement).value = field.defaultValue;\n } else if (field.type === 'textarea') {\n input = document.createElement('textarea');\n input.className = 'form-tex';\n // (input as HTMLTextAreaElement).required = !!field.required;\n if (field.placeholder) (input as HTMLTextAreaElement).placeholder = field.placeholder;\n if (field.defaultValue) (input as HTMLTextAreaElement).value = field.defaultValue;\n } else if (field.type === 'radio') {\n // Special handling for radio group\n input = document.createElement('div');\n input.className = 'form-radio-grp';\n if (field.options) {\n field.options.forEach(opt => {\n const wrap = document.createElement('label');\n wrap.style.display = 'flex';\n wrap.style.gap = '6px';\n wrap.style.alignItems = 'center';\n \n const rad = document.createElement('input');\n rad.type = 'radio';\n rad.name = field.name;\n rad.value = opt;\n if (field.defaultValue === opt) rad.checked = true;\n \n wrap.appendChild(rad);\n wrap.appendChild(document.createTextNode(opt));\n input.appendChild(wrap);\n });\n }\n } else {\n input = document.createElement('input');\n input.className = 'form-inp';\n (input as HTMLInputElement).type = field.type;\n // (input as HTMLInputElement).required = !!field.required;\n if (field.placeholder) (input as HTMLInputElement).placeholder = field.placeholder;\n if (field.defaultValue) (input as HTMLInputElement).value = field.defaultValue;\n }\n \n inputs[field.name] = input;\n grp.appendChild(input);\n \n const err = document.createElement('div');\n err.className = 'form-err';\n err.style.color = 'var(--vex-error-text, #f87171)';\n err.style.fontSize = '11px';\n err.style.display = 'none';\n err.style.marginTop = '4px';\n grp.appendChild(err);\n \n formContent.appendChild(grp);\n });\n\n this.create({\n ...opts,\n content: formContent,\n confirmLabel: opts.submitLabel || 'Enviar',\n cancelLabel: opts.cancelLabel || 'Cancelar',\n }, () => {\n // Validate\n let isValid = true;\n const data: Record<string, any> = {};\n \n opts.fields.forEach(field => {\n const inputEl = inputs[field.name];\n let val: any;\n \n if (field.type === 'radio') {\n const checked = inputEl.querySelector('input:checked') as HTMLInputElement;\n val = checked ? checked.value : null;\n } else {\n val = (inputEl as HTMLInputElement).value;\n }\n \n data[field.name] = val;\n \n // Reset error\n const errEl = inputEl.parentElement?.querySelector('.form-err') as HTMLElement;\n if (errEl) errEl.style.display = 'none';\n\n let error = null;\n if (field.required && !val) error = 'Campo obrigatório';\n else if (field.validate) error = field.validate(val);\n \n if (error) {\n isValid = false;\n if (errEl) {\n errEl.textContent = error;\n errEl.style.display = 'block';\n }\n }\n });\n\n if (isValid && opts.validate) {\n const errors = opts.validate(data);\n if (errors) {\n isValid = false;\n Object.entries(errors).forEach(([key, msg]) => {\n const inputEl = inputs[key];\n const errEl = inputEl?.parentElement?.querySelector('.form-err') as HTMLElement;\n if (errEl) {\n errEl.textContent = msg;\n errEl.style.display = 'block';\n }\n });\n }\n }\n\n if (isValid) {\n resolve(data);\n return true; // Close\n }\n return false; // Keep open\n }, () => resolve(null));\n });\n }\n\n public async prompt(opts: ModalOptions & { defaultValue?: string, placeholder?: string, validate?: (v: string) => string | null }): Promise<string | null> {\n const { validate, ...restOpts } = opts;\n const data = await this.form({\n ...restOpts,\n fields: [{\n name: 'value',\n label: '',\n type: 'text',\n defaultValue: opts.defaultValue,\n placeholder: opts.placeholder,\n validate: validate,\n required: true\n }],\n submitLabel: opts.confirmLabel || 'OK',\n });\n return data ? data.value : null;\n }\n\n public preview(opts: ModalOptions & { src: string, meta?: string[], gallery?: string[] }) {\n const content = document.createElement('div');\n content.className = 'vx-preview-body';\n content.style.textAlign = 'center';\n \n const img = document.createElement('img');\n img.src = opts.src;\n img.style.maxWidth = '100%';\n img.style.maxHeight = '70vh';\n img.style.borderRadius = '8px';\n img.style.boxShadow = '0 8px 30px rgba(0,0,0,0.5)';\n content.appendChild(img);\n \n if (opts.meta) {\n const meta = document.createElement('div');\n meta.className = 'vx-meta';\n meta.textContent = opts.meta.join(' · ');\n meta.style.marginTop = '16px';\n meta.style.color = 'var(--vex-text-muted, rgba(255,255,255,0.6))';\n meta.style.fontSize = '13px';\n content.appendChild(meta);\n }\n \n // Gallery thumbs?\n if (opts.gallery) {\n const gal = document.createElement('div');\n gal.className = 'vx-gallery';\n gal.style.display = 'flex';\n gal.style.gap = '8px';\n gal.style.justifyContent = 'center';\n gal.style.marginTop = '16px';\n \n opts.gallery.forEach(src => {\n const thumb = document.createElement('img');\n thumb.src = src;\n thumb.style.width = '48px';\n thumb.style.height = '48px';\n thumb.style.objectFit = 'cover';\n thumb.style.borderRadius = '6px';\n thumb.style.cursor = 'pointer';\n thumb.style.opacity = src === opts.src ? '1' : '0.5';\n thumb.style.border = src === opts.src ? '2px solid var(--vex-primary, #6366f1)' : '2px solid transparent';\n thumb.onclick = () => {\n img.src = src;\n // Update active state\n Array.from(gal.children).forEach((c: any) => {\n c.style.opacity = '0.5';\n c.style.border = '2px solid transparent';\n });\n thumb.style.opacity = '1';\n thumb.style.border = '2px solid var(--vex-primary, #6366f1)';\n };\n gal.appendChild(thumb);\n });\n content.appendChild(gal);\n }\n \n this.create({\n ...opts,\n content: content,\n width: opts.width || 800,\n footer: false\n });\n }\n\n public custom(opts: ModalOptions): { close: () => void } {\n return this.create(opts);\n }\n\n // --- Core Implementation ---\n\n private create(opts: ModalOptions, onConfirm?: ConfirmCallback, onCancel?: ConfirmCallback): { close: () => void } {\n if (typeof document === 'undefined') return { close: () => {} };\n\n saveFocus();\n\n const backdrop = document.createElement('div');\n backdrop.className = 'vex-backdrop';\n const titleId = `vex-modal-title-${Math.random().toString(36).slice(2)}`;\n const descId = `vex-modal-desc-${Math.random().toString(36).slice(2)}`;\n setupModalA11y(backdrop, titleId, descId);\n\n const modal = document.createElement('div');\n modal.className = 'vex-modal';\n if (opts.width) modal.style.maxWidth = `${opts.width}px`;\n if (opts.animate) modal.classList.add(`vex-anim-${opts.animate}`);\n \n // Header\n const hdr = document.createElement('div');\n hdr.className = 'modal-hdr';\n hdr.appendChild(document.createElement('div')); // spacer\n \n if (opts.showClose !== false) {\n const closeBtn = document.createElement('button');\n closeBtn.className = 'modal-x';\n closeBtn.ariaLabel = 'Fechar';\n closeBtn.innerHTML = '✕';\n closeBtn.onclick = () => {\n if (onCancel) onCancel();\n this.close(backdrop);\n };\n hdr.appendChild(closeBtn);\n }\n modal.appendChild(hdr);\n\n // Body\n const body = document.createElement('div');\n body.className = 'modal-bdy';\n \n if (opts.type) {\n const icon = document.createElement('div');\n icon.className = `modal-icon ${opts.type}`;\n icon.innerHTML = this.getIcon(opts.type);\n body.appendChild(icon);\n }\n\n if (opts.title) {\n const title = document.createElement('div');\n title.id = titleId;\n title.className = 'modal-title';\n title.textContent = opts.title;\n body.appendChild(title);\n }\n\n if (opts.message) {\n const desc = document.createElement('div');\n desc.id = descId;\n desc.className = 'modal-desc';\n desc.textContent = opts.message;\n body.appendChild(desc);\n }\n \n if (opts.content) {\n const customContent = document.createElement('div');\n customContent.className = 'modal-custom';\n if (typeof opts.content === 'string') customContent.innerHTML = opts.content;\n else customContent.appendChild(opts.content);\n body.appendChild(customContent);\n }\n\n modal.appendChild(body);\n\n // Footer\n if (opts.footer !== false && (opts.confirmLabel || opts.cancelLabel)) {\n const ftr = document.createElement('div');\n ftr.className = 'modal-ftr';\n \n if (opts.cancelLabel) {\n const cancelBtn = document.createElement('button');\n cancelBtn.className = 'modal-btn cancel';\n cancelBtn.textContent = opts.cancelLabel;\n cancelBtn.onclick = () => {\n if (onCancel) onCancel();\n this.close(backdrop);\n };\n ftr.appendChild(cancelBtn);\n }\n \n if (opts.confirmLabel) {\n const confirmBtn = document.createElement('button');\n confirmBtn.className = `modal-btn ${opts.type || 'primary'}`;\n confirmBtn.textContent = opts.confirmLabel;\n \n if (opts.confirmDelay && opts.confirmDelay > 0) {\n confirmBtn.disabled = true;\n let remaining = Math.ceil(opts.confirmDelay / 1000);\n const originalLabel = opts.confirmLabel;\n confirmBtn.textContent = `${originalLabel} (${remaining})`;\n \n const interval = setInterval(() => {\n remaining--;\n if (remaining <= 0) {\n clearInterval(interval);\n confirmBtn.disabled = false;\n confirmBtn.textContent = originalLabel;\n } else {\n confirmBtn.textContent = `${originalLabel} (${remaining})`;\n }\n }, 1000);\n \n // Cleanup interval on close\n (backdrop as any)._interval = interval;\n }\n\n confirmBtn.onclick = async () => {\n if (onConfirm) {\n const shouldClose = await onConfirm();\n if (shouldClose !== false) this.close(backdrop);\n } else {\n this.close(backdrop);\n }\n };\n ftr.appendChild(confirmBtn);\n }\n modal.appendChild(ftr);\n }\n\n backdrop.appendChild(modal);\n document.body.appendChild(backdrop);\n this.activeModals.push(backdrop);\n\n // Events\n if (opts.closeOnBackdrop !== false) {\n backdrop.onclick = (e) => {\n if (e.target === backdrop) {\n if (onCancel) onCancel();\n this.close(backdrop);\n }\n };\n }\n \n const escHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && opts.closeOnEscape !== false) {\n if (this.activeModals[this.activeModals.length - 1] === backdrop) {\n if (onCancel) onCancel();\n this.close(backdrop);\n }\n }\n if (e.key === 'Tab') {\n trapFocus(backdrop, e);\n }\n };\n document.addEventListener('keydown', escHandler);\n \n (backdrop as any)._cleanup = () => {\n document.removeEventListener('keydown', escHandler);\n if ((backdrop as any)._interval) clearInterval((backdrop as any)._interval);\n };\n\n if (opts.onOpen) opts.onOpen();\n\n return {\n close: () => this.close(backdrop, onCancel)\n };\n }\n\n private close(backdrop: HTMLElement, callback?: () => void) {\n if (backdrop.classList.contains('closing')) return; // Already closing\n \n backdrop.classList.add('closing');\n const modal = backdrop.querySelector('.vex-modal');\n if (modal) modal.classList.add('closing');\n \n const onRemove = () => {\n if ((backdrop as any)._cleanup) (backdrop as any)._cleanup();\n if (backdrop.parentNode) backdrop.parentNode.removeChild(backdrop);\n this.activeModals = this.activeModals.filter(m => m !== backdrop);\n restoreFocus();\n // Only call callback if it wasn't called by the trigger action (handled by caller mostly, but for forced close)\n // Actually onCancel/onConfirm are handled before close.\n // options.onClose is what we want here.\n // I didn't pass options.onClose to create.\n // For now, minimal.\n };\n\n backdrop.addEventListener('animationend', onRemove);\n // Fallback\n setTimeout(() => {\n if (document.body.contains(backdrop)) onRemove();\n }, 300);\n }\n\n private getIcon(type: string): string {\n switch (type) {\n case 'danger': return '✕';\n case 'warning': return '!';\n case 'success': return '✓';\n case 'info': return 'i';\n default: return '';\n }\n }\n}\n","import { trapFocus, saveFocus, restoreFocus } from './a11y';\n\nexport interface DrawerAction {\n label: string;\n variant?: 'primary' | 'danger' | 'default';\n onClick?: (close: () => void) => void;\n}\n\nexport interface DrawerOptions {\n title?: string;\n position: 'right' | 'left' | 'top' | 'bottom';\n width?: number; // for right/left\n height?: number; // for top/bottom\n content: string | HTMLElement;\n persistent?: boolean; // false = fecha ao clicar fora\n footer?: DrawerAction[];\n onClose?: () => void;\n // Internal\n className?: string;\n}\n\nexport function drawer(opts: DrawerOptions): { close: () => void } {\n if (typeof document === 'undefined') return { close: () => {} };\n\n saveFocus();\n\n const panel = document.createElement('div');\n panel.className = `vex-drawer vex-drawer-${opts.position}`;\n if (opts.className) panel.classList.add(opts.className);\n \n // Size\n if (opts.width && (opts.position === 'left' || opts.position === 'right')) {\n panel.style.width = `${opts.width}px`;\n }\n if (opts.height && (opts.position === 'top' || opts.position === 'bottom')) {\n panel.style.height = `${opts.height}px`;\n }\n \n // Structure\n const hdr = document.createElement('div');\n hdr.className = 'drawer-hdr';\n if (opts.title) {\n const title = document.createElement('div');\n title.className = 'drawer-title';\n title.textContent = opts.title;\n hdr.appendChild(title);\n }\n \n const closeBtn = document.createElement('button');\n closeBtn.className = 'drawer-close';\n closeBtn.innerHTML = '✕';\n closeBtn.onclick = () => close();\n hdr.appendChild(closeBtn);\n panel.appendChild(hdr);\n \n const body = document.createElement('div');\n body.className = 'drawer-body';\n \n let originalParent: ParentNode | null = null;\n let nextSibling: Node | null = null;\n let contentEl: HTMLElement | null = null;\n\n if (typeof opts.content === 'string') {\n // Check if it's a selector\n if (opts.content.startsWith('#') || opts.content.startsWith('.')) {\n const el = document.querySelector(opts.content) as HTMLElement;\n if (el) {\n contentEl = el;\n originalParent = el.parentNode;\n nextSibling = el.nextSibling;\n body.appendChild(el); \n // Ensure it's visible if it was hidden\n el.style.display = 'block';\n } else {\n body.innerHTML = opts.content;\n }\n } else {\n body.innerHTML = opts.content;\n }\n } else {\n contentEl = opts.content;\n originalParent = opts.content.parentNode;\n nextSibling = opts.content.nextSibling;\n body.appendChild(opts.content);\n opts.content.style.display = 'block';\n }\n panel.appendChild(body);\n \n if (opts.footer && opts.footer.length > 0) {\n const ftr = document.createElement('div');\n ftr.className = 'drawer-ftr';\n opts.footer.forEach(action => {\n const btn = document.createElement('button');\n btn.className = `drawer-btn ${action.variant || 'default'}`;\n btn.textContent = action.label;\n btn.onclick = () => {\n if (action.onClick) action.onClick(() => close());\n else close();\n };\n ftr.appendChild(btn);\n });\n panel.appendChild(ftr);\n }\n \n document.body.appendChild(panel);\n \n // Animate in\n requestAnimationFrame(() => {\n panel.classList.add('open');\n });\n \n const close = () => {\n panel.classList.remove('open');\n panel.addEventListener('transitionend', () => {\n if (contentEl && originalParent) {\n // Restore content to original place\n contentEl.style.display = ''; // Reset display\n originalParent.insertBefore(contentEl, nextSibling);\n }\n \n if (panel.parentNode) panel.parentNode.removeChild(panel);\n restoreFocus();\n if (opts.onClose) opts.onClose();\n }, { once: true });\n \n document.removeEventListener('click', outsideClickHandler);\n };\n \n const outsideClickHandler = (e: MouseEvent) => {\n if (opts.persistent) return;\n // If click is not inside panel and panel is open\n if (panel.classList.contains('open') && !panel.contains(e.target as Node)) {\n close();\n }\n };\n \n setTimeout(() => {\n document.addEventListener('click', outsideClickHandler);\n }, 100);\n \n return { close };\n}\n","import { ModalEngine, FormField } from './modal';\n\nexport interface FlowStep {\n title: string;\n type?: 'info' | 'success' | 'warning' | 'danger';\n description?: string;\n fields?: FormField[];\n condition?: (accumulatedData: Record<string, any>) => boolean;\n beforeNext?: (stepData: Record<string, any>) => Promise<Record<string, string> | null>;\n}\n\nexport async function flow(steps: FlowStep[]): Promise<Record<string, any> | null> {\n const modalEngine = new ModalEngine();\n \n return new Promise((resolve) => {\n let currentStepIndex = 0;\n const data: Record<string, any> = {};\n let modalInstance: { close: () => void } | null = null;\n let modalEl: HTMLElement | null = null;\n\n // Find first valid step\n const findNextValidStep = (start: number): number => {\n let idx = start;\n while (idx < steps.length) {\n const step = steps[idx];\n if (!step.condition || step.condition!(data)) {\n return idx;\n }\n idx++;\n }\n return -1; // End\n };\n \n currentStepIndex = findNextValidStep(0);\n if (currentStepIndex === -1) {\n resolve(data);\n return;\n }\n\n const container = document.createElement('div');\n container.className = 'vex-flow-container';\n \n const renderStep = () => {\n container.innerHTML = '';\n const step = steps[currentStepIndex];\n \n // Update Modal Title if possible\n if (modalEl) {\n const titleEl = modalEl.querySelector('.modal-title');\n if (titleEl) titleEl.textContent = step.title;\n \n // Update Icon if type changes\n const iconEl = modalEl.querySelector('.modal-icon');\n if (iconEl && step.type) {\n iconEl.className = `modal-icon ${step.type}`;\n // We need to update icon content too. \n // This implies we need getIcon logic here or duplication.\n // For simplicity, let's just update class and assume icon content is generic enough or update it manually.\n const icons: Record<string, string> = {\n 'danger': '✕', 'warning': '!', 'success': '✓', 'info': 'i'\n };\n iconEl.innerHTML = icons[step.type] || 'i';\n }\n }\n\n // 1. Steps Bar\n const bar = document.createElement('div');\n bar.className = 'modal-steps';\n \n steps.forEach((s, i) => {\n // Only show if condition matches or if it's past/current?\n // Usually wizards show all steps or at least known ones.\n // If condition depends on future data, we might not know.\n // Let's just show all steps, maybe dim conditional ones?\n // Or just show 1, 2, 3...\n \n const dot = document.createElement('div');\n dot.className = 'step-dot';\n if (i < currentStepIndex) dot.classList.add('done');\n if (i === currentStepIndex) dot.classList.add('active');\n \n const circle = document.createElement('div');\n circle.className = 'step-circle';\n circle.textContent = (i + 1).toString();\n if (i < currentStepIndex) circle.textContent = '✓';\n \n const name = document.createElement('div');\n name.className = 'step-name';\n name.textContent = s.title; // Short title?\n \n dot.appendChild(circle);\n dot.appendChild(name);\n bar.appendChild(dot);\n });\n container.appendChild(bar);\n \n // 2. Content\n const content = document.createElement('div');\n content.className = 'flow-content';\n \n if (step.description) {\n const desc = document.createElement('div');\n desc.className = 'modal-desc';\n desc.textContent = step.description;\n desc.style.marginBottom = '16px';\n content.appendChild(desc);\n }\n \n const inputs: Record<string, HTMLElement> = {};\n \n if (step.fields) {\n step.fields.forEach(field => {\n const grp = document.createElement('div');\n grp.className = 'form-grp';\n \n const lbl = document.createElement('label');\n lbl.className = 'form-lbl';\n lbl.textContent = field.label;\n grp.appendChild(lbl);\n \n let input: HTMLElement;\n // Simplified field creation (duplicated from modal.ts, ideally shared)\n if (field.type === 'select') {\n input = document.createElement('select');\n input.className = 'form-sel';\n if (field.options) {\n field.options.forEach(opt => {\n const op = document.createElement('option');\n op.value = opt;\n op.textContent = opt;\n (input as HTMLSelectElement).appendChild(op);\n });\n }\n if (data[field.name]) (input as HTMLSelectElement).value = data[field.name];\n } else {\n input = document.createElement('input');\n input.className = 'form-inp';\n (input as HTMLInputElement).type = field.type;\n if (data[field.name]) (input as HTMLInputElement).value = data[field.name];\n }\n \n inputs[field.name] = input;\n grp.appendChild(input);\n \n const err = document.createElement('div');\n err.className = 'form-err';\n err.style.color = 'var(--vex-error-text, #f87171)';\n err.style.fontSize = '11px';\n err.style.display = 'none';\n grp.appendChild(err);\n \n content.appendChild(grp);\n });\n }\n container.appendChild(content);\n \n // 3. Footer (Custom)\n const ftr = document.createElement('div');\n ftr.className = 'flow-btns';\n ftr.style.marginTop = '24px';\n ftr.style.display = 'flex';\n ftr.style.justifyContent = 'flex-end';\n ftr.style.gap = '10px';\n \n if (currentStepIndex > 0) {\n const backBtn = document.createElement('button');\n backBtn.className = 'modal-btn cancel';\n backBtn.textContent = '← Voltar';\n backBtn.onclick = () => {\n // Find prev valid step\n let prev = currentStepIndex - 1;\n while (prev >= 0) {\n const prevStep = steps[prev];\n if (!prevStep.condition || prevStep.condition!(data)) break;\n prev--;\n }\n if (prev >= 0) {\n currentStepIndex = prev;\n renderStep();\n }\n };\n ftr.appendChild(backBtn);\n }\n \n const nextBtn = document.createElement('button');\n nextBtn.className = 'modal-btn primary';\n const isLast = findNextValidStep(currentStepIndex + 1) === -1;\n nextBtn.textContent = isLast ? 'Concluir' : 'Próximo →';\n \n nextBtn.onclick = async () => {\n // Collect data\n const stepData: Record<string, any> = {};\n let isValid = true;\n \n if (step.fields) {\n step.fields.forEach(field => {\n const val = (inputs[field.name] as HTMLInputElement).value;\n stepData[field.name] = val;\n data[field.name] = val; // Update global data\n \n if (field.required && !val) {\n isValid = false;\n // Show error...\n }\n });\n }\n \n if (!isValid) return; // Show errors\n \n if (step.beforeNext) {\n nextBtn.disabled = true;\n nextBtn.textContent = 'Aguarde...';\n const errors = await step.beforeNext!(stepData);\n nextBtn.disabled = false;\n nextBtn.textContent = isLast ? 'Concluir' : 'Próximo →';\n \n if (errors) {\n Object.keys(errors).forEach(key => {\n const input = inputs[key];\n if (input && input.nextElementSibling) {\n const err = input.nextElementSibling as HTMLElement;\n err.textContent = errors[key];\n err.style.display = 'block';\n }\n });\n return;\n }\n }\n \n const next = findNextValidStep(currentStepIndex + 1);\n if (next !== -1) {\n currentStepIndex = next;\n renderStep();\n } else {\n // Finish\n if (modalInstance) modalInstance.close();\n resolve(data);\n }\n };\n \n ftr.appendChild(nextBtn);\n container.appendChild(ftr);\n };\n\n // Initialize modal\n const step = steps[currentStepIndex];\n modalInstance = modalEngine.custom({\n title: step.title,\n type: step.type || 'info',\n content: container,\n footer: false,\n width: 600,\n onClose: () => {\n // If closed by user (X or backdrop), resolve null\n // But if closed by code (finish), we already resolved.\n // We can check if resolved? No easy way.\n // We can assume if we didn't resolve data, it's a cancel.\n // For now, simple resolve null.\n // (If logic finished, resolve was called, this secondary resolve(null) is ignored by Promise)\n resolve(null);\n }\n });\n \n // Get element\n setTimeout(() => {\n modalEl = document.querySelector('.vex-modal:last-child') as HTMLElement;\n renderStep();\n }, 0);\n });\n}\n","/**\n * VexUI Theme Manager\n *\n * Handles CSS variables, theme switching (dark/light/auto), and reduced motion.\n */\n\nexport type ThemeMode = 'dark' | 'light' | 'auto';\n\nexport interface ThemeTokens {\n [key: string]: string;\n}\n\nexport class ThemeManager {\n private currentTheme: ThemeMode = 'auto';\n private mediaQuery: MediaQueryList | null = null;\n\n constructor() {\n if (typeof window !== 'undefined') {\n this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n this.init();\n }\n }\n\n private init() {\n this.mediaQuery?.addEventListener('change', () => {\n if (this.currentTheme === 'auto') {\n this.applyTheme();\n }\n });\n }\n\n public setTheme(theme: ThemeMode) {\n this.currentTheme = theme;\n this.applyTheme();\n }\n\n public getTheme(): ThemeMode {\n return this.currentTheme;\n }\n\n private applyTheme() {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n const isDark = this.currentTheme === 'dark' || (this.currentTheme === 'auto' && this.mediaQuery?.matches);\n\n // We toggle a class on html element to allow CSS overrides\n if (isDark) {\n root.classList.add('vex-dark');\n root.classList.remove('vex-light');\n } else {\n root.classList.add('vex-light');\n root.classList.remove('vex-dark');\n }\n \n // Also set data-theme attribute for easier styling\n root.setAttribute('data-vex-theme', isDark ? 'dark' : 'light');\n }\n\n public setTokens(tokens: ThemeTokens) {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n Object.entries(tokens).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n });\n }\n \n public isReducedMotion(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n}\n\nexport const themeManager = new ThemeManager();\n","import { AlertEngine, AlertOptions } from './core/alert';\r\nimport { ModalEngine, ModalOptions, FormOptions } from './core/modal';\r\nimport { drawer, DrawerOptions } from './core/drawer';\r\nimport { flow, FlowStep } from './core/flow';\r\nimport { historyManager } from './core/history';\r\nimport { themeManager } from './core/theme';\r\n\r\n// Instantiate singletons\r\nexport const alert = new AlertEngine();\r\nexport const modal = new ModalEngine();\r\nexport const history = historyManager;\r\n\r\n// Export types\r\nexport type { AlertOptions, ModalOptions, FormOptions, DrawerOptions, FlowStep };\r\n\r\n// Export standalone functions\r\nexport { drawer, flow };\r\n\r\nexport interface VexConfig {\r\n duration?: number;\r\n position?: 'top' | 'bottom';\r\n maxStack?: number;\r\n theme?: 'dark' | 'light' | 'auto';\r\n // ...\r\n}\r\n\r\n// Global configuration\r\nexport function configure(opts: VexConfig) {\r\n if (opts.theme) themeManager.setTheme(opts.theme);\r\n // Pass config to alert engine if needed\r\n // alert.configure(opts);\r\n}\r\n\r\nexport function setTheme(theme: 'dark' | 'light' | 'auto') {\r\n themeManager.setTheme(theme);\r\n}\r\n\r\nexport function dismiss(id: string) {\r\n alert.dismiss(id);\r\n}\r\n\r\nexport function dismissAll(filter?: { type?: string, position?: string }) {\r\n alert.dismissAll(filter);\r\n}\r\n\r\nexport function update(id: string, opts: Partial<AlertOptions>) {\r\n alert.update(id, opts);\r\n}\r\n\r\nexport function progress(id: string, value: number | { loaded: number, total: number }) {\r\n alert.progress(id, value);\r\n}\r\n\r\n// Default export object\r\nconst vex = {\r\n alert,\r\n modal,\r\n drawer,\r\n flow,\r\n history,\r\n configure,\r\n setTheme,\r\n dismiss,\r\n dismissAll,\r\n update,\r\n progress,\r\n // Helper for inline prompts\r\n prompt: {\r\n inline: async (selector: string | HTMLElement, opts: any) => {\r\n // Implementation of inline prompt\r\n // \"Substitui um elemento de texto por um input diretamente no DOM\"\r\n // This is a \"power feature\".\r\n // I'll implement a basic version here or in a separate file if needed.\r\n // Given \"Phase 2\" includes \"index.ts\", I can add it here.\r\n \r\n const el = typeof selector === 'string' ? document.querySelector(selector) : selector;\r\n if (!el) return null;\r\n \r\n const originalText = el.textContent;\r\n const originalDisplay = (el as HTMLElement).style.display;\r\n \r\n const input = document.createElement('input');\r\n input.type = 'text';\r\n input.value = originalText || '';\r\n input.placeholder = opts.placeholder || '';\r\n input.className = 'vex-inline-prompt';\r\n // Style to match element?\r\n input.style.fontSize = getComputedStyle(el as Element).fontSize;\r\n input.style.fontFamily = getComputedStyle(el as Element).fontFamily;\r\n input.style.border = '1px solid var(--vex-primary, #6366f1)';\r\n input.style.borderRadius = '4px';\r\n input.style.padding = '2px 4px';\r\n input.style.background = 'var(--vex-bg, #000)';\r\n input.style.color = 'var(--vex-text, #fff)';\r\n \r\n (el as HTMLElement).style.display = 'none';\r\n el.parentNode?.insertBefore(input, el);\r\n input.focus();\r\n \r\n return new Promise((resolve) => {\r\n const finish = (val: string | null) => {\r\n if (val !== null && opts.validate) {\r\n const err = opts.validate(val);\r\n if (err) {\r\n // Show error tooltip?\r\n input.style.borderColor = 'red';\r\n return; \r\n }\r\n }\r\n \r\n input.remove();\r\n (el as HTMLElement).style.display = originalDisplay;\r\n if (val !== null) (el as HTMLElement).textContent = val;\r\n resolve(val);\r\n };\r\n \r\n input.onblur = () => finish(input.value); // Confirm on blur? Or cancel? Usually confirm.\r\n input.onkeydown = (e) => {\r\n if (e.key === 'Enter') finish(input.value);\r\n if (e.key === 'Escape') finish(null);\r\n };\r\n });\r\n }\r\n }\r\n};\r\n\r\nexport default vex;\r\n"],"mappings":"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","names":["onUnmounted","AlertQueue","max","item","victimIndex","id","index","next","a","b","p","HistoryManager","entry","fullEntry","id","e","anchorSelector","anchor","existing","dropdown","rect","list","closeHandler","stored","key","value","historyManager","getFocusableElements","container","el","trapFocus","event","focusable","first","last","previousFocus","saveFocus","restoreFocus","setupAlertA11y","element","priority","liveMode","setupModalA11y","titleId","descId","AlertEngine","AlertQueue","message","opts","selector","id","fullOpts","historyManager","el","setupAlertA11y","iconEl","body","title","msg","actionsEl","action","btn","e","closeBtn","prog","upProg","k","v","container","existing","target","pos","placement","rect","elRect","scrollX","scrollY","top","left","alert","element","options","onRemove","filter","idsToRemove","val","newOpts","msgEl","titleEl","value","percent","wrapper","type","custom","ModalEngine","opts","resolve","inputs","formContent","field","grp","lbl","input","opt","op","wrap","rad","err","isValid","data","inputEl","val","checked","errEl","error","errors","key","msg","validate","restOpts","content","img","meta","gal","src","thumb","c","onConfirm","onCancel","saveFocus","backdrop","titleId","descId","setupModalA11y","modal","hdr","closeBtn","body","icon","title","desc","customContent","ftr","cancelBtn","confirmBtn","remaining","originalLabel","interval","e","escHandler","trapFocus","callback","onRemove","m","restoreFocus","type","drawer","opts","saveFocus","panel","hdr","title","closeBtn","close","body","originalParent","nextSibling","contentEl","el","ftr","action","btn","restoreFocus","outsideClickHandler","e","flow","steps","modalEngine","ModalEngine","resolve","currentStepIndex","data","modalInstance","modalEl","findNextValidStep","start","idx","step","container","renderStep","titleEl","iconEl","icons","bar","s","i","dot","circle","name","content","desc","inputs","field","grp","lbl","input","opt","op","err","ftr","backBtn","prev","prevStep","nextBtn","isLast","stepData","isValid","val","errors","key","next","ThemeManager","theme","root","isDark","tokens","key","value","themeManager","alert","AlertEngine","modal","ModalEngine","history","historyManager","configure","opts","themeManager","setTheme","theme","dismiss","id","alert","dismissAll","filter","update","progress","value","vex","modal","drawer","flow","history","selector","el","originalText","originalDisplay","input","resolve","finish","val","e","src_default","VexUI","app","src_default","useVex","ids","wrappedAlert","msg","opts","id","selector","onUnmounted"]}