@retinalabsllc/zairusjs 15.0.85 → 15.0.90

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
@@ -370,12 +370,143 @@ var Header = ({
370
370
  };
371
371
 
372
372
  // src/components/PipleAuth.tsx
373
- var import_react6 = __toESM(require("react"));
373
+ var import_react7 = __toESM(require("react"));
374
374
  var import_navigation2 = require("next/navigation");
375
375
  var import_react_hot_toast = __toESM(require("react-hot-toast"));
376
376
  var import_react_google_recaptcha_v3 = require("react-google-recaptcha-v3");
377
377
  var import_browser = require("@simplewebauthn/browser");
378
- var InputSpinner = () => /* @__PURE__ */ import_react6.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react6.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react6.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" }));
378
+
379
+ // src/components/TextInput.tsx
380
+ var import_react6 = __toESM(require("react"));
381
+ var InputSpinner = () => /* @__PURE__ */ import_react6.default.createElement("svg", { className: "animate-spin h-3 w-3 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react6.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react6.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" }));
382
+ var FlagImage = ({ countryCode }) => {
383
+ const [loaded, setLoaded] = (0, import_react6.useState)(false);
384
+ return /* @__PURE__ */ import_react6.default.createElement("div", { className: "relative w-6 h-6 rounded-full overflow-hidden flex items-center justify-center bg-neutral-100 shrink-0 border border-neutral-200" }, !loaded && /* @__PURE__ */ import_react6.default.createElement("div", { className: "absolute inset-0 flex items-center justify-center" }, /* @__PURE__ */ import_react6.default.createElement(InputSpinner, null)), /* @__PURE__ */ import_react6.default.createElement(
385
+ "img",
386
+ {
387
+ src: `https://flagcdn.com/w40/${countryCode.toLowerCase()}.png`,
388
+ alt: countryCode,
389
+ className: `object-cover w-full h-full transition-opacity duration-300 ${loaded ? "opacity-100" : "opacity-0"}`,
390
+ onLoad: () => setLoaded(true)
391
+ }
392
+ ));
393
+ };
394
+ var TextInput = ({
395
+ label,
396
+ value,
397
+ onChange,
398
+ placeholder,
399
+ maxLength,
400
+ disabled,
401
+ readOnly,
402
+ type = "text",
403
+ onClick
404
+ }) => /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-2 flex-1 w-full", onClick }, label && /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, label), /* @__PURE__ */ import_react6.default.createElement(
405
+ "input",
406
+ {
407
+ type,
408
+ value,
409
+ onChange: (e) => onChange(e.target.value.substring(0, maxLength || 100)),
410
+ placeholder,
411
+ disabled,
412
+ readOnly,
413
+ autoComplete: "off",
414
+ spellCheck: "false",
415
+ className: `w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black transition-all outline-none focus:border-black disabled:opacity-50 ${readOnly ? "cursor-pointer" : ""}`
416
+ }
417
+ ));
418
+ var NumberInput = ({
419
+ label,
420
+ value,
421
+ onChange,
422
+ placeholder,
423
+ maxLength,
424
+ disabled
425
+ }) => /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-2 flex-1 w-full" }, label && /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, label), /* @__PURE__ */ import_react6.default.createElement(
426
+ "input",
427
+ {
428
+ type: "text",
429
+ value,
430
+ onChange: (e) => {
431
+ const numOnly = e.target.value.replace(/[^0-9]/g, "");
432
+ onChange(numOnly.substring(0, maxLength || 20));
433
+ },
434
+ placeholder,
435
+ disabled,
436
+ autoComplete: "off",
437
+ spellCheck: "false",
438
+ className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black transition-all outline-none focus:border-black disabled:opacity-50"
439
+ }
440
+ ));
441
+ var PhoneInput = ({
442
+ label,
443
+ value,
444
+ onChange,
445
+ selectedCountry,
446
+ onCountryClick,
447
+ placeholder,
448
+ disabled
449
+ }) => /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5 flex-1 w-full" }, label && /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block" }, label), /* @__PURE__ */ import_react6.default.createElement("div", { className: `flex items-center gap-3 border-b border-neutral-200 focus-within:border-black transition-all duration-300 pb-2 ${disabled ? "opacity-50" : ""}` }, /* @__PURE__ */ import_react6.default.createElement(
450
+ "button",
451
+ {
452
+ type: "button",
453
+ disabled,
454
+ onClick: onCountryClick,
455
+ className: "flex items-center gap-1.5 outline-none hover:opacity-80 transition-opacity"
456
+ },
457
+ /* @__PURE__ */ import_react6.default.createElement(FlagImage, { countryCode: selectedCountry.code }),
458
+ /* @__PURE__ */ import_react6.default.createElement("span", { className: "text-sm text-black font-medium pl-1" }, selectedCountry.dialCode),
459
+ /* @__PURE__ */ import_react6.default.createElement("svg", { className: "w-3 h-3 text-neutral-500", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ import_react6.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }))
460
+ ), /* @__PURE__ */ import_react6.default.createElement(
461
+ "input",
462
+ {
463
+ type: "tel",
464
+ value,
465
+ onChange: (e) => {
466
+ const numOnly = e.target.value.replace(/[^0-9]/g, "");
467
+ onChange(numOnly.substring(0, 15));
468
+ },
469
+ disabled,
470
+ required: true,
471
+ autoFocus: true,
472
+ autoComplete: "off",
473
+ spellCheck: "false",
474
+ className: "w-full text-sm bg-transparent text-black outline-none pt-1",
475
+ placeholder: placeholder || "0801 234 5678"
476
+ }
477
+ )));
478
+
479
+ // src/components/PipleAuth.tsx
480
+ var SUPPORTED_COUNTRIES = [
481
+ { code: "NG", dialCode: "+234", name: "Nigeria" },
482
+ { code: "GH", dialCode: "+233", name: "Ghana" },
483
+ { code: "KE", dialCode: "+254", name: "Kenya" }
484
+ ];
485
+ var InputSpinner2 = () => /* @__PURE__ */ import_react7.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react7.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react7.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" }));
486
+ var CountrySelectorDialog = ({ isOpen, onClose, onSelect }) => {
487
+ if (!isOpen) return null;
488
+ return /* @__PURE__ */ import_react7.default.createElement("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/40" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "absolute inset-0", onClick: onClose }), /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full max-w-sm bg-white rounded-2xl shadow-2xl overflow-hidden relative z-10 animate-in fade-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react7.default.createElement(
489
+ "button",
490
+ {
491
+ onClick: onClose,
492
+ className: "absolute top-4 right-4 p-2 text-neutral-700 hover:text-neutral-400 transition-colors outline-none"
493
+ },
494
+ /* @__PURE__ */ import_react7.default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, /* @__PURE__ */ import_react7.default.createElement("path", { d: "M18 6 6 18" }), /* @__PURE__ */ import_react7.default.createElement("path", { d: "m6 6 12 12" }))
495
+ ), /* @__PURE__ */ import_react7.default.createElement("div", { className: "p-6 sm:p-8" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "mb-6 mt-2" }, /* @__PURE__ */ import_react7.default.createElement("h2", { className: "text-xl text-black tracking-tight mb-2" }, "Select Country"), /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-[13px] text-neutral-500 leading-relaxed" }, "Choose your region to continue.")), /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col gap-2" }, SUPPORTED_COUNTRIES.map((c) => /* @__PURE__ */ import_react7.default.createElement(
496
+ "button",
497
+ {
498
+ key: c.code,
499
+ onClick: () => {
500
+ onSelect(c);
501
+ onClose();
502
+ },
503
+ className: "flex items-center gap-4 p-3 rounded-xl hover:bg-neutral-50 transition-colors text-left outline-none"
504
+ },
505
+ /* @__PURE__ */ import_react7.default.createElement(FlagImage, { countryCode: c.code }),
506
+ /* @__PURE__ */ import_react7.default.createElement("span", { className: "text-sm text-black flex-1 font-medium" }, c.name),
507
+ /* @__PURE__ */ import_react7.default.createElement("span", { className: "text-sm text-neutral-500 font-mono" }, c.dialCode)
508
+ ))))));
509
+ };
379
510
  function AuthFormInner({
380
511
  companyName,
381
512
  workspaceLabel = "Workspace",
@@ -391,29 +522,27 @@ function AuthFormInner({
391
522
  const searchParams = (0, import_navigation2.useSearchParams)();
392
523
  const redirectUrl = searchParams.get("redirect") || defaultRedirectPath;
393
524
  const captchaContext = useRecaptcha ? (0, import_react_google_recaptcha_v3.useGoogleReCaptcha)() : null;
394
- const [mode, setMode] = (0, import_react6.useState)("LOGIN");
395
- const [step, setStep] = (0, import_react6.useState)("INPUT");
396
- const getInitialSignupStep = () => {
397
- return "INVITATION";
398
- };
399
- const [signupStep, setSignupStep] = (0, import_react6.useState)(getInitialSignupStep());
400
- const [isSubmitting, setIsSubmitting] = (0, import_react6.useState)(false);
401
- const [countdown, setCountdown] = (0, import_react6.useState)(0);
402
- const [invitationCode, setInvitationCode] = (0, import_react6.useState)("");
403
- const [emailId, setEmailId] = (0, import_react6.useState)("");
404
- const [firstName, setFirstName] = (0, import_react6.useState)("");
405
- const [lastName, setLastName] = (0, import_react6.useState)("");
406
- const [orgName, setOrgName] = (0, import_react6.useState)("");
407
- const [agreedToTerms, setAgreedToTerms] = (0, import_react6.useState)(false);
408
- const [userHas2FA, setUserHas2FA] = (0, import_react6.useState)(false);
409
- const [userHasPasskey, setUserHasPasskey] = (0, import_react6.useState)(false);
410
- const [authOptions, setAuthOptions] = (0, import_react6.useState)(null);
411
- const [otp, setOtp] = (0, import_react6.useState)(["", "", "", "", "", ""]);
412
- const inputRefs = (0, import_react6.useRef)([]);
525
+ const [mode, setMode] = (0, import_react7.useState)("LOGIN");
526
+ const [step, setStep] = (0, import_react7.useState)("INPUT");
527
+ const getInitialSignupStep = () => "INVITATION";
528
+ const [signupStep, setSignupStep] = (0, import_react7.useState)(getInitialSignupStep());
529
+ const [isSubmitting, setIsSubmitting] = (0, import_react7.useState)(false);
530
+ const [countdown, setCountdown] = (0, import_react7.useState)(0);
531
+ const [invitationCode, setInvitationCode] = (0, import_react7.useState)("");
532
+ const [phoneNumber, setPhoneNumber] = (0, import_react7.useState)("");
533
+ const [selectedCountry, setSelectedCountry] = (0, import_react7.useState)(SUPPORTED_COUNTRIES[0]);
534
+ const [isCountryDialogOpen, setIsCountryDialogOpen] = (0, import_react7.useState)(false);
535
+ const [firstName, setFirstName] = (0, import_react7.useState)("");
536
+ const [lastName, setLastName] = (0, import_react7.useState)("");
537
+ const [orgName, setOrgName] = (0, import_react7.useState)("");
538
+ const [agreedToTerms, setAgreedToTerms] = (0, import_react7.useState)(false);
539
+ const [userHasPasskey, setUserHasPasskey] = (0, import_react7.useState)(false);
540
+ const [authOptions, setAuthOptions] = (0, import_react7.useState)(null);
541
+ const [otp, setOtp] = (0, import_react7.useState)(["", "", "", "", "", ""]);
542
+ const inputRefs = (0, import_react7.useRef)([]);
413
543
  const cleanAlpha = (val) => val.replace(/[^a-zA-Z]/g, "").substring(0, 50);
414
544
  const cleanOrgName = (val) => val.replace(/[^a-zA-Z0-9\s]/g, "").substring(0, 50);
415
- const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
416
- (0, import_react6.useEffect)(() => {
545
+ (0, import_react7.useEffect)(() => {
417
546
  if (countdown > 0) {
418
547
  const timer = setTimeout(() => setCountdown(countdown - 1), 1e3);
419
548
  return () => clearTimeout(timer);
@@ -442,6 +571,10 @@ function AuthFormInner({
442
571
  verifyOtpCode(newOtp.join(""));
443
572
  }
444
573
  };
574
+ const getFormattedPhoneNumber = () => {
575
+ const cleanNumber = phoneNumber.replace(/^0+/, "");
576
+ return `${selectedCountry.dialCode}${cleanNumber}`;
577
+ };
445
578
  const handleAuthRequestSubmit = async (e) => {
446
579
  if (e) e.preventDefault();
447
580
  if (mode === "SIGNUP" && !agreedToTerms) {
@@ -456,7 +589,8 @@ function AuthFormInner({
456
589
  recaptchaToken = await captchaContext.executeRecaptcha("auth_request");
457
590
  }
458
591
  const res = await onAuthRequest({
459
- email: emailId,
592
+ phoneNumber: getFormattedPhoneNumber(),
593
+ country: selectedCountry.code,
460
594
  firstName: mode === "SIGNUP" && requireNames ? firstName : void 0,
461
595
  lastName: mode === "SIGNUP" && requireNames ? lastName : void 0,
462
596
  organizationName: mode === "SIGNUP" && requireOrganization ? orgName : void 0,
@@ -465,10 +599,9 @@ function AuthFormInner({
465
599
  recaptchaToken
466
600
  });
467
601
  if (res.success) {
468
- setUserHas2FA(!!res.has2FA);
469
602
  setUserHasPasskey(!!res.hasPasskey);
470
603
  if (res.passkeyOptions) setAuthOptions(res.passkeyOptions);
471
- import_react_hot_toast.default.success(res.has2FA ? "Security check required" : "Verification code sent");
604
+ import_react_hot_toast.default.success(res.needsPukSetup ? "Verification code sent" : "Security check required");
472
605
  setStep("OTP");
473
606
  setCountdown(60);
474
607
  } else {
@@ -484,7 +617,10 @@ function AuthFormInner({
484
617
  if (codeToVerify.length !== 6 || isSubmitting) return;
485
618
  setIsSubmitting(true);
486
619
  try {
487
- const res = await onVerifyOtp({ email: emailId, code: codeToVerify });
620
+ const res = await onVerifyOtp({
621
+ phoneNumber: getFormattedPhoneNumber(),
622
+ code: codeToVerify
623
+ });
488
624
  if (res.success) {
489
625
  window.location.href = res.redirect || redirectUrl;
490
626
  } else {
@@ -503,7 +639,11 @@ function AuthFormInner({
503
639
  setIsSubmitting(true);
504
640
  try {
505
641
  const credentialResponse = await (0, import_browser.startAuthentication)({ optionsJSON: authOptions });
506
- const res = await onVerifyOtp({ email: emailId, isPasskey: true, passkeyCredential: credentialResponse });
642
+ const res = await onVerifyOtp({
643
+ phoneNumber: getFormattedPhoneNumber(),
644
+ isPasskey: true,
645
+ passkeyCredential: credentialResponse
646
+ });
507
647
  if (res.success) {
508
648
  window.location.href = res.redirect || redirectUrl;
509
649
  } else {
@@ -519,35 +659,42 @@ function AuthFormInner({
519
659
  if (signupStep === "INVITATION") {
520
660
  if (requireNames) setSignupStep("NAME");
521
661
  else if (requireOrganization) setSignupStep("ORGANIZATION");
522
- else setSignupStep("EMAIL_ID");
662
+ else setSignupStep("PHONE_ID");
523
663
  } else if (signupStep === "NAME") {
524
664
  if (requireOrganization) setSignupStep("ORGANIZATION");
525
- else setSignupStep("EMAIL_ID");
665
+ else setSignupStep("PHONE_ID");
526
666
  } else if (signupStep === "ORGANIZATION") {
527
- setSignupStep("EMAIL_ID");
667
+ setSignupStep("PHONE_ID");
528
668
  }
529
669
  };
530
670
  const isContinueDisabled = () => {
531
671
  if (isSubmitting) return true;
532
- if (mode === "LOGIN") return emailId.length < 3;
672
+ if (mode === "LOGIN") return phoneNumber.length < 5;
533
673
  if (mode === "SIGNUP") {
534
674
  if (signupStep === "INVITATION") return invitationCode.trim().length > 0 && invitationCode.trim().length < 3;
535
675
  if (signupStep === "NAME") return firstName.trim() === "" || lastName.trim() === "";
536
676
  if (signupStep === "ORGANIZATION") return orgName.trim().length < 3;
537
- if (signupStep === "EMAIL_ID") return emailId.length < 3 || !agreedToTerms;
677
+ if (signupStep === "PHONE_ID") return phoneNumber.length < 5 || !agreedToTerms;
538
678
  }
539
679
  return false;
540
680
  };
541
- return /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full max-w-md mx-auto flex flex-col items-center gap-4 relative z-10 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "p-8 md:p-12" }, step === "INPUT" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "mb-12 text-center mt-2" }, /* @__PURE__ */ import_react6.default.createElement("h2", { className: "text-xl text-black mb-2 tracking-tight" }, mode === "LOGIN" ? `${companyName} ${workspaceLabel}` : "Create Account"), /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-[13px] text-neutral-500" }, mode === "LOGIN" ? /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, "Don't have an account? ", /* @__PURE__ */ import_react6.default.createElement("button", { type: "button", onClick: () => {
681
+ return /* @__PURE__ */ import_react7.default.createElement(import_react7.default.Fragment, null, /* @__PURE__ */ import_react7.default.createElement(
682
+ CountrySelectorDialog,
683
+ {
684
+ isOpen: isCountryDialogOpen,
685
+ onClose: () => setIsCountryDialogOpen(false),
686
+ onSelect: setSelectedCountry
687
+ }
688
+ ), /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full max-w-md mx-auto flex flex-col items-center gap-4 relative z-10 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full bg-white rounded-2xl overflow-hidden" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "p-8 md:p-12" }, step === "INPUT" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "mb-12 text-center mt-2" }, /* @__PURE__ */ import_react7.default.createElement("h2", { className: "text-xl text-black mb-2 tracking-tight" }, mode === "LOGIN" ? `${companyName} ${workspaceLabel}` : "Create Account"), /* @__PURE__ */ import_react7.default.createElement("div", { className: "text-[13px] text-neutral-500" }, mode === "LOGIN" ? /* @__PURE__ */ import_react7.default.createElement(import_react7.default.Fragment, null, "Don't have an account? ", /* @__PURE__ */ import_react7.default.createElement("button", { type: "button", onClick: () => {
542
689
  setMode("SIGNUP");
543
690
  setSignupStep(getInitialSignupStep());
544
- }, className: "text-black transition-colors ml-1" }, "Sign up")) : /* @__PURE__ */ import_react6.default.createElement(import_react6.default.Fragment, null, "Already have an account? ", /* @__PURE__ */ import_react6.default.createElement("button", { type: "button", onClick: () => setMode("LOGIN"), className: "text-black transition-colors ml-1" }, "Log in")))), /* @__PURE__ */ import_react6.default.createElement("form", { className: "space-y-6", autoComplete: "off", onSubmit: (e) => {
691
+ }, className: "text-black transition-colors ml-1" }, "Sign up")) : /* @__PURE__ */ import_react7.default.createElement(import_react7.default.Fragment, null, "Already have an account? ", /* @__PURE__ */ import_react7.default.createElement("button", { type: "button", onClick: () => setMode("LOGIN"), className: "text-black transition-colors ml-1" }, "Log in")))), /* @__PURE__ */ import_react7.default.createElement("form", { className: "space-y-6", autoComplete: "off", onSubmit: (e) => {
545
692
  e.preventDefault();
546
693
  if (mode === "SIGNUP" && signupStep === "INVITATION") handleNextSignupStep();
547
694
  else if (mode === "SIGNUP" && signupStep === "NAME") handleNextSignupStep();
548
695
  else if (mode === "SIGNUP" && signupStep === "ORGANIZATION") handleNextSignupStep();
549
696
  else handleAuthRequestSubmit();
550
- } }, mode === "SIGNUP" && signupStep === "INVITATION" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Referral Code"), /* @__PURE__ */ import_react6.default.createElement(
697
+ } }, mode === "SIGNUP" && signupStep === "INVITATION" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react7.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Referral Code"), /* @__PURE__ */ import_react7.default.createElement(
551
698
  "input",
552
699
  {
553
700
  type: "text",
@@ -557,10 +704,20 @@ function AuthFormInner({
557
704
  className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300 tracking-widest",
558
705
  placeholder: "Referral Code (Optional)"
559
706
  }
560
- ))), mode === "SIGNUP" && signupStep === "NAME" && requireNames && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "First Name"), /* @__PURE__ */ import_react6.default.createElement("input", { type: "text", value: firstName, onChange: (e) => setFirstName(cleanAlpha(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "First name" })), /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Last Name"), /* @__PURE__ */ import_react6.default.createElement("input", { type: "text", value: lastName, onChange: (e) => setLastName(cleanAlpha(e.target.value)), required: true, 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", placeholder: "Last name" }))), mode === "SIGNUP" && signupStep === "ORGANIZATION" && requireOrganization && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Organization Name"), /* @__PURE__ */ import_react6.default.createElement("input", { type: "text", value: orgName, onChange: (e) => setOrgName(cleanOrgName(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "Acme Corporation" }))), (mode === "LOGIN" || mode === "SIGNUP" && signupStep === "EMAIL_ID") && /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-6" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react6.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Email ID"), /* @__PURE__ */ import_react6.default.createElement("input", { type: "email", value: emailId, onChange: (e) => setEmailId(cleanEmailId(e.target.value)), required: true, autoFocus: true, 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", placeholder: "name@company.com" })), mode === "SIGNUP" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex items-start gap-3 mt-4" }, /* @__PURE__ */ import_react6.default.createElement("input", { type: "checkbox", id: "zairus-terms", checked: agreedToTerms, onChange: (e) => setAgreedToTerms(e.target.checked), className: "mt-0.5 w-4 h-4 bg-white border-neutral-300 rounded text-black focus:ring-black cursor-pointer", required: true }), /* @__PURE__ */ import_react6.default.createElement("label", { htmlFor: "zairus-terms", className: "text-[11px] text-neutral-500 cursor-pointer leading-snug" }, "I agree to ", companyName, "'s ", /* @__PURE__ */ import_react6.default.createElement("a", { href: termsUrl, target: "_blank", rel: "noreferrer", className: "text-black underline " }, "Terms of Service"), " and ", /* @__PURE__ */ import_react6.default.createElement("a", { href: privacyUrl, target: "_blank", rel: "noreferrer", className: "text-black underline " }, "Privacy Policy"), "."))), /* @__PURE__ */ import_react6.default.createElement(ThreeDActionButton, { type: "submit", disabled: isContinueDisabled(), isLoading: isSubmitting, className: "w-full mt-10" }, "Continue"))), step === "OTP" && /* @__PURE__ */ import_react6.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "text-center mb-10 mt-2" }, /* @__PURE__ */ import_react6.default.createElement("h2", { className: "text-xl text-black mb-2 tracking-tight" }, "Security Check"), /* @__PURE__ */ import_react6.default.createElement("p", { className: "text-[13px] text-neutral-500" }, userHas2FA ? "Enter the code from your authenticator app." : `Enter the code sent to ${emailId}`)), /* @__PURE__ */ import_react6.default.createElement("form", { className: "space-y-8", autoComplete: "off", onSubmit: (e) => {
707
+ ))), mode === "SIGNUP" && signupStep === "NAME" && requireNames && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react7.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "First Name"), /* @__PURE__ */ import_react7.default.createElement("input", { type: "text", value: firstName, onChange: (e) => setFirstName(cleanAlpha(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "First name" })), /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ import_react7.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Last Name"), /* @__PURE__ */ import_react7.default.createElement("input", { type: "text", value: lastName, onChange: (e) => setLastName(cleanAlpha(e.target.value)), required: true, 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", placeholder: "Last name" }))), mode === "SIGNUP" && signupStep === "ORGANIZATION" && requireOrganization && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-1.5 relative" }, /* @__PURE__ */ import_react7.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, "Organization Name"), /* @__PURE__ */ import_react7.default.createElement("input", { type: "text", value: orgName, onChange: (e) => setOrgName(cleanOrgName(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "Acme Corporation" }))), (mode === "LOGIN" || mode === "SIGNUP" && signupStep === "PHONE_ID") && /* @__PURE__ */ import_react7.default.createElement("div", { className: "space-y-6 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react7.default.createElement(
708
+ PhoneInput,
709
+ {
710
+ label: "Phone Number",
711
+ value: phoneNumber,
712
+ onChange: setPhoneNumber,
713
+ selectedCountry,
714
+ onCountryClick: () => setIsCountryDialogOpen(true),
715
+ disabled: isSubmitting
716
+ }
717
+ ), mode === "SIGNUP" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex items-start gap-3 mt-4" }, /* @__PURE__ */ import_react7.default.createElement("input", { type: "checkbox", id: "zairus-terms", checked: agreedToTerms, onChange: (e) => setAgreedToTerms(e.target.checked), className: "mt-0.5 w-4 h-4 bg-white border-neutral-300 rounded text-black focus:ring-black cursor-pointer", required: true }), /* @__PURE__ */ import_react7.default.createElement("label", { htmlFor: "zairus-terms", className: "text-[11px] text-neutral-500 cursor-pointer leading-snug" }, "I agree to ", companyName, "'s ", /* @__PURE__ */ import_react7.default.createElement("a", { href: termsUrl, target: "_blank", rel: "noreferrer", className: "text-black underline " }, "Terms of Service"), " and ", /* @__PURE__ */ import_react7.default.createElement("a", { href: privacyUrl, target: "_blank", rel: "noreferrer", className: "text-black underline " }, "Privacy Policy"), "."))), /* @__PURE__ */ import_react7.default.createElement(ThreeDActionButton, { type: "submit", disabled: isContinueDisabled(), isLoading: isSubmitting, className: "w-full mt-10" }, "Continue"))), step === "OTP" && /* @__PURE__ */ import_react7.default.createElement("div", { className: "animate-in fade-in duration-300" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "text-center mb-10 mt-2" }, /* @__PURE__ */ import_react7.default.createElement("h2", { className: "text-xl text-black mb-2 tracking-tight" }, "Security Check"), /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-[13px] text-neutral-500" }, "Enter your 6-digit security passcode or OTP.")), /* @__PURE__ */ import_react7.default.createElement("form", { className: "space-y-8", autoComplete: "off", onSubmit: (e) => {
561
718
  e.preventDefault();
