@uptrademedia/site-kit 1.0.5 → 1.0.8

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 (169) hide show
  1. package/dist/analytics/index.js +7 -7
  2. package/dist/analytics/index.mjs +3 -3
  3. package/dist/api-QUIPJJCX.js +77 -0
  4. package/dist/api-QUIPJJCX.js.map +1 -0
  5. package/dist/api-V3BA5PMX.mjs +4 -0
  6. package/dist/api-V3BA5PMX.mjs.map +1 -0
  7. package/dist/blog/index.d.mts +2 -2
  8. package/dist/blog/index.d.ts +2 -2
  9. package/dist/blog/index.js +40 -6
  10. package/dist/blog/index.js.map +1 -1
  11. package/dist/blog/index.mjs +40 -6
  12. package/dist/blog/index.mjs.map +1 -1
  13. package/dist/blog/server.d.mts +3 -2
  14. package/dist/blog/server.d.ts +3 -2
  15. package/dist/blog/server.js +13 -6
  16. package/dist/blog/server.js.map +1 -1
  17. package/dist/blog/server.mjs +13 -6
  18. package/dist/blog/server.mjs.map +1 -1
  19. package/dist/{chunk-FKVJOT2F.mjs → chunk-42EXHJTC.mjs} +196 -7
  20. package/dist/chunk-42EXHJTC.mjs.map +1 -0
  21. package/dist/{scanner-AZV5I6US.mjs → chunk-44OMJFCG.mjs} +354 -14
  22. package/dist/chunk-44OMJFCG.mjs.map +1 -0
  23. package/dist/chunk-4TGJYNHV.js +981 -0
  24. package/dist/chunk-4TGJYNHV.js.map +1 -0
  25. package/dist/chunk-4XPGGLVP.mjs +53 -0
  26. package/dist/{chunk-NYKRE2FL.mjs.map → chunk-4XPGGLVP.mjs.map} +1 -1
  27. package/dist/{generators-TO2FKJR6.mjs → chunk-6ONUXZDO.mjs} +26 -9
  28. package/dist/chunk-6ONUXZDO.mjs.map +1 -0
  29. package/dist/chunk-CG53ASWX.mjs +729 -0
  30. package/dist/chunk-CG53ASWX.mjs.map +1 -0
  31. package/dist/{scanner-ETJAMIT7.js → chunk-DERI27QC.js} +448 -102
  32. package/dist/chunk-DERI27QC.js.map +1 -0
  33. package/dist/chunk-DYM5ML2V.mjs +1518 -0
  34. package/dist/chunk-DYM5ML2V.mjs.map +1 -0
  35. package/dist/chunk-FLZZOX44.js +1526 -0
  36. package/dist/chunk-FLZZOX44.js.map +1 -0
  37. package/dist/{chunk-7H6I3ECV.mjs → chunk-FQVGK746.mjs} +63 -3
  38. package/dist/chunk-FQVGK746.mjs.map +1 -0
  39. package/dist/{chunk-GQ6ZOU2N.mjs → chunk-JGQPAXTL.mjs} +4 -4
  40. package/dist/{chunk-GQ6ZOU2N.mjs.map → chunk-JGQPAXTL.mjs.map} +1 -1
  41. package/dist/{chunk-V3F5J6CV.js → chunk-JUEVN4Q4.js} +196 -7
  42. package/dist/chunk-JUEVN4Q4.js.map +1 -0
  43. package/dist/chunk-KKMGTT7F.mjs +968 -0
  44. package/dist/chunk-KKMGTT7F.mjs.map +1 -0
  45. package/dist/{chunk-XQJX252G.mjs → chunk-MB3WR5KJ.mjs} +28 -18
  46. package/dist/chunk-MB3WR5KJ.mjs.map +1 -0
  47. package/dist/{chunk-2IHTEKHU.mjs → chunk-QD5CN2OI.mjs} +16 -7
  48. package/dist/chunk-QD5CN2OI.mjs.map +1 -0
  49. package/dist/{chunk-SBVEYCSV.js → chunk-QQB4FO4Q.js} +7 -7
  50. package/dist/{chunk-SBVEYCSV.js.map → chunk-QQB4FO4Q.js.map} +1 -1
  51. package/dist/{generators-YZWIGHCO.js → chunk-S2GXR5HY.js} +26 -9
  52. package/dist/chunk-S2GXR5HY.js.map +1 -0
  53. package/dist/{chunk-O2OHHBUD.js → chunk-TDK7DLCH.js} +30 -20
  54. package/dist/chunk-TDK7DLCH.js.map +1 -0
  55. package/dist/{chunk-QP5NCO2E.js → chunk-VDI7KYME.js} +67 -2
  56. package/dist/chunk-VDI7KYME.js.map +1 -0
  57. package/dist/chunk-VOR53RUR.js +753 -0
  58. package/dist/chunk-VOR53RUR.js.map +1 -0
  59. package/dist/{chunk-GAJLEDRD.js → chunk-ZKJ7JKFV.js} +16 -7
  60. package/dist/chunk-ZKJ7JKFV.js.map +1 -0
  61. package/dist/chunk-ZSMWDLMK.js +63 -0
  62. package/dist/{chunk-EQCVQC35.js.map → chunk-ZSMWDLMK.js.map} +1 -1
  63. package/dist/cli/index.js +37269 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/index.mjs +37233 -0
  66. package/dist/cli/index.mjs.map +1 -0
  67. package/dist/commerce/index.js +1 -1
  68. package/dist/commerce/index.mjs +1 -1
  69. package/dist/commerce/server.d.mts +12 -3
  70. package/dist/commerce/server.d.ts +12 -3
  71. package/dist/commerce/server.js +71 -70
  72. package/dist/commerce/server.js.map +1 -1
  73. package/dist/commerce/server.mjs +71 -70
  74. package/dist/commerce/server.mjs.map +1 -1
  75. package/dist/engage/index.d.mts +6 -4
  76. package/dist/engage/index.d.ts +6 -4
  77. package/dist/engage/index.js +8 -4
  78. package/dist/engage/index.mjs +2 -2
  79. package/dist/forms/index.js +1 -1
  80. package/dist/forms/index.mjs +1 -1
  81. package/dist/generators-5EU4PTVF.js +33 -0
  82. package/dist/generators-5EU4PTVF.js.map +1 -0
  83. package/dist/generators-TYPILCWD.mjs +4 -0
  84. package/dist/generators-TYPILCWD.mjs.map +1 -0
  85. package/dist/images/index.js +11 -11
  86. package/dist/images/index.mjs +4 -4
  87. package/dist/index.d.mts +154 -5
  88. package/dist/index.d.ts +154 -5
  89. package/dist/index.js +940 -24
  90. package/dist/index.js.map +1 -1
  91. package/dist/index.mjs +819 -7
  92. package/dist/index.mjs.map +1 -1
  93. package/dist/llms/index.d.mts +657 -0
  94. package/dist/llms/index.d.ts +657 -0
  95. package/dist/llms/index.js +101 -0
  96. package/dist/llms/index.js.map +1 -0
  97. package/dist/llms/index.mjs +4 -0
  98. package/dist/llms/index.mjs.map +1 -0
  99. package/dist/migrator-ARLHUNB3.mjs +4 -0
  100. package/dist/migrator-ARLHUNB3.mjs.map +1 -0
  101. package/dist/migrator-VZLBH3VY.js +37 -0
  102. package/dist/migrator-VZLBH3VY.js.map +1 -0
  103. package/dist/redirects/index.js +1 -1
  104. package/dist/redirects/index.mjs +1 -1
  105. package/dist/reputation/index.js +1 -1
  106. package/dist/reputation/index.mjs +1 -1
  107. package/dist/{routing-BWjUF7lp.d.ts → routing-CF91y6NO.d.ts} +1 -1
  108. package/dist/{routing-CgmRi9tD.d.mts → routing-CIOFpFCB.d.mts} +1 -1
  109. package/dist/scanner-7ZMUM2P5.mjs +4 -0
  110. package/dist/scanner-7ZMUM2P5.mjs.map +1 -0
  111. package/dist/scanner-OY7UF3WA.js +53 -0
  112. package/dist/scanner-OY7UF3WA.js.map +1 -0
  113. package/dist/seo/index.d.mts +267 -7
  114. package/dist/seo/index.d.ts +267 -7
  115. package/dist/seo/index.js +433 -24
  116. package/dist/seo/index.js.map +1 -1
  117. package/dist/seo/index.mjs +401 -11
  118. package/dist/seo/index.mjs.map +1 -1
  119. package/dist/seo/server.d.mts +11 -4
  120. package/dist/seo/server.d.ts +11 -4
  121. package/dist/seo/server.js +17 -17
  122. package/dist/seo/server.mjs +3 -3
  123. package/dist/setup/client.js +1 -1
  124. package/dist/setup/client.mjs +1 -1
  125. package/dist/setup/index.js +3 -3
  126. package/dist/setup/index.mjs +2 -2
  127. package/dist/setup/server.js +3 -3
  128. package/dist/setup/server.mjs +2 -2
  129. package/dist/sitemap/index.js +2 -2
  130. package/dist/sitemap/index.js.map +1 -1
  131. package/dist/sitemap/index.mjs +2 -2
  132. package/dist/sitemap/index.mjs.map +1 -1
  133. package/dist/{types-C0pJGfbH.d.mts → types-D6FHAVWX.d.mts} +99 -3
  134. package/dist/{types-C0pJGfbH.d.ts → types-D6FHAVWX.d.ts} +99 -3
  135. package/dist/{types-BN4OwtCO.d.mts → types-DI0jnhjJ.d.mts} +2 -0
  136. package/dist/{types-BN4OwtCO.d.ts → types-DI0jnhjJ.d.ts} +2 -0
  137. package/dist/{types-BmzutFwy.d.ts → types-j8X4vUhB.d.mts} +19 -2
  138. package/dist/{types-BmzutFwy.d.mts → types-j8X4vUhB.d.ts} +19 -2
  139. package/dist/{web-vitals-BH55V7EJ.js → web-vitals-444RLW3B.js} +11 -11
  140. package/dist/{web-vitals-BH55V7EJ.js.map → web-vitals-444RLW3B.js.map} +1 -1
  141. package/dist/{web-vitals-RJYPWAR3.mjs → web-vitals-KPICZIEF.mjs} +3 -3
  142. package/dist/{web-vitals-RJYPWAR3.mjs.map → web-vitals-KPICZIEF.mjs.map} +1 -1
  143. package/package.json +17 -10
  144. package/dist/api-N35S3EES.js +0 -57
  145. package/dist/api-N35S3EES.js.map +0 -1
  146. package/dist/api-SYBTK7Z7.mjs +0 -4
  147. package/dist/api-SYBTK7Z7.mjs.map +0 -1
  148. package/dist/chunk-2IHTEKHU.mjs.map +0 -1
  149. package/dist/chunk-7H6I3ECV.mjs.map +0 -1
  150. package/dist/chunk-BGJLOJ7T.mjs +0 -605
  151. package/dist/chunk-BGJLOJ7T.mjs.map +0 -1
  152. package/dist/chunk-EQCVQC35.js +0 -35
  153. package/dist/chunk-FKVJOT2F.mjs.map +0 -1
  154. package/dist/chunk-GAJLEDRD.js.map +0 -1
  155. package/dist/chunk-NYKRE2FL.mjs +0 -31
  156. package/dist/chunk-O2OHHBUD.js.map +0 -1
  157. package/dist/chunk-QAYJV4KK.js +0 -608
  158. package/dist/chunk-QAYJV4KK.js.map +0 -1
  159. package/dist/chunk-QP5NCO2E.js.map +0 -1
  160. package/dist/chunk-V3F5J6CV.js.map +0 -1
  161. package/dist/chunk-XQJX252G.mjs.map +0 -1
  162. package/dist/generators-TO2FKJR6.mjs.map +0 -1
  163. package/dist/generators-YZWIGHCO.js.map +0 -1
  164. package/dist/migrator-V6KS75EA.mjs +0 -265
  165. package/dist/migrator-V6KS75EA.mjs.map +0 -1
  166. package/dist/migrator-XKM7YQCY.js +0 -272
  167. package/dist/migrator-XKM7YQCY.js.map +0 -1
  168. package/dist/scanner-AZV5I6US.mjs.map +0 -1
  169. package/dist/scanner-ETJAMIT7.js.map +0 -1
