@reqdesk/widget 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/shadow-dom.ts","../src/ui/fab.ts","../src/ui/ticket-form.ts","../src/ui/tracker.ts","../src/ui/portal.ts","../src/index.ts"],"sourcesContent":["import { getWidgetStyles } from './theme'\n\nlet shadowRoot: ShadowRoot | null = null\nlet hostEl: HTMLElement | null = null\n\nexport function mountWidget(config: { zIndex?: number }): { shadow: ShadowRoot; host: HTMLElement; mount: HTMLElement } {\n if (shadowRoot && hostEl) {\n const mount = shadowRoot.querySelector('.rqd-root') as HTMLElement\n return { shadow: shadowRoot, host: hostEl, mount }\n }\n\n hostEl = document.createElement('div')\n hostEl.id = 'reqdesk-widget'\n hostEl.style.position = 'fixed'\n hostEl.style.zIndex = String(config.zIndex ?? 9999)\n hostEl.style.inset = '0'\n hostEl.style.pointerEvents = 'none'\n document.body.appendChild(hostEl)\n\n shadowRoot = hostEl.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = getWidgetStyles()\n shadowRoot.appendChild(style)\n\n const mount = document.createElement('div')\n mount.className = 'rqd-root'\n shadowRoot.appendChild(mount)\n\n return { shadow: shadowRoot, host: hostEl, mount }\n}\n\nexport function unmountWidget(): void {\n if (hostEl) {\n hostEl.remove()\n hostEl = null\n shadowRoot = null\n }\n}\n\nexport function getShadowRoot(): ShadowRoot | null {\n return shadowRoot\n}\n","function createSvg(path: string): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n const p = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n p.setAttribute('d', path)\n svg.appendChild(p)\n return svg\n}\n\nconst CHAT_PATH = 'M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z'\nconst CLOSE_PATH = 'M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z'\n\nexport function createFab(\n position: 'bottom-right' | 'bottom-left',\n onClick: () => void,\n): HTMLButtonElement {\n const btn = document.createElement('button')\n btn.className = `rqd-fab rqd-${position}`\n btn.appendChild(createSvg(CHAT_PATH))\n btn.setAttribute('aria-label', 'Open support widget')\n btn.addEventListener('click', onClick)\n return btn\n}\n\nexport function setFabOpen(fab: HTMLButtonElement, isOpen: boolean): void {\n while (fab.firstChild) fab.removeChild(fab.firstChild)\n fab.appendChild(createSvg(isOpen ? CLOSE_PATH : CHAT_PATH))\n fab.setAttribute('aria-label', isOpen ? 'Close support widget' : 'Open support widget')\n}\n","import { submitTicket } from '../api-client'\nimport { saveTrackingToken } from '../storage'\nimport type { EventCallback, SubmitTicketData, TicketResult } from '../types'\n\ntype T = (key: string) => string\n\nexport function createTicketForm(\n projectId: string,\n t: T,\n onSuccess: (result: TicketResult) => void,\n onError: EventCallback,\n): HTMLElement {\n const form = document.createElement('form')\n form.className = 'rqd-form'\n form.setAttribute('novalidate', '')\n\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\n const errors: Record<string, HTMLElement> = {}\n\n function addField(name: string, type: 'input' | 'textarea' | 'select', label: string, opts?: { placeholder?: string; required?: boolean; options?: Array<{ value: string; label: string }> }) {\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n\n const lbl = document.createElement('label')\n lbl.className = 'rqd-label'\n lbl.textContent = label\n group.appendChild(lbl)\n\n let el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n if (type === 'textarea') {\n el = document.createElement('textarea')\n el.className = 'rqd-textarea'\n } else if (type === 'select') {\n el = document.createElement('select')\n el.className = 'rqd-select'\n if (opts?.options) {\n for (const opt of opts.options) {\n const option = document.createElement('option')\n option.value = opt.value\n option.textContent = opt.label\n el.appendChild(option)\n }\n }\n } else {\n el = document.createElement('input')\n el.className = 'rqd-input'\n el.type = name === 'email' ? 'email' : 'text'\n }\n\n if (opts?.placeholder && 'placeholder' in el) el.placeholder = opts.placeholder\n if (opts?.required) el.required = true\n el.name = name\n group.appendChild(el)\n\n const err = document.createElement('div')\n err.className = 'rqd-error-text'\n err.style.display = 'none'\n group.appendChild(err)\n\n fields[name] = el\n errors[name] = err\n form.appendChild(group)\n }\n\n // Unsaved data warning\n let hasContent = false\n function onBeforeUnload(e: BeforeUnloadEvent) {\n if (hasContent) {\n e.preventDefault()\n }\n }\n window.addEventListener('beforeunload', onBeforeUnload)\n form.addEventListener('input', () => {\n hasContent = Object.values(fields).some((f) => f.value.trim().length > 0)\n })\n\n addField('title', 'input', t('form.title'), { placeholder: t('form.titlePlaceholder'), required: true })\n addField('description', 'textarea', t('form.description'), { placeholder: t('form.descriptionPlaceholder') })\n addField('email', 'input', t('form.email'), { placeholder: t('form.emailPlaceholder'), required: true })\n addField('priority', 'select', t('form.priority'), {\n options: [\n { value: 'medium', label: t('form.priorityMedium') },\n { value: 'low', label: t('form.priorityLow') },\n { value: 'high', label: t('form.priorityHigh') },\n { value: 'urgent', label: t('form.priorityUrgent') },\n ],\n })\n\n const submitBtn = document.createElement('button')\n submitBtn.type = 'submit'\n submitBtn.className = 'rqd-btn rqd-btn-primary'\n submitBtn.textContent = t('form.submit')\n form.appendChild(submitBtn)\n\n function validate(): boolean {\n let valid = true\n const title = (fields.title as HTMLInputElement).value.trim()\n const email = (fields.email as HTMLInputElement).value.trim()\n\n // Clear errors\n for (const err of Object.values(errors)) {\n err.style.display = 'none'\n err.textContent = ''\n }\n\n if (!title) {\n errors.title.textContent = t('error.required')\n errors.title.style.display = 'block'\n valid = false\n } else if (title.length < 5) {\n errors.title.textContent = t('error.titleMin')\n errors.title.style.display = 'block'\n valid = false\n }\n\n if (!email) {\n errors.email.textContent = t('error.required')\n errors.email.style.display = 'block'\n valid = false\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n errors.email.textContent = t('error.emailInvalid')\n errors.email.style.display = 'block'\n valid = false\n }\n\n return valid\n }\n\n form.addEventListener('submit', async (e) => {\n e.preventDefault()\n if (!validate()) return\n\n submitBtn.disabled = true\n submitBtn.textContent = t('form.submitting')\n\n const data: SubmitTicketData = {\n title: (fields.title as HTMLInputElement).value.trim(),\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\n email: (fields.email as HTMLInputElement).value.trim(),\n priority: (fields.priority as HTMLSelectElement).value as SubmitTicketData['priority'],\n }\n\n try {\n const result = await submitTicket(projectId, data)\n if (result.trackingToken) {\n saveTrackingToken(projectId, result.trackingToken)\n }\n hasContent = false\n window.removeEventListener('beforeunload', onBeforeUnload)\n onSuccess(result)\n } catch (err) {\n onError(err)\n submitBtn.disabled = false\n submitBtn.textContent = t('form.submit')\n }\n })\n\n return form\n}\n\nexport function createSuccessView(\n result: TicketResult,\n t: T,\n onClose: () => void,\n onTrack?: () => void,\n): HTMLElement {\n const div = document.createElement('div')\n div.className = 'rqd-success'\n\n const icon = document.createElement('div')\n icon.className = 'rqd-success-icon'\n icon.textContent = '\\u2705'\n div.appendChild(icon)\n\n const heading = document.createElement('h3')\n heading.textContent = t('success.title')\n div.appendChild(heading)\n\n const num = document.createElement('p')\n num.textContent = t('success.ticketNumber') + result.ticketNumber\n div.appendChild(num)\n\n if (result.trackingToken) {\n const hint = document.createElement('p')\n hint.textContent = t('success.trackingHint')\n hint.style.fontSize = '13px'\n hint.style.color = 'var(--rqd-text-secondary)'\n div.appendChild(hint)\n\n const tokenBox = document.createElement('div')\n tokenBox.className = 'rqd-token-box'\n tokenBox.textContent = result.trackingToken\n div.appendChild(tokenBox)\n\n const copyBtn = document.createElement('button')\n copyBtn.className = 'rqd-btn rqd-btn-secondary'\n copyBtn.textContent = t('success.copyToken')\n copyBtn.style.marginBottom = '8px'\n copyBtn.addEventListener('click', () => {\n navigator.clipboard.writeText(result.trackingToken!).then(() => {\n copyBtn.textContent = t('success.copied')\n setTimeout(() => { copyBtn.textContent = t('success.copyToken') }, 2000)\n })\n })\n div.appendChild(copyBtn)\n\n if (onTrack) {\n const trackBtn = document.createElement('button')\n trackBtn.className = 'rqd-btn rqd-btn-primary'\n trackBtn.textContent = t('success.trackNow')\n trackBtn.style.marginTop = '4px'\n trackBtn.addEventListener('click', onTrack)\n div.appendChild(trackBtn)\n }\n }\n\n const closeBtn = document.createElement('button')\n closeBtn.className = 'rqd-btn rqd-btn-secondary'\n closeBtn.textContent = t('success.close')\n closeBtn.style.marginTop = '8px'\n closeBtn.addEventListener('click', onClose)\n div.appendChild(closeBtn)\n\n return div\n}\n","import { trackTicket, submitTrackingReply } from '../api-client'\nimport type { EventCallback, TrackedTicketResult } from '../types'\n\ntype T = (key: string) => string\n\nexport function createTrackerView(\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n prefillToken?: string,\n): HTMLElement {\n const container = document.createElement('div')\n container.className = 'rqd-tracker'\n\n if (prefillToken) {\n renderLoading(container, t)\n doTrack(prefillToken, container, t, onTracked, onReplySent, onError, onBack)\n } else {\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\n }\n\n return container\n}\n\nfunction renderTokenInput(\n container: HTMLElement,\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n\n const label = document.createElement('label')\n label.className = 'rqd-label'\n label.textContent = t('tracker.title')\n group.appendChild(label)\n\n const input = document.createElement('input')\n input.className = 'rqd-input'\n input.placeholder = t('tracker.tokenPlaceholder')\n input.type = 'text'\n group.appendChild(input)\n\n const err = document.createElement('div')\n err.className = 'rqd-error-text'\n err.style.display = 'none'\n group.appendChild(err)\n\n container.appendChild(group)\n\n const btn = document.createElement('button')\n btn.className = 'rqd-btn rqd-btn-primary'\n btn.textContent = t('tracker.submit')\n btn.addEventListener('click', () => {\n const token = input.value.trim()\n if (!token) {\n err.textContent = t('error.required')\n err.style.display = 'block'\n return\n }\n err.style.display = 'none'\n btn.disabled = true\n btn.textContent = t('tracker.tracking')\n doTrack(token, container, t, onTracked, onReplySent, onError, onBack)\n })\n container.appendChild(btn)\n}\n\nfunction renderLoading(container: HTMLElement, t: T) {\n while (container.firstChild) container.removeChild(container.firstChild)\n const p = document.createElement('p')\n p.textContent = t('tracker.tracking')\n p.style.textAlign = 'center'\n p.style.color = 'var(--rqd-text-secondary)'\n container.appendChild(p)\n}\n\nasync function doTrack(\n token: string,\n container: HTMLElement,\n t: T,\n onTracked: EventCallback,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n try {\n const result = await trackTicket(token)\n onTracked(result)\n renderTicketDetail(container, token, result, t, onReplySent, onError, onBack)\n } catch (err) {\n onError(err)\n renderTokenInput(container, t, onTracked, onReplySent, onError, onBack)\n }\n}\n\nfunction renderTicketDetail(\n container: HTMLElement,\n token: string,\n ticket: TrackedTicketResult,\n t: T,\n onReplySent: EventCallback,\n onError: EventCallback,\n onBack?: () => void,\n) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n if (onBack) {\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', onBack)\n container.appendChild(backBtn)\n }\n\n // Ticket info\n const info = document.createElement('div')\n info.className = 'rqd-ticket-info'\n\n const titleRow = document.createElement('div')\n titleRow.style.fontWeight = '600'\n titleRow.style.marginBottom = '8px'\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\n info.appendChild(titleRow)\n\n for (const [label, value] of [\n [t('tracker.status'), ticket.status],\n [t('tracker.priority'), ticket.priority],\n [t('tracker.created'), new Date(ticket.createdAt).toLocaleDateString()],\n ]) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-row'\n const lbl = document.createElement('span')\n lbl.className = 'rqd-ticket-label'\n lbl.textContent = label\n row.appendChild(lbl)\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = value\n row.appendChild(badge)\n info.appendChild(row)\n }\n container.appendChild(info)\n\n // Replies\n const repliesLabel = document.createElement('div')\n repliesLabel.className = 'rqd-label'\n repliesLabel.textContent = t('tracker.replies')\n repliesLabel.style.marginBottom = '8px'\n container.appendChild(repliesLabel)\n\n if (ticket.replies.length === 0) {\n const noReplies = document.createElement('p')\n noReplies.textContent = t('tracker.noReplies')\n noReplies.style.color = 'var(--rqd-text-secondary)'\n noReplies.style.fontSize = '13px'\n container.appendChild(noReplies)\n } else {\n for (const reply of ticket.replies) {\n const replyEl = document.createElement('div')\n replyEl.className = 'rqd-reply'\n\n const header = document.createElement('div')\n header.className = 'rqd-reply-header'\n const authorSpan = document.createElement('span')\n authorSpan.textContent = reply.authorName\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\n header.appendChild(authorSpan)\n const dateSpan = document.createElement('span')\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\n header.appendChild(dateSpan)\n replyEl.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-reply-body'\n body.textContent = reply.body\n replyEl.appendChild(body)\n\n container.appendChild(replyEl)\n }\n }\n\n // Reply form\n const replyGroup = document.createElement('div')\n replyGroup.className = 'rqd-form-group'\n replyGroup.style.marginTop = '12px'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'rqd-textarea'\n textarea.placeholder = t('tracker.replyPlaceholder')\n textarea.rows = 3\n replyGroup.appendChild(textarea)\n container.appendChild(replyGroup)\n\n const sendBtn = document.createElement('button')\n sendBtn.className = 'rqd-btn rqd-btn-primary'\n sendBtn.textContent = t('tracker.sendReply')\n sendBtn.addEventListener('click', async () => {\n const body = textarea.value.trim()\n if (!body) return\n\n sendBtn.disabled = true\n sendBtn.textContent = t('tracker.sending')\n\n try {\n await submitTrackingReply(token, body)\n onReplySent({ token, body })\n // Refresh ticket detail\n const updated = await trackTicket(token)\n renderTicketDetail(container, token, updated, t, onReplySent, onError, onBack)\n } catch (err) {\n onError(err)\n sendBtn.disabled = false\n sendBtn.textContent = t('tracker.sendReply')\n }\n })\n container.appendChild(sendBtn)\n}\n","import { submitTicket } from '../api-client'\nimport type { EventCallback, SubmitTicketData } from '../types'\n\ntype T = (key: string) => string\n\ninterface PortalTicket {\n id: string\n ticketNumber: string\n title: string\n status: string\n priority: string\n createdAt: string\n}\n\ninterface PortalTicketDetail extends PortalTicket {\n replies: Array<{\n id: string\n body: string\n authorName: string\n isStaff: boolean\n createdAt: string\n }>\n}\n\nexport function createPortalView(\n t: T,\n fetchTickets: () => Promise<PortalTicket[]>,\n fetchTicketDetail: (id: string) => Promise<PortalTicketDetail>,\n submitReply: (ticketId: string, body: string) => Promise<void>,\n projectId: string,\n onTicketCreated: EventCallback,\n onError: EventCallback,\n pollingInterval?: number,\n): HTMLElement {\n const container = document.createElement('div')\n container.className = 'rqd-portal'\n\n let currentView: 'list' | 'detail' | 'new' = 'list'\n let pollTimer: ReturnType<typeof setInterval> | undefined\n\n function renderList() {\n currentView = 'list'\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const header = document.createElement('div')\n header.style.display = 'flex'\n header.style.justifyContent = 'space-between'\n header.style.alignItems = 'center'\n header.style.marginBottom = '12px'\n\n const title = document.createElement('span')\n title.style.fontWeight = '600'\n title.textContent = t('portal.myTickets')\n header.appendChild(title)\n\n const newBtn = document.createElement('button')\n newBtn.className = 'rqd-btn rqd-btn-primary'\n newBtn.style.width = 'auto'\n newBtn.style.padding = '6px 14px'\n newBtn.style.fontSize = '13px'\n newBtn.textContent = t('portal.newTicket')\n newBtn.addEventListener('click', renderNewTicketForm)\n header.appendChild(newBtn)\n\n container.appendChild(header)\n\n const loading = document.createElement('p')\n loading.textContent = '...'\n loading.style.textAlign = 'center'\n loading.style.color = 'var(--rqd-text-secondary)'\n container.appendChild(loading)\n\n fetchTickets()\n .then((tickets) => {\n loading.remove()\n if (tickets.length === 0) {\n const empty = document.createElement('p')\n empty.textContent = t('portal.noTickets')\n empty.style.textAlign = 'center'\n empty.style.color = 'var(--rqd-text-secondary)'\n empty.style.padding = '24px 0'\n container.appendChild(empty)\n return\n }\n\n for (const ticket of tickets) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-info'\n row.style.cursor = 'pointer'\n row.style.marginBottom = '8px'\n\n const top = document.createElement('div')\n top.style.display = 'flex'\n top.style.justifyContent = 'space-between'\n top.style.marginBottom = '4px'\n\n const num = document.createElement('span')\n num.style.fontWeight = '600'\n num.style.fontSize = '13px'\n num.textContent = ticket.ticketNumber\n top.appendChild(num)\n\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = ticket.status\n top.appendChild(badge)\n\n row.appendChild(top)\n\n const titleEl = document.createElement('div')\n titleEl.style.fontSize = '14px'\n titleEl.textContent = ticket.title\n row.appendChild(titleEl)\n\n const date = document.createElement('div')\n date.style.fontSize = '12px'\n date.style.color = 'var(--rqd-text-secondary)'\n date.style.marginTop = '4px'\n date.textContent = new Date(ticket.createdAt).toLocaleDateString()\n row.appendChild(date)\n\n row.addEventListener('click', () => renderDetail(ticket.id))\n container.appendChild(row)\n }\n })\n .catch((err) => {\n loading.remove()\n onError(err)\n })\n\n // Start polling\n if (pollingInterval && pollingInterval > 0) {\n stopPolling()\n pollTimer = setInterval(() => {\n if (currentView === 'list') renderList()\n }, pollingInterval)\n }\n }\n\n function renderDetail(ticketId: string) {\n currentView = 'detail'\n stopPolling()\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', renderList)\n container.appendChild(backBtn)\n\n const loading = document.createElement('p')\n loading.textContent = '...'\n loading.style.textAlign = 'center'\n container.appendChild(loading)\n\n fetchTicketDetail(ticketId)\n .then((ticket) => {\n loading.remove()\n\n const info = document.createElement('div')\n info.className = 'rqd-ticket-info'\n\n const titleRow = document.createElement('div')\n titleRow.style.fontWeight = '600'\n titleRow.style.marginBottom = '8px'\n titleRow.textContent = `${ticket.ticketNumber} — ${ticket.title}`\n info.appendChild(titleRow)\n\n for (const [label, value] of [\n [t('tracker.status'), ticket.status],\n [t('tracker.priority'), ticket.priority],\n ]) {\n const row = document.createElement('div')\n row.className = 'rqd-ticket-row'\n const lbl = document.createElement('span')\n lbl.className = 'rqd-ticket-label'\n lbl.textContent = label\n row.appendChild(lbl)\n const badge = document.createElement('span')\n badge.className = 'rqd-badge'\n badge.textContent = value\n row.appendChild(badge)\n info.appendChild(row)\n }\n container.appendChild(info)\n\n // Replies\n const repliesLabel = document.createElement('div')\n repliesLabel.className = 'rqd-label'\n repliesLabel.textContent = t('tracker.replies')\n repliesLabel.style.marginBottom = '8px'\n container.appendChild(repliesLabel)\n\n if (ticket.replies.length === 0) {\n const noReplies = document.createElement('p')\n noReplies.textContent = t('tracker.noReplies')\n noReplies.style.color = 'var(--rqd-text-secondary)'\n noReplies.style.fontSize = '13px'\n container.appendChild(noReplies)\n } else {\n for (const reply of ticket.replies) {\n const replyEl = document.createElement('div')\n replyEl.className = 'rqd-reply'\n\n const header = document.createElement('div')\n header.className = 'rqd-reply-header'\n const authorSpan = document.createElement('span')\n authorSpan.textContent = reply.authorName\n if (reply.isStaff) authorSpan.className = 'rqd-reply-staff'\n header.appendChild(authorSpan)\n const dateSpan = document.createElement('span')\n dateSpan.textContent = new Date(reply.createdAt).toLocaleString()\n header.appendChild(dateSpan)\n replyEl.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-reply-body'\n body.textContent = reply.body\n replyEl.appendChild(body)\n\n container.appendChild(replyEl)\n }\n }\n\n // Reply form\n const replyGroup = document.createElement('div')\n replyGroup.className = 'rqd-form-group'\n replyGroup.style.marginTop = '12px'\n\n const textarea = document.createElement('textarea')\n textarea.className = 'rqd-textarea'\n textarea.placeholder = t('tracker.replyPlaceholder')\n textarea.rows = 3\n replyGroup.appendChild(textarea)\n container.appendChild(replyGroup)\n\n const sendBtn = document.createElement('button')\n sendBtn.className = 'rqd-btn rqd-btn-primary'\n sendBtn.textContent = t('tracker.sendReply')\n sendBtn.addEventListener('click', async () => {\n const body = textarea.value.trim()\n if (!body) return\n sendBtn.disabled = true\n sendBtn.textContent = t('tracker.sending')\n try {\n await submitReply(ticketId, body)\n renderDetail(ticketId)\n } catch (err) {\n onError(err)\n sendBtn.disabled = false\n sendBtn.textContent = t('tracker.sendReply')\n }\n })\n container.appendChild(sendBtn)\n })\n .catch((err) => {\n loading.remove()\n onError(err)\n })\n }\n\n function renderNewTicketForm() {\n currentView = 'new'\n stopPolling()\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const backBtn = document.createElement('button')\n backBtn.className = 'rqd-btn rqd-btn-secondary'\n backBtn.textContent = t('tracker.back')\n backBtn.style.marginBottom = '12px'\n backBtn.addEventListener('click', renderList)\n container.appendChild(backBtn)\n\n // Minimal inline form\n const fields: Record<string, HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement> = {}\n\n function addField(name: string, type: 'input' | 'textarea', label: string, placeholder: string) {\n const group = document.createElement('div')\n group.className = 'rqd-form-group'\n const lbl = document.createElement('label')\n lbl.className = 'rqd-label'\n lbl.textContent = label\n group.appendChild(lbl)\n const el = type === 'textarea' ? document.createElement('textarea') : document.createElement('input')\n el.className = type === 'textarea' ? 'rqd-textarea' : 'rqd-input'\n el.placeholder = placeholder\n el.name = name\n group.appendChild(el)\n fields[name] = el\n container.appendChild(group)\n }\n\n addField('title', 'input', t('form.title'), t('form.titlePlaceholder'))\n addField('description', 'textarea', t('form.description'), t('form.descriptionPlaceholder'))\n\n const submitBtn = document.createElement('button')\n submitBtn.className = 'rqd-btn rqd-btn-primary'\n submitBtn.textContent = t('form.submit')\n submitBtn.addEventListener('click', async () => {\n const title = (fields.title as HTMLInputElement).value.trim()\n if (!title || title.length < 5) return\n\n submitBtn.disabled = true\n submitBtn.textContent = t('form.submitting')\n\n const data: SubmitTicketData = {\n title,\n description: (fields.description as HTMLTextAreaElement).value.trim() || undefined,\n email: '', // Portal users are identified, email comes from customer config\n priority: 'medium',\n }\n\n try {\n const result = await submitTicket(projectId, data)\n onTicketCreated(result)\n renderList()\n } catch (err) {\n onError(err)\n submitBtn.disabled = false\n submitBtn.textContent = t('form.submit')\n }\n })\n container.appendChild(submitBtn)\n }\n\n function stopPolling() {\n if (pollTimer) {\n clearInterval(pollTimer)\n pollTimer = undefined\n }\n }\n\n // Initial render\n renderList()\n\n return container\n}\n","import { configureClient } from './api-client'\nimport { en } from './i18n/en'\nimport { ar } from './i18n/ar'\nimport { mountWidget, unmountWidget, getShadowRoot } from './shadow-dom'\nimport { themeToVars } from './theme'\nimport { createFab, setFabOpen } from './ui/fab'\nimport { createTicketForm, createSuccessView } from './ui/ticket-form'\nimport { createTrackerView } from './ui/tracker'\nimport { createPortalView } from './ui/portal'\nimport { getTrackingTokens, loadWidgetConfig, saveWidgetConfig } from './storage'\nimport type {\n ReqdeskWidgetConfig,\n ThemeConfig,\n CustomerConfig,\n WidgetEvent,\n EventCallback,\n TicketResult,\n} from './types'\n\nexport type {\n ReqdeskWidgetConfig,\n ThemeConfig,\n CustomerConfig,\n WidgetEvent,\n EventCallback,\n TicketResult,\n}\n\nconst translations: Record<string, Record<string, string>> = { en, ar }\nconst listeners: Record<string, EventCallback[]> = {}\n\nlet config: ReqdeskWidgetConfig | null = null\nlet isOpen = false\nlet currentLang = 'en'\nlet fab: HTMLButtonElement | null = null\nlet panel: HTMLElement | null = null\nlet mount: HTMLElement | null = null\nlet currentTab: 'form' | 'tracker' = 'form'\nlet pendingTrackToken: string | undefined\n\nfunction t(key: string): string {\n const overrides = config?.translations\n if (overrides?.[key]) return overrides[key]\n const lang = translations[currentLang] ?? translations.en\n return lang[key] ?? key\n}\n\nfunction emit(event: WidgetEvent, data?: unknown) {\n for (const cb of listeners[event] ?? []) {\n try { cb(data) } catch { /* ignore listener errors */ }\n }\n}\n\nfunction deriveApiUrl(): string {\n return window.location.origin\n}\n\nfunction extractProjectId(): string {\n // The project ID is resolved server-side via the API key's entity_id claim\n return '_current'\n}\n\nfunction renderPanel() {\n if (!mount || !config) return\n\n while (mount.firstChild) mount.removeChild(mount.firstChild)\n\n const position = config.position ?? 'bottom-right'\n\n if (!config.inline) {\n panel = document.createElement('div')\n panel.className = `rqd-panel rqd-${position}`\n panel.style.cssText = themeToVars(config.theme)\n\n // Header\n const header = document.createElement('div')\n header.className = 'rqd-header'\n const title = document.createElement('span')\n title.className = 'rqd-header-title'\n title.textContent = t('widget.title')\n header.appendChild(title)\n\n const closeBtn = document.createElement('button')\n closeBtn.className = 'rqd-header-close'\n closeBtn.textContent = '\\u2715'\n closeBtn.addEventListener('click', close)\n header.appendChild(closeBtn)\n panel.appendChild(header)\n\n const body = document.createElement('div')\n body.className = 'rqd-body'\n\n const isPortal = config.widget === 'support-portal' && config.customer?.email\n\n if (isPortal) {\n // Support portal mode — full ticket list + detail\n renderPortal(body)\n } else {\n // Ticket form + tracker tabs\n const tabs = document.createElement('div')\n tabs.className = 'rqd-tabs'\n\n const formTab = document.createElement('button')\n formTab.className = `rqd-tab${currentTab === 'form' ? ' rqd-active' : ''}`\n formTab.textContent = t('widget.newTicket')\n formTab.addEventListener('click', () => switchTab('form', body, tabs))\n\n const trackerTab = document.createElement('button')\n trackerTab.className = `rqd-tab${currentTab === 'tracker' ? ' rqd-active' : ''}`\n trackerTab.textContent = t('widget.trackTicket')\n trackerTab.addEventListener('click', () => switchTab('tracker', body, tabs))\n\n tabs.appendChild(formTab)\n tabs.appendChild(trackerTab)\n panel.appendChild(tabs)\n\n if (currentTab === 'form') renderForm(body)\n else renderTracker(body)\n }\n\n panel.appendChild(body)\n\n mount.appendChild(panel)\n } else {\n // Inline mode\n const container = typeof config.container === 'string'\n ? document.querySelector(config.container)\n : config.container\n\n if (container) {\n const inline = document.createElement('div')\n inline.className = 'rqd-inline'\n inline.style.cssText = themeToVars(config.theme)\n\n const body = document.createElement('div')\n body.className = 'rqd-body'\n renderForm(body)\n inline.appendChild(body)\n\n // For inline, mount in the host page, not shadow DOM\n container.appendChild(inline)\n return\n }\n }\n}\n\nfunction renderPortal(container: HTMLElement) {\n if (!config) return\n\n const projectId = extractProjectId()\n\n // Portal uses the API client's ticket endpoints (via API key auth)\n // These return the customer's own tickets when customer.email is set\n const portalView = createPortalView(\n t,\n async () => {\n // Placeholder: in a real implementation, getTickets would filter by customer email\n // For now, return empty array — the backend filters by API key's project\n return []\n },\n async (id: string) => {\n return {\n id,\n ticketNumber: '',\n title: '',\n status: '',\n priority: '',\n createdAt: '',\n replies: [],\n }\n },\n async (_ticketId: string, _body: string) => {\n // Will call submitReply via API client\n },\n projectId,\n (data) => emit('ticket:created', data),\n (err) => emit('error', err),\n 30000,\n )\n container.appendChild(portalView)\n}\n\nfunction switchTab(tab: 'form' | 'tracker', body: HTMLElement, tabs: HTMLElement) {\n currentTab = tab\n pendingTrackToken = undefined\n\n // Update tab active state\n const tabBtns = tabs.querySelectorAll('.rqd-tab')\n tabBtns.forEach((btn, i) => {\n btn.classList.toggle('rqd-active', (i === 0 && tab === 'form') || (i === 1 && tab === 'tracker'))\n })\n\n while (body.firstChild) body.removeChild(body.firstChild)\n if (tab === 'form') renderForm(body)\n else renderTracker(body)\n}\n\nfunction renderForm(container: HTMLElement) {\n if (!config) return\n\n const projectId = extractProjectId()\n const form = createTicketForm(\n projectId,\n t,\n (result: TicketResult) => {\n emit('ticket:created', result)\n renderSuccess(container, result)\n },\n (err) => {\n emit('error', err)\n },\n )\n container.appendChild(form)\n}\n\nfunction renderTracker(container: HTMLElement) {\n const view = createTrackerView(\n t,\n (data) => emit('ticket:tracked', data),\n (data) => emit('reply:sent', data),\n (err) => emit('error', err),\n undefined,\n pendingTrackToken,\n )\n container.appendChild(view)\n}\n\nfunction renderSuccess(container: HTMLElement, result: TicketResult) {\n while (container.firstChild) container.removeChild(container.firstChild)\n\n const view = createSuccessView(\n result,\n t,\n () => close(),\n result.trackingToken\n ? () => {\n pendingTrackToken = result.trackingToken\n // Switch to tracker tab\n if (panel) {\n const body = panel.querySelector('.rqd-body') as HTMLElement\n const tabs = panel.querySelector('.rqd-tabs') as HTMLElement\n if (body && tabs) switchTab('tracker', body, tabs)\n }\n }\n : undefined,\n )\n container.appendChild(view)\n}\n\nexport function init(cfg: ReqdeskWidgetConfig): void {\n if (config) return // singleton guard\n\n // Merge saved config as defaults — explicit init values take priority\n const saved = loadWidgetConfig(cfg.apiKey)\n config = {\n ...cfg,\n position: cfg.position ?? saved?.position ?? 'bottom-right',\n language: cfg.language ?? saved?.language ?? 'en',\n widget: cfg.widget ?? saved?.widget ?? 'ticket-form',\n theme: { ...saved?.theme, ...cfg.theme },\n }\n currentLang = config.language ?? 'en'\n\n // Persist resolved config for next init\n saveWidgetConfig(cfg.apiKey, {\n position: config.position,\n language: config.language,\n widget: config.widget,\n theme: config.theme,\n })\n\n const apiUrl = deriveApiUrl()\n configureClient(apiUrl, cfg.apiKey)\n\n if (cfg.inline) {\n renderPanel()\n return\n }\n\n const { mount: m } = mountWidget({ zIndex: cfg.theme?.zIndex })\n mount = m\n\n // Apply theme vars to the root\n const shadow = getShadowRoot()\n if (shadow) {\n const root = shadow.querySelector('.rqd-root') as HTMLElement\n if (root) root.style.cssText = themeToVars(cfg.theme)\n }\n\n // Set RTL\n const host = document.getElementById('reqdesk-widget')\n if (host && (currentLang === 'ar')) {\n host.setAttribute('dir', 'rtl')\n }\n\n // Auto-show tracker tab if user has saved tracking tokens\n const tokens = getTrackingTokens(cfg.apiKey)\n if (tokens.length > 0) currentTab = 'tracker'\n\n const position = cfg.position ?? 'bottom-right'\n fab = createFab(position, toggle)\n mount.appendChild(fab)\n}\n\nexport function open(): void {\n if (!config || isOpen) return\n isOpen = true\n if (fab) setFabOpen(fab, true)\n renderPanel()\n emit('open')\n}\n\nexport function close(): void {\n if (!isOpen) return\n isOpen = false\n if (fab) setFabOpen(fab, false)\n if (panel) {\n panel.remove()\n panel = null\n }\n emit('close')\n}\n\nexport function toggle(): void {\n if (isOpen) close()\n else open()\n}\n\nexport function setLanguage(lang: string): void {\n currentLang = lang\n if (config) {\n config.language = lang\n saveWidgetConfig(config.apiKey, { language: lang })\n }\n const host = document.getElementById('reqdesk-widget')\n if (host) {\n host.setAttribute('dir', lang === 'ar' ? 'rtl' : 'ltr')\n }\n // Re-render if open\n if (isOpen && panel && mount) {\n panel.remove()\n panel = null\n renderPanel()\n }\n}\n\nexport function setTheme(theme: Partial<ThemeConfig>): void {\n if (!config) return\n config.theme = { ...config.theme, ...theme }\n saveWidgetConfig(config.apiKey, { theme: config.theme })\n if (panel) {\n panel.style.cssText = themeToVars(config.theme)\n }\n}\n\nexport function on(event: WidgetEvent, callback: EventCallback): void {\n if (!listeners[event]) listeners[event] = []\n listeners[event].push(callback)\n}\n\nexport function identify(customer: CustomerConfig): void {\n if (config) config.customer = customer\n}\n\nexport function destroy(): void {\n close()\n unmountWidget()\n config = null\n fab = null\n panel = null\n mount = null\n isOpen = false\n for (const key of Object.keys(listeners)) {\n delete listeners[key]\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { c as TicketResult, i as PublicReply, l as TrackedTicketResult, o as SubmitTicketData, r as OidcAuthConfig, s as ThemeConfig, t as CustomerConfig, u as WidgetError } from "./types-CRxzGfna.cjs";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/react/types.d.ts
6
+ interface ReqdeskProviderProps {
7
+ apiKey: string;
8
+ auth?: OidcAuthConfig;
9
+ theme?: ThemeConfig;
10
+ language?: string;
11
+ customer?: CustomerConfig;
12
+ translations?: Record<string, string>;
13
+ children: React.ReactNode;
14
+ }
15
+ interface TicketFormProps {
16
+ mode?: 'floating' | 'inline';
17
+ position?: 'bottom-right' | 'bottom-left';
18
+ defaultCategory?: string;
19
+ onTicketCreated?: (ticket: TicketResult) => void;
20
+ onError?: (error: WidgetError) => void;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ }
24
+ interface SupportPortalProps {
25
+ pollingInterval?: number;
26
+ onTicketSelected?: (ticketId: string) => void;
27
+ className?: string;
28
+ style?: React.CSSProperties;
29
+ }
30
+ interface UseReqdeskReturn {
31
+ submitTicket(data: SubmitTicketData): Promise<TicketResult>;
32
+ trackTicket(token: string): Promise<TrackedTicketResult>;
33
+ submitTrackingReply(token: string, body: string): Promise<void>;
34
+ isLoading: boolean;
35
+ error: WidgetError | null;
36
+ }
37
+ //#endregion
38
+ //#region src/react/ReqdeskProvider.d.ts
39
+ declare function ReqdeskProvider({
40
+ apiKey,
41
+ auth,
42
+ theme,
43
+ language,
44
+ customer,
45
+ translations,
46
+ children
47
+ }: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
48
+ //# sourceMappingURL=ReqdeskProvider.d.ts.map
49
+ //#endregion
50
+ //#region src/react/TicketForm.d.ts
51
+ declare function TicketForm({
52
+ mode,
53
+ onTicketCreated,
54
+ onError,
55
+ className,
56
+ style
57
+ }: TicketFormProps): react_jsx_runtime0.JSX.Element;
58
+ //# sourceMappingURL=TicketForm.d.ts.map
59
+ //#endregion
60
+ //#region src/react/SupportPortal.d.ts
61
+ declare function SupportPortal({
62
+ className
63
+ }: SupportPortalProps): react_jsx_runtime0.JSX.Element;
64
+ //# sourceMappingURL=SupportPortal.d.ts.map
65
+ //#endregion
66
+ //#region src/react/FloatingWidget.d.ts
67
+ interface FloatingWidgetProps {
68
+ position?: 'bottom-right' | 'bottom-left';
69
+ contained?: boolean;
70
+ onTicketCreated?: (ticket: TicketResult) => void;
71
+ onError?: (error: WidgetError) => void;
72
+ }
73
+ declare function FloatingWidget({
74
+ position,
75
+ contained,
76
+ onTicketCreated,
77
+ onError
78
+ }: FloatingWidgetProps): react_jsx_runtime0.JSX.Element;
79
+ //#endregion
80
+ //#region src/react/useReqdesk.d.ts
81
+ declare function useReqdesk(): UseReqdeskReturn;
82
+ //# sourceMappingURL=useReqdesk.d.ts.map
83
+ //#endregion
84
+ //#region src/react/shadow-root.d.ts
85
+ interface ShadowRootProps {
86
+ children: ReactNode;
87
+ }
88
+ declare function ShadowRoot({
89
+ children
90
+ }: ShadowRootProps): react_jsx_runtime0.JSX.Element;
91
+ //#endregion
92
+ //#region src/storage.d.ts
93
+ interface WidgetConfigPersist {
94
+ position?: 'bottom-right' | 'bottom-left';
95
+ language?: string;
96
+ theme?: {
97
+ primaryColor?: string;
98
+ mode?: 'light' | 'dark' | 'auto';
99
+ };
100
+ widget?: 'ticket-form' | 'support-portal';
101
+ }
102
+ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
103
+ //# sourceMappingURL=storage.d.ts.map
104
+
105
+ //#endregion
106
+ export { type CustomerConfig, FloatingWidget, type PublicReply, ReqdeskProvider, type ReqdeskProviderProps, ShadowRoot, type SubmitTicketData, SupportPortal, type SupportPortalProps, type ThemeConfig, TicketForm, type TicketFormProps, type TicketResult, type TrackedTicketResult, type UseReqdeskReturn, type WidgetConfigPersist, type WidgetError, loadWidgetConfig as getWidgetDefaults, useReqdesk };
107
+ //# sourceMappingURL=react-8GCnIHnw.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-8GCnIHnw.d.cts","names":[],"sources":["../src/react/types.ts","../src/react/ReqdeskProvider.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/FloatingWidget.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/storage.ts"],"mappings":";;;;;UAIiB,oBAAA;;SAER;EAFQ,KAAA,CAAA,EAGP,WAHO;EAAoB,QAAA,CAAA,EAAA,MAAA;UAE5B,CAAA,EAGI,cAHJ;cACC,CAAA,EAGO,MAHP,CAAA,MAAA,EAAA,MAAA,CAAA;UAEG,EAED,KAAA,CAAM,SAFL;;AAED,UAGK,eAAA,CAHC;EAAS,IAAA,CAAA,EAAA,UAAA,GAAA,QAAA;EAGV,QAAA,CAAA,EAAA,cAAe,GAAA,aAAA;EAAA,eAAA,CAAA,EAAA,MAAA;iBAIH,CAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,GAAA,IAAA;SACT,CAAA,EAAA,CAAA,KAAA,EAAA,WAAA,EAAA,GAAA,IAAA;WAEJ,CAAA,EAAA,MAAA;EAAa,KAAA,CAAA,EAAnB,KAAA,CAAM,aAAa;AAG7B;AAOiB,UAPA,kBAAA,CAOgB;EAAA,eAAA,CAAA,EAAA,MAAA;kBACZ,CAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAAA,IAAA;WAA2B,CAAA,EAAA,MAAA;OAAR,CAAA,EAJ9B,KAAA,CAAM,aAIwB;;AACV,UAFb,gBAAA,CAEa;cACsB,CAAA,IAAA,EAF/B,gBAE+B,CAAA,EAFZ,OAEY,CAFJ,YAEI,CAAA;aAE3C,CAAA,KAAA,EAAA,MAAA,CAAA,EAHqB,OAGrB,CAH6B,mBAG7B,CAAA;EAAW,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAFgC,OAEhC,CAAA,IAAA,CAAA;;SAAX;;;;iBCAO,eAAA;;;;;;;;GAAqF,uBAAoB,kBAAA,CAAA,GAAA,CAAA;;;;iBCxBzG,UAAA;;;;;;GAA4E,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;;iBCN3F,aAAA;;GAA6B,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;;UCYrD,mBAAA;;;6BAGmB;EJjBZ,OAAA,CAAA,EAAA,CAAA,KAAA,EIkBG,WJlBiB,EAAA,GAAA,IAAA;;AAE5B,iBIuCO,cAAA,CJvCP;EAAA,QAAA;EAAA,SAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EI4CN,mBJ5CM,CAAA,EI4Ca,kBAAA,CAAA,GAAA,CAAA,OJ5Cb;;;iBKDO,UAAA,CAAA,GAAc;;;;UCDpB,eAAA;YACE;;iBAGI,UAAA;;GAAyB,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;UCRvC,mBAAA;;;;;IPIA,IAAA,CAAA,EAAA,OAAA,GAAA,MAAoB,GAAA,MAAA;EAAA,CAAA;QAE5B,CAAA,EAAA,aAAA,GAAA,gBAAA;;AAYoB,iBO6Eb,gBAAA,CP7Ea,MAAA,EAAA,MAAA,CAAA,EO6EqB,mBP7ErB,GAAA,IAAA"}
@@ -0,0 +1,107 @@
1
+ import { c as TicketResult, i as PublicReply, l as TrackedTicketResult, o as SubmitTicketData, r as OidcAuthConfig, s as ThemeConfig, t as CustomerConfig, u as WidgetError } from "./types-gPfzZQw5.js";
2
+ import { ReactNode } from "react";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
+
5
+ //#region src/react/types.d.ts
6
+ interface ReqdeskProviderProps {
7
+ apiKey: string;
8
+ auth?: OidcAuthConfig;
9
+ theme?: ThemeConfig;
10
+ language?: string;
11
+ customer?: CustomerConfig;
12
+ translations?: Record<string, string>;
13
+ children: React.ReactNode;
14
+ }
15
+ interface TicketFormProps {
16
+ mode?: 'floating' | 'inline';
17
+ position?: 'bottom-right' | 'bottom-left';
18
+ defaultCategory?: string;
19
+ onTicketCreated?: (ticket: TicketResult) => void;
20
+ onError?: (error: WidgetError) => void;
21
+ className?: string;
22
+ style?: React.CSSProperties;
23
+ }
24
+ interface SupportPortalProps {
25
+ pollingInterval?: number;
26
+ onTicketSelected?: (ticketId: string) => void;
27
+ className?: string;
28
+ style?: React.CSSProperties;
29
+ }
30
+ interface UseReqdeskReturn {
31
+ submitTicket(data: SubmitTicketData): Promise<TicketResult>;
32
+ trackTicket(token: string): Promise<TrackedTicketResult>;
33
+ submitTrackingReply(token: string, body: string): Promise<void>;
34
+ isLoading: boolean;
35
+ error: WidgetError | null;
36
+ }
37
+ //#endregion
38
+ //#region src/react/ReqdeskProvider.d.ts
39
+ declare function ReqdeskProvider({
40
+ apiKey,
41
+ auth,
42
+ theme,
43
+ language,
44
+ customer,
45
+ translations,
46
+ children
47
+ }: ReqdeskProviderProps): react_jsx_runtime0.JSX.Element;
48
+ //# sourceMappingURL=ReqdeskProvider.d.ts.map
49
+ //#endregion
50
+ //#region src/react/TicketForm.d.ts
51
+ declare function TicketForm({
52
+ mode,
53
+ onTicketCreated,
54
+ onError,
55
+ className,
56
+ style
57
+ }: TicketFormProps): react_jsx_runtime0.JSX.Element;
58
+ //# sourceMappingURL=TicketForm.d.ts.map
59
+ //#endregion
60
+ //#region src/react/SupportPortal.d.ts
61
+ declare function SupportPortal({
62
+ className
63
+ }: SupportPortalProps): react_jsx_runtime0.JSX.Element;
64
+ //# sourceMappingURL=SupportPortal.d.ts.map
65
+ //#endregion
66
+ //#region src/react/FloatingWidget.d.ts
67
+ interface FloatingWidgetProps {
68
+ position?: 'bottom-right' | 'bottom-left';
69
+ contained?: boolean;
70
+ onTicketCreated?: (ticket: TicketResult) => void;
71
+ onError?: (error: WidgetError) => void;
72
+ }
73
+ declare function FloatingWidget({
74
+ position,
75
+ contained,
76
+ onTicketCreated,
77
+ onError
78
+ }: FloatingWidgetProps): react_jsx_runtime0.JSX.Element;
79
+ //#endregion
80
+ //#region src/react/useReqdesk.d.ts
81
+ declare function useReqdesk(): UseReqdeskReturn;
82
+ //# sourceMappingURL=useReqdesk.d.ts.map
83
+ //#endregion
84
+ //#region src/react/shadow-root.d.ts
85
+ interface ShadowRootProps {
86
+ children: ReactNode;
87
+ }
88
+ declare function ShadowRoot({
89
+ children
90
+ }: ShadowRootProps): react_jsx_runtime0.JSX.Element;
91
+ //#endregion
92
+ //#region src/storage.d.ts
93
+ interface WidgetConfigPersist {
94
+ position?: 'bottom-right' | 'bottom-left';
95
+ language?: string;
96
+ theme?: {
97
+ primaryColor?: string;
98
+ mode?: 'light' | 'dark' | 'auto';
99
+ };
100
+ widget?: 'ticket-form' | 'support-portal';
101
+ }
102
+ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
103
+ //# sourceMappingURL=storage.d.ts.map
104
+
105
+ //#endregion
106
+ export { type CustomerConfig, FloatingWidget, type PublicReply, ReqdeskProvider, type ReqdeskProviderProps, ShadowRoot, type SubmitTicketData, SupportPortal, type SupportPortalProps, type ThemeConfig, TicketForm, type TicketFormProps, type TicketResult, type TrackedTicketResult, type UseReqdeskReturn, type WidgetConfigPersist, type WidgetError, loadWidgetConfig as getWidgetDefaults, useReqdesk };
107
+ //# sourceMappingURL=react-D69QlAm1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-D69QlAm1.d.ts","names":[],"sources":["../src/react/types.ts","../src/react/ReqdeskProvider.tsx","../src/react/TicketForm.tsx","../src/react/SupportPortal.tsx","../src/react/FloatingWidget.tsx","../src/react/useReqdesk.ts","../src/react/shadow-root.tsx","../src/storage.ts"],"mappings":";;;;;UAIiB,oBAAA;;SAER;EAFQ,KAAA,CAAA,EAGP,WAHO;EAAoB,QAAA,CAAA,EAAA,MAAA;UAE5B,CAAA,EAGI,cAHJ;cACC,CAAA,EAGO,MAHP,CAAA,MAAA,EAAA,MAAA,CAAA;UAEG,EAED,KAAA,CAAM,SAFL;;AAED,UAGK,eAAA,CAHC;EAAS,IAAA,CAAA,EAAA,UAAA,GAAA,QAAA;EAGV,QAAA,CAAA,EAAA,cAAe,GAAA,aAAA;EAAA,eAAA,CAAA,EAAA,MAAA;iBAIH,CAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,GAAA,IAAA;SACT,CAAA,EAAA,CAAA,KAAA,EAAA,WAAA,EAAA,GAAA,IAAA;WAEJ,CAAA,EAAA,MAAA;EAAa,KAAA,CAAA,EAAnB,KAAA,CAAM,aAAa;AAG7B;AAOiB,UAPA,kBAAA,CAOgB;EAAA,eAAA,CAAA,EAAA,MAAA;kBACZ,CAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,GAAA,IAAA;WAA2B,CAAA,EAAA,MAAA;OAAR,CAAA,EAJ9B,KAAA,CAAM,aAIwB;;AACV,UAFb,gBAAA,CAEa;cACsB,CAAA,IAAA,EAF/B,gBAE+B,CAAA,EAFZ,OAEY,CAFJ,YAEI,CAAA;aAE3C,CAAA,KAAA,EAAA,MAAA,CAAA,EAHqB,OAGrB,CAH6B,mBAG7B,CAAA;EAAW,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAFgC,OAEhC,CAAA,IAAA,CAAA;;SAAX;;;;iBCAO,eAAA;;;;;;;;GAAqF,uBAAoB,kBAAA,CAAA,GAAA,CAAA;;;;iBCxBzG,UAAA;;;;;;GAA4E,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;;iBCN3F,aAAA;;GAA6B,qBAAkB,kBAAA,CAAA,GAAA,CAAA;;;;UCYrD,mBAAA;;;6BAGmB;EJjBZ,OAAA,CAAA,EAAA,CAAA,KAAA,EIkBG,WJlBiB,EAAA,GAAA,IAAA;;AAE5B,iBIuCO,cAAA,CJvCP;EAAA,QAAA;EAAA,SAAA;EAAA,eAAA;EAAA;AAAA,CAAA,EI4CN,mBJ5CM,CAAA,EI4Ca,kBAAA,CAAA,GAAA,CAAA,OJ5Cb;;;iBKDO,UAAA,CAAA,GAAc;;;;UCDpB,eAAA;YACE;;iBAGI,UAAA;;GAAyB,kBAAe,kBAAA,CAAA,GAAA,CAAA;;;UCRvC,mBAAA;;;;;IPIA,IAAA,CAAA,EAAA,OAAA,GAAA,MAAoB,GAAA,MAAA;EAAA,CAAA;QAE5B,CAAA,EAAA,aAAA,GAAA,gBAAA;;AAYoB,iBO6Eb,gBAAA,CP7Ea,MAAA,EAAA,MAAA,CAAA,EO6EqB,mBP7ErB,GAAA,IAAA"}