@levo-so/blocks 0.1.80 → 0.1.82

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.
@@ -72,7 +72,6 @@ const DEFAULT_CONTENT = {
72
72
  },
73
73
  edit_profile_block_title: "Wanderlooms",
74
74
  edit_profile_block_description: "<p>Joined on: 01/01/2026</p>",
75
- post_detail_page_url: "/community",
76
75
  forum_key: "forum",
77
76
  };
78
77
 
@@ -83,6 +82,7 @@ export const Community1: IBlock = {
83
82
  title: "Community 1",
84
83
  key: "community-1",
85
84
  version: "v1",
85
+ source: [{ required: true, module: "community", type: "block", field_key: "community" }],
86
86
  content_schema: [
87
87
  {
88
88
  key: "layout",
@@ -157,11 +157,6 @@ export const Community1: IBlock = {
157
157
  label: "Posts",
158
158
  field_interface: "BoxWidget",
159
159
  },
160
- {
161
- key: "post_detail_page_url",
162
- label: "Post Detail Page URL",
163
- field_interface: "HeadingWidget",
164
- },
165
160
  {
166
161
  key: "loading_container",
167
162
  label: "Loading Container",
@@ -26,10 +26,12 @@ import {
26
26
  Skeleton,
27
27
  Typography,
28
28
  useAuth,
29
+ useBlockContext,
29
30
  } from "@levo-so/studio";
30
- import { useCallback, useEffect, useRef, useState } from "react";
31
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
31
32
 
32
33
  import type { ICommunity1Content } from "./community-1.schema";
34
+ import { SAMPLE_GET_MEMBER_RESPONSE } from "./MEMBER_RESPONSE";
33
35
 
34
36
  const PostSkeleton: React.FC = () => {
35
37
  return (
@@ -101,7 +103,15 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
101
103
  // Join request state
102
104
  const [joinRequest, setJoinRequest] = useState<IForumJoinRequest | null>(null);
103
105
 
104
- const forumKey = content?.forum_key as unknown as string;
106
+ const { parsedBlockData, isBuilder } = useBlockContext();
107
+ const forumKey = useMemo(() => {
108
+ return (
109
+ parsedBlockData?.source?.find((s) => s.module === "community")?.identifier ||
110
+ // Fallback
111
+ (content?.forum_key as unknown as string) ||
112
+ ""
113
+ );
114
+ }, [content?.forum_key, parsedBlockData?.source]);
105
115
 
106
116
  useEffect(() => {
107
117
  return () => {
@@ -119,7 +129,17 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
119
129
  .json<IResponseSingle<IForum>>();
120
130
 
121
131
  if (response?.content?.data) {
122
- setForumData(response.content.data);
132
+ if (isBuilder) {
133
+ setForumData({
134
+ ...response.content.data,
135
+ settings: {
136
+ ...response.content.data.settings,
137
+ invite_only: false,
138
+ },
139
+ });
140
+ } else {
141
+ setForumData(response.content.data);
142
+ }
123
143
  }
124
144
 
125
145
  return response;
@@ -127,7 +147,7 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
127
147
  levoClient?.logger?.error("Error fetching single forum data:", error);
128
148
  return null;
129
149
  }
130
- }, [forumKey]);
150
+ }, [forumKey, isBuilder]);
131
151
 
132
152
  const checkMembership = useCallback(async () => {
133
153
  if (!forumData?.settings?.invite_only || !isLoggedIn) {
@@ -137,6 +157,15 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
137
157
  return;
138
158
  }
139
159
 
160
+ // In builder mode, bypass API call and use sample data
161
+ if (isBuilder) {
162
+ const data = SAMPLE_GET_MEMBER_RESPONSE.content.data;
163
+ setIsMember(!!data?.member);
164
+ setJoinRequest(data?.join_request || null);
165
+ hasFetchedMembershipRef.current = true;
166
+ return;
167
+ }
168
+
140
169
  setIsLoadingMembership(true);
141
170
 
142
171
  try {
@@ -157,7 +186,7 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
157
186
  setIsLoadingMembership(false);
158
187
  hasFetchedMembershipRef.current = true;
159
188
  }
160
- }, [forumKey, forumData?.settings?.invite_only, isLoggedIn, levoClient]);
189
+ }, [forumKey, forumData?.settings?.invite_only, isLoggedIn, isBuilder, levoClient]);
161
190
 
162
191
  /**
163
192
  * Submit a join request for the current user
@@ -325,6 +354,40 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
325
354
  }
326
355
  }, [forumData, checkMembership]);
327
356
 
357
+ const detailPageStudioConfig = useMemo(() => {
358
+ return forumData?.studio_config?.find((v) => v?.block_instance_id === null);
359
+ }, [forumData]);
360
+
361
+ const listingPageStudioConfig = useMemo(() => {
362
+ return forumData?.studio_config?.find((v) => v?.block_instance_id !== null);
363
+ }, [forumData]);
364
+
365
+ const postDetailPageURLPattern = useMemo(() => {
366
+ if (
367
+ (isBuilder && detailPageStudioConfig?.preview_url) ||
368
+ (!isBuilder && detailPageStudioConfig?.live_url)
369
+ ) {
370
+ return isBuilder && detailPageStudioConfig.preview_url
371
+ ? detailPageStudioConfig.preview_url
372
+ : !isBuilder && detailPageStudioConfig.live_url
373
+ ? detailPageStudioConfig.live_url
374
+ : "";
375
+ }
376
+ }, [isBuilder, detailPageStudioConfig]);
377
+
378
+ const postListingPageURL = useMemo(() => {
379
+ if (
380
+ (isBuilder && listingPageStudioConfig?.preview_url) ||
381
+ (!isBuilder && listingPageStudioConfig?.live_url)
382
+ ) {
383
+ return isBuilder && listingPageStudioConfig.preview_url
384
+ ? listingPageStudioConfig.preview_url
385
+ : !isBuilder && listingPageStudioConfig.live_url
386
+ ? listingPageStudioConfig.live_url
387
+ : "";
388
+ }
389
+ }, [isBuilder, listingPageStudioConfig]);
390
+
328
391
  const isInviteOnly = forumData?.settings?.invite_only ?? false;
329
392
  const allowJoinRequests = forumData?.settings?.allow_join_requests ?? false;
330
393
 
@@ -474,7 +537,8 @@ const Community1: React.FC<ILevoBlockBaseProps<ICommunity1Content>> = ({ content
474
537
  <ForumPost
475
538
  key={`poll_${forumKey}_${item?._id}_${index}`}
476
539
  post={item}
477
- postDetailPageBaseURL={content?.post_detail_page_url || ""}
540
+ postDetailPageURLPattern={postDetailPageURLPattern}
541
+ postListingPageURL={postListingPageURL}
478
542
  forumKey={forumKey}
479
543
  />
480
544
  ))}
@@ -80,6 +80,7 @@ export const CommunityPost1: IBlock = {
80
80
  title: "Community Post 1",
81
81
  key: "community-post-1",
82
82
  version: "v1",
83
+ source: [{ required: true, module: "community", type: "page" }],
83
84
  content_schema: [
84
85
  {
85
86
  key: "layout",
@@ -129,11 +130,6 @@ export const CommunityPost1: IBlock = {
129
130
  label: "Post",
130
131
  field_interface: "HeadingWidget",
131
132
  },
132
- {
133
- key: "post_detail_page_url",
134
- label: "Post Detail Page URL",
135
- field_interface: "HeadingWidget",
136
- },
137
133
  {
138
134
  key: "right_container",
139
135
  label: "Right Container",
@@ -25,10 +25,13 @@ import {
25
25
  Skeleton,
26
26
  Typography,
27
27
  useAuth,
28
+ useBlockContext,
29
+ usePageContext,
28
30
  } from "@levo-so/studio";
29
- import { useCallback, useEffect, useRef, useState } from "react";
31
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
30
32
 
31
33
  import type { ICommunityPost1Content } from "./community-post-1.schema";
34
+ import { SAMPLE_GET_MEMBER_RESPONSE } from "./MEMBER_RESPONSE";
32
35
 
33
36
  /** Map API error codes to user-friendly messages */
34
37
  const JOIN_REQUEST_ERROR_MESSAGES: { [key: number]: string } = {
@@ -88,9 +91,16 @@ const PostDetailSkeleton: React.FC = () => (
88
91
  const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({ content }) => {
89
92
  const { fetch, logger } = useLevo();
90
93
  const { isLoggedIn } = useAuth();
94
+ const { isBuilder } = useBlockContext();
95
+ const pagePost = usePageContext("community");
96
+
97
+ const postSource = pagePost && Object.keys(pagePost).length > 0 ? pagePost : content?.post;
98
+ const postSlug = (postSource as unknown as IForumPost)?.slug;
99
+ const forumKey = pagePost?.forum;
100
+
91
101
  const [fetchedPostData, setFetchedPostData] = useState<Partial<IForumPost> | null>(null);
92
102
  const [commentCount, setCommentCount] = useState(
93
- (content?.post as unknown as IForumPost)?.comments_count ?? 0,
103
+ (postSource as unknown as IForumPost)?.comments_count ?? 0,
94
104
  );
95
105
  const hasFetchedRef = useRef(false);
96
106
  const failedAttemptsRef = useRef(0);
@@ -103,9 +113,6 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
103
113
  const [isLoadingMembership, setIsLoadingMembership] = useState(false);
104
114
  const [joinRequest, setJoinRequest] = useState<IForumJoinRequest | null>(null);
105
115
 
106
- const postSlug = (content?.post as unknown as IForumPost)?.slug;
107
- const forumKey = content?.forum_key as unknown as string;
108
-
109
116
  const fetchForumData = useCallback(async () => {
110
117
  if (!forumKey || hasFetchedForumRef.current || failedForumAttemptsRef.current >= 3) return;
111
118
 
@@ -116,7 +123,18 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
116
123
  .json<IResponseSingle<IForum>>();
117
124
 
118
125
  if (response?.content?.data) {
119
- setForumData(response.content.data);
126
+ if (isBuilder) {
127
+ setForumData({
128
+ ...response.content.data,
129
+ settings: {
130
+ ...response.content.data.settings,
131
+ invite_only: false,
132
+ },
133
+ });
134
+ } else {
135
+ setForumData(response.content.data);
136
+ }
137
+
120
138
  hasFetchedForumRef.current = true;
121
139
  }
122
140
  } catch (error) {
@@ -124,7 +142,7 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
124
142
  logger?.error("Failed to fetch forum data", levoError);
125
143
  failedForumAttemptsRef.current += 1;
126
144
  }
127
- }, [forumKey, fetch, logger]);
145
+ }, [forumKey, fetch, logger, isBuilder]);
128
146
 
129
147
  const checkMembership = useCallback(async () => {
130
148
  if (!forumData?.settings?.invite_only || !isLoggedIn) {
@@ -134,6 +152,15 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
134
152
  return;
135
153
  }
136
154
 
155
+ // In builder mode, bypass API call and use sample data
156
+ if (isBuilder) {
157
+ const data = SAMPLE_GET_MEMBER_RESPONSE.content.data;
158
+ setIsMember(!!data?.member);
159
+ setJoinRequest(data?.join_request || null);
160
+ hasFetchedMembershipRef.current = true;
161
+ return;
162
+ }
163
+
137
164
  if (hasFetchedMembershipRef.current || failedMembershipAttemptsRef.current >= 3) {
138
165
  return;
139
166
  }
@@ -159,7 +186,7 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
159
186
  } finally {
160
187
  setIsLoadingMembership(false);
161
188
  }
162
- }, [forumKey, forumData?.settings?.invite_only, isLoggedIn, fetch, logger]);
189
+ }, [forumKey, forumData?.settings?.invite_only, isLoggedIn, isBuilder, fetch, logger]);
163
190
 
