@fluid-app/portal-widgets 0.1.17

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 (145) hide show
  1. package/dist/AlertWidget-AS_8Jjbd.cjs +39 -0
  2. package/dist/AlertWidget-AS_8Jjbd.cjs.map +1 -0
  3. package/dist/AlertWidget-Dy6pBmXm.mjs +22 -0
  4. package/dist/AlertWidget-Dy6pBmXm.mjs.map +1 -0
  5. package/dist/CalendarWidget-DAHnT9Wn.mjs +424 -0
  6. package/dist/CalendarWidget-DAHnT9Wn.mjs.map +1 -0
  7. package/dist/CalendarWidget-DW7q6Q7_.cjs +441 -0
  8. package/dist/CalendarWidget-DW7q6Q7_.cjs.map +1 -0
  9. package/dist/CarouselWidget-BJvLjY7H.mjs +436 -0
  10. package/dist/CarouselWidget-BJvLjY7H.mjs.map +1 -0
  11. package/dist/CarouselWidget-Bdn0LVXT.cjs +453 -0
  12. package/dist/CarouselWidget-Bdn0LVXT.cjs.map +1 -0
  13. package/dist/CatchUpWidget-CZMptzf8.cjs +264 -0
  14. package/dist/CatchUpWidget-CZMptzf8.cjs.map +1 -0
  15. package/dist/CatchUpWidget-vEP5scfy.mjs +247 -0
  16. package/dist/CatchUpWidget-vEP5scfy.mjs.map +1 -0
  17. package/dist/ChartWidget-B3GcdLqH.mjs +415 -0
  18. package/dist/ChartWidget-B3GcdLqH.mjs.map +1 -0
  19. package/dist/ChartWidget-DQB7K6S0.cjs +432 -0
  20. package/dist/ChartWidget-DQB7K6S0.cjs.map +1 -0
  21. package/dist/ContainerWidget-B-4hcPKJ.mjs +44 -0
  22. package/dist/ContainerWidget-B-4hcPKJ.mjs.map +1 -0
  23. package/dist/ContainerWidget-CHa4gVvV.cjs +2 -0
  24. package/dist/ContainerWidget-rGsakG66.cjs +51 -0
  25. package/dist/ContainerWidget-rGsakG66.cjs.map +1 -0
  26. package/dist/EmbedWidget-ChLVA_9a.mjs +156 -0
  27. package/dist/EmbedWidget-ChLVA_9a.mjs.map +1 -0
  28. package/dist/EmbedWidget-mv5ce32s.cjs +173 -0
  29. package/dist/EmbedWidget-mv5ce32s.cjs.map +1 -0
  30. package/dist/ImageWidget-DFt4mJJx.cjs +167 -0
  31. package/dist/ImageWidget-DFt4mJJx.cjs.map +1 -0
  32. package/dist/ImageWidget-DMubcgat.mjs +150 -0
  33. package/dist/ImageWidget-DMubcgat.mjs.map +1 -0
  34. package/dist/LayoutWidget-BEi0yFpz.mjs +107 -0
  35. package/dist/LayoutWidget-BEi0yFpz.mjs.map +1 -0
  36. package/dist/LayoutWidget-C4-ka0Ge.cjs +114 -0
  37. package/dist/LayoutWidget-C4-ka0Ge.cjs.map +1 -0
  38. package/dist/LayoutWidget-D4haEqTQ.cjs +2 -0
  39. package/dist/ListWidget-C-jcsCb4.mjs +901 -0
  40. package/dist/ListWidget-C-jcsCb4.mjs.map +1 -0
  41. package/dist/ListWidget-RHQ2fQXa.cjs +919 -0
  42. package/dist/ListWidget-RHQ2fQXa.cjs.map +1 -0
  43. package/dist/MediaRenderer-CcJvyOJ1.cjs +181 -0
  44. package/dist/MediaRenderer-CcJvyOJ1.cjs.map +1 -0
  45. package/dist/MediaRenderer-Uq90PZcY.mjs +163 -0
  46. package/dist/MediaRenderer-Uq90PZcY.mjs.map +1 -0
  47. package/dist/MySiteWidget-A_cYFgxJ.cjs +279 -0
  48. package/dist/MySiteWidget-A_cYFgxJ.cjs.map +1 -0
  49. package/dist/MySiteWidget-DariqlfU.mjs +262 -0
  50. package/dist/MySiteWidget-DariqlfU.mjs.map +1 -0
  51. package/dist/NestedWidget-CNkwGwhM.mjs +330 -0
  52. package/dist/NestedWidget-CNkwGwhM.mjs.map +1 -0
  53. package/dist/NestedWidget-ofk9O-t1.cjs +346 -0
  54. package/dist/NestedWidget-ofk9O-t1.cjs.map +1 -0
  55. package/dist/QuickShareWidget-DWvgEy74.cjs +262 -0
  56. package/dist/QuickShareWidget-DWvgEy74.cjs.map +1 -0
  57. package/dist/QuickShareWidget-DXq5lcDn.mjs +245 -0
  58. package/dist/QuickShareWidget-DXq5lcDn.mjs.map +1 -0
  59. package/dist/RecentActivityWidget-BvncOdax.mjs +391 -0
  60. package/dist/RecentActivityWidget-BvncOdax.mjs.map +1 -0
  61. package/dist/RecentActivityWidget-wODng8dt.cjs +408 -0
  62. package/dist/RecentActivityWidget-wODng8dt.cjs.map +1 -0
  63. package/dist/RegistryContext-CscXrsRa.mjs +36 -0
  64. package/dist/RegistryContext-CscXrsRa.mjs.map +1 -0
  65. package/dist/RegistryContext-xjea4xVV.cjs +55 -0
  66. package/dist/RegistryContext-xjea4xVV.cjs.map +1 -0
  67. package/dist/ScreenRenderer-D52h5VQr.mjs +76 -0
  68. package/dist/ScreenRenderer-D52h5VQr.mjs.map +1 -0
  69. package/dist/ScreenRenderer-DZAxcg7x.cjs +82 -0
  70. package/dist/ScreenRenderer-DZAxcg7x.cjs.map +1 -0
  71. package/dist/ScreenRendererContext-CK1IsFTn.cjs +36 -0
  72. package/dist/ScreenRendererContext-CK1IsFTn.cjs.map +1 -0
  73. package/dist/ScreenRendererContext-DKcdcmiT.mjs +23 -0
  74. package/dist/ScreenRendererContext-DKcdcmiT.mjs.map +1 -0
  75. package/dist/SpacerWidget-Bgz6701y.cjs +60 -0
  76. package/dist/SpacerWidget-Bgz6701y.cjs.map +1 -0
  77. package/dist/SpacerWidget-DHGoW6eu.mjs +43 -0
  78. package/dist/SpacerWidget-DHGoW6eu.mjs.map +1 -0
  79. package/dist/TableWidget--yLJTqoW.mjs +438 -0
  80. package/dist/TableWidget--yLJTqoW.mjs.map +1 -0
  81. package/dist/TableWidget-TfQfFHft.cjs +455 -0
  82. package/dist/TableWidget-TfQfFHft.cjs.map +1 -0
  83. package/dist/TextWidget-CL2H3vei.mjs +129 -0
  84. package/dist/TextWidget-CL2H3vei.mjs.map +1 -0
  85. package/dist/TextWidget-D6Ug_2Z1.cjs +146 -0
  86. package/dist/TextWidget-D6Ug_2Z1.cjs.map +1 -0
  87. package/dist/ToDoWidget-D8YIsl7y.mjs +274 -0
  88. package/dist/ToDoWidget-D8YIsl7y.mjs.map +1 -0
  89. package/dist/ToDoWidget-Dvs0GDkx.cjs +291 -0
  90. package/dist/ToDoWidget-Dvs0GDkx.cjs.map +1 -0
  91. package/dist/VideoWidget-D6C_jHOF.mjs +192 -0
  92. package/dist/VideoWidget-D6C_jHOF.mjs.map +1 -0
  93. package/dist/VideoWidget-SODAPZO4.cjs +209 -0
  94. package/dist/VideoWidget-SODAPZO4.cjs.map +1 -0
  95. package/dist/chunk-CZWwpsFl.cjs +43 -0
  96. package/dist/components/index.cjs +14 -0
  97. package/dist/components/index.cjs.map +1 -0
  98. package/dist/components/index.d.cts +11 -0
  99. package/dist/components/index.d.cts.map +1 -0
  100. package/dist/components/index.d.mts +11 -0
  101. package/dist/components/index.d.mts.map +1 -0
  102. package/dist/components/index.mjs +11 -0
  103. package/dist/components/index.mjs.map +1 -0
  104. package/dist/contexts/index.cjs +8 -0
  105. package/dist/contexts/index.d.cts +77 -0
  106. package/dist/contexts/index.d.cts.map +1 -0
  107. package/dist/contexts/index.d.mts +77 -0
  108. package/dist/contexts/index.d.mts.map +1 -0
  109. package/dist/contexts/index.mjs +3 -0
  110. package/dist/core/index.cjs +51 -0
  111. package/dist/core/index.d.cts +77 -0
  112. package/dist/core/index.d.cts.map +1 -0
  113. package/dist/core/index.d.mts +77 -0
  114. package/dist/core/index.d.mts.map +1 -0
  115. package/dist/core/index.mjs +4 -0
  116. package/dist/error-state-DErSxZwH.mjs +18 -0
  117. package/dist/error-state-DErSxZwH.mjs.map +1 -0
  118. package/dist/error-state-DSzVUtEl.cjs +24 -0
  119. package/dist/error-state-DSzVUtEl.cjs.map +1 -0
  120. package/dist/fields-4FC6JUNH.d.mts +2 -0
  121. package/dist/fields-DjLFJmz6.d.cts +2 -0
  122. package/dist/fields-wPOk-SmZ.mjs +2 -0
  123. package/dist/rolldown-runtime-wcPFST8Q.mjs +13 -0
  124. package/dist/scroll-arrows-BZIlsE_x.cjs +35 -0
  125. package/dist/scroll-arrows-BZIlsE_x.cjs.map +1 -0
  126. package/dist/scroll-arrows-BevCYRNT.mjs +29 -0
  127. package/dist/scroll-arrows-BevCYRNT.mjs.map +1 -0
  128. package/dist/ui/index.cjs +101 -0
  129. package/dist/ui/index.d.cts +15 -0
  130. package/dist/ui/index.d.cts.map +1 -0
  131. package/dist/ui/index.d.mts +15 -0
  132. package/dist/ui/index.d.mts.map +1 -0
  133. package/dist/ui/index.mjs +3 -0
  134. package/dist/widgets/index.cjs +92 -0
  135. package/dist/widgets/index.cjs.map +1 -0
  136. package/dist/widgets/index.d.cts +689 -0
  137. package/dist/widgets/index.d.cts.map +1 -0
  138. package/dist/widgets/index.d.mts +689 -0
  139. package/dist/widgets/index.d.mts.map +1 -0
  140. package/dist/widgets/index.mjs +46 -0
  141. package/dist/widgets/index.mjs.map +1 -0
  142. package/package.json +104 -0
  143. package/src/styles/globals.css +23 -0
  144. package/src/styles/index.ts +1 -0
  145. package/tailwind.config.ts +61 -0