562
719
  verifyOtpCode(otp.join(""));
563
- } }, /* @__PURE__ */ import_react6.default.createElement("div", { className: "flex justify-between gap-2", onPaste: handlePaste }, otp.map((digit, index) => /* @__PURE__ */ import_react6.default.createElement(
720
+ } }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex justify-between gap-2", onPaste: handlePaste }, otp.map((digit, index) => /* @__PURE__ */ import_react7.default.createElement(
564
721
  "input",
565
722
  {
566
723
  key: index,
@@ -577,27 +734,27 @@ function AuthFormInner({
577
734
  },
578
735
  className: "w-10 h-12 text-center text-lg bg-transparent border-b-2 border-neutral-200 text-black outline-none focus:border-black transition-all duration-300"
579
736
  }
580
- ))), /* @__PURE__ */ import_react6.default.createElement(ThreeDActionButton, { type: "submit", disabled: otp.join("").length < 6, isLoading: isSubmitting, className: "w-full" }, "Verify Code")), userHasPasskey && /* @__PURE__ */ import_react6.default.createElement("div", { className: "pt-6 " }, /* @__PURE__ */ import_react6.default.createElement(
737
+ ))), /* @__PURE__ */ import_react7.default.createElement(ThreeDActionButton, { type: "submit", disabled: otp.join("").length < 6, isLoading: isSubmitting, className: "w-full" }, "Verify Code")), userHasPasskey && /* @__PURE__ */ import_react7.default.createElement("div", { className: "pt-6" }, /* @__PURE__ */ import_react7.default.createElement(
581
738
  "button",
582
739
  {
583
740
  onClick: triggerPasskeyLogin,
584
741
  disabled: isSubmitting,
585
- className: "w-full py-2.5 rounded-full text-black border border-neutral-200 hover:bg-neutral-50 text-xs tracking-wide transition-colors outline-none disabled:opacity-50"
742
+ className: "w-full py-2.5 rounded-full text-black border border-neutral-200 hover:bg-neutral-50 text-xs tracking-wide transition-colors outline-none disabled:opacity-50"
586
743
  },
587
744
  "Use Passkey / Biometrics"
588
- ))))));
745
+ )))))));
589
746
  }