164
191
  /** Submit a join request for the current user */
165
192
  const handleSubmitJoinRequest = useCallback(
@@ -198,9 +225,53 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
198
225
  }
199
226
  }, [forumData, checkMembership]);
200
227
 
228
+ const detailPageStudioConfig = useMemo(() => {
229
+ return forumData?.studio_config?.find((v) => v?.block_instance_id === null);
230
+ }, [forumData]);
231
+
232
+ const listingPageStudioConfig = useMemo(() => {
233
+ return forumData?.studio_config?.find((v) => v?.block_instance_id !== null);
234
+ }, [forumData]);
235
+
236
+ const postDetailPageURLPattern = useMemo(() => {
237
+ if (
238
+ (isBuilder && detailPageStudioConfig?.preview_url) ||
239
+ (!isBuilder && detailPageStudioConfig?.live_url)
240
+ ) {
241
+ return isBuilder && detailPageStudioConfig.preview_url
242
+ ? detailPageStudioConfig.preview_url
243
+ : !isBuilder && detailPageStudioConfig.live_url
244
+ ? detailPageStudioConfig.live_url
245
+ : "";
246
+ }
247
+ }, [isBuilder, detailPageStudioConfig]);
248
+
249
+ const postListingPageURL = useMemo(() => {
250
+ if (
251
+ (isBuilder && listingPageStudioConfig?.preview_url) ||
252
+ (!isBuilder && listingPageStudioConfig?.live_url)
253
+ ) {
254
+ return isBuilder && listingPageStudioConfig.preview_url
255
+ ? listingPageStudioConfig.preview_url
256
+ : !isBuilder && listingPageStudioConfig.live_url
257
+ ? listingPageStudioConfig.live_url
258
+ : "";
259
+ }
260
+ }, [isBuilder, listingPageStudioConfig]);
261
+
262
+ // Reset fetch state when the post changes
263
+ const postCommentsCount = (postSource as unknown as IForumPost)?.comments_count ?? 0;
264
+ // biome-ignore lint/correctness/useExhaustiveDependencies: Need to use postSlug to trigger refetch when changing post from studio.
265
+ useEffect(() => {
266
+ hasFetchedRef.current = false;
267
+ failedAttemptsRef.current = 0;
268
+ setFetchedPostData(null);
269
+ setCommentCount(postCommentsCount);
270
+ }, [postSlug, postCommentsCount]);
271
+
201
272
  useEffect(() => {
202
273
  const fetchPostVotes = async () => {
203
- if (!postSlug || hasFetchedRef.current || failedAttemptsRef.current >= 3) return;
274
+ if (!postSlug || !forumKey || hasFetchedRef.current || failedAttemptsRef.current >= 3) return;
204
275
 
205
276
  try {
206
277
  const response = await fetch
@@ -227,11 +298,11 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
227
298
  };
228
299
 
229
300
  fetchPostVotes();
230
- }, [postSlug, fetch, logger]);
301
+ }, [postSlug, forumKey, fetch, logger]);
231
302
 
