@wirechunk/cli 0.1.0 → 0.2.0
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/README.md +1 -0
- package/build/main.js +1102 -420
- package/package.json +2 -2
package/build/main.js
CHANGED
|
@@ -4016,7 +4016,7 @@ const applyStyle = (self2, string2) => {
|
|
|
4016
4016
|
return openAll + string2 + closeAll;
|
|
4017
4017
|
};
|
|
4018
4018
|
Object.defineProperties(createChalk.prototype, styles);
|
|
4019
|
-
const chalk = createChalk();
|
|
4019
|
+
const chalk$1 = createChalk();
|
|
4020
4020
|
createChalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
4021
4021
|
const validatePasswordComplexity = (password) => {
|
|
4022
4022
|
if (password.length < 10) {
|
|
@@ -4088,6 +4088,7 @@ function customAlphabet(alphabet2, size = 21) {
|
|
|
4088
4088
|
}
|
|
4089
4089
|
const alphabet = "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
|
|
4090
4090
|
const cleanSmallId = customAlphabet(alphabet, 22);
|
|
4091
|
+
const designerComponentId = customAlphabet(alphabet, 7);
|
|
4091
4092
|
const domainRegex = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
|
|
4092
4093
|
const validDomain = (domain) => domainRegex.test(domain);
|
|
4093
4094
|
const removeColons = (domain) => domain.replaceAll(":", "");
|
|
@@ -4195,6 +4196,10 @@ const permissionSubscriptionEdit = {
|
|
|
4195
4196
|
object: "Subscription",
|
|
4196
4197
|
action: "edit"
|
|
4197
4198
|
};
|
|
4199
|
+
const permissionSubscriptionCancel = {
|
|
4200
|
+
object: "Subscription",
|
|
4201
|
+
action: "cancel"
|
|
4202
|
+
};
|
|
4198
4203
|
const permissionTemplateEdit = {
|
|
4199
4204
|
object: "Template",
|
|
4200
4205
|
action: "edit"
|
|
@@ -4272,6 +4277,7 @@ const allPermissions = [
|
|
|
4272
4277
|
permissionSiteEditDomain,
|
|
4273
4278
|
permissionSiteEditTls,
|
|
4274
4279
|
permissionSiteView,
|
|
4280
|
+
permissionSubscriptionCancel,
|
|
4275
4281
|
permissionSubscriptionEdit,
|
|
4276
4282
|
permissionTemplateEdit,
|
|
4277
4283
|
permissionTemplateView,
|
|
@@ -6314,7 +6320,7 @@ function partial$1(Class, schema, mask) {
|
|
|
6314
6320
|
});
|
|
6315
6321
|
return clone$1(schema, def);
|
|
6316
6322
|
}
|
|
6317
|
-
function required$
|
|
6323
|
+
function required$4(Class, schema, mask) {
|
|
6318
6324
|
const def = mergeDefs$1(schema._zod.def, {
|
|
6319
6325
|
get shape() {
|
|
6320
6326
|
const oldShape = schema._zod.def.shape;
|
|
@@ -8055,7 +8061,7 @@ const ZodObject$2 = /* @__PURE__ */ $constructor$1("ZodObject", (inst, def) => {
|
|
|
8055
8061
|
inst.pick = (mask) => pick$1(inst, mask);
|
|
8056
8062
|
inst.omit = (mask) => omit$1(inst, mask);
|
|
8057
8063
|
inst.partial = (...args) => partial$1(ZodOptional$2, inst, args[0]);
|
|
8058
|
-
inst.required = (...args) => required$
|
|
8064
|
+
inst.required = (...args) => required$4(ZodNonOptional$1, inst, args[0]);
|
|
8059
8065
|
});
|
|
8060
8066
|
function object$1(shape, params) {
|
|
8061
8067
|
const def = {
|
|
@@ -14944,7 +14950,7 @@ function requireLib$5() {
|
|
|
14944
14950
|
})(lib$5);
|
|
14945
14951
|
return lib$5;
|
|
14946
14952
|
}
|
|
14947
|
-
var libExports$
|
|
14953
|
+
var libExports$2 = requireLib$5();
|
|
14948
14954
|
var postgresInterval$2;
|
|
14949
14955
|
var hasRequiredPostgresInterval$2;
|
|
14950
14956
|
function requirePostgresInterval$2() {
|
|
@@ -15158,7 +15164,7 @@ function requirePostgresInterval$2() {
|
|
|
15158
15164
|
var postgresIntervalExports = requirePostgresInterval$2();
|
|
15159
15165
|
const parseInterval = /* @__PURE__ */ getDefaultExportFromCjs(postgresIntervalExports);
|
|
15160
15166
|
const intervalParser = (value) => {
|
|
15161
|
-
return value === null ? value : libExports$
|
|
15167
|
+
return value === null ? value : libExports$2.toSeconds(libExports$2.parse(parseInterval(value).toISOString()));
|
|
15162
15168
|
};
|
|
15163
15169
|
const createIntervalTypeParser = () => {
|
|
15164
15170
|
return {
|
|
@@ -20856,8 +20862,8 @@ function requireLib$3() {
|
|
|
20856
20862
|
})(lib$4);
|
|
20857
20863
|
return lib$4.exports;
|
|
20858
20864
|
}
|
|
20859
|
-
var libExports = requireLib$3();
|
|
20860
|
-
const pg = /* @__PURE__ */ getDefaultExportFromCjs(libExports);
|
|
20865
|
+
var libExports$1 = requireLib$3();
|
|
20866
|
+
const pg = /* @__PURE__ */ getDefaultExportFromCjs(libExports$1);
|
|
20861
20867
|
const Client = pg.Client;
|
|
20862
20868
|
pg.Pool;
|
|
20863
20869
|
pg.Connection;
|
|
@@ -23360,7 +23366,7 @@ function partial(Class, schema, mask) {
|
|
|
23360
23366
|
});
|
|
23361
23367
|
return clone(schema, def);
|
|
23362
23368
|
}
|
|
23363
|
-
function required$
|
|
23369
|
+
function required$3(Class, schema, mask) {
|
|
23364
23370
|
const def = mergeDefs(schema._zod.def, {
|
|
23365
23371
|
get shape() {
|
|
23366
23372
|
const oldShape = schema._zod.def.shape;
|
|
@@ -25778,7 +25784,7 @@ const ZodObject2 = /* @__PURE__ */ $constructor("ZodObject", (inst, def) => {
|
|
|
25778
25784
|
inst.pick = (mask) => pick(inst, mask);
|
|
25779
25785
|
inst.omit = (mask) => omit(inst, mask);
|
|
25780
25786
|
inst.partial = (...args) => partial(ZodOptional2, inst, args[0]);
|
|
25781
|
-
inst.required = (...args) => required$
|
|
25787
|
+
inst.required = (...args) => required$3(ZodNonOptional, inst, args[0]);
|
|
25782
25788
|
});
|
|
25783
25789
|
function object(shape, params) {
|
|
25784
25790
|
const def = {
|
|
@@ -26642,6 +26648,7 @@ const bootstrap = async (opts, env2) => {
|
|
|
26642
26648
|
console.error("Missing required option: --name");
|
|
26643
26649
|
process.exit(1);
|
|
26644
26650
|
}
|
|
26651
|
+
const jwtSecret = requireJwtSecret(opts, env2);
|
|
26645
26652
|
let handle = opts.dev ? "dev" : opts.handle?.trim().toLowerCase().replace(/\s+/g, "-");
|
|
26646
26653
|
if (!handle) {
|
|
26647
26654
|
handle = name.toLowerCase().replace(/\s+/g, "-");
|
|
@@ -26802,7 +26809,6 @@ const bootstrap = async (opts, env2) => {
|
|
|
26802
26809
|
console.log(
|
|
26803
26810
|
`Created platform ${name} with handle ${handle} (ID ${result2.platformId}) and admin site ${adminSiteDomain}`
|
|
26804
26811
|
);
|
|
26805
|
-
const jwtSecret = requireJwtSecret(opts, env2);
|
|
26806
26812
|
const sessionId = cleanSmallId();
|
|
26807
26813
|
const apiTokenId = cleanSmallId();
|
|
26808
26814
|
await db.transaction(async (db2) => {
|
|
@@ -26867,304 +26873,21 @@ WIRECHUNK_PLATFORM_ID=${result2.platformId}
|
|
|
26867
26873
|
);
|
|
26868
26874
|
}
|
|
26869
26875
|
};
|
|
26870
|
-
const
|
|
26871
|
-
function validate25(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
|
|
26872
|
-
let vErrors = null;
|
|
26873
|
-
let errors2 = 0;
|
|
26874
|
-
const evaluated0 = validate25.evaluated;
|
|
26875
|
-
if (evaluated0.dynamicProps) {
|
|
26876
|
-
evaluated0.props = void 0;
|
|
26877
|
-
}
|
|
26878
|
-
if (evaluated0.dynamicItems) {
|
|
26879
|
-
evaluated0.items = void 0;
|
|
26880
|
-
}
|
|
26881
|
-
{
|
|
26882
|
-
if (data && typeof data == "object" && !Array.isArray(data)) {
|
|
26883
|
-
let missing0;
|
|
26884
|
-
if (data.name === void 0 && (missing0 = "name")) {
|
|
26885
|
-
validate25.errors = [
|
|
26886
|
-
{
|
|
26887
|
-
instancePath,
|
|
26888
|
-
schemaPath: "#/required",
|
|
26889
|
-
keyword: "required",
|
|
26890
|
-
params: { missingProperty: missing0 },
|
|
26891
|
-
message: "must have required property '" + missing0 + "'"
|
|
26892
|
-
}
|
|
26893
|
-
];
|
|
26894
|
-
return false;
|
|
26895
|
-
} else {
|
|
26896
|
-
if (data.name !== void 0) {
|
|
26897
|
-
const _errs1 = errors2;
|
|
26898
|
-
if (typeof data.name !== "string") {
|
|
26899
|
-
validate25.errors = [
|
|
26900
|
-
{
|
|
26901
|
-
instancePath: instancePath + "/name",
|
|
26902
|
-
schemaPath: "#/properties/name/type",
|
|
26903
|
-
keyword: "type",
|
|
26904
|
-
params: { type: "string" },
|
|
26905
|
-
message: "must be string"
|
|
26906
|
-
}
|
|
26907
|
-
];
|
|
26908
|
-
return false;
|
|
26909
|
-
}
|
|
26910
|
-
var valid0 = _errs1 === errors2;
|
|
26911
|
-
} else {
|
|
26912
|
-
var valid0 = true;
|
|
26913
|
-
}
|
|
26914
|
-
if (valid0) {
|
|
26915
|
-
if (data.server !== void 0) {
|
|
26916
|
-
let data1 = data.server;
|
|
26917
|
-
const _errs3 = errors2;
|
|
26918
|
-
{
|
|
26919
|
-
if (data1 && typeof data1 == "object" && !Array.isArray(data1)) {
|
|
26920
|
-
if (data1.enable !== void 0) {
|
|
26921
|
-
const _errs5 = errors2;
|
|
26922
|
-
if (typeof data1.enable !== "boolean") {
|
|
26923
|
-
validate25.errors = [
|
|
26924
|
-
{
|
|
26925
|
-
instancePath: instancePath + "/server/enable",
|
|
26926
|
-
schemaPath: "#/properties/server/properties/enable/type",
|
|
26927
|
-
keyword: "type",
|
|
26928
|
-
params: { type: "boolean" },
|
|
26929
|
-
message: "must be boolean"
|
|
26930
|
-
}
|
|
26931
|
-
];
|
|
26932
|
-
return false;
|
|
26933
|
-
}
|
|
26934
|
-
var valid1 = _errs5 === errors2;
|
|
26935
|
-
} else {
|
|
26936
|
-
var valid1 = true;
|
|
26937
|
-
}
|
|
26938
|
-
if (valid1) {
|
|
26939
|
-
if (data1.database !== void 0) {
|
|
26940
|
-
let data3 = data1.database;
|
|
26941
|
-
const _errs7 = errors2;
|
|
26942
|
-
{
|
|
26943
|
-
if (data3 && typeof data3 == "object" && !Array.isArray(data3)) {
|
|
26944
|
-
if (data3.enable !== void 0) {
|
|
26945
|
-
if (typeof data3.enable !== "boolean") {
|
|
26946
|
-
validate25.errors = [
|
|
26947
|
-
{
|
|
26948
|
-
instancePath: instancePath + "/server/database/enable",
|
|
26949
|
-
schemaPath: "#/properties/server/properties/database/properties/enable/type",
|
|
26950
|
-
keyword: "type",
|
|
26951
|
-
params: { type: "boolean" },
|
|
26952
|
-
message: "must be boolean"
|
|
26953
|
-
}
|
|
26954
|
-
];
|
|
26955
|
-
return false;
|
|
26956
|
-
}
|
|
26957
|
-
}
|
|
26958
|
-
} else {
|
|
26959
|
-
validate25.errors = [
|
|
26960
|
-
{
|
|
26961
|
-
instancePath: instancePath + "/server/database",
|
|
26962
|
-
schemaPath: "#/properties/server/properties/database/type",
|
|
26963
|
-
keyword: "type",
|
|
26964
|
-
params: { type: "object" },
|
|
26965
|
-
message: "must be object"
|
|
26966
|
-
}
|
|
26967
|
-
];
|
|
26968
|
-
return false;
|
|
26969
|
-
}
|
|
26970
|
-
}
|
|
26971
|
-
var valid1 = _errs7 === errors2;
|
|
26972
|
-
} else {
|
|
26973
|
-
var valid1 = true;
|
|
26974
|
-
}
|
|
26975
|
-
}
|
|
26976
|
-
} else {
|
|
26977
|
-
validate25.errors = [
|
|
26978
|
-
{
|
|
26979
|
-
instancePath: instancePath + "/server",
|
|
26980
|
-
schemaPath: "#/properties/server/type",
|
|
26981
|
-
keyword: "type",
|
|
26982
|
-
params: { type: "object" },
|
|
26983
|
-
message: "must be object"
|
|
26984
|
-
}
|
|
26985
|
-
];
|
|
26986
|
-
return false;
|
|
26987
|
-
}
|
|
26988
|
-
}
|
|
26989
|
-
var valid0 = _errs3 === errors2;
|
|
26990
|
-
} else {
|
|
26991
|
-
var valid0 = true;
|
|
26992
|
-
}
|
|
26993
|
-
if (valid0) {
|
|
26994
|
-
if (data.components !== void 0) {
|
|
26995
|
-
let data5 = data.components;
|
|
26996
|
-
const _errs11 = errors2;
|
|
26997
|
-
{
|
|
26998
|
-
if (data5 && typeof data5 == "object" && !Array.isArray(data5)) {
|
|
26999
|
-
for (const key0 in data5) {
|
|
27000
|
-
let data6 = data5[key0];
|
|
27001
|
-
const _errs14 = errors2;
|
|
27002
|
-
{
|
|
27003
|
-
if (data6 && typeof data6 == "object" && !Array.isArray(data6)) {
|
|
27004
|
-
let missing1;
|
|
27005
|
-
if (data6.path === void 0 && (missing1 = "path")) {
|
|
27006
|
-
validate25.errors = [
|
|
27007
|
-
{
|
|
27008
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),
|
|
27009
|
-
schemaPath: "#/properties/components/additionalProperties/required",
|
|
27010
|
-
keyword: "required",
|
|
27011
|
-
params: { missingProperty: missing1 },
|
|
27012
|
-
message: "must have required property '" + missing1 + "'"
|
|
27013
|
-
}
|
|
27014
|
-
];
|
|
27015
|
-
return false;
|
|
27016
|
-
} else {
|
|
27017
|
-
if (data6.path !== void 0) {
|
|
27018
|
-
const _errs16 = errors2;
|
|
27019
|
-
if (typeof data6.path !== "string") {
|
|
27020
|
-
validate25.errors = [
|
|
27021
|
-
{
|
|
27022
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/path",
|
|
27023
|
-
schemaPath: "#/properties/components/additionalProperties/properties/path/type",
|
|
27024
|
-
keyword: "type",
|
|
27025
|
-
params: { type: "string" },
|
|
27026
|
-
message: "must be string"
|
|
27027
|
-
}
|
|
27028
|
-
];
|
|
27029
|
-
return false;
|
|
27030
|
-
}
|
|
27031
|
-
var valid4 = _errs16 === errors2;
|
|
27032
|
-
} else {
|
|
27033
|
-
var valid4 = true;
|
|
27034
|
-
}
|
|
27035
|
-
if (valid4) {
|
|
27036
|
-
if (data6.description !== void 0) {
|
|
27037
|
-
const _errs18 = errors2;
|
|
27038
|
-
if (typeof data6.description !== "string") {
|
|
27039
|
-
validate25.errors = [
|
|
27040
|
-
{
|
|
27041
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/description",
|
|
27042
|
-
schemaPath: "#/properties/components/additionalProperties/properties/description/type",
|
|
27043
|
-
keyword: "type",
|
|
27044
|
-
params: { type: "string" },
|
|
27045
|
-
message: "must be string"
|
|
27046
|
-
}
|
|
27047
|
-
];
|
|
27048
|
-
return false;
|
|
27049
|
-
}
|
|
27050
|
-
var valid4 = _errs18 === errors2;
|
|
27051
|
-
} else {
|
|
27052
|
-
var valid4 = true;
|
|
27053
|
-
}
|
|
27054
|
-
if (valid4) {
|
|
27055
|
-
if (data6.supports !== void 0) {
|
|
27056
|
-
let data9 = data6.supports;
|
|
27057
|
-
const _errs20 = errors2;
|
|
27058
|
-
{
|
|
27059
|
-
if (data9 && typeof data9 == "object" && !Array.isArray(data9)) {
|
|
27060
|
-
if (data9.children !== void 0) {
|
|
27061
|
-
if (typeof data9.children !== "boolean") {
|
|
27062
|
-
validate25.errors = [
|
|
27063
|
-
{
|
|
27064
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/supports/children",
|
|
27065
|
-
schemaPath: "#/properties/components/additionalProperties/properties/supports/properties/children/type",
|
|
27066
|
-
keyword: "type",
|
|
27067
|
-
params: { type: "boolean" },
|
|
27068
|
-
message: "must be boolean"
|
|
27069
|
-
}
|
|
27070
|
-
];
|
|
27071
|
-
return false;
|
|
27072
|
-
}
|
|
27073
|
-
}
|
|
27074
|
-
} else {
|
|
27075
|
-
validate25.errors = [
|
|
27076
|
-
{
|
|
27077
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/supports",
|
|
27078
|
-
schemaPath: "#/properties/components/additionalProperties/properties/supports/type",
|
|
27079
|
-
keyword: "type",
|
|
27080
|
-
params: { type: "object" },
|
|
27081
|
-
message: "must be object"
|
|
27082
|
-
}
|
|
27083
|
-
];
|
|
27084
|
-
return false;
|
|
27085
|
-
}
|
|
27086
|
-
}
|
|
27087
|
-
var valid4 = _errs20 === errors2;
|
|
27088
|
-
} else {
|
|
27089
|
-
var valid4 = true;
|
|
27090
|
-
}
|
|
27091
|
-
}
|
|
27092
|
-
}
|
|
27093
|
-
}
|
|
27094
|
-
} else {
|
|
27095
|
-
validate25.errors = [
|
|
27096
|
-
{
|
|
27097
|
-
instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),
|
|
27098
|
-
schemaPath: "#/properties/components/additionalProperties/type",
|
|
27099
|
-
keyword: "type",
|
|
27100
|
-
params: { type: "object" },
|
|
27101
|
-
message: "must be object"
|
|
27102
|
-
}
|
|
27103
|
-
];
|
|
27104
|
-
return false;
|
|
27105
|
-
}
|
|
27106
|
-
}
|
|
27107
|
-
var valid3 = _errs14 === errors2;
|
|
27108
|
-
if (!valid3) {
|
|
27109
|
-
break;
|
|
27110
|
-
}
|
|
27111
|
-
}
|
|
27112
|
-
} else {
|
|
27113
|
-
validate25.errors = [
|
|
27114
|
-
{
|
|
27115
|
-
instancePath: instancePath + "/components",
|
|
27116
|
-
schemaPath: "#/properties/components/type",
|
|
27117
|
-
keyword: "type",
|
|
27118
|
-
params: { type: "object" },
|
|
27119
|
-
message: "must be object"
|
|
27120
|
-
}
|
|
27121
|
-
];
|
|
27122
|
-
return false;
|
|
27123
|
-
}
|
|
27124
|
-
}
|
|
27125
|
-
var valid0 = _errs11 === errors2;
|
|
27126
|
-
} else {
|
|
27127
|
-
var valid0 = true;
|
|
27128
|
-
}
|
|
27129
|
-
}
|
|
27130
|
-
}
|
|
27131
|
-
}
|
|
27132
|
-
} else {
|
|
27133
|
-
validate25.errors = [
|
|
27134
|
-
{
|
|
27135
|
-
instancePath,
|
|
27136
|
-
schemaPath: "#/type",
|
|
27137
|
-
keyword: "type",
|
|
27138
|
-
params: { type: "object" },
|
|
27139
|
-
message: "must be object"
|
|
27140
|
-
}
|
|
27141
|
-
];
|
|
27142
|
-
return false;
|
|
27143
|
-
}
|
|
27144
|
-
}
|
|
27145
|
-
validate25.errors = vErrors;
|
|
27146
|
-
return errors2 === 0;
|
|
27147
|
-
}
|
|
27148
|
-
validate25.evaluated = {
|
|
27149
|
-
props: { name: true, server: true, components: true },
|
|
27150
|
-
dynamicProps: false,
|
|
27151
|
-
dynamicItems: false
|
|
27152
|
-
};
|
|
27153
|
-
const type$b = "array";
|
|
27154
|
-
const items$2 = /* @__PURE__ */ JSON.parse(`{"anyOf":[{"title":"BoxComponent","description":"An element for wrapping children elements.","type":"object","properties":{"type":{"const":"Box"},"elementId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The HTML tag to use for the element. Defaults to div.","type":"string","enum":["article","aside","blockquote","code","div","fieldset","footer","h1","h2","h3","h4","h5","h6","header","label","legend","li","main","nav","ol","p","pre","section","span","ul"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ButtonComponent","type":"object","properties":{"type":{"const":"Button"},"id":{"type":"string","minLength":1},"onClick":{"description":"Defaults to submitForm.","anyOf":[{"type":"object","properties":{"type":{"const":"emitEvent"},"eventType":{"description":"A string representing a custom event type, to reference in other components that listen for events.","type":"string"}},"required":["type","eventType"]},{"type":"object","properties":{"type":{"type":"string","enum":["goBack","goBackFormStep","removeRepeatingGroupInputItem","resetForm","submitForm"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["decrementQueryParameter","incrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CalendlyEmbedComponent","description":"An embedded Calendly scheduling widget.","type":"object","properties":{"type":{"const":"CalendlyEmbed"},"id":{"type":"string","minLength":1},"queryParameters":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"parameter":{"type":"string"},"value":{"$ref":"#/$defs/componentStringValueSource"}},"required":["id","parameter","value"]}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"url":{"$ref":"#/$defs/componentStringValueSource"}},"additionalProperties":false,"required":["type","id"]},{"title":"CheckboxGroupInputComponent","description":"A group of checkboxes for selecting one or more options, represented as an array of strings in form data.","type":"object","properties":{"type":{"const":"CheckboxGroupInput"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a checkbox icon, and its children are rendered inside a label that refers to the checkbox input element. For cards, there is default styling with each item's border color indicating whether it is checked. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"id":{"type":"string","minLength":1},"itemsContainerStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"showIndicators":{"description":"Whether to show indicators for each item. Applies only if displayType is indicators. Defaults to true.","type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"CheckboxGroupInputItemComponent","description":"A checkbox item within a checkbox group input.","type":"object","properties":{"type":{"const":"CheckboxGroupInputItem"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CheckboxInputComponent","description":"A standalone checkbox. Represented as either a boolean or a string in form data. If value is set to a string and is not an empty string, it is used as the value for the input when the box is checked. Otherwise, a boolean is set as the value when the box is checked or unchecked.","type":"object","properties":{"type":{"const":"CheckboxInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"CollapsiblePanelComponent","description":"A panel that can be collapsed or expanded.","type":"object","properties":{"type":{"const":"CollapsiblePanel"},"header":{"description":"The text displayed in the clickable header.","type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"triggerButtonStyles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CompletableVideoInputComponent","type":"object","properties":{"type":{"const":"CompletableVideoInput"},"collapseCompleted":{"description":"By default, collapseCompleted is false.","type":"boolean"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"initiallyCollapsed":{"description":"Default initialCollapsed is false.","type":"boolean"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"showHeader":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"type":"string"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"ConditionalLogicComponent","type":"object","properties":{"type":{"const":"ConditionalLogic"},"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CourseComponent","type":"object","properties":{"type":{"const":"Course"},"courseId":{"description":"If set, a Course is used instead of the legacy Plan.","type":"string"},"emptyNotesMessage":{"type":"string"},"enableNotes":{"type":"boolean"},"id":{"type":"string","minLength":1},"planId":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"CurrentYearComponent","description":"Displays the current year.","type":"object","properties":{"type":{"const":"CurrentYear"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"CustomComponentComponent","description":"A custom component (a saved fragment of components).","type":"object","properties":{"type":{"const":"CustomComponent"},"customComponentId":{"description":"The ID of the custom component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","customComponentId","id"]},{"title":"DashboardComponent","description":"A dashboard layout with a header, sidebar, and main content area.","type":"object","properties":{"type":{"const":"Dashboard"},"collapseSidebarOnPaths":{"description":"An array of path patterns as globs. If set, the sidebar will automatically be collapsed on matching paths.","type":"array","items":{"type":"string"}},"extraNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"id":{"type":"string","minLength":1},"mainNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"DateInputComponent","type":"object","properties":{"type":{"const":"DateInput"},"clearable":{"type":"boolean"},"dayPlaceholder":{"type":"string"},"id":{"type":"string","minLength":1},"inputElementStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maximumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"minimumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"monthPlaceholder":{"type":"string"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"style":{"type":"string","enum":["Calendar","3Fields"]},"styles":{"$ref":"#/$defs/componentStyleRules"},"yearPlaceholder":{"type":"string"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"DialogComponent","type":"object","properties":{"type":{"const":"Dialog"},"closeOnBackdropClick":{"description":"Whether the dialog can be closed by clicking the backdrop. Defaults to true.","type":"boolean"},"hideTriggers":{"description":"A list of events that will trigger the dialog to be hidden.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"id":{"type":"string","minLength":1},"showTriggers":{"description":"A list of events that will trigger the dialog to be shown.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"DocumentComponent","description":"A component that displays a document that can be downloaded.","type":"object","properties":{"type":{"const":"Document"},"documentId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"DropdownInputComponent","type":"object","properties":{"type":{"const":"DropdownInput"},"clearable":{"description":"Clearable is ignored if the input is required. When the input is not required, it may or may not be clearable. The default is false.","type":"boolean"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"options":{"description":"The options to show. Each option's value is both the label displayed and the value.","type":"array","items":{"type":"object","properties":{"key":{"type":"number"},"value":{"type":"string"}},"required":["key","value"]}},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name","options"]},{"title":"FormComponent","type":"object","properties":{"type":{"const":"Form"},"formId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"FormStepComponent","description":"Represents the current step in a multi-step form.","type":"object","properties":{"type":{"const":"FormStep"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"GooglePlaceInputComponent","description":"A map with a search field that lets you select a Place in Google Maps.","type":"object","properties":{"type":{"const":"GooglePlaceInput"},"id":{"type":"string","minLength":1},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","name"]},{"title":"HeaderComponent","description":"A header component with navigation items and a slot for other components. Children components must have either the LeftContent or RightContent slot property set to be rendered. No default styling is applied to children. Notice that children for either the left or right need to be enabled explicitly on mobile screens (up to 767px wide) with the showLeftContentOnMobile or showRightContentOnMobile properties. The navAlign property specifies the alignment of the navigation items element: if Center, then the nav is centered; if Left, then the nav is on the left but immediately to the right of the children with the LeftContent slot, if any; if Right, then the nav is on the right but immediately to the left of the children with the RightContent slot, if any.","type":"object","properties":{"type":{"const":"Header"},"contentMaxWidth":{"$ref":"#/$defs/componentWidth"},"id":{"type":"string","minLength":1},"navAlign":{"$ref":"#/$defs/componentAlign"},"navItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"showLeftContentOnMobile":{"description":"If true, the left content is shown on mobile. Defaults to false.","type":"boolean"},"showRightContentOnMobile":{"description":"If true, the right content is shown on mobile. Defaults to false.","type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"sticky":{"description":"If true, the header is sticky upon scrolling. Defaults to false.","type":"boolean"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"HelpTicketsPortalComponent","description":"A portal for help tickets.","type":"object","properties":{"type":{"const":"HelpTicketsPortal"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"HTMLComponent","description":"A component that renders raw HTML.","type":"object","properties":{"type":{"const":"HTML"},"html":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"IconComponent","type":"object","properties":{"type":{"const":"Icon"},"alt":{"description":"The alternative text for the icon. This should be provided only for icons that serve some purpose on their own other than decoration. Decorative icons should omit alt text to avoid unnecessary screen reader announcements.","type":"string"},"ariaHidden":{"description":"If true, the icon is hidden from the accessibility tree. This should be set to true for purely decorative icons.","type":"boolean"},"icon":{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"MaterialSymbols"},"value":{"type":"object","properties":{"fill":{"description":"If true, the icon's filled variant is used. Defaults to false.","type":"boolean"},"name":{"description":"The name of the icon. Must be one of the defined Material Symbols.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"opticalSize":{"description":"The optical size of the icon, for optimizing the appearance at different sizes. For icons rendered at 34px width or smaller, use 20. For icons rendered at bigger than 34px width, use 48. This is also the default width and height of the icon in pixels. Can be used together with CSS width and height properties. Defaults to 20.","type":"number","enum":[20,48]},"style":{"description":"The style of the icon. The outlined style is a sort of hybrid of rounded and sharp, and depending on the icon it may look exactly the same as either the rounded or sharp style. Defaults to outlined.","type":"string","enum":["outlined","rounded","sharp"]},"weight":{"description":"The weight of the icon. Similar to font-weight in that 200 is lighter and 600 is heavier. Defaults to 400.","type":"number","enum":[200,400,600]}}}},"required":["type"]}]}},"required":["type"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ImageComponent","description":"A component that displays an image.","type":"object","properties":{"type":{"const":"Image"},"alt":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageFeaturedImage","SiteLogo"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Asset"},"assetId":{"type":"string"},"variantId":{"description":"Optional ID of a specific variant to use. Should not be set together with variantIds. If not provided and variantIds is also not provided or is empty, the image is rendered with a srcset including all variants by default.","type":"string"},"variantIds":{"description":"Optional IDs of specific variants to use in the srcset attribute. Should not be set together with variantId.","type":"array","items":{"type":"string"}}},"required":["type"]}]},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"LessonNotesFieldComponent","description":"A text field for users to save notes related to a lesson (for courses).","type":"object","properties":{"type":{"const":"LessonNotesField"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label"]},{"title":"LinkComponent","description":"A link.","type":"object","properties":{"type":{"const":"Link"},"id":{"type":"string","minLength":1},"linkStyle":{"description":"Controls the visual style of the link. When \\"Button\\", renders a Button component with asChild prop and a Link inside.","type":"string","enum":["Text","Button"]},"protocol":{"description":"Adds the specified protocol prefix to the href attribute's value.","type":"string","enum":["mailto","tel","sms"]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"target":{"type":"string","enum":["_blank","_self","_parent","_top"]},"to":{"description":"The URL that the link points to. A router link will be rendered for a path without a host (using the History API). A regular link will be rendered for a full URL.","$ref":"#/$defs/componentStringValueSource"},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"MapComponent","description":"A component that displays a map. The focus property is the place to display. It can be the name of a location (the way it appears on Google Maps), an address, or a place ID with the prefix 'place_id:'.","type":"object","properties":{"type":{"const":"Map"},"focus":{"$ref":"#/$defs/componentNullableStringValueSource"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"MoveUserPlanComponent","description":"A component for a user to move between sequence stages.","type":"object","properties":{"type":{"const":"MoveUserPlan"},"id":{"type":"string","minLength":1},"nextButtonLabel":{"type":"string"},"previousButtonLabel":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"MultiOrgViewComponent","description":"A view for viewing all the orgs under a subscription, including all the users of each org and their training progress.","type":"object","properties":{"type":{"const":"MultiOrgView"},"id":{"type":"string","minLength":1},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressSequenceIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type","id"]},{"title":"MultipleChoiceInputComponent","type":"object","properties":{"type":{"const":"MultipleChoiceInput"},"answerIndex":{"type":"number"},"choices":{"type":"array","items":{"type":"string"}},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"MultiSelectInputComponent","type":"object","properties":{"type":{"const":"MultiSelectInput"},"answerIndices":{"type":"array","items":{"type":"number"}},"choices":{"type":"array","items":{"type":"string"}},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"NumberInputComponent","type":"object","properties":{"type":{"const":"NumberInput"},"format":{"type":"string","enum":["Number","Currency","Integer"]},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxDecimalDigits":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"OrderFormComponent","description":"An order form for checking out for a subscription.","type":"object","properties":{"type":{"const":"OrderForm"},"checkoutOptions":{"description":"The products to display in the form. Each product may optionally have a condition that needs to evaluate to true for the product to be displayed.","type":"array","items":{"type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"subscriptionPlanId":{"type":"string"}},"required":["subscriptionPlanId"]}},"enablePhoneNumber":{"description":"Whether to enable a phone number input field. Defaults to true.","type":"boolean"},"enablePromoCode":{"description":"Whether to enable a promo code input field. If set to Stripe, only Stripe promo codes are allowed. If set to Custom, only custom promo codes are allowed. Defaults to none.","type":"string","enum":["Stripe","Custom"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgBillingSettingsComponent","description":"Org billing settings dashboard.","type":"object","properties":{"type":{"const":"OrgBillingSettings"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgSitePagesComponent","description":"Shows the pages of an org site and allows authorized users to activate and edit pages.","type":"object","properties":{"type":{"const":"OrgSitePages"},"defaultPageTemplatePreviewImageUrl":{"type":"string"},"id":{"type":"string","minLength":1},"pageTemplates":{"type":"object","properties":{"filter":{"type":"string","enum":["include","exclude"]},"ids":{"type":"array","items":{"type":"string"}}},"required":["filter","ids"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgSiteReviewsComponent","description":"Organization site reviews component.","type":"object","properties":{"type":{"const":"OrgSiteReviews"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrganizationTeamComponent","description":"Organization team/members dashboard.","type":"object","properties":{"type":{"const":"OrganizationTeam"},"id":{"type":"string","minLength":1},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type","id"]},{"title":"PageComponent","description":"Represents the current page when rendered inside a layout.","type":"object","properties":{"type":{"const":"Page"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"PlainTextComponent","type":"object","properties":{"type":{"const":"PlainText"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The HTML tag to use for the element. Defaults to span.","type":"string","enum":["code","div","h1","h2","h3","h4","h5","h6","label","legend","li","p","span"]},"text":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]}},"additionalProperties":false,"required":["type","id"]},{"title":"PopoverComponent","type":"object","properties":{"type":{"const":"Popover"},"hideTriggers":{"description":"A list of events that will trigger the popover to be hidden.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"id":{"type":"string","minLength":1},"showTriggers":{"description":"A list of events that will trigger the popover to be shown.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ProductItemGuardComponent","description":"Ensures that a user is signed in and belongs to an org that has access to the specified product item in an active subscription. Otherwise, the component shows a default message, a custom children, or nothing, depending on how it is configured. The styling applies only to the default message.","type":"object","properties":{"type":{"const":"ProductItemGuard"},"accessDeniedMode":{"description":"The default accessDeniedMode is DefaultMessage. A custom message is defined through children with an AccessDenied slot key.","type":"string","enum":["CustomMessage","DefaultMessage","Empty"]},"id":{"type":"string","minLength":1},"productItem":{"description":"The product item to require. If not set, this component does not require anything and displays its children.","type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ProvidePropsComponent","type":"object","properties":{"type":{"const":"ProvideProps"},"id":{"type":"string","minLength":1},"props":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"name":{"description":"The name of the prop to provide.","type":"string"},"source":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Number"},"value":{"type":"number"}},"required":["type","value"]},{"type":"object","properties":{"type":{"const":"String"},"value":{"type":"string"}},"required":["type","value"]}]}},"required":["type","value"]},{"description":"The output is a function of the input using one of the built-in format functions.","type":"object","properties":{"type":{"const":"Transform"},"format":{"type":"string","enum":["Phone number (###) ###-####","Phone number ###-###-####","U.S. State abbreviation spelled out"]},"inputPropName":{"description":"Used only in transform mode.","type":"string"}},"required":["type"]},{"description":"Produce the output prop from the LiquidJS template.","type":"object","properties":{"type":{"const":"Template"},"template":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"CustomField"},"fieldName":{"type":"string"},"object":{"description":"The object from which to read the specified field. For a page template being previewed, when the object is 'Page' the custom fields are taken instead from the page template.","type":"string","enum":["Site","Page","User"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["id","name","source"]}},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"QueryComponent","description":"A component that queries data and provides it as props to its children. Supports pagination and provides metadata about the query results.","type":"object","properties":{"type":{"const":"Query"},"id":{"type":"string","minLength":1},"pageLimitSource":{"description":"The source of the page limit. Defaults to a Direct value of 20.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]}]},"pageNumberSource":{"description":"The source of the page number. Defaults to QueryParameter 'page'. Pagination is 1-based (i.e., the first page is page 1).","anyOf":[{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"props":{"description":"Configuration for the props that will be provided to children components.","type":"object","properties":{"items":{"description":"The prop name for the array of items returned by the query. Defaults to 'items'.","type":"string"},"currentPage":{"description":"The prop name for the current page number. Defaults to 'currentPage'.","type":"string"},"hasNextPage":{"description":"The prop name for whether there is a next page. Defaults to 'hasNextPage'.","type":"string"},"hasPreviousPage":{"description":"The prop name for whether there is a previous page. Defaults to 'hasPreviousPage'.","type":"string"},"pageLimit":{"description":"The prop name for the actual number of items per page (returned by the server). Defaults to 'pageLimit'.","type":"string"},"totalItemsCount":{"description":"The prop name for the total number of items matching the filter. Defaults to 'totalItemsCount'.","type":"string"},"totalPagesCount":{"description":"The prop name for the total number of pages. Defaults to 'totalPagesCount'.","type":"string"}}},"slot":{"$ref":"#/$defs/componentSlot"},"source":{"description":"The data source configuration for the query.","anyOf":[{"description":"Fetch pages matching a set of filter conditions. Only published pages are included. Each element will be an object with the following properties: 'id', 'path', 'title', 'publishedAt', 'props'. The 'props' property will be the parsed page props.","type":"object","properties":{"type":{"const":"Pages"},"filter":{"description":"The filter to apply to select pages.","type":"object","properties":{"pathPrefix":{"description":"The path prefix to require for pages. Defaults to all paths.","type":"string"},"props":{"description":"A set of props to filter by. The prop values must be strings.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]}}}}},"required":["type"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RadioGroupInputComponent","type":"object","properties":{"type":{"const":"RadioGroupInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a bubble icon, and its children are rendered inside a label that refers to the radio input element. For cards, there is default styling with each item's border color indicating whether it is the one selected. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"id":{"type":"string","minLength":1},"itemsContainerStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"RadioGroupInputItemComponent","description":"A radio item within a radio group input.","type":"object","properties":{"type":{"const":"RadioGroupInputItem"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RemoteComponentComponent","description":"A component that dynamically loads a remote React component with custom code from an extension.","type":"object","properties":{"type":{"const":"RemoteComponent"},"componentName":{"description":"The name of the component to display.","type":"string"},"extensionName":{"description":"The name of the extension that contains the remote component.","type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","componentName","extensionName","id"]},{"title":"RepeaterComponent","description":"A component that repeats a set of children for each item of an array or property of an object. Children are rendered with a prop for the current item. The key prop is the index for array items and the property name for objects. There is no wrapping element for children.","type":"object","properties":{"type":{"const":"Repeater"},"id":{"type":"string","minLength":1},"itemPropName":{"description":"The name of the prop for the current item. This is the array element for an array source, or the value of a property for an object source. Defaults to 'item'.","type":"string"},"keyPropName":{"description":"The name of the prop for the index or key of the current item. Defaults to 'key'.","type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"source":{"description":"The data to iterate over. Needs to evaluate to an array or an object.","anyOf":[{"description":"Use a prop as the data source.","type":"object","properties":{"type":{"const":"Prop"},"name":{"description":"The name of the prop providing the array or object.","type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RepeatingGroupInputComponent","description":"An input component that can include multiple input components and other components, allowing an array of records to be entered.","type":"object","properties":{"type":{"const":"RepeatingGroupInput"},"id":{"type":"string","minLength":1},"name":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","name"]},{"title":"RequestPasswordResetComponent","description":"A component to request password reset.","type":"object","properties":{"type":{"const":"RequestPasswordReset"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ResetPasswordComponent","description":"A component to reset a password.","type":"object","properties":{"type":{"const":"ResetPassword"},"id":{"type":"string","minLength":1},"mode":{"type":"string","enum":["create","reset"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ReviewComponent","description":"Displays a review form with 1-5 stars and redirects to the configured Google Place if the user clicks 5 stars.","type":"object","properties":{"type":{"const":"Review"},"googlePlace":{"$ref":"#/$defs/componentNullableStringValueSource"},"id":{"type":"string","minLength":1},"reviewFieldPlaceholder":{"type":"string"},"selectStarsLabel":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"SignInGuardComponent","type":"object","properties":{"type":{"const":"SignInGuard"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"SiteLogoComponent","description":"A component that displays the site logo.","type":"object","properties":{"type":{"const":"SiteLogo"},"alt":{"description":"Alternative text for the logo, defaults to the site name","type":"string"},"fallbackSiteName":{"description":"Whether to display the site name if the logo is not available","type":"boolean"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"SitePrivacyPolicyComponent","description":"A component that displays the site privacy policy.","type":"object","properties":{"type":{"const":"SitePrivacyPolicy"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"SiteTermsOfUseComponent","description":"A component that displays the site terms of use.","type":"object","properties":{"type":{"const":"SiteTermsOfUse"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageComponent","description":"A stage in a sequence.","type":"object","properties":{"type":{"const":"Stage"},"enableWrappedStageBody":{"description":"Whether to enable the wrapped stage body","type":"boolean"},"id":{"type":"string","minLength":1},"sequenceId":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageBodyComponent","description":"The body of a stage in a sequence.","type":"object","properties":{"type":{"const":"StageBody"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageNameComponent","description":"A component that displays the name of a stage.","type":"object","properties":{"type":{"const":"StageName"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"TextComponent","description":"A component that displays rich text. The content property should be an object with a delta property set to a Quill Delta object.","type":"object","properties":{"type":{"const":"Text"},"content":{"$ref":"#/$defs/richText"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"TextInputComponent","type":"object","properties":{"type":{"const":"TextInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"format":{"description":"Validation format for the input","type":"string","enum":["None","Email","Phone","Url"]},"id":{"type":"string","minLength":1},"inputElementStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"TextareaInputComponent","type":"object","properties":{"type":{"const":"TextareaInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"ThemeComponent","type":"object","properties":{"type":{"const":"Theme"},"appearance":{"type":"string","enum":["light","dark","inherit"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"TypeformComponent","description":"A component that embeds a Typeform.","type":"object","properties":{"type":{"const":"Typeform"},"formId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"UserProfileComponent","description":"A component that displays a user profile.","type":"object","properties":{"type":{"const":"UserProfile"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"VerifiedEmailAddressGuardComponent","description":"Requires that a user be signed in and have a verified email address. Otherwise displays either a message that you need to be signed in or a message and a button to send a verification email.","type":"object","properties":{"type":{"const":"VerifiedEmailAddressGuard"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"VerifyEmailAddressComponent","description":"Reads a URL query parameter that contains a unique token for verifying a user’s email address and makes an API request to mark the email address as verified. If the token is valid, it displays a message that the email address has been verified. Otherwise, it displays an error message. In either case, at the bottom it displays a 'Go to {siteName}' link that navigates to the home page.","type":"object","properties":{"type":{"const":"VerifyEmailAddress"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"VideoComponent","description":"A component that displays a video.","type":"object","properties":{"type":{"const":"Video"},"autoPlay":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"controls":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"id":{"type":"string","minLength":1},"loop":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"muted":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"playsInline":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"poster":{"description":"The URL of an image to display while the video is loading. Applicable only when tag is 'video'.","$ref":"#/$defs/componentStringValueSource"},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"$ref":"#/$defs/componentStringValueSource"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The way to render the video. Defaults to 'iframe'.","type":"string","enum":["iframe","video"]}},"additionalProperties":false,"required":["type","id"]},{"title":"ViewPlanStagesButtonComponent","description":"A button that opens a dialog that displays the stages of a sequence and allows the user to move to another stage.","type":"object","properties":{"type":{"const":"ViewPlanStagesButton"},"dialogHeader":{"type":"string"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"slot":{"$ref":"#/$defs/componentSlot"},"stageNameTableHeader":{"type":"string"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label"]},{"title":"WidthContainerComponent","description":"A div element that sets the max-width property to a specified width (defaults to 1200px). The default alignment is Center. An additional div is rendered to wrap the children to set alignment. That inner div (the direct parent element of children) cannot be styled. Only the WidthContainerComponent's outer element gets the styles, if any.","type":"object","properties":{"type":{"const":"WidthContainer"},"align":{"$ref":"#/$defs/componentAlign"},"elementId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"width":{"$ref":"#/$defs/componentWidth"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]}]}`);
|
|
26876
|
+
const type$c = "array";
|
|
26877
|
+
const items$2 = /* @__PURE__ */ JSON.parse(`{"anyOf":[{"title":"BoxComponent","description":"An element for wrapping children elements.","type":"object","properties":{"type":{"const":"Box"},"elementId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The HTML tag to use for the element. Defaults to div.","type":"string","enum":["article","aside","blockquote","code","div","fieldset","footer","h1","h2","h3","h4","h5","h6","header","label","legend","li","main","nav","ol","p","pre","section","span","ul"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ButtonComponent","type":"object","properties":{"type":{"const":"Button"},"id":{"type":"string","minLength":1},"onClick":{"description":"Defaults to submitForm.","anyOf":[{"type":"object","properties":{"type":{"const":"emitEvent"},"eventType":{"description":"A string representing a custom event type, to reference in other components that listen for events.","type":"string"}},"required":["type","eventType"]},{"type":"object","properties":{"type":{"type":"string","enum":["goBack","goBackFormStep","removeRepeatingGroupInputItem","resetForm","submitForm"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["decrementQueryParameter","incrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CalendlyEmbedComponent","description":"An embedded Calendly scheduling widget.","type":"object","properties":{"type":{"const":"CalendlyEmbed"},"id":{"type":"string","minLength":1},"queryParameters":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"parameter":{"type":"string"},"value":{"$ref":"#/$defs/componentStringValueSource"}},"required":["id","parameter","value"]}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"url":{"$ref":"#/$defs/componentStringValueSource"}},"additionalProperties":false,"required":["type","id"]},{"title":"CheckboxGroupInputComponent","description":"A group of checkboxes for selecting one or more options, represented as an array of strings in form data.","type":"object","properties":{"type":{"const":"CheckboxGroupInput"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a checkbox icon, and its children are rendered inside a label that refers to the checkbox input element. For cards, there is default styling with each item's border color indicating whether it is checked. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"id":{"type":"string","minLength":1},"itemsContainerStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"showIndicators":{"description":"Whether to show indicators for each item. Applies only if displayType is indicators. Defaults to true.","type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"CheckboxGroupInputItemComponent","description":"A checkbox item within a checkbox group input.","type":"object","properties":{"type":{"const":"CheckboxGroupInputItem"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CheckboxInputComponent","description":"A standalone checkbox. Represented as either a boolean or a string in form data. If value is set to a string and is not an empty string, it is used as the value for the input when the box is checked. Otherwise, a boolean is set as the value when the box is checked or unchecked.","type":"object","properties":{"type":{"const":"CheckboxInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"CollapsiblePanelComponent","description":"A panel that can be collapsed or expanded.","type":"object","properties":{"type":{"const":"CollapsiblePanel"},"header":{"description":"The text displayed in the clickable header.","type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"triggerButtonStyles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CompletableVideoInputComponent","type":"object","properties":{"type":{"const":"CompletableVideoInput"},"collapseCompleted":{"description":"By default, collapseCompleted is false.","type":"boolean"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"id":{"type":"string","minLength":1},"initiallyCollapsed":{"description":"Default initialCollapsed is false.","type":"boolean"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"showHeader":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"type":"string"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"ConditionalLogicComponent","type":"object","properties":{"type":{"const":"ConditionalLogic"},"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"CourseComponent","type":"object","properties":{"type":{"const":"Course"},"courseId":{"description":"If set, a Course is used instead of the legacy Plan.","type":"string"},"emptyNotesMessage":{"type":"string"},"enableNotes":{"type":"boolean"},"id":{"type":"string","minLength":1},"planId":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"CurrentYearComponent","description":"Displays the current year.","type":"object","properties":{"type":{"const":"CurrentYear"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"CustomComponentComponent","description":"A custom component (a saved fragment of components).","type":"object","properties":{"type":{"const":"CustomComponent"},"customComponentId":{"description":"The ID of the custom component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","customComponentId","id"]},{"title":"DashboardComponent","description":"A dashboard layout with a header, sidebar, and main content area.","type":"object","properties":{"type":{"const":"Dashboard"},"collapseSidebarOnPaths":{"description":"An array of path patterns as globs. If set, the sidebar will automatically be collapsed on matching paths.","type":"array","items":{"type":"string"}},"extraNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"id":{"type":"string","minLength":1},"mainNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"DateInputComponent","type":"object","properties":{"type":{"const":"DateInput"},"clearable":{"type":"boolean"},"dayPlaceholder":{"type":"string"},"id":{"type":"string","minLength":1},"inputElementStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maximumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"minimumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"monthPlaceholder":{"type":"string"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"style":{"type":"string","enum":["Calendar","3Fields"]},"styles":{"$ref":"#/$defs/componentStyleRules"},"yearPlaceholder":{"type":"string"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"DialogComponent","type":"object","properties":{"type":{"const":"Dialog"},"closeOnBackdropClick":{"description":"Whether the dialog can be closed by clicking the backdrop. Defaults to true.","type":"boolean"},"hideTriggers":{"description":"A list of events that will trigger the dialog to be hidden.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"id":{"type":"string","minLength":1},"showTriggers":{"description":"A list of events that will trigger the dialog to be shown.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"DocumentComponent","description":"A component that displays a document that can be downloaded.","type":"object","properties":{"type":{"const":"Document"},"documentId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"DropdownInputComponent","type":"object","properties":{"type":{"const":"DropdownInput"},"clearable":{"description":"Clearable is ignored if the input is required. When the input is not required, it may or may not be clearable. The default is false.","type":"boolean"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"options":{"description":"The options to show. Each option's value is both the label displayed and the value.","type":"array","items":{"type":"object","properties":{"key":{"type":"number"},"value":{"type":"string"}},"required":["key","value"]}},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name","options"]},{"title":"FormComponent","type":"object","properties":{"type":{"const":"Form"},"formId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"FormStepComponent","description":"Represents the current step in a multi-step form.","type":"object","properties":{"type":{"const":"FormStep"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"GooglePlaceInputComponent","description":"A map with a search field that lets you select a Place in Google Maps.","type":"object","properties":{"type":{"const":"GooglePlaceInput"},"id":{"type":"string","minLength":1},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","name"]},{"title":"HeaderComponent","description":"A header component with navigation items and a slot for other components. Children components must have either the LeftContent or RightContent slot property set to be rendered. No default styling is applied to children. Notice that children for either the left or right need to be enabled explicitly on mobile screens (up to 767px wide) with the showLeftContentOnMobile or showRightContentOnMobile properties. The navAlign property specifies the alignment of the navigation items element: if Center, then the nav is centered; if Left, then the nav is on the left but immediately to the right of the children with the LeftContent slot, if any; if Right, then the nav is on the right but immediately to the left of the children with the RightContent slot, if any.","type":"object","properties":{"type":{"const":"Header"},"contentMaxWidth":{"$ref":"#/$defs/componentWidth"},"id":{"type":"string","minLength":1},"navAlign":{"$ref":"#/$defs/componentAlign"},"navItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"showLeftContentOnMobile":{"description":"If true, the left content is shown on mobile. Defaults to false.","type":"boolean"},"showRightContentOnMobile":{"description":"If true, the right content is shown on mobile. Defaults to false.","type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"sticky":{"description":"If true, the header is sticky upon scrolling. Defaults to false.","type":"boolean"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"HelpTicketsPortalComponent","description":"A portal for help tickets.","type":"object","properties":{"type":{"const":"HelpTicketsPortal"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"HTMLComponent","description":"A component that renders raw HTML.","type":"object","properties":{"type":{"const":"HTML"},"html":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"IconComponent","type":"object","properties":{"type":{"const":"Icon"},"alt":{"description":"The alternative text for the icon. This should be provided only for icons that serve some purpose on their own other than decoration. Decorative icons should omit alt text to avoid unnecessary screen reader announcements.","type":"string"},"ariaHidden":{"description":"If true, the icon is hidden from the accessibility tree. This should be set to true for purely decorative icons.","type":"boolean"},"icon":{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"MaterialSymbols"},"value":{"type":"object","properties":{"fill":{"description":"If true, the icon's filled variant is used. Defaults to false.","type":"boolean"},"name":{"description":"The name of the icon. Must be one of the defined Material Symbols.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"opticalSize":{"description":"The optical size of the icon, for optimizing the appearance at different sizes. For icons rendered at 34px width or smaller, use 20. For icons rendered at bigger than 34px width, use 48. This is also the default width and height of the icon in pixels. Can be used together with CSS width and height properties. Defaults to 20.","type":"number","enum":[20,48]},"style":{"description":"The style of the icon. The outlined style is a sort of hybrid of rounded and sharp, and depending on the icon it may look exactly the same as either the rounded or sharp style. Defaults to outlined.","type":"string","enum":["outlined","rounded","sharp"]},"weight":{"description":"The weight of the icon. Similar to font-weight in that 200 is lighter and 600 is heavier. Defaults to 400.","type":"number","enum":[200,400,600]}}}},"required":["type"]}]}},"required":["type"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ImageComponent","description":"A component that displays an image.","type":"object","properties":{"type":{"const":"Image"},"alt":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageFeaturedImage","SiteLogo"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Asset"},"assetId":{"type":"string"},"variantId":{"description":"Optional ID of a specific variant to use. Should not be set together with variantIds. If not provided and variantIds is also not provided or is empty, the image is rendered with a srcset including all variants by default.","type":"string"},"variantIds":{"description":"Optional IDs of specific variants to use in the srcset attribute. Should not be set together with variantId.","type":"array","items":{"type":"string"}}},"required":["type"]}]},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"LessonNotesFieldComponent","description":"A text field for users to save notes related to a lesson (for courses).","type":"object","properties":{"type":{"const":"LessonNotesField"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label"]},{"title":"LinkComponent","description":"A link.","type":"object","properties":{"type":{"const":"Link"},"id":{"type":"string","minLength":1},"linkStyle":{"description":"Controls the visual style of the link. When \\"Button\\", renders a Button component with asChild prop and a Link inside.","type":"string","enum":["Text","Button"]},"protocol":{"description":"Adds the specified protocol prefix to the href attribute's value.","type":"string","enum":["mailto","tel","sms"]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"target":{"type":"string","enum":["_blank","_self","_parent","_top"]},"to":{"description":"The URL that the link points to. A router link will be rendered for a path without a host (using the History API). A regular link will be rendered for a full URL.","anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"enum":["IncrementQueryParameter","DecrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"MapComponent","description":"A component that displays a map. The focus property is the place to display. It can be the name of a location (the way it appears on Google Maps), an address, or a place ID with the prefix 'place_id:'.","type":"object","properties":{"type":{"const":"Map"},"focus":{"$ref":"#/$defs/componentNullableStringValueSource"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"MoveUserPlanComponent","description":"A component for a user to move between sequence stages.","type":"object","properties":{"type":{"const":"MoveUserPlan"},"id":{"type":"string","minLength":1},"nextButtonLabel":{"type":"string"},"previousButtonLabel":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"MultiOrgViewComponent","description":"A view for viewing all the orgs under a subscription, including all the users of each org and their training progress.","type":"object","properties":{"type":{"const":"MultiOrgView"},"id":{"type":"string","minLength":1},"orgLabelPlural":{"type":"string"},"orgLabelSingular":{"type":"string"},"showManageOrgs":{"type":"boolean"},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressSequenceIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type","id"]},{"title":"MultipleChoiceInputComponent","type":"object","properties":{"type":{"const":"MultipleChoiceInput"},"answerIndex":{"type":"number"},"choices":{"type":"array","items":{"type":"string"}},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"MultiSelectInputComponent","type":"object","properties":{"type":{"const":"MultiSelectInput"},"answerIndices":{"type":"array","items":{"type":"number"}},"choices":{"type":"array","items":{"type":"string"}},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"NumberInputComponent","type":"object","properties":{"type":{"const":"NumberInput"},"format":{"type":"string","enum":["Number","Currency","Integer"]},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxDecimalDigits":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"OrderFormComponent","description":"An order form for checking out for a subscription.","type":"object","properties":{"type":{"const":"OrderForm"},"checkoutOptions":{"description":"The products to display in the form. Each product may optionally have a condition that needs to evaluate to true for the product to be displayed.","type":"array","items":{"type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"subscriptionPlanId":{"type":"string"}},"required":["subscriptionPlanId"]}},"enablePhoneNumber":{"description":"Whether to enable a phone number input field. Defaults to true.","type":"boolean"},"enablePromoCode":{"description":"Whether to enable a promo code input field. If set to Stripe, only Stripe promo codes are allowed. If set to Custom, only custom promo codes are allowed. Defaults to none.","type":"string","enum":["Stripe","Custom"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgBillingSettingsComponent","description":"Org billing settings dashboard.","type":"object","properties":{"type":{"const":"OrgBillingSettings"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgSitePagesComponent","description":"Shows the pages of an org site and allows authorized users to activate and edit pages.","type":"object","properties":{"type":{"const":"OrgSitePages"},"defaultPageTemplatePreviewImageUrl":{"type":"string"},"id":{"type":"string","minLength":1},"pageTemplates":{"type":"object","properties":{"filter":{"type":"string","enum":["include","exclude"]},"ids":{"type":"array","items":{"type":"string"}}},"required":["filter","ids"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrgSiteReviewsComponent","description":"Organization site reviews component.","type":"object","properties":{"type":{"const":"OrgSiteReviews"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"OrganizationTeamComponent","description":"Organization team/members dashboard.","type":"object","properties":{"type":{"const":"OrganizationTeam"},"id":{"type":"string","minLength":1},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type","id"]},{"title":"PageComponent","description":"Represents the current page when rendered inside a layout.","type":"object","properties":{"type":{"const":"Page"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"PlainTextComponent","type":"object","properties":{"type":{"const":"PlainText"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The HTML tag to use for the element. Defaults to span.","type":"string","enum":["code","div","h1","h2","h3","h4","h5","h6","label","legend","li","p","span"]},"text":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]}},"additionalProperties":false,"required":["type","id"]},{"title":"PopoverComponent","type":"object","properties":{"type":{"const":"Popover"},"hideTriggers":{"description":"A list of events that will trigger the popover to be hidden.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"id":{"type":"string","minLength":1},"showTriggers":{"description":"A list of events that will trigger the popover to be shown.","type":"array","items":{"$ref":"#/$defs/componentTrigger"}},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ProductItemGuardComponent","description":"Ensures that a user is signed in and belongs to an org that has access to the specified product item in an active subscription. Otherwise, the component shows a default message, a custom children, or nothing, depending on how it is configured. The styling applies only to the default message.","type":"object","properties":{"type":{"const":"ProductItemGuard"},"accessDeniedMode":{"description":"The default accessDeniedMode is DefaultMessage. A custom message is defined through children with an AccessDenied slot key.","type":"string","enum":["CustomMessage","DefaultMessage","Empty"]},"id":{"type":"string","minLength":1},"productItem":{"description":"The product item to require. If not set, this component does not require anything and displays its children.","type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"ProvidePropsComponent","type":"object","properties":{"type":{"const":"ProvideProps"},"id":{"type":"string","minLength":1},"props":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"name":{"description":"The name of the prop to provide.","type":"string"},"source":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Number"},"value":{"type":"number"}},"required":["type","value"]},{"type":"object","properties":{"type":{"const":"String"},"value":{"type":"string"}},"required":["type","value"]}]}},"required":["type","value"]},{"description":"The output is a function of the input using one of the built-in format functions.","type":"object","properties":{"type":{"const":"Transform"},"format":{"type":"string","enum":["Phone number (###) ###-####","Phone number ###-###-####","U.S. State abbreviation spelled out"]},"inputPropName":{"description":"Used only in transform mode.","type":"string"}},"required":["type"]},{"description":"Produce the output prop from the LiquidJS template.","type":"object","properties":{"type":{"const":"Template"},"template":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"CustomField"},"fieldName":{"type":"string"},"object":{"description":"The object from which to read the specified field. For a page template being previewed, when the object is 'Page' the custom fields are taken instead from the page template.","type":"string","enum":["Site","Page","User"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["id","name","source"]}},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"QueryComponent","description":"A component that queries data and provides it as props to its children. Supports pagination and provides metadata about the query results.","type":"object","properties":{"type":{"const":"Query"},"id":{"type":"string","minLength":1},"pageLimitSource":{"description":"The source of the page limit. Defaults to a Direct value of 20.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]}]},"pageNumberSource":{"description":"The source of the page number. Defaults to QueryParameter 'page'. Pagination is 1-based (i.e., the first page is page 1).","anyOf":[{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"props":{"description":"Configuration for the props that will be provided to children components.","type":"object","properties":{"items":{"description":"The prop name for the array of items returned by the query. Defaults to 'items'.","type":"string"},"currentPage":{"description":"The prop name for the current page number. Defaults to 'currentPage'.","type":"string"},"hasNextPage":{"description":"The prop name for whether there is a next page. Defaults to 'hasNextPage'.","type":"string"},"hasPreviousPage":{"description":"The prop name for whether there is a previous page. Defaults to 'hasPreviousPage'.","type":"string"},"pageLimit":{"description":"The prop name for the actual number of items per page (returned by the server). Defaults to 'pageLimit'.","type":"string"},"totalItemsCount":{"description":"The prop name for the total number of items matching the filter. Defaults to 'totalItemsCount'.","type":"string"},"totalPagesCount":{"description":"The prop name for the total number of pages. Defaults to 'totalPagesCount'.","type":"string"}}},"slot":{"$ref":"#/$defs/componentSlot"},"source":{"description":"The data source configuration for the query.","anyOf":[{"description":"Fetch pages matching a set of filter conditions. Only published pages are included. Each element will be an object with the following properties: 'id', 'path', 'title', 'publishedAt', 'props'. The 'props' property will be the parsed page props.","type":"object","properties":{"type":{"const":"Pages"},"filter":{"description":"The filter to apply to select pages.","type":"object","properties":{"pathPrefix":{"description":"The path prefix to require for pages. Defaults to all paths.","type":"string"},"props":{"description":"A set of props to filter by. The prop values must be strings.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]}}}}},"required":["type"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RadioGroupInputComponent","type":"object","properties":{"type":{"const":"RadioGroupInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a bubble icon, and its children are rendered inside a label that refers to the radio input element. For cards, there is default styling with each item's border color indicating whether it is the one selected. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"id":{"type":"string","minLength":1},"itemsContainerStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"RadioGroupInputItemComponent","description":"A radio item within a radio group input.","type":"object","properties":{"type":{"const":"RadioGroupInputItem"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"value":{"$ref":"#/$defs/componentStringValueSource"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RemoteComponentComponent","description":"A component that dynamically loads a remote React component with custom code from an extension.","type":"object","properties":{"type":{"const":"RemoteComponent"},"componentName":{"description":"The name of the component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"extensionName":{"description":"The name of the extension that contains the remote component.","type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","componentName","extensionName","id"]},{"title":"RepeaterComponent","description":"A component that repeats a set of children for each item of an array or property of an object. Children are rendered with a prop for the current item. The key prop is the index for array items and the property name for objects. There is no wrapping element for children.","type":"object","properties":{"type":{"const":"Repeater"},"id":{"type":"string","minLength":1},"itemPropName":{"description":"The name of the prop for the current item. This is the array element for an array source, or the value of a property for an object source. Defaults to 'item'.","type":"string"},"keyPropName":{"description":"The name of the prop for the index or key of the current item. Defaults to 'key'.","type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"source":{"description":"The data to iterate over. Needs to evaluate to an array or an object.","anyOf":[{"description":"Use a prop as the data source.","type":"object","properties":{"type":{"const":"Prop"},"name":{"description":"The name of the prop providing the array or object.","type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"RepeatingGroupInputComponent","description":"An input component that can include multiple input components and other components, allowing an array of records to be entered.","type":"object","properties":{"type":{"const":"RepeatingGroupInput"},"id":{"type":"string","minLength":1},"name":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id","name"]},{"title":"RequestPasswordResetComponent","description":"A component to request password reset.","type":"object","properties":{"type":{"const":"RequestPasswordReset"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ResetPasswordComponent","description":"A component to reset a password.","type":"object","properties":{"type":{"const":"ResetPassword"},"id":{"type":"string","minLength":1},"mode":{"type":"string","enum":["create","reset"]},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"ReviewComponent","description":"Displays a review form with 1-5 stars and redirects to the configured Google Place if the user clicks 5 stars.","type":"object","properties":{"type":{"const":"Review"},"googlePlace":{"$ref":"#/$defs/componentNullableStringValueSource"},"id":{"type":"string","minLength":1},"reviewFieldPlaceholder":{"type":"string"},"selectStarsLabel":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"SignInGuardComponent","type":"object","properties":{"type":{"const":"SignInGuard"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"SiteLogoComponent","description":"A component that displays the site logo.","type":"object","properties":{"type":{"const":"SiteLogo"},"alt":{"description":"Alternative text for the logo, defaults to the site name","type":"string"},"fallbackSiteName":{"description":"Whether to display the site name if the logo is not available","type":"boolean"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"SitePrivacyPolicyComponent","description":"A component that displays the site privacy policy.","type":"object","properties":{"type":{"const":"SitePrivacyPolicy"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"SiteTermsOfUseComponent","description":"A component that displays the site terms of use.","type":"object","properties":{"type":{"const":"SiteTermsOfUse"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageComponent","description":"A stage in a sequence.","type":"object","properties":{"type":{"const":"Stage"},"enableWrappedStageBody":{"description":"Whether to enable the wrapped stage body","type":"boolean"},"id":{"type":"string","minLength":1},"sequenceId":{"type":"string"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageBodyComponent","description":"The body of a stage in a sequence.","type":"object","properties":{"type":{"const":"StageBody"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"StageNameComponent","description":"A component that displays the name of a stage.","type":"object","properties":{"type":{"const":"StageName"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"TextComponent","description":"A component that displays rich text. The content property should be an object with a delta property set to a Quill Delta object.","type":"object","properties":{"type":{"const":"Text"},"content":{"$ref":"#/$defs/richText"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"}},"additionalProperties":false,"required":["type","id"]},{"title":"TextInputComponent","type":"object","properties":{"type":{"const":"TextInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"format":{"description":"Validation format for the input","type":"string","enum":["None","Email","Phone","Url"]},"id":{"type":"string","minLength":1},"inputElementStyles":{"$ref":"#/$defs/componentStyleRules"},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"TextareaInputComponent","type":"object","properties":{"type":{"const":"TextareaInput"},"defaultValue":{"$ref":"#/$defs/componentStringValueSource"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label","name"]},{"title":"ThemeComponent","type":"object","properties":{"type":{"const":"Theme"},"appearance":{"type":"string","enum":["light","dark","inherit"]},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"TypeformComponent","description":"A component that embeds a Typeform.","type":"object","properties":{"type":{"const":"Typeform"},"formId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"UserProfileComponent","description":"A component that displays a user profile.","type":"object","properties":{"type":{"const":"UserProfile"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"VerifiedEmailAddressGuardComponent","description":"Requires that a user be signed in and have a verified email address. Otherwise displays either a message that you need to be signed in or a message and a button to send a verification email.","type":"object","properties":{"type":{"const":"VerifiedEmailAddressGuard"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]},{"title":"VerifyEmailAddressComponent","description":"Reads a URL query parameter that contains a unique token for verifying a user’s email address and makes an API request to mark the email address as verified. If the token is valid, it displays a message that the email address has been verified. Otherwise, it displays an error message. In either case, at the bottom it displays a 'Go to {siteName}' link that navigates to the home page.","type":"object","properties":{"type":{"const":"VerifyEmailAddress"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id"]},{"title":"VideoComponent","description":"A component that displays a video.","type":"object","properties":{"type":{"const":"Video"},"autoPlay":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"controls":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"id":{"type":"string","minLength":1},"loop":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"muted":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"playsInline":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"poster":{"description":"The URL of an image to display while the video is loading. Applicable only when tag is 'video'.","$ref":"#/$defs/componentStringValueSource"},"slot":{"$ref":"#/$defs/componentSlot"},"src":{"$ref":"#/$defs/componentStringValueSource"},"styles":{"$ref":"#/$defs/componentStyleRules"},"tag":{"description":"The way to render the video. Defaults to 'iframe'.","type":"string","enum":["iframe","video"]}},"additionalProperties":false,"required":["type","id"]},{"title":"ViewPlanStagesButtonComponent","description":"A button that opens a dialog that displays the stages of a sequence and allows the user to move to another stage.","type":"object","properties":{"type":{"const":"ViewPlanStagesButton"},"dialogHeader":{"type":"string"},"id":{"type":"string","minLength":1},"label":{"anyOf":[{"$ref":"#/$defs/componentStringValueSource"},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/componentStyleRules"},"slot":{"$ref":"#/$defs/componentSlot"},"stageNameTableHeader":{"type":"string"},"styles":{"$ref":"#/$defs/componentStyleRules"}},"additionalProperties":false,"required":["type","id","label"]},{"title":"WidthContainerComponent","description":"A div element that sets the max-width property to a specified width (defaults to 1200px). The default alignment is Center. An additional div is rendered to wrap the children to set alignment. That inner div (the direct parent element of children) cannot be styled. Only the WidthContainerComponent's outer element gets the styles, if any.","type":"object","properties":{"type":{"const":"WidthContainer"},"align":{"$ref":"#/$defs/componentAlign"},"elementId":{"type":"string"},"id":{"type":"string","minLength":1},"slot":{"$ref":"#/$defs/componentSlot"},"styles":{"$ref":"#/$defs/componentStyleRules"},"width":{"$ref":"#/$defs/componentWidth"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","id"]}]}`);
|
|
27155
26878
|
const $defs$6 = /* @__PURE__ */ JSON.parse(`{"componentAlign":{"type":"string","enum":["Center","Left","Right"]},"componentNavItem":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"label":{"description":"The text to display in the nav item.","type":"string"},"openInNewTab":{"type":"boolean"},"productItem":{"description":"If set, then only signed in users with access to the specified product item will see this nav item.","type":["string","null"]},"roles":{"description":"If set and not empty, then only signed in users with one of the specified roles will see this nav item.","type":"array","items":{"type":"string"}},"subItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItemLeaf"}},"url":{"description":"The URL to navigate to when the nav item is clicked. Can be an absolute path. Can also be an anchor link (e.g., #pricing).","type":"string"}},"required":["id","label"]},"componentNavItemLeaf":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"label":{"description":"The text to display in the nav item.","type":"string"},"openInNewTab":{"type":"boolean"},"productItem":{"description":"If set, then only signed in users with access to the specified product item will see this nav item.","type":["string","null"]},"roles":{"description":"If set and not empty, then only signed in users with one of the specified roles will see this nav item.","type":"array","items":{"type":"string"}},"url":{"description":"The URL to navigate to when the nav item is clicked. Can be an absolute path. Can also be an anchor link (e.g., #pricing).","type":"string"}},"required":["id","label","url"]},"componentNullableStringValueSource":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":["string","null"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"componentSlot":{"type":"string","enum":["True","False","AccessAllowed","AccessDenied","LeftContent","RightContent"]},"componentStringValueSource":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"componentStyleRules":{"type":"array","items":{"type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"declarations":{"description":"A list of declarations. Each property must be either a CSS property or a custom property.","type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"property":{"type":"string"},"value":{"type":"string"}},"required":["id","property","value"]}},"id":{"type":"string"},"minWidth":{"description":"Optional min-width media query for this rule. If not set, the rule applies to all widths.","type":"string","enum":["sm","md","lg","xl","xxl"]},"states":{"description":"Optional pseudo-classes for this rule to apply to. Multiple classes are combined (e.g., ':hover:last-child').","type":"array","items":{"type":"string","enum":["active","disabled","first-child","focus","focus-visible","focus-within","hover","last-child","only-child"]}}},"required":["declarations","id"]}},"componentTrigger":{"description":"A specification for an event that will trigger some action. The condition property is an expression that, if set, needs to evaluate to true for the trigger to apply.","type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"eventType":{"description":"The expected event type for the trigger to apply.","type":"string"},"id":{"description":"A random unique string for identification.","type":"string"}},"required":["eventType","id"]},"componentWidth":{"type":"string","enum":["400px","500px","600px","800px","1000px","1200px","1400px","1600px"]},"contextData":{"title":"ContextData","type":"object","additionalProperties":{"$ref":"#/$defs/contextDataDataValue"}},"contextDataDataTableRow":{"type":"object","properties":{"data":{"$ref":"#/$defs/contextData"},"id":{"type":"string"}},"required":["data","id"]},"contextDataDataValue":{"anyOf":[{"type":"boolean"},{"type":"string"},{"type":"number"},{"type":"null"},{"type":"array","items":{"$ref":"#/$defs/contextDataDataTableRow"}},{"$ref":"#/$defs/contextDataUploadedFile"},{"type":"array","items":{"type":"string"}}]},"contextDataUploadedFile":{"type":"object","properties":{"fileId":{"type":"string"}},"required":["fileId"]},"expression":{"title":"Expression","anyOf":[{"$ref":"#/$defs/expressionArrayExpression"},{"$ref":"#/$defs/expressionBooleanExpression"},{"$ref":"#/$defs/expressionNumberExpression"},{"$ref":"#/$defs/expressionStringExpression"}]},"expressionAll":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"all"}},"required":["arrayExpression","condition","operator"]},"expressionArrayExpression":{"anyOf":[{"$ref":"#/$defs/expressionArrayLiteral"},{"$ref":"#/$defs/expressionFilter"},{"$ref":"#/$defs/expressionMap"},{"$ref":"#/$defs/expressionUserProductItems"},{"$ref":"#/$defs/expressionDynamicValue"}]},"expressionArrayIncludes":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"operator":{"const":"arrayIncludes"},"value":{"$ref":"#/$defs/expression"}},"required":["arrayExpression","operator","value"]},"expressionArrayLiteral":{"type":"object","properties":{"operator":{"const":"arrayLiteral"},"value":{"type":"array","items":{"$ref":"#/$defs/expression"}}},"required":["operator","value"]},"expressionBooleanExpression":{"anyOf":[{"$ref":"#/$defs/expressionAll"},{"$ref":"#/$defs/expressionArrayIncludes"},{"$ref":"#/$defs/expressionBoth"},{"$ref":"#/$defs/expressionBooleanLiteral"},{"$ref":"#/$defs/expressionEither"},{"$ref":"#/$defs/expressionEquals"},{"$ref":"#/$defs/expressionExists"},{"$ref":"#/$defs/expressionGreaterThan"},{"$ref":"#/$defs/expressionNot"},{"$ref":"#/$defs/expressionSome"},{"$ref":"#/$defs/expressionDynamicValue"}]},"expressionBooleanLiteral":{"type":"object","properties":{"operator":{"const":"booleanLiteral"},"value":{"type":"boolean"}},"required":["operator","value"]},"expressionBoth":{"type":"object","properties":{"left":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"both"},"right":{"$ref":"#/$defs/expressionBooleanExpression"}},"required":["left","operator","right"]},"expressionCurrentTime":{"description":"A timestamp in milliseconds since epoch.","type":"object","properties":{"operator":{"const":"currentTime"}},"required":["operator"]},"expressionDataValue":{"description":"Access a value from the data object. The source of the data depends on the context. For example, in a form the data object is the form data and the name is the name of the input component.","type":"object","properties":{"name":{"type":"string"},"operator":{"const":"dataValue"}},"required":["name","operator"]},"expressionDynamicValue":{"anyOf":[{"$ref":"#/$defs/expressionDataValue"},{"$ref":"#/$defs/expressionProp"}]},"expressionEither":{"type":"object","properties":{"left":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"either"},"right":{"$ref":"#/$defs/expressionBooleanExpression"}},"required":["left","operator","right"]},"expressionEquals":{"type":"object","properties":{"left":{"$ref":"#/$defs/expression"},"operator":{"const":"equals"},"right":{"$ref":"#/$defs/expression"}},"required":["left","operator","right"]},"expressionEventType":{"description":"Access the type set on an event. Applicable only in contexts where the expression deals with an event.","type":"object","properties":{"operator":{"const":"eventType"}},"required":["operator"]},"expressionExists":{"type":"object","properties":{"expression":{"$ref":"#/$defs/expression"},"operator":{"const":"exists"}},"required":["expression","operator"]},"expressionFilter":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"filterExpression":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"filter"}},"required":["arrayExpression","filterExpression","operator"]},"expressionGreaterThan":{"type":"object","properties":{"left":{"$ref":"#/$defs/expressionNumberExpression"},"operator":{"const":"greaterThan"},"right":{"$ref":"#/$defs/expressionNumberExpression"}},"required":["left","operator","right"]},"expressionLength":{"type":"object","properties":{"operator":{"const":"length"},"value":{"anyOf":[{"$ref":"#/$defs/expressionArrayExpression"},{"$ref":"#/$defs/expressionStringExpression"}]}},"required":["operator","value"]},"expressionMap":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"mapExpression":{"$ref":"#/$defs/expression"},"operator":{"const":"map"}},"required":["arrayExpression","mapExpression","operator"]},"expressionNot":{"type":"object","properties":{"expression":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"not"}},"required":["expression","operator"]},"expressionNumberExpression":{"anyOf":[{"$ref":"#/$defs/expressionCurrentTime"},{"$ref":"#/$defs/expressionLength"},{"$ref":"#/$defs/expressionNumberLiteral"},{"$ref":"#/$defs/expressionSum"},{"$ref":"#/$defs/expressionSumArray"},{"$ref":"#/$defs/expressionTimeLiteral"},{"$ref":"#/$defs/expressionDynamicValue"}]},"expressionNumberLiteral":{"type":"object","properties":{"operator":{"const":"numberLiteral"},"value":{"type":"number"}},"required":["operator","value"]},"expressionProp":{"description":"Access a value from props. Applicable only in contexts where the expression deals with props.","type":"object","properties":{"name":{"type":"string"},"operator":{"const":"prop"}},"required":["name","operator"]},"expressionSome":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"condition":{"$ref":"#/$defs/expressionBooleanExpression"},"operator":{"const":"some"}},"required":["arrayExpression","condition","operator"]},"expressionStringExpression":{"anyOf":[{"$ref":"#/$defs/expressionEventType"},{"$ref":"#/$defs/expressionStringLiteral"},{"$ref":"#/$defs/expressionUserRole"},{"$ref":"#/$defs/expressionDynamicValue"}]},"expressionStringLiteral":{"type":"object","properties":{"operator":{"const":"stringLiteral"},"value":{"type":"string"}},"required":["operator","value"]},"expressionSum":{"type":"object","properties":{"left":{"$ref":"#/$defs/expressionNumberExpression"},"operator":{"const":"sum"},"right":{"$ref":"#/$defs/expressionNumberExpression"}},"required":["left","operator","right"]},"expressionSumArray":{"type":"object","properties":{"arrayExpression":{"$ref":"#/$defs/expressionArrayExpression"},"operator":{"const":"sumArray"}},"required":["arrayExpression","operator"]},"expressionTimeLiteral":{"description":"A timestamp in milliseconds since epoch.","type":"object","properties":{"operator":{"const":"timeLiteral"},"value":{"type":"number"}},"required":["operator","value"]},"expressionUserProductItems":{"type":"object","properties":{"operator":{"const":"userProductItems"}},"required":["operator"]},"expressionUserRole":{"type":"object","properties":{"operator":{"const":"userRole"}},"required":["operator"]},"richText":{"title":"RichText","oneOf":[{"title":"Delta","type":"object","properties":{"delta":{"type":"object","properties":{"ops":{"type":"array","items":{"type":"object","properties":{"attributes":{"type":"object","additionalProperties":true},"insert":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"required":["insert"]}}},"required":["ops"]}},"required":["delta"]}]}}`);
|
|
27156
|
-
const $id$
|
|
26879
|
+
const $id$c = "/designer/components.json";
|
|
27157
26880
|
const componentsSchema = {
|
|
27158
|
-
type: type$
|
|
26881
|
+
type: type$c,
|
|
27159
26882
|
items: items$2,
|
|
27160
26883
|
$defs: $defs$6,
|
|
27161
|
-
$id: $id$
|
|
26884
|
+
$id: $id$c
|
|
27162
26885
|
};
|
|
27163
|
-
const type$
|
|
27164
|
-
const items$1 = /* @__PURE__ */ JSON.parse(`{"anyOf":[{"description":"An element for wrapping children elements.","type":"object","properties":{"type":{"const":"Box"},"elementId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The HTML tag to use for the element. Defaults to div.","type":"string","enum":["article","aside","blockquote","code","div","fieldset","footer","h1","h2","h3","h4","h5","h6","header","label","legend","li","main","nav","ol","p","pre","section","span","ul"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Button"},"onClick":{"description":"Defaults to submitForm.","anyOf":[{"type":"object","properties":{"type":{"const":"emitEvent"},"eventType":{"description":"A string representing a custom event type, to reference in other components that listen for events.","type":"string"}},"required":["type","eventType"]},{"type":"object","properties":{"type":{"type":"string","enum":["goBack","goBackFormStep","removeRepeatingGroupInputItem","resetForm","submitForm"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["decrementQueryParameter","incrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"An embedded Calendly scheduling widget.","type":"object","properties":{"type":{"const":"CalendlyEmbed"},"queryParameters":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"parameter":{"type":"string"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["id","parameter","value"]}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"url":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"additionalProperties":false,"required":["type"]},{"description":"A group of checkboxes for selecting one or more options, represented as an array of strings in form data.","type":"object","properties":{"type":{"const":"CheckboxGroupInput"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a checkbox icon, and its children are rendered inside a label that refers to the checkbox input element. For cards, there is default styling with each item's border color indicating whether it is checked. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"itemsContainerStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"showIndicators":{"description":"Whether to show indicators for each item. Applies only if displayType is indicators. Defaults to true.","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A checkbox item within a checkbox group input.","type":"object","properties":{"type":{"const":"CheckboxGroupInputItem"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A standalone checkbox. Represented as either a boolean or a string in form data. If value is set to a string and is not an empty string, it is used as the value for the input when the box is checked. Otherwise, a boolean is set as the value when the box is checked or unchecked.","type":"object","properties":{"type":{"const":"CheckboxInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A panel that can be collapsed or expanded.","type":"object","properties":{"type":{"const":"CollapsiblePanel"},"header":{"description":"The text displayed in the clickable header.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"triggerButtonStyles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"CompletableVideoInput"},"collapseCompleted":{"description":"By default, collapseCompleted is false.","type":"boolean"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"initiallyCollapsed":{"description":"Default initialCollapsed is false.","type":"boolean"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"showHeader":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"src":{"type":"string"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"ConditionalLogic"},"condition":{"$ref":"#/$defs/expressionBoolean"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Course"},"courseId":{"description":"If set, a Course is used instead of the legacy Plan.","type":"string"},"emptyNotesMessage":{"type":"string"},"enableNotes":{"type":"boolean"},"planId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Displays the current year.","type":"object","properties":{"type":{"const":"CurrentYear"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A custom component (a saved fragment of components).","type":"object","properties":{"type":{"const":"CustomComponent"},"customComponentId":{"description":"The ID of the custom component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type","customComponentId"]},{"description":"A dashboard layout with a header, sidebar, and main content area.","type":"object","properties":{"type":{"const":"Dashboard"},"collapseSidebarOnPaths":{"description":"An array of path patterns as globs. If set, the sidebar will automatically be collapsed on matching paths.","type":"array","items":{"type":"string"}},"extraNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"mainNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"DateInput"},"clearable":{"type":"boolean"},"dayPlaceholder":{"type":"string"},"inputElementStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maximumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"minimumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"monthPlaceholder":{"type":"string"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"style":{"type":"string","enum":["Calendar","3Fields"]},"styles":{"$ref":"#/$defs/styles"},"yearPlaceholder":{"type":"string"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"Dialog"},"closeOnBackdropClick":{"description":"Whether the dialog can be closed by clicking the backdrop. Defaults to true.","type":"boolean"},"hideTriggers":{"description":"A list of events that will trigger the dialog to be hidden.","type":"array","items":{"$ref":"#/$defs/trigger"}},"showTriggers":{"description":"A list of events that will trigger the dialog to be shown.","type":"array","items":{"$ref":"#/$defs/trigger"}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a document that can be downloaded.","type":"object","properties":{"type":{"const":"Document"},"documentId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"DropdownInput"},"clearable":{"description":"Clearable is ignored if the input is required. When the input is not required, it may or may not be clearable. The default is false.","type":"boolean"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"options":{"description":"The options to show. Each string is both the label displayed and the value.","type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name","options"]},{"type":"object","properties":{"type":{"const":"Form"},"formId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Represents the current step in a multi-step form.","type":"object","properties":{"type":{"const":"FormStep"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A map with a search field that lets you select a Place in Google Maps.","type":"object","properties":{"type":{"const":"GooglePlaceInput"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","name"]},{"description":"A header component with navigation items and a slot for other components. Children components must have either the LeftContent or RightContent slot property set to be rendered. No default styling is applied to children. Notice that children for either the left or right need to be enabled explicitly on mobile screens (up to 767px wide) with the showLeftContentOnMobile or showRightContentOnMobile properties. The navAlign property specifies the alignment of the navigation items element: if Center, then the nav is centered; if Left, then the nav is on the left but immediately to the right of the children with the LeftContent slot, if any; if Right, then the nav is on the right but immediately to the left of the children with the RightContent slot, if any.","type":"object","properties":{"type":{"const":"Header"},"contentMaxWidth":{"$ref":"#/$defs/width"},"navAlign":{"$ref":"#/$defs/align"},"navItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"showLeftContentOnMobile":{"description":"If true, the left content is shown on mobile. Defaults to false.","type":"boolean"},"showRightContentOnMobile":{"description":"If true, the right content is shown on mobile. Defaults to false.","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"sticky":{"description":"If true, the header is sticky upon scrolling. Defaults to false.","type":"boolean"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A portal for help tickets.","type":"object","properties":{"type":{"const":"HelpTicketsPortal"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that renders raw HTML.","type":"object","properties":{"type":{"const":"HTML"},"html":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Icon"},"alt":{"description":"The alternative text for the icon. This should be provided only for icons that serve some purpose on their own other than decoration. Decorative icons should omit alt text to avoid unnecessary screen reader announcements.","type":"string"},"ariaHidden":{"description":"If true, the icon is hidden from the accessibility tree. This should be set to true for purely decorative icons.","type":"boolean"},"icon":{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"MaterialSymbols"},"value":{"type":"object","properties":{"fill":{"description":"If true, the icon's filled variant is used. Defaults to false.","type":"boolean"},"name":{"description":"The name of the icon. Must be one of the defined Material Symbols.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"opticalSize":{"description":"The optical size of the icon, for optimizing the appearance at different sizes. For icons rendered at 34px width or smaller, use 20. For icons rendered at bigger than 34px width, use 48. This is also the default width and height of the icon in pixels. Can be used together with CSS width and height properties. Defaults to 20.","type":"number","enum":[20,48]},"style":{"description":"The style of the icon. The outlined style is a sort of hybrid of rounded and sharp, and depending on the icon it may look exactly the same as either the rounded or sharp style. Defaults to outlined.","type":"string","enum":["outlined","rounded","sharp"]},"weight":{"description":"The weight of the icon. Similar to font-weight in that 200 is lighter and 600 is heavier. Defaults to 400.","type":"number","enum":[200,400,600]}}}},"required":["type"]}]}},"required":["type"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays an image.","type":"object","properties":{"type":{"const":"Image"},"alt":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"src":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageFeaturedImage","SiteLogo"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Asset"},"assetId":{"type":"string"},"variantId":{"description":"Optional ID of a specific variant to use. Should not be set together with variantIds. If not provided and variantIds is also not provided or is empty, the image is rendered with a srcset including all variants by default.","type":"string"},"variantIds":{"description":"Optional IDs of specific variants to use in the srcset attribute. Should not be set together with variantId.","type":"array","items":{"type":"string"}}},"required":["type"]}]},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A text field for users to save notes related to a lesson (for courses).","type":"object","properties":{"type":{"const":"LessonNotesField"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label"]},{"description":"A link.","type":"object","properties":{"type":{"const":"Link"},"linkStyle":{"description":"Controls the visual style of the link. When \\"Button\\", renders a Button component with asChild prop and a Link inside.","type":"string","enum":["Text","Button"]},"protocol":{"description":"Adds the specified protocol prefix to the href attribute's value.","type":"string","enum":["mailto","tel","sms"]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"target":{"type":"string","enum":["_blank","_self","_parent","_top"]},"to":{"description":"The URL that the link points to. A router link will be rendered for a path without a host (using the History API). A regular link will be rendered for a full URL.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a map. The focus property is the place to display. It can be the name of a location (the way it appears on Google Maps), an address, or a place ID with the prefix 'place_id:'.","type":"object","properties":{"type":{"const":"Map"},"focus":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":["string","null"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component for a user to move between sequence stages.","type":"object","properties":{"type":{"const":"MoveUserPlan"},"nextButtonLabel":{"type":"string"},"previousButtonLabel":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A view for viewing all the orgs under a subscription, including all the users of each org and their training progress.","type":"object","properties":{"type":{"const":"MultiOrgView"},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressSequenceIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"MultipleChoiceInput"},"answerIndex":{"type":"number"},"choices":{"type":"array","items":{"type":"string"}},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"MultiSelectInput"},"answerIndices":{"type":"array","items":{"type":"number"}},"choices":{"type":"array","items":{"type":"string"}},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"NumberInput"},"format":{"type":"string","enum":["Number","Currency","Integer"]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxDecimalDigits":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"An order form for checking out for a subscription.","type":"object","properties":{"type":{"const":"OrderForm"},"checkoutOptions":{"description":"The products to display in the form. Each product may optionally have a condition that needs to evaluate to true for the product to be displayed.","type":"array","items":{"type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBoolean"},"subscriptionPlanId":{"type":"string"}},"required":["subscriptionPlanId"]}},"enablePhoneNumber":{"description":"Whether to enable a phone number input field. Defaults to true.","type":"boolean"},"enablePromoCode":{"description":"Whether to enable a promo code input field. If set to Stripe, only Stripe promo codes are allowed. If set to Custom, only custom promo codes are allowed. Defaults to none.","type":"string","enum":["Stripe","Custom"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Org billing settings dashboard.","type":"object","properties":{"type":{"const":"OrgBillingSettings"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Shows the pages of an org site and allows authorized users to activate and edit pages.","type":"object","properties":{"type":{"const":"OrgSitePages"},"defaultPageTemplatePreviewImageUrl":{"type":"string"},"pageTemplates":{"type":"object","properties":{"filter":{"type":"string","enum":["include","exclude"]},"ids":{"type":"array","items":{"type":"string"}}},"required":["filter","ids"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Organization site reviews component.","type":"object","properties":{"type":{"const":"OrgSiteReviews"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Organization team/members dashboard.","type":"object","properties":{"type":{"const":"OrganizationTeam"},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type"]},{"description":"Represents the current page when rendered inside a layout.","type":"object","properties":{"type":{"const":"Page"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"PlainText"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The HTML tag to use for the element. Defaults to span.","type":"string","enum":["code","div","h1","h2","h3","h4","h5","h6","label","legend","li","p","span"]},"text":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Popover"},"hideTriggers":{"description":"A list of events that will trigger the popover to be hidden.","type":"array","items":{"$ref":"#/$defs/trigger"}},"showTriggers":{"description":"A list of events that will trigger the popover to be shown.","type":"array","items":{"$ref":"#/$defs/trigger"}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"Ensures that a user is signed in and belongs to an org that has access to the specified product item in an active subscription. Otherwise, the component shows a default message, a custom children, or nothing, depending on how it is configured. The styling applies only to the default message.","type":"object","properties":{"type":{"const":"ProductItemGuard"},"accessDeniedMode":{"description":"The default accessDeniedMode is DefaultMessage. A custom message is defined through children with an AccessDenied slot key.","type":"string","enum":["CustomMessage","DefaultMessage","Empty"]},"productItem":{"description":"The product item to require. If not set, this component does not require anything and displays its children.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"ProvideProps"},"props":{"type":"array","items":{"type":"object","properties":{"name":{"description":"The name of the prop to provide.","type":"string"},"source":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Number"},"value":{"type":"number"}},"required":["type","value"]},{"type":"object","properties":{"type":{"const":"String"},"value":{"type":"string"}},"required":["type","value"]}]}},"required":["type","value"]},{"description":"The output is a function of the input using one of the built-in format functions.","type":"object","properties":{"type":{"const":"Transform"},"format":{"type":"string","enum":["Phone number (###) ###-####","Phone number ###-###-####","U.S. State abbreviation spelled out"]},"inputPropName":{"description":"Used only in transform mode.","type":"string"}},"required":["type"]},{"description":"Produce the output prop from the LiquidJS template.","type":"object","properties":{"type":{"const":"Template"},"template":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"CustomField"},"fieldName":{"type":"string"},"object":{"description":"The object from which to read the specified field. For a page template being previewed, when the object is 'Page' the custom fields are taken instead from the page template.","type":"string","enum":["Site","Page","User"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["name","source"]}},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that queries data and provides it as props to its children. Supports pagination and provides metadata about the query results.","type":"object","properties":{"type":{"const":"Query"},"pageLimitSource":{"description":"The source of the page limit. Defaults to a Direct value of 20.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]}]},"pageNumberSource":{"description":"The source of the page number. Defaults to QueryParameter 'page'. Pagination is 1-based (i.e., the first page is page 1).","anyOf":[{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"props":{"description":"Configuration for the props that will be provided to children components.","type":"object","properties":{"items":{"description":"The prop name for the array of items returned by the query. Defaults to 'items'.","type":"string"},"currentPage":{"description":"The prop name for the current page number. Defaults to 'currentPage'.","type":"string"},"hasNextPage":{"description":"The prop name for whether there is a next page. Defaults to 'hasNextPage'.","type":"string"},"hasPreviousPage":{"description":"The prop name for whether there is a previous page. Defaults to 'hasPreviousPage'.","type":"string"},"pageLimit":{"description":"The prop name for the actual number of items per page (returned by the server). Defaults to 'pageLimit'.","type":"string"},"totalItemsCount":{"description":"The prop name for the total number of items matching the filter. Defaults to 'totalItemsCount'.","type":"string"},"totalPagesCount":{"description":"The prop name for the total number of pages. Defaults to 'totalPagesCount'.","type":"string"}}},"slot":{"$ref":"#/$defs/slot"},"source":{"description":"The data source configuration for the query.","anyOf":[{"description":"Fetch pages matching a set of filter conditions. Only published pages are included. Each element will be an object with the following properties: 'id', 'path', 'title', 'publishedAt', 'props'. The 'props' property will be the parsed page props.","type":"object","properties":{"type":{"const":"Pages"},"filter":{"description":"The filter to apply to select pages.","type":"object","properties":{"pathPrefix":{"description":"The path prefix to require for pages. Defaults to all paths.","type":"string"},"props":{"description":"A set of props to filter by. The prop values must be strings.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]}}}}},"required":["type"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"RadioGroupInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a bubble icon, and its children are rendered inside a label that refers to the radio input element. For cards, there is default styling with each item's border color indicating whether it is the one selected. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"itemsContainerStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A radio item within a radio group input.","type":"object","properties":{"type":{"const":"RadioGroupInputItem"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that dynamically loads a remote React component with custom code from an extension.","type":"object","properties":{"type":{"const":"RemoteComponent"},"componentName":{"description":"The name of the component to display.","type":"string"},"extensionName":{"description":"The name of the extension that contains the remote component.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","componentName","extensionName"]},{"description":"A component that repeats a set of children for each item of an array or property of an object. Children are rendered with a prop for the current item. The key prop is the index for array items and the property name for objects. There is no wrapping element for children.","type":"object","properties":{"type":{"const":"Repeater"},"itemPropName":{"description":"The name of the prop for the current item. This is the array element for an array source, or the value of a property for an object source. Defaults to 'item'.","type":"string"},"keyPropName":{"description":"The name of the prop for the index or key of the current item. Defaults to 'key'.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"source":{"description":"The data to iterate over. Needs to evaluate to an array or an object.","anyOf":[{"description":"Use a prop as the data source.","type":"object","properties":{"type":{"const":"Prop"},"name":{"description":"The name of the prop providing the array or object.","type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"An input component that can include multiple input components and other components, allowing an array of records to be entered.","type":"object","properties":{"type":{"const":"RepeatingGroupInput"},"name":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","name"]},{"description":"A component to request password reset.","type":"object","properties":{"type":{"const":"RequestPasswordReset"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component to reset a password.","type":"object","properties":{"type":{"const":"ResetPassword"},"mode":{"type":"string","enum":["create","reset"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Displays a review form with 1-5 stars and redirects to the configured Google Place if the user clicks 5 stars.","type":"object","properties":{"type":{"const":"Review"},"googlePlace":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":["string","null"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"reviewFieldPlaceholder":{"type":"string"},"selectStarsLabel":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"SignInGuard"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site logo.","type":"object","properties":{"type":{"const":"SiteLogo"},"alt":{"description":"Alternative text for the logo, defaults to the site name","type":"string"},"fallbackSiteName":{"description":"Whether to display the site name if the logo is not available","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site privacy policy.","type":"object","properties":{"type":{"const":"SitePrivacyPolicy"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site terms of use.","type":"object","properties":{"type":{"const":"SiteTermsOfUse"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A stage in a sequence.","type":"object","properties":{"type":{"const":"Stage"},"enableWrappedStageBody":{"description":"Whether to enable the wrapped stage body","type":"boolean"},"sequenceId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"The body of a stage in a sequence.","type":"object","properties":{"type":{"const":"StageBody"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the name of a stage.","type":"object","properties":{"type":{"const":"StageName"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays rich text. The content property should be an object with a delta property set to a Quill Delta object.","type":"object","properties":{"type":{"const":"Text"},"content":{"title":"RichText","anyOf":[{"title":"Delta","type":"object","properties":{"delta":{"type":"object","properties":{"ops":{"type":"array","items":{"type":"object","properties":{"attributes":{"type":"object","additionalProperties":true},"insert":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"required":["insert"]}}},"required":["ops"]}},"required":["delta"]}]},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"TextInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"format":{"description":"Validation format for the input","type":"string","enum":["None","Email","Phone","Url"]},"inputElementStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"TextareaInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"Theme"},"appearance":{"type":"string","enum":["light","dark","inherit"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that embeds a Typeform.","type":"object","properties":{"type":{"const":"Typeform"},"formId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a user profile.","type":"object","properties":{"type":{"const":"UserProfile"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Requires that a user be signed in and have a verified email address. Otherwise displays either a message that you need to be signed in or a message and a button to send a verification email.","type":"object","properties":{"type":{"const":"VerifiedEmailAddressGuard"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"Reads a URL query parameter that contains a unique token for verifying a user’s email address and makes an API request to mark the email address as verified. If the token is valid, it displays a message that the email address has been verified. Otherwise, it displays an error message. In either case, at the bottom it displays a 'Go to {siteName}' link that navigates to the home page.","type":"object","properties":{"type":{"const":"VerifyEmailAddress"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a video.","type":"object","properties":{"type":{"const":"Video"},"autoPlay":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"controls":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"loop":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"muted":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"playsInline":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"poster":{"description":"The URL of an image to display while the video is loading. Applicable only when tag is 'video'.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"src":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The way to render the video. Defaults to 'iframe'.","type":"string","enum":["iframe","video"]}},"additionalProperties":false,"required":["type"]},{"description":"A button that opens a dialog that displays the stages of a sequence and allows the user to move to another stage.","type":"object","properties":{"type":{"const":"ViewPlanStagesButton"},"dialogHeader":{"type":"string"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"slot":{"$ref":"#/$defs/slot"},"stageNameTableHeader":{"type":"string"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label"]},{"description":"A div element that sets the max-width property to a specified width (defaults to 1200px). The default alignment is Center. An additional div is rendered to wrap the children to set alignment. That inner div (the direct parent element of children) cannot be styled. Only the WidthContainerComponent's outer element gets the styles, if any.","type":"object","properties":{"type":{"const":"WidthContainer"},"align":{"$ref":"#/$defs/align"},"elementId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"width":{"$ref":"#/$defs/width"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]}]}`);
|
|
26886
|
+
const type$b = "array";
|
|
26887
|
+
const items$1 = /* @__PURE__ */ JSON.parse(`{"anyOf":[{"description":"An element for wrapping children elements.","type":"object","properties":{"type":{"const":"Box"},"elementId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The HTML tag to use for the element. Defaults to div.","type":"string","enum":["article","aside","blockquote","code","div","fieldset","footer","h1","h2","h3","h4","h5","h6","header","label","legend","li","main","nav","ol","p","pre","section","span","ul"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Button"},"onClick":{"description":"Defaults to submitForm.","anyOf":[{"type":"object","properties":{"type":{"const":"emitEvent"},"eventType":{"description":"A string representing a custom event type, to reference in other components that listen for events.","type":"string"}},"required":["type","eventType"]},{"type":"object","properties":{"type":{"type":"string","enum":["goBack","goBackFormStep","removeRepeatingGroupInputItem","resetForm","submitForm"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["decrementQueryParameter","incrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"An embedded Calendly scheduling widget.","type":"object","properties":{"type":{"const":"CalendlyEmbed"},"queryParameters":{"type":"array","items":{"type":"object","properties":{"id":{"description":"A random unique string for identification.","type":"string"},"parameter":{"type":"string"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["id","parameter","value"]}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"url":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"additionalProperties":false,"required":["type"]},{"description":"A group of checkboxes for selecting one or more options, represented as an array of strings in form data.","type":"object","properties":{"type":{"const":"CheckboxGroupInput"},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a checkbox icon, and its children are rendered inside a label that refers to the checkbox input element. For cards, there is default styling with each item's border color indicating whether it is checked. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"itemsContainerStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"showIndicators":{"description":"Whether to show indicators for each item. Applies only if displayType is indicators. Defaults to true.","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A checkbox item within a checkbox group input.","type":"object","properties":{"type":{"const":"CheckboxGroupInputItem"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A standalone checkbox. Represented as either a boolean or a string in form data. If value is set to a string and is not an empty string, it is used as the value for the input when the box is checked. Otherwise, a boolean is set as the value when the box is checked or unchecked.","type":"object","properties":{"type":{"const":"CheckboxInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A panel that can be collapsed or expanded.","type":"object","properties":{"type":{"const":"CollapsiblePanel"},"header":{"description":"The text displayed in the clickable header.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"triggerButtonStyles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"CompletableVideoInput"},"collapseCompleted":{"description":"By default, collapseCompleted is false.","type":"boolean"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"boolean"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"initiallyCollapsed":{"description":"Default initialCollapsed is false.","type":"boolean"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"showHeader":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"src":{"type":"string"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"ConditionalLogic"},"condition":{"$ref":"#/$defs/expressionBoolean"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Course"},"courseId":{"description":"If set, a Course is used instead of the legacy Plan.","type":"string"},"emptyNotesMessage":{"type":"string"},"enableNotes":{"type":"boolean"},"planId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Displays the current year.","type":"object","properties":{"type":{"const":"CurrentYear"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A custom component (a saved fragment of components).","type":"object","properties":{"type":{"const":"CustomComponent"},"customComponentId":{"description":"The ID of the custom component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type","customComponentId"]},{"description":"A dashboard layout with a header, sidebar, and main content area.","type":"object","properties":{"type":{"const":"Dashboard"},"collapseSidebarOnPaths":{"description":"An array of path patterns as globs. If set, the sidebar will automatically be collapsed on matching paths.","type":"array","items":{"type":"string"}},"extraNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"mainNavItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"DateInput"},"clearable":{"type":"boolean"},"dayPlaceholder":{"type":"string"},"inputElementStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maximumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"minimumDate":{"anyOf":[{"type":"object","properties":{"type":{"const":"today"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"date"},"value":{"type":"string"}},"required":["type","value"]}]},"monthPlaceholder":{"type":"string"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"style":{"type":"string","enum":["Calendar","3Fields"]},"styles":{"$ref":"#/$defs/styles"},"yearPlaceholder":{"type":"string"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"Dialog"},"closeOnBackdropClick":{"description":"Whether the dialog can be closed by clicking the backdrop. Defaults to true.","type":"boolean"},"hideTriggers":{"description":"A list of events that will trigger the dialog to be hidden.","type":"array","items":{"$ref":"#/$defs/trigger"}},"showTriggers":{"description":"A list of events that will trigger the dialog to be shown.","type":"array","items":{"$ref":"#/$defs/trigger"}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a document that can be downloaded.","type":"object","properties":{"type":{"const":"Document"},"documentId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"DropdownInput"},"clearable":{"description":"Clearable is ignored if the input is required. When the input is not required, it may or may not be clearable. The default is false.","type":"boolean"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"options":{"description":"The options to show. Each string is both the label displayed and the value.","type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name","options"]},{"type":"object","properties":{"type":{"const":"Form"},"formId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Represents the current step in a multi-step form.","type":"object","properties":{"type":{"const":"FormStep"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A map with a search field that lets you select a Place in Google Maps.","type":"object","properties":{"type":{"const":"GooglePlaceInput"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","name"]},{"description":"A header component with navigation items and a slot for other components. Children components must have either the LeftContent or RightContent slot property set to be rendered. No default styling is applied to children. Notice that children for either the left or right need to be enabled explicitly on mobile screens (up to 767px wide) with the showLeftContentOnMobile or showRightContentOnMobile properties. The navAlign property specifies the alignment of the navigation items element: if Center, then the nav is centered; if Left, then the nav is on the left but immediately to the right of the children with the LeftContent slot, if any; if Right, then the nav is on the right but immediately to the left of the children with the RightContent slot, if any.","type":"object","properties":{"type":{"const":"Header"},"contentMaxWidth":{"$ref":"#/$defs/width"},"navAlign":{"$ref":"#/$defs/align"},"navItems":{"type":"array","items":{"$ref":"#/$defs/componentNavItem"}},"showLeftContentOnMobile":{"description":"If true, the left content is shown on mobile. Defaults to false.","type":"boolean"},"showRightContentOnMobile":{"description":"If true, the right content is shown on mobile. Defaults to false.","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"sticky":{"description":"If true, the header is sticky upon scrolling. Defaults to false.","type":"boolean"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A portal for help tickets.","type":"object","properties":{"type":{"const":"HelpTicketsPortal"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that renders raw HTML.","type":"object","properties":{"type":{"const":"HTML"},"html":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Icon"},"alt":{"description":"The alternative text for the icon. This should be provided only for icons that serve some purpose on their own other than decoration. Decorative icons should omit alt text to avoid unnecessary screen reader announcements.","type":"string"},"ariaHidden":{"description":"If true, the icon is hidden from the accessibility tree. This should be set to true for purely decorative icons.","type":"boolean"},"icon":{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"MaterialSymbols"},"value":{"type":"object","properties":{"fill":{"description":"If true, the icon's filled variant is used. Defaults to false.","type":"boolean"},"name":{"description":"The name of the icon. Must be one of the defined Material Symbols.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"opticalSize":{"description":"The optical size of the icon, for optimizing the appearance at different sizes. For icons rendered at 34px width or smaller, use 20. For icons rendered at bigger than 34px width, use 48. This is also the default width and height of the icon in pixels. Can be used together with CSS width and height properties. Defaults to 20.","type":"number","enum":[20,48]},"style":{"description":"The style of the icon. The outlined style is a sort of hybrid of rounded and sharp, and depending on the icon it may look exactly the same as either the rounded or sharp style. Defaults to outlined.","type":"string","enum":["outlined","rounded","sharp"]},"weight":{"description":"The weight of the icon. Similar to font-weight in that 200 is lighter and 600 is heavier. Defaults to 400.","type":"number","enum":[200,400,600]}}}},"required":["type"]}]}},"required":["type"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays an image.","type":"object","properties":{"type":{"const":"Image"},"alt":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"src":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageFeaturedImage","SiteLogo"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Asset"},"assetId":{"type":"string"},"variantId":{"description":"Optional ID of a specific variant to use. Should not be set together with variantIds. If not provided and variantIds is also not provided or is empty, the image is rendered with a srcset including all variants by default.","type":"string"},"variantIds":{"description":"Optional IDs of specific variants to use in the srcset attribute. Should not be set together with variantId.","type":"array","items":{"type":"string"}}},"required":["type"]}]},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A text field for users to save notes related to a lesson (for courses).","type":"object","properties":{"type":{"const":"LessonNotesField"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label"]},{"description":"A link.","type":"object","properties":{"type":{"const":"Link"},"linkStyle":{"description":"Controls the visual style of the link. When \\"Button\\", renders a Button component with asChild prop and a Link inside.","type":"string","enum":["Text","Button"]},"protocol":{"description":"Adds the specified protocol prefix to the href attribute's value.","type":"string","enum":["mailto","tel","sms"]},"size":{"description":"Controls the size of the button. Options are: '1' (12px font size), '2' (default, 14px font size), '3' (16px font size), and '4' (18px font size).","type":"string","enum":["1","2","3","4"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"target":{"type":"string","enum":["_blank","_self","_parent","_top"]},"to":{"description":"The URL that the link points to. A router link will be rendered for a path without a host (using the History API). A regular link will be rendered for a full URL.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"enum":["IncrementQueryParameter","DecrementQueryParameter"]},"defaultValue":{"type":"number"},"parameter":{"type":"string"}},"required":["type","defaultValue","parameter"]}]},"variant":{"description":"Controls the visual style of the button. Options are: 'solid' (default, filled background), 'soft' (lighter background, --accent-a11 text), 'surface' (subtle background, solid border, --accent-a11 text), 'outline' (transparent background, solid border, --accent-a11 text), and 'ghost' (no background, no border, --accent-a11 text, behaves like text in layout with negative margins).","type":"string","enum":["solid","soft","surface","outline","ghost"]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a map. The focus property is the place to display. It can be the name of a location (the way it appears on Google Maps), an address, or a place ID with the prefix 'place_id:'.","type":"object","properties":{"type":{"const":"Map"},"focus":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":["string","null"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component for a user to move between sequence stages.","type":"object","properties":{"type":{"const":"MoveUserPlan"},"nextButtonLabel":{"type":"string"},"previousButtonLabel":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A view for viewing all the orgs under a subscription, including all the users of each org and their training progress.","type":"object","properties":{"type":{"const":"MultiOrgView"},"orgLabelPlural":{"type":"string"},"orgLabelSingular":{"type":"string"},"showManageOrgs":{"type":"boolean"},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressSequenceIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"MultipleChoiceInput"},"answerIndex":{"type":"number"},"choices":{"type":"array","items":{"type":"string"}},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"MultiSelectInput"},"answerIndices":{"type":"array","items":{"type":"number"}},"choices":{"type":"array","items":{"type":"string"}},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"question":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"NumberInput"},"format":{"type":"string","enum":["Number","Currency","Integer"]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxDecimalDigits":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"An order form for checking out for a subscription.","type":"object","properties":{"type":{"const":"OrderForm"},"checkoutOptions":{"description":"The products to display in the form. Each product may optionally have a condition that needs to evaluate to true for the product to be displayed.","type":"array","items":{"type":"object","properties":{"condition":{"$ref":"#/$defs/expressionBoolean"},"subscriptionPlanId":{"type":"string"}},"required":["subscriptionPlanId"]}},"enablePhoneNumber":{"description":"Whether to enable a phone number input field. Defaults to true.","type":"boolean"},"enablePromoCode":{"description":"Whether to enable a promo code input field. If set to Stripe, only Stripe promo codes are allowed. If set to Custom, only custom promo codes are allowed. Defaults to none.","type":"string","enum":["Stripe","Custom"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Org billing settings dashboard.","type":"object","properties":{"type":{"const":"OrgBillingSettings"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Shows the pages of an org site and allows authorized users to activate and edit pages.","type":"object","properties":{"type":{"const":"OrgSitePages"},"defaultPageTemplatePreviewImageUrl":{"type":"string"},"pageTemplates":{"type":"object","properties":{"filter":{"type":"string","enum":["include","exclude"]},"ids":{"type":"array","items":{"type":"string"}}},"required":["filter","ids"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Organization site reviews component.","type":"object","properties":{"type":{"const":"OrgSiteReviews"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Organization team/members dashboard.","type":"object","properties":{"type":{"const":"OrganizationTeam"},"showUserTrainingProgress":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"userTrainingProgressContentPlanIds":{"type":"array","items":{"type":"string"}},"userTrainingProgressCourseIds":{"type":"array","items":{"type":"string"}}},"additionalProperties":false,"required":["type"]},{"description":"Represents the current page when rendered inside a layout.","type":"object","properties":{"type":{"const":"Page"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"PlainText"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The HTML tag to use for the element. Defaults to span.","type":"string","enum":["code","div","h1","h2","h3","h4","h5","h6","label","legend","li","p","span"]},"text":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"Popover"},"hideTriggers":{"description":"A list of events that will trigger the popover to be hidden.","type":"array","items":{"$ref":"#/$defs/trigger"}},"showTriggers":{"description":"A list of events that will trigger the popover to be shown.","type":"array","items":{"$ref":"#/$defs/trigger"}},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"Ensures that a user is signed in and belongs to an org that has access to the specified product item in an active subscription. Otherwise, the component shows a default message, a custom children, or nothing, depending on how it is configured. The styling applies only to the default message.","type":"object","properties":{"type":{"const":"ProductItemGuard"},"accessDeniedMode":{"description":"The default accessDeniedMode is DefaultMessage. A custom message is defined through children with an AccessDenied slot key.","type":"string","enum":["CustomMessage","DefaultMessage","Empty"]},"productItem":{"description":"The product item to require. If not set, this component does not require anything and displays its children.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"ProvideProps"},"props":{"type":"array","items":{"type":"object","properties":{"name":{"description":"The name of the prop to provide.","type":"string"},"source":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Number"},"value":{"type":"number"}},"required":["type","value"]},{"type":"object","properties":{"type":{"const":"String"},"value":{"type":"string"}},"required":["type","value"]}]}},"required":["type","value"]},{"description":"The output is a function of the input using one of the built-in format functions.","type":"object","properties":{"type":{"const":"Transform"},"format":{"type":"string","enum":["Phone number (###) ###-####","Phone number ###-###-####","U.S. State abbreviation spelled out"]},"inputPropName":{"description":"Used only in transform mode.","type":"string"}},"required":["type"]},{"description":"Produce the output prop from the LiquidJS template.","type":"object","properties":{"type":{"const":"Template"},"template":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"CustomField"},"fieldName":{"type":"string"},"object":{"description":"The object from which to read the specified field. For a page template being previewed, when the object is 'Page' the custom fields are taken instead from the page template.","type":"string","enum":["Site","Page","User"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]}},"required":["name","source"]}},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that queries data and provides it as props to its children. Supports pagination and provides metadata about the query results.","type":"object","properties":{"type":{"const":"Query"},"pageLimitSource":{"description":"The source of the page limit. Defaults to a Direct value of 20.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"number"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]}]},"pageNumberSource":{"description":"The source of the page number. Defaults to QueryParameter 'page'. Pagination is 1-based (i.e., the first page is page 1).","anyOf":[{"type":"object","properties":{"type":{"const":"QueryParameter"},"parameter":{"type":"string"}},"required":["type","parameter"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"props":{"description":"Configuration for the props that will be provided to children components.","type":"object","properties":{"items":{"description":"The prop name for the array of items returned by the query. Defaults to 'items'.","type":"string"},"currentPage":{"description":"The prop name for the current page number. Defaults to 'currentPage'.","type":"string"},"hasNextPage":{"description":"The prop name for whether there is a next page. Defaults to 'hasNextPage'.","type":"string"},"hasPreviousPage":{"description":"The prop name for whether there is a previous page. Defaults to 'hasPreviousPage'.","type":"string"},"pageLimit":{"description":"The prop name for the actual number of items per page (returned by the server). Defaults to 'pageLimit'.","type":"string"},"totalItemsCount":{"description":"The prop name for the total number of items matching the filter. Defaults to 'totalItemsCount'.","type":"string"},"totalPagesCount":{"description":"The prop name for the total number of pages. Defaults to 'totalPagesCount'.","type":"string"}}},"slot":{"$ref":"#/$defs/slot"},"source":{"description":"The data source configuration for the query.","anyOf":[{"description":"Fetch pages matching a set of filter conditions. Only published pages are included. Each element will be an object with the following properties: 'id', 'path', 'title', 'publishedAt', 'props'. The 'props' property will be the parsed page props.","type":"object","properties":{"type":{"const":"Pages"},"filter":{"description":"The filter to apply to select pages.","type":"object","properties":{"pathPrefix":{"description":"The path prefix to require for pages. Defaults to all paths.","type":"string"},"props":{"description":"A set of props to filter by. The prop values must be strings.","type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"required":["name","value"]}}}}},"required":["type"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"RadioGroupInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"displayType":{"description":"The style to use for items. For indicators, each item is rendered with a bubble icon, and its children are rendered inside a label that refers to the radio input element. For cards, there is default styling with each item's border color indicating whether it is the one selected. Defaults to indicators.","type":"string","enum":["indicators","cards"]},"itemsContainerStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"name":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","label","name"]},{"description":"A radio item within a radio group input.","type":"object","properties":{"type":{"const":"RadioGroupInputItem"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"value":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that dynamically loads a remote React component with custom code from an extension.","type":"object","properties":{"type":{"const":"RemoteComponent"},"componentName":{"description":"The name of the component to display.","type":"string"},"customProps":{"$ref":"#/$defs/contextData"},"extensionName":{"description":"The name of the extension that contains the remote component.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","componentName","extensionName"]},{"description":"A component that repeats a set of children for each item of an array or property of an object. Children are rendered with a prop for the current item. The key prop is the index for array items and the property name for objects. There is no wrapping element for children.","type":"object","properties":{"type":{"const":"Repeater"},"itemPropName":{"description":"The name of the prop for the current item. This is the array element for an array source, or the value of a property for an object source. Defaults to 'item'.","type":"string"},"keyPropName":{"description":"The name of the prop for the index or key of the current item. Defaults to 'key'.","type":"string"},"slot":{"$ref":"#/$defs/slot"},"source":{"description":"The data to iterate over. Needs to evaluate to an array or an object.","anyOf":[{"description":"Use a prop as the data source.","type":"object","properties":{"type":{"const":"Prop"},"name":{"description":"The name of the prop providing the array or object.","type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"An input component that can include multiple input components and other components, allowing an array of records to be entered.","type":"object","properties":{"type":{"const":"RepeatingGroupInput"},"name":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type","name"]},{"description":"A component to request password reset.","type":"object","properties":{"type":{"const":"RequestPasswordReset"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component to reset a password.","type":"object","properties":{"type":{"const":"ResetPassword"},"mode":{"type":"string","enum":["create","reset"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Displays a review form with 1-5 stars and redirects to the configured Google Place if the user clicks 5 stars.","type":"object","properties":{"type":{"const":"Review"},"googlePlace":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":["string","null"]}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"reviewFieldPlaceholder":{"type":"string"},"selectStarsLabel":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"SignInGuard"},"slot":{"$ref":"#/$defs/slot"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site logo.","type":"object","properties":{"type":{"const":"SiteLogo"},"alt":{"description":"Alternative text for the logo, defaults to the site name","type":"string"},"fallbackSiteName":{"description":"Whether to display the site name if the logo is not available","type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site privacy policy.","type":"object","properties":{"type":{"const":"SitePrivacyPolicy"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the site terms of use.","type":"object","properties":{"type":{"const":"SiteTermsOfUse"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A stage in a sequence.","type":"object","properties":{"type":{"const":"Stage"},"enableWrappedStageBody":{"description":"Whether to enable the wrapped stage body","type":"boolean"},"sequenceId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"The body of a stage in a sequence.","type":"object","properties":{"type":{"const":"StageBody"},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays the name of a stage.","type":"object","properties":{"type":{"const":"StageName"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays rich text. The content property should be an object with a delta property set to a Quill Delta object.","type":"object","properties":{"type":{"const":"Text"},"content":{"title":"RichText","anyOf":[{"title":"Delta","type":"object","properties":{"delta":{"type":"object","properties":{"ops":{"type":"array","items":{"type":"object","properties":{"attributes":{"type":"object","additionalProperties":true},"insert":{"oneOf":[{"type":"string"},{"type":"object","additionalProperties":true}]}},"required":["insert"]}}},"required":["ops"]}},"required":["delta"]}]},"slot":{"$ref":"#/$defs/slot"}},"additionalProperties":false,"required":["type"]},{"type":"object","properties":{"type":{"const":"TextInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"format":{"description":"Validation format for the input","type":"string","enum":["None","Email","Phone","Url"]},"inputElementStyles":{"$ref":"#/$defs/styles"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"TextareaInput"},"defaultValue":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"maxLength":{"type":"number"},"name":{"type":"string"},"placeholder":{"type":"string"},"required":{"type":"boolean"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label","name"]},{"type":"object","properties":{"type":{"const":"Theme"},"appearance":{"type":"string","enum":["light","dark","inherit"]},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"A component that embeds a Typeform.","type":"object","properties":{"type":{"const":"Typeform"},"formId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a user profile.","type":"object","properties":{"type":{"const":"UserProfile"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"Requires that a user be signed in and have a verified email address. Otherwise displays either a message that you need to be signed in or a message and a button to send a verification email.","type":"object","properties":{"type":{"const":"VerifiedEmailAddressGuard"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]},{"description":"Reads a URL query parameter that contains a unique token for verifying a user’s email address and makes an API request to mark the email address as verified. If the token is valid, it displays a message that the email address has been verified. Otherwise, it displays an error message. In either case, at the bottom it displays a 'Go to {siteName}' link that navigates to the home page.","type":"object","properties":{"type":{"const":"VerifyEmailAddress"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type"]},{"description":"A component that displays a video.","type":"object","properties":{"type":{"const":"Video"},"autoPlay":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"controls":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"loop":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"muted":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"playsInline":{"description":"Applicable only when tag is 'video'.","type":"boolean"},"poster":{"description":"The URL of an image to display while the video is loading. Applicable only when tag is 'video'.","anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"slot":{"$ref":"#/$defs/slot"},"src":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]}]},"styles":{"$ref":"#/$defs/styles"},"tag":{"description":"The way to render the video. Defaults to 'iframe'.","type":"string","enum":["iframe","video"]}},"additionalProperties":false,"required":["type"]},{"description":"A button that opens a dialog that displays the stages of a sequence and allows the user to move to another stage.","type":"object","properties":{"type":{"const":"ViewPlanStagesButton"},"dialogHeader":{"type":"string"},"label":{"anyOf":[{"type":"object","properties":{"type":{"const":"Direct"},"value":{"type":"string"}},"required":["type"]},{"type":"object","properties":{"type":{"const":"Prop"},"name":{"type":"string"}},"required":["type","name"]},{"type":"object","properties":{"type":{"type":"string","enum":["PageTitle","SiteName"]}},"required":["type"]}]},"labelStyles":{"$ref":"#/$defs/styles"},"slot":{"$ref":"#/$defs/slot"},"stageNameTableHeader":{"type":"string"},"styles":{"$ref":"#/$defs/styles"}},"additionalProperties":false,"required":["type","label"]},{"description":"A div element that sets the max-width property to a specified width (defaults to 1200px). The default alignment is Center. An additional div is rendered to wrap the children to set alignment. That inner div (the direct parent element of children) cannot be styled. Only the WidthContainerComponent's outer element gets the styles, if any.","type":"object","properties":{"type":{"const":"WidthContainer"},"align":{"$ref":"#/$defs/align"},"elementId":{"type":"string"},"slot":{"$ref":"#/$defs/slot"},"styles":{"$ref":"#/$defs/styles"},"width":{"$ref":"#/$defs/width"},"children":{"$ref":"#"}},"additionalProperties":false,"required":["type"]}]}`);
|
|
27165
26888
|
const $defs$5 = { "align": { "type": "string", "enum": ["Center", "Left", "Right"] }, "componentNavItem": { "type": "object", "properties": { "label": { "description": "The text to display in the nav item.", "type": "string" }, "openInNewTab": { "type": "boolean" }, "productItem": { "description": "If set, then only signed in users with access to the specified product item will see this nav item.", "type": ["string", "null"] }, "roles": { "description": "If set and not empty, then only signed in users with one of the specified roles will see this nav item.", "type": "array", "items": { "type": "string" } }, "subItems": { "type": "array", "items": { "type": "object", "properties": { "label": { "description": "The text to display in the nav item.", "type": "string" }, "openInNewTab": { "type": "boolean" }, "productItem": { "description": "If set, then only signed in users with access to the specified product item will see this nav item.", "type": ["string", "null"] }, "roles": { "description": "If set and not empty, then only signed in users with one of the specified roles will see this nav item.", "type": "array", "items": { "type": "string" } }, "url": { "description": "The URL to navigate to when the nav item is clicked. Can be an absolute path. Can also be an anchor link (e.g., #pricing).", "type": "string" } }, "required": ["label", "url"] } }, "url": { "description": "The URL to navigate to when the nav item is clicked. Can be an absolute path. Can also be an anchor link (e.g., #pricing).", "type": "string" } }, "required": ["label"] }, "contextData": { "title": "ContextData", "type": "object", "additionalProperties": { "anyOf": [{ "type": "boolean" }, { "type": "string" }, { "type": "number" }, { "type": "null" }, { "type": "array", "items": { "type": "object", "properties": { "data": { "$ref": "#/$defs/contextData" }, "id": { "type": "string" } }, "required": ["data", "id"] } }, { "type": "object", "properties": { "fileId": { "type": "string" } }, "required": ["fileId"] }, { "type": "array", "items": { "type": "string" } }] } }, "expression": { "title": "Expression", "anyOf": [{ "$ref": "#/$defs/expressionArray" }, { "$ref": "#/$defs/expressionBoolean" }, { "$ref": "#/$defs/expressionNumber" }, { "$ref": "#/$defs/expressionString" }] }, "expressionAll": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "condition": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "all" } }, "required": ["arrayExpression", "condition", "operator"] }, "expressionArray": { "anyOf": [{ "$ref": "#/$defs/expressionArrayLiteral" }, { "$ref": "#/$defs/expressionFilter" }, { "$ref": "#/$defs/expressionMap" }, { "$ref": "#/$defs/expressionUserProductItems" }, { "$ref": "#/$defs/expressionDynamicValue" }] }, "expressionArrayIncludes": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "operator": { "const": "arrayIncludes" }, "value": { "$ref": "#/$defs/expression" } }, "required": ["arrayExpression", "operator", "value"] }, "expressionArrayLiteral": { "type": "object", "properties": { "operator": { "const": "arrayLiteral" }, "value": { "type": "array", "items": { "$ref": "#/$defs/expression" } } }, "required": ["operator", "value"] }, "expressionBoolean": { "anyOf": [{ "$ref": "#/$defs/expressionAll" }, { "$ref": "#/$defs/expressionArrayIncludes" }, { "$ref": "#/$defs/expressionBoth" }, { "$ref": "#/$defs/expressionBooleanLiteral" }, { "$ref": "#/$defs/expressionEither" }, { "$ref": "#/$defs/expressionEquals" }, { "$ref": "#/$defs/expressionExists" }, { "$ref": "#/$defs/expressionGreaterThan" }, { "$ref": "#/$defs/expressionNot" }, { "$ref": "#/$defs/expressionSome" }, { "$ref": "#/$defs/expressionDynamicValue" }] }, "expressionBooleanLiteral": { "type": "object", "properties": { "operator": { "const": "booleanLiteral" }, "value": { "type": "boolean" } }, "required": ["operator", "value"] }, "expressionBoth": { "type": "object", "properties": { "left": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "both" }, "right": { "$ref": "#/$defs/expressionBoolean" } }, "required": ["left", "operator", "right"] }, "expressionCurrentTime": { "description": "A timestamp in milliseconds since epoch.", "type": "object", "properties": { "operator": { "const": "currentTime" } }, "required": ["operator"] }, "expressionDataValue": { "description": "Access a value from the data object. The source of the data depends on the context. For example, in a form the data object is the form data and the name is the name of the input component.", "type": "object", "properties": { "name": { "type": "string" }, "operator": { "const": "dataValue" } }, "required": ["name", "operator"] }, "expressionDynamicValue": { "anyOf": [{ "$ref": "#/$defs/expressionDataValue" }, { "$ref": "#/$defs/expressionProp" }] }, "expressionEither": { "type": "object", "properties": { "left": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "either" }, "right": { "$ref": "#/$defs/expressionBoolean" } }, "required": ["left", "operator", "right"] }, "expressionEquals": { "type": "object", "properties": { "left": { "$ref": "#/$defs/expression" }, "operator": { "const": "equals" }, "right": { "$ref": "#/$defs/expression" } }, "required": ["left", "operator", "right"] }, "expressionEventType": { "description": "Access the type set on an event. Applicable only in contexts where the expression deals with an event.", "type": "object", "properties": { "operator": { "const": "eventType" } }, "required": ["operator"] }, "expressionExists": { "type": "object", "properties": { "expression": { "$ref": "#/$defs/expression" }, "operator": { "const": "exists" } }, "required": ["expression", "operator"] }, "expressionFilter": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "filterExpression": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "filter" } }, "required": ["arrayExpression", "filterExpression", "operator"] }, "expressionGreaterThan": { "type": "object", "properties": { "left": { "$ref": "#/$defs/expressionNumber" }, "operator": { "const": "greaterThan" }, "right": { "$ref": "#/$defs/expressionNumber" } }, "required": ["left", "operator", "right"] }, "expressionLength": { "type": "object", "properties": { "operator": { "const": "length" }, "value": { "anyOf": [{ "$ref": "#/$defs/expressionArray" }, { "$ref": "#/$defs/expressionString" }] } }, "required": ["operator", "value"] }, "expressionMap": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "mapExpression": { "$ref": "#/$defs/expression" }, "operator": { "const": "map" } }, "required": ["arrayExpression", "mapExpression", "operator"] }, "expressionNot": { "type": "object", "properties": { "expression": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "not" } }, "required": ["expression", "operator"] }, "expressionNumber": { "anyOf": [{ "$ref": "#/$defs/expressionCurrentTime" }, { "$ref": "#/$defs/expressionLength" }, { "$ref": "#/$defs/expressionNumberLiteral" }, { "$ref": "#/$defs/expressionSum" }, { "$ref": "#/$defs/expressionSumArray" }, { "$ref": "#/$defs/expressionTimeLiteral" }, { "$ref": "#/$defs/expressionDynamicValue" }] }, "expressionNumberLiteral": { "type": "object", "properties": { "operator": { "const": "numberLiteral" }, "value": { "type": "number" } }, "required": ["operator", "value"] }, "expressionProp": { "description": "Access a value from props. Applicable only in contexts where the expression deals with props.", "type": "object", "properties": { "name": { "type": "string" }, "operator": { "const": "prop" } }, "required": ["name", "operator"] }, "expressionSome": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "condition": { "$ref": "#/$defs/expressionBoolean" }, "operator": { "const": "some" } }, "required": ["arrayExpression", "condition", "operator"] }, "expressionString": { "anyOf": [{ "$ref": "#/$defs/expressionEventType" }, { "$ref": "#/$defs/expressionStringLiteral" }, { "$ref": "#/$defs/expressionUserRole" }, { "$ref": "#/$defs/expressionDynamicValue" }] }, "expressionStringLiteral": { "type": "object", "properties": { "operator": { "const": "stringLiteral" }, "value": { "type": "string" } }, "required": ["operator", "value"] }, "expressionSum": { "type": "object", "properties": { "left": { "$ref": "#/$defs/expressionNumber" }, "operator": { "const": "sum" }, "right": { "$ref": "#/$defs/expressionNumber" } }, "required": ["left", "operator", "right"] }, "expressionSumArray": { "type": "object", "properties": { "arrayExpression": { "$ref": "#/$defs/expressionArray" }, "operator": { "const": "sumArray" } }, "required": ["arrayExpression", "operator"] }, "expressionTimeLiteral": { "description": "A timestamp in milliseconds since epoch.", "type": "object", "properties": { "operator": { "const": "timeLiteral" }, "value": { "type": "number" } }, "required": ["operator", "value"] }, "expressionUserProductItems": { "type": "object", "properties": { "operator": { "const": "userProductItems" } }, "required": ["operator"] }, "expressionUserRole": { "type": "object", "properties": { "operator": { "const": "userRole" } }, "required": ["operator"] }, "slot": { "type": "string", "enum": ["True", "False", "AccessAllowed", "AccessDenied", "LeftContent", "RightContent"] }, "styles": { "type": "array", "items": { "type": "object", "properties": { "condition": { "$ref": "#/$defs/expressionBoolean" }, "declarations": { "description": "A list of declarations, each a key-value pair with a colon separating the key and value. The key must be a CSS property or a custom property.", "type": "array", "items": { "type": "string" } }, "minWidth": { "description": "Optional min-width media query for this rule. If not set, the rule applies to all widths.", "type": "string", "enum": ["sm", "md", "lg", "xl", "xxl"] }, "states": { "description": "Optional pseudo-classes for this rule to apply to. Multiple classes are combined (e.g., ':hover:last-child').", "type": "array", "items": { "type": "string", "enum": ["active", "disabled", "first-child", "focus", "focus-visible", "focus-within", "hover", "last-child", "only-child"] } } }, "required": ["declarations"] } }, "trigger": { "description": "A specification for an event that will trigger some action. The condition property is an expression that, if set, needs to evaluate to true for the trigger to apply.", "type": "object", "properties": { "condition": { "$ref": "#/$defs/expressionBoolean" }, "eventType": { "description": "The expected event type for the trigger to apply.", "type": "string" } }, "required": ["eventType"] }, "width": { "type": "string", "enum": ["400px", "500px", "600px", "800px", "1000px", "1200px", "1400px", "1600px"] } };
|
|
27166
26889
|
const strippedComponentsSchema = {
|
|
27167
|
-
type: type$
|
|
26890
|
+
type: type$b,
|
|
27168
26891
|
items: items$1,
|
|
27169
26892
|
$defs: $defs$5
|
|
27170
26893
|
};
|
|
@@ -27215,31 +26938,45 @@ function isString(value) {
|
|
|
27215
26938
|
return typeof value == "string" || !isArray(value) && isObjectLike$1(value) && baseGetTag(value) == stringTag;
|
|
27216
26939
|
}
|
|
27217
26940
|
const isNonEmptyString = (value) => isString(value) && value.length > 0;
|
|
27218
|
-
const $schema$
|
|
27219
|
-
const $id$
|
|
27220
|
-
const title$
|
|
27221
|
-
const type$
|
|
26941
|
+
const $schema$a = "https://json-schema.org/draft/2020-12/schema";
|
|
26942
|
+
const $id$b = "/context-data/context-data.json";
|
|
26943
|
+
const title$a = "ContextData";
|
|
26944
|
+
const type$a = "object";
|
|
27222
26945
|
const additionalProperties$2 = { "$ref": "#/$defs/dataValue" };
|
|
27223
26946
|
const $defs$4 = { "dataValue": { "anyOf": [{ "type": "boolean" }, { "type": "string" }, { "type": "number" }, { "type": "null" }, { "type": "array", "items": { "$ref": "#/$defs/dataTableRow" } }, { "$ref": "#/$defs/uploadedFile" }, { "type": "array", "items": { "type": "string" } }] }, "dataTableRow": { "type": "object", "properties": { "id": { "type": "string" }, "data": { "$ref": "#" } }, "required": ["id", "data"] }, "uploadedFile": { "type": "object", "properties": { "fileId": { "type": "string" } }, "required": ["fileId"] } };
|
|
27224
26947
|
const contextDataSchema = {
|
|
27225
|
-
$schema: $schema$
|
|
27226
|
-
$id: $id$
|
|
27227
|
-
title: title$
|
|
27228
|
-
type: type$
|
|
26948
|
+
$schema: $schema$a,
|
|
26949
|
+
$id: $id$b,
|
|
26950
|
+
title: title$a,
|
|
26951
|
+
type: type$a,
|
|
27229
26952
|
additionalProperties: additionalProperties$2,
|
|
27230
26953
|
$defs: $defs$4
|
|
27231
26954
|
};
|
|
27232
|
-
const $schema$
|
|
27233
|
-
const $id$
|
|
27234
|
-
const title$
|
|
26955
|
+
const $schema$9 = "https://json-schema.org/draft/2020-12/schema";
|
|
26956
|
+
const $id$a = "/expressions/expression.json";
|
|
26957
|
+
const title$9 = "Expression";
|
|
27235
26958
|
const anyOf$1 = [{ "$ref": "#/$defs/arrayExpression" }, { "$ref": "#/$defs/booleanExpression" }, { "$ref": "#/$defs/numberExpression" }, { "$ref": "#/$defs/stringExpression" }];
|
|
27236
26959
|
const $defs$3 = { "all": { "type": "object", "properties": { "operator": { "const": "all" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" }, "condition": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "arrayExpression", "condition"] }, "arrayExpression": { "anyOf": [{ "$ref": "#/$defs/arrayLiteral" }, { "$ref": "#/$defs/filter" }, { "$ref": "#/$defs/map" }, { "$ref": "#/$defs/userProductItems" }, { "$ref": "#/$defs/dynamicValue" }] }, "arrayLiteral": { "type": "object", "properties": { "operator": { "const": "arrayLiteral" }, "value": { "type": "array", "items": { "$ref": "#" } } }, "required": ["operator", "value"] }, "filter": { "type": "object", "properties": { "operator": { "const": "filter" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" }, "filterExpression": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "arrayExpression", "filterExpression"] }, "length": { "type": "object", "properties": { "operator": { "const": "length" }, "value": { "anyOf": [{ "$ref": "#/$defs/arrayExpression" }, { "$ref": "#/$defs/stringExpression" }] } }, "required": ["operator", "value"] }, "numberExpression": { "anyOf": [{ "$ref": "#/$defs/currentTime" }, { "$ref": "#/$defs/length" }, { "$ref": "#/$defs/numberLiteral" }, { "$ref": "#/$defs/sum" }, { "$ref": "#/$defs/sumArray" }, { "$ref": "#/$defs/timeLiteral" }, { "$ref": "#/$defs/dynamicValue" }] }, "currentTime": { "type": "object", "description": "A timestamp in milliseconds since epoch.", "properties": { "operator": { "const": "currentTime" } }, "required": ["operator"] }, "numberLiteral": { "type": "object", "properties": { "operator": { "const": "numberLiteral" }, "value": { "type": "number" } }, "required": ["operator", "value"] }, "sum": { "type": "object", "properties": { "operator": { "const": "sum" }, "left": { "$ref": "#/$defs/numberExpression" }, "right": { "$ref": "#/$defs/numberExpression" } }, "required": ["operator", "left", "right"] }, "sumArray": { "type": "object", "properties": { "operator": { "const": "sumArray" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" } }, "required": ["operator", "arrayExpression"] }, "timeLiteral": { "type": "object", "description": "A timestamp in milliseconds since epoch.", "properties": { "operator": { "const": "timeLiteral" }, "value": { "type": "number" } }, "required": ["operator", "value"] }, "map": { "type": "object", "properties": { "operator": { "const": "map" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" }, "mapExpression": { "$ref": "#" } }, "required": ["operator", "arrayExpression", "mapExpression"] }, "stringExpression": { "anyOf": [{ "$ref": "#/$defs/eventType" }, { "$ref": "#/$defs/stringLiteral" }, { "$ref": "#/$defs/userRole" }, { "$ref": "#/$defs/dynamicValue" }] }, "eventType": { "description": "Access the type set on an event. Applicable only in contexts where the expression deals with an event.", "type": "object", "properties": { "operator": { "const": "eventType" } }, "required": ["operator"] }, "stringLiteral": { "type": "object", "properties": { "operator": { "const": "stringLiteral" }, "value": { "type": "string" } }, "required": ["operator", "value"] }, "userRole": { "type": "object", "properties": { "operator": { "const": "userRole" } }, "required": ["operator"] }, "arrayIncludes": { "type": "object", "properties": { "operator": { "const": "arrayIncludes" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" }, "value": { "$ref": "#" } }, "required": ["operator", "arrayExpression", "value"] }, "booleanExpression": { "anyOf": [{ "$ref": "#/$defs/all" }, { "$ref": "#/$defs/arrayIncludes" }, { "$ref": "#/$defs/both" }, { "$ref": "#/$defs/booleanLiteral" }, { "$ref": "#/$defs/either" }, { "$ref": "#/$defs/equals" }, { "$ref": "#/$defs/exists" }, { "$ref": "#/$defs/greaterThan" }, { "$ref": "#/$defs/not" }, { "$ref": "#/$defs/some" }, { "$ref": "#/$defs/dynamicValue" }] }, "dynamicValue": { "anyOf": [{ "$ref": "#/$defs/dataValue" }, { "$ref": "#/$defs/prop" }] }, "booleanLiteral": { "type": "object", "properties": { "operator": { "const": "booleanLiteral" }, "value": { "type": "boolean" } }, "required": ["operator", "value"] }, "both": { "type": "object", "properties": { "operator": { "const": "both" }, "left": { "$ref": "#/$defs/booleanExpression" }, "right": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "left", "right"] }, "dataValue": { "description": "Access a value from the data object. The source of the data depends on the context. For example, in a form the data object is the form data and the name is the name of the input component.", "type": "object", "properties": { "operator": { "const": "dataValue" }, "name": { "type": "string" } }, "required": ["operator", "name"] }, "prop": { "description": "Access a value from props. Applicable only in contexts where the expression deals with props.", "type": "object", "properties": { "operator": { "const": "prop" }, "name": { "type": "string" } }, "required": ["operator", "name"] }, "either": { "type": "object", "properties": { "operator": { "const": "either" }, "left": { "$ref": "#/$defs/booleanExpression" }, "right": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "left", "right"] }, "equals": { "type": "object", "properties": { "operator": { "const": "equals" }, "left": { "$ref": "#" }, "right": { "$ref": "#" } }, "required": ["operator", "left", "right"] }, "exists": { "type": "object", "properties": { "operator": { "const": "exists" }, "expression": { "$ref": "#" } }, "required": ["operator", "expression"] }, "greaterThan": { "type": "object", "properties": { "operator": { "const": "greaterThan" }, "left": { "$ref": "#/$defs/numberExpression" }, "right": { "$ref": "#/$defs/numberExpression" } }, "required": ["operator", "left", "right"] }, "not": { "type": "object", "properties": { "operator": { "const": "not" }, "expression": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "expression"] }, "some": { "type": "object", "properties": { "operator": { "const": "some" }, "arrayExpression": { "$ref": "#/$defs/arrayExpression" }, "condition": { "$ref": "#/$defs/booleanExpression" } }, "required": ["operator", "arrayExpression", "condition"] }, "userProductItems": { "type": "object", "properties": { "operator": { "const": "userProductItems" } }, "required": ["operator"] } };
|
|
27237
26960
|
const expressionSchema = {
|
|
26961
|
+
$schema: $schema$9,
|
|
26962
|
+
$id: $id$a,
|
|
26963
|
+
title: title$9,
|
|
26964
|
+
anyOf: anyOf$1,
|
|
26965
|
+
$defs: $defs$3
|
|
26966
|
+
};
|
|
26967
|
+
const $schema$8 = "https://json-schema.org/draft/2020-12/schema";
|
|
26968
|
+
const $id$9 = "/meta/extension-config.json";
|
|
26969
|
+
const title$8 = "ExtensionConfig";
|
|
26970
|
+
const type$9 = "object";
|
|
26971
|
+
const properties$a = { "name": { "type": "string" }, "server": { "type": "object", "properties": { "enable": { "type": "boolean" }, "database": { "type": "object", "properties": { "enable": { "type": "boolean" } } } } }, "components": { "type": "object", "additionalProperties": { "type": "object", "properties": { "path": { "type": "string" }, "description": { "type": "string" }, "supports": { "type": "object", "properties": { "children": { "type": "boolean" } } } }, "required": ["path"] } } };
|
|
26972
|
+
const required$2 = ["name"];
|
|
26973
|
+
const extensionManifestSchema = {
|
|
27238
26974
|
$schema: $schema$8,
|
|
27239
26975
|
$id: $id$9,
|
|
27240
26976
|
title: title$8,
|
|
27241
|
-
|
|
27242
|
-
|
|
26977
|
+
type: type$9,
|
|
26978
|
+
properties: properties$a,
|
|
26979
|
+
required: required$2
|
|
27243
26980
|
};
|
|
27244
26981
|
var _2020 = { exports: {} };
|
|
27245
26982
|
var core$2 = {};
|
|
@@ -32878,12 +32615,12 @@ function requirePatternProperties() {
|
|
|
32878
32615
|
patternProperties.default = def;
|
|
32879
32616
|
return patternProperties;
|
|
32880
32617
|
}
|
|
32881
|
-
var not = {};
|
|
32618
|
+
var not$1 = {};
|
|
32882
32619
|
var hasRequiredNot;
|
|
32883
32620
|
function requireNot() {
|
|
32884
|
-
if (hasRequiredNot) return not;
|
|
32621
|
+
if (hasRequiredNot) return not$1;
|
|
32885
32622
|
hasRequiredNot = 1;
|
|
32886
|
-
Object.defineProperty(not, "__esModule", { value: true });
|
|
32623
|
+
Object.defineProperty(not$1, "__esModule", { value: true });
|
|
32887
32624
|
const util_1 = requireUtil$5();
|
|
32888
32625
|
const def = {
|
|
32889
32626
|
keyword: "not",
|
|
@@ -32906,8 +32643,8 @@ function requireNot() {
|
|
|
32906
32643
|
},
|
|
32907
32644
|
error: { message: "must NOT be valid" }
|
|
32908
32645
|
};
|
|
32909
|
-
not.default = def;
|
|
32910
|
-
return not;
|
|
32646
|
+
not$1.default = def;
|
|
32647
|
+
return not$1;
|
|
32911
32648
|
}
|
|
32912
32649
|
var anyOf = {};
|
|
32913
32650
|
var hasRequiredAnyOf;
|
|
@@ -34695,7 +34432,27 @@ function requireApi() {
|
|
|
34695
34432
|
api.types = types2;
|
|
34696
34433
|
return api;
|
|
34697
34434
|
}
|
|
34698
|
-
requireApi();
|
|
34435
|
+
var apiExports = requireApi();
|
|
34436
|
+
var eq = (x) => (y) => x === y;
|
|
34437
|
+
var not = (fn) => (x) => !fn(x);
|
|
34438
|
+
var getValues = (
|
|
34439
|
+
/*::<Obj: Object>*/
|
|
34440
|
+
((o) => Object.values(o))
|
|
34441
|
+
);
|
|
34442
|
+
var notUndefined = (x) => x !== void 0;
|
|
34443
|
+
var isXError = (x) => (error2) => error2.keyword === x;
|
|
34444
|
+
var isRequiredError = isXError("required");
|
|
34445
|
+
var isAnyOfError = isXError("anyOf");
|
|
34446
|
+
var isEnumError = isXError("enum");
|
|
34447
|
+
var getErrors = (node2) => node2 && node2.errors ? node2.errors.map(
|
|
34448
|
+
(e) => e.keyword === "errorMessage" ? { ...e.params.errors[0], message: e.message } : e
|
|
34449
|
+
) : [];
|
|
34450
|
+
var getChildren = (node2) => node2 && getValues(node2.children) || [];
|
|
34451
|
+
var getSiblings = (parent2) => (node2) => getChildren(parent2).filter(not(eq(node2)));
|
|
34452
|
+
var concatAll = (
|
|
34453
|
+
/*::<T>*/
|
|
34454
|
+
((xs) => (ys) => ys.reduce((zs, z) => zs.concat(z), xs))
|
|
34455
|
+
);
|
|
34699
34456
|
var ansiStyles = { exports: {} };
|
|
34700
34457
|
var colorName;
|
|
34701
34458
|
var hasRequiredColorName;
|
|
@@ -36249,7 +36006,8 @@ function requireSource() {
|
|
|
36249
36006
|
source = chalk2;
|
|
36250
36007
|
return source;
|
|
36251
36008
|
}
|
|
36252
|
-
requireSource();
|
|
36009
|
+
var sourceExports = requireSource();
|
|
36010
|
+
const chalk = /* @__PURE__ */ getDefaultExportFromCjs(sourceExports);
|
|
36253
36011
|
var lib$2 = {};
|
|
36254
36012
|
var picocolors = { exports: {} };
|
|
36255
36013
|
var hasRequiredPicocolors;
|
|
@@ -36732,15 +36490,170 @@ ${frame}`;
|
|
|
36732
36490
|
lib$2.highlight = highlight;
|
|
36733
36491
|
return lib$2;
|
|
36734
36492
|
}
|
|
36735
|
-
requireLib$1();
|
|
36736
|
-
var
|
|
36493
|
+
var libExports = requireLib$1();
|
|
36494
|
+
var getPointers = (dataPath) => {
|
|
36495
|
+
return dataPath.split("/").slice(1).map((pointer2) => pointer2.split("~1").join("/").split("~0").join("~"));
|
|
36496
|
+
};
|
|
36497
|
+
function getMetaFromPath(jsonAst, dataPath, includeIdentifierLocation) {
|
|
36498
|
+
const pointers = getPointers(dataPath);
|
|
36499
|
+
const lastPointerIndex = pointers.length - 1;
|
|
36500
|
+
return pointers.reduce((obj, pointer2, idx) => {
|
|
36501
|
+
switch (obj.type) {
|
|
36502
|
+
case "Object": {
|
|
36503
|
+
const filtered = obj.members.filter(
|
|
36504
|
+
(child) => child.name.value === pointer2
|
|
36505
|
+
);
|
|
36506
|
+
if (filtered.length !== 1) {
|
|
36507
|
+
throw new Error(`Couldn't find property ${pointer2} of ${dataPath}`);
|
|
36508
|
+
}
|
|
36509
|
+
const { name, value } = filtered[0];
|
|
36510
|
+
return includeIdentifierLocation && idx === lastPointerIndex ? name : value;
|
|
36511
|
+
}
|
|
36512
|
+
case "Array":
|
|
36513
|
+
return obj.elements[pointer2];
|
|
36514
|
+
default:
|
|
36515
|
+
console.log(obj);
|
|
36516
|
+
}
|
|
36517
|
+
}, jsonAst.body);
|
|
36518
|
+
}
|
|
36519
|
+
function getDecoratedDataPath(jsonAst, dataPath) {
|
|
36520
|
+
let decoratedPath = "";
|
|
36521
|
+
getPointers(dataPath).reduce((obj, pointer2) => {
|
|
36522
|
+
switch (obj.type) {
|
|
36523
|
+
case "Object": {
|
|
36524
|
+
decoratedPath += `/${pointer2}`;
|
|
36525
|
+
const filtered = obj.members.filter(
|
|
36526
|
+
(child) => child.name.value === pointer2
|
|
36527
|
+
);
|
|
36528
|
+
if (filtered.length !== 1) {
|
|
36529
|
+
throw new Error(`Couldn't find property ${pointer2} of ${dataPath}`);
|
|
36530
|
+
}
|
|
36531
|
+
return filtered[0].value;
|
|
36532
|
+
}
|
|
36533
|
+
case "Array": {
|
|
36534
|
+
decoratedPath += `/${pointer2}${getTypeName(obj.elements[pointer2])}`;
|
|
36535
|
+
return obj.elements[pointer2];
|
|
36536
|
+
}
|
|
36537
|
+
default:
|
|
36538
|
+
console.log(obj);
|
|
36539
|
+
}
|
|
36540
|
+
}, jsonAst.body);
|
|
36541
|
+
return decoratedPath;
|
|
36542
|
+
}
|
|
36543
|
+
function getTypeName(obj) {
|
|
36544
|
+
if (!obj || !obj.elements) {
|
|
36545
|
+
return "";
|
|
36546
|
+
}
|
|
36547
|
+
const type2 = obj.elements.filter(
|
|
36548
|
+
(child) => child && child.name && child.name.value === "type"
|
|
36549
|
+
);
|
|
36550
|
+
if (!type2.length) {
|
|
36551
|
+
return "";
|
|
36552
|
+
}
|
|
36553
|
+
return type2[0].value && `:${type2[0].value.value}` || "";
|
|
36554
|
+
}
|
|
36555
|
+
var BaseValidationError = class {
|
|
36556
|
+
constructor(options = { isIdentifierLocation: false }, { data, schema, jsonAst, jsonRaw }) {
|
|
36557
|
+
this.options = options;
|
|
36558
|
+
this.data = data;
|
|
36559
|
+
this.schema = schema;
|
|
36560
|
+
this.jsonAst = jsonAst;
|
|
36561
|
+
this.jsonRaw = jsonRaw;
|
|
36562
|
+
}
|
|
36563
|
+
getLocation(dataPath = this.instancePath) {
|
|
36564
|
+
const { isIdentifierLocation, isSkipEndLocation } = this.options;
|
|
36565
|
+
const { loc } = getMetaFromPath(
|
|
36566
|
+
this.jsonAst,
|
|
36567
|
+
dataPath,
|
|
36568
|
+
isIdentifierLocation
|
|
36569
|
+
);
|
|
36570
|
+
return {
|
|
36571
|
+
start: loc.start,
|
|
36572
|
+
end: isSkipEndLocation ? void 0 : loc.end
|
|
36573
|
+
};
|
|
36574
|
+
}
|
|
36575
|
+
getDecoratedPath(dataPath = this.instancePath) {
|
|
36576
|
+
const decoratedPath = getDecoratedDataPath(this.jsonAst, dataPath);
|
|
36577
|
+
return decoratedPath;
|
|
36578
|
+
}
|
|
36579
|
+
getCodeFrame(message, dataPath = this.instancePath) {
|
|
36580
|
+
return libExports.codeFrameColumns(this.jsonRaw, this.getLocation(dataPath), {
|
|
36581
|
+
highlightCode: true,
|
|
36582
|
+
message
|
|
36583
|
+
});
|
|
36584
|
+
}
|
|
36585
|
+
/**
|
|
36586
|
+
* @return {string}
|
|
36587
|
+
*/
|
|
36588
|
+
get instancePath() {
|
|
36589
|
+
return typeof this.options.instancePath !== "undefined" ? this.options.instancePath : this.options.dataPath;
|
|
36590
|
+
}
|
|
36591
|
+
print() {
|
|
36592
|
+
throw new Error(
|
|
36593
|
+
`Implement the 'print' method inside ${this.constructor.name}!`
|
|
36594
|
+
);
|
|
36595
|
+
}
|
|
36596
|
+
getError() {
|
|
36597
|
+
throw new Error(
|
|
36598
|
+
`Implement the 'getError' method inside ${this.constructor.name}!`
|
|
36599
|
+
);
|
|
36600
|
+
}
|
|
36601
|
+
};
|
|
36602
|
+
var RequiredValidationError = class extends BaseValidationError {
|
|
36603
|
+
getLocation(dataPath = this.instancePath) {
|
|
36604
|
+
const { start } = super.getLocation(dataPath);
|
|
36605
|
+
return { start };
|
|
36606
|
+
}
|
|
36607
|
+
print() {
|
|
36608
|
+
const { message, params } = this.options;
|
|
36609
|
+
const output = [chalk`{red {bold REQUIRED} ${message}}\n`];
|
|
36610
|
+
return output.concat(
|
|
36611
|
+
this.getCodeFrame(
|
|
36612
|
+
chalk`☹️ {magentaBright ${params.missingProperty}} is missing here!`
|
|
36613
|
+
)
|
|
36614
|
+
);
|
|
36615
|
+
}
|
|
36616
|
+
getError() {
|
|
36617
|
+
const { message } = this.options;
|
|
36618
|
+
return {
|
|
36619
|
+
...this.getLocation(),
|
|
36620
|
+
error: `${this.getDecoratedPath()} ${message}`,
|
|
36621
|
+
path: this.instancePath
|
|
36622
|
+
};
|
|
36623
|
+
}
|
|
36624
|
+
};
|
|
36625
|
+
var AdditionalPropValidationError = class extends BaseValidationError {
|
|
36626
|
+
constructor(...args) {
|
|
36627
|
+
super(...args);
|
|
36628
|
+
this.options.isIdentifierLocation = true;
|
|
36629
|
+
}
|
|
36630
|
+
print() {
|
|
36631
|
+
const { message, params } = this.options;
|
|
36632
|
+
const output = [chalk`{red {bold ADDTIONAL PROPERTY} ${message}}\n`];
|
|
36633
|
+
return output.concat(
|
|
36634
|
+
this.getCodeFrame(
|
|
36635
|
+
chalk`😲 {magentaBright ${params.additionalProperty}} is not expected to be here!`,
|
|
36636
|
+
`${this.instancePath}/${params.additionalProperty}`
|
|
36637
|
+
)
|
|
36638
|
+
);
|
|
36639
|
+
}
|
|
36640
|
+
getError() {
|
|
36641
|
+
const { params } = this.options;
|
|
36642
|
+
return {
|
|
36643
|
+
...this.getLocation(`${this.instancePath}/${params.additionalProperty}`),
|
|
36644
|
+
error: `${this.getDecoratedPath()} Property ${params.additionalProperty} is not expected to be here`,
|
|
36645
|
+
path: this.instancePath
|
|
36646
|
+
};
|
|
36647
|
+
}
|
|
36648
|
+
};
|
|
36649
|
+
var leven$1 = { exports: {} };
|
|
36737
36650
|
var hasRequiredLeven;
|
|
36738
36651
|
function requireLeven() {
|
|
36739
|
-
if (hasRequiredLeven) return leven.exports;
|
|
36652
|
+
if (hasRequiredLeven) return leven$1.exports;
|
|
36740
36653
|
hasRequiredLeven = 1;
|
|
36741
36654
|
const array2 = [];
|
|
36742
36655
|
const charCodeCache = [];
|
|
36743
|
-
const
|
|
36656
|
+
const leven2 = (left, right) => {
|
|
36744
36657
|
if (left === right) {
|
|
36745
36658
|
return 0;
|
|
36746
36659
|
}
|
|
@@ -36786,11 +36699,12 @@ function requireLeven() {
|
|
|
36786
36699
|
}
|
|
36787
36700
|
return result2;
|
|
36788
36701
|
};
|
|
36789
|
-
leven.exports =
|
|
36790
|
-
leven.exports.default =
|
|
36791
|
-
return leven.exports;
|
|
36702
|
+
leven$1.exports = leven2;
|
|
36703
|
+
leven$1.exports.default = leven2;
|
|
36704
|
+
return leven$1.exports;
|
|
36792
36705
|
}
|
|
36793
|
-
requireLeven();
|
|
36706
|
+
var levenExports = requireLeven();
|
|
36707
|
+
const leven = /* @__PURE__ */ getDefaultExportFromCjs(levenExports);
|
|
36794
36708
|
var jsonpointer = {};
|
|
36795
36709
|
var hasRequiredJsonpointer;
|
|
36796
36710
|
function requireJsonpointer() {
|
|
@@ -36811,19 +36725,19 @@ function requireJsonpointer() {
|
|
|
36811
36725
|
if (!hasExcape.test(str)) return str;
|
|
36812
36726
|
return str.replace(escapeMatcher, escapeReplacer);
|
|
36813
36727
|
}
|
|
36814
|
-
function setter(obj,
|
|
36728
|
+
function setter(obj, pointer2, value) {
|
|
36815
36729
|
var part;
|
|
36816
36730
|
var hasNextPart;
|
|
36817
|
-
for (var p = 1, len =
|
|
36818
|
-
if (
|
|
36819
|
-
part = untilde(
|
|
36731
|
+
for (var p = 1, len = pointer2.length; p < len; ) {
|
|
36732
|
+
if (pointer2[p] === "constructor" || pointer2[p] === "prototype" || pointer2[p] === "__proto__") return obj;
|
|
36733
|
+
part = untilde(pointer2[p++]);
|
|
36820
36734
|
hasNextPart = len > p;
|
|
36821
36735
|
if (typeof obj[part] === "undefined") {
|
|
36822
36736
|
if (Array.isArray(obj) && part === "-") {
|
|
36823
36737
|
part = obj.length;
|
|
36824
36738
|
}
|
|
36825
36739
|
if (hasNextPart) {
|
|
36826
|
-
if (
|
|
36740
|
+
if (pointer2[p] !== "" && pointer2[p] < Infinity || pointer2[p] === "-") obj[part] = [];
|
|
36827
36741
|
else obj[part] = {};
|
|
36828
36742
|
}
|
|
36829
36743
|
}
|
|
@@ -36835,40 +36749,40 @@ function requireJsonpointer() {
|
|
|
36835
36749
|
else obj[part] = value;
|
|
36836
36750
|
return oldValue;
|
|
36837
36751
|
}
|
|
36838
|
-
function compilePointer(
|
|
36839
|
-
if (typeof
|
|
36840
|
-
|
|
36841
|
-
if (
|
|
36752
|
+
function compilePointer(pointer2) {
|
|
36753
|
+
if (typeof pointer2 === "string") {
|
|
36754
|
+
pointer2 = pointer2.split("/");
|
|
36755
|
+
if (pointer2[0] === "") return pointer2;
|
|
36842
36756
|
throw new Error("Invalid JSON pointer.");
|
|
36843
|
-
} else if (Array.isArray(
|
|
36844
|
-
for (const part of
|
|
36757
|
+
} else if (Array.isArray(pointer2)) {
|
|
36758
|
+
for (const part of pointer2) {
|
|
36845
36759
|
if (typeof part !== "string" && typeof part !== "number") {
|
|
36846
36760
|
throw new Error("Invalid JSON pointer. Must be of type string or number.");
|
|
36847
36761
|
}
|
|
36848
36762
|
}
|
|
36849
|
-
return
|
|
36763
|
+
return pointer2;
|
|
36850
36764
|
}
|
|
36851
36765
|
throw new Error("Invalid JSON pointer.");
|
|
36852
36766
|
}
|
|
36853
|
-
function get(obj,
|
|
36767
|
+
function get(obj, pointer2) {
|
|
36854
36768
|
if (typeof obj !== "object") throw new Error("Invalid input object.");
|
|
36855
|
-
|
|
36856
|
-
var len =
|
|
36769
|
+
pointer2 = compilePointer(pointer2);
|
|
36770
|
+
var len = pointer2.length;
|
|
36857
36771
|
if (len === 1) return obj;
|
|
36858
36772
|
for (var p = 1; p < len; ) {
|
|
36859
|
-
obj = obj[untilde(
|
|
36773
|
+
obj = obj[untilde(pointer2[p++])];
|
|
36860
36774
|
if (len === p) return obj;
|
|
36861
36775
|
if (typeof obj !== "object" || obj === null) return void 0;
|
|
36862
36776
|
}
|
|
36863
36777
|
}
|
|
36864
|
-
function set(obj,
|
|
36778
|
+
function set(obj, pointer2, value) {
|
|
36865
36779
|
if (typeof obj !== "object") throw new Error("Invalid input object.");
|
|
36866
|
-
|
|
36867
|
-
if (
|
|
36868
|
-
return setter(obj,
|
|
36780
|
+
pointer2 = compilePointer(pointer2);
|
|
36781
|
+
if (pointer2.length === 0) throw new Error("Invalid JSON pointer for set.");
|
|
36782
|
+
return setter(obj, pointer2, value);
|
|
36869
36783
|
}
|
|
36870
|
-
function compile2(
|
|
36871
|
-
var compiled = compilePointer(
|
|
36784
|
+
function compile2(pointer2) {
|
|
36785
|
+
var compiled = compilePointer(pointer2);
|
|
36872
36786
|
return {
|
|
36873
36787
|
get: function(object2) {
|
|
36874
36788
|
return get(object2, compiled);
|
|
@@ -36883,32 +36797,203 @@ function requireJsonpointer() {
|
|
|
36883
36797
|
jsonpointer.compile = compile2;
|
|
36884
36798
|
return jsonpointer;
|
|
36885
36799
|
}
|
|
36886
|
-
requireJsonpointer();
|
|
36800
|
+
var jsonpointerExports = requireJsonpointer();
|
|
36801
|
+
const pointer = /* @__PURE__ */ getDefaultExportFromCjs(jsonpointerExports);
|
|
36802
|
+
var EnumValidationError = class extends BaseValidationError {
|
|
36803
|
+
print() {
|
|
36804
|
+
const {
|
|
36805
|
+
message,
|
|
36806
|
+
params: { allowedValues }
|
|
36807
|
+
} = this.options;
|
|
36808
|
+
const bestMatch = this.findBestMatch();
|
|
36809
|
+
const output = [
|
|
36810
|
+
chalk`{red {bold ENUM} ${message}}`,
|
|
36811
|
+
chalk`{red (${allowedValues.join(", ")})}\n`
|
|
36812
|
+
];
|
|
36813
|
+
return output.concat(
|
|
36814
|
+
this.getCodeFrame(
|
|
36815
|
+
bestMatch !== null ? chalk`👈🏽 Did you mean {magentaBright ${bestMatch}} here?` : chalk`👈🏽 Unexpected value, should be equal to one of the allowed values`
|
|
36816
|
+
)
|
|
36817
|
+
);
|
|
36818
|
+
}
|
|
36819
|
+
getError() {
|
|
36820
|
+
const { message, params } = this.options;
|
|
36821
|
+
const bestMatch = this.findBestMatch();
|
|
36822
|
+
const allowedValues = params.allowedValues.join(", ");
|
|
36823
|
+
const output = {
|
|
36824
|
+
...this.getLocation(),
|
|
36825
|
+
error: `${this.getDecoratedPath()} ${message}: ${allowedValues}`,
|
|
36826
|
+
path: this.instancePath
|
|
36827
|
+
};
|
|
36828
|
+
if (bestMatch !== null) {
|
|
36829
|
+
output.suggestion = `Did you mean ${bestMatch}?`;
|
|
36830
|
+
}
|
|
36831
|
+
return output;
|
|
36832
|
+
}
|
|
36833
|
+
findBestMatch() {
|
|
36834
|
+
const {
|
|
36835
|
+
params: { allowedValues }
|
|
36836
|
+
} = this.options;
|
|
36837
|
+
const currentValue = this.instancePath === "" ? this.data : pointer.get(this.data, this.instancePath);
|
|
36838
|
+
if (!currentValue) {
|
|
36839
|
+
return null;
|
|
36840
|
+
}
|
|
36841
|
+
const bestMatch = allowedValues.map((value) => ({
|
|
36842
|
+
value,
|
|
36843
|
+
weight: leven(value, currentValue.toString())
|
|
36844
|
+
})).sort(
|
|
36845
|
+
(x, y) => x.weight > y.weight ? 1 : x.weight < y.weight ? -1 : 0
|
|
36846
|
+
)[0];
|
|
36847
|
+
return allowedValues.length === 1 || bestMatch.weight < bestMatch.value.length ? bestMatch.value : null;
|
|
36848
|
+
}
|
|
36849
|
+
};
|
|
36850
|
+
var DefaultValidationError = class extends BaseValidationError {
|
|
36851
|
+
print() {
|
|
36852
|
+
const { keyword: keyword2, message } = this.options;
|
|
36853
|
+
const output = [chalk`{red {bold ${keyword2.toUpperCase()}} ${message}}\n`];
|
|
36854
|
+
return output.concat(
|
|
36855
|
+
this.getCodeFrame(chalk`👈🏽 {magentaBright ${keyword2}} ${message}`)
|
|
36856
|
+
);
|
|
36857
|
+
}
|
|
36858
|
+
getError() {
|
|
36859
|
+
const { keyword: keyword2, message } = this.options;
|
|
36860
|
+
return {
|
|
36861
|
+
...this.getLocation(),
|
|
36862
|
+
error: `${this.getDecoratedPath()}: ${keyword2} ${message}`,
|
|
36863
|
+
path: this.instancePath
|
|
36864
|
+
};
|
|
36865
|
+
}
|
|
36866
|
+
};
|
|
36867
|
+
var JSON_POINTERS_REGEX = /\/[\w_-]+(\/\d+)?/g;
|
|
36868
|
+
function makeTree(ajvErrors = []) {
|
|
36869
|
+
const root2 = { children: {} };
|
|
36870
|
+
ajvErrors.forEach((ajvError) => {
|
|
36871
|
+
const instancePath = typeof ajvError.instancePath !== "undefined" ? ajvError.instancePath : ajvError.dataPath;
|
|
36872
|
+
const paths = instancePath === "" ? [""] : instancePath.match(JSON_POINTERS_REGEX);
|
|
36873
|
+
paths && paths.reduce((obj, path2, i) => {
|
|
36874
|
+
obj.children[path2] = obj.children[path2] || { children: {}, errors: [] };
|
|
36875
|
+
if (i === paths.length - 1) {
|
|
36876
|
+
obj.children[path2].errors.push(ajvError);
|
|
36877
|
+
}
|
|
36878
|
+
return obj.children[path2];
|
|
36879
|
+
}, root2);
|
|
36880
|
+
});
|
|
36881
|
+
return root2;
|
|
36882
|
+
}
|
|
36883
|
+
function filterRedundantErrors(root2, parent2, key) {
|
|
36884
|
+
getErrors(root2).forEach((error2) => {
|
|
36885
|
+
if (isRequiredError(error2)) {
|
|
36886
|
+
root2.errors = [error2];
|
|
36887
|
+
root2.children = {};
|
|
36888
|
+
}
|
|
36889
|
+
});
|
|
36890
|
+
if (getErrors(root2).some(isAnyOfError)) {
|
|
36891
|
+
if (Object.keys(root2.children).length > 0) {
|
|
36892
|
+
delete root2.errors;
|
|
36893
|
+
}
|
|
36894
|
+
}
|
|
36895
|
+
if (root2.errors && root2.errors.length && getErrors(root2).every(isEnumError)) {
|
|
36896
|
+
if (getSiblings(parent2)(root2).filter(notUndefined).some(getErrors)) {
|
|
36897
|
+
delete parent2.children[key];
|
|
36898
|
+
}
|
|
36899
|
+
}
|
|
36900
|
+
Object.entries(root2.children).forEach(
|
|
36901
|
+
([key2, child]) => filterRedundantErrors(child, root2, key2)
|
|
36902
|
+
);
|
|
36903
|
+
}
|
|
36904
|
+
function createErrorInstances(root2, options) {
|
|
36905
|
+
const errors2 = getErrors(root2);
|
|
36906
|
+
if (errors2.length && errors2.every(isEnumError)) {
|
|
36907
|
+
const uniqueValues = new Set(
|
|
36908
|
+
concatAll([])(errors2.map((e) => e.params.allowedValues))
|
|
36909
|
+
);
|
|
36910
|
+
const allowedValues = [...uniqueValues];
|
|
36911
|
+
const error2 = errors2[0];
|
|
36912
|
+
return [
|
|
36913
|
+
new EnumValidationError(
|
|
36914
|
+
{
|
|
36915
|
+
...error2,
|
|
36916
|
+
params: { allowedValues }
|
|
36917
|
+
},
|
|
36918
|
+
options
|
|
36919
|
+
)
|
|
36920
|
+
];
|
|
36921
|
+
} else {
|
|
36922
|
+
return concatAll(
|
|
36923
|
+
errors2.reduce((ret, error2) => {
|
|
36924
|
+
switch (error2.keyword) {
|
|
36925
|
+
case "additionalProperties":
|
|
36926
|
+
return ret.concat(
|
|
36927
|
+
new AdditionalPropValidationError(error2, options)
|
|
36928
|
+
);
|
|
36929
|
+
case "required":
|
|
36930
|
+
return ret.concat(new RequiredValidationError(error2, options));
|
|
36931
|
+
default:
|
|
36932
|
+
return ret.concat(new DefaultValidationError(error2, options));
|
|
36933
|
+
}
|
|
36934
|
+
}, [])
|
|
36935
|
+
)(getChildren(root2).map((child) => createErrorInstances(child, options)));
|
|
36936
|
+
}
|
|
36937
|
+
}
|
|
36938
|
+
var helpers_default = (ajvErrors, options) => {
|
|
36939
|
+
const tree = makeTree(ajvErrors || []);
|
|
36940
|
+
filterRedundantErrors(tree);
|
|
36941
|
+
return createErrorInstances(tree, options);
|
|
36942
|
+
};
|
|
36943
|
+
var index_default = (schema, data, errors2, options = {}) => {
|
|
36944
|
+
const { format: format2 = "cli", indent: indent2 = null, json: json2 = null } = options;
|
|
36945
|
+
const jsonRaw = json2 || JSON.stringify(data, null, indent2);
|
|
36946
|
+
const jsonAst = apiExports.parse(jsonRaw);
|
|
36947
|
+
const customErrorToText = (error2) => error2.print().join("\n");
|
|
36948
|
+
const customErrorToStructure = (error2) => error2.getError();
|
|
36949
|
+
const customErrors = helpers_default(errors2, {
|
|
36950
|
+
data,
|
|
36951
|
+
schema,
|
|
36952
|
+
jsonAst,
|
|
36953
|
+
jsonRaw
|
|
36954
|
+
});
|
|
36955
|
+
if (format2 === "cli") {
|
|
36956
|
+
return customErrors.map(customErrorToText).join("\n\n");
|
|
36957
|
+
} else {
|
|
36958
|
+
return customErrors.map(customErrorToStructure);
|
|
36959
|
+
}
|
|
36960
|
+
};
|
|
36887
36961
|
const instance = new _2020Exports.Ajv2020();
|
|
36888
36962
|
instance.addSchema([
|
|
36889
36963
|
componentsSchema,
|
|
36890
36964
|
strippedComponentsSchema,
|
|
36891
36965
|
contextDataSchema,
|
|
36892
|
-
expressionSchema
|
|
36966
|
+
expressionSchema,
|
|
36967
|
+
extensionManifestSchema
|
|
36893
36968
|
]);
|
|
36894
36969
|
const errorsText = (instance2) => {
|
|
36895
36970
|
const { errors: errors2 } = instance2;
|
|
36896
36971
|
const detail = errors2?.slice(0, 5).map((error2) => `${error2.instancePath} ${error2.message ?? "invalid"}`.trim()).join(", ");
|
|
36897
36972
|
return `Invalid data: ${detail ?? "validation failed"}`;
|
|
36898
36973
|
};
|
|
36899
|
-
const
|
|
36900
|
-
|
|
36974
|
+
const validateSafe = (schema, data, errorsFormat, ajvInstance) => {
|
|
36975
|
+
try {
|
|
36976
|
+
if (ajvInstance.validate(schema, data)) {
|
|
36977
|
+
return {
|
|
36978
|
+
ok: true,
|
|
36979
|
+
value: data
|
|
36980
|
+
};
|
|
36981
|
+
}
|
|
36901
36982
|
return {
|
|
36902
|
-
ok:
|
|
36903
|
-
|
|
36983
|
+
ok: false,
|
|
36984
|
+
error: errorsFormat === "ajv" ? errorsText(ajvInstance) : index_default(schema, data, ajvInstance.errors, {
|
|
36985
|
+
format: "cli",
|
|
36986
|
+
indent: 2
|
|
36987
|
+
})
|
|
36988
|
+
};
|
|
36989
|
+
} catch {
|
|
36990
|
+
return {
|
|
36991
|
+
ok: false,
|
|
36992
|
+
error: "Validation failed"
|
|
36904
36993
|
};
|
|
36905
36994
|
}
|
|
36906
|
-
return {
|
|
36907
|
-
ok: false,
|
|
36908
|
-
error: errorsText(validate2)
|
|
36909
|
-
};
|
|
36910
36995
|
};
|
|
36911
|
-
const validateExtensionManifest =
|
|
36996
|
+
const validateExtensionManifest = (manifest, errorsFormat = "ajv") => validateSafe(extensionManifestSchema, manifest, errorsFormat, instance);
|
|
36912
36997
|
const requireValidExtensionDir = async (dir2) => {
|
|
36913
36998
|
const extConfigPath = resolve$1(dir2, "extension.json");
|
|
36914
36999
|
if (!existsSync(extConfigPath)) {
|
|
@@ -43042,10 +43127,10 @@ var hasRequiredEq;
|
|
|
43042
43127
|
function requireEq() {
|
|
43043
43128
|
if (hasRequiredEq) return eq_1;
|
|
43044
43129
|
hasRequiredEq = 1;
|
|
43045
|
-
function
|
|
43130
|
+
function eq2(value, other) {
|
|
43046
43131
|
return value === other || value !== value && other !== other;
|
|
43047
43132
|
}
|
|
43048
|
-
eq_1 =
|
|
43133
|
+
eq_1 = eq2;
|
|
43049
43134
|
return eq_1;
|
|
43050
43135
|
}
|
|
43051
43136
|
var isLength_1;
|
|
@@ -43092,14 +43177,14 @@ var hasRequired_isIterateeCall;
|
|
|
43092
43177
|
function require_isIterateeCall() {
|
|
43093
43178
|
if (hasRequired_isIterateeCall) return _isIterateeCall;
|
|
43094
43179
|
hasRequired_isIterateeCall = 1;
|
|
43095
|
-
var
|
|
43180
|
+
var eq2 = requireEq(), isArrayLike2 = requireIsArrayLike(), isIndex = require_isIndex(), isObject2 = requireIsObject();
|
|
43096
43181
|
function isIterateeCall(value, index2, object2) {
|
|
43097
43182
|
if (!isObject2(object2)) {
|
|
43098
43183
|
return false;
|
|
43099
43184
|
}
|
|
43100
43185
|
var type2 = typeof index2;
|
|
43101
43186
|
if (type2 == "number" ? isArrayLike2(object2) && isIndex(index2, object2.length) : type2 == "string" && index2 in object2) {
|
|
43102
|
-
return
|
|
43187
|
+
return eq2(object2[index2], value);
|
|
43103
43188
|
}
|
|
43104
43189
|
return false;
|
|
43105
43190
|
}
|
|
@@ -43361,7 +43446,7 @@ var hasRequiredDefaults;
|
|
|
43361
43446
|
function requireDefaults() {
|
|
43362
43447
|
if (hasRequiredDefaults) return defaults_1;
|
|
43363
43448
|
hasRequiredDefaults = 1;
|
|
43364
|
-
var baseRest = require_baseRest(),
|
|
43449
|
+
var baseRest = require_baseRest(), eq2 = requireEq(), isIterateeCall = require_isIterateeCall(), keysIn = requireKeysIn();
|
|
43365
43450
|
var objectProto2 = Object.prototype;
|
|
43366
43451
|
var hasOwnProperty2 = objectProto2.hasOwnProperty;
|
|
43367
43452
|
var defaults2 = baseRest(function(object2, sources) {
|
|
@@ -43380,7 +43465,7 @@ function requireDefaults() {
|
|
|
43380
43465
|
while (++propsIndex < propsLength) {
|
|
43381
43466
|
var key = props[propsIndex];
|
|
43382
43467
|
var value = object2[key];
|
|
43383
|
-
if (value === void 0 ||
|
|
43468
|
+
if (value === void 0 || eq2(value, objectProto2[key]) && !hasOwnProperty2.call(object2, key)) {
|
|
43384
43469
|
object2[key] = source2[key];
|
|
43385
43470
|
}
|
|
43386
43471
|
}
|
|
@@ -49688,11 +49773,11 @@ var hasRequired_assocIndexOf;
|
|
|
49688
49773
|
function require_assocIndexOf() {
|
|
49689
49774
|
if (hasRequired_assocIndexOf) return _assocIndexOf;
|
|
49690
49775
|
hasRequired_assocIndexOf = 1;
|
|
49691
|
-
var
|
|
49776
|
+
var eq2 = requireEq();
|
|
49692
49777
|
function assocIndexOf(array2, key) {
|
|
49693
49778
|
var length = array2.length;
|
|
49694
49779
|
while (length--) {
|
|
49695
|
-
if (
|
|
49780
|
+
if (eq2(array2[length][0], key)) {
|
|
49696
49781
|
return length;
|
|
49697
49782
|
}
|
|
49698
49783
|
}
|
|
@@ -65702,16 +65787,6 @@ const resolveServerAndDbOptions = (manifest) => {
|
|
|
65702
65787
|
}
|
|
65703
65788
|
return { enableServer, enableDb };
|
|
65704
65789
|
};
|
|
65705
|
-
const formatValidationErrors = (errors2) => {
|
|
65706
|
-
if (!errors2 || errors2.length === 0) {
|
|
65707
|
-
return "Invalid extension config.";
|
|
65708
|
-
}
|
|
65709
|
-
return errors2.map((error2) => {
|
|
65710
|
-
const path2 = error2.instancePath || "/";
|
|
65711
|
-
const message = error2.message ?? "is invalid";
|
|
65712
|
-
return `${path2} ${message}`.trim();
|
|
65713
|
-
}).join("; ");
|
|
65714
|
-
};
|
|
65715
65790
|
const createExtension = async (opts, env2) => {
|
|
65716
65791
|
const cwd = process.cwd();
|
|
65717
65792
|
let nameFromConfig = null;
|
|
@@ -65731,10 +65806,11 @@ const createExtension = async (opts, env2) => {
|
|
|
65731
65806
|
const parsedExtensionConfig = JSON.parse(
|
|
65732
65807
|
await readFile(extensionConfigPath, "utf8")
|
|
65733
65808
|
);
|
|
65734
|
-
|
|
65735
|
-
|
|
65809
|
+
const validateResult = validateExtensionManifest(parsedExtensionConfig);
|
|
65810
|
+
if (validateResult.ok) {
|
|
65811
|
+
nameFromConfig = validateResult.value.name;
|
|
65736
65812
|
} else {
|
|
65737
|
-
extensionConfigError = `Invalid extension config at ${extensionConfigPath}: ${
|
|
65813
|
+
extensionConfigError = `Invalid extension config at ${extensionConfigPath}: ${validateResult.error}`;
|
|
65738
65814
|
}
|
|
65739
65815
|
} catch (error2) {
|
|
65740
65816
|
extensionConfigError = `Failed to read extension config at ${extensionConfigPath}: ${parseErrorMessage(error2)}`;
|
|
@@ -65833,52 +65909,657 @@ const createExtension = async (opts, env2) => {
|
|
|
65833
65909
|
const envContents = updatedEnvLines.join("\n");
|
|
65834
65910
|
await writeFile(envFilePath2, envContents.endsWith("\n") ? envContents : `${envContents}
|
|
65835
65911
|
`);
|
|
65836
|
-
|
|
65837
|
-
|
|
65838
|
-
|
|
65839
|
-
|
|
65912
|
+
return;
|
|
65913
|
+
}
|
|
65914
|
+
console.error(
|
|
65915
|
+
`Failed to create an extension (${result2.createExtension.__typename}):`,
|
|
65916
|
+
result2.createExtension.message
|
|
65917
|
+
);
|
|
65918
|
+
process.exit(1);
|
|
65919
|
+
} catch (error2) {
|
|
65920
|
+
console.error("Failed to create an extension:", parseErrorMessage(error2));
|
|
65921
|
+
process.exit(1);
|
|
65922
|
+
}
|
|
65923
|
+
};
|
|
65924
|
+
const ESCAPABLE_TARGETS = ["\\", "[", "]", "(", ")", "*", "_", "$"];
|
|
65925
|
+
const SENTINEL_BASE = 57344;
|
|
65926
|
+
const targetToSentinel = new Map(
|
|
65927
|
+
ESCAPABLE_TARGETS.map((ch, idx) => [
|
|
65928
|
+
ch,
|
|
65929
|
+
String.fromCharCode(SENTINEL_BASE + idx)
|
|
65930
|
+
])
|
|
65931
|
+
);
|
|
65932
|
+
const sentinelToTarget = new Map(
|
|
65933
|
+
ESCAPABLE_TARGETS.map((ch, idx) => [
|
|
65934
|
+
String.fromCharCode(SENTINEL_BASE + idx),
|
|
65935
|
+
ch
|
|
65936
|
+
])
|
|
65937
|
+
);
|
|
65938
|
+
function protectEscapes(input) {
|
|
65939
|
+
let out = "";
|
|
65940
|
+
for (let i = 0; i < input.length; i++) {
|
|
65941
|
+
const ch = input[i];
|
|
65942
|
+
if (ch === "\\" && i + 1 < input.length) {
|
|
65943
|
+
const next2 = input[i + 1];
|
|
65944
|
+
const sentinel = targetToSentinel.get(next2);
|
|
65945
|
+
if (sentinel) {
|
|
65946
|
+
out += sentinel;
|
|
65947
|
+
i += 1;
|
|
65948
|
+
continue;
|
|
65949
|
+
}
|
|
65950
|
+
out += ch;
|
|
65951
|
+
continue;
|
|
65952
|
+
}
|
|
65953
|
+
out += ch;
|
|
65954
|
+
}
|
|
65955
|
+
return out;
|
|
65956
|
+
}
|
|
65957
|
+
function unprotectEscapes(input) {
|
|
65958
|
+
if (!input) return input;
|
|
65959
|
+
let out = "";
|
|
65960
|
+
for (let i = 0; i < input.length; i++) {
|
|
65961
|
+
const ch = input[i];
|
|
65962
|
+
const mapped = sentinelToTarget.get(ch);
|
|
65963
|
+
out += mapped ?? ch;
|
|
65964
|
+
}
|
|
65965
|
+
return out;
|
|
65966
|
+
}
|
|
65967
|
+
function calcIndent(lead) {
|
|
65968
|
+
const width = lead.replace(/\t/g, " ").length;
|
|
65969
|
+
return Math.floor(width / 2);
|
|
65970
|
+
}
|
|
65971
|
+
function appendInline(text, out) {
|
|
65972
|
+
const protectedText = protectEscapes(text);
|
|
65973
|
+
const tokens = splitLinks(protectedText);
|
|
65974
|
+
for (const token of tokens) {
|
|
65975
|
+
const segments = splitInlineCode(token.text);
|
|
65976
|
+
for (const segment of segments) {
|
|
65977
|
+
if (segment.isCode) {
|
|
65978
|
+
const insert = normalizeInlineCodeContent(segment.text);
|
|
65979
|
+
if (!insert) continue;
|
|
65980
|
+
const attrs = { code: true };
|
|
65981
|
+
if (token.url) {
|
|
65982
|
+
attrs.link = token.url;
|
|
65983
|
+
}
|
|
65984
|
+
out.push({ insert, attributes: attrs });
|
|
65985
|
+
continue;
|
|
65986
|
+
}
|
|
65987
|
+
const runs = parseBoldItalic(segment.text);
|
|
65988
|
+
for (const run of runs) {
|
|
65989
|
+
let op = run;
|
|
65990
|
+
if (typeof op.insert === "string") {
|
|
65991
|
+
op = { ...op, insert: unprotectEscapes(op.insert) };
|
|
65992
|
+
}
|
|
65993
|
+
if (token.url) {
|
|
65994
|
+
op = {
|
|
65995
|
+
...op,
|
|
65996
|
+
attributes: { ...op.attributes ?? {}, link: token.url }
|
|
65997
|
+
};
|
|
65998
|
+
}
|
|
65999
|
+
out.push(op);
|
|
66000
|
+
}
|
|
66001
|
+
}
|
|
66002
|
+
}
|
|
66003
|
+
}
|
|
66004
|
+
function splitLinks(str) {
|
|
66005
|
+
const parts = [];
|
|
66006
|
+
let i = 0;
|
|
66007
|
+
const n = str.length;
|
|
66008
|
+
while (i < n) {
|
|
66009
|
+
const lb = str.indexOf("[", i);
|
|
66010
|
+
if (lb === -1) {
|
|
66011
|
+
if (i < n) parts.push({ text: str.slice(i) });
|
|
66012
|
+
break;
|
|
66013
|
+
}
|
|
66014
|
+
if (lb > i) parts.push({ text: str.slice(i, lb) });
|
|
66015
|
+
let pos = lb + 1;
|
|
66016
|
+
let depth = 1;
|
|
66017
|
+
while (pos < n) {
|
|
66018
|
+
const ch = str[pos];
|
|
66019
|
+
if (ch === "[") depth += 1;
|
|
66020
|
+
else if (ch === "]") {
|
|
66021
|
+
depth -= 1;
|
|
66022
|
+
if (depth === 0) break;
|
|
66023
|
+
}
|
|
66024
|
+
pos += 1;
|
|
66025
|
+
}
|
|
66026
|
+
if (pos >= n || str[pos] !== "]") {
|
|
66027
|
+
parts.push({ text: str.slice(lb) });
|
|
66028
|
+
break;
|
|
66029
|
+
}
|
|
66030
|
+
const label = str.slice(lb + 1, pos);
|
|
66031
|
+
let j = pos + 1;
|
|
66032
|
+
while (j < n && (str[j] === " " || str[j] === " ")) j += 1;
|
|
66033
|
+
if (j >= n || str[j] !== "(") {
|
|
66034
|
+
parts.push({ text: str.slice(lb, pos + 1) });
|
|
66035
|
+
i = pos + 1;
|
|
66036
|
+
continue;
|
|
66037
|
+
}
|
|
66038
|
+
j += 1;
|
|
66039
|
+
const start = j;
|
|
66040
|
+
let pDepth = 0;
|
|
66041
|
+
let end = -1;
|
|
66042
|
+
while (j < n) {
|
|
66043
|
+
const ch = str[j];
|
|
66044
|
+
if (ch === "(") pDepth += 1;
|
|
66045
|
+
else if (ch === ")") {
|
|
66046
|
+
if (pDepth === 0) {
|
|
66047
|
+
end = j;
|
|
66048
|
+
break;
|
|
66049
|
+
}
|
|
66050
|
+
pDepth -= 1;
|
|
66051
|
+
}
|
|
66052
|
+
j += 1;
|
|
66053
|
+
}
|
|
66054
|
+
if (end === -1) {
|
|
66055
|
+
parts.push({ text: str.slice(lb) });
|
|
66056
|
+
break;
|
|
66057
|
+
}
|
|
66058
|
+
const destAndMaybeTitle = str.slice(start, end).trim();
|
|
66059
|
+
let urlEnd = destAndMaybeTitle.length;
|
|
66060
|
+
for (let k = 0; k < destAndMaybeTitle.length; k++) {
|
|
66061
|
+
const c = destAndMaybeTitle[k];
|
|
66062
|
+
if (c === " " || c === " " || c === "\n") {
|
|
66063
|
+
urlEnd = k;
|
|
66064
|
+
break;
|
|
66065
|
+
}
|
|
66066
|
+
}
|
|
66067
|
+
let url = destAndMaybeTitle.slice(0, urlEnd);
|
|
66068
|
+
if (url.startsWith("<") && url.endsWith(">")) {
|
|
66069
|
+
url = url.slice(1, -1);
|
|
66070
|
+
}
|
|
66071
|
+
parts.push({ text: label, url });
|
|
66072
|
+
i = end + 1;
|
|
66073
|
+
}
|
|
66074
|
+
return parts;
|
|
66075
|
+
}
|
|
66076
|
+
function parseBoldItalic(original) {
|
|
66077
|
+
const out = [];
|
|
66078
|
+
let i = 0, buf = "";
|
|
66079
|
+
let bold = false, italic = false;
|
|
66080
|
+
const flush = () => {
|
|
66081
|
+
if (!buf) return;
|
|
66082
|
+
const attrs = {};
|
|
66083
|
+
if (bold) attrs.bold = true;
|
|
66084
|
+
if (italic) attrs.italic = true;
|
|
66085
|
+
out.push(Object.keys(attrs).length ? { insert: buf, attributes: attrs } : { insert: buf });
|
|
66086
|
+
buf = "";
|
|
66087
|
+
};
|
|
66088
|
+
while (i < original.length) {
|
|
66089
|
+
if (original.startsWith("**", i)) {
|
|
66090
|
+
flush();
|
|
66091
|
+
bold = !bold;
|
|
66092
|
+
i += 2;
|
|
66093
|
+
continue;
|
|
66094
|
+
}
|
|
66095
|
+
if (original.startsWith("__", i)) {
|
|
66096
|
+
flush();
|
|
66097
|
+
bold = !bold;
|
|
66098
|
+
i += 2;
|
|
66099
|
+
continue;
|
|
66100
|
+
}
|
|
66101
|
+
const ch = original[i];
|
|
66102
|
+
if (ch === "*" && !original.startsWith("**", i)) {
|
|
66103
|
+
flush();
|
|
66104
|
+
italic = !italic;
|
|
66105
|
+
i += 1;
|
|
66106
|
+
continue;
|
|
66107
|
+
}
|
|
66108
|
+
if (ch === "_" && !original.startsWith("__", i)) {
|
|
66109
|
+
const prev = i > 0 ? original[i - 1] : "";
|
|
66110
|
+
const next2 = i + 1 < original.length ? original[i + 1] : "";
|
|
66111
|
+
const isWord = (c) => /[A-Za-z0-9]/.test(c);
|
|
66112
|
+
const surroundedByWord = isWord(prev) && isWord(next2);
|
|
66113
|
+
if (!surroundedByWord) {
|
|
66114
|
+
flush();
|
|
66115
|
+
italic = !italic;
|
|
66116
|
+
i += 1;
|
|
66117
|
+
continue;
|
|
66118
|
+
}
|
|
66119
|
+
}
|
|
66120
|
+
buf += original[i++];
|
|
66121
|
+
}
|
|
66122
|
+
flush();
|
|
66123
|
+
if (bold || italic) return [{ insert: original }];
|
|
66124
|
+
return out;
|
|
66125
|
+
}
|
|
66126
|
+
function splitInlineCode(input) {
|
|
66127
|
+
const segments = [];
|
|
66128
|
+
let i = 0;
|
|
66129
|
+
let buffer = "";
|
|
66130
|
+
while (i < input.length) {
|
|
66131
|
+
if (input[i] === "`") {
|
|
66132
|
+
let runLength = 1;
|
|
66133
|
+
while (i + runLength < input.length && input[i + runLength] === "`") {
|
|
66134
|
+
runLength += 1;
|
|
66135
|
+
}
|
|
66136
|
+
const closingIndex = findClosingBackticks(input, i + runLength, runLength);
|
|
66137
|
+
if (closingIndex === -1) {
|
|
66138
|
+
buffer += input.slice(i, i + runLength);
|
|
66139
|
+
i += runLength;
|
|
66140
|
+
continue;
|
|
66141
|
+
}
|
|
66142
|
+
if (buffer) {
|
|
66143
|
+
segments.push({ text: buffer, isCode: false });
|
|
66144
|
+
buffer = "";
|
|
66145
|
+
}
|
|
66146
|
+
segments.push({ text: input.slice(i + runLength, closingIndex), isCode: true });
|
|
66147
|
+
i = closingIndex + runLength;
|
|
66148
|
+
continue;
|
|
66149
|
+
}
|
|
66150
|
+
buffer += input[i];
|
|
66151
|
+
i += 1;
|
|
66152
|
+
}
|
|
66153
|
+
if (buffer) {
|
|
66154
|
+
segments.push({ text: buffer, isCode: false });
|
|
66155
|
+
}
|
|
66156
|
+
return segments;
|
|
66157
|
+
}
|
|
66158
|
+
function findClosingBackticks(input, start, runLength) {
|
|
66159
|
+
let i = start;
|
|
66160
|
+
while (i < input.length) {
|
|
66161
|
+
if (input[i] !== "`") {
|
|
66162
|
+
i += 1;
|
|
66163
|
+
continue;
|
|
66164
|
+
}
|
|
66165
|
+
let len = 0;
|
|
66166
|
+
while (i + len < input.length && input[i + len] === "`") {
|
|
66167
|
+
len += 1;
|
|
66168
|
+
}
|
|
66169
|
+
if (len === runLength) {
|
|
66170
|
+
return i;
|
|
66171
|
+
}
|
|
66172
|
+
i += len;
|
|
66173
|
+
}
|
|
66174
|
+
return -1;
|
|
66175
|
+
}
|
|
66176
|
+
function normalizeInlineCodeContent(raw) {
|
|
66177
|
+
let text = raw.replace(/\r\n?/g, "\n").replace(/\n/g, " ");
|
|
66178
|
+
if (text.startsWith(" ") && text.endsWith(" ") && text.trim() !== "") {
|
|
66179
|
+
text = text.slice(1, -1);
|
|
66180
|
+
}
|
|
66181
|
+
return unprotectEscapes(text);
|
|
66182
|
+
}
|
|
66183
|
+
const collectAndFoldListContinuation = (allLines, startIndex, firstText, minIndent) => {
|
|
66184
|
+
let text = firstText.replace(/\s+$/g, "");
|
|
66185
|
+
let i = startIndex;
|
|
66186
|
+
while (i + 1 < allLines.length) {
|
|
66187
|
+
const nextLine = allLines[i + 1];
|
|
66188
|
+
if (!nextLine.trim()) break;
|
|
66189
|
+
const leadingMatch = nextLine.match(/^([ \t]*)/);
|
|
66190
|
+
const leadingWs = leadingMatch ? leadingMatch[1] : "";
|
|
66191
|
+
const leadingWidth = leadingWs.replace(/\t/g, " ").length;
|
|
66192
|
+
if (leadingWidth < minIndent) break;
|
|
66193
|
+
const trimmedLeading = nextLine.slice(leadingWs.length);
|
|
66194
|
+
if (/^[-*+][ \t]+/.test(trimmedLeading)) break;
|
|
66195
|
+
if (/^\d+[.)][ \t]+/.test(trimmedLeading)) break;
|
|
66196
|
+
if (/^#{1,6}[ \t]+/.test(trimmedLeading)) break;
|
|
66197
|
+
const content = trimmedLeading.replace(/\s+$/g, "");
|
|
66198
|
+
const trimmedSoFar = text.replace(/\s+$/g, "");
|
|
66199
|
+
if (!/[.?]$/.test(trimmedSoFar)) {
|
|
66200
|
+
text = trimmedSoFar + ".";
|
|
66201
|
+
} else {
|
|
66202
|
+
text = trimmedSoFar;
|
|
66203
|
+
}
|
|
66204
|
+
text += " " + content;
|
|
66205
|
+
i += 1;
|
|
66206
|
+
}
|
|
66207
|
+
return { text, nextIndex: i };
|
|
66208
|
+
};
|
|
66209
|
+
const markdownToDelta = (markdown) => {
|
|
66210
|
+
const ops = [];
|
|
66211
|
+
const lines = markdown.replace(/\r\n?/g, "\n").split("\n");
|
|
66212
|
+
let paraBuf = [];
|
|
66213
|
+
const listStack = [];
|
|
66214
|
+
const flushParagraph = () => {
|
|
66215
|
+
if (!paraBuf.length) return;
|
|
66216
|
+
const pieces = [];
|
|
66217
|
+
for (let i = 0; i < paraBuf.length; i++) {
|
|
66218
|
+
const l = paraBuf[i];
|
|
66219
|
+
const hardBreak = / +$/.test(l);
|
|
66220
|
+
const trimmed = l.replace(/\s+$/g, "");
|
|
66221
|
+
pieces.push(trimmed);
|
|
66222
|
+
if (i < paraBuf.length - 1) {
|
|
66223
|
+
pieces.push(hardBreak ? "\n" : " ");
|
|
66224
|
+
}
|
|
66225
|
+
}
|
|
66226
|
+
appendInline(pieces.join(""), ops);
|
|
66227
|
+
ops.push({ insert: "\n" });
|
|
66228
|
+
paraBuf = [];
|
|
66229
|
+
};
|
|
66230
|
+
const flushAsListContinuation = (ctx) => {
|
|
66231
|
+
if (!paraBuf.length) return;
|
|
66232
|
+
const pieces = [];
|
|
66233
|
+
for (let i = 0; i < paraBuf.length; i++) {
|
|
66234
|
+
const l = paraBuf[i];
|
|
66235
|
+
const hardBreak = / +$/.test(l);
|
|
66236
|
+
const trimmed = l.trim();
|
|
66237
|
+
pieces.push(trimmed);
|
|
66238
|
+
if (i < paraBuf.length - 1) {
|
|
66239
|
+
pieces.push(hardBreak ? "\n" : " ");
|
|
66240
|
+
}
|
|
66241
|
+
}
|
|
66242
|
+
appendInline(pieces.join(""), ops);
|
|
66243
|
+
const attrs = { list: ctx.type };
|
|
66244
|
+
if (ctx.indent > 0) attrs.indent = ctx.indent;
|
|
66245
|
+
ops.push({ insert: "\n", attributes: attrs });
|
|
66246
|
+
paraBuf = [];
|
|
66247
|
+
};
|
|
66248
|
+
for (let i = 0; i < lines.length; i++) {
|
|
66249
|
+
const rawLine = lines[i];
|
|
66250
|
+
const line = rawLine;
|
|
66251
|
+
const trimmed = line.trim();
|
|
66252
|
+
if (!trimmed) {
|
|
66253
|
+
flushParagraph();
|
|
66254
|
+
listStack.length = 0;
|
|
66255
|
+
continue;
|
|
66256
|
+
}
|
|
66257
|
+
if (trimmed === "---") {
|
|
66258
|
+
flushParagraph();
|
|
66259
|
+
listStack.length = 0;
|
|
66260
|
+
continue;
|
|
66261
|
+
}
|
|
66262
|
+
const fence = line.match(/^(?: {0,3})(`{3,})(.*)$/);
|
|
66263
|
+
if (fence) {
|
|
66264
|
+
const fenceLength = fence[1].length;
|
|
66265
|
+
const codeLines = [];
|
|
66266
|
+
let closingIndex = -1;
|
|
66267
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
66268
|
+
const candidate = lines[j];
|
|
66269
|
+
const closing = candidate.match(/^(?: {0,3})(`{3,})(.*)$/);
|
|
66270
|
+
if (closing && closing[1].length >= fenceLength && !closing[2].trim()) {
|
|
66271
|
+
closingIndex = j;
|
|
66272
|
+
break;
|
|
65840
66273
|
}
|
|
65841
|
-
|
|
65842
|
-
|
|
65843
|
-
|
|
65844
|
-
|
|
65845
|
-
|
|
65846
|
-
|
|
65847
|
-
|
|
65848
|
-
|
|
65849
|
-
|
|
65850
|
-
|
|
65851
|
-
|
|
65852
|
-
autoDeploy: false
|
|
66274
|
+
codeLines.push(candidate);
|
|
66275
|
+
}
|
|
66276
|
+
if (closingIndex !== -1) {
|
|
66277
|
+
flushParagraph();
|
|
66278
|
+
listStack.length = 0;
|
|
66279
|
+
if (!codeLines.length) {
|
|
66280
|
+
ops.push({ insert: "\n", attributes: { "code-block": true } });
|
|
66281
|
+
} else {
|
|
66282
|
+
for (const codeLine of codeLines) {
|
|
66283
|
+
if (codeLine) {
|
|
66284
|
+
ops.push({ insert: codeLine });
|
|
65853
66285
|
}
|
|
65854
|
-
|
|
65855
|
-
requestHeaders: {
|
|
65856
|
-
Authorization: `Bearer ${apiToken}`
|
|
66286
|
+
ops.push({ insert: "\n", attributes: { "code-block": true } });
|
|
65857
66287
|
}
|
|
65858
|
-
});
|
|
65859
|
-
if (versionResult.createExtensionVersion.__typename !== "CreateExtensionVersionSuccessResult") {
|
|
65860
|
-
console.error(
|
|
65861
|
-
`Failed to create dev extension version (${versionResult.createExtensionVersion.__typename}):`,
|
|
65862
|
-
versionResult.createExtensionVersion.message
|
|
65863
|
-
);
|
|
65864
|
-
process.exit(1);
|
|
65865
66288
|
}
|
|
65866
|
-
|
|
65867
|
-
|
|
65868
|
-
|
|
65869
|
-
|
|
65870
|
-
|
|
66289
|
+
i = closingIndex;
|
|
66290
|
+
continue;
|
|
66291
|
+
}
|
|
66292
|
+
}
|
|
66293
|
+
const m = line.match(/^(?: {0,3})(#{1,6})[ \t]+(.+?)[ \t]*#*[ \t]*$/);
|
|
66294
|
+
if (m) {
|
|
66295
|
+
flushParagraph();
|
|
66296
|
+
listStack.length = 0;
|
|
66297
|
+
appendInline(m[2], ops);
|
|
66298
|
+
ops.push({ insert: "\n", attributes: { header: m[1]?.length } });
|
|
66299
|
+
continue;
|
|
66300
|
+
}
|
|
66301
|
+
const b = line.match(/^([ \t]*)([-*+])[ \t]+(.*)$/);
|
|
66302
|
+
if (b) {
|
|
66303
|
+
flushParagraph();
|
|
66304
|
+
const leadingWs = b[1];
|
|
66305
|
+
const text = b[3];
|
|
66306
|
+
const markerCol = leadingWs.replace(/\t/g, " ").length;
|
|
66307
|
+
const minContinuationIndent = markerCol + 2;
|
|
66308
|
+
const indent2 = calcIndent(leadingWs);
|
|
66309
|
+
while (listStack.length > 0 && listStack[listStack.length - 1].indent >= indent2) {
|
|
66310
|
+
listStack.pop();
|
|
66311
|
+
}
|
|
66312
|
+
listStack.push({ type: "bullet", indent: indent2, markerCol });
|
|
66313
|
+
const folded = collectAndFoldListContinuation(lines, i, text, minContinuationIndent);
|
|
66314
|
+
appendInline(folded.text, ops);
|
|
66315
|
+
const attrs = { list: "bullet" };
|
|
66316
|
+
if (indent2 > 0) attrs.indent = indent2;
|
|
66317
|
+
ops.push({ insert: "\n", attributes: attrs });
|
|
66318
|
+
i = folded.nextIndex;
|
|
66319
|
+
continue;
|
|
66320
|
+
}
|
|
66321
|
+
const o = line.match(/^([ \t]*)(\d+)[.)][ \t]+(.*)$/);
|
|
66322
|
+
if (o) {
|
|
66323
|
+
flushParagraph();
|
|
66324
|
+
const leadingWs = o[1];
|
|
66325
|
+
const marker = o[2];
|
|
66326
|
+
const text = o[3];
|
|
66327
|
+
const markerCol = leadingWs.replace(/\t/g, " ").length;
|
|
66328
|
+
const minContinuationIndent = markerCol + marker.length + 2;
|
|
66329
|
+
const indent2 = calcIndent(leadingWs);
|
|
66330
|
+
while (listStack.length > 0 && listStack[listStack.length - 1].indent >= indent2) {
|
|
66331
|
+
listStack.pop();
|
|
66332
|
+
}
|
|
66333
|
+
listStack.push({ type: "ordered", indent: indent2, markerCol });
|
|
66334
|
+
const folded = collectAndFoldListContinuation(lines, i, text, minContinuationIndent);
|
|
66335
|
+
appendInline(folded.text, ops);
|
|
66336
|
+
const attrs = { list: "ordered" };
|
|
66337
|
+
if (indent2 > 0) attrs.indent = indent2;
|
|
66338
|
+
ops.push({ insert: "\n", attributes: attrs });
|
|
66339
|
+
i = folded.nextIndex;
|
|
66340
|
+
continue;
|
|
66341
|
+
}
|
|
66342
|
+
const leadingMatch = line.match(/^([ \t]+)/);
|
|
66343
|
+
if (leadingMatch && listStack.length > 0) {
|
|
66344
|
+
const leadingWs = leadingMatch[1];
|
|
66345
|
+
const lineIndentLevel = calcIndent(leadingWs);
|
|
66346
|
+
let matchingCtx;
|
|
66347
|
+
for (let j = listStack.length - 1; j >= 0; j--) {
|
|
66348
|
+
const ctx = listStack[j];
|
|
66349
|
+
if (ctx.indent < lineIndentLevel) {
|
|
66350
|
+
matchingCtx = ctx;
|
|
66351
|
+
break;
|
|
65871
66352
|
}
|
|
65872
66353
|
}
|
|
66354
|
+
if (matchingCtx) {
|
|
66355
|
+
while (listStack.length > 0 && listStack[listStack.length - 1] !== matchingCtx) {
|
|
66356
|
+
listStack.pop();
|
|
66357
|
+
}
|
|
66358
|
+
paraBuf.push(line);
|
|
66359
|
+
const nextLine = i + 1 < lines.length ? lines[i + 1] : "";
|
|
66360
|
+
const nextTrimmed = nextLine.trim();
|
|
66361
|
+
const nextIsBlank = !nextTrimmed;
|
|
66362
|
+
const nextIsList = /^[ \t]*[-*+][ \t]+/.test(nextLine) || /^[ \t]*\d+[.)][ \t]+/.test(nextLine);
|
|
66363
|
+
const nextIsHeading = /^(?: {0,3})#{1,6}[ \t]+/.test(nextLine);
|
|
66364
|
+
if (nextIsBlank || nextIsList || nextIsHeading || i + 1 >= lines.length) {
|
|
66365
|
+
flushAsListContinuation(matchingCtx);
|
|
66366
|
+
}
|
|
66367
|
+
continue;
|
|
66368
|
+
}
|
|
66369
|
+
}
|
|
66370
|
+
paraBuf.push(line);
|
|
66371
|
+
}
|
|
66372
|
+
if (paraBuf.length > 0 && listStack.length > 0) {
|
|
66373
|
+
const firstLine = paraBuf[0];
|
|
66374
|
+
const leadingMatch = firstLine.match(/^([ \t]+)/);
|
|
66375
|
+
if (leadingMatch) {
|
|
66376
|
+
const lineIndentLevel = calcIndent(leadingMatch[1]);
|
|
66377
|
+
for (let j = listStack.length - 1; j >= 0; j--) {
|
|
66378
|
+
const ctx = listStack[j];
|
|
66379
|
+
if (ctx.indent < lineIndentLevel) {
|
|
66380
|
+
flushAsListContinuation(ctx);
|
|
66381
|
+
return { ops };
|
|
66382
|
+
}
|
|
66383
|
+
}
|
|
66384
|
+
}
|
|
66385
|
+
}
|
|
66386
|
+
flushParagraph();
|
|
66387
|
+
return { ops };
|
|
66388
|
+
};
|
|
66389
|
+
const PublishStatus = {
|
|
66390
|
+
Archived: "Archived",
|
|
66391
|
+
Draft: "Draft",
|
|
66392
|
+
Published: "Published"
|
|
66393
|
+
};
|
|
66394
|
+
const CreatePageDocument = {
|
|
66395
|
+
kind: "Document",
|
|
66396
|
+
definitions: [
|
|
66397
|
+
{
|
|
66398
|
+
kind: "OperationDefinition",
|
|
66399
|
+
operation: "mutation",
|
|
66400
|
+
name: { kind: "Name", value: "CreatePage" },
|
|
66401
|
+
variableDefinitions: [
|
|
66402
|
+
{
|
|
66403
|
+
kind: "VariableDefinition",
|
|
66404
|
+
variable: { kind: "Variable", name: { kind: "Name", value: "input" } },
|
|
66405
|
+
type: {
|
|
66406
|
+
kind: "NonNullType",
|
|
66407
|
+
type: { kind: "NamedType", name: { kind: "Name", value: "CreatePageInput" } }
|
|
66408
|
+
}
|
|
66409
|
+
}
|
|
66410
|
+
],
|
|
66411
|
+
selectionSet: {
|
|
66412
|
+
kind: "SelectionSet",
|
|
66413
|
+
selections: [
|
|
66414
|
+
{
|
|
66415
|
+
kind: "Field",
|
|
66416
|
+
name: { kind: "Name", value: "createPage" },
|
|
66417
|
+
arguments: [
|
|
66418
|
+
{
|
|
66419
|
+
kind: "Argument",
|
|
66420
|
+
name: { kind: "Name", value: "input" },
|
|
66421
|
+
value: { kind: "Variable", name: { kind: "Name", value: "input" } }
|
|
66422
|
+
}
|
|
66423
|
+
],
|
|
66424
|
+
selectionSet: {
|
|
66425
|
+
kind: "SelectionSet",
|
|
66426
|
+
selections: [
|
|
66427
|
+
{ kind: "Field", name: { kind: "Name", value: "__typename" } },
|
|
66428
|
+
{
|
|
66429
|
+
kind: "InlineFragment",
|
|
66430
|
+
typeCondition: {
|
|
66431
|
+
kind: "NamedType",
|
|
66432
|
+
name: { kind: "Name", value: "CreatePageSuccessResult" }
|
|
66433
|
+
},
|
|
66434
|
+
selectionSet: {
|
|
66435
|
+
kind: "SelectionSet",
|
|
66436
|
+
selections: [
|
|
66437
|
+
{
|
|
66438
|
+
kind: "Field",
|
|
66439
|
+
name: { kind: "Name", value: "page" },
|
|
66440
|
+
selectionSet: {
|
|
66441
|
+
kind: "SelectionSet",
|
|
66442
|
+
selections: [
|
|
66443
|
+
{ kind: "Field", name: { kind: "Name", value: "id" } },
|
|
66444
|
+
{ kind: "Field", name: { kind: "Name", value: "title" } },
|
|
66445
|
+
{ kind: "Field", name: { kind: "Name", value: "path" } }
|
|
66446
|
+
]
|
|
66447
|
+
}
|
|
66448
|
+
}
|
|
66449
|
+
]
|
|
66450
|
+
}
|
|
66451
|
+
},
|
|
66452
|
+
{
|
|
66453
|
+
kind: "InlineFragment",
|
|
66454
|
+
typeCondition: { kind: "NamedType", name: { kind: "Name", value: "Error" } },
|
|
66455
|
+
selectionSet: {
|
|
66456
|
+
kind: "SelectionSet",
|
|
66457
|
+
selections: [{ kind: "Field", name: { kind: "Name", value: "message" } }]
|
|
66458
|
+
}
|
|
66459
|
+
}
|
|
66460
|
+
]
|
|
66461
|
+
}
|
|
66462
|
+
}
|
|
66463
|
+
]
|
|
66464
|
+
}
|
|
66465
|
+
}
|
|
66466
|
+
]
|
|
66467
|
+
};
|
|
66468
|
+
const parseStatus = (status) => {
|
|
66469
|
+
const normalized = status.trim().toLowerCase();
|
|
66470
|
+
const mapping = {
|
|
66471
|
+
archived: PublishStatus.Archived,
|
|
66472
|
+
draft: PublishStatus.Draft,
|
|
66473
|
+
published: PublishStatus.Published
|
|
66474
|
+
};
|
|
66475
|
+
const mapped = mapping[normalized];
|
|
66476
|
+
if (!mapped) {
|
|
66477
|
+
console.error(`Invalid status "${status}". Use Draft, Published, or Archived.`);
|
|
66478
|
+
process.exit(1);
|
|
66479
|
+
}
|
|
66480
|
+
return mapped;
|
|
66481
|
+
};
|
|
66482
|
+
const readJson = (raw, label) => {
|
|
66483
|
+
try {
|
|
66484
|
+
const parsed = JSON.parse(raw);
|
|
66485
|
+
return JSON.stringify(parsed);
|
|
66486
|
+
} catch (error2) {
|
|
66487
|
+
console.error(`Failed to parse ${label} JSON:`, parseErrorMessage(error2));
|
|
66488
|
+
process.exit(1);
|
|
66489
|
+
}
|
|
66490
|
+
};
|
|
66491
|
+
const readJsonFile = async (path2, label) => {
|
|
66492
|
+
try {
|
|
66493
|
+
const contents = await readFile(path2, "utf8");
|
|
66494
|
+
return readJson(contents, label);
|
|
66495
|
+
} catch (error2) {
|
|
66496
|
+
console.error(`Failed to read ${label} file at ${path2}:`, parseErrorMessage(error2));
|
|
66497
|
+
process.exit(1);
|
|
66498
|
+
}
|
|
66499
|
+
};
|
|
66500
|
+
const buildMarkdownComponents = async (markdownFilePath) => {
|
|
66501
|
+
const contents = await readFile(markdownFilePath, "utf8");
|
|
66502
|
+
const delta = markdownToDelta(contents);
|
|
66503
|
+
const components = [
|
|
66504
|
+
{
|
|
66505
|
+
type: "Text",
|
|
66506
|
+
id: designerComponentId(),
|
|
66507
|
+
content: {
|
|
66508
|
+
delta
|
|
66509
|
+
}
|
|
66510
|
+
}
|
|
66511
|
+
];
|
|
66512
|
+
return JSON.stringify(components);
|
|
66513
|
+
};
|
|
66514
|
+
const createPage = async (opts, env2) => {
|
|
66515
|
+
const siteId = opts.siteId.trim();
|
|
66516
|
+
const title2 = opts.title.trim();
|
|
66517
|
+
const path2 = opts.path.trim();
|
|
66518
|
+
if (opts.props && opts.propsFile) {
|
|
66519
|
+
console.error("Use either --props or --props-file, not both.");
|
|
66520
|
+
process.exit(1);
|
|
66521
|
+
}
|
|
66522
|
+
const status = opts.status ? parseStatus(opts.status) : void 0;
|
|
66523
|
+
const props = opts.props ? readJson(opts.props, "props") : opts.propsFile ? await readJsonFile(resolve$1(process.cwd(), opts.propsFile), "props") : void 0;
|
|
66524
|
+
const components = opts.textContentFile ? await buildMarkdownComponents(resolve$1(process.cwd(), opts.textContentFile)) : void 0;
|
|
66525
|
+
const apiToken = requireApiToken(env2);
|
|
66526
|
+
const url = `${env2.WIRECHUNK_CORE_SERVER_URL}/api`;
|
|
66527
|
+
if (opts.verbose) {
|
|
66528
|
+
console.log(`POST ${url}`);
|
|
66529
|
+
}
|
|
66530
|
+
try {
|
|
66531
|
+
const client2 = new GraphQLClient(url);
|
|
66532
|
+
const result2 = await client2.request({
|
|
66533
|
+
document: CreatePageDocument,
|
|
66534
|
+
variables: {
|
|
66535
|
+
input: {
|
|
66536
|
+
siteId,
|
|
66537
|
+
title: title2,
|
|
66538
|
+
path: path2,
|
|
66539
|
+
status,
|
|
66540
|
+
metaTitle: opts.metaTitle,
|
|
66541
|
+
metaDescription: opts.metaDescription,
|
|
66542
|
+
pageTemplateId: opts.pageTemplateId,
|
|
66543
|
+
props,
|
|
66544
|
+
components
|
|
66545
|
+
}
|
|
66546
|
+
},
|
|
66547
|
+
requestHeaders: {
|
|
66548
|
+
Authorization: `Bearer ${apiToken}`
|
|
66549
|
+
}
|
|
66550
|
+
});
|
|
66551
|
+
if (result2.createPage.__typename === "CreatePageSuccessResult") {
|
|
66552
|
+
const page = result2.createPage.page;
|
|
66553
|
+
console.log(`Created page ${page.title} (ID ${page.id})`);
|
|
65873
66554
|
return;
|
|
65874
66555
|
}
|
|
65875
66556
|
console.error(
|
|
65876
|
-
`Failed to create
|
|
65877
|
-
result2.
|
|
66557
|
+
`Failed to create page (${result2.createPage.__typename}):`,
|
|
66558
|
+
result2.createPage.message
|
|
65878
66559
|
);
|
|
65879
66560
|
process.exit(1);
|
|
65880
66561
|
} catch (error2) {
|
|
65881
|
-
console.error("Failed to create
|
|
66562
|
+
console.error("Failed to create page:", parseErrorMessage(error2));
|
|
65882
66563
|
process.exit(1);
|
|
65883
66564
|
}
|
|
65884
66565
|
};
|
|
@@ -66523,14 +67204,14 @@ Environment variables used by some commands:
|
|
|
66523
67204
|
const withOptions = (action) => async (options, cmd) => {
|
|
66524
67205
|
const mergedOptions = { ...program.opts(), ...options };
|
|
66525
67206
|
if (mergedOptions.verbose) {
|
|
66526
|
-
console.log(`Running ${chalk.green.bold(cmd.name())}`);
|
|
67207
|
+
console.log(`Running ${chalk$1.green.bold(cmd.name())}`);
|
|
66527
67208
|
}
|
|
66528
67209
|
return action(mergedOptions);
|
|
66529
67210
|
};
|
|
66530
67211
|
const withOptionsAndEnv = (action) => async (options, cmd) => {
|
|
66531
67212
|
const mergedOptions = { ...program.opts(), ...options };
|
|
66532
67213
|
if (mergedOptions.verbose) {
|
|
66533
|
-
console.log(`Running ${chalk.green.bold(cmd.name())}`);
|
|
67214
|
+
console.log(`Running ${chalk$1.green.bold(cmd.name())}`);
|
|
66534
67215
|
}
|
|
66535
67216
|
const env2 = await parseEnv(mergedOptions.envMode);
|
|
66536
67217
|
return action(mergedOptions, env2);
|
|
@@ -66548,6 +67229,7 @@ program.command("create-extension-version").description("create an extension ver
|
|
|
66548
67229
|
"--config-file <string>",
|
|
66549
67230
|
"the path to a file to use when creating the extension version, containing environment-style key-value pairs"
|
|
66550
67231
|
).action(withOptionsAndEnv(createExtensionVersion));
|
|
67232
|
+
program.command("create-page").description("create a page").requiredOption("--site-id <string>", "the ID of the site").requiredOption("--title <string>", "the title of the page").requiredOption("--path <string>", "the path for the page, such as blog/my-post").option("--status <status>", "the page status (Draft, Published, or Archived)").option("--meta-title <string>", "the meta title for the page").option("--meta-description <string>", "the meta description for the page").option("--page-template-id <string>", "the page template ID").option("--props <json>", "JSON object string for page props").option("--props-file <path>", "path to a JSON file for page props").option("--text-content-file <path>", "path to a Markdown file to render as a Text component").action(withOptionsAndEnv(createPage));
|
|
66551
67233
|
program.command("create-user").description("create a user").requiredOption("--email <string>", "the email address of the user").requiredOption("--password <string>", "the password of the user").requiredOption("--first-name <string>", "the first name of the user").requiredOption("--last-name <string>", "the last name of the user").option(
|
|
66552
67234
|
"--org-id <string>",
|
|
66553
67235
|
"the ID of the org to which the user belongs, defaults to creating a new org if not specified"
|
|
@@ -66557,7 +67239,7 @@ program.command("create-user").description("create a user").requiredOption("--em
|
|
|
66557
67239
|
).option(
|
|
66558
67240
|
"--role <string>",
|
|
66559
67241
|
"the role the user will have (defaults to the default role set on the platform, if defined, or an empty string)"
|
|
66560
|
-
).option("--email-verified", "mark the email address as already verified by the user",
|
|
67242
|
+
).option("--email-verified", "mark the email address as already verified by the user", true).option("--pending", "create the user in a pending state", false).action(withOptionsAndEnv(createUser));
|
|
66561
67243
|
const extDev = program.command("ext-dev").description("extension development commands");
|
|
66562
67244
|
extDev.command("get-db-url").description(
|
|
66563
67245
|
"write the connection info for the extension database to a .env.local or .env.<env-mode>.local file"
|