@@ -1,608 +0,0 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var navigation = require('next/navigation');
6
-
7
- // src/engage/ChatWidget.tsx
8
- function getApiConfig() {
9
- const signalUrl = typeof window !== "undefined" ? window.__SITE_KIT_SIGNAL_URL__ || "https://signal.uptrademedia.com" : "https://signal.uptrademedia.com";
10
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
11
- return { signalUrl, apiKey };
12
- }
13
- function ChatWidget({ projectId, config, signalApiUrl }) {
14
- const [isOpen, setIsOpen] = react.useState(false);
15
- const [messages, setMessages] = react.useState([]);
16
- const [inputValue, setInputValue] = react.useState("");
17
- const [isLoading, setIsLoading] = react.useState(false);
18
- const [showWelcome, setShowWelcome] = react.useState(true);
19
- const messagesEndRef = react.useRef(null);
20
- const inputRef = react.useRef(null);
21
- const position = config?.position || "bottom-right";
22
- const buttonColor = config?.buttonColor || "#00afab";
23
- const welcomeMessage = config?.welcomeMessage || "Hi! How can I help you today?";
24
- react.useEffect(() => {
25
- messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
26
- }, [messages]);
27
- react.useEffect(() => {
28
- if (isOpen && inputRef.current) {
29
- inputRef.current.focus();
30
- }
31
- }, [isOpen]);
32
- const handleToggle = react.useCallback(() => {
33
- setIsOpen((prev) => !prev);
34
- if (!isOpen && messages.length === 0) {
35
- setMessages([{
36
- id: "welcome",
37
- role: "assistant",
38
- content: welcomeMessage,
39
- timestamp: /* @__PURE__ */ new Date()
40
- }]);
41
- }
42
- }, [isOpen, messages.length, welcomeMessage]);
43
- const handleSubmit = react.useCallback(async (e) => {
44
- e.preventDefault();
45
- if (!inputValue.trim() || isLoading) return;
46
- const userMessage = {
47
- id: `user-${Date.now()}`,
48
- role: "user",
49
- content: inputValue.trim(),
50
- timestamp: /* @__PURE__ */ new Date()
51
- };
52
- setMessages((prev) => [...prev, userMessage]);
53
- setInputValue("");
54
- setIsLoading(true);
55
- setShowWelcome(false);
56
- try {
57
- const { signalUrl, apiKey } = getApiConfig();
58
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.uptrademedia.com" : "https://api.uptrademedia.com";
59
- const response = await fetch(`${apiUrl}/api/public/engage/chat`, {
60
- method: "POST",
61
- headers: {
62
- "Content-Type": "application/json",
63
- ...apiKey && { "x-api-key": apiKey }
64
- },
65
- body: JSON.stringify({
66
- message: userMessage.content,
67
- projectId,
68
- context: {
69
- pageUrl: typeof window !== "undefined" ? window.location.href : "",
70
- pageTitle: typeof document !== "undefined" ? document.title : ""
71
- }
72
- })
73
- });
74
- if (!response.ok) {
75
- throw new Error("Failed to get response");
76
- }
77
- const data = await response.json();
78
- const assistantMessage = {
79
- id: `assistant-${Date.now()}`,
80
- role: "assistant",
81
- content: data.response || data.message || "I'm sorry, I couldn't process that request.",
82
- timestamp: /* @__PURE__ */ new Date()
83
- };
84
- setMessages((prev) => [...prev, assistantMessage]);
85
- } catch (error) {
86
- console.error("[ChatWidget] Error:", error);
87
- const errorMessage = {
88
- id: `error-${Date.now()}`,
89
- role: "assistant",
90
- content: "I'm sorry, I'm having trouble connecting right now. Please try again later.",
91
- timestamp: /* @__PURE__ */ new Date()
92
- };
93
- setMessages((prev) => [...prev, errorMessage]);
94
- } finally {
95
- setIsLoading(false);
96
- }
97
- }, [inputValue, isLoading, projectId, signalApiUrl]);
98
- const handleKeyDown = react.useCallback((e) => {
99
- if (e.key === "Enter" && !e.shiftKey) {
100
- e.preventDefault();
101
- handleSubmit(e);
102
- }
103
- }, [handleSubmit]);
104
- const ChatButton = /* @__PURE__ */ jsxRuntime.jsx(
105
- "button",
106
- {
107
- onClick: handleToggle,
108
- "aria-label": isOpen ? "Close chat" : "Open chat",
109
- style: {
110
- position: "fixed",
111
- [position === "bottom-left" ? "left" : "right"]: 20,
112
- bottom: 20,
113
- width: 60,
114
- height: 60,
115
- borderRadius: "50%",
116
- backgroundColor: buttonColor,
117
- border: "none",
118
- display: "flex",
119
- alignItems: "center",
120
- justifyContent: "center",
121
- cursor: "pointer",
122
- boxShadow: "0 4px 12px rgba(0, 0, 0, 0.25)",
123
- transition: "transform 0.2s, box-shadow 0.2s",
124
- zIndex: 9999
125
- },
126
- onMouseEnter: (e) => {
127
- e.currentTarget.style.transform = "scale(1.05)";
128
- e.currentTarget.style.boxShadow = "0 6px 16px rgba(0, 0, 0, 0.3)";
129
- },
130
- onMouseLeave: (e) => {
131
- e.currentTarget.style.transform = "scale(1)";
132
- e.currentTarget.style.boxShadow = "0 4px 12px rgba(0, 0, 0, 0.25)";
133
- },
134
- children: isOpen ? (
135
- // Close icon (X)
136
- /* @__PURE__ */ jsxRuntime.jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
137
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
138
- /* @__PURE__ */ jsxRuntime.jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
139
- ] })
140
- ) : (
141
- // Chat icon
142
- /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.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" }) })
143
- )
144
- }
145
- );
146
- const ChatPopup = isOpen && /* @__PURE__ */ jsxRuntime.jsxs(
147
- "div",
148
- {
149
- style: {
150
- position: "fixed",
151
- [position === "bottom-left" ? "left" : "right"]: 20,
152
- bottom: 90,
153
- width: 380,
154
- maxWidth: "calc(100vw - 40px)",
155
- height: 500,
156
- maxHeight: "calc(100vh - 120px)",
157
- backgroundColor: "#ffffff",
158
- borderRadius: 16,
159
- boxShadow: "0 8px 32px rgba(0, 0, 0, 0.2)",
160
- display: "flex",
161
- flexDirection: "column",
162
- overflow: "hidden",
163
- zIndex: 9998,
164
- animation: "chatSlideUp 0.3s ease-out"
165
- },
166
- children: [
167
- /* @__PURE__ */ jsxRuntime.jsxs(
168
- "div",
169
- {
170
- style: {
171
- padding: "16px 20px",
172
- background: `linear-gradient(135deg, ${buttonColor}, ${adjustColor(buttonColor, -20)})`,
173
- color: "white",
174
- display: "flex",
175
- alignItems: "center",
176
- gap: 12
177
- },
178
- children: [
179
- /* @__PURE__ */ jsxRuntime.jsx(
180
- "div",
181
- {
182
- style: {
183
- width: 40,
184
- height: 40,
185
- borderRadius: "50%",
186
- backgroundColor: "rgba(255,255,255,0.2)",
187
- display: "flex",
188
- alignItems: "center",
189
- justifyContent: "center"
190
- },
191
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsxRuntime.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" }) })
192
- }
193
- ),
194
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
195
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 600, fontSize: 16 }, children: "Chat with us" }),
196
- /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 13, opacity: 0.9 }, children: "We typically reply instantly" })
197
- ] })
198
- ]
199
- }
200
- ),
201
- /* @__PURE__ */ jsxRuntime.jsxs(
202
- "div",
203
- {
204
- style: {
205
- flex: 1,
206
- overflowY: "auto",
207
- padding: 16,
208
- display: "flex",
209
- flexDirection: "column",
210
- gap: 12,
211
- backgroundColor: "#f8f9fa"
212
- },
213
- children: [
214
- messages.map((message) => /* @__PURE__ */ jsxRuntime.jsx(
215
- "div",
216
- {
217
- style: {
218
- display: "flex",
219
- justifyContent: message.role === "user" ? "flex-end" : "flex-start"
220
- },
221
- children: /* @__PURE__ */ jsxRuntime.jsx(
222
- "div",
223
- {
224
- style: {
225
- maxWidth: "80%",
226
- padding: "10px 14px",
227
- borderRadius: message.role === "user" ? "16px 16px 4px 16px" : "16px 16px 16px 4px",
228
- backgroundColor: message.role === "user" ? buttonColor : "#ffffff",
229
- color: message.role === "user" ? "white" : "#1a1a1a",
230
- boxShadow: "0 1px 2px rgba(0,0,0,0.1)",
231
- fontSize: 14,
232
- lineHeight: 1.5,
233
- whiteSpace: "pre-wrap",
234
- wordBreak: "break-word"
235
- },
236
- children: message.content
237
- }
238
- )
239
- },
240
- message.id
241
- )),
242
- isLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { display: "flex", justifyContent: "flex-start" }, children: /* @__PURE__ */ jsxRuntime.jsxs(
243
- "div",
244
- {
245
- style: {
246
- padding: "10px 14px",
247
- borderRadius: "16px 16px 16px 4px",
248
- backgroundColor: "#ffffff",
249
- boxShadow: "0 1px 2px rgba(0,0,0,0.1)",
250
- display: "flex",
251
- gap: 4
252
- },
253
- children: [
254
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { animation: "chatDot 1.4s infinite ease-in-out", animationDelay: "0s" }, children: "\u25CF" }),
255
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { animation: "chatDot 1.4s infinite ease-in-out", animationDelay: "0.2s" }, children: "\u25CF" }),
256
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { animation: "chatDot 1.4s infinite ease-in-out", animationDelay: "0.4s" }, children: "\u25CF" })
257
- ]
258
- }
259
- ) }),
260
- /* @__PURE__ */ jsxRuntime.jsx("div", { ref: messagesEndRef })
261
- ]
262
- }
263
- ),
264
- /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSubmit, style: { padding: 12, borderTop: "1px solid #e5e7eb", backgroundColor: "#ffffff" }, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8 }, children: [
265
- /* @__PURE__ */ jsxRuntime.jsx(
266
- "input",
267
- {
268
- ref: inputRef,
269
- type: "text",
270
- value: inputValue,
271
- onChange: (e) => setInputValue(e.target.value),
272
- onKeyDown: handleKeyDown,
273
- placeholder: "Type a message...",
274
- disabled: isLoading,
275
- style: {
276
- flex: 1,
277
- padding: "10px 14px",
278
- borderRadius: 24,
279
- border: "1px solid #e5e7eb",
280
- fontSize: 14,
281
- outline: "none",
282
- transition: "border-color 0.2s"
283
- },
284
- onFocus: (e) => e.currentTarget.style.borderColor = buttonColor,
285
- onBlur: (e) => e.currentTarget.style.borderColor = "#e5e7eb"
286
- }
287
- ),
288
- /* @__PURE__ */ jsxRuntime.jsx(
289
- "button",
290
- {
291
- type: "submit",
292
- disabled: !inputValue.trim() || isLoading,
293
- style: {
294
- width: 40,
295
- height: 40,
296
- borderRadius: "50%",
297
- border: "none",
298
- backgroundColor: inputValue.trim() && !isLoading ? buttonColor : "#e5e7eb",
299
- color: "white",
300
- cursor: inputValue.trim() && !isLoading ? "pointer" : "not-allowed",
301
- display: "flex",
302
- alignItems: "center",
303
- justifyContent: "center",
304
- transition: "background-color 0.2s"
305
- },
306
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M2.01 21L23 12 2.01 3 2 10l15 2-15 2z" }) })
307
- }
308
- )
309
- ] }) }),
310
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
311
- @keyframes chatSlideUp {
312
- from {
313
- opacity: 0;
314
- transform: translateY(20px);
315
- }
316
- to {
317
- opacity: 1;
318
- transform: translateY(0);
319
- }
320
- }
321
- @keyframes chatDot {
322
- 0%, 80%, 100% {
323
- opacity: 0.3;
324
- }
325
- 40% {
326
- opacity: 1;
327
- }
328
- }
329
- ` })
330
- ]
331
- }
332
- );
333
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
334
- ChatPopup,
335
- ChatButton
336
- ] });
337
- }
338
- function adjustColor(hex, amount) {
339
- const num = parseInt(hex.replace("#", ""), 16);
340
- const r = Math.min(255, Math.max(0, (num >> 16) + amount));
341
- const g = Math.min(255, Math.max(0, (num >> 8 & 255) + amount));
342
- const b = Math.min(255, Math.max(0, (num & 255) + amount));
343
- return `#${(1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1)}`;
344
- }
345
- function getApiConfig2() {
346
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.uptrademedia.com" : "https://api.uptrademedia.com";
347
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
348
- return { apiUrl, apiKey };
349
- }
350
- function EngageWidget({
351
- apiUrl: propApiUrl,
352
- apiKey: propApiKey,
353
- position = "bottom-right",
354
- zIndex = 9999,
355
- chatEnabled = true,
356
- debug = false
357
- }) {
358
- const pathname = navigation.usePathname();
359
- const [elements, setElements] = react.useState([]);
360
- const [activeElements, setActiveElements] = react.useState([]);
361
- const [dismissedElements, setDismissedElements] = react.useState(/* @__PURE__ */ new Set());
362
- react.useEffect(() => {
363
- async function loadElements() {
364
- const { apiUrl: globalApiUrl, apiKey: globalApiKey } = getApiConfig2();
365
- const apiUrl = propApiUrl || globalApiUrl;
366
- const apiKey = propApiKey || globalApiKey;
367
- if (!apiKey) {
368
- if (debug) console.warn("[Engage] No API key configured");
369
- return;
370
- }
371
- try {
372
- const response = await fetch(`${apiUrl}/api/public/engage/elements`, {
373
- method: "POST",
374
- headers: {
375
- "Content-Type": "application/json",
376
- "x-api-key": apiKey
377
- },
378
- body: JSON.stringify({})
379
- });
380
- if (!response.ok) {
381
- if (debug) console.error("[Engage] Error loading elements:", response.statusText);
382
- return;
383
- }
384
- const data = await response.json();
385
- if (debug) console.log("[Engage] Loaded elements:", data.elements);
386
- setElements(data.elements || []);
387
- } catch (error) {
388
- if (debug) console.error("[Engage] Error loading elements:", error);
389
- }
390
- }
391
- loadElements();
392
- }, [propApiUrl, propApiKey, debug]);
393
- react.useEffect(() => {
394
- if (!elements.length) return;
395
- const checkElement = (element) => {
396
- if (dismissedElements.has(element.id)) return false;
397
- if (element.targeting?.pages) {
398
- const { include, exclude } = element.targeting.pages;
399
- if (exclude?.some((p) => matchPath(pathname, p))) return false;
400
- if (include && !include.some((p) => matchPath(pathname, p))) return false;
401
- }
402
- if (element.targeting?.devices) {
403
- const device = getDeviceType();
404
- if (!element.targeting.devices.includes(device)) return false;
405
- }
406
- if (element.trigger?.frequency) {
407
- const { type, days } = element.trigger.frequency;
408
- const key = `_engage_${element.id}`;
409
- if (type === "once") {
410
- if (localStorage.getItem(key)) return false;
411
- } else if (type === "once-per-session") {
412
- if (sessionStorage.getItem(key)) return false;
413
- } else if (type === "every-n-days" && days) {
414
- const lastShown = localStorage.getItem(key);
415
- if (lastShown) {
416
- const elapsed = Date.now() - parseInt(lastShown, 10);
417
- if (elapsed < days * 24 * 60 * 60 * 1e3) return false;
418
- }
419
- }
420
- }
421
- return true;
422
- };
423
- const eligible = elements.filter(checkElement);
424
- if (debug) console.log("[Engage] Eligible elements:", eligible);
425
- eligible.forEach((element) => {
426
- const trigger = element.trigger;
427
- if (trigger?.type === "immediate" || !trigger?.type) {
428
- setActiveElements((prev) => [...prev, element.id]);
429
- } else if (trigger?.type === "delay" && trigger.delay) {
430
- setTimeout(() => {
431
- setActiveElements((prev) => [...prev, element.id]);
432
- }, trigger.delay * 1e3);
433
- } else if (trigger?.type === "exit-intent") {
434
- const handleMouseLeave = (e) => {
435
- if (e.clientY < 10) {
436
- setActiveElements((prev) => [...prev, element.id]);
437
- document.removeEventListener("mouseleave", handleMouseLeave);
438
- }
439
- };
440
- document.addEventListener("mouseleave", handleMouseLeave);
441
- } else if (trigger?.type === "scroll" && trigger.scrollPercentage) {
442
- const handleScroll = () => {
443
- const scrollPercent = window.scrollY / (document.body.scrollHeight - window.innerHeight) * 100;
444
- if (scrollPercent >= (trigger.scrollPercentage || 50)) {
445
- setActiveElements((prev) => [...prev, element.id]);
446
- window.removeEventListener("scroll", handleScroll);
447
- }
448
- };
449
- window.addEventListener("scroll", handleScroll);
450
- }
451
- });
452
- }, [elements, pathname, dismissedElements, debug]);
453
- const handleDismiss = react.useCallback((elementId) => {
454
- setDismissedElements((prev) => /* @__PURE__ */ new Set([...prev, elementId]));
455
- setActiveElements((prev) => prev.filter((id) => id !== elementId));
456
- const element = elements.find((e) => e.id === elementId);
457
- if (element?.trigger?.frequency) {
458
- const key = `_engage_${elementId}`;
459
- if (element.trigger.frequency.type === "once-per-session") {
460
- sessionStorage.setItem(key, "true");
461
- } else {
462
- localStorage.setItem(key, Date.now().toString());
463
- }
464
- }
465
- }, [elements]);
466
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
467
- activeElements.map((elementId) => {
468
- const element = elements.find((e) => e.id === elementId);
469
- if (!element) return null;
470
- return /* @__PURE__ */ jsxRuntime.jsx(
471
- EngageElementRenderer,
472
- {
473
- element,
474
- onDismiss: () => handleDismiss(element.id),
475
- zIndex
476
- },
477
- element.id
478
- );
479
- }),
480
- chatEnabled && /* @__PURE__ */ jsxRuntime.jsx(
481
- ChatWidget,
482
- {
483
- projectId: propApiKey || "",
484
- config: {
485
- position,
486
- buttonColor: "#00afab"
487
- // Default teal, can be customized later
488
- }
489
- }
490
- )
491
- ] });
492
- }
493
- function EngageElementRenderer({
494
- element,
495
- onDismiss,
496
- zIndex
497
- }) {
498
- if (element.type === "popup") {
499
- return /* @__PURE__ */ jsxRuntime.jsx(
500
- "div",
501
- {
502
- style: {
503
- position: "fixed",
504
- top: 0,
505
- left: 0,
506
- right: 0,
507
- bottom: 0,
508
- backgroundColor: "rgba(0,0,0,0.5)",
509
- display: "flex",
510
- alignItems: "center",
511
- justifyContent: "center",
512
- zIndex
513
- },
514
- onClick: onDismiss,
515
- children: /* @__PURE__ */ jsxRuntime.jsxs(
516
- "div",
517
- {
518
- style: {
519
- backgroundColor: "white",
520
- padding: 24,
521
- borderRadius: 8,
522
- maxWidth: 500,
523
- width: "90%"
524
- },
525
- onClick: (e) => e.stopPropagation(),
526
- children: [
527
- /* @__PURE__ */ jsxRuntime.jsx(
528
- "button",
529
- {
530
- onClick: onDismiss,
531
- style: {
532
- position: "absolute",
533
- top: 8,
534
- right: 8,
535
- background: "none",
536
- border: "none",
537
- fontSize: 24,
538
- cursor: "pointer"
539
- },
540
- children: "\xD7"
541
- }
542
- ),
543
- element.config?.title && /* @__PURE__ */ jsxRuntime.jsx("h2", { children: element.config.title }),
544
- element.config?.message && /* @__PURE__ */ jsxRuntime.jsx("p", { children: element.config.message })
545
- ]
546
- }
547
- )
548
- }
549
- );
550
- }
551
- if (element.type === "bar") {
552
- return /* @__PURE__ */ jsxRuntime.jsxs(
553
- "div",
554
- {
555
- style: {
556
- position: "fixed",
557
- top: 0,
558
- left: 0,
559
- right: 0,
560
- backgroundColor: element.config?.backgroundColor || "#3b82f6",
561
- color: element.config?.textColor || "white",
562
- padding: "12px 24px",
563
- display: "flex",
564
- alignItems: "center",
565
- justifyContent: "center",
566
- gap: 16,
567
- zIndex
568
- },
569
- children: [
570
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: element.config?.message }),
571
- /* @__PURE__ */ jsxRuntime.jsx(
572
- "button",
573
- {
574
- onClick: onDismiss,
575
- style: {
576
- background: "none",
577
- border: "none",
578
- color: "inherit",
579
- fontSize: 20,
580
- cursor: "pointer"
581
- },
582
- children: "\xD7"
583
- }
584
- )
585
- ]
586
- }
587
- );
588
- }
589
- return null;
590
- }
591
- function matchPath(pathname, pattern) {
592
- if (pattern.endsWith("*")) {
593
- return pathname.startsWith(pattern.slice(0, -1));
594
- }
595
- return pathname === pattern;
596
- }
597
- function getDeviceType() {
598
- if (typeof window === "undefined") return "desktop";
599
- const ua = navigator.userAgent;
600
- if (/tablet|ipad|playbook|silk/i.test(ua)) return "tablet";
601
- if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return "mobile";
602
- return "desktop";
603
- }
604
-
605
- exports.ChatWidget = ChatWidget;
606
- exports.EngageWidget = EngageWidget;
607
- //# sourceMappingURL=chunk-QAYJV4KK.js.map
608
- //# sourceMappingURL=chunk-QAYJV4KK.js.map