232
- const postWithVotes: IForumPost | null = content?.post
303
+ const postWithVotes: IForumPost | null = postSource
233
304
  ? {
234
- ...(content.post as unknown as IForumPost),
305
+ ...(postSource as unknown as IForumPost),
235
306
  ...(fetchedPostData || {}),
236
307
  comments_count: commentCount,
237
308
  }
@@ -350,7 +421,8 @@ const CommunityPost1: React.FC<ILevoBlockBaseProps<ICommunityPost1Content>> = ({
350
421
  <ForumPost
351
422
  post={postWithVotes}
352
423
  isRenderedSolo
353
- postDetailPageBaseURL={content?.post_detail_page_url || ""}
424
+ postDetailPageURLPattern={postDetailPageURLPattern}
425
+ postListingPageURL={postListingPageURL}
354
426
  forumKey={forumKey}
355
427
  actionsLoadingState={{
356
428
  comments: isLoadingPostData,
@@ -11,6 +11,28 @@ const DUMMY_IMAGE = {
11
11
  },
12
12
  };
13
13
 
14
+ const CALENDAR_ICON = {
15
+ kind: "icon",
16
+ data: {
17
+ id: "calendar-1",
18
+ label: "Calendar 1",
19
+ tags: ["calendar", "custom", "time"],
20
+ svgCode:
21
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M8 5.75C7.59 5.75 7.25 5.41 7.25 5V2C7.25 1.59 7.59 1.25 8 1.25C8.41 1.25 8.75 1.59 8.75 2V5C8.75 5.41 8.41 5.75 8 5.75Z" fill="var(--color-icon-primary)"/>\n<path d="M16 5.75C15.59 5.75 15.25 5.41 15.25 5V2C15.25 1.59 15.59 1.25 16 1.25C16.41 1.25 16.75 1.59 16.75 2V5C16.75 5.41 16.41 5.75 16 5.75Z" fill="var(--color-icon-primary)"/>\n<path d="M8.5 14.5001C8.37 14.5001 8.24 14.4701 8.12 14.4201C7.99 14.3701 7.89 14.3001 7.79 14.2101C7.61 14.0201 7.5 13.7701 7.5 13.5001C7.5 13.3701 7.53 13.2401 7.58 13.1201C7.63 13.0001 7.7 12.8901 7.79 12.7901C7.89 12.7001 7.99 12.6301 8.12 12.5801C8.48 12.4301 8.93 12.5101 9.21 12.7901C9.39 12.9801 9.5 13.2401 9.5 13.5001C9.5 13.5601 9.49 13.6301 9.48 13.7001C9.47 13.7601 9.45 13.8201 9.42 13.8801C9.4 13.9401 9.37 14.0001 9.33 14.0601C9.3 14.1101 9.25 14.1601 9.21 14.2101C9.02 14.3901 8.76 14.5001 8.5 14.5001Z" fill="var(--color-icon-primary)"/>\n<path d="M12 14.5C11.87 14.5 11.74 14.47 11.62 14.42C11.49 14.37 11.39 14.3 11.29 14.21C11.11 14.02 11 13.77 11 13.5C11 13.37 11.03 13.24 11.08 13.12C11.13 13 11.2 12.89 11.29 12.79C11.39 12.7 11.49 12.63 11.62 12.58C11.98 12.42 12.43 12.51 12.71 12.79C12.89 12.98 13 13.24 13 13.5C13 13.56 12.99 13.63 12.98 13.7C12.97 13.76 12.95 13.82 12.92 13.88C12.9 13.94 12.87 14 12.83 14.06C12.8 14.11 12.75 14.16 12.71 14.21C12.52 14.39 12.26 14.5 12 14.5Z" fill="var(--color-icon-primary)"/>\n<path d="M15.5 14.5C15.37 14.5 15.24 14.47 15.12 14.42C14.99 14.37 14.89 14.3 14.79 14.21C14.75 14.16 14.71 14.11 14.67 14.06C14.63 14 14.6 13.94 14.58 13.88C14.55 13.82 14.53 13.76 14.52 13.7C14.51 13.63 14.5 13.56 14.5 13.5C14.5 13.24 14.61 12.98 14.79 12.79C14.89 12.7 14.99 12.63 15.12 12.58C15.49 12.42 15.93 12.51 16.21 12.79C16.39 12.98 16.5 13.24 16.5 13.5C16.5 13.56 16.49 13.63 16.48 13.7C16.47 13.76 16.45 13.82 16.42 13.88C16.4 13.94 16.37 14 16.33 14.06C16.3 14.11 16.25 14.16 16.21 14.21C16.02 14.39 15.76 14.5 15.5 14.5Z" fill="var(--color-icon-primary)"/>\n<path d="M8.5 17.9999C8.37 17.9999 8.24 17.97 8.12 17.92C8 17.87 7.89 17.7999 7.79 17.7099C7.61 17.5199 7.5 17.2599 7.5 16.9999C7.5 16.8699 7.53 16.7399 7.58 16.6199C7.63 16.4899 7.7 16.38 7.79 16.29C8.16 15.92 8.84 15.92 9.21 16.29C9.39 16.48 9.5 16.7399 9.5 16.9999C9.5 17.2599 9.39 17.5199 9.21 17.7099C9.02 17.8899 8.76 17.9999 8.5 17.9999Z" fill="var(--color-icon-primary)"/>\n<path d="M12 17.9999C11.74 17.9999 11.48 17.8899 11.29 17.7099C11.11 17.5199 11 17.2599 11 16.9999C11 16.8699 11.03 16.7399 11.08 16.6199C11.13 16.4899 11.2 16.38 11.29 16.29C11.66 15.92 12.34 15.92 12.71 16.29C12.8 16.38 12.87 16.4899 12.92 16.6199C12.97 16.7399 13 16.8699 13 16.9999C13 17.2599 12.89 17.5199 12.71 17.7099C12.52 17.8899 12.26 17.9999 12 17.9999Z" fill="var(--color-icon-primary)"/>\n<path d="M15.5 18C15.24 18 14.98 17.89 14.79 17.71C14.7 17.62 14.63 17.51 14.58 17.38C14.53 17.26 14.5 17.13 14.5 17C14.5 16.87 14.53 16.74 14.58 16.62C14.63 16.49 14.7 16.38 14.79 16.29C15.02 16.06 15.37 15.95 15.69 16.02C15.76 16.03 15.82 16.05 15.88 16.08C15.94 16.1 16 16.13 16.06 16.17C16.11 16.2 16.16 16.25 16.21 16.29C16.39 16.48 16.5 16.74 16.5 17C16.5 17.26 16.39 17.52 16.21 17.71C16.02 17.89 15.76 18 15.5 18Z" fill="var(--color-icon-primary)"/>\n<path d="M20.5 9.83997H3.5C3.09 9.83997 2.75 9.49997 2.75 9.08997C2.75 8.67997 3.09 8.33997 3.5 8.33997H20.5C20.91 8.33997 21.25 8.67997 21.25 9.08997C21.25 9.49997 20.91 9.83997 20.5 9.83997Z" fill="var(--color-icon-primary)"/>\n<path d="M16 22.75H8C4.35 22.75 2.25 20.65 2.25 17V8.5C2.25 4.85 4.35 2.75 8 2.75H16C19.65 2.75 21.75 4.85 21.75 8.5V17C21.75 20.65 19.65 22.75 16 22.75ZM8 4.25C5.14 4.25 3.75 5.64 3.75 8.5V17C3.75 19.86 5.14 21.25 8 21.25H16C18.86 21.25 20.25 19.86 20.25 17V8.5C20.25 5.64 18.86 4.25 16 4.25H8Z" fill="var(--color-icon-primary)"/>\n</svg>',
22
+ },
23
+ };
24
+
25
+ const TIME_ICON = {
26
+ kind: "icon",
27
+ data: {
28
+ id: "clock",
29
+ label: "Clock",
30
+ tags: ["clock", "custom", "directional", "time"],
31
+ svgCode:
32
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M12 22.75C6.07 22.75 1.25 17.93 1.25 12C1.25 6.07 6.07 1.25 12 1.25C17.93 1.25 22.75 6.07 22.75 12C22.75 17.93 17.93 22.75 12 22.75ZM12 2.75C6.9 2.75 2.75 6.9 2.75 12C2.75 17.1 6.9 21.25 12 21.25C17.1 21.25 21.25 17.1 21.25 12C21.25 6.9 17.1 2.75 12 2.75Z" fill="var(--color-icon-primary)"/>\n<path d="M15.7096 15.93C15.5796 15.93 15.4496 15.9 15.3296 15.82L12.2296 13.97C11.4596 13.51 10.8896 12.5 10.8896 11.61V7.51001C10.8896 7.10001 11.2296 6.76001 11.6396 6.76001C12.0496 6.76001 12.3896 7.10001 12.3896 7.51001V11.61C12.3896 11.97 12.6896 12.5 12.9996 12.68L16.0996 14.53C16.4596 14.74 16.5696 15.2 16.3596 15.56C16.2096 15.8 15.9596 15.93 15.7096 15.93Z" fill="var(--color-icon-primary)"/>\n</svg>',
33
+ },
34
+ };
35
+
14
36
  const DEFAULT_CONTENT = {
15
37
  layout: null,
16
38
  container: null,
@@ -33,13 +55,13 @@ const DEFAULT_CONTENT = {
33
55
  title: "Annual Technology Summit 2024",
34
56
  "event-info": null,
35
57
  "start-date-wrapper": null,
36
- "date-icon": DUMMY_IMAGE,
58
+ "date-icon": CALENDAR_ICON,
37
59
  "start-date": "March 15, 2024",
38
60
  "end-date-wrapper": null,
39
- "end-date-icon": DUMMY_IMAGE,
61
+ "end-date-icon": CALENDAR_ICON,
40
62
  "end-date": "March 15, 2024",
41
63
  "time-wrapper": null,
42
- "time-icon": DUMMY_IMAGE,
64
+ "time-icon": TIME_ICON,
43
65
  "time-range": "09:00 AM - 05:00 PM",
44
66
  "kind-wrapper": null,
45
67
  "kind-icon": DUMMY_IMAGE,