@triagly/sdk 1.3.0 → 1.4.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/ui.ts","../src/api.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["// Feedback Widget UI\n\nimport { TriaglyConfig } from './types';\n\nexport class FeedbackWidget {\n private config: TriaglyConfig;\n private container: HTMLElement | null = null;\n private isOpen: boolean = false;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusableElements: HTMLElement[] = [];\n\n constructor(config: TriaglyConfig) {\n this.config = config;\n }\n\n /**\n * Initialize the widget\n */\n init(): void {\n this.createButton();\n this.injectStyles();\n // Load Turnstile script if configured\n if (this.config.turnstileSiteKey) {\n this.loadTurnstileScript();\n }\n }\n\n /**\n * Load Cloudflare Turnstile script dynamically\n */\n private loadTurnstileScript(): void {\n // Check if already loaded\n if ((window as any).turnstile || document.querySelector('script[src*=\"turnstile\"]')) {\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n document.head.appendChild(script);\n }\n\n /**\n * Create the feedback button\n */\n private createButton(): void {\n const button = document.createElement('button');\n button.id = 'triagly-button';\n button.className = 'triagly-button';\n \n // Button shape\n const shape = this.config.buttonShape || 'rounded';\n button.classList.add(`triagly-shape-${shape}`);\n \n // Button orientation\n const orientation = this.config.orientation || 'horizontal';\n button.classList.add(`triagly-orientation-${orientation}`);\n \n // Speech bubble SVG icon\n const speechBubbleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"triagly-icon\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"/></svg>`;\n const largeIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"triagly-icon\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"/></svg>`;\n\n // Handle button text based on shape\n const fullText = this.config.buttonText || 'Feedback';\n if (shape === 'circular') {\n button.innerHTML = largeIcon;\n button.setAttribute('aria-label', fullText);\n } else if (shape === 'expandable') {\n // Expandable starts with icon, expands to full text on hover\n button.innerHTML = `<span class=\"triagly-btn-icon\">${largeIcon}</span><span class=\"triagly-btn-text\"> ${this.config.buttonText || 'Feedback'}</span>`;\n button.setAttribute('aria-label', fullText);\n } else {\n // Default: icon + text\n button.innerHTML = `${speechBubbleIcon}<span class=\"triagly-btn-label\">${fullText}</span>`;\n }\n \n button.onclick = () => this.toggle();\n\n // Position button\n const position = this.config.position || 'bottom-right';\n button.classList.add(`triagly-${position}`);\n\n // For expandable buttons, set expansion direction based on position\n if (shape === 'expandable') {\n if (position.includes('right')) {\n button.classList.add('triagly-expand-left');\n } else if (position.includes('left')) {\n button.classList.add('triagly-expand-right');\n }\n }\n\n // Apply custom offsets if provided\n if (this.config.offsetX) {\n if (position.includes('right')) {\n button.style.right = this.config.offsetX;\n } else if (position.includes('left')) {\n button.style.left = this.config.offsetX;\n }\n }\n if (this.config.offsetY) {\n if (position.includes('top')) {\n button.style.top = this.config.offsetY;\n } else if (position.includes('bottom')) {\n button.style.bottom = this.config.offsetY;\n }\n }\n\n document.body.appendChild(button);\n }\n\n /**\n * Toggle widget visibility\n */\n toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Open the widget\n */\n open(): void {\n if (this.isOpen) return;\n\n // Store currently focused element to restore later\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n this.container = this.createContainer();\n document.body.appendChild(this.container);\n this.isOpen = true;\n\n // Call onOpen callback\n if (this.config.onOpen) {\n this.config.onOpen();\n }\n\n // Set up keyboard and focus after DOM is ready\n setTimeout(() => {\n // Set up keyboard event listener\n this.setupKeyboardEvents();\n\n // Set up focus trap\n this.setupFocusTrap();\n\n // Focus on description field\n const descInput = this.container?.querySelector('#triagly-description') as HTMLTextAreaElement;\n descInput?.focus();\n }, 0);\n }\n\n /**\n * Close the widget\n */\n close(reason?: 'cancel' | 'dismiss' | 'overlay' | 'programmatic'): void {\n if (!this.isOpen || !this.container) return;\n\n // Clean up tab handler (must match capture phase used when adding)\n const tabHandler = (this.container as any)._tabHandler;\n if (tabHandler) {\n document.removeEventListener('keydown', tabHandler, true);\n }\n\n this.container.remove();\n this.container = null;\n this.isOpen = false;\n\n // Restore focus to previously focused element\n if (this.previouslyFocusedElement) {\n this.previouslyFocusedElement.focus();\n this.previouslyFocusedElement = null;\n }\n\n // Call specific callbacks based on reason\n if (reason === 'cancel' && this.config.onCancel) {\n this.config.onCancel();\n } else if (reason === 'dismiss' && this.config.onDismiss) {\n this.config.onDismiss();\n } else if (reason === 'overlay' && this.config.onOverlayClick) {\n this.config.onOverlayClick();\n }\n\n // Always call general onClose callback (backward compatible)\n if (this.config.onClose) {\n this.config.onClose();\n }\n }\n\n /**\n * Create the widget container\n */\n private createContainer(): HTMLElement {\n const overlay = document.createElement('div');\n overlay.className = 'triagly-overlay';\n overlay.setAttribute('role', 'dialog');\n overlay.setAttribute('aria-modal', 'true');\n overlay.setAttribute('aria-label', 'Send feedback');\n overlay.onclick = (e) => {\n if (e.target === overlay) this.close('overlay');\n };\n\n const modal = document.createElement('div');\n modal.className = 'triagly-modal';\n modal.setAttribute('role', 'document');\n\n const header = document.createElement('div');\n header.className = 'triagly-header';\n header.innerHTML = `\n <button type=\"button\" class=\"triagly-close\" aria-label=\"Close feedback form\">×</button>\n `;\n\n const closeBtn = header.querySelector('.triagly-close');\n closeBtn?.addEventListener('click', () => this.close('dismiss'));\n\n const form = document.createElement('form');\n form.className = 'triagly-form';\n form.innerHTML = `\n <div class=\"triagly-field\">\n <label for=\"triagly-description\">What's on your mind?</label>\n <textarea\n id=\"triagly-description\"\n required\n rows=\"5\"\n placeholder=\"${this.config.placeholderText || 'Describe what happened...'}\"\n ></textarea>\n </div>\n\n <div class=\"triagly-field\">\n <label for=\"triagly-name\">Name (optional)</label>\n <input\n type=\"text\"\n id=\"triagly-name\"\n placeholder=\"Your name\"\n />\n </div>\n\n <div class=\"triagly-field\">\n <label for=\"triagly-email\">Email (optional)</label>\n <input\n type=\"email\"\n id=\"triagly-email\"\n placeholder=\"your@email.com\"\n />\n </div>\n\n ${this.config.turnstileSiteKey ? `\n <div class=\"triagly-field triagly-turnstile\">\n <div class=\"cf-turnstile\" data-sitekey=\"${this.config.turnstileSiteKey}\" data-theme=\"light\"></div>\n </div>\n ` : ''}\n\n <div class=\"triagly-actions\">\n <button type=\"button\" class=\"triagly-btn-secondary\" id=\"triagly-cancel\" aria-label=\"Cancel and close feedback form\">\n Cancel\n </button>\n <button type=\"submit\" class=\"triagly-btn-primary\" aria-label=\"Submit feedback\">\n Send Feedback\n </button>\n </div>\n\n <div class=\"triagly-status\" id=\"triagly-status\" role=\"status\" aria-live=\"polite\"></div>\n `;\n\n const cancelBtn = form.querySelector('#triagly-cancel');\n cancelBtn?.addEventListener('click', () => this.close('cancel'));\n\n form.onsubmit = (e) => {\n e.preventDefault();\n this.handleSubmit(form);\n };\n\n const footer = document.createElement('div');\n footer.className = 'triagly-footer';\n footer.innerHTML = `\n <a href=\"https://triagly.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"triagly-branding\">\n Powered by <strong>Triagly</strong>\n </a>\n `;\n\n modal.appendChild(header);\n modal.appendChild(form);\n modal.appendChild(footer);\n overlay.appendChild(modal);\n\n // Render Turnstile widget if available\n if (this.config.turnstileSiteKey) {\n setTimeout(() => {\n this.renderTurnstileWidget(form);\n }, 100);\n }\n\n return overlay;\n }\n\n /**\n * Render Cloudflare Turnstile widget\n */\n private renderTurnstileWidget(form: HTMLFormElement): void {\n const turnstileContainer = form.querySelector('.cf-turnstile');\n if (!turnstileContainer) return;\n\n // Check if Turnstile script is loaded\n if (!(window as any).turnstile) {\n console.warn('Triagly: Turnstile script not loaded. Please include: <script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async defer></script>');\n return;\n }\n\n try {\n const widgetId = (window as any).turnstile.render(turnstileContainer, {\n sitekey: this.config.turnstileSiteKey,\n theme: this.config.theme === 'dark' ? 'dark' : 'light',\n callback: (token: string) => {\n // Store token in a data attribute for easy retrieval\n turnstileContainer.setAttribute('data-turnstile-response', token);\n turnstileContainer.setAttribute('data-widget-id', widgetId);\n },\n 'error-callback': () => {\n console.error('Triagly: Turnstile widget error');\n },\n 'expired-callback': () => {\n // Clear stored token when it expires\n turnstileContainer.removeAttribute('data-turnstile-response');\n },\n });\n\n turnstileContainer.setAttribute('data-widget-id', widgetId);\n } catch (error) {\n console.error('Triagly: Failed to render Turnstile widget:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n /**\n * Handle form submission\n */\n private async handleSubmit(form: HTMLFormElement): Promise<void> {\n const descInput = form.querySelector('#triagly-description') as HTMLTextAreaElement;\n const nameInput = form.querySelector('#triagly-name') as HTMLInputElement;\n const emailInput = form.querySelector('#triagly-email') as HTMLInputElement;\n const statusDiv = form.querySelector('#triagly-status') as HTMLDivElement;\n const submitBtn = form.querySelector('button[type=\"submit\"]') as HTMLButtonElement;\n const turnstileContainer = form.querySelector('.cf-turnstile');\n\n // Disable form\n submitBtn.disabled = true;\n submitBtn.textContent = 'Sending...';\n\n try {\n // Get Turnstile token if widget is present\n let turnstileToken: string | undefined;\n if (turnstileContainer) {\n turnstileToken = turnstileContainer.getAttribute('data-turnstile-response') || undefined;\n }\n\n const data = {\n description: descInput.value.trim(),\n reporterName: nameInput.value.trim() || undefined,\n reporterEmail: emailInput.value.trim() || undefined,\n turnstileToken,\n };\n\n // Create a promise that waits for actual submission result\n const submissionPromise = new Promise<void>((resolve, reject) => {\n const handleSuccess = () => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n resolve();\n };\n\n const handleError = (e: Event) => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n reject((e as CustomEvent).detail);\n };\n\n document.addEventListener('triagly:success', handleSuccess, { once: true });\n document.addEventListener('triagly:error', handleError, { once: true });\n\n // Set a timeout in case events don't fire\n setTimeout(() => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n reject(new Error('Submission timeout'));\n }, 30000); // 30 second timeout\n });\n\n // Dispatch custom event for parent to handle\n const event = new CustomEvent('triagly:submit', {\n detail: data,\n bubbles: true,\n });\n document.dispatchEvent(event);\n\n // Wait for actual submission result\n await submissionPromise;\n\n // Show success\n statusDiv.className = 'triagly-status triagly-success';\n statusDiv.textContent = this.config.successMessage || 'Feedback sent successfully!';\n\n // Close after delay\n setTimeout(() => {\n this.close();\n }, 2000);\n } catch (error) {\n // Show error with actual error message\n statusDiv.className = 'triagly-status triagly-error';\n const errorMessage = error instanceof Error ? error.message :\n (this.config.errorMessage || 'Failed to send feedback. Please try again.');\n statusDiv.textContent = errorMessage;\n\n // Re-enable form\n submitBtn.disabled = false;\n submitBtn.textContent = 'Send Feedback';\n }\n }\n\n /**\n * Inject widget styles\n */\n private injectStyles(): void {\n if (document.getElementById('triagly-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'triagly-styles';\n style.textContent = `\n .triagly-button {\n position: fixed;\n z-index: 999999;\n padding: 12px 20px;\n background: var(--triagly-button-bg, #18181b);\n color: var(--triagly-button-text, #ffffff);\n border: none;\n border-radius: var(--triagly-button-radius, 8px);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n box-shadow: var(--triagly-button-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n\n .triagly-button:hover {\n background: var(--triagly-button-bg-hover, #27272a);\n transform: translateY(-2px);\n box-shadow: var(--triagly-button-shadow-hover, 0 6px 16px rgba(0, 0, 0, 0.2));\n }\n\n .triagly-button .triagly-icon {\n flex-shrink: 0;\n }\n\n .triagly-button .triagly-btn-label {\n line-height: 1;\n }\n\n /* Prevent expandable buttons from shifting on hover */\n .triagly-button.triagly-shape-expandable:hover {\n transform: translateY(0) !important;\n }\n\n .triagly-bottom-right { bottom: 20px; right: 20px; }\n .triagly-bottom-left { bottom: 20px; left: 20px; }\n .triagly-top-right { top: 20px; right: 20px; }\n .triagly-top-left { top: 20px; left: 20px; }\n\n /* Edge-aligned positions (0 offset from edges) */\n .triagly-edge-bottom-right { bottom: 0; right: 0; }\n .triagly-edge-bottom-left { bottom: 0; left: 0; }\n .triagly-edge-top-right { top: 0; right: 0; }\n .triagly-edge-top-left { top: 0; left: 0; }\n .triagly-edge-right { top: 50%; right: 0; transform: translateY(-50%); }\n .triagly-edge-left { top: 50%; left: 0; transform: translateY(-50%); }\n .triagly-edge-top { top: 0; left: 50%; transform: translateX(-50%); }\n .triagly-edge-bottom { bottom: 0; left: 50%; transform: translateX(-50%); }\n\n /* Button shapes */\n .triagly-shape-rounded {\n border-radius: var(--triagly-button-radius, 8px);\n }\n .triagly-shape-circular {\n border-radius: 50%;\n width: 60px;\n height: 60px;\n padding: 0;\n font-size: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .triagly-shape-square {\n border-radius: 0;\n }\n .triagly-shape-pill {\n border-radius: 30px;\n }\n .triagly-shape-expandable {\n border-radius: 50%;\n width: 60px;\n height: 60px;\n min-width: 60px;\n padding: 0;\n font-size: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n border-radius 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n padding 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n background 0.2s,\n box-shadow 0.2s;\n white-space: nowrap;\n }\n \n /* Expansion direction - expands left for right-positioned buttons */\n .triagly-shape-expandable.triagly-expand-left {\n flex-direction: row-reverse;\n }\n \n /* Expansion direction - expands right for left-positioned buttons */\n .triagly-shape-expandable.triagly-expand-right {\n flex-direction: row;\n }\n \n .triagly-shape-expandable .triagly-btn-icon {\n display: inline-block;\n flex-shrink: 0;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .triagly-shape-expandable .triagly-btn-text {\n display: inline-block;\n width: 0;\n opacity: 0;\n overflow: hidden;\n font-size: 14px;\n font-weight: 500;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* Hover state */\n .triagly-shape-expandable:hover {\n width: auto;\n min-width: auto;\n padding: 12px 20px;\n border-radius: 30px;\n background: var(--triagly-button-bg-hover, #27272a);\n box-shadow: var(--triagly-button-shadow-hover, 0 6px 16px rgba(0, 0, 0, 0.2));\n }\n .triagly-shape-expandable:hover .triagly-btn-text {\n width: auto;\n opacity: 1;\n }\n\n /* Button orientations */\n .triagly-orientation-horizontal {\n writing-mode: horizontal-tb;\n }\n .triagly-orientation-vertical {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n }\n\n .triagly-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--triagly-overlay-bg, rgba(0, 0, 0, 0.5));\n z-index: 1000000;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: triagly-fadeIn 0.2s;\n }\n\n @keyframes triagly-fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .triagly-modal {\n background: var(--triagly-modal-bg, #ffffff);\n border-radius: var(--triagly-modal-radius, 12px);\n width: 90%;\n max-width: var(--triagly-modal-max-width, 500px);\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: var(--triagly-modal-shadow, 0 20px 60px rgba(0, 0, 0, 0.3));\n animation: triagly-slideUp 0.3s;\n }\n\n @keyframes triagly-slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .triagly-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n padding: 8px 12px 0;\n background: var(--triagly-header-bg, #ffffff);\n }\n\n .triagly-close {\n background: none;\n border: none;\n font-size: 28px;\n color: #6b7280;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s;\n }\n\n .triagly-close:hover {\n background: #f3f4f6;\n color: #111827;\n }\n\n .triagly-form {\n padding: 24px;\n background: var(--triagly-form-bg, #ffffff);\n }\n\n .triagly-field {\n margin-bottom: 16px;\n }\n\n .triagly-field label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: var(--triagly-label-text, #374151);\n }\n\n .triagly-field input,\n .triagly-field textarea {\n width: 100%;\n padding: 10px 12px;\n background: var(--triagly-input-bg, #ffffff);\n border: 1px solid var(--triagly-input-border, #d1d5db);\n border-radius: var(--triagly-input-radius, 6px);\n color: var(--triagly-input-text, #111827);\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s;\n box-sizing: border-box;\n }\n\n .triagly-field input:focus,\n .triagly-field textarea:focus {\n outline: none;\n border-color: var(--triagly-input-border-focus, #a1a1aa);\n box-shadow: 0 0 0 2px rgba(161, 161, 170, 0.15);\n }\n\n /* Focus visible styles for accessibility */\n .triagly-button:focus-visible,\n .triagly-field input:focus-visible,\n .triagly-field textarea:focus-visible,\n .triagly-btn-primary:focus-visible,\n .triagly-btn-secondary:focus-visible,\n .triagly-close:focus-visible {\n outline: 2px solid #a1a1aa;\n outline-offset: 2px;\n }\n\n .triagly-turnstile {\n display: flex;\n justify-content: center;\n margin: 8px 0;\n }\n\n .triagly-actions {\n display: flex;\n gap: 12px;\n margin-top: 24px;\n }\n\n .triagly-btn-primary,\n .triagly-btn-secondary {\n flex: 1;\n padding: 10px 16px;\n border-radius: var(--triagly-btn-radius, 6px);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n\n .triagly-btn-primary {\n background: var(--triagly-btn-primary-bg, #18181b);\n color: var(--triagly-btn-primary-text, #ffffff);\n }\n\n .triagly-btn-primary:hover:not(:disabled) {\n background: var(--triagly-btn-primary-bg-hover, #27272a);\n }\n\n .triagly-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .triagly-btn-secondary {\n background: var(--triagly-btn-secondary-bg, #f3f4f6);\n color: var(--triagly-btn-secondary-text, #374151);\n }\n\n .triagly-btn-secondary:hover {\n background: var(--triagly-btn-secondary-bg-hover, #e5e7eb);\n }\n\n .triagly-status {\n margin-top: 16px;\n padding: 12px;\n border-radius: 6px;\n font-size: 14px;\n display: none;\n }\n\n .triagly-status.triagly-success {\n display: block;\n background: var(--triagly-success-bg, #d1fae5);\n color: var(--triagly-success-text, #065f46);\n }\n\n .triagly-status.triagly-error {\n display: block;\n background: var(--triagly-error-bg, #fee2e2);\n color: var(--triagly-error-text, #991b1b);\n }\n\n .triagly-footer {\n padding: 12px 24px 16px;\n text-align: right;\n border-top: 1px solid var(--triagly-footer-border, #e5e7eb);\n background: var(--triagly-footer-bg, #f9fafb);\n border-radius: 0 0 var(--triagly-modal-radius, 12px) var(--triagly-modal-radius, 12px);\n }\n\n .triagly-branding {\n font-size: 12px;\n color: var(--triagly-footer-text, #6b7280);\n text-decoration: none;\n transition: color 0.2s;\n }\n\n .triagly-branding:hover {\n color: var(--triagly-footer-text-hover, #18181b);\n }\n\n .triagly-branding strong {\n font-weight: 600;\n }\n `;\n\n document.head.appendChild(style);\n }\n\n /**\n * Set up keyboard event handlers\n */\n private setupKeyboardEvents(): void {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Close on Escape key\n if (e.key === 'Escape' && this.isOpen) {\n e.preventDefault();\n this.close('dismiss');\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n \n // Store handler for cleanup\n if (this.container) {\n (this.container as any)._keydownHandler = handleKeyDown;\n }\n }\n\n /**\n * Set up focus trap to keep focus within modal\n */\n private setupFocusTrap(): void {\n if (!this.container) return;\n\n // Get all focusable elements\n const modal = this.container.querySelector('.triagly-modal');\n if (!modal) return;\n\n const focusableSelector =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n this.focusableElements = Array.from(\n modal.querySelectorAll(focusableSelector)\n ) as HTMLElement[];\n\n if (this.focusableElements.length === 0) {\n console.warn('Triagly: No focusable elements found in modal');\n return;\n }\n\n // Handle Tab key to trap focus - must prevent default BEFORE focus moves\n const handleTab = (e: Event) => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key !== 'Tab') return;\n\n // Only handle if focus is within our modal\n if (!this.container?.contains(document.activeElement)) return;\n\n const firstFocusable = this.focusableElements[0];\n const lastFocusable = this.focusableElements[this.focusableElements.length - 1];\n\n if (keyEvent.shiftKey) {\n // Shift + Tab - moving backwards\n if (document.activeElement === firstFocusable) {\n keyEvent.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n // Tab - moving forwards\n if (document.activeElement === lastFocusable) {\n keyEvent.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n // Use capture phase to intercept Tab before browser handles it\n document.addEventListener('keydown', handleTab as EventListener, true);\n (this.container as any)._tabHandler = handleTab;\n }\n\n /**\n * Destroy the widget\n */\n destroy(): void {\n // Clean up event listeners\n if (this.container) {\n const keydownHandler = (this.container as any)._keydownHandler;\n if (keydownHandler) {\n document.removeEventListener('keydown', keydownHandler);\n }\n\n const tabHandler = (this.container as any)._tabHandler;\n if (tabHandler) {\n document.removeEventListener('keydown', tabHandler, true);\n }\n }\n\n this.close();\n document.getElementById('triagly-button')?.remove();\n document.getElementById('triagly-styles')?.remove();\n }\n}\n","// API Client\n\nimport {\n FeedbackData,\n FeedbackMetadata,\n FeedbackResponse,\n} from './types';\n\nconst API_URLS = {\n production: 'https://iipkklhhafrjesryscjh.supabase.co/functions/v1',\n staging: 'https://bssghvinezdawvupcyci.supabase.co/functions/v1',\n} as const;\n\nexport type Environment = 'production' | 'staging';\n\nexport class TriaglyAPI {\n private apiUrl: string;\n private publishableKey: string;\n private getToken?: () => Promise<string>;\n private turnstileSiteKey: string;\n\n // Triagly's public Turnstile site key (safe to hardcode - client-side only)\n private static readonly DEFAULT_TURNSTILE_SITE_KEY = '0x4AAAAAAB8Dc-Fl964Vp1Nn';\n\n constructor(\n publishableKey: string,\n environment: Environment = 'production',\n apiUrl?: string,\n getToken?: () => Promise<string>,\n turnstileSiteKey?: string\n ) {\n // apiUrl override takes precedence, then environment-based URL\n this.apiUrl = (apiUrl || API_URLS[environment]).replace(/\\/$/, ''); // Remove trailing slash\n this.publishableKey = publishableKey;\n this.getToken = getToken;\n // Always use Triagly's Turnstile site key (can be overridden for testing)\n this.turnstileSiteKey = turnstileSiteKey || TriaglyAPI.DEFAULT_TURNSTILE_SITE_KEY;\n }\n\n /**\n * Get the Turnstile site key\n */\n getTurnstileSiteKey(): string {\n return this.turnstileSiteKey;\n }\n\n /**\n * Get Turnstile token from widget if available\n */\n private async getTurnstileToken(): Promise<string | null> {\n // Check if Turnstile widget is available\n const turnstileWidget = document.querySelector('[data-turnstile-response]');\n if (turnstileWidget) {\n const token = turnstileWidget.getAttribute('data-turnstile-response');\n if (token) return token;\n }\n\n // Check if window.turnstile is available\n if ((window as any).turnstile) {\n try {\n // Get the first widget's response\n const widgets = document.querySelectorAll('.cf-turnstile');\n if (widgets.length > 0) {\n const widgetId = widgets[0].getAttribute('data-widget-id');\n if (widgetId) {\n const token = (window as any).turnstile.getResponse(widgetId);\n if (token) return token;\n }\n }\n } catch (error) {\n console.warn('Failed to get Turnstile token:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n return null;\n }\n\n /**\n * Submit feedback with new authentication\n */\n async submitFeedback(\n data: FeedbackData,\n metadata: FeedbackMetadata,\n turnstileToken?: string\n ): Promise<FeedbackResponse> {\n // Get Turnstile token if not provided\n if (!turnstileToken) {\n turnstileToken = await this.getTurnstileToken() || undefined;\n }\n\n // Only require Turnstile if configured\n if (this.turnstileSiteKey && !turnstileToken) {\n throw new Error('Turnstile verification required. Please complete the captcha.');\n }\n\n // Get hardened token if callback is provided\n let hardenedToken: string | undefined;\n if (this.getToken) {\n try {\n hardenedToken = await this.getToken();\n } catch (error) {\n console.error('Failed to get hardened token:', error instanceof Error ? error.message : 'Unknown error');\n throw new Error('Failed to authenticate. Please try again.');\n }\n }\n\n const payload = {\n publishableKey: this.publishableKey,\n title: data.title,\n description: data.description,\n metadata: {\n ...metadata,\n consoleLogs: data.consoleLogs,\n },\n tags: data.tags,\n reporterEmail: data.reporterEmail,\n reporterName: data.reporterName,\n turnstileToken,\n hardenedToken,\n };\n\n const response = await fetch(`${this.apiUrl}/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error', message: 'Unknown error' }));\n\n // Handle specific error types with user-friendly messages\n if (response.status === 401) {\n if (error.error === 'invalid_publishable_key') {\n throw new Error('Invalid API key. Please contact support.');\n } else if (error.error === 'token_required') {\n throw new Error('Authentication required. Please refresh and try again.');\n }\n throw new Error(error.message || 'Authentication failed');\n } else if (response.status === 403) {\n if (error.error === 'origin_not_allowed') {\n throw new Error('This website is not authorized to submit feedback.');\n }\n throw new Error(error.message || 'Access denied');\n } else if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const resetTime = retryAfter ? `in ${retryAfter} seconds` : 'later';\n throw new Error(`Too many requests. Please try again ${resetTime}.`);\n } else if (response.status === 400 && error.error === 'captcha_failed') {\n throw new Error('Captcha verification failed. Please try again.');\n }\n\n throw new Error(error.message || error.error || `Failed to submit feedback (HTTP ${response.status})`);\n }\n\n return await response.json();\n }\n}\n","// Utility functions\n\nimport { FeedbackMetadata } from './types';\n\n/**\n * Collect browser and page metadata\n */\nexport function collectMetadata(customMetadata?: Record<string, any>): FeedbackMetadata {\n const viewport = `${window.innerWidth}x${window.innerHeight}`;\n const browser = detectBrowser();\n\n return {\n url: window.location.href,\n browser,\n viewport,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n ...customMetadata,\n };\n}\n\n/**\n * Detect browser name and version\n */\nfunction detectBrowser(): string {\n const ua = navigator.userAgent;\n let browser = 'Unknown';\n\n if (ua.includes('Firefox/')) {\n const version = ua.match(/Firefox\\/(\\d+)/)?.[1];\n browser = `Firefox ${version}`;\n } else if (ua.includes('Chrome/') && !ua.includes('Edg')) {\n const version = ua.match(/Chrome\\/(\\d+)/)?.[1];\n browser = `Chrome ${version}`;\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n const version = ua.match(/Version\\/(\\d+)/)?.[1];\n browser = `Safari ${version}`;\n } else if (ua.includes('Edg/')) {\n const version = ua.match(/Edg\\/(\\d+)/)?.[1];\n browser = `Edge ${version}`;\n }\n\n return browser;\n}\n\n/**\n * Simple rate limiter using localStorage\n */\nexport class RateLimiter {\n private key: string;\n private maxAttempts: number;\n private windowMs: number;\n\n constructor(key: string, maxAttempts: number = 3, windowMs: number = 5 * 60 * 1000) {\n this.key = `triagly_ratelimit_${key}`;\n this.maxAttempts = maxAttempts;\n this.windowMs = windowMs;\n }\n\n canProceed(): boolean {\n const now = Date.now();\n const data = this.getData();\n\n // Filter out old attempts\n const recentAttempts = data.attempts.filter(\n (timestamp) => now - timestamp < this.windowMs\n );\n\n if (recentAttempts.length >= this.maxAttempts) {\n return false;\n }\n\n return true;\n }\n\n recordAttempt(): void {\n const now = Date.now();\n const data = this.getData();\n\n // Add new attempt\n data.attempts.push(now);\n\n // Keep only recent attempts\n data.attempts = data.attempts.filter(\n (timestamp) => now - timestamp < this.windowMs\n );\n\n this.setData(data);\n }\n\n getTimeUntilReset(): number {\n const now = Date.now();\n const data = this.getData();\n\n if (data.attempts.length === 0) {\n return 0;\n }\n\n const oldestAttempt = Math.min(...data.attempts);\n const resetTime = oldestAttempt + this.windowMs;\n\n return Math.max(0, resetTime - now);\n }\n\n private getData(): { attempts: number[] } {\n try {\n const stored = localStorage.getItem(this.key);\n return stored ? JSON.parse(stored) : { attempts: [] };\n } catch {\n return { attempts: [] };\n }\n }\n\n private setData(data: { attempts: number[] }): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(data));\n } catch (error) {\n console.error('Failed to store rate limit data:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Console log capture for debugging\n */\nexport interface ConsoleLog {\n level: 'error' | 'warn' | 'log';\n message: string;\n timestamp: string;\n stack?: string;\n}\n\nexport class ConsoleLogger {\n private buffer: ConsoleLog[] = [];\n private maxLogs: number;\n private levels: Set<'error' | 'warn' | 'log'>;\n private originalConsole: {\n error: typeof console.error;\n warn: typeof console.warn;\n log: typeof console.log;\n };\n private isActive: boolean = false;\n\n constructor(maxLogs: number = 50, levels: ('error' | 'warn' | 'log')[] = ['error', 'warn']) {\n this.maxLogs = maxLogs;\n this.levels = new Set(levels);\n \n // Store original console methods\n this.originalConsole = {\n error: console.error,\n warn: console.warn,\n log: console.log,\n };\n }\n\n /**\n * Start capturing console logs\n */\n start(): void {\n if (this.isActive) return;\n this.isActive = true;\n\n // Intercept console.error\n if (this.levels.has('error')) {\n console.error = (...args: any[]) => {\n this.captureLog('error', args);\n this.originalConsole.error.apply(console, args);\n };\n }\n\n // Intercept console.warn\n if (this.levels.has('warn')) {\n console.warn = (...args: any[]) => {\n this.captureLog('warn', args);\n this.originalConsole.warn.apply(console, args);\n };\n }\n\n // Intercept console.log\n if (this.levels.has('log')) {\n console.log = (...args: any[]) => {\n this.captureLog('log', args);\n this.originalConsole.log.apply(console, args);\n };\n }\n }\n\n /**\n * Stop capturing and restore original console methods\n */\n stop(): void {\n if (!this.isActive) return;\n this.isActive = false;\n\n console.error = this.originalConsole.error;\n console.warn = this.originalConsole.warn;\n console.log = this.originalConsole.log;\n }\n\n /**\n * Capture a log entry\n */\n private captureLog(level: 'error' | 'warn' | 'log', args: any[]): void {\n try {\n // Convert arguments to string\n const message = args.map(arg => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) return arg.message;\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(' ');\n\n // Get stack trace for errors\n let stack: string | undefined;\n if (level === 'error') {\n const error = args.find(arg => arg instanceof Error);\n if (error) {\n stack = error.stack;\n } else {\n // Create stack trace\n stack = new Error().stack?.split('\\n').slice(2).join('\\n');\n }\n }\n\n // Sanitize sensitive data\n const sanitized = this.sanitize(message);\n const sanitizedStack = stack ? this.sanitize(stack) : undefined;\n\n // Add to buffer\n const logEntry: ConsoleLog = {\n level,\n message: sanitized,\n timestamp: new Date().toISOString(),\n stack: sanitizedStack,\n };\n\n this.buffer.push(logEntry);\n\n // Keep buffer size limited (circular buffer)\n if (this.buffer.length > this.maxLogs) {\n this.buffer.shift();\n }\n } catch (error) {\n // Don't let logging break the app\n this.originalConsole.error('Failed to capture log:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n /**\n * Sanitize sensitive data from logs\n */\n private sanitize(text: string): string {\n return text\n // API keys, tokens, secrets\n .replace(/[a-zA-Z0-9_-]*token[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'token=***')\n .replace(/[a-zA-Z0-9_-]*key[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'key=***')\n .replace(/[a-zA-Z0-9_-]*secret[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'secret=***')\n // GitHub tokens (ghp_, gho_, etc.)\n .replace(/gh[ps]_[a-zA-Z0-9]{36,}/g, 'gh*_***')\n // JWT tokens\n .replace(/eyJ[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+/g, 'jwt.***')\n // Passwords\n .replace(/password\\s*[:=]\\s*[\"']?[^\"'\\s]+[\"']?/gi, 'password=***')\n // Email addresses\n .replace(/\\b[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}\\b/g, '***@***.com')\n // Credit cards (basic pattern)\n .replace(/\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g, '****-****-****-****')\n // URLs with tokens in query params\n .replace(/([?&])(token|key|secret|auth)=[^&\\s]+/gi, '$1$2=***');\n }\n\n /**\n * Get all captured logs\n */\n getLogs(): ConsoleLog[] {\n return [...this.buffer];\n }\n\n /**\n * Clear all captured logs\n */\n clear(): void {\n this.buffer = [];\n }\n\n /**\n * Get logs count\n */\n getCount(): number {\n return this.buffer.length;\n }\n}\n","// Triagly SDK Main Entry Point\n\nimport {\n TriaglyConfig,\n FeedbackData,\n} from './types';\nimport { FeedbackWidget } from './ui';\nimport { TriaglyAPI } from './api';\nimport { collectMetadata, RateLimiter, ConsoleLogger } from './utils';\n\nexport class Triagly {\n private config: TriaglyConfig;\n private widget: FeedbackWidget;\n private api: TriaglyAPI;\n private rateLimiter: RateLimiter;\n private consoleLogger: ConsoleLogger | null = null;\n\n constructor(config: TriaglyConfig) {\n // Handle backward compatibility - support multiple key names\n let apiKey = config.apiKey || config.publishableKey;\n\n if (!apiKey && config.projectId) {\n console.warn(\n 'Triagly: projectId is deprecated. Please use apiKey instead. ' +\n 'See migration guide: https://docs.triagly.com/sdk/migration'\n );\n apiKey = config.projectId;\n }\n\n if (!apiKey) {\n throw new Error('Triagly: apiKey is required. Get yours at https://triagly.com/dashboard');\n }\n\n this.config = {\n theme: 'auto',\n position: 'bottom-right',\n buttonShape: 'rounded',\n buttonText: 'Feedback',\n placeholderText: 'Describe what happened...',\n successMessage: 'Feedback sent successfully!',\n errorMessage: 'Failed to send feedback. Please try again.',\n captureConsole: true,\n consoleLogLimit: 50,\n consoleLogLevels: ['error', 'warn'],\n ...config,\n apiKey,\n publishableKey: apiKey, // Keep for backward compatibility\n };\n\n this.api = new TriaglyAPI(\n apiKey,\n this.config.environment || 'production',\n this.config.apiUrl,\n this.config.getToken,\n this.config.turnstileSiteKey\n );\n\n // Always pass Turnstile site key to widget (from API which has default)\n this.config.turnstileSiteKey = this.api.getTurnstileSiteKey();\n this.widget = new FeedbackWidget(this.config);\n this.rateLimiter = new RateLimiter(apiKey, 3, 5 * 60 * 1000);\n\n // Initialize console logger if enabled\n if (this.config.captureConsole !== false) {\n this.consoleLogger = new ConsoleLogger(\n this.config.consoleLogLimit,\n this.config.consoleLogLevels\n );\n this.consoleLogger.start();\n }\n\n this.init();\n }\n\n /**\n * Initialize the SDK\n */\n private init(): void {\n // Wait for DOM to be ready before initializing widget\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.widget.init();\n });\n } else {\n // DOM is already ready\n this.widget.init();\n }\n\n // Listen for form submissions\n document.addEventListener('triagly:submit', (e: Event) => {\n const customEvent = e as CustomEvent;\n this.handleSubmit(customEvent.detail);\n });\n }\n\n /**\n * Handle feedback submission\n */\n private async handleSubmit(data: any): Promise<void> {\n try {\n // Check rate limit\n if (!this.rateLimiter.canProceed()) {\n const resetTime = Math.ceil(this.rateLimiter.getTimeUntilReset() / 1000 / 60);\n throw new Error(`Rate limit exceeded. Please try again in ${resetTime} minute(s).`);\n }\n\n // Collect metadata\n const metadata = collectMetadata(this.config.metadata);\n\n // Prepare feedback data\n const feedbackData: FeedbackData = {\n title: data.title,\n description: data.description,\n reporterEmail: data.reporterEmail,\n consoleLogs: this.consoleLogger?.getLogs(),\n };\n\n // Submit to API with Turnstile token if provided\n const response = await this.api.submitFeedback(\n feedbackData,\n metadata,\n data.turnstileToken\n );\n\n // Record rate limit attempt\n this.rateLimiter.recordAttempt();\n\n // Dispatch success event for UI layer\n document.dispatchEvent(new CustomEvent('triagly:success', {\n detail: { feedbackId: response.id }\n }));\n\n // Call success callback\n if (this.config.onSuccess) {\n this.config.onSuccess(response.id);\n }\n } catch (error) {\n console.error('Failed to submit feedback:', error instanceof Error ? error.message : 'Unknown error');\n\n // Dispatch error event for UI layer\n document.dispatchEvent(new CustomEvent('triagly:error', {\n detail: error\n }));\n\n // Call error callback\n if (this.config.onError && error instanceof Error) {\n this.config.onError(error);\n }\n\n throw error;\n }\n }\n\n /**\n * Programmatically open the feedback widget\n */\n open(): void {\n this.widget.open();\n }\n\n /**\n * Programmatically close the feedback widget\n */\n close(): void {\n this.widget.close();\n }\n\n /**\n * Submit feedback programmatically without UI\n * Note: When Turnstile is enabled, you must use the widget UI or provide a token\n */\n async submit(data: FeedbackData, turnstileToken?: string): Promise<void> {\n // Require Turnstile token if configured\n if (this.config.turnstileSiteKey && !turnstileToken) {\n throw new Error(\n 'Turnstile verification required. When Turnstile is enabled, you must:\\n' +\n '1. Use the widget UI (triagly.open()), or\\n' +\n '2. Implement Turnstile in your form and pass the token: triagly.submit(data, token)'\n );\n }\n\n const metadata = collectMetadata(this.config.metadata);\n\n // Include console logs if available and not already provided\n if (!data.consoleLogs && this.consoleLogger) {\n data.consoleLogs = this.consoleLogger.getLogs();\n }\n\n await this.api.submitFeedback(data, metadata, turnstileToken);\n this.rateLimiter.recordAttempt();\n }\n\n /**\n * Destroy the SDK instance\n */\n destroy(): void {\n this.widget.destroy();\n this.consoleLogger?.stop();\n document.removeEventListener('triagly:submit', () => {});\n }\n}\n\n// Export types\nexport * from './types';\n\n// Auto-initialize if config is in window\nif (typeof window !== 'undefined') {\n const globalConfig = (window as any).TriaglyConfig;\n if (globalConfig) {\n (window as any).triagly = new Triagly(globalConfig);\n }\n\n // Make Triagly class directly accessible as window.Triagly for UMD builds\n // This allows users to use: new Triagly({...}) instead of new Triagly.default({...})\n (window as any).Triagly = Triagly;\n}\n\n// Default export\nexport default Triagly;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/annotation.ts","../src/ui.ts","../src/api.ts","../src/utils.ts","../src/index.ts"],"sourcesContent":["// Annotation Editor Module\n// Canvas-based annotation overlay for marking up screenshots\n\nexport type AnnotationTool = 'highlight' | 'arrow' | 'freehand' | 'text';\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface Annotation {\n type: AnnotationTool;\n color: string;\n strokeWidth: number;\n points: Point[];\n text?: string;\n}\n\nexport class AnnotationEditor {\n private overlay: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private ctx: CanvasRenderingContext2D | null = null;\n private imageData: string;\n private image: HTMLImageElement | null = null;\n private annotations: Annotation[] = [];\n private currentTool: AnnotationTool = 'highlight';\n private currentColor: string = '#ff0000';\n private strokeWidth: number = 3;\n private isDrawing: boolean = false;\n private currentAnnotation: Annotation | null = null;\n private onComplete: (annotatedImage: string) => void;\n private onCancel: () => void;\n private scale: number = 1;\n private offsetX: number = 0;\n private offsetY: number = 0;\n private pendingTextPoint: Point | null = null;\n\n constructor(\n imageData: string,\n onComplete: (annotatedImage: string) => void,\n onCancel: () => void\n ) {\n this.imageData = imageData;\n this.onComplete = onComplete;\n this.onCancel = onCancel;\n }\n\n /**\n * Open the annotation editor\n */\n async open(): Promise<void> {\n // Load the image first\n this.image = await this.loadImage(this.imageData);\n\n // Create the overlay UI\n this.createOverlay();\n\n // Set up the canvas\n this.setupCanvas();\n\n // Set up canvas drawing event listeners (must be after setupCanvas)\n this.setupCanvasEventListeners();\n\n // Draw the image\n this.render();\n }\n\n /**\n * Load image from data URL\n */\n private loadImage(dataUrl: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error('Failed to load image'));\n img.src = dataUrl;\n });\n }\n\n /**\n * Create the fullscreen overlay UI\n */\n private createOverlay(): void {\n this.overlay = document.createElement('div');\n this.overlay.className = 'triagly-annotation-overlay';\n this.overlay.innerHTML = `\n <div class=\"triagly-annotation-header\">\n <div class=\"triagly-annotation-tools\">\n <button type=\"button\" class=\"triagly-tool-btn active\" data-tool=\"highlight\" title=\"Highlight\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" opacity=\"0.3\" fill=\"currentColor\"/>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"triagly-tool-btn\" data-tool=\"arrow\" title=\"Arrow\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\"/>\n <polyline points=\"10,5 19,5 19,14\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"triagly-tool-btn\" data-tool=\"freehand\" title=\"Draw\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 19l7-7 3 3-7 7-3-3z\"/>\n <path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\"/>\n <path d=\"M2 2l7.586 7.586\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"triagly-tool-btn\" data-tool=\"text\" title=\"Text\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"4 7 4 4 20 4 20 7\"/>\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"/>\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"/>\n </svg>\n </button>\n <div class=\"triagly-tool-divider\"></div>\n <input type=\"color\" class=\"triagly-color-picker\" value=\"#ff0000\" title=\"Color\">\n </div>\n <div class=\"triagly-annotation-actions\">\n <button type=\"button\" class=\"triagly-annotation-btn triagly-btn-clear\" title=\"Clear All\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"3 6 5 6 21 6\"/>\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/>\n </svg>\n Clear\n </button>\n <button type=\"button\" class=\"triagly-annotation-btn triagly-btn-cancel\">Cancel</button>\n <button type=\"button\" class=\"triagly-annotation-btn triagly-btn-done\">Done</button>\n </div>\n </div>\n <div class=\"triagly-annotation-canvas-container\">\n <canvas class=\"triagly-annotation-canvas\"></canvas>\n </div>\n <div class=\"triagly-text-modal\" id=\"triagly-text-modal\" style=\"display: none;\">\n <div class=\"triagly-text-modal-content\">\n <h3>Add Text Annotation</h3>\n <input type=\"text\" id=\"triagly-text-input\" placeholder=\"Enter text...\" maxlength=\"200\" autofocus />\n <div class=\"triagly-text-modal-actions\">\n <button type=\"button\" class=\"triagly-annotation-btn triagly-btn-cancel\" id=\"triagly-text-cancel\">Cancel</button>\n <button type=\"button\" class=\"triagly-annotation-btn triagly-btn-done\" id=\"triagly-text-confirm\">Add Text</button>\n </div>\n </div>\n </div>\n `;\n\n // Inject styles\n this.injectStyles();\n\n // Add event listeners\n this.setupEventListeners();\n\n document.body.appendChild(this.overlay);\n }\n\n /**\n * Set up the canvas with correct dimensions\n */\n private setupCanvas(): void {\n if (!this.overlay || !this.image) return;\n\n this.canvas = this.overlay.querySelector('.triagly-annotation-canvas') as HTMLCanvasElement;\n const container = this.overlay.querySelector('.triagly-annotation-canvas-container') as HTMLElement;\n\n if (!this.canvas || !container) return;\n\n this.ctx = this.canvas.getContext('2d');\n if (!this.ctx) return;\n\n // Calculate scale to fit image in container\n const containerRect = container.getBoundingClientRect();\n const maxWidth = containerRect.width - 40; // Padding\n const maxHeight = containerRect.height - 40;\n\n const imageAspect = this.image.width / this.image.height;\n const containerAspect = maxWidth / maxHeight;\n\n let canvasWidth: number;\n let canvasHeight: number;\n\n if (imageAspect > containerAspect) {\n // Image is wider - fit to width\n canvasWidth = Math.min(this.image.width, maxWidth);\n canvasHeight = canvasWidth / imageAspect;\n } else {\n // Image is taller - fit to height\n canvasHeight = Math.min(this.image.height, maxHeight);\n canvasWidth = canvasHeight * imageAspect;\n }\n\n this.scale = canvasWidth / this.image.width;\n\n this.canvas.width = canvasWidth;\n this.canvas.height = canvasHeight;\n this.canvas.style.width = `${canvasWidth}px`;\n this.canvas.style.height = `${canvasHeight}px`;\n\n // Calculate offset for centering\n this.offsetX = (containerRect.width - canvasWidth) / 2;\n this.offsetY = (containerRect.height - canvasHeight) / 2;\n }\n\n /**\n * Set up UI event listeners (buttons, color picker, etc.)\n */\n private setupEventListeners(): void {\n if (!this.overlay) return;\n\n // Tool selection\n const toolBtns = this.overlay.querySelectorAll('.triagly-tool-btn');\n toolBtns.forEach((btn) => {\n btn.addEventListener('click', (e) => {\n const tool = (e.currentTarget as HTMLElement).dataset.tool as AnnotationTool;\n if (tool) {\n this.currentTool = tool;\n toolBtns.forEach((b) => b.classList.remove('active'));\n (e.currentTarget as HTMLElement).classList.add('active');\n }\n });\n });\n\n // Color picker\n const colorPicker = this.overlay.querySelector('.triagly-color-picker') as HTMLInputElement;\n if (colorPicker) {\n colorPicker.addEventListener('change', (e) => {\n this.currentColor = (e.target as HTMLInputElement).value;\n });\n }\n\n // Clear button\n const clearBtn = this.overlay.querySelector('.triagly-btn-clear');\n if (clearBtn) {\n clearBtn.addEventListener('click', () => {\n this.annotations = [];\n this.render();\n });\n }\n\n // Cancel button - use class selector to get the header cancel button only\n const headerCancelBtn = this.overlay.querySelector('.triagly-annotation-actions .triagly-btn-cancel');\n if (headerCancelBtn) {\n headerCancelBtn.addEventListener('click', () => this.close(true));\n }\n\n // Done button\n const doneBtn = this.overlay.querySelector('.triagly-btn-done');\n if (doneBtn) {\n doneBtn.addEventListener('click', () => this.close(false));\n }\n\n // Text modal event listeners\n const textConfirmBtn = this.overlay.querySelector('#triagly-text-confirm');\n const textCancelBtn = this.overlay.querySelector('#triagly-text-cancel');\n const textInput = this.overlay.querySelector('#triagly-text-input') as HTMLInputElement;\n\n textConfirmBtn?.addEventListener('click', () => this.confirmTextAnnotation());\n textCancelBtn?.addEventListener('click', () => this.hideTextModal());\n textInput?.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.confirmTextAnnotation();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.hideTextModal();\n }\n });\n\n // Escape key to cancel\n document.addEventListener('keydown', this.handleKeyDown);\n }\n\n /**\n * Set up canvas drawing event listeners\n */\n private setupCanvasEventListeners(): void {\n if (!this.canvas) return;\n\n // Canvas drawing events\n this.canvas.addEventListener('mousedown', (e) => this.handleMouseDown(e));\n this.canvas.addEventListener('mousemove', (e) => this.handleMouseMove(e));\n this.canvas.addEventListener('mouseup', () => this.handleMouseUp());\n this.canvas.addEventListener('mouseleave', () => this.handleMouseUp());\n\n // Touch support (use passive: false to allow preventDefault)\n this.canvas.addEventListener('touchstart', (e) => {\n e.preventDefault();\n const touch = e.touches[0];\n this.handleMouseDown(touch as unknown as MouseEvent);\n }, { passive: false });\n this.canvas.addEventListener('touchmove', (e) => {\n e.preventDefault();\n const touch = e.touches[0];\n this.handleMouseMove(touch as unknown as MouseEvent);\n }, { passive: false });\n this.canvas.addEventListener('touchend', () => this.handleMouseUp());\n this.canvas.addEventListener('touchcancel', () => this.handleMouseUp());\n }\n\n /**\n * Remove canvas drawing event listeners\n */\n private removeCanvasEventListeners(): void {\n if (!this.canvas) return;\n\n // Remove all canvas event listeners to prevent memory leaks\n // Note: We can't remove the exact listeners since they're arrow functions,\n // but removing the overlay (which contains the canvas) will clean them up\n this.canvas = null;\n this.ctx = null;\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape') {\n this.close(true);\n }\n };\n\n /**\n * Get canvas coordinates from mouse event\n */\n private getCanvasPoint(e: MouseEvent): Point {\n if (!this.canvas) return { x: 0, y: 0 };\n\n const rect = this.canvas.getBoundingClientRect();\n return {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n }\n\n /**\n * Handle mouse down - start drawing\n */\n private handleMouseDown(e: MouseEvent): void {\n const point = this.getCanvasPoint(e);\n this.isDrawing = true;\n\n if (this.currentTool === 'text') {\n // For text, show custom modal input\n this.pendingTextPoint = point;\n this.showTextModal();\n this.isDrawing = false;\n return;\n }\n\n this.currentAnnotation = {\n type: this.currentTool,\n color: this.currentColor,\n strokeWidth: this.strokeWidth,\n points: [point],\n };\n }\n\n /**\n * Show the text input modal\n */\n private showTextModal(): void {\n if (!this.overlay) return;\n const modal = this.overlay.querySelector('#triagly-text-modal') as HTMLElement;\n const input = this.overlay.querySelector('#triagly-text-input') as HTMLInputElement;\n if (modal && input) {\n modal.style.display = 'flex';\n input.value = '';\n input.focus();\n }\n }\n\n /**\n * Hide the text input modal\n */\n private hideTextModal(): void {\n if (!this.overlay) return;\n const modal = this.overlay.querySelector('#triagly-text-modal') as HTMLElement;\n if (modal) {\n modal.style.display = 'none';\n }\n this.pendingTextPoint = null;\n }\n\n /**\n * Confirm text annotation from modal\n */\n private confirmTextAnnotation(): void {\n if (!this.overlay || !this.pendingTextPoint) return;\n const input = this.overlay.querySelector('#triagly-text-input') as HTMLInputElement;\n const text = input?.value.trim();\n if (text) {\n this.annotations.push({\n type: 'text',\n color: this.currentColor,\n strokeWidth: this.strokeWidth,\n points: [this.pendingTextPoint],\n text,\n });\n this.render();\n }\n this.hideTextModal();\n }\n\n /**\n * Handle mouse move - continue drawing\n */\n private handleMouseMove(e: MouseEvent): void {\n if (!this.isDrawing || !this.currentAnnotation) return;\n\n const point = this.getCanvasPoint(e);\n\n if (this.currentTool === 'freehand') {\n // Add point to path\n this.currentAnnotation.points.push(point);\n } else {\n // For highlight and arrow, just update the end point\n if (this.currentAnnotation.points.length === 1) {\n this.currentAnnotation.points.push(point);\n } else {\n this.currentAnnotation.points[1] = point;\n }\n }\n\n this.render();\n }\n\n /**\n * Handle mouse up - finish drawing\n */\n private handleMouseUp(): void {\n if (this.isDrawing && this.currentAnnotation && this.currentAnnotation.points.length > 1) {\n this.annotations.push(this.currentAnnotation);\n }\n this.isDrawing = false;\n this.currentAnnotation = null;\n this.render();\n }\n\n /**\n * Render the canvas with image and annotations\n */\n private render(): void {\n if (!this.ctx || !this.canvas || !this.image) return;\n\n // Clear canvas\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n // Draw the image\n this.ctx.drawImage(this.image, 0, 0, this.canvas.width, this.canvas.height);\n\n // Draw all annotations\n for (const annotation of this.annotations) {\n this.drawAnnotation(annotation);\n }\n\n // Draw current annotation being made\n if (this.currentAnnotation) {\n this.drawAnnotation(this.currentAnnotation);\n }\n }\n\n /**\n * Draw a single annotation\n */\n private drawAnnotation(annotation: Annotation): void {\n if (!this.ctx) return;\n\n this.ctx.strokeStyle = annotation.color;\n this.ctx.fillStyle = annotation.color;\n this.ctx.lineWidth = annotation.strokeWidth;\n this.ctx.lineCap = 'round';\n this.ctx.lineJoin = 'round';\n\n switch (annotation.type) {\n case 'highlight':\n this.drawHighlight(annotation);\n break;\n case 'arrow':\n this.drawArrow(annotation);\n break;\n case 'freehand':\n this.drawFreehand(annotation);\n break;\n case 'text':\n this.drawText(annotation);\n break;\n }\n }\n\n /**\n * Draw a semi-transparent highlight rectangle\n */\n private drawHighlight(annotation: Annotation): void {\n if (!this.ctx || annotation.points.length < 2) return;\n\n const [start, end] = annotation.points;\n const width = end.x - start.x;\n const height = end.y - start.y;\n\n // Semi-transparent fill\n this.ctx.globalAlpha = 0.3;\n this.ctx.fillRect(start.x, start.y, width, height);\n\n // Solid border\n this.ctx.globalAlpha = 1;\n this.ctx.strokeRect(start.x, start.y, width, height);\n }\n\n /**\n * Draw an arrow from start to end\n */\n private drawArrow(annotation: Annotation): void {\n if (!this.ctx || annotation.points.length < 2) return;\n\n const [start, end] = annotation.points;\n const headLength = 15;\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Draw the line\n this.ctx.beginPath();\n this.ctx.moveTo(start.x, start.y);\n this.ctx.lineTo(end.x, end.y);\n this.ctx.stroke();\n\n // Draw the arrow head\n this.ctx.beginPath();\n this.ctx.moveTo(end.x, end.y);\n this.ctx.lineTo(\n end.x - headLength * Math.cos(angle - Math.PI / 6),\n end.y - headLength * Math.sin(angle - Math.PI / 6)\n );\n this.ctx.moveTo(end.x, end.y);\n this.ctx.lineTo(\n end.x - headLength * Math.cos(angle + Math.PI / 6),\n end.y - headLength * Math.sin(angle + Math.PI / 6)\n );\n this.ctx.stroke();\n }\n\n /**\n * Draw a freehand path\n */\n private drawFreehand(annotation: Annotation): void {\n if (!this.ctx || annotation.points.length < 2) return;\n\n this.ctx.beginPath();\n this.ctx.moveTo(annotation.points[0].x, annotation.points[0].y);\n\n for (let i = 1; i < annotation.points.length; i++) {\n this.ctx.lineTo(annotation.points[i].x, annotation.points[i].y);\n }\n\n this.ctx.stroke();\n }\n\n /**\n * Draw text annotation\n */\n private drawText(annotation: Annotation): void {\n if (!this.ctx || !annotation.text || annotation.points.length < 1) return;\n\n const point = annotation.points[0];\n\n // Text settings\n this.ctx.font = 'bold 16px sans-serif';\n this.ctx.textBaseline = 'top';\n\n // Measure text for background\n const metrics = this.ctx.measureText(annotation.text);\n const padding = 4;\n\n // Draw background\n this.ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';\n this.ctx.fillRect(\n point.x - padding,\n point.y - padding,\n metrics.width + padding * 2,\n 20 + padding * 2\n );\n\n // Draw text\n this.ctx.fillStyle = '#ffffff';\n this.ctx.fillText(annotation.text, point.x, point.y);\n }\n\n /**\n * Close the editor\n */\n private close(cancelled: boolean): void {\n // Clean up event listeners\n document.removeEventListener('keydown', this.handleKeyDown);\n this.removeCanvasEventListeners();\n\n if (cancelled) {\n this.onCancel();\n } else {\n // Generate final annotated image\n const annotatedImage = this.renderFinalImage();\n this.onComplete(annotatedImage);\n }\n\n // Remove overlay\n if (this.overlay) {\n this.overlay.remove();\n this.overlay = null;\n }\n }\n\n /**\n * Render the final annotated image at full resolution\n */\n private renderFinalImage(): string {\n if (!this.image) return this.imageData;\n\n // Create a full-resolution canvas\n const canvas = document.createElement('canvas');\n canvas.width = this.image.width;\n canvas.height = this.image.height;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return this.imageData;\n\n // Draw original image\n ctx.drawImage(this.image, 0, 0);\n\n // Calculate scale factor\n const scaleFactor = 1 / this.scale;\n\n // Draw annotations at full resolution\n for (const annotation of this.annotations) {\n ctx.strokeStyle = annotation.color;\n ctx.fillStyle = annotation.color;\n ctx.lineWidth = annotation.strokeWidth * scaleFactor;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n // Scale points\n const scaledPoints = annotation.points.map((p) => ({\n x: p.x * scaleFactor,\n y: p.y * scaleFactor,\n }));\n\n const scaledAnnotation = { ...annotation, points: scaledPoints };\n\n switch (annotation.type) {\n case 'highlight':\n this.drawHighlightOnCtx(ctx, scaledAnnotation);\n break;\n case 'arrow':\n this.drawArrowOnCtx(ctx, scaledAnnotation, scaleFactor);\n break;\n case 'freehand':\n this.drawFreehandOnCtx(ctx, scaledAnnotation);\n break;\n case 'text':\n this.drawTextOnCtx(ctx, scaledAnnotation, scaleFactor);\n break;\n }\n }\n\n return canvas.toDataURL('image/jpeg', 0.9);\n }\n\n private drawHighlightOnCtx(ctx: CanvasRenderingContext2D, annotation: Annotation): void {\n if (annotation.points.length < 2) return;\n const [start, end] = annotation.points;\n const width = end.x - start.x;\n const height = end.y - start.y;\n ctx.globalAlpha = 0.3;\n ctx.fillRect(start.x, start.y, width, height);\n ctx.globalAlpha = 1;\n ctx.strokeRect(start.x, start.y, width, height);\n }\n\n private drawArrowOnCtx(ctx: CanvasRenderingContext2D, annotation: Annotation, scaleFactor: number): void {\n if (annotation.points.length < 2) return;\n const [start, end] = annotation.points;\n const headLength = 15 * scaleFactor;\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n ctx.beginPath();\n ctx.moveTo(start.x, start.y);\n ctx.lineTo(end.x, end.y);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(end.x, end.y);\n ctx.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 6), end.y - headLength * Math.sin(angle - Math.PI / 6));\n ctx.moveTo(end.x, end.y);\n ctx.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 6), end.y - headLength * Math.sin(angle + Math.PI / 6));\n ctx.stroke();\n }\n\n private drawFreehandOnCtx(ctx: CanvasRenderingContext2D, annotation: Annotation): void {\n if (annotation.points.length < 2) return;\n ctx.beginPath();\n ctx.moveTo(annotation.points[0].x, annotation.points[0].y);\n for (let i = 1; i < annotation.points.length; i++) {\n ctx.lineTo(annotation.points[i].x, annotation.points[i].y);\n }\n ctx.stroke();\n }\n\n private drawTextOnCtx(ctx: CanvasRenderingContext2D, annotation: Annotation, scaleFactor: number): void {\n if (!annotation.text || annotation.points.length < 1) return;\n const point = annotation.points[0];\n const fontSize = 16 * scaleFactor;\n ctx.font = `bold ${fontSize}px sans-serif`;\n ctx.textBaseline = 'top';\n const metrics = ctx.measureText(annotation.text);\n const padding = 4 * scaleFactor;\n ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';\n ctx.fillRect(point.x - padding, point.y - padding, metrics.width + padding * 2, fontSize * 1.2 + padding * 2);\n ctx.fillStyle = '#ffffff';\n ctx.fillText(annotation.text, point.x, point.y);\n }\n\n /**\n * Inject annotation editor styles\n */\n private injectStyles(): void {\n const styleId = 'triagly-annotation-styles';\n if (document.getElementById(styleId)) return;\n\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n .triagly-annotation-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 2000000;\n background: rgba(0, 0, 0, 0.9);\n display: flex;\n flex-direction: column;\n }\n\n .triagly-annotation-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: #1a1a1a;\n border-bottom: 1px solid #333;\n }\n\n .triagly-annotation-tools {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .triagly-tool-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 8px;\n background: #333;\n color: #fff;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .triagly-tool-btn:hover {\n background: #444;\n }\n\n .triagly-tool-btn.active {\n background: #0066cc;\n }\n\n .triagly-tool-divider {\n width: 1px;\n height: 24px;\n background: #444;\n margin: 0 8px;\n }\n\n .triagly-color-picker {\n width: 40px;\n height: 40px;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n padding: 0;\n background: none;\n }\n\n .triagly-color-picker::-webkit-color-swatch-wrapper {\n padding: 4px;\n }\n\n .triagly-color-picker::-webkit-color-swatch {\n border: none;\n border-radius: 4px;\n }\n\n .triagly-annotation-actions {\n display: flex;\n gap: 8px;\n }\n\n .triagly-annotation-btn {\n padding: 8px 16px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .triagly-btn-clear {\n background: transparent;\n color: #999;\n border: 1px solid #444;\n }\n\n .triagly-btn-clear:hover {\n background: #333;\n color: #fff;\n }\n\n .triagly-btn-cancel {\n background: #333;\n color: #fff;\n }\n\n .triagly-btn-cancel:hover {\n background: #444;\n }\n\n .triagly-btn-done {\n background: #0066cc;\n color: #fff;\n }\n\n .triagly-btn-done:hover {\n background: #0055aa;\n }\n\n .triagly-annotation-canvas-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 20px;\n }\n\n .triagly-annotation-canvas {\n cursor: crosshair;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);\n border-radius: 4px;\n }\n\n .triagly-text-modal {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000000;\n }\n\n .triagly-text-modal-content {\n background: #1a1a1a;\n border-radius: 12px;\n padding: 24px;\n min-width: 320px;\n max-width: 400px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n }\n\n .triagly-text-modal-content h3 {\n color: #fff;\n font-size: 16px;\n font-weight: 600;\n margin: 0 0 16px 0;\n }\n\n .triagly-text-modal-content input {\n width: 100%;\n padding: 12px;\n border: 1px solid #444;\n border-radius: 8px;\n background: #2a2a2a;\n color: #fff;\n font-size: 14px;\n outline: none;\n box-sizing: border-box;\n }\n\n .triagly-text-modal-content input:focus {\n border-color: #0066cc;\n }\n\n .triagly-text-modal-content input::placeholder {\n color: #666;\n }\n\n .triagly-text-modal-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 16px;\n }\n `;\n\n document.head.appendChild(style);\n }\n}\n","// Feedback Widget UI\n\nimport { TriaglyConfig } from './types';\nimport { AnnotationEditor } from './annotation';\n\nexport class FeedbackWidget {\n private config: TriaglyConfig;\n private container: HTMLElement | null = null;\n private isOpen: boolean = false;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusableElements: HTMLElement[] = [];\n private screenshotDataUrl: string | null = null;\n private themeMediaQuery: MediaQueryList | null = null;\n\n constructor(config: TriaglyConfig) {\n this.config = config;\n }\n\n /**\n * Get the resolved theme (resolves 'auto' to actual theme)\n */\n private getResolvedTheme(): 'light' | 'dark' {\n const theme = this.config.theme || 'auto';\n if (theme === 'auto') {\n // Check system preference\n if (typeof window !== 'undefined' && window.matchMedia) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n return 'light';\n }\n return theme;\n }\n\n /**\n * Update button theme based on current resolved theme\n */\n private updateButtonTheme = (): void => {\n const button = document.getElementById('triagly-button');\n if (!button) return;\n\n const newTheme = this.getResolvedTheme();\n // Remove old theme class and add new one\n button.classList.remove('triagly-theme-light', 'triagly-theme-dark');\n button.classList.add(`triagly-theme-${newTheme}`);\n };\n\n /**\n * Setup listener for system theme changes (when using 'auto' theme)\n */\n private setupThemeListener(): void {\n // Only setup listener if theme is 'auto'\n const theme = this.config.theme || 'auto';\n if (theme !== 'auto') {\n return;\n }\n\n if (typeof window !== 'undefined' && window.matchMedia) {\n this.themeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n // Use addListener for older browsers, addEventListener for modern ones\n if (this.themeMediaQuery.addEventListener) {\n this.themeMediaQuery.addEventListener('change', this.updateButtonTheme);\n } else if ((this.themeMediaQuery as any).addListener) {\n (this.themeMediaQuery as any).addListener(this.updateButtonTheme);\n }\n }\n }\n\n /**\n * Initialize the widget\n */\n init(): void {\n this.createButton();\n this.injectStyles();\n this.setupThemeListener();\n // Load Turnstile script if configured\n if (this.config.turnstileSiteKey) {\n this.loadTurnstileScript();\n }\n }\n\n /**\n * Load Cloudflare Turnstile script dynamically\n */\n private loadTurnstileScript(): void {\n // Check if already loaded\n if ((window as any).turnstile || document.querySelector('script[src*=\"turnstile\"]')) {\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';\n script.async = true;\n script.defer = true;\n document.head.appendChild(script);\n }\n\n /**\n * Create the feedback button\n */\n private createButton(): void {\n const button = document.createElement('button');\n button.id = 'triagly-button';\n button.className = 'triagly-button';\n\n // Apply theme class\n const theme = this.getResolvedTheme();\n button.classList.add(`triagly-theme-${theme}`);\n \n // Button shape\n const shape = this.config.buttonShape || 'rounded';\n button.classList.add(`triagly-shape-${shape}`);\n \n // Button orientation\n const orientation = this.config.orientation || 'horizontal';\n button.classList.add(`triagly-orientation-${orientation}`);\n \n // Speech bubble SVG icon\n const speechBubbleIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"triagly-icon\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"/></svg>`;\n const largeIcon = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"currentColor\" class=\"triagly-icon\"><path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"/></svg>`;\n\n // Handle button text based on shape\n const fullText = this.config.buttonText || 'Feedback';\n if (shape === 'circular') {\n button.innerHTML = largeIcon;\n button.setAttribute('aria-label', fullText);\n } else if (shape === 'expandable') {\n // Expandable starts with icon, expands to full text on hover\n button.innerHTML = `<span class=\"triagly-btn-icon\">${largeIcon}</span><span class=\"triagly-btn-text\"> ${this.config.buttonText || 'Feedback'}</span>`;\n button.setAttribute('aria-label', fullText);\n } else {\n // Default: icon + text\n button.innerHTML = `${speechBubbleIcon}<span class=\"triagly-btn-label\">${fullText}</span>`;\n }\n \n button.onclick = () => this.toggle();\n\n // Position button\n const position = this.config.position || 'bottom-right';\n button.classList.add(`triagly-${position}`);\n\n // For expandable buttons, set expansion direction based on position\n if (shape === 'expandable') {\n if (position.includes('right')) {\n button.classList.add('triagly-expand-left');\n } else if (position.includes('left')) {\n button.classList.add('triagly-expand-right');\n }\n }\n\n // Apply custom offsets if provided\n if (this.config.offsetX) {\n if (position.includes('right')) {\n button.style.right = this.config.offsetX;\n } else if (position.includes('left')) {\n button.style.left = this.config.offsetX;\n }\n }\n if (this.config.offsetY) {\n if (position.includes('top')) {\n button.style.top = this.config.offsetY;\n } else if (position.includes('bottom')) {\n button.style.bottom = this.config.offsetY;\n }\n }\n\n document.body.appendChild(button);\n }\n\n /**\n * Toggle widget visibility\n */\n toggle(): void {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Open the widget\n */\n open(): void {\n if (this.isOpen) return;\n\n // Store currently focused element to restore later\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n this.container = this.createContainer();\n document.body.appendChild(this.container);\n this.isOpen = true;\n\n // Call onOpen callback\n if (this.config.onOpen) {\n this.config.onOpen();\n }\n\n // Set up keyboard and focus after DOM is ready\n setTimeout(() => {\n // Set up keyboard event listener\n this.setupKeyboardEvents();\n\n // Set up focus trap\n this.setupFocusTrap();\n\n // Focus on description field\n const descInput = this.container?.querySelector('#triagly-description') as HTMLTextAreaElement;\n descInput?.focus();\n }, 0);\n }\n\n /**\n * Close the widget\n */\n close(reason?: 'cancel' | 'dismiss' | 'overlay' | 'programmatic'): void {\n if (!this.isOpen || !this.container) return;\n\n // Clean up tab handler (must match capture phase used when adding)\n const tabHandler = (this.container as any)._tabHandler;\n if (tabHandler) {\n document.removeEventListener('keydown', tabHandler, true);\n }\n\n this.container.remove();\n this.container = null;\n this.isOpen = false;\n this.screenshotDataUrl = null;\n\n // Restore focus to previously focused element\n if (this.previouslyFocusedElement) {\n this.previouslyFocusedElement.focus();\n this.previouslyFocusedElement = null;\n }\n\n // Call specific callbacks based on reason\n if (reason === 'cancel' && this.config.onCancel) {\n this.config.onCancel();\n } else if (reason === 'dismiss' && this.config.onDismiss) {\n this.config.onDismiss();\n } else if (reason === 'overlay' && this.config.onOverlayClick) {\n this.config.onOverlayClick();\n }\n\n // Always call general onClose callback (backward compatible)\n if (this.config.onClose) {\n this.config.onClose();\n }\n }\n\n /**\n * Create the widget container\n */\n private createContainer(): HTMLElement {\n const overlay = document.createElement('div');\n overlay.className = 'triagly-overlay';\n overlay.setAttribute('role', 'dialog');\n overlay.setAttribute('aria-modal', 'true');\n overlay.setAttribute('aria-label', 'Send feedback');\n overlay.onclick = (e) => {\n if (e.target === overlay) this.close('overlay');\n };\n\n const modal = document.createElement('div');\n modal.className = 'triagly-modal';\n modal.setAttribute('role', 'document');\n\n const header = document.createElement('div');\n header.className = 'triagly-header';\n header.innerHTML = `\n <button type=\"button\" class=\"triagly-close\" aria-label=\"Close feedback form\">×</button>\n `;\n\n const closeBtn = header.querySelector('.triagly-close');\n closeBtn?.addEventListener('click', () => this.close('dismiss'));\n\n const form = document.createElement('form');\n form.className = 'triagly-form';\n form.innerHTML = `\n <div class=\"triagly-field\">\n <label for=\"triagly-description\">What's on your mind?</label>\n <textarea\n id=\"triagly-description\"\n required\n rows=\"5\"\n placeholder=\"${this.config.placeholderText || 'Describe what happened...'}\"\n ></textarea>\n </div>\n\n <div class=\"triagly-field\">\n <label for=\"triagly-name\">Name (optional)</label>\n <input\n type=\"text\"\n id=\"triagly-name\"\n placeholder=\"Your name\"\n />\n </div>\n\n <div class=\"triagly-field\">\n <label for=\"triagly-email\">Email (optional)</label>\n <input\n type=\"email\"\n id=\"triagly-email\"\n placeholder=\"your@email.com\"\n />\n </div>\n\n ${this.config.enableScreenshot ? `\n <div class=\"triagly-field triagly-screenshot-field\">\n <label>Screenshot (optional)</label>\n <input type=\"file\" id=\"triagly-screenshot-input\" accept=\"image/*\" style=\"display: none;\" />\n <div class=\"triagly-screenshot-controls\" id=\"triagly-screenshot-controls\">\n <button type=\"button\" class=\"triagly-btn-upload\" id=\"triagly-upload-btn\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n ${this.config.screenshotButtonText || 'Upload Screenshot'}\n </button>\n </div>\n <div class=\"triagly-screenshot-error\" id=\"triagly-screenshot-error\" style=\"display: none;\" role=\"alert\"></div>\n <div class=\"triagly-screenshot-preview\" id=\"triagly-screenshot-preview\" style=\"display: none;\">\n <img id=\"triagly-screenshot-img\" alt=\"Screenshot preview\" />\n <div class=\"triagly-screenshot-actions\">\n ${this.config.enableAnnotation !== false ? `\n <button type=\"button\" class=\"triagly-btn-icon\" id=\"triagly-annotate-btn\" title=\"Add annotations\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 19l7-7 3 3-7 7-3-3z\"/>\n <path d=\"M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z\"/>\n </svg>\n </button>\n ` : ''}\n <button type=\"button\" class=\"triagly-btn-icon\" id=\"triagly-change-screenshot-btn\" title=\"Upload different screenshot\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/>\n <polyline points=\"17 8 12 3 7 8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"/>\n </svg>\n </button>\n <button type=\"button\" class=\"triagly-btn-icon triagly-btn-danger\" id=\"triagly-remove-screenshot-btn\" title=\"Remove screenshot\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>\n ` : ''}\n\n ${this.config.turnstileSiteKey ? `\n <div class=\"triagly-field triagly-turnstile\">\n <div class=\"cf-turnstile\" data-sitekey=\"${this.config.turnstileSiteKey}\" data-theme=\"light\"></div>\n </div>\n ` : ''}\n\n <div class=\"triagly-actions\">\n <button type=\"button\" class=\"triagly-btn-secondary\" id=\"triagly-cancel\" aria-label=\"Cancel and close feedback form\">\n Cancel\n </button>\n <button type=\"submit\" class=\"triagly-btn-primary\" aria-label=\"Submit feedback\">\n Send Feedback\n </button>\n </div>\n\n <div class=\"triagly-status\" id=\"triagly-status\" role=\"status\" aria-live=\"polite\"></div>\n `;\n\n const cancelBtn = form.querySelector('#triagly-cancel');\n cancelBtn?.addEventListener('click', () => this.close('cancel'));\n\n form.onsubmit = (e) => {\n e.preventDefault();\n this.handleSubmit(form);\n };\n\n // Set up screenshot event handlers\n if (this.config.enableScreenshot) {\n this.setupScreenshotHandlers(form);\n }\n\n const footer = document.createElement('div');\n footer.className = 'triagly-footer';\n footer.innerHTML = `\n <a href=\"https://triagly.com\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"triagly-branding\">\n Powered by <strong>Triagly</strong>\n </a>\n `;\n\n modal.appendChild(header);\n modal.appendChild(form);\n modal.appendChild(footer);\n overlay.appendChild(modal);\n\n // Render Turnstile widget if available\n if (this.config.turnstileSiteKey) {\n setTimeout(() => {\n this.renderTurnstileWidget(form);\n }, 100);\n }\n\n return overlay;\n }\n\n /**\n * Render Cloudflare Turnstile widget\n */\n private renderTurnstileWidget(form: HTMLFormElement): void {\n const turnstileContainer = form.querySelector('.cf-turnstile');\n if (!turnstileContainer) return;\n\n // Check if Turnstile script is loaded\n if (!(window as any).turnstile) {\n console.warn('Triagly: Turnstile script not loaded. Please include: <script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async defer></script>');\n return;\n }\n\n try {\n const widgetId = (window as any).turnstile.render(turnstileContainer, {\n sitekey: this.config.turnstileSiteKey,\n theme: this.config.theme === 'dark' ? 'dark' : 'light',\n callback: (token: string) => {\n // Store token in a data attribute for easy retrieval\n turnstileContainer.setAttribute('data-turnstile-response', token);\n turnstileContainer.setAttribute('data-widget-id', widgetId);\n },\n 'error-callback': () => {\n console.error('Triagly: Turnstile widget error');\n },\n 'expired-callback': () => {\n // Clear stored token when it expires\n turnstileContainer.removeAttribute('data-turnstile-response');\n },\n });\n\n turnstileContainer.setAttribute('data-widget-id', widgetId);\n } catch (error) {\n console.error('Triagly: Failed to render Turnstile widget:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n /**\n * Set up screenshot upload event handlers\n */\n private setupScreenshotHandlers(form: HTMLFormElement): void {\n const fileInput = form.querySelector('#triagly-screenshot-input') as HTMLInputElement;\n const uploadBtn = form.querySelector('#triagly-upload-btn');\n const annotateBtn = form.querySelector('#triagly-annotate-btn');\n const changeBtn = form.querySelector('#triagly-change-screenshot-btn');\n const removeBtn = form.querySelector('#triagly-remove-screenshot-btn');\n const preview = form.querySelector('#triagly-screenshot-preview') as HTMLElement;\n const controls = form.querySelector('#triagly-screenshot-controls') as HTMLElement;\n const previewImg = form.querySelector('#triagly-screenshot-img') as HTMLImageElement;\n const errorDiv = form.querySelector('#triagly-screenshot-error') as HTMLElement;\n\n // Helper to show error message\n const showError = (message: string) => {\n if (errorDiv) {\n errorDiv.textContent = message;\n errorDiv.style.display = 'block';\n }\n };\n\n // Helper to hide error message\n const hideError = () => {\n if (errorDiv) {\n errorDiv.textContent = '';\n errorDiv.style.display = 'none';\n }\n };\n\n // Handle file selection\n const handleFileSelect = (file: File) => {\n // Clear any previous error\n hideError();\n\n // Validate file type\n if (!file.type.startsWith('image/')) {\n const errorMessage = 'Invalid file type. Please select an image.';\n showError(errorMessage);\n if (this.config.onScreenshotError) {\n this.config.onScreenshotError(new Error(errorMessage));\n }\n return;\n }\n\n // Validate file size (configurable, default 10MB)\n const maxSize = this.config.screenshotMaxFileSize ?? 10 * 1024 * 1024;\n if (file.size > maxSize) {\n const maxSizeMB = Math.round(maxSize / (1024 * 1024));\n const errorMessage = `File too large. Maximum size is ${maxSizeMB}MB.`;\n showError(errorMessage);\n if (this.config.onScreenshotError) {\n this.config.onScreenshotError(new Error(errorMessage));\n }\n return;\n }\n\n const reader = new FileReader();\n reader.onload = (e) => {\n const dataUrl = e.target?.result as string;\n this.screenshotDataUrl = dataUrl;\n\n // Update UI\n if (previewImg) previewImg.src = dataUrl;\n if (preview) preview.style.display = 'block';\n if (controls) controls.style.display = 'none';\n\n // Call callback if provided\n if (this.config.onScreenshotUpload) {\n this.config.onScreenshotUpload(dataUrl);\n }\n };\n\n reader.onerror = () => {\n const errorMessage = 'Failed to read file. Please try again.';\n showError(errorMessage);\n if (this.config.onScreenshotError) {\n this.config.onScreenshotError(new Error(errorMessage));\n }\n };\n\n reader.readAsDataURL(file);\n };\n\n // File input change handler\n fileInput?.addEventListener('change', () => {\n const file = fileInput.files?.[0];\n if (file) {\n handleFileSelect(file);\n }\n // Reset input so same file can be selected again\n fileInput.value = '';\n });\n\n // Upload button triggers file input\n uploadBtn?.addEventListener('click', () => {\n hideError();\n fileInput?.click();\n });\n\n // Change screenshot - trigger file input again\n changeBtn?.addEventListener('click', () => {\n hideError();\n fileInput?.click();\n });\n\n // Annotate screenshot\n annotateBtn?.addEventListener('click', () => {\n if (!this.screenshotDataUrl) return;\n\n const editor = new AnnotationEditor(\n this.screenshotDataUrl,\n (annotatedImage) => {\n this.screenshotDataUrl = annotatedImage;\n if (previewImg) previewImg.src = annotatedImage;\n },\n () => {\n // Cancelled - do nothing\n }\n );\n editor.open();\n });\n\n // Remove screenshot\n removeBtn?.addEventListener('click', () => {\n this.screenshotDataUrl = null;\n if (preview) preview.style.display = 'none';\n if (controls) controls.style.display = 'block';\n if (previewImg) previewImg.src = '';\n });\n }\n\n /**\n * Handle form submission\n */\n private async handleSubmit(form: HTMLFormElement): Promise<void> {\n const descInput = form.querySelector('#triagly-description') as HTMLTextAreaElement;\n const nameInput = form.querySelector('#triagly-name') as HTMLInputElement;\n const emailInput = form.querySelector('#triagly-email') as HTMLInputElement;\n const statusDiv = form.querySelector('#triagly-status') as HTMLDivElement;\n const submitBtn = form.querySelector('button[type=\"submit\"]') as HTMLButtonElement;\n const turnstileContainer = form.querySelector('.cf-turnstile');\n\n // Disable form\n submitBtn.disabled = true;\n submitBtn.textContent = 'Sending...';\n\n try {\n // Get Turnstile token if widget is present\n let turnstileToken: string | undefined;\n if (turnstileContainer) {\n turnstileToken = turnstileContainer.getAttribute('data-turnstile-response') || undefined;\n }\n\n const data = {\n description: descInput.value.trim(),\n reporterName: nameInput.value.trim() || undefined,\n reporterEmail: emailInput.value.trim() || undefined,\n turnstileToken,\n screenshot: this.screenshotDataUrl || undefined,\n };\n\n // Create a promise that waits for actual submission result\n const submissionPromise = new Promise<void>((resolve, reject) => {\n const handleSuccess = () => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n resolve();\n };\n\n const handleError = (e: Event) => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n reject((e as CustomEvent).detail);\n };\n\n document.addEventListener('triagly:success', handleSuccess, { once: true });\n document.addEventListener('triagly:error', handleError, { once: true });\n\n // Set a timeout in case events don't fire\n setTimeout(() => {\n document.removeEventListener('triagly:success', handleSuccess);\n document.removeEventListener('triagly:error', handleError);\n reject(new Error('Submission timeout'));\n }, 30000); // 30 second timeout\n });\n\n // Dispatch custom event for parent to handle\n const event = new CustomEvent('triagly:submit', {\n detail: data,\n bubbles: true,\n });\n document.dispatchEvent(event);\n\n // Wait for actual submission result\n await submissionPromise;\n\n // Show success\n statusDiv.className = 'triagly-status triagly-success';\n statusDiv.textContent = this.config.successMessage || 'Feedback sent successfully!';\n\n // Close after delay\n setTimeout(() => {\n this.close();\n }, 2000);\n } catch (error) {\n // Show error with actual error message\n statusDiv.className = 'triagly-status triagly-error';\n const errorMessage = error instanceof Error ? error.message :\n (this.config.errorMessage || 'Failed to send feedback. Please try again.');\n statusDiv.textContent = errorMessage;\n\n // Re-enable form\n submitBtn.disabled = false;\n submitBtn.textContent = 'Send Feedback';\n }\n }\n\n /**\n * Inject widget styles\n */\n private injectStyles(): void {\n if (document.getElementById('triagly-styles')) return;\n\n const style = document.createElement('style');\n style.id = 'triagly-styles';\n style.textContent = `\n .triagly-button {\n position: fixed;\n z-index: 999999;\n padding: 12px 20px;\n background: var(--triagly-button-bg, #18181b);\n color: var(--triagly-button-text, #ffffff);\n border: none;\n border-radius: var(--triagly-button-radius, 8px);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n box-shadow: var(--triagly-button-shadow, 0 4px 12px rgba(0, 0, 0, 0.15));\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n\n .triagly-button:hover {\n background: var(--triagly-button-bg-hover, #27272a);\n transform: translateY(-2px);\n box-shadow: var(--triagly-button-shadow-hover, 0 6px 16px rgba(0, 0, 0, 0.2));\n }\n\n /* Dark theme: white button with black text */\n .triagly-button.triagly-theme-dark {\n --triagly-button-bg: #ffffff;\n --triagly-button-text: #18181b;\n --triagly-button-bg-hover: #f4f4f5;\n --triagly-button-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);\n --triagly-button-shadow-hover: 0 6px 16px rgba(0, 0, 0, 0.35);\n }\n\n /* Light theme: dark button with white text (default) */\n .triagly-button.triagly-theme-light {\n --triagly-button-bg: #18181b;\n --triagly-button-text: #ffffff;\n --triagly-button-bg-hover: #27272a;\n --triagly-button-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n --triagly-button-shadow-hover: 0 6px 16px rgba(0, 0, 0, 0.2);\n }\n\n .triagly-button .triagly-icon {\n flex-shrink: 0;\n }\n\n .triagly-button .triagly-btn-label {\n line-height: 1;\n }\n\n /* Prevent expandable buttons from shifting on hover */\n .triagly-button.triagly-shape-expandable:hover {\n transform: translateY(0) !important;\n }\n\n .triagly-bottom-right { bottom: 20px; right: 20px; }\n .triagly-bottom-left { bottom: 20px; left: 20px; }\n .triagly-top-right { top: 20px; right: 20px; }\n .triagly-top-left { top: 20px; left: 20px; }\n\n /* Edge-aligned positions (0 offset from edges) */\n .triagly-edge-bottom-right { bottom: 0; right: 0; }\n .triagly-edge-bottom-left { bottom: 0; left: 0; }\n .triagly-edge-top-right { top: 0; right: 0; }\n .triagly-edge-top-left { top: 0; left: 0; }\n .triagly-edge-right { top: 50%; right: 0; transform: translateY(-50%); }\n .triagly-edge-left { top: 50%; left: 0; transform: translateY(-50%); }\n .triagly-edge-top { top: 0; left: 50%; transform: translateX(-50%); }\n .triagly-edge-bottom { bottom: 0; left: 50%; transform: translateX(-50%); }\n\n /* Button shapes */\n .triagly-shape-rounded {\n border-radius: var(--triagly-button-radius, 8px);\n }\n .triagly-shape-circular {\n border-radius: 50%;\n width: 60px;\n height: 60px;\n padding: 0;\n font-size: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .triagly-shape-square {\n border-radius: 0;\n }\n .triagly-shape-pill {\n border-radius: 30px;\n }\n .triagly-shape-expandable {\n border-radius: 50%;\n width: 60px;\n height: 60px;\n min-width: 60px;\n padding: 0;\n font-size: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n border-radius 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n padding 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n background 0.2s,\n box-shadow 0.2s;\n white-space: nowrap;\n }\n \n /* Expansion direction - expands left for right-positioned buttons */\n .triagly-shape-expandable.triagly-expand-left {\n flex-direction: row-reverse;\n }\n \n /* Expansion direction - expands right for left-positioned buttons */\n .triagly-shape-expandable.triagly-expand-right {\n flex-direction: row;\n }\n \n .triagly-shape-expandable .triagly-btn-icon {\n display: inline-block;\n flex-shrink: 0;\n transition: margin 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n .triagly-shape-expandable .triagly-btn-text {\n display: inline-block;\n width: 0;\n opacity: 0;\n overflow: hidden;\n font-size: 14px;\n font-weight: 500;\n transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1),\n opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* Hover state */\n .triagly-shape-expandable:hover {\n width: auto;\n min-width: auto;\n padding: 12px 20px;\n border-radius: 30px;\n background: var(--triagly-button-bg-hover);\n box-shadow: var(--triagly-button-shadow-hover);\n }\n .triagly-shape-expandable:hover .triagly-btn-text {\n width: auto;\n opacity: 1;\n }\n\n /* Button orientations */\n .triagly-orientation-horizontal {\n writing-mode: horizontal-tb;\n }\n .triagly-orientation-vertical {\n writing-mode: vertical-rl;\n text-orientation: mixed;\n }\n\n .triagly-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--triagly-overlay-bg, rgba(0, 0, 0, 0.5));\n z-index: 1000000;\n display: flex;\n align-items: center;\n justify-content: center;\n animation: triagly-fadeIn 0.2s;\n }\n\n @keyframes triagly-fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n .triagly-modal {\n background: var(--triagly-modal-bg, #ffffff);\n border-radius: var(--triagly-modal-radius, 12px);\n width: 90%;\n max-width: var(--triagly-modal-max-width, 500px);\n max-height: 90vh;\n overflow-y: auto;\n box-shadow: var(--triagly-modal-shadow, 0 20px 60px rgba(0, 0, 0, 0.3));\n animation: triagly-slideUp 0.3s;\n }\n\n @keyframes triagly-slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .triagly-header {\n display: flex;\n justify-content: flex-end;\n align-items: center;\n padding: 8px 12px 0;\n background: var(--triagly-header-bg, #ffffff);\n }\n\n .triagly-close {\n background: none;\n border: none;\n font-size: 28px;\n color: #6b7280;\n cursor: pointer;\n padding: 0;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s;\n }\n\n .triagly-close:hover {\n background: #f3f4f6;\n color: #111827;\n }\n\n .triagly-form {\n padding: 24px;\n background: var(--triagly-form-bg, #ffffff);\n }\n\n .triagly-field {\n margin-bottom: 16px;\n }\n\n .triagly-field label {\n display: block;\n margin-bottom: 6px;\n font-size: 14px;\n font-weight: 500;\n color: var(--triagly-label-text, #374151);\n }\n\n .triagly-field input,\n .triagly-field textarea {\n width: 100%;\n padding: 10px 12px;\n background: var(--triagly-input-bg, #ffffff);\n border: 1px solid var(--triagly-input-border, #d1d5db);\n border-radius: var(--triagly-input-radius, 6px);\n color: var(--triagly-input-text, #111827);\n font-size: 14px;\n font-family: inherit;\n transition: border-color 0.2s;\n box-sizing: border-box;\n }\n\n .triagly-field input:focus,\n .triagly-field textarea:focus {\n outline: none;\n background: var(--triagly-input-bg, #ffffff);\n border-color: var(--triagly-input-border-focus, #a1a1aa);\n box-shadow: 0 0 0 2px rgba(161, 161, 170, 0.15);\n }\n\n /* Focus visible styles for accessibility */\n .triagly-button:focus-visible,\n .triagly-field input:focus-visible,\n .triagly-field textarea:focus-visible,\n .triagly-btn-primary:focus-visible,\n .triagly-btn-secondary:focus-visible,\n .triagly-close:focus-visible {\n outline: 2px solid #a1a1aa;\n outline-offset: 2px;\n }\n\n .triagly-turnstile {\n display: flex;\n justify-content: center;\n margin: 8px 0;\n }\n\n .triagly-actions {\n display: flex;\n gap: 12px;\n margin-top: 24px;\n }\n\n .triagly-btn-primary,\n .triagly-btn-secondary {\n flex: 1;\n padding: 10px 16px;\n border-radius: var(--triagly-btn-radius, 6px);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n\n .triagly-btn-primary {\n background: var(--triagly-btn-primary-bg, #18181b);\n color: var(--triagly-btn-primary-text, #ffffff);\n }\n\n .triagly-btn-primary:hover:not(:disabled) {\n background: var(--triagly-btn-primary-bg-hover, #27272a);\n }\n\n .triagly-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .triagly-btn-secondary {\n background: var(--triagly-btn-secondary-bg, #f3f4f6);\n color: var(--triagly-btn-secondary-text, #374151);\n }\n\n .triagly-btn-secondary:hover {\n background: var(--triagly-btn-secondary-bg-hover, #e5e7eb);\n }\n\n .triagly-status {\n margin-top: 16px;\n padding: 12px;\n border-radius: 6px;\n font-size: 14px;\n display: none;\n }\n\n .triagly-status.triagly-success {\n display: block;\n background: var(--triagly-success-bg, #d1fae5);\n color: var(--triagly-success-text, #065f46);\n }\n\n .triagly-status.triagly-error {\n display: block;\n background: var(--triagly-error-bg, #fee2e2);\n color: var(--triagly-error-text, #991b1b);\n }\n\n .triagly-footer {\n padding: 12px 24px 16px;\n text-align: right;\n border-top: 1px solid var(--triagly-footer-border, #e5e7eb);\n background: var(--triagly-footer-bg, #f9fafb);\n border-radius: 0 0 var(--triagly-modal-radius, 12px) var(--triagly-modal-radius, 12px);\n }\n\n .triagly-branding {\n font-size: 12px;\n color: var(--triagly-footer-text, #6b7280);\n text-decoration: none;\n transition: color 0.2s;\n }\n\n .triagly-branding:hover {\n color: var(--triagly-footer-text-hover, #18181b);\n }\n\n .triagly-branding strong {\n font-weight: 600;\n }\n\n /* Screenshot styles */\n .triagly-screenshot-field {\n margin-bottom: 16px;\n }\n\n .triagly-screenshot-controls {\n display: flex;\n gap: 8px;\n }\n\n .triagly-btn-upload {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: var(--triagly-btn-secondary-bg, #f3f4f6);\n color: var(--triagly-btn-secondary-text, #374151);\n border: 1px dashed var(--triagly-input-border, #d1d5db);\n border-radius: var(--triagly-input-radius, 6px);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n width: 100%;\n justify-content: center;\n }\n\n .triagly-btn-upload:hover:not(:disabled) {\n background: var(--triagly-btn-secondary-bg-hover, #e5e7eb);\n border-style: solid;\n }\n\n .triagly-btn-upload:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n }\n\n .triagly-screenshot-error {\n margin-top: 8px;\n padding: 8px 12px;\n background: var(--triagly-error-bg, #fee2e2);\n color: var(--triagly-error-text, #991b1b);\n border-radius: var(--triagly-input-radius, 6px);\n font-size: 13px;\n }\n\n .triagly-screenshot-preview {\n position: relative;\n border-radius: var(--triagly-input-radius, 6px);\n overflow: hidden;\n border: 1px solid var(--triagly-input-border, #d1d5db);\n background: var(--triagly-input-bg, #ffffff);\n }\n\n .triagly-screenshot-preview img {\n display: block;\n width: 100%;\n max-height: 200px;\n object-fit: contain;\n background: #f9fafb;\n }\n\n .triagly-screenshot-actions {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n gap: 4px;\n }\n\n .triagly-btn-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: rgba(255, 255, 255, 0.9);\n border: 1px solid var(--triagly-input-border, #d1d5db);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n color: #374151;\n }\n\n .triagly-btn-icon:hover {\n background: #ffffff;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .triagly-btn-icon.triagly-btn-danger:hover {\n background: #fee2e2;\n border-color: #fca5a5;\n color: #dc2626;\n }\n\n @keyframes triagly-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n\n .triagly-spin {\n animation: triagly-spin 1s linear infinite;\n }\n `;\n\n document.head.appendChild(style);\n }\n\n /**\n * Set up keyboard event handlers\n */\n private setupKeyboardEvents(): void {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Close on Escape key\n if (e.key === 'Escape' && this.isOpen) {\n e.preventDefault();\n this.close('dismiss');\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n \n // Store handler for cleanup\n if (this.container) {\n (this.container as any)._keydownHandler = handleKeyDown;\n }\n }\n\n /**\n * Set up focus trap to keep focus within modal\n */\n private setupFocusTrap(): void {\n if (!this.container) return;\n\n // Get all focusable elements\n const modal = this.container.querySelector('.triagly-modal');\n if (!modal) return;\n\n const focusableSelector =\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])';\n this.focusableElements = Array.from(\n modal.querySelectorAll(focusableSelector)\n ) as HTMLElement[];\n\n if (this.focusableElements.length === 0) {\n console.warn('Triagly: No focusable elements found in modal');\n return;\n }\n\n // Handle Tab key to trap focus - must prevent default BEFORE focus moves\n const handleTab = (e: Event) => {\n const keyEvent = e as KeyboardEvent;\n if (keyEvent.key !== 'Tab') return;\n\n // Only handle if focus is within our modal\n if (!this.container?.contains(document.activeElement)) return;\n\n const firstFocusable = this.focusableElements[0];\n const lastFocusable = this.focusableElements[this.focusableElements.length - 1];\n\n if (keyEvent.shiftKey) {\n // Shift + Tab - moving backwards\n if (document.activeElement === firstFocusable) {\n keyEvent.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n // Tab - moving forwards\n if (document.activeElement === lastFocusable) {\n keyEvent.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n // Use capture phase to intercept Tab before browser handles it\n document.addEventListener('keydown', handleTab as EventListener, true);\n (this.container as any)._tabHandler = handleTab;\n }\n\n /**\n * Destroy the widget\n */\n destroy(): void {\n // Clean up event listeners\n if (this.container) {\n const keydownHandler = (this.container as any)._keydownHandler;\n if (keydownHandler) {\n document.removeEventListener('keydown', keydownHandler);\n }\n\n const tabHandler = (this.container as any)._tabHandler;\n if (tabHandler) {\n document.removeEventListener('keydown', tabHandler, true);\n }\n }\n\n // Clean up theme listener\n if (this.themeMediaQuery) {\n if (this.themeMediaQuery.removeEventListener) {\n this.themeMediaQuery.removeEventListener('change', this.updateButtonTheme);\n } else if ((this.themeMediaQuery as any).removeListener) {\n (this.themeMediaQuery as any).removeListener(this.updateButtonTheme);\n }\n this.themeMediaQuery = null;\n }\n\n this.close();\n document.getElementById('triagly-button')?.remove();\n document.getElementById('triagly-styles')?.remove();\n }\n}\n","// API Client\n\nimport {\n FeedbackData,\n FeedbackMetadata,\n FeedbackResponse,\n} from './types';\n\nconst API_URLS = {\n production: 'https://iipkklhhafrjesryscjh.supabase.co/functions/v1',\n staging: 'https://bssghvinezdawvupcyci.supabase.co/functions/v1',\n} as const;\n\nexport type Environment = 'production' | 'staging';\n\nexport class TriaglyAPI {\n private apiUrl: string;\n private publishableKey: string;\n private getToken?: () => Promise<string>;\n private turnstileSiteKey: string;\n\n // Triagly's public Turnstile site key (safe to hardcode - client-side only)\n private static readonly DEFAULT_TURNSTILE_SITE_KEY = '0x4AAAAAAB8Dc-Fl964Vp1Nn';\n\n constructor(\n publishableKey: string,\n environment: Environment = 'production',\n apiUrl?: string,\n getToken?: () => Promise<string>,\n turnstileSiteKey?: string\n ) {\n // apiUrl override takes precedence, then environment-based URL\n this.apiUrl = (apiUrl || API_URLS[environment]).replace(/\\/$/, ''); // Remove trailing slash\n this.publishableKey = publishableKey;\n this.getToken = getToken;\n // Always use Triagly's Turnstile site key (can be overridden for testing)\n this.turnstileSiteKey = turnstileSiteKey || TriaglyAPI.DEFAULT_TURNSTILE_SITE_KEY;\n }\n\n /**\n * Get the Turnstile site key\n */\n getTurnstileSiteKey(): string {\n return this.turnstileSiteKey;\n }\n\n /**\n * Get Turnstile token from widget if available\n */\n private async getTurnstileToken(): Promise<string | null> {\n // Check if Turnstile widget is available\n const turnstileWidget = document.querySelector('[data-turnstile-response]');\n if (turnstileWidget) {\n const token = turnstileWidget.getAttribute('data-turnstile-response');\n if (token) return token;\n }\n\n // Check if window.turnstile is available\n if ((window as any).turnstile) {\n try {\n // Get the first widget's response\n const widgets = document.querySelectorAll('.cf-turnstile');\n if (widgets.length > 0) {\n const widgetId = widgets[0].getAttribute('data-widget-id');\n if (widgetId) {\n const token = (window as any).turnstile.getResponse(widgetId);\n if (token) return token;\n }\n }\n } catch (error) {\n console.warn('Failed to get Turnstile token:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n return null;\n }\n\n /**\n * Submit feedback with new authentication\n */\n async submitFeedback(\n data: FeedbackData,\n metadata: FeedbackMetadata,\n turnstileToken?: string\n ): Promise<FeedbackResponse> {\n // Get Turnstile token if not provided\n if (!turnstileToken) {\n turnstileToken = await this.getTurnstileToken() || undefined;\n }\n\n // Only require Turnstile if configured\n if (this.turnstileSiteKey && !turnstileToken) {\n throw new Error('Turnstile verification required. Please complete the captcha.');\n }\n\n // Get hardened token if callback is provided\n let hardenedToken: string | undefined;\n if (this.getToken) {\n try {\n hardenedToken = await this.getToken();\n } catch (error) {\n console.error('Failed to get hardened token:', error instanceof Error ? error.message : 'Unknown error');\n throw new Error('Failed to authenticate. Please try again.');\n }\n }\n\n const payload = {\n publishableKey: this.publishableKey,\n title: data.title,\n description: data.description,\n metadata: {\n ...metadata,\n consoleLogs: data.consoleLogs,\n },\n tags: data.tags,\n reporterEmail: data.reporterEmail,\n reporterName: data.reporterName,\n screenshot: data.screenshot,\n turnstileToken,\n hardenedToken,\n };\n\n const response = await fetch(`${this.apiUrl}/feedback`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error', message: 'Unknown error' }));\n\n // Handle specific error types with user-friendly messages\n if (response.status === 401) {\n if (error.error === 'invalid_publishable_key') {\n throw new Error('Invalid API key. Please contact support.');\n } else if (error.error === 'token_required') {\n throw new Error('Authentication required. Please refresh and try again.');\n }\n throw new Error(error.message || 'Authentication failed');\n } else if (response.status === 403) {\n if (error.error === 'origin_not_allowed') {\n throw new Error('This website is not authorized to submit feedback.');\n }\n throw new Error(error.message || 'Access denied');\n } else if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const resetTime = retryAfter ? `in ${retryAfter} seconds` : 'later';\n throw new Error(`Too many requests. Please try again ${resetTime}.`);\n } else if (response.status === 400 && error.error === 'captcha_failed') {\n throw new Error('Captcha verification failed. Please try again.');\n }\n\n throw new Error(error.message || error.error || `Failed to submit feedback (HTTP ${response.status})`);\n }\n\n return await response.json();\n }\n}\n","// Utility functions\n\nimport { FeedbackMetadata } from './types';\n\n/**\n * Collect browser and page metadata\n */\nexport function collectMetadata(customMetadata?: Record<string, any>): FeedbackMetadata {\n const viewport = `${window.innerWidth}x${window.innerHeight}`;\n const browser = detectBrowser();\n\n return {\n url: window.location.href,\n browser,\n viewport,\n userAgent: navigator.userAgent,\n timestamp: new Date().toISOString(),\n ...customMetadata,\n };\n}\n\n/**\n * Detect browser name and version\n */\nfunction detectBrowser(): string {\n const ua = navigator.userAgent;\n let browser = 'Unknown';\n\n if (ua.includes('Firefox/')) {\n const version = ua.match(/Firefox\\/(\\d+)/)?.[1];\n browser = `Firefox ${version}`;\n } else if (ua.includes('Chrome/') && !ua.includes('Edg')) {\n const version = ua.match(/Chrome\\/(\\d+)/)?.[1];\n browser = `Chrome ${version}`;\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n const version = ua.match(/Version\\/(\\d+)/)?.[1];\n browser = `Safari ${version}`;\n } else if (ua.includes('Edg/')) {\n const version = ua.match(/Edg\\/(\\d+)/)?.[1];\n browser = `Edge ${version}`;\n }\n\n return browser;\n}\n\n/**\n * Simple rate limiter using localStorage\n */\nexport class RateLimiter {\n private key: string;\n private maxAttempts: number;\n private windowMs: number;\n\n constructor(key: string, maxAttempts: number = 3, windowMs: number = 5 * 60 * 1000) {\n this.key = `triagly_ratelimit_${key}`;\n this.maxAttempts = maxAttempts;\n this.windowMs = windowMs;\n }\n\n canProceed(): boolean {\n const now = Date.now();\n const data = this.getData();\n\n // Filter out old attempts\n const recentAttempts = data.attempts.filter(\n (timestamp) => now - timestamp < this.windowMs\n );\n\n if (recentAttempts.length >= this.maxAttempts) {\n return false;\n }\n\n return true;\n }\n\n recordAttempt(): void {\n const now = Date.now();\n const data = this.getData();\n\n // Add new attempt\n data.attempts.push(now);\n\n // Keep only recent attempts\n data.attempts = data.attempts.filter(\n (timestamp) => now - timestamp < this.windowMs\n );\n\n this.setData(data);\n }\n\n getTimeUntilReset(): number {\n const now = Date.now();\n const data = this.getData();\n\n if (data.attempts.length === 0) {\n return 0;\n }\n\n const oldestAttempt = Math.min(...data.attempts);\n const resetTime = oldestAttempt + this.windowMs;\n\n return Math.max(0, resetTime - now);\n }\n\n private getData(): { attempts: number[] } {\n try {\n const stored = localStorage.getItem(this.key);\n return stored ? JSON.parse(stored) : { attempts: [] };\n } catch {\n return { attempts: [] };\n }\n }\n\n private setData(data: { attempts: number[] }): void {\n try {\n localStorage.setItem(this.key, JSON.stringify(data));\n } catch (error) {\n console.error('Failed to store rate limit data:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n}\n\n/**\n * Generate unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Console log capture for debugging\n */\nexport interface ConsoleLog {\n level: 'error' | 'warn' | 'log';\n message: string;\n timestamp: string;\n stack?: string;\n}\n\nexport class ConsoleLogger {\n private buffer: ConsoleLog[] = [];\n private maxLogs: number;\n private levels: Set<'error' | 'warn' | 'log'>;\n private originalConsole: {\n error: typeof console.error;\n warn: typeof console.warn;\n log: typeof console.log;\n };\n private isActive: boolean = false;\n\n constructor(maxLogs: number = 50, levels: ('error' | 'warn' | 'log')[] = ['error', 'warn']) {\n this.maxLogs = maxLogs;\n this.levels = new Set(levels);\n \n // Store original console methods\n this.originalConsole = {\n error: console.error,\n warn: console.warn,\n log: console.log,\n };\n }\n\n /**\n * Start capturing console logs\n */\n start(): void {\n if (this.isActive) return;\n this.isActive = true;\n\n // Intercept console.error\n if (this.levels.has('error')) {\n console.error = (...args: any[]) => {\n this.captureLog('error', args);\n this.originalConsole.error.apply(console, args);\n };\n }\n\n // Intercept console.warn\n if (this.levels.has('warn')) {\n console.warn = (...args: any[]) => {\n this.captureLog('warn', args);\n this.originalConsole.warn.apply(console, args);\n };\n }\n\n // Intercept console.log\n if (this.levels.has('log')) {\n console.log = (...args: any[]) => {\n this.captureLog('log', args);\n this.originalConsole.log.apply(console, args);\n };\n }\n }\n\n /**\n * Stop capturing and restore original console methods\n */\n stop(): void {\n if (!this.isActive) return;\n this.isActive = false;\n\n console.error = this.originalConsole.error;\n console.warn = this.originalConsole.warn;\n console.log = this.originalConsole.log;\n }\n\n /**\n * Capture a log entry\n */\n private captureLog(level: 'error' | 'warn' | 'log', args: any[]): void {\n try {\n // Convert arguments to string\n const message = args.map(arg => {\n if (typeof arg === 'string') return arg;\n if (arg instanceof Error) return arg.message;\n try {\n return JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n }).join(' ');\n\n // Get stack trace for errors\n let stack: string | undefined;\n if (level === 'error') {\n const error = args.find(arg => arg instanceof Error);\n if (error) {\n stack = error.stack;\n } else {\n // Create stack trace\n stack = new Error().stack?.split('\\n').slice(2).join('\\n');\n }\n }\n\n // Sanitize sensitive data\n const sanitized = this.sanitize(message);\n const sanitizedStack = stack ? this.sanitize(stack) : undefined;\n\n // Add to buffer\n const logEntry: ConsoleLog = {\n level,\n message: sanitized,\n timestamp: new Date().toISOString(),\n stack: sanitizedStack,\n };\n\n this.buffer.push(logEntry);\n\n // Keep buffer size limited (circular buffer)\n if (this.buffer.length > this.maxLogs) {\n this.buffer.shift();\n }\n } catch (error) {\n // Don't let logging break the app\n this.originalConsole.error('Failed to capture log:', error instanceof Error ? error.message : 'Unknown error');\n }\n }\n\n /**\n * Sanitize sensitive data from logs\n */\n private sanitize(text: string): string {\n return text\n // API keys, tokens, secrets\n .replace(/[a-zA-Z0-9_-]*token[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'token=***')\n .replace(/[a-zA-Z0-9_-]*key[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'key=***')\n .replace(/[a-zA-Z0-9_-]*secret[a-zA-Z0-9_-]*\\s*[:=]\\s*[\"']?[\\w-]{20,}[\"']?/gi, 'secret=***')\n // GitHub tokens (ghp_, gho_, etc.)\n .replace(/gh[ps]_[a-zA-Z0-9]{36,}/g, 'gh*_***')\n // JWT tokens\n .replace(/eyJ[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+/g, 'jwt.***')\n // Passwords\n .replace(/password\\s*[:=]\\s*[\"']?[^\"'\\s]+[\"']?/gi, 'password=***')\n // Email addresses\n .replace(/\\b[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,}\\b/g, '***@***.com')\n // Credit cards (basic pattern)\n .replace(/\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g, '****-****-****-****')\n // URLs with tokens in query params\n .replace(/([?&])(token|key|secret|auth)=[^&\\s]+/gi, '$1$2=***');\n }\n\n /**\n * Get all captured logs\n */\n getLogs(): ConsoleLog[] {\n return [...this.buffer];\n }\n\n /**\n * Clear all captured logs\n */\n clear(): void {\n this.buffer = [];\n }\n\n /**\n * Get logs count\n */\n getCount(): number {\n return this.buffer.length;\n }\n}\n","// Triagly SDK Main Entry Point\n\nimport {\n TriaglyConfig,\n FeedbackData,\n} from './types';\nimport { FeedbackWidget } from './ui';\nimport { TriaglyAPI } from './api';\nimport { collectMetadata, RateLimiter, ConsoleLogger } from './utils';\n\nexport class Triagly {\n private config: TriaglyConfig;\n private widget: FeedbackWidget;\n private api: TriaglyAPI;\n private rateLimiter: RateLimiter;\n private consoleLogger: ConsoleLogger | null = null;\n\n constructor(config: TriaglyConfig) {\n // Handle backward compatibility - support multiple key names\n let apiKey = config.apiKey || config.publishableKey;\n\n if (!apiKey && config.projectId) {\n console.warn(\n 'Triagly: projectId is deprecated. Please use apiKey instead. ' +\n 'See migration guide: https://docs.triagly.com/sdk/migration'\n );\n apiKey = config.projectId;\n }\n\n if (!apiKey) {\n throw new Error('Triagly: apiKey is required. Get yours at https://triagly.com/dashboard');\n }\n\n this.config = {\n theme: 'auto',\n position: 'bottom-right',\n buttonShape: 'rounded',\n buttonText: 'Feedback',\n placeholderText: 'Describe what happened...',\n successMessage: 'Feedback sent successfully!',\n errorMessage: 'Failed to send feedback. Please try again.',\n captureConsole: true,\n consoleLogLimit: 50,\n consoleLogLevels: ['error', 'warn'],\n ...config,\n apiKey,\n publishableKey: apiKey, // Keep for backward compatibility\n };\n\n this.api = new TriaglyAPI(\n apiKey,\n this.config.environment || 'production',\n this.config.apiUrl,\n this.config.getToken,\n this.config.turnstileSiteKey\n );\n\n // Always pass Turnstile site key to widget (from API which has default)\n this.config.turnstileSiteKey = this.api.getTurnstileSiteKey();\n this.widget = new FeedbackWidget(this.config);\n this.rateLimiter = new RateLimiter(apiKey, 3, 5 * 60 * 1000);\n\n // Initialize console logger if enabled\n if (this.config.captureConsole !== false) {\n this.consoleLogger = new ConsoleLogger(\n this.config.consoleLogLimit,\n this.config.consoleLogLevels\n );\n this.consoleLogger.start();\n }\n\n this.init();\n }\n\n /**\n * Initialize the SDK\n */\n private init(): void {\n // Wait for DOM to be ready before initializing widget\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n this.widget.init();\n });\n } else {\n // DOM is already ready\n this.widget.init();\n }\n\n // Listen for form submissions\n document.addEventListener('triagly:submit', (e: Event) => {\n const customEvent = e as CustomEvent;\n this.handleSubmit(customEvent.detail);\n });\n }\n\n /**\n * Handle feedback submission\n */\n private async handleSubmit(data: any): Promise<void> {\n try {\n // Check rate limit\n if (!this.rateLimiter.canProceed()) {\n const resetTime = Math.ceil(this.rateLimiter.getTimeUntilReset() / 1000 / 60);\n throw new Error(`Rate limit exceeded. Please try again in ${resetTime} minute(s).`);\n }\n\n // Collect metadata\n const metadata = collectMetadata(this.config.metadata);\n\n // Prepare feedback data\n const feedbackData: FeedbackData = {\n title: data.title,\n description: data.description,\n reporterEmail: data.reporterEmail,\n consoleLogs: this.consoleLogger?.getLogs(),\n screenshot: data.screenshot,\n };\n\n // Submit to API with Turnstile token if provided\n const response = await this.api.submitFeedback(\n feedbackData,\n metadata,\n data.turnstileToken\n );\n\n // Record rate limit attempt\n this.rateLimiter.recordAttempt();\n\n // Dispatch success event for UI layer\n document.dispatchEvent(new CustomEvent('triagly:success', {\n detail: { feedbackId: response.id }\n }));\n\n // Call success callback\n if (this.config.onSuccess) {\n this.config.onSuccess(response.id);\n }\n } catch (error) {\n console.error('Failed to submit feedback:', error instanceof Error ? error.message : 'Unknown error');\n\n // Dispatch error event for UI layer\n document.dispatchEvent(new CustomEvent('triagly:error', {\n detail: error\n }));\n\n // Call error callback\n if (this.config.onError && error instanceof Error) {\n this.config.onError(error);\n }\n\n throw error;\n }\n }\n\n /**\n * Programmatically open the feedback widget\n */\n open(): void {\n this.widget.open();\n }\n\n /**\n * Programmatically close the feedback widget\n */\n close(): void {\n this.widget.close();\n }\n\n /**\n * Submit feedback programmatically without UI\n * Note: When Turnstile is enabled, you must use the widget UI or provide a token\n */\n async submit(data: FeedbackData, turnstileToken?: string): Promise<void> {\n // Require Turnstile token if configured\n if (this.config.turnstileSiteKey && !turnstileToken) {\n throw new Error(\n 'Turnstile verification required. When Turnstile is enabled, you must:\\n' +\n '1. Use the widget UI (triagly.open()), or\\n' +\n '2. Implement Turnstile in your form and pass the token: triagly.submit(data, token)'\n );\n }\n\n const metadata = collectMetadata(this.config.metadata);\n\n // Include console logs if available and not already provided\n if (!data.consoleLogs && this.consoleLogger) {\n data.consoleLogs = this.consoleLogger.getLogs();\n }\n\n await this.api.submitFeedback(data, metadata, turnstileToken);\n this.rateLimiter.recordAttempt();\n }\n\n /**\n * Destroy the SDK instance\n */\n destroy(): void {\n this.widget.destroy();\n this.consoleLogger?.stop();\n document.removeEventListener('triagly:submit', () => {});\n }\n}\n\n// Export types\nexport * from './types';\n\n// Auto-initialize if config is in window\nif (typeof window !== 'undefined') {\n const globalConfig = (window as any).TriaglyConfig;\n if (globalConfig) {\n (window as any).triagly = new Triagly(globalConfig);\n }\n\n // Make Triagly class directly accessible as window.Triagly for UMD builds\n // This allows users to use: new Triagly({...}) instead of new Triagly.default({...})\n (window as any).Triagly = Triagly;\n}\n\n// Default export\nexport default Triagly;\n"],"names":[],"mappings":"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"}