// Form component utilities and Alpine.js data export function formComponentsData() { return { // Modal states showAlertModal: false, showConfirmModal: false, showContentModal: false, // Toast notification state toasts: [], // Handle confirm modal action handleConfirm() { this.showConfirmModal = false; this.showToast('success', 'Action confirmed!'); }, // Show toast notification showToast(type = 'success', message = null) { const messages = { success: 'Operation completed successfully!', error: 'An error occurred. Please try again.', info: 'Here is some information.', warning: 'Please be careful with this action.' }; const toastMessage = message || messages[type] || messages.success; const toastId = Date.now(); // Add toast to list this.toasts.push({ id: toastId, type: type, message: toastMessage }); // Auto-remove after 5 seconds setTimeout(() => { this.toasts = this.toasts.filter(t => t.id !== toastId); }, 5000); }, // Remove toast manually removeToast(id) { this.toasts = this.toasts.filter(t => t.id !== id); }, // Form validation utilities validateEmail(email) { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return regex.test(email); }, validatePassword(password) { return password.length >= 8; }, // Auto-expand textarea autoExpandTextarea(event) { const textarea = event.target; textarea.style.height = 'auto'; textarea.style.height = (textarea.scrollHeight) + 'px'; } }; } // Toast container component for Alpine.js export function renderToastContainer(Alpine) { if (!Alpine) return; // This can be used in templates via Alpine window.formUtils = { formatCharCount(current, max) { if (max) { return `${current}/${max}`; } return current; }, isCharCountWarning(current, max) { if (!max) return false; return current > (max * 0.8); }, isCharCountError(current, max) { if (!max) return false; return current >= max; } }; }