@reqdesk/widget 0.1.0 → 0.2.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.
@@ -1,4 +1,4 @@
1
- import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-CRxzGfna.cjs";
1
+ import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-i3IgBEjw.cjs";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  declare function init(cfg: ReqdeskWidgetConfig): void;
@@ -14,4 +14,4 @@ declare function destroy(): void;
14
14
 
15
15
  //#endregion
16
16
  export { type CustomerConfig, type EventCallback, type ReqdeskWidgetConfig, type ThemeConfig, type TicketResult, type WidgetEvent, close, destroy, identify, init, on, open, setLanguage, setTheme, toggle };
17
- //# sourceMappingURL=index-2oPxlN4_.d.cts.map
17
+ //# sourceMappingURL=index-C4jNMODn.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-2oPxlN4_.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
1
+ {"version":3,"file":"index-C4jNMODn.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
@@ -1,4 +1,4 @@
1
- import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-gPfzZQw5.js";
1
+ import { a as ReqdeskWidgetConfig, c as TicketResult, d as WidgetEvent, n as EventCallback, s as ThemeConfig, t as CustomerConfig } from "./types-rPiXlS0A.js";
2
2
 
3
3
  //#region src/index.d.ts
4
4
  declare function init(cfg: ReqdeskWidgetConfig): void;
@@ -14,4 +14,4 @@ declare function destroy(): void;
14
14
 
15
15
  //#endregion
16
16
  export { type CustomerConfig, type EventCallback, type ReqdeskWidgetConfig, type ThemeConfig, type TicketResult, type WidgetEvent, close, destroy, identify, init, on, open, setLanguage, setTheme, toggle };
17
- //# sourceMappingURL=index-B8fhsCuv.d.ts.map
17
+ //# sourceMappingURL=index-CgLsyyP9.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-B8fhsCuv.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
1
+ {"version":3,"file":"index-CgLsyyP9.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;iBAyPgB,IAAA,MAAU;AAAV,iBAuDA,IAAA,CAAA,CAvDU,EAAA,IAAA;AAuDV,iBAQA,KAAA,CAAA,CARI,EAAA,IAAA;AAQJ,iBAWA,MAAA,CAAA,CAXK,EAAA,IAAA;AAWL,iBAKA,WAAA,CALM,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA;AAKN,iBAkBA,QAAA,CAlBW,KAAA,EAkBK,OAlBL,CAkBa,WAlBb,CAAA,CAAA,EAAA,IAAA;AAkBX,iBASA,EAAA,CATQ,KAAA,EASE,WATF,EAAA,QAAA,EASyB,aATzB,CAAA,EAAA,IAAA;AAAA,iBAcR,QAAA,CAdQ,QAAA,EAcW,cAdX,CAAA,EAAA,IAAA;AAAgB,iBAkBxB,OAAA,CAAA,CAlBwB,EAAA,IAAA"}
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_storage = require("./storage-Db9XjupR.cjs");
2
+ const require_storage = require("./storage-DqhhTxeh.cjs");
3
3
  //#region src/shadow-dom.ts
4
4
  let shadowRoot = null;
5
5
  let hostEl = null;
package/dist/index.d.cts CHANGED
@@ -1 +1 @@
1
- export * from './index-2oPxlN4_.cjs';
1
+ export * from './index-C4jNMODn.cjs';
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './index-B8fhsCuv.js';
1
+ export * from './index-CgLsyyP9.js';
@@ -1,4 +1,4 @@
1
- var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let n=``,r=``;function i(e,t){r=e.replace(/\/$/,``),n=t}let a=t.ofetch.create({timeout:15e3,retry:2,retryStatusCodes:[408,429,500,502,503,504],async onRequest({options:e}){e.baseURL=`${r}/api/v1`;let t=new Headers(e.headers);t.set(`X-API-Key`,n),e.headers=t},onResponseError({response:e}){let t=e._data;throw{code:t?.responseCode??`HTTP_${e.status}`,message:t?.responseMessage??e.statusText}}});function o(){return crypto.randomUUID()}async function s(e,t){let n=await a(`/projects/${e}/tickets`,{method:`POST`,body:{title:t.title,description:t.description,priority:t.priority,categoryId:t.categoryId,email:t.email},headers:{"Idempotency-Key":o()}});return{id:n.data.id,ticketNumber:n.data.attributes.ticketNumber,trackingToken:n.meta?.trackingToken,status:n.data.attributes.status}}async function c(e){let t=await a(`/tickets/track?token=${encodeURIComponent(e)}`),n=t.included??[];return{id:t.data.id,ticketNumber:t.data.attributes.ticketNumber,title:t.data.attributes.title,status:t.data.attributes.status,priority:t.data.attributes.priority,createdAt:t.data.attributes.createdAt,replies:n.filter(e=>e.type===`public-reply`).map(e=>({id:e.id,body:e.attributes.body,authorName:e.attributes.authorName,isStaff:e.attributes.isStaff,createdAt:e.attributes.createdAt}))}}async function l(e,t){await a(`/tickets/track/reply`,{method:`POST`,body:{trackingToken:e,body:t}})}let u={"widget.title":`Support`,"widget.newTicket":`New Ticket`,"widget.trackTicket":`Track Ticket`,"form.title":`Title`,"form.titlePlaceholder":`Brief summary of your issue`,"form.description":`Description`,"form.descriptionPlaceholder":`Describe your issue in detail...`,"form.email":`Email`,"form.emailPlaceholder":`your@email.com`,"form.priority":`Priority`,"form.priorityLow":`Low`,"form.priorityMedium":`Medium`,"form.priorityHigh":`High`,"form.priorityUrgent":`Urgent`,"form.category":`Category`,"form.categoryNone":`Select a category`,"form.submit":`Submit Ticket`,"form.submitting":`Submitting...`,"form.cancel":`Cancel`,"form.attachment":`Attach files`,"success.title":`Ticket Submitted!`,"success.ticketNumber":`Ticket #`,"success.trackingToken":`Your tracking token:`,"success.trackingHint":`Save this token to track your ticket status.`,"success.copyToken":`Copy Token`,"success.copied":`Copied!`,"success.close":`Close`,"success.trackNow":`Track Ticket`,"tracker.title":`Track Your Ticket`,"tracker.tokenPlaceholder":`Enter your tracking token (trk_...)`,"tracker.submit":`Track`,"tracker.tracking":`Tracking...`,"tracker.status":`Status`,"tracker.priority":`Priority`,"tracker.created":`Created`,"tracker.replies":`Replies`,"tracker.noReplies":`No replies yet.`,"tracker.replyPlaceholder":`Write a reply...`,"tracker.sendReply":`Send Reply`,"tracker.sending":`Sending...`,"tracker.back":`Back`,"tracker.staff":`Staff`,"error.generic":`Something went wrong. Please try again.`,"error.network":`Network error. Check your connection.`,"error.tokenInvalid":`Invalid or expired tracking token.`,"error.required":`This field is required.`,"error.emailInvalid":`Please enter a valid email address.`,"error.titleMin":`Title must be at least 5 characters.`,"portal.title":`Support Portal`,"portal.myTickets":`My Tickets`,"portal.noTickets":`No tickets yet.`,"portal.newTicket":`New Ticket`,"widget.close":`Close`,"menu.newTicket":`Submit a Ticket`,"menu.newTicketDesc":`Create a new support request`,"menu.myTickets":`My Tickets`,"menu.myTicketsDesc":`View and manage your tickets`,"menu.trackTicket":`Track a Ticket`,"menu.trackTicketDesc":`Check status with your tracking token`,"menu.knowledgeBase":`Knowledge Base`,"menu.knowledgeBaseDesc":`Browse help articles and guides`,"menu.myTicketsPlaceholder":`Sign in to view your tickets.`,"menu.trackPlaceholder":`Ticket tracking is coming soon.`,"menu.kbPlaceholder":`Knowledge base is coming soon.`,"menu.preferences":`Preferences`,"menu.preferencesDesc":`Language and appearance settings`,"prefs.title":`Preferences`,"prefs.language":`Language`,"prefs.theme":`Theme`,"prefs.light":`Light`,"prefs.dark":`Dark`,"prefs.auto":`System`,"branding.poweredBy":`Powered by`,"attach.dropzone":`Drop files here or click to browse`,"attach.dropzoneActive":`Drop files here`,"attach.maxFiles":`Maximum {max} files`,"attach.remove":`Remove`,"attach.uploading":`Uploading files...`,"attach.uploadProgress":`Uploading {name}... {percent}%`,"attach.invalidType":`File type not allowed`,"attach.tooLarge":`File exceeds maximum size`,"attach.tooMany":`Maximum number of files reached`,"attach.download":`Download`,"mytickets.title":`My Tickets`,"mytickets.emailPrompt":`Enter your email to view your tickets`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`Remember me`,"mytickets.lookup":`Find My Tickets`,"mytickets.lookingUp":`Looking up...`,"mytickets.noTickets":`No tickets yet.`,"mytickets.submitFirst":`Submit your first ticket`,"mytickets.noAccount":`No tickets found for this email.`,"detail.description":`Description`,"detail.attachments":`Attachments`,"detail.noAttachments":`No attachments`,"detail.replies":`Conversation`,"detail.noReplies":`No replies yet.`,"detail.replyPlaceholder":`Write a reply...`,"detail.sendReply":`Send`,"detail.sending":`Sending...`,"detail.staff":`Staff`,"detail.you":`You`,"detail.loading":`Loading ticket...`,"track.title":`Track a Ticket`,"track.tokenPlaceholder":`Enter tracking token (trk_...)`,"track.submit":`Track`,"track.tracking":`Tracking...`,"track.recentTickets":`Recent Tickets`,"track.invalidToken":`Invalid or expired tracking token.`,"prefs.clearEmail":`Clear saved email`,"prefs.emailCleared":`Email cleared`,"auth.login":`Login`,"auth.logout":`Logout`,"auth.sessionExpired":`Session expired. Please log in again.`,"prefs.accentColor":`Accent Color`},d={"widget.title":`الدعم`,"widget.newTicket":`تذكرة جديدة`,"widget.trackTicket":`تتبع التذكرة`,"form.title":`العنوان`,"form.titlePlaceholder":`ملخص موجز لمشكلتك`,"form.description":`الوصف`,"form.descriptionPlaceholder":`صف مشكلتك بالتفصيل...`,"form.email":`البريد الإلكتروني`,"form.emailPlaceholder":`your@email.com`,"form.priority":`الأولوية`,"form.priorityLow":`منخفضة`,"form.priorityMedium":`متوسطة`,"form.priorityHigh":`عالية`,"form.priorityUrgent":`عاجلة`,"form.category":`الفئة`,"form.categoryNone":`اختر فئة`,"form.submit":`إرسال التذكرة`,"form.submitting":`جارِ الإرسال...`,"form.cancel":`إلغاء`,"form.attachment":`إرفاق ملفات`,"success.title":`تم إرسال التذكرة!`,"success.ticketNumber":`تذكرة #`,"success.trackingToken":`رمز التتبع الخاص بك:`,"success.trackingHint":`احفظ هذا الرمز لتتبع حالة تذكرتك.`,"success.copyToken":`نسخ الرمز`,"success.copied":`تم النسخ!`,"success.close":`إغلاق`,"success.trackNow":`تتبع التذكرة`,"tracker.title":`تتبع تذكرتك`,"tracker.tokenPlaceholder":`أدخل رمز التتبع الخاص بك (trk_...)`,"tracker.submit":`تتبع`,"tracker.tracking":`جارِ التتبع...`,"tracker.status":`الحالة`,"tracker.priority":`الأولوية`,"tracker.created":`تاريخ الإنشاء`,"tracker.replies":`الردود`,"tracker.noReplies":`لا توجد ردود بعد.`,"tracker.replyPlaceholder":`اكتب رداً...`,"tracker.sendReply":`إرسال الرد`,"tracker.sending":`جارِ الإرسال...`,"tracker.back":`رجوع`,"tracker.staff":`فريق الدعم`,"error.generic":`حدث خطأ ما. يرجى المحاولة مرة أخرى.`,"error.network":`خطأ في الشبكة. تحقق من اتصالك.`,"error.tokenInvalid":`رمز التتبع غير صالح أو منتهي الصلاحية.`,"error.required":`هذا الحقل مطلوب.`,"error.emailInvalid":`يرجى إدخال بريد إلكتروني صالح.`,"error.titleMin":`يجب أن يكون العنوان 5 أحرف على الأقل.`,"portal.title":`بوابة الدعم`,"portal.myTickets":`تذاكري`,"portal.noTickets":`لا توجد تذاكر بعد.`,"portal.newTicket":`تذكرة جديدة`,"widget.close":`إغلاق`,"menu.newTicket":`إرسال تذكرة`,"menu.newTicketDesc":`إنشاء طلب ��عم جديد`,"menu.myTickets":`تذاكري`,"menu.myTicketsDesc":`عرض وإدارة تذاكرك`,"menu.trackTicket":`تتبع تذكرة`,"menu.trackTicketDesc":`تحقق من الحالة باستخدام رمز التتبع`,"menu.knowledgeBase":`قاعدة المعرفة`,"menu.knowledgeBaseDesc":`تصفح مقالات المساعدة والأدلة`,"menu.myTicketsPlaceholder":`سجّل الدخول ��عرض تذاكرك.`,"menu.trackPlaceholder":`تتبع التذاكر قريبًا.`,"menu.kbPlaceholder":`قاعدة المعرفة قريبًا.`,"menu.preferences":`التفضيلات`,"menu.preferencesDesc":`إعدادات اللغة والمظهر`,"prefs.title":`التفضيلات`,"prefs.language":`اللغة`,"prefs.theme":`المظهر`,"prefs.light":`فاتح`,"prefs.dark":`داكن`,"prefs.auto":`النظام`,"branding.poweredBy":`مدعوم من`,"attach.dropzone":`اسحب الملفات هنا أو انقر للتصفح`,"attach.dropzoneActive":`أفلت الملفات هنا`,"attach.maxFiles":`بحد أقصى {max} ملفات`,"attach.remove":`إزالة`,"attach.uploading":`جارِ رفع الملفات...`,"attach.uploadProgress":`جارِ رفع {name}... {percent}%`,"attach.invalidType":`نوع الملف غير مسموح`,"attach.tooLarge":`حجم الملف يتجاوز الحد الأقصى`,"attach.tooMany":`تم الوصول للحد الأقصى لعدد الملفات`,"attach.download":`تحميل`,"mytickets.title":`تذاكري`,"mytickets.emailPrompt":`أدخل بريدك الإلكتروني لعرض تذاكرك`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`تذكرني`,"mytickets.lookup":`البحث عن تذاكري`,"mytickets.lookingUp":`جارِ البحث...`,"mytickets.noTickets":`لا توجد تذاكر بعد.`,"mytickets.submitFirst":`أرسل تذكرتك الأولى`,"mytickets.noAccount":`لم يتم العثور على تذاكر لهذا البريد.`,"detail.description":`الوصف`,"detail.attachments":`المرفقات`,"detail.noAttachments":`لا توجد مرفقات`,"detail.replies":`المحادثة`,"detail.noReplies":`لا توجد ردود بعد.`,"detail.replyPlaceholder":`اكتب رداً...`,"detail.sendReply":`إرسال`,"detail.sending":`جارِ الإرسال...`,"detail.staff":`فريق الدعم`,"detail.you":`أنت`,"detail.loading":`جارِ تحميل التذكرة...`,"track.title":`تتبع تذكرة`,"track.tokenPlaceholder":`أدخل رمز التتبع (trk_...)`,"track.submit":`تتبع`,"track.tracking":`جارِ التتبع...`,"track.recentTickets":`التذاكر الأخيرة`,"track.invalidToken":`رمز التتبع غير صالح أو منتهي.`,"prefs.clearEmail":`مسح البريد المحفوظ`,"prefs.emailCleared":`تم مسح البريد`,"auth.login":`تسجيل الدخول`,"auth.logout":`تسجيل الخروج`,"auth.sessionExpired":`انتهت الجلسة. يرجى تسجيل الدخول مرة أخرى.`,"prefs.accentColor":`لون التمييز`},f={primaryColor:`#42b983`,mode:`light`,borderRadius:`8px`,fontFamily:`inherit`,zIndex:9999};function p(e){return e===`auto`?typeof window<`u`&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e??`light`}function m(e={}){let t={...f,...e,mode:p(e.mode??f.mode)},n=h(t.primaryColor),r=Math.min(n.l+30,95),i=Math.max(n.l-15,10);return[`--rqd-primary: ${t.primaryColor}`,`--rqd-primary-h: ${n.h}`,`--rqd-primary-s: ${n.s}%`,`--rqd-primary-l: ${n.l}%`,`--rqd-primary-light: hsl(${n.h}, ${n.s}%, ${r}%)`,`--rqd-primary-dark: hsl(${n.h}, ${n.s}%, ${i}%)`,`--rqd-radius: ${t.borderRadius}`,`--rqd-font: ${t.fontFamily}`,`--rqd-z: ${t.zIndex}`,`--rqd-bg: ${t.mode===`dark`?`#1a1a2e`:`#ffffff`}`,`--rqd-bg-secondary: ${t.mode===`dark`?`#16213e`:`#f8f9fa`}`,`--rqd-text: ${t.mode===`dark`?`#e0e0e0`:`#1a1a2e`}`,`--rqd-text-secondary: ${t.mode===`dark`?`#a0a0b0`:`#6c757d`}`,`--rqd-border: ${t.mode===`dark`?`#2a2a4a`:`#e0e0e0`}`,`--rqd-input-bg: ${t.mode===`dark`?`#0f3460`:`#ffffff`}`,`--rqd-shadow: ${t.mode===`dark`?`0 8px 32px rgba(0,0,0,0.4)`:`0 8px 32px rgba(0,0,0,0.12)`}`].join(`; `)}function h(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return{h:160,s:51,l:49};let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;c=l>.5?e/(2-a-o):e/(a+o),s=a===n?((r-i)/e+(r<i?6:0))/6:a===r?((i-n)/e+2)/6:((n-r)/e+4)/6}return{h:Math.round(s*360),s:Math.round(c*100),l:Math.round(l*100)}}function ee(){return te}let te=`:host { all: initial; }
1
+ var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let n=``,r=``;function i(e,t){r=e.replace(/\/$/,``),n=t}let a=t.ofetch.create({timeout:15e3,retry:2,retryStatusCodes:[408,429,500,502,503,504],async onRequest({options:e}){e.baseURL=`${r}/api/v1`;let t=new Headers(e.headers);t.set(`X-API-Key`,n),e.headers=t},onResponseError({response:e}){let t=e._data;throw{code:t?.responseCode??`HTTP_${e.status}`,message:t?.responseMessage??e.statusText}}});function o(){return crypto.randomUUID()}async function s(e,t){let n=await a(`/projects/${e}/tickets`,{method:`POST`,body:{title:t.title,description:t.description,priority:t.priority,categoryId:t.categoryId,email:t.email,clientMetadata:t.clientMetadata},headers:{"Idempotency-Key":o()}});return{id:n.data.id,ticketNumber:n.data.attributes.ticketNumber,trackingToken:n.meta?.trackingToken,status:n.data.attributes.status}}async function c(e){let t=await a(`/tickets/track?token=${encodeURIComponent(e)}`),n=t.included??[];return{id:t.data.id,ticketNumber:t.data.attributes.ticketNumber,title:t.data.attributes.title,status:t.data.attributes.status,priority:t.data.attributes.priority,createdAt:t.data.attributes.createdAt,replies:n.filter(e=>e.type===`public-reply`).map(e=>({id:e.id,body:e.attributes.body,authorName:e.attributes.authorName,isStaff:e.attributes.isStaff,createdAt:e.attributes.createdAt}))}}async function l(e,t){await a(`/tickets/track/reply`,{method:`POST`,body:{trackingToken:e,body:t}})}let u={"widget.title":`Support`,"widget.newTicket":`New Ticket`,"widget.trackTicket":`Track Ticket`,"form.title":`Title`,"form.titlePlaceholder":`Brief summary of your issue`,"form.description":`Description`,"form.descriptionPlaceholder":`Describe your issue in detail...`,"form.email":`Email`,"form.emailPlaceholder":`your@email.com`,"form.priority":`Priority`,"form.priorityLow":`Low`,"form.priorityMedium":`Medium`,"form.priorityHigh":`High`,"form.priorityUrgent":`Urgent`,"form.category":`Category`,"form.categoryNone":`Select a category`,"form.submit":`Submit Ticket`,"form.submitting":`Submitting...`,"form.cancel":`Cancel`,"form.attachment":`Attach files`,"success.title":`Ticket Submitted!`,"success.ticketNumber":`Ticket #`,"success.trackingToken":`Your tracking token:`,"success.trackingHint":`Save this token to track your ticket status.`,"success.copyToken":`Copy Token`,"success.copied":`Copied!`,"success.close":`Close`,"success.trackNow":`Track Ticket`,"tracker.title":`Track Your Ticket`,"tracker.tokenPlaceholder":`Enter your tracking token (trk_...)`,"tracker.submit":`Track`,"tracker.tracking":`Tracking...`,"tracker.status":`Status`,"tracker.priority":`Priority`,"tracker.created":`Created`,"tracker.replies":`Replies`,"tracker.noReplies":`No replies yet.`,"tracker.replyPlaceholder":`Write a reply...`,"tracker.sendReply":`Send Reply`,"tracker.sending":`Sending...`,"tracker.back":`Back`,"tracker.staff":`Staff`,"error.generic":`Something went wrong. Please try again.`,"error.network":`Network error. Check your connection.`,"error.tokenInvalid":`Invalid or expired tracking token.`,"error.required":`This field is required.`,"error.emailInvalid":`Please enter a valid email address.`,"error.titleMin":`Title must be at least 5 characters.`,"portal.title":`Support Portal`,"portal.myTickets":`My Tickets`,"portal.noTickets":`No tickets yet.`,"portal.newTicket":`New Ticket`,"widget.close":`Close`,"menu.newTicket":`Submit a Ticket`,"menu.newTicketDesc":`Create a new support request`,"menu.myTickets":`My Tickets`,"menu.myTicketsDesc":`View and manage your tickets`,"menu.trackTicket":`Track a Ticket`,"menu.trackTicketDesc":`Check status with your tracking token`,"menu.knowledgeBase":`Knowledge Base`,"menu.knowledgeBaseDesc":`Browse help articles and guides`,"menu.myTicketsPlaceholder":`Sign in to view your tickets.`,"menu.trackPlaceholder":`Ticket tracking is coming soon.`,"menu.kbPlaceholder":`Knowledge base is coming soon.`,"menu.preferences":`Preferences`,"menu.preferencesDesc":`Language and appearance settings`,"prefs.title":`Preferences`,"prefs.language":`Language`,"prefs.theme":`Theme`,"prefs.light":`Light`,"prefs.dark":`Dark`,"prefs.auto":`System`,"branding.poweredBy":`Powered by`,"attach.dropzone":`Drop files here or click to browse`,"attach.dropzoneActive":`Drop files here`,"attach.maxFiles":`Maximum {max} files`,"attach.remove":`Remove`,"attach.uploading":`Uploading files...`,"attach.uploadProgress":`Uploading {name}... {percent}%`,"attach.invalidType":`File type not allowed`,"attach.tooLarge":`File exceeds maximum size`,"attach.tooMany":`Maximum number of files reached`,"attach.download":`Download`,"mytickets.title":`My Tickets`,"mytickets.emailPrompt":`Enter your email to view your tickets`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`Remember me`,"mytickets.lookup":`Find My Tickets`,"mytickets.lookingUp":`Looking up...`,"mytickets.noTickets":`No tickets yet.`,"mytickets.submitFirst":`Submit your first ticket`,"mytickets.noAccount":`No tickets found for this email.`,"detail.description":`Description`,"detail.attachments":`Attachments`,"detail.noAttachments":`No attachments`,"detail.replies":`Conversation`,"detail.noReplies":`No replies yet.`,"detail.replyPlaceholder":`Write a reply...`,"detail.sendReply":`Send`,"detail.sending":`Sending...`,"detail.staff":`Staff`,"detail.you":`You`,"detail.loading":`Loading ticket...`,"track.title":`Track a Ticket`,"track.tokenPlaceholder":`Enter tracking token (trk_...)`,"track.submit":`Track`,"track.tracking":`Tracking...`,"track.recentTickets":`Recent Tickets`,"track.invalidToken":`Invalid or expired tracking token.`,"prefs.clearEmail":`Clear saved email`,"prefs.emailCleared":`Email cleared`,"auth.login":`Login`,"auth.logout":`Logout`,"auth.sessionExpired":`Session expired. Please log in again.`,"prefs.accentColor":`Accent Color`,"form.categoryPlaceholder":`Select a category`,"form.categoryBack":`Back`,"form.categorySelected":`Category`,"diag.title":`Share diagnostic info`,"diag.hint":`Help us resolve your issue faster`,"diag.screenResolution":`Screen resolution`,"diag.deviceType":`Device type`,"diag.timezone":`Timezone`,"diag.referrerUrl":`Referrer URL`,"diag.language":`Browser language`,"diag.platform":`Platform`,"detail.resolve":`Mark as Resolved`,"detail.resolving":`Resolving...`,"detail.resolved":`Resolved`,"detail.sla":`SLA`},d={"widget.title":`الدعم`,"widget.newTicket":`تذكرة جديدة`,"widget.trackTicket":`تتبع التذكرة`,"form.title":`العنوان`,"form.titlePlaceholder":`ملخص موجز لمشكلتك`,"form.description":`الوصف`,"form.descriptionPlaceholder":`صف مشكلتك بالتفصيل...`,"form.email":`البريد الإلكتروني`,"form.emailPlaceholder":`your@email.com`,"form.priority":`الأولوية`,"form.priorityLow":`منخفضة`,"form.priorityMedium":`متوسطة`,"form.priorityHigh":`عالية`,"form.priorityUrgent":`عاجلة`,"form.category":`الفئة`,"form.categoryNone":`اختر فئة`,"form.submit":`إرسال التذكرة`,"form.submitting":`جارِ الإرسال...`,"form.cancel":`إلغاء`,"form.attachment":`إرفاق ملفات`,"success.title":`تم إرسال التذكرة!`,"success.ticketNumber":`تذكرة #`,"success.trackingToken":`رمز التتبع الخاص بك:`,"success.trackingHint":`احفظ هذا الرمز لتتبع حالة تذكرتك.`,"success.copyToken":`نسخ الرمز`,"success.copied":`تم النسخ!`,"success.close":`إغلاق`,"success.trackNow":`تتبع التذكرة`,"tracker.title":`تتبع تذكرتك`,"tracker.tokenPlaceholder":`أدخل رمز التتبع الخاص بك (trk_...)`,"tracker.submit":`تتبع`,"tracker.tracking":`جارِ التتبع...`,"tracker.status":`الحالة`,"tracker.priority":`الأولوية`,"tracker.created":`تاريخ الإنشاء`,"tracker.replies":`الردود`,"tracker.noReplies":`لا توجد ردود بعد.`,"tracker.replyPlaceholder":`اكتب رداً...`,"tracker.sendReply":`إرسال الرد`,"tracker.sending":`جارِ الإرسال...`,"tracker.back":`رجوع`,"tracker.staff":`فريق الدعم`,"error.generic":`حدث خطأ ما. يرجى المحاولة مرة أخرى.`,"error.network":`خطأ في الشبكة. تحقق من اتصالك.`,"error.tokenInvalid":`رمز التتبع غير صالح أو منتهي الصلاحية.`,"error.required":`هذا الحقل مطلوب.`,"error.emailInvalid":`يرجى إدخال بريد إلكتروني صالح.`,"error.titleMin":`يجب أن يكون العنوان 5 أحرف على الأقل.`,"portal.title":`بوابة الدعم`,"portal.myTickets":`تذاكري`,"portal.noTickets":`لا توجد تذاكر بعد.`,"portal.newTicket":`تذكرة جديدة`,"widget.close":`إغلاق`,"menu.newTicket":`إرسال تذكرة`,"menu.newTicketDesc":`إنشاء طلب ��عم جديد`,"menu.myTickets":`تذاكري`,"menu.myTicketsDesc":`عرض وإدارة تذاكرك`,"menu.trackTicket":`تتبع تذكرة`,"menu.trackTicketDesc":`تحقق من الحالة باستخدام رمز التتبع`,"menu.knowledgeBase":`قاعدة المعرفة`,"menu.knowledgeBaseDesc":`تصفح مقالات المساعدة والأدلة`,"menu.myTicketsPlaceholder":`سجّل الدخول ��عرض تذاكرك.`,"menu.trackPlaceholder":`تتبع التذاكر قريبًا.`,"menu.kbPlaceholder":`قاعدة المعرفة قريبًا.`,"menu.preferences":`التفضيلات`,"menu.preferencesDesc":`إعدادات اللغة والمظهر`,"prefs.title":`التفضيلات`,"prefs.language":`اللغة`,"prefs.theme":`المظهر`,"prefs.light":`فاتح`,"prefs.dark":`داكن`,"prefs.auto":`النظام`,"branding.poweredBy":`مدعوم من`,"attach.dropzone":`اسحب الملفات هنا أو انقر للتصفح`,"attach.dropzoneActive":`أفلت الملفات هنا`,"attach.maxFiles":`بحد أقصى {max} ملفات`,"attach.remove":`إزالة`,"attach.uploading":`جارِ رفع الملفات...`,"attach.uploadProgress":`جارِ رفع {name}... {percent}%`,"attach.invalidType":`نوع الملف غير مسموح`,"attach.tooLarge":`حجم الملف يتجاوز الحد الأقصى`,"attach.tooMany":`تم الوصول للحد الأقصى لعدد الملفات`,"attach.download":`تحميل`,"mytickets.title":`تذاكري`,"mytickets.emailPrompt":`أدخل بريدك الإلكتروني لعرض تذاكرك`,"mytickets.emailPlaceholder":`your@email.com`,"mytickets.rememberMe":`تذكرني`,"mytickets.lookup":`البحث عن تذاكري`,"mytickets.lookingUp":`جارِ البحث...`,"mytickets.noTickets":`لا توجد تذاكر بعد.`,"mytickets.submitFirst":`أرسل تذكرتك الأولى`,"mytickets.noAccount":`لم يتم العثور على تذاكر لهذا البريد.`,"detail.description":`الوصف`,"detail.attachments":`المرفقات`,"detail.noAttachments":`لا توجد مرفقات`,"detail.replies":`المحادثة`,"detail.noReplies":`لا توجد ردود بعد.`,"detail.replyPlaceholder":`اكتب رداً...`,"detail.sendReply":`إرسال`,"detail.sending":`جارِ الإرسال...`,"detail.staff":`فريق الدعم`,"detail.you":`أنت`,"detail.loading":`جارِ تحميل التذكرة...`,"track.title":`تتبع تذكرة`,"track.tokenPlaceholder":`أدخل رمز التتبع (trk_...)`,"track.submit":`تتبع`,"track.tracking":`جارِ التتبع...`,"track.recentTickets":`التذاكر الأخيرة`,"track.invalidToken":`رمز التتبع غير صالح أو منتهي.`,"prefs.clearEmail":`مسح البريد المحفوظ`,"prefs.emailCleared":`تم مسح البريد`,"auth.login":`تسجيل الدخول`,"auth.logout":`تسجيل الخروج`,"auth.sessionExpired":`انتهت الجلسة. يرجى تسجيل الدخول مرة أخرى.`,"prefs.accentColor":`لون التمييز`,"form.categoryPlaceholder":`اختر فئة`,"form.categoryBack":`رجوع`,"form.categorySelected":`الفئة`,"diag.title":`مشاركة معلومات التشخيص`,"diag.hint":`ساعدنا في حل مشكلتك بشكل أسرع`,"diag.screenResolution":`دقة الشاشة`,"diag.deviceType":`نوع الجهاز`,"diag.timezone":`المنطقة الزمنية`,"diag.referrerUrl":`رابط المصدر`,"diag.language":`لغة المتصفح`,"diag.platform":`المنصة`,"detail.resolve":`تحديد كمحلول`,"detail.resolving":`جارِ الحل...`,"detail.resolved":`محلول`,"detail.sla":`اتفاقية الخدمة`},f={primaryColor:`#42b983`,mode:`light`,borderRadius:`8px`,fontFamily:`inherit`,zIndex:9999};function p(e){return e===`auto`?typeof window<`u`&&window.matchMedia?.(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e??`light`}function m(e={}){let t={...f,...e,mode:p(e.mode??f.mode)},n=h(t.primaryColor),r=Math.min(n.l+30,95),i=Math.max(n.l-15,10);return[`--rqd-primary: ${t.primaryColor}`,`--rqd-primary-h: ${n.h}`,`--rqd-primary-s: ${n.s}%`,`--rqd-primary-l: ${n.l}%`,`--rqd-primary-light: hsl(${n.h}, ${n.s}%, ${r}%)`,`--rqd-primary-dark: hsl(${n.h}, ${n.s}%, ${i}%)`,`--rqd-radius: ${t.borderRadius}`,`--rqd-font: ${t.fontFamily}`,`--rqd-z: ${t.zIndex}`,`--rqd-bg: ${t.mode===`dark`?`#1a1a2e`:`#ffffff`}`,`--rqd-bg-secondary: ${t.mode===`dark`?`#16213e`:`#f8f9fa`}`,`--rqd-text: ${t.mode===`dark`?`#e0e0e0`:`#1a1a2e`}`,`--rqd-text-secondary: ${t.mode===`dark`?`#a0a0b0`:`#6c757d`}`,`--rqd-border: ${t.mode===`dark`?`#2a2a4a`:`#e0e0e0`}`,`--rqd-input-bg: ${t.mode===`dark`?`#0f3460`:`#ffffff`}`,`--rqd-shadow: ${t.mode===`dark`?`0 8px 32px rgba(0,0,0,0.4)`:`0 8px 32px rgba(0,0,0,0.12)`}`].join(`; `)}function h(e){let t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!t)return{h:160,s:51,l:49};let n=parseInt(t[1],16)/255,r=parseInt(t[2],16)/255,i=parseInt(t[3],16)/255,a=Math.max(n,r,i),o=Math.min(n,r,i),s=0,c=0,l=(a+o)/2;if(a!==o){let e=a-o;c=l>.5?e/(2-a-o):e/(a+o),s=a===n?((r-i)/e+(r<i?6:0))/6:a===r?((i-n)/e+2)/6:((n-r)/e+4)/6}return{h:Math.round(s*360),s:Math.round(c*100),l:Math.round(l*100)}}function ee(){return te}let te=`:host { all: initial; }
2
2
  .rqd-root { font-family: var(--rqd-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif); font-size: 14px; line-height: 1.5; color: var(--rqd-text); -webkit-font-smoothing: antialiased; }
3
3
  .rqd-fab { position: fixed; bottom: 20px; width: 56px; height: 56px; border-radius: 50%; background: var(--rqd-primary); color: #fff; border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 16px rgba(0,0,0,0.2); transition: transform 0.2s, box-shadow 0.2s; pointer-events: auto; z-index: var(--rqd-z, 9999); }
4
4
  .rqd-fab:hover { transform: scale(1.08); box-shadow: 0 6px 20px rgba(0,0,0,0.25); }
@@ -105,6 +105,22 @@ var ReqdeskWidget=(function(e,t){Object.defineProperty(e,Symbol.toStringTag,{val
105
105
  .rqd-ticket-list { display: flex; flex-direction: column; gap: 6px; }
106
106
  .rqd-loading { text-align: center; padding: 24px 0; color: var(--rqd-text-secondary); font-size: 14px; }
107
107
  .rqd-reply-compose { margin-top: 12px; display: flex; flex-direction: column; gap: 8px; }
108
+ .rqd-category-list { display: flex; flex-direction: column; gap: 4px; margin-bottom: 14px; }
109
+ .rqd-category-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--rqd-bg-secondary); border: 1px solid transparent; border-radius: calc(var(--rqd-radius, 8px) / 2); cursor: pointer; font-size: 14px; font-family: inherit; color: var(--rqd-text); transition: border-color 0.15s, background 0.15s; text-align: start; width: 100%; }
110
+ .rqd-category-item:hover { border-color: var(--rqd-primary); }
111
+ .rqd-category-item-chevron { color: var(--rqd-text-secondary); font-size: 16px; }
112
+ .rqd-category-breadcrumb { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin-bottom: 8px; font-size: 12px; color: var(--rqd-text-secondary); }
113
+ .rqd-category-breadcrumb button { background: none; border: none; color: var(--rqd-primary); cursor: pointer; font-size: 12px; font-family: inherit; padding: 0; }
114
+ .rqd-category-breadcrumb button:hover { text-decoration: underline; }
115
+ .rqd-category-breadcrumb-sep { color: var(--rqd-text-secondary); }
116
+ .rqd-category-selected { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--rqd-primary-light); border-radius: calc(var(--rqd-radius, 8px) / 2); font-size: 13px; color: var(--rqd-primary-dark); margin-bottom: 14px; }
117
+ .rqd-category-selected button { background: none; border: none; color: var(--rqd-primary-dark); cursor: pointer; font-size: 14px; margin-left: auto; padding: 0; }
118
+ .rqd-diag-toggle { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--rqd-bg-secondary); border-radius: calc(var(--rqd-radius, 8px) / 2); cursor: pointer; font-size: 13px; color: var(--rqd-text-secondary); border: none; width: 100%; font-family: inherit; text-align: start; margin-bottom: 8px; }
119
+ .rqd-diag-toggle:hover { color: var(--rqd-text); }
120
+ .rqd-diag-panel { display: flex; flex-direction: column; gap: 6px; padding: 8px 0; }
121
+ .rqd-diag-item { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--rqd-text-secondary); }
122
+ .rqd-diag-item input[type="checkbox"] { accent-color: var(--rqd-primary); width: 14px; height: 14px; }
123
+ .rqd-diag-item-value { color: var(--rqd-text); font-family: monospace; font-size: 11px; margin-left: auto; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
108
124
  .rqd-auth-btn { background: rgba(255,255,255,0.2); border: 1px solid rgba(255,255,255,0.4); color: #fff; cursor: pointer; padding: 4px 12px; border-radius: 12px; font-size: 12px; font-weight: 500; font-family: inherit; transition: background 0.15s; white-space: nowrap; }
109
125
  .rqd-auth-btn:hover { background: rgba(255,255,255,0.3); }
110
126
  .rqd-color-presets { display: flex; gap: 8px; flex-wrap: wrap; }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { _ as submitTrackingReply, a as saveTrackingToken, b as configureWidgetClient, c as getWidgetStyles, d as en, g as submitTicket, l as themeToVars, n as getTrackingTokens, o as saveWidgetConfig, r as loadWidgetConfig, u as ar, v as trackTicket } from "./storage-CC5BCsxP.js";
1
+ import { S as configureWidgetClient, a as saveTrackingToken, b as trackTicket, c as getWidgetStyles, d as en, l as themeToVars, n as getTrackingTokens, o as saveWidgetConfig, r as loadWidgetConfig, u as ar, v as submitTicket, y as submitTrackingReply } from "./storage-PjDHb5v7.js";
2
2
  //#region src/shadow-dom.ts
3
3
  let shadowRoot = null;
4
4
  let hostEl = null;
@@ -1,4 +1,4 @@
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";
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-rPiXlS0A.js";
2
2
  import { ReactNode } from "react";
3
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
 
@@ -104,4 +104,4 @@ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
104
104
 
105
105
  //#endregion
106
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
107
+ //# sourceMappingURL=react-DYAKyC3I.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"react-DYAKyC3I.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"}
@@ -1,4 +1,4 @@
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";
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-i3IgBEjw.cjs";
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
  import { ReactNode } from "react";
4
4
 
@@ -104,4 +104,4 @@ declare function loadWidgetConfig(apiKey: string): WidgetConfigPersist | null;
104
104
 
105
105
  //#endregion
106
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
107
+ //# sourceMappingURL=react-PYPqwxcj.d.cts.map
@@ -1 +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"}
1
+ {"version":3,"file":"react-PYPqwxcj.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"}
package/dist/react.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_storage = require("./storage-Db9XjupR.cjs");
2
+ const require_storage = require("./storage-DqhhTxeh.cjs");
3
3
  let react = require("react");
4
4
  let _tanstack_react_query = require("@tanstack/react-query");
5
5
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -481,6 +481,132 @@ function SupportPortal({ className }) {
481
481
  }) });
482
482
  }
483
483
  //#endregion
484
+ //#region src/react/queries.ts
485
+ const widgetTicketDetailOptions = (ticketId) => (0, _tanstack_react_query.queryOptions)({
486
+ queryKey: ["widget-ticket", ticketId],
487
+ queryFn: () => require_storage.getTicketDetail(ticketId),
488
+ staleTime: 6e4,
489
+ enabled: !!ticketId
490
+ });
491
+ const widgetMyTicketsOptions = (projectId, userId) => (0, _tanstack_react_query.queryOptions)({
492
+ queryKey: [
493
+ "widget-tickets",
494
+ projectId,
495
+ userId
496
+ ],
497
+ queryFn: () => require_storage.listMyTickets(projectId, userId),
498
+ staleTime: 3e4,
499
+ placeholderData: _tanstack_react_query.keepPreviousData,
500
+ enabled: !!userId
501
+ });
502
+ const widgetUserOptions = (projectId, email) => (0, _tanstack_react_query.queryOptions)({
503
+ queryKey: [
504
+ "widget-user",
505
+ projectId,
506
+ email
507
+ ],
508
+ queryFn: () => require_storage.resolveWidgetUser(projectId, email),
509
+ staleTime: 5 * 6e4,
510
+ enabled: !!email
511
+ });
512
+ const widgetCategoriesOptions = (projectId, parentId) => (0, _tanstack_react_query.queryOptions)({
513
+ queryKey: [
514
+ "widget-categories",
515
+ projectId,
516
+ parentId ?? "root"
517
+ ],
518
+ queryFn: () => require_storage.getCategories(projectId, parentId),
519
+ staleTime: 5 * 6e4
520
+ });
521
+ //#endregion
522
+ //#region src/client-metadata.ts
523
+ const STORAGE_PREFIX = "reqdesk_diag_";
524
+ const DEFAULT_PREFS = {
525
+ screenResolution: false,
526
+ deviceType: false,
527
+ timezone: false,
528
+ referrerUrl: false,
529
+ language: false,
530
+ platform: false
531
+ };
532
+ /** Always collected — minimal, non-sensitive */
533
+ function collectMinimalMetadata() {
534
+ const meta = {};
535
+ try {
536
+ meta.pageUrl = window.location.href;
537
+ meta.userAgent = navigator.userAgent;
538
+ } catch {}
539
+ return meta;
540
+ }
541
+ /** Full diagnostic set — only included for opted-in fields */
542
+ function collectDiagnosticMetadata(prefs) {
543
+ const meta = {};
544
+ try {
545
+ if (prefs.screenResolution) meta.screenResolution = `${screen.width}x${screen.height}`;
546
+ if (prefs.deviceType) meta.deviceType = detectDeviceType();
547
+ if (prefs.timezone) meta.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
548
+ if (prefs.referrerUrl && document.referrer) meta.referrerUrl = document.referrer;
549
+ if (prefs.language) meta.language = navigator.language;
550
+ if (prefs.platform) meta.platform = navigator.platform;
551
+ } catch {}
552
+ return meta;
553
+ }
554
+ /** Combine minimal + opted-in diagnostic metadata */
555
+ function collectAllMetadata(apiKey) {
556
+ const prefs = getMetadataPreferences(apiKey);
557
+ return {
558
+ ...collectMinimalMetadata(),
559
+ ...collectDiagnosticMetadata(prefs)
560
+ };
561
+ }
562
+ function getMetadataPreferences(apiKey) {
563
+ try {
564
+ const raw = localStorage.getItem(`${STORAGE_PREFIX}${apiKey}`);
565
+ if (raw) return {
566
+ ...DEFAULT_PREFS,
567
+ ...JSON.parse(raw)
568
+ };
569
+ } catch {}
570
+ return { ...DEFAULT_PREFS };
571
+ }
572
+ function saveMetadataPreferences(apiKey, prefs) {
573
+ try {
574
+ localStorage.setItem(`${STORAGE_PREFIX}${apiKey}`, JSON.stringify(prefs));
575
+ } catch {}
576
+ }
577
+ function detectDeviceType() {
578
+ const ua = navigator.userAgent.toLowerCase();
579
+ if (/tablet|ipad|playbook|silk/i.test(ua)) return "tablet";
580
+ if (/mobile|iphone|ipod|android.*mobile|windows phone/i.test(ua)) return "mobile";
581
+ return "desktop";
582
+ }
583
+ const DIAGNOSTIC_FIELDS = [
584
+ {
585
+ key: "screenResolution",
586
+ labelKey: "diag.screenResolution"
587
+ },
588
+ {
589
+ key: "deviceType",
590
+ labelKey: "diag.deviceType"
591
+ },
592
+ {
593
+ key: "timezone",
594
+ labelKey: "diag.timezone"
595
+ },
596
+ {
597
+ key: "referrerUrl",
598
+ labelKey: "diag.referrerUrl"
599
+ },
600
+ {
601
+ key: "language",
602
+ labelKey: "diag.language"
603
+ },
604
+ {
605
+ key: "platform",
606
+ labelKey: "diag.platform"
607
+ }
608
+ ];
609
+ //#endregion
484
610
  //#region src/react/views/SubmitTicketView.tsx
485
611
  const translations$4 = {
486
612
  en: require_storage.en,
@@ -530,6 +656,19 @@ function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, user
530
656
  const [uploadProgress, setUploadProgress] = (0, react.useState)(null);
531
657
  const [success, setSuccess] = (0, react.useState)(null);
532
658
  const [rememberEmail, setRememberEmail] = (0, react.useState)(!!savedEmail);
659
+ const [categoryPath, setCategoryPath] = (0, react.useState)([]);
660
+ const [selectedCategory, setSelectedCategory] = (0, react.useState)(null);
661
+ const { data: categories = [] } = (0, _tanstack_react_query.useQuery)(widgetCategoriesOptions(projectId, categoryPath.length > 0 ? categoryPath[categoryPath.length - 1].id : null));
662
+ const [diagOpen, setDiagOpen] = (0, react.useState)(false);
663
+ const [diagPrefs, setDiagPrefs] = (0, react.useState)(getMetadataPreferences(ctx.apiKey));
664
+ const diagValues = collectDiagnosticMetadata({
665
+ screenResolution: true,
666
+ deviceType: true,
667
+ timezone: true,
668
+ referrerUrl: true,
669
+ language: true,
670
+ platform: true
671
+ });
533
672
  const t = (0, react.useCallback)((key) => {
534
673
  if (ctx.translations?.[key]) return ctx.translations[key];
535
674
  return (translations$4[ctx.language] ?? translations$4.en)[key] ?? key;
@@ -616,12 +755,15 @@ function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, user
616
755
  }
617
756
  setErrors({});
618
757
  if (rememberEmail && email) require_storage.saveWidgetEmail(ctx.apiKey, email);
758
+ saveMetadataPreferences(ctx.apiKey, diagPrefs);
619
759
  const validFiles = files.filter((f) => !f.error);
620
760
  const data = {
621
761
  title,
622
762
  description: formData.get("description")?.trim() || void 0,
623
763
  email,
624
- priority: formData.get("priority") ?? "medium"
764
+ priority: formData.get("priority") ?? "medium",
765
+ categoryId: selectedCategory?.id,
766
+ clientMetadata: collectAllMetadata(ctx.apiKey)
625
767
  };
626
768
  submitMutation.mutate({
627
769
  data,
@@ -802,6 +944,97 @@ function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, user
802
944
  ]
803
945
  })]
804
946
  }),
947
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
948
+ className: "rqd-form-group",
949
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("label", {
950
+ className: "rqd-label",
951
+ children: t("form.categorySelected")
952
+ }), selectedCategory ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
953
+ className: "rqd-category-selected",
954
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
955
+ categoryPath.map((c) => c.name).join(" > "),
956
+ categoryPath.length > 0 ? " > " : "",
957
+ selectedCategory.name
958
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
959
+ type: "button",
960
+ onClick: () => {
961
+ setSelectedCategory(null);
962
+ setCategoryPath([]);
963
+ },
964
+ children: "×"
965
+ })]
966
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [categoryPath.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
967
+ className: "rqd-category-breadcrumb",
968
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
969
+ type: "button",
970
+ onClick: () => setCategoryPath([]),
971
+ children: t("form.categoryPlaceholder")
972
+ }), categoryPath.map((c, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
973
+ className: "rqd-category-breadcrumb-sep",
974
+ children: "›"
975
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
976
+ type: "button",
977
+ onClick: () => setCategoryPath((prev) => prev.slice(0, i + 1)),
978
+ children: c.name
979
+ })] }, c.id))]
980
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
981
+ className: "rqd-category-list",
982
+ children: [categories.map((cat) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
983
+ type: "button",
984
+ className: "rqd-category-item",
985
+ onClick: () => {
986
+ if (cat.hasChildren) setCategoryPath((prev) => [...prev, cat]);
987
+ else setSelectedCategory(cat);
988
+ },
989
+ children: [cat.name, cat.hasChildren && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
990
+ className: "rqd-category-item-chevron",
991
+ children: "›"
992
+ })]
993
+ }, cat.id)), categories.length === 0 && categoryPath.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
994
+ style: {
995
+ fontSize: 13,
996
+ color: "var(--rqd-text-secondary)"
997
+ },
998
+ children: t("form.categoryPlaceholder")
999
+ })]
1000
+ })] })]
1001
+ }),
1002
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1003
+ className: "rqd-form-group",
1004
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1005
+ type: "button",
1006
+ className: "rqd-diag-toggle",
1007
+ onClick: () => setDiagOpen((prev) => !prev),
1008
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("diag.title") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: diagOpen ? "▲" : "▼" })]
1009
+ }), diagOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1010
+ className: "rqd-diag-panel",
1011
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1012
+ style: {
1013
+ fontSize: 12,
1014
+ color: "var(--rqd-text-secondary)",
1015
+ margin: "0 0 6px"
1016
+ },
1017
+ children: t("diag.hint")
1018
+ }), DIAGNOSTIC_FIELDS.map((field) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1019
+ className: "rqd-diag-item",
1020
+ children: [
1021
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1022
+ type: "checkbox",
1023
+ checked: diagPrefs[field.key],
1024
+ onChange: (e) => setDiagPrefs((prev) => ({
1025
+ ...prev,
1026
+ [field.key]: e.target.checked
1027
+ }))
1028
+ }),
1029
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(field.labelKey) }),
1030
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1031
+ className: "rqd-diag-item-value",
1032
+ children: diagValues[field.key] ?? "—"
1033
+ })
1034
+ ]
1035
+ }, field.key))]
1036
+ })]
1037
+ }),
805
1038
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
806
1039
  className: "rqd-form-group",
