@schematichq/schematic-react 0.2.0-rc.0 → 0.2.0-rc.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -140,7 +140,7 @@ __export(src_exports, {
140
140
  IconRound: () => IconRound,
141
141
  IncludedFeatures: () => IncludedFeatures,
142
142
  Invoices: () => Invoices,
143
- NextBillDue: () => NextBillDue,
143
+ MeteredFeatures: () => MeteredFeatures,
144
144
  PaymentMethod: () => PaymentMethod,
145
145
  PlanManager: () => PlanManager,
146
146
  ProgressBar: () => ProgressBar,
@@ -148,6 +148,9 @@ __export(src_exports, {
148
148
  SchematicEmbed: () => SchematicEmbed,
149
149
  SchematicProvider: () => SchematicProvider,
150
150
  Text: () => Text,
151
+ UpcomingBill: () => UpcomingBill,
152
+ defaultSettings: () => defaultSettings,
153
+ defaultTheme: () => defaultTheme,
151
154
  useEmbed: () => useEmbed,
152
155
  useSchematic: () => useSchematic,
153
156
  useSchematicContext: () => useSchematicContext,
@@ -5906,6 +5909,107 @@ var JSONApiResponse = class {
5906
5909
  }
5907
5910
  };
5908
5911
 
5912
+ // src/api/models/BillingPlan.ts
5913
+ function BillingPlanFromJSON(json) {
5914
+ return BillingPlanFromJSONTyped(json, false);
5915
+ }
5916
+ function BillingPlanFromJSONTyped(json, ignoreDiscriminator) {
5917
+ if (json == null) {
5918
+ return json;
5919
+ }
5920
+ return {
5921
+ description: json["description"] == null ? void 0 : json["description"],
5922
+ id: json["id"],
5923
+ imageUrl: json["image_url"] == null ? void 0 : json["image_url"],
5924
+ name: json["name"],
5925
+ planPeriod: json["plan_period"] == null ? void 0 : json["plan_period"],
5926
+ planPrice: json["plan_price"] == null ? void 0 : json["plan_price"]
5927
+ };
5928
+ }
5929
+
5930
+ // src/api/models/BillingPriceResponseData.ts
5931
+ function BillingPriceResponseDataFromJSON(json) {
5932
+ return BillingPriceResponseDataFromJSONTyped(json, false);
5933
+ }
5934
+ function BillingPriceResponseDataFromJSONTyped(json, ignoreDiscriminator) {
5935
+ if (json == null) {
5936
+ return json;
5937
+ }
5938
+ return {
5939
+ externalPriceId: json["external_price_id"],
5940
+ id: json["id"],
5941
+ interval: json["interval"],
5942
+ price: json["price"]
5943
+ };
5944
+ }
5945
+
5946
+ // src/api/models/BillingProductDetailResponseData.ts
5947
+ function BillingProductDetailResponseDataFromJSON(json) {
5948
+ return BillingProductDetailResponseDataFromJSONTyped(json, false);
5949
+ }
5950
+ function BillingProductDetailResponseDataFromJSONTyped(json, ignoreDiscriminator) {
5951
+ if (json == null) {
5952
+ return json;
5953
+ }
5954
+ return {
5955
+ prices: json["Prices"].map(
5956
+ BillingPriceResponseDataFromJSON
5957
+ ),
5958
+ accountId: json["account_id"],
5959
+ createdAt: new Date(json["created_at"]),
5960
+ currency: json["currency"],
5961
+ environmentId: json["environment_id"],
5962
+ externalId: json["external_id"],
5963
+ name: json["name"],
5964
+ price: json["price"],
5965
+ productId: json["product_id"],
5966
+ quantity: json["quantity"],
5967
+ updatedAt: new Date(json["updated_at"])
5968
+ };
5969
+ }
5970
+
5971
+ // src/api/models/BillingSubscriptionResponseData.ts
5972
+ function BillingSubscriptionResponseDataFromJSON(json) {
5973
+ return BillingSubscriptionResponseDataFromJSONTyped(json, false);
5974
+ }
5975
+ function BillingSubscriptionResponseDataFromJSONTyped(json, ignoreDiscriminator) {
5976
+ if (json == null) {
5977
+ return json;
5978
+ }
5979
+ return {
5980
+ expiredAt: json["expired_at"] == null ? void 0 : new Date(json["expired_at"]),
5981
+ externalId: json["external_id"],
5982
+ id: json["id"],
5983
+ updatedAt: new Date(json["updated_at"])
5984
+ };
5985
+ }
5986
+
5987
+ // src/api/models/ChangeSubscriptionRequestBody.ts
5988
+ function ChangeSubscriptionRequestBodyToJSON(value) {
5989
+ if (value == null) {
5990
+ return value;
5991
+ }
5992
+ return {
5993
+ action: value["action"],
5994
+ new_plan_id: value["newPlanId"],
5995
+ new_price_id: value["newPriceId"]
5996
+ };
5997
+ }
5998
+
5999
+ // src/api/models/CheckoutResponse.ts
6000
+ function CheckoutResponseFromJSON(json) {
6001
+ return CheckoutResponseFromJSONTyped(json, false);
6002
+ }
6003
+ function CheckoutResponseFromJSONTyped(json, ignoreDiscriminator) {
6004
+ if (json == null) {
6005
+ return json;
6006
+ }
6007
+ return {
6008
+ data: BillingSubscriptionResponseDataFromJSON(json["data"]),
6009
+ params: json["params"]
6010
+ };
6011
+ }
6012
+
5909
6013
  // src/api/models/PreviewObject.ts
5910
6014
  function PreviewObjectFromJSON(json) {
5911
6015
  return PreviewObjectFromJSONTyped(json, false);
@@ -6008,7 +6112,7 @@ function CompanyDetailResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6008
6112
  return json;
6009
6113
  }
6010
6114
  return {
6011
- addOns: json["add_ons"].map(PreviewObjectFromJSON),
6115
+ addOns: json["add_ons"].map(BillingPlanFromJSON),
6012
6116
  createdAt: new Date(json["created_at"]),
6013
6117
  entityTraits: json["entity_traits"].map(
6014
6118
  EntityTraitDetailResponseDataFromJSON
@@ -6019,7 +6123,7 @@ function CompanyDetailResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6019
6123
  lastSeenAt: json["last_seen_at"] == null ? void 0 : new Date(json["last_seen_at"]),
6020
6124
  logoUrl: json["logo_url"] == null ? void 0 : json["logo_url"],
6021
6125
  name: json["name"],
6022
- plan: json["plan"] == null ? void 0 : PreviewObjectFromJSON(json["plan"]),
6126
+ plan: json["plan"] == null ? void 0 : BillingPlanFromJSON(json["plan"]),
6023
6127
  plans: json["plans"].map(PreviewObjectFromJSON),
6024
6128
  traits: json["traits"] == null ? void 0 : json["traits"],
6025
6129
  updatedAt: new Date(json["updated_at"]),
@@ -6027,25 +6131,6 @@ function CompanyDetailResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6027
6131
  };
6028
6132
  }
6029
6133
 
6030
- // src/api/models/ComponentResponseData.ts
6031
- function ComponentResponseDataFromJSON(json) {
6032
- return ComponentResponseDataFromJSONTyped(json, false);
6033
- }
6034
- function ComponentResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6035
- if (json == null) {
6036
- return json;
6037
- }
6038
- return {
6039
- ast: json["ast"],
6040
- createdAt: new Date(json["created_at"]),
6041
- id: json["id"],
6042
- name: json["name"],
6043
- state: json["state"],
6044
- type: json["type"],
6045
- updatedAt: new Date(json["updated_at"])
6046
- };
6047
- }
6048
-
6049
6134
  // src/api/models/EventSummaryResponseData.ts
6050
6135
  function EventSummaryResponseDataFromJSON(json) {
6051
6136
  return EventSummaryResponseDataFromJSONTyped(json, false);
@@ -6247,13 +6332,91 @@ function PlanResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6247
6332
  return json;
6248
6333
  }
6249
6334
  return {
6250
- audienceType: json["audience_type"],
6335
+ audienceType: json["audience_type"] == null ? void 0 : json["audience_type"],
6336
+ createdAt: new Date(json["created_at"]),
6337
+ description: json["description"],
6338
+ icon: json["icon"],
6339
+ id: json["id"],
6340
+ name: json["name"],
6341
+ planType: json["plan_type"],
6342
+ updatedAt: new Date(json["updated_at"])
6343
+ };
6344
+ }
6345
+
6346
+ // src/api/models/PlanEntitlementResponseData.ts
6347
+ function PlanEntitlementResponseDataFromJSON(json) {
6348
+ return PlanEntitlementResponseDataFromJSONTyped(json, false);
6349
+ }
6350
+ function PlanEntitlementResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6351
+ if (json == null) {
6352
+ return json;
6353
+ }
6354
+ return {
6355
+ createdAt: new Date(json["created_at"]),
6356
+ environmentId: json["environment_id"],
6357
+ feature: json["feature"] == null ? void 0 : FeatureResponseDataFromJSON(json["feature"]),
6358
+ featureId: json["feature_id"],
6359
+ id: json["id"],
6360
+ metricPeriod: json["metric_period"] == null ? void 0 : json["metric_period"],
6361
+ plan: json["plan"] == null ? void 0 : PlanResponseDataFromJSON(json["plan"]),
6362
+ planId: json["plan_id"],
6363
+ ruleId: json["rule_id"],
6364
+ updatedAt: new Date(json["updated_at"]),
6365
+ valueBool: json["value_bool"] == null ? void 0 : json["value_bool"],
6366
+ valueNumeric: json["value_numeric"] == null ? void 0 : json["value_numeric"],
6367
+ valueTrait: json["value_trait"] == null ? void 0 : EntityTraitDefinitionResponseDataFromJSON(json["value_trait"]),
6368
+ valueTraitId: json["value_trait_id"] == null ? void 0 : json["value_trait_id"],
6369
+ valueType: json["value_type"]
6370
+ };
6371
+ }
6372
+
6373
+ // src/api/models/CompanyPlanDetailResponseData.ts
6374
+ function CompanyPlanDetailResponseDataFromJSON(json) {
6375
+ return CompanyPlanDetailResponseDataFromJSONTyped(json, false);
6376
+ }
6377
+ function CompanyPlanDetailResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6378
+ if (json == null) {
6379
+ return json;
6380
+ }
6381
+ return {
6382
+ audienceType: json["audience_type"] == null ? void 0 : json["audience_type"],
6383
+ billingProduct: json["billing_product"] == null ? void 0 : BillingProductDetailResponseDataFromJSON(json["billing_product"]),
6384
+ companyCount: json["company_count"],
6251
6385
  createdAt: new Date(json["created_at"]),
6386
+ current: json["current"],
6252
6387
  description: json["description"],
6388
+ entitlements: json["entitlements"].map(
6389
+ PlanEntitlementResponseDataFromJSON
6390
+ ),
6391
+ features: json["features"].map(
6392
+ FeatureDetailResponseDataFromJSON
6393
+ ),
6253
6394
  icon: json["icon"],
6254
6395
  id: json["id"],
6396
+ monthlyPrice: json["monthly_price"] == null ? void 0 : BillingPriceResponseDataFromJSON(json["monthly_price"]),
6255
6397
  name: json["name"],
6256
6398
  planType: json["plan_type"],
6399
+ updatedAt: new Date(json["updated_at"]),
6400
+ valid: json["valid"],
6401
+ yearlyPrice: json["yearly_price"] == null ? void 0 : BillingPriceResponseDataFromJSON(json["yearly_price"])
6402
+ };
6403
+ }
6404
+
6405
+ // src/api/models/ComponentResponseData.ts
6406
+ function ComponentResponseDataFromJSON(json) {
6407
+ return ComponentResponseDataFromJSONTyped(json, false);
6408
+ }
6409
+ function ComponentResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6410
+ if (json == null) {
6411
+ return json;
6412
+ }
6413
+ return {
6414
+ ast: json["ast"] == null ? void 0 : json["ast"],
6415
+ createdAt: new Date(json["created_at"]),
6416
+ id: json["id"],
6417
+ name: json["name"],
6418
+ state: json["state"],
6419
+ type: json["type"],
6257
6420
  updatedAt: new Date(json["updated_at"])
6258
6421
  };
6259
6422
  }
@@ -6294,6 +6457,20 @@ function FeatureUsageDetailResponseDataFromJSONTyped(json, ignoreDiscriminator)
6294
6457
  };
6295
6458
  }
6296
6459
 
6460
+ // src/api/models/StripeEmbedInfo.ts
6461
+ function StripeEmbedInfoFromJSON(json) {
6462
+ return StripeEmbedInfoFromJSONTyped(json, false);
6463
+ }
6464
+ function StripeEmbedInfoFromJSONTyped(json, ignoreDiscriminator) {
6465
+ if (json == null) {
6466
+ return json;
6467
+ }
6468
+ return {
6469
+ customerEkey: json["customer_ekey"],
6470
+ publishableKey: json["publishable_key"]
6471
+ };
6472
+ }
6473
+
6297
6474
  // src/api/models/ComponentHydrateResponseData.ts
6298
6475
  function ComponentHydrateResponseDataFromJSON(json) {
6299
6476
  return ComponentHydrateResponseDataFromJSONTyped(json, false);
@@ -6303,9 +6480,13 @@ function ComponentHydrateResponseDataFromJSONTyped(json, ignoreDiscriminator) {
6303
6480
  return json;
6304
6481
  }
6305
6482
  return {
6483
+ activePlans: json["active_plans"].map(
6484
+ CompanyPlanDetailResponseDataFromJSON
6485
+ ),
6306
6486
  company: json["company"] == null ? void 0 : CompanyDetailResponseDataFromJSON(json["company"]),
6307
6487
  component: json["component"] == null ? void 0 : ComponentResponseDataFromJSON(json["component"]),
6308
- featureUsage: json["feature_usage"] == null ? void 0 : FeatureUsageDetailResponseDataFromJSON(json["feature_usage"])
6488
+ featureUsage: json["feature_usage"] == null ? void 0 : FeatureUsageDetailResponseDataFromJSON(json["feature_usage"]),
6489
+ stripeEmbed: json["stripe_embed"] == null ? void 0 : StripeEmbedInfoFromJSON(json["stripe_embed"])
6309
6490
  };
6310
6491
  }
6311
6492
 
@@ -6323,8 +6504,50 @@ function HydrateComponentResponseFromJSONTyped(json, ignoreDiscriminator) {
6323
6504
  };
6324
6505
  }
6325
6506
 
