@levo-so/studio 0.1.94 → 0.1.96

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 (41) hide show
  1. package/{BillingStep-o2yIMjLk.js → BillingStep-C3jJkLXQ.js} +1 -1
  2. package/{Button-_hpg7Rxx.js → Button-CwN6jTXH.js} +17 -12
  3. package/CollectionField-DnbpB0Z5.js +254 -0
  4. package/CollectionInput-BoNAc4sq.js +132 -0
  5. package/DateTimeWidget-IRleQI-3.js +255 -0
  6. package/{EntryCard-B-feJvrB.js → EntryCard-CZIUBwtE.js} +3 -3
  7. package/{LoginCard-CF9JbU-y.js → LoginCard-Bthy9dcf.js} +3 -3
  8. package/{LoginForm-CdpNCQJa.js → LoginForm-CPMtCyMF.js} +4 -0
  9. package/{LoginModal-ngTHCyli.js → LoginModal-BPI5tOIZ.js} +3 -3
  10. package/{MessageCard-D2uja800.js → MessageCard-BYxgc9dl.js} +2 -2
  11. package/{ModalManager-B7pCzvK1.js → ModalManager-BaIL6HG-.js} +1 -1
  12. package/{PendingApprovalCard-Dut-Xiw1.js → PendingApprovalCard-DEnawzxD.js} +3 -3
  13. package/PhoneWidget-CjhHfwuG.js +100 -0
  14. package/Popover-DHVZdJuv.js +56 -0
  15. package/RichTextWidget-CgT1_zC3.js +1135 -0
  16. package/Tooltip-ByJRyayB.js +78 -0
  17. package/VerifyButton-DFKzKYxC.js +283 -0
  18. package/{bookingCard-CGV9svhn.js → bookingCard-Bw4tvDYh.js} +3 -3
  19. package/collection.d.ts +81 -46
  20. package/collection.js +8 -5
  21. package/dist-D_jY4Tf1.js +3168 -0
  22. package/getFieldValidations-qVzuq6mv.js +195 -0
  23. package/index.d.ts +23 -5
  24. package/index.js +1634 -1420
  25. package/nodeAlignment-CG3qmAuQ.js +180 -0
  26. package/package.json +3 -4
  27. package/studio.css +1 -1
  28. package/theme.cssm-De_pl52g.js +4 -0
  29. package/{utils-KqbqLlMF.js → utils-F6eBcsyI.js} +1 -1
  30. package/widgets-Dvyv5_uj.js +215 -0
  31. package/dist-DDKHTnIW.js +0 -3653
  32. package/widgets-B84lq4lO.js +0 -351
  33. /package/{Beams-CCNNOvfW.js → Beams-Blr-zwvz.js} +0 -0
  34. /package/{Dots-89WGkd-z.js → Dots-DeBKuibU.js} +0 -0
  35. /package/{Gradient-vTa_uWCj.js → Gradient-DGFxOjft.js} +0 -0
  36. /package/{Grid-CrtztrxK.js → Grid-A7HRCQ0T.js} +0 -0
  37. /package/{MessageFooter-Bu-jyPkJ.js → MessageFooter-C6DivT4m.js} +0 -0
  38. /package/{StripePaymentModal-CajqohNM.js → StripePaymentModal-BcePXzmC.js} +0 -0
  39. /package/{Waves-BhA6CLEI.js → Waves-CIT6Ngng.js} +0 -0
  40. /package/{card-DCbhJCO9.js → card-izMd2DvE.js} +0 -0
  41. /package/{dialog-CILIXExr.js → dialog-CCWrvmHd.js} +0 -0
