@retinalabsllc/zairusjs 16.0.95 → 16.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1016,6 +1016,7 @@ interface UniversalMembersPageProps {
1016
1016
  actionButtonText: string;
1017
1017
  hideAction?: boolean;
1018
1018
  onRemoveMember: (memberId: string) => Promise<void>;
1019
+ onInviteMember: (email: string) => Promise<void>;
1019
1020
  }
1020
1021
  declare const UniversalMembersPage: React.FC<UniversalMembersPageProps>;
1021
1022
 
package/dist/index.d.ts CHANGED
@@ -1016,6 +1016,7 @@ interface UniversalMembersPageProps {
1016
1016
  actionButtonText: string;
1017
1017
  hideAction?: boolean;
1018
1018
  onRemoveMember: (memberId: string) => Promise<void>;
1019
+ onInviteMember: (email: string) => Promise<void>;
1019
1020
  }
1020
1021
  declare const UniversalMembersPage: React.FC<UniversalMembersPageProps>;
1021
1022
 
package/dist/index.js CHANGED
@@ -4573,7 +4573,7 @@ var MemberAvatar = ({ src, status }) => {
4573
4573
  return "bg-neutral-200";
4574
4574
  }
4575
4575
  };
4576
- return /* @__PURE__ */ import_react79.default.createElement("div", { className: "relative w-10 h-10 shrink-0" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden border border-neutral-200" }, !loaded && !error && /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ import_react79.default.createElement(
4576
+ return /* @__PURE__ */ import_react79.default.createElement("div", { className: "relative w-10 h-10 shrink-0" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ import_react79.default.createElement(
4577
4577
  "img",
4578
4578
  {
4579
4579
  src: finalSrc,
@@ -4582,7 +4582,7 @@ var MemberAvatar = ({ src, status }) => {
4582
4582
  onLoad: () => setLoaded(true),
4583
4583
  onError: () => setError(true)
4584
4584
  }
4585
- )), /* @__PURE__ */ import_react79.default.createElement("div", { className: `absolute -bottom-1 -right-1 w-3.5 h-3.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
4585
+ )), /* @__PURE__ */ import_react79.default.createElement("div", { className: `absolute -bottom-1 -right-1 w-2.5 h-2.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
4586
4586
  };
4587
4587
  var PageSpinner7 = () => /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
4588
4588
  var UniversalMembersPage = ({
@@ -4601,17 +4601,22 @@ var UniversalMembersPage = ({
4601
4601
  onRoleFilterChange,
4602
4602
  actionButtonText,
4603
4603
  hideAction = false,
4604
- onRemoveMember
4604
+ onRemoveMember,
4605
+ onInviteMember
4605
4606
  }) => {
4606
4607
  const [expandedId, setExpandedId] = (0, import_react79.useState)(null);
4607
4608
  const [memberToRemove, setMemberToRemove] = (0, import_react79.useState)(null);
4608
4609
  const [isRemoving, setIsRemoving] = (0, import_react79.useState)(false);
4610
+ const [isInviteMode, setIsInviteMode] = (0, import_react79.useState)(false);
4611
+ const [inviteEmail, setInviteEmail] = (0, import_react79.useState)("");
4612
+ const [isInviting, setIsInviting] = (0, import_react79.useState)(false);
4609
4613
  const [localSearchQuery, setLocalSearchQuery] = (0, import_react79.useState)(searchQuery);
4610
4614
  const [isTyping, setIsTyping] = (0, import_react79.useState)(false);
4611
4615
  const [isStatusModalOpen, setIsStatusModalOpen] = (0, import_react79.useState)(false);
4612
4616
  const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react79.useState)(false);
4613
4617
  const statusDropdownRef = (0, import_react79.useRef)(null);
4614
4618
  const roleDropdownRef = (0, import_react79.useRef)(null);
4619
+ const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
4615
4620
  (0, import_react79.useEffect)(() => {
4616
4621
  function handleClickOutside(event) {
4617
4622
  if (statusDropdownRef.current && !statusDropdownRef.current.contains(event.target)) {
@@ -4651,6 +4656,20 @@ var UniversalMembersPage = ({
4651
4656
  setIsRemoving(false);
4652
4657
  }
4653
4658
  };
4659
+ const handleInviteSubmit = async (e) => {
4660
+ e.preventDefault();
4661
+ if (inviteEmail.length < 5 || isInviting) return;
4662
+ setIsInviting(true);
4663
+ try {
4664
+ await onInviteMember(inviteEmail);
4665
+ setInviteEmail("");
4666
+ setIsInviteMode(false);
4667
+ } catch (error) {
4668
+ import_react_hot_toast13.default.error(error.message || "Failed to send invitation.");
4669
+ } finally {
4670
+ setIsInviting(false);
4671
+ }
4672
+ };
4654
4673
  const isListLoading = isLoading || isTyping;
4655
4674
  return /* @__PURE__ */ import_react79.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react79.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react79.default.createElement(
4656
4675
  ConfirmationDialog,
@@ -4665,7 +4684,7 @@ var UniversalMembersPage = ({
4665
4684
  onClose: () => setMemberToRemove(null),
4666
4685
  onConfirm: handleConfirmRemove
4667
4686
  }
4668
- ), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.Search01Icon, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ import_react79.default.createElement(
4687
+ ), !isInviteMode && /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full animate-in fade-in duration-300" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.Search01Icon, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ import_react79.default.createElement(
4669
4688
  "input",
4670
4689
  {
4671
4690
  type: "text",
@@ -4688,7 +4707,46 @@ var UniversalMembersPage = ({
4688
4707
  className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-neutral-500 hover:text-black transition-colors outline-none"
4689
4708
  },
4690
4709
  /* @__PURE__ */ import_react79.default.createElement(import_react80.HugeiconsIcon, { icon: import_core_free_icons28.ListSettingIcon, size: 16 })
4691
- ))), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ import_react79.default.createElement("div", null, /* @__PURE__ */ import_react79.default.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ import_react79.default.createElement("p", { className: "text-[12px] text-neutral-500" }, headerDescription))), /* @__PURE__ */ import_react79.default.createElement("div", { className: "w-full overflow-hidden" }, isListLoading ? /* @__PURE__ */ import_react79.default.createElement(PageSpinner7, null) : /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react79.default.createElement("div", null, members.length === 0 ? /* @__PURE__ */ import_react79.default.createElement("p", { className: "text-[12px] text-neutral-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ import_react79.default.createElement(import_react79.default.Fragment, { key: member.id }, expandedId === member.id ? /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col p-5 bg-neutral-50 rounded-xl animate-in fade-in zoom-in-95 duration-200 gap-5 my-2" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react79.default.createElement(MemberAvatar, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[14px] text-black tracking-tight truncate" }, member.name), /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[12px] text-neutral-500 capitalize" }, member.role.toLowerCase()))), member.departmentName && /* @__PURE__ */ import_react79.default.createElement("div", { className: "pt-3 border-t border-neutral-200" }, /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1" }, "Department"), /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[13px] text-black truncate block" }, member.departmentName)), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex gap-3 pt-2" }, !hideAction && /* @__PURE__ */ import_react79.default.createElement(
4710
+ ))), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-row items-start justify-between gap-4" }, /* @__PURE__ */ import_react79.default.createElement("div", null, /* @__PURE__ */ import_react79.default.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, isInviteMode ? "Add Member" : headerTitle), headerDescription && !isInviteMode && /* @__PURE__ */ import_react79.default.createElement("p", { className: "text-[12px] text-neutral-500" }, headerDescription)), !isInviteMode && /* @__PURE__ */ import_react79.default.createElement(
4711
+ "button",
4712
+ {
4713
+ onClick: () => setIsInviteMode(true),
4714
+ className: "shrink-0 px-4 py-2 border border-neutral-200 text-black text-[12px] tracking-wide rounded-full hover:bg-neutral-50 transition-colors outline-none"
4715
+ },
4716
+ "Invite Team"
4717
+ )), /* @__PURE__ */ import_react79.default.createElement("div", { className: "w-full overflow-hidden" }, isInviteMode ? /* @__PURE__ */ import_react79.default.createElement("form", { onSubmit: handleInviteSubmit, className: "flex flex-col gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ import_react79.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ import_react79.default.createElement(
4718
+ "input",
4719
+ {
4720
+ type: "email",
4721
+ value: inviteEmail,
4722
+ onChange: (e) => setInviteEmail(cleanEmailId(e.target.value)),
4723
+ required: true,
4724
+ autoFocus: true,
4725
+ className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300",
4726
+ placeholder: "name@company.com"
4727
+ }
4728
+ )), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ import_react79.default.createElement(
4729
+ ThreeDActionButton,
4730
+ {
4731
+ type: "submit",
4732
+ disabled: inviteEmail.length < 5 || isInviting,
4733
+ isLoading: isInviting,
4734
+ className: "w-full"
4735
+ },
4736
+ "Send Invitation"
4737
+ ), /* @__PURE__ */ import_react79.default.createElement(
4738
+ "button",
4739
+ {
4740
+ type: "button",
4741
+ onClick: () => {
4742
+ setIsInviteMode(false);
4743
+ setInviteEmail("");
4744
+ },
4745
+ disabled: isInviting,
4746
+ className: "w-full flex items-center justify-center py-2.5 rounded-full border border-neutral-200 text-black hover:bg-neutral-50 transition-colors outline-none text-xs tracking-wide"
4747
+ },
4748
+ "Cancel"
4749
+ ))) : isListLoading ? /* @__PURE__ */ import_react79.default.createElement(PageSpinner7, null) : /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col min-w-0 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react79.default.createElement("div", null, members.length === 0 ? /* @__PURE__ */ import_react79.default.createElement("p", { className: "text-[12px] text-neutral-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ import_react79.default.createElement(import_react79.default.Fragment, { key: member.id }, expandedId === member.id ? /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col p-5 bg-neutral-50 rounded-xl animate-in fade-in zoom-in-95 duration-200 gap-5 my-2" }, /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react79.default.createElement(MemberAvatar, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[14px] text-black tracking-tight truncate" }, member.name), /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[12px] text-neutral-500 capitalize" }, member.role.toLowerCase()))), member.departmentName && /* @__PURE__ */ import_react79.default.createElement("div", { className: "pt-3 border-t border-neutral-200" }, /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1" }, "Department"), /* @__PURE__ */ import_react79.default.createElement("span", { className: "text-[13px] text-black truncate block" }, member.departmentName)), /* @__PURE__ */ import_react79.default.createElement("div", { className: "flex gap-3 pt-2" }, !hideAction && /* @__PURE__ */ import_react79.default.createElement(
4692
4750
  "button",
4693
4751
  {
4694
4752
  onClick: () => setMemberToRemove(member),
@@ -4777,7 +4835,7 @@ var UniversalHome2 = ({
4777
4835
  const fallbackAvatarUrl = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
4778
4836
  const finalAvatarSrc = avatarSrc || fallbackAvatarUrl;
4779
4837
  const hasUnreadNotifs = notifications.some((n) => !n.isRead);
4780
- return /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-10 h-10 shrink-0 cursor-pointer", onClick: () => router.push("/app/account/me") }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "relative w-full h-full rounded-lg overflow-hidden bg-neutral-100 flex items-center justify-center border border-neutral-200" }, !isAvatarLoaded && /* @__PURE__ */ import_react81.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-neutral-100" }, /* @__PURE__ */ import_react81.default.createElement(import_react82.HugeiconsIcon, { icon: import_core_free_icons29.Loading03Icon, size: 16, className: "animate-spin text-black" })), /* @__PURE__ */ import_react81.default.createElement(
4838
+ return /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-10 h-10 shrink-0 cursor-pointer", onClick: () => router.push("/app/account/me") }, /* @__PURE__ */ import_react81.default.createElement("div", { className: "relative w-full h-full rounded-lg overflow-hidden bg-white flex items-center justify-center" }, !isAvatarLoaded && /* @__PURE__ */ import_react81.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-white" }, /* @__PURE__ */ import_react81.default.createElement(import_react82.HugeiconsIcon, { icon: import_core_free_icons29.Loading03Icon, size: 16, className: "animate-spin text-black" })), /* @__PURE__ */ import_react81.default.createElement(
4781
4839
  "img",
4782
4840
  {
4783
4841
  src: finalAvatarSrc,
@@ -4808,7 +4866,7 @@ var UniversalHome2 = ({
4808
4866
  {
4809
4867
  src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cal_a.avif",
4810
4868
  alt: "Create Huddle",
4811
- 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 drop-shadow-md"
4869
+ 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 "
4812
4870
  }
4813
4871
  )
4814
4872
  ), /* @__PURE__ */ import_react81.default.createElement(
@@ -4823,7 +4881,7 @@ var UniversalHome2 = ({
4823
4881
  {
4824
4882
  src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cam_a.avif",
4825
4883
  alt: "Join Huddle",
4826
- 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 drop-shadow-md"
4884
+ 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 "
4827
4885
  }
4828
4886
  )
4829
4887
  ))), customContent && /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-full" }, customContent), /* @__PURE__ */ import_react81.default.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ import_react81.default.createElement(
package/dist/index.mjs CHANGED
@@ -4593,7 +4593,7 @@ var MemberAvatar = ({ src, status }) => {
4593
4593
  return "bg-neutral-200";
4594
4594
  }
4595
4595
  };
4596
- return /* @__PURE__ */ React47.createElement("div", { className: "relative w-10 h-10 shrink-0" }, /* @__PURE__ */ React47.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden border border-neutral-200" }, !loaded && !error && /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: Loading03Icon21, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ React47.createElement(
4596
+ return /* @__PURE__ */ React47.createElement("div", { className: "relative w-10 h-10 shrink-0" }, /* @__PURE__ */ React47.createElement("div", { className: "w-full h-full rounded-lg bg-neutral-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: Loading03Icon21, className: "animate-spin text-neutral-400 absolute", size: 14 }), /* @__PURE__ */ React47.createElement(
4597
4597
  "img",
4598
4598
  {
4599
4599
  src: finalSrc,
@@ -4602,7 +4602,7 @@ var MemberAvatar = ({ src, status }) => {
4602
4602
  onLoad: () => setLoaded(true),
4603
4603
  onError: () => setError(true)
4604
4604
  }
4605
- )), /* @__PURE__ */ React47.createElement("div", { className: `absolute -bottom-1 -right-1 w-3.5 h-3.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
4605
+ )), /* @__PURE__ */ React47.createElement("div", { className: `absolute -bottom-1 -right-1 w-2.5 h-2.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
4606
4606
  };
4607
4607
  var PageSpinner7 = () => /* @__PURE__ */ React47.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: Loading03Icon21, size: 32, className: "animate-spin mb-4 text-black" }));
4608
4608
  var UniversalMembersPage = ({
@@ -4621,17 +4621,22 @@ var UniversalMembersPage = ({
4621
4621
  onRoleFilterChange,
4622
4622
  actionButtonText,
4623
4623
  hideAction = false,
4624
- onRemoveMember
4624
+ onRemoveMember,
4625
+ onInviteMember
4625
4626
  }) => {
4626
4627
  const [expandedId, setExpandedId] = useState32(null);
4627
4628
  const [memberToRemove, setMemberToRemove] = useState32(null);
4628
4629
  const [isRemoving, setIsRemoving] = useState32(false);
4630
+ const [isInviteMode, setIsInviteMode] = useState32(false);
4631
+ const [inviteEmail, setInviteEmail] = useState32("");
4632
+ const [isInviting, setIsInviting] = useState32(false);
4629
4633
  const [localSearchQuery, setLocalSearchQuery] = useState32(searchQuery);
4630
4634
  const [isTyping, setIsTyping] = useState32(false);
4631
4635
  const [isStatusModalOpen, setIsStatusModalOpen] = useState32(false);
4632
4636
  const [isRoleModalOpen, setIsRoleModalOpen] = useState32(false);
4633
4637
  const statusDropdownRef = useRef12(null);
4634
4638
  const roleDropdownRef = useRef12(null);
4639
+ const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
4635
4640
  useEffect18(() => {
4636
4641
  function handleClickOutside(event) {
4637
4642
  if (statusDropdownRef.current && !statusDropdownRef.current.contains(event.target)) {
@@ -4671,6 +4676,20 @@ var UniversalMembersPage = ({
4671
4676
  setIsRemoving(false);
4672
4677
  }
4673
4678
  };
4679
+ const handleInviteSubmit = async (e) => {
4680
+ e.preventDefault();
4681
+ if (inviteEmail.length < 5 || isInviting) return;
4682
+ setIsInviting(true);
4683
+ try {
4684
+ await onInviteMember(inviteEmail);
4685
+ setInviteEmail("");
4686
+ setIsInviteMode(false);
4687
+ } catch (error) {
4688
+ toast12.error(error.message || "Failed to send invitation.");
4689
+ } finally {
4690
+ setIsInviting(false);
4691
+ }
4692
+ };
4674
4693
  const isListLoading = isLoading || isTyping;
4675
4694
  return /* @__PURE__ */ React47.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ React47.createElement(ManagedToaster, null), /* @__PURE__ */ React47.createElement(
4676
4695
  ConfirmationDialog,
@@ -4685,7 +4704,7 @@ var UniversalMembersPage = ({
4685
4704
  onClose: () => setMemberToRemove(null),
4686
4705
  onConfirm: handleConfirmRemove
4687
4706
  }
4688
- ), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full" }, /* @__PURE__ */ React47.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ React47.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: Search01Icon3, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ React47.createElement(
4707
+ ), !isInviteMode && /* @__PURE__ */ React47.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full animate-in fade-in duration-300" }, /* @__PURE__ */ React47.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ React47.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: Search01Icon3, size: 16, className: "text-neutral-400" })), /* @__PURE__ */ React47.createElement(
4689
4708
  "input",
4690
4709
  {
4691
4710
  type: "text",
@@ -4708,7 +4727,46 @@ var UniversalMembersPage = ({
4708
4727
  className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-neutral-500 hover:text-black transition-colors outline-none"
4709
4728
  },
4710
4729
  /* @__PURE__ */ React47.createElement(HugeiconsIcon33, { icon: ListSettingIcon2, size: 16 })
4711
- ))), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, /* @__PURE__ */ React47.createElement("div", null, /* @__PURE__ */ React47.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, headerTitle), headerDescription && /* @__PURE__ */ React47.createElement("p", { className: "text-[12px] text-neutral-500" }, headerDescription))), /* @__PURE__ */ React47.createElement("div", { className: "w-full overflow-hidden" }, isListLoading ? /* @__PURE__ */ React47.createElement(PageSpinner7, null) : /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React47.createElement("div", null, members.length === 0 ? /* @__PURE__ */ React47.createElement("p", { className: "text-[12px] text-neutral-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ React47.createElement(React47.Fragment, { key: member.id }, expandedId === member.id ? /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col p-5 bg-neutral-50 rounded-xl animate-in fade-in zoom-in-95 duration-200 gap-5 my-2" }, /* @__PURE__ */ React47.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React47.createElement(MemberAvatar, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React47.createElement("span", { className: "text-[14px] text-black tracking-tight truncate" }, member.name), /* @__PURE__ */ React47.createElement("span", { className: "text-[12px] text-neutral-500 capitalize" }, member.role.toLowerCase()))), member.departmentName && /* @__PURE__ */ React47.createElement("div", { className: "pt-3 border-t border-neutral-200" }, /* @__PURE__ */ React47.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1" }, "Department"), /* @__PURE__ */ React47.createElement("span", { className: "text-[13px] text-black truncate block" }, member.departmentName)), /* @__PURE__ */ React47.createElement("div", { className: "flex gap-3 pt-2" }, !hideAction && /* @__PURE__ */ React47.createElement(
4730
+ ))), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ React47.createElement("div", { className: "flex flex-row items-start justify-between gap-4" }, /* @__PURE__ */ React47.createElement("div", null, /* @__PURE__ */ React47.createElement("h1", { className: "text-black text-xl mb-1 tracking-tight" }, isInviteMode ? "Add Member" : headerTitle), headerDescription && !isInviteMode && /* @__PURE__ */ React47.createElement("p", { className: "text-[12px] text-neutral-500" }, headerDescription)), !isInviteMode && /* @__PURE__ */ React47.createElement(
4731
+ "button",
4732
+ {
4733
+ onClick: () => setIsInviteMode(true),
4734
+ className: "shrink-0 px-4 py-2 border border-neutral-200 text-black text-[12px] tracking-wide rounded-full hover:bg-neutral-50 transition-colors outline-none"
4735
+ },
4736
+ "Invite Team"
4737
+ )), /* @__PURE__ */ React47.createElement("div", { className: "w-full overflow-hidden" }, isInviteMode ? /* @__PURE__ */ React47.createElement("form", { onSubmit: handleInviteSubmit, className: "flex flex-col gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ React47.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ React47.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ React47.createElement(
4738
+ "input",
4739
+ {
4740
+ type: "email",
4741
+ value: inviteEmail,
4742
+ onChange: (e) => setInviteEmail(cleanEmailId(e.target.value)),
4743
+ required: true,
4744
+ autoFocus: true,
4745
+ className: "w-full px-2 py-3 bg-transparent text-sm border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300",
4746
+ placeholder: "name@company.com"
4747
+ }
4748
+ )), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React47.createElement(
4749
+ ThreeDActionButton,
4750
+ {
4751
+ type: "submit",
4752
+ disabled: inviteEmail.length < 5 || isInviting,
4753
+ isLoading: isInviting,
4754
+ className: "w-full"
4755
+ },
4756
+ "Send Invitation"
4757
+ ), /* @__PURE__ */ React47.createElement(
4758
+ "button",
4759
+ {
4760
+ type: "button",
4761
+ onClick: () => {
4762
+ setIsInviteMode(false);
4763
+ setInviteEmail("");
4764
+ },
4765
+ disabled: isInviting,
4766
+ className: "w-full flex items-center justify-center py-2.5 rounded-full border border-neutral-200 text-black hover:bg-neutral-50 transition-colors outline-none text-xs tracking-wide"
4767
+ },
4768
+ "Cancel"
4769
+ ))) : isListLoading ? /* @__PURE__ */ React47.createElement(PageSpinner7, null) : /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col min-w-0 animate-in fade-in duration-300" }, /* @__PURE__ */ React47.createElement("div", null, members.length === 0 ? /* @__PURE__ */ React47.createElement("p", { className: "text-[12px] text-neutral-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ React47.createElement(React47.Fragment, { key: member.id }, expandedId === member.id ? /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col p-5 bg-neutral-50 rounded-xl animate-in fade-in zoom-in-95 duration-200 gap-5 my-2" }, /* @__PURE__ */ React47.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ React47.createElement(MemberAvatar, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ React47.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React47.createElement("span", { className: "text-[14px] text-black tracking-tight truncate" }, member.name), /* @__PURE__ */ React47.createElement("span", { className: "text-[12px] text-neutral-500 capitalize" }, member.role.toLowerCase()))), member.departmentName && /* @__PURE__ */ React47.createElement("div", { className: "pt-3 border-t border-neutral-200" }, /* @__PURE__ */ React47.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1" }, "Department"), /* @__PURE__ */ React47.createElement("span", { className: "text-[13px] text-black truncate block" }, member.departmentName)), /* @__PURE__ */ React47.createElement("div", { className: "flex gap-3 pt-2" }, !hideAction && /* @__PURE__ */ React47.createElement(
4712
4770
  "button",
4713
4771
  {
4714
4772
  onClick: () => setMemberToRemove(member),
@@ -4804,7 +4862,7 @@ var UniversalHome2 = ({
4804
4862
  const fallbackAvatarUrl = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
4805
4863
  const finalAvatarSrc = avatarSrc || fallbackAvatarUrl;
4806
4864
  const hasUnreadNotifs = notifications.some((n) => !n.isRead);
4807
- return /* @__PURE__ */ React48.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ React48.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ React48.createElement("div", { className: "w-10 h-10 shrink-0 cursor-pointer", onClick: () => router.push("/app/account/me") }, /* @__PURE__ */ React48.createElement("div", { className: "relative w-full h-full rounded-lg overflow-hidden bg-neutral-100 flex items-center justify-center border border-neutral-200" }, !isAvatarLoaded && /* @__PURE__ */ React48.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-neutral-100" }, /* @__PURE__ */ React48.createElement(HugeiconsIcon34, { icon: Loading03Icon22, size: 16, className: "animate-spin text-black" })), /* @__PURE__ */ React48.createElement(
4865
+ return /* @__PURE__ */ React48.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ React48.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ React48.createElement("div", { className: "w-10 h-10 shrink-0 cursor-pointer", onClick: () => router.push("/app/account/me") }, /* @__PURE__ */ React48.createElement("div", { className: "relative w-full h-full rounded-lg overflow-hidden bg-white flex items-center justify-center" }, !isAvatarLoaded && /* @__PURE__ */ React48.createElement("div", { className: "absolute inset-0 flex items-center justify-center z-10 bg-white" }, /* @__PURE__ */ React48.createElement(HugeiconsIcon34, { icon: Loading03Icon22, size: 16, className: "animate-spin text-black" })), /* @__PURE__ */ React48.createElement(
4808
4866
  "img",
4809
4867
  {
4810
4868
  src: finalAvatarSrc,
@@ -4835,7 +4893,7 @@ var UniversalHome2 = ({
4835
4893
  {
4836
4894
  src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cal_a.avif",
4837
4895
  alt: "Create Huddle",
4838
- 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 drop-shadow-md"
4896
+ 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 "
4839
4897
  }
4840
4898
  )
4841
4899
  ), /* @__PURE__ */ React48.createElement(
@@ -4850,7 +4908,7 @@ var UniversalHome2 = ({
4850
4908
  {
4851
4909
  src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cam_a.avif",
4852
4910
  alt: "Join Huddle",
4853
- 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 drop-shadow-md"
4911
+ 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 "
4854
4912
  }
4855
4913
  )
4856
4914
  ))), customContent && /* @__PURE__ */ React48.createElement("div", { className: "w-full" }, customContent), /* @__PURE__ */ React48.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ React48.createElement(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retinalabsllc/zairusjs",
3
- "version": "16.0.95",
3
+ "version": "16.1.1",
4
4
  "description": "A perceptive, Ai data driven Next.js UI component library.",
5
5
  "author": "Retina Labs Company",
6
6
  "license": "MIT",