6326
- // src/api/apis/ComponentsApi.ts
6327
- var ComponentsApi = class extends BaseAPI {
6507
+ // src/api/apis/CheckoutApi.ts
6508
+ var CheckoutApi = class extends BaseAPI {
6509
+ /**
6510
+ * Checkout
6511
+ */
6512
+ async checkoutRaw(requestParameters, initOverrides) {
6513
+ if (requestParameters["changeSubscriptionRequestBody"] == null) {
6514
+ throw new RequiredError(
6515
+ "changeSubscriptionRequestBody",
6516
+ 'Required parameter "changeSubscriptionRequestBody" was null or undefined when calling checkout().'
6517
+ );
6518
+ }
6519
+ const queryParameters = {};
6520
+ const headerParameters = {};
6521
+ headerParameters["Content-Type"] = "application/json";
6522
+ if (this.configuration && this.configuration.apiKey) {
6523
+ headerParameters["X-Schematic-Api-Key"] = await this.configuration.apiKey(
6524
+ "X-Schematic-Api-Key"
6525
+ );
6526
+ }
6527
+ const response = await this.request(
6528
+ {
6529
+ path: `/checkout`,
6530
+ method: "POST",
6531
+ headers: headerParameters,
6532
+ query: queryParameters,
6533
+ body: ChangeSubscriptionRequestBodyToJSON(
6534
+ requestParameters["changeSubscriptionRequestBody"]
6535
+ )
6536
+ },
6537
+ initOverrides
6538
+ );
6539
+ return new JSONApiResponse(
6540
+ response,
6541
+ (jsonValue) => CheckoutResponseFromJSON(jsonValue)
6542
+ );
6543
+ }
6544
+ /**
6545
+ * Checkout
6546
+ */
6547
+ async checkout(requestParameters, initOverrides) {
6548
+ const response = await this.checkoutRaw(requestParameters, initOverrides);
6549
+ return await response.value();
6550
+ }
6328
6551
  /**
6329
6552
  * Hydrate component
6330
6553
  */
@@ -6371,30 +6594,73 @@ var ComponentsApi = class extends BaseAPI {
6371
6594
  }
6372
6595
  };
6373
6596
 
6374
- // src/components/theme.ts
6375
- var light = {
6376
- text: "#000000",
6377
- textDetail: "#767676",
6378
- background: "#FFFFFF",
6379
- button: "#000000"
6380
- };
6381
- var dark = {
6382
- text: "#FFFFFF",
6383
- textDetail: "#A5A5A5",
6384
- background: "#000000",
6385
- button: "#194BFB"
6386
- };
6387
-
6388
6597
  // src/context/embed.tsx
6389
6598
  var import_jsx_runtime = require("react/jsx-runtime");
6390
- var defaultSettings = {
6391
- theme: "light",
6599
+ var defaultTheme = {
6600
+ numberOfColumns: 2,
6392
6601
  sectionLayout: "merged",
6393
- borderWidth: 0,
6394
- borderColor: "#E9E9E9",
6395
- borderRadius: 10,
6396
- boxShadow: "none",
6397
- boxPadding: 50
6602
+ colorMode: "light",
6603
+ primary: "#000000",
6604
+ secondary: "#000000",
6605
+ card: {
6606
+ background: "#FFFFFF",
6607
+ borderRadius: 10,
6608
+ hasShadow: true,
6609
+ padding: 45
6610
+ },
6611
+ typography: {
6612
+ heading1: {
6613
+ fontFamily: "Manrope",
6614
+ fontSize: 37,
6615
+ fontWeight: 800,
6616
+ color: "#000000"
6617
+ },
6618
+ heading2: {
6619
+ fontFamily: "Manrope",
6620
+ fontSize: 29,
6621
+ fontWeight: 800,
6622
+ color: "#000000"
6623
+ },
6624
+ heading3: {
6625
+ fontFamily: "Manrope",
6626
+ fontSize: 20,
6627
+ fontWeight: 600,
6628
+ color: "#000000"
6629
+ },
6630
+ heading4: {
6631
+ fontFamily: "Manrope",
6632
+ fontSize: 18,
6633
+ fontWeight: 800,
6634
+ color: "#000000"
6635
+ },
6636
+ heading5: {
6637
+ fontFamily: "Public Sans",
6638
+ fontSize: 17,
6639
+ fontWeight: 500,
6640
+ color: "#000000"
6641
+ },
6642
+ heading6: {
6643
+ fontFamily: "Public Sans",
6644
+ fontSize: 14,
6645
+ fontWeight: 400,
6646
+ color: "#8A8A8A"
6647
+ },
6648
+ text: {
6649
+ fontFamily: "Public Sans",
6650
+ fontSize: 16,
6651
+ fontWeight: 400,
6652
+ color: "#000000"
6653
+ },
6654
+ link: {
6655
+ fontFamily: "Inter",
6656
+ fontSize: 16,
6657
+ fontWeight: 400,
6658
+ color: "#194BFB"
6659
+ }
6660
+ }
6661
+ };
6662
+ var defaultSettings = {
6663
+ theme: defaultTheme
6398
6664
  };
6399
6665
  function isEditorState(obj) {
6400
6666
  return Object.entries(obj).every(([key, value]) => {
@@ -6421,11 +6687,11 @@ function parseEditorState(data) {
6421
6687
  });
6422
6688
  return arr;
6423
6689
  }
6424
- async function fetchComponent(id, accessToken) {
6690
+ async function fetchComponent(id, accessToken, options) {
6425
6691
  const settings = { ...defaultSettings };
6426
6692
  const nodes = [];
6427
- const config = new Configuration({ apiKey: accessToken });
6428
- const api = new ComponentsApi(config);
6693
+ const config = new Configuration({ ...options, apiKey: accessToken });
6694
+ const api = new CheckoutApi(config);
6429
6695
  const response = await api.hydrateComponent({ componentId: id });
6430
6696
  const { data } = response;
6431
6697
  if (data.component?.ast) {
@@ -6433,7 +6699,7 @@ async function fetchComponent(id, accessToken) {
6433
6699
  const json = inflate_1(Uint8Array.from(Object.values(compressed)), {
6434
6700
  to: "string"
6435
6701
  });
6436
- const ast = getEditorState(json);
6702
+ const ast = getEditorState(JSON.stringify(json));
6437
6703
  if (ast) {
6438
6704
  Object.assign(settings, ast.ROOT.props);
6439
6705
  nodes.push(...parseEditorState(ast));
@@ -6448,61 +6714,92 @@ async function fetchComponent(id, accessToken) {
6448
6714
  var EmbedContext = (0, import_react2.createContext)({
6449
6715
  data: {},
6450
6716
  nodes: [],
6451
- settings: {},
6717
+ settings: { ...defaultSettings },
6718
+ layout: "portal",
6719
+ error: void 0,
6452
6720
  setData: () => {
6453
6721
  },
6454
- setSettings: () => {
6455
- },
6456
6722
  updateSettings: () => {
6723
+ },
6724
+ setLayout: () => {
6457
6725
  }
6458
6726
  });
6459
6727
  var EmbedProvider = ({
6460
6728
  id,
6461
6729
  accessToken,
6730
+ apiConfig,
6462
6731
  children
6463
6732
  }) => {
6464
- const [state, setState] = (0, import_react2.useState)({
6465
- data: {},
6466
- nodes: [],
6467
- settings: { ...defaultSettings },
6468
- setData: () => {
6469
- },
6470
- setSettings: () => {
6471
- },
6472
- updateSettings: () => {
6473
- }
6733
+ const styleRef = (0, import_react2.useRef)(null);
6734
+ const [state, setState] = (0, import_react2.useState)(() => {
6735
+ return {
6736
+ data: {},
6737
+ nodes: [],
6738
+ settings: { ...defaultSettings },
6739
+ layout: "portal",
6740
+ error: void 0,
6741
+ setData: () => {
6742
+ },
6743
+ updateSettings: () => {
6744
+ },
6745
+ setLayout: () => {
6746
+ }
6747
+ };
6474
6748
  });
6749
+ (0, import_react2.useEffect)(() => {
6750
+ const element = document.getElementById("schematic-fonts");
6751
+ if (element) {
6752
+ return void (styleRef.current = element);
6753
+ }
6754
+ const style = document.createElement("link");
6755
+ style.id = "schematic-fonts";
6756
+ style.rel = "stylesheet";
6757
+ document.head.appendChild(style);
6758
+ styleRef.current = style;
6759
+ }, []);
6475
6760
  (0, import_react2.useEffect)(() => {
6476
6761
  if (!id || !accessToken) {
6477
6762
  return;
6478
6763
  }
6479
- fetchComponent(id, accessToken).then((resolvedData) => {
6764
+ fetchComponent(id, accessToken, apiConfig).then((resolvedData) => {
6480
6765
  setState((prev2) => ({ ...prev2, ...resolvedData }));
6481
6766
  }).catch((error) => setState((prev2) => ({ ...prev2, error })));
6482
- }, [id, accessToken]);
6767
+ }, [id, accessToken, apiConfig]);
6768
+ (0, import_react2.useEffect)(() => {
6769
+ const fontSet = /* @__PURE__ */ new Set([]);
6770
+ Object.values(state.settings.theme.typography).forEach(({ fontFamily }) => {
6771
+ fontSet.add(fontFamily);
6772
+ });
6773
+ if (fontSet.size > 0) {
6774
+ const src = `https://fonts.googleapis.com/css2?${[...fontSet].map((fontFamily) => `family=${fontFamily}&display=swap`).join("&")}`;
6775
+ if (styleRef.current) {
6776
+ styleRef.current.href = src;
6777
+ }
6778
+ }
6779
+ }, [state.settings.theme.typography]);
6483
6780
  const setData = (0, import_react2.useCallback)(
6484
6781
  (data) => {
6485
6782
  setState((prev2) => ({
6486
6783
  ...prev2,
6487
- data
6784
+ data: Object.assign({}, data)
6488
6785
  }));
6489
6786
  },
6490
6787
  [setState]
6491
6788
  );
6492
- const setSettings = (0, import_react2.useCallback)(
6789
+ const updateSettings = (0, import_react2.useCallback)(
6493
6790
  (settings) => {
6494
6791
  setState((prev2) => ({
6495
6792
  ...prev2,
6496
- settings
6793
+ settings: Object.assign({}, prev2.settings, settings)
6497
6794
  }));
6498
6795
  },
6499
6796
  [setState]
6500
6797
  );
6501
- const updateSettings = (0, import_react2.useCallback)(
6502
- (settings) => {
6798
+ const setLayout = (0, import_react2.useCallback)(
6799
+ (layout) => {
6503
6800
  setState((prev2) => ({
6504
6801
  ...prev2,
6505
- settings: { ...prev2.settings, ...settings }
6802
+ layout
6506
6803
  }));
6507
6804
  },
6508
6805
  [setState]
@@ -6514,75 +6811,602 @@ var EmbedProvider = ({
6514
6811
  data: state.data,
6515
6812
  nodes: state.nodes,
6516
6813
  settings: state.settings,
6814
+ layout: state.layout,
6517
6815
  error: state.error,
6518
6816
  setData,
6519
- setSettings,
6520
- updateSettings
6817
+ updateSettings,
6818
+ setLayout
6521
6819
  },
6522
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ot, { theme: state.settings.theme === "dark" ? dark : light, children })
6820
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ot, { theme: state.settings.theme, children })
6523
6821
  }
6524
6822
  );
6525
6823
  };
6526
6824
 
6527
6825
  // node_modules/@schematichq/schematic-js/dist/schematic.esm.js
6528
- var getRandomValues;
6529
- var rnds8 = new Uint8Array(16);
6530
- function rng() {
6531
- if (!getRandomValues) {
6532
- getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
6533
- if (!getRandomValues) {
6534
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
6535
- }
6826
+ var __create2 = Object.create;
6827
+ var __defProp2 = Object.defineProperty;
6828
+ var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
6829
+ var __getOwnPropNames2 = Object.getOwnPropertyNames;
6830
+ var __getProtoOf2 = Object.getPrototypeOf;
6831
+ var __hasOwnProp2 = Object.prototype.hasOwnProperty;
6832
+ var __commonJS2 = (cb, mod) => function __require() {
6833
+ return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
6834
+ };
6835
+ var __copyProps2 = (to, from2, except, desc) => {
6836
+ if (from2 && typeof from2 === "object" || typeof from2 === "function") {
6837
+ for (let key of __getOwnPropNames2(from2))
6838
+ if (!__hasOwnProp2.call(to, key) && key !== except)
6839
+ __defProp2(to, key, { get: () => from2[key], enumerable: !(desc = __getOwnPropDesc2(from2, key)) || desc.enumerable });
6536
6840
  }
6537
- return getRandomValues(rnds8);
6538
- }
6539
- var byteToHex = [];
6540
- for (let i2 = 0; i2 < 256; ++i2) {
6541
- byteToHex.push((i2 + 256).toString(16).slice(1));
6542
- }
6543
- function unsafeStringify(arr, offset = 0) {
6544
- return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
6545
- }
6546
- var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
6547
- var native_default = {
6548
- randomUUID
6841
+ return to;
6549
6842
  };
6550
- function v4(options, buf, offset) {
6551
- if (native_default.randomUUID && !buf && !options) {
6552
- return native_default.randomUUID();
6553
- }
6554
- options = options || {};
6555
- const rnds = options.random || (options.rng || rng)();
6556
- rnds[6] = rnds[6] & 15 | 64;
6557
- rnds[8] = rnds[8] & 63 | 128;
6558
- if (buf) {
6559
- offset = offset || 0;
6560
- for (let i2 = 0; i2 < 16; ++i2) {
6561
- buf[offset + i2] = rnds[i2];
6562
- }
6563
- return buf;
6564
- }
6565
- return unsafeStringify(rnds);
6566
- }
6567
- var v4_default = v4;
6568
- var anonymousIdKey = "schematicId";
6569
- var Schematic = class {
6570
- apiKey;
6571
- apiUrl = "https://api.schematichq.com";
6572
- webSocketUrl = "wss://api.schematichq.com";
6573
- eventUrl = "https://c.schematichq.com";
6574
- conn = null;
6575
- context = {};
6576
- eventQueue;
6577
- storage;
6578
- useWebSocket = false;
6579
- values = {};
6580
- flagListener;
6581
- constructor(apiKey, options) {
6582
- this.apiKey = apiKey;
6583
- this.eventQueue = [];
6584
- this.useWebSocket = options?.useWebSocket ?? false;
6585
- this.flagListener = options?.flagListener;
6843
+ var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps2(
6844
+ // If the importer is in node compatibility mode or this is not an ESM
6845
+ // file that has been converted to a CommonJS file using a Babel-
6846
+ // compatible transform (i.e. "__esModule" has not been set), then set
6847
+ // "default" to the CommonJS "module.exports" for node compatibility.
6848
+ isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target,
6849
+ mod
6850
+ ));
6851
+ var require_browser_polyfill = __commonJS2({
6852
+ "node_modules/cross-fetch/dist/browser-polyfill.js"(exports) {
6853
+ (function(self2) {
6854
+ var irrelevant = function(exports2) {
6855
+ var global = typeof globalThis !== "undefined" && globalThis || typeof self2 !== "undefined" && self2 || typeof global !== "undefined" && global;
6856
+ var support = {
6857
+ searchParams: "URLSearchParams" in global,
6858
+ iterable: "Symbol" in global && "iterator" in Symbol,
6859
+ blob: "FileReader" in global && "Blob" in global && function() {
6860
+ try {
6861
+ new Blob();
6862
+ return true;
6863
+ } catch (e) {
6864
+ return false;
6865
+ }
6866
+ }(),
6867
+ formData: "FormData" in global,
6868
+ arrayBuffer: "ArrayBuffer" in global
6869
+ };
6870
+ function isDataView(obj) {
6871
+ return obj && DataView.prototype.isPrototypeOf(obj);
6872
+ }
6873
+ if (support.arrayBuffer) {
6874
+ var viewClasses = [
6875
+ "[object Int8Array]",
6876
+ "[object Uint8Array]",
6877
+ "[object Uint8ClampedArray]",
6878
+ "[object Int16Array]",
6879
+ "[object Uint16Array]",
6880
+ "[object Int32Array]",
6881
+ "[object Uint32Array]",
6882
+ "[object Float32Array]",
6883
+ "[object Float64Array]"
6884
+ ];
6885
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
6886
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1;
6887
+ };
6888
+ }
6889
+ function normalizeName(name) {
6890
+ if (typeof name !== "string") {
6891
+ name = String(name);
6892
+ }
6893
+ if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === "") {
6894
+ throw new TypeError('Invalid character in header field name: "' + name + '"');
6895
+ }
6896
+ return name.toLowerCase();
6897
+ }
6898
+ function normalizeValue(value) {
6899
+ if (typeof value !== "string") {
6900
+ value = String(value);
6901
+ }
6902
+ return value;
6903
+ }
6904
+ function iteratorFor(items) {
6905
+ var iterator = {
6906
+ next: function() {
6907
+ var value = items.shift();
6908
+ return { done: value === void 0, value };
6909
+ }
6910
+ };
6911
+ if (support.iterable) {
6912
+ iterator[Symbol.iterator] = function() {
6913
+ return iterator;
6914
+ };
6915
+ }
6916
+ return iterator;
6917
+ }
6918
+ function Headers(headers) {
6919
+ this.map = {};
6920
+ if (headers instanceof Headers) {
6921
+ headers.forEach(function(value, name) {
6922
+ this.append(name, value);
6923
+ }, this);
6924
+ } else if (Array.isArray(headers)) {
6925
+ headers.forEach(function(header) {
6926
+ this.append(header[0], header[1]);
6927
+ }, this);
6928
+ } else if (headers) {
6929
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
6930
+ this.append(name, headers[name]);
6931
+ }, this);
6932
+ }
6933
+ }
6934
+ Headers.prototype.append = function(name, value) {
6935
+ name = normalizeName(name);
6936
+ value = normalizeValue(value);
6937
+ var oldValue = this.map[name];
6938
+ this.map[name] = oldValue ? oldValue + ", " + value : value;
6939
+ };
6940
+ Headers.prototype["delete"] = function(name) {
6941
+ delete this.map[normalizeName(name)];
6942
+ };
6943
+ Headers.prototype.get = function(name) {
6944
+ name = normalizeName(name);
6945
+ return this.has(name) ? this.map[name] : null;
6946
+ };
6947
+ Headers.prototype.has = function(name) {
6948
+ return this.map.hasOwnProperty(normalizeName(name));
6949
+ };
6950
+ Headers.prototype.set = function(name, value) {
6951
+ this.map[normalizeName(name)] = normalizeValue(value);
6952
+ };
6953
+ Headers.prototype.forEach = function(callback, thisArg) {
6954
+ for (var name in this.map) {
6955
+ if (this.map.hasOwnProperty(name)) {
6956
+ callback.call(thisArg, this.map[name], name, this);
6957
+ }
6958
+ }
6959
+ };
6960
+ Headers.prototype.keys = function() {
6961
+ var items = [];
6962
+ this.forEach(function(value, name) {
6963
+ items.push(name);
6964
+ });
6965
+ return iteratorFor(items);
6966
+ };
6967
+ Headers.prototype.values = function() {
6968
+ var items = [];
6969
+ this.forEach(function(value) {
6970
+ items.push(value);
6971
+ });
6972
+ return iteratorFor(items);
6973
+ };
6974
+ Headers.prototype.entries = function() {
6975
+ var items = [];
6976
+ this.forEach(function(value, name) {
6977
+ items.push([name, value]);
6978
+ });
6979
+ return iteratorFor(items);
6980
+ };
6981
+ if (support.iterable) {
6982
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
6983
+ }
6984
+ function consumed(body) {
6985
+ if (body.bodyUsed) {
6986
+ return Promise.reject(new TypeError("Already read"));
6987
+ }
6988
+ body.bodyUsed = true;
6989
+ }
6990
+ function fileReaderReady(reader) {
6991
+ return new Promise(function(resolve, reject) {
6992
+ reader.onload = function() {
6993
+ resolve(reader.result);
6994
+ };
6995
+ reader.onerror = function() {
6996
+ reject(reader.error);
6997
+ };
6998
+ });
6999
+ }
7000
+ function readBlobAsArrayBuffer(blob) {
7001
+ var reader = new FileReader();
7002
+ var promise = fileReaderReady(reader);
7003
+ reader.readAsArrayBuffer(blob);
7004
+ return promise;
7005
+ }
7006
+ function readBlobAsText(blob) {
7007
+ var reader = new FileReader();
7008
+ var promise = fileReaderReady(reader);
7009
+ reader.readAsText(blob);
7010
+ return promise;
7011
+ }
7012
+ function readArrayBufferAsText(buf) {
7013
+ var view = new Uint8Array(buf);
7014
+ var chars = new Array(view.length);
7015
+ for (var i2 = 0; i2 < view.length; i2++) {
7016
+ chars[i2] = String.fromCharCode(view[i2]);
7017
+ }
7018
+ return chars.join("");
7019
+ }
7020
+ function bufferClone(buf) {
7021
+ if (buf.slice) {
7022
+ return buf.slice(0);
7023
+ } else {
7024
+ var view = new Uint8Array(buf.byteLength);
7025
+ view.set(new Uint8Array(buf));
7026
+ return view.buffer;
7027
+ }
7028
+ }
7029
+ function Body() {
7030
+ this.bodyUsed = false;
7031
+ this._initBody = function(body) {
7032
+ this.bodyUsed = this.bodyUsed;
7033
+ this._bodyInit = body;
7034
+ if (!body) {
7035
+ this._bodyText = "";
7036
+ } else if (typeof body === "string") {
7037
+ this._bodyText = body;
7038
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
7039
+ this._bodyBlob = body;
7040
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
7041
+ this._bodyFormData = body;
7042
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
7043
+ this._bodyText = body.toString();
7044
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
7045
+ this._bodyArrayBuffer = bufferClone(body.buffer);
7046
+ this._bodyInit = new Blob([this._bodyArrayBuffer]);
7047
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
7048
+ this._bodyArrayBuffer = bufferClone(body);
7049
+ } else {
7050
+ this._bodyText = body = Object.prototype.toString.call(body);
7051
+ }
7052
+ if (!this.headers.get("content-type")) {
7053
+ if (typeof body === "string") {
7054
+ this.headers.set("content-type", "text/plain;charset=UTF-8");
7055
+ } else if (this._bodyBlob && this._bodyBlob.type) {
7056
+ this.headers.set("content-type", this._bodyBlob.type);
7057
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
7058
+ this.headers.set("content-type", "application/x-www-form-urlencoded;charset=UTF-8");
7059
+ }
7060
+ }
7061
+ };
7062
+ if (support.blob) {
7063
+ this.blob = function() {
7064
+ var rejected = consumed(this);
7065
+ if (rejected) {
7066
+ return rejected;
7067
+ }
7068
+ if (this._bodyBlob) {
7069
+ return Promise.resolve(this._bodyBlob);
7070
+ } else if (this._bodyArrayBuffer) {
7071
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]));
7072
+ } else if (this._bodyFormData) {
7073
+ throw new Error("could not read FormData body as blob");
7074
+ } else {
7075
+ return Promise.resolve(new Blob([this._bodyText]));
7076
+ }
7077
+ };
7078
+ this.arrayBuffer = function() {
7079
+ if (this._bodyArrayBuffer) {
7080
+ var isConsumed = consumed(this);
7081
+ if (isConsumed) {
7082
+ return isConsumed;
7083
+ }
7084
+ if (ArrayBuffer.isView(this._bodyArrayBuffer)) {
7085
+ return Promise.resolve(
7086
+ this._bodyArrayBuffer.buffer.slice(
7087
+ this._bodyArrayBuffer.byteOffset,
7088
+ this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength
7089
+ )
7090
+ );
7091
+ } else {
7092
+ return Promise.resolve(this._bodyArrayBuffer);
7093
+ }
7094
+ } else {
7095
+ return this.blob().then(readBlobAsArrayBuffer);
7096
+ }
7097
+ };
7098
+ }
7099
+ this.text = function() {
7100
+ var rejected = consumed(this);
7101
+ if (rejected) {
7102
+ return rejected;
7103
+ }
7104
+ if (this._bodyBlob) {
7105
+ return readBlobAsText(this._bodyBlob);
7106
+ } else if (this._bodyArrayBuffer) {
7107
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer));
7108
+ } else if (this._bodyFormData) {
7109
+ throw new Error("could not read FormData body as text");
7110
+ } else {
7111
+ return Promise.resolve(this._bodyText);
7112
+ }
7113
+ };
7114
+ if (support.formData) {
7115
+ this.formData = function() {
7116
+ return this.text().then(decode);
7117
+ };
7118
+ }
7119
+ this.json = function() {
7120
+ return this.text().then(JSON.parse);
7121
+ };
7122
+ return this;
7123
+ }
7124
+ var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
7125
+ function normalizeMethod(method) {
7126
+ var upcased = method.toUpperCase();
7127
+ return methods.indexOf(upcased) > -1 ? upcased : method;
7128
+ }
7129
+ function Request(input, options) {
7130
+ if (!(this instanceof Request)) {
7131
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
7132
+ }
7133
+ options = options || {};
7134
+ var body = options.body;
7135
+ if (input instanceof Request) {
7136
+ if (input.bodyUsed) {
7137
+ throw new TypeError("Already read");
7138
+ }
7139
+ this.url = input.url;
7140
+ this.credentials = input.credentials;
7141
+ if (!options.headers) {
7142
+ this.headers = new Headers(input.headers);
7143
+ }
7144
+ this.method = input.method;
7145
+ this.mode = input.mode;
7146
+ this.signal = input.signal;
7147
+ if (!body && input._bodyInit != null) {
7148
+ body = input._bodyInit;
7149
+ input.bodyUsed = true;
7150
+ }
7151
+ } else {
7152
+ this.url = String(input);
7153
+ }
7154
+ this.credentials = options.credentials || this.credentials || "same-origin";
7155
+ if (options.headers || !this.headers) {
7156
+ this.headers = new Headers(options.headers);
7157
+ }
7158
+ this.method = normalizeMethod(options.method || this.method || "GET");
7159
+ this.mode = options.mode || this.mode || null;
7160
+ this.signal = options.signal || this.signal;
7161
+ this.referrer = null;
7162
+ if ((this.method === "GET" || this.method === "HEAD") && body) {
7163
+ throw new TypeError("Body not allowed for GET or HEAD requests");
7164
+ }
7165
+ this._initBody(body);
7166
+ if (this.method === "GET" || this.method === "HEAD") {
7167
+ if (options.cache === "no-store" || options.cache === "no-cache") {
7168
+ var reParamSearch = /([?&])_=[^&]*/;
7169
+ if (reParamSearch.test(this.url)) {
7170
+ this.url = this.url.replace(reParamSearch, "$1_=" + (/* @__PURE__ */ new Date()).getTime());
7171
+ } else {
7172
+ var reQueryString = /\?/;
7173
+ this.url += (reQueryString.test(this.url) ? "&" : "?") + "_=" + (/* @__PURE__ */ new Date()).getTime();
7174
+ }
7175
+ }
7176
+ }
7177
+ }
7178
+ Request.prototype.clone = function() {
7179
+ return new Request(this, { body: this._bodyInit });
7180
+ };
7181
+ function decode(body) {
7182
+ var form = new FormData();
7183
+ body.trim().split("&").forEach(function(bytes) {
7184
+ if (bytes) {
7185
+ var split = bytes.split("=");
7186
+ var name = split.shift().replace(/\+/g, " ");
7187
+ var value = split.join("=").replace(/\+/g, " ");
7188
+ form.append(decodeURIComponent(name), decodeURIComponent(value));
7189
+ }
7190
+ });
7191
+ return form;
7192
+ }
7193
+ function parseHeaders(rawHeaders) {
7194
+ var headers = new Headers();
7195
+ var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, " ");
7196
+ preProcessedHeaders.split("\r").map(function(header) {
7197
+ return header.indexOf("\n") === 0 ? header.substr(1, header.length) : header;
7198
+ }).forEach(function(line2) {
7199
+ var parts = line2.split(":");
7200
+ var key = parts.shift().trim();
7201
+ if (key) {
7202
+ var value = parts.join(":").trim();
7203
+ headers.append(key, value);
7204
+ }
7205
+ });
7206
+ return headers;
7207
+ }
7208
+ Body.call(Request.prototype);
7209
+ function Response(bodyInit, options) {
7210
+ if (!(this instanceof Response)) {
7211
+ throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');
7212
+ }
7213
+ if (!options) {
7214
+ options = {};
7215
+ }
7216
+ this.type = "default";
7217
+ this.status = options.status === void 0 ? 200 : options.status;
7218
+ this.ok = this.status >= 200 && this.status < 300;
7219
+ this.statusText = options.statusText === void 0 ? "" : "" + options.statusText;
7220
+ this.headers = new Headers(options.headers);
7221
+ this.url = options.url || "";
7222
+ this._initBody(bodyInit);
7223
+ }
7224
+ Body.call(Response.prototype);
7225
+ Response.prototype.clone = function() {
7226
+ return new Response(this._bodyInit, {
7227
+ status: this.status,
7228
+ statusText: this.statusText,
7229
+ headers: new Headers(this.headers),
7230
+ url: this.url
7231
+ });
7232
+ };
7233
+ Response.error = function() {
7234
+ var response = new Response(null, { status: 0, statusText: "" });
7235
+ response.type = "error";
7236
+ return response;
7237
+ };
7238
+ var redirectStatuses = [301, 302, 303, 307, 308];
7239
+ Response.redirect = function(url, status) {
7240
+ if (redirectStatuses.indexOf(status) === -1) {
7241
+ throw new RangeError("Invalid status code");
7242
+ }
7243
+ return new Response(null, { status, headers: { location: url } });
7244
+ };
7245
+ exports2.DOMException = global.DOMException;
7246
+ try {
7247
+ new exports2.DOMException();
7248
+ } catch (err2) {
7249
+ exports2.DOMException = function(message, name) {
7250
+ this.message = message;
7251
+ this.name = name;
7252
+ var error = Error(message);
7253
+ this.stack = error.stack;
7254
+ };
7255
+ exports2.DOMException.prototype = Object.create(Error.prototype);
7256
+ exports2.DOMException.prototype.constructor = exports2.DOMException;
7257
+ }
7258
+ function fetch2(input, init) {
7259
+ return new Promise(function(resolve, reject) {
7260
+ var request = new Request(input, init);
7261
+ if (request.signal && request.signal.aborted) {
7262
+ return reject(new exports2.DOMException("Aborted", "AbortError"));
7263
+ }
7264
+ var xhr = new XMLHttpRequest();
7265
+ function abortXhr() {
7266
+ xhr.abort();
7267
+ }
7268
+ xhr.onload = function() {
7269
+ var options = {
7270
+ status: xhr.status,
7271
+ statusText: xhr.statusText,
7272
+ headers: parseHeaders(xhr.getAllResponseHeaders() || "")
7273
+ };
7274
+ options.url = "responseURL" in xhr ? xhr.responseURL : options.headers.get("X-Request-URL");
7275
+ var body = "response" in xhr ? xhr.response : xhr.responseText;
7276
+ setTimeout(function() {
7277
+ resolve(new Response(body, options));
7278
+ }, 0);
7279
+ };
7280
+ xhr.onerror = function() {
7281
+ setTimeout(function() {
7282
+ reject(new TypeError("Network request failed"));
7283
+ }, 0);
7284
+ };
7285
+ xhr.ontimeout = function() {
7286
+ setTimeout(function() {
7287
+ reject(new TypeError("Network request failed"));
7288
+ }, 0);
7289
+ };
7290
+ xhr.onabort = function() {
7291
+ setTimeout(function() {
7292
+ reject(new exports2.DOMException("Aborted", "AbortError"));
7293
+ }, 0);
7294
+ };
7295
+ function fixUrl(url) {
7296
+ try {
7297
+ return url === "" && global.location.href ? global.location.href : url;
7298
+ } catch (e) {
7299
+ return url;
7300
+ }
7301
+ }
7302
+ xhr.open(request.method, fixUrl(request.url), true);
7303
+ if (request.credentials === "include") {
7304
+ xhr.withCredentials = true;
7305
+ } else if (request.credentials === "omit") {
7306
+ xhr.withCredentials = false;
7307
+ }
7308
+ if ("responseType" in xhr) {
7309
+ if (support.blob) {
7310
+ xhr.responseType = "blob";
7311
+ } else if (support.arrayBuffer && request.headers.get("Content-Type") && request.headers.get("Content-Type").indexOf("application/octet-stream") !== -1) {
7312
+ xhr.responseType = "arraybuffer";
7313
+ }
7314
+ }
7315
+ if (init && typeof init.headers === "object" && !(init.headers instanceof Headers)) {
7316
+ Object.getOwnPropertyNames(init.headers).forEach(function(name) {
7317
+ xhr.setRequestHeader(name, normalizeValue(init.headers[name]));
7318
+ });
7319
+ } else {
7320
+ request.headers.forEach(function(value, name) {
7321
+ xhr.setRequestHeader(name, value);
7322
+ });
7323
+ }
7324
+ if (request.signal) {
7325
+ request.signal.addEventListener("abort", abortXhr);
7326
+ xhr.onreadystatechange = function() {
7327
+ if (xhr.readyState === 4) {
7328
+ request.signal.removeEventListener("abort", abortXhr);
7329
+ }
7330
+ };
7331
+ }
7332
+ xhr.send(typeof request._bodyInit === "undefined" ? null : request._bodyInit);
7333
+ });
7334
+ }
7335
+ fetch2.polyfill = true;
7336
+ if (!global.fetch) {
7337
+ global.fetch = fetch2;
7338
+ global.Headers = Headers;
7339
+ global.Request = Request;
7340
+ global.Response = Response;
7341
+ }
7342
+ exports2.Headers = Headers;
7343
+ exports2.Request = Request;
7344
+ exports2.Response = Response;
7345
+ exports2.fetch = fetch2;
7346
+ return exports2;
7347
+ }({});
7348
+ })(typeof self !== "undefined" ? self : exports);
7349
+ }
7350
+ });
7351
+ var getRandomValues;
7352
+ var rnds8 = new Uint8Array(16);
7353
+ function rng() {
7354
+ if (!getRandomValues) {
7355
+ getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
7356
+ if (!getRandomValues) {
7357
+ throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
7358
+ }
7359
+ }
7360
+ return getRandomValues(rnds8);
7361
+ }
7362
+ var byteToHex = [];
7363
+ for (let i2 = 0; i2 < 256; ++i2) {
7364
+ byteToHex.push((i2 + 256).toString(16).slice(1));
7365
+ }
7366
+ function unsafeStringify(arr, offset = 0) {
7367
+ return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
7368
+ }
7369
+ var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
7370
+ var native_default = {
7371
+ randomUUID
7372
+ };
7373
+ function v4(options, buf, offset) {
7374
+ if (native_default.randomUUID && !buf && !options) {
7375
+ return native_default.randomUUID();
7376
+ }
7377
+ options = options || {};
7378
+ const rnds = options.random || (options.rng || rng)();
7379
+ rnds[6] = rnds[6] & 15 | 64;
7380
+ rnds[8] = rnds[8] & 63 | 128;
7381
+ if (buf) {
7382
+ offset = offset || 0;
7383
+ for (let i2 = 0; i2 < 16; ++i2) {
7384
+ buf[offset + i2] = rnds[i2];
7385
+ }
7386
+ return buf;
7387
+ }
7388
+ return unsafeStringify(rnds);
7389
+ }
7390
+ var v4_default = v4;
7391
+ var import_polyfill = __toESM2(require_browser_polyfill());
7392
+ var anonymousIdKey = "schematicId";
7393
+ var Schematic = class {
7394
+ apiKey;
7395
+ apiUrl = "https://api.schematichq.com";
7396
+ webSocketUrl = "wss://api.schematichq.com";
7397
+ eventUrl = "https://c.schematichq.com";
7398
+ conn = null;
7399
+ context = {};
7400
+ eventQueue;
7401
+ storage;
7402
+ useWebSocket = false;
7403
+ values = {};
7404
+ flagListener;
7405
+ constructor(apiKey, options) {
7406
+ this.apiKey = apiKey;
7407
+ this.eventQueue = [];
7408
+ this.useWebSocket = options?.useWebSocket ?? false;
7409
+ this.flagListener = options?.flagListener;
6586
7410
  if (options?.storage) {
6587
7411
  this.storage = options.storage;
6588
7412
  } else if (typeof localStorage !== "undefined") {
@@ -6931,14 +7755,11 @@ var useSchematicFlag = (key, opts) => {
6931
7755
  return value;
6932
7756
  };
6933
7757
 
6934
- // src/components/embed/ComponentTree.tsx
6935
- var import_react10 = require("react");
6936
-
6937
- // src/components/embed/renderer.ts
6938
- var import_react9 = require("react");
7758
+ // src/components/elements/card/Card.tsx
7759
+ var import_react6 = require("react");
6939
7760
 
6940
- // src/components/elements/included-features/IncludedFeatures.tsx
6941
- var import_react7 = require("react");
7761
+ // src/const/index.ts
7762
+ var TEXT_BASE_SIZE = 16;
6942
7763
 
6943
7764
  // src/utils/color.ts
6944
7765
  function hexToHSL(color) {
@@ -7025,15 +7846,24 @@ function hslToHex({ h, s: s2, l: l2 }) {
7025
7846
  bs = "0" + bs;
7026
7847
  return "#" + rs + gs + bs;
7027
7848
  }
7028
- function adjustHexLightness(color, amount) {
7849
+ function adjustLightness(color, amount) {
7029
7850
  const { h, s: s2, l: l2 } = hexToHSL(color);
7030
7851
  return hslToHex({ h, s: s2, l: Math.max(Math.min(l2 + amount, 100), 0) });
7031
7852
  }
7032
7853
  function lighten(color, amount) {
7033
- return adjustHexLightness(color, amount);
7854
+ return adjustLightness(color, amount);
7034
7855
  }
7035
7856
  function darken(color, amount) {
7036
- return adjustHexLightness(color, -amount);
7857
+ return adjustLightness(color, -amount);
7858
+ }
7859
+
7860
+ // src/utils/date.ts
7861
+ function toPrettyDate(date) {
7862
+ return new Intl.DateTimeFormat("en-US", {
7863
+ month: "long",
7864
+ day: "numeric",
7865
+ year: "numeric"
7866
+ }).format(new Date(date));
7037
7867
  }
7038
7868
 
7039
7869
  // src/utils/string.ts
@@ -7041,9 +7871,6 @@ function camelToHyphen(str) {
7041
7871
  return str.replace(/([a-z][A-Z])/g, (g2) => `${g2[0]}-${g2[1].toLowerCase()}`);
7042
7872
  }
7043
7873
 
7044
- // src/const/index.ts
7045
- var TEXT_BASE_SIZE = 16;
7046
-
7047
7874
  // src/utils/style.ts
7048
7875
  function attr(key, value) {
7049
7876
  return typeof value !== "undefined" && lt`
@@ -7061,6 +7888,88 @@ attr.rem = function propAsRem(key, value) {
7061
7888
  `;
7062
7889
  };
7063
7890
 
7891
+ // src/components/elements/card/styles.ts
7892
+ var StyledCard = dt.div(
7893
+ ({
7894
+ theme,
7895
+ $sectionLayout = "merged",
7896
+ $borderRadius = 8,
7897
+ $padding = 48,
7898
+ $shadow = true
7899
+ }) => {
7900
+ return lt`
7901
+ box-sizing: border-box;
7902
+ font-size: ${TEXT_BASE_SIZE}px;
7903
+
7904
+ *,
7905
+ *::before,
7906
+ *::after {
7907
+ box-sizing: inherit;
7908
+ }
7909
+
7910
+ > * {
7911
+ padding: ${$padding * 0.75 / TEXT_BASE_SIZE}rem
7912
+ ${$padding / TEXT_BASE_SIZE}rem;
7913
+ color: ${theme.typography.text.color};
7914
+ }
7915
+
7916
+ ${() => {
7917
+ const { l: l2 } = hexToHSL(theme.card.background);
7918
+ const borderColor = l2 > 50 ? darken(theme.card.background, 10) : lighten(theme.card.background, 30);
7919
+ const borderRadius = `${$borderRadius / TEXT_BASE_SIZE}rem`;
7920
+ const boxShadow = "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A";
7921
+ if ($sectionLayout === "merged") {
7922
+ return lt`
7923
+ background: ${({ theme: theme2 }) => theme2.card.background};
7924
+ border-radius: ${borderRadius};
7925
+
7926
+ ${$shadow && `box-shadow: ${boxShadow};`}
7927
+
7928
+ > :not(:last-child) {
7929
+ border-bottom: 1px solid ${borderColor};
7930
+ }
7931
+ `;
7932
+ }
7933
+ return lt`
7934
+ > :not(:last-child) {
7935
+ margin-bottom: 1rem;
7936
+ }
7937
+
7938
+ > * {
7939
+ background: ${theme.card.background};
7940
+ border-radius: ${borderRadius};
7941
+ ${$shadow && `box-shadow: ${boxShadow};`}
7942
+ }
7943
+ `;
7944
+ }}
7945
+ `;
7946
+ }
7947
+ );
7948
+
7949
+ // src/components/elements/card/Card.tsx
7950
+ var import_jsx_runtime3 = require("react/jsx-runtime");
7951
+ var Card = (0, import_react6.forwardRef)(
7952
+ ({ children, className }, ref) => {
7953
+ const { settings } = useEmbed();
7954
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
7955
+ StyledCard,
7956
+ {
7957
+ ref,
7958
+ className,
7959
+ $sectionLayout: settings.theme?.sectionLayout,
7960
+ $borderRadius: settings.theme?.card?.borderRadius,
7961
+ $padding: settings.theme?.card?.padding,
7962
+ $shadow: settings.theme?.card?.hasShadow,
7963
+ children
7964
+ }
7965
+ );
7966
+ }
7967
+ );
7968
+
7969
+ // src/components/elements/plan-manager/PlanManager.tsx
7970
+ var import_react7 = require("react");
7971
+ var import_react_dom = require("react-dom");
7972
+
7064
7973
  // src/components/ui/box/styles.ts
7065
7974
  var Box = dt.div((props) => {
7066
7975
  const initialStyles = [];
@@ -7079,10 +7988,13 @@ var Box = dt.div((props) => {
7079
7988
  var Text = dt.span`
7080
7989
  font-family: ${({ $font = "Inter" }) => `${$font}, sans-serif`};
7081
7990
  font-size: ${({ $size = 16 }) => typeof $size === "number" ? `${$size / TEXT_BASE_SIZE}rem` : $size};
7082
- font-weight: ${({ $weight = 400 }) => $weight};
7083
- line-height: 1.25;
7991
+ ${({ $weight = 400 }) => lt`
7992
+ font-weight: ${$weight};
7993
+ font-variation-settings: "wght" ${$weight};
7994
+ `};
7995
+ line-height: ${({ $lineHeight = 1.25 }) => $lineHeight};
7084
7996
  ${({ $align }) => attr("text-align", $align)};
7085
- color: ${({ $color, theme }) => $color || theme.text};
7997
+ color: ${({ $color, theme }) => $color || theme.typography.text.color};
7086
7998
 
7087
7999
  &:focus-visible {
7088
8000
  outline: 2px solid ${({ theme }) => theme.primary};
@@ -7107,46 +8019,46 @@ var Button = dt.button`
7107
8019
  switch ($size) {
7108
8020
  case "sm":
7109
8021
  return lt`
7110
- font-size: ${12 / 16}rem;
8022
+ font-size: ${12 / TEXT_BASE_SIZE}rem;
7111
8023
  ${$variant !== "link" && lt`
7112
- padding: ${7 / 16}rem ${20 / 16}rem;
8024
+ padding: ${7 / TEXT_BASE_SIZE}rem ${20 / TEXT_BASE_SIZE}rem;
7113
8025
  `}
7114
- border-radius: ${4 / 16}rem;
8026
+ border-radius: ${4 / TEXT_BASE_SIZE}rem;
7115
8027
  `;
7116
8028
  case "md":
7117
8029
  default:
7118
8030
  return lt`
7119
- font-size: ${14 / 16}rem;
8031
+ font-size: ${14 / TEXT_BASE_SIZE}rem;
7120
8032
  ${$variant !== "link" && lt`
7121
- padding: ${8 / 16}rem ${24 / 16}rem;
8033
+ padding: ${8 / TEXT_BASE_SIZE}rem ${24 / TEXT_BASE_SIZE}rem;
7122
8034
  `}
7123
- border-radius: ${8 / 16}rem;
8035
+ border-radius: ${8 / TEXT_BASE_SIZE}rem;
7124
8036
  `;
7125
8037
  case "lg":
7126
8038
  return lt`
7127
- font-size: ${16 / 16}rem;
8039
+ font-size: ${16 / TEXT_BASE_SIZE}rem;
7128
8040
  ${$variant !== "link" && lt`
7129
- padding: ${9 / 16}rem ${28 / 16}rem;
8041
+ padding: ${9 / TEXT_BASE_SIZE}rem ${28 / TEXT_BASE_SIZE}rem;
7130
8042
  `}
7131
- border-radius: ${12 / 16}rem;
8043
+ border-radius: ${12 / TEXT_BASE_SIZE}rem;
7132
8044
  `;
7133
8045
  }
7134
8046
  }}
7135
8047
 
7136
8048
  ${({ $color, $variant }) => {
7137
- let color = "#ffffff";
8049
+ let color = "#FFFFFF";
7138
8050
  let bgColor;
7139
8051
  switch ($color) {
7140
8052
  case "blue":
7141
8053
  default:
7142
- bgColor = "#194bfb";
8054
+ bgColor = "#194BFB";
7143
8055
  break;
7144
8056
  case "red":
7145
- bgColor = "#ef4444";
8057
+ bgColor = "#EF4444";
7146
8058
  break;
7147
8059
  case "white":
7148
8060
  color = "#000000";
7149
- bgColor = "#ffffff";
8061
+ bgColor = "#FFFFFF";
7150
8062
  break;
7151
8063
  case "black":
7152
8064
  bgColor = "#000000";
@@ -7175,7 +8087,7 @@ var Button = dt.button`
7175
8087
  `;
7176
8088
 
7177
8089
  // src/components/ui/button/Button.tsx
7178
- var import_jsx_runtime3 = require("react/jsx-runtime");
8090
+ var import_jsx_runtime4 = require("react/jsx-runtime");
7179
8091
  var Button2 = ({
7180
8092
  color = "white",
7181
8093
  size = "md",
@@ -7184,7 +8096,7 @@ var Button2 = ({
7184
8096
  children,
7185
8097
  ...props
7186
8098
  }) => {
7187
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
8099
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
7188
8100
  Button,
7189
8101
  {
7190
8102
  $color: color,
@@ -7197,72 +8109,6 @@ var Button2 = ({
7197
8109
  );
7198
8110
  };
7199
8111
 
7200
- // src/components/ui/card/Card.tsx
7201
- var import_react6 = require("react");
7202
-
7203
- // src/components/ui/card/styles.ts
7204
- var StyledCard = dt.div`
7205
- box-sizing: border-box;
7206
- font-size: ${TEXT_BASE_SIZE}px;
7207
-
7208
- *,
7209
- *::before,
7210
- *::after {
7211
- box-sizing: inherit;
7212
- }
7213
-
7214
- > * {
7215
- padding: ${40 / 16}rem ${50 / 16}rem;
7216
- color: ${({ theme }) => theme.color};
7217
- background: ${({ theme }) => theme.background};
7218
- box-shadow:
7219
- 0px 1px 20px 0px #1018280f,
7220
- 0px 1px 3px 0px #1018281a;
7221
- }
7222
-
7223
- ${({ $sectionLayout = "merged", $borderRadius = 8 }) => $sectionLayout === "merged" ? lt`
7224
- > :first-child {
7225
- border-top-left-radius: ${$borderRadius / 16}rem;
7226
- border-top-right-radius: ${$borderRadius / 16}rem;
7227
- }
7228
-
7229
- > :last-child {
7230
- border-bottom-left-radius: ${$borderRadius / 16}rem;
7231
- border-bottom-right-radius: ${$borderRadius / 16}rem;
7232
- }
7233
-
7234
- > :not(:last-child) {
7235
- border-bottom: 1px solid #eaeaea;
7236
- }
7237
- ` : lt`
7238
- > :not(:last-child) {
7239
- margin-bottom: 2rem;
7240
- }
7241
-
7242
- > * {
7243
- border-radius: ${$borderRadius / 16}rem;
7244
- }
7245
- `}
7246
- `;
7247
-
7248
- // src/components/ui/card/Card.tsx
7249
- var import_jsx_runtime4 = require("react/jsx-runtime");
7250
- var Card = (0, import_react6.forwardRef)(
7251
- ({ children, className }, ref) => {
7252
- const { settings } = useEmbed();
7253
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
7254
- StyledCard,
7255
- {
7256
- ref,
7257
- className,
7258
- $sectionLayout: settings.sectionLayout,
7259
- $borderRadius: settings.borderRadius,
7260
- children
7261
- }
7262
- );
7263
- }
7264
- );
7265
-
7266
8112
  // src/components/ui/flex/styles.ts
7267
8113
  var Flex = dt(Box)`
7268
8114
  display: flex;
@@ -7281,9 +8127,7 @@ var Container = dt.div`
7281
8127
  display: flex;
7282
8128
  justify-content: center;
7283
8129
  align-items: center;
7284
- border-width: 1px;
7285
- border-style: solid;
7286
- border-radius: 100%;
8130
+ border-radius: 9999px;
7287
8131
  ${({ $size }) => {
7288
8132
  const base = 24;
7289
8133
  let scale = 1;
@@ -7303,18 +8147,18 @@ var Container = dt.div`
7303
8147
  break;
7304
8148
  }
7305
8149
  return lt`
7306
- font-size: ${base * scale / 16}rem;
8150
+ font-size: ${base * scale / TEXT_BASE_SIZE}rem;
7307
8151
  line-height: 1;
7308
- width: ${(base + 8) * scale / 16}rem;
7309
- height: ${(base + 8) * scale / 16}rem;
8152
+ width: ${(base + 8) * scale / TEXT_BASE_SIZE}rem;
8153
+ height: ${(base + 8) * scale / TEXT_BASE_SIZE}rem;
7310
8154
  `;
7311
8155
  }}
7312
- ${({ $style }) => $style === "outline" ? lt`
8156
+ ${({ $variant, $colors }) => $variant === "outline" ? lt`
8157
+ color: ${$colors[0]};
7313
8158
  background-color: transparent;
7314
- border-color: #d1d5db;
7315
8159
  ` : lt`
7316
- background-color: #e5e7eb;
7317
- border-color: #e5e7eb;
8160
+ color: ${$colors[0]};
8161
+ background-color: ${$colors[1]};
7318
8162
  `}
7319
8163
  `;
7320
8164
 
@@ -7328,10 +8172,12 @@ var Icon2 = ({ name, className, ...props }) => {
7328
8172
  var import_jsx_runtime6 = require("react/jsx-runtime");
7329
8173
  var IconRound = ({
7330
8174
  name,
7331
- style = "filled",
7332
- size = "md"
8175
+ variant = "filled",
8176
+ size = "md",
8177
+ colors = ["white", "#e5e7eb"],
8178
+ ...props
7333
8179
  }) => {
7334
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Container, { $size: size, $style: style, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon2, { name }) });
8180
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Container, { $size: size, $variant: variant, $colors: colors, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Icon2, { name }) });
7335
8181
  };
7336
8182
 
7337
8183
  // src/components/ui/progress-bar/styles.ts
@@ -7346,7 +8192,7 @@ var ProgressBar = ({
7346
8192
  value,
7347
8193
  total = 0,
7348
8194
  color = "gray",
7349
- barWidth,
8195
+ barWidth = "100%",
7350
8196
  ...props
7351
8197
  }) => {
7352
8198
  const barColorMap = {
@@ -7356,287 +8202,72 @@ var ProgressBar = ({
7356
8202
  orange: "#DB6769",
7357
8203
  red: "#EF4444"
7358
8204
  };
7359
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Container2, { $alignItems: "center", $gap: `${16 / 16}rem`, ...props, children: [
7360
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Flex, { $alignItems: "center", $width: `${barWidth}`, $position: "relative", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
7361
- Flex,
7362
- {
7363
- $position: "relative",
7364
- $overflow: "hidden",
7365
- $width: "100%",
7366
- $height: `${8 / TEXT_BASE_SIZE}rem`,
7367
- $background: "#F2F4F7",
7368
- $borderRadius: "9999px",
7369
- children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
7370
- Box,
8205
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
8206
+ Container2,
8207
+ {
8208
+ $alignItems: "center",
8209
+ $gap: `${16 / TEXT_BASE_SIZE}rem`,
8210
+ ...props,
8211
+ children: [
8212
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
8213
+ Flex,
7371
8214
  {
7372
- $width: `${Math.min(progress, 100)}%`,
7373
- $height: "100%",
7374
- $background: barColorMap[color],
7375
- $borderRadius: "9999px"
8215
+ $position: "relative",
8216
+ $alignItems: "center",
8217
+ $width: `${barWidth}`,
8218
+ $maxWidth: "100%",
8219
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
8220
+ Flex,
8221
+ {
8222
+ $position: "relative",
8223
+ $overflow: "hidden",
8224
+ $width: "100%",
8225
+ $height: `${8 / TEXT_BASE_SIZE}rem`,
8226
+ $background: "#F2F4F7",
8227
+ $borderRadius: "9999px",
8228
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
8229
+ Box,
8230
+ {
8231
+ $width: `${Math.min(progress, 100)}%`,
8232
+ $height: "100%",
8233
+ $background: barColorMap[color],
8234
+ $borderRadius: "9999px"
8235
+ }
8236
+ )
8237
+ }
8238
+ )
7376
8239
  }
7377
- )
7378
- }
7379
- ) }),
7380
- total !== 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Text, { $size: `${14 / 16}rem`, $weight: "500", children: [
7381
- value,
7382
- "/",
7383
- total
7384
- ] })
7385
- ] });
7386
- };
7387
-
7388
- // src/components/elements/included-features/IncludedFeatures.tsx
7389
- var import_jsx_runtime8 = require("react/jsx-runtime");
7390
- function resolveDesignProps(props) {
7391
- return {
7392
- name: {
7393
- text: props.name?.text || "Included features",
7394
- style: {
7395
- fontFamily: props.name?.style?.fontFamily || "Inter",
7396
- fontSize: props.name?.style?.fontSize || 16,
7397
- fontWeight: props.name?.style?.fontWeight || 500,
7398
- color: props.name?.style?.color || "#000000"
7399
- }
7400
- },
7401
- limits: {
7402
- isVisible: props.limits?.isVisible || true
7403
- },
7404
- usage: {
7405
- isVisible: props.usage?.isVisible || true
7406
- },
7407
- count: props.count || 3
7408
- };
7409
- }
7410
- var LimitFeature = ({
7411
- feature,
7412
- allocation,
7413
- usage
7414
- }) => {
7415
- if (!feature) {
7416
- return null;
7417
- }
7418
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $justifyContent: "space-between", $margin: "0 0 1.5rem", children: [
7419
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $gap: `${16 / 16}rem`, children: [
7420
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(IconRound, { name: feature.icon, size: "sm" }),
7421
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7422
- Text,
7423
- {
7424
- $font: "Public Sans",
7425
- $size: `${18 / 16}rem`,
7426
- $weight: "500",
7427
- $align: "center",
7428
- children: feature.name
7429
- }
7430
- ) })
7431
- ] }),
7432
- typeof allocation === "number" && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7433
- ProgressBar,
7434
- {
7435
- progress: (usage || 0) / allocation * 100,
7436
- value: usage || 0,
7437
- total: allocation,
7438
- color: "blue",
7439
- barWidth: "140px"
7440
- }
7441
- )
7442
- ] });
7443
- };
7444
- var UsageFeature = ({
7445
- feature,
7446
- usage
7447
- }) => {
7448
- if (!feature) {
7449
- return null;
7450
- }
7451
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $justifyContent: "space-between", $margin: "0 0 1.5rem", children: [
7452
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $gap: `${16 / 16}rem`, children: [
7453
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(IconRound, { name: feature.icon, size: "sm" }),
7454
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7455
- Text,
7456
- {
7457
- $font: "Public Sans",
7458
- $size: `${18 / 16}rem`,
7459
- $weight: "500",
7460
- $align: "center",
7461
- children: feature.name
7462
- }
7463
- ) })
7464
- ] }),
7465
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Text, { as: Box, $font: "Public Sans", $weight: "500", $align: "right", children: [
7466
- usage,
7467
- " ",
7468
- feature.featureType,
7469
- " used"
7470
- ] }) })
7471
- ] });
7472
- };
7473
- var AddonFeature = ({
7474
- feature
7475
- }) => {
7476
- if (!feature) {
7477
- return null;
7478
- }
7479
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $justifyContent: "space-between", $margin: "0 0 1.5rem", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $gap: `${16 / 16}rem`, children: [
7480
- feature.icon && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(IconRound, { name: feature.icon, size: "sm" }),
7481
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7482
- Text,
7483
- {
7484
- $font: "Public Sans",
7485
- $size: `${18 / 16}rem`,
7486
- $weight: "500",
7487
- $align: "center",
7488
- children: feature.name
7489
- }
7490
- ) })
7491
- ] }) });
7492
- };
7493
- var IncludedFeatures = ({
7494
- className,
7495
- ...props
7496
- }) => {
7497
- const designPropsWithDefaults = resolveDesignProps(props);
7498
- const { data } = useEmbed();
7499
- const [numVisible, setNumVisible] = (0, import_react7.useState)(designPropsWithDefaults.count);
7500
- const isExpanded = (0, import_react7.useMemo)(
7501
- () => numVisible > designPropsWithDefaults.count,
7502
- [numVisible, designPropsWithDefaults.count]
8240
+ ),
8241
+ total !== 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Text, { $size: 14, $weight: 500, children: [
8242
+ value,
8243
+ "/",
8244
+ total
8245
+ ] })
8246
+ ]
8247
+ }
7503
8248
  );
7504
- const features = (0, import_react7.useMemo)(() => {
7505
- return (data.featureUsage?.features || []).map(
7506
- ({
7507
- access,
7508
- allocation,
7509
- allocationType,
7510
- feature,
7511
- period,
7512
- usage,
7513
- ...props2
7514
- }) => {
7515
- return {
7516
- access,
7517
- allocation,
7518
- allocationType,
7519
- feature,
7520
- period,
7521
- /**
7522
- * @TODO: resolve feature price
7523
- */
7524
- price: void 0,
7525
- usage,
7526
- ...props2
7527
- };
7528
- }
7529
- );
7530
- }, [data.featureUsage]);
7531
- const resize = () => {
7532
- setNumVisible(
7533
- (prev2) => prev2 > designPropsWithDefaults.count ? designPropsWithDefaults.count : features.length
7534
- );
7535
- };
7536
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className, children: [
7537
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { $margin: "0 0 1.5rem", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7538
- Text,
7539
- {
7540
- $font: "Inter",
7541
- $size: `${15 / 16}rem`,
7542
- $weight: "500",
7543
- $color: "#767676",
7544
- children: designPropsWithDefaults.name.text
7545
- }
7546
- ) }),
7547
- features.slice(0, numVisible).reduce((acc, feature, index) => {
7548
- if (feature.allocationType === "boolean") {
7549
- return [...acc, /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(AddonFeature, { ...feature }, index)];
7550
- }
7551
- if (feature.allocationType === "numeric" || feature.allocationType === "trait" || feature.allocationType === "unlimited") {
7552
- if (typeof feature.allocation === "number") {
7553
- return [...acc, /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LimitFeature, { ...feature }, index)];
7554
- }
7555
- return [...acc, /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(UsageFeature, { ...feature }, index)];
7556
- }
7557
- return acc;
7558
- }, []),
7559
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $alignItems: "center", $gap: `${4 / 16}rem`, children: [
7560
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7561
- Icon2,
7562
- {
7563
- name: isExpanded ? "chevron-up" : "chevron-down",
7564
- style: { fontSize: "1.25rem", color: "#D0D0D0" }
7565
- }
7566
- ),
7567
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Button2, { onClick: resize, color: "blue", variant: "link", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Text, { $weight: "500", children: "See all" }) })
7568
- ] })
7569
- ] });
7570
- };
7571
-
7572
- // src/components/elements/invoices/Invoices.tsx
7573
- var import_jsx_runtime9 = require("react/jsx-runtime");
7574
- var Invoices = () => {
7575
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "p-8", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "relative z-[1] bg-white flex flex-col space-y-4", children: [
7576
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "flex items-center justify-between", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "font-bold text-base", children: "Invoices" }) }),
7577
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex flex-col space-y-2", children: [
7578
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between text-sm", children: [
7579
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-blue-400", children: "May 12, 2024" }),
7580
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-gray-400", children: "$315.00" })
7581
- ] }),
7582
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between text-sm", children: [
7583
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-blue-400", children: "May 12, 2024" }),
7584
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-gray-400", children: "$315.00" })
7585
- ] })
7586
- ] }),
7587
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex flex-row space-x-2 items-center", children: [
7588
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon2, { name: "chevron-down", className: "text-gray-400 leading-none" }),
7589
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-blue-400 font-medium font-display text-sm", children: "See all" })
7590
- ] })
7591
- ] }) });
7592
- };
7593
-
7594
- // src/components/elements/next-bill-due/NextBillDue.tsx
7595
- var import_jsx_runtime10 = require("react/jsx-runtime");
7596
- var NextBillDue = () => {
7597
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "bg-white p-8", children: [
7598
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex items-center justify-between mb-3", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "font-bold text-base", children: "Next bill due June 12, 2024" }) }),
7599
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex items-center leading-none justify-between", children: [
7600
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-row items-end flex-1 font-medium font-display text-gray-700", children: [
7601
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "text-lg mr-0.5 translate-y-[3px]", children: "$" }),
7602
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "text-3xl", children: "315.00" })
7603
- ] }),
7604
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "text-gray-400 text-xs max-w-[160px]", children: [
7605
- "Estimated monthly bill, ",
7606
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("br", {}),
7607
- "Contract ends 5/12/24."
7608
- ] })
7609
- ] })
7610
- ] });
7611
- };
7612
-
7613
- // src/components/elements/payment-method/PaymentMethod.tsx
7614
- var import_jsx_runtime11 = require("react/jsx-runtime");
7615
- var PaymentMethod = () => {
7616
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "relative px-8 py-8 bg-white", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "relative z-[1] bg-white", children: [
7617
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
7618
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "font-bold text-base", children: "Payment Method" }),
7619
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-xs text-red-400", children: "Expires in 4 mo" })
7620
- ] }),
7621
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex flex-row justify-between bg-gray-50 text-sm px-4 py-1.5 rounded-full", children: [
7622
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "", children: "\u{1F4B3} Card ending 4512" }),
7623
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-blue-400", children: "Edit" })
7624
- ] })
7625
- ] }) });
7626
8249
  };
7627
8250
 
7628
- // src/components/elements/plan-manager/PlanManager.tsx
7629
- var import_react8 = require("react");
7630
-
7631
8251
  // src/components/elements/plan-manager/styles.ts
7632
- var Button3 = dt(Button2)`
8252
+ var StyledButton = dt(Button2)`
7633
8253
  font-family: "Public Sans", sans-serif;
7634
8254
  font-weight: 500;
7635
8255
  text-align: center;
7636
8256
  width: 100%;
7637
- color: ${({ $color, theme }) => $color || theme.text};
7638
- ${({ $backgroundColor, theme }) => {
7639
- const color = $backgroundColor || theme.button;
8257
+ ${({ $color = "primary", theme }) => {
8258
+ const { l: l2 } = hexToHSL(theme[$color]);
8259
+ const color = l2 > 50 ? "#000000" : "#FFFFFF";
8260
+ return lt`
8261
+ color: ${color};
8262
+
8263
+ ${Text} {
8264
+ color: ${color};
8265
+ }
8266
+ `;
8267
+ }};
8268
+
8269
+ ${({ $color = "primary", theme }) => {
8270
+ const color = theme[$color];
7640
8271
  return lt`
7641
8272
  background-color: ${color};
7642
8273
  border-color: ${color};
@@ -7644,10 +8275,10 @@ var Button3 = dt(Button2)`
7644
8275
  }}
7645
8276
 
7646
8277
  &:hover {
7647
- ${({ $backgroundColor, theme }) => {
7648
- const specified = $backgroundColor || theme.button;
7649
- const lightened = lighten(specified, 12.5);
7650
- const color = specified === lightened ? darken(specified, 12.5) : lightened;
8278
+ ${({ $color = "primary", theme }) => {
8279
+ const specified = theme[$color];
8280
+ const lightened = lighten(specified, 15);
8281
+ const color = specified === lightened ? darken(specified, 15) : lightened;
7651
8282
  return lt`
7652
8283
  background-color: ${color};
7653
8284
  border-color: ${color};
@@ -7680,66 +8311,56 @@ var Button3 = dt(Button2)`
7680
8311
  `;
7681
8312
 
7682
8313
  // src/components/elements/plan-manager/PlanManager.tsx
7683
- var import_jsx_runtime12 = require("react/jsx-runtime");
7684
- function resolveDesignProps2(props) {
8314
+ var import_jsx_runtime8 = require("react/jsx-runtime");
8315
+ var resolveDesignProps = (props) => {
7685
8316
  return {
7686
8317
  header: {
7687
- isVisible: props.header?.isVisible || true,
8318
+ isVisible: props.header?.isVisible ?? true,
7688
8319
  title: {
7689
- fontFamily: props.header?.title?.fontFamily || "Manrope",
7690
- fontSize: props.header?.title?.fontSize || 37,
7691
- fontWeight: props.header?.title?.fontWeight || 800,
7692
- color: props.header?.title?.color || "black"
8320
+ fontStyle: props.header?.title?.fontStyle ?? "heading1"
7693
8321
  },
7694
8322
  description: {
7695
- isVisible: props.header?.description?.isVisible || true,
7696
- fontFamily: props.header?.description?.fontFamily || "Public Sans",
7697
- fontSize: props.header?.description?.fontSize || 16,
7698
- fontWeight: props.header?.description?.fontWeight || 400,
7699
- color: props.header?.description?.color || "black"
8323
+ isVisible: props.header?.description?.isVisible ?? true,
8324
+ fontStyle: props.header?.description?.fontStyle ?? "text"
7700
8325
  },
7701
8326
  price: {
7702
- isVisible: props.header?.price?.isVisible || true,
7703
- fontFamily: props.header?.price?.fontFamily || "Inter",
7704
- fontSize: props.header?.price?.fontSize || 16,
7705
- fontWeight: props.header?.price?.fontWeight || 500,
7706
- color: props.header?.price?.color || "black"
8327
+ isVisible: props.header?.price?.isVisible ?? true,
8328
+ fontStyle: props.header?.price?.fontStyle ?? "text"
7707
8329
  }
7708
8330
  },
7709
8331
  addOns: {
7710
- isVisible: props.addOns?.isVisible || true
7711
- },
7712
- usageBased: {
7713
- isVisible: props.usageBased?.isVisible || true
8332
+ isVisible: props.addOns?.isVisible ?? true,
8333
+ fontStyle: props.addOns?.fontStyle ?? "heading4",
8334
+ showLabel: props.addOns?.showLabel ?? true
7714
8335
  },
7715
8336
  callToAction: {
7716
- isVisible: props.callToAction?.isVisible || true,
7717
- size: props.callToAction?.size || "md",
7718
- color: props.callToAction?.color || "white",
7719
- backgroundColor: props.callToAction?.backgroundColor || "black"
8337
+ isVisible: props.callToAction?.isVisible ?? true,
8338
+ buttonSize: props.callToAction?.buttonSize ?? "md",
8339
+ buttonStyle: props.callToAction?.buttonStyle ?? "secondary"
7720
8340
  }
7721
8341
  };
7722
- }
7723
- var PlanManager = ({ className, ...props }) => {
7724
- const designPropsWithDefaults = resolveDesignProps2(props);
7725
- const { data } = useEmbed();
7726
- const plans = (0, import_react8.useMemo)(() => {
7727
- return (data.company?.plans || []).map(({ name, description }) => {
7728
- return {
8342
+ };
8343
+ var PlanManager = (0, import_react7.forwardRef)(({ children, className, portal, ...rest }, ref) => {
8344
+ const props = resolveDesignProps(rest);
8345
+ const { data, settings, layout, setLayout } = useEmbed();
8346
+ const { plan, plans, addOns } = (0, import_react7.useMemo)(() => {
8347
+ return {
8348
+ plan: data.company?.plan || {},
8349
+ plans: data.company?.plans?.map(({ name, description }) => ({
7729
8350
  name,
7730
8351
  description,
7731
- /**
7732
- * @TODO: resolve plan/addon prices
7733
- */
7734
8352
  price: void 0
7735
- };
7736
- });
7737
- }, [data.company?.plans]);
7738
- const plan = plans.at(0);
7739
- const addons = plans.slice(1);
7740
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className, children: [
7741
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Flex, { $flexDirection: "column", $gap: `${12 / 16}rem`, $margin: "0 0 3rem", children: [
7742
- designPropsWithDefaults.header.isVisible && plan && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
8353
+ })) || [],
8354
+ addOns: data.company?.addOns?.map(({ name, description }) => ({
8355
+ name,
8356
+ description,
8357
+ price: void 0
8358
+ })) || []
8359
+ };
8360
+ }, [data.company]);
8361
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { ref, className, children: [
8362
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $flexDirection: "column", $gap: "0.75rem", $margin: "0 0 3rem", children: [
8363
+ props.header.isVisible && plan && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
7743
8364
  Flex,
7744
8365
  {
7745
8366
  $justifyContent: "space-between",
@@ -7747,58 +8368,78 @@ var PlanManager = ({ className, ...props }) => {
7747
8368
  $width: "100%",
7748
8369
  $margin: "0 0 1.5rem",
7749
8370
  children: [
7750
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { children: [
7751
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Box, { $margin: "0 0 0.75rem", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
8371
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { children: [
8372
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { $margin: "0 0 0.75rem", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7752
8373
  Text,
7753
8374
  {
7754
- $font: designPropsWithDefaults.header.title.fontFamily,
7755
- $size: `${designPropsWithDefaults.header.title.fontSize / 16}rem`,
7756
- $weight: `${designPropsWithDefaults.header.title.fontWeight}`,
7757
- $color: designPropsWithDefaults.header.title.color,
8375
+ $font: settings.theme.typography[props.header.title.fontStyle].fontFamily,
8376
+ $size: settings.theme.typography[props.header.title.fontStyle].fontSize,
8377
+ $weight: settings.theme.typography[props.header.title.fontStyle].fontWeight,
8378
+ $color: settings.theme.typography[props.header.title.fontStyle].color,
8379
+ $lineHeight: 1,
7758
8380
  children: plan.name
7759
8381
  }
7760
8382
  ) }),
7761
- designPropsWithDefaults.header.description.isVisible && plan.description && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
8383
+ props.header.description.isVisible && plan.description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
7762
8384
  Text,
7763
8385
  {
7764
- $font: designPropsWithDefaults.header.description.fontFamily,
7765
- $size: `${designPropsWithDefaults.header.description.fontSize / 16}rem`,
7766
- $weight: `${designPropsWithDefaults.header.description.fontWeight}`,
7767
- $color: designPropsWithDefaults.header.description.color,
8386
+ $font: settings.theme.typography[props.header.description.fontStyle].fontFamily,
8387
+ $size: settings.theme.typography[props.header.description.fontStyle].fontSize,
8388
+ $weight: settings.theme.typography[props.header.description.fontStyle].fontWeight,
8389
+ $color: settings.theme.typography[props.header.description.fontStyle].color,
7768
8390
  children: plan.description
7769
8391
  }
7770
8392
  )
7771
8393
  ] }),
7772
- designPropsWithDefaults.header.price.isVisible && plan.price >= 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
8394
+ props.header.price.isVisible && plan.planPrice >= 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
7773
8395
  Text,
7774
8396
  {
7775
- $font: designPropsWithDefaults.header.price.fontFamily,
7776
- $size: `${designPropsWithDefaults.header.price.fontSize / 16}`,
7777
- $weight: `${designPropsWithDefaults.header.price.fontWeight}`,
7778
- $color: designPropsWithDefaults.header.price.color,
8397
+ $font: settings.theme.typography[props.header.price.fontStyle].fontFamily,
8398
+ $size: settings.theme.typography[props.header.price.fontStyle].fontSize,
8399
+ $weight: settings.theme.typography[props.header.price.fontStyle].fontWeight,
8400
+ $color: settings.theme.typography[props.header.price.fontStyle].color,
7779
8401
  children: [
7780
8402
  "$",
7781
- plan.price,
7782
- "/mo"
8403
+ plan.planPrice,
8404
+ "/",
8405
+ plan.planPeriod
7783
8406
  ]
7784
8407
  }
7785
8408
  )
7786
8409
  ]
7787
8410
  }
7788
8411
  ),
7789
- designPropsWithDefaults.addOns.isVisible && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
7790
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Text, { $size: `${15 / 16}rem`, $weight: "500", children: "Add-Ons" }),
7791
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Box, { $width: "100%", $margin: "0 0 1rem", children: addons.map((addon, index) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
8412
+ props.addOns.isVisible && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
8413
+ props.addOns.showLabel && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8414
+ Text,
8415
+ {
8416
+ $font: settings.theme.typography.text.fontFamily,
8417
+ $size: settings.theme.typography.text.fontSize,
8418
+ $weight: 500,
8419
+ $color: darken(settings.theme.typography.text.color, 20),
8420
+ children: "Add-Ons"
8421
+ }
8422
+ ),
8423
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Box, { $width: "100%", $margin: "0 0 1rem", children: addOns.map((addOn, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
7792
8424
  Flex,
7793
8425
  {
7794
8426
  $justifyContent: "space-between",
7795
8427
  $alignItems: "center",
7796
8428
  $width: "100%",
7797
8429
  children: [
7798
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Text, { $font: "Manrope", $size: `${18 / 16}rem`, $weight: "800", children: addon.name }),
7799
- addon.price >= 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Text, { $weight: "500", children: [
8430
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8431
+ Text,
8432
+ {
8433
+ $font: settings.theme.typography[props.addOns.fontStyle].fontFamily,
8434
+ $size: settings.theme.typography[props.addOns.fontStyle].fontSize,
8435
+ $weight: settings.theme.typography[props.addOns.fontStyle].fontWeight,
8436
+ $color: settings.theme.typography[props.addOns.fontStyle].color,
8437
+ children: addOn.name
8438
+ }
8439
+ ),
8440
+ addOn.price >= 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Text, { $weight: 500, children: [
7800
8441
  "$",
7801
- addon.price,
8442
+ addOn.price,
7802
8443
  "/mo"
7803
8444
  ] })
7804
8445
  ]
@@ -7807,23 +8448,759 @@ var PlanManager = ({ className, ...props }) => {
7807
8448
  )) })
7808
8449
  ] })
7809
8450
  ] }),
7810
- designPropsWithDefaults.callToAction.isVisible && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
7811
- Button3,
8451
+ props.callToAction.isVisible && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8452
+ StyledButton,
7812
8453
  {
7813
- $size: designPropsWithDefaults.callToAction.size,
7814
- $color: designPropsWithDefaults.callToAction.color,
7815
- $backgroundColor: designPropsWithDefaults.callToAction.backgroundColor,
7816
- children: "Change Plan"
8454
+ onClick: () => {
8455
+ if (layout !== "checkout")
8456
+ return;
8457
+ setLayout("checkout");
8458
+ },
8459
+ $size: props.callToAction.buttonSize,
8460
+ $color: props.callToAction.buttonStyle,
8461
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8462
+ Text,
8463
+ {
8464
+ $font: settings.theme.typography.text.fontFamily,
8465
+ $size: settings.theme.typography.text.fontSize,
8466
+ $weight: settings.theme.typography.text.fontWeight,
8467
+ children: "Change Plan"
8468
+ }
8469
+ )
7817
8470
  }
8471
+ ),
8472
+ children,
8473
+ layout === "checkout" && (0, import_react_dom.createPortal)(
8474
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8475
+ Box,
8476
+ {
8477
+ $position: "absolute",
8478
+ $top: "50%",
8479
+ $left: "50%",
8480
+ $zIndex: "999999",
8481
+ $transform: "translate(-50%, -50%)",
8482
+ $width: "100%",
8483
+ $height: "100%",
8484
+ $backgroundColor: "#B5B5B580",
8485
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
8486
+ Flex,
8487
+ {
8488
+ $position: "relative",
8489
+ $top: "50%",
8490
+ $left: "50%",
8491
+ $transform: "translate(-50%, -50%)",
8492
+ $width: "956px",
8493
+ $height: "700px",
8494
+ $backgroundColor: "#FBFBFB",
8495
+ $borderRadius: "8px",
8496
+ $boxShadow: "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A;",
8497
+ id: "select-plan-dialog",
8498
+ role: "dialog",
8499
+ "aria-labelledby": "select-plan-dialog-label",
8500
+ "aria-modal": "true",
8501
+ children: [
8502
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8503
+ Box,
8504
+ {
8505
+ $position: "absolute",
8506
+ $top: "0.25rem",
8507
+ $right: "0.75rem",
8508
+ $cursor: "pointer",
8509
+ onClick: () => {
8510
+ setLayout("portal");
8511
+ },
8512
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon2, { name: "close", style: { fontSize: 36, color: "#B8B8B8" } })
8513
+ }
8514
+ ),
8515
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Flex, { $flexDirection: "column", $gap: "1rem", children: [
8516
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
8517
+ Text,
8518
+ {
8519
+ as: "h1",
8520
+ id: "select-plan-dialog-label",
8521
+ $size: 24,
8522
+ $weight: 800,
8523
+ children: "Select plan"
8524
+ }
8525
+ ),
8526
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Flex, { $flexDirection: "column", $gap: "1rem", children: plans.map((plan2, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
8527
+ Flex,
8528
+ {
8529
+ $justifyContent: "space-between",
8530
+ $alignItems: "center",
8531
+ $width: "100%",
8532
+ children: [
8533
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Text, { $size: 20, $weight: 800, children: plan2.name }),
8534
+ plan2.price >= 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(Text, { children: [
8535
+ "$",
8536
+ plan2.price,
8537
+ "/mo"
8538
+ ] })
8539
+ ]
8540
+ },
8541
+ index
8542
+ )) })
8543
+ ] })
8544
+ ]
8545
+ }
8546
+ )
8547
+ }
8548
+ ),
8549
+ portal || document.body
7818
8550
  )
7819
8551
  ] });
8552
+ });
8553
+
8554
+ // src/components/elements/included-features/IncludedFeatures.tsx
8555
+ var import_react8 = require("react");
8556
+ var import_jsx_runtime9 = require("react/jsx-runtime");
8557
+ function resolveDesignProps2(props) {
8558
+ return {
8559
+ header: {
8560
+ isVisible: props.header?.isVisible ?? true,
8561
+ fontStyle: props.header?.fontStyle ?? "heading4",
8562
+ text: props.header?.text ?? "Included features"
8563
+ },
8564
+ icons: {
8565
+ isVisible: props.icons?.isVisible ?? true,
8566
+ fontStyle: props.icons?.fontStyle ?? "heading3",
8567
+ style: props.icons?.style ?? "light"
8568
+ },
8569
+ entitlement: {
8570
+ isVisible: props.entitlement?.isVisible ?? true,
8571
+ fontStyle: props.entitlement?.fontStyle ?? "heading5"
8572
+ },
8573
+ usage: {
8574
+ isVisible: props.usage?.isVisible ?? true,
8575
+ fontStyle: props.usage?.fontStyle ?? "heading6"
8576
+ }
8577
+ };
8578
+ }
8579
+ var IncludedFeatures = (0, import_react8.forwardRef)(({ className, ...rest }, ref) => {
8580
+ const props = resolveDesignProps2(rest);
8581
+ const { data, settings } = useEmbed();
8582
+ const features = (0, import_react8.useMemo)(() => {
8583
+ return (data.featureUsage?.features || []).map(
8584
+ ({
8585
+ access,
8586
+ allocation,
8587
+ allocationType,
8588
+ feature,
8589
+ period,
8590
+ usage,
8591
+ ...props2
8592
+ }) => {
8593
+ return {
8594
+ access,
8595
+ allocation,
8596
+ allocationType,
8597
+ feature,
8598
+ period,
8599
+ /**
8600
+ * @TODO: resolve feature price
8601
+ */
8602
+ price: void 0,
8603
+ usage,
8604
+ ...props2
8605
+ };
8606
+ }
8607
+ );
8608
+ }, [data.featureUsage]);
8609
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Flex, { ref, className, $flexDirection: "column", $gap: "1.5rem", children: [
8610
+ props.header.isVisible && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Box, { children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
8611
+ Text,
8612
+ {
8613
+ $font: settings.theme.typography[props.header.fontStyle].fontFamily,
8614
+ $size: settings.theme.typography[props.header.fontStyle].fontSize,
8615
+ $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
8616
+ $color: settings.theme.typography[props.header.fontStyle].color,
8617
+ children: props.header.text
8618
+ }
8619
+ ) }),
8620
+ features.reduce(
8621
+ (acc, { allocation, allocationType, feature, usage }, index) => {
8622
+ if (!allocationType) {
8623
+ return acc;
8624
+ }
8625
+ return [
8626
+ ...acc,
8627
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
8628
+ Flex,
8629
+ {
8630
+ $flexWrap: "wrap",
8631
+ $justifyContent: "space-between",
8632
+ $alignItems: "center",
8633
+ $gap: "1rem",
8634
+ children: [
8635
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Flex, { $flexShrink: "0", $gap: "1rem", children: [
8636
+ props.icons.isVisible && feature?.icon && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
8637
+ IconRound,
8638
+ {
8639
+ name: feature.icon,
8640
+ size: "sm",
8641
+ colors: [
8642
+ settings.theme.card.background,
8643
+ settings.theme.primary
8644
+ ]
8645
+ }
8646
+ ),
8647
+ feature?.name && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Flex, { $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
8648
+ Text,
8649
+ {
8650
+ $font: settings.theme.typography[props.icons.fontStyle].fontFamily,
8651
+ $size: settings.theme.typography[props.icons.fontStyle].fontSize,
8652
+ $weight: settings.theme.typography[props.icons.fontStyle].fontWeight,
8653
+ $color: settings.theme.typography[props.icons.fontStyle].color,
8654
+ $align: "center",
8655
+ children: feature.name
8656
+ }
8657
+ ) })
8658
+ ] }),
8659
+ allocationType === "numeric" && feature?.name && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Box, { $textAlign: "right", children: [
8660
+ props.entitlement.isVisible && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
8661
+ Text,
8662
+ {
8663
+ as: Box,
8664
+ $font: settings.theme.typography[props.entitlement.fontStyle].fontFamily,
8665
+ $size: settings.theme.typography[props.entitlement.fontStyle].fontSize,
8666
+ $weight: settings.theme.typography[props.entitlement.fontStyle].fontWeight,
8667
+ $color: settings.theme.typography[props.entitlement.fontStyle].color,
8668
+ children: typeof allocation === "number" ? `${allocation} ${feature.name}` : `Unlimited ${feature.name}`
8669
+ }
8670
+ ),
8671
+ props.usage.isVisible && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
8672
+ Text,
8673
+ {
8674
+ as: Box,
8675
+ $font: settings.theme.typography[props.usage.fontStyle].fontFamily,
8676
+ $size: settings.theme.typography[props.usage.fontStyle].fontSize,
8677
+ $weight: settings.theme.typography[props.usage.fontStyle].fontWeight,
8678
+ $color: settings.theme.typography[props.usage.fontStyle].color,
8679
+ children: typeof allocation === "number" ? `${usage} of ${allocation} used` : `${usage} used`
8680
+ }
8681
+ )
8682
+ ] })
8683
+ ]
8684
+ },
8685
+ index
8686
+ )
8687
+ ];
8688
+ },
8689
+ []
8690
+ )
8691
+ ] });
8692
+ });
8693
+
8694
+ // src/components/elements/metered-features/MeteredFeatures.tsx
8695
+ var import_react9 = require("react");
8696
+ var import_jsx_runtime10 = require("react/jsx-runtime");
8697
+ function resolveDesignProps3(props) {
8698
+ return {
8699
+ isVisible: props.isVisible ?? true,
8700
+ header: {
8701
+ fontStyle: props.header?.fontStyle ?? "heading2"
8702
+ },
8703
+ description: {
8704
+ isVisible: props.description?.isVisible ?? true,
8705
+ fontStyle: props.description?.fontStyle ?? "text"
8706
+ },
8707
+ icon: {
8708
+ isVisible: props.icon?.isVisible ?? true
8709
+ },
8710
+ allocation: {
8711
+ isVisible: props.allocation?.isVisible ?? true,
8712
+ fontStyle: props.allocation?.fontStyle ?? "heading4"
8713
+ },
8714
+ usage: {
8715
+ isVisible: props.usage?.isVisible ?? true,
8716
+ fontStyle: props.usage?.fontStyle ?? "heading5"
8717
+ },
8718
+ callToAction: {
8719
+ isVisible: props.callToAction?.isVisible ?? true,
8720
+ buttonSize: props.callToAction?.buttonSize ?? "md",
8721
+ buttonStyle: props.callToAction?.buttonStyle ?? "secondary"
8722
+ }
8723
+ };
8724
+ }
8725
+ var MeteredFeatures = (0, import_react9.forwardRef)(({ className, ...rest }, ref) => {
8726
+ const props = resolveDesignProps3(rest);
8727
+ const { data, settings } = useEmbed();
8728
+ const features = (0, import_react9.useMemo)(() => {
8729
+ return (data.featureUsage?.features || []).map(
8730
+ ({
8731
+ access,
8732
+ allocation,
8733
+ allocationType,
8734
+ feature,
8735
+ period,
8736
+ usage,
8737
+ ...props2
8738
+ }) => {
8739
+ return {
8740
+ access,
8741
+ allocation,
8742
+ allocationType,
8743
+ feature,
8744
+ period,
8745
+ /**
8746
+ * @TODO: resolve feature price
8747
+ */
8748
+ price: void 0,
8749
+ usage,
8750
+ ...props2
8751
+ };
8752
+ }
8753
+ );
8754
+ }, [data.featureUsage]);
8755
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Flex, { ref, className, $flexDirection: "column", $gap: "1.5rem", children: features.reduce(
8756
+ (acc, { allocation, allocationType, feature, usage }, index) => {
8757
+ if (!props.isVisible || allocationType !== "numeric" || typeof allocation !== "number") {
8758
+ return acc;
8759
+ }
8760
+ return [
8761
+ ...acc,
8762
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Flex, { $gap: "1.5rem", children: [
8763
+ props.icon.isVisible && feature?.icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Box, { $flexShrink: "0", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(IconRound, { name: feature.icon, size: "sm" }) }),
8764
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Box, { $flexGrow: "1", children: [
8765
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Flex, { children: [
8766
+ feature?.name && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Box, { $flexGrow: "1", children: [
8767
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
8768
+ Text,
8769
+ {
8770
+ as: Box,
8771
+ $font: settings.theme.typography[props.header.fontStyle].fontFamily,
8772
+ $size: settings.theme.typography[props.header.fontStyle].fontSize,
8773
+ $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
8774
+ $color: settings.theme.typography[props.header.fontStyle].color,
8775
+ children: feature.name
8776
+ }
8777
+ ),
8778
+ props.description.isVisible && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
8779
+ Text,
8780
+ {
8781
+ as: Box,
8782
+ $font: settings.theme.typography[props.description.fontStyle].fontFamily,
8783
+ $size: settings.theme.typography[props.description.fontStyle].fontSize,
8784
+ $weight: settings.theme.typography[props.description.fontStyle].fontWeight,
8785
+ $color: settings.theme.typography[props.description.fontStyle].color,
8786
+ children: feature.description
8787
+ }
8788
+ )
8789
+ ] }),
8790
+ allocationType === "numeric" && feature?.name && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Box, { $textAlign: "right", children: [
8791
+ props.allocation.isVisible && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
8792
+ Text,
8793
+ {
8794
+ as: Box,
8795
+ $font: settings.theme.typography[props.allocation.fontStyle].fontFamily,
8796
+ $size: settings.theme.typography[props.allocation.fontStyle].fontSize,
8797
+ $weight: settings.theme.typography[props.allocation.fontStyle].fontWeight,
8798
+ $color: settings.theme.typography[props.allocation.fontStyle].color,
8799
+ children: typeof allocation === "number" ? `${allocation} ${feature.name}` : `Unlimited ${feature.name}`
8800
+ }
8801
+ ),
8802
+ props.usage.isVisible && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
8803
+ Text,
8804
+ {
8805
+ as: Box,
8806
+ $font: settings.theme.typography[props.usage.fontStyle].fontFamily,
8807
+ $size: settings.theme.typography[props.usage.fontStyle].fontSize,
8808
+ $weight: settings.theme.typography[props.usage.fontStyle].fontWeight,
8809
+ $color: settings.theme.typography[props.usage.fontStyle].color,
8810
+ children: typeof allocation === "number" ? `${usage} of ${allocation} used` : `${usage} used`
8811
+ }
8812
+ )
8813
+ ] })
8814
+ ] }),
8815
+ typeof usage === "number" && typeof allocation === "number" && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Box, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
8816
+ ProgressBar,
8817
+ {
8818
+ progress: usage / allocation * 100,
8819
+ value: usage,
8820
+ total: allocation,
8821
+ color: "blue"
8822
+ }
8823
+ ) })
8824
+ ] })
8825
+ ] }, index)
8826
+ ];
8827
+ },
8828
+ []
8829
+ ) });
8830
+ });
8831
+
8832
+ // src/components/elements/upcoming-bill/UpcomingBill.tsx
8833
+ var import_react10 = require("react");
8834
+ var import_jsx_runtime11 = require("react/jsx-runtime");
8835
+ function resolveDesignProps4(props) {
8836
+ return {
8837
+ header: {
8838
+ isVisible: props.header?.isVisible ?? true,
8839
+ fontStyle: props.header?.fontStyle ?? "heading4",
8840
+ prefix: props.header?.prefix ?? "Next bill due"
8841
+ },
8842
+ price: {
8843
+ isVisible: props.price?.isVisible ?? true,
8844
+ fontStyle: props.price?.fontStyle ?? "heading1"
8845
+ },
8846
+ contractEndDate: {
8847
+ isVisible: props.contractEndDate?.isVisible ?? true,
8848
+ fontStyle: props.contractEndDate?.fontStyle ?? "heading6",
8849
+ prefix: props.contractEndDate?.prefix ?? "Contract ends"
8850
+ }
8851
+ };
8852
+ }
8853
+ var UpcomingBill = (0, import_react10.forwardRef)(({ className, ...rest }, ref) => {
8854
+ const props = resolveDesignProps4(rest);
8855
+ const { settings } = useEmbed();
8856
+ const { bill } = (0, import_react10.useMemo)(() => {
8857
+ return {
8858
+ bill: {
8859
+ amount: 200,
8860
+ period: "monthly",
8861
+ dueDate: toPrettyDate(/* @__PURE__ */ new Date("2024-06-12")),
8862
+ endDate: (/* @__PURE__ */ new Date("2025-05-12")).toLocaleDateString()
8863
+ }
8864
+ };
8865
+ }, []);
8866
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { ref, className, children: [
8867
+ props.header.isVisible && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
8868
+ Flex,
8869
+ {
8870
+ $justifyContent: "space-between",
8871
+ $alignItems: "center",
8872
+ $margin: "0 0 0.75rem",
8873
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
8874
+ Text,
8875
+ {
8876
+ $font: settings.theme.typography[props.header.fontStyle].fontFamily,
8877
+ $size: settings.theme.typography[props.header.fontStyle].fontSize,
8878
+ $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
8879
+ $color: settings.theme.typography[props.header.fontStyle].color,
8880
+ children: [
8881
+ props.header.prefix,
8882
+ " ",
8883
+ bill.dueDate
8884
+ ]
8885
+ }
8886
+ )
8887
+ }
8888
+ ),
8889
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Flex, { $justifyContent: "space-between", $alignItems: "start", $gap: "1rem", children: [
8890
+ props.price.isVisible && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Flex, { $alignItems: "end", $flexGrow: "1", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
8891
+ Text,
8892
+ {
8893
+ $font: settings.theme.typography[props.price.fontStyle].fontFamily,
8894
+ $size: settings.theme.typography[props.price.fontStyle].fontSize,
8895
+ $weight: settings.theme.typography[props.price.fontStyle].fontWeight,
8896
+ $color: settings.theme.typography[props.price.fontStyle].color,
8897
+ $lineHeight: 1,
8898
+ children: [
8899
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
8900
+ Text,
8901
+ {
8902
+ $size: "0.75em",
8903
+ $color: settings.theme.typography[props.price.fontStyle].color,
8904
+ children: "$"
8905
+ }
8906
+ ),
8907
+ bill.amount
8908
+ ]
8909
+ }
8910
+ ) }),
8911
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Box, { $maxWidth: "140px", $lineHeight: "1", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
8912
+ Text,
8913
+ {
8914
+ $font: settings.theme.typography[props.contractEndDate.fontStyle].fontFamily,
8915
+ $size: settings.theme.typography[props.contractEndDate.fontStyle].fontSize,
8916
+ $weight: settings.theme.typography[props.contractEndDate.fontStyle].fontWeight,
8917
+ $color: settings.theme.typography[props.contractEndDate.fontStyle].color,
8918
+ children: [
8919
+ "Estimated monthly bill.",
8920
+ props.contractEndDate.isVisible && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
8921
+ "\xA0",
8922
+ props.contractEndDate.prefix,
8923
+ " ",
8924
+ bill.endDate,
8925
+ "."
8926
+ ] })
8927
+ ]
8928
+ }
8929
+ ) })
8930
+ ] })
8931
+ ] });
8932
+ });
8933
+
8934
+ // src/components/elements/payment-method/PaymentMethod.tsx
8935
+ var import_react11 = require("react");
8936
+ var import_react_dom2 = require("react-dom");
8937
+ var import_jsx_runtime12 = require("react/jsx-runtime");
8938
+ var resolveDesignProps5 = (props) => {
8939
+ return {
8940
+ header: {
8941
+ isVisible: props.header?.isVisible ?? true,
8942
+ fontStyle: props.header?.fontStyle ?? "heading4"
8943
+ },
8944
+ functions: {
8945
+ allowEdit: props.functions?.allowEdit ?? true
8946
+ }
8947
+ };
7820
8948
  };
