@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,453 @@
1
+ const require_chunk = require("./chunk-CZWwpsFl.cjs");
2
+ const require_scroll_arrows = require("./scroll-arrows-BZIlsE_x.cjs");
3
+ const require_MediaRenderer = require("./MediaRenderer-CcJvyOJ1.cjs");
4
+ let _fluid_app_portal_core_registries = require("@fluid-app/portal-core/registries");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ let react = require("react");
7
+ let dompurify = require("dompurify");
8
+ dompurify = require_chunk.__toESM(dompurify);
9
+ let _fluid_app_ui_primitives = require("@fluid-app/ui-primitives");
10
+ //#region src/widgets/CarouselWidget.tsx
11
+ var CarouselWidget_exports = /* @__PURE__ */ require_chunk.__exportAll({
12
+ CarouselWidget: () => CarouselWidget,
13
+ carouselWidgetPropertySchema: () => carouselWidgetPropertySchema
14
+ });
15
+ const DEFAULT_SLIDES = [];
16
+ function CarouselWidget({ slides = DEFAULT_SLIDES, autoScrollInterval = 3e3, enableAutoScroll = false, carouselHeight = "400px", align = {
17
+ vertical: "bottom",
18
+ horizontal: "left"
19
+ }, overlayIntensity = 40, borderRadius = "none", padding = 0, textWidth = "100%", headerSize = "lg", headerColor = "background", textSize = "md", textColor = "background", showButton = true, buttonColor = "background", buttonSize = "default", overlayEnabled = true, overlayType = "solid", className, ...props }) {
20
+ const [currentIndex, setCurrentIndex] = (0, react.useState)(0);
21
+ const [isHovered, setIsHovered] = (0, react.useState)(false);
22
+ const hasSlides = slides.length > 0;
23
+ const totalSlides = slides.length;
24
+ const goToNext = (0, react.useCallback)(() => {
25
+ if (!hasSlides) return;
26
+ setCurrentIndex((prev) => {
27
+ if (prev === totalSlides - 1) return 0;
28
+ return prev + 1;
29
+ });
30
+ }, [hasSlides, totalSlides]);
31
+ const goToPrevious = (0, react.useCallback)(() => {
32
+ if (!hasSlides) return;
33
+ setCurrentIndex((prev) => {
34
+ if (prev === 0) return totalSlides - 1;
35
+ return prev - 1;
36
+ });
37
+ }, [hasSlides, totalSlides]);
38
+ const goToSlide = (0, react.useCallback)((index) => {
39
+ if (!hasSlides) return;
40
+ if (index >= 0 && index < totalSlides) setCurrentIndex(index);
41
+ }, [hasSlides, totalSlides]);
42
+ (0, react.useEffect)(() => {
43
+ if (!enableAutoScroll || !hasSlides || isHovered) return;
44
+ const intervalId = setInterval(() => {
45
+ goToNext();
46
+ }, autoScrollInterval);
47
+ return () => clearInterval(intervalId);
48
+ }, [
49
+ enableAutoScroll,
50
+ autoScrollInterval,
51
+ hasSlides,
52
+ isHovered,
53
+ goToNext
54
+ ]);
55
+ (0, react.useEffect)(() => {
56
+ if (currentIndex >= totalSlides && totalSlides > 0) setCurrentIndex(0);
57
+ }, [totalSlides, currentIndex]);
58
+ if (!hasSlides) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
59
+ className: `rounded-${borderRadius} ${className} w-full overflow-hidden`,
60
+ style: { minHeight: carouselHeight },
61
+ ...props,
62
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
63
+ className: "bg-muted flex h-full w-full items-center justify-center",
64
+ style: { minHeight: carouselHeight },
65
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
66
+ className: "text-muted-foreground flex flex-col items-center gap-2",
67
+ children: [
68
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
69
+ className: "text-4xl",
70
+ children: "🎠"
71
+ }),
72
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
73
+ className: "text-sm",
74
+ children: "No slides added"
75
+ }),
76
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
77
+ className: "text-muted-foreground/70 text-xs",
78
+ children: "Add slides to create a carousel"
79
+ })
80
+ ]
81
+ })
82
+ })
83
+ });
84
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
85
+ className: `relative w-full overflow-hidden rounded-${borderRadius} ${className}`,
86
+ style: { minHeight: carouselHeight },
87
+ onMouseEnter: () => setIsHovered(true),
88
+ onMouseLeave: () => setIsHovered(false),
89
+ ...props,
90
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
91
+ className: "relative h-full w-full",
92
+ style: { minHeight: carouselHeight },
93
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
94
+ className: "flex h-full transition-transform duration-500 ease-in-out",
95
+ style: { transform: `translateX(-${currentIndex * 100}%)` },
96
+ children: slides.map((slide) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
97
+ className: "relative h-full w-full flex-shrink-0",
98
+ style: {
99
+ minWidth: "100%",
100
+ minHeight: carouselHeight
101
+ },
102
+ children: [
103
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
104
+ className: "absolute inset-0 h-full w-full",
105
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MediaRenderer.MediaRenderer, { ...require_MediaRenderer.getMediaPropsFromWidgetSchema(slide.content) })
106
+ }),
107
+ overlayEnabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
108
+ className: `absolute inset-0 z-9 ${overlayType === "gradient" ? "bg-gradient-to-t from-black to-transparent" : "bg-black"}`,
109
+ style: { opacity: (Number(String(overlayIntensity).replace("%", "")) || 40) / 100 }
110
+ }),
111
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
112
+ className: `absolute inset-x-0 z-10 flex px-3 ${align.horizontal === "left" ? "justify-start" : align.horizontal === "center" ? "justify-center" : "justify-end"} ${align.vertical === "top" ? "top-0 pt-13" : align.vertical === "center" ? "top-1/2 -translate-y-1/2" : "bottom-0 pb-13"}`,
113
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
114
+ className: `p-${padding} flex flex-col gap-3`,
115
+ style: { maxWidth: textWidth },
116
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
117
+ className: `flex flex-col text-${align.horizontal}`,
118
+ children: [slide.title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
119
+ className: `mb-2 leading-tight font-bold text-${headerColor} text-${headerSize === "md" ? "base" : headerSize}`,
120
+ children: slide.title
121
+ }), slide.description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
122
+ className: `leading-snug text-${textColor} text-${textSize === "md" ? "base" : textSize} line-clamp-2`,
123
+ dangerouslySetInnerHTML: { __html: dompurify.default.sanitize(slide.description, {
124
+ ALLOWED_TAGS: [
125
+ "br",
126
+ "strong",
127
+ "em",
128
+ "b",
129
+ "i",
130
+ "ul",
131
+ "ol",
132
+ "li",
133
+ "p"
134
+ ],
135
+ ALLOWED_ATTR: []
136
+ }) }
137
+ })]
138
+ }), slide.buttonText && slide.buttonEnabled && showButton && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
139
+ className: `text-${align.horizontal}`,
140
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_fluid_app_ui_primitives.Button, {
141
+ size: buttonSize,
142
+ className: `rounded-md py-1 font-semibold bg-${buttonColor} text-${buttonColor}-foreground hover:bg-${buttonColor}/90`,
143
+ asChild: true,
144
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
145
+ href: slide.buttonLink,
146
+ children: slide.buttonText
147
+ })
148
+ })
149
+ })]
150
+ })
151
+ })
152
+ ]
153
+ }, slide.id))
154
+ })
155
+ }), totalSlides > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
156
+ className: `p-${padding} absolute bottom-0 z-10 flex w-full items-center justify-between ${align.horizontal === "center" ? "h-full" : ""}`,
157
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
158
+ className: `flex items-center ${align.horizontal === "center" ? `p-${padding} absolute inset-x-0 bottom-3 justify-center` : ""}`,
159
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
160
+ className: `flex items-center gap-2 ${align.horizontal === "center" ? "justify-center" : ""}`,
161
+ children: slides.map((_, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
162
+ className: `h-[6px] w-[6px] rounded-full transition-colors ${index === currentIndex ? "bg-background" : "bg-background/40 hover:bg-background/60"}`,
163
+ onClick: () => goToSlide(index),
164
+ "aria-label": `Go to slide ${index + 1}`,
165
+ "aria-current": index === currentIndex ? "true" : "false"
166
+ }, `dot-${index}`))
167
+ })
168
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
169
+ className: `flex items-center gap-[10px] ${align.horizontal === "center" ? `absolute inset-x-0 top-1/2 justify-between px-${padding}` : ""}`,
170
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_scroll_arrows.ScrollArrows, {
171
+ onPrevious: goToPrevious,
172
+ onNext: goToNext
173
+ })
174
+ })]
175
+ })]
176
+ });
177
+ }
178
+ const carouselWidgetPropertySchema = {
179
+ widgetType: "CarouselWidget",
180
+ displayName: "Carousel",
181
+ tabsConfig: [
182
+ {
183
+ id: "styling",
184
+ label: "Styling"
185
+ },
186
+ {
187
+ id: "behavior",
188
+ label: "Behavior"
189
+ },
190
+ {
191
+ id: "data",
192
+ label: "Data"
193
+ }
194
+ ],
195
+ dataSourceTargetProps: ["slides"],
196
+ fields: [
197
+ (0, _fluid_app_portal_core_registries.getFontSizeField)({
198
+ defaultValue: "lg",
199
+ key: "headerSize",
200
+ label: "Header Font Size",
201
+ description: "Font size for the slide header",
202
+ tab: "styling",
203
+ group: "Text Styling"
204
+ }),
205
+ (0, _fluid_app_portal_core_registries.getColorField)({
206
+ defaultValue: "background",
207
+ key: "headerColor",
208
+ label: "Header Color",
209
+ description: "Color variant for the slide header",
210
+ tab: "styling",
211
+ group: "Text Styling"
212
+ }),
213
+ {
214
+ key: "separator",
215
+ type: "separator",
216
+ label: "Separator",
217
+ tab: "styling",
218
+ group: "Text Styling"
219
+ },
220
+ (0, _fluid_app_portal_core_registries.getFontSizeField)({
221
+ defaultValue: "md",
222
+ key: "textSize",
223
+ label: "Text Font Size",
224
+ description: "Font size for the slide text",
225
+ tab: "styling",
226
+ group: "Text Styling"
227
+ }),
228
+ (0, _fluid_app_portal_core_registries.getColorField)({
229
+ defaultValue: "background",
230
+ key: "textColor",
231
+ label: "Text Color",
232
+ description: "Color variant for the slide text",
233
+ tab: "styling",
234
+ group: "Text Styling"
235
+ }),
236
+ {
237
+ key: "align",
238
+ label: "Alignment",
239
+ type: "alignment",
240
+ description: "Alignment of the carousel content",
241
+ defaultValue: {
242
+ vertical: "bottom",
243
+ horizontal: "left"
244
+ },
245
+ options: {
246
+ verticalEnabled: true,
247
+ horizontalEnabled: true
248
+ },
249
+ tab: "styling",
250
+ group: "Layout"
251
+ },
252
+ {
253
+ key: "textWidth",
254
+ label: "Content Width",
255
+ type: "text",
256
+ description: "Maximum width for slide content (e.g., 100%, 50%, 600px)",
257
+ defaultValue: "100%",
258
+ tab: "styling",
259
+ group: "Layout"
260
+ },
261
+ (0, _fluid_app_portal_core_registries.getHeightField)({
262
+ key: "carouselHeight",
263
+ label: "Carousel Height",
264
+ description: "Height of the carousel",
265
+ min: 100,
266
+ max: 1200,
267
+ step: 10,
268
+ defaultValue: "400px",
269
+ tab: "styling",
270
+ group: "Design"
271
+ }),
272
+ {
273
+ key: "separator2",
274
+ type: "separator",
275
+ label: "Separator",
276
+ tab: "styling",
277
+ group: "Design"
278
+ },
279
+ (0, _fluid_app_portal_core_registries.getBorderRadiusField)({
280
+ defaultValue: "md",
281
+ key: "borderRadius",
282
+ label: "Border Radius",
283
+ description: "Rounded corners for the carousel",
284
+ tab: "styling",
285
+ group: "Design"
286
+ }),
287
+ (0, _fluid_app_portal_core_registries.getPaddingField)({
288
+ defaultValue: 4,
289
+ key: "padding",
290
+ label: "Padding",
291
+ description: "Padding for the carousel",
292
+ tab: "styling",
293
+ group: "Design"
294
+ }),
295
+ {
296
+ key: "overlayEnabled",
297
+ label: "Enable Overlay",
298
+ type: "boolean",
299
+ description: "Add background overlay to slide content",
300
+ defaultValue: true,
301
+ tab: "styling",
302
+ group: "Design"
303
+ },
304
+ {
305
+ key: "overlayType",
306
+ label: "Overlay Type",
307
+ type: "buttonGroup",
308
+ description: "Type of overlay to add to the slide content",
309
+ defaultValue: "gradient",
310
+ options: [{
311
+ label: "Solid",
312
+ value: "solid"
313
+ }, {
314
+ label: "Gradient",
315
+ value: "gradient"
316
+ }],
317
+ tab: "styling",
318
+ group: "Design",
319
+ requiresKeyToBeTrue: "overlayEnabled"
320
+ },
321
+ {
322
+ key: "overlayIntensity",
323
+ label: "Overlay Intensity",
324
+ type: "slider",
325
+ description: "Opacity of the overlay background (0-100)",
326
+ min: 0,
327
+ max: 100,
328
+ step: 5,
329
+ defaultValue: 50,
330
+ unit: "%",
331
+ tab: "styling",
332
+ group: "Design",
333
+ requiresKeyToBeTrue: "overlayEnabled"
334
+ },
335
+ {
336
+ key: "showButton",
337
+ label: "Show Button",
338
+ type: "boolean",
339
+ description: "Display the button in slide content",
340
+ defaultValue: true,
341
+ tab: "styling",
342
+ group: "Design"
343
+ },
344
+ (0, _fluid_app_portal_core_registries.getColorField)({
345
+ defaultValue: "primary",
346
+ key: "buttonColor",
347
+ label: "Button Color",
348
+ description: "Color variant for the slide button",
349
+ tab: "styling",
350
+ group: "Design",
351
+ requiresKeyToBeTrue: "showButton"
352
+ }),
353
+ (0, _fluid_app_portal_core_registries.getButtonSizeField)({
354
+ defaultValue: "default",
355
+ key: "buttonSize",
356
+ label: "Button Size",
357
+ description: "Size of the slide button",
358
+ tab: "styling",
359
+ group: "Design",
360
+ requiresKeyToBeTrue: "showButton"
361
+ }),
362
+ {
363
+ key: "enableAutoScroll",
364
+ label: "Enable Auto-Scroll",
365
+ type: "boolean",
366
+ description: "Automatically advance to the next slide",
367
+ defaultValue: false,
368
+ tab: "behavior",
369
+ group: "Auto-Scroll"
370
+ },
371
+ {
372
+ key: "autoScrollInterval",
373
+ label: "Auto-Scroll Interval (ms)",
374
+ type: "number",
375
+ description: "Time in milliseconds between automatic slide transitions",
376
+ min: 1e3,
377
+ max: 1e4,
378
+ step: 500,
379
+ defaultValue: 3e3,
380
+ tab: "behavior",
381
+ group: "Auto-Scroll",
382
+ requiresKeyToBeTrue: "enableAutoScroll"
383
+ },
384
+ {
385
+ key: "dataSource",
386
+ label: "Data Source",
387
+ type: "dataSource",
388
+ description: "",
389
+ tab: "data",
390
+ group: "Data Configuration"
391
+ }
392
+ ],
393
+ itemConfigSchema: {
394
+ description: "Configure settings for this slide",
395
+ fields: [
396
+ {
397
+ key: "title",
398
+ label: "Custom Title",
399
+ type: "text",
400
+ description: "Override the item's title for this slide"
401
+ },
402
+ {
403
+ key: "description",
404
+ label: "Custom Description",
405
+ type: "textarea",
406
+ description: "Override the item's description for this slide",
407
+ rows: 3
408
+ },
409
+ {
410
+ key: "buttonEnabled",
411
+ label: "Show Button",
412
+ type: "boolean",
413
+ description: "Show the button in the slide",
414
+ defaultValue: false
415
+ },
416
+ {
417
+ key: "buttonText",
418
+ label: "Button Text",
419
+ type: "text",
420
+ description: "Text to display on the slide button",
421
+ requiresKeyToBeTrue: "buttonEnabled"
422
+ },
423
+ {
424
+ key: "buttonLink",
425
+ label: "Button Link",
426
+ type: "text",
427
+ description: "URL for the slide button",
428
+ requiresKeyToBeTrue: "buttonEnabled"
429
+ }
430
+ ]
431
+ }
432
+ };
433
+ //#endregion
434
+ Object.defineProperty(exports, "CarouselWidget", {
435
+ enumerable: true,
436
+ get: function() {
437
+ return CarouselWidget;
438
+ }
439
+ });
440
+ Object.defineProperty(exports, "CarouselWidget_exports", {
441
+ enumerable: true,
442
+ get: function() {
443
+ return CarouselWidget_exports;
444
+ }
445
+ });
446
+ Object.defineProperty(exports, "carouselWidgetPropertySchema", {
447
+ enumerable: true,
448
+ get: function() {
449
+ return carouselWidgetPropertySchema;
450
+ }
451
+ });
452
+
453
+ //# sourceMappingURL=CarouselWidget-Bdn0LVXT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CarouselWidget-Bdn0LVXT.cjs","names":["MediaRenderer","getMediaPropsFromWidgetSchema","DOMPurify","Button","ScrollArrows"],"sources":["../src/widgets/CarouselWidget.tsx"],"sourcesContent":["import DOMPurify from \"dompurify\";\nimport { Button } from \"@fluid-app/ui-primitives\";\nimport { ScrollArrows } from \"../ui/scroll-arrows\";\nimport type { ComponentProps } from \"react\";\nimport { useEffect, useState, useCallback } from \"react\";\nimport type React from \"react\";\nimport {\n MediaRenderer,\n getMediaPropsFromWidgetSchema,\n} from \"../components/MediaRenderer\";\nimport type {\n WidgetSchema,\n BorderRadiusOptions,\n ColorOptions,\n AlignOptions,\n FontSizeOptions,\n PaddingOptions,\n ButtonSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport {\n getHeightField,\n type WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n getButtonSizeField,\n} from \"../core/fields\";\n\nconst DEFAULT_SLIDES: CarouselSlide[] = [];\n\ntype CarouselSlide = {\n id: string;\n content: WidgetSchema;\n title?: string;\n description?: string;\n buttonEnabled?: boolean;\n buttonText?: string;\n buttonVariant?:\n | \"default\"\n | \"secondary\"\n | \"outline\"\n | \"destructive\"\n | \"ghost\"\n | \"link\";\n buttonLink?: string;\n};\n\ntype CarouselWidgetProps = ComponentProps<\"div\"> & {\n slides?: CarouselSlide[];\n autoScrollInterval?: number;\n enableAutoScroll?: boolean;\n\n // Layout\n align?: AlignOptions;\n carouselHeight?: string;\n borderRadius?: BorderRadiusOptions;\n padding?: PaddingOptions;\n\n // Text Styling\n headerSize?: FontSizeOptions;\n headerColor?: ColorOptions;\n textSize?: FontSizeOptions;\n textColor?: ColorOptions;\n textWidth?: string;\n\n // Button\n showButton?: boolean;\n buttonColor?: ColorOptions;\n buttonSize?: ButtonSizeOptions;\n\n // Overlay\n overlayEnabled?: boolean;\n overlayType?: \"solid\" | \"gradient\";\n overlayIntensity?: number;\n};\n\nexport function CarouselWidget({\n slides = DEFAULT_SLIDES,\n autoScrollInterval = 3000,\n enableAutoScroll = false,\n carouselHeight = \"400px\",\n align = { vertical: \"bottom\", horizontal: \"left\" },\n overlayIntensity = 40,\n borderRadius = \"none\",\n padding = 0,\n textWidth = \"100%\",\n headerSize = \"lg\",\n headerColor = \"background\",\n textSize = \"md\",\n textColor = \"background\",\n showButton = true,\n buttonColor = \"background\",\n buttonSize = \"default\",\n overlayEnabled = true,\n overlayType = \"solid\",\n className,\n ...props\n}: CarouselWidgetProps): React.JSX.Element {\n const [currentIndex, setCurrentIndex] = useState(0);\n const [isHovered, setIsHovered] = useState(false);\n\n const hasSlides = slides.length > 0;\n const totalSlides = slides.length;\n\n const goToNext = useCallback(() => {\n if (!hasSlides) return;\n setCurrentIndex((prev) => {\n if (prev === totalSlides - 1) {\n return 0;\n }\n return prev + 1;\n });\n }, [hasSlides, totalSlides]);\n\n const goToPrevious = useCallback(() => {\n if (!hasSlides) return;\n setCurrentIndex((prev) => {\n if (prev === 0) {\n return totalSlides - 1;\n }\n return prev - 1;\n });\n }, [hasSlides, totalSlides]);\n\n const goToSlide = useCallback(\n (index: number) => {\n if (!hasSlides) return;\n if (index >= 0 && index < totalSlides) {\n setCurrentIndex(index);\n }\n },\n [hasSlides, totalSlides],\n );\n\n // Auto-scroll effect\n useEffect(() => {\n if (!enableAutoScroll || !hasSlides || isHovered) return;\n\n const intervalId = setInterval(() => {\n goToNext();\n }, autoScrollInterval);\n\n return () => clearInterval(intervalId);\n }, [enableAutoScroll, autoScrollInterval, hasSlides, isHovered, goToNext]);\n\n // Reset to first slide if slides change\n useEffect(() => {\n if (currentIndex >= totalSlides && totalSlides > 0) {\n setCurrentIndex(0);\n }\n }, [totalSlides, currentIndex]);\n\n if (!hasSlides) {\n return (\n <div\n className={`rounded-${borderRadius} ${className} w-full overflow-hidden`}\n style={{ minHeight: carouselHeight }}\n {...props}\n >\n <div\n className=\"bg-muted flex h-full w-full items-center justify-center\"\n style={{ minHeight: carouselHeight }}\n >\n <div className=\"text-muted-foreground flex flex-col items-center gap-2\">\n <div className=\"text-4xl\">🎠</div>\n <p className=\"text-sm\">No slides added</p>\n <p className=\"text-muted-foreground/70 text-xs\">\n Add slides to create a carousel\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={`relative w-full overflow-hidden rounded-${borderRadius} ${className}`}\n style={{ minHeight: carouselHeight }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n {...props}\n >\n {/* Slides Container */}\n <div\n className=\"relative h-full w-full\"\n style={{ minHeight: carouselHeight }}\n >\n <div\n className=\"flex h-full transition-transform duration-500 ease-in-out\"\n style={{\n transform: `translateX(-${currentIndex * 100}%)`,\n }}\n >\n {slides.map((slide) => (\n <div\n key={slide.id}\n className=\"relative h-full w-full flex-shrink-0\"\n style={{ minWidth: \"100%\", minHeight: carouselHeight }}\n >\n {/* Background image/content layer */}\n <div className=\"absolute inset-0 h-full w-full\">\n <MediaRenderer\n {...getMediaPropsFromWidgetSchema(slide.content)}\n />\n </div>\n\n {/* Dark overlay for text readability */}\n {overlayEnabled && (\n <div\n className={`absolute inset-0 z-9 ${\n overlayType === \"gradient\"\n ? \"bg-gradient-to-t from-black to-transparent\"\n : \"bg-black\"\n }`}\n style={{\n opacity:\n (Number(String(overlayIntensity).replace(\"%\", \"\")) ||\n 40) / 100,\n }}\n />\n )}\n\n {/* Content box */}\n <div\n className={`absolute inset-x-0 z-10 flex px-3 ${\n align.horizontal === \"left\"\n ? \"justify-start\"\n : align.horizontal === \"center\"\n ? \"justify-center\"\n : \"justify-end\"\n } ${\n align.vertical === \"top\"\n ? \"top-0 pt-13\"\n : align.vertical === \"center\"\n ? \"top-1/2 -translate-y-1/2\"\n : \"bottom-0 pb-13\"\n }`}\n >\n <div\n className={`p-${padding} flex flex-col gap-3`}\n style={{ maxWidth: textWidth }}\n >\n {/* Heading and text */}\n <div className={`flex flex-col text-${align.horizontal}`}>\n {slide.title && (\n <h2\n className={`mb-2 leading-tight font-bold text-${headerColor} text-${headerSize === \"md\" ? \"base\" : headerSize}`}\n >\n {slide.title}\n </h2>\n )}\n {slide.description && (\n <div\n className={`leading-snug text-${textColor} text-${textSize === \"md\" ? \"base\" : textSize} line-clamp-2`}\n dangerouslySetInnerHTML={{\n __html: DOMPurify.sanitize(slide.description, {\n ALLOWED_TAGS: [\n \"br\",\n \"strong\",\n \"em\",\n \"b\",\n \"i\",\n \"ul\",\n \"ol\",\n \"li\",\n \"p\",\n ],\n ALLOWED_ATTR: [],\n }),\n }}\n />\n )}\n </div>\n\n {/* Button */}\n {slide.buttonText && slide.buttonEnabled && showButton && (\n <div className={`text-${align.horizontal}`}>\n <Button\n size={buttonSize}\n className={`rounded-md py-1 font-semibold bg-${buttonColor} text-${buttonColor}-foreground hover:bg-${buttonColor}/90`}\n asChild\n >\n <a href={slide.buttonLink}>{slide.buttonText}</a>\n </Button>\n </div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n {/* Dots and Navigation */}\n {totalSlides > 1 && (\n <div\n className={`p-${padding} absolute bottom-0 z-10 flex w-full items-center justify-between ${align.horizontal === \"center\" ? \"h-full\" : \"\"}`}\n >\n {/* Pagination dots - always at bottom */}\n <div\n className={`flex items-center ${\n align.horizontal === \"center\"\n ? `p-${padding} absolute inset-x-0 bottom-3 justify-center`\n : \"\"\n }`}\n >\n <div\n className={`flex items-center gap-2 ${\n align.horizontal === \"center\" ? \"justify-center\" : \"\"\n }`}\n >\n {slides.map((_, index) => (\n <button\n key={`dot-${index}`}\n className={`h-[6px] w-[6px] rounded-full transition-colors ${\n index === currentIndex\n ? \"bg-background\"\n : \"bg-background/40 hover:bg-background/60\"\n }`}\n onClick={() => goToSlide(index)}\n aria-label={`Go to slide ${index + 1}`}\n aria-current={index === currentIndex ? \"true\" : \"false\"}\n />\n ))}\n </div>\n </div>\n\n {/* Navigation arrows - position changes based on alignment */}\n <div\n className={`flex items-center gap-[10px] ${\n align.horizontal === \"center\"\n ? `absolute inset-x-0 top-1/2 justify-between px-${padding}`\n : \"\"\n }`}\n >\n <ScrollArrows onPrevious={goToPrevious} onNext={goToNext} />\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport const carouselWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"CarouselWidget\",\n displayName: \"Carousel\",\n tabsConfig: [\n { id: \"styling\", label: \"Styling\" },\n { id: \"behavior\", label: \"Behavior\" },\n { id: \"data\", label: \"Data\" },\n ],\n dataSourceTargetProps: [\"slides\"],\n fields: [\n // Styling tab - Text Styling group\n getFontSizeField({\n defaultValue: \"lg\",\n key: \"headerSize\",\n label: \"Header Font Size\",\n description: \"Font size for the slide header\",\n tab: \"styling\",\n group: \"Text Styling\",\n }),\n getColorField({\n defaultValue: \"background\",\n key: \"headerColor\",\n label: \"Header Color\",\n description: \"Color variant for the slide header\",\n tab: \"styling\",\n group: \"Text Styling\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Text Styling\",\n },\n getFontSizeField({\n defaultValue: \"md\",\n key: \"textSize\",\n label: \"Text Font Size\",\n description: \"Font size for the slide text\",\n tab: \"styling\",\n group: \"Text Styling\",\n }),\n getColorField({\n defaultValue: \"background\",\n key: \"textColor\",\n label: \"Text Color\",\n description: \"Color variant for the slide text\",\n tab: \"styling\",\n group: \"Text Styling\",\n }),\n // Styling tab - Layout group\n {\n key: \"align\",\n label: \"Alignment\",\n type: \"alignment\",\n description: \"Alignment of the carousel content\",\n defaultValue: { vertical: \"bottom\", horizontal: \"left\" },\n options: {\n verticalEnabled: true,\n horizontalEnabled: true,\n },\n tab: \"styling\",\n group: \"Layout\",\n },\n {\n key: \"textWidth\",\n label: \"Content Width\",\n type: \"text\",\n description: \"Maximum width for slide content (e.g., 100%, 50%, 600px)\",\n defaultValue: \"100%\",\n tab: \"styling\",\n group: \"Layout\",\n },\n // Styling tab - Design group\n getHeightField({\n key: \"carouselHeight\",\n label: \"Carousel Height\",\n description: \"Height of the carousel\",\n min: 100,\n max: 1200,\n step: 10,\n defaultValue: \"400px\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"separator2\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Design\",\n },\n getBorderRadiusField({\n defaultValue: \"md\",\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Rounded corners for the carousel\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getPaddingField({\n defaultValue: 4,\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding for the carousel\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"overlayEnabled\",\n label: \"Enable Overlay\",\n type: \"boolean\",\n description: \"Add background overlay to slide content\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Design\",\n },\n {\n key: \"overlayType\",\n label: \"Overlay Type\",\n type: \"buttonGroup\",\n description: \"Type of overlay to add to the slide content\",\n defaultValue: \"gradient\",\n options: [\n { label: \"Solid\", value: \"solid\" },\n { label: \"Gradient\", value: \"gradient\" },\n ],\n tab: \"styling\",\n group: \"Design\",\n requiresKeyToBeTrue: \"overlayEnabled\",\n },\n {\n key: \"overlayIntensity\",\n label: \"Overlay Intensity\",\n type: \"slider\",\n description: \"Opacity of the overlay background (0-100)\",\n min: 0,\n max: 100,\n step: 5,\n defaultValue: 50,\n unit: \"%\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyToBeTrue: \"overlayEnabled\",\n },\n {\n key: \"showButton\",\n label: \"Show Button\",\n type: \"boolean\",\n description: \"Display the button in slide content\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Design\",\n },\n getColorField({\n defaultValue: \"primary\",\n key: \"buttonColor\",\n label: \"Button Color\",\n description: \"Color variant for the slide button\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyToBeTrue: \"showButton\",\n }),\n getButtonSizeField({\n defaultValue: \"default\",\n key: \"buttonSize\",\n label: \"Button Size\",\n description: \"Size of the slide button\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyToBeTrue: \"showButton\",\n }),\n // Behavior tab - Auto-Scroll group\n {\n key: \"enableAutoScroll\",\n label: \"Enable Auto-Scroll\",\n type: \"boolean\",\n description: \"Automatically advance to the next slide\",\n defaultValue: false,\n tab: \"behavior\",\n group: \"Auto-Scroll\",\n },\n {\n key: \"autoScrollInterval\",\n label: \"Auto-Scroll Interval (ms)\",\n type: \"number\",\n description: \"Time in milliseconds between automatic slide transitions\",\n min: 1000,\n max: 10000,\n step: 500,\n defaultValue: 3000,\n tab: \"behavior\",\n group: \"Auto-Scroll\",\n requiresKeyToBeTrue: \"enableAutoScroll\",\n },\n // Data tab - Data Configuration group\n {\n key: \"dataSource\",\n label: \"Data Source\",\n type: \"dataSource\",\n description: \"\",\n tab: \"data\",\n group: \"Data Configuration\",\n },\n ],\n // Per-item configuration schema for custom data sources\n itemConfigSchema: {\n description: \"Configure settings for this slide\",\n fields: [\n {\n key: \"title\",\n label: \"Custom Title\",\n type: \"text\",\n description: \"Override the item's title for this slide\",\n },\n {\n key: \"description\",\n label: \"Custom Description\",\n type: \"textarea\",\n description: \"Override the item's description for this slide\",\n rows: 3,\n },\n {\n key: \"buttonEnabled\",\n label: \"Show Button\",\n type: \"boolean\",\n description: \"Show the button in the slide\",\n defaultValue: false,\n },\n {\n key: \"buttonText\",\n label: \"Button Text\",\n type: \"text\",\n description: \"Text to display on the slide button\",\n requiresKeyToBeTrue: \"buttonEnabled\",\n },\n {\n key: \"buttonLink\",\n label: \"Button Link\",\n type: \"text\",\n description: \"URL for the slide button\",\n requiresKeyToBeTrue: \"buttonEnabled\",\n },\n ],\n },\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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AO;GACP,KAAK;GACL,OAAO;GACR;8DACoB;GACnB,cAAc;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,KAAK;GACL,OAAO;GACR,CAAC;yDACc;GACd,cAAc;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,KAAK;GACL,OAAO;GACR,CAAC;EACF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,SAAS,CACP;IAAE,OAAO;IAAS,OAAO;IAAS,EAClC;IAAE,OAAO;IAAY,OAAO;IAAY,CACzC;GACD,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,KAAK;GACL,MAAM;GACN,cAAc;GACd,MAAM;GACN,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;uDACa;GACZ,cAAc;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;4DACiB;GACjB,cAAc;GACd,KAAK;GACL,OAAO;GACP,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EAEF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,KAAK;GACL,MAAM;GACN,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EAED;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACR;EACF;CAED,kBAAkB;EAChB,aAAa;EACb,QAAQ;GACN;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,MAAM;IACP;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,cAAc;IACf;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,qBAAqB;IACtB;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,qBAAqB;IACtB;GACF;EACF;CACF"}