@schematichq/schematic-react 0.2.0-rc.5 → 0.2.0-rc.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6418,7 +6418,7 @@ var registerWrapper = function registerWrapper2(stripe, startTime) {
6418
6418
  }
6419
6419
  stripe._registerWrapper({
6420
6420
  name: "stripe-js",
6421
- version: "4.3.0",
6421
+ version: "4.4.0",
6422
6422
  startTime
6423
6423
  });
6424
6424
  };
@@ -7344,7 +7344,6 @@ function PaymentMethodResponseDataFromJSONTyped(json, ignoreDiscriminator) {
7344
7344
  environmentId: json["environment_id"],
7345
7345
  externalId: json["external_id"],
7346
7346
  id: json["id"],
7347
- invoiceExternalId: json["invoice_external_id"] == null ? void 0 : json["invoice_external_id"],
7348
7347
  paymentMethodType: json["payment_method_type"],
7349
7348
  subscriptionExternalId: json["subscription_external_id"] == null ? void 0 : json["subscription_external_id"],
7350
7349
  updatedAt: new Date(json["updated_at"])
@@ -7969,33 +7968,6 @@ function parseEditorState(data) {
7969
7968
  });
7970
7969
  return arr;
7971
7970
  }
7972
- async function fetchComponent(id, api) {
7973
- const nodes = [];
7974
- const settings = { ...defaultSettings };
7975
- const response = await api.hydrateComponent({ componentId: id });
7976
- const { data } = response;
7977
- if (data.component?.ast) {
7978
- const compressed = data.component.ast;
7979
- const json = inflate_1(Uint8Array.from(Object.values(compressed)), {
7980
- to: "string"
7981
- });
7982
- const ast = getEditorState(json);
7983
- if (ast) {
7984
- (0, import_lodash.default)(settings, ast.ROOT.props.settings);
7985
- nodes.push(...parseEditorState(ast));
7986
- }
7987
- }
7988
- let stripe = null;
7989
- if (data.stripeEmbed?.publishableKey) {
7990
- stripe = loadStripe(data.stripeEmbed.publishableKey);
7991
- }
7992
- return {
7993
- data,
7994
- nodes,
7995
- settings,
7996
- stripe
7997
- };
7998
- }
7999
7971
  var EmbedContext = createContext({
8000
7972
  api: null,
8001
7973
  data: {
@@ -8006,6 +7978,9 @@ var EmbedContext = createContext({
8006
7978
  stripe: null,
8007
7979
  layout: "portal",
8008
7980
  error: void 0,
7981
+ isPending: false,
7982
+ hydrate: () => {
7983
+ },
8009
7984
  setData: () => {
8010
7985
  },
8011
7986
  updateSettings: () => {
@@ -8032,7 +8007,10 @@ var EmbedProvider = ({
8032
8007
  settings: { ...defaultSettings },
8033
8008
  stripe: null,
8034
8009
  layout: "portal",
8010
+ isPending: false,
8035
8011
  error: void 0,
8012
+ hydrate: () => {
8013
+ },
8036
8014
  setData: () => {
8037
8015
  },
8038
8016
  updateSettings: () => {
@@ -8043,45 +8021,47 @@ var EmbedProvider = ({
8043
8021
  }
8044
8022
  };
8045
8023
  });
8046
- useEffect(() => {
8047
- const element = document.getElementById("schematic-fonts");
8048
- if (element) {
8049
- return void (styleRef.current = element);
8050
- }
8051
- const style = document.createElement("link");
8052
- style.id = "schematic-fonts";
8053
- style.rel = "stylesheet";
8054
- document.head.appendChild(style);
8055
- styleRef.current = style;
8056
- }, []);
8057
- useEffect(() => {
8058
- if (!accessToken) {
8059
- return;
8060
- }
8061
- const config = new Configuration({ ...apiConfig, apiKey: accessToken });
8062
- const api = new CheckoutApi(config);
8063
- setState((prev2) => ({ ...prev2, api }));
8064
- }, [accessToken, apiConfig]);
8065
- useEffect(() => {
8066
- if (!id || !state.api) {
8067
- return;
8068
- }
8069
- fetchComponent(id, state.api).then(async (resolvedData) => {
8070
- setState((prev2) => ({ ...prev2, ...resolvedData }));
8071
- }).catch((error) => setState((prev2) => ({ ...prev2, error })));
8072
- }, [id, state.api]);
8073
- useEffect(() => {
8074
- const fontSet = /* @__PURE__ */ new Set([]);
8075
- Object.values(state.settings.theme.typography).forEach(({ fontFamily }) => {
8076
- fontSet.add(fontFamily);
8077
- });
8078
- if (fontSet.size > 0) {
8079
- const src = `https://fonts.googleapis.com/css2?${[...fontSet].map((fontFamily) => `family=${fontFamily}&display=swap`).join("&")}`;
8080
- if (styleRef.current) {
8081
- styleRef.current.href = src;
8024
+ const hydrate = useCallback(async () => {
8025
+ setState((prev2) => ({ ...prev2, isPending: true, error: void 0 }));
8026
+ try {
8027
+ const nodes = [];
8028
+ const settings = { ...defaultSettings };
8029
+ if (!id || !state.api) {
8030
+ throw new Error("Invalid component id or api instance.");
8031
+ }
8032
+ const response = await state.api.hydrateComponent({ componentId: id });
8033
+ const { data } = response;
8034
+ if (data.component?.ast) {
8035
+ const compressed = data.component.ast;
8036
+ const json = inflate_1(Uint8Array.from(Object.values(compressed)), {
8037
+ to: "string"
8038
+ });
8039
+ const ast = getEditorState(json);
8040
+ if (ast) {
8041
+ (0, import_lodash.default)(settings, ast.ROOT.props.settings);
8042
+ nodes.push(...parseEditorState(ast));
8043
+ }
8082
8044
  }
8045
+ let stripe = null;
8046
+ if (data.stripeEmbed?.publishableKey) {
8047
+ stripe = loadStripe(data.stripeEmbed.publishableKey);
8048
+ }
8049
+ setState((prev2) => ({
8050
+ ...prev2,
8051
+ data,
8052
+ nodes,
8053
+ settings,
8054
+ stripe,
8055
+ isPending: false
8056
+ }));
8057
+ } catch (error) {
8058
+ setState((prev2) => ({
8059
+ ...prev2,
8060
+ isPending: false,
8061
+ error: error instanceof Error ? error : new Error("An unknown error occurred.")
8062
+ }));
8083
8063
  }
8084
- }, [state.settings.theme.typography]);
8064
+ }, [id, state.api]);
8085
8065
  const setData = useCallback(
8086
8066
  (data) => {
8087
8067
  setState((prev2) => {
@@ -8124,6 +8104,40 @@ var EmbedProvider = ({
8124
8104
  },
8125
8105
  [setState]
8126
8106
  );
8107
+ useEffect(() => {
8108
+ const element = document.getElementById("schematic-fonts");
8109
+ if (element) {
8110
+ return void (styleRef.current = element);
8111
+ }
8112
+ const style = document.createElement("link");
8113
+ style.id = "schematic-fonts";
8114
+ style.rel = "stylesheet";
8115
+ document.head.appendChild(style);
8116
+ styleRef.current = style;
8117
+ }, []);
8118
+ useEffect(() => {
8119
+ if (!accessToken) {
8120
+ return;
8121
+ }
8122
+ const config = new Configuration({ ...apiConfig, apiKey: accessToken });
8123
+ const api = new CheckoutApi(config);
8124
+ setState((prev2) => ({ ...prev2, api }));
8125
+ }, [accessToken, apiConfig]);
8126
+ useEffect(() => {
8127
+ hydrate();
8128
+ }, [hydrate]);
8129
+ useEffect(() => {
8130
+ const fontSet = /* @__PURE__ */ new Set([]);
8131
+ Object.values(state.settings.theme.typography).forEach(({ fontFamily }) => {
8132
+ fontSet.add(fontFamily);
8133
+ });
8134
+ if (fontSet.size > 0) {
8135
+ const src = `https://fonts.googleapis.com/css2?${[...fontSet].map((fontFamily) => `family=${fontFamily}&display=swap`).join("&")}`;
8136
+ if (styleRef.current) {
8137
+ styleRef.current.href = src;
8138
+ }
8139
+ }
8140
+ }, [state.settings.theme.typography]);
8127
8141
  const renderChildren = () => {
8128
8142
  if (state.stripe) {
8129
8143
  return /* @__PURE__ */ jsx(
@@ -8176,6 +8190,8 @@ var EmbedProvider = ({
8176
8190
  stripe: state.stripe,
8177
8191
  layout: state.layout,
8178
8192
  error: state.error,
8193
+ isPending: state.isPending,
8194
+ hydrate,
8179
8195
  setData,
8180
8196
  updateSettings,
8181
8197
  setStripe,
@@ -8756,19 +8772,36 @@ function v4(options, buf, offset) {
8756
8772
  }
8757
8773
  var v4_default = v4;
8758
8774
  var import_polyfill = __toESM2(require_browser_polyfill());
8775
+ function contextString(context) {
8776
+ const sortedContext = Object.keys(context).reduce((acc, key) => {
8777
+ const sortedKeys = Object.keys(
8778
+ context[key] || {}
8779
+ ).sort();
8780
+ const sortedObj = sortedKeys.reduce((obj, sortedKey) => {
8781
+ obj[sortedKey] = context[key][sortedKey];
8782
+ return obj;
8783
+ }, {});
8784
+ acc[key] = sortedObj;
8785
+ return acc;
8786
+ }, {});
8787
+ return JSON.stringify(sortedContext);
8788
+ }
8759
8789
  var anonymousIdKey = "schematicId";
8760
8790
  var Schematic = class {
8761
8791
  apiKey;
8762
8792
  apiUrl = "https://api.schematichq.com";
8763
- webSocketUrl = "wss://api.schematichq.com";
8764
- eventUrl = "https://c.schematichq.com";
8765
8793
  conn = null;
8766
8794
  context = {};
8767
8795
  eventQueue;
8796
+ eventUrl = "https://c.schematichq.com";
8797
+ flagListener;
8798
+ flagValueListeners = {};
8799
+ isPending = true;
8800
+ isPendingListeners = /* @__PURE__ */ new Set();
8768
8801
  storage;
8769
8802
  useWebSocket = false;
8770
8803
  values = {};
8771
- flagListener;
8804
+ webSocketUrl = "wss://api.schematichq.com";
8772
8805
  constructor(apiKey, options) {
8773
8806
  this.apiKey = apiKey;
8774
8807
  this.eventQueue = [];
@@ -8788,12 +8821,14 @@ var Schematic = class {
8788
8821
  if (options?.webSocketUrl !== void 0) {
8789
8822
  this.webSocketUrl = options.webSocketUrl;
8790
8823
  }
8791
- if (window?.addEventListener) {
8824
+ if (typeof window !== "undefined" && window?.addEventListener) {
8792
8825
  window.addEventListener("beforeunload", () => {
8793
8826
  this.flushEventQueue();
8794
8827
  });
8795
8828
  }
8796
8829
  }
8830
+ // Get value for a single flag
8831
+ // If in websocket mode, return the local value, otherwise make an API call
8797
8832
  async checkFlag(options) {
8798
8833
  const { fallback = false, key } = options;
8799
8834
  const context = options.context || this.context;
@@ -8821,7 +8856,7 @@ var Schematic = class {
8821
8856
  return fallback;
8822
8857
  });
8823
8858
  }
8824
- // Make a REST API call to fetch all flag values for a given context
8859
+ // Make an API call to fetch all flag values for a given context (use if not in websocket mode)
8825
8860
  checkFlags = async (context) => {
8826
8861
  context = context || this.context;
8827
8862
  const requestUrl = `${this.apiUrl}/flags/check`;
@@ -8851,18 +8886,6 @@ var Schematic = class {
8851
8886
  return false;
8852
8887
  });
8853
8888
  };
8854
- cleanup = async () => {
8855
- if (this.conn) {
8856
- try {
8857
- const socket = await this.conn;
8858
- socket.close();
8859
- } catch (error) {
8860
- console.error("Error during cleanup:", error);
8861
- } finally {
8862
- this.conn = null;
8863
- }
8864
- }
8865
- };
8866
8889
  // Send an identify event
8867
8890
  identify = (body) => {
8868
8891
  this.setContext({
@@ -8880,12 +8903,16 @@ var Schematic = class {
8880
8903
  this.context = context;
8881
8904
  return Promise.resolve();
8882
8905
  }
8883
- if (!this.conn) {
8884
- this.conn = this.wsConnect();
8906
+ try {
8907
+ this.setIsPending(true);
8908
+ if (!this.conn) {
8909
+ this.conn = this.wsConnect();
8910
+ }
8911
+ const socket = await this.conn;
8912
+ await this.wsSendMessage(socket, context);
8913
+ } catch (error) {
8914
+ console.error("Error setting Schematic context:", error);
8885
8915
  }
8886
- return this.conn.then((socket) => {
8887
- return this.wsSendMessage(socket, context);
8888
- });
8889
8916
  };
8890
8917
  // Send track event
8891
8918
  track = (body) => {
@@ -8897,6 +8924,9 @@ var Schematic = class {
8897
8924
  user: user ?? this.context.user
8898
8925
  });
8899
8926
  };
8927
+ /**
8928
+ * Event processing
8929
+ */
8900
8930
  flushEventQueue = () => {
8901
8931
  while (this.eventQueue.length > 0) {
8902
8932
  const event = this.eventQueue.shift();
@@ -8952,6 +8982,22 @@ var Schematic = class {
8952
8982
  this.eventQueue.push(event);
8953
8983
  return Promise.resolve();
8954
8984
  };
8985
+ /**
8986
+ * Websocket management
8987
+ */
8988
+ cleanup = async () => {
8989
+ if (this.conn) {
8990
+ try {
8991
+ const socket = await this.conn;
8992
+ socket.close();
8993
+ } catch (error) {
8994
+ console.error("Error during cleanup:", error);
8995
+ } finally {
8996
+ this.conn = null;
8997
+ }
8998
+ }
8999
+ };
9000
+ // Open a websocket connection
8955
9001
  wsConnect = () => {
8956
9002
  return new Promise((resolve, reject) => {
8957
9003
  const wsUrl = `${this.webSocketUrl}/flags/bootstrap`;
@@ -8967,6 +9013,8 @@ var Schematic = class {
8967
9013
  };
8968
9014
  });
8969
9015
  };
9016
+ // Send a message on the websocket indicating interest in a particular evaluation context
9017
+ // and wait for the initial set of flag values to be returned
8970
9018
  wsSendMessage = (socket, context) => {
8971
9019
  return new Promise((resolve, reject) => {
8972
9020
  if (contextString(context) == contextString(this.context)) {
@@ -8984,16 +9032,17 @@ var Schematic = class {
8984
9032
  (message.flags ?? []).forEach(
8985
9033
  (flag) => {
8986
9034
  this.values[contextString(context)][flag.flag] = flag.value;
9035
+ this.notifyFlagValueListeners(flag.flag);
8987
9036
  }
8988
9037
  );
8989
9038
  if (this.flagListener) {
8990
- this.flagListener(this.values[contextString(context)]);
9039
+ this.flagListener(this.getFlagValues());
8991
9040
  }
9041
+ this.setIsPending(false);
8992
9042
  if (!resolved) {
8993
9043
  resolved = true;
8994
9044
  resolve();
8995
9045
  }
8996
- socket.removeEventListener("message", messageHandler);
8997
9046
  };
8998
9047
  socket.addEventListener("message", messageHandler);
8999
9048
  socket.send(
@@ -9012,118 +9061,156 @@ var Schematic = class {
9012
9061
  }
9013
9062
  });
9014
9063
  };
9064
+ /**
9065
+ * State management
9066
+ */
9067
+ // isPending state
9068
+ getIsPending = () => {
9069
+ return this.isPending;
9070
+ };
9071
+ addIsPendingListener = (listener) => {
9072
+ this.isPendingListeners.add(listener);
9073
+ return () => {
9074
+ this.isPendingListeners.delete(listener);
9075
+ };
9076
+ };
9077
+ setIsPending = (isPending) => {
9078
+ this.isPending = isPending;
9079
+ this.isPendingListeners.forEach((listener) => listener());
9080
+ };
9081
+ // flagValues state
9082
+ getFlagValue = (flagKey) => {
9083
+ const values = this.getFlagValues();
9084
+ return values[flagKey];
9085
+ };
9086
+ getFlagValues = () => {
9087
+ const contextStr = contextString(this.context);
9088
+ return this.values[contextStr] ?? {};
9089
+ };
9090
+ addFlagValueListener = (flagKey, listener) => {
9091
+ if (!(flagKey in this.flagValueListeners)) {
9092
+ this.flagValueListeners[flagKey] = /* @__PURE__ */ new Set();
9093
+ }
9094
+ this.flagValueListeners[flagKey].add(listener);
9095
+ return () => {
9096
+ this.flagValueListeners[flagKey].delete(listener);
9097
+ };
9098
+ };
9099
+ notifyFlagValueListeners = (flagKey) => {
9100
+ const listeners = this.flagValueListeners?.[flagKey] ?? [];
9101
+ listeners.forEach((listener) => listener());
9102
+ };
9015
9103
  };
9016
- function contextString(context) {
9017
- const sortedContext = Object.keys(context).reduce((acc, key) => {
9018
- const sortedKeys = Object.keys(
9019
- context[key] || {}
9020
- ).sort();
9021
- const sortedObj = sortedKeys.reduce((obj, sortedKey) => {
9022
- obj[sortedKey] = context[key][sortedKey];
9023
- return obj;
9024
- }, {});
9025
- acc[key] = sortedObj;
9026
- return acc;
9027
- }, {});
9028
- return JSON.stringify(sortedContext);
9029
- }
9030
9104
 
9031
9105
  // src/context/schematic.tsx
9032
- import { createContext as createContext2, useEffect as useEffect2, useMemo, useState as useState2 } from "react";
9106
+ import React, { createContext as createContext2, useEffect as useEffect2, useMemo } from "react";
9033
9107
  import { jsx as jsx2 } from "react/jsx-runtime";
9034
- var SchematicContext = createContext2({
9035
- flagValues: {}
9036
- });
9108
+ var SchematicContext = createContext2(
9109
+ null
9110
+ );
9037
9111
  var SchematicProvider = ({
9038
9112
  children,
9039
9113
  client: providedClient,
9040
9114
  publishableKey,
9041
9115
  ...clientOpts
9042
9116
  }) => {
9043
- const [client, setClient] = useState2();
9044
- const [flagValues, setFlagValues] = useState2({});
9045
- const memoizedClientOpts = useMemo(
9046
- () => clientOpts,
9047
- /* eslint-disable-next-line react-hooks/exhaustive-deps */
9048
- [JSON.stringify(clientOpts)]
9049
- );
9050
- const { useWebSocket = true } = clientOpts;
9051
- useEffect2(() => {
9052
- let cleanupFunction;
9117
+ const client = useMemo(() => {
9118
+ const { useWebSocket = true } = clientOpts;
9053
9119
  if (providedClient) {
9054
- setClient(providedClient);
9055
- cleanupFunction = () => {
9056
- providedClient.cleanup().catch((error) => {
9057
- console.error("Error during cleanup:", error);
9058
- });
9059
- };
9060
- } else {
9061
- const newClient = new Schematic(publishableKey, {
9062
- ...memoizedClientOpts,
9063
- flagListener: setFlagValues,
9064
- useWebSocket
9065
- });
9066
- setClient(newClient);
9067
- cleanupFunction = () => {
9068
- newClient.cleanup().catch((error) => {
9120
+ return providedClient;
9121
+ }
9122
+ return new Schematic(publishableKey, {
9123
+ useWebSocket,
9124
+ ...clientOpts
9125
+ });
9126
+ }, [providedClient, publishableKey, clientOpts]);
9127
+ useEffect2(() => {
9128
+ return () => {
9129
+ if (!providedClient) {
9130
+ client.cleanup().catch((error) => {
9069
9131
  console.error("Error during cleanup:", error);
9070
9132
  });
9071
- };
9072
- }
9073
- return cleanupFunction;
9074
- }, [memoizedClientOpts, providedClient, publishableKey, useWebSocket]);
9075
- const contextValue = {
9076
- client,
9077
- flagValues
9078
- };
9133
+ }
9134
+ };
9135
+ }, [client, providedClient]);
9136
+ const contextValue = useMemo(
9137
+ () => ({
9138
+ client
9139
+ }),
9140
+ [client]
9141
+ );
9079
9142
  return /* @__PURE__ */ jsx2(SchematicContext.Provider, { value: contextValue, children });
9080
9143
  };
9144
+ var useSchematic = () => {
9145
+ const context = React.useContext(SchematicContext);
9146
+ if (context === null) {
9147
+ throw new Error("useSchematic must be used within a SchematicProvider");
9148
+ }
9149
+ return context;
9150
+ };
9081
9151
 
9082
9152
  // src/hooks/embed.ts
9083
9153
  import { useContext } from "react";
9084
9154
  var useEmbed = () => useContext(EmbedContext);
9085
9155
 
9086
9156
  // src/hooks/schematic.ts
9087
- import { useContext as useContext2, useEffect as useEffect3, useState as useState3 } from "react";
9088
- var useSchematic = () => useContext2(SchematicContext);
9157
+ import { useMemo as useMemo2, useSyncExternalStore, useCallback as useCallback2 } from "react";
9089
9158
  var useSchematicClient = (opts) => {
9090
9159
  const schematic = useSchematic();
9091
9160
  const { client } = opts ?? {};
9092
- if (client) {
9093
- return client;
9094
- }
9095
- return schematic.client;
9161
+ return useMemo2(() => {
9162
+ if (client) {
9163
+ return client;
9164
+ }
9165
+ return schematic.client;
9166
+ }, [client, schematic.client]);
9096
9167
  };
9097
9168
  var useSchematicContext = (opts) => {
9098
9169
  const client = useSchematicClient(opts);
9099
- const { setContext } = client ?? {};
9100
- return { setContext };
9170
+ return useMemo2(
9171
+ () => ({
9172
+ setContext: client.setContext.bind(client)
9173
+ }),
9174
+ [client]
9175
+ );
9101
9176
  };
9102
9177
  var useSchematicEvents = (opts) => {
9103
9178
  const client = useSchematicClient(opts);
9104
- const { track, identify } = client ?? {};
9105
- return { track, identify };
9179
+ const track = useCallback2(
9180
+ (...args) => client.track(...args),
9181
+ [client]
9182
+ );
9183
+ const identify = useCallback2(
9184
+ (...args) => client.identify(...args),
9185
+ [client]
9186
+ );
9187
+ return useMemo2(() => ({ track, identify }), [track, identify]);
9106
9188
  };
9107
9189
  var useSchematicFlag = (key, opts) => {
9108
- const { flagValues } = useSchematic();
9109
- const { client } = opts ?? {};
9110
- const { fallback = false } = opts ?? {};
9111
- const [value, setValue] = useState3(fallback);
9112
- const flagValue = flagValues[key];
9113
- useEffect3(() => {
9114
- if (typeof flagValue !== "undefined") {
9115
- setValue(flagValue);
9116
- } else if (client) {
9117
- client.checkFlag({ key, fallback }).then(setValue);
9118
- } else {
9119
- setValue(fallback);
9120
- }
9121
- }, [key, fallback, flagValue, client]);
9122
- return value;
9190
+ const client = useSchematicClient(opts);
9191
+ const fallback = opts?.fallback ?? false;
9192
+ const subscribe = useCallback2(
9193
+ (callback) => client.addFlagValueListener(key, callback),
9194
+ [client, key]
9195
+ );
9196
+ const getSnapshot = useCallback2(() => {
9197
+ const value = client.getFlagValue(key);
9198
+ return typeof value === "undefined" ? fallback : value;
9199
+ }, [client, key, fallback]);
9200
+ return useSyncExternalStore(subscribe, getSnapshot);
9201
+ };
9202
+ var useSchematicIsPending = (opts) => {
9203
+ const client = useSchematicClient(opts);
9204
+ const subscribe = useCallback2(
9205
+ (callback) => client.addIsPendingListener(callback),
9206
+ [client]
9207
+ );
9208
+ const getSnapshot = useCallback2(() => client.getIsPending(), [client]);
9209
+ return useSyncExternalStore(subscribe, getSnapshot);
9123
9210
  };
9124
9211
 
9125
9212
  // src/components/elements/plan-manager/PlanManager.tsx
9126
- import { forwardRef, useMemo as useMemo3 } from "react";
9213
+ import { forwardRef, useMemo as useMemo6 } from "react";
9127
9214
  import { createPortal } from "react-dom";
9128
9215
 
9129
9216
  // src/utils/color.ts
@@ -9205,7 +9292,7 @@ function hslToHex({ h, s: s2, l: l2 }) {
9205
9292
  }
9206
9293
  function adjustLightness(color, amount) {
9207
9294
  const { h, s: s2, l: l2 } = hexToHSL(color);
9208
- return hslToHex({ h, s: s2, l: Math.max(Math.min(l2 + amount, 100), 0) });
9295
+ return hslToHex({ h, s: s2, l: Math.max(Math.min(l2 + amount * 100, 100), 0) });
9209
9296
  }
9210
9297
  function lighten(color, amount) {
9211
9298
  return adjustLightness(color, amount);
@@ -9435,6 +9522,7 @@ var Container = dt.div`
9435
9522
  align-items: center;
9436
9523
  flex-shrink: 0;
9437
9524
  border-radius: 9999px;
9525
+
9438
9526
  ${({ $size }) => {
9439
9527
  const base = 24;
9440
9528
  let scale = 1;
@@ -9452,6 +9540,15 @@ var Container = dt.div`
9452
9540
  case "lg":
9453
9541
  scale *= 1.75;
9454
9542
  break;
9543
+ case "xl":
9544
+ scale *= 2;
9545
+ break;
9546
+ case "2xl":
9547
+ scale *= 2.5;
9548
+ break;
9549
+ case "3xl":
9550
+ scale *= 3;
9551
+ break;
9455
9552
  }
9456
9553
  return lt`
9457
9554
  font-size: ${base * scale / TEXT_BASE_SIZE}rem;
@@ -9460,12 +9557,19 @@ var Container = dt.div`
9460
9557
  height: ${(base + 8) * scale / TEXT_BASE_SIZE}rem;
9461
9558
  `;
9462
9559
  }}
9560
+
9463
9561
  ${({ $variant, $colors }) => $variant === "outline" ? lt`
9464
- color: ${$colors[0]};
9465
9562
  background-color: transparent;
9563
+
9564
+ ${Icon} {
9565
+ color: ${$colors[0]};
9566
+ }
9466
9567
  ` : lt`
9467
- color: ${$colors[0]};
9468
9568
  background-color: ${$colors[1]};
9569
+
9570
+ ${Icon} {
9571
+ color: ${$colors[0]};
9572
+ }
9469
9573
  `}
9470
9574
  `;
9471
9575
 
@@ -9488,17 +9592,20 @@ var IconRound = ({
9488
9592
  };
9489
9593
 
9490
9594
  // src/components/ui/modal/Modal.tsx
9491
- import { useCallback as useCallback2, useEffect as useEffect4, useRef as useRef2 } from "react";
9595
+ import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef2 } from "react";
9492
9596
  import { jsx as jsx6 } from "react/jsx-runtime";
9493
- var Modal = ({ children, onClose }) => {
9597
+ var Modal = ({ children, size = "auto", onClose }) => {
9494
9598
  const theme = nt();
9495
9599
  const { setLayout } = useEmbed();
9496
9600
  const ref = useRef2(null);
9497
- const handleClose = useCallback2(() => {
9601
+ const isLightBackground = useMemo3(() => {
9602
+ return hexToHSL(theme.card.background).l > 50;
9603
+ }, [theme.card.background]);
9604
+ const handleClose = useCallback3(() => {
9498
9605
  setLayout("portal");
9499
9606
  onClose?.();
9500
9607
  }, [setLayout, onClose]);
9501
- useEffect4(() => {
9608
+ useEffect3(() => {
9502
9609
  ref.current?.focus();
9503
9610
  }, []);
9504
9611
  return /* @__PURE__ */ jsx6(
@@ -9523,7 +9630,7 @@ var Modal = ({ children, onClose }) => {
9523
9630
  $transform: "translate(-50%, -50%)",
9524
9631
  $width: "100%",
9525
9632
  $height: "100%",
9526
- $backgroundColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 15) : lighten(theme.card.background, 15),
9633
+ $backgroundColor: isLightBackground ? "hsl(0, 0%, 85%)" : "hsl(0, 0%, 15%)",
9527
9634
  $overflow: "hidden",
9528
9635
  children: /* @__PURE__ */ jsx6(
9529
9636
  Flex,
@@ -9534,9 +9641,13 @@ var Modal = ({ children, onClose }) => {
9534
9641
  $transform: "translate(-50%, -50%)",
9535
9642
  $flexDirection: "column",
9536
9643
  $overflow: "hidden",
9537
- $width: "calc(100% - 5rem)",
9538
- $height: "calc(100% - 5rem)",
9539
- $backgroundColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 2.5) : lighten(theme.card.background, 2.5),
9644
+ ...size === "auto" ? { $width: "min-content", $height: "min-content" } : {
9645
+ $width: "100%",
9646
+ $height: "100%",
9647
+ $maxWidth: "1366px",
9648
+ $maxHeight: "768px"
9649
+ },
9650
+ $backgroundColor: theme.card.background,
9540
9651
  $borderRadius: "0.5rem",
9541
9652
  $boxShadow: "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A;",
9542
9653
  id: "select-plan-dialog",
@@ -9551,12 +9662,19 @@ var Modal = ({ children, onClose }) => {
9551
9662
  };
9552
9663
 
9553
9664
  // src/components/ui/modal/ModalHeader.tsx
9554
- import { useCallback as useCallback3 } from "react";
9665
+ import { useCallback as useCallback4, useMemo as useMemo4 } from "react";
9555
9666
  import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
9556
- var ModalHeader = ({ children, onClose }) => {
9667
+ var ModalHeader = ({
9668
+ children,
9669
+ bordered = false,
9670
+ onClose
9671
+ }) => {
9557
9672
  const theme = nt();
9558
9673
  const { setLayout } = useEmbed();
9559
- const handleClose = useCallback3(() => {
9674
+ const isLightBackground = useMemo4(() => {
9675
+ return hexToHSL(theme.card.background).l > 50;
9676
+ }, [theme.card.background]);
9677
+ const handleClose = useCallback4(() => {
9560
9678
  setLayout("portal");
9561
9679
  onClose?.();
9562
9680
  }, [setLayout, onClose]);
@@ -9565,13 +9683,15 @@ var ModalHeader = ({ children, onClose }) => {
9565
9683
  {
9566
9684
  $justifyContent: "space-between",
9567
9685
  $alignItems: "center",
9686
+ $flexShrink: "0",
9568
9687
  $gap: "1rem",
9569
- $height: "3.75rem",
9570
- $padding: "0 0.625rem 0 2.5rem",
9571
- $backgroundColor: theme.card.background,
9572
- $borderBottomWidth: "1px",
9573
- $borderBottomStyle: "solid",
9574
- $borderBottomColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 15) : lighten(theme.card.background, 15),
9688
+ $height: "5rem",
9689
+ $padding: "0 1.5rem 0 3rem",
9690
+ ...bordered && {
9691
+ $borderBottomWidth: "1px",
9692
+ $borderBottomStyle: "solid",
9693
+ $borderBottomColor: isLightBackground ? "hsla(0, 0%, 0%, 0.15)" : "hsla(0, 0%, 100%, 0.15)"
9694
+ },
9575
9695
  children: [
9576
9696
  children,
9577
9697
  /* @__PURE__ */ jsx7(Box, { $cursor: "pointer", onClick: handleClose, children: /* @__PURE__ */ jsx7(
@@ -9580,7 +9700,7 @@ var ModalHeader = ({ children, onClose }) => {
9580
9700
  name: "close",
9581
9701
  style: {
9582
9702
  fontSize: 36,
9583
- color: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 27.5) : lighten(theme.card.background, 27.5)
9703
+ color: isLightBackground ? "hsla(0, 0%, 0%, 0.275)" : "hsla(0, 0%, 100%, 0.275)"
9584
9704
  }
9585
9705
  }
9586
9706
  ) })
@@ -9632,14 +9752,14 @@ var ProgressBar = ({
9632
9752
  $overflow: "hidden",
9633
9753
  $width: "100%",
9634
9754
  $height: `${8 / TEXT_BASE_SIZE}rem`,
9635
- $background: "#F2F4F7",
9755
+ $backgroundColor: "#F2F4F7",
9636
9756
  $borderRadius: "9999px",
9637
9757
  children: /* @__PURE__ */ jsx8(
9638
9758
  Box,
9639
9759
  {
9640
9760
  $width: `${Math.min(progress, 100)}%`,
9641
9761
  $height: "100%",
9642
- $background: barColorMap[color],
9762
+ $backgroundColor: barColorMap[color],
9643
9763
  $borderRadius: "9999px"
9644
9764
  }
9645
9765
  )
@@ -9658,10 +9778,10 @@ var ProgressBar = ({
9658
9778
  };
9659
9779
 
9660
9780
  // src/components/elements/plan-manager/CheckoutDialog.tsx
9661
- import { useMemo as useMemo2, useState as useState5 } from "react";
9781
+ import { useEffect as useEffect4, useMemo as useMemo5, useState as useState3 } from "react";
9662
9782
 
9663
9783
  // src/components/elements/plan-manager/PaymentForm.tsx
9664
- import { useState as useState4 } from "react";
9784
+ import { useState as useState2 } from "react";
9665
9785
  import {
9666
9786
  LinkAuthenticationElement,
9667
9787
  PaymentElement
@@ -9702,7 +9822,7 @@ var StyledButton = dt(Button2)`
9702
9822
  if (disabled) {
9703
9823
  const { l: l2 } = hexToHSL(theme.card.background);
9704
9824
  color = hslToHex({ h: 0, s: 0, l: l2 });
9705
- color = l2 > 50 ? darken(color, 7.5) : lighten(color, 7.5);
9825
+ color = l2 > 50 ? darken(color, 0.075) : lighten(color, 0.15);
9706
9826
  }
9707
9827
  return $variant === "filled" ? lt`
9708
9828
  background-color: ${color};
@@ -9725,8 +9845,8 @@ var StyledButton = dt(Button2)`
9725
9845
  &:not(:disabled):hover {
9726
9846
  ${({ $color = "primary", theme, $variant = "filled" }) => {
9727
9847
  const specified = theme[$color];
9728
- const lightened = lighten(specified, 15);
9729
- const color = specified === lightened ? darken(specified, 15) : lightened;
9848
+ const lightened = lighten(specified, 0.15);
9849
+ const color = specified === lightened ? darken(specified, 0.15) : lightened;
9730
9850
  const { l: l2 } = hexToHSL(theme[$color]);
9731
9851
  const textColor = l2 > 50 ? "#000000" : "#FFFFFF";
9732
9852
  return $variant === "filled" ? lt`
@@ -9748,21 +9868,21 @@ var StyledButton = dt(Button2)`
9748
9868
  switch ($size) {
9749
9869
  case "sm":
9750
9870
  return lt`
9751
- font-size: ${15 / 16}rem;
9752
- padding: ${12 / 16}rem 0;
9753
- border-radius: ${6 / 16}rem;
9871
+ font-size: ${15 / TEXT_BASE_SIZE}rem;
9872
+ padding: ${12 / TEXT_BASE_SIZE}rem 0;
9873
+ border-radius: ${6 / TEXT_BASE_SIZE}rem;
9754
9874
  `;
9755
9875
  case "md":
9756
9876
  return lt`
9757
- font-size: ${17 / 16}rem;
9758
- padding: ${16 / 16}rem 0;
9759
- border-radius: ${8 / 16}rem;
9877
+ font-size: ${17 / TEXT_BASE_SIZE}rem;
9878
+ padding: ${16 / TEXT_BASE_SIZE}rem 0;
9879
+ border-radius: ${8 / TEXT_BASE_SIZE}rem;
9760
9880
  `;
9761
9881
  case "lg":
9762
9882
  return lt`
9763
- font-size: ${19 / 16}rem;
9764
- padding: ${20 / 16}rem 0;
9765
- border-radius: ${10 / 16}rem;
9883
+ font-size: ${19 / TEXT_BASE_SIZE}rem;
9884
+ padding: ${20 / TEXT_BASE_SIZE}rem 0;
9885
+ border-radius: ${10 / TEXT_BASE_SIZE}rem;
9766
9886
  `;
9767
9887
  }
9768
9888
  }}
@@ -9774,9 +9894,9 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9774
9894
  const stripe = useStripe();
9775
9895
  const elements = useElements();
9776
9896
  const { api, data } = useEmbed();
9777
- const [message, setMessage] = useState4(null);
9778
- const [isLoading, setIsLoading] = useState4(false);
9779
- const [isConfirmed, setIsConfirmed] = useState4(false);
9897
+ const [message, setMessage] = useState2(null);
9898
+ const [isLoading, setIsLoading] = useState2(false);
9899
+ const [isConfirmed, setIsConfirmed] = useState2(false);
9780
9900
  const handleSubmit = async (event) => {
9781
9901
  event.preventDefault();
9782
9902
  const priceId = period === "month" ? plan.monthlyPrice?.id : plan.yearlyPrice?.id;
@@ -9785,6 +9905,7 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9785
9905
  }
9786
9906
  setIsLoading(true);
9787
9907
  setIsConfirmed(false);
9908
+ setMessage(null);
9788
9909
  try {
9789
9910
  const { setupIntent, error } = await stripe.confirmSetup({
9790
9911
  elements,
@@ -9801,13 +9922,9 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9801
9922
  if (error?.type === "card_error" || error?.type === "validation_error") {
9802
9923
  setMessage(error.message);
9803
9924
  }
9804
- setIsLoading(false);
9805
9925
  } catch (error) {
9806
- if (error instanceof Error) {
9807
- setMessage(error.message);
9808
- } else {
9809
- setMessage("An unexpected error occured.");
9810
- }
9926
+ setMessage("A problem occurred while saving your payment method.");
9927
+ } finally {
9811
9928
  setIsLoading(false);
9812
9929
  }
9813
9930
  };
@@ -9830,8 +9947,8 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9830
9947
  {
9831
9948
  $flexDirection: "column",
9832
9949
  $gap: "1.5rem",
9833
- $marginBottom: "1.5rem",
9834
9950
  $width: "100%",
9951
+ $marginBottom: "1.5rem",
9835
9952
  children: /* @__PURE__ */ jsx9(
9836
9953
  LinkAuthenticationElement,
9837
9954
  {
@@ -9840,20 +9957,18 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9840
9957
  )
9841
9958
  }
9842
9959
  ),
9843
- /* @__PURE__ */ jsxs4(Flex, { $flexDirection: "column", $width: "100%", $flex: "1", $height: "100%", children: [
9844
- /* @__PURE__ */ jsx9(PaymentElement, { id: "payment-element" }),
9845
- message && /* @__PURE__ */ jsx9(Text, { id: "payment-message", children: message })
9846
- ] }),
9847
- /* @__PURE__ */ jsx9("div", { children: /* @__PURE__ */ jsx9(
9960
+ /* @__PURE__ */ jsx9(Box, { $marginBottom: "1.5rem", children: /* @__PURE__ */ jsx9(PaymentElement, { id: "payment-element" }) }),
9961
+ /* @__PURE__ */ jsx9(
9848
9962
  StyledButton,
9849
9963
  {
9850
9964
  id: "submit",
9851
9965
  disabled: isLoading || !stripe || !elements || !data.stripeEmbed?.publishableKey || !data.stripeEmbed?.setupIntentClientSecret || isConfirmed,
9852
9966
  $size: "md",
9853
9967
  $color: "primary",
9854
- children: /* @__PURE__ */ jsx9(Text, { id: "button-text", children: !isLoading ? "Loading" : "Save payment method" })
9968
+ children: /* @__PURE__ */ jsx9(Text, { id: "button-text", children: isLoading ? "Loading" : "Save payment method" })
9855
9969
  }
9856
- ) })
9970
+ ),
9971
+ message && /* @__PURE__ */ jsx9(Box, { $margin: "1rem 0", children: /* @__PURE__ */ jsx9(Text, { id: "payment-message", $size: 15, $weight: 500, $color: "#DB6669", children: message }) })
9857
9972
  ]
9858
9973
  }
9859
9974
  );
@@ -9862,23 +9977,24 @@ var PaymentForm = ({ plan, period, onConfirm }) => {
9862
9977
  // src/components/elements/plan-manager/CheckoutDialog.tsx
9863
9978
  import { Fragment, jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
9864
9979
  var CheckoutDialog = () => {
9865
- const [checkoutStage, setCheckoutStage] = useState5(
9980
+ const [checkoutStage, setCheckoutStage] = useState3(
9866
9981
  "plan"
9867
9982
  );
9868
- const [planPeriod, setPlanPeriod] = useState5("month");
9869
- const [selectedPlan, setSelectedPlan] = useState5();
9870
- const [paymentMethodId, setPaymentMethodId] = useState5();
9871
- const [isLoading, setIsLoading] = useState5(false);
9872
- const [isCheckoutComplete, setIsCheckoutComplete] = useState5(false);
9983
+ const [planPeriod, setPlanPeriod] = useState3("month");
9984
+ const [selectedPlan, setSelectedPlan] = useState3();
9985
+ const [paymentMethodId, setPaymentMethodId] = useState3();
9986
+ const [isLoading, setIsLoading] = useState3(false);
9987
+ const [isCheckoutComplete, setIsCheckoutComplete] = useState3(false);
9988
+ const [error, setError] = useState3();
9873
9989
  const theme = nt();
9874
- const { api, data, settings } = useEmbed();
9875
- const { currentPlan, availablePlans } = useMemo2(() => {
9990
+ const { api, data, hydrate, setLayout } = useEmbed();
9991
+ const { currentPlan, availablePlans } = useMemo5(() => {
9876
9992
  return {
9877
9993
  currentPlan: data.company?.plan,
9878
9994
  availablePlans: data.activePlans
9879
9995
  };
9880
9996
  }, [data.company, data.activePlans]);
9881
- const savingsPercentage = useMemo2(() => {
9997
+ const savingsPercentage = useMemo5(() => {
9882
9998
  if (selectedPlan) {
9883
9999
  const monthly = (selectedPlan?.monthlyPrice?.price || 0) * 12;
9884
10000
  const yearly = selectedPlan?.yearlyPrice?.price || 0;
@@ -9886,29 +10002,39 @@ var CheckoutDialog = () => {
9886
10002
  }
9887
10003
  return 0;
9888
10004
  }, [selectedPlan]);
9889
- return /* @__PURE__ */ jsxs5(Modal, { children: [
9890
- /* @__PURE__ */ jsx10(ModalHeader, { children: /* @__PURE__ */ jsx10(Flex, { $gap: "1rem", children: !isCheckoutComplete && /* @__PURE__ */ jsxs5(Fragment, { children: [
10005
+ const isLightBackground = useMemo5(() => {
10006
+ return hexToHSL(theme.card.background).l > 50;
10007
+ }, [theme.card.background]);
10008
+ useEffect4(() => {
10009
+ if (isCheckoutComplete && api && data.component?.id) {
10010
+ hydrate();
10011
+ }
10012
+ }, [isCheckoutComplete, api, data.component?.id, hydrate]);
10013
+ return /* @__PURE__ */ jsxs5(Modal, { size: isCheckoutComplete ? "auto" : "lg", children: [
10014
+ /* @__PURE__ */ jsx10(ModalHeader, { bordered: !isCheckoutComplete, children: /* @__PURE__ */ jsx10(Flex, { $gap: "1rem", children: !isCheckoutComplete && /* @__PURE__ */ jsxs5(Fragment, { children: [
9891
10015
  /* @__PURE__ */ jsxs5(Flex, { $gap: "0.5rem", $alignItems: "center", children: [
9892
10016
  checkoutStage === "plan" ? /* @__PURE__ */ jsx10(
9893
10017
  Box,
9894
10018
  {
9895
- $width: "0.9375rem",
9896
- $height: "0.9375rem",
10019
+ $width: `${20 / TEXT_BASE_SIZE}rem`,
10020
+ $height: `${20 / TEXT_BASE_SIZE}rem`,
9897
10021
  $borderWidth: "2px",
9898
10022
  $borderStyle: "solid",
9899
- $borderColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 12.5) : lighten(theme.card.background, 12.5),
10023
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.125)" : "hsla(0, 0%, 100%, 0.25)",
9900
10024
  $borderRadius: "9999px"
9901
10025
  }
9902
10026
  ) : /* @__PURE__ */ jsx10(
9903
10027
  IconRound,
9904
10028
  {
9905
10029
  name: "check",
10030
+ colors: [
10031
+ theme.card.background,
10032
+ isLightBackground ? "hsla(0, 0%, 0%, 0.125)" : "hsla(0, 0%, 100%, 0.25)"
10033
+ ],
9906
10034
  style: {
9907
- color: theme.card.background,
9908
- backgroundColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 12.5) : lighten(theme.card.background, 12.5),
9909
- fontSize: 16,
9910
- width: "1rem",
9911
- height: "1rem"
10035
+ fontSize: `${16 / TEXT_BASE_SIZE}rem`,
10036
+ width: `${20 / TEXT_BASE_SIZE}rem`,
10037
+ height: `${20 / TEXT_BASE_SIZE}rem`
9912
10038
  }
9913
10039
  }
9914
10040
  ),
@@ -9916,39 +10042,43 @@ var CheckoutDialog = () => {
9916
10042
  Box,
9917
10043
  {
9918
10044
  tabIndex: 0,
9919
- ...checkoutStage === "plan" ? {
9920
- style: {
9921
- fontWeight: "700"
9922
- }
9923
- } : {
9924
- style: {
9925
- cursor: "pointer"
9926
- },
9927
- onClick: () => setCheckoutStage("plan")
10045
+ ...checkoutStage !== "plan" && {
10046
+ onClick: () => setCheckoutStage("plan"),
10047
+ $opacity: "0.6375",
10048
+ $cursor: "pointer"
9928
10049
  },
9929
- children: /* @__PURE__ */ jsx10(Text, { children: "1. Select plan" })
9930
- }
9931
- ),
9932
- /* @__PURE__ */ jsx10(
9933
- Icon2,
9934
- {
9935
- name: "chevron-right",
9936
- style: {
9937
- fontSize: 16,
9938
- color: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 17.5) : lighten(theme.card.background, 17.5)
9939
- }
10050
+ children: /* @__PURE__ */ jsx10(
10051
+ Text,
10052
+ {
10053
+ $font: theme.typography.text.fontFamily,
10054
+ $size: 19,
10055
+ $weight: checkoutStage === "plan" ? 600 : 400,
10056
+ $color: theme.typography.text.color,
10057
+ children: "1. Select plan"
10058
+ }
10059
+ )
9940
10060
  }
9941
10061
  )
9942
10062
  ] }),
10063
+ /* @__PURE__ */ jsx10(
10064
+ Icon2,
10065
+ {
10066
+ name: "chevron-right",
10067
+ style: {
10068
+ fontSize: 16,
10069
+ color: isLightBackground ? "hsla(0, 0%, 0%, 0.175)" : "hsla(0, 0%, 100%, 0.35)"
10070
+ }
10071
+ }
10072
+ ),
9943
10073
  /* @__PURE__ */ jsxs5(Flex, { $gap: "0.5rem", $alignItems: "center", children: [
9944
10074
  /* @__PURE__ */ jsx10(
9945
10075
  Box,
9946
10076
  {
9947
- $width: "0.9375rem",
9948
- $height: "0.9375rem",
10077
+ $width: `${20 / TEXT_BASE_SIZE}rem`,
10078
+ $height: `${20 / TEXT_BASE_SIZE}rem`,
9949
10079
  $borderWidth: "2px",
9950
10080
  $borderStyle: "solid",
9951
- $borderColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 12.5) : lighten(theme.card.background, 12.5),
10081
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.125)" : "hsla(0, 0%, 100%, 0.25)",
9952
10082
  $borderRadius: "9999px"
9953
10083
  }
9954
10084
  ),
@@ -9956,41 +10086,70 @@ var CheckoutDialog = () => {
9956
10086
  Box,
9957
10087
  {
9958
10088
  tabIndex: 0,
9959
- ...checkoutStage === "checkout" && {
9960
- style: {
9961
- fontWeight: "700"
9962
- }
10089
+ ...checkoutStage !== "checkout" && {
10090
+ $opacity: "0.6375"
9963
10091
  },
9964
- children: /* @__PURE__ */ jsx10(Text, { children: "2. Checkout" })
10092
+ children: /* @__PURE__ */ jsx10(
10093
+ Text,
10094
+ {
10095
+ $font: theme.typography.text.fontFamily,
10096
+ $size: 19,
10097
+ $weight: checkoutStage === "plan" ? 600 : 400,
10098
+ $color: theme.typography.text.color,
10099
+ children: "2. Checkout"
10100
+ }
10101
+ )
9965
10102
  }
9966
10103
  )
9967
10104
  ] })
9968
10105
  ] }) }) }),
9969
- isCheckoutComplete && /* @__PURE__ */ jsx10(Flex, { $justifyContent: "center", $alignItems: "center", $flexGrow: "1", children: /* @__PURE__ */ jsx10(
9970
- Text,
10106
+ isCheckoutComplete && /* @__PURE__ */ jsxs5(
10107
+ Flex,
9971
10108
  {
9972
- as: "h1",
9973
- $font: theme.typography.heading1.fontFamily,
9974
- $size: theme.typography.heading1.fontSize,
9975
- $weight: theme.typography.heading1.fontWeight,
9976
- $color: theme.typography.heading1.color,
9977
- children: "Subscription updated!"
10109
+ $flexDirection: "column",
10110
+ $justifyContent: "center",
10111
+ $alignItems: "center",
10112
+ $flexGrow: "1",
10113
+ $gap: `${32 / TEXT_BASE_SIZE}rem`,
10114
+ $padding: `${32 / TEXT_BASE_SIZE}rem ${40 / TEXT_BASE_SIZE}rem`,
10115
+ $whiteSpace: "nowrap",
10116
+ children: [
10117
+ /* @__PURE__ */ jsx10(
10118
+ IconRound,
10119
+ {
10120
+ name: "check",
10121
+ size: "3xl",
10122
+ colors: [
10123
+ theme.card.background,
10124
+ isLightBackground ? "hsla(0, 0%, 0%, 0.125)" : "hsla(0, 0%, 100%, 0.125)"
10125
+ ]
10126
+ }
10127
+ ),
10128
+ /* @__PURE__ */ jsx10(
10129
+ Text,
10130
+ {
10131
+ as: "h1",
10132
+ $font: theme.typography.heading1.fontFamily,
10133
+ $size: theme.typography.heading1.fontSize,
10134
+ $weight: theme.typography.heading1.fontWeight,
10135
+ $color: theme.typography.heading1.color,
10136
+ children: "Subscription updated!"
10137
+ }
10138
+ ),
10139
+ /* @__PURE__ */ jsx10(StyledButton, { onClick: () => setLayout("portal"), children: "Close" })
10140
+ ]
9978
10141
  }
9979
- ) }),
9980
- !isCheckoutComplete && /* @__PURE__ */ jsxs5(Flex, { $position: "relative", $flexGrow: "1", children: [
10142
+ ),
10143
+ !isCheckoutComplete && /* @__PURE__ */ jsxs5(Flex, { $position: "relative", $height: "calc(100% - 5rem)", children: [
9981
10144
  /* @__PURE__ */ jsxs5(
9982
10145
  Flex,
9983
10146
  {
9984
- $position: "absolute",
9985
- $top: "0",
9986
- $left: "0",
9987
10147
  $flexDirection: "column",
10148
+ $flexGrow: "1",
9988
10149
  $gap: "1rem",
9989
10150
  $padding: "2rem 2.5rem 2rem 2.5rem",
9990
- $backgroundColor: darken(settings.theme.card.background, 2.5),
10151
+ $backgroundColor: isLightBackground ? "hsla(0, 0%, 0%, 0.025)" : "hsla(0, 0%, 100%, 0.025)",
9991
10152
  $flex: "1",
9992
- $width: "72.5%",
9993
- $height: "100%",
9994
10153
  $overflow: "auto",
9995
10154
  children: [
9996
10155
  checkoutStage === "plan" && /* @__PURE__ */ jsxs5(Fragment, { children: [
@@ -9998,9 +10157,12 @@ var CheckoutDialog = () => {
9998
10157
  /* @__PURE__ */ jsx10(
9999
10158
  Text,
10000
10159
  {
10001
- as: "h1",
10160
+ as: "h3",
10002
10161
  id: "select-plan-dialog-label",
10003
- $size: 18,
10162
+ $font: theme.typography.heading3.fontFamily,
10163
+ $size: theme.typography.heading3.fontSize,
10164
+ $weight: theme.typography.heading3.fontWeight,
10165
+ $color: theme.typography.heading3.color,
10004
10166
  $marginBottom: "0.5rem",
10005
10167
  children: "Select plan"
10006
10168
  }
@@ -10010,25 +10172,28 @@ var CheckoutDialog = () => {
10010
10172
  {
10011
10173
  as: "p",
10012
10174
  id: "select-plan-dialog-description",
10013
- $size: 14,
10014
- $weight: 400,
10175
+ $font: theme.typography.text.fontFamily,
10176
+ $size: theme.typography.text.fontSize,
10177
+ $weight: theme.typography.text.fontWeight,
10178
+ $color: theme.typography.text.color,
10015
10179
  children: "Choose your base plan"
10016
10180
  }
10017
10181
  )
10018
10182
  ] }),
10019
- /* @__PURE__ */ jsx10(Flex, { $gap: "1rem", $flexGrow: "1", children: availablePlans?.map((plan) => {
10183
+ /* @__PURE__ */ jsx10(Flex, { $flexWrap: "wrap", $gap: "1rem", $flexGrow: "1", children: availablePlans?.map((plan) => {
10020
10184
  return /* @__PURE__ */ jsxs5(
10021
10185
  Flex,
10022
10186
  {
10023
- $height: "100%",
10024
10187
  $flexDirection: "column",
10025
- $backgroundColor: settings.theme.card.background,
10026
- $flex: "1",
10188
+ $width: "100%",
10189
+ $minWidth: "280px",
10190
+ $maxWidth: `calc(${100 / 3}% - 1rem)`,
10191
+ $backgroundColor: theme.card.background,
10027
10192
  $outlineWidth: "2px",
10028
10193
  $outlineStyle: "solid",
10029
10194
  $outlineColor: plan.id === selectedPlan?.id ? theme.primary : "transparent",
10030
- $borderRadius: `${settings.theme.card.borderRadius / 16}rem`,
10031
- ...settings.theme.card.hasShadow && {
10195
+ $borderRadius: `${theme.card.borderRadius / TEXT_BASE_SIZE}rem`,
10196
+ ...theme.card.hasShadow && {
10032
10197
  $boxShadow: "0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 20px rgba(16, 24, 40, 0.06)"
10033
10198
  },
10034
10199
  children: [
@@ -10040,10 +10205,10 @@ var CheckoutDialog = () => {
10040
10205
  $gap: "1rem",
10041
10206
  $width: "100%",
10042
10207
  $height: "auto",
10043
- $padding: `${settings.theme.card.padding / 16}rem`,
10208
+ $padding: `${theme.card.padding / TEXT_BASE_SIZE}rem`,
10044
10209
  $borderBottomWidth: "1px",
10045
10210
  $borderStyle: "solid",
10046
- $borderColor: hexToHSL(theme.card.background).l > 50 ? darken(theme.card.background, 17.5) : lighten(theme.card.background, 17.5),
10211
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.175)" : "hsla(0, 0%, 100%, 0.175)",
10047
10212
  children: [
10048
10213
  /* @__PURE__ */ jsx10(Text, { $size: 20, $weight: 600, children: plan.name }),
10049
10214
  /* @__PURE__ */ jsx10(Text, { $size: 14, children: plan.description }),
@@ -10096,8 +10261,8 @@ var CheckoutDialog = () => {
10096
10261
  name: feature.icon,
10097
10262
  size: "tn",
10098
10263
  colors: [
10099
- settings.theme.primary,
10100
- `${hexToHSL(settings.theme.card.background).l > 50 ? darken(settings.theme.card.background, 10) : lighten(settings.theme.card.background, 20)}`
10264
+ theme.primary,
10265
+ isLightBackground ? "hsla(0, 0%, 0%, 0.0625)" : "hsla(0, 0%, 100%, 0.0625)"
10101
10266
  ]
10102
10267
  }
10103
10268
  ),
@@ -10142,10 +10307,8 @@ var CheckoutDialog = () => {
10142
10307
  /* @__PURE__ */ jsx10(
10143
10308
  Text,
10144
10309
  {
10145
- style: {
10146
- color: hexToHSL(theme.card.background).l > 50 ? "#000000" : "#FFFFFF",
10147
- lineHeight: "1.4"
10148
- },
10310
+ $lineHeight: "1.4",
10311
+ $color: theme.typography.text.color,
10149
10312
  children: "Selected"
10150
10313
  }
10151
10314
  )
@@ -10156,12 +10319,12 @@ var CheckoutDialog = () => {
10156
10319
  StyledButton,
10157
10320
  {
10158
10321
  disabled: plan.valid === false,
10322
+ ...plan.valid === true && {
10323
+ onClick: () => setSelectedPlan(plan)
10324
+ },
10159
10325
  $size: "sm",
10160
10326
  $color: "primary",
10161
10327
  $variant: "outline",
10162
- onClick: () => {
10163
- setSelectedPlan(plan);
10164
- },
10165
10328
  children: "Select"
10166
10329
  }
10167
10330
  )
@@ -10190,14 +10353,10 @@ var CheckoutDialog = () => {
10190
10353
  /* @__PURE__ */ jsxs5(
10191
10354
  Flex,
10192
10355
  {
10193
- $position: "absolute",
10194
- $top: "0",
10195
- $right: "0",
10196
10356
  $flexDirection: "column",
10197
- $background: settings.theme.card.background,
10357
+ $backgroundColor: theme.card.background,
10198
10358
  $borderRadius: "0 0 0.5rem",
10199
- $width: "27.5%",
10200
- $height: "100%",
10359
+ $width: "21.5rem",
10201
10360
  $boxShadow: "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A;",
10202
10361
  children: [
10203
10362
  /* @__PURE__ */ jsxs5(
@@ -10209,13 +10368,27 @@ var CheckoutDialog = () => {
10209
10368
  $width: "100%",
10210
10369
  $height: "auto",
10211
10370
  $padding: "1.5rem",
10212
- $borderBottom: "1px solid #DEDEDE",
10371
+ $borderBottomWidth: "1px",
10372
+ $borderStyle: "solid",
10373
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.1)" : "hsla(0, 0%, 100%, 0.2)",
10213
10374
  children: [
10214
- /* @__PURE__ */ jsx10(Flex, { $justifyContent: "space-between", children: /* @__PURE__ */ jsx10(Text, { $size: 20, $weight: 600, children: "Subscription" }) }),
10375
+ /* @__PURE__ */ jsx10(Flex, { $justifyContent: "space-between", children: /* @__PURE__ */ jsx10(
10376
+ Text,
10377
+ {
10378
+ as: "h3",
10379
+ $font: theme.typography.heading3.fontFamily,
10380
+ $size: theme.typography.heading3.fontSize,
10381
+ $weight: theme.typography.heading3.fontWeight,
10382
+ $color: theme.typography.heading3.color,
10383
+ children: "Subscription"
10384
+ }
10385
+ ) }),
10215
10386
  /* @__PURE__ */ jsxs5(
10216
10387
  Flex,
10217
10388
  {
10218
- $border: "1px solid #D9D9D9",
10389
+ $borderWidth: "1px",
10390
+ $borderStyle: "solid",
10391
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.1)" : "hsla(0, 0%, 100%, 0.2)",
10219
10392
  $borderRadius: "2.5rem",
10220
10393
  $cursor: "pointer",
10221
10394
  children: [
@@ -10227,9 +10400,20 @@ var CheckoutDialog = () => {
10227
10400
  $alignItems: "center",
10228
10401
  $padding: "0.25rem 0.5rem",
10229
10402
  $flex: "1",
10230
- $backgroundColor: planPeriod === "month" ? darken(settings.theme.card.background, 8) : lighten(settings.theme.card.background, 2),
10403
+ ...planPeriod === "month" && {
10404
+ $backgroundColor: isLightBackground ? "hsla(0, 0%, 0%, 0.075)" : "hsla(0, 0%, 100%, 0.15)"
10405
+ },
10231
10406
  $borderRadius: "2.5rem",
10232
- children: /* @__PURE__ */ jsx10(Text, { $size: 12, $weight: planPeriod === "month" ? 600 : 400, children: "Billed monthly" })
10407
+ children: /* @__PURE__ */ jsx10(
10408
+ Text,
10409
+ {
10410
+ $font: theme.typography.text.fontFamily,
10411
+ $size: 14,
10412
+ $weight: planPeriod === "month" ? 600 : 400,
10413
+ $color: theme.typography.text.color,
10414
+ children: "Billed monthly"
10415
+ }
10416
+ )
10233
10417
  }
10234
10418
  ),
10235
10419
  /* @__PURE__ */ jsx10(
@@ -10240,15 +10424,35 @@ var CheckoutDialog = () => {
10240
10424
  $alignItems: "center",
10241
10425
  $padding: "0.25rem 0.5rem",
10242
10426
  $flex: "1",
10243
- $backgroundColor: planPeriod === "year" ? darken(settings.theme.card.background, 8) : lighten(settings.theme.card.background, 2),
10427
+ ...planPeriod === "year" && {
10428
+ $backgroundColor: isLightBackground ? "hsla(0, 0%, 0%, 0.075)" : "hsla(0, 0%, 100%, 0.15)"
10429
+ },
10244
10430
  $borderRadius: "2.5rem",
10245
- children: /* @__PURE__ */ jsx10(Text, { $size: 12, $weight: planPeriod === "year" ? 600 : 400, children: "Billed yearly" })
10431
+ children: /* @__PURE__ */ jsx10(
10432
+ Text,
10433
+ {
10434
+ $font: theme.typography.text.fontFamily,
10435
+ $size: 14,
10436
+ $weight: planPeriod === "year" ? 600 : 400,
10437
+ $color: theme.typography.text.color,
10438
+ children: "Billed yearly"
10439
+ }
10440
+ )
10246
10441
  }
10247
10442
  )
10248
10443
  ]
10249
10444
  }
10250
10445
  ),
10251
- savingsPercentage > 0 && /* @__PURE__ */ jsx10(Box, { children: /* @__PURE__ */ jsx10(Text, { $size: 11, $color: "#194BFB", children: planPeriod === "month" ? `Save up to ${savingsPercentage}% with yearly billing` : `You are saving ${savingsPercentage}% with yearly billing` }) })
10446
+ savingsPercentage > 0 && /* @__PURE__ */ jsx10(Box, { children: /* @__PURE__ */ jsx10(
10447
+ Text,
10448
+ {
10449
+ $font: theme.typography.text.fontFamily,
10450
+ $size: 11,
10451
+ $weight: theme.typography.text.fontWeight,
10452
+ $color: theme.primary,
10453
+ children: planPeriod === "month" ? `Save up to ${savingsPercentage}% with yearly billing` : `You are saving ${savingsPercentage}% with yearly billing`
10454
+ }
10455
+ ) })
10252
10456
  ]
10253
10457
  }
10254
10458
  ),
@@ -10262,85 +10466,106 @@ var CheckoutDialog = () => {
10262
10466
  $height: "auto",
10263
10467
  $padding: "1.5rem",
10264
10468
  $flex: "1",
10265
- $borderBottom: "1px solid #DEDEDE",
10469
+ $borderBottomWidth: "1px",
10470
+ $borderStyle: "solid",
10471
+ $borderColor: isLightBackground ? "hsla(0, 0%, 0%, 0.1)" : "hsla(0, 0%, 100%, 0.2)",
10266
10472
  children: [
10267
- /* @__PURE__ */ jsx10(Box, { children: /* @__PURE__ */ jsx10(Text, { $size: 14, $color: "#5D5D5D", children: "Plan" }) }),
10268
- /* @__PURE__ */ jsxs5(
10269
- Flex,
10473
+ /* @__PURE__ */ jsx10(Box, { $opacity: "0.625", children: /* @__PURE__ */ jsx10(
10474
+ Text,
10270
10475
  {
10271
- $flexDirection: "column",
10272
- $fontSize: "0.875rem",
10273
- $color: "#5D5D5D",
10274
- $gap: "0.5rem",
10275
- children: [
10276
- currentPlan && /* @__PURE__ */ jsxs5(
10277
- Flex,
10278
- {
10279
- $alignItems: "center",
10280
- $justifyContent: "space-between",
10281
- $fontSize: "0.875rem",
10282
- $color: "#5D5D5D",
10283
- children: [
10284
- /* @__PURE__ */ jsx10(Flex, { $fontSize: "0.875rem", $color: "#5D5D5D", children: currentPlan.name }),
10285
- typeof currentPlan.planPrice === "number" && currentPlan.planPeriod && /* @__PURE__ */ jsxs5(Flex, { $fontSize: "0.75rem", $color: "#000000", children: [
10286
- formatCurrency(currentPlan.planPrice),
10287
- "/",
10288
- currentPlan.planPeriod
10289
- ] })
10290
- ]
10291
- }
10292
- ),
10293
- selectedPlan && /* @__PURE__ */ jsxs5(Fragment, { children: [
10294
- /* @__PURE__ */ jsx10(
10295
- Box,
10476
+ $font: theme.typography.text.fontFamily,
10477
+ $size: 14,
10478
+ $weight: theme.typography.text.fontWeight,
10479
+ $color: theme.typography.text.color,
10480
+ children: "Plan"
10481
+ }
10482
+ ) }),
10483
+ /* @__PURE__ */ jsxs5(Flex, { $flexDirection: "column", $gap: "0.5rem", children: [
10484
+ currentPlan && /* @__PURE__ */ jsxs5(Flex, { $justifyContent: "space-between", $alignItems: "center", children: [
10485
+ /* @__PURE__ */ jsx10(
10486
+ Flex,
10487
+ {
10488
+ ...selectedPlan && {
10489
+ $opacity: "0.625",
10490
+ $textDecoration: "line-through"
10491
+ },
10492
+ children: /* @__PURE__ */ jsx10(
10493
+ Text,
10296
10494
  {
10297
- $width: "100%",
10298
- $textAlign: "left",
10299
- $opacity: "50%",
10300
- $marginBottom: "-0.25rem",
10301
- $marginTop: "-0.25rem",
10302
- children: /* @__PURE__ */ jsx10(
10303
- Icon2,
10304
- {
10305
- name: "arrow-down",
10306
- style: {
10307
- display: "inline-block"
10308
- }
10309
- }
10310
- )
10495
+ $font: theme.typography.heading4.fontFamily,
10496
+ $size: theme.typography.heading4.fontSize,
10497
+ $weight: theme.typography.heading4.fontWeight,
10498
+ $color: theme.typography.heading4.color,
10499
+ children: currentPlan.name
10311
10500
  }
10312
- ),
10313
- /* @__PURE__ */ jsxs5(
10314
- Flex,
10501
+ )
10502
+ }
10503
+ ),
10504
+ typeof currentPlan.planPrice === "number" && currentPlan.planPeriod && /* @__PURE__ */ jsx10(Flex, { children: /* @__PURE__ */ jsxs5(
10505
+ Text,
10506
+ {
10507
+ $font: theme.typography.text.fontFamily,
10508
+ $size: theme.typography.text.fontSize,
10509
+ $weight: theme.typography.text.fontWeight,
10510
+ $color: theme.typography.text.color,
10511
+ children: [
10512
+ formatCurrency(currentPlan.planPrice),
10513
+ "/",
10514
+ currentPlan.planPeriod
10515
+ ]
10516
+ }
10517
+ ) })
10518
+ ] }),
10519
+ selectedPlan && /* @__PURE__ */ jsxs5(Fragment, { children: [
10520
+ /* @__PURE__ */ jsx10(
10521
+ Box,
10522
+ {
10523
+ $width: "100%",
10524
+ $textAlign: "left",
10525
+ $opacity: "50%",
10526
+ $marginBottom: "-0.25rem",
10527
+ $marginTop: "-0.25rem",
10528
+ children: /* @__PURE__ */ jsx10(
10529
+ Icon2,
10315
10530
  {
10316
- $alignItems: "center",
10317
- $justifyContent: "space-between",
10318
- $fontSize: "0.875rem",
10319
- $color: "#5D5D5D",
10320
- children: [
10321
- /* @__PURE__ */ jsx10(
10322
- Flex,
10323
- {
10324
- $fontSize: "0.875rem",
10325
- $color: "#000000",
10326
- $fontWeight: "600",
10327
- children: selectedPlan.name
10328
- }
10329
- ),
10330
- /* @__PURE__ */ jsxs5(Flex, { $fontSize: "0.75rem", $color: "#000000", children: [
10331
- formatCurrency(
10332
- (planPeriod === "month" ? selectedPlan.monthlyPrice : selectedPlan.yearlyPrice)?.price ?? 0
10333
- ),
10334
- "/",
10335
- planPeriod
10336
- ] })
10337
- ]
10531
+ name: "arrow-down",
10532
+ style: {
10533
+ display: "inline-block"
10534
+ }
10338
10535
  }
10339
10536
  )
10340
- ] })
10341
- ]
10342
- }
10343
- )
10537
+ }
10538
+ ),
10539
+ /* @__PURE__ */ jsxs5(Flex, { $justifyContent: "space-between", $alignItems: "center", children: [
10540
+ /* @__PURE__ */ jsx10(Flex, { children: /* @__PURE__ */ jsx10(
10541
+ Text,
10542
+ {
10543
+ $font: theme.typography.heading4.fontFamily,
10544
+ $size: theme.typography.heading4.fontSize,
10545
+ $weight: theme.typography.heading4.fontWeight,
10546
+ $color: theme.typography.heading4.color,
10547
+ children: selectedPlan.name
10548
+ }
10549
+ ) }),
10550
+ /* @__PURE__ */ jsx10(Flex, { children: /* @__PURE__ */ jsxs5(
10551
+ Text,
10552
+ {
10553
+ $font: theme.typography.text.fontFamily,
10554
+ $size: theme.typography.text.fontSize,
10555
+ $weight: theme.typography.text.fontWeight,
10556
+ $color: theme.typography.text.color,
10557
+ children: [
10558
+ formatCurrency(
10559
+ (planPeriod === "month" ? selectedPlan.monthlyPrice : selectedPlan.yearlyPrice)?.price ?? 0
10560
+ ),
10561
+ "/",
10562
+ planPeriod
10563
+ ]
10564
+ }
10565
+ ) })
10566
+ ] })
10567
+ ] })
10568
+ ] })
10344
10569
  ]
10345
10570
  }
10346
10571
  ),
@@ -10349,47 +10574,57 @@ var CheckoutDialog = () => {
10349
10574
  {
10350
10575
  $flexDirection: "column",
10351
10576
  $position: "relative",
10352
- $gap: "0.75rem",
10577
+ $gap: "1rem",
10353
10578
  $width: "100%",
10354
10579
  $height: "auto",
10355
10580
  $padding: "1.5rem",
10356
10581
  children: [
10357
- selectedPlan && /* @__PURE__ */ jsxs5(
10358
- Flex,
10359
- {
10360
- $fontSize: "0.75rem",
10361
- $color: "#5D5D5D",
10362
- $justifyContent: "space-between",
10363
- children: [
10364
- /* @__PURE__ */ jsxs5(Box, { $fontSize: "0.75rem", $color: "#5D5D5D", children: [
10582
+ selectedPlan && /* @__PURE__ */ jsxs5(Flex, { $justifyContent: "space-between", children: [
10583
+ /* @__PURE__ */ jsx10(Box, { $opacity: "0.625", children: /* @__PURE__ */ jsxs5(
10584
+ Text,
10585
+ {
10586
+ $font: theme.typography.text.fontFamily,
10587
+ $size: theme.typography.text.fontSize,
10588
+ $weight: theme.typography.text.fontWeight,
10589
+ $color: theme.typography.text.color,
10590
+ children: [
10365
10591
  planPeriod === "month" ? "Monthly" : "Yearly",
10366
10592
  " total:",
10367
10593
  " "
10368
- ] }),
10369
- /* @__PURE__ */ jsxs5(Box, { $fontSize: "0.75rem", $color: "#000000", children: [
10594
+ ]
10595
+ }
10596
+ ) }),
10597
+ /* @__PURE__ */ jsx10(Box, { children: /* @__PURE__ */ jsxs5(
10598
+ Text,
10599
+ {
10600
+ $font: theme.typography.text.fontFamily,
10601
+ $size: theme.typography.text.fontSize,
10602
+ $weight: theme.typography.text.fontWeight,
10603
+ $color: theme.typography.text.color,
10604
+ children: [
10370
10605
  formatCurrency(
10371
10606
  (planPeriod === "month" ? selectedPlan.monthlyPrice : selectedPlan.yearlyPrice)?.price ?? 0
10372
10607
  ),
10373
10608
  "/",
10374
10609
  planPeriod
10375
- ] })
10376
- ]
10377
- }
10378
- ),
10610
+ ]
10611
+ }
10612
+ ) })
10613
+ ] }),
10379
10614
  checkoutStage === "plan" ? /* @__PURE__ */ jsx10(
10380
10615
  StyledButton,
10381
10616
  {
10382
10617
  disabled: !selectedPlan,
10383
- onClick: () => {
10384
- setCheckoutStage("checkout");
10618
+ ...selectedPlan && {
10619
+ onClick: () => setCheckoutStage("checkout")
10385
10620
  },
10386
10621
  $size: "sm",
10387
10622
  children: /* @__PURE__ */ jsxs5(
10388
10623
  Flex,
10389
10624
  {
10390
10625
  $gap: "0.5rem",
10391
- $alignItems: "center",
10392
10626
  $justifyContent: "center",
10627
+ $alignItems: "center",
10393
10628
  $padding: "0 1rem",
10394
10629
  children: [
10395
10630
  /* @__PURE__ */ jsx10(Text, { $align: "left", children: "Next: Checkout" }),
@@ -10418,10 +10653,11 @@ var CheckoutDialog = () => {
10418
10653
  }
10419
10654
  });
10420
10655
  setIsCheckoutComplete(true);
10421
- } catch (error) {
10422
- console.error(error);
10656
+ } catch {
10657
+ setError(
10658
+ "Error processing payment. Please try a different payment method."
10659
+ );
10423
10660
  } finally {
10424
- setIsCheckoutComplete(true);
10425
10661
  setIsLoading(false);
10426
10662
  }
10427
10663
  },
@@ -10429,7 +10665,26 @@ var CheckoutDialog = () => {
10429
10665
  children: "Pay now"
10430
10666
  }
10431
10667
  ),
10432
- /* @__PURE__ */ jsx10(Box, { $fontSize: "0.75rem", $color: "#5D5D5D", children: "Discounts & credits applied at checkout" })
10668
+ /* @__PURE__ */ jsx10(Box, { $opacity: "0.625", children: /* @__PURE__ */ jsx10(
10669
+ Text,
10670
+ {
10671
+ $font: theme.typography.text.fontFamily,
10672
+ $size: theme.typography.text.fontSize,
10673
+ $weight: theme.typography.text.fontWeight,
10674
+ $color: theme.typography.text.color,
10675
+ children: "Discounts & credits applied at checkout"
10676
+ }
10677
+ ) }),
10678
+ error && /* @__PURE__ */ jsx10(Box, { children: /* @__PURE__ */ jsx10(
10679
+ Text,
10680
+ {
10681
+ $font: theme.typography.text.fontFamily,
10682
+ $size: theme.typography.text.fontSize,
10683
+ $weight: 500,
10684
+ $color: "#DB6669",
10685
+ children: error
10686
+ }
10687
+ ) })
10433
10688
  ]
10434
10689
  }
10435
10690
  )
@@ -10465,15 +10720,16 @@ var resolveDesignProps = (props) => {
10465
10720
  },
10466
10721
  callToAction: {
10467
10722
  isVisible: props.callToAction?.isVisible ?? true,
10468
- buttonSize: props.callToAction?.buttonSize ?? "md",
10723
+ buttonSize: props.callToAction?.buttonSize ?? "lg",
10469
10724
  buttonStyle: props.callToAction?.buttonStyle ?? "primary"
10470
10725
  }
10471
10726
  };
10472
10727
  };
10473
10728
  var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) => {
10474
10729
  const props = resolveDesignProps(rest);
10475
- const { data, settings, layout, stripe, setLayout } = useEmbed();
10476
- const { currentPlan, canChangePlan } = useMemo3(() => {
10730
+ const theme = nt();
10731
+ const { data, layout, stripe, setLayout } = useEmbed();
10732
+ const { currentPlan, canChangePlan } = useMemo6(() => {
10477
10733
  return {
10478
10734
  currentPlan: data.company?.plan,
10479
10735
  canChangePlan: stripe !== null
@@ -10498,10 +10754,10 @@ var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) =>
10498
10754
  /* @__PURE__ */ jsx11(Box, { $margin: "0 0 0.75rem", children: /* @__PURE__ */ jsx11(
10499
10755
  Text,
10500
10756
  {
10501
- $font: settings.theme.typography[props.header.title.fontStyle].fontFamily,
10502
- $size: settings.theme.typography[props.header.title.fontStyle].fontSize,
10503
- $weight: settings.theme.typography[props.header.title.fontStyle].fontWeight,
10504
- $color: settings.theme.typography[props.header.title.fontStyle].color,
10757
+ $font: theme.typography[props.header.title.fontStyle].fontFamily,
10758
+ $size: theme.typography[props.header.title.fontStyle].fontSize,
10759
+ $weight: theme.typography[props.header.title.fontStyle].fontWeight,
10760
+ $color: theme.typography[props.header.title.fontStyle].color,
10505
10761
  $lineHeight: 1,
10506
10762
  children: currentPlan.name
10507
10763
  }
@@ -10509,10 +10765,10 @@ var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) =>
10509
10765
  props.header.description.isVisible && currentPlan.description && /* @__PURE__ */ jsx11(
10510
10766
  Text,
10511
10767
  {
10512
- $font: settings.theme.typography[props.header.description.fontStyle].fontFamily,
10513
- $size: settings.theme.typography[props.header.description.fontStyle].fontSize,
10514
- $weight: settings.theme.typography[props.header.description.fontStyle].fontWeight,
10515
- $color: settings.theme.typography[props.header.description.fontStyle].color,
10768
+ $font: theme.typography[props.header.description.fontStyle].fontFamily,
10769
+ $size: theme.typography[props.header.description.fontStyle].fontSize,
10770
+ $weight: theme.typography[props.header.description.fontStyle].fontWeight,
10771
+ $color: theme.typography[props.header.description.fontStyle].color,
10516
10772
  children: currentPlan.description
10517
10773
  }
10518
10774
  )
@@ -10520,10 +10776,10 @@ var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) =>
10520
10776
  props.header.price.isVisible && typeof currentPlan.planPrice === "number" && currentPlan.planPeriod && /* @__PURE__ */ jsxs6(
10521
10777
  Text,
10522
10778
  {
10523
- $font: settings.theme.typography[props.header.price.fontStyle].fontFamily,
10524
- $size: settings.theme.typography[props.header.price.fontStyle].fontSize,
10525
- $weight: settings.theme.typography[props.header.price.fontStyle].fontWeight,
10526
- $color: settings.theme.typography[props.header.price.fontStyle].color,
10779
+ $font: theme.typography[props.header.price.fontStyle].fontFamily,
10780
+ $size: theme.typography[props.header.price.fontStyle].fontSize,
10781
+ $weight: theme.typography[props.header.price.fontStyle].fontWeight,
10782
+ $color: theme.typography[props.header.price.fontStyle].color,
10527
10783
  children: [
10528
10784
  formatCurrency(currentPlan.planPrice),
10529
10785
  "/",
@@ -10544,15 +10800,7 @@ var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) =>
10544
10800
  },
10545
10801
  $size: props.callToAction.buttonSize,
10546
10802
  $color: props.callToAction.buttonStyle,
10547
- children: /* @__PURE__ */ jsx11(
10548
- Text,
10549
- {
10550
- $font: settings.theme.typography.text.fontFamily,
10551
- $size: settings.theme.typography.text.fontSize,
10552
- $weight: settings.theme.typography.text.fontWeight,
10553
- children: "Change Plan"
10554
- }
10555
- )
10803
+ children: "Change Plan"
10556
10804
  }
10557
10805
  ),
10558
10806
  canChangePlan && layout === "checkout" && createPortal(/* @__PURE__ */ jsx11(CheckoutDialog, {}), portal || document.body)
@@ -10560,7 +10808,7 @@ var PlanManager = forwardRef(({ children, className, portal, ...rest }, ref) =>
10560
10808
  });
10561
10809
 
10562
10810
  // src/components/elements/included-features/IncludedFeatures.tsx
10563
- import { forwardRef as forwardRef2, useMemo as useMemo4 } from "react";
10811
+ import { forwardRef as forwardRef2, useMemo as useMemo7 } from "react";
10564
10812
  import { jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
10565
10813
  function resolveDesignProps2(props) {
10566
10814
  return {
@@ -10571,12 +10819,12 @@ function resolveDesignProps2(props) {
10571
10819
  },
10572
10820
  icons: {
10573
10821
  isVisible: props.icons?.isVisible ?? true,
10574
- fontStyle: props.icons?.fontStyle ?? "heading3",
10822
+ fontStyle: props.icons?.fontStyle ?? "heading5",
10575
10823
  style: props.icons?.style ?? "light"
10576
10824
  },
10577
10825
  entitlement: {
10578
10826
  isVisible: props.entitlement?.isVisible ?? true,
10579
- fontStyle: props.entitlement?.fontStyle ?? "heading5"
10827
+ fontStyle: props.entitlement?.fontStyle ?? "text"
10580
10828
  },
10581
10829
  usage: {
10582
10830
  isVisible: props.usage?.isVisible ?? true,
@@ -10586,8 +10834,9 @@ function resolveDesignProps2(props) {
10586
10834
  }
10587
10835
  var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10588
10836
  const props = resolveDesignProps2(rest);
10589
- const { data, settings } = useEmbed();
10590
- const features = useMemo4(() => {
10837
+ const theme = nt();
10838
+ const { data } = useEmbed();
10839
+ const features = useMemo7(() => {
10591
10840
  return (data.featureUsage?.features || []).map(
10592
10841
  ({
10593
10842
  access,
@@ -10614,14 +10863,17 @@ var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10614
10863
  }
10615
10864
  );
10616
10865
  }, [data.featureUsage]);
10866
+ const isLightBackground = useMemo7(() => {
10867
+ return hexToHSL(theme.card.background).l > 50;
10868
+ }, [theme.card.background]);
10617
10869
  return /* @__PURE__ */ jsxs7(Flex, { ref, className, $flexDirection: "column", $gap: "1.5rem", children: [
10618
10870
  props.header.isVisible && /* @__PURE__ */ jsx12(Box, { children: /* @__PURE__ */ jsx12(
10619
10871
  Text,
10620
10872
  {
10621
- $font: settings.theme.typography[props.header.fontStyle].fontFamily,
10622
- $size: settings.theme.typography[props.header.fontStyle].fontSize,
10623
- $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
10624
- $color: settings.theme.typography[props.header.fontStyle].color,
10873
+ $font: theme.typography[props.header.fontStyle].fontFamily,
10874
+ $size: theme.typography[props.header.fontStyle].fontSize,
10875
+ $weight: theme.typography[props.header.fontStyle].fontWeight,
10876
+ $color: theme.typography[props.header.fontStyle].color,
10625
10877
  children: props.header.text
10626
10878
  }
10627
10879
  ) }),
@@ -10647,18 +10899,18 @@ var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10647
10899
  name: feature.icon,
10648
10900
  size: "sm",
10649
10901
  colors: [
10650
- settings.theme.primary,
10651
- `${hexToHSL(settings.theme.card.background).l > 50 ? darken(settings.theme.card.background, 10) : lighten(settings.theme.card.background, 20)}`
10902
+ theme.primary,
10903
+ isLightBackground ? "hsla(0, 0%, 0%, 0.0625)" : "hsla(0, 0%, 100%, 0.25)"
10652
10904
  ]
10653
10905
  }
10654
10906
  ),
10655
10907
  feature?.name && /* @__PURE__ */ jsx12(Flex, { $alignItems: "center", children: /* @__PURE__ */ jsx12(
10656
10908
  Text,
10657
10909
  {
10658
- $font: settings.theme.typography[props.icons.fontStyle].fontFamily,
10659
- $size: settings.theme.typography[props.icons.fontStyle].fontSize,
10660
- $weight: settings.theme.typography[props.icons.fontStyle].fontWeight,
10661
- $color: settings.theme.typography[props.icons.fontStyle].color,
10910
+ $font: theme.typography[props.icons.fontStyle].fontFamily,
10911
+ $size: theme.typography[props.icons.fontStyle].fontSize,
10912
+ $weight: theme.typography[props.icons.fontStyle].fontWeight,
10913
+ $color: theme.typography[props.icons.fontStyle].color,
10662
10914
  children: feature.name
10663
10915
  }
10664
10916
  ) })
@@ -10668,10 +10920,11 @@ var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10668
10920
  Text,
10669
10921
  {
10670
10922
  as: Box,
10671
- $font: settings.theme.typography[props.entitlement.fontStyle].fontFamily,
10672
- $size: settings.theme.typography[props.entitlement.fontStyle].fontSize,
10673
- $weight: settings.theme.typography[props.entitlement.fontStyle].fontWeight,
10674
- $color: settings.theme.typography[props.entitlement.fontStyle].color,
10923
+ $font: theme.typography[props.entitlement.fontStyle].fontFamily,
10924
+ $size: theme.typography[props.entitlement.fontStyle].fontSize,
10925
+ $weight: theme.typography[props.entitlement.fontStyle].fontWeight,
10926
+ $lineHeight: 1.5,
10927
+ $color: theme.typography[props.entitlement.fontStyle].color,
10675
10928
  children: typeof allocation === "number" ? `${allocation} ${feature.name}` : `Unlimited ${feature.name}`
10676
10929
  }
10677
10930
  ),
@@ -10679,10 +10932,11 @@ var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10679
10932
  Text,
10680
10933
  {
10681
10934
  as: Box,
10682
- $font: settings.theme.typography[props.usage.fontStyle].fontFamily,
10683
- $size: settings.theme.typography[props.usage.fontStyle].fontSize,
10684
- $weight: settings.theme.typography[props.usage.fontStyle].fontWeight,
10685
- $color: settings.theme.typography[props.usage.fontStyle].color,
10935
+ $font: theme.typography[props.usage.fontStyle].fontFamily,
10936
+ $size: theme.typography[props.usage.fontStyle].fontSize,
10937
+ $weight: theme.typography[props.usage.fontStyle].fontWeight,
10938
+ $lineHeight: 1.5,
10939
+ $color: theme.typography[props.usage.fontStyle].color,
10686
10940
  children: typeof allocation === "number" ? `${usage} of ${allocation} used` : `${usage} used`
10687
10941
  }
10688
10942
  )
@@ -10699,7 +10953,7 @@ var IncludedFeatures = forwardRef2(({ className, ...rest }, ref) => {
10699
10953
  });
10700
10954
 
10701
10955
  // src/components/elements/metered-features/MeteredFeatures.tsx
10702
- import { forwardRef as forwardRef3, useMemo as useMemo5 } from "react";
10956
+ import { forwardRef as forwardRef3, useMemo as useMemo8 } from "react";
10703
10957
  import { jsx as jsx13, jsxs as jsxs8 } from "react/jsx-runtime";
10704
10958
  function resolveDesignProps3(props) {
10705
10959
  return {
@@ -10731,8 +10985,9 @@ function resolveDesignProps3(props) {
10731
10985
  }
10732
10986
  var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10733
10987
  const props = resolveDesignProps3(rest);
10734
- const { data, settings } = useEmbed();
10735
- const features = useMemo5(() => {
10988
+ const theme = nt();
10989
+ const { data } = useEmbed();
10990
+ const features = useMemo8(() => {
10736
10991
  return (data.featureUsage?.features || []).map(
10737
10992
  ({
10738
10993
  access,
@@ -10775,10 +11030,10 @@ var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10775
11030
  Text,
10776
11031
  {
10777
11032
  as: Box,
10778
- $font: settings.theme.typography[props.header.fontStyle].fontFamily,
10779
- $size: settings.theme.typography[props.header.fontStyle].fontSize,
10780
- $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
10781
- $color: settings.theme.typography[props.header.fontStyle].color,
11033
+ $font: theme.typography[props.header.fontStyle].fontFamily,
11034
+ $size: theme.typography[props.header.fontStyle].fontSize,
11035
+ $weight: theme.typography[props.header.fontStyle].fontWeight,
11036
+ $color: theme.typography[props.header.fontStyle].color,
10782
11037
  children: feature.name
10783
11038
  }
10784
11039
  ),
@@ -10786,10 +11041,10 @@ var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10786
11041
  Text,
10787
11042
  {
10788
11043
  as: Box,
10789
- $font: settings.theme.typography[props.description.fontStyle].fontFamily,
10790
- $size: settings.theme.typography[props.description.fontStyle].fontSize,
10791
- $weight: settings.theme.typography[props.description.fontStyle].fontWeight,
10792
- $color: settings.theme.typography[props.description.fontStyle].color,
11044
+ $font: theme.typography[props.description.fontStyle].fontFamily,
11045
+ $size: theme.typography[props.description.fontStyle].fontSize,
11046
+ $weight: theme.typography[props.description.fontStyle].fontWeight,
11047
+ $color: theme.typography[props.description.fontStyle].color,
10793
11048
  children: feature.description
10794
11049
  }
10795
11050
  )
@@ -10799,10 +11054,10 @@ var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10799
11054
  Text,
10800
11055
  {
10801
11056
  as: Box,
10802
- $font: settings.theme.typography[props.allocation.fontStyle].fontFamily,
10803
- $size: settings.theme.typography[props.allocation.fontStyle].fontSize,
10804
- $weight: settings.theme.typography[props.allocation.fontStyle].fontWeight,
10805
- $color: settings.theme.typography[props.allocation.fontStyle].color,
11057
+ $font: theme.typography[props.allocation.fontStyle].fontFamily,
11058
+ $size: theme.typography[props.allocation.fontStyle].fontSize,
11059
+ $weight: theme.typography[props.allocation.fontStyle].fontWeight,
11060
+ $color: theme.typography[props.allocation.fontStyle].color,
10806
11061
  children: typeof allocation === "number" ? `${allocation} ${feature.name}` : `Unlimited ${feature.name}`
10807
11062
  }
10808
11063
  ),
@@ -10810,10 +11065,10 @@ var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10810
11065
  Text,
10811
11066
  {
10812
11067
  as: Box,
10813
- $font: settings.theme.typography[props.usage.fontStyle].fontFamily,
10814
- $size: settings.theme.typography[props.usage.fontStyle].fontSize,
10815
- $weight: settings.theme.typography[props.usage.fontStyle].fontWeight,
10816
- $color: settings.theme.typography[props.usage.fontStyle].color,
11068
+ $font: theme.typography[props.usage.fontStyle].fontFamily,
11069
+ $size: theme.typography[props.usage.fontStyle].fontSize,
11070
+ $weight: theme.typography[props.usage.fontStyle].fontWeight,
11071
+ $color: theme.typography[props.usage.fontStyle].color,
10817
11072
  children: typeof allocation === "number" ? `${usage} of ${allocation} used` : `${usage} used`
10818
11073
  }
10819
11074
  )
@@ -10837,7 +11092,7 @@ var MeteredFeatures = forwardRef3(({ className, ...rest }, ref) => {
10837
11092
  });
10838
11093
 
10839
11094
  // src/components/elements/upcoming-bill/UpcomingBill.tsx
10840
- import { forwardRef as forwardRef4, useMemo as useMemo6 } from "react";
11095
+ import { forwardRef as forwardRef4, useMemo as useMemo9 } from "react";
10841
11096
  import { jsx as jsx14, jsxs as jsxs9 } from "react/jsx-runtime";
10842
11097
  function resolveDesignProps4(props) {
10843
11098
  return {
@@ -10859,8 +11114,9 @@ function resolveDesignProps4(props) {
10859
11114
  }
10860
11115
  var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10861
11116
  const props = resolveDesignProps4(rest);
10862
- const { data, settings, stripe } = useEmbed();
10863
- const { upcomingInvoice } = useMemo6(() => {
11117
+ const theme = nt();
11118
+ const { data, stripe } = useEmbed();
11119
+ const { upcomingInvoice } = useMemo9(() => {
10864
11120
  return {
10865
11121
  upcomingInvoice: {
10866
11122
  ...data.upcomingInvoice?.amountDue && {
@@ -10875,7 +11131,7 @@ var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10875
11131
  }
10876
11132
  };
10877
11133
  }, [data.subscription, data.upcomingInvoice]);
10878
- if (!stripe || !data.upcomingInvoice) {
11134
+ if (!stripe || !upcomingInvoice.amountDue || !upcomingInvoice.dueDate) {
10879
11135
  return null;
10880
11136
  }
10881
11137
  return /* @__PURE__ */ jsxs9("div", { ref, className, children: [
@@ -10888,10 +11144,10 @@ var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10888
11144
  children: /* @__PURE__ */ jsxs9(
10889
11145
  Text,
10890
11146
  {
10891
- $font: settings.theme.typography[props.header.fontStyle].fontFamily,
10892
- $size: settings.theme.typography[props.header.fontStyle].fontSize,
10893
- $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
10894
- $color: settings.theme.typography[props.header.fontStyle].color,
11147
+ $font: theme.typography[props.header.fontStyle].fontFamily,
11148
+ $size: theme.typography[props.header.fontStyle].fontSize,
11149
+ $weight: theme.typography[props.header.fontStyle].fontWeight,
11150
+ $color: theme.typography[props.header.fontStyle].color,
10895
11151
  children: [
10896
11152
  props.header.prefix,
10897
11153
  " ",
@@ -10905,10 +11161,10 @@ var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10905
11161
  props.price.isVisible && /* @__PURE__ */ jsx14(Flex, { $alignItems: "end", $flexGrow: "1", children: /* @__PURE__ */ jsx14(
10906
11162
  Text,
10907
11163
  {
10908
- $font: settings.theme.typography[props.price.fontStyle].fontFamily,
10909
- $size: settings.theme.typography[props.price.fontStyle].fontSize,
10910
- $weight: settings.theme.typography[props.price.fontStyle].fontWeight,
10911
- $color: settings.theme.typography[props.price.fontStyle].color,
11164
+ $font: theme.typography[props.price.fontStyle].fontFamily,
11165
+ $size: theme.typography[props.price.fontStyle].fontSize,
11166
+ $weight: theme.typography[props.price.fontStyle].fontWeight,
11167
+ $color: theme.typography[props.price.fontStyle].color,
10912
11168
  $lineHeight: 1,
10913
11169
  children: formatCurrency(upcomingInvoice.amountDue)
10914
11170
  }
@@ -10916,10 +11172,10 @@ var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10916
11172
  /* @__PURE__ */ jsx14(Box, { $maxWidth: "10rem", $lineHeight: "1", $textAlign: "right", children: /* @__PURE__ */ jsx14(
10917
11173
  Text,
10918
11174
  {
10919
- $font: settings.theme.typography[props.contractEndDate.fontStyle].fontFamily,
10920
- $size: settings.theme.typography[props.contractEndDate.fontStyle].fontSize,
10921
- $weight: settings.theme.typography[props.contractEndDate.fontStyle].fontWeight,
10922
- $color: settings.theme.typography[props.contractEndDate.fontStyle].color,
11175
+ $font: theme.typography[props.contractEndDate.fontStyle].fontFamily,
11176
+ $size: theme.typography[props.contractEndDate.fontStyle].fontSize,
11177
+ $weight: theme.typography[props.contractEndDate.fontStyle].fontWeight,
11178
+ $color: theme.typography[props.contractEndDate.fontStyle].color,
10923
11179
  children: "Estimated monthly bill."
10924
11180
  }
10925
11181
  ) })
@@ -10928,7 +11184,7 @@ var UpcomingBill = forwardRef4(({ className, ...rest }, ref) => {
10928
11184
  });
10929
11185
 
10930
11186
  // src/components/elements/payment-method/PaymentMethod.tsx
10931
- import { forwardRef as forwardRef5, useMemo as useMemo7 } from "react";
11187
+ import { forwardRef as forwardRef5, useMemo as useMemo10 } from "react";
10932
11188
  import { createPortal as createPortal2 } from "react-dom";
10933
11189
  import { jsx as jsx15, jsxs as jsxs10 } from "react/jsx-runtime";
10934
11190
  var resolveDesignProps5 = (props) => {
@@ -10944,8 +11200,9 @@ var resolveDesignProps5 = (props) => {
10944
11200
  };
10945
11201
  var PaymentMethod = forwardRef5(({ children, className, portal, ...rest }, ref) => {
10946
11202
  const props = resolveDesignProps5(rest);
10947
- const { data, settings, stripe, layout } = useEmbed();
10948
- const paymentMethod = useMemo7(() => {
11203
+ const theme = nt();
11204
+ const { data, stripe, layout } = useEmbed();
11205
+ const paymentMethod = useMemo10(() => {
10949
11206
  const { cardLast4, cardExpMonth, cardExpYear } = data.subscription?.paymentMethod || {};
10950
11207
  let monthsToExpiration;
10951
11208
  if (typeof cardExpYear === "number" && typeof cardExpMonth === "number") {
@@ -10961,7 +11218,10 @@ var PaymentMethod = forwardRef5(({ children, className, portal, ...rest }, ref)
10961
11218
  monthsToExpiration
10962
11219
  };
10963
11220
  }, [data.subscription?.paymentMethod]);
10964
- if (!stripe || !data.subscription?.paymentMethod) {
11221
+ const isLightBackground = useMemo10(() => {
11222
+ return hexToHSL(theme.card.background).l > 50;
11223
+ }, [theme.card.background]);
11224
+ if (!stripe || !paymentMethod.cardLast4) {
10965
11225
  return null;
10966
11226
  }
10967
11227
  return /* @__PURE__ */ jsxs10("div", { ref, className, children: [
@@ -10975,17 +11235,17 @@ var PaymentMethod = forwardRef5(({ children, className, portal, ...rest }, ref)
10975
11235
  /* @__PURE__ */ jsx15(
10976
11236
  Text,
10977
11237
  {
10978
- $font: settings.theme.typography[props.header.fontStyle].fontFamily,
10979
- $size: settings.theme.typography[props.header.fontStyle].fontSize,
10980
- $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
10981
- $color: settings.theme.typography[props.header.fontStyle].color,
11238
+ $font: theme.typography[props.header.fontStyle].fontFamily,
11239
+ $size: theme.typography[props.header.fontStyle].fontSize,
11240
+ $weight: theme.typography[props.header.fontStyle].fontWeight,
11241
+ $color: theme.typography[props.header.fontStyle].color,
10982
11242
  children: "Payment Method"
10983
11243
  }
10984
11244
  ),
10985
11245
  typeof paymentMethod.monthsToExpiration === "number" && Math.abs(paymentMethod.monthsToExpiration) < 4 && /* @__PURE__ */ jsx15(
10986
11246
  Text,
10987
11247
  {
10988
- $font: settings.theme.typography.text.fontFamily,
11248
+ $font: theme.typography.text.fontFamily,
10989
11249
  $size: 14,
10990
11250
  $color: "#DB6769",
10991
11251
  children: paymentMethod.monthsToExpiration > 0 ? `Expires in ${paymentMethod.monthsToExpiration} mo` : "Expired"
@@ -11000,10 +11260,10 @@ var PaymentMethod = forwardRef5(({ children, className, portal, ...rest }, ref)
11000
11260
  $justifyContent: "space-between",
11001
11261
  $alignItems: "center",
11002
11262
  $margin: "0 0 1rem",
11003
- $background: `${hexToHSL(settings.theme.card.background).l > 50 ? darken(settings.theme.card.background, 10) : lighten(settings.theme.card.background, 20)}`,
11263
+ $backgroundColor: isLightBackground ? "hsla(0, 0%, 0%, 0.0625)" : "hsla(0, 0%, 100%, 0.125)",
11004
11264
  $padding: "0.375rem 1rem",
11005
11265
  $borderRadius: "9999px",
11006
- children: /* @__PURE__ */ jsxs10(Text, { $font: settings.theme.typography.text.fontFamily, $size: 14, children: [
11266
+ children: /* @__PURE__ */ jsxs10(Text, { $font: theme.typography.text.fontFamily, $size: 14, children: [
11007
11267
  "\u{1F4B3} Card ending in ",
11008
11268
  paymentMethod.cardLast4
11009
11269
  ] })
@@ -11222,7 +11482,7 @@ var PaymentMethod = forwardRef5(({ children, className, portal, ...rest }, ref)
11222
11482
  });
11223
11483
 
11224
11484
  // src/components/elements/invoices/Invoices.tsx
11225
- import { forwardRef as forwardRef6, useMemo as useMemo8 } from "react";
11485
+ import { forwardRef as forwardRef6, useMemo as useMemo11 } from "react";
11226
11486
  import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
11227
11487
  function resolveDesignProps6(props) {
11228
11488
  return {
@@ -11250,8 +11510,8 @@ function resolveDesignProps6(props) {
11250
11510
  }
11251
11511
  var Invoices = forwardRef6(({ className, ...rest }, ref) => {
11252
11512
  const props = resolveDesignProps6(rest);
11253
- const { settings } = useEmbed();
11254
- const { invoices } = useMemo8(() => {
11513
+ const theme = nt();
11514
+ const { invoices } = useMemo11(() => {
11255
11515
  return {
11256
11516
  invoices: [
11257
11517
  {
@@ -11269,10 +11529,10 @@ var Invoices = forwardRef6(({ className, ...rest }, ref) => {
11269
11529
  props.header.isVisible && /* @__PURE__ */ jsx16(Flex, { $justifyContent: "space-between", $alignItems: "center", children: /* @__PURE__ */ jsx16(
11270
11530
  Text,
11271
11531
  {
11272
- $font: settings.theme.typography[props.header.fontStyle].fontFamily,
11273
- $size: settings.theme.typography[props.header.fontStyle].fontSize,
11274
- $weight: settings.theme.typography[props.header.fontStyle].fontWeight,
11275
- $color: settings.theme.typography[props.header.fontStyle].color,
11532
+ $font: theme.typography[props.header.fontStyle].fontFamily,
11533
+ $size: theme.typography[props.header.fontStyle].fontSize,
11534
+ $weight: theme.typography[props.header.fontStyle].fontWeight,
11535
+ $color: theme.typography[props.header.fontStyle].color,
11276
11536
  children: "Invoices"
11277
11537
  }
11278
11538
  ) }),
@@ -11284,20 +11544,20 @@ var Invoices = forwardRef6(({ className, ...rest }, ref) => {
11284
11544
  props.date.isVisible && /* @__PURE__ */ jsx16(
11285
11545
  Text,
11286
11546
  {
11287
- $font: settings.theme.typography[props.date.fontStyle].fontFamily,
11288
- $size: settings.theme.typography[props.date.fontStyle].fontSize,
11289
- $weight: settings.theme.typography[props.date.fontStyle].fontWeight,
11290
- $color: settings.theme.typography[props.date.fontStyle].color,
11547
+ $font: theme.typography[props.date.fontStyle].fontFamily,
11548
+ $size: theme.typography[props.date.fontStyle].fontSize,
11549
+ $weight: theme.typography[props.date.fontStyle].fontWeight,
11550
+ $color: theme.typography[props.date.fontStyle].color,
11291
11551
  children: toPrettyDate(date)
11292
11552
  }
11293
11553
  ),
11294
11554
  props.amount.isVisible && /* @__PURE__ */ jsxs11(
11295
11555
  Text,
11296
11556
  {
11297
- $font: settings.theme.typography[props.amount.fontStyle].fontFamily,
11298
- $size: settings.theme.typography[props.amount.fontStyle].fontSize,
11299
- $weight: settings.theme.typography[props.amount.fontStyle].fontWeight,
11300
- $color: settings.theme.typography[props.amount.fontStyle].color,
11557
+ $font: theme.typography[props.amount.fontStyle].fontFamily,
11558
+ $size: theme.typography[props.amount.fontStyle].fontSize,
11559
+ $weight: theme.typography[props.amount.fontStyle].fontWeight,
11560
+ $color: theme.typography[props.amount.fontStyle].color,
11301
11561
  children: [
11302
11562
  "$",
11303
11563
  amount
@@ -11311,10 +11571,10 @@ var Invoices = forwardRef6(({ className, ...rest }, ref) => {
11311
11571
  /* @__PURE__ */ jsx16(
11312
11572
  Text,
11313
11573
  {
11314
- $font: settings.theme.typography[props.collapse.fontStyle].fontFamily,
11315
- $size: settings.theme.typography[props.collapse.fontStyle].fontSize,
11316
- $weight: settings.theme.typography[props.collapse.fontStyle].fontWeight,
11317
- $color: settings.theme.typography[props.collapse.fontStyle].color,
11574
+ $font: theme.typography[props.collapse.fontStyle].fontFamily,
11575
+ $size: theme.typography[props.collapse.fontStyle].fontSize,
11576
+ $weight: theme.typography[props.collapse.fontStyle].fontWeight,
11577
+ $color: theme.typography[props.collapse.fontStyle].color,
11318
11578
  children: "See all"
11319
11579
  }
11320
11580
  )
@@ -11323,7 +11583,7 @@ var Invoices = forwardRef6(({ className, ...rest }, ref) => {
11323
11583
  });
11324
11584
 
11325
11585
  // src/components/embed/ComponentTree.tsx
11326
- import { useEffect as useEffect5, useState as useState6 } from "react";
11586
+ import { useEffect as useEffect5, useState as useState4, Children } from "react";
11327
11587
 
11328
11588
  // src/components/embed/renderer.ts
11329
11589
  import { createElement } from "react";
@@ -11352,22 +11612,23 @@ var StyledViewport = dt.div`
11352
11612
  import { jsx as jsx18, jsxs as jsxs12 } from "react/jsx-runtime";
11353
11613
  var Viewport = forwardRef8(
11354
11614
  ({ children, ...props }, ref) => {
11355
- const { settings, layout } = useEmbed();
11615
+ const theme = nt();
11616
+ const { layout } = useEmbed();
11356
11617
  return /* @__PURE__ */ jsx18(
11357
11618
  StyledViewport,
11358
11619
  {
11359
11620
  ref,
11360
- $numberOfColumns: settings.theme.numberOfColumns,
11621
+ $numberOfColumns: theme.numberOfColumns,
11361
11622
  ...props,
11362
11623
  children: layout === "disabled" ? /* @__PURE__ */ jsx18(Box, { $width: "100%", children: /* @__PURE__ */ jsxs12(
11363
11624
  Flex,
11364
11625
  {
11365
11626
  $flexDirection: "column",
11366
- $padding: `${settings.theme.card.padding / 16}rem`,
11627
+ $padding: `${theme.card.padding / TEXT_BASE_SIZE}rem`,
11367
11628
  $width: "100%",
11368
11629
  $height: "auto",
11369
- $borderRadius: `${settings.theme.card.borderRadius / 16}rem`,
11370
- $backgroundColor: settings.theme.card.background,
11630
+ $borderRadius: `${theme.card.borderRadius / TEXT_BASE_SIZE}rem`,
11631
+ $backgroundColor: theme.card.background,
11371
11632
  $alignItems: "center",
11372
11633
  $justifyContent: "center",
11373
11634
  children: [
@@ -11375,10 +11636,10 @@ var Viewport = forwardRef8(
11375
11636
  Box,
11376
11637
  {
11377
11638
  $marginBottom: "8px",
11378
- $fontSize: `${settings.theme.typography.heading1.fontSize / 16}rem`,
11379
- $fontFamily: settings.theme.typography.heading1.fontFamily,
11380
- $fontWeight: settings.theme.typography.heading1.fontWeight,
11381
- $color: settings.theme.typography.heading1.color,
11639
+ $fontSize: `${theme.typography.heading1.fontSize / TEXT_BASE_SIZE}rem`,
11640
+ $fontFamily: theme.typography.heading1.fontFamily,
11641
+ $fontWeight: theme.typography.heading1.fontWeight,
11642
+ $color: theme.typography.heading1.color,
11382
11643
  children: "Coming soon"
11383
11644
  }
11384
11645
  ),
@@ -11386,10 +11647,10 @@ var Viewport = forwardRef8(
11386
11647
  Box,
11387
11648
  {
11388
11649
  $marginBottom: "8px",
11389
- $fontSize: `${settings.theme.typography.text.fontSize / 16}rem`,
11390
- $fontFamily: settings.theme.typography.text.fontFamily,
11391
- $fontWeight: settings.theme.typography.text.fontWeight,
11392
- $color: settings.theme.typography.text.color,
11650
+ $fontSize: `${theme.typography.text.fontSize / TEXT_BASE_SIZE}rem`,
11651
+ $fontFamily: theme.typography.text.fontFamily,
11652
+ $fontWeight: theme.typography.text.fontWeight,
11653
+ $color: theme.typography.text.color,
11393
11654
  children: "The plan manager will be back very soon."
11394
11655
  }
11395
11656
  )
@@ -11434,7 +11695,7 @@ var StyledCard = dt.div(
11434
11695
 
11435
11696
  ${() => {
11436
11697
  const { l: l2 } = hexToHSL(theme.card.background);
11437
- const borderColor = l2 > 50 ? darken(theme.card.background, 10) : lighten(theme.card.background, 20);
11698
+ const borderColor = l2 > 50 ? "hsla(0, 0%, 0%, 0.1)" : "hsla(0, 0%, 100%, 0.2)";
11438
11699
  const borderRadius = `${$borderRadius / TEXT_BASE_SIZE}rem`;
11439
11700
  const boxShadow = "0px 1px 20px 0px #1018280F, 0px 1px 3px 0px #1018281A";
11440
11701
  if ($sectionLayout === "merged") {
@@ -11469,16 +11730,16 @@ var StyledCard = dt.div(
11469
11730
  import { jsx as jsx19 } from "react/jsx-runtime";
11470
11731
  var Card = forwardRef9(
11471
11732
  ({ children, className }, ref) => {
11472
- const { settings } = useEmbed();
11733
+ const theme = nt();
11473
11734
  return /* @__PURE__ */ jsx19(
11474
11735
  StyledCard,
11475
11736
  {
11476
11737
  ref,
11477
11738
  className,
11478
- $sectionLayout: settings.theme?.sectionLayout,
11479
- $borderRadius: settings.theme?.card?.borderRadius,
11480
- $padding: settings.theme?.card?.padding,
11481
- $shadow: settings.theme?.card?.hasShadow,
11739
+ $sectionLayout: theme?.sectionLayout,
11740
+ $borderRadius: theme?.card?.borderRadius,
11741
+ $padding: theme?.card?.padding,
11742
+ $shadow: theme?.card?.hasShadow,
11482
11743
  children
11483
11744
  }
11484
11745
  );
@@ -11550,78 +11811,84 @@ var spin = mt`
11550
11811
  transform: rotate(360deg);
11551
11812
  }
11552
11813
  `;
11553
- var Loader = dt.div(() => {
11554
- const { settings } = useEmbed();
11555
- return lt`
11556
- border: 4px solid rgba(0, 0, 0, 0.1);
11557
- border-top: 4px solid ${settings.theme.primary};
11558
- border-radius: 50%;
11559
- width: 40px;
11560
- height: 40px;
11561
- animation: ${spin} 1.5s linear infinite;
11562
- display: inline-block;
11563
- `;
11564
- });
11814
+ var Loader = dt.div`
11815
+ border: ${({ theme }) => `${4 / TEXT_BASE_SIZE}rem solid hsla(0, 0%, ${hexToHSL(theme.card.background).l > 50 ? 0 : 100}%, 0.1)`};
11816
+ border-top: ${4 / TEXT_BASE_SIZE}rem solid ${({ theme }) => theme.primary};
11817
+ border-radius: 50%;
11818
+ width: ${40 / TEXT_BASE_SIZE}rem;
11819
+ height: ${40 / TEXT_BASE_SIZE}rem;
11820
+ animation: ${spin} 1.5s linear infinite;
11821
+ display: inline-block;
11822
+ `;
11565
11823
 
11566
11824
  // src/components/embed/ComponentTree.tsx
11567
11825
  import { Fragment as Fragment2, jsx as jsx21, jsxs as jsxs13 } from "react/jsx-runtime";
11568
- var ComponentTree = () => {
11569
- const { error, nodes, settings } = useEmbed();
11570
- const [children, setChildren] = useState6(
11571
- /* @__PURE__ */ jsx21(
11572
- Flex,
11573
- {
11574
- $width: "100%",
11575
- $height: "100%",
11576
- $alignItems: "center",
11577
- $justifyContent: "center",
11578
- $padding: `${settings.theme.card.padding / 16}rem`,
11579
- children: /* @__PURE__ */ jsx21(Loader, {})
11580
- }
11581
- )
11826
+ var Loading = () => {
11827
+ const theme = nt();
11828
+ return /* @__PURE__ */ jsx21(
11829
+ Flex,
11830
+ {
11831
+ $width: "100%",
11832
+ $height: "100%",
11833
+ $alignItems: "center",
11834
+ $justifyContent: "center",
11835
+ $padding: `${theme.card.padding / TEXT_BASE_SIZE}rem`,
11836
+ children: /* @__PURE__ */ jsx21(Loader, {})
11837
+ }
11838
+ );
11839
+ };
11840
+ var Error2 = ({ message }) => {
11841
+ const theme = nt();
11842
+ return /* @__PURE__ */ jsxs13(
11843
+ Flex,
11844
+ {
11845
+ $flexDirection: "column",
11846
+ $padding: `${theme.card.padding / TEXT_BASE_SIZE}rem`,
11847
+ $width: "100%",
11848
+ $height: "auto",
11849
+ $borderRadius: `${theme.card.borderRadius / TEXT_BASE_SIZE}rem`,
11850
+ $backgroundColor: theme.card.background,
11851
+ $alignItems: "center",
11852
+ $justifyContent: "center",
11853
+ children: [
11854
+ /* @__PURE__ */ jsx21(
11855
+ Box,
11856
+ {
11857
+ $marginBottom: `${8 / TEXT_BASE_SIZE}rem`,
11858
+ $fontSize: `${theme.typography.heading1.fontSize / TEXT_BASE_SIZE}rem`,
11859
+ $fontFamily: theme.typography.heading1.fontFamily,
11860
+ $fontWeight: theme.typography.heading1.fontWeight,
11861
+ $color: theme.typography.heading1.color,
11862
+ children: "404 Error"
11863
+ }
11864
+ ),
11865
+ /* @__PURE__ */ jsx21(
11866
+ Box,
11867
+ {
11868
+ $marginBottom: `${8 / TEXT_BASE_SIZE}rem`,
11869
+ $fontSize: `${theme.typography.text.fontSize / TEXT_BASE_SIZE}rem`,
11870
+ $fontFamily: theme.typography.text.fontFamily,
11871
+ $fontWeight: theme.typography.text.fontWeight,
11872
+ $color: theme.typography.text.color,
11873
+ children: message
11874
+ }
11875
+ )
11876
+ ]
11877
+ }
11582
11878
  );
11879
+ };
11880
+ var ComponentTree = () => {
11881
+ const { error, nodes } = useEmbed();
11882
+ const [children, setChildren] = useState4(/* @__PURE__ */ jsx21(Loading, {}));
11583
11883
  useEffect5(() => {
11584
11884
  const renderer = createRenderer();
11585
11885
  setChildren(nodes.map(renderer));
11586
11886
  }, [nodes]);
11587
11887
  if (error) {
11588
- return /* @__PURE__ */ jsxs13(
11589
- Flex,
11590
- {
11591
- $flexDirection: "column",
11592
- $padding: `${settings.theme.card.padding / 16}rem`,
11593
- $width: "100%",
11594
- $height: "auto",
11595
- $borderRadius: `${settings.theme.card.borderRadius / 16}rem`,
11596
- $backgroundColor: settings.theme.card.background,
11597
- $alignItems: "center",
11598
- $justifyContent: "center",
11599
- children: [
11600
- /* @__PURE__ */ jsx21(
11601
- Box,
11602
- {
11603
- $marginBottom: "8px",
11604
- $fontSize: `${settings.theme.typography.heading1.fontSize / 16}rem`,
11605
- $fontFamily: settings.theme.typography.heading1.fontFamily,
11606
- $fontWeight: settings.theme.typography.heading1.fontWeight,
11607
- $color: settings.theme.typography.heading1.color,
11608
- children: "404 Error"
11609
- }
11610
- ),
11611
- /* @__PURE__ */ jsx21(
11612
- Box,
11613
- {
11614
- $marginBottom: "8px",
11615
- $fontSize: `${settings.theme.typography.text.fontSize / 16}rem`,
11616
- $fontFamily: settings.theme.typography.text.fontFamily,
11617
- $fontWeight: settings.theme.typography.text.fontWeight,
11618
- $color: settings.theme.typography.text.color,
11619
- children: error.message
11620
- }
11621
- )
11622
- ]
11623
- }
11624
- );
11888
+ return /* @__PURE__ */ jsx21(Error2, { message: error.message });
11889
+ }
11890
+ if (Children.count(children) === 0) {
11891
+ return /* @__PURE__ */ jsx21(Loading, {});
11625
11892
  }
11626
11893
  return /* @__PURE__ */ jsx21(Fragment2, { children });
11627
11894
  };
@@ -11668,7 +11935,8 @@ export {
11668
11935
  useSchematic,
11669
11936
  useSchematicContext,
11670
11937
  useSchematicEvents,
11671
- useSchematicFlag
11938
+ useSchematicFlag,
11939
+ useSchematicIsPending
11672
11940
  };
11673
11941
  /*! Bundled license information:
11674
11942