807
1040
  children: [
@@ -865,35 +1098,6 @@ function SubmitTicketView({ projectId, onSuccess, onError, isAuthenticated, user
865
1098
  });
866
1099
  }
867
1100
  //#endregion
868
- //#region src/react/queries.ts
869
- const widgetTicketDetailOptions = (ticketId) => (0, _tanstack_react_query.queryOptions)({
870
- queryKey: ["widget-ticket", ticketId],
871
- queryFn: () => require_storage.getTicketDetail(ticketId),
872
- staleTime: 6e4,
873
- enabled: !!ticketId
874
- });
875
- const widgetMyTicketsOptions = (projectId, userId) => (0, _tanstack_react_query.queryOptions)({
876
- queryKey: [
877
- "widget-tickets",
878
- projectId,
879
- userId
880
- ],
881
- queryFn: () => require_storage.listMyTickets(projectId, userId),
882
- staleTime: 3e4,
883
- placeholderData: _tanstack_react_query.keepPreviousData,
884
- enabled: !!userId
885
- });
886
- const widgetUserOptions = (projectId, email) => (0, _tanstack_react_query.queryOptions)({
887
- queryKey: [
888
- "widget-user",
889
- projectId,
890
- email
891
- ],
892
- queryFn: () => require_storage.resolveWidgetUser(projectId, email),
893
- staleTime: 5 * 6e4,
894
- enabled: !!email
895
- });
896
- //#endregion
897
1101
  //#region src/react/views/MyTicketsView.tsx