590
747
  var PipleAuth = (props) => {
591
748
  if (props.useRecaptcha && props.recaptchaSiteKey) {
592
- return /* @__PURE__ */ import_react6.default.createElement(import_react_google_recaptcha_v3.GoogleReCaptchaProvider, { reCaptchaKey: props.recaptchaSiteKey }, /* @__PURE__ */ import_react6.default.createElement(import_react6.Suspense, { fallback: /* @__PURE__ */ import_react6.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react6.default.createElement(InputSpinner, null)) }, /* @__PURE__ */ import_react6.default.createElement(AuthFormInner, { ...props })));
749
+ return /* @__PURE__ */ import_react7.default.createElement(import_react_google_recaptcha_v3.GoogleReCaptchaProvider, { reCaptchaKey: props.recaptchaSiteKey }, /* @__PURE__ */ import_react7.default.createElement(import_react7.Suspense, { fallback: /* @__PURE__ */ import_react7.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react7.default.createElement(InputSpinner2, null)) }, /* @__PURE__ */ import_react7.default.createElement(AuthFormInner, { ...props })));
593
750
  }
594
- return /* @__PURE__ */ import_react6.default.createElement(import_react6.Suspense, { fallback: /* @__PURE__ */ import_react6.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react6.default.createElement(InputSpinner, null)) }, /* @__PURE__ */ import_react6.default.createElement(AuthFormInner, { ...props }));
751
+ return /* @__PURE__ */ import_react7.default.createElement(import_react7.Suspense, { fallback: /* @__PURE__ */ import_react7.default.createElement("div", { className: "h-64 flex items-center justify-center" }, /* @__PURE__ */ import_react7.default.createElement(InputSpinner2, null)) }, /* @__PURE__ */ import_react7.default.createElement(AuthFormInner, { ...props }));
595
752
  };