8949
+ var PaymentMethod = (0, import_react11.forwardRef)(({ children, className, portal, ...rest }, ref) => {
8950
+ const props = resolveDesignProps5(rest);
8951
+ const { settings, layout, setLayout } = useEmbed();
8952
+ const paymentMethod = (0, import_react11.useMemo)(() => {
8953
+ const cardNumber = "4512";
8954
+ const expirationDate = "2024-12-22";
8955
+ const timeToExpiration = Math.round(
8956
+ +new Date(expirationDate) - +/* @__PURE__ */ new Date()
8957
+ );
8958
+ const monthsToExpiration = Math.round(
8959
+ timeToExpiration / (1e3 * 60 * 60 * 24 * 30)
8960
+ );
8961
+ return {
8962
+ cardNumber,
8963
+ monthsToExpiration
8964
+ };
8965
+ }, []);
8966
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { ref, className, children: [
8967
+ props.header.isVisible && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
8968
+ Flex,
8969
+ {
8970
+ $justifyContent: "space-between",
8971
+ $alignItems: "center",
8972
+ $margin: "0 0 1rem",
8973
+ children: [
8974
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
8975
+ Text,
8976
+ {
8977
+ $font: settings.theme.typography[props.header.fontStyle].fontFamily,
8978
+ $size: settings.theme.typography[props.header.fontStyle].fontSize,
8979
+ $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
8980
+ $color: settings.theme.typography[props.header.fontStyle].color,
8981
+ children: "Payment Method"
8982
+ }
8983
+ ),
8984
+ Math.abs(paymentMethod.monthsToExpiration) < 4 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
8985
+ Text,
8986
+ {
8987
+ $font: settings.theme.typography.text.fontFamily,
8988
+ $size: 14,
8989
+ $color: "#DB6769",
8990
+ children: paymentMethod.monthsToExpiration > 0 ? `Expires in ${paymentMethod.monthsToExpiration} mo` : "Expired"
8991
+ }
8992
+ )
8993
+ ]
8994
+ }
8995
+ ),
8996
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
8997
+ Flex,
8998
+ {
8999
+ $justifyContent: "space-between",
9000
+ $alignItems: "center",
9001
+ $margin: "0 0 1rem",
9002
+ $background: `${hexToHSL(settings.theme.card.background).l > 50 ? darken(settings.theme.card.background, 10) : lighten(settings.theme.card.background, 20)}`,
9003
+ $padding: "0.375rem 1rem",
9004
+ $borderRadius: "9999px",
9005
+ children: [
9006
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(Text, { $font: settings.theme.typography.text.fontFamily, $size: 14, children: [
9007
+ "\u{1F4B3} Card ending in ",
9008
+ paymentMethod.cardNumber
9009
+ ] }),
9010
+ props.functions.allowEdit && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9011
+ Text,
9012
+ {
9013
+ tabIndex: 0,
9014
+ onClick: () => {
9015
+ if (layout !== "payment")
9016
+ return;
9017
+ setLayout("payment");
9018
+ },
9019
+ $font: settings.theme.typography.link.fontFamily,
9020
+ $size: settings.theme.typography.link.fontSize,
9021
+ $weight: settings.theme.typography.link.fontWeight,
9022
+ $color: settings.theme.typography.link.color,
9023
+ children: "Edit"
9024
+ }
9025
+ )
9026
+ ]
9027
+ }
9028
+ ),
9029
+ layout === "payment" && (0, import_react_dom2.createPortal)(
9030
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9031
+ Box,
9032
+ {
9033
+ $position: "absolute",
9034
+ $top: "50%",
9035
+ $left: "50%",
9036
+ $zIndex: "999999",
9037
+ $transform: "translate(-50%, -50%)",
9038
+ $width: "100%",
9039
+ $height: "100%",
9040
+ $backgroundColor: "#B5B5B580",
9041
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
9042
+ Flex,
9043
+ {
9044
+ $position: "relative",
9045
+ $top: "50%",
9046
+ $left: "50%",
9047
+ $transform: "translate(-50%, -50%)",
9048
+ $width: "956px",
9049
+ $height: "700px",
9050
+ $backgroundColor: "#FBFBFB",
9051
+ $borderRadius: "8px",
9052
+ $boxShadow: "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A;",
9053
+ id: "select-plan-dialog",
9054
+ role: "dialog",
9055
+ "aria-labelledby": "select-plan-dialog-label",
9056
+ "aria-modal": "true",
9057
+ children: [
9058
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9059
+ Box,
9060
+ {
9061
+ $position: "absolute",
9062
+ $top: "0.25rem",
9063
+ $right: "0.75rem",
9064
+ $cursor: "pointer",
9065
+ onClick: () => {
9066
+ setLayout("portal");
9067
+ },
9068
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon2, { name: "close", style: { fontSize: 36, color: "#B8B8B8" } })
9069
+ }
9070
+ ),
9071
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Flex, { $flexDirection: "column", $gap: "1rem", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
9072
+ Text,
9073
+ {
9074
+ as: "h1",
9075
+ id: "select-plan-dialog-label",
9076
+ $size: 24,
9077
+ $weight: 800,
9078
+ children: "Add payment method"
9079
+ }
9080
+ ) })
9081
+ ]
9082
+ }
9083
+ )
9084
+ }
9085
+ ),
9086
+ portal || document.body
9087
+ )
9088
+ ] });
9089
+ });
9090
+
9091
+ // src/components/elements/invoices/Invoices.tsx
9092
+ var import_react12 = require("react");
9093
+ var import_jsx_runtime13 = require("react/jsx-runtime");
9094
+ function resolveDesignProps6(props) {
9095
+ return {
9096
+ header: {
9097
+ isVisible: props.header?.isVisible ?? true,
9098
+ fontStyle: props.header?.fontStyle ?? "heading4"
9099
+ },
9100
+ date: {
9101
+ isVisible: props.date?.isVisible ?? true,
9102
+ fontStyle: props.date?.fontStyle ?? "link"
9103
+ },
9104
+ amount: {
9105
+ isVisible: props.amount?.isVisible ?? true,
9106
+ fontStyle: props.amount?.fontStyle ?? "text"
9107
+ },
9108
+ limit: {
9109
+ isVisible: props.limit?.isVisible ?? true,
9110
+ number: props.limit?.number ?? 2
9111
+ },
9112
+ collapse: {
9113
+ isVisible: props.collapse?.isVisible ?? true,
9114
+ fontStyle: props.collapse?.fontStyle ?? "link"
9115
+ }
9116
+ };
9117
+ }
9118
+ var Invoices = (0, import_react12.forwardRef)(({ className, ...rest }, ref) => {
9119
+ const props = resolveDesignProps6(rest);
9120
+ const { settings } = useEmbed();
9121
+ const { invoices } = (0, import_react12.useMemo)(() => {
9122
+ return {
9123
+ invoices: [
9124
+ {
9125
+ date: toPrettyDate(/* @__PURE__ */ new Date("2024-05-12")),
9126
+ amount: 200
9127
+ },
9128
+ {
9129
+ date: toPrettyDate(/* @__PURE__ */ new Date("2024-04-12")),
9130
+ amount: 200
9131
+ }
9132
+ ]
9133
+ };
9134
+ }, []);
9135
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { ref, className, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Flex, { $flexDirection: "column", $gap: "1rem", children: [
9136
+ props.header.isVisible && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Flex, { $justifyContent: "space-between", $alignItems: "center", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
9137
+ Text,
9138
+ {
9139
+ $font: settings.theme.typography[props.header.fontStyle].fontFamily,
9140
+ $size: settings.theme.typography[props.header.fontStyle].fontSize,
9141
+ $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
9142
+ $color: settings.theme.typography[props.header.fontStyle].color,
9143
+ children: "Invoices"
9144
+ }
9145
+ ) }),
9146
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Flex, { $flexDirection: "column", $gap: "0.5rem", children: invoices.slice(
9147
+ 0,
9148
+ props.limit.isVisible && props.limit.number || invoices.length
9149
+ ).map(({ date, amount }, index) => {
9150
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Flex, { $justifyContent: "space-between", children: [
9151
+ props.date.isVisible && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
9152
+ Text,
9153
+ {
9154
+ $font: settings.theme.typography[props.date.fontStyle].fontFamily,
9155
+ $size: settings.theme.typography[props.date.fontStyle].fontSize,
9156
+ $weight: settings.theme.typography[props.date.fontStyle].fontWeight,
9157
+ $color: settings.theme.typography[props.date.fontStyle].color,
9158
+ children: toPrettyDate(date)
9159
+ }
9160
+ ),
9161
+ props.amount.isVisible && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
9162
+ Text,
9163
+ {
9164
+ $font: settings.theme.typography[props.amount.fontStyle].fontFamily,
9165
+ $size: settings.theme.typography[props.amount.fontStyle].fontSize,
9166
+ $weight: settings.theme.typography[props.amount.fontStyle].fontWeight,
9167
+ $color: settings.theme.typography[props.amount.fontStyle].color,
9168
+ children: [
9169
+ "$",
9170
+ amount
9171
+ ]
9172
+ }
9173
+ )
9174
+ ] }, index);
9175
+ }) }),
9176
+ props.collapse.isVisible && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(Flex, { $alignItems: "center", $gap: "0.5rem", children: [
9177
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Icon2, { name: "chevron-down", style: { color: "#D0D0D0" } }),
9178
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
9179
+ Text,
9180
+ {
9181
+ $font: settings.theme.typography[props.collapse.fontStyle].fontFamily,
9182
+ $size: settings.theme.typography[props.collapse.fontStyle].fontSize,
9183
+ $weight: settings.theme.typography[props.collapse.fontStyle].fontWeight,
9184
+ $color: settings.theme.typography[props.collapse.fontStyle].color,
9185
+ children: "See all"
9186
+ }
9187
+ )
9188
+ ] })
9189
+ ] }) });
9190
+ });
9191
+
9192
+ // src/components/embed/ComponentTree.tsx
9193
+ var import_react14 = require("react");
7821
9194
 