898
1102
  const translations$3 = {
899
1103
  en: require_storage.en,
@@ -1075,6 +1279,24 @@ function TicketDetailView({ ticketId, onBack }) {
1075
1279
  if (context?.previous) queryClient.setQueryData(["widget-ticket", ticketId], context.previous);
1076
1280
  }
1077
1281
  });
1282
+ const resolveMutation = (0, _tanstack_react_query.useMutation)({
1283
+ mutationFn: () => require_storage.closeTicket(ticketId),
1284
+ onMutate: async () => {
1285
+ await queryClient.cancelQueries({ queryKey: ["widget-ticket", ticketId] });
1286
+ const previous = queryClient.getQueryData(["widget-ticket", ticketId]);
1287
+ if (previous) queryClient.setQueryData(["widget-ticket", ticketId], {
1288
+ ...previous,
1289
+ status: "resolved"
1290
+ });
1291
+ return { previous };
1292
+ },
1293
+ onSuccess: () => {
1294
+ queryClient.invalidateQueries({ queryKey: ["widget-ticket", ticketId] });
1295
+ },
1296
+ onError: (_err, _vars, context) => {
1297
+ if (context?.previous) queryClient.setQueryData(["widget-ticket", ticketId], context.previous);
1298
+ }
1299
+ });
1078
1300
  if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1079
