@weaverse/react 0.6.15 → 0.6.18

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/dist/index.js CHANGED
@@ -62,232 +62,184 @@ module.exports = __toCommonJS(src_exports);
62
62
 
63
63
  // src/context.ts
64
64
  var import_core = require("@weaverse/core");
65
- var import_react9 = require("react");
66
-
67
- // src/elements/base.tsx
68
- var import_react = __toESM(require("react"));
69
- var BaseElement = import_react.default.forwardRef((_a, ref) => {
70
- var _b = _a, { tag, children } = _b, props = __objRest(_b, ["tag", "children"]);
71
- return import_react.default.createElement(tag, __spreadValues({
72
- ref
73
- }, props), children);
74
- });
75
- BaseElement.defaultProps = {
76
- tag: "div",
77
- style: {}
78
- };
79
- var schema = {
80
- type: "base",
81
- parentType: "container",
82
- title: "Base",
83
- settings: []
84
- };
85
- var base_default = BaseElement;
65
+ var import_react10 = require("react");
86
66
 
87
67
  // src/elements/button.tsx
88
- var React2 = __toESM(require("react"));
89
- var Button = React2.forwardRef((props, ref) => {
90
- const _a = props, { buttonType, css, openInNewTab = false, target = "" } = _a, rest = __objRest(_a, ["buttonType", "css", "openInNewTab", "target"]);
68
+ var React = __toESM(require("react"));
69
+ var Button = React.forwardRef((props, ref) => {
70
+ const _a = props, { openInNewTab, target, value } = _a, rest = __objRest(_a, ["openInNewTab", "target", "value"]);
91
71
  if (target) {
92
- return /* @__PURE__ */ React2.createElement("a", {
72
+ return /* @__PURE__ */ React.createElement("a", __spreadProps(__spreadValues({
93
73
  href: target,
94
- target: openInNewTab ? "_blank" : "_self"
95
- }, /* @__PURE__ */ React2.createElement("button", __spreadValues({
74
+ target: openInNewTab ? "_blank" : "_self",
75
+ rel: "noreferrer"
76
+ }, rest), {
96
77
  ref
97
- }, rest), props.value));
78
+ }), value);
98
79
  }
99
- return /* @__PURE__ */ React2.createElement("button", __spreadValues({
80
+ return /* @__PURE__ */ React.createElement("button", __spreadValues({
100
81
  ref
101
- }, rest), props.value);
82
+ }, rest), value);
102
83
  });
103
84
  Button.defaultProps = {
104
- value: "Shop now"
105
- };
106
- var schema2 = {
107
- title: "Button",
85
+ value: "Shop now",
86
+ openInNewTab: false,
87
+ target: "",
108
88
  type: "button",
109
- parentType: "container",
110
- styles: [
111
- {
112
- type: "dimensions"
113
- },
114
- {
115
- type: "alignment"
116
- },
117
- {
118
- type: "border"
119
- },
120
- {
121
- type: "background"
122
- },
123
- {
124
- type: "spacing"
125
- }
126
- ],
127
- settings: [],
128
- toolbar: [
129
- {
130
- type: "delete"
131
- },
132
- {
133
- type: "duplicate"
134
- },
135
- {
136
- type: "link"
137
- },
138
- {
139
- type: "color"
89
+ css: {
90
+ "@desktop": {
91
+ borderRadius: "72px",
92
+ border: "none",
93
+ backgroundColor: "#0F71FF",
94
+ color: "#fff",
95
+ fontSize: "13px",
96
+ padding: "10px 20px"
140
97
  }
141
- ],
142
- data: {
143
- css: {
144
- "@desktop": {
145
- borderRadius: "72px",
146
- border: "none",
147
- backgroundColor: "#0F71FF",
148
- color: "#fff",
149
- fontSize: "13px",
150
- padding: "10px 20px"
151
- }
152
- },
153
- target: "",
154
- openInNewTab: false
155
- },
156
- flags: {
157
- draggable: true
158
98
  }
159
99
  };
160
100
  var button_default = Button;
161
101
 
162
102
  // src/elements/container.tsx
163
- var import_react2 = __toESM(require("react"));
164
- var Container = (0, import_react2.forwardRef)((props, ref) => {
165
- return /* @__PURE__ */ import_react2.default.createElement("div", __spreadValues({
103
+ var import_react = __toESM(require("react"));
104
+ var Container = (0, import_react.forwardRef)((props, ref) => {
105
+ return /* @__PURE__ */ import_react.default.createElement("div", __spreadValues({
166
106
  ref
167
107
  }, props));
168
108
  });
169
- var schema3 = {
170
- title: "Container",
171
- type: "container",
172
- parentType: "layout",
173
- data: {
174
- css: {
175
- "@desktop": {
176
- display: "flex",
177
- backgroundColor: "rgba(248,203,203,0.38)",
178
- flexDirection: "column",
179
- alignItems: "flex-start",
180
- justifyContent: "flex-start",
181
- textAlign: "left",
182
- gridArea: "1 / 1 / 3 / 6",
183
- width: "100%",
184
- height: "fit-content"
185
- }
109
+ Container.defaultProps = {
110
+ css: {
111
+ "@desktop": {
112
+ alignItems: "flex-start",
113
+ backgroundColor: "rgba(248,203,203,0.38)",
114
+ display: "flex",
115
+ flexDirection: "column",
116
+ gridArea: "1 / 1 / 3 / 6",
117
+ height: "fit-content",
118
+ justifyContent: "flex-start",
119
+ overflow: "hidden",
120
+ textAlign: "left",
121
+ width: "100%"
186
122
  }
187
- },
188
- settings: [],
189
- flags: {
190
- draggable: true,
191
- resizable: true,
192
- sortable: true
193
123
  }
194
124
  };
195
125
  var container_default = Container;
196
126
 
197
- // src/elements/layout.tsx
127
+ // src/elements/countdown/index.tsx
198
128
  var import_react3 = __toESM(require("react"));
199
- var Layout = (0, import_react3.forwardRef)((props, ref) => {
200
- const _a = props, { css, children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["css", "children", "rows", "gap", "rowSize", "columns", "gridSize"]);
201
- return /* @__PURE__ */ import_react3.default.createElement("section", __spreadValues({
202
- ref,
203
- style: {
204
- "--grid-size": gridSize + "px",
205
- "--rows": rows,
206
- "--columns": columns,
207
- "--gap": gap + "px",
208
- "--row-size": rowSize + "px",
209
- "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
210
- }
211
- }, rest), /* @__PURE__ */ import_react3.default.createElement("div", {
212
- "data-layout-content": true
213
- }, children));
214
- });
215
- var schema4 = {
216
- title: "Layout",
217
- type: "layout",
218
- parentType: "root",
219
- data: {
220
- css: {
221
- "@desktop": {
222
- paddingTop: "16px",
223
- paddingBottom: "16px",
224
- paddingLeft: "var(--gap)",
225
- paddingRight: "var(--gap)",
226
- "> [data-layout-content]": {
227
- margin: "0 auto",
228
- display: "grid !important",
229
- gridTemplateRows: "repeat(var(--rows), var(--row-size))",
230
- gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
231
- gap: "var(--gap)",
232
- maxWidth: "var(--grid-size)"
233
- }
234
- },
235
- "@mobile": {
236
- padding: "0 16px",
237
- "> [data-layout-content]": {
238
- display: "flex !important",
239
- flexDirection: "column"
240
- }
241
- }
242
- },
243
- gridSize: 1224,
244
- rows: 12,
245
- columns: 12,
246
- gap: 16,
247
- rowSize: 48
248
- },
249
- settings: []
250
- };
251
- var layout_default = Layout;
252
129
 
253
- // src/elements/text.tsx
254
- var React5 = __toESM(require("react"));
255
- var Text = React5.forwardRef((props, ref) => {
256
- let _a = props, { children, value } = _a, rest = __objRest(_a, ["children", "value"]);
257
- return /* @__PURE__ */ React5.createElement("div", __spreadProps(__spreadValues({
130
+ // src/elements/countdown/timer-block.tsx
131
+ var import_react2 = __toESM(require("react"));
132
+ function TimerBlock({ value, label }) {
133
+ return /* @__PURE__ */ import_react2.default.createElement("div", null, /* @__PURE__ */ import_react2.default.createElement("div", {
134
+ className: "wv-countdown-number"
135
+ }, value.toString().padStart(2, "0")), label && /* @__PURE__ */ import_react2.default.createElement("div", {
136
+ className: "wv-countdown-label"
137
+ }, label));
138
+ }
139
+
140
+ // src/elements/countdown/utils.ts
141
+ var times = ["days", "hours", "minutes", "seconds"];
142
+ function getTime(_seconds) {
143
+ const ONE_MINUTE = 60 * 1e3;
144
+ const ONE_HOUR = 60 * ONE_MINUTE;
145
+ const ONE_DAY = 24 * ONE_HOUR;
146
+ const days = Math.floor(_seconds / ONE_DAY);
147
+ const hours = Math.floor((_seconds - days * ONE_DAY) / ONE_HOUR);
148
+ const minutes = Math.floor((_seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE);
149
+ const seconds = Math.floor((_seconds - days * ONE_DAY - hours * ONE_HOUR - minutes * ONE_MINUTE) / 1e3);
150
+ return { days, hours, minutes, seconds };
151
+ }
152
+
153
+ // src/elements/countdown/index.tsx
154
+ var Countdown = (0, import_react3.forwardRef)((props, ref) => {
155
+ const { isDesignMode } = (0, import_react3.useContext)(WeaverseContext);
156
+ let _a = props, {
157
+ timerType,
158
+ startTime,
159
+ endTime,
160
+ periods,
161
+ redirectUrl,
162
+ openInNewTab,
163
+ showColon,
164
+ showLabel
165
+ } = _a, rest = __objRest(_a, [
166
+ "timerType",
167
+ "startTime",
168
+ "endTime",
169
+ "periods",
170
+ "redirectUrl",
171
+ "openInNewTab",
172
+ "showColon",
173
+ "showLabel"
174
+ ]);
175
+ const [remaining, setRemaining] = import_react3.default.useState(0);
176
+ if (typeof endTime !== "number") {
177
+ endTime = Number.parseInt(endTime);
178
+ }
179
+ (0, import_react3.useEffect)(() => {
180
+ const flag = setInterval(() => {
181
+ const remainingTime = Math.max((timerType === "specific" ? new Date(endTime).getTime() : new Date(startTime).getTime() + periods * 60 * 1e3) - Date.now(), 0);
182
+ if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
183
+ window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
184
+ }
185
+ setRemaining(remainingTime);
186
+ }, 1e3);
187
+ return () => {
188
+ clearInterval(flag);
189
+ };
190
+ }, [startTime, endTime, periods, timerType]);
191
+ const timer = getTime(remaining);
192
+ return /* @__PURE__ */ import_react3.default.createElement("div", __spreadValues({
258
193
  ref
259
- }, rest), {
260
- dangerouslySetInnerHTML: { __html: value }
194
+ }, rest), times.map((time) => {
195
+ return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, {
196
+ key: time
197
+ }, /* @__PURE__ */ import_react3.default.createElement(TimerBlock, {
198
+ label: showLabel ? time : "",
199
+ value: timer[time]
200
+ }), time !== "seconds" && /* @__PURE__ */ import_react3.default.createElement("span", {
201
+ className: `wv-countdown-number ${showColon ? "" : "hidden"}`
202
+ }, ":"));
261
203
  }));
262
204
  });
263
- Text.defaultProps = {
264
- value: "sample text"
265
- };
266
- var schema5 = {
267
- type: "text",
268
- parentType: "container",
269
- title: "Text",
270
- settings: [],
271
- data: {
272
- css: {
273
- "@desktop": {
274
- width: "100%",
275
- height: "fit-content",
276
- padding: 0,
277
- margin: 0,
278
- outline: "none",
279
- wordBreak: "break-word",
280
- overflowWrap: "break-word",
281
- whiteSpace: "break-spaces"
205
+ Countdown.defaultProps = {
206
+ timerType: "specific",
207
+ startTime: Date.now(),
208
+ endTime: 1661140528e3,
209
+ periods: 90,
210
+ redirectUrl: "https://myshop.com",
211
+ openInNewTab: false,
212
+ showLabel: true,
213
+ showColon: true,
214
+ css: {
215
+ "@desktop": {
216
+ fontFamily: "Inter",
217
+ fontSize: 36,
218
+ fontWeight: 500,
219
+ display: "grid",
220
+ gridAutoFlow: "column",
221
+ gap: 10,
222
+ "& > div": {
223
+ width: 48,
224
+ textAlign: "center"
225
+ },
226
+ "& .wv-countdown-label": {
227
+ fontSize: 10
228
+ },
229
+ "& > span": {
230
+ lineHeight: "100%"
231
+ },
232
+ "& .hidden": {
233
+ visibility: "hidden"
282
234
  }
283
235
  }
284
236
  }
285
237
  };
286
- var text_default = Text;
238
+ var countdown_default = Countdown;
287
239
 
288
240
  // src/elements/image.tsx
289
241
  var import_react4 = __toESM(require("react"));
290
- var Image = import_react4.default.forwardRef(function Image2(props, ref) {
242
+ var Image = import_react4.default.forwardRef((props, ref) => {
291
243
  let _a = props, { src, alt, children } = _a, rest = __objRest(_a, ["src", "alt", "children"]);
292
244
  return /* @__PURE__ */ import_react4.default.createElement("img", __spreadProps(__spreadValues({
293
245
  ref
@@ -298,101 +250,77 @@ var Image = import_react4.default.forwardRef(function Image2(props, ref) {
298
250
  });
299
251
  Image.defaultProps = {
300
252
  src: "https://ucarecdn.com/1cdc9d39-ca62-492e-8ec7-f1a86b241a90/",
301
- alt: "weaverse image element"
302
- };
303
- var schema6 = {
304
- settings: [],
305
- type: "image",
306
- parentType: "layout",
307
- title: "Image",
308
- data: {
309
- css: {
310
- "@desktop": {
311
- width: "100%",
312
- height: "100%",
313
- objectFit: "cover"
314
- },
315
- "@mobile": {
316
- display: "block"
317
- }
253
+ alt: "weaverse image element",
254
+ css: {
255
+ "@desktop": {
256
+ width: "100%",
257
+ height: "100%",
258
+ objectFit: "cover"
259
+ },
260
+ "@mobile": {
261
+ display: "block"
318
262
  }
319
- },
320
- flags: {
321
- resizable: true,
322
- draggable: true,
323
- sortable: true
324
263
  }
325
264
  };
326
265
  var image_default = Image;
327
266
 
328
- // src/elements/video.tsx
267
+ // src/elements/layout.tsx
329
268
  var import_react5 = __toESM(require("react"));
330
- var Video = (0, import_react5.forwardRef)((props, ref) => {
331
- const { isDesignMode } = (0, import_react5.useContext)(WeaverseContext);
332
- let _a = props, { src, type, controls, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "autoPlay", "loop", "muted"]);
333
- if (isDesignMode) {
334
- controls = false;
335
- autoPlay = false;
336
- }
337
- console.info("9779 props", props, isDesignMode);
338
- return /* @__PURE__ */ import_react5.default.createElement("video", __spreadValues({
269
+ var Layout = (0, import_react5.forwardRef)((props, ref) => {
270
+ let _a = props, { children, rows, gap, rowSize, columns, gridSize } = _a, rest = __objRest(_a, ["children", "rows", "gap", "rowSize", "columns", "gridSize"]);
271
+ return /* @__PURE__ */ import_react5.default.createElement("section", __spreadValues({
339
272
  ref,
340
- controls,
341
- autoPlay,
342
- loop,
343
- muted: true
344
- }, rest), /* @__PURE__ */ import_react5.default.createElement("source", {
345
- src,
346
- type: type || "video/mp4",
347
- controlsList: "nodownload",
348
- disablePictureInPicture: true
349
- }));
273
+ style: {
274
+ "--grid-size": gridSize + "px",
275
+ "--rows": rows,
276
+ "--columns": columns,
277
+ "--gap": gap + "px",
278
+ "--row-size": rowSize + "px",
279
+ "--col-size": "calc((var(--grid-size) - calc(var(--columns) - 1) * var(--gap)) / var(--columns))"
280
+ }
281
+ }, rest), /* @__PURE__ */ import_react5.default.createElement("div", {
282
+ "data-layout-content": true
283
+ }, children));
350
284
  });
351
- Video.defaultProps = {
352
- src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
353
- poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
354
- loop: false,
355
- type: "video/mp4",
356
- controls: false,
357
- autoPlay: true,
358
- muted: true,
359
- width: "100%",
360
- height: "auto"
361
- };
362
- var schema7 = {
363
- title: "Video",
364
- type: "video",
365
- parentType: "layout",
366
- toolbar: [
367
- {
368
- type: "delete"
369
- },
370
- {
371
- type: "duplicate"
372
- },
373
- {
374
- type: "link"
285
+ Layout.defaultProps = {
286
+ gridSize: 1224,
287
+ rows: 12,
288
+ columns: 12,
289
+ gap: 16,
290
+ rowSize: 48,
291
+ css: {
292
+ "@desktop": {
293
+ paddingTop: "16px",
294
+ paddingBottom: "16px",
295
+ paddingLeft: "var(--gap)",
296
+ paddingRight: "var(--gap)",
297
+ "> [data-layout-content]": {
298
+ margin: "0 auto",
299
+ display: "grid !important",
300
+ gridTemplateRows: "repeat(var(--rows), var(--row-size))",
301
+ gridTemplateColumns: "repeat(var(--columns), minmax(0, var(--col-size)))",
302
+ gap: "var(--gap)",
303
+ maxWidth: "var(--grid-size)"
304
+ }
375
305
  },
376
- {
377
- type: "color"
306
+ "@mobile": {
307
+ padding: "0 16px",
308
+ "> [data-layout-content]": {
309
+ display: "flex !important",
310
+ flexDirection: "column"
311
+ }
378
312
  }
379
- ],
380
- flags: {
381
- resizable: true,
382
- draggable: true,
383
- sortable: true
384
313
  }
385
314
  };
386
- var video_default = Video;
315
+ var layout_default = Layout;
387
316
 
388
317
  // src/elements/map.tsx
389
318
  var import_react6 = __toESM(require("react"));
390
319
  var Map = (0, import_react6.forwardRef)((props, ref) => {
391
- const { place, zoom } = props;
392
- console.info("9779 props", props);
320
+ const _a = props, { place, zoom } = _a, rest = __objRest(_a, ["place", "zoom"]);
393
321
  return /* @__PURE__ */ import_react6.default.createElement("div", __spreadValues({
394
322
  ref
395
- }, props), /* @__PURE__ */ import_react6.default.createElement("iframe", {
323
+ }, rest), /* @__PURE__ */ import_react6.default.createElement("iframe", {
396
324
  loading: "lazy",
397
325
  scrolling: "no",
398
326
  width: "100%",
@@ -406,203 +334,224 @@ var Map = (0, import_react6.forwardRef)((props, ref) => {
406
334
  });
407
335
  Map.defaultProps = {
408
336
  place: "Hanoi",
409
- zoom: 14
410
- };
411
- var schema8 = {
412
- title: "Map",
413
- type: "map",
414
- parentType: "layout",
415
- toolbar: [
416
- {
417
- type: "delete"
418
- },
419
- {
420
- type: "duplicate"
421
- },
422
- {
423
- type: "link"
424
- },
425
- {
426
- type: "color"
427
- }
428
- ],
429
- data: {
430
- css: {
431
- "@desktop": {
432
- gridArea: "1 / 1 / 11 / 13"
433
- }
337
+ zoom: 14,
338
+ css: {
339
+ "@desktop": {
340
+ gridArea: "1 / 1 / 11 / 13"
434
341
  }
435
- },
436
- flags: {
437
- resizable: true,
438
- draggable: true,
439
- sortable: true
440
342
  }
441
343
  };
442
344
  var map_default = Map;
443
345
 
444
- // src/elements/countdown/index.tsx
445
- var import_react8 = __toESM(require("react"));
446
-
447
- // src/elements/countdown/utils.ts
448
- function getTime(seconds) {
449
- const ONE_MINUTE = 60 * 1e3;
450
- const ONE_HOUR = 60 * ONE_MINUTE;
451
- const ONE_DAY = 24 * ONE_HOUR;
452
- const days = Math.floor(seconds / ONE_DAY);
453
- const hours = Math.floor((seconds - days * ONE_DAY) / ONE_HOUR);
454
- const mins = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR) / ONE_MINUTE);
455
- const secs = Math.floor((seconds - days * ONE_DAY - hours * ONE_HOUR - mins * ONE_MINUTE) / 1e3);
456
- return { days, hours, mins, secs };
457
- }
346
+ // src/elements/text.tsx
347
+ var React8 = __toESM(require("react"));
348
+ var Text = React8.forwardRef((props, ref) => {
349
+ let _a = props, { children, value } = _a, rest = __objRest(_a, ["children", "value"]);
350
+ return /* @__PURE__ */ React8.createElement("div", __spreadProps(__spreadValues({
351
+ ref
352
+ }, rest), {
353
+ dangerouslySetInnerHTML: { __html: value }
354
+ }));
355
+ });
356
+ Text.defaultProps = {
357
+ value: "The quick brown fox jumps over the lazy dog",
358
+ css: {
359
+ "@desktop": {
360
+ width: "100%",
361
+ height: "fit-content",
362
+ padding: 0,
363
+ margin: 0,
364
+ outline: "none",
365
+ wordBreak: "break-word",
366
+ overflowWrap: "break-word",
367
+ whiteSpace: "break-spaces"
368
+ }
369
+ }
370
+ };
371
+ var text_default = Text;
458
372
 
459
- // src/elements/countdown/timer-block.tsx
373
+ // src/elements/video.tsx
460
374
  var import_react7 = __toESM(require("react"));
461
- var TimerBlock = (props) => {
462
- return /* @__PURE__ */ import_react7.default.createElement("div", null, /* @__PURE__ */ import_react7.default.createElement("div", null, props.value.toString().padStart(2, "0")), props.label && /* @__PURE__ */ import_react7.default.createElement("div", {
463
- className: "wv-countdown-label"
464
- }, props.label));
375
+ var Video = (0, import_react7.forwardRef)((props, ref) => {
376
+ const { isDesignMode } = (0, import_react7.useContext)(WeaverseContext);
377
+ let _a = props, { src, type, controls, poster, autoPlay, loop, muted } = _a, rest = __objRest(_a, ["src", "type", "controls", "poster", "autoPlay", "loop", "muted"]);
378
+ return /* @__PURE__ */ import_react7.default.createElement("video", __spreadValues({
379
+ ref,
380
+ controls: isDesignMode ? false : controls,
381
+ autoPlay: isDesignMode ? false : autoPlay,
382
+ loop,
383
+ muted: true,
384
+ controlsList: "nodownload",
385
+ disablePictureInPicture: true
386
+ }, rest), /* @__PURE__ */ import_react7.default.createElement("source", {
387
+ src,
388
+ type: type || "video/mp4"
389
+ }));
390
+ });
391
+ Video.defaultProps = {
392
+ src: "https://ucarecdn.com/7cae0dab-8966-4484-9998-602728c360ca/IMG_0048.MOV",
393
+ poster: "https://ucarecdn.com/48d73272-3fe3-43f6-8b5b-22b68fc5a8c8/section.png",
394
+ loop: false,
395
+ type: "video/mp4",
396
+ controls: false,
397
+ autoPlay: true,
398
+ muted: true,
399
+ css: {
400
+ "@desktop": {
401
+ height: "fit-content",
402
+ margin: 0,
403
+ outline: "none",
404
+ overflowWrap: "break-word",
405
+ padding: 0,
406
+ whitespace: "break-spaces",
407
+ width: "100%",
408
+ wordBreak: "break-word"
409
+ }
410
+ }
465
411
  };
466
- var timer_block_default = TimerBlock;
412
+ var video_default = Video;
467
413
 
468
- // src/elements/countdown/index.tsx
469
- var Countdown = (0, import_react8.forwardRef)((props, ref) => {
470
- const { isDesignMode } = (0, import_react8.useContext)(WeaverseContext);
471
- let { type, startTime, endTime, periods, redirectUrl, openInNewTab, showColon, showLabel } = props;
472
- const [remaining, setRemaining] = import_react8.default.useState(0);
473
- if (typeof endTime !== "number") {
474
- endTime = Number.parseInt(endTime);
475
- }
476
- (0, import_react8.useEffect)(() => {
477
- const flag = setInterval(() => {
478
- const remainingTime = Math.max((type === "specific" ? new Date(endTime).getTime() : new Date(startTime) + periods * 60 * 1e3) - Date.now(), 0);
479
- if (!isDesignMode && redirectUrl && remainingTime > 0 && remainingTime < 1e3) {
480
- window.open(redirectUrl, openInNewTab ? "_blank" : "_self");
481
- }
482
- setRemaining(remainingTime);
483
- }, 1e3);
484
- return () => {
485
- clearInterval(flag);
486
- };
487
- }, [startTime, endTime, periods, type]);
488
- const timer = getTime(remaining);
414
+ // src/elements/instagram.tsx
415
+ var import_react9 = __toESM(require("react"));
416
+
417
+ // src/elements/shared/Placeholder.tsx
418
+ var import_react8 = __toESM(require("react"));
419
+ var Placeholder = (0, import_react8.forwardRef)((props, ref) => {
420
+ let _a = props, { element, children } = _a, rest = __objRest(_a, ["element", "children"]);
421
+ let style = {
422
+ height: "100%",
423
+ display: "flex",
424
+ flexDirection: "column",
425
+ alignItems: "center",
426
+ justifyContent: "center",
427
+ color: "#374151"
428
+ };
489
429
  return /* @__PURE__ */ import_react8.default.createElement("div", __spreadValues({
430
+ style,
490
431
  ref
491
- }, props), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
492
- value: timer.days,
493
- label: showLabel && "days"
494
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
495
- className: !showColon && "hidden"
496
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
497
- value: timer.hours,
498
- label: showLabel && "hours"
499
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
500
- className: !showColon && "hidden"
501
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
502
- value: timer.mins,
503
- label: showLabel && "minutes"
504
- }), /* @__PURE__ */ import_react8.default.createElement("span", {
505
- className: !showColon && "hidden"
506
- }, ":"), /* @__PURE__ */ import_react8.default.createElement(timer_block_default, {
507
- value: timer.secs,
508
- label: showLabel && "seconds"
509
- }));
432
+ }, rest), /* @__PURE__ */ import_react8.default.createElement("div", {
433
+ style: { fontWeight: 600, marginBottom: "10px" }
434
+ }, element), /* @__PURE__ */ import_react8.default.createElement("div", null, children));
510
435
  });
511
- Countdown.defaultProps = {
512
- type: "specific",
513
- startTime: Date.now(),
514
- endTime: 1661140528e3,
515
- redirectUrl: "",
516
- openInNewTab: false,
517
- showLabel: true,
518
- showColon: true
519
- };
520
- var schema9 = {
521
- title: "Countdown",
522
- type: "countdown",
523
- parentType: "container",
524
- toolbar: [
525
- {
526
- type: "delete"
527
- },
528
- {
529
- type: "duplicate"
530
- },
531
- {
532
- type: "link"
533
- },
534
- {
535
- type: "color"
436
+ var Placeholder_default = Placeholder;
437
+
438
+ // src/elements/instagram.tsx
439
+ var INSTAGRAM_API = "https://graph.instagram.com";
440
+ var Instagram = (0, import_react9.forwardRef)((props, ref) => {
441
+ const _a = props, { token, username, numberOfImages, imagesPerRow, gap } = _a, rest = __objRest(_a, ["token", "username", "numberOfImages", "imagesPerRow", "gap"]);
442
+ const [media, setMedia] = (0, import_react9.useState)([]);
443
+ const [error, setError] = (0, import_react9.useState)(null);
444
+ let { isDesignMode } = (0, import_react9.useContext)(WeaverseContext);
445
+ (0, import_react9.useEffect)(() => {
446
+ if (token) {
447
+ let params = new URLSearchParams({
448
+ access_token: token,
449
+ fields: "id,media_type,caption,media_url,permalink"
450
+ });
451
+ fetch(`${INSTAGRAM_API}/me/media?${params.toString()}`).then((res) => res.json()).then((res) => {
452
+ if (res.error) {
453
+ setError(res);
454
+ } else {
455
+ setError(null);
456
+ setMedia([...res.data]);
457
+ }
458
+ }).catch(console.error);
536
459
  }
537
- ],
538
- data: {
539
- css: {
540
- "@desktop": {
541
- fontFamily: "Inter",
542
- fontSize: 36,
543
- fontWeight: 500,
460
+ }, [token]);
461
+ if (!token || error) {
462
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadValues({
463
+ ref
464
+ }, rest), /* @__PURE__ */ import_react9.default.createElement(Placeholder_default, {
465
+ element: "Instagram"
466
+ }, !token ? "Connect your Instagram account to display photos on your site." : "Invalid or expired token!"));
467
+ }
468
+ let style = {
469
+ "--wv-ig-images-per-row": imagesPerRow,
470
+ "--wv-ig-images-gap": gap
471
+ };
472
+ return /* @__PURE__ */ import_react9.default.createElement("div", __spreadProps(__spreadValues({
473
+ ref
474
+ }, rest), {
475
+ style
476
+ }), /* @__PURE__ */ import_react9.default.createElement("div", {
477
+ className: "wv-ig-media-wrapper"
478
+ }, media.slice(0, numberOfImages).map((item) => {
479
+ let linkProps;
480
+ if (!isDesignMode) {
481
+ linkProps = { href: item.permalink, target: "_blank" };
482
+ }
483
+ return /* @__PURE__ */ import_react9.default.createElement("a", __spreadValues({
484
+ key: item.id
485
+ }, linkProps), /* @__PURE__ */ import_react9.default.createElement("img", {
486
+ alt: item.caption,
487
+ src: item.media_url
488
+ }));
489
+ })));
490
+ });
491
+ Instagram.defaultProps = {
492
+ token: "",
493
+ username: "",
494
+ numberOfImages: 8,
495
+ imagesPerRow: 4,
496
+ gap: 0,
497
+ css: {
498
+ "@desktop": {
499
+ ".wv-ig-media-wrapper": {
500
+ overflow: "hidden",
501
+ maxWidth: "100%",
502
+ maxHeight: "100%",
544
503
  display: "grid",
545
- gridAutoFlow: "column",
546
- gap: 10,
547
- "& > div": {
548
- width: 48,
549
- textAlign: "center"
550
- },
551
- "& .wv-countdown-label": {
552
- fontSize: 10
553
- },
554
- "& > span": {
555
- lineHeight: "100%"
556
- },
557
- "& .hidden": {
558
- visibility: "hidden"
504
+ gridTemplateColumns: "repeat(var(--wv-ig-images-per-row, 4), 1fr)",
505
+ gap: "var(--wv-ig-images-gap, 0px)",
506
+ img: {
507
+ aspectRatio: "1 / 1",
508
+ width: "100%",
509
+ height: "100%",
510
+ objectFit: "cover"
559
511
  }
560
512
  }
561
513
  }
562
- },
563
- flags: {
564
- draggable: true
565
514
  }
566
515
  };
567
- var countdown_default = Countdown;
516
+ var instagram_default = Instagram;
568
517
 
569
518
  // src/elements/index.ts
570
519
  var elements = {
520
+ Countdown: {
521
+ Component: countdown_default,
522
+ type: "countdown"
523
+ },
571
524
  Button: {
572
525
  Component: button_default,
573
- schema: schema2
574
- },
575
- BaseElement: {
576
- Component: base_default,
577
- schema
578
- },
579
- Text: {
580
- Component: text_default,
581
- schema: schema5
582
- },
583
- Layout: {
584
- Component: layout_default,
585
- schema: schema4
526
+ type: "button"
586
527
  },
587
528
  Container: {
588
529
  Component: container_default,
589
- schema: schema3
530
+ type: "container"
590
531
  },
591
532
  Image: {
592
533
  Component: image_default,
593
- schema: schema6
534
+ type: "image"
594
535
  },
595
- Video: {
596
- Component: video_default,
597
- schema: schema7
536
+ Instagram: {
537
+ Component: instagram_default,
538
+ type: "instagram"
539
+ },
540
+ Layout: {
541
+ Component: layout_default,
542
+ type: "layout"
598
543
  },
599
544
  Map: {
600
545
  Component: map_default,
601
- schema: schema8
546
+ type: "map"
602
547
  },
603
- Countdown: {
604
- Component: countdown_default,
605
- schema: schema9
548
+ Text: {
549
+ Component: text_default,
550
+ type: "text"
551
+ },
552
+ Video: {
553
+ Component: video_default,
554
+ type: "video"
606
555
  }
607
556
  };
608
557
  var elements_default = elements;
@@ -615,30 +564,31 @@ var createRootContext = (configs) => {
615
564
  });
616
565
  return rootContext;
617
566
  };
618
- var WeaverseContext = (0, import_react9.createContext)({});
567
+ var WeaverseContext = (0, import_react10.createContext)({});
619
568
  var WeaverseContextProvider = WeaverseContext.Provider;
620
569
  var WeaverseContextConsumer = WeaverseContext.Consumer;
621
570
 
622
571
  // src/renderer.tsx
623
572
  var import_core2 = require("@weaverse/core");
624
- var import_react10 = __toESM(require("react"));
573
+ var import_react11 = __toESM(require("react"));
625
574
 
626
575
  // src/utils/index.ts
627
576
  var shortCssObject = (css) => {
628
577
  return {
629
- "@desktop": css[`@desktop`],
630
- "@mobile": css[`@mobile`]
578
+ "@desktop": css["@desktop"],
579
+ "@mobile": css["@mobile"]
631
580
  };
632
581
  };
633
582
  function generateItemClass(instance, stitchesInstance) {
634
- var _a;
583
+ var _a, _b, _c, _d;
635
584
  let { css, className: cls = "" } = instance.data;
585
+ let defaultCss = ((_c = (_b = (_a = instance.Element) == null ? void 0 : _a.Component) == null ? void 0 : _b.defaultProps) == null ? void 0 : _c.css) || {};
636
586
  let className = "";
637
- if (css) {
638
- let formattedCss = shortCssObject(css);
587
+ if (css || defaultCss) {
588
+ let formattedCss = shortCssObject(css || defaultCss);
639
589
  let { className: newClass = "" } = stitchesInstance.css(formattedCss)();
640
590
  let { stitchesClass } = instance;
641
- let otherClass = (((_a = instance.ref.current) == null ? void 0 : _a.className) || "").replace(stitchesClass, "").replace(cls, "").trim();
591
+ let otherClass = (((_d = instance.ref.current) == null ? void 0 : _d.className) || "").replace(stitchesClass, "").replace(cls, "").trim();
642
592
  className = `${cls} ${newClass} ${otherClass}`.trim();
643
593
  instance.stitchesClass = newClass;
644
594
  }
@@ -648,9 +598,9 @@ function generateItemClass(instance, stitchesInstance) {
648
598
  // src/renderer.tsx
649
599
  var WeaverseRoot = ({ context }) => {
650
600
  var _a;
651
- let [, setData] = (0, import_react10.useState)(context.projectData);
652
- let rootRef = (0, import_react10.useRef)();
653
- (0, import_react10.useEffect)(() => {
601
+ let [, setData] = (0, import_react11.useState)(context.projectData);
602
+ let rootRef = (0, import_react11.useRef)();
603
+ (0, import_react11.useEffect)(() => {
654
604
  let update = () => setData({});
655
605
  context.subscribe(update);
656
606
  if (context.projectData) {
@@ -663,21 +613,22 @@ var WeaverseRoot = ({ context }) => {
663
613
  }, []);
664
614
  let eventHandlers = ((_a = context == null ? void 0 : context.studioBridge) == null ? void 0 : _a.eventHandlers) || {};
665
615
  let themeClass = context.stitchesInstance.theme.className;
666
- return /* @__PURE__ */ import_react10.default.createElement("div", __spreadProps(__spreadValues({
616
+ return /* @__PURE__ */ import_react11.default.createElement("div", __spreadProps(__spreadValues({
667
617
  className: `weaverse-content-root ${themeClass}`
668
618
  }, eventHandlers), {
669
619
  ref: rootRef
670
- }), /* @__PURE__ */ import_react10.default.createElement(WeaverseContextProvider, {
620
+ }), /* @__PURE__ */ import_react11.default.createElement(WeaverseContextProvider, {
671
621
  value: context
672
- }, /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
622
+ }, /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
673
623
  id: context.projectData.rootId || 0
674
624
  })));
675
625
  };
676
626
  var ItemComponent = ({ instance }) => {
677
- let { stitchesInstance, elementInstances } = (0, import_react10.useContext)(WeaverseContext);
678
- let [data, setData] = (0, import_react10.useState)(instance.data);
679
- let _a = data, { id, type, childIds = [], css, className: cls = "" } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
680
- (0, import_react10.useEffect)(() => {
627
+ let { stitchesInstance, elementInstances } = (0, import_react11.useContext)(WeaverseContext);
628
+ let [data, setData] = (0, import_react11.useState)(instance.data);
629
+ let _a = data, { id, type, childIds = [], css, className } = _a, rest = __objRest(_a, ["id", "type", "childIds", "css", "className"]);
630
+ (0, import_react11.useEffect)(() => {
631
+ var _a2;
681
632
  let update = (data2) => setData(__spreadValues({}, data2));
682
633
  instance.subscribe(update);
683
634
  if (import_core2.isBrowser && !instance.ref.current) {
@@ -685,22 +636,23 @@ var ItemComponent = ({ instance }) => {
685
636
  current: document.querySelector(`[data-wv-id="${id}"]`)
686
637
  });
687
638
  }
639
+ (_a2 = instance.ref.current) == null ? void 0 : _a2.removeAttribute("css");
688
640
  return () => {
689
641
  instance.unsubscribe(update);
690
642
  };
691
643
  }, []);
692
- let Element = elementInstances.get(type || "base");
644
+ let Element = elementInstances.get(type);
693
645
  if (Element == null ? void 0 : Element.Component) {
694
646
  let Component = Element.Component;
695
647
  if (Component.$$typeof === Symbol.for("react.forward_ref")) {
696
648
  rest.ref = instance.ref;
697
649
  }
698
- return /* @__PURE__ */ import_react10.default.createElement(Component, __spreadValues({
650
+ return /* @__PURE__ */ import_react11.default.createElement(Component, __spreadValues({
699
651
  key: id,
700
652
  "data-wv-type": type,
701
653
  "data-wv-id": id,
702
654
  className: generateItemClass(instance, stitchesInstance)
703
- }, rest), childIds.map((id2) => /* @__PURE__ */ import_react10.default.createElement(ItemInstance, {
655
+ }, rest), childIds.map((id2) => /* @__PURE__ */ import_react11.default.createElement(ItemInstance, {
704
656
  key: id2,
705
657
  id: id2
706
658
  })));
@@ -708,15 +660,15 @@ var ItemComponent = ({ instance }) => {
708
660
  return null;
709
661
  };
710
662
  var ItemInstance = ({ id }) => {
711
- let context = (0, import_react10.useContext)(WeaverseContext);
663
+ let context = (0, import_react11.useContext)(WeaverseContext);
712
664
  let { itemInstances } = context;
713
665
  let instance = itemInstances.get(id);
714
666
  if (!instance) {
715
- return /* @__PURE__ */ import_react10.default.createElement("div", {
667
+ return /* @__PURE__ */ import_react11.default.createElement("div", {
716
668
  style: { display: "none" }
717
669
  }, "Item instance ", id, " not found");
718
670
  }
719
- return /* @__PURE__ */ import_react10.default.createElement(ItemComponent, {
671
+ return /* @__PURE__ */ import_react11.default.createElement(ItemComponent, {
720
672
  instance
721
673
  });
722
674
  };