@@ -0,0 +1,195 @@
1
+ import { createContext as e, useContext as t, useEffect as n, useMemo as r, useRef as i } from "react";
2
+ import { jsx as a } from "react/jsx-runtime";
3
+ import { FieldInterfaces as o } from "@levo-so/core";
4
+ import { c as s } from "react/compiler-runtime";
5
+ import c from "clsx";
6
+ import { createRuntimeFn as l } from "@vanilla-extract/recipes/createRuntimeFn";
7
+ import { isValidPhoneNumber as u } from "react-phone-number-input";
8
+ import * as d from "yup";
9
+ //#region ../../libraries/levocn/dist/styles/reset.cssm.js
10
+ var f = "_1er5g5a0", p = /* @__PURE__ */ new Set(), m = {}, h = e(null), g = () => {
11
+ let e = s(1), n = t(h);
12
+ if (!n) {
13
+ let t;
14
+ return e[0] === Symbol.for("react.memo_cache_sentinel") ? (t = {
15
+ portalRef: { current: null },
16
+ classes: p,
17
+ overrides: m
18
+ }, e[0] = t) : t = e[0], t;
19
+ }
20
+ return n;
21
+ }, _ = ({ children: e, cssReset: o, className: s, style: l, ...u }) => {
22
+ let d = t(h), g = i(null), _ = !d && o !== !1 ? f : "", v = d?.classes ?? p, y = d?.overrides ?? m, b = r(() => {
23
+ let e = s ? s.split(/\s+/).filter(Boolean) : [], t = new Set(v);
24
+ for (let n of e) t.add(n);
25
+ return {
26
+ portalRef: g,
27
+ classes: t,
28
+ overrides: {
29
+ ...y,
30
+ ...l
31
+ }
32
+ };
33
+ }, [
34
+ v,
35
+ s,
36
+ y,
37
+ l
38
+ ]);
39
+ n(() => {
40
+ let e = document.createElement("div");
41
+ return document.body.appendChild(e), g.current = e, () => {
42
+ document.body.removeChild(e), g.current = null;
43
+ };
44
+ }, []), n(() => {
45
+ let e = g.current;
46
+ e && (e.className = c(_, ...b.classes), Object.assign(e.style, {
47
+ display: "contents",
48
+ ...b.overrides
49
+ }));
50
+ }, [
51
+ b.classes,
52
+ b.overrides,
53
+ _
54
+ ]);
55
+ let x = c(_, ...s ? s.split(/\s+/).filter((e) => e && !v.has(e)) : []);
56
+ return /* @__PURE__ */ a(h.Provider, {
57
+ value: b,
58
+ children: /* @__PURE__ */ a("div", {
59
+ className: x,
60
+ style: {
61
+ display: "contents",
62
+ ...l
63
+ },
64
+ ...u,
65
+ children: e
66
+ })
67
+ });
68
+ }, v = l({
69
+ defaultClassName: "_1a7d0ek1 _1a7d0ek0",
70
+ variantClassNames: {
71
+ variant: {
72
+ default: "_1a7d0ek2",
73
+ outline: "_1a7d0ek3",
74
+ secondary: "_1a7d0ek4",
75
+ ghost: "_1a7d0ek5",
76
+ destructive: "_1a7d0ek6",
77
+ link: "_1a7d0ek7"
78
+ },
79
+ size: {
80
+ default: "_1a7d0ek8",
81
+ xs: "_1a7d0ek9",
82
+ sm: "_1a7d0eka",
83
+ lg: "_1a7d0ekb",
84
+ icon: "_1a7d0ekc",
85
+ "icon-xs": "_1a7d0ekd",
86
+ "icon-sm": "_1a7d0eke",
87
+ "icon-lg": "_1a7d0ekf"
88
+ }
89
+ },
90
+ defaultVariants: {
91
+ variant: "default",
92
+ size: "default"
93
+ },
94
+ compoundVariants: []
95
+ }), y = (e) => {
96
+ let t = s(14), n, r, i, o, l;
97
+ t[0] === e ? (n = t[1], r = t[2], i = t[3], o = t[4], l = t[5]) : ({className: n, variant: l, size: i, type: o, ...r} = e, t[0] = e, t[1] = n, t[2] = r, t[3] = i, t[4] = o, t[5] = l);
98
+ let u = o === void 0 ? "button" : o, d;
99
+ t[6] !== n || t[7] !== i || t[8] !== l ? (d = c(v({
100
+ variant: l,
101
+ size: i
102
+ }), n), t[6] = n, t[7] = i, t[8] = l, t[9] = d) : d = t[9];
103
+ let f;
104
+ return t[10] !== r || t[11] !== d || t[12] !== u ? (f = /* @__PURE__ */ a("button", {
105
+ "data-slot": "button",
106
+ type: u,
107
+ className: d,
108
+ ...r
109
+ }), t[10] = r, t[11] = d, t[12] = u, t[13] = f) : f = t[13], f;
110
+ }, b = (e, t) => {
111
+ let n = (e?.label || e?.key || "")?.replace(/_/g, " ");
112
+ if (n?.endsWith("Id") && (n = n?.replace("Id", "")), n.includes(".")) {
113
+ let [e] = n.split(".");
114
+ e && (n = e);
115
+ }
116
+ let r = (t) => {
117
+ let r = t;
118
+ return e.max !== void 0 && e.max !== null && e.max !== "" && (r = r.max(Number(e.max), `The ${n} value is too large (max ${e.max})`)), e.min !== void 0 && e.min !== null && e.min !== "" && (r = r.min(Number(e.min), `The ${n} value is too small (min ${e.min})`)), r;
119
+ }, i;
120
+ switch (e.field_interface) {
121
+ case o.NumberWidget:
122
+ i = r(d.number());
123
+ break;
124
+ case o.ArrayWidget:
125
+ i = r(d.array().typeError("The field must be an array"));
126
+ break;
127
+ case o.RecordWidget:
128
+ i = d.object();
129
+ break;
130
+ case o.EmailWidget:
131
+ i = r(d.string().email("The email address is not valid"));
132
+ break;
133
+ case o.PhoneWidget:
134
+ i = r(d.string().test("phone", "The phone number has incorrect format", (e) => {
135
+ if (e) try {
136
+ return u(e);
137
+ } catch {
138
+ return !1;
139
+ }
140
+ return !0;
141
+ }));
142
+ break;
143
+ case o.URLWidget:
144
+ i = r(d.string().matches(/^(?:https?:\/\/)?(?:[a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+(?:\.[a-zA-Z]{2,})+(?:\/[^\s?#]*)?(?:\?[^\s]*)?$/, "The URL is not valid"));
145
+ break;
146
+ case o.ImageUploadWidget:
147
+ case o.FileUploadWidget:
148
+ case o.GeocoderWidget:
149
+ i = d.object();
150
+ break;
151
+ case o.MultiImageUploadWidget:
152
+ case o.MultiFileUploadWidget:
153
+ case o.MultiGeocoderWidget:
154
+ i = d.array().of(d.object());
155
+ break;
156
+ case o.JSONWidget:
157
+ case o.DropdownWidget:
158
+ i = d.string();
159
+ break;
160
+ case o.MultiTextWidget:
161
+ case o.MultiDropdownWidget:
162
+ case o.CheckboxWidget:
163
+ i = d.array().of(d.string());
164
+ break;
165
+ case o.ToggleCheckboxWidget:
166
+ i = d.boolean();
167
+ break;
168
+ case o.CollectionWidget:
169
+ i = e.options.current_have_many_connected ? d.array() : d.object();
170
+ break;
171
+ default:
172
+ i = r(d.string());
173
+ break;
174
+ }
175
+ if (e.options?.validationsPresets && Array.isArray(e.options.validationsPresets)) {
176
+ let t = e.options.validationsPresets;
177
+ (e.field_interface === o.TextWidget || e.field_interface === o.TextareaWidget) && (t.includes("exclude_special_chars") && (i = i.matches(/^[a-zA-Z0-9\s]*$/, "Special characters are not allowed")), t.includes("exclude_numbers") && (i = i.matches(/^[^0-9]*$/, "Numbers are not allowed")));
178
+ }
179
+ return {
180
+ required: {
181
+ value: !!e?.required,
182
+ message: `The ${n} field is required`
183
+ },
184
+ validate: (n) => {
185
+ if (e?.options?.disableValidation || n === "" || n == null) return !0;
186
+ try {
187
+ return i.validateSync(n), t ? t(n) : !0;
188
+ } catch (e) {
189
+ return e instanceof d.ValidationError ? e.message : !0;
190
+ }
191
+ }
192
+ };
193
+ };
194
+ //#endregion
195
+ export { _ as a, g as i, y as n, v as r, b as t };
package/index.d.ts CHANGED
@@ -563,6 +563,8 @@ export declare const DEFAULT_VISIBLE_STATE: AnimationProperties;
563
563
 
564
564
  export declare const DEMO_SCHEMA: ILemaCollection;
565
565
 
566
+ export declare const DevTools: React.FC<IDevToolsProps>;
567
+
566
568
  export declare const EditForm: WithBlockPropsComponent<BaseElementProps & {
567
569
  className?: string;
568
570
  initialValues?: Record<string, any>;
@@ -1104,6 +1106,13 @@ declare interface ICreateForumPostProps {
1104
1106
  onPostCreated?: (post: IForumPost) => void;
1105
1107
  }
1106
1108
 
1109
+ export declare interface IDevToolsProps {
1110
+ schema: IBlock;
1111
+ component: React.ComponentType<any>;
1112
+ theme?: ITheme;
1113
+ defaultLayoutIndex?: number;
1114
+ }
1115
+
1107
1116
  export declare type IElementStyle = Record<string, any>;
1108
1117
 
1109
1118
  export declare interface IFieldConfig {
@@ -1173,6 +1182,9 @@ export declare interface IFieldConfig {
1173
1182
  height?: string;
1174
1183
  alt?: string;
1175
1184
  };
1185
+ icon?: {
1186
+ alt?: string;
1187
+ };
1176
1188
  media?: {
1177
1189
  autoPlay?: boolean;
1178
1190
  controls?: boolean;
@@ -1341,6 +1353,8 @@ declare interface ILevoFormContext {
1341
1353
  };
1342
1354
  };
1343
1355
  debug?: boolean;
1356
+ /** When true, the form is in preview mode — no remote submission, no drafts, no captcha, no analytics. */
1357
+ preview?: boolean;
1344
1358
  }
1345
1359
 
1346
1360
  export declare type ILevoPageData = Pick<IPageExpanded, "id" | "workspace_id" | "blocks" | "source" | "title" | "description" | "access" | "style_config">;
@@ -1354,8 +1368,6 @@ export declare interface ILevoPageProps {
1354
1368
  workspace: IWorkspace;
1355
1369
  site: ISite;
1356
1370
  authOverride?: IAuthOverride | null;
1357
- /** Wrap page content in a Suspense boundary (needed for React.lazy blocks). Auto-enabled in studio modes. */
1358
- enableSuspense?: boolean;
1359
1371
  }
1360
1372
 
1361
1373
  export declare interface ILocalizedPage {
@@ -1693,7 +1705,7 @@ export declare interface ISite {
1693
1705
  updated_at: string;
1694
1706
  }
1695
1707
 
1696
- export declare type ISiteCompact = Pick<ISite, "object" | "id" | "name" | "slug" | "icon" | "logo" | "domain" | "domain_count" | "is_default" | "created_at" | "updated_at">;
1708
+ export declare type ISiteCompact = Pick<ISite, "object" | "id" | "name" | "slug" | "icon" | "logo" | "domain" | "domain_count" | "is_default" | "settings" | "created_at" | "updated_at">;
1697
1709
 
1698
1710
  export declare interface ISitemap {
1699
1711
  created_at: string;
@@ -2428,6 +2440,12 @@ export declare const sanitizeBackgroundEffectConfig: (config: BackgroundEffectCo
2428
2440
  */
2429
2441
  export declare const sanitizeElementKey: (elementKey: string) => string;
2430
2442
 
2443
+ /**
2444
+ * Converts an IBlock schema definition into a mock IBlockInstance
2445
+ * that LevoBlock can render. Uses layout defaults for content/styles/config.
2446
+ */
2447
+ export declare const schemaToBlockInstance: (schema: IBlock, layoutIndex?: number) => IBlockInstance;
2448
+
2431
2449
  declare interface Scores {
2432
2450
  performance: number;
2433
2451
  seo: number;
@@ -2540,9 +2558,9 @@ export declare interface StudioState {
2540
2558
  };
2541
2559
  }
2542
2560
 
2543
- export declare const StudioWidgetList: readonly ["BoxWidget", "ButtonWidget", "LayoutWidget", "HeadingWidget", "IframeWidget", "ImageWidget", "IconWidget", "MediaWidget", "TypographyWidget", "BlogContentWidget", "CarouselWidget", "FormWidget", "ContainerWidget", "UserMenuWidget", "TabsListWidget", "TabsTriggerWidget", "TabsContentWidget", "CardWidget", "TitleWidget", "TextWidget", "NumberWidget", "URLWidget", "ImageUploadWidget", "MultiImageUploadWidget", "TextareaWidget", "RichTextWidget", "DropdownWidget", "SwitchWidget", "DateWidget", "ArrayWidget", "RecordWidget"];
2561
+ export declare const StudioWidgetList: readonly ["BoxWidget", "ButtonWidget", "LayoutWidget", "HeadingWidget", "IframeWidget", "ImageWidget", "IconWidget", "MediaWidget", "TypographyWidget", "BlogContentWidget", "CarouselWidget", "FormWidget", "ContainerWidget", "UserMenuWidget", "TabsListWidget", "TabsTriggerWidget", "TabsContentWidget", "NavMenuWidget", "CardWidget", "TitleWidget", "TextWidget", "NumberWidget", "URLWidget", "ImageUploadWidget", "MultiImageUploadWidget", "TextareaWidget", "RichTextWidget", "DropdownWidget", "SwitchWidget", "DateWidget", "ArrayWidget", "RecordWidget"];
2544
2562
 
2545
- export declare const StudioWidgetMap: Record<"BoxWidget" | "ButtonWidget" | "LayoutWidget" | "HeadingWidget" | "IframeWidget" | "ImageWidget" | "IconWidget" | "MediaWidget" | "TypographyWidget" | "BlogContentWidget" | "CarouselWidget" | "FormWidget" | "ContainerWidget" | "UserMenuWidget" | "TabsListWidget" | "TabsTriggerWidget" | "TabsContentWidget" | "CardWidget" | "TitleWidget" | "TextWidget" | "NumberWidget" | "URLWidget" | "ImageUploadWidget" | "MultiImageUploadWidget" | "TextareaWidget" | "RichTextWidget" | "DropdownWidget" | "SwitchWidget" | "DateWidget" | "ArrayWidget" | "RecordWidget", "BoxWidget" | "ButtonWidget" | "LayoutWidget" | "HeadingWidget" | "IframeWidget" | "ImageWidget" | "IconWidget" | "MediaWidget" | "TypographyWidget" | "BlogContentWidget" | "CarouselWidget" | "FormWidget" | "ContainerWidget" | "UserMenuWidget" | "TabsListWidget" | "TabsTriggerWidget" | "TabsContentWidget" | "CardWidget" | "TitleWidget" | "TextWidget" | "NumberWidget" | "URLWidget" | "ImageUploadWidget" | "MultiImageUploadWidget" | "TextareaWidget" | "RichTextWidget" | "DropdownWidget" | "SwitchWidget" | "DateWidget" | "ArrayWidget" | "RecordWidget">;
2563
+ export declare const StudioWidgetMap: Record<"BoxWidget" | "ButtonWidget" | "LayoutWidget" | "HeadingWidget" | "IframeWidget" | "ImageWidget" | "IconWidget" | "MediaWidget" | "TypographyWidget" | "BlogContentWidget" | "CarouselWidget" | "FormWidget" | "ContainerWidget" | "UserMenuWidget" | "TabsListWidget" | "TabsTriggerWidget" | "TabsContentWidget" | "NavMenuWidget" | "CardWidget" | "TitleWidget" | "TextWidget" | "NumberWidget" | "URLWidget" | "ImageUploadWidget" | "MultiImageUploadWidget" | "TextareaWidget" | "RichTextWidget" | "DropdownWidget" | "SwitchWidget" | "DateWidget" | "ArrayWidget" | "RecordWidget", "BoxWidget" | "ButtonWidget" | "LayoutWidget" | "HeadingWidget" | "IframeWidget" | "ImageWidget" | "IconWidget" | "MediaWidget" | "TypographyWidget" | "BlogContentWidget" | "CarouselWidget" | "FormWidget" | "ContainerWidget" | "UserMenuWidget" | "TabsListWidget" | "TabsTriggerWidget" | "TabsContentWidget" | "NavMenuWidget" | "CardWidget" | "TitleWidget" | "TextWidget" | "NumberWidget" | "URLWidget" | "ImageUploadWidget" | "MultiImageUploadWidget" | "TextareaWidget" | "RichTextWidget" | "DropdownWidget" | "SwitchWidget" | "DateWidget" | "ArrayWidget" | "RecordWidget">;
2546
2564
 
2547
2565
  export declare const TabsContent: WithBlockPropsComponent<BaseTabsContentProps>;
2548
2566