@embedreach/components 0.1.30 → 0.1.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.umd.js CHANGED
@@ -8001,192 +8001,6 @@
8001
8001
  },
8002
8002
  authListeners
8003
8003
  );
8004
- const normalizeColor = (color2) => {
8005
- const div = document.createElement("div");
8006
- div.style.color = color2;
8007
- document.body.appendChild(div);
8008
- const computed = window.getComputedStyle(div).color;
8009
- document.body.removeChild(div);
8010
- return computed;
8011
- };
8012
- const isValidColor = (color2) => {
8013
- if (/^\d+\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/.test(color2.trim())) {
8014
- return true;
8015
- }
8016
- const div = document.createElement("div");
8017
- const prevColor = div.style.color;
8018
- div.style.color = color2;
8019
- return div.style.color !== prevColor;
8020
- };
8021
- const rgbToShadcnHsl = (r2, g2, b2) => {
8022
- r2 /= 255;
8023
- g2 /= 255;
8024
- b2 /= 255;
8025
- const max2 = Math.max(r2, g2, b2);
8026
- const min2 = Math.min(r2, g2, b2);
8027
- let h2 = 0, s2 = 0;
8028
- const l2 = (max2 + min2) / 2;
8029
- if (max2 !== min2) {
8030
- const d2 = max2 - min2;
8031
- s2 = l2 > 0.5 ? d2 / (2 - max2 - min2) : d2 / (max2 + min2);
8032
- switch (max2) {
8033
- case r2:
8034
- h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
8035
- break;
8036
- case g2:
8037
- h2 = (b2 - r2) / d2 + 2;
8038
- break;
8039
- case b2:
8040
- h2 = (r2 - g2) / d2 + 4;
8041
- break;
8042
- }
8043
- h2 *= 60;
8044
- }
8045
- return `${Math.round(h2)} ${Math.round(s2 * 100)}% ${Math.round(l2 * 100)}%`;
8046
- };
8047
- const extractRgb = (rgbColor) => {
8048
- const matches = rgbColor.match(/\d+/g);
8049
- if (!matches || matches.length < 3) {
8050
- throw new Error(`Invalid RGB color format: ${rgbColor}`);
8051
- }
8052
- return [
8053
- parseInt(matches[0], 10),
8054
- parseInt(matches[1], 10),
8055
- parseInt(matches[2], 10)
8056
- ];
8057
- };
8058
- const toShadcnFormat = (color2) => {
8059
- if (/^\d+\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/.test(color2.trim())) {
8060
- return color2.trim();
8061
- }
8062
- try {
8063
- const rgbColor = normalizeColor(color2);
8064
- const [r2, g2, b2] = extractRgb(rgbColor);
8065
- return rgbToShadcnHsl(r2, g2, b2);
8066
- } catch (e2) {
8067
- console.warn(`Failed to convert color to shadcn format: ${color2}`, e2);
8068
- return color2;
8069
- }
8070
- };
8071
- const DEFAULT_THEME_STYLES = {
8072
- primary: "hsl(222.2 47.4% 11.2%)",
8073
- background: "hsl(0 0% 100%)",
8074
- foreground: "hsl(222.2 47.4% 11.2%)",
8075
- "primary-foreground": "hsl(210 40% 98%)",
8076
- secondary: "hsl(210 40% 96.1%)",
8077
- "secondary-foreground": "hsl(222.2 47.4% 11.2%)",
8078
- muted: "hsl(210 40% 96.1%)",
8079
- "muted-foreground": "hsl(215.4 16.3% 46.9%)",
8080
- accent: "hsl(210 40% 96.1%)",
8081
- "accent-foreground": "hsl(222.2 47.4% 11.2%)",
8082
- border: "hsl(214.3 31.8% 91.4%)",
8083
- input: "hsl(214.3 31.8% 91.4%)",
8084
- ring: "hsl(222.2 84% 4.9%)",
8085
- destructive: "hsl(0 84.2% 60.2%)",
8086
- "destructive-foreground": "hsl(210 40% 98%)",
8087
- card: "hsl(0 0% 100%)",
8088
- "card-foreground": "hsl(222.2 47.4% 11.2%)",
8089
- popover: "hsl(0 0% 100%)",
8090
- "popover-foreground": "hsl(222.2 47.4% 11.2%)",
8091
- "font-body": 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
8092
- "font-heading": 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
8093
- };
8094
- const applyThemeStyles = (styles2) => {
8095
- const existingStyles = document.getElementById("reach-theme-styles");
8096
- if (existingStyles) {
8097
- existingStyles.remove();
8098
- }
8099
- const styleElement = document.createElement("style");
8100
- styleElement.id = "reach-theme-styles";
8101
- const cssText = `
8102
- [data-reach-root] {
8103
- ${Object.entries(DEFAULT_THEME_STYLES).map(([key, defaultValue]) => {
8104
- const userValue = styles2[key];
8105
- let finalValue = defaultValue;
8106
- if (userValue !== void 0) {
8107
- if (key === "radius" || key === "font-body" || key === "font-heading") {
8108
- finalValue = userValue;
8109
- } else if (isValidColor(userValue)) {
8110
- try {
8111
- finalValue = toShadcnFormat(userValue);
8112
- } catch (e2) {
8113
- console.warn(
8114
- `Failed to convert color for ${key}, using default`
8115
- );
8116
- }
8117
- }
8118
- }
8119
- return `--reach-${key}: ${finalValue};`;
8120
- }).join("\n")}
8121
- }
8122
-
8123
- /* Apply font families directly */
8124
- [data-reach-root] {
8125
- font-family: var(--reach-font-body);
8126
- }
8127
-
8128
- [data-reach-root] h1,
8129
- [data-reach-root] h2,
8130
- [data-reach-root] h3,
8131
- [data-reach-root] h4,
8132
- [data-reach-root] h5,
8133
- [data-reach-root] h6 {
8134
- font-family: var(--reach-font-heading);
8135
- }
8136
- `;
8137
- styleElement.textContent = cssText;
8138
- document.head.appendChild(styleElement);
8139
- };
8140
- const mergeThemeStyles = (themeConfig, overrides) => {
8141
- return {
8142
- ...DEFAULT_THEME_STYLES,
8143
- ...themeConfig?.styles || {},
8144
- ...{}
8145
- };
8146
- };
8147
- const themeReducer = (state, action) => {
8148
- switch (action.type) {
8149
- case "set_theme":
8150
- if (action.payload && !state.theme) {
8151
- applyThemeStyles(action.payload.styles);
8152
- }
8153
- return {
8154
- ...state,
8155
- loading: false,
8156
- error: null,
8157
- theme: action.payload
8158
- };
8159
- case "set_loading":
8160
- return {
8161
- ...state,
8162
- loading: action.payload
8163
- };
8164
- case "set_error":
8165
- return {
8166
- ...state,
8167
- loading: false,
8168
- error: action.payload
8169
- };
8170
- default:
8171
- return state;
8172
- }
8173
- };
8174
- const setTheme = (dispatch2) => (theme2) => dispatch2({ type: "set_theme", payload: theme2 });
8175
- const setLoading = (dispatch2) => (loading2) => dispatch2({ type: "set_loading", payload: loading2 });
8176
- const setError = (dispatch2) => (error2) => dispatch2({ type: "set_error", payload: error2 });
8177
- const { Context, Provider: Provider$2 } = createDataContext(
8178
- themeReducer,
8179
- {
8180
- setTheme,
8181
- setLoading,
8182
- setError
8183
- },
8184
- {
8185
- theme: null,
8186
- loading: true,
8187
- error: null
8188
- }
8189
- );
8190
8004
  const warn = (...args) => {
8191
8005
  if (console?.warn) {
8192
8006
  if (isString$2(args[0])) args[0] = `react-i18next:: ${args[0]}`;
@@ -8389,39 +8203,386 @@
8389
8203
  if (i18n) bindI18n?.split(" ").forEach((e2) => i18n.off(e2, boundReset));
8390
8204
  if (bindI18nStore && i18n) bindI18nStore.split(" ").forEach((e2) => i18n.store.off(e2, boundReset));
8391
8205
  };
8392
- }, [i18n, joinedNS]);
8206
+ }, [i18n, joinedNS]);
8207
+ React.useEffect(() => {
8208
+ if (isMounted.current && ready) {
8209
+ setT(getT);
8210
+ }
8211
+ }, [i18n, keyPrefix, ready]);
8212
+ const ret = [t2, i18n, ready];
8213
+ ret.t = t2;
8214
+ ret.i18n = i18n;
8215
+ ret.ready = ready;
8216
+ if (ready) return ret;
8217
+ if (!ready && !useSuspense) return ret;
8218
+ throw new Promise((resolve) => {
8219
+ if (props.lng) {
8220
+ loadLanguages(i18n, props.lng, namespaces, () => resolve());
8221
+ } else {
8222
+ loadNamespaces(i18n, namespaces, () => resolve());
8223
+ }
8224
+ });
8225
+ };
8226
+ function I18nextProvider({
8227
+ i18n,
8228
+ defaultNS,
8229
+ children: children2
8230
+ }) {
8231
+ const value = React.useMemo(() => ({
8232
+ i18n,
8233
+ defaultNS
8234
+ }), [i18n, defaultNS]);
8235
+ return React.createElement(I18nContext$1.Provider, {
8236
+ value
8237
+ }, children2);
8238
+ }
8239
+ const H3 = ({ children: children2 }) => {
8240
+ return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "scroll-m-20 text-2xl font-semibold tracking-tight", children: children2 });
8241
+ };
8242
+ const SpinLoader = ({
8243
+ size: size3 = 35,
8244
+ color: color2 = "black",
8245
+ speed = 0.9,
8246
+ strokeWidth = 3.5,
8247
+ text,
8248
+ textSpeed = 2e3,
8249
+ // Default 2 seconds per text
8250
+ textColor = "black"
8251
+ }) => {
8252
+ const [currentTextIndex, setCurrentTextIndex] = React.useState(0);
8253
+ const textArray = Array.isArray(text) ? text : text ? [text] : [];
8254
+ React.useEffect(() => {
8255
+ if (textArray.length <= 1) return;
8256
+ if (currentTextIndex >= textArray.length - 1) return;
8257
+ const interval = setInterval(() => {
8258
+ setCurrentTextIndex(
8259
+ (current) => current < textArray.length - 1 ? current + 1 : current
8260
+ );
8261
+ }, textSpeed);
8262
+ return () => clearInterval(interval);
8263
+ }, [textArray.length, textSpeed, currentTextIndex]);
8264
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col justify-center items-center h-full", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
8265
+ /* @__PURE__ */ jsxRuntime.jsxs(
8266
+ "div",
8267
+ {
8268
+ className: "loader-container",
8269
+ style: {
8270
+ "--uib-size": `${size3}px`,
8271
+ "--uib-color": color2,
8272
+ "--uib-speed": `${speed}s`,
8273
+ "--uib-stroke": `${strokeWidth}px`
8274
+ },
8275
+ children: [
8276
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
8277
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
8278
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
8279
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
8280
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
8281
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" })
8282
+ ]
8283
+ }
8284
+ ),
8285
+ textArray.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
8286
+ "div",
8287
+ {
8288
+ className: `text-center text-sm text-muted-foreground animate-fade-in ${textColor ? `text-${textColor}` : ""}`,
8289
+ children: /* @__PURE__ */ jsxRuntime.jsx(H3, { children: textArray[currentTextIndex] })
8290
+ },
8291
+ currentTextIndex
8292
+ ),
8293
+ /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
8294
+ .loader-container {
8295
+ position: relative;
8296
+ display: flex;
8297
+ align-items: center;
8298
+ justify-content: center;
8299
+ height: var(--uib-size);
8300
+ width: var(--uib-size);
8301
+ }
8302
+ .line {
8303
+ position: absolute;
8304
+ top: calc(50% - var(--uib-stroke) / 2);
8305
+ left: 0;
8306
+ height: var(--uib-stroke);
8307
+ width: 100%;
8308
+ border-radius: calc(var(--uib-stroke) / 2);
8309
+ background-color: var(--uib-color);
8310
+ animation: rotate var(--uib-speed) ease-in-out infinite;
8311
+ transition: background-color 0.3s ease;
8312
+ }
8313
+ .line:nth-child(1) {
8314
+ animation-delay: calc(var(--uib-speed) * -0.375);
8315
+ }
8316
+ .line:nth-child(2) {
8317
+ animation-delay: calc(var(--uib-speed) * -0.375);
8318
+ opacity: 0.8;
8319
+ }
8320
+ .line:nth-child(3) {
8321
+ animation-delay: calc(var(--uib-speed) * -0.3);
8322
+ opacity: 0.6;
8323
+ }
8324
+ .line:nth-child(4) {
8325
+ animation-delay: calc(var(--uib-speed) * -0.225);
8326
+ opacity: 0.4;
8327
+ }
8328
+ .line:nth-child(5) {
8329
+ animation-delay: calc(var(--uib-speed) * -0.15);
8330
+ opacity: 0.2;
8331
+ }
8332
+ .line:nth-child(6) {
8333
+ animation-delay: calc(var(--uib-speed) * -0.075);
8334
+ opacity: 0.1;
8335
+ }
8336
+ @keyframes rotate {
8337
+ 0% {
8338
+ transform: rotate(0deg);
8339
+ }
8340
+ 100% {
8341
+ transform: rotate(180deg);
8342
+ }
8343
+ }
8344
+ .animate-fade-in {
8345
+ animation: fadeIn 0.5s ease-in-out;
8346
+ }
8347
+ @keyframes fadeIn {
8348
+ from {
8349
+ opacity: 0;
8350
+ transform: translateY(5px);
8351
+ }
8352
+ to {
8353
+ opacity: 1;
8354
+ transform: translateY(0);
8355
+ }
8356
+ }
8357
+ ` })
8358
+ ] }) });
8359
+ };
8360
+ const normalizeColor = (color2) => {
8361
+ const div = document.createElement("div");
8362
+ div.style.color = color2;
8363
+ document.body.appendChild(div);
8364
+ const computed = window.getComputedStyle(div).color;
8365
+ document.body.removeChild(div);
8366
+ return computed;
8367
+ };
8368
+ const isValidColor = (color2) => {
8369
+ if (/^\d+\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/.test(color2.trim())) {
8370
+ return true;
8371
+ }
8372
+ const div = document.createElement("div");
8373
+ const prevColor = div.style.color;
8374
+ div.style.color = color2;
8375
+ return div.style.color !== prevColor;
8376
+ };
8377
+ const rgbToShadcnHsl = (r2, g2, b2) => {
8378
+ r2 /= 255;
8379
+ g2 /= 255;
8380
+ b2 /= 255;
8381
+ const max2 = Math.max(r2, g2, b2);
8382
+ const min2 = Math.min(r2, g2, b2);
8383
+ let h2 = 0, s2 = 0;
8384
+ const l2 = (max2 + min2) / 2;
8385
+ if (max2 !== min2) {
8386
+ const d2 = max2 - min2;
8387
+ s2 = l2 > 0.5 ? d2 / (2 - max2 - min2) : d2 / (max2 + min2);
8388
+ switch (max2) {
8389
+ case r2:
8390
+ h2 = (g2 - b2) / d2 + (g2 < b2 ? 6 : 0);
8391
+ break;
8392
+ case g2:
8393
+ h2 = (b2 - r2) / d2 + 2;
8394
+ break;
8395
+ case b2:
8396
+ h2 = (r2 - g2) / d2 + 4;
8397
+ break;
8398
+ }
8399
+ h2 *= 60;
8400
+ }
8401
+ return `${Math.round(h2)} ${Math.round(s2 * 100)}% ${Math.round(l2 * 100)}%`;
8402
+ };
8403
+ const extractRgb = (rgbColor) => {
8404
+ const matches = rgbColor.match(/\d+/g);
8405
+ if (!matches || matches.length < 3) {
8406
+ throw new Error(`Invalid RGB color format: ${rgbColor}`);
8407
+ }
8408
+ return [
8409
+ parseInt(matches[0], 10),
8410
+ parseInt(matches[1], 10),
8411
+ parseInt(matches[2], 10)
8412
+ ];
8413
+ };
8414
+ const toShadcnFormat = (color2) => {
8415
+ if (/^\d+\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/.test(color2.trim())) {
8416
+ return color2.trim();
8417
+ }
8418
+ try {
8419
+ const rgbColor = normalizeColor(color2);
8420
+ const [r2, g2, b2] = extractRgb(rgbColor);
8421
+ return rgbToShadcnHsl(r2, g2, b2);
8422
+ } catch (e2) {
8423
+ console.warn(`Failed to convert color to shadcn format: ${color2}`, e2);
8424
+ return color2;
8425
+ }
8426
+ };
8427
+ const DEFAULT_THEME_STYLES = {
8428
+ primary: "hsl(222.2 47.4% 11.2%)",
8429
+ background: "hsl(0 0% 100%)",
8430
+ foreground: "hsl(222.2 47.4% 11.2%)",
8431
+ "primary-foreground": "hsl(210 40% 98%)",
8432
+ secondary: "hsl(210 40% 96.1%)",
8433
+ "secondary-foreground": "hsl(222.2 47.4% 11.2%)",
8434
+ muted: "hsl(210 40% 96.1%)",
8435
+ "muted-foreground": "hsl(215.4 16.3% 46.9%)",
8436
+ accent: "hsl(210 40% 96.1%)",
8437
+ "accent-foreground": "hsl(222.2 47.4% 11.2%)",
8438
+ border: "hsl(214.3 31.8% 91.4%)",
8439
+ input: "hsl(214.3 31.8% 91.4%)",
8440
+ ring: "hsl(222.2 84% 4.9%)",
8441
+ destructive: "hsl(0 84.2% 60.2%)",
8442
+ "destructive-foreground": "hsl(210 40% 98%)",
8443
+ card: "hsl(0 0% 100%)",
8444
+ "card-foreground": "hsl(222.2 47.4% 11.2%)",
8445
+ popover: "hsl(0 0% 100%)",
8446
+ "popover-foreground": "hsl(222.2 47.4% 11.2%)",
8447
+ "font-body": 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
8448
+ "font-heading": 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
8449
+ };
8450
+ const applyThemeStyles = (styles2) => {
8451
+ const existingStyles = document.getElementById("reach-theme-styles");
8452
+ if (existingStyles) {
8453
+ existingStyles.remove();
8454
+ }
8455
+ const styleElement = document.createElement("style");
8456
+ styleElement.id = "reach-theme-styles";
8457
+ const cssText = `
8458
+ [data-reach-root] {
8459
+ ${Object.entries(DEFAULT_THEME_STYLES).map(([key, defaultValue]) => {
8460
+ const userValue = styles2[key];
8461
+ let finalValue = defaultValue;
8462
+ if (userValue !== void 0) {
8463
+ if (key === "radius" || key === "font-body" || key === "font-heading") {
8464
+ finalValue = userValue;
8465
+ } else if (isValidColor(userValue)) {
8466
+ try {
8467
+ finalValue = toShadcnFormat(userValue);
8468
+ } catch (e2) {
8469
+ console.warn(
8470
+ `Failed to convert color for ${key}, using default`
8471
+ );
8472
+ }
8473
+ }
8474
+ }
8475
+ return `--reach-${key}: ${finalValue};`;
8476
+ }).join("\n")}
8477
+ }
8478
+
8479
+ /* Apply font families directly */
8480
+ [data-reach-root] {
8481
+ font-family: var(--reach-font-body);
8482
+ }
8483
+
8484
+ [data-reach-root] h1,
8485
+ [data-reach-root] h2,
8486
+ [data-reach-root] h3,
8487
+ [data-reach-root] h4,
8488
+ [data-reach-root] h5,
8489
+ [data-reach-root] h6 {
8490
+ font-family: var(--reach-font-heading);
8491
+ }
8492
+ `;
8493
+ styleElement.textContent = cssText;
8494
+ document.head.appendChild(styleElement);
8495
+ };
8496
+ const mergeThemeStyles = (themeConfig, overrides) => {
8497
+ return {
8498
+ ...DEFAULT_THEME_STYLES,
8499
+ ...themeConfig?.styles || {},
8500
+ ...{}
8501
+ };
8502
+ };
8503
+ const themeReducer = (state, action) => {
8504
+ switch (action.type) {
8505
+ case "set_theme":
8506
+ if (action.payload && !state.theme) {
8507
+ applyThemeStyles(action.payload.styles);
8508
+ }
8509
+ return {
8510
+ ...state,
8511
+ loading: false,
8512
+ error: null,
8513
+ theme: action.payload
8514
+ };
8515
+ case "set_loading":
8516
+ return {
8517
+ ...state,
8518
+ loading: action.payload
8519
+ };
8520
+ case "set_error":
8521
+ return {
8522
+ ...state,
8523
+ loading: false,
8524
+ error: action.payload
8525
+ };
8526
+ default:
8527
+ return state;
8528
+ }
8529
+ };
8530
+ const setTheme = (dispatch2) => (theme2) => dispatch2({ type: "set_theme", payload: theme2 });
8531
+ const setLoading = (dispatch2) => (loading2) => dispatch2({ type: "set_loading", payload: loading2 });
8532
+ const setError = (dispatch2) => (error2) => dispatch2({ type: "set_error", payload: error2 });
8533
+ const { Context, Provider: Provider$2 } = createDataContext(
8534
+ themeReducer,
8535
+ {
8536
+ setTheme,
8537
+ setLoading,
8538
+ setError
8539
+ },
8540
+ {
8541
+ theme: null,
8542
+ loading: true,
8543
+ error: null
8544
+ }
8545
+ );
8546
+ const useThemeContext = () => {
8547
+ const context = React.useContext(Context);
8548
+ if (context === void 0) {
8549
+ throw new Error("useThemeContext must be used within a ThemeProvider");
8550
+ }
8551
+ const applyTheme = (themeConfig) => {
8552
+ if (!themeConfig) return;
8553
+ const mergedStyles = mergeThemeStyles(themeConfig);
8554
+ const finalTheme = {
8555
+ styles: mergedStyles
8556
+ };
8557
+ context.setTheme(finalTheme);
8558
+ };
8559
+ return {
8560
+ ...context.state,
8561
+ setTheme: context.setTheme,
8562
+ setLoading: context.setLoading,
8563
+ setError: context.setError,
8564
+ // Add the helper function
8565
+ applyTheme
8566
+ };
8567
+ };
8568
+ const ThemeProvider = ({
8569
+ children: children2,
8570
+ theme: theme2
8571
+ }) => {
8572
+ const { t: t2 } = useTranslation();
8573
+ const { loading: themeLoading, applyTheme } = useThemeContext();
8574
+ const themeApplied = React.useRef(false);
8393
8575
  React.useEffect(() => {
8394
- if (isMounted.current && ready) {
8395
- setT(getT);
8396
- }
8397
- }, [i18n, keyPrefix, ready]);
8398
- const ret = [t2, i18n, ready];
8399
- ret.t = t2;
8400
- ret.i18n = i18n;
8401
- ret.ready = ready;
8402
- if (ready) return ret;
8403
- if (!ready && !useSuspense) return ret;
8404
- throw new Promise((resolve) => {
8405
- if (props.lng) {
8406
- loadLanguages(i18n, props.lng, namespaces, () => resolve());
8407
- } else {
8408
- loadNamespaces(i18n, namespaces, () => resolve());
8576
+ if (!themeApplied.current && theme2) {
8577
+ applyTheme(theme2);
8578
+ themeApplied.current = true;
8409
8579
  }
8410
- });
8580
+ }, [applyTheme, theme2]);
8581
+ if (themeLoading && theme2) {
8582
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col justify-center items-center h-screen", children: /* @__PURE__ */ jsxRuntime.jsx(SpinLoader, { text: [t2("loading")] }) });
8583
+ }
8584
+ return /* @__PURE__ */ jsxRuntime.jsx(Provider$2, { children: children2 });
8411
8585
  };
8412
- function I18nextProvider({
8413
- i18n,
8414
- defaultNS,
8415
- children: children2
8416
- }) {
8417
- const value = React.useMemo(() => ({
8418
- i18n,
8419
- defaultNS
8420
- }), [i18n, defaultNS]);
8421
- return React.createElement(I18nContext$1.Provider, {
8422
- value
8423
- }, children2);
8424
- }
8425
8586
  const isString$1 = (obj) => typeof obj === "string";
8426
8587
  const defer = () => {
8427
8588
  let res;
@@ -11894,167 +12055,6 @@
11894
12055
  }, [initialLanguage]);
11895
12056
  return /* @__PURE__ */ jsxRuntime.jsx(I18nextProvider, { i18n: instance, children: children2 });
11896
12057
  };
11897
- const useThemeContext = () => {
11898
- const context = React.useContext(Context);
11899
- if (context === void 0) {
11900
- throw new Error("useThemeContext must be used within a ThemeProvider");
11901
- }
11902
- const applyTheme = (themeConfig) => {
11903
- if (!themeConfig) return;
11904
- const mergedStyles = mergeThemeStyles(themeConfig);
11905
- const finalTheme = {
11906
- styles: mergedStyles
11907
- };
11908
- context.setTheme(finalTheme);
11909
- };
11910
- return {
11911
- ...context.state,
11912
- setTheme: context.setTheme,
11913
- setLoading: context.setLoading,
11914
- setError: context.setError,
11915
- // Add the helper function
11916
- applyTheme
11917
- };
11918
- };
11919
- const H3 = ({ children: children2 }) => {
11920
- return /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "scroll-m-20 text-2xl font-semibold tracking-tight", children: children2 });
11921
- };
11922
- const SpinLoader = ({
11923
- size: size3 = 35,
11924
- color: color2 = "black",
11925
- speed = 0.9,
11926
- strokeWidth = 3.5,
11927
- text,
11928
- textSpeed = 2e3,
11929
- // Default 2 seconds per text
11930
- textColor = "black"
11931
- }) => {
11932
- const [currentTextIndex, setCurrentTextIndex] = React.useState(0);
11933
- const textArray = Array.isArray(text) ? text : text ? [text] : [];
11934
- React.useEffect(() => {
11935
- if (textArray.length <= 1) return;
11936
- if (currentTextIndex >= textArray.length - 1) return;
11937
- const interval = setInterval(() => {
11938
- setCurrentTextIndex(
11939
- (current) => current < textArray.length - 1 ? current + 1 : current
11940
- );
11941
- }, textSpeed);
11942
- return () => clearInterval(interval);
11943
- }, [textArray.length, textSpeed, currentTextIndex]);
11944
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col justify-center items-center h-full", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
11945
- /* @__PURE__ */ jsxRuntime.jsxs(
11946
- "div",
11947
- {
11948
- className: "loader-container",
11949
- style: {
11950
- "--uib-size": `${size3}px`,
11951
- "--uib-color": color2,
11952
- "--uib-speed": `${speed}s`,
11953
- "--uib-stroke": `${strokeWidth}px`
11954
- },
11955
- children: [
11956
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
11957
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
11958
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
11959
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
11960
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" }),
11961
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line" })
11962
- ]
11963
- }
11964
- ),
11965
- textArray.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
11966
- "div",
11967
- {
11968
- className: `text-center text-sm text-muted-foreground animate-fade-in ${textColor ? `text-${textColor}` : ""}`,
11969
- children: /* @__PURE__ */ jsxRuntime.jsx(H3, { children: textArray[currentTextIndex] })
11970
- },
11971
- currentTextIndex
11972
- ),
11973
- /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
11974
- .loader-container {
11975
- position: relative;
11976
- display: flex;
11977
- align-items: center;
11978
- justify-content: center;
11979
- height: var(--uib-size);
11980
- width: var(--uib-size);
11981
- }
11982
- .line {
11983
- position: absolute;
11984
- top: calc(50% - var(--uib-stroke) / 2);
11985
- left: 0;
11986
- height: var(--uib-stroke);
11987
- width: 100%;
11988
- border-radius: calc(var(--uib-stroke) / 2);
11989
- background-color: var(--uib-color);
11990
- animation: rotate var(--uib-speed) ease-in-out infinite;
11991
- transition: background-color 0.3s ease;
11992
- }
11993
- .line:nth-child(1) {
11994
- animation-delay: calc(var(--uib-speed) * -0.375);
11995
- }
11996
- .line:nth-child(2) {
11997
- animation-delay: calc(var(--uib-speed) * -0.375);
11998
- opacity: 0.8;
11999
- }
12000
- .line:nth-child(3) {
12001
- animation-delay: calc(var(--uib-speed) * -0.3);
12002
- opacity: 0.6;
12003
- }
12004
- .line:nth-child(4) {
12005
- animation-delay: calc(var(--uib-speed) * -0.225);
12006
- opacity: 0.4;
12007
- }
12008
- .line:nth-child(5) {
12009
- animation-delay: calc(var(--uib-speed) * -0.15);
12010
- opacity: 0.2;
12011
- }
12012
- .line:nth-child(6) {
12013
- animation-delay: calc(var(--uib-speed) * -0.075);
12014
- opacity: 0.1;
12015
- }
12016
- @keyframes rotate {
12017
- 0% {
12018
- transform: rotate(0deg);
12019
- }
12020
- 100% {
12021
- transform: rotate(180deg);
12022
- }
12023
- }
12024
- .animate-fade-in {
12025
- animation: fadeIn 0.5s ease-in-out;
12026
- }
12027
- @keyframes fadeIn {
12028
- from {
12029
- opacity: 0;
12030
- transform: translateY(5px);
12031
- }
12032
- to {
12033
- opacity: 1;
12034
- transform: translateY(0);
12035
- }
12036
- }
12037
- ` })
12038
- ] }) });
12039
- };
12040
- const ReachProviderThemeProvider = ({
12041
- children: children2,
12042
- theme: theme2
12043
- }) => {
12044
- const { t: t2 } = useTranslation();
12045
- const { loading: themeLoading, applyTheme } = useThemeContext();
12046
- const themeApplied = React.useRef(false);
12047
- React.useEffect(() => {
12048
- if (!themeApplied.current && theme2) {
12049
- applyTheme(theme2);
12050
- themeApplied.current = true;
12051
- }
12052
- }, [applyTheme, theme2]);
12053
- if (themeLoading && theme2) {
12054
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col justify-center items-center h-screen", children: /* @__PURE__ */ jsxRuntime.jsx(SpinLoader, { text: [t2("loading")] }) });
12055
- }
12056
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: children2 });
12057
- };
12058
12058
  const TOAST_LIMIT = 1;
12059
12059
  const TOAST_REMOVE_DELAY = 1e6;
12060
12060
  let count$2 = 0;
@@ -16600,8 +16600,8 @@
16600
16600
  useCamelCaseFlagKeys: false,
16601
16601
  sendEventsOnFlagRead: true
16602
16602
  },
16603
- children: /* @__PURE__ */ jsxRuntime.jsx(I18nProvider, { initialLanguage: language, children: /* @__PURE__ */ jsxRuntime.jsx(Provider$2, { children: /* @__PURE__ */ jsxRuntime.jsxs(Provider$3, { children: [
16604
- /* @__PURE__ */ jsxRuntime.jsx(ReachProviderThemeProvider, { theme: theme2, children: children2 }),
16603
+ children: /* @__PURE__ */ jsxRuntime.jsx(I18nProvider, { initialLanguage: language, children: /* @__PURE__ */ jsxRuntime.jsx(ThemeProvider, { theme: theme2, children: /* @__PURE__ */ jsxRuntime.jsxs(Provider$3, { children: [
16604
+ children2,
16605
16605
  /* @__PURE__ */ jsxRuntime.jsx(Toaster, {})
16606
16606
  ] }) }) })
16607
16607
  }