596
753
 
597
754
  // src/components/Footer.tsx
598
- var import_react7 = __toESM(require("react"));
755
+ var import_react8 = __toESM(require("react"));
599
756
  var import_link3 = __toESM(require("next/link"));
600
- var import_react8 = require("@hugeicons/react");
757
+ var import_react9 = require("@hugeicons/react");
601
758
  var Footer = ({
602
759
  description,
603
760
  columns,
@@ -605,20 +762,20 @@ var Footer = ({
605
762
  copyrightText,
606
763
  topSection
607
764
  }) => {
608
- const [openCol, setOpenCol] = (0, import_react7.useState)(null);
765
+ const [openCol, setOpenCol] = (0, import_react8.useState)(null);
609
766
  const toggleColumn = (idx) => {
610
767
  setOpenCol(openCol === idx ? null : idx);
611
768
  };
612
- return /* @__PURE__ */ import_react7.default.createElement("div", { className: "" }, topSection && topSection, /* @__PURE__ */ import_react7.default.createElement("footer", { className: "relative px-6 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "relative w-full max-w-7xl mx-auto z-20 flex flex-col" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "relative py-12 md:py-16" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start gap-12 lg:gap-16 mb-12 text-left" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full lg:max-w-sm flex flex-col items-start justify-between shrink-0" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex items-center gap-4 mb-4" }, /* @__PURE__ */ import_react7.default.createElement("img", { src: "https://retinalabs.company/assets/images/ndpr.avif", alt: "NDPR", className: "w-28 h-auto object-contain filter grayscale opacity-80" }), /* @__PURE__ */ import_react7.default.createElement("img", { src: "https://retinalabs.company/assets/images/gdpr.avif", alt: "GDPR", className: "w-12 h-12 object-contain filter grayscale opacity-80" })), /* @__PURE__ */ import_react7.default.createElement("div", null, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-[11px] text-neutral-600 leading-relaxed pr-4" }, description))), /* @__PURE__ */ import_react7.default.createElement("div", { className: "w-full lg:flex-1 lg:max-w-2xl" }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "hidden md:grid grid-cols-2 gap-x-16 lg:gap-x-24 gap-y-12" }, columns.map((col, idx) => /* @__PURE__ */ import_react7.default.createElement("div", { key: idx, className: "flex flex-col" }, /* @__PURE__ */ import_react7.default.createElement("h4", { className: "text-[11px] tracking-[0.2em] text-black mb-6 " }, col.title), /* @__PURE__ */ import_react7.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react7.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react7.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors block truncate" }, link.label) : /* @__PURE__ */ import_react7.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors block truncate" }, link.label))))))), /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex flex-col md:hidden w-full border-t border-neutral-200 mt-4" }, columns.map((col, idx) => {
769
+ return /* @__PURE__ */ import_react8.default.createElement("div", { className: "" }, topSection && topSection, /* @__PURE__ */ import_react8.default.createElement("footer", { className: "relative px-6 overflow-hidden flex flex-col" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "relative w-full max-w-7xl mx-auto z-20 flex flex-col" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "relative py-12 md:py-16" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col lg:flex-row justify-between items-start gap-12 lg:gap-16 mb-12 text-left" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "w-full lg:max-w-sm flex flex-col items-start justify-between shrink-0" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-4 mb-4" }, /* @__PURE__ */ import_react8.default.createElement("img", { src: "https://retinalabs.company/assets/images/ndpr.avif", alt: "NDPR", className: "w-28 h-auto object-contain filter grayscale opacity-80" }), /* @__PURE__ */ import_react8.default.createElement("img", { src: "https://retinalabs.company/assets/images/gdpr.avif", alt: "GDPR", className: "w-12 h-12 object-contain filter grayscale opacity-80" })), /* @__PURE__ */ import_react8.default.createElement("div", null, /* @__PURE__ */ import_react8.default.createElement("p", { className: "text-[11px] text-neutral-600 leading-relaxed pr-4" }, description))), /* @__PURE__ */ import_react8.default.createElement("div", { className: "w-full lg:flex-1 lg:max-w-2xl" }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "hidden md:grid grid-cols-2 gap-x-16 lg:gap-x-24 gap-y-12" }, columns.map((col, idx) => /* @__PURE__ */ import_react8.default.createElement("div", { key: idx, className: "flex flex-col" }, /* @__PURE__ */ import_react8.default.createElement("h4", { className: "text-[11px] tracking-[0.2em] text-black mb-6 " }, col.title), /* @__PURE__ */ import_react8.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react8.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react8.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors block truncate" }, link.label) : /* @__PURE__ */ import_react8.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors block truncate" }, link.label))))))), /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex flex-col md:hidden w-full border-t border-neutral-200 mt-4" }, columns.map((col, idx) => {
613
770
  const isOpen = openCol === idx;
