@fluid-app/rep-widgets 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 (228) hide show
  1. package/dist/AlertWidget-2JHMNYIY.js +5 -0
  2. package/dist/AlertWidget-2JHMNYIY.js.map +1 -0
  3. package/dist/AlertWidget-VHXWOKM4.cjs +18 -0
  4. package/dist/AlertWidget-VHXWOKM4.cjs.map +1 -0
  5. package/dist/CalendarWidget-AQ7PVNSI.cjs +18 -0
  6. package/dist/CalendarWidget-AQ7PVNSI.cjs.map +1 -0
  7. package/dist/CalendarWidget-E54LNKCG.js +5 -0
  8. package/dist/CalendarWidget-E54LNKCG.js.map +1 -0
  9. package/dist/CarouselWidget-IPPFSXDZ.js +8 -0
  10. package/dist/CarouselWidget-IPPFSXDZ.js.map +1 -0
  11. package/dist/CarouselWidget-ZG6LJJXG.cjs +21 -0
  12. package/dist/CarouselWidget-ZG6LJJXG.cjs.map +1 -0
  13. package/dist/CatchUpWidget-CSSQMPPA.cjs +18 -0
  14. package/dist/CatchUpWidget-CSSQMPPA.cjs.map +1 -0
  15. package/dist/CatchUpWidget-HYJRKFN3.js +5 -0
  16. package/dist/CatchUpWidget-HYJRKFN3.js.map +1 -0
  17. package/dist/ChartWidget-MBLGRSJQ.cjs +19 -0
  18. package/dist/ChartWidget-MBLGRSJQ.cjs.map +1 -0
  19. package/dist/ChartWidget-OL5DRMGA.js +6 -0
  20. package/dist/ChartWidget-OL5DRMGA.js.map +1 -0
  21. package/dist/ContainerWidget-DETCLP52.js +8 -0
  22. package/dist/ContainerWidget-DETCLP52.js.map +1 -0
  23. package/dist/ContainerWidget-XQDJSJXO.cjs +21 -0
  24. package/dist/ContainerWidget-XQDJSJXO.cjs.map +1 -0
  25. package/dist/EmbedWidget-HTR2MJ25.cjs +16 -0
  26. package/dist/EmbedWidget-HTR2MJ25.cjs.map +1 -0
  27. package/dist/EmbedWidget-O2XFGDJS.js +3 -0
  28. package/dist/EmbedWidget-O2XFGDJS.js.map +1 -0
  29. package/dist/ImageWidget-L2MIYWTE.cjs +17 -0
  30. package/dist/ImageWidget-L2MIYWTE.cjs.map +1 -0
  31. package/dist/ImageWidget-RF6XKPPV.js +4 -0
  32. package/dist/ImageWidget-RF6XKPPV.js.map +1 -0
  33. package/dist/LayoutWidget-4XISA6RO.cjs +20 -0
  34. package/dist/LayoutWidget-4XISA6RO.cjs.map +1 -0
  35. package/dist/LayoutWidget-WZSMZLLM.js +7 -0
  36. package/dist/LayoutWidget-WZSMZLLM.js.map +1 -0
  37. package/dist/ListWidget-XY5C3P3C.cjs +19 -0
  38. package/dist/ListWidget-XY5C3P3C.cjs.map +1 -0
  39. package/dist/ListWidget-ZFRV6DKI.js +6 -0
  40. package/dist/ListWidget-ZFRV6DKI.js.map +1 -0
  41. package/dist/MySiteWidget-75NJUIWV.js +5 -0
  42. package/dist/MySiteWidget-75NJUIWV.js.map +1 -0
  43. package/dist/MySiteWidget-CBDKQT35.cjs +18 -0
  44. package/dist/MySiteWidget-CBDKQT35.cjs.map +1 -0
  45. package/dist/NestedWidget-N4I7LOVX.js +6 -0
  46. package/dist/NestedWidget-N4I7LOVX.js.map +1 -0
  47. package/dist/NestedWidget-VO3YYOOH.cjs +19 -0
  48. package/dist/NestedWidget-VO3YYOOH.cjs.map +1 -0
  49. package/dist/QuickShareWidget-3VGSFY4J.js +4 -0
  50. package/dist/QuickShareWidget-3VGSFY4J.js.map +1 -0
  51. package/dist/QuickShareWidget-VHDB5SYT.cjs +17 -0
  52. package/dist/QuickShareWidget-VHDB5SYT.cjs.map +1 -0
  53. package/dist/RecentActivityWidget-3KAR64SB.js +5 -0
  54. package/dist/RecentActivityWidget-3KAR64SB.js.map +1 -0
  55. package/dist/RecentActivityWidget-X5UABJHL.cjs +18 -0
  56. package/dist/RecentActivityWidget-X5UABJHL.cjs.map +1 -0
  57. package/dist/SpacerWidget-K7CXVECO.cjs +16 -0
  58. package/dist/SpacerWidget-K7CXVECO.cjs.map +1 -0
  59. package/dist/SpacerWidget-ODKNZAND.js +3 -0
  60. package/dist/SpacerWidget-ODKNZAND.js.map +1 -0
  61. package/dist/TableWidget-MDEBHVIA.cjs +20 -0
  62. package/dist/TableWidget-MDEBHVIA.cjs.map +1 -0
  63. package/dist/TableWidget-W6LL5FLE.js +7 -0
  64. package/dist/TableWidget-W6LL5FLE.js.map +1 -0
  65. package/dist/TextWidget-D72TL53O.js +4 -0
  66. package/dist/TextWidget-D72TL53O.js.map +1 -0
  67. package/dist/TextWidget-DYINWJGB.cjs +17 -0
  68. package/dist/TextWidget-DYINWJGB.cjs.map +1 -0
  69. package/dist/ToDoWidget-DH544SJH.cjs +18 -0
  70. package/dist/ToDoWidget-DH544SJH.cjs.map +1 -0
  71. package/dist/ToDoWidget-LCAYWRVH.js +5 -0
  72. package/dist/ToDoWidget-LCAYWRVH.js.map +1 -0
  73. package/dist/VideoWidget-VHAZTNLI.js +4 -0
  74. package/dist/VideoWidget-VHAZTNLI.js.map +1 -0
  75. package/dist/VideoWidget-YLRKZ27S.cjs +17 -0
  76. package/dist/VideoWidget-YLRKZ27S.cjs.map +1 -0
  77. package/dist/chunk-2KQFMF6L.js +413 -0
  78. package/dist/chunk-2KQFMF6L.js.map +1 -0
  79. package/dist/chunk-3CUVGQQI.cjs +15 -0
  80. package/dist/chunk-3CUVGQQI.cjs.map +1 -0
  81. package/dist/chunk-3RV7AYQZ.js +149 -0
  82. package/dist/chunk-3RV7AYQZ.js.map +1 -0
  83. package/dist/chunk-4M2A5W2D.cjs +42 -0
  84. package/dist/chunk-4M2A5W2D.cjs.map +1 -0
  85. package/dist/chunk-4XJCU4HY.js +248 -0
  86. package/dist/chunk-4XJCU4HY.js.map +1 -0
  87. package/dist/chunk-5HHN5MRZ.js +11 -0
  88. package/dist/chunk-5HHN5MRZ.js.map +1 -0
  89. package/dist/chunk-6GF46P3S.js +33 -0
  90. package/dist/chunk-6GF46P3S.js.map +1 -0
  91. package/dist/chunk-7JIRJTGY.js +32 -0
  92. package/dist/chunk-7JIRJTGY.js.map +1 -0
  93. package/dist/chunk-7XWMJDFE.js +443 -0
  94. package/dist/chunk-7XWMJDFE.js.map +1 -0
  95. package/dist/chunk-C7A3OMIF.cjs +446 -0
  96. package/dist/chunk-C7A3OMIF.cjs.map +1 -0
  97. package/dist/chunk-CEZOXMO6.js +377 -0
  98. package/dist/chunk-CEZOXMO6.js.map +1 -0
  99. package/dist/chunk-CM7D7WGL.cjs +36 -0
  100. package/dist/chunk-CM7D7WGL.cjs.map +1 -0
  101. package/dist/chunk-D4ULCQ42.cjs +353 -0
  102. package/dist/chunk-D4ULCQ42.cjs.map +1 -0
  103. package/dist/chunk-DKGP3DTX.cjs +389 -0
  104. package/dist/chunk-DKGP3DTX.cjs.map +1 -0
  105. package/dist/chunk-DM2JDG3D.js +318 -0
  106. package/dist/chunk-DM2JDG3D.js.map +1 -0
  107. package/dist/chunk-DW6V4ZCT.cjs +140 -0
  108. package/dist/chunk-DW6V4ZCT.cjs.map +1 -0
  109. package/dist/chunk-E4MY6TUE.cjs +255 -0
  110. package/dist/chunk-E4MY6TUE.cjs.map +1 -0
  111. package/dist/chunk-EHSWARYY.js +39 -0
  112. package/dist/chunk-EHSWARYY.js.map +1 -0
  113. package/dist/chunk-EUOP3MWJ.cjs +118 -0
  114. package/dist/chunk-EUOP3MWJ.cjs.map +1 -0
  115. package/dist/chunk-F3SFIX7U.cjs +58 -0
  116. package/dist/chunk-F3SFIX7U.cjs.map +1 -0
  117. package/dist/chunk-F63VY23B.js +174 -0
  118. package/dist/chunk-F63VY23B.js.map +1 -0
  119. package/dist/chunk-FSLUSFJ2.cjs +75 -0
  120. package/dist/chunk-FSLUSFJ2.cjs.map +1 -0
  121. package/dist/chunk-GA52TZC4.js +133 -0
  122. package/dist/chunk-GA52TZC4.js.map +1 -0
  123. package/dist/chunk-GRFCSQ2M.js +13 -0
  124. package/dist/chunk-GRFCSQ2M.js.map +1 -0
  125. package/dist/chunk-HBRGW3CJ.js +383 -0
  126. package/dist/chunk-HBRGW3CJ.js.map +1 -0
  127. package/dist/chunk-HDA2ZOV2.cjs +13 -0
  128. package/dist/chunk-HDA2ZOV2.cjs.map +1 -0
  129. package/dist/chunk-HQVTEFSO.js +386 -0
  130. package/dist/chunk-HQVTEFSO.js.map +1 -0
  131. package/dist/chunk-IU657MP5.js +270 -0
  132. package/dist/chunk-IU657MP5.js.map +1 -0
  133. package/dist/chunk-IY3BNQ5Y.js +24 -0
  134. package/dist/chunk-IY3BNQ5Y.js.map +1 -0
  135. package/dist/chunk-J2FIIZSN.js +137 -0
  136. package/dist/chunk-J2FIIZSN.js.map +1 -0
  137. package/dist/chunk-JRBJXVXL.cjs +251 -0
  138. package/dist/chunk-JRBJXVXL.cjs.map +1 -0
  139. package/dist/chunk-JYWKXNUO.cjs +37 -0
  140. package/dist/chunk-JYWKXNUO.cjs.map +1 -0
  141. package/dist/chunk-KE27RJ3X.cjs +954 -0
  142. package/dist/chunk-KE27RJ3X.cjs.map +1 -0
  143. package/dist/chunk-M4J3OZJF.cjs +152 -0
  144. package/dist/chunk-M4J3OZJF.cjs.map +1 -0
  145. package/dist/chunk-MKUJOEAC.cjs +178 -0
  146. package/dist/chunk-MKUJOEAC.cjs.map +1 -0
  147. package/dist/chunk-MNRHGJDQ.cjs +225 -0
  148. package/dist/chunk-MNRHGJDQ.cjs.map +1 -0
  149. package/dist/chunk-MNWWZGL2.js +14 -0
  150. package/dist/chunk-MNWWZGL2.js.map +1 -0
  151. package/dist/chunk-MWED53XR.js +115 -0
  152. package/dist/chunk-MWED53XR.js.map +1 -0
  153. package/dist/chunk-NCQQI2T2.cjs +386 -0
  154. package/dist/chunk-NCQQI2T2.cjs.map +1 -0
  155. package/dist/chunk-NGYR4RQF.js +476 -0
  156. package/dist/chunk-NGYR4RQF.js.map +1 -0
  157. package/dist/chunk-NNJDJNSY.cjs +197 -0
  158. package/dist/chunk-NNJDJNSY.cjs.map +1 -0
  159. package/dist/chunk-NOZVVD6G.cjs +26 -0
  160. package/dist/chunk-NOZVVD6G.cjs.map +1 -0
  161. package/dist/chunk-NUG3DWF7.js +55 -0
  162. package/dist/chunk-NUG3DWF7.js.map +1 -0
  163. package/dist/chunk-NXAZEYLC.cjs +136 -0
  164. package/dist/chunk-NXAZEYLC.cjs.map +1 -0
  165. package/dist/chunk-PNVBMN27.cjs +380 -0
  166. package/dist/chunk-PNVBMN27.cjs.map +1 -0
  167. package/dist/chunk-RKDOQV4T.js +73 -0
  168. package/dist/chunk-RKDOQV4T.js.map +1 -0
  169. package/dist/chunk-RMZFC7HF.cjs +17 -0
  170. package/dist/chunk-RMZFC7HF.cjs.map +1 -0
  171. package/dist/chunk-SBHL3GFW.js +40 -0
  172. package/dist/chunk-SBHL3GFW.js.map +1 -0
  173. package/dist/chunk-TFJQ4525.cjs +416 -0
  174. package/dist/chunk-TFJQ4525.cjs.map +1 -0
  175. package/dist/chunk-VBJ5FT4C.cjs +273 -0
  176. package/dist/chunk-VBJ5FT4C.cjs.map +1 -0
  177. package/dist/chunk-VZFL5BZM.js +222 -0
  178. package/dist/chunk-VZFL5BZM.js.map +1 -0
  179. package/dist/chunk-W7VPL5I4.js +252 -0
  180. package/dist/chunk-W7VPL5I4.js.map +1 -0
  181. package/dist/chunk-XALQ3ANE.cjs +34 -0
  182. package/dist/chunk-XALQ3ANE.cjs.map +1 -0
  183. package/dist/chunk-YCYKV5KF.cjs +43 -0
  184. package/dist/chunk-YCYKV5KF.cjs.map +1 -0
  185. package/dist/chunk-YJZGIS4L.cjs +479 -0
  186. package/dist/chunk-YJZGIS4L.cjs.map +1 -0
  187. package/dist/chunk-YU5DAILW.cjs +14 -0
  188. package/dist/chunk-YU5DAILW.cjs.map +1 -0
  189. package/dist/chunk-YY5WLV63.js +951 -0
  190. package/dist/chunk-YY5WLV63.js.map +1 -0
  191. package/dist/chunk-ZS7C474P.js +3 -0
  192. package/dist/chunk-ZS7C474P.js.map +1 -0
  193. package/dist/chunk-ZSUGXJWD.js +194 -0
  194. package/dist/chunk-ZSUGXJWD.js.map +1 -0
  195. package/dist/chunk-ZWFK5UUU.js +11 -0
  196. package/dist/chunk-ZWFK5UUU.js.map +1 -0
  197. package/dist/components/index.cjs +17 -0
  198. package/dist/components/index.cjs.map +1 -0
  199. package/dist/components/index.d.cts +8 -0
  200. package/dist/components/index.d.ts +8 -0
  201. package/dist/components/index.js +4 -0
  202. package/dist/components/index.js.map +1 -0
  203. package/dist/contexts/index.cjs +29 -0
  204. package/dist/contexts/index.cjs.map +1 -0
  205. package/dist/contexts/index.d.cts +73 -0
  206. package/dist/contexts/index.d.ts +73 -0
  207. package/dist/contexts/index.js +4 -0
  208. package/dist/contexts/index.js.map +1 -0
  209. package/dist/core/index.cjs +55 -0
  210. package/dist/core/index.cjs.map +1 -0
  211. package/dist/core/index.d.cts +64 -0
  212. package/dist/core/index.d.ts +64 -0
  213. package/dist/core/index.js +6 -0
  214. package/dist/core/index.js.map +1 -0
  215. package/dist/ui/index.cjs +80 -0
  216. package/dist/ui/index.cjs.map +1 -0
  217. package/dist/ui/index.d.cts +69 -0
  218. package/dist/ui/index.d.ts +69 -0
  219. package/dist/ui/index.js +7 -0
  220. package/dist/ui/index.js.map +1 -0
  221. package/dist/widgets/index.cjs +217 -0
  222. package/dist/widgets/index.cjs.map +1 -0
  223. package/dist/widgets/index.d.cts +397 -0
  224. package/dist/widgets/index.d.ts +397 -0
  225. package/dist/widgets/index.js +59 -0
  226. package/dist/widgets/index.js.map +1 -0
  227. package/package.json +99 -0
  228. package/styles/globals.css +20 -0
