@wirechunk/cli 0.0.9 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +75 -0
  2. package/build/main.js +510 -447
  3. package/package.json +2 -18
package/build/main.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import EventEmitter from "node:events";
3
3
  import require$$1$1, { spawn } from "node:child_process";
4
- import require$$2$2, { resolve as resolve$1 } from "node:path";
4
+ import require$$2$2, { resolve as resolve$1, dirname } from "node:path";
5
5
  import require$$3$1, { readFileSync, existsSync } from "node:fs";
6
6
  import process$2 from "node:process";
7
7
  import os from "node:os";
@@ -31,7 +31,7 @@ import require$$0$d from "os";
31
31
  import require$$1$4 from "tty";
32
32
  import require$$0$e from "constants";
33
33
  import require$$5$1 from "assert";
34
- import require$$2$4 from "node:url";
34
+ import require$$2$4, { fileURLToPath } from "node:url";
35
35
  import require$$2$3 from "node:string_decoder";
36
36
  import require$$0$f from "zlib";
37
37
  var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
@@ -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) {
@@ -6314,7 +6314,7 @@ function partial$1(Class, schema, mask) {
6314
6314
  });
6315
6315
  return clone$1(schema, def);
6316
6316
  }
6317
- function required$3(Class, schema, mask) {
6317
+ function required$4(Class, schema, mask) {
6318
6318
  const def = mergeDefs$1(schema._zod.def, {
6319
6319
  get shape() {
6320
6320
  const oldShape = schema._zod.def.shape;
@@ -6834,7 +6834,7 @@ let Doc$1 = class Doc {
6834
6834
  return new F(...args, lines.join("\n"));
6835
6835
  }
6836
6836
  };
6837
- const version$1 = {
6837
+ const version$2 = {
6838
6838
  major: 4,
6839
6839
  minor: 1,
6840
6840
  patch: 13
@@ -6844,7 +6844,7 @@ const $ZodType$1 = /* @__PURE__ */ $constructor$1("$ZodType", (inst, def) => {
6844
6844
  inst ?? (inst = {});
6845
6845
  inst._zod.def = def;
6846
6846
  inst._zod.bag = inst._zod.bag || {};
6847
- inst._zod.version = version$1;
6847
+ inst._zod.version = version$2;
6848
6848
  const checks = [...inst._zod.def.checks ?? []];
6849
6849
  if (inst._zod.traits.has("$ZodCheck")) {
6850
6850
  checks.unshift(inst);
@@ -8055,7 +8055,7 @@ const ZodObject$2 = /* @__PURE__ */ $constructor$1("ZodObject", (inst, def) => {
8055
8055
  inst.pick = (mask) => pick$1(inst, mask);
8056
8056
  inst.omit = (mask) => omit$1(inst, mask);
8057
8057
  inst.partial = (...args) => partial$1(ZodOptional$2, inst, args[0]);
8058
- inst.required = (...args) => required$3(ZodNonOptional$1, inst, args[0]);
8058
+ inst.required = (...args) => required$4(ZodNonOptional$1, inst, args[0]);
8059
8059
  });
8060
8060
  function object$1(shape, params) {
8061
8061
  const def = {
@@ -14944,7 +14944,7 @@ function requireLib$5() {
14944
14944
  })(lib$5);
14945
14945
  return lib$5;
14946
14946
  }
14947
- var libExports$1 = requireLib$5();
14947
+ var libExports$2 = requireLib$5();
14948
14948
  var postgresInterval$2;
14949
14949
  var hasRequiredPostgresInterval$2;
14950
14950
  function requirePostgresInterval$2() {
@@ -15158,7 +15158,7 @@ function requirePostgresInterval$2() {
15158
15158
  var postgresIntervalExports = requirePostgresInterval$2();
15159
15159
  const parseInterval = /* @__PURE__ */ getDefaultExportFromCjs(postgresIntervalExports);
15160
15160
  const intervalParser = (value) => {
15161
- return value === null ? value : libExports$1.toSeconds(libExports$1.parse(parseInterval(value).toISOString()));
15161
+ return value === null ? value : libExports$2.toSeconds(libExports$2.parse(parseInterval(value).toISOString()));
15162
15162
  };
15163
15163
  const createIntervalTypeParser = () => {
15164
15164
  return {
@@ -20856,8 +20856,8 @@ function requireLib$3() {
20856
20856
  })(lib$4);
20857
20857
  return lib$4.exports;
20858
20858
  }
20859
- var libExports = requireLib$3();
20860
- const pg = /* @__PURE__ */ getDefaultExportFromCjs(libExports);
20859
+ var libExports$1 = requireLib$3();
20860
+ const pg = /* @__PURE__ */ getDefaultExportFromCjs(libExports$1);
20861
20861
  const Client = pg.Client;
20862
20862
  pg.Pool;
20863
20863
  pg.Connection;
@@ -23360,7 +23360,7 @@ function partial(Class, schema, mask) {
23360
23360
  });
23361
23361
  return clone(schema, def);
23362
23362
  }
23363
- function required$2(Class, schema, mask) {
23363
+ function required$3(Class, schema, mask) {
23364
23364
  const def = mergeDefs(schema._zod.def, {
23365
23365
  get shape() {
23366
23366
  const oldShape = schema._zod.def.shape;
@@ -23897,7 +23897,7 @@ class Doc2 {
23897
23897
  return new F(...args, lines.join("\n"));
23898
23898
  }
23899
23899
  }
23900
- const version = {
23900
+ const version$1 = {
23901
23901
  major: 4,
23902
23902
  minor: 1,
23903
23903
  patch: 13
@@ -23907,7 +23907,7 @@ const $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
23907
23907
  inst ?? (inst = {});
23908
23908
  inst._zod.def = def;
23909
23909
  inst._zod.bag = inst._zod.bag || {};
23910
- inst._zod.version = version;
23910
+ inst._zod.version = version$1;
23911
23911
  const checks = [...inst._zod.def.checks ?? []];
23912
23912
  if (inst._zod.traits.has("$ZodCheck")) {
23913
23913
  checks.unshift(inst);
@@ -25778,7 +25778,7 @@ const ZodObject2 = /* @__PURE__ */ $constructor("ZodObject", (inst, def) => {
25778
25778
  inst.pick = (mask) => pick(inst, mask);
25779
25779
  inst.omit = (mask) => omit(inst, mask);
25780
25780
  inst.partial = (...args) => partial(ZodOptional2, inst, args[0]);
25781
- inst.required = (...args) => required$2(ZodNonOptional, inst, args[0]);
25781
+ inst.required = (...args) => required$3(ZodNonOptional, inst, args[0]);
25782
25782
  });
25783
25783
  function object(shape, params) {
25784
25784
  const def = {
@@ -26007,9 +26007,11 @@ function superRefine(fn) {
26007
26007
  const localhostRegex1 = /localhost:\d{2,4}$/;
26008
26008
  const localhostRegex2 = /localhost$/;
26009
26009
  const isLocalhost = (domain) => localhostRegex1.test(domain) || localhostRegex2.test(domain);
26010
+ const envModeSymbol = Symbol("envMode");
26011
+ const mainEnvFilePathSymbol = Symbol("mainEnvFilePath");
26012
+ const mainEnvFileExistsSymbol = Symbol("mainEnvFileExists");
26010
26013
  const envFilePath = ".env";
26011
26014
  const envLocalFilePath = ".env.local";
26012
- const hasEnvFile = existsSync(envFilePath);
26013
26015
  const requireApiToken = (env2) => {
26014
26016
  if (!env2.WIRECHUNK_API_TOKEN) {
26015
26017
  console.error(
@@ -26023,10 +26025,10 @@ const requireCoreDbUrl = (env2) => {
26023
26025
  const url = env2.WIRECHUNK_CORE_DATABASE_URL;
26024
26026
  if (!url) {
26025
26027
  const message = "Missing WIRECHUNK_CORE_DATABASE_URL in environment";
26026
- if (hasEnvFile) {
26028
+ if (env2[mainEnvFileExistsSymbol]) {
26027
26029
  console.error(message);
26028
26030
  } else {
26029
- console.error(`${message}, no ${envFilePath} file found`);
26031
+ console.error(`${message}, no ${env2[mainEnvFilePathSymbol]} file found`);
26030
26032
  }
26031
26033
  process$2.exit(1);
26032
26034
  }
@@ -26045,16 +26047,20 @@ const coreServerUrlFromEnv = (env2) => {
26045
26047
  };
26046
26048
  const parseEnv = async (envMode) => {
26047
26049
  const env2 = {};
26048
- if (hasEnvFile) {
26049
- const envFileRaw = await readFile(envFilePath, "utf8");
26050
- Object.assign(env2, parseEnv$1(envFileRaw));
26051
- }
26050
+ const mainEnvFilePath = envMode ? `.env.${envMode}` : envFilePath;
26051
+ const mainEnvFileExists = existsSync(mainEnvFilePath);
26052
26052
  if (envMode) {
26053
- const modeFilePath = `.env.${envMode}`;
26054
- if (existsSync(modeFilePath)) {
26055
- const modeFileRaw = await readFile(modeFilePath, "utf8");
26053
+ if (existsSync(envFilePath)) {
26054
+ const envFileRaw = await readFile(envFilePath, "utf8");
26055
+ Object.assign(env2, parseEnv$1(envFileRaw));
26056
+ }
26057
+ if (mainEnvFileExists) {
26058
+ const modeFileRaw = await readFile(mainEnvFilePath, "utf8");
26056
26059
  Object.assign(env2, parseEnv$1(modeFileRaw));
26057
26060
  }
26061
+ } else if (mainEnvFileExists) {
26062
+ const envFileRaw = await readFile(mainEnvFilePath, "utf8");
26063
+ Object.assign(env2, parseEnv$1(envFileRaw));
26058
26064
  }
26059
26065
  if (existsSync(envLocalFilePath)) {
26060
26066
  const envLocalFileRaw = await readFile(envLocalFilePath, "utf8");
@@ -26070,7 +26076,10 @@ const parseEnv = async (envMode) => {
26070
26076
  Object.assign(env2, process$2.env);
26071
26077
  return {
26072
26078
  ...env2,
26073
- WIRECHUNK_CORE_SERVER_URL: coreServerUrlFromEnv(env2)
26079
+ WIRECHUNK_CORE_SERVER_URL: coreServerUrlFromEnv(env2),
26080
+ [envModeSymbol]: envMode,
26081
+ [mainEnvFilePathSymbol]: mainEnvFilePath,
26082
+ [mainEnvFileExistsSymbol]: mainEnvFileExists
26074
26083
  };
26075
26084
  };
26076
26085
  var dist$1 = {};
@@ -26858,304 +26867,21 @@ WIRECHUNK_PLATFORM_ID=${result2.platformId}
26858
26867
  );
26859
26868
  }
26860
26869
  };
26861
- const validateExtensionConfig = validate25;
26862
- function validate25(data, { instancePath = "", parentData, parentDataProperty, rootData = data, dynamicAnchors = {} } = {}) {
26863
- let vErrors = null;
26864
- let errors2 = 0;
26865
- const evaluated0 = validate25.evaluated;
26866
- if (evaluated0.dynamicProps) {
26867
- evaluated0.props = void 0;
26868
- }
26869
- if (evaluated0.dynamicItems) {
26870
- evaluated0.items = void 0;
26871
- }
26872
- {
26873
- if (data && typeof data == "object" && !Array.isArray(data)) {
26874
- let missing0;
26875
- if (data.name === void 0 && (missing0 = "name")) {
26876
- validate25.errors = [
26877
- {
26878
- instancePath,
26879
- schemaPath: "#/required",
26880
- keyword: "required",
26881
- params: { missingProperty: missing0 },
26882
- message: "must have required property '" + missing0 + "'"
26883
- }
26884
- ];
26885
- return false;
26886
- } else {
26887
- if (data.name !== void 0) {
26888
- const _errs1 = errors2;
26889
- if (typeof data.name !== "string") {
26890
- validate25.errors = [
26891
- {
26892
- instancePath: instancePath + "/name",
26893
- schemaPath: "#/properties/name/type",
26894
- keyword: "type",
26895
- params: { type: "string" },
26896
- message: "must be string"
26897
- }
26898
- ];
26899
- return false;
26900
- }
26901
- var valid0 = _errs1 === errors2;
26902
- } else {
26903
- var valid0 = true;
26904
- }
26905
- if (valid0) {
26906
- if (data.server !== void 0) {
26907
- let data1 = data.server;
26908
- const _errs3 = errors2;
26909
- {
26910
- if (data1 && typeof data1 == "object" && !Array.isArray(data1)) {
26911
- if (data1.enable !== void 0) {
26912
- const _errs5 = errors2;
26913
- if (typeof data1.enable !== "boolean") {
26914
- validate25.errors = [
26915
- {
26916
- instancePath: instancePath + "/server/enable",
26917
- schemaPath: "#/properties/server/properties/enable/type",
26918
- keyword: "type",
26919
- params: { type: "boolean" },
26920
- message: "must be boolean"
26921
- }
26922
- ];
26923
- return false;
26924
- }
26925
- var valid1 = _errs5 === errors2;
26926
- } else {
26927
- var valid1 = true;
26928
- }
26929
- if (valid1) {
26930
- if (data1.database !== void 0) {
26931
- let data3 = data1.database;
26932
- const _errs7 = errors2;
26933
- {
26934
- if (data3 && typeof data3 == "object" && !Array.isArray(data3)) {
26935
- if (data3.enable !== void 0) {
26936
- if (typeof data3.enable !== "boolean") {
26937
- validate25.errors = [
26938
- {
26939
- instancePath: instancePath + "/server/database/enable",
26940
- schemaPath: "#/properties/server/properties/database/properties/enable/type",
26941
- keyword: "type",
26942
- params: { type: "boolean" },
26943
- message: "must be boolean"
26944
- }
26945
- ];
26946
- return false;
26947
- }
26948
- }
26949
- } else {
26950
- validate25.errors = [
26951
- {
26952
- instancePath: instancePath + "/server/database",
26953
- schemaPath: "#/properties/server/properties/database/type",
26954
- keyword: "type",
26955
- params: { type: "object" },
26956
- message: "must be object"
26957
- }
26958
- ];
26959
- return false;
26960
- }
26961
- }
26962
- var valid1 = _errs7 === errors2;
26963
- } else {
26964
- var valid1 = true;
26965
- }
26966
- }
26967
- } else {
26968
- validate25.errors = [
26969
- {
26970
- instancePath: instancePath + "/server",
26971
- schemaPath: "#/properties/server/type",
26972
- keyword: "type",
26973
- params: { type: "object" },
26974
- message: "must be object"
26975
- }
26976
- ];
26977
- return false;
26978
- }
26979
- }
26980
- var valid0 = _errs3 === errors2;
26981
- } else {
26982
- var valid0 = true;
26983
- }
26984
- if (valid0) {
26985
- if (data.components !== void 0) {
26986
- let data5 = data.components;
26987
- const _errs11 = errors2;
26988
- {
26989
- if (data5 && typeof data5 == "object" && !Array.isArray(data5)) {
26990
- for (const key0 in data5) {
26991
- let data6 = data5[key0];
26992
- const _errs14 = errors2;
26993
- {
26994
- if (data6 && typeof data6 == "object" && !Array.isArray(data6)) {
26995
- let missing1;
26996
- if (data6.path === void 0 && (missing1 = "path")) {
26997
- validate25.errors = [
26998
- {
26999
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),
27000
- schemaPath: "#/properties/components/additionalProperties/required",
27001
- keyword: "required",
27002
- params: { missingProperty: missing1 },
27003
- message: "must have required property '" + missing1 + "'"
27004
- }
27005
- ];
27006
- return false;
27007
- } else {
27008
- if (data6.path !== void 0) {
27009
- const _errs16 = errors2;
27010
- if (typeof data6.path !== "string") {
27011
- validate25.errors = [
27012
- {
27013
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/path",
27014
- schemaPath: "#/properties/components/additionalProperties/properties/path/type",
27015
- keyword: "type",
27016
- params: { type: "string" },
27017
- message: "must be string"
27018
- }
27019
- ];
27020
- return false;
27021
- }
27022
- var valid4 = _errs16 === errors2;
27023
- } else {
27024
- var valid4 = true;
27025
- }
27026
- if (valid4) {
27027
- if (data6.description !== void 0) {
27028
- const _errs18 = errors2;
27029
- if (typeof data6.description !== "string") {
27030
- validate25.errors = [
27031
- {
27032
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/description",
27033
- schemaPath: "#/properties/components/additionalProperties/properties/description/type",
27034
- keyword: "type",
27035
- params: { type: "string" },
27036
- message: "must be string"
27037
- }
27038
- ];
27039
- return false;
27040
- }
27041
- var valid4 = _errs18 === errors2;
27042
- } else {
27043
- var valid4 = true;
27044
- }
27045
- if (valid4) {
27046
- if (data6.supports !== void 0) {
27047
- let data9 = data6.supports;
27048
- const _errs20 = errors2;
27049
- {
27050
- if (data9 && typeof data9 == "object" && !Array.isArray(data9)) {
27051
- if (data9.children !== void 0) {
27052
- if (typeof data9.children !== "boolean") {
27053
- validate25.errors = [
27054
- {
27055
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/supports/children",
27056
- schemaPath: "#/properties/components/additionalProperties/properties/supports/properties/children/type",
27057
- keyword: "type",
27058
- params: { type: "boolean" },
27059
- message: "must be boolean"
27060
- }
27061
- ];
27062
- return false;
27063
- }
27064
- }
27065
- } else {
27066
- validate25.errors = [
27067
- {
27068
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1") + "/supports",
27069
- schemaPath: "#/properties/components/additionalProperties/properties/supports/type",
27070
- keyword: "type",
27071
- params: { type: "object" },
27072
- message: "must be object"
27073
- }
27074
- ];
27075
- return false;
27076
- }
27077
- }
27078
- var valid4 = _errs20 === errors2;
27079
- } else {
27080
- var valid4 = true;
27081
- }
27082
- }
27083
- }
27084
- }
27085
- } else {
27086
- validate25.errors = [
27087
- {
27088
- instancePath: instancePath + "/components/" + key0.replace(/~/g, "~0").replace(/\//g, "~1"),
27089
- schemaPath: "#/properties/components/additionalProperties/type",
27090
- keyword: "type",
27091
- params: { type: "object" },
27092
- message: "must be object"
27093
- }
27094
- ];
27095
- return false;
27096
- }
27097
- }
27098
- var valid3 = _errs14 === errors2;
27099
- if (!valid3) {
27100
- break;
27101
- }
27102
- }
27103
- } else {
27104
- validate25.errors = [
27105
- {
27106
- instancePath: instancePath + "/components",
27107
- schemaPath: "#/properties/components/type",
27108
- keyword: "type",
27109
- params: { type: "object" },
27110
- message: "must be object"
27111
- }
27112
- ];
27113
- return false;
27114
- }
27115
- }
27116
- var valid0 = _errs11 === errors2;
27117
- } else {
27118
- var valid0 = true;
27119
- }
27120
- }
27121
- }
27122
- }
27123
- } else {
27124
- validate25.errors = [
27125
- {
27126
- instancePath,
27127
- schemaPath: "#/type",
27128
- keyword: "type",
27129
- params: { type: "object" },
27130
- message: "must be object"
27131
- }
27132
- ];
27133
- return false;
27134
- }
27135
- }
27136
- validate25.errors = vErrors;
27137
- return errors2 === 0;
27138
- }
27139
- validate25.evaluated = {
27140
- props: { name: true, server: true, components: true },
27141
- dynamicProps: false,
27142
- dynamicItems: false
27143
- };
27144
- const type$b = "array";
27145
- 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"]}]}`);
26870
+ const type$c = "array";
26871
+ 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"},"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"]}]}`);
27146
26872
  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"]}]}}`);
27147
- const $id$b = "/designer/components.json";
26873
+ const $id$c = "/designer/components.json";
27148
26874
  const componentsSchema = {
27149
- type: type$b,
26875
+ type: type$c,
27150
26876
  items: items$2,
27151
26877
  $defs: $defs$6,
27152
- $id: $id$b
26878
+ $id: $id$c
27153
26879
  };
27154
- const type$a = "array";
27155
- 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"]}]}`);
26880
+ const type$b = "array";
26881
+ 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"},"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"]}]}`);
27156
26882
  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"] } };
27157
26883
  const strippedComponentsSchema = {
27158
- type: type$a,
26884
+ type: type$b,
27159
26885
  items: items$1,
27160
26886
  $defs: $defs$5
27161
26887
  };
@@ -27206,31 +26932,45 @@ function isString(value) {
27206
26932
  return typeof value == "string" || !isArray(value) && isObjectLike$1(value) && baseGetTag(value) == stringTag;
27207
26933
  }
27208
26934
  const isNonEmptyString = (value) => isString(value) && value.length > 0;
27209
- const $schema$9 = "https://json-schema.org/draft/2020-12/schema";
27210
- const $id$a = "/context-data/context-data.json";
27211
- const title$9 = "ContextData";
27212
- const type$9 = "object";
26935
+ const $schema$a = "https://json-schema.org/draft/2020-12/schema";
26936
+ const $id$b = "/context-data/context-data.json";
26937
+ const title$a = "ContextData";
26938
+ const type$a = "object";
27213
26939
  const additionalProperties$2 = { "$ref": "#/$defs/dataValue" };
27214
26940
  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"] } };
27215
26941
  const contextDataSchema = {
27216
- $schema: $schema$9,
27217
- $id: $id$a,
27218
- title: title$9,
27219
- type: type$9,
26942
+ $schema: $schema$a,
26943
+ $id: $id$b,
26944
+ title: title$a,
26945
+ type: type$a,
27220
26946
  additionalProperties: additionalProperties$2,
27221
26947
  $defs: $defs$4
27222
26948
  };
27223
- const $schema$8 = "https://json-schema.org/draft/2020-12/schema";
27224
- const $id$9 = "/expressions/expression.json";
27225
- const title$8 = "Expression";
26949
+ const $schema$9 = "https://json-schema.org/draft/2020-12/schema";
26950
+ const $id$a = "/expressions/expression.json";
26951
+ const title$9 = "Expression";
27226
26952
  const anyOf$1 = [{ "$ref": "#/$defs/arrayExpression" }, { "$ref": "#/$defs/booleanExpression" }, { "$ref": "#/$defs/numberExpression" }, { "$ref": "#/$defs/stringExpression" }];
27227
26953
  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"] } };
27228
26954
  const expressionSchema = {
26955
+ $schema: $schema$9,
26956
+ $id: $id$a,
26957
+ title: title$9,
26958
+ anyOf: anyOf$1,
26959
+ $defs: $defs$3
26960
+ };
26961
+ const $schema$8 = "https://json-schema.org/draft/2020-12/schema";
26962
+ const $id$9 = "/meta/extension-config.json";
26963
+ const title$8 = "ExtensionConfig";
26964
+ const type$9 = "object";
26965
+ 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"] } } };
26966
+ const required$2 = ["name"];
26967
+ const extensionManifestSchema = {
27229
26968
  $schema: $schema$8,
27230
26969
  $id: $id$9,
27231
26970
  title: title$8,
27232
- anyOf: anyOf$1,
27233
- $defs: $defs$3
26971
+ type: type$9,
26972
+ properties: properties$a,
26973
+ required: required$2
27234
26974
  };
27235
26975
  var _2020 = { exports: {} };
27236
26976
  var core$2 = {};
@@ -32869,12 +32609,12 @@ function requirePatternProperties() {
32869
32609
  patternProperties.default = def;
32870
32610
  return patternProperties;
32871
32611
  }
32872
- var not = {};
32612
+ var not$1 = {};
32873
32613
  var hasRequiredNot;
32874
32614
  function requireNot() {
32875
- if (hasRequiredNot) return not;
32615
+ if (hasRequiredNot) return not$1;
32876
32616
  hasRequiredNot = 1;
32877
- Object.defineProperty(not, "__esModule", { value: true });
32617
+ Object.defineProperty(not$1, "__esModule", { value: true });
32878
32618
  const util_1 = requireUtil$5();
32879
32619
  const def = {
32880
32620
  keyword: "not",
@@ -32897,8 +32637,8 @@ function requireNot() {
32897
32637
  },
32898
32638
  error: { message: "must NOT be valid" }
32899
32639
  };
32900
- not.default = def;
32901
- return not;
32640
+ not$1.default = def;
32641
+ return not$1;
32902
32642
  }
32903
32643
  var anyOf = {};
32904
32644
  var hasRequiredAnyOf;
@@ -34686,7 +34426,27 @@ function requireApi() {
34686
34426
  api.types = types2;
34687
34427
  return api;
34688
34428
  }
34689
- requireApi();
34429
+ var apiExports = requireApi();
34430
+ var eq = (x) => (y) => x === y;
34431
+ var not = (fn) => (x) => !fn(x);
34432
+ var getValues = (
34433
+ /*::<Obj: Object>*/
34434
+ ((o) => Object.values(o))
34435
+ );
34436
+ var notUndefined = (x) => x !== void 0;
34437
+ var isXError = (x) => (error2) => error2.keyword === x;
34438
+ var isRequiredError = isXError("required");
34439
+ var isAnyOfError = isXError("anyOf");
34440
+ var isEnumError = isXError("enum");
34441
+ var getErrors = (node2) => node2 && node2.errors ? node2.errors.map(
34442
+ (e) => e.keyword === "errorMessage" ? { ...e.params.errors[0], message: e.message } : e
34443
+ ) : [];
34444
+ var getChildren = (node2) => node2 && getValues(node2.children) || [];
34445
+ var getSiblings = (parent2) => (node2) => getChildren(parent2).filter(not(eq(node2)));
34446
+ var concatAll = (
34447
+ /*::<T>*/
34448
+ ((xs) => (ys) => ys.reduce((zs, z) => zs.concat(z), xs))
34449
+ );
34690
34450
  var ansiStyles = { exports: {} };
34691
34451
  var colorName;
34692
34452
  var hasRequiredColorName;
@@ -36240,7 +36000,8 @@ function requireSource() {
36240
36000
  source = chalk2;
36241
36001
  return source;
36242
36002
  }
36243
- requireSource();
36003
+ var sourceExports = requireSource();
36004
+ const chalk = /* @__PURE__ */ getDefaultExportFromCjs(sourceExports);
36244
36005
  var lib$2 = {};
36245
36006
  var picocolors = { exports: {} };
36246
36007
  var hasRequiredPicocolors;
@@ -36723,15 +36484,170 @@ ${frame}`;
36723
36484
  lib$2.highlight = highlight;
36724
36485
  return lib$2;
36725
36486
  }
36726
- requireLib$1();
36727
- var leven = { exports: {} };
36487
+ var libExports = requireLib$1();
36488
+ var getPointers = (dataPath) => {
36489
+ return dataPath.split("/").slice(1).map((pointer2) => pointer2.split("~1").join("/").split("~0").join("~"));
36490
+ };
36491
+ function getMetaFromPath(jsonAst, dataPath, includeIdentifierLocation) {
36492
+ const pointers = getPointers(dataPath);
36493
+ const lastPointerIndex = pointers.length - 1;
36494
+ return pointers.reduce((obj, pointer2, idx) => {
36495
+ switch (obj.type) {
36496
+ case "Object": {
36497
+ const filtered = obj.members.filter(
36498
+ (child) => child.name.value === pointer2
36499
+ );
36500
+ if (filtered.length !== 1) {
36501
+ throw new Error(`Couldn't find property ${pointer2} of ${dataPath}`);
36502
+ }
36503
+ const { name, value } = filtered[0];
36504
+ return includeIdentifierLocation && idx === lastPointerIndex ? name : value;
36505
+ }
36506
+ case "Array":
36507
+ return obj.elements[pointer2];
36508
+ default:
36509
+ console.log(obj);
36510
+ }
36511
+ }, jsonAst.body);
36512
+ }
36513
+ function getDecoratedDataPath(jsonAst, dataPath) {
36514
+ let decoratedPath = "";
36515
+ getPointers(dataPath).reduce((obj, pointer2) => {
36516
+ switch (obj.type) {
36517
+ case "Object": {
36518
+ decoratedPath += `/${pointer2}`;
36519
+ const filtered = obj.members.filter(
36520
+ (child) => child.name.value === pointer2
36521
+ );
36522
+ if (filtered.length !== 1) {
36523
+ throw new Error(`Couldn't find property ${pointer2} of ${dataPath}`);
36524
+ }
36525
+ return filtered[0].value;
36526
+ }
36527
+ case "Array": {
36528
+ decoratedPath += `/${pointer2}${getTypeName(obj.elements[pointer2])}`;
36529
+ return obj.elements[pointer2];
36530
+ }
36531
+ default:
36532
+ console.log(obj);
36533
+ }
36534
+ }, jsonAst.body);
36535
+ return decoratedPath;
36536
+ }
36537
+ function getTypeName(obj) {
36538
+ if (!obj || !obj.elements) {
36539
+ return "";
36540
+ }
36541
+ const type2 = obj.elements.filter(
36542
+ (child) => child && child.name && child.name.value === "type"
36543
+ );
36544
+ if (!type2.length) {
36545
+ return "";
36546
+ }
36547
+ return type2[0].value && `:${type2[0].value.value}` || "";
36548
+ }
36549
+ var BaseValidationError = class {
36550
+ constructor(options = { isIdentifierLocation: false }, { data, schema, jsonAst, jsonRaw }) {
36551
+ this.options = options;
36552
+ this.data = data;
36553
+ this.schema = schema;
36554
+ this.jsonAst = jsonAst;
36555
+ this.jsonRaw = jsonRaw;
36556
+ }
36557
+ getLocation(dataPath = this.instancePath) {
36558
+ const { isIdentifierLocation, isSkipEndLocation } = this.options;
36559
+ const { loc } = getMetaFromPath(
36560
+ this.jsonAst,
36561
+ dataPath,
36562
+ isIdentifierLocation
36563
+ );
36564
+ return {
36565
+ start: loc.start,
36566
+ end: isSkipEndLocation ? void 0 : loc.end
36567
+ };
36568
+ }
36569
+ getDecoratedPath(dataPath = this.instancePath) {
36570
+ const decoratedPath = getDecoratedDataPath(this.jsonAst, dataPath);
36571
+ return decoratedPath;
36572
+ }
36573
+ getCodeFrame(message, dataPath = this.instancePath) {
36574
+ return libExports.codeFrameColumns(this.jsonRaw, this.getLocation(dataPath), {
36575
+ highlightCode: true,
36576
+ message
36577
+ });
36578
+ }
36579
+ /**
36580
+ * @return {string}
36581
+ */
36582
+ get instancePath() {
36583
+ return typeof this.options.instancePath !== "undefined" ? this.options.instancePath : this.options.dataPath;
36584
+ }
36585
+ print() {
36586
+ throw new Error(
36587
+ `Implement the 'print' method inside ${this.constructor.name}!`
36588
+ );
36589
+ }
36590
+ getError() {
36591
+ throw new Error(
36592
+ `Implement the 'getError' method inside ${this.constructor.name}!`
36593
+ );
36594
+ }
36595
+ };
36596
+ var RequiredValidationError = class extends BaseValidationError {
36597
+ getLocation(dataPath = this.instancePath) {
36598
+ const { start } = super.getLocation(dataPath);
36599
+ return { start };
36600
+ }
36601
+ print() {
36602
+ const { message, params } = this.options;
36603
+ const output = [chalk`{red {bold REQUIRED} ${message}}\n`];
36604
+ return output.concat(
36605
+ this.getCodeFrame(
36606
+ chalk`☹️ {magentaBright ${params.missingProperty}} is missing here!`
36607
+ )
36608
+ );
36609
+ }
36610
+ getError() {
36611
+ const { message } = this.options;
36612
+ return {
36613
+ ...this.getLocation(),
36614
+ error: `${this.getDecoratedPath()} ${message}`,
36615
+ path: this.instancePath
36616
+ };
36617
+ }
36618
+ };
36619
+ var AdditionalPropValidationError = class extends BaseValidationError {
36620
+ constructor(...args) {
36621
+ super(...args);
36622
+ this.options.isIdentifierLocation = true;
36623
+ }
36624
+ print() {
36625
+ const { message, params } = this.options;
36626
+ const output = [chalk`{red {bold ADDTIONAL PROPERTY} ${message}}\n`];
36627
+ return output.concat(
36628
+ this.getCodeFrame(
36629
+ chalk`😲 {magentaBright ${params.additionalProperty}} is not expected to be here!`,
36630
+ `${this.instancePath}/${params.additionalProperty}`
36631
+ )
36632
+ );
36633
+ }
36634
+ getError() {
36635
+ const { params } = this.options;
36636
+ return {
36637
+ ...this.getLocation(`${this.instancePath}/${params.additionalProperty}`),
36638
+ error: `${this.getDecoratedPath()} Property ${params.additionalProperty} is not expected to be here`,
36639
+ path: this.instancePath
36640
+ };
36641
+ }
36642
+ };
36643
+ var leven$1 = { exports: {} };
36728
36644
  var hasRequiredLeven;
36729
36645
  function requireLeven() {
36730
- if (hasRequiredLeven) return leven.exports;
36646
+ if (hasRequiredLeven) return leven$1.exports;
36731
36647
  hasRequiredLeven = 1;
36732
36648
  const array2 = [];
36733
36649
  const charCodeCache = [];
36734
- const leven$1 = (left, right) => {
36650
+ const leven2 = (left, right) => {
36735
36651
  if (left === right) {
36736
36652
  return 0;
36737
36653
  }
@@ -36777,11 +36693,12 @@ function requireLeven() {
36777
36693
  }
36778
36694
  return result2;
36779
36695
  };
36780
- leven.exports = leven$1;
36781
- leven.exports.default = leven$1;
36782
- return leven.exports;
36696
+ leven$1.exports = leven2;
36697
+ leven$1.exports.default = leven2;
36698
+ return leven$1.exports;
36783
36699
  }
36784
- requireLeven();
36700
+ var levenExports = requireLeven();
36701
+ const leven = /* @__PURE__ */ getDefaultExportFromCjs(levenExports);
36785
36702
  var jsonpointer = {};
36786
36703
  var hasRequiredJsonpointer;
36787
36704
  function requireJsonpointer() {
@@ -36802,19 +36719,19 @@ function requireJsonpointer() {
36802
36719
  if (!hasExcape.test(str)) return str;
36803
36720
  return str.replace(escapeMatcher, escapeReplacer);
36804
36721
  }
36805
- function setter(obj, pointer, value) {
36722
+ function setter(obj, pointer2, value) {
36806
36723
  var part;
36807
36724
  var hasNextPart;
36808
- for (var p = 1, len = pointer.length; p < len; ) {
36809
- if (pointer[p] === "constructor" || pointer[p] === "prototype" || pointer[p] === "__proto__") return obj;
36810
- part = untilde(pointer[p++]);
36725
+ for (var p = 1, len = pointer2.length; p < len; ) {
36726
+ if (pointer2[p] === "constructor" || pointer2[p] === "prototype" || pointer2[p] === "__proto__") return obj;
36727
+ part = untilde(pointer2[p++]);
36811
36728
  hasNextPart = len > p;
36812
36729
  if (typeof obj[part] === "undefined") {
36813
36730
  if (Array.isArray(obj) && part === "-") {
36814
36731
  part = obj.length;
36815
36732
  }
36816
36733
  if (hasNextPart) {
36817
- if (pointer[p] !== "" && pointer[p] < Infinity || pointer[p] === "-") obj[part] = [];
36734
+ if (pointer2[p] !== "" && pointer2[p] < Infinity || pointer2[p] === "-") obj[part] = [];
36818
36735
  else obj[part] = {};
36819
36736
  }
36820
36737
  }
@@ -36826,40 +36743,40 @@ function requireJsonpointer() {
36826
36743
  else obj[part] = value;
36827
36744
  return oldValue;
36828
36745
  }
36829
- function compilePointer(pointer) {
36830
- if (typeof pointer === "string") {
36831
- pointer = pointer.split("/");
36832
- if (pointer[0] === "") return pointer;
36746
+ function compilePointer(pointer2) {
36747
+ if (typeof pointer2 === "string") {
36748
+ pointer2 = pointer2.split("/");
36749
+ if (pointer2[0] === "") return pointer2;
36833
36750
  throw new Error("Invalid JSON pointer.");
36834
- } else if (Array.isArray(pointer)) {
36835
- for (const part of pointer) {
36751
+ } else if (Array.isArray(pointer2)) {
36752
+ for (const part of pointer2) {
36836
36753
  if (typeof part !== "string" && typeof part !== "number") {
36837
36754
  throw new Error("Invalid JSON pointer. Must be of type string or number.");
36838
36755
  }
36839
36756
  }
36840
- return pointer;
36757
+ return pointer2;
36841
36758
  }
36842
36759
  throw new Error("Invalid JSON pointer.");
36843
36760
  }
36844
- function get(obj, pointer) {
36761
+ function get(obj, pointer2) {
36845
36762
  if (typeof obj !== "object") throw new Error("Invalid input object.");
36846
- pointer = compilePointer(pointer);
36847
- var len = pointer.length;
36763
+ pointer2 = compilePointer(pointer2);
36764
+ var len = pointer2.length;
36848
36765
  if (len === 1) return obj;
36849
36766
  for (var p = 1; p < len; ) {
36850
- obj = obj[untilde(pointer[p++])];
36767
+ obj = obj[untilde(pointer2[p++])];
36851
36768
  if (len === p) return obj;
36852
36769
  if (typeof obj !== "object" || obj === null) return void 0;
36853
36770
  }
36854
36771
  }
36855
- function set(obj, pointer, value) {
36772
+ function set(obj, pointer2, value) {
36856
36773
  if (typeof obj !== "object") throw new Error("Invalid input object.");
36857
- pointer = compilePointer(pointer);
36858
- if (pointer.length === 0) throw new Error("Invalid JSON pointer for set.");
36859
- return setter(obj, pointer, value);
36774
+ pointer2 = compilePointer(pointer2);
36775
+ if (pointer2.length === 0) throw new Error("Invalid JSON pointer for set.");
36776
+ return setter(obj, pointer2, value);
36860
36777
  }
36861
- function compile2(pointer) {
36862
- var compiled = compilePointer(pointer);
36778
+ function compile2(pointer2) {
36779
+ var compiled = compilePointer(pointer2);
36863
36780
  return {
36864
36781
  get: function(object2) {
36865
36782
  return get(object2, compiled);
@@ -36874,32 +36791,203 @@ function requireJsonpointer() {
36874
36791
  jsonpointer.compile = compile2;
36875
36792
  return jsonpointer;
36876
36793
  }
36877
- requireJsonpointer();
36794
+ var jsonpointerExports = requireJsonpointer();
36795
+ const pointer = /* @__PURE__ */ getDefaultExportFromCjs(jsonpointerExports);
36796
+ var EnumValidationError = class extends BaseValidationError {
36797
+ print() {
36798
+ const {
36799
+ message,
36800
+ params: { allowedValues }
36801
+ } = this.options;
36802
+ const bestMatch = this.findBestMatch();
36803
+ const output = [
36804
+ chalk`{red {bold ENUM} ${message}}`,
36805
+ chalk`{red (${allowedValues.join(", ")})}\n`
36806
+ ];
36807
+ return output.concat(
36808
+ this.getCodeFrame(
36809
+ bestMatch !== null ? chalk`👈🏽 Did you mean {magentaBright ${bestMatch}} here?` : chalk`👈🏽 Unexpected value, should be equal to one of the allowed values`
36810
+ )
36811
+ );
36812
+ }
36813
+ getError() {
36814
+ const { message, params } = this.options;
36815
+ const bestMatch = this.findBestMatch();
36816
+ const allowedValues = params.allowedValues.join(", ");
36817
+ const output = {
36818
+ ...this.getLocation(),
36819
+ error: `${this.getDecoratedPath()} ${message}: ${allowedValues}`,
36820
+ path: this.instancePath
36821
+ };
36822
+ if (bestMatch !== null) {
36823
+ output.suggestion = `Did you mean ${bestMatch}?`;
36824
+ }
36825
+ return output;
36826
+ }
36827
+ findBestMatch() {
36828
+ const {
36829
+ params: { allowedValues }
36830
+ } = this.options;
36831
+ const currentValue = this.instancePath === "" ? this.data : pointer.get(this.data, this.instancePath);
36832
+ if (!currentValue) {
36833
+ return null;
36834
+ }
36835
+ const bestMatch = allowedValues.map((value) => ({
36836
+ value,
36837
+ weight: leven(value, currentValue.toString())
36838
+ })).sort(
36839
+ (x, y) => x.weight > y.weight ? 1 : x.weight < y.weight ? -1 : 0
36840
+ )[0];
36841
+ return allowedValues.length === 1 || bestMatch.weight < bestMatch.value.length ? bestMatch.value : null;
36842
+ }
36843
+ };
36844
+ var DefaultValidationError = class extends BaseValidationError {
36845
+ print() {
36846
+ const { keyword: keyword2, message } = this.options;
36847
+ const output = [chalk`{red {bold ${keyword2.toUpperCase()}} ${message}}\n`];
36848
+ return output.concat(
36849
+ this.getCodeFrame(chalk`👈🏽 {magentaBright ${keyword2}} ${message}`)
36850
+ );
36851
+ }
36852
+ getError() {
36853
+ const { keyword: keyword2, message } = this.options;
36854
+ return {
36855
+ ...this.getLocation(),
36856
+ error: `${this.getDecoratedPath()}: ${keyword2} ${message}`,
36857
+ path: this.instancePath
36858
+ };
36859
+ }
36860
+ };
36861
+ var JSON_POINTERS_REGEX = /\/[\w_-]+(\/\d+)?/g;
36862
+ function makeTree(ajvErrors = []) {
36863
+ const root2 = { children: {} };
36864
+ ajvErrors.forEach((ajvError) => {
36865
+ const instancePath = typeof ajvError.instancePath !== "undefined" ? ajvError.instancePath : ajvError.dataPath;
36866
+ const paths = instancePath === "" ? [""] : instancePath.match(JSON_POINTERS_REGEX);
36867
+ paths && paths.reduce((obj, path2, i) => {
36868
+ obj.children[path2] = obj.children[path2] || { children: {}, errors: [] };
36869
+ if (i === paths.length - 1) {
36870
+ obj.children[path2].errors.push(ajvError);
36871
+ }
36872
+ return obj.children[path2];
36873
+ }, root2);
36874
+ });
36875
+ return root2;
36876
+ }
36877
+ function filterRedundantErrors(root2, parent2, key) {
36878
+ getErrors(root2).forEach((error2) => {
36879
+ if (isRequiredError(error2)) {
36880
+ root2.errors = [error2];
36881
+ root2.children = {};
36882
+ }
36883
+ });
36884
+ if (getErrors(root2).some(isAnyOfError)) {
36885
+ if (Object.keys(root2.children).length > 0) {
36886
+ delete root2.errors;
36887
+ }
36888
+ }
36889
+ if (root2.errors && root2.errors.length && getErrors(root2).every(isEnumError)) {
36890
+ if (getSiblings(parent2)(root2).filter(notUndefined).some(getErrors)) {
36891
+ delete parent2.children[key];
36892
+ }
36893
+ }
36894
+ Object.entries(root2.children).forEach(
36895
+ ([key2, child]) => filterRedundantErrors(child, root2, key2)
36896
+ );
36897
+ }
36898
+ function createErrorInstances(root2, options) {
36899
+ const errors2 = getErrors(root2);
36900
+ if (errors2.length && errors2.every(isEnumError)) {
36901
+ const uniqueValues = new Set(
36902
+ concatAll([])(errors2.map((e) => e.params.allowedValues))
36903
+ );
36904
+ const allowedValues = [...uniqueValues];
36905
+ const error2 = errors2[0];
36906
+ return [
36907
+ new EnumValidationError(
36908
+ {
36909
+ ...error2,
36910
+ params: { allowedValues }
36911
+ },
36912
+ options
36913
+ )
36914
+ ];
36915
+ } else {
36916
+ return concatAll(
36917
+ errors2.reduce((ret, error2) => {
36918
+ switch (error2.keyword) {
36919
+ case "additionalProperties":
36920
+ return ret.concat(
36921
+ new AdditionalPropValidationError(error2, options)
36922
+ );
36923
+ case "required":
36924
+ return ret.concat(new RequiredValidationError(error2, options));
36925
+ default:
36926
+ return ret.concat(new DefaultValidationError(error2, options));
36927
+ }
36928
+ }, [])
36929
+ )(getChildren(root2).map((child) => createErrorInstances(child, options)));
36930
+ }
36931
+ }
36932
+ var helpers_default = (ajvErrors, options) => {
36933
+ const tree = makeTree(ajvErrors || []);
36934
+ filterRedundantErrors(tree);
36935
+ return createErrorInstances(tree, options);
36936
+ };
36937
+ var index_default = (schema, data, errors2, options = {}) => {
36938
+ const { format: format2 = "cli", indent: indent2 = null, json: json2 = null } = options;
36939
+ const jsonRaw = json2 || JSON.stringify(data, null, indent2);
36940
+ const jsonAst = apiExports.parse(jsonRaw);
36941
+ const customErrorToText = (error2) => error2.print().join("\n");
36942
+ const customErrorToStructure = (error2) => error2.getError();
36943
+ const customErrors = helpers_default(errors2, {
36944
+ data,
36945
+ schema,
36946
+ jsonAst,
36947
+ jsonRaw
36948
+ });
36949
+ if (format2 === "cli") {
36950
+ return customErrors.map(customErrorToText).join("\n\n");
36951
+ } else {
36952
+ return customErrors.map(customErrorToStructure);
36953
+ }
36954
+ };
36878
36955
  const instance = new _2020Exports.Ajv2020();
36879
36956
  instance.addSchema([
36880
36957
  componentsSchema,
36881
36958
  strippedComponentsSchema,
36882
36959
  contextDataSchema,
36883
- expressionSchema
36960
+ expressionSchema,
36961
+ extensionManifestSchema
36884
36962
  ]);
36885
36963
  const errorsText = (instance2) => {
36886
36964
  const { errors: errors2 } = instance2;
36887
36965
  const detail = errors2?.slice(0, 5).map((error2) => `${error2.instancePath} ${error2.message ?? "invalid"}`.trim()).join(", ");
36888
36966
  return `Invalid data: ${detail ?? "validation failed"}`;
36889
36967
  };
36890
- const preCompiledSafeValidator = (validate2) => (value) => {
36891
- if (validate2(value)) {
36968
+ const validateSafe = (schema, data, errorsFormat, ajvInstance) => {
36969
+ try {
36970
+ if (ajvInstance.validate(schema, data)) {
36971
+ return {
36972
+ ok: true,
36973
+ value: data
36974
+ };
36975
+ }
36892
36976
  return {
36893
- ok: true,
36894
- value
36977
+ ok: false,
36978
+ error: errorsFormat === "ajv" ? errorsText(ajvInstance) : index_default(schema, data, ajvInstance.errors, {
36979
+ format: "cli",
36980
+ indent: 2
36981
+ })
36982
+ };
36983
+ } catch {
36984
+ return {
36985
+ ok: false,
36986
+ error: "Validation failed"
36895
36987
  };
36896
36988
  }
36897
- return {
36898
- ok: false,
36899
- error: errorsText(validate2)
36900
- };
36901
36989
  };
36902
- const validateExtensionManifest = preCompiledSafeValidator(validateExtensionConfig);
36990
+ const validateExtensionManifest = (manifest, errorsFormat = "ajv") => validateSafe(extensionManifestSchema, manifest, errorsFormat, instance);
36903
36991
  const requireValidExtensionDir = async (dir2) => {
36904
36992
  const extConfigPath = resolve$1(dir2, "extension.json");
36905
36993
  if (!existsSync(extConfigPath)) {
@@ -43033,10 +43121,10 @@ var hasRequiredEq;
43033
43121
  function requireEq() {
43034
43122
  if (hasRequiredEq) return eq_1;
43035
43123
  hasRequiredEq = 1;
43036
- function eq(value, other) {
43124
+ function eq2(value, other) {
43037
43125
  return value === other || value !== value && other !== other;
43038
43126
  }
43039
- eq_1 = eq;
43127
+ eq_1 = eq2;
43040
43128
  return eq_1;
43041
43129
  }
43042
43130
  var isLength_1;
@@ -43083,14 +43171,14 @@ var hasRequired_isIterateeCall;
43083
43171
  function require_isIterateeCall() {
43084
43172
  if (hasRequired_isIterateeCall) return _isIterateeCall;
43085
43173
  hasRequired_isIterateeCall = 1;
43086
- var eq = requireEq(), isArrayLike2 = requireIsArrayLike(), isIndex = require_isIndex(), isObject2 = requireIsObject();
43174
+ var eq2 = requireEq(), isArrayLike2 = requireIsArrayLike(), isIndex = require_isIndex(), isObject2 = requireIsObject();
43087
43175
  function isIterateeCall(value, index2, object2) {
43088
43176
  if (!isObject2(object2)) {
43089
43177
  return false;
43090
43178
  }
43091
43179
  var type2 = typeof index2;
43092
43180
  if (type2 == "number" ? isArrayLike2(object2) && isIndex(index2, object2.length) : type2 == "string" && index2 in object2) {
43093
- return eq(object2[index2], value);
43181
+ return eq2(object2[index2], value);
43094
43182
  }
43095
43183
  return false;
43096
43184
  }
@@ -43352,7 +43440,7 @@ var hasRequiredDefaults;
43352
43440
  function requireDefaults() {
43353
43441
  if (hasRequiredDefaults) return defaults_1;
43354
43442
  hasRequiredDefaults = 1;
43355
- var baseRest = require_baseRest(), eq = requireEq(), isIterateeCall = require_isIterateeCall(), keysIn = requireKeysIn();
43443
+ var baseRest = require_baseRest(), eq2 = requireEq(), isIterateeCall = require_isIterateeCall(), keysIn = requireKeysIn();
43356
43444
  var objectProto2 = Object.prototype;
43357
43445
  var hasOwnProperty2 = objectProto2.hasOwnProperty;
43358
43446
  var defaults2 = baseRest(function(object2, sources) {
@@ -43371,7 +43459,7 @@ function requireDefaults() {
43371
43459
  while (++propsIndex < propsLength) {
43372
43460
  var key = props[propsIndex];
43373
43461
  var value = object2[key];
43374
- if (value === void 0 || eq(value, objectProto2[key]) && !hasOwnProperty2.call(object2, key)) {
43462
+ if (value === void 0 || eq2(value, objectProto2[key]) && !hasOwnProperty2.call(object2, key)) {
43375
43463
  object2[key] = source2[key];
43376
43464
  }
43377
43465
  }
@@ -49679,11 +49767,11 @@ var hasRequired_assocIndexOf;
49679
49767
  function require_assocIndexOf() {
49680
49768
  if (hasRequired_assocIndexOf) return _assocIndexOf;
49681
49769
  hasRequired_assocIndexOf = 1;
49682
- var eq = requireEq();
49770
+ var eq2 = requireEq();
49683
49771
  function assocIndexOf(array2, key) {
49684
49772
  var length = array2.length;
49685
49773
  while (length--) {
49686
- if (eq(array2[length][0], key)) {
49774
+ if (eq2(array2[length][0], key)) {
49687
49775
  return length;
49688
49776
  }
49689
49777
  }
@@ -65693,16 +65781,6 @@ const resolveServerAndDbOptions = (manifest) => {
65693
65781
  }
65694
65782
  return { enableServer, enableDb };
65695
65783
  };
65696
- const formatValidationErrors = (errors2) => {
65697
- if (!errors2 || errors2.length === 0) {
65698
- return "Invalid extension config.";
65699
- }
65700
- return errors2.map((error2) => {
65701
- const path2 = error2.instancePath || "/";
65702
- const message = error2.message ?? "is invalid";
65703
- return `${path2} ${message}`.trim();
65704
- }).join("; ");
65705
- };
65706
65784
  const createExtension = async (opts, env2) => {
65707
65785
  const cwd = process.cwd();
65708
65786
  let nameFromConfig = null;
@@ -65722,10 +65800,11 @@ const createExtension = async (opts, env2) => {
65722
65800
  const parsedExtensionConfig = JSON.parse(
65723
65801
  await readFile(extensionConfigPath, "utf8")
65724
65802
  );
65725
- if (validateExtensionConfig(parsedExtensionConfig)) {
65726
- nameFromConfig = parsedExtensionConfig.name;
65803
+ const validateResult = validateExtensionManifest(parsedExtensionConfig);
65804
+ if (validateResult.ok) {
65805
+ nameFromConfig = validateResult.value.name;
65727
65806
  } else {
65728
- extensionConfigError = `Invalid extension config at ${extensionConfigPath}: ${formatValidationErrors(validateExtensionConfig.errors)}`;
65807
+ extensionConfigError = `Invalid extension config at ${extensionConfigPath}: ${validateResult.error}`;
65729
65808
  }
65730
65809
  } catch (error2) {
65731
65810
  extensionConfigError = `Failed to read extension config at ${extensionConfigPath}: ${parseErrorMessage(error2)}`;
@@ -65824,43 +65903,6 @@ const createExtension = async (opts, env2) => {
65824
65903
  const envContents = updatedEnvLines.join("\n");
65825
65904
  await writeFile(envFilePath2, envContents.endsWith("\n") ? envContents : `${envContents}
65826
65905
  `);
65827
- if (opts.dev) {
65828
- if (!devServerDbOptions) {
65829
- console.error("The --dev flag requires a valid extension.json manifest.");
65830
- process.exit(1);
65831
- }
65832
- const { enableServer, enableDb } = devServerDbOptions;
65833
- const versionResult = await client2.request({
65834
- document: CreateExtensionVersionDocument,
65835
- variables: {
65836
- input: {
65837
- extensionId: extension.id,
65838
- extensionName: extension.name,
65839
- versionName: "1",
65840
- manifest: JSON.stringify(manifest),
65841
- enableServer,
65842
- enableDb,
65843
- autoDeploy: false
65844
- }
65845
- },
65846
- requestHeaders: {
65847
- Authorization: `Bearer ${apiToken}`
65848
- }
65849
- });
65850
- if (versionResult.createExtensionVersion.__typename !== "CreateExtensionVersionSuccessResult") {
65851
- console.error(
65852
- `Failed to create dev extension version (${versionResult.createExtensionVersion.__typename}):`,
65853
- versionResult.createExtensionVersion.message
65854
- );
65855
- process.exit(1);
65856
- }
65857
- if (opts.verbose) {
65858
- console.log(
65859
- `Created dev extension version 1 (ID ${versionResult.createExtensionVersion.extensionVersion.id})`
65860
- );
65861
- console.log("Skipping upload in dev mode.");
65862
- }
65863
- }
65864
65906
  return;
65865
65907
  }
65866
65908
  console.error(
@@ -66402,6 +66444,7 @@ const initDb = async (opts, env2) => {
66402
66444
  coreDbUrl: coreDbUrlObject
66403
66445
  });
66404
66446
  };
66447
+ const defaultDevServerImage = "us-docker.pkg.dev/wirechunk/dev-server/core:latest";
66405
66448
  const parseStartFlag = (value, name) => {
66406
66449
  const trimmed = value?.trim();
66407
66450
  if (!trimmed) {
@@ -66414,11 +66457,7 @@ const parseStartFlag = (value, name) => {
66414
66457
  process.exit(1);
66415
66458
  };
66416
66459
  const startCore = async (opts, env2) => {
66417
- const image = env2.WIRECHUNK_CORE_DEV_SERVER_IMAGE;
66418
- if (!image) {
66419
- console.error("Missing WIRECHUNK_CORE_DEV_SERVER_IMAGE in environment");
66420
- process.exit(1);
66421
- }
66460
+ const image = env2.WIRECHUNK_CORE_DEV_SERVER_IMAGE?.trim() || defaultDevServerImage;
66422
66461
  const databaseUrl = env2.WIRECHUNK_CORE_DATABASE_URL_DOCKER || env2.WIRECHUNK_CORE_DATABASE_URL;
66423
66462
  if (!databaseUrl) {
66424
66463
  console.error(
@@ -66486,26 +66525,50 @@ const startCore = async (opts, env2) => {
66486
66525
  process.exit(exitCode);
66487
66526
  }
66488
66527
  };
66528
+ const hasVersion = (value) => typeof value === "object" && value !== null && "version" in value;
66529
+ const packageJsonPath = resolve$1(dirname(fileURLToPath(import.meta.url)), "../package.json");
66530
+ const getCliVersion = () => {
66531
+ const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8"));
66532
+ if (!hasVersion(parsed) || typeof parsed.version !== "string" || parsed.version.length === 0) {
66533
+ throw new Error("package.json is missing a version string");
66534
+ }
66535
+ return parsed.version;
66536
+ };
66537
+ const version = (_options) => {
66538
+ console.log(getCliVersion());
66539
+ };
66489
66540
  const program = new Command().name("wirechunk").option("--verbose", "output debug logging").option(
66490
66541
  "--env-mode <mode>",
66491
- 'the mode to use for finding .env files to load environment variables, such as "test" to load .env, .env.test, .env.local, and .env.test.local; also for finding config files to include when creating an extension or extension version, such as config.production.json'
66542
+ 'the mode to use for finding .env files to load environment variables, such as "test" to load .env, .env.test, .env.local, and .env.test.local (in that order); also for finding config files to include when creating an extension or extension version, such as config.production.json'
66492
66543
  ).description(`The official Wirechunk CLI
66493
66544
 
66494
- By default, environment variables are loaded from the .env file in the current working directory,
66495
- then the .env.local file, and then from the environment. Variables from the environment have the
66496
- highest precedence.
66545
+ By default, environment variables are loaded from the .env file in the current working directory, then the .env.local file, and then from the environment.
66546
+
66547
+ When --env-mode is used, variables are loaded from .env, then .env.<mode>, then .env.local, then .env.<mode>.local, and finally from the environment.
66548
+
66549
+ Variables loaded later overwrite those loaded earlier. Variables from the environment have the highest precedence.
66497
66550
 
66498
66551
  Environment variables used by some commands:
66499
66552
  WIRECHUNK_CORE_SERVER_URL (the core admin server URL for commands using the API)
66500
- WIRECHUNK_CORE_DATABASE_URL (the core database URL for commands requiring direct database access)`);
66553
+ WIRECHUNK_CORE_DATABASE_URL (the core database URL for commands requiring direct database access)
66554
+ WIRECHUNK_API_TOKEN (the API token for authentication)
66555
+ WIRECHUNK_CORE_JWT_SECRET (the JWT secret for creating new tokens)`);
66556
+ const withOptions = (action) => async (options, cmd) => {
66557
+ const mergedOptions = { ...program.opts(), ...options };
66558
+ if (mergedOptions.verbose) {
66559
+ console.log(`Running ${chalk$1.green.bold(cmd.name())}`);
66560
+ }
66561
+ return action(mergedOptions);
66562
+ };
66501
66563
  const withOptionsAndEnv = (action) => async (options, cmd) => {
66502
66564
  const mergedOptions = { ...program.opts(), ...options };
66503
66565
  if (mergedOptions.verbose) {
66504
- console.log(`Running ${chalk.green.bold(cmd.name())}`);
66566
+ console.log(`Running ${chalk$1.green.bold(cmd.name())}`);
66505
66567
  }
66506
66568
  const env2 = await parseEnv(mergedOptions.envMode);
66507
66569
  return action(mergedOptions, env2);
66508
66570
  };
66571
+ program.command("version").description("print the CLI version").action(withOptions(version));
66509
66572
  program.command("bootstrap").description("create a platform").option("--dev", "bootstrap with development defaults").option("--name <string>", "the name of the platform").option("--handle <string>", "the handle of the platform").option("--admin-site-domain <string>", "the domain of the admin site (dashboard)").action(withOptionsAndEnv(bootstrap));
66510
66573
  program.command("create-extension").description("create an extension").option("--platform-id <string>", "the ID of the platform").option("--name <string>", "the name of the extension").option(
66511
66574
  "--config-file <string>",