614
- return /* @__PURE__ */ import_react7.default.createElement("div", { key: idx, className: "border-b border-neutral-200" }, /* @__PURE__ */ import_react7.default.createElement(
771
+ return /* @__PURE__ */ import_react8.default.createElement("div", { key: idx, className: "border-b border-neutral-200" }, /* @__PURE__ */ import_react8.default.createElement(
615
772
  "button",
616
773
  {
617
774
  onClick: () => toggleColumn(idx),
618
775
  className: "w-full flex items-center justify-between py-5 text-left outline-none"
619
776
  },
620
- /* @__PURE__ */ import_react7.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-black " }, col.title),
621
- /* @__PURE__ */ import_react7.default.createElement(
777
+ /* @__PURE__ */ import_react8.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-black " }, col.title),
778
+ /* @__PURE__ */ import_react8.default.createElement(
622
779
  "svg",
623
780
  {
624
781
  className: `w-4 h-4 text-neutral-400 transition-transform duration-300 ${isOpen ? "rotate-180" : ""}`,
@@ -626,10 +783,10 @@ var Footer = ({
626
783
  viewBox: "0 0 24 24",
627
784
  stroke: "currentColor"
628
785
  },
629
- /* @__PURE__ */ import_react7.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M19 9l-7 7-7-7" })
786
+ /* @__PURE__ */ import_react8.default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M19 9l-7 7-7-7" })
630
787
  )
631
- ), /* @__PURE__ */ import_react7.default.createElement("div", { className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] pb-6 opacity-100" : "grid-rows-[0fr] opacity-0"}` }, /* @__PURE__ */ import_react7.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react7.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500 pt-2" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react7.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react7.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors" }, link.label) : /* @__PURE__ */ import_react7.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors" }, link.label)))))));
632
- })))), /* @__PURE__ */ import_react7.default.createElement("div", { className: "pt-8 mt-4 flex flex-col-reverse md:flex-row justify-between items-start md:items-center gap-6 relative z-20" }, /* @__PURE__ */ import_react7.default.createElement("p", { className: "text-[11px] text-neutral-400 tracking-widest text-left" }, copyrightText), socialLinks && socialLinks.length > 0 && /* @__PURE__ */ import_react7.default.createElement("div", { className: "flex items-center gap-6" }, socialLinks.map((social, idx) => /* @__PURE__ */ import_react7.default.createElement(
788
+ ), /* @__PURE__ */ import_react8.default.createElement("div", { className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] pb-6 opacity-100" : "grid-rows-[0fr] opacity-0"}` }, /* @__PURE__ */ import_react8.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react8.default.createElement("ul", { className: "space-y-4 text-[13px] text-neutral-500 pt-2" }, col.links.map((link, lIdx) => /* @__PURE__ */ import_react8.default.createElement("li", { key: lIdx }, link.isExternal ? /* @__PURE__ */ import_react8.default.createElement("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "hover:text-black transition-colors" }, link.label) : /* @__PURE__ */ import_react8.default.createElement(import_link3.default, { href: link.href, className: "hover:text-black transition-colors" }, link.label)))))));
789
+ })))), /* @__PURE__ */ import_react8.default.createElement("div", { className: "pt-8 mt-4 flex flex-col-reverse md:flex-row justify-between items-start md:items-center gap-6 relative z-20" }, /* @__PURE__ */ import_react8.default.createElement("p", { className: "text-[11px] text-neutral-400 tracking-widest text-left" }, copyrightText), socialLinks && socialLinks.length > 0 && /* @__PURE__ */ import_react8.default.createElement("div", { className: "flex items-center gap-6" }, socialLinks.map((social, idx) => /* @__PURE__ */ import_react8.default.createElement(
633
790
  "a",
634
791
  {
635
792
  key: idx,
@@ -638,38 +795,38 @@ var Footer = ({
638
795
  rel: "noopener noreferrer",
639
796
  className: "text-neutral-400 hover:text-black transition-colors"
640
797
  },
641
- /* @__PURE__ */ import_react7.default.createElement(import_react8.HugeiconsIcon, { icon: social.icon, size: 20 })
798
+ /* @__PURE__ */ import_react8.default.createElement(import_react9.HugeiconsIcon, { icon: social.icon, size: 20 })
642
799
  ))))))));
