@retinalabsllc/zairusjs 21.1.3 → 21.1.5

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.js CHANGED
@@ -59,15 +59,20 @@ __export(index_exports, {
59
59
  PipleAuth: () => PipleAuth,
60
60
  PlatformFeatures: () => PlatformFeatures,
61
61
  PortfolioHero: () => PortfolioHero,
62
+ RootSidebar: () => RootSidebar,
62
63
  TextInput: () => TextInput,
63
64
  ThreeDActionButton: () => ThreeDActionButton,
64
65
  ThreeDButton: () => ThreeDButton,
66
+ UniversalApplicationPage2: () => UniversalApplicationPage2,
67
+ UniversalApplicationsPage: () => UniversalApplicationsPage,
65
68
  UniversalBuyCryptoPage: () => UniversalBuyCryptoPage,
66
69
  UniversalCardActionPage: () => UniversalCardActionPage,
67
70
  UniversalCardPage: () => UniversalCardPage,
68
71
  UniversalCreateHuddle: () => UniversalCreateHuddle,
72
+ UniversalDeveloperSettings: () => UniversalDeveloperSettings,
69
73
  UniversalErrorView: () => UniversalErrorView,
70
74
  UniversalHome2: () => UniversalHome2,
75
+ UniversalHome3: () => UniversalHome3,
71
76
  UniversalHomeView: () => UniversalHomeView,
72
77
  UniversalHuddleDetails: () => UniversalHuddleDetails,
73
78
  UniversalHuddlesPage: () => UniversalHuddlesPage,
@@ -79,6 +84,7 @@ __export(index_exports, {
79
84
  UniversalRewardPage: () => UniversalRewardPage,
80
85
  UniversalSecurityPage: () => UniversalSecurityPage,
81
86
  UniversalSettings: () => UniversalSettings,
87
+ UniversalSettings2: () => UniversalSettings2,
82
88
  UniversalSidebar: () => UniversalSidebar,
83
89
  UniversalTransactionPage: () => UniversalTransactionPage,
84
90
  UniversalVerificationPage: () => UniversalVerificationPage,
@@ -3388,6 +3394,7 @@ var ManagedDocument = ({
3388
3394
  var import_react55 = __toESM(require("react"));
3389
3395
  var import_react56 = require("@hugeicons/react");
3390
3396
  var import_core_free_icons20 = require("@hugeicons/core-free-icons");
3397
+ var import_react_hot_toast10 = __toESM(require("react-hot-toast"));
3391
3398
  var TextInput2 = ({
3392
3399
  label,
3393
3400
  value,
@@ -3464,11 +3471,9 @@ var ManagedContactBlock = ({
3464
3471
  }) => {
3465
3472
  const [formData, setFormData] = (0, import_react55.useState)({ name: "", email: "", title: "", phone: "", message: "" });
3466
3473
  const [status, setStatus] = (0, import_react55.useState)("idle");
3467
- const [responseMessage, setResponseMessage] = (0, import_react55.useState)("");
3468
3474
  const handleSubmit = async (e) => {
3469
3475
  e.preventDefault();
3470
3476
  setStatus("loading");
3471
- setResponseMessage("");
3472
3477
  try {
3473
3478
  const res = await fetch("/api/contact", {
3474
3479
  method: "POST",
@@ -3478,15 +3483,15 @@ var ManagedContactBlock = ({
3478
3483
  const data = await res.json();
3479
3484
  if (res.ok) {
3480
3485
  setStatus("success");
3481
- setResponseMessage(data.message || "Message sent successfully!");
3486
+ import_react_hot_toast10.default.success(data.message || "Message sent successfully!");
3482
3487
  setFormData({ name: "", email: "", title: "", phone: "", message: "" });
3483
3488
  } else {
3484
3489
  setStatus("error");
3485
- setResponseMessage(data.error || "Failed to send message.");
3490
+ import_react_hot_toast10.default.error(data.error || "Failed to send message.");
3486
3491
  }
3487
3492
  } catch (error) {
3488
3493
  setStatus("error");
3489
- setResponseMessage("An unexpected error occurred. Please try again.");
3494
+ import_react_hot_toast10.default.error("An unexpected error occurred. Please try again.");
3490
3495
  }
3491
3496
  };
3492
3497
  return /* @__PURE__ */ import_react55.default.createElement("div", { className: "grow pt-4 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ import_react55.default.createElement(
@@ -3570,7 +3575,7 @@ var ManagedContactBlock = ({
3570
3575
  onChange: (val) => setFormData({ ...formData, message: val }),
3571
3576
  disabled: status === "loading"
3572
3577
  }
3573
- ), responseMessage && /* @__PURE__ */ import_react55.default.createElement("p", { className: `text-sm ${status === "error" ? "text-red-500" : "text-green-600"}` }, responseMessage), /* @__PURE__ */ import_react55.default.createElement("div", { className: "pt-4" }, /* @__PURE__ */ import_react55.default.createElement(
3578
+ ), /* @__PURE__ */ import_react55.default.createElement("div", { className: "pt-4" }, /* @__PURE__ */ import_react55.default.createElement(
3574
3579
  ThreeDActionButton2,
3575
3580
  {
3576
3581
  type: "submit",
@@ -4273,7 +4278,7 @@ var UniversalVerificationPage = ({
4273
4278
  // src/components/UniversalRewardPage.tsx
4274
4279
  var import_react73 = __toESM(require("react"));
4275
4280
  var import_axios = __toESM(require("axios"));
4276
- var import_react_hot_toast10 = __toESM(require("react-hot-toast"));
4281
+ var import_react_hot_toast11 = __toESM(require("react-hot-toast"));
4277
4282
  var import_react_confetti = __toESM(require("react-confetti"));
4278
4283
  var import_react_use = require("react-use");
4279
4284
  var import_react74 = require("@hugeicons/react");
@@ -4324,7 +4329,7 @@ var UniversalRewardPage = ({
4324
4329
  const res = await import_axios.default.post(selectedReward.endpoint, selectedReward.config);
4325
4330
  if (res.data.success) {
4326
4331
  setShowConfetti(true);
4327
- import_react_hot_toast10.default.success(res.data.message || "Reward claimed successfully!");
4332
+ import_react_hot_toast11.default.success(res.data.message || "Reward claimed successfully!");
4328
4333
  setSelectedReward(null);
4329
4334
  onRefresh();
4330
4335
  setTimeout(() => {
@@ -4332,7 +4337,7 @@ var UniversalRewardPage = ({
4332
4337
  }, 6e3);
4333
4338
  }
4334
4339
  } catch (error) {
4335
- import_react_hot_toast10.default.error(error.response?.data?.error || "Failed to claim reward. Please try again.");
4340
+ import_react_hot_toast11.default.error(error.response?.data?.error || "Failed to claim reward. Please try again.");
4336
4341
  } finally {
4337
4342
  setIsClaiming(false);
4338
4343
  }
@@ -4382,7 +4387,7 @@ var UniversalRewardPage = ({
4382
4387
 
4383
4388
  // src/components/UniversalReferralPage.tsx
4384
4389
  var import_react75 = __toESM(require("react"));
4385
- var import_react_hot_toast11 = __toESM(require("react-hot-toast"));
4390
+ var import_react_hot_toast12 = __toESM(require("react-hot-toast"));
4386
4391
  var import_react76 = require("@hugeicons/react");
4387
4392
  var import_core_free_icons27 = require("@hugeicons/core-free-icons");
4388
4393
  var PageSpinner5 = () => /* @__PURE__ */ import_react75.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react75.default.createElement(import_react76.HugeiconsIcon, { icon: import_core_free_icons27.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
@@ -4411,9 +4416,9 @@ var UniversalReferralPage = ({
4411
4416
  if (!referralCode) return;
4412
4417
  try {
4413
4418
  await navigator.clipboard.writeText(referralCode);
4414
- import_react_hot_toast11.default.success("Referral code copied!");
4419
+ import_react_hot_toast12.default.success("Referral code copied!");
4415
4420
  } catch {
4416
- import_react_hot_toast11.default.error("Failed to copy code.");
4421
+ import_react_hot_toast12.default.error("Failed to copy code.");
4417
4422
  }
4418
4423
  };
4419
4424
  const AvatarLogo2 = ({ src, alt, name, sizeClass = "w-10 h-10" }) => {
@@ -4718,7 +4723,7 @@ var PinDialerBottomSheet = ({
4718
4723
 
4719
4724
  // src/components/UniversalBuyCryptoPage.tsx
4720
4725
  var import_react81 = __toESM(require("react"));
4721
- var import_react_hot_toast12 = __toESM(require("react-hot-toast"));
4726
+ var import_react_hot_toast13 = __toESM(require("react-hot-toast"));
4722
4727
  var import_react82 = require("@hugeicons/react");
4723
4728
  var import_core_free_icons30 = require("@hugeicons/core-free-icons");
4724
4729
  var CircularLogo = ({ src, alt, fallbackText }) => {
@@ -4841,7 +4846,7 @@ var UniversalBuyCryptoPage = ({
4841
4846
  if (result.ratePerToken) setRateDisplay(result.ratePerToken);
4842
4847
  if (result.rateKey) setCurrentRateKey(result.rateKey);
4843
4848
  } catch {
4844
- import_react_hot_toast12.default.error("Failed to calculate live rate.");
4849
+ import_react_hot_toast13.default.error("Failed to calculate live rate.");
4845
4850
  } finally {
4846
4851
  setIsCalculating(false);
4847
4852
  }
@@ -4872,11 +4877,11 @@ var UniversalBuyCryptoPage = ({
4872
4877
  const handleCheckout = async () => {
4873
4878
  const numFiat = parseFloat(fiatAmount) || 0;
4874
4879
  const numCrypto = parseFloat(cryptoAmount) || 0;
4875
- if (numFiat <= 0 || numCrypto <= 0) return import_react_hot_toast12.default.error("Please enter a valid amount.");
4880
+ if (numFiat <= 0 || numCrypto <= 0) return import_react_hot_toast13.default.error("Please enter a valid amount.");
4876
4881
  if (selectedNetwork.minimumWithdrawal && numCrypto < selectedNetwork.minimumWithdrawal) {
4877
- return import_react_hot_toast12.default.error(`Minimum purchase for ${selectedNetwork.name} is ${selectedNetwork.minimumWithdrawal} ${selectedCrypto.code}`);
4882
+ return import_react_hot_toast13.default.error(`Minimum purchase for ${selectedNetwork.name} is ${selectedNetwork.minimumWithdrawal} ${selectedCrypto.code}`);
4878
4883
  }
4879
- if (!recipientAddress.trim() || !isAddressValid) return import_react_hot_toast12.default.error("Please enter a valid wallet address.");
4884
+ if (!recipientAddress.trim() || !isAddressValid) return import_react_hot_toast13.default.error("Please enter a valid wallet address.");
4880
4885
  if (onSubmitCheckout) {
4881
4886
  setIsSubmitting(true);
4882
4887
  try {
@@ -5075,7 +5080,7 @@ var UniversalHuddlesPage = ({
5075
5080
  // src/components/UniversalMembersPage.tsx
5076
5081
  var import_react85 = __toESM(require("react"));
5077
5082
  var import_react86 = require("@hugeicons/react");
5078
- var import_react_hot_toast13 = __toESM(require("react-hot-toast"));
5083
+ var import_react_hot_toast14 = __toESM(require("react-hot-toast"));
5079
5084
  var import_core_free_icons32 = require("@hugeicons/core-free-icons");
5080
5085
  var MemberAvatar2 = ({ src, status }) => {
5081
5086
  const [loaded, setLoaded] = (0, import_react85.useState)(false);
@@ -5170,11 +5175,11 @@ var UniversalMembersPage = ({
5170
5175
  setIsRemoving(true);
5171
5176
  try {
5172
5177
  await onRemoveMember(memberToRemove.id);
5173
- import_react_hot_toast13.default.success("Member removed successfully.");
5178
+ import_react_hot_toast14.default.success("Member removed successfully.");
5174
5179
  setExpandedId(null);
5175
5180
  setMemberToRemove(null);
5176
5181
  } catch (error) {
5177
- import_react_hot_toast13.default.error("Failed to remove member.");
5182
+ import_react_hot_toast14.default.error("Failed to remove member.");
5178
5183
  } finally {
5179
5184
  setIsRemoving(false);
5180
5185
  }
@@ -5188,7 +5193,7 @@ var UniversalMembersPage = ({
5188
5193
  setInviteEmail("");
5189
5194
  setIsInviteMode(false);
5190
5195
  } catch (error) {
5191
- import_react_hot_toast13.default.error(error.message || "Failed to send invitation.");
5196
+ import_react_hot_toast14.default.error(error.message || "Failed to send invitation.");
5192
5197
  } finally {
5193
5198
  setIsInviting(false);
5194
5199
  }
@@ -5335,7 +5340,7 @@ var UniversalMembersPage = ({
5335
5340
  var import_react87 = __toESM(require("react"));
5336
5341
  var import_navigation6 = require("next/navigation");
5337
5342
  var import_react88 = require("@hugeicons/react");
5338
- var import_react_hot_toast14 = __toESM(require("react-hot-toast"));
5343
+ var import_react_hot_toast15 = __toESM(require("react-hot-toast"));
5339
5344
  var import_core_free_icons33 = require("@hugeicons/core-free-icons");
5340
5345
  var OrgAvatar = ({ src, sizeClass = "w-10 h-10" }) => {
5341
5346
  const [loaded, setLoaded] = (0, import_react87.useState)(false);
@@ -5390,7 +5395,7 @@ var UniversalHome2 = ({
5390
5395
  await onResolveInvite(selectedNotif, resolution);
5391
5396
  window.location.reload();
5392
5397
  } catch (error) {
5393
- import_react_hot_toast14.default.error("Failed to process invitation");
5398
+ import_react_hot_toast15.default.error("Failed to process invitation");
5394
5399
  setIsResolving(false);
5395
5400
  }
5396
5401
  };
@@ -5399,7 +5404,7 @@ var UniversalHome2 = ({
5399
5404
  try {
5400
5405
  if (onLogout) await onLogout();
5401
5406
  } catch (e) {
5402
- import_react_hot_toast14.default.error("Failed to log out cleanly.");
5407
+ import_react_hot_toast15.default.error("Failed to log out cleanly.");
5403
5408
  } finally {
5404
5409
  setIsLoggingOut(false);
5405
5410
  setShowLogoutConfirm(false);
@@ -5552,7 +5557,7 @@ var UniversalHome2 = ({
5552
5557
 
5553
5558
  // src/components/UniversalSettings.tsx
5554
5559
  var import_react89 = __toESM(require("react"));
5555
- var import_react_hot_toast15 = __toESM(require("react-hot-toast"));
5560
+ var import_react_hot_toast16 = __toESM(require("react-hot-toast"));
5556
5561
  var import_react90 = require("@hugeicons/react");
5557
5562
  var import_core_free_icons34 = require("@hugeicons/core-free-icons");
5558
5563
  var MemberAvatar3 = ({ src, status, sizeClass = "w-10 h-10" }) => {
@@ -5685,13 +5690,13 @@ var UniversalSettings = ({
5685
5690
  const file = e.target.files?.[0];
5686
5691
  if (!file) return;
5687
5692
  if (file.size > 1024 * 1024) {
5688
- import_react_hot_toast15.default.error("Image size must be less than 1MB.");
5693
+ import_react_hot_toast16.default.error("Image size must be less than 1MB.");
5689
5694
  e.target.value = "";
5690
5695
  return;
5691
5696
  }
5692
5697
  const validTypes = ["image/jpeg", "image/jpg", "image/png"];
5693
5698
  if (!validTypes.includes(file.type)) {
5694
- import_react_hot_toast15.default.error("Only PNG and JPEG images are allowed.");
5699
+ import_react_hot_toast16.default.error("Only PNG and JPEG images are allowed.");
5695
5700
  e.target.value = "";
5696
5701
  return;
5697
5702
  }
@@ -5726,11 +5731,11 @@ var UniversalSettings = ({
5726
5731
  setIsRemoving(true);
5727
5732
  try {
5728
5733
  await onRemoveMember(memberToRemove.userId);
5729
- import_react_hot_toast15.default.success("Member removed successfully.");
5734
+ import_react_hot_toast16.default.success("Member removed successfully.");
5730
5735
  setExpandedId(null);
5731
5736
  setMemberToRemove(null);
5732
5737
  } catch (error) {
5733
- import_react_hot_toast15.default.error(error.message || "Failed to remove member.");
5738
+ import_react_hot_toast16.default.error(error.message || "Failed to remove member.");
5734
5739
  } finally {
5735
5740
  setIsRemoving(false);
5736
5741
  }
@@ -5744,7 +5749,7 @@ var UniversalSettings = ({
5744
5749
  setInviteEmail("");
5745
5750
  setIsInviteMode(false);
5746
5751
  } catch (error) {
5747
- import_react_hot_toast15.default.error(error.message || "Failed to send invitation.");
5752
+ import_react_hot_toast16.default.error(error.message || "Failed to send invitation.");
5748
5753
  } finally {
5749
5754
  setIsInviting(false);
5750
5755
  }
@@ -5792,7 +5797,7 @@ var UniversalSettings = ({
5792
5797
  const handleSaveOrganization = async (e) => {
5793
5798
  e.preventDefault();
5794
5799
  if (isSavingOrg || isCheckingSlug || !canManage || !onSaveOrganization) return;
5795
- if (orgSlug !== initialOrgSlug && slugAvailable === false) return import_react_hot_toast15.default.error("Address handle unavailable.");
5800
+ if (orgSlug !== initialOrgSlug && slugAvailable === false) return import_react_hot_toast16.default.error("Address handle unavailable.");
5796
5801
  setIsSavingOrg(true);
5797
5802
  try {
5798
5803
  let finalAvatarUrl = orgAvatarUrl;
@@ -5805,7 +5810,7 @@ var UniversalSettings = ({
5805
5810
  setOrgAvatarUrl(finalAvatarUrl);
5806
5811
  }
5807
5812
  } catch (err) {
5808
- import_react_hot_toast15.default.error("Failed to securely upload workspace avatar.");
5813
+ import_react_hot_toast16.default.error("Failed to securely upload workspace avatar.");
5809
5814
  setIsSavingOrg(false);
5810
5815
  setIsUploadingOrgAvatar(false);
5811
5816
  return;
@@ -5814,10 +5819,10 @@ var UniversalSettings = ({
5814
5819
  setIsUploadingOrgAvatar(false);
5815
5820
  }
5816
5821
  const res = await onSaveOrganization({ name: orgName, slug: orgSlug, avatarUrl: finalAvatarUrl });
5817
- if (res.success) import_react_hot_toast15.default.success("Workspace updated successfully.");
5818
- else import_react_hot_toast15.default.error(res.error || "Failed to update workspace.");
5822
+ if (res.success) import_react_hot_toast16.default.success("Workspace updated successfully.");
5823
+ else import_react_hot_toast16.default.error(res.error || "Failed to update workspace.");
5819
5824
  } catch (error) {
5820
- import_react_hot_toast15.default.error("Service unavailable.");
5825
+ import_react_hot_toast16.default.error("Service unavailable.");
5821
5826
  } finally {
5822
5827
  setIsSavingOrg(false);
5823
5828
  setIsUploadingOrgAvatar(false);
@@ -5838,7 +5843,7 @@ var UniversalSettings = ({
5838
5843
  setAvatarUrl(finalAvatarUrl);
5839
5844
  }
5840
5845
  } catch (err) {
5841
- import_react_hot_toast15.default.error("Failed to securely upload profile avatar.");
5846
+ import_react_hot_toast16.default.error("Failed to securely upload profile avatar.");
5842
5847
  setIsSavingProfile(false);
5843
5848
  setIsUploadingUserAvatar(false);
5844
5849
  return;
@@ -5847,10 +5852,10 @@ var UniversalSettings = ({
5847
5852
  setIsUploadingUserAvatar(false);
5848
5853
  }
5849
5854
  const res = await onSaveProfile({ firstName, lastName, jobTitle, description, avatarUrl: finalAvatarUrl });
5850
- if (res.success) import_react_hot_toast15.default.success("Identity updated successfully.");
5851
- else import_react_hot_toast15.default.error(res.error || "Failed to update identity.");
5855
+ if (res.success) import_react_hot_toast16.default.success("Identity updated successfully.");
5856
+ else import_react_hot_toast16.default.error(res.error || "Failed to update identity.");
5852
5857
  } catch (error) {
5853
- import_react_hot_toast15.default.error("Service unavailable.");
5858
+ import_react_hot_toast16.default.error("Service unavailable.");
5854
5859
  } finally {
5855
5860
  setIsSavingProfile(false);
5856
5861
  setIsUploadingUserAvatar(false);
@@ -5917,7 +5922,7 @@ var UniversalSettings = ({
5917
5922
 
5918
5923
  // src/components/UniversalCreateHuddle.tsx
5919
5924
  var import_react91 = __toESM(require("react"));
5920
- var import_react_hot_toast16 = __toESM(require("react-hot-toast"));
5925
+ var import_react_hot_toast17 = __toESM(require("react-hot-toast"));
5921
5926
  var import_react92 = require("@hugeicons/react");
5922
5927
  var import_core_free_icons35 = require("@hugeicons/core-free-icons");
5923
5928
  var MemberAvatar4 = ({ src, sizeClass = "w-10 h-10" }) => {
@@ -6008,8 +6013,8 @@ var UniversalCreateHuddle = ({
6008
6013
  e.preventDefault();
6009
6014
  if (!canManage) return;
6010
6015
  const cleanTitle = title.trim();
6011
- if (cleanTitle.length < 2) return import_react_hot_toast16.default.error("Please enter a valid huddle name.");
6012
- if (isPrivate && selectedParticipants.size === 0) return import_react_hot_toast16.default.error("Private huddles require at least one participant.");
6016
+ if (cleanTitle.length < 2) return import_react_hot_toast17.default.error("Please enter a valid huddle name.");
6017
+ if (isPrivate && selectedParticipants.size === 0) return import_react_hot_toast17.default.error("Private huddles require at least one participant.");
6013
6018
  setIsSubmitting(true);
6014
6019
  try {
6015
6020
  await onCreateSubmit({
@@ -6020,7 +6025,7 @@ var UniversalCreateHuddle = ({
6020
6025
  participantIds: isPrivate ? Array.from(selectedParticipants) : []
6021
6026
  });
6022
6027
  } catch (error) {
6023
- import_react_hot_toast16.default.error(error.message || "Failed to schedule huddle.");
6028
+ import_react_hot_toast17.default.error(error.message || "Failed to schedule huddle.");
6024
6029
  setIsSubmitting(false);
6025
6030
  }
6026
6031
  };
@@ -6327,6 +6332,1004 @@ var HomeHuddleCalendar = ({
6327
6332
  }
6328
6333
  ));
6329
6334
  };
6335
+
6336
+ // src/components/UniversalApplicationsPage.tsx
6337
+ var import_react95 = __toESM(require("react"));
6338
+ var import_react96 = require("@hugeicons/react");
6339
+ var import_core_free_icons37 = require("@hugeicons/core-free-icons");
6340
+ var formatType = (type) => {
6341
+ if (!type) return "";
6342
+ return type.split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
6343
+ };
6344
+ var ApplicationIcon = ({ icon, sizeClass = "w-10 h-10" }) => {
6345
+ return /* @__PURE__ */ import_react95.default.createElement("div", { className: `relative shrink-0 aspect-square ${sizeClass}` }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full h-full aspect-square rounded-lg bg-neutral-50 flex items-center justify-center overflow-hidden" }, icon ? /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon, size: 20, className: "text-stone-500" }) : /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-4 h-4 rounded-sm bg-stone-300" })));
6346
+ };
6347
+ var PageSpinner9 = () => /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
6348
+ var UniversalApplicationsPage = ({
6349
+ headerTitle,
6350
+ headerDescription,
6351
+ applications,
6352
+ isLoading,
6353
+ currentPage,
6354
+ totalPages,
6355
+ onPageChange,
6356
+ onApplicationClick,
6357
+ onCreateApplication
6358
+ }) => {
6359
+ return /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-row items-center justify-between gap-4" }, /* @__PURE__ */ import_react95.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, headerTitle), /* @__PURE__ */ import_react95.default.createElement(
6360
+ "button",
6361
+ {
6362
+ onClick: () => onCreateApplication?.(),
6363
+ className: "shrink-0 px-4 py-1.5 border border-stone-200 text-black text-xs tracking-wide rounded-full hover:bg-stone-50 transition-colors outline-none"
6364
+ },
6365
+ "Create new"
6366
+ )), headerDescription && /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-xs text-stone-500" }, headerDescription)), /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react95.default.createElement(PageSpinner9, null) : /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react95.default.createElement("div", null, applications.length === 0 ? /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-xs text-stone-400 py-6 text-center" }, "No applications available") : applications.map((app) => /* @__PURE__ */ import_react95.default.createElement(
6367
+ "div",
6368
+ {
6369
+ key: app.id,
6370
+ onClick: () => onApplicationClick(app.id),
6371
+ className: "flex flex-row items-center gap-4 py-2 hover:bg-stone-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl"
6372
+ },
6373
+ /* @__PURE__ */ import_react95.default.createElement(ApplicationIcon, { icon: app.icon }),
6374
+ /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-sm text-black tracking-tight truncate" }, formatType(app.type)), /* @__PURE__ */ import_react95.default.createElement("span", { className: "text-xs text-stone-500 truncate block mt-0.5" }, app.timeString)),
6375
+ /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowRight01Icon, size: 14, className: "shrink-0 text-stone-400" })
6376
+ ))), /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex items-center justify-between pt-6 mt-2 " }, /* @__PURE__ */ import_react95.default.createElement("span", { className: "text-xs text-stone-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages === 0 ? 1 : totalPages), /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react95.default.createElement(
6377
+ "button",
6378
+ {
6379
+ onClick: () => onPageChange(currentPage - 1),
6380
+ disabled: currentPage <= 1 || isLoading,
6381
+ className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
6382
+ },
6383
+ /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowLeft01Icon, size: 14 })
6384
+ ), /* @__PURE__ */ import_react95.default.createElement(
6385
+ "button",
6386
+ {
6387
+ onClick: () => onPageChange(currentPage + 1),
6388
+ disabled: currentPage >= totalPages || isLoading || totalPages === 0,
6389
+ className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
6390
+ },
6391
+ /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowRight01Icon, size: 14 })
6392
+ )))))));
6393
+ };
6394
+
6395
+ // src/components/UniversalHome3.tsx
6396
+ var import_react97 = __toESM(require("react"));
6397
+ var import_navigation8 = require("next/navigation");
6398
+ var import_react98 = require("@hugeicons/react");
6399
+ var import_react_hot_toast18 = __toESM(require("react-hot-toast"));
6400
+ var import_core_free_icons38 = require("@hugeicons/core-free-icons");
6401
+ var UniversalHome3 = ({
6402
+ createApplicationAction,
6403
+ checkApplicationAction,
6404
+ notifications = [],
6405
+ notificationPage = 1,
6406
+ notificationTotalPages = 1,
6407
+ isNotifsLoading = false,
6408
+ onNotificationPageChange,
6409
+ onNotificationClick,
6410
+ onResolveInvite,
6411
+ formatNotifDate,
6412
+ customContent,
6413
+ applicationsProps
6414
+ }) => {
6415
+ const [showNotifDialog, setShowNotifDialog] = (0, import_react97.useState)(false);
6416
+ const [selectedNotif, setSelectedNotif] = (0, import_react97.useState)(null);
6417
+ const [isResolving, setIsResolving] = (0, import_react97.useState)(false);
6418
+ const router = (0, import_navigation8.useRouter)();
6419
+ const hasUnreadNotifs = notifications.some((n) => !n.isRead);
6420
+ const handleResolve = async (resolution) => {
6421
+ if (!onResolveInvite || !selectedNotif) return;
6422
+ setIsResolving(true);
6423
+ try {
6424
+ await onResolveInvite(selectedNotif, resolution);
6425
+ window.location.reload();
6426
+ } catch (error) {
6427
+ import_react_hot_toast18.default.error("Failed to process invitation");
6428
+ setIsResolving(false);
6429
+ }
6430
+ };
6431
+ return /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react97.default.createElement(
6432
+ "button",
6433
+ {
6434
+ onClick: () => window.dispatchEvent(new Event("open-sidebar")),
6435
+ className: "md:hidden flex items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
6436
+ "aria-label": "Open Menu"
6437
+ },
6438
+ /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.SidebarLeft01Icon, size: 18 })
6439
+ )), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center gap-2 shrink-0" }, /* @__PURE__ */ import_react97.default.createElement(
6440
+ "button",
6441
+ {
6442
+ onClick: () => router.push("/app/ai"),
6443
+ className: "relative w-10 h-10 flex items-center justify-center rounded-full bg-white outline-none hover:bg-stone-50 transition-colors"
6444
+ },
6445
+ /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Robot01Icon, size: 20, className: "text-black" })
6446
+ ), /* @__PURE__ */ import_react97.default.createElement(
6447
+ "button",
6448
+ {
6449
+ onClick: () => {
6450
+ setShowNotifDialog(true);
6451
+ setSelectedNotif(null);
6452
+ },
6453
+ className: "relative w-10 h-10 flex items-center justify-center rounded-full bg-white outline-none hover:bg-stone-50 transition-colors"
6454
+ },
6455
+ /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Notification01Icon, size: 20, className: "text-black" }),
6456
+ hasUnreadNotifs && /* @__PURE__ */ import_react97.default.createElement("span", { className: "absolute top-2.5 right-2.5 w-2 h-2 bg-[#d97757] rounded-full border border-white" })
6457
+ ))), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full pb-6 flex flex-col gap-4" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react97.default.createElement(
6458
+ "div",
6459
+ {
6460
+ onClick: createApplicationAction?.onClick,
6461
+ className: "bg-[#d97757] rounded-2xl p-5 relative overflow-hidden flex flex-col h-32 sm:h-36 cursor-pointer hover:opacity-90 transition-opacity"
6462
+ },
6463
+ /* @__PURE__ */ import_react97.default.createElement("div", { className: "relative z-10 flex flex-col h-full justify-between" }, /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-sm sm:text-sm text-white leading-tight" }, "New", /* @__PURE__ */ import_react97.default.createElement("br", null), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-white/70" }, "Application")), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-8 h-8 rounded-full bg-white/10 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowUpRight01Icon, size: 16, className: "text-white" }))),
6464
+ /* @__PURE__ */ import_react97.default.createElement(
6465
+ "img",
6466
+ {
6467
+ src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cal_b.avif",
6468
+ alt: "New Application",
6469
+ className: "absolute bottom-4 right-2 translate-x-1/4 translate-y-1/2 w-32 h-auto object-contain z-0 pointer-events-none opacity-30"
6470
+ }
6471
+ )
6472
+ ), /* @__PURE__ */ import_react97.default.createElement(
6473
+ "div",
6474
+ {
6475
+ onClick: checkApplicationAction?.onClick,
6476
+ className: "bg-[#ffffff] rounded-2xl p-5 relative overflow-hidden flex flex-col h-32 sm:h-36 cursor-pointer hover:opacity-90 transition-opacity"
6477
+ },
6478
+ /* @__PURE__ */ import_react97.default.createElement("div", { className: "relative z-10 flex flex-col h-full justify-between" }, /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-sm sm:text-sm text-black leading-tight" }, "Check", /* @__PURE__ */ import_react97.default.createElement("br", null), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-black/60" }, "Application")), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-8 h-8 rounded-full bg-black/5 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowRight01Icon, size: 16, className: "text-black" }))),
6479
+ /* @__PURE__ */ import_react97.default.createElement(
6480
+ "img",
6481
+ {
6482
+ src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cam_c.avif",
6483
+ alt: "Check Application",
6484
+ className: "absolute bottom-4 right-2 translate-x-1/4 translate-y-1/2 w-32 h-auto object-contain z-0 pointer-events-none opacity-30"
6485
+ }
6486
+ )
6487
+ ))), customContent && /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full" }, customContent), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ import_react97.default.createElement(
6488
+ UniversalApplicationsPage,
6489
+ {
6490
+ ...applicationsProps
6491
+ }
6492
+ )), showNotifDialog && /* @__PURE__ */ import_react97.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setShowNotifDialog(false) }), /* @__PURE__ */ import_react97.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 max-h-[80vh] h-auto" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0" }, selectedNotif ? /* @__PURE__ */ import_react97.default.createElement("button", { onClick: () => setSelectedNotif(null), disabled: isResolving, className: "text-[#d97757] hover:text-[#d97757] transition-colors outline-none flex items-center gap-2 text-xs tracking-widest disabled:opacity-50" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowLeft01Icon, size: 14 }), " Back") : /* @__PURE__ */ import_react97.default.createElement("h3", { className: "text-sm text-black tracking-tight flex items-center gap-2" }, "Notifications"), /* @__PURE__ */ import_react97.default.createElement("button", { onClick: () => setShowNotifDialog(false), disabled: isResolving, className: "text-stone-400 hover:text-black transition-colors outline-none disabled:opacity-50" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2 relative" }, isNotifsLoading && !selectedNotif && /* @__PURE__ */ import_react97.default.createElement("div", { className: "absolute inset-0 z-10 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Loading03Icon, size: 28, className: "animate-spin text-black" })), selectedNotif ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-4 text-left" }, selectedNotif.type === "HUDDLE_INVITE" && selectedNotif.meta_json?.action === "RESOLVE_INVITE" && selectedNotif.meta_json?.completed ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "" }) : /* @__PURE__ */ import_react97.default.createElement("h4", { className: "text-sm text-black mb-1" }, selectedNotif.title), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest mb-4 block" }, formatNotifDate(selectedNotif.createdAt)), /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-xs text-stone-600 leading-relaxed whitespace-pre-wrap" }, selectedNotif.message), selectedNotif.type === "HUDDLE_INVITE" && selectedNotif.meta_json?.action === "RESOLVE_INVITE" && /* @__PURE__ */ import_react97.default.createElement("div", { className: `mt-8 flex gap-3 pt-6 ${selectedNotif.meta_json?.completed ? "opacity-40 pointer-events-none cursor-not-allowed" : ""}` }, /* @__PURE__ */ import_react97.default.createElement(
6493
+ "button",
6494
+ {
6495
+ onClick: () => handleResolve("ACCEPTED"),
6496
+ disabled: isResolving || selectedNotif.meta_json?.completed,
6497
+ className: "flex-1 py-2.5 rounded-full bg-black text-white text-xs tracking-wide transition-all outline-none hover:bg-stone-800 flex justify-center items-center disabled:opacity-50"
6498
+ },
6499
+ isResolving ? /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Loading03Icon, className: "animate-spin", size: 16 }) : "Accept"
6500
+ ), /* @__PURE__ */ import_react97.default.createElement(
6501
+ "button",
6502
+ {
6503
+ onClick: () => handleResolve("REJECTED"),
6504
+ disabled: isResolving || selectedNotif.meta_json?.completed,
6505
+ className: "flex-1 py-2.5 rounded-full bg-white border border-stone-200 text-black text-xs tracking-wide transition-all outline-none hover:bg-stone-50 flex justify-center items-center disabled:opacity-50"
6506
+ },
6507
+ "Reject"
6508
+ ))) : /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex flex-col divide-y divide-stone-50/50" }, notifications?.length === 0 && !isNotifsLoading ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-8 text-center text-xs text-stone-400" }, "You have no notifications.") : notifications?.map((notif) => /* @__PURE__ */ import_react97.default.createElement(
6509
+ "div",
6510
+ {
6511
+ key: notif.id,
6512
+ onClick: () => {
6513
+ setSelectedNotif(notif);
6514
+ onNotificationClick?.(notif);
6515
+ },
6516
+ className: `p-3 flex items-start gap-3 rounded-xl cursor-pointer transition-colors ${isNotifsLoading ? "opacity-50 pointer-events-none" : "hover:bg-stone-50"}`
6517
+ },
6518
+ /* @__PURE__ */ import_react97.default.createElement("div", { className: "mt-1.5 shrink-0" }, !notif.isRead ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-1.5 h-1.5 bg-[#d97757] rounded-full" }) : /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-1.5 h-1.5 bg-transparent" })),
6519
+ /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex-1 min-w-0 text-left" }, /* @__PURE__ */ import_react97.default.createElement("h5", { className: `text-xs truncate ${notif.isRead ? "text-stone-500" : "text-black"}` }, notif.title), /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-xs text-stone-400 truncate mt-0.5" }, notif.message), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest mt-2 block" }, formatNotifDate(notif.createdAt)))
6520
+ )))), !selectedNotif && /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-4 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest" }, "Page ", notificationPage, " of ", notificationTotalPages === 0 ? 1 : notificationTotalPages), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ import_react97.default.createElement(
6521
+ "button",
6522
+ {
6523
+ disabled: notificationPage <= 1 || isNotifsLoading,
6524
+ onClick: () => onNotificationPageChange?.(notificationPage - 1),
6525
+ className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-stone-200 text-stone-600 disabled:opacity-30 outline-none hover:bg-stone-50 transition-colors"
6526
+ },
6527
+ /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowLeft01Icon, size: 12 })
6528
+ ), /* @__PURE__ */ import_react97.default.createElement(
6529
+ "button",
6530
+ {
6531
+ disabled: notificationPage >= notificationTotalPages || notificationTotalPages === 0 || isNotifsLoading,
6532
+ onClick: () => onNotificationPageChange?.(notificationPage + 1),
6533
+ className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-stone-200 text-stone-600 disabled:opacity-30 outline-none hover:bg-stone-50 transition-colors"
6534
+ },
6535
+ /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowRight01Icon, size: 12 })
6536
+ ))))));
6537
+ };
6538
+
6539
+ // src/components/RootSidebar.tsx
6540
+ var import_react99 = __toESM(require("react"));
6541
+ var import_link10 = __toESM(require("next/link"));
6542
+ var import_react100 = require("@hugeicons/react");
6543
+ var import_core_free_icons39 = require("@hugeicons/core-free-icons");
6544
+ function RootSidebar({
6545
+ NavItem2s,
6546
+ currentPath,
6547
+ isMobileOpen,
6548
+ closeMobile,
6549
+ onNavClick,
6550
+ avatarSrc,
6551
+ title = "App",
6552
+ subtitle,
6553
+ homeUrl = "/app",
6554
+ showWorkspaceSwitcher = false,
6555
+ workspaces = [],
6556
+ activeWorkspaceId,
6557
+ onSwitchWorkspace,
6558
+ showLogoutAction = false,
6559
+ onLogout
6560
+ }) {
6561
+ const [isCollapsed, setIsCollapsed] = (0, import_react99.useState)(false);
6562
+ const [isAvatarLoaded, setIsAvatarLoaded] = (0, import_react99.useState)(false);
6563
+ const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react99.useState)(false);
6564
+ const [showLogoutDialog, setShowLogoutDialog] = (0, import_react99.useState)(false);
6565
+ const [isLoggingOut, setIsLoggingOut] = (0, import_react99.useState)(false);
6566
+ (0, import_react99.useEffect)(() => {
6567
+ if (isMobileOpen) {
6568
+ closeMobile();
6569
+ }
6570
+ }, [currentPath]);
6571
+ const hasActiveMatch = NavItem2s.some(
6572
+ (item) => item.path === "/applications" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`)
6573
+ );
6574
+ const handleLogoutInitiation = async () => {
6575
+ if (isLoggingOut || !onLogout) return;
6576
+ setIsLoggingOut(true);
6577
+ try {
6578
+ await onLogout();
6579
+ } catch (error) {
6580
+ setIsLoggingOut(false);
6581
+ setShowLogoutDialog(false);
6582
+ }
6583
+ };
6584
+ const finalAvatarSrc = avatarSrc || "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
6585
+ return /* @__PURE__ */ import_react99.default.createElement(import_react99.default.Fragment, null, /* @__PURE__ */ import_react99.default.createElement(
6586
+ "div",
6587
+ {
6588
+ className: `fixed inset-0 bg-black/30 shadow-2xl transition-opacity duration-300 md:hidden z-90 ${isMobileOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
6589
+ onClick: closeMobile
6590
+ }
6591
+ ), /* @__PURE__ */ import_react99.default.createElement(
6592
+ "aside",
6593
+ {
6594
+ className: `
6595
+ fixed md:sticky rounded-2xl top-4 md:top-4 md:my-4 left-4 md:left-0 md:ml-4 h-[calc(100dvh-2rem)] bg-white
6596
+ transition-all duration-300 ease-in-out shrink-0 flex flex-col z-100 md:z-10
6597
+ ${isMobileOpen ? "translate-x-0" : "translate-x-[-120%] md:translate-x-0"}
6598
+ ${isCollapsed ? "md:w-16 w-64" : "w-64"}
6599
+ `
6600
+ },
6601
+ /* @__PURE__ */ import_react99.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center" : "justify-between"}` }, /* @__PURE__ */ import_react99.default.createElement(import_link10.default, { href: homeUrl, className: `flex items-center outline-none group min-w-0 ${isCollapsed && !isMobileOpen ? "" : "gap-3 pr-2"}` }, /* @__PURE__ */ import_react99.default.createElement("div", { className: "w-8 h-8 shrink-0 relative rounded-lg overflow-hidden bg-stone-50 flex items-center justify-center" }, !isAvatarLoaded && /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.Loading03Icon, size: 14, className: "animate-spin text-stone-300 absolute" }), /* @__PURE__ */ import_react99.default.createElement(
6602
+ "img",
6603
+ {
6604
+ src: finalAvatarSrc,
6605
+ alt: "User Avatar",
6606
+ onLoad: () => setIsAvatarLoaded(true),
6607
+ className: `w-full h-full object-cover transition-opacity duration-300 ${isAvatarLoaded ? "opacity-100" : "opacity-0"}`
6608
+ }
6609
+ )), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("div", { className: "flex flex-col justify-center min-w-0" }, /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate max-w-32.5 tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate max-w-32.5 tracking-[0.2em] leading-none uppercase" }, subtitle))), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react99.default.createElement(
6610
+ "button",
6611
+ {
6612
+ onClick: closeMobile,
6613
+ className: "text-neutral-400 hover:text-black transition-colors outline-none",
6614
+ "aria-label": "Close Menu"
6615
+ },
6616
+ /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.CancelCircleIcon, size: 24 })
6617
+ ))),
6618
+ /* @__PURE__ */ import_react99.default.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar" }, NavItem2s.map((item, index) => {
6619
+ const isExactOrSubMatch = item.path === "/applications" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
6620
+ const isCurrentRoute = isExactOrSubMatch || !hasActiveMatch && index === 0;
6621
+ return /* @__PURE__ */ import_react99.default.createElement(
6622
+ import_link10.default,
6623
+ {
6624
+ key: item.name,
6625
+ href: item.path,
6626
+ onClick: (e) => onNavClick ? onNavClick(e, item.path) : void 0,
6627
+ className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group shrink-0 ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
6628
+ title: isCollapsed && !isMobileOpen ? item.name : void 0
6629
+ },
6630
+ /* @__PURE__ */ import_react99.default.createElement(
6631
+ import_react100.HugeiconsIcon,
6632
+ {
6633
+ icon: item.icon,
6634
+ size: 18,
6635
+ className: `shrink-0 transition-colors ${isCurrentRoute ? "text-black" : "text-neutral-400 group-hover:text-black"}`
6636
+ }
6637
+ ),
6638
+ (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-xs tracking-wide truncate" }, item.name)
6639
+ );
6640
+ })),
6641
+ /* @__PURE__ */ import_react99.default.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2 " }, (showWorkspaceSwitcher || showLogoutAction) && /* @__PURE__ */ import_react99.default.createElement("div", { className: `flex gap-2 px-1 pb-2 ${isCollapsed && !isMobileOpen ? "flex-col items-center" : "flex-col items-start md:flex-row md:items-center"}` }, showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react99.default.createElement(
6642
+ "button",
6643
+ {
6644
+ onClick: () => setShowSwitcherDialog(true),
6645
+ className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
6646
+ title: "Switch Workspace"
6647
+ },
6648
+ /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.UserIcon, size: 16 })
6649
+ ), showLogoutAction && /* @__PURE__ */ import_react99.default.createElement(
6650
+ "button",
6651
+ {
6652
+ onClick: () => setShowLogoutDialog(true),
6653
+ className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
6654
+ title: "Secure Logout"
6655
+ },
6656
+ /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.LogoutCircle02Icon, size: 16 })
6657
+ )), /* @__PURE__ */ import_react99.default.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ import_react99.default.createElement(
6658
+ "button",
6659
+ {
6660
+ onClick: () => setIsCollapsed(!isCollapsed),
6661
+ className: "flex items-center justify-center md:justify-start gap-3 w-full p-2.5 rounded-full text-neutral-500 hover:text-black hover:bg-neutral-50 transition-colors outline-none"
6662
+ },
6663
+ /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
6664
+ !isCollapsed && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-xs" }, "Collapse")
6665
+ )))
6666
+ ), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react99.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react99.default.createElement(
6667
+ "div",
6668
+ {
6669
+ className: "absolute inset-0 bg-black/30",
6670
+ onClick: () => setShowSwitcherDialog(false)
6671
+ }
6672
+ ), /* @__PURE__ */ import_react99.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react99.default.createElement("div", { className: "p-5 text-center w-full" }, /* @__PURE__ */ import_react99.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Switch Workspace"), /* @__PURE__ */ import_react99.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-snug" }, "Select an organization to switch your current context.")), /* @__PURE__ */ import_react99.default.createElement("div", { className: "max-h-75 overflow-y-auto w-full custom-scrollbar" }, workspaces.map((org) => /* @__PURE__ */ import_react99.default.createElement(
6673
+ "button",
6674
+ {
6675
+ key: org.id,
6676
+ onClick: () => {
6677
+ if (onSwitchWorkspace) onSwitchWorkspace(org.id);
6678
+ setShowSwitcherDialog(false);
6679
+ },
6680
+ className: "w-full text-left px-5 py-4 flex items-center justify-between hover:bg-neutral-50 transition-colors group outline-none last:border-0"
6681
+ },
6682
+ /* @__PURE__ */ import_react99.default.createElement("div", { className: "flex flex-col truncate pr-4" }, /* @__PURE__ */ import_react99.default.createElement("span", { className: `text-[13px] truncate ${activeWorkspaceId === org.id ? "text-black" : "text-neutral-600 group-hover:text-black"}` }, org.name), /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[9px] text-neutral-400 tracking-[0.2em] mt-1 uppercase" }, "Role: ", org.role)),
6683
+ activeWorkspaceId === org.id && /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.CheckmarkCircle01Icon, size: 16, className: "text-black shrink-0" })
6684
+ ))), /* @__PURE__ */ import_react99.default.createElement("div", { className: "w-full flex mt-auto" }, /* @__PURE__ */ import_react99.default.createElement(
6685
+ "button",
6686
+ {
6687
+ onClick: () => setShowSwitcherDialog(false),
6688
+ className: "w-full py-3.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
6689
+ },
6690
+ "Cancel"
6691
+ )))), /* @__PURE__ */ import_react99.default.createElement(
6692
+ ConfirmationDialog,
6693
+ {
6694
+ isOpen: showLogoutDialog && showLogoutAction,
6695
+ title: "Secure Logout",
6696
+ message: "Are you sure you want to log out? You will need to authenticate to return.",
6697
+ confirmText: "Log Out",
6698
+ cancelText: "Cancel",
6699
+ isProcessing: isLoggingOut,
6700
+ isDestructive: true,
6701
+ onClose: () => !isLoggingOut && setShowLogoutDialog(false),
6702
+ onConfirm: handleLogoutInitiation
6703
+ }
6704
+ ));
6705
+ }
6706
+
6707
+ // src/components/UniversalSettings2.tsx
6708
+ var import_react101 = __toESM(require("react"));
6709
+ var import_react_hot_toast19 = __toESM(require("react-hot-toast"));
6710
+ var import_react102 = require("@hugeicons/react");
6711
+ var import_core_free_icons40 = require("@hugeicons/core-free-icons");
6712
+ var MemberAvatar5 = ({ src, status, sizeClass = "w-10 h-10" }) => {
6713
+ const [loaded, setLoaded] = (0, import_react101.useState)(false);
6714
+ const [error, setError] = (0, import_react101.useState)(false);
6715
+ const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
6716
+ const finalSrc = error || !src ? defaultAvatar : src;
6717
+ const getStatusColor = () => {
6718
+ switch (status?.toUpperCase()) {
6719
+ case "ACTIVE":
6720
+ return "bg-emerald-500";
6721
+ case "BUSY":
6722
+ return "bg-amber-500";
6723
+ case "OFFLINE":
6724
+ return "bg-[#d97757]";
6725
+ case "AWAY":
6726
+ return "bg-stone-400";
6727
+ default:
6728
+ return "bg-stone-200";
6729
+ }
6730
+ };
6731
+ return /* @__PURE__ */ import_react101.default.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full h-full rounded-lg bg-stone-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, className: "animate-spin text-stone-400 absolute", size: 14 }), /* @__PURE__ */ import_react101.default.createElement("img", { src: finalSrc, alt: "Member", className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`, onLoad: () => setLoaded(true), onError: () => setError(true) })), /* @__PURE__ */ import_react101.default.createElement("div", { className: `absolute -bottom-1 -right-1 w-3.5 h-3.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
6732
+ };
6733
+ var OrgAvatar3 = ({ src, sizeClass = "w-10 h-10" }) => {
6734
+ const [loaded, setLoaded] = (0, import_react101.useState)(false);
6735
+ const [error, setError] = (0, import_react101.useState)(false);
6736
+ const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/office_a.avif";
6737
+ const finalSrc = error || !src ? defaultAvatar : src;
6738
+ return /* @__PURE__ */ import_react101.default.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full h-full rounded-lg bg-stone-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, className: "animate-spin text-stone-400 absolute", size: 14 }), /* @__PURE__ */ import_react101.default.createElement(
6739
+ "img",
6740
+ {
6741
+ src: finalSrc,
6742
+ alt: "Workspace Avatar",
6743
+ className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`,
6744
+ onLoad: () => setLoaded(true),
6745
+ onError: () => setError(true)
6746
+ }
6747
+ )));
6748
+ };
6749
+ var PageSpinner10 = () => /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
6750
+ var InputSpinner4 = () => /* @__PURE__ */ import_react101.default.createElement("svg", { className: "animate-spin h-4 w-4 text-stone-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react101.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react101.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
6751
+ var UniversalSettings2 = ({
6752
+ accountType,
6753
+ userRole,
6754
+ members = [],
6755
+ isMembersLoading = false,
6756
+ membersCurrentPage = 1,
6757
+ membersTotalPages = 1,
6758
+ onMembersPageChange = () => {
6759
+ },
6760
+ membersSearchQuery = "",
6761
+ onMembersSearchChange = () => {
6762
+ },
6763
+ activeStatusFilter = "ALL",
6764
+ onStatusFilterChange = () => {
6765
+ },
6766
+ activeRoleFilter = "ALL",
6767
+ onRoleFilterChange = () => {
6768
+ },
6769
+ onRemoveMember,
6770
+ onInviteMember,
6771
+ onUpdateRole,
6772
+ initialOrgName = "",
6773
+ initialOrgSlug = "",
6774
+ initialOrgAvatarUrl = "",
6775
+ initialFullName = "",
6776
+ initialEmail = "",
6777
+ initialJobTitle = "",
6778
+ initialDescription = "",
6779
+ initialAvatarUrl = "",
6780
+ onSaveProfile,
6781
+ onSaveOrganization,
6782
+ onCheckSlugAvailability,
6783
+ onUploadAvatar
6784
+ }) => {
6785
+ const isOrg = accountType === "ORGANIZATION";
6786
+ const safeRole = String(userRole || "").toUpperCase().trim();
6787
+ const canManage = ["ADMIN", "MANAGER", "OWNER"].includes(safeRole);
6788
+ const [activeTab, setActiveTab] = (0, import_react101.useState)(isOrg ? "MEMBERS" : "ACCOUNT");
6789
+ const [expandedId, setExpandedId] = (0, import_react101.useState)(null);
6790
+ const [memberToRemove, setMemberToRemove] = (0, import_react101.useState)(null);
6791
+ const [isRemoving, setIsRemoving] = (0, import_react101.useState)(false);
6792
+ const [isInviteMode, setIsInviteMode] = (0, import_react101.useState)(false);
6793
+ const [inviteEmail, setInviteEmail] = (0, import_react101.useState)("");
6794
+ const [isInviting, setIsInviting] = (0, import_react101.useState)(false);
6795
+ const [localSearchQuery, setLocalSearchQuery] = (0, import_react101.useState)(membersSearchQuery);
6796
+ const [isTyping, setIsTyping] = (0, import_react101.useState)(false);
6797
+ const isFirstSearchMount = (0, import_react101.useRef)(true);
6798
+ const [isStatusModalOpen, setIsStatusModalOpen] = (0, import_react101.useState)(false);
6799
+ const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react101.useState)(false);
6800
+ const [roleEditTarget, setRoleEditTarget] = (0, import_react101.useState)(null);
6801
+ const [isUpdatingRole, setIsUpdatingRole] = (0, import_react101.useState)(false);
6802
+ const [orgName, setOrgName] = (0, import_react101.useState)(initialOrgName);
6803
+ const [orgSlug, setOrgSlug] = (0, import_react101.useState)(initialOrgSlug);
6804
+ const [orgAvatarUrl, setOrgAvatarUrl] = (0, import_react101.useState)(initialOrgAvatarUrl);
6805
+ const [firstName, setFirstName] = (0, import_react101.useState)("");
6806
+ const [lastName, setLastName] = (0, import_react101.useState)("");
6807
+ const [jobTitle, setJobTitle] = (0, import_react101.useState)(initialJobTitle);
6808
+ const [description, setDescription] = (0, import_react101.useState)(initialDescription);
6809
+ const [avatarUrl, setAvatarUrl] = (0, import_react101.useState)(initialAvatarUrl);
6810
+ const [isCheckingSlug, setIsCheckingSlug] = (0, import_react101.useState)(false);
6811
+ const [slugAvailable, setSlugAvailable] = (0, import_react101.useState)(null);
6812
+ const [isSavingOrg, setIsSavingOrg] = (0, import_react101.useState)(false);
6813
+ const [isSavingProfile, setIsSavingProfile] = (0, import_react101.useState)(false);
6814
+ const orgFileInputRef = (0, import_react101.useRef)(null);
6815
+ const userFileInputRef = (0, import_react101.useRef)(null);
6816
+ const [pendingOrgAvatar, setPendingOrgAvatar] = (0, import_react101.useState)(null);
6817
+ const [pendingUserAvatar, setPendingUserAvatar] = (0, import_react101.useState)(null);
6818
+ const [isUploadingOrgAvatar, setIsUploadingOrgAvatar] = (0, import_react101.useState)(false);
6819
+ const [isUploadingUserAvatar, setIsUploadingUserAvatar] = (0, import_react101.useState)(false);
6820
+ (0, import_react101.useEffect)(() => {
6821
+ setOrgName(initialOrgName || "");
6822
+ setOrgSlug(initialOrgSlug || "");
6823
+ setOrgAvatarUrl(initialOrgAvatarUrl || "");
6824
+ const parts = (initialFullName || "").split(" ");
6825
+ setFirstName(parts[0] || "");
6826
+ setLastName(parts.slice(1).join(" ") || "");
6827
+ setJobTitle(initialJobTitle || "");
6828
+ setDescription(initialDescription || "");
6829
+ setAvatarUrl(initialAvatarUrl || "");
6830
+ }, [initialOrgName, initialOrgSlug, initialOrgAvatarUrl, initialFullName, initialJobTitle, initialDescription, initialAvatarUrl]);
6831
+ const handleFileSelect = (e, type) => {
6832
+ const file = e.target.files?.[0];
6833
+ if (!file) return;
6834
+ if (file.size > 1024 * 1024) {
6835
+ import_react_hot_toast19.default.error("Image size must be less than 1MB.");
6836
+ e.target.value = "";
6837
+ return;
6838
+ }
6839
+ const validTypes = ["image/jpeg", "image/jpg", "image/png"];
6840
+ if (!validTypes.includes(file.type)) {
6841
+ import_react_hot_toast19.default.error("Only PNG and JPEG images are allowed.");
6842
+ e.target.value = "";
6843
+ return;
6844
+ }
6845
+ const previewUrl = URL.createObjectURL(file);
6846
+ if (type === "USER") {
6847
+ setPendingUserAvatar(file);
6848
+ setAvatarUrl(previewUrl);
6849
+ } else if (type === "ORGANIZATION") {
6850
+ setPendingOrgAvatar(file);
6851
+ setOrgAvatarUrl(previewUrl);
6852
+ }
6853
+ e.target.value = "";
6854
+ };
6855
+ (0, import_react101.useEffect)(() => {
6856
+ if (activeTab !== "MEMBERS") return;
6857
+ if (isFirstSearchMount.current) {
6858
+ isFirstSearchMount.current = false;
6859
+ return;
6860
+ }
6861
+ setIsTyping(true);
6862
+ const handler = setTimeout(() => {
6863
+ onMembersSearchChange(localSearchQuery);
6864
+ setIsTyping(false);
6865
+ }, 600);
6866
+ return () => clearTimeout(handler);
6867
+ }, [localSearchQuery, activeTab]);
6868
+ const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
6869
+ const handleOrgSlugChange = (val) => setOrgSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
6870
+ const handleOrgNameChange = (val) => setOrgName(val.replace(/[^a-zA-Z0-9\s-]/g, "").substring(0, 50));
6871
+ const handleConfirmRemove = async () => {
6872
+ if (!memberToRemove || !onRemoveMember) return;
6873
+ setIsRemoving(true);
6874
+ try {
6875
+ await onRemoveMember(memberToRemove.userId);
6876
+ import_react_hot_toast19.default.success("Member removed successfully.");
6877
+ setExpandedId(null);
6878
+ setMemberToRemove(null);
6879
+ } catch (error) {
6880
+ import_react_hot_toast19.default.error(error.message || "Failed to remove member.");
6881
+ } finally {
6882
+ setIsRemoving(false);
6883
+ }
6884
+ };
6885
+ const handleInviteSubmit = async (e) => {
6886
+ e.preventDefault();
6887
+ if (inviteEmail.length < 5 || isInviting || !onInviteMember) return;
6888
+ setIsInviting(true);
6889
+ try {
6890
+ await onInviteMember(inviteEmail);
6891
+ setInviteEmail("");
6892
+ setIsInviteMode(false);
6893
+ } catch (error) {
6894
+ import_react_hot_toast19.default.error(error.message || "Failed to send invitation.");
6895
+ } finally {
6896
+ setIsInviting(false);
6897
+ }
6898
+ };
6899
+ const handleRoleUpdate = async (newRole) => {
6900
+ if (!roleEditTarget || !onUpdateRole) return;
6901
+ setIsUpdatingRole(true);
6902
+ const targetId = roleEditTarget.userId;
6903
+ setRoleEditTarget(null);
6904
+ try {
6905
+ await onUpdateRole(targetId, newRole);
6906
+ } catch (error) {
6907
+ } finally {
6908
+ setIsUpdatingRole(false);
6909
+ }
6910
+ };
6911
+ const activeExpandedMember = expandedId ? members.find((m) => m.id === expandedId) : null;
6912
+ (0, import_react101.useEffect)(() => {
6913
+ if (!isOrg || !orgSlug || orgSlug === initialOrgSlug) {
6914
+ setSlugAvailable(null);
6915
+ setIsCheckingSlug(false);
6916
+ return;
6917
+ }
6918
+ if (orgSlug.length < 3) {
6919
+ setSlugAvailable(false);
6920
+ setIsCheckingSlug(false);
6921
+ return;
6922
+ }
6923
+ setIsCheckingSlug(true);
6924
+ setSlugAvailable(null);
6925
+ const checkTimer = setTimeout(async () => {
6926
+ try {
6927
+ if (onCheckSlugAvailability) {
6928
+ const res = await onCheckSlugAvailability(orgSlug);
6929
+ setSlugAvailable(res.available);
6930
+ }
6931
+ } catch (error) {
6932
+ setSlugAvailable(null);
6933
+ } finally {
6934
+ setIsCheckingSlug(false);
6935
+ }
6936
+ }, 1500);
6937
+ return () => clearTimeout(checkTimer);
6938
+ }, [orgSlug, initialOrgSlug, onCheckSlugAvailability, isOrg]);
6939
+ const handleSaveOrganization = async (e) => {
6940
+ e.preventDefault();
6941
+ if (isSavingOrg || isCheckingSlug || !canManage || !onSaveOrganization) return;
6942
+ if (orgSlug !== initialOrgSlug && slugAvailable === false) return import_react_hot_toast19.default.error("Address handle unavailable.");
6943
+ setIsSavingOrg(true);
6944
+ try {
6945
+ let finalAvatarUrl = orgAvatarUrl;
6946
+ if (pendingOrgAvatar && onUploadAvatar) {
6947
+ setIsUploadingOrgAvatar(true);
6948
+ try {
6949
+ const res2 = await onUploadAvatar(pendingOrgAvatar, "ORGANIZATION");
6950
+ if (res2?.url) {
6951
+ finalAvatarUrl = res2.url;
6952
+ setOrgAvatarUrl(finalAvatarUrl);
6953
+ }
6954
+ } catch (err) {
6955
+ import_react_hot_toast19.default.error("Failed to securely upload workspace avatar.");
6956
+ setIsSavingOrg(false);
6957
+ setIsUploadingOrgAvatar(false);
6958
+ return;
6959
+ }
6960
+ setPendingOrgAvatar(null);
6961
+ setIsUploadingOrgAvatar(false);
6962
+ }
6963
+ const res = await onSaveOrganization({ name: orgName, slug: orgSlug, avatarUrl: finalAvatarUrl });
6964
+ if (res.success) import_react_hot_toast19.default.success("Workspace updated successfully.");
6965
+ else import_react_hot_toast19.default.error(res.error || "Failed to update workspace.");
6966
+ } catch (error) {
6967
+ import_react_hot_toast19.default.error("Service unavailable.");
6968
+ } finally {
6969
+ setIsSavingOrg(false);
6970
+ setIsUploadingOrgAvatar(false);
6971
+ }
6972
+ };
6973
+ const handleSaveProfile = async (e) => {
6974
+ e.preventDefault();
6975
+ if (isSavingProfile || !onSaveProfile) return;
6976
+ setIsSavingProfile(true);
6977
+ try {
6978
+ let finalAvatarUrl = avatarUrl;
6979
+ if (pendingUserAvatar && onUploadAvatar) {
6980
+ setIsUploadingUserAvatar(true);
6981
+ try {
6982
+ const res2 = await onUploadAvatar(pendingUserAvatar, "USER");
6983
+ if (res2?.url) {
6984
+ finalAvatarUrl = res2.url;
6985
+ setAvatarUrl(finalAvatarUrl);
6986
+ }
6987
+ } catch (err) {
6988
+ import_react_hot_toast19.default.error("Failed to securely upload profile avatar.");
6989
+ setIsSavingProfile(false);
6990
+ setIsUploadingUserAvatar(false);
6991
+ return;
6992
+ }
6993
+ setPendingUserAvatar(null);
6994
+ setIsUploadingUserAvatar(false);
6995
+ }
6996
+ const res = await onSaveProfile({ firstName, lastName, jobTitle, description, avatarUrl: finalAvatarUrl });
6997
+ if (res.success) import_react_hot_toast19.default.success("Identity updated successfully.");
6998
+ else import_react_hot_toast19.default.error(res.error || "Failed to update identity.");
6999
+ } catch (error) {
7000
+ import_react_hot_toast19.default.error("Service unavailable.");
7001
+ } finally {
7002
+ setIsSavingProfile(false);
7003
+ setIsUploadingUserAvatar(false);
7004
+ }
7005
+ };
7006
+ const hasOrgChanges = orgName !== initialOrgName || orgSlug !== initialOrgSlug || orgAvatarUrl !== initialOrgAvatarUrl;
7007
+ const isOrgSaveDisabled = isSavingOrg || !canManage || isCheckingSlug || !hasOrgChanges || orgName.length < 3 || orgSlug.length < 3 || orgSlug !== initialOrgSlug && slugAvailable === false;
7008
+ const hasProfileChanges = `${firstName} ${lastName}`.trim() !== initialFullName || jobTitle !== initialJobTitle || description !== initialDescription || avatarUrl !== initialAvatarUrl;
7009
+ const isProfileSaveDisabled = isSavingProfile || !hasProfileChanges || firstName.length < 2 || lastName.length < 2;
7010
+ const tabs = [];
7011
+ if (isOrg) {
7012
+ tabs.push({ id: "MEMBERS", label: "Members" });
7013
+ tabs.push({ id: "ORGANIZATION", label: "Organization" });
7014
+ }
7015
+ tabs.push({ id: "ACCOUNT", label: "Profile" });
7016
+ return /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 mb-8 px-1" }, /* @__PURE__ */ import_react101.default.createElement(
7017
+ "button",
7018
+ {
7019
+ onClick: () => window.dispatchEvent(new Event("open-sidebar")),
7020
+ className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
7021
+ "aria-label": "Open Menu"
7022
+ },
7023
+ /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.SidebarLeft01Icon, size: 18 })
7024
+ ), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react101.default.createElement("h1", { className: "text-black text-xl tracking-tight" }, "System Settings"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage your workspace identity, team configurations, and AI billing parameters."))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center justify-center mb-8 sm:mb-10 w-full animate-in fade-in duration-300 px-2" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center bg-white rounded-full p-1 sm:p-1.5 max-w-full overflow-x-auto custom-scrollbar" }, tabs.map((tab, idx) => {
7025
+ const isActive = activeTab === tab.id;
7026
+ return /* @__PURE__ */ import_react101.default.createElement(
7027
+ "button",
7028
+ {
7029
+ key: idx,
7030
+ onClick: () => {
7031
+ setActiveTab(tab.id);
7032
+ if (tab.id === "MEMBERS") {
7033
+ setExpandedId(null);
7034
+ setIsInviteMode(false);
7035
+ }
7036
+ },
7037
+ className: `px-4 py-1.5 rounded-full text-xs transition-all duration-200 outline-none whitespace-nowrap shrink-0 ${isActive ? "bg-stone-50 text-black" : "text-stone-500 hover:text-black hover:bg-stone-50/50"}`
7038
+ },
7039
+ tab.label
7040
+ );
7041
+ }))), activeTab === "MEMBERS" && isOrg && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement(
7042
+ ConfirmationDialog,
7043
+ {
7044
+ isOpen: !!memberToRemove,
7045
+ title: "Remove Member",
7046
+ message: `Are you sure you want to remove ${memberToRemove?.fullName}? This action cannot be undone.`,
7047
+ confirmText: "Remove",
7048
+ cancelText: "Cancel",
7049
+ isProcessing: isRemoving,
7050
+ isDestructive: true,
7051
+ onClose: () => setMemberToRemove(null),
7052
+ onConfirm: handleConfirmRemove
7053
+ }
7054
+ ), !isInviteMode && !activeExpandedMember && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full px-1" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Search01Icon, size: 16, className: "text-stone-400" })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "text", placeholder: "Search members...", value: localSearchQuery, onChange: (e) => setLocalSearchQuery(e.target.value), className: "w-full pl-10 pr-4 py-2 bg-white rounded-full text-sm text-black placeholder-stone-400 outline-none transition-colors focus:border-[#d97757] border border-transparent " })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-3 w-auto pb-0 shrink-0" }, /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsStatusModalOpen(true), className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-stone-500 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.SearchList02Icon, size: 16 })), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsRoleModalOpen(true), className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-stone-500 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ListSettingIcon, size: 16 })))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, activeExpandedMember ? /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col animate-in fade-in zoom-in-95 duration-300 w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "mb-6 flex w-full items-center" }, /* @__PURE__ */ import_react101.default.createElement(
7055
+ "button",
7056
+ {
7057
+ onClick: () => setExpandedId(null),
7058
+ disabled: isUpdatingRole,
7059
+ className: "flex items-center gap-2 text-[#d97757] hover:text-[#d97757] transition-colors text-sm outline-none disabled:opacity-50"
7060
+ },
7061
+ /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowLeft01Icon, size: 16 }),
7062
+ " Back"
7063
+ )), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1 mb-8" }, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, "Member Profile"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "View and manage this member's access privileges.")), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 mb-4" }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: activeExpandedMember.avatarUrl, status: activeExpandedMember.status, sizeClass: "w-14 h-14" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-sm text-black tracking-tight truncate" }, activeExpandedMember.fullName), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-2 mt-0.5" }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-xs text-stone-500 capitalize" }, activeExpandedMember.role.toLowerCase()), canManage && (isUpdatingRole ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin text-stone-400 ml-1" }) : /* @__PURE__ */ import_react101.default.createElement(import_react101.default.Fragment, null, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-stone-300 text-xs px-0.5" }, "\u2022"), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setRoleEditTarget(activeExpandedMember), className: "text-xs text-[#d97757] hover:underline outline-none" }, "Edit"), /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-stone-300 text-xs px-0.5" }, "\u2022"), /* @__PURE__ */ import_react101.default.createElement(
7064
+ "button",
7065
+ {
7066
+ onClick: () => setMemberToRemove(activeExpandedMember),
7067
+ disabled: isUpdatingRole,
7068
+ className: "text-xs text-[#d97757] hover:underline outline-none disabled:opacity-50"
7069
+ },
7070
+ "Remove"
7071
+ ))))))) : /* @__PURE__ */ import_react101.default.createElement(import_react101.default.Fragment, null, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-row items-center justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, isInviteMode ? "Add Member" : "Team Directory"), !isInviteMode && canManage && /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsInviteMode(true), className: "shrink-0 px-4 py-1.5 border border-stone-200 text-black text-xs tracking-wide rounded-full hover:bg-stone-50 transition-colors outline-none" }, "Invite Team")), !isInviteMode && /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage members and access controls across your organization.")), /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full overflow-hidden" }, isInviteMode ? /* @__PURE__ */ import_react101.default.createElement("form", { onSubmit: handleInviteSubmit, className: "flex flex-col gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ import_react101.default.createElement("input", { type: "email", value: inviteEmail, onChange: (e) => setInviteEmail(cleanEmailId(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 bg-transparent text-sm border-b border-stone-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "name@company.com" })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: inviteEmail.length < 5 || isInviting, isLoading: isInviting, className: "w-full" }, "Send Invitation"), /* @__PURE__ */ import_react101.default.createElement("button", { type: "button", onClick: () => {
7072
+ setIsInviteMode(false);
7073
+ setInviteEmail("");
7074
+ }, disabled: isInviting, className: "w-full flex items-center justify-center py-2.5 rounded-full border border-stone-200 text-black hover:bg-stone-50 transition-colors outline-none text-xs tracking-wide" }, "Cancel"))) : isMembersLoading || isTyping ? /* @__PURE__ */ import_react101.default.createElement(PageSpinner10, null) : /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col min-w-0 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", null, members.length === 0 ? /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ import_react101.default.createElement("div", { key: member.id, onClick: () => setExpandedId(member.id), className: "flex items-center justify-between py-3 hover:bg-stone-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-sm text-black truncate" }, member.fullName), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500 capitalize truncate" }, member.role.toLowerCase())))))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center justify-between pt-6 mt-2 " }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-xs text-stone-400 tracking-[0.2em]" }, "Page ", membersCurrentPage, " of ", membersTotalPages === 0 ? 1 : membersTotalPages), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => onMembersPageChange(membersCurrentPage - 1), disabled: membersCurrentPage <= 1 || isMembersLoading, className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => onMembersPageChange(membersCurrentPage + 1), disabled: membersCurrentPage >= membersTotalPages || isMembersLoading || membersTotalPages === 0, className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowRight01Icon, size: 14 })))))))), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: isStatusModalOpen, onClose: () => setIsStatusModalOpen(false), title: "Status Filter", options: ["ALL", "ACTIVE", "BUSY", "OFFLINE", "AWAY"], selectedOption: activeStatusFilter, onSelect: (status) => onStatusFilterChange(status) }), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: isRoleModalOpen, onClose: () => setIsRoleModalOpen(false), title: "Role Filter", options: ["ALL", "OWNER", "ADMIN", "MANAGER", "MEMBER", "GUEST"], selectedOption: activeRoleFilter, onSelect: (role) => onRoleFilterChange(role) }), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: !!roleEditTarget, onClose: () => setRoleEditTarget(null), title: "Modify Access Role", options: ["ADMIN", "MANAGER", "MEMBER"], selectedOption: roleEditTarget?.role || "", onSelect: handleRoleUpdate })), activeTab === "ORGANIZATION" && isOrg && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 animate-in rounded-2xl p-6 bg-white fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative group cursor-pointer shrink-0", onClick: () => canManage && !isSavingOrg ? orgFileInputRef.current?.click() : void 0 }, /* @__PURE__ */ import_react101.default.createElement(OrgAvatar3, { src: orgAvatarUrl, sizeClass: "w-14 h-14" }), canManage && /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute -bottom-1 -right-1 w-6 h-6 bg-white border border-stone-200 rounded-full flex items-center justify-center text-stone-500 group-hover:text-black transition-colors z-10" }, isUploadingOrgAvatar ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin" }) : /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CloudUploadIcon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "file", ref: orgFileInputRef, className: "hidden", accept: ".png, .jpg, .jpeg", onChange: (e) => handleFileSelect(e, "ORGANIZATION") })), /* @__PURE__ */ import_react101.default.createElement("div", null, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl mb-1 tracking-tight" }, "Workspace Details"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage your organizational identity and handles."))), !canManage && /* @__PURE__ */ import_react101.default.createElement("span", { className: "p-2 w-9 h-9 bg-stone-100 text-stone-400 rounded-full shrink-0" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ import_react101.default.createElement("form", { className: "flex flex-col gap-8 w-full max-w-5xl", onSubmit: handleSaveOrganization, autoComplete: "off" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Workspace Name", value: orgName, onChange: handleOrgNameChange, disabled: !canManage || isSavingOrg, placeholder: "Acme Corporation", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 relative w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Workspace Handle"), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center relative w-full border-b border-stone-200 focus-within:border-black transition-all duration-300 overflow-hidden" }, /* @__PURE__ */ import_react101.default.createElement("input", { type: "text", value: orgSlug, disabled: !canManage || isSavingOrg, onChange: (e) => handleOrgSlugChange(e.target.value), spellCheck: "false", autoComplete: "off", className: "w-full pr-10 pl-0 py-3 text-sm bg-transparent text-black outline-none disabled:opacity-50 disabled:cursor-not-allowed", placeholder: "workspace-handle" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react101.default.createElement(InputSpinner4, null), !isCheckingSlug && canManage && orgSlug !== initialOrgSlug && orgSlug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react101.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-[#d97757]/10" }, /* @__PURE__ */ import_react101.default.createElement("svg", { className: "w-2 h-2 text-[#d97757]", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react101.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" }))), !isCheckingSlug && canManage && orgSlug !== initialOrgSlug && orgSlug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react101.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react101.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react101.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 10-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z" })))))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: isOrgSaveDisabled, isLoading: isSavingOrg, className: "min-w-32" }, "Save Changes"), hasOrgChanges && !isSavingOrg && canManage && /* @__PURE__ */ import_react101.default.createElement("button", { type: "button", onClick: () => {
7075
+ setOrgName(initialOrgName || "");
7076
+ setOrgSlug(initialOrgSlug || "");
7077
+ setOrgAvatarUrl(initialOrgAvatarUrl || "");
7078
+ setPendingOrgAvatar(null);
7079
+ }, className: "text-xs tracking-widest text-stone-400 hover:text-black transition-colors outline-none" }, "Cancel")))), activeTab === "ACCOUNT" && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-6 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 rounded-2xl p-6 bg-white w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative group cursor-pointer shrink-0", onClick: () => !isSavingProfile ? userFileInputRef.current?.click() : void 0 }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: avatarUrl, status: "ACTIVE", sizeClass: "w-14 h-14" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute -bottom-1 -right-1 w-6 h-6 bg-white border border-stone-200 rounded-full flex items-center justify-center text-stone-500 group-hover:text-black transition-colors z-20" }, isUploadingUserAvatar ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin" }) : /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CloudUploadIcon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "file", ref: userFileInputRef, className: "hidden", accept: ".png, .jpg, .jpeg", onChange: (e) => handleFileSelect(e, "USER") })), /* @__PURE__ */ import_react101.default.createElement("div", null, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl mb-1 tracking-tight" }, "Personal Identity"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Update your system display name and contact email.")))), /* @__PURE__ */ import_react101.default.createElement("form", { className: "flex flex-col gap-6 w-full max-w-5xl", onSubmit: handleSaveProfile, autoComplete: "off" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "First Name", value: firstName, onChange: (v) => setFirstName(v.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50)), disabled: isSavingProfile, placeholder: "First name", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Last Name", value: lastName, onChange: (v) => setLastName(v.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50)), disabled: isSavingProfile, placeholder: "Last name", maxLength: 50 })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Job Title", value: jobTitle, onChange: (v) => setJobTitle(v.substring(0, 50)), disabled: isSavingProfile, placeholder: "e.g. HR Manager, CEO", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ import_react101.default.createElement("input", { type: "email", value: initialEmail, disabled: true, className: "w-full pb-3 pt-3 text-sm bg-transparent text-stone-400 border-b border-stone-200 outline-none cursor-not-allowed" }))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "About Me"), /* @__PURE__ */ import_react101.default.createElement(
7080
+ "textarea",
7081
+ {
7082
+ value: description,
7083
+ onChange: (e) => setDescription(e.target.value.substring(0, 300)),
7084
+ disabled: isSavingProfile,
7085
+ placeholder: "A short shout about yourself...",
7086
+ className: "w-full pb-3 pt-3 text-sm bg-transparent text-black border-b border-stone-200 outline-none focus:border-[#d97757] transition-all duration-300 resize-none h-20 custom-scrollbar",
7087
+ maxLength: 300
7088
+ }
7089
+ )), /* @__PURE__ */ import_react101.default.createElement("div", { className: "pt-4 flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: isProfileSaveDisabled, isLoading: isSavingProfile, className: "min-w-32" }, "Update Identity"))))));
7090
+ };
7091
+
7092
+ // src/components/UniversalDeveloperSettings.tsx
7093
+ var import_react103 = __toESM(require("react"));
7094
+ var import_react_hot_toast20 = require("react-hot-toast");
7095
+ var import_react104 = require("@hugeicons/react");
7096
+ var import_core_free_icons41 = require("@hugeicons/core-free-icons");
7097
+ var UniversalDeveloperSettings = ({
7098
+ initialPublicKey,
7099
+ initialWebhookUrl,
7100
+ isReadOnly = false,
7101
+ onGenerateKeys,
7102
+ onSaveWebhook
7103
+ }) => {
7104
+ const [publicKey, setPublicKey] = (0, import_react103.useState)(initialPublicKey);
7105
+ const [webhookUrl, setWebhookUrl] = (0, import_react103.useState)(initialWebhookUrl);
7106
+ const [isGenerating, setIsGenerating] = (0, import_react103.useState)(false);
7107
+ const [isSavingWebhook, setIsSavingWebhook] = (0, import_react103.useState)(false);
7108
+ const [isRollModalOpen, setIsRollModalOpen] = (0, import_react103.useState)(false);
7109
+ (0, import_react103.useEffect)(() => {
7110
+ setPublicKey(initialPublicKey || "");
7111
+ setWebhookUrl(initialWebhookUrl || "");
7112
+ }, [initialPublicKey, initialWebhookUrl]);
7113
+ const handleWebhookChange = (val) => {
7114
+ setWebhookUrl(val.trim());
7115
+ };
7116
+ const downloadEnvironmentFile = (pubKey, secKey) => {
7117
+ const envContent = `AUDDITUR_PUBLIC_KEY="${pubKey}"
7118
+ AUDDITUR_SECRET_KEY="${secKey}"
7119
+ `;
7120
+ const blob = new Blob([envContent], { type: "text/plain" });
7121
+ const url = URL.createObjectURL(blob);
7122
+ const link = document.createElement("a");
7123
+ link.href = url;
7124
+ link.download = "audditur_credentials.txt";
7125
+ document.body.appendChild(link);
7126
+ link.click();
7127
+ document.body.removeChild(link);
7128
+ URL.revokeObjectURL(url);
7129
+ };
7130
+ const handleGenerateKeys = async () => {
7131
+ if (isGenerating || isReadOnly) return;
7132
+ setIsGenerating(true);
7133
+ try {
7134
+ const res = await onGenerateKeys();
7135
+ if (res.success && res.data) {
7136
+ setPublicKey(res.data.publicKey);
7137
+ downloadEnvironmentFile(res.data.publicKey, res.data.secretKey);
7138
+ import_react_hot_toast20.toast.success("Keys generated. Check your downloads folder.");
7139
+ setIsRollModalOpen(false);
7140
+ } else {
7141
+ import_react_hot_toast20.toast.error(res.error || "Uh oh! Something went wrong.");
7142
+ }
7143
+ } catch (error) {
7144
+ import_react_hot_toast20.toast.error("Uh oh! Something went wrong.");
7145
+ } finally {
7146
+ setIsGenerating(false);
7147
+ }
7148
+ };
7149
+ const handleSaveWebhook = async (e) => {
7150
+ e.preventDefault();
7151
+ if (isSavingWebhook || isReadOnly) return;
7152
+ setIsSavingWebhook(true);
7153
+ try {
7154
+ const res = await onSaveWebhook(webhookUrl);
7155
+ if (res.success && res.data) {
7156
+ setWebhookUrl(res.data.webhookUrl || "");
7157
+ import_react_hot_toast20.toast.success("Webhook URL updated.");
7158
+ } else {
7159
+ import_react_hot_toast20.toast.error(res.error || "Uh oh! Something went wrong.");
7160
+ }
7161
+ } catch (error) {
7162
+ import_react_hot_toast20.toast.error("Uh oh! Something went wrong.");
7163
+ } finally {
7164
+ setIsSavingWebhook(false);
7165
+ }
7166
+ };
7167
+ const hasWebhookChanges = webhookUrl !== initialWebhookUrl;
7168
+ const isWebhookSaveDisabled = isSavingWebhook || isReadOnly || !hasWebhookChanges;
7169
+ return /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 min-h-full" }, /* @__PURE__ */ import_react103.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-4 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
7170
+ "button",
7171
+ {
7172
+ onClick: () => window.dispatchEvent(new Event("open-sidebar")),
7173
+ className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
7174
+ "aria-label": "Open Menu"
7175
+ },
7176
+ /* @__PURE__ */ import_react103.default.createElement(import_react104.HugeiconsIcon, { icon: import_core_free_icons41.SidebarLeft01Icon, size: 18 })
7177
+ ), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("h1", { className: "font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Developer Settings"), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations."))), isReadOnly && /* @__PURE__ */ import_react103.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit sm:mt-1" }, "Read Only Access")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "w-full max-w-2xl flex flex-col gap-12" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
7178
+ TextInput,
7179
+ {
7180
+ label: "Public Key",
7181
+ value: publicKey || "No key generated yet",
7182
+ onChange: () => {
7183
+ },
7184
+ disabled: true
7185
+ }
7186
+ ), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 leading-snug" }, "Your public key is used to identify your application. Your secret key will only be shown once upon generation.")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react103.default.createElement(
7187
+ ThreeDActionButton,
7188
+ {
7189
+ onClick: () => {
7190
+ if (publicKey) setIsRollModalOpen(true);
7191
+ else handleGenerateKeys();
7192
+ },
7193
+ disabled: isGenerating || isReadOnly,
7194
+ isLoading: isGenerating,
7195
+ className: "w-fit"
7196
+ },
7197
+ publicKey ? "Roll API Keys" : "Generate Keys"
7198
+ ))), /* @__PURE__ */ import_react103.default.createElement("form", { className: "flex flex-col gap-6 border-t border-neutral-100 pt-8", onSubmit: handleSaveWebhook, autoComplete: "off" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
7199
+ TextInput,
7200
+ {
7201
+ label: "Webhook URL",
7202
+ value: webhookUrl,
7203
+ onChange: handleWebhookChange,
7204
+ disabled: isReadOnly || isSavingWebhook,
7205
+ placeholder: "https://your-domain.com/webhook",
7206
+ type: "url"
7207
+ }
7208
+ ), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 leading-snug" }, "We will send secure POST requests to this endpoint when significant events occur. Must use HTTPS.")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between mt-2 gap-6 sm:gap-4" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Webhook Status"), /* @__PURE__ */ import_react103.default.createElement("span", { className: `text-xs block truncate ${webhookUrl ? "text-emerald-600" : "text-neutral-400"}` }, webhookUrl ? "Active" : "Inactive"))), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col-reverse sm:flex-row items-center gap-3 sm:gap-4 w-full sm:w-auto shrink-0" }, hasWebhookChanges && !isSavingWebhook && !isReadOnly && /* @__PURE__ */ import_react103.default.createElement(
7209
+ "button",
7210
+ {
7211
+ type: "button",
7212
+ onClick: () => setWebhookUrl(initialWebhookUrl),
7213
+ className: "text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
7214
+ },
7215
+ "Cancel"
7216
+ ), /* @__PURE__ */ import_react103.default.createElement(
7217
+ ThreeDActionButton,
7218
+ {
7219
+ type: "submit",
7220
+ disabled: isWebhookSaveDisabled,
7221
+ isLoading: isSavingWebhook,
7222
+ className: "min-w-32 w-full sm:w-auto"
7223
+ },
7224
+ "Save Webhook"
7225
+ ))))), /* @__PURE__ */ import_react103.default.createElement(
7226
+ ConfirmationDialog,
7227
+ {
7228
+ isOpen: isRollModalOpen && !isReadOnly,
7229
+ title: "Roll API Keys",
7230
+ message: "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.",
7231
+ confirmText: "Roll Keys",
7232
+ cancelText: "Cancel",
7233
+ isProcessing: isGenerating,
7234
+ isDestructive: true,
7235
+ onClose: () => !isGenerating && setIsRollModalOpen(false),
7236
+ onConfirm: handleGenerateKeys
7237
+ }
7238
+ ));
7239
+ };
7240
+
7241
+ // src/components/UniversalApplicationPage2.tsx
7242
+ var import_react105 = __toESM(require("react"));
7243
+ var import_react106 = require("@hugeicons/react");
7244
+ var import_core_free_icons42 = require("@hugeicons/core-free-icons");
7245
+ var UniversalApplicationPage2 = ({
7246
+ userRole = "MEMBER",
7247
+ applications,
7248
+ isLoading,
7249
+ currentPage,
7250
+ totalPages,
7251
+ onPageChange,
7252
+ searchQuery,
7253
+ onSearchChange,
7254
+ activeStatusFilter,
7255
+ onStatusFilterChange,
7256
+ onApplicationClick,
7257
+ onCreateApplication
7258
+ }) => {
7259
+ const canManage = userRole === "ADMIN" || userRole === "MANAGER" || userRole === "OWNER";
7260
+ const [showStatusModal, setShowStatusModal] = (0, import_react105.useState)(false);
7261
+ const [localSearchQuery, setLocalSearchQuery] = (0, import_react105.useState)(searchQuery);
7262
+ const typingTimer = (0, import_react105.useRef)(null);
7263
+ const handleSearchInput = (e) => {
7264
+ const val = e.target.value;
7265
+ setLocalSearchQuery(val);
7266
+ if (typingTimer.current) clearTimeout(typingTimer.current);
7267
+ typingTimer.current = setTimeout(() => {
7268
+ onSearchChange(val);
7269
+ }, 600);
7270
+ };
7271
+ const APPLICATION_STATUSES = [
7272
+ "ALL",
7273
+ "DRAFT",
7274
+ "COMPLETED",
7275
+ "PENDING",
7276
+ "REJECTED",
7277
+ "QUERIED",
7278
+ "AWAITING_PAYMENT"
7279
+ ];
7280
+ return /* @__PURE__ */ import_react105.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex items-center gap-4 mb-8 px-1" }, /* @__PURE__ */ import_react105.default.createElement(
7281
+ "button",
7282
+ {
7283
+ onClick: () => window.dispatchEvent(new Event("open-sidebar")),
7284
+ className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
7285
+ "aria-label": "Open Menu"
7286
+ },
7287
+ /* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.SidebarLeft01Icon, size: 18 })
7288
+ ), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react105.default.createElement("h1", { className: "text-black text-xl tracking-tight" }, "Applications Directory"), /* @__PURE__ */ import_react105.default.createElement("p", { className: "text-xs text-stone-500" }, "Search, filter, and track all your organizational applications."))), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex flex-row flex-nowrap mb-2 items-center justify-between gap-4 w-full px-1" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.Search01Icon, size: 16, className: "text-stone-400" })), /* @__PURE__ */ import_react105.default.createElement(
7289
+ "input",
7290
+ {
7291
+ type: "text",
7292
+ placeholder: "Search applications...",
7293
+ value: localSearchQuery,
7294
+ onChange: handleSearchInput,
7295
+ className: "w-full pl-10 pr-4 py-2.5 bg-white rounded-full text-sm text-black placeholder-stone-400 outline-none transition-colors focus:border-[#d97757] border border-transparent shadow-[0_2px_10px_rgba(0,0,0,0.02)]"
7296
+ }
7297
+ )), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex items-center gap-3 w-auto pb-0 shrink-0" }, /* @__PURE__ */ import_react105.default.createElement(
7298
+ "button",
7299
+ {
7300
+ onClick: () => setShowStatusModal(true),
7301
+ className: "flex items-center justify-center bg-white shadow-[0_2px_10px_rgba(0,0,0,0.02)] w-10 h-10 rounded-full text-stone-500 hover:text-black transition-colors outline-none relative"
7302
+ },
7303
+ /* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.SearchList02Icon, size: 18 }),
7304
+ activeStatusFilter !== "ALL" && /* @__PURE__ */ import_react105.default.createElement("span", { className: "absolute top-2 right-2 w-2 h-2 bg-[#d97757] rounded-full border border-white" })
7305
+ ))), /* @__PURE__ */ import_react105.default.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ import_react105.default.createElement(
7306
+ UniversalApplicationsPage,
7307
+ {
7308
+ headerTitle: "Recent Filings",
7309
+ headerDescription: "",
7310
+ applications,
7311
+ isLoading,
7312
+ currentPage,
7313
+ totalPages,
7314
+ onPageChange,
7315
+ onApplicationClick,
7316
+ onCreateApplication: canManage ? onCreateApplication : void 0
7317
+ }
7318
+ )), /* @__PURE__ */ import_react105.default.createElement(
7319
+ ReusableOptions,
7320
+ {
7321
+ isOpen: showStatusModal,
7322
+ onClose: () => setShowStatusModal(false),
7323
+ title: "Filter by Status",
7324
+ options: APPLICATION_STATUSES,
7325
+ selectedOption: activeStatusFilter,
7326
+ onSelect: (status) => {
7327
+ onStatusFilterChange(status);
7328
+ setShowStatusModal(false);
7329
+ }
7330
+ }
7331
+ ));
7332
+ };
6330
7333
  // Annotate the CommonJS export names for ESM import in node:
6331
7334
  0 && (module.exports = {
6332
7335
  AppBento2,
@@ -6357,15 +7360,20 @@ var HomeHuddleCalendar = ({
6357
7360
  PipleAuth,
6358
7361
  PlatformFeatures,
6359
7362
  PortfolioHero,
7363
+ RootSidebar,
6360
7364
  TextInput,
6361
7365
  ThreeDActionButton,
6362
7366
  ThreeDButton,
7367
+ UniversalApplicationPage2,
7368
+ UniversalApplicationsPage,
6363
7369
  UniversalBuyCryptoPage,
6364
7370
  UniversalCardActionPage,
6365
7371
  UniversalCardPage,
6366
7372
  UniversalCreateHuddle,
7373
+ UniversalDeveloperSettings,
6367
7374
  UniversalErrorView,
6368
7375
  UniversalHome2,
7376
+ UniversalHome3,
6369
7377
  UniversalHomeView,
6370
7378
  UniversalHuddleDetails,
6371
7379
  UniversalHuddlesPage,
@@ -6377,6 +7385,7 @@ var HomeHuddleCalendar = ({
6377
7385
  UniversalRewardPage,
6378
7386
  UniversalSecurityPage,
6379
7387
  UniversalSettings,
7388
+ UniversalSettings2,
6380
7389
  UniversalSidebar,
6381
7390
  UniversalTransactionPage,
6382
7391
  UniversalVerificationPage,