@levo-so/blocks 0.1.81 → 0.1.83
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.
- package/package.json +8 -5
- package/src/blocks/blogs/blog-post-1.schema.ts +7 -4
- package/src/blocks/blogs/blog-post-1.tsx +1 -1
- package/src/blocks/cards/cards-19.schema.ts +1341 -0
- package/src/blocks/cards/cards-19.tsx +89 -0
- package/src/blocks/cards/cards-20.schema.ts +536 -0
- package/src/blocks/cards/cards-20.tsx +85 -0
- package/src/blocks/cards/cards-21.schema.ts +611 -0
- package/src/blocks/cards/cards-21.tsx +93 -0
- package/src/blocks/cards/cards-22.schema.ts +3488 -0
- package/src/blocks/cards/cards-22.tsx +100 -0
- package/src/blocks/cards/cards-23.schema.ts +388 -0
- package/src/blocks/cards/cards-23.tsx +66 -0
- package/src/blocks/community/MEMBER_RESPONSE.ts +141 -0
- package/src/blocks/community/community-1.schema.ts +1 -6
- package/src/blocks/community/community-1.tsx +70 -6
- package/src/blocks/community/community-post-1.schema.ts +1 -5
- package/src/blocks/community/community-post-1.tsx +85 -13
- package/src/blocks/event/event-details.schema.ts +25 -3
- package/src/blocks/index.ts +148 -122
- package/src/index.ts +1 -2
- package/src/schemas/blocks.ts +10 -0
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
(
|
|
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
|
-
|
|
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 =
|
|
303
|
+
const postWithVotes: IForumPost | null = postSource
|
|
233
304
|
? {
|
|
234
|
-
...(
|
|
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
|
-
|
|
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":
|
|
58
|
+
"date-icon": CALENDAR_ICON,
|
|
37
59
|
"start-date": "March 15, 2024",
|
|
38
60
|
"end-date-wrapper": null,
|
|
39
|
-
"end-date-icon":
|
|
61
|
+
"end-date-icon": CALENDAR_ICON,
|
|
40
62
|
"end-date": "March 15, 2024",
|
|
41
63
|
"time-wrapper": null,
|
|
42
|
-
"time-icon":
|
|
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,
|