1301
  className: "rqd-loading",
1080
1302
  children: t("detail.loading")
@@ -1183,11 +1405,28 @@ function TicketDetailView({ ticketId, onBack }) {
1183
1405
  onChange: (e) => setReplyBody(e.target.value),
1184
1406
  placeholder: t("detail.replyPlaceholder"),
1185
1407
  rows: 3
1186
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1187
- className: "rqd-btn rqd-btn-primary",
1188
- onClick: () => replyMutation.mutate(replyBody.trim()),
1189
- disabled: !replyBody.trim() || replyMutation.isPending,
1190
- children: replyMutation.isPending ? t("detail.sending") : t("detail.sendReply")
1408
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1409
+ style: {
1410
+ display: "flex",
1411
+ gap: 8
1412
+ },
1413
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1414
+ className: "rqd-btn rqd-btn-primary",
1415
+ style: { flex: 1 },
1416
+ onClick: () => replyMutation.mutate(replyBody.trim()),
1417
+ disabled: !replyBody.trim() || replyMutation.isPending,
1418
+ children: replyMutation.isPending ? t("detail.sending") : t("detail.sendReply")
1419
+ }), ticket.status !== "resolved" && ticket.status !== "closed" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1420
+ className: "rqd-btn rqd-btn-secondary",
1421
+ style: {
1422
+ flex: 0,
1423
+ whiteSpace: "nowrap",
1424
+ padding: "10px 16px"
1425
+ },
1426
+ onClick: () => resolveMutation.mutate(),
1427
+ disabled: resolveMutation.isPending,
1428
+ children: resolveMutation.isPending ? t("detail.resolving") : t("detail.resolve")
1429
+ })]
1191
1430
  })]
1192
1431
  })
1193
1432
  ] });
package/dist/react.d.cts CHANGED
@@ -1 +1 @@
1
- export * from './react-8GCnIHnw.cjs';
1
+ export * from './react-PYPqwxcj.cjs';
package/dist/react.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './react-D69QlAm1.js';
1
+ export * from './react-DYAKyC3I.js';