643
800
  };
644
801
 
645
802
  // src/components/MobileNav.tsx
646
- var import_react9 = __toESM(require("react"));
803
+ var import_react10 = __toESM(require("react"));
647
804
  var import_link4 = __toESM(require("next/link"));
648
805
  var import_navigation3 = require("next/navigation");
649
- var import_react10 = require("@hugeicons/react");
806
+ var import_react11 = require("@hugeicons/react");
650
807
  var MobileNav = ({ items }) => {
651
808
  const pathname = (0, import_navigation3.usePathname)();
652
809
  if (!items || items.length === 0) return null;
653
810
  const pathMatches = items.some((item) => {
654
811
  return item.href === "/" || item.href === "/app" ? pathname === "/" || pathname === "/app" : pathname === item.href || pathname?.startsWith(`${item.href}/`);
655
812
  });
656
- return /* @__PURE__ */ import_react9.default.createElement("div", { className: "fixed bottom-6 inset-x-0 z-100 flex justify-center pointer-events-none px-3 animate-in slide-in-from-bottom-8 fade-in duration-500 md:hidden" }, /* @__PURE__ */ import_react9.default.createElement("nav", { className: "pointer-events-auto w-full max-w-sm bg-white/50 backdrop-blur-xl shadow-[0_8px_30px_rgb(0,0,0,0.08)] rounded-full px-6 py-2.5 flex items-center justify-between" }, items.map((item, index) => {
813
+ return /* @__PURE__ */ import_react10.default.createElement("div", { className: "fixed bottom-6 inset-x-0 z-100 flex justify-center pointer-events-none px-3 animate-in slide-in-from-bottom-8 fade-in duration-500 md:hidden" }, /* @__PURE__ */ import_react10.default.createElement("nav", { className: "pointer-events-auto w-full max-w-sm bg-white/50 backdrop-blur-xl shadow-[0_8px_30px_rgb(0,0,0,0.08)] rounded-full px-6 py-2.5 flex items-center justify-between" }, items.map((item, index) => {
657
814
  const isActive = !pathMatches && index === 0 ? true : item.href === "/" || item.href === "/app" ? pathname === "/" || pathname === "/app" : pathname === item.href || pathname?.startsWith(`${item.href}/`);
658
- return /* @__PURE__ */ import_react9.default.createElement(
815
+ return /* @__PURE__ */ import_react10.default.createElement(
659
816
  import_link4.default,
660
817
  {
661
818
  key: item.label,
662
819
  href: item.href,
663
820
  className: "flex flex-col items-center justify-center gap-1 min-w-14 transition-transform active:scale-95 outline-none"
664
821
  },
665
- /* @__PURE__ */ import_react9.default.createElement("div", { className: `transition-colors duration-300 ${isActive ? "text-black" : "text-neutral-400 hover:text-neutral-600"}` }, /* @__PURE__ */ import_react9.default.createElement(
666
- import_react10.HugeiconsIcon,
822
+ /* @__PURE__ */ import_react10.default.createElement("div", { className: `transition-colors duration-300 ${isActive ? "text-black" : "text-neutral-400 hover:text-neutral-600"}` }, /* @__PURE__ */ import_react10.default.createElement(
823
+ import_react11.HugeiconsIcon,
667
824
  {
668
825
  icon: item.icon,
669
826
  size: 20
670
827
  }
671
828
  )),
672
- /* @__PURE__ */ import_react9.default.createElement(
829
+ /* @__PURE__ */ import_react10.default.createElement(
673
830
  "span",
674
831
  {
675
832
  className: `text-[9px] tracking-wide transition-colors duration-300 ${isActive ? "text-black" : "text-neutral-400"}`
@@ -685,10 +842,10 @@ var import_react15 = __toESM(require("react"));
685
842
  var import_react_hot_toast3 = __toESM(require("react-hot-toast"));
686
843
 
687
844
  // src/components/ManagedToaster.tsx
688
- var import_react11 = __toESM(require("react"));
845
+ var import_react12 = __toESM(require("react"));
689
846
  var import_react_hot_toast2 = require("react-hot-toast");
690
847
  var ManagedToaster = () => {
691
- return /* @__PURE__ */ import_react11.default.createElement(
848
+ return /* @__PURE__ */ import_react12.default.createElement(
692
849
  import_react_hot_toast2.Toaster,
693
850
  {
694
851
  position: "top-right",
@@ -719,56 +876,6 @@ var ManagedToaster = () => {
719
876
  );
720
877
  };
721
878
 
722
- // src/components/TextInput.tsx
723
- var import_react12 = __toESM(require("react"));
724
- var TextInput = ({
725
- label,
726
- value,
727
- onChange,
728
- placeholder,
729
- maxLength,
730
- disabled,
731
- readOnly,
732
- type = "text",
733
- onClick
734
- }) => /* @__PURE__ */ import_react12.default.createElement("div", { className: "space-y-2 flex-1 w-full", onClick }, label && /* @__PURE__ */ import_react12.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ import_react12.default.createElement(
735
- "input",
736
- {
737
- type,
738
- value,
739
- onChange: (e) => onChange(e.target.value.substring(0, maxLength || 100)),
740
- placeholder,
741
- disabled,
742
- readOnly,
743
- autoComplete: "off",
744
- spellCheck: "false",
745
- className: `w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black transition-all outline-none focus:border-black disabled:opacity-50 ${readOnly ? "cursor-pointer" : ""}`
746
- }
747
- ));
748
- var NumberInput = ({
749
- label,
750
- value,
751
- onChange,
752
- placeholder,
753
- maxLength,
754
- disabled
755
- }) => /* @__PURE__ */ import_react12.default.createElement("div", { className: "space-y-2 flex-1 w-full" }, label && /* @__PURE__ */ import_react12.default.createElement("label", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block " }, label), /* @__PURE__ */ import_react12.default.createElement(
756
- "input",
757
- {
758
- type: "text",
759
- value,
760
- onChange: (e) => {
761
- const numOnly = e.target.value.replace(/[^0-9]/g, "");
762
- onChange(numOnly.substring(0, maxLength || 20));
763
- },
764
- placeholder,
765
- disabled,
766
- autoComplete: "off",
767
- spellCheck: "false",
768
- className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-200 text-black transition-all outline-none focus:border-black disabled:opacity-50"
769
- }
770
- ));
771
-
772
879
  // src/components/Banner.tsx
773
880
  var import_react13 = __toESM(require("react"));
774
881
  var import_react14 = require("@hugeicons/react");
@@ -828,7 +935,7 @@ var Banner = ({
828
935
  // src/components/UniversalOrganizationPage.tsx
829
936
  var import_react16 = require("@hugeicons/react");
830
937
  var import_core_free_icons3 = require("@hugeicons/core-free-icons");
831
- var InputSpinner2 = () => /* @__PURE__ */ import_react15.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react15.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react15.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" }));
938
+ var InputSpinner3 = () => /* @__PURE__ */ import_react15.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react15.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react15.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" }));
832
939
  var UniversalOrganizationPage = ({
833
940
  initialOrgName,
834
941
  initialSlug,
@@ -960,7 +1067,7 @@ var UniversalOrganizationPage = ({
960
1067
  className: "w-full px-2 py-3 text-sm bg-transparent text-black outline-none disabled:opacity-50 disabled:cursor-not-allowed",
961
1068
  placeholder: "sovereign-user-handle"
962
1069
  }
963
- ), /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-neutral-400 text-sm py-3 pr-8 shrink-0 whitespace-nowrap" }, slugPrefixUrl), /* @__PURE__ */ import_react15.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react15.default.createElement(InputSpinner2, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react15.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-100" }, /* @__PURE__ */ import_react15.default.createElement("svg", { className: "w-2 h-2 text-red-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react15.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 && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react15.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react15.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react15.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_react15.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react15.default.createElement(
1070
+ ), /* @__PURE__ */ import_react15.default.createElement("span", { className: "text-neutral-400 text-sm py-3 pr-8 shrink-0 whitespace-nowrap" }, slugPrefixUrl), /* @__PURE__ */ import_react15.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react15.default.createElement(InputSpinner3, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react15.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-100" }, /* @__PURE__ */ import_react15.default.createElement("svg", { className: "w-2 h-2 text-red-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react15.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 && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react15.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react15.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react15.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_react15.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react15.default.createElement(
964
1071
  ThreeDActionButton,
965
1072
  {
966
1073
  type: "submit",