@@ -0,0 +1,279 @@
1
+ const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
+ const require_error_state = require("./error-state-DSzVUtEl.cjs");
3
+ let react_jsx_runtime = require("react/jsx-runtime");
4
+ let react = require("react");
5
+ let _tanstack_react_query = require("@tanstack/react-query");
6
+ let _fluid_app_portal_core_data_sources_context = require("@fluid-app/portal-core/data-sources/context");
7
+ let _fluid_app_portal_core_data_sources_preview_context = require("@fluid-app/portal-core/data-sources/preview-context");
8
+ let _fluid_app_portal_core_registries = require("@fluid-app/portal-core/registries");
9
+ //#region src/hooks/use-mysite.preview.ts
10
+ const PREVIEW_DATA = {
11
+ url: "https://mysite.example.com",
12
+ views: 1248,
13
+ leads: 43,
14
+ userName: "Jane"
15
+ };
16
+ //#endregion
17
+ //#region src/hooks/use-mysite.ts
18
+ function useMySite() {
19
+ const { baseUrl, getApiHeaders } = (0, _fluid_app_portal_core_data_sources_context.useDataSourceConfig)();
20
+ const { isPreview } = (0, _fluid_app_portal_core_data_sources_preview_context.useWidgetPreviewContext)();
21
+ return (0, _tanstack_react_query.useQuery)({
22
+ queryKey: [
23
+ "portal-widget-use",
24
+ "mysite",
25
+ isPreview ? "preview" : baseUrl
26
+ ],
27
+ queryFn: async ({ signal }) => {
28
+ const url = baseUrl ? `${baseUrl}/me` : "/me";
29
+ const response = await fetch(url, {
30
+ headers: {
31
+ "content-type": "application/json",
32
+ ...getApiHeaders?.()
33
+ },
34
+ signal
35
+ });
36
+ if (!response.ok) throw new Error(`Failed to fetch MySite data: ${response.status}`);
37
+ const data = await response.json();
38
+ return {
39
+ url: data.mysite_url ?? null,
40
+ views: data.mysite_views ?? 0,
41
+ leads: data.mysite_leads ?? 0,
42
+ userName: data.name || data.first_name || "User"
43
+ };
44
+ },
45
+ enabled: !isPreview,
46
+ ...isPreview && { placeholderData: PREVIEW_DATA }
47
+ });
48
+ }
49
+ //#endregion
50
+ //#region src/widgets/MySiteWidget.tsx
51
+ var MySiteWidget_exports = /* @__PURE__ */ require_chunk.__exportAll({
52
+ MySiteWidget: () => MySiteWidget,
53
+ mySiteWidgetPropertySchema: () => mySiteWidgetPropertySchema
54
+ });
55
+ function MySiteWidget({ titleEnabled = true, titleText = "My Site", titleFontSize = "lg", titleColor = "foreground", background = {
56
+ type: "solid",
57
+ color: "background"
58
+ }, textColor = "foreground", accentColor = "primary", padding = 4, borderRadius = "md", showPreview = true, showAnalytics = true, className, ...props }) {
59
+ const backgroundColor = background.color || "background";
60
+ const backgroundImage = (background.resource?.image_url || background.resource?.imageUrl) && background.type === "image" ? `url(${background.resource.image_url || background.resource.imageUrl})` : "none";
61
+ const { data: mySite, isLoading, isError } = useMySite();
62
+ const previewUrl = (0, react.useMemo)(() => {
63
+ if (!mySite?.url) return "";
64
+ try {
65
+ const urlObj = new URL(mySite.url);
66
+ urlObj.searchParams.set("preview", "true");
67
+ return urlObj.toString();
68
+ } catch {
69
+ return mySite.url;
70
+ }
71
+ }, [mySite?.url]);
72
+ const displayUrl = (0, react.useMemo)(() => mySite?.url ? mySite.url.replace(/^https?:\/\//, "") : "", [mySite?.url]);
73
+ if (!isLoading && !isError && !mySite?.url) return null;
74
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
75
+ className: `@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className}`,
76
+ style: { backgroundImage },
77
+ ...props,
78
+ children: [titleEnabled && titleText && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
79
+ className: `p-${padding} pb-0`,
80
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
81
+ className: `text-${titleFontSize} font-bold text-${titleColor}`,
82
+ children: mySite?.userName ? `${mySite.userName}'s ${titleText}` : titleText
83
+ })
84
+ }), isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
85
+ className: `flex min-h-[200px] items-center justify-center p-${padding}`,
86
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent" })
87
+ }) : isError ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_error_state.ErrorState, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
88
+ className: `p-${padding}`,
89
+ children: [showPreview && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
90
+ className: "border-muted mb-4 overflow-hidden rounded-lg border",
91
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
92
+ className: "bg-[#f3f4f6] px-3 py-2 text-[#6b7280]",
93
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
94
+ className: "flex items-center gap-2",
95
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
96
+ className: "flex gap-1",
97
+ children: [
98
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-3 w-3 rounded-full bg-[#ff5f57]" }),
99
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-3 w-3 rounded-full bg-[#febc2e]" }),
100
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: "h-3 w-3 rounded-full bg-[#28c840]" })
101
+ ]
102
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
103
+ className: "flex-1 text-center",
104
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
105
+ href: mySite?.url ?? "",
106
+ target: "_blank",
107
+ rel: "noopener noreferrer",
108
+ className: "text-sm opacity-60",
109
+ children: displayUrl
110
+ })
111
+ })]
112
+ })
113
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
114
+ className: "h-[200px] overflow-hidden bg-[#ffffff] @md:h-[280px]",
115
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("iframe", {
116
+ className: "pointer-events-none h-[700%] w-[700%] origin-top-left scale-[0.14] bg-[#ffffff]",
117
+ src: previewUrl,
118
+ title: "MySite Preview"
119
+ })
120
+ })]
121
+ }), showAnalytics && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
122
+ className: "grid grid-cols-2 gap-3",
123
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
124
+ className: "border-muted bg-background rounded-lg border p-3",
125
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
126
+ className: "text-xs opacity-60",
127
+ children: "Visitors This Month"
128
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
129
+ className: `text-xl font-bold text-${accentColor}`,
130
+ children: mySite?.views ?? 0
131
+ })]
132
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
133
+ className: "border-muted bg-background rounded-lg border p-3",
134
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
135
+ className: "text-xs opacity-60",
136
+ children: "Total Leads"
137
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
138
+ className: `text-xl font-bold text-${accentColor}`,
139
+ children: mySite?.leads ?? 0
140
+ })]
141
+ })]
142
+ })]
143
+ })]
144
+ });
145
+ }
146
+ const mySiteWidgetPropertySchema = {
147
+ widgetType: "MySiteWidget",
148
+ displayName: "MySite Widget",
149
+ tabsConfig: [{
150
+ id: "styling",
151
+ label: "Styling"
152
+ }],
153
+ fields: [
154
+ {
155
+ key: "titleEnabled",
156
+ label: "Widget Title",
157
+ type: "boolean",
158
+ description: "Enable the title displayed above the widget",
159
+ defaultValue: true,
160
+ tab: "styling",
161
+ group: "Title"
162
+ },
163
+ {
164
+ key: "titleText",
165
+ label: "Title",
166
+ type: "text",
167
+ description: "Title text displayed above the widget",
168
+ defaultValue: "My Site",
169
+ tab: "styling",
170
+ group: "Title",
171
+ requiresKeyToBeTrue: "titleEnabled"
172
+ },
173
+ (0, _fluid_app_portal_core_registries.getFontSizeField)({
174
+ key: "titleFontSize",
175
+ label: "Title Font Size",
176
+ description: "Font size for the widget title",
177
+ defaultValue: "xl",
178
+ tab: "styling",
179
+ group: "Title",
180
+ requiresKeyToBeTrue: "titleEnabled"
181
+ }),
182
+ (0, _fluid_app_portal_core_registries.getColorField)({
183
+ key: "titleColor",
184
+ label: "Title Color",
185
+ description: "Color for the widget title",
186
+ defaultValue: "foreground",
187
+ tab: "styling",
188
+ group: "Title",
189
+ requiresKeyToBeTrue: "titleEnabled"
190
+ }),
191
+ {
192
+ type: "background",
193
+ key: "background",
194
+ label: "Background",
195
+ description: "Background for the widget container",
196
+ defaultValue: "background",
197
+ tab: "styling",
198
+ group: "Design"
199
+ },
200
+ (0, _fluid_app_portal_core_registries.getColorField)({
201
+ key: "textColor",
202
+ label: "Text Color",
203
+ description: "Default text color for widget content",
204
+ defaultValue: "foreground",
205
+ tab: "styling",
206
+ group: "Design"
207
+ }),
208
+ (0, _fluid_app_portal_core_registries.getColorField)({
209
+ key: "accentColor",
210
+ label: "Accent Color",
211
+ description: "Color used for analytics numbers",
212
+ defaultValue: "primary",
213
+ tab: "styling",
214
+ group: "Design"
215
+ }),
216
+ {
217
+ key: "separator",
218
+ type: "separator",
219
+ label: "Separator",
220
+ tab: "styling",
221
+ group: "Design"
222
+ },
223
+ (0, _fluid_app_portal_core_registries.getPaddingField)({
224
+ key: "padding",
225
+ label: "Padding",
226
+ description: "Padding around the widget container",
227
+ defaultValue: 4,
228
+ tab: "styling",
229
+ group: "Design"
230
+ }),
231
+ (0, _fluid_app_portal_core_registries.getBorderRadiusField)({
232
+ key: "borderRadius",
233
+ label: "Border Radius",
234
+ description: "Border radius for the widget container",
235
+ defaultValue: "md",
236
+ tab: "styling",
237
+ group: "Design"
238
+ }),
239
+ {
240
+ key: "showPreview",
241
+ label: "Show Preview",
242
+ type: "boolean",
243
+ description: "Show the MySite iframe preview",
244
+ defaultValue: true,
245
+ tab: "styling",
246
+ group: "Display"
247
+ },
248
+ {
249
+ key: "showAnalytics",
250
+ label: "Show Analytics",
251
+ type: "boolean",
252
+ description: "Show the analytics section",
253
+ defaultValue: true,
254
+ tab: "styling",
255
+ group: "Display"
256
+ }
257
+ ]
258
+ };
259
+ //#endregion
260
+ Object.defineProperty(exports, "MySiteWidget", {
261
+ enumerable: true,
262
+ get: function() {
263
+ return MySiteWidget;
264
+ }
265
+ });
266
+ Object.defineProperty(exports, "MySiteWidget_exports", {
267
+ enumerable: true,
268
+ get: function() {
269
+ return MySiteWidget_exports;
270
+ }
271
+ });
272
+ Object.defineProperty(exports, "mySiteWidgetPropertySchema", {
273
+ enumerable: true,
274
+ get: function() {
275
+ return mySiteWidgetPropertySchema;
276
+ }
277
+ });
278
+
279
+ //# sourceMappingURL=MySiteWidget-A_cYFgxJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MySiteWidget-A_cYFgxJ.cjs","names":["ErrorState"],"sources":["../src/hooks/use-mysite.preview.ts","../src/hooks/use-mysite.ts","../src/widgets/MySiteWidget.tsx"],"sourcesContent":["import type { MySiteData } from \"./use-mysite.types\";\n\nexport const PREVIEW_DATA: MySiteData = {\n url: \"https://mysite.example.com\",\n views: 1248,\n leads: 43,\n userName: \"Jane\",\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useDataSourceConfig } from \"@fluid-app/portal-core/data-sources/context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-core/data-sources/preview-context\";\nimport { PREVIEW_DATA } from \"./use-mysite.preview\";\n\nimport type { MySiteData } from \"./use-mysite.types\";\n\nexport type { MySiteData } from \"./use-mysite.types\";\n\nexport function useMySite(): UseQueryResult<MySiteData, Error> {\n const { baseUrl, getApiHeaders } = useDataSourceConfig();\n const { isPreview } = useWidgetPreviewContext();\n\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n \"mysite\",\n isPreview ? \"preview\" : baseUrl,\n ] as const,\n queryFn: async ({ signal }): Promise<MySiteData> => {\n const url = baseUrl ? `${baseUrl}/me` : \"/me\";\n const response = await fetch(url, {\n headers: {\n \"content-type\": \"application/json\",\n ...getApiHeaders?.(),\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch MySite data: ${response.status}`);\n }\n\n const data = await response.json();\n return {\n url: data.mysite_url ?? null,\n views: data.mysite_views ?? 0,\n leads: data.mysite_leads ?? 0,\n userName: data.name || data.first_name || \"User\",\n };\n },\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useMemo, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport { useMySite } from \"../hooks/use-mysite\";\nimport { ErrorState } from \"../components/error-state\";\n\ntype MySiteWidgetProps = ComponentProps<\"div\"> & {\n // Title settings\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Design settings\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Display settings\n showPreview?: boolean;\n showAnalytics?: boolean;\n};\n\nexport function MySiteWidget({\n // Title defaults\n titleEnabled = true,\n titleText = \"My Site\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n\n // Design defaults\n background = {\n type: \"solid\",\n color: \"background\",\n },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n\n // Display defaults\n showPreview = true,\n showAnalytics = true,\n\n className,\n ...props\n}: MySiteWidgetProps): React.JSX.Element | null {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n const { data: mySite, isLoading, isError } = useMySite();\n\n // Generate preview URL with preview=true parameter\n const previewUrl = useMemo(() => {\n if (!mySite?.url) return \"\";\n try {\n const urlObj = new URL(mySite.url);\n urlObj.searchParams.set(\"preview\", \"true\");\n return urlObj.toString();\n } catch {\n return mySite.url;\n }\n }, [mySite?.url]);\n\n // Display URL without protocol\n const displayUrl = useMemo(\n () => (mySite?.url ? mySite.url.replace(/^https?:\\/\\//, \"\") : \"\"),\n [mySite?.url],\n );\n\n // Don't render if no MySite URL exists (but still render if errored or loading)\n if (!isLoading && !isError && !mySite?.url) {\n return null;\n }\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className}`}\n style={{ backgroundImage }}\n {...props}\n >\n {/* Title */}\n {titleEnabled && titleText && (\n <div className={`p-${padding} pb-0`}>\n <h2 className={`text-${titleFontSize} font-bold text-${titleColor}`}>\n {mySite?.userName ? `${mySite.userName}'s ${titleText}` : titleText}\n </h2>\n </div>\n )}\n\n {/* Loading state */}\n {isLoading ? (\n <div\n className={`flex min-h-[200px] items-center justify-center p-${padding}`}\n >\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : (\n <div className={`p-${padding}`}>\n {/* MySite iframe preview */}\n {showPreview && (\n <div className=\"border-muted mb-4 overflow-hidden rounded-lg border\">\n {/* Browser chrome */}\n <div className=\"bg-[#f3f4f6] px-3 py-2 text-[#6b7280]\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-1\">\n <div className=\"h-3 w-3 rounded-full bg-[#ff5f57]\" />\n <div className=\"h-3 w-3 rounded-full bg-[#febc2e]\" />\n <div className=\"h-3 w-3 rounded-full bg-[#28c840]\" />\n </div>\n <div className=\"flex-1 text-center\">\n <a\n href={mySite?.url ?? \"\"}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm opacity-60\"\n >\n {displayUrl}\n </a>\n </div>\n </div>\n </div>\n {/* iframe container */}\n <div className=\"h-[200px] overflow-hidden bg-[#ffffff] @md:h-[280px]\">\n <iframe\n className=\"pointer-events-none h-[700%] w-[700%] origin-top-left scale-[0.14] bg-[#ffffff]\"\n src={previewUrl}\n title=\"MySite Preview\"\n />\n </div>\n </div>\n )}\n\n {/* Analytics data */}\n {showAnalytics && (\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"border-muted bg-background rounded-lg border p-3\">\n <div className=\"text-xs opacity-60\">Visitors This Month</div>\n <div className={`text-xl font-bold text-${accentColor}`}>\n {mySite?.views ?? 0}\n </div>\n </div>\n <div className=\"border-muted bg-background rounded-lg border p-3\">\n <div className=\"text-xs opacity-60\">Total Leads</div>\n <div className={`text-xl font-bold text-${accentColor}`}>\n {mySite?.leads ?? 0}\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const mySiteWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteWidget\",\n displayName: \"MySite Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Styling Tab - Title Group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the widget\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the widget\",\n defaultValue: \"My Site\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling Tab - Design Group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for widget content\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color used for analytics numbers\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the widget container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n\n // Styling Tab - Display Group\n {\n key: \"showPreview\",\n label: \"Show Preview\",\n type: \"boolean\",\n description: \"Show the MySite iframe preview\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n {\n key: \"showAnalytics\",\n label: \"Show Analytics\",\n type: \"boolean\",\n description: \"Show the analytics section\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -0,0 +1,262 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-wcPFST8Q.mjs";
2
+ import { a as getFontSizeField, c as getPaddingField, i as getColorField, n as getBorderRadiusField } from "./fields-wPOk-SmZ.mjs";
3
+ import { t as ErrorState } from "./error-state-DErSxZwH.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { useMemo } from "react";
6
+ import { useQuery } from "@tanstack/react-query";
7
+ import { useDataSourceConfig } from "@fluid-app/portal-core/data-sources/context";
8
+ import { useWidgetPreviewContext } from "@fluid-app/portal-core/data-sources/preview-context";
9
+ //#region src/hooks/use-mysite.preview.ts
10
+ const PREVIEW_DATA = {
11
+ url: "https://mysite.example.com",
12
+ views: 1248,
13
+ leads: 43,
14
+ userName: "Jane"
15
+ };
16
+ //#endregion
17
+ //#region src/hooks/use-mysite.ts
18
+ function useMySite() {
19
+ const { baseUrl, getApiHeaders } = useDataSourceConfig();
20
+ const { isPreview } = useWidgetPreviewContext();
21
+ return useQuery({
22
+ queryKey: [
23
+ "portal-widget-use",
24
+ "mysite",
25
+ isPreview ? "preview" : baseUrl
26
+ ],
27
+ queryFn: async ({ signal }) => {
28
+ const url = baseUrl ? `${baseUrl}/me` : "/me";
29
+ const response = await fetch(url, {
30
+ headers: {
31
+ "content-type": "application/json",
32
+ ...getApiHeaders?.()
33
+ },
34
+ signal
35
+ });
36
+ if (!response.ok) throw new Error(`Failed to fetch MySite data: ${response.status}`);
37
+ const data = await response.json();
38
+ return {
39
+ url: data.mysite_url ?? null,
40
+ views: data.mysite_views ?? 0,
41
+ leads: data.mysite_leads ?? 0,
42
+ userName: data.name || data.first_name || "User"
43
+ };
44
+ },
45
+ enabled: !isPreview,
46
+ ...isPreview && { placeholderData: PREVIEW_DATA }
47
+ });
48
+ }
49
+ //#endregion
50
+ //#region src/widgets/MySiteWidget.tsx
51
+ var MySiteWidget_exports = /* @__PURE__ */ __exportAll({
52
+ MySiteWidget: () => MySiteWidget,
53
+ mySiteWidgetPropertySchema: () => mySiteWidgetPropertySchema
54
+ });
55
+ function MySiteWidget({ titleEnabled = true, titleText = "My Site", titleFontSize = "lg", titleColor = "foreground", background = {
56
+ type: "solid",
57
+ color: "background"
58
+ }, textColor = "foreground", accentColor = "primary", padding = 4, borderRadius = "md", showPreview = true, showAnalytics = true, className, ...props }) {
59
+ const backgroundColor = background.color || "background";
60
+ const backgroundImage = (background.resource?.image_url || background.resource?.imageUrl) && background.type === "image" ? `url(${background.resource.image_url || background.resource.imageUrl})` : "none";
61
+ const { data: mySite, isLoading, isError } = useMySite();
62
+ const previewUrl = useMemo(() => {
63
+ if (!mySite?.url) return "";
64
+ try {
65
+ const urlObj = new URL(mySite.url);
66
+ urlObj.searchParams.set("preview", "true");
67
+ return urlObj.toString();
68
+ } catch {
69
+ return mySite.url;
70
+ }
71
+ }, [mySite?.url]);
72
+ const displayUrl = useMemo(() => mySite?.url ? mySite.url.replace(/^https?:\/\//, "") : "", [mySite?.url]);
73
+ if (!isLoading && !isError && !mySite?.url) return null;
74
+ return /* @__PURE__ */ jsxs("div", {
75
+ className: `@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className}`,
76
+ style: { backgroundImage },
77
+ ...props,
78
+ children: [titleEnabled && titleText && /* @__PURE__ */ jsx("div", {
79
+ className: `p-${padding} pb-0`,
80
+ children: /* @__PURE__ */ jsx("h2", {
81
+ className: `text-${titleFontSize} font-bold text-${titleColor}`,
82
+ children: mySite?.userName ? `${mySite.userName}'s ${titleText}` : titleText
83
+ })
84
+ }), isLoading ? /* @__PURE__ */ jsx("div", {
85
+ className: `flex min-h-[200px] items-center justify-center p-${padding}`,
86
+ children: /* @__PURE__ */ jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent" })
87
+ }) : isError ? /* @__PURE__ */ jsx(ErrorState, {}) : /* @__PURE__ */ jsxs("div", {
88
+ className: `p-${padding}`,
89
+ children: [showPreview && /* @__PURE__ */ jsxs("div", {
90
+ className: "border-muted mb-4 overflow-hidden rounded-lg border",
91
+ children: [/* @__PURE__ */ jsx("div", {
92
+ className: "bg-[#f3f4f6] px-3 py-2 text-[#6b7280]",
93
+ children: /* @__PURE__ */ jsxs("div", {
94
+ className: "flex items-center gap-2",
95
+ children: [/* @__PURE__ */ jsxs("div", {
96
+ className: "flex gap-1",
97
+ children: [
98
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-[#ff5f57]" }),
99
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-[#febc2e]" }),
100
+ /* @__PURE__ */ jsx("div", { className: "h-3 w-3 rounded-full bg-[#28c840]" })
101
+ ]
102
+ }), /* @__PURE__ */ jsx("div", {
103
+ className: "flex-1 text-center",
104
+ children: /* @__PURE__ */ jsx("a", {
105
+ href: mySite?.url ?? "",
106
+ target: "_blank",
107
+ rel: "noopener noreferrer",
108
+ className: "text-sm opacity-60",
109
+ children: displayUrl
110
+ })
111
+ })]
112
+ })
113
+ }), /* @__PURE__ */ jsx("div", {
114
+ className: "h-[200px] overflow-hidden bg-[#ffffff] @md:h-[280px]",
115
+ children: /* @__PURE__ */ jsx("iframe", {
116
+ className: "pointer-events-none h-[700%] w-[700%] origin-top-left scale-[0.14] bg-[#ffffff]",
117
+ src: previewUrl,
118
+ title: "MySite Preview"
119
+ })
120
+ })]
121
+ }), showAnalytics && /* @__PURE__ */ jsxs("div", {
122
+ className: "grid grid-cols-2 gap-3",
123
+ children: [/* @__PURE__ */ jsxs("div", {
124
+ className: "border-muted bg-background rounded-lg border p-3",
125
+ children: [/* @__PURE__ */ jsx("div", {
126
+ className: "text-xs opacity-60",
127
+ children: "Visitors This Month"
128
+ }), /* @__PURE__ */ jsx("div", {
129
+ className: `text-xl font-bold text-${accentColor}`,
130
+ children: mySite?.views ?? 0
131
+ })]
132
+ }), /* @__PURE__ */ jsxs("div", {
133
+ className: "border-muted bg-background rounded-lg border p-3",
134
+ children: [/* @__PURE__ */ jsx("div", {
135
+ className: "text-xs opacity-60",
136
+ children: "Total Leads"
137
+ }), /* @__PURE__ */ jsx("div", {
138
+ className: `text-xl font-bold text-${accentColor}`,
139
+ children: mySite?.leads ?? 0
140
+ })]
141
+ })]
142
+ })]
143
+ })]
144
+ });
145
+ }
146
+ const mySiteWidgetPropertySchema = {
147
+ widgetType: "MySiteWidget",
148
+ displayName: "MySite Widget",
149
+ tabsConfig: [{
150
+ id: "styling",
151
+ label: "Styling"
152
+ }],
153
+ fields: [
154
+ {
155
+ key: "titleEnabled",
156
+ label: "Widget Title",
157
+ type: "boolean",
158
+ description: "Enable the title displayed above the widget",
159
+ defaultValue: true,
160
+ tab: "styling",
161
+ group: "Title"
162
+ },
163
+ {
164
+ key: "titleText",
165
+ label: "Title",
166
+ type: "text",
167
+ description: "Title text displayed above the widget",
168
+ defaultValue: "My Site",
169
+ tab: "styling",
170
+ group: "Title",
171
+ requiresKeyToBeTrue: "titleEnabled"
172
+ },
173
+ getFontSizeField({
174
+ key: "titleFontSize",
175
+ label: "Title Font Size",
176
+ description: "Font size for the widget title",
177
+ defaultValue: "xl",
178
+ tab: "styling",
179
+ group: "Title",
180
+ requiresKeyToBeTrue: "titleEnabled"
181
+ }),
182
+ getColorField({
183
+ key: "titleColor",
184
+ label: "Title Color",
185
+ description: "Color for the widget title",
186
+ defaultValue: "foreground",
187
+ tab: "styling",
188
+ group: "Title",
189
+ requiresKeyToBeTrue: "titleEnabled"
190
+ }),
191
+ {
192
+ type: "background",
193
+ key: "background",
194
+ label: "Background",
195
+ description: "Background for the widget container",
196
+ defaultValue: "background",
197
+ tab: "styling",
198
+ group: "Design"
199
+ },
200
+ getColorField({
201
+ key: "textColor",
202
+ label: "Text Color",
203
+ description: "Default text color for widget content",
204
+ defaultValue: "foreground",
205
+ tab: "styling",
206
+ group: "Design"
207
+ }),
208
+ getColorField({
209
+ key: "accentColor",
210
+ label: "Accent Color",
211
+ description: "Color used for analytics numbers",
212
+ defaultValue: "primary",
213
+ tab: "styling",
214
+ group: "Design"
215
+ }),
216
+ {
217
+ key: "separator",
218
+ type: "separator",
219
+ label: "Separator",
220
+ tab: "styling",
221
+ group: "Design"
222
+ },
223
+ getPaddingField({
224
+ key: "padding",
225
+ label: "Padding",
226
+ description: "Padding around the widget container",
227
+ defaultValue: 4,
228
+ tab: "styling",
229
+ group: "Design"
230
+ }),
231
+ getBorderRadiusField({
232
+ key: "borderRadius",
233
+ label: "Border Radius",
234
+ description: "Border radius for the widget container",
235
+ defaultValue: "md",
236
+ tab: "styling",
237
+ group: "Design"
238
+ }),
239
+ {
240
+ key: "showPreview",
241
+ label: "Show Preview",
242
+ type: "boolean",
243
+ description: "Show the MySite iframe preview",
244
+ defaultValue: true,
245
+ tab: "styling",
246
+ group: "Display"
247
+ },
248
+ {
249
+ key: "showAnalytics",
250
+ label: "Show Analytics",
251
+ type: "boolean",
252
+ description: "Show the analytics section",
253
+ defaultValue: true,
254
+ tab: "styling",
255
+ group: "Display"
256
+ }
257
+ ]
258
+ };
259
+ //#endregion
260
+ export { MySiteWidget_exports as n, mySiteWidgetPropertySchema as r, MySiteWidget as t };
261
+
262
+ //# sourceMappingURL=MySiteWidget-DariqlfU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MySiteWidget-DariqlfU.mjs","names":[],"sources":["../src/hooks/use-mysite.preview.ts","../src/hooks/use-mysite.ts","../src/widgets/MySiteWidget.tsx"],"sourcesContent":["import type { MySiteData } from \"./use-mysite.types\";\n\nexport const PREVIEW_DATA: MySiteData = {\n url: \"https://mysite.example.com\",\n views: 1248,\n leads: 43,\n userName: \"Jane\",\n};\n","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useDataSourceConfig } from \"@fluid-app/portal-core/data-sources/context\";\nimport { useWidgetPreviewContext } from \"@fluid-app/portal-core/data-sources/preview-context\";\nimport { PREVIEW_DATA } from \"./use-mysite.preview\";\n\nimport type { MySiteData } from \"./use-mysite.types\";\n\nexport type { MySiteData } from \"./use-mysite.types\";\n\nexport function useMySite(): UseQueryResult<MySiteData, Error> {\n const { baseUrl, getApiHeaders } = useDataSourceConfig();\n const { isPreview } = useWidgetPreviewContext();\n\n return useQuery({\n queryKey: [\n \"portal-widget-use\",\n \"mysite\",\n isPreview ? \"preview\" : baseUrl,\n ] as const,\n queryFn: async ({ signal }): Promise<MySiteData> => {\n const url = baseUrl ? `${baseUrl}/me` : \"/me\";\n const response = await fetch(url, {\n headers: {\n \"content-type\": \"application/json\",\n ...getApiHeaders?.(),\n },\n signal,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch MySite data: ${response.status}`);\n }\n\n const data = await response.json();\n return {\n url: data.mysite_url ?? null,\n views: data.mysite_views ?? 0,\n leads: data.mysite_leads ?? 0,\n userName: data.name || data.first_name || \"User\",\n };\n },\n enabled: !isPreview,\n ...(isPreview && { placeholderData: PREVIEW_DATA }),\n });\n}\n","import { useMemo, type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n} from \"../core/fields\";\nimport { useMySite } from \"../hooks/use-mysite\";\nimport { ErrorState } from \"../components/error-state\";\n\ntype MySiteWidgetProps = ComponentProps<\"div\"> & {\n // Title settings\n titleEnabled?: boolean;\n titleText?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Design settings\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n\n // Display settings\n showPreview?: boolean;\n showAnalytics?: boolean;\n};\n\nexport function MySiteWidget({\n // Title defaults\n titleEnabled = true,\n titleText = \"My Site\",\n titleFontSize = \"lg\",\n titleColor = \"foreground\",\n\n // Design defaults\n background = {\n type: \"solid\",\n color: \"background\",\n },\n textColor = \"foreground\",\n accentColor = \"primary\",\n padding = 4,\n borderRadius = \"md\",\n\n // Display defaults\n showPreview = true,\n showAnalytics = true,\n\n className,\n ...props\n}: MySiteWidgetProps): React.JSX.Element | null {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n const { data: mySite, isLoading, isError } = useMySite();\n\n // Generate preview URL with preview=true parameter\n const previewUrl = useMemo(() => {\n if (!mySite?.url) return \"\";\n try {\n const urlObj = new URL(mySite.url);\n urlObj.searchParams.set(\"preview\", \"true\");\n return urlObj.toString();\n } catch {\n return mySite.url;\n }\n }, [mySite?.url]);\n\n // Display URL without protocol\n const displayUrl = useMemo(\n () => (mySite?.url ? mySite.url.replace(/^https?:\\/\\//, \"\") : \"\"),\n [mySite?.url],\n );\n\n // Don't render if no MySite URL exists (but still render if errored or loading)\n if (!isLoading && !isError && !mySite?.url) {\n return null;\n }\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} text-${textColor} ${className}`}\n style={{ backgroundImage }}\n {...props}\n >\n {/* Title */}\n {titleEnabled && titleText && (\n <div className={`p-${padding} pb-0`}>\n <h2 className={`text-${titleFontSize} font-bold text-${titleColor}`}>\n {mySite?.userName ? `${mySite.userName}'s ${titleText}` : titleText}\n </h2>\n </div>\n )}\n\n {/* Loading state */}\n {isLoading ? (\n <div\n className={`flex min-h-[200px] items-center justify-center p-${padding}`}\n >\n <div className=\"h-8 w-8 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n </div>\n ) : isError ? (\n <ErrorState />\n ) : (\n <div className={`p-${padding}`}>\n {/* MySite iframe preview */}\n {showPreview && (\n <div className=\"border-muted mb-4 overflow-hidden rounded-lg border\">\n {/* Browser chrome */}\n <div className=\"bg-[#f3f4f6] px-3 py-2 text-[#6b7280]\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex gap-1\">\n <div className=\"h-3 w-3 rounded-full bg-[#ff5f57]\" />\n <div className=\"h-3 w-3 rounded-full bg-[#febc2e]\" />\n <div className=\"h-3 w-3 rounded-full bg-[#28c840]\" />\n </div>\n <div className=\"flex-1 text-center\">\n <a\n href={mySite?.url ?? \"\"}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm opacity-60\"\n >\n {displayUrl}\n </a>\n </div>\n </div>\n </div>\n {/* iframe container */}\n <div className=\"h-[200px] overflow-hidden bg-[#ffffff] @md:h-[280px]\">\n <iframe\n className=\"pointer-events-none h-[700%] w-[700%] origin-top-left scale-[0.14] bg-[#ffffff]\"\n src={previewUrl}\n title=\"MySite Preview\"\n />\n </div>\n </div>\n )}\n\n {/* Analytics data */}\n {showAnalytics && (\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"border-muted bg-background rounded-lg border p-3\">\n <div className=\"text-xs opacity-60\">Visitors This Month</div>\n <div className={`text-xl font-bold text-${accentColor}`}>\n {mySite?.views ?? 0}\n </div>\n </div>\n <div className=\"border-muted bg-background rounded-lg border p-3\">\n <div className=\"text-xs opacity-60\">Total Leads</div>\n <div className={`text-xl font-bold text-${accentColor}`}>\n {mySite?.leads ?? 0}\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport const mySiteWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"MySiteWidget\",\n displayName: \"MySite Widget\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [\n // Styling Tab - Title Group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the widget\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"titleText\",\n label: \"Title\",\n type: \"text\",\n description: \"Title text displayed above the widget\",\n defaultValue: \"My Site\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling Tab - Design Group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Default text color for widget content\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getColorField({\n key: \"accentColor\",\n label: \"Accent Color\",\n description: \"Color used for analytics numbers\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the widget container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n\n // Styling Tab - Display Group\n {\n key: \"showPreview\",\n label: \"Show Preview\",\n type: \"boolean\",\n description: \"Show the MySite iframe preview\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n {\n key: \"showAnalytics\",\n label: \"Show Analytics\",\n type: \"boolean\",\n description: \"Show the analytics section\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Display\",\n },\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}