@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.
- package/{BillingStep-o2yIMjLk.js → BillingStep-C3jJkLXQ.js} +1 -1
- package/{Button-_hpg7Rxx.js → Button-CwN6jTXH.js} +17 -12
- package/CollectionField-DnbpB0Z5.js +254 -0
- package/CollectionInput-BoNAc4sq.js +132 -0
- package/DateTimeWidget-IRleQI-3.js +255 -0
- package/{EntryCard-B-feJvrB.js → EntryCard-CZIUBwtE.js} +3 -3
- package/{LoginCard-CF9JbU-y.js → LoginCard-Bthy9dcf.js} +3 -3
- package/{LoginForm-CdpNCQJa.js → LoginForm-CPMtCyMF.js} +4 -0
- package/{LoginModal-ngTHCyli.js → LoginModal-BPI5tOIZ.js} +3 -3
- package/{MessageCard-D2uja800.js → MessageCard-BYxgc9dl.js} +2 -2
- package/{ModalManager-B7pCzvK1.js → ModalManager-BaIL6HG-.js} +1 -1
- package/{PendingApprovalCard-Dut-Xiw1.js → PendingApprovalCard-DEnawzxD.js} +3 -3
- package/PhoneWidget-CjhHfwuG.js +100 -0
- package/Popover-DHVZdJuv.js +56 -0
- package/RichTextWidget-CgT1_zC3.js +1135 -0
- package/Tooltip-ByJRyayB.js +78 -0
- package/VerifyButton-DFKzKYxC.js +283 -0
- package/{bookingCard-CGV9svhn.js → bookingCard-Bw4tvDYh.js} +3 -3
- package/collection.d.ts +81 -46
- package/collection.js +8 -5
- package/dist-D_jY4Tf1.js +3168 -0
- package/getFieldValidations-qVzuq6mv.js +195 -0
- package/index.d.ts +23 -5
- package/index.js +1634 -1420
- package/nodeAlignment-CG3qmAuQ.js +180 -0
- package/package.json +3 -4
- package/studio.css +1 -1
- package/theme.cssm-De_pl52g.js +4 -0
- package/{utils-KqbqLlMF.js → utils-F6eBcsyI.js} +1 -1
- package/widgets-Dvyv5_uj.js +215 -0
- package/dist-DDKHTnIW.js +0 -3653
- package/widgets-B84lq4lO.js +0 -351
- /package/{Beams-CCNNOvfW.js → Beams-Blr-zwvz.js} +0 -0
- /package/{Dots-89WGkd-z.js → Dots-DeBKuibU.js} +0 -0
- /package/{Gradient-vTa_uWCj.js → Gradient-DGFxOjft.js} +0 -0
- /package/{Grid-CrtztrxK.js → Grid-A7HRCQ0T.js} +0 -0
- /package/{MessageFooter-Bu-jyPkJ.js → MessageFooter-C6DivT4m.js} +0 -0
- /package/{StripePaymentModal-CajqohNM.js → StripePaymentModal-BcePXzmC.js} +0 -0
- /package/{Waves-BhA6CLEI.js → Waves-CIT6Ngng.js} +0 -0
- /package/{card-DCbhJCO9.js → card-izMd2DvE.js} +0 -0
- /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
|
|