@@ -0,0 +1,174 @@
1
+ import { Video, Image } from 'lucide-react';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+
4
+ // src/components/MediaRenderer.tsx
5
+ function MediaRenderer({
6
+ src,
7
+ alt = "Media",
8
+ objectFit = "cover",
9
+ focusPoint,
10
+ mediaType = "image",
11
+ poster,
12
+ autoplay = false,
13
+ loop = false,
14
+ muted = false,
15
+ controls = true
16
+ }) {
17
+ const hasValidSrc = src && src.trim() !== "";
18
+ const objectPosition = focusPoint?.replace("-", " ");
19
+ if (!hasValidSrc) {
20
+ const Icon = mediaType === "video" ? Video : Image;
21
+ const label = mediaType === "video" ? "No video selected" : "No image selected";
22
+ return /* @__PURE__ */ jsx("div", { className: "flex h-full min-h-[200px] w-full items-center justify-center bg-muted", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 text-muted-foreground", children: [
23
+ /* @__PURE__ */ jsx(Icon, { className: "h-12 w-12" }),
24
+ /* @__PURE__ */ jsx("p", { className: "text-sm", children: label })
25
+ ] }) });
26
+ }
27
+ const isContainMode = objectFit === "contain";
28
+ const blurSrc = isContainMode ? `${src}?tr=bl-50` : void 0;
29
+ if (mediaType === "video") {
30
+ const blurredBgSrc = isContainMode ? poster ? `${poster}?tr=bl-50` : blurSrc : void 0;
31
+ if (isContainMode && blurredBgSrc) {
32
+ return /* @__PURE__ */ jsxs("div", { className: "relative h-full w-full overflow-hidden", children: [
33
+ /* @__PURE__ */ jsx(
34
+ "img",
35
+ {
36
+ src: blurredBgSrc,
37
+ alt: "",
38
+ className: "absolute inset-0 h-full w-full object-cover",
39
+ "aria-hidden": "true"
40
+ }
41
+ ),
42
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": "true" }),
43
+ /* @__PURE__ */ jsx(
44
+ "video",
45
+ {
46
+ src,
47
+ poster,
48
+ controls,
49
+ autoPlay: autoplay,
50
+ loop,
51
+ muted,
52
+ className: `relative z-10 h-full w-full object-contain ${!controls ? "pointer-events-none" : ""}`,
53
+ children: "Your browser does not support the video tag."
54
+ }
55
+ )
56
+ ] });
57
+ }
58
+ return /* @__PURE__ */ jsx(
59
+ "video",
60
+ {
61
+ src,
62
+ poster,
63
+ controls,
64
+ autoPlay: autoplay,
65
+ loop,
66
+ muted,
67
+ className: `h-full w-full object-${objectFit} ${!controls ? "pointer-events-none" : ""}`,
68
+ style: objectPosition ? { objectPosition } : void 0,
69
+ children: "Your browser does not support the video tag."
70
+ }
71
+ );
72
+ }
73
+ if (isContainMode) {
74
+ return /* @__PURE__ */ jsxs("div", { className: "relative h-full w-full overflow-hidden", children: [
75
+ /* @__PURE__ */ jsx(
76
+ "img",
77
+ {
78
+ src: blurSrc,
79
+ alt: "",
80
+ className: "absolute inset-0 h-full w-full object-cover",
81
+ "aria-hidden": "true"
82
+ }
83
+ ),
84
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/30", "aria-hidden": "true" }),
85
+ /* @__PURE__ */ jsx(
86
+ "img",
87
+ {
88
+ src,
89
+ alt,
90
+ className: "relative z-10 h-full w-full object-contain"
91
+ }
92
+ )
93
+ ] });
94
+ }
95
+ return /* @__PURE__ */ jsx(
96
+ "img",
97
+ {
98
+ src,
99
+ alt,
100
+ className: `h-full w-full object-${objectFit}`,
101
+ style: objectPosition ? { objectPosition } : void 0
102
+ }
103
+ );
104
+ }
105
+ function getMediaPropsFromShareable(item) {
106
+ const isVideo = item.kind === "video" || !!item.videoUrl;
107
+ if (isVideo && item.videoUrl) {
108
+ const result2 = {
109
+ mediaType: "video",
110
+ src: item.videoUrl,
111
+ alt: item.title ?? "Video"
112
+ };
113
+ if (item.imageUrl != null) result2.poster = item.imageUrl;
114
+ return result2;
115
+ }
116
+ const result = {
117
+ mediaType: "image",
118
+ alt: item.title || "Image",
119
+ objectFit: "cover"
120
+ };
121
+ if (item.imageUrl != null) result.src = item.imageUrl;
122
+ return result;
123
+ }
124
+ function getMediaPropsFromWidgetSchema(schema) {
125
+ const props = schema.props;
126
+ const resource = props.resource;
127
+ const useCustomUrl = props.useCustomUrl;
128
+ const focusPoint = props.focusPoint;
129
+ const displayFit = props.displayFit;
130
+ if (schema.type === "VideoWidget") {
131
+ const result2 = {
132
+ mediaType: "video",
133
+ autoplay: props.autoplay ?? false,
134
+ loop: props.loop ?? false,
135
+ muted: props.muted ?? false,
136
+ controls: props.controls ?? true,
137
+ objectFit: displayFit ?? "cover",
138
+ focusPoint
139
+ };
140
+ if (useCustomUrl) {
141
+ if (typeof props.src === "string") result2.src = props.src;
142
+ if (typeof props.poster === "string") result2.poster = props.poster;
143
+ } else if (resource) {
144
+ if (resource.videoUrl) result2.src = resource.videoUrl;
145
+ else if (typeof props.src === "string") result2.src = props.src;
146
+ if (resource.imageUrl) result2.poster = resource.imageUrl;
147
+ else if (typeof props.poster === "string") result2.poster = props.poster;
148
+ } else {
149
+ if (typeof props.src === "string") result2.src = props.src;
150
+ if (typeof props.poster === "string") result2.poster = props.poster;
151
+ }
152
+ return result2;
153
+ }
154
+ const result = {
155
+ mediaType: "image",
156
+ alt: props.alt ?? "Image",
157
+ objectFit: displayFit ?? "cover",
158
+ focusPoint
159
+ };
160
+ if (useCustomUrl) {
161
+ if (typeof props.src === "string") result.src = props.src;
162
+ } else if (resource) {
163
+ if (resource.imageUrl) result.src = resource.imageUrl;
164
+ else if (typeof props.src === "string") result.src = props.src;
165
+ if (resource.title) result.alt = resource.title;
166
+ } else {
167
+ if (typeof props.src === "string") result.src = props.src;
168
+ }
169
+ return result;
170
+ }
171
+
172
+ export { MediaRenderer, getMediaPropsFromShareable, getMediaPropsFromWidgetSchema };
173
+ //# sourceMappingURL=chunk-F63VY23B.js.map
174
+ //# sourceMappingURL=chunk-F63VY23B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/MediaRenderer.tsx"],"names":["VideoIcon","ImageIcon","result"],"mappings":"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","file":"chunk-F63VY23B.js","sourcesContent":["import { Image as ImageIcon } from \"lucide-react\";\nimport { Video as VideoIcon } from \"lucide-react\";\nimport type { ShareableItem, WidgetSchema } from \"@fluid-app/rep-core/types\";\n\nexport type MediaRendererProps = {\n src?: string | undefined;\n alt?: string | undefined;\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | undefined;\n focusPoint?: string | undefined;\n mediaType?: \"image\" | \"video\" | undefined;\n poster?: string | undefined;\n autoplay?: boolean | undefined;\n loop?: boolean | undefined;\n muted?: boolean | undefined;\n controls?: boolean | undefined;\n};\n\nexport function MediaRenderer({\n src,\n alt = \"Media\",\n objectFit = \"cover\",\n focusPoint,\n mediaType = \"image\",\n poster,\n autoplay = false,\n loop = false,\n muted = false,\n controls = true,\n}: MediaRendererProps) {\n const hasValidSrc = src && src.trim() !== \"\";\n const objectPosition = focusPoint?.replace(\"-\", \" \");\n\n if (!hasValidSrc) {\n const Icon = mediaType === \"video\" ? VideoIcon : ImageIcon;\n const label =\n mediaType === \"video\" ? \"No video selected\" : \"No image selected\";\n return (\n <div className=\"flex h-full min-h-[200px] w-full items-center justify-center bg-muted\">\n <div className=\"flex flex-col items-center gap-2 text-muted-foreground\">\n <Icon className=\"h-12 w-12\" />\n <p className=\"text-sm\">{label}</p>\n </div>\n </div>\n );\n }\n\n const isContainMode = objectFit === \"contain\";\n const blurSrc = isContainMode ? `${src}?tr=bl-50` : undefined;\n\n if (mediaType === \"video\") {\n const blurredBgSrc = isContainMode\n ? poster\n ? `${poster}?tr=bl-50`\n : blurSrc\n : undefined;\n\n if (isContainMode && blurredBgSrc) {\n return (\n <div className=\"relative h-full w-full overflow-hidden\">\n <img\n src={blurredBgSrc}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n aria-hidden=\"true\"\n />\n <div className=\"absolute inset-0 bg-black/30\" aria-hidden=\"true\" />\n <video\n src={src}\n poster={poster}\n controls={controls}\n autoPlay={autoplay}\n loop={loop}\n muted={muted}\n className={`relative z-10 h-full w-full object-contain ${!controls ? \"pointer-events-none\" : \"\"}`}\n >\n Your browser does not support the video tag.\n </video>\n </div>\n );\n }\n\n return (\n <video\n src={src}\n poster={poster}\n controls={controls}\n autoPlay={autoplay}\n loop={loop}\n muted={muted}\n className={`h-full w-full object-${objectFit} ${!controls ? \"pointer-events-none\" : \"\"}`}\n style={objectPosition ? { objectPosition } : undefined}\n >\n Your browser does not support the video tag.\n </video>\n );\n }\n\n if (isContainMode) {\n return (\n <div className=\"relative h-full w-full overflow-hidden\">\n <img\n src={blurSrc}\n alt=\"\"\n className=\"absolute inset-0 h-full w-full object-cover\"\n aria-hidden=\"true\"\n />\n <div className=\"absolute inset-0 bg-black/30\" aria-hidden=\"true\" />\n <img\n src={src}\n alt={alt}\n className=\"relative z-10 h-full w-full object-contain\"\n />\n </div>\n );\n }\n\n return (\n <img\n src={src}\n alt={alt}\n className={`h-full w-full object-${objectFit}`}\n style={objectPosition ? { objectPosition } : undefined}\n />\n );\n}\n\n/**\n * Converts a ShareableItem to MediaRenderer props.\n * Replaces the createWidgetFromShareable → ScreenRenderer pattern.\n */\nexport function getMediaPropsFromShareable(\n item: ShareableItem,\n): MediaRendererProps {\n const isVideo = item.kind === \"video\" || !!item.videoUrl;\n\n if (isVideo && item.videoUrl) {\n const result: MediaRendererProps = {\n mediaType: \"video\",\n src: item.videoUrl,\n alt: item.title ?? \"Video\",\n };\n if (item.imageUrl != null) result.poster = item.imageUrl;\n return result;\n }\n\n const result: MediaRendererProps = {\n mediaType: \"image\",\n alt: item.title || \"Image\",\n objectFit: \"cover\",\n };\n if (item.imageUrl != null) result.src = item.imageUrl;\n return result;\n}\n\n/**\n * Extracts media props from an ImageWidget/VideoWidget schema.\n * Used by CarouselWidget for slide.content rendering.\n */\nexport function getMediaPropsFromWidgetSchema(\n schema: WidgetSchema,\n): MediaRendererProps {\n const props = schema.props;\n\n const resource = props.resource as ShareableItem | undefined;\n const useCustomUrl = props.useCustomUrl as boolean | undefined;\n const focusPoint = props.focusPoint as string | undefined;\n const displayFit = props.displayFit as\n | MediaRendererProps[\"objectFit\"]\n | undefined;\n\n if (schema.type === \"VideoWidget\") {\n const result: MediaRendererProps = {\n mediaType: \"video\",\n autoplay: (props.autoplay as boolean | undefined) ?? false,\n loop: (props.loop as boolean | undefined) ?? false,\n muted: (props.muted as boolean | undefined) ?? false,\n controls: (props.controls as boolean | undefined) ?? true,\n objectFit: displayFit ?? \"cover\",\n focusPoint,\n };\n if (useCustomUrl) {\n if (typeof props.src === \"string\") result.src = props.src;\n if (typeof props.poster === \"string\") result.poster = props.poster;\n } else if (resource) {\n if (resource.videoUrl) result.src = resource.videoUrl;\n else if (typeof props.src === \"string\") result.src = props.src;\n if (resource.imageUrl) result.poster = resource.imageUrl;\n else if (typeof props.poster === \"string\") result.poster = props.poster;\n } else {\n if (typeof props.src === \"string\") result.src = props.src;\n if (typeof props.poster === \"string\") result.poster = props.poster;\n }\n return result;\n }\n\n const result: MediaRendererProps = {\n mediaType: \"image\",\n alt: (props.alt as string | undefined) ?? \"Image\",\n objectFit: displayFit ?? \"cover\",\n focusPoint,\n };\n if (useCustomUrl) {\n if (typeof props.src === \"string\") result.src = props.src;\n } else if (resource) {\n if (resource.imageUrl) result.src = resource.imageUrl;\n else if (typeof props.src === \"string\") result.src = props.src;\n if (resource.title) result.alt = resource.title;\n } else {\n if (typeof props.src === \"string\") result.src = props.src;\n }\n return result;\n}\n"]}
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var chunkJYWKXNUO_cjs = require('./chunk-JYWKXNUO.cjs');
4
+ var react = require('react');
5
+ var types = require('@fluid-app/rep-core/types');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function ScreenRendererContent({
9
+ screen,
10
+ containerWidgetTypes,
11
+ className
12
+ }) {
13
+ const registry = chunkJYWKXNUO_cjs.useRegistry();
14
+ const isContainerWidget = react.useCallback(
15
+ (widgetType) => containerWidgetTypes.includes(widgetType),
16
+ [containerWidgetTypes]
17
+ );
18
+ const renderWidget = react.useCallback(
19
+ (widget, index, currentPath) => {
20
+ const Component = registry[widget.type];
21
+ if (!Component) {
22
+ console.warn(
23
+ `Widget type "${String(widget.type)}" not found in registry`
24
+ );
25
+ return null;
26
+ }
27
+ const widgetPath = [...currentPath, index];
28
+ const additionalProps = isContainerWidget(widget.type) ? {
29
+ widgetId: widget.id,
30
+ widgetPath
31
+ } : {};
32
+ const props = {
33
+ ...widget.props,
34
+ ...additionalProps
35
+ };
36
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
+ "div",
38
+ {
39
+ className: "h-full w-full overflow-x-hidden",
40
+ children: /* @__PURE__ */ jsxRuntime.jsx(Component, { ...props })
41
+ },
42
+ widget.id || index
43
+ );
44
+ },
45
+ [registry, isContainerWidget]
46
+ );
47
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: className || "h-full w-full", children: screen?.map((item, index) => {
48
+ if (!item) return null;
49
+ return renderWidget(item, index, []);
50
+ }) });
51
+ }
52
+ function ScreenRenderer(props) {
53
+ const {
54
+ screen,
55
+ registry,
56
+ containerWidgetTypes = [
57
+ types.WIDGET_TYPE_NAMES.Layout,
58
+ types.WIDGET_TYPE_NAMES.Container
59
+ ],
60
+ className
61
+ } = props;
62
+ const registryProviderProps = registry !== void 0 ? { registry } : {};
63
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkJYWKXNUO_cjs.RegistryProvider, { ...registryProviderProps, children: /* @__PURE__ */ jsxRuntime.jsx(
64
+ ScreenRendererContent,
65
+ {
66
+ screen,
67
+ containerWidgetTypes,
68
+ className
69
+ }
70
+ ) });
71
+ }
72
+
73
+ exports.ScreenRenderer = ScreenRenderer;
74
+ //# sourceMappingURL=chunk-FSLUSFJ2.cjs.map
75
+ //# sourceMappingURL=chunk-FSLUSFJ2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/ScreenRenderer.tsx"],"names":["useRegistry","useCallback","jsx","WIDGET_TYPE_NAMES","RegistryProvider"],"mappings":";;;;;;;AAkCA,SAAS,qBAAA,CAAsB;AAAA,EAC7B,MAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM,WAAWA,6BAAA,EAAY;AAG7B,EAAA,MAAM,iBAAA,GAAoBC,iBAAA;AAAA,IACxB,CAAC,UAAA,KAAuB,oBAAA,CAAqB,QAAA,CAAS,UAAU,CAAA;AAAA,IAChE,CAAC,oBAAoB;AAAA,GACvB;AAGA,EAAA,MAAM,YAAA,GAAeA,iBAAA;AAAA,IACnB,CAAC,MAAA,EAAsB,KAAA,EAAe,WAAA,KAA4B;AAChE,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AACtC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA,uBAAA;AAAA,SACrC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAG,WAAA,EAAa,KAAK,CAAA;AAGzC,MAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA,GACjD;AAAA,QACE,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB;AAAA,UAEF,EAAC;AAEL,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,GAAG,MAAA,CAAO,KAAA;AAAA,QACV,GAAG;AAAA,OACL;AAEA,MAAA,uBACEC,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,iCAAA;AAAA,UAEV,QAAA,kBAAAA,cAAA,CAAC,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO;AAAA,SAAA;AAAA,QAHjB,OAAO,EAAA,IAAM;AAAA,OAIpB;AAAA,IAEJ,CAAA;AAAA,IACA,CAAC,UAAU,iBAAiB;AAAA,GAC9B;AAEA,EAAA,uBACEA,cAAA,CAAC,SAAI,SAAA,EAAW,SAAA,IAAa,iBAC1B,QAAA,EAAA,MAAA,EAAQ,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAE5B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,KAAA,EAAO,EAAE,CAAA;AAAA,EACrC,CAAC,CAAA,EACH,CAAA;AAEJ;AAwBO,SAAS,eAGd,KAAA,EAA+B;AAC/B,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,QAAA;AAAA,IACA,oBAAA,GAAuB;AAAA,MACrBC,uBAAA,CAAkB,MAAA;AAAA,MAClBA,uBAAA,CAAkB;AAAA,KACpB;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAIJ,EAAA,MAAM,wBAAwB,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,KAAa,EAAC;AAEvE,EAAA,uBACED,cAAA,CAACE,kCAAA,EAAA,EAAkB,GAAG,qBAAA,EAKpB,QAAA,kBAAAF,cAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ","file":"chunk-FSLUSFJ2.cjs","sourcesContent":["import type { ComponentType } from \"react\";\nimport { useCallback } from \"react\";\nimport type {\n WidgetSchema,\n TypedWidgetSchema,\n WidgetPath,\n} from \"@fluid-app/rep-core/types\";\nimport { WIDGET_TYPE_NAMES } from \"@fluid-app/rep-core/types\";\nimport { RegistryProvider, useRegistry } from \"../contexts/RegistryContext\";\n\nexport interface ScreenRendererProps<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, ComponentType<any>>,\n> {\n /** Array of widget schemas to render */\n screen: TypedWidgetSchema<T>[] | WidgetSchema[];\n /** Widget registry mapping type names to components */\n registry?: T;\n /** Container widgets (like LayoutWidget) receive these additional props */\n containerWidgetTypes?: string[];\n /** Additional CSS classes for the wrapper div */\n className?: string;\n}\n\ninterface ScreenRendererContentProps {\n screen: WidgetSchema[];\n containerWidgetTypes: string[];\n className?: string | undefined;\n}\n\n/**\n * Internal component that uses the registry from context.\n * This allows us to avoid prop drilling the registry.\n */\nfunction ScreenRendererContent({\n screen,\n containerWidgetTypes,\n className,\n}: ScreenRendererContentProps) {\n const registry = useRegistry();\n\n // Check if a widget type is a container\n const isContainerWidget = useCallback(\n (widgetType: string) => containerWidgetTypes.includes(widgetType),\n [containerWidgetTypes],\n );\n\n // Render widgets recursively with path tracking\n const renderWidget = useCallback(\n (widget: WidgetSchema, index: number, currentPath: WidgetPath) => {\n const Component = registry[widget.type];\n if (!Component) {\n console.warn(\n `Widget type \"${String(widget.type)}\" not found in registry`,\n );\n return null;\n }\n\n const widgetPath = [...currentPath, index];\n\n // Build additional props for container widgets\n const additionalProps = isContainerWidget(widget.type)\n ? {\n widgetId: widget.id,\n widgetPath,\n }\n : {};\n\n const props = {\n ...widget.props,\n ...additionalProps,\n };\n\n return (\n <div\n key={widget.id || index}\n className=\"h-full w-full overflow-x-hidden\"\n >\n <Component {...props} />\n </div>\n );\n },\n [registry, isContainerWidget],\n );\n\n return (\n <div className={className || \"h-full w-full\"}>\n {screen?.map((item, index) => {\n // Skip null items (empty grid cells)\n if (!item) return null;\n return renderWidget(item, index, []);\n })}\n </div>\n );\n}\n\n/**\n * ScreenRenderer - View-only component for rendering widget screens.\n *\n * This is a simplified version designed for the SDK that only handles\n * rendering widgets without edit mode or drag-and-drop functionality.\n *\n * Features:\n * - Static rendering of widgets\n * - Registry context: No prop drilling for widget registry\n * - Container widget support with path tracking\n *\n * Usage:\n * ```tsx\n * import { ScreenRenderer } from '@fluid-app/rep-widgets/core';\n * import { WIDGET_REGISTRY } from '@fluid-app/rep-widgets/widgets';\n *\n * <ScreenRenderer\n * screen={widgets}\n * registry={WIDGET_REGISTRY}\n * />\n * ```\n */\nexport function ScreenRenderer<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, ComponentType<any>>,\n>(props: ScreenRendererProps<T>) {\n const {\n screen,\n registry,\n containerWidgetTypes = [\n WIDGET_TYPE_NAMES.Layout,\n WIDGET_TYPE_NAMES.Container,\n ],\n className,\n } = props;\n\n // Conditionally pass registry prop to satisfy exactOptionalPropertyTypes\n // When registry is undefined, we omit it entirely and let RegistryProvider inherit from parent\n const registryProviderProps = registry !== undefined ? { registry } : {};\n\n return (\n <RegistryProvider {...registryProviderProps}>\n {/* Type assertion required: TypedWidgetSchema<T>[] is a subtype of WidgetSchema[]\n when T's components accept props compatible with WidgetSchema props.\n This enables type-safe widget rendering with custom registries while allowing\n the internal renderer to work with the base WidgetSchema type. */}\n <ScreenRendererContent\n screen={screen as WidgetSchema[]}\n containerWidgetTypes={containerWidgetTypes}\n className={className}\n />\n </RegistryProvider>\n );\n}\n"]}
@@ -0,0 +1,133 @@
1
+ import { Globe } from 'lucide-react';
2
+ import { getBorderRadiusField } from '@fluid-app/rep-core/registries';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ // src/widgets/EmbedWidget.tsx
6
+ function EmbedWidget({
7
+ url = "",
8
+ title = "Embedded Content",
9
+ height,
10
+ fullScreen = false,
11
+ allowFullscreen = true,
12
+ loading = "lazy",
13
+ borderRadius = "md",
14
+ className,
15
+ ...props
16
+ }) {
17
+ const isFullScreen = fullScreen;
18
+ if (!url) {
19
+ return /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ className: `flex items-center justify-center rounded-${borderRadius} border-2 border-dashed border-border bg-muted text-muted-foreground ${isFullScreen ? "h-full" : ""} ${className}`,
23
+ style: isFullScreen ? void 0 : { height: `${height}px` },
24
+ ...props,
25
+ children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-2 p-6 text-center", children: [
26
+ /* @__PURE__ */ jsx(Globe, { className: "h-12 w-12 opacity-50" }),
27
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: "Enter a URL to embed external content" }),
28
+ /* @__PURE__ */ jsx("p", { className: "text-xs opacity-75", children: "Configure the URL in the properties panel" })
29
+ ] })
30
+ }
31
+ );
32
+ }
33
+ return /* @__PURE__ */ jsx(
34
+ "div",
35
+ {
36
+ className: `w-full ${isFullScreen ? "h-full" : ""} ${className}`,
37
+ ...props,
38
+ children: /* @__PURE__ */ jsx(
39
+ "iframe",
40
+ {
41
+ src: url,
42
+ title,
43
+ width: "100%",
44
+ height: isFullScreen ? "100%" : height,
45
+ loading,
46
+ allowFullScreen: allowFullscreen,
47
+ className: `rounded-${borderRadius} border border-border`,
48
+ sandbox: "allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox"
49
+ }
50
+ )
51
+ }
52
+ );
53
+ }
54
+ var embedWidgetPropertySchema = {
55
+ widgetType: "EmbedWidget",
56
+ displayName: "Embed",
57
+ fields: [
58
+ // Content
59
+ {
60
+ key: "url",
61
+ label: "URL",
62
+ type: "text",
63
+ description: "The URL of the external site to embed",
64
+ placeholder: "https://example.com",
65
+ defaultValue: "",
66
+ group: "Content"
67
+ },
68
+ {
69
+ key: "title",
70
+ label: "Title",
71
+ type: "text",
72
+ description: "Accessibility title for the embedded content",
73
+ defaultValue: "Embedded Content",
74
+ group: "Content"
75
+ },
76
+ // Design
77
+ getBorderRadiusField({
78
+ key: "borderRadius",
79
+ label: "Border Radius",
80
+ description: "Border radius for the embed container",
81
+ defaultValue: "md",
82
+ group: "Design"
83
+ }),
84
+ {
85
+ key: "fullScreen",
86
+ label: "Full Screen",
87
+ type: "boolean",
88
+ description: "When enabled, the embed fills the available space",
89
+ defaultValue: false,
90
+ group: "Design"
91
+ },
92
+ {
93
+ key: "height",
94
+ label: "Height (px)",
95
+ type: "number",
96
+ description: "Height of the embedded iframe in pixels",
97
+ min: 100,
98
+ max: 1200,
99
+ step: 50,
100
+ defaultValue: 400,
101
+ group: "Design",
102
+ requiresKeyValue: {
103
+ key: "fullScreen",
104
+ value: false
105
+ }
106
+ },
107
+ // Settings
108
+ {
109
+ key: "allowFullscreen",
110
+ label: "Allow Fullscreen",
111
+ type: "boolean",
112
+ description: "Allow the embedded content to use fullscreen mode",
113
+ defaultValue: true,
114
+ group: "Settings"
115
+ },
116
+ {
117
+ key: "loading",
118
+ label: "Loading",
119
+ type: "select",
120
+ description: "When to load the embedded content",
121
+ options: [
122
+ { label: "Lazy (on scroll)", value: "lazy" },
123
+ { label: "Eager (immediately)", value: "eager" }
124
+ ],
125
+ defaultValue: "lazy",
126
+ group: "Settings"
127
+ }
128
+ ]
129
+ };
130
+
131
+ export { EmbedWidget, embedWidgetPropertySchema };
132
+ //# sourceMappingURL=chunk-GA52TZC4.js.map
133
+ //# sourceMappingURL=chunk-GA52TZC4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/widgets/EmbedWidget.tsx"],"names":[],"mappings":"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","file":"chunk-GA52TZC4.js","sourcesContent":["import { Globe } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport {\n getBorderRadiusField,\n type WidgetPropertySchema,\n} from \"@fluid-app/rep-core/registries\";\nimport type { BorderRadiusOptions } from \"@fluid-app/rep-core/types\";\n\ntype EmbedWidgetProps = ComponentProps<\"div\"> & {\n url?: string;\n title?: string;\n height?: number;\n fullScreen?: boolean;\n allowFullscreen?: boolean;\n loading?: \"eager\" | \"lazy\";\n borderRadius?: BorderRadiusOptions;\n};\n\nexport function EmbedWidget({\n url = \"\",\n title = \"Embedded Content\",\n height,\n fullScreen = false,\n allowFullscreen = true,\n loading = \"lazy\",\n borderRadius = \"md\",\n className,\n ...props\n}: EmbedWidgetProps) {\n const isFullScreen = fullScreen;\n\n // Show placeholder if no URL is provided\n if (!url) {\n return (\n <div\n className={`flex items-center justify-center rounded-${borderRadius} border-2 border-dashed border-border bg-muted text-muted-foreground ${isFullScreen ? \"h-full\" : \"\"} ${className}`}\n style={isFullScreen ? undefined : { height: `${height}px` }}\n {...props}\n >\n <div className=\"flex flex-col items-center gap-2 p-6 text-center\">\n <Globe className=\"h-12 w-12 opacity-50\" />\n <p className=\"text-sm font-medium\">\n Enter a URL to embed external content\n </p>\n <p className=\"text-xs opacity-75\">\n Configure the URL in the properties panel\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`w-full ${isFullScreen ? \"h-full\" : \"\"} ${className}`}\n {...props}\n >\n <iframe\n src={url}\n title={title}\n width=\"100%\"\n height={isFullScreen ? \"100%\" : height}\n loading={loading}\n allowFullScreen={allowFullscreen}\n className={`rounded-${borderRadius} border border-border`}\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\"\n />\n </div>\n );\n}\n\nexport const embedWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"EmbedWidget\",\n displayName: \"Embed\",\n fields: [\n // Content\n {\n key: \"url\",\n label: \"URL\",\n type: \"text\",\n description: \"The URL of the external site to embed\",\n placeholder: \"https://example.com\",\n defaultValue: \"\",\n group: \"Content\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Accessibility title for the embedded content\",\n defaultValue: \"Embedded Content\",\n group: \"Content\",\n },\n\n // Design\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the embed container\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n {\n key: \"fullScreen\",\n label: \"Full Screen\",\n type: \"boolean\",\n description: \"When enabled, the embed fills the available space\",\n defaultValue: false,\n group: \"Design\",\n },\n {\n key: \"height\",\n label: \"Height (px)\",\n type: \"number\",\n description: \"Height of the embedded iframe in pixels\",\n min: 100,\n max: 1200,\n step: 50,\n defaultValue: 400,\n group: \"Design\",\n requiresKeyValue: {\n key: \"fullScreen\",\n value: false,\n },\n },\n\n // Settings\n {\n key: \"allowFullscreen\",\n label: \"Allow Fullscreen\",\n type: \"boolean\",\n description: \"Allow the embedded content to use fullscreen mode\",\n defaultValue: true,\n group: \"Settings\",\n },\n {\n key: \"loading\",\n label: \"Loading\",\n type: \"select\",\n description: \"When to load the embedded content\",\n options: [\n { label: \"Lazy (on scroll)\", value: \"lazy\" },\n { label: \"Eager (immediately)\", value: \"eager\" },\n ],\n defaultValue: \"lazy\",\n group: \"Settings\",\n },\n ],\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/components/error-state.tsx
4
+ function ErrorState() {
5
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-h-[120px] flex-col items-center justify-center p-6 text-center", children: [
6
+ /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold", children: "Something Went Wrong" }),
7
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Please contact a company admin for help" })
8
+ ] });
9
+ }
10
+
11
+ export { ErrorState };
12
+ //# sourceMappingURL=chunk-GRFCSQ2M.js.map
13
+ //# sourceMappingURL=chunk-GRFCSQ2M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/error-state.tsx"],"names":[],"mappings":";;;AAAO,SAAS,UAAA,GAAa;AAC3B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,oBACzD,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,yCAAA,EAE7C;AAAA,GAAA,EACF,CAAA;AAEJ","file":"chunk-GRFCSQ2M.js","sourcesContent":["export function ErrorState() {\n return (\n <div className=\"flex min-h-[120px] flex-col items-center justify-center p-6 text-center\">\n <p className=\"text-lg font-semibold\">Something Went Wrong</p>\n <p className=\"text-sm text-muted-foreground\">\n Please contact a company admin for help\n </p>\n </div>\n );\n}\n"]}