7822
9195
  // src/components/embed/renderer.ts
9196
+ var import_react13 = require("react");
7823
9197
  var components = {
7824
9198
  Card,
9199
+ PlanManager,
7825
9200
  IncludedFeatures,
7826
- PlanManager
9201
+ UpcomingBill,
9202
+ PaymentMethod,
9203
+ MeteredFeatures
7827
9204
  };
7828
9205
  function createRenderer(options) {
7829
9206
  const { useFallback = true } = options || {};
@@ -7840,13 +9217,14 @@ function createRenderer(options) {
7840
9217
  if (!component) {
7841
9218
  return null;
7842
9219
  }
7843
- const { className, style, ...rootProps } = props;
7844
- const resolvedProps = node2.id === "ROOT" ? rootProps : props;
9220
+ const { className, ...rest } = props;
9221
+ const resolvedProps = component === "div" ? rest : props;
7845
9222
  const resolvedChildren = children.map(renderNode);
7846
- return (0, import_react9.createElement)(
9223
+ return (0, import_react13.createElement)(
7847
9224
  component,
7848
9225
  {
7849
- ...resolvedProps,
9226
+ className,
9227
+ ...component !== "div" && { resolvedProps },
7850
9228
  ...Object.keys(custom).length > 0 && { custom },
7851
9229
  key: index
7852
9230
  },
@@ -7856,30 +9234,30 @@ function createRenderer(options) {
7856
9234
  }
7857
9235
 
7858
9236
  // src/components/embed/ComponentTree.tsx
7859
- var import_jsx_runtime13 = require("react/jsx-runtime");
9237
+ var import_jsx_runtime14 = require("react/jsx-runtime");
7860
9238
  var ComponentTree = () => {
7861
- const [children, setChildren] = (0, import_react10.useState)("Loading");
9239
+ const [children, setChildren] = (0, import_react14.useState)("Loading");
7862
9240
  const { error, nodes } = useEmbed();
7863
- (0, import_react10.useEffect)(() => {
9241
+ (0, import_react14.useEffect)(() => {
7864
9242
  const renderer = createRenderer();
7865
9243
  setChildren(nodes.map(renderer));
7866
9244
  }, [nodes]);
7867
9245
  if (error) {
7868
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { children: error.message });
9246
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { children: error.message });
7869
9247
  }
7870
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_jsx_runtime13.Fragment, { children });
9248
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, { children });
7871
9249
  };
7872
9250
 
7873
9251
  // src/components/embed/Embed.tsx
7874
- var import_jsx_runtime14 = require("react/jsx-runtime");
7875
- var SchematicEmbed = ({ id, accessToken }) => {
9252
+ var import_jsx_runtime15 = require("react/jsx-runtime");
9253
+ var SchematicEmbed = ({ id, accessToken, apiConfig }) => {
7876
9254
  if (accessToken?.length === 0) {
7877
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { children: "Please provide an access token." });
9255
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: "Please provide an access token." });
7878
9256
  }
7879
9257
  if (!accessToken?.startsWith("token_")) {
7880
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { children: 'Invalid access token; your temporary access token will start with "token_".' });
9258
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { children: 'Invalid access token; your temporary access token will start with "token_".' });
7881
9259
  }
7882
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EmbedProvider, { id, accessToken, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ComponentTree, {}) });
9260
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(EmbedProvider, { id, accessToken, apiConfig, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ComponentTree, {}) });
7883
9261
  };
7884
9262
  /*! Bundled license information:
7885
9263