pulse-feedback-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.
Files changed (73) hide show
  1. package/dist/PulseWidget.d.ts +3 -0
  2. package/dist/PulseWidget.d.ts.map +1 -0
  3. package/dist/PulseWidget.mjs +62 -0
  4. package/dist/PulseWidget.mjs.map +1 -0
  5. package/dist/components/ConversationView.d.ts +11 -0
  6. package/dist/components/ConversationView.d.ts.map +1 -0
  7. package/dist/components/ConversationView.mjs +70 -0
  8. package/dist/components/ConversationView.mjs.map +1 -0
  9. package/dist/components/ConversationView.module.css.mjs +8 -0
  10. package/dist/components/ConversationView.module.css.mjs.map +1 -0
  11. package/dist/components/FeedbackForm.d.ts +14 -0
  12. package/dist/components/FeedbackForm.d.ts.map +1 -0
  13. package/dist/components/FeedbackForm.mjs +76 -0
  14. package/dist/components/FeedbackForm.mjs.map +1 -0
  15. package/dist/components/FeedbackForm.module.css.mjs +8 -0
  16. package/dist/components/FeedbackForm.module.css.mjs.map +1 -0
  17. package/dist/components/FeedbackPanel.d.ts +17 -0
  18. package/dist/components/FeedbackPanel.d.ts.map +1 -0
  19. package/dist/components/FeedbackPanel.mjs +41 -0
  20. package/dist/components/FeedbackPanel.mjs.map +1 -0
  21. package/dist/components/FeedbackPanel.module.css.mjs +8 -0
  22. package/dist/components/FeedbackPanel.module.css.mjs.map +1 -0
  23. package/dist/components/SuccessState.d.ts +7 -0
  24. package/dist/components/SuccessState.d.ts.map +1 -0
  25. package/dist/components/SuccessState.mjs +9 -0
  26. package/dist/components/SuccessState.mjs.map +1 -0
  27. package/dist/components/SuccessState.module.css.mjs +8 -0
  28. package/dist/components/SuccessState.module.css.mjs.map +1 -0
  29. package/dist/components/ThreadList.d.ts +9 -0
  30. package/dist/components/ThreadList.d.ts.map +1 -0
  31. package/dist/components/ThreadList.mjs +58 -0
  32. package/dist/components/ThreadList.mjs.map +1 -0
  33. package/dist/components/ThreadList.module.css.mjs +8 -0
  34. package/dist/components/ThreadList.module.css.mjs.map +1 -0
  35. package/dist/components/TriggerButton.d.ts +9 -0
  36. package/dist/components/TriggerButton.d.ts.map +1 -0
  37. package/dist/components/TriggerButton.mjs +10 -0
  38. package/dist/components/TriggerButton.mjs.map +1 -0
  39. package/dist/components/TriggerButton.module.css.mjs +8 -0
  40. package/dist/components/TriggerButton.module.css.mjs.map +1 -0
  41. package/dist/components/TypeSelector.d.ts +8 -0
  42. package/dist/components/TypeSelector.d.ts.map +1 -0
  43. package/dist/components/TypeSelector.mjs +13 -0
  44. package/dist/components/TypeSelector.mjs.map +1 -0
  45. package/dist/components/TypeSelector.module.css.mjs +8 -0
  46. package/dist/components/TypeSelector.module.css.mjs.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.mjs +2 -0
  50. package/dist/index.mjs.map +1 -0
  51. package/dist/lib/api.d.ts +35 -0
  52. package/dist/lib/api.d.ts.map +1 -0
  53. package/dist/lib/api.mjs +105 -0
  54. package/dist/lib/api.mjs.map +1 -0
  55. package/dist/lib/capture.d.ts +7 -0
  56. package/dist/lib/capture.d.ts.map +1 -0
  57. package/dist/lib/capture.mjs +14 -0
  58. package/dist/lib/capture.mjs.map +1 -0
  59. package/dist/lib/device.d.ts +2 -0
  60. package/dist/lib/device.d.ts.map +1 -0
  61. package/dist/lib/device.mjs +34 -0
  62. package/dist/lib/device.mjs.map +1 -0
  63. package/dist/lib/supabase.d.ts +4 -0
  64. package/dist/lib/supabase.d.ts.map +1 -0
  65. package/dist/lib/supabase.mjs +19 -0
  66. package/dist/lib/supabase.mjs.map +1 -0
  67. package/dist/node_modules/style-inject/dist/style-inject.es.mjs +29 -0
  68. package/dist/node_modules/style-inject/dist/style-inject.es.mjs.map +1 -0
  69. package/dist/types.d.ts +89 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.mjs +45 -0
  72. package/dist/types.mjs.map +1 -0
  73. package/package.json +52 -0
@@ -0,0 +1,9 @@
1
+ interface TriggerButtonProps {
2
+ onClick: () => void;
3
+ position: 'bottom-right' | 'bottom-left';
4
+ accentColor: string;
5
+ hasNotification: boolean;
6
+ }
7
+ export declare function TriggerButton({ onClick, position, accentColor, hasNotification }: TriggerButtonProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=TriggerButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerButton.d.ts","sourceRoot":"","sources":["../../src/components/TriggerButton.tsx"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,cAAc,GAAG,aAAa,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,EAAE,kBAAkB,2CAiBpG"}
@@ -0,0 +1,10 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import styles from './TriggerButton.module.css.mjs';
3
+
4
+ function TriggerButton({ onClick, position, accentColor, hasNotification }) {
5
+ const posClass = position === 'bottom-left' ? styles.bottomLeft : styles.bottomRight;
6
+ return (jsxs("button", { className: `${styles.trigger} ${posClass}`, onClick: onClick, style: { backgroundColor: accentColor }, "aria-label": "Open feedback", type: "button", children: [jsx("svg", { className: styles.triggerIcon, viewBox: "0 0 24 24", children: jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) }), hasNotification && jsx("span", { className: styles.notificationDot })] }));
7
+ }
8
+
9
+ export { TriggerButton };
10
+ //# sourceMappingURL=TriggerButton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerButton.mjs","sources":["../../src/components/TriggerButton.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;AAUM,SAAU,aAAa,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAsB,EAAA;AACnG,IAAA,MAAM,QAAQ,GAAG,QAAQ,KAAK,aAAa,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW;IAEpF,QACEA,IAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,EAC1C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,EAAA,YAAA,EAC5B,eAAe,EAC1B,IAAI,EAAC,QAAQ,EAAA,QAAA,EAAA,CAEbC,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,EAAC,WAAW,EAAA,QAAA,EACrDA,GAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,+DAA+D,EAAA,CAAG,EAAA,CACtE,EACL,eAAe,IAAIA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,eAAe,EAAA,CAAI,CAAA,EAAA,CACxD;AAEb;;;;"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../node_modules/style-inject/dist/style-inject.es.mjs';
2
+
3
+ var css_248z = ".TriggerButton-module_trigger__02CR-{align-items:center;border:none;border-radius:50%;box-shadow:0 2px 12px rgba(0,0,0,.15);cursor:pointer;display:flex;height:48px;justify-content:center;outline:none;padding:0;position:fixed;transition:transform .12s cubic-bezier(.22,1,.36,1),box-shadow .12s cubic-bezier(.22,1,.36,1);width:48px;z-index:9999}.TriggerButton-module_trigger__02CR-:hover{box-shadow:0 4px 20px rgba(0,0,0,.2);transform:scale(1.08)}.TriggerButton-module_trigger__02CR-:active{transform:scale(.95)}.TriggerButton-module_bottomRight__566sd{bottom:16px;right:16px}.TriggerButton-module_bottomLeft__G7wbE{bottom:16px;left:16px}.TriggerButton-module_triggerIcon__WdZYH{fill:none;stroke:currentColor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;color:#fff;height:24px;width:24px}.TriggerButton-module_notificationDot__b1Thf{animation:TriggerButton-module_pulse-dot__TIqUH 2s ease-in-out infinite;background:#ef4444;border:2px solid #fff;border-radius:50%;height:10px;position:absolute;right:-2px;top:-2px;width:10px}@keyframes TriggerButton-module_pulse-dot__TIqUH{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.3)}}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRyaWdnZXJCdXR0b24ubW9kdWxlLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxQ0FTRSxrQkFBbUIsQ0FIbkIsV0FBWSxDQURaLGlCQUFrQixDQU1sQixxQ0FBMEMsQ0FKMUMsY0FBZSxDQUNmLFlBQWEsQ0FKYixXQUFZLENBTVosc0JBQXVCLENBS3ZCLFlBQWEsQ0FEYixTQUFVLENBYlYsY0FBZSxDQVdmLDZGQUMyRCxDQVYzRCxVQUFXLENBRFgsWUFjRixDQUVBLDJDQUVFLG9DQUF5QyxDQUR6QyxxQkFFRixDQUVBLDRDQUNFLG9CQUNGLENBRUEseUNBQ0UsV0FBWSxDQUNaLFVBQ0YsQ0FFQSx3Q0FDRSxXQUFZLENBQ1osU0FDRixDQUVBLHlDQUlFLFNBQVUsQ0FDVixtQkFBb0IsQ0FDcEIsZ0JBQWlCLENBQ2pCLG9CQUFxQixDQUNyQixxQkFBc0IsQ0FMdEIsVUFBYyxDQURkLFdBQVksQ0FEWixVQVFGLENBRUEsNkNBU0UsdUVBQTRDLENBRjVDLGtCQUFtQixDQUNuQixxQkFBeUIsQ0FGekIsaUJBQWtCLENBRGxCLFdBQVksQ0FKWixpQkFBa0IsQ0FFbEIsVUFBVyxDQURYLFFBQVMsQ0FFVCxVQU1GLENBRUEsaURBQ0UsTUFBZ0MsU0FBVSxDQUEvQixrQkFBaUMsQ0FDNUMsSUFBNkIsVUFBWSxDQUFuQyxvQkFBcUMsQ0FDN0MiLCJmaWxlIjoiVHJpZ2dlckJ1dHRvbi5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnRyaWdnZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk7XG4gIHdpZHRoOiA0OHB4O1xuICBoZWlnaHQ6IDQ4cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBib3gtc2hhZG93OiAwIDJweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAxMjBtcyBjdWJpYy1iZXppZXIoMC4yMiwgMSwgMC4zNiwgMSksXG4gICAgICAgICAgICAgIGJveC1zaGFkb3cgMTIwbXMgY3ViaWMtYmV6aWVyKDAuMjIsIDEsIDAuMzYsIDEpO1xuICBwYWRkaW5nOiAwO1xuICBvdXRsaW5lOiBub25lO1xufVxuXG4udHJpZ2dlcjpob3ZlciB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4wOCk7XG4gIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xufVxuXG4udHJpZ2dlcjphY3RpdmUge1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpO1xufVxuXG4uYm90dG9tUmlnaHQge1xuICBib3R0b206IDE2cHg7XG4gIHJpZ2h0OiAxNnB4O1xufVxuXG4uYm90dG9tTGVmdCB7XG4gIGJvdHRvbTogMTZweDtcbiAgbGVmdDogMTZweDtcbn1cblxuLnRyaWdnZXJJY29uIHtcbiAgd2lkdGg6IDI0cHg7XG4gIGhlaWdodDogMjRweDtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIGZpbGw6IG5vbmU7XG4gIHN0cm9rZTogY3VycmVudENvbG9yO1xuICBzdHJva2Utd2lkdGg6IDEuNTtcbiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kO1xuICBzdHJva2UtbGluZWpvaW46IHJvdW5kO1xufVxuXG4ubm90aWZpY2F0aW9uRG90IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0ycHg7XG4gIHJpZ2h0OiAtMnB4O1xuICB3aWR0aDogMTBweDtcbiAgaGVpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJhY2tncm91bmQ6ICNFRjQ0NDQ7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmZmZmY7XG4gIGFuaW1hdGlvbjogcHVsc2UtZG90IDJzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xufVxuXG5Aa2V5ZnJhbWVzIHB1bHNlLWRvdCB7XG4gIDAlLCAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKTsgb3BhY2l0eTogMTsgfVxuICA1MCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEuMyk7IG9wYWNpdHk6IDAuODsgfVxufVxuIl19 */";
4
+ var styles = {"trigger":"TriggerButton-module_trigger__02CR-","bottomRight":"TriggerButton-module_bottomRight__566sd","bottomLeft":"TriggerButton-module_bottomLeft__G7wbE","triggerIcon":"TriggerButton-module_triggerIcon__WdZYH","notificationDot":"TriggerButton-module_notificationDot__b1Thf"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=TriggerButton.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerButton.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,8 @@
1
+ import type { FeedbackType } from '../types';
2
+ interface TypeSelectorProps {
3
+ value: FeedbackType | null;
4
+ onChange: (type: FeedbackType) => void;
5
+ }
6
+ export declare function TypeSelector({ value, onChange }: TypeSelectorProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=TypeSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeSelector.d.ts","sourceRoot":"","sources":["../../src/components/TypeSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,UAAU,iBAAiB;IACzB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CACxC;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CAoBlE"}
@@ -0,0 +1,13 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { FEEDBACK_TYPES } from '../types.mjs';
3
+ import styles from './TypeSelector.module.css.mjs';
4
+
5
+ function TypeSelector({ value, onChange }) {
6
+ return (jsx("div", { className: styles.typeSelector, children: FEEDBACK_TYPES.map((ft) => {
7
+ const isActive = value === ft.value;
8
+ return (jsxs("button", { type: "button", className: `${styles.typeBtn} ${isActive ? styles.typeBtnActive : ''}`, style: isActive ? { backgroundColor: ft.color, borderColor: ft.color } : undefined, onClick: () => onChange(ft.value), children: [jsx("span", { className: styles.emoji, children: ft.emoji }), ft.label] }, ft.value));
9
+ }) }));
10
+ }
11
+
12
+ export { TypeSelector };
13
+ //# sourceMappingURL=TypeSelector.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeSelector.mjs","sources":["../../src/components/TypeSelector.tsx"],"sourcesContent":[null],"names":["_jsx","_jsxs"],"mappings":";;;;SAUgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB,EAAA;AACjE,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,YAAY,EAAA,QAAA,EAChC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,KAAI;AACzB,YAAA,MAAM,QAAQ,GAAG,KAAK,KAAK,EAAE,CAAC,KAAK;AACnC,YAAA,QACEC,IAAA,CAAA,QAAA,EAAA,EAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,EAAE,EAAE,EACtE,KAAK,EAAE,QAAQ,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,SAAS,EAClF,OAAO,EAAE,MAAM,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAA,QAAA,EAAA,CAEjCD,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,KAAK,YAAG,EAAE,CAAC,KAAK,EAAA,CAAQ,EAC/C,EAAE,CAAC,KAAK,CAAA,EAAA,EAPJ,EAAE,CAAC,KAAK,CAQN;QAEb,CAAC,CAAC,EAAA,CACE;AAEV;;;;"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../node_modules/style-inject/dist/style-inject.es.mjs';
2
+
3
+ var css_248z = ".TypeSelector-module_typeSelector__2e3l6{display:flex;flex-wrap:wrap;gap:6px}.TypeSelector-module_typeBtn__OV7GJ{align-items:center;background:transparent;border:1px solid var(--pulse-border,#e5e7eb);border-radius:9999px;color:var(--pulse-text-secondary,#6b7280);cursor:pointer;display:flex;font-family:inherit;font-size:13px;font-weight:500;gap:4px;padding:4px 10px;transition:all .12s cubic-bezier(.22,1,.36,1)}.TypeSelector-module_typeBtn__OV7GJ:hover{background:var(--pulse-bg-hover,#f3f4f6);border-color:var(--pulse-border-strong,#d1d5db)}.TypeSelector-module_typeBtnActive__BtcSH{border-color:transparent;color:#fff}.TypeSelector-module_emoji__74Qn7{font-size:14px;line-height:1}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlR5cGVTZWxlY3Rvci5tb2R1bGUuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUNFLFlBQWEsQ0FFYixjQUFlLENBRGYsT0FFRixDQUVBLG9DQUVFLGtCQUFtQixDQUtuQixzQkFBdUIsQ0FEdkIsNENBQThDLENBRDlDLG9CQUFxQixDQU1yQix5Q0FBMkMsQ0FIM0MsY0FBZSxDQVBmLFlBQWEsQ0FZYixtQkFBb0IsQ0FKcEIsY0FBZSxDQUNmLGVBQWdCLENBUGhCLE9BQVEsQ0FDUixnQkFBaUIsQ0FRakIsNkNBRUYsQ0FFQSwwQ0FFRSx3Q0FBMEMsQ0FEMUMsK0NBRUYsQ0FFQSwwQ0FFRSx3QkFBeUIsQ0FEekIsVUFFRixDQUVBLGtDQUNFLGNBQWUsQ0FDZixhQUNGIiwiZmlsZSI6IlR5cGVTZWxlY3Rvci5tb2R1bGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnR5cGVTZWxlY3RvciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGdhcDogNnB4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XG5cbi50eXBlQnRuIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA0cHg7XG4gIHBhZGRpbmc6IDRweCAxMHB4O1xuICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXB1bHNlLWJvcmRlciwgI2U1ZTdlYik7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLXB1bHNlLXRleHQtc2Vjb25kYXJ5LCAjNmI3MjgwKTtcbiAgdHJhbnNpdGlvbjogYWxsIDEyMG1zIGN1YmljLWJlemllcigwLjIyLCAxLCAwLjM2LCAxKTtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG59XG5cbi50eXBlQnRuOmhvdmVyIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wdWxzZS1ib3JkZXItc3Ryb25nLCAjZDFkNWRiKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tcHVsc2UtYmctaG92ZXIsICNmM2Y0ZjYpO1xufVxuXG4udHlwZUJ0bkFjdGl2ZSB7XG4gIGNvbG9yOiAjZmZmZmZmO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xufVxuXG4uZW1vamkge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuIl19 */";
4
+ var styles = {"typeSelector":"TypeSelector-module_typeSelector__2e3l6","typeBtn":"TypeSelector-module_typeBtn__OV7GJ","typeBtnActive":"TypeSelector-module_typeBtnActive__BtcSH","emoji":"TypeSelector-module_emoji__74Qn7"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=TypeSelector.module.css.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeSelector.module.css.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,3 @@
1
+ export { PulseWidget } from './PulseWidget';
2
+ export type { PulseWidgetProps, FeedbackType, ThreadStatus } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ export { PulseWidget } from './PulseWidget.mjs';
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import type { SupabaseClient } from '@supabase/supabase-js';
2
+ import type { FeedbackType, Thread, Message } from '../types';
3
+ interface SubmitFeedbackParams {
4
+ projectSlug: string;
5
+ deviceId: string;
6
+ type: FeedbackType;
7
+ subject: string;
8
+ body: string;
9
+ userEmail?: string;
10
+ userName?: string;
11
+ pageUrl?: string;
12
+ userAgent?: string;
13
+ appVersion?: string;
14
+ screenSize?: string;
15
+ metadata?: Record<string, unknown>;
16
+ attachments?: {
17
+ path: string;
18
+ name: string;
19
+ type: string;
20
+ size: number;
21
+ }[];
22
+ }
23
+ export declare function submitFeedback(client: SupabaseClient, params: SubmitFeedbackParams): Promise<string | null>;
24
+ export declare function getMyThreads(client: SupabaseClient): Promise<Thread[]>;
25
+ export declare function getThreadMessages(client: SupabaseClient, threadId: string): Promise<Message[]>;
26
+ export declare function sendUserReply(client: SupabaseClient, threadId: string, body: string): Promise<boolean>;
27
+ export declare function checkUnreadReplies(client: SupabaseClient, deviceId: string): Promise<boolean>;
28
+ export declare function uploadAttachment(client: SupabaseClient, deviceId: string, threadId: string, file: File): Promise<{
29
+ path: string;
30
+ name: string;
31
+ type: string;
32
+ size: number;
33
+ } | null>;
34
+ export {};
35
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKnF,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5E;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BxB;AAID,wBAAsB,YAAY,CAChC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB;AAID,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,EAAE,CAAC,CAkBpB;AAID,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CAelB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAID,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAsB5E"}
@@ -0,0 +1,105 @@
1
+ import { fromDbMessage, fromDbThread } from '../types.mjs';
2
+
3
+ // ── Widget API Layer ──
4
+ async function submitFeedback(client, params) {
5
+ try {
6
+ const { data, error } = await client.rpc('create_thread_with_message', {
7
+ p_project_slug: params.projectSlug,
8
+ p_device_id: params.deviceId,
9
+ p_type: params.type,
10
+ p_subject: params.subject,
11
+ p_body: params.body,
12
+ p_user_email: params.userEmail || null,
13
+ p_user_name: params.userName || null,
14
+ p_page_url: params.pageUrl || null,
15
+ p_user_agent: params.userAgent || null,
16
+ p_app_version: params.appVersion || null,
17
+ p_screen_size: params.screenSize || null,
18
+ p_metadata: params.metadata || {},
19
+ p_attachments: params.attachments || [],
20
+ });
21
+ if (error) {
22
+ console.warn('[Pulse] Submit error:', error.message);
23
+ return null;
24
+ }
25
+ return data;
26
+ }
27
+ catch (err) {
28
+ console.warn('[Pulse] Network error:', err);
29
+ return null;
30
+ }
31
+ }
32
+ // ── Get My Threads ──
33
+ async function getMyThreads(client) {
34
+ try {
35
+ const { data, error } = await client
36
+ .from('threads')
37
+ .select('*')
38
+ .order('created_at', { ascending: false });
39
+ if (error) {
40
+ console.warn('[Pulse] Fetch threads error:', error.message);
41
+ return [];
42
+ }
43
+ return data.map(fromDbThread);
44
+ }
45
+ catch (err) {
46
+ console.warn('[Pulse] Network error:', err);
47
+ return [];
48
+ }
49
+ }
50
+ // ── Get Thread Messages ──
51
+ async function getThreadMessages(client, threadId) {
52
+ try {
53
+ const { data, error } = await client
54
+ .from('messages')
55
+ .select('*')
56
+ .eq('thread_id', threadId)
57
+ .order('created_at', { ascending: true });
58
+ if (error) {
59
+ console.warn('[Pulse] Fetch messages error:', error.message);
60
+ return [];
61
+ }
62
+ return data.map(fromDbMessage);
63
+ }
64
+ catch (err) {
65
+ console.warn('[Pulse] Network error:', err);
66
+ return [];
67
+ }
68
+ }
69
+ // ── Send Reply (user) ──
70
+ async function sendUserReply(client, threadId, body) {
71
+ try {
72
+ const { error } = await client
73
+ .from('messages')
74
+ .insert({ thread_id: threadId, sender: 'user', body });
75
+ if (error) {
76
+ console.warn('[Pulse] Reply error:', error.message);
77
+ return false;
78
+ }
79
+ return true;
80
+ }
81
+ catch (err) {
82
+ console.warn('[Pulse] Network error:', err);
83
+ return false;
84
+ }
85
+ }
86
+ // ── Check Unread Replies ──
87
+ async function checkUnreadReplies(client, deviceId) {
88
+ try {
89
+ const { data, error } = await client.rpc('check_unread_replies', {
90
+ p_device_id: deviceId,
91
+ });
92
+ if (error) {
93
+ console.warn('[Pulse] Unread check error:', error.message);
94
+ return false;
95
+ }
96
+ return data;
97
+ }
98
+ catch (err) {
99
+ console.warn('[Pulse] Network error:', err);
100
+ return false;
101
+ }
102
+ }
103
+
104
+ export { checkUnreadReplies, getMyThreads, getThreadMessages, sendUserReply, submitFeedback };
105
+ //# sourceMappingURL=api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.mjs","sources":["../../src/lib/api.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface CapturedContext {
2
+ pageUrl: string;
3
+ userAgent: string;
4
+ screenSize: string;
5
+ }
6
+ export declare function captureContext(): CapturedContext;
7
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/lib/capture.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,IAAI,eAAe,CAUhD"}
@@ -0,0 +1,14 @@
1
+ // ── Auto-capture context ──
2
+ function captureContext() {
3
+ if (typeof window === 'undefined') {
4
+ return { pageUrl: '', userAgent: '', screenSize: '' };
5
+ }
6
+ return {
7
+ pageUrl: window.location.href,
8
+ userAgent: navigator.userAgent,
9
+ screenSize: `${window.innerWidth}x${window.innerHeight}`,
10
+ };
11
+ }
12
+
13
+ export { captureContext };
14
+ //# sourceMappingURL=capture.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.mjs","sources":["../../src/lib/capture.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;SAQgB,cAAc,GAAA;AAC5B,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AACjC,QAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACvD;IAEA,OAAO;AACL,QAAA,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,GAAG,MAAM,CAAC,UAAU,CAAA,CAAA,EAAI,MAAM,CAAC,WAAW,CAAA,CAAE;KACzD;AACH;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function getDeviceId(): string;
2
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/lib/device.ts"],"names":[],"mappings":"AAkBA,wBAAgB,WAAW,IAAI,MAAM,CAcpC"}
@@ -0,0 +1,34 @@
1
+ // ── Device ID management ──
2
+ // Generates a random device ID and persists it in localStorage for thread continuity.
3
+ const STORAGE_KEY = 'pulse_device_id';
4
+ function generateId() {
5
+ // Crypto.randomUUID is available in all modern browsers
6
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
7
+ return crypto.randomUUID();
8
+ }
9
+ // Fallback
10
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
11
+ const r = (Math.random() * 16) | 0;
12
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
13
+ return v.toString(16);
14
+ });
15
+ }
16
+ function getDeviceId() {
17
+ if (typeof window === 'undefined')
18
+ return '';
19
+ try {
20
+ let id = localStorage.getItem(STORAGE_KEY);
21
+ if (!id) {
22
+ id = generateId();
23
+ localStorage.setItem(STORAGE_KEY, id);
24
+ }
25
+ return id;
26
+ }
27
+ catch {
28
+ // localStorage blocked (incognito, iframe restrictions, etc.)
29
+ return generateId();
30
+ }
31
+ }
32
+
33
+ export { getDeviceId };
34
+ //# sourceMappingURL=device.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.mjs","sources":["../../src/lib/device.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AAEA,MAAM,WAAW,GAAG,iBAAiB;AAErC,SAAS,UAAU,GAAA;;IAEjB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;AACtD,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE;IAC5B;;IAEA,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAI;AACnE,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AAClC,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;AACzC,QAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AACvB,IAAA,CAAC,CAAC;AACJ;SAEgB,WAAW,GAAA;IACzB,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,EAAE;AAE5C,IAAA,IAAI;QACF,IAAI,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,IAAI,CAAC,EAAE,EAAE;YACP,EAAE,GAAG,UAAU,EAAE;AACjB,YAAA,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QACvC;AACA,QAAA,OAAO,EAAE;IACX;AAAE,IAAA,MAAM;;QAEN,OAAO,UAAU,EAAE;IACrB;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ export declare function getSupabaseClient(url: string, anonKey: string, deviceId: string): SupabaseClient;
3
+ export declare function resetSupabaseClient(): void;
4
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../src/lib/supabase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIrE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAWhG;AAGD,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
@@ -0,0 +1,19 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+
3
+ // ── Widget Supabase Client ──
4
+ let client = null;
5
+ function getSupabaseClient(url, anonKey, deviceId) {
6
+ if (!client) {
7
+ client = createClient(url, anonKey, {
8
+ global: {
9
+ headers: {
10
+ 'x-device-id': deviceId,
11
+ },
12
+ },
13
+ });
14
+ }
15
+ return client;
16
+ }
17
+
18
+ export { getSupabaseClient };
19
+ //# sourceMappingURL=supabase.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.mjs","sources":["../../src/lib/supabase.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;AAIA,IAAI,MAAM,GAA0B,IAAI;SAExB,iBAAiB,CAAC,GAAW,EAAE,OAAe,EAAE,QAAgB,EAAA;IAC9E,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE;AAClC,YAAA,MAAM,EAAE;AACN,gBAAA,OAAO,EAAE;AACP,oBAAA,aAAa,EAAE,QAAQ;AACxB,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;IACJ;AACA,IAAA,OAAO,MAAM;AACf;;;;"}
@@ -0,0 +1,29 @@
1
+ function styleInject(css, ref) {
2
+ if ( ref === void 0 ) ref = {};
3
+ var insertAt = ref.insertAt;
4
+
5
+ if (!css || typeof document === 'undefined') { return; }
6
+
7
+ var head = document.head || document.getElementsByTagName('head')[0];
8
+ var style = document.createElement('style');
9
+ style.type = 'text/css';
10
+
11
+ if (insertAt === 'top') {
12
+ if (head.firstChild) {
13
+ head.insertBefore(style, head.firstChild);
14
+ } else {
15
+ head.appendChild(style);
16
+ }
17
+ } else {
18
+ head.appendChild(style);
19
+ }
20
+
21
+ if (style.styleSheet) {
22
+ style.styleSheet.cssText = css;
23
+ } else {
24
+ style.appendChild(document.createTextNode(css));
25
+ }
26
+ }
27
+
28
+ export { styleInject as default };
29
+ //# sourceMappingURL=style-inject.es.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-inject.es.mjs","sources":["../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;","x_google_ignoreList":[0]}
@@ -0,0 +1,89 @@
1
+ export type FeedbackType = 'bug' | 'feature' | 'question' | 'praise' | 'other';
2
+ export type ThreadStatus = 'open' | 'in_progress' | 'resolved' | 'closed' | 'wont_fix';
3
+ export type MessageSender = 'user' | 'developer';
4
+ export interface Thread {
5
+ id: string;
6
+ projectId: string;
7
+ deviceId: string;
8
+ type: FeedbackType;
9
+ status: ThreadStatus;
10
+ subject: string;
11
+ userEmail: string | null;
12
+ userName: string | null;
13
+ pageUrl: string | null;
14
+ userAgent: string | null;
15
+ appVersion: string | null;
16
+ screenSize: string | null;
17
+ metadata: Record<string, unknown>;
18
+ isRead: boolean;
19
+ isStarred: boolean;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ }
23
+ export interface Message {
24
+ id: string;
25
+ threadId: string;
26
+ sender: MessageSender;
27
+ body: string;
28
+ attachments: Attachment[];
29
+ isInternal: boolean;
30
+ createdAt: string;
31
+ }
32
+ export interface Attachment {
33
+ path: string;
34
+ name: string;
35
+ type: string;
36
+ size: number;
37
+ }
38
+ export interface PulseWidgetProps {
39
+ projectId: string;
40
+ supabaseUrl: string;
41
+ supabaseAnonKey: string;
42
+ position?: 'bottom-right' | 'bottom-left';
43
+ accentColor?: string;
44
+ greeting?: string;
45
+ placeholder?: string;
46
+ hideOnPaths?: string[];
47
+ collectEmail?: boolean;
48
+ metadata?: Record<string, unknown>;
49
+ onOpen?: () => void;
50
+ onClose?: () => void;
51
+ onSubmit?: (threadId: string) => void;
52
+ }
53
+ export declare const FEEDBACK_TYPES: {
54
+ value: FeedbackType;
55
+ emoji: string;
56
+ label: string;
57
+ color: string;
58
+ }[];
59
+ export interface DbThread {
60
+ id: string;
61
+ project_id: string;
62
+ device_id: string;
63
+ type: FeedbackType;
64
+ status: ThreadStatus;
65
+ subject: string;
66
+ user_email: string | null;
67
+ user_name: string | null;
68
+ page_url: string | null;
69
+ user_agent: string | null;
70
+ app_version: string | null;
71
+ screen_size: string | null;
72
+ metadata: Record<string, unknown>;
73
+ is_read: boolean;
74
+ is_starred: boolean;
75
+ created_at: string;
76
+ updated_at: string;
77
+ }
78
+ export interface DbMessage {
79
+ id: string;
80
+ thread_id: string;
81
+ sender: MessageSender;
82
+ body: string;
83
+ attachments: Attachment[];
84
+ is_internal: boolean;
85
+ created_at: string;
86
+ }
87
+ export declare function fromDbThread(row: DbThread): Thread;
88
+ export declare function fromDbMessage(row: DbMessage): Message;
89
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.mjs ADDED
@@ -0,0 +1,45 @@
1
+ // ── Pulse Widget Types ──
2
+ // Feedback type config
3
+ const FEEDBACK_TYPES = [
4
+ { value: 'bug', emoji: '🐛', label: 'Bug', color: '#EF4444' },
5
+ { value: 'feature', emoji: '💡', label: 'Feature', color: '#F59E0B' },
6
+ { value: 'question', emoji: '❓', label: 'Question', color: '#3B82F6' },
7
+ { value: 'praise', emoji: '🎉', label: 'Praise', color: '#10B981' },
8
+ { value: 'other', emoji: '💬', label: 'Other', color: '#6B7280' },
9
+ ];
10
+ // Mappers
11
+ function fromDbThread(row) {
12
+ return {
13
+ id: row.id,
14
+ projectId: row.project_id,
15
+ deviceId: row.device_id,
16
+ type: row.type,
17
+ status: row.status,
18
+ subject: row.subject,
19
+ userEmail: row.user_email,
20
+ userName: row.user_name,
21
+ pageUrl: row.page_url,
22
+ userAgent: row.user_agent,
23
+ appVersion: row.app_version,
24
+ screenSize: row.screen_size,
25
+ metadata: row.metadata,
26
+ isRead: row.is_read,
27
+ isStarred: row.is_starred,
28
+ createdAt: row.created_at,
29
+ updatedAt: row.updated_at,
30
+ };
31
+ }
32
+ function fromDbMessage(row) {
33
+ return {
34
+ id: row.id,
35
+ threadId: row.thread_id,
36
+ sender: row.sender,
37
+ body: row.body,
38
+ attachments: row.attachments,
39
+ isInternal: row.is_internal,
40
+ createdAt: row.created_at,
41
+ };
42
+ }
43
+
44
+ export { FEEDBACK_TYPES, fromDbMessage, fromDbThread };
45
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","sources":["../src/types.ts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;AA6DA;AACO,MAAM,cAAc,GAA2E;AACpG,IAAA,EAAE,KAAK,EAAE,KAAK,EAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAO,KAAK,EAAE,SAAS,EAAE;AACvE,IAAA,EAAE,KAAK,EAAE,SAAS,EAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAG,KAAK,EAAE,SAAS,EAAE;AACvE,IAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;AACtE,IAAA,EAAE,KAAK,EAAE,QAAQ,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAI,KAAK,EAAE,SAAS,EAAE;AACvE,IAAA,EAAE,KAAK,EAAE,OAAO,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAK,KAAK,EAAE,SAAS,EAAE;;AAkCzE;AACM,SAAU,YAAY,CAAC,GAAa,EAAA;IACxC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B;AACH;AAEM,SAAU,aAAa,CAAC,GAAc,EAAA;IAC1C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B;AACH;;;;"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "pulse-feedback-widget",
3
+ "version": "0.1.0",
4
+ "description": "Drop-in feedback widget for React apps. Collect bugs, features, questions, and praise from users.",
5
+ "type": "module",
6
+ "main": "dist/index.mjs",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.mjs"
14
+ }
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "sideEffects": [
21
+ "**/*.css",
22
+ "**/*.mjs"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "build": "rm -rf dist && rollup -c",
29
+ "prepublishOnly": "npm run build",
30
+ "typecheck": "tsc --noEmit"
31
+ },
32
+ "peerDependencies": {
33
+ "react": "^18.0.0 || ^19.0.0",
34
+ "react-dom": "^18.0.0 || ^19.0.0"
35
+ },
36
+ "dependencies": {
37
+ "@supabase/supabase-js": "^2.49.0"
38
+ },
39
+ "devDependencies": {
40
+ "@rollup/plugin-commonjs": "^28.0.0",
41
+ "@rollup/plugin-node-resolve": "^16.0.0",
42
+ "@rollup/plugin-typescript": "^12.0.0",
43
+ "@types/react": "^19.0.0",
44
+ "@types/react-dom": "^19.0.0",
45
+ "rollup": "^4.0.0",
46
+ "rollup-plugin-peer-deps-external": "^2.2.0",
47
+ "rollup-plugin-postcss": "^4.0.0",
48
+ "rollup-plugin-preserve-directives": "^0.4.0",
49
+ "tslib": "^2.6.0",
50
+ "typescript": "^5.5.0"
51
+ }
52
+ }