@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.d.mts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +222 -115
- package/dist/index.mjs +332 -225
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -370,12 +370,143 @@ var Header = ({
|
|
|
370
370
|
};
|
|
371
371
|
|
|
372
372
|
// src/components/PipleAuth.tsx
|
|
373
|
-
var
|
|
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
|
-
|
|
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,
|
|
395
|
-
const [step, setStep] = (0,
|
|
396
|
-
const getInitialSignupStep = () =>
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
const [
|
|
400
|
-
const [
|
|
401
|
-
const [
|
|
402
|
-
const [
|
|
403
|
-
const [
|
|
404
|
-
const [firstName, setFirstName] = (0,
|
|
405
|
-
const [lastName, setLastName] = (0,
|
|
406
|
-
const [orgName, setOrgName] = (0,
|
|
407
|
-
const [agreedToTerms, setAgreedToTerms] = (0,
|
|
408
|
-
const [
|
|
409
|
-
const [
|
|
410
|
-
const [
|
|
411
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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({
|
|
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({
|
|
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("
|
|
662
|
+
else setSignupStep("PHONE_ID");
|
|
523
663
|
} else if (signupStep === "NAME") {
|
|
524
664
|
if (requireOrganization) setSignupStep("ORGANIZATION");
|
|
525
|
-
else setSignupStep("
|
|
665
|
+
else setSignupStep("PHONE_ID");
|
|
526
666
|
} else if (signupStep === "ORGANIZATION") {
|
|
527
|
-
setSignupStep("
|
|
667
|
+
setSignupStep("PHONE_ID");
|
|
528
668
|
}
|
|
529
669
|
};
|
|
530
670
|
const isContinueDisabled = () => {
|
|
531
671
|
if (isSubmitting) return true;
|
|
532
|
-
if (mode === "LOGIN") return
|
|
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 === "
|
|
677
|
+
if (signupStep === "PHONE_ID") return phoneNumber.length < 5 || !agreedToTerms;
|
|
538
678
|
}
|
|
539
679
|
return false;
|
|
540
680
|
};
|
|
541
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
755
|
+
var import_react8 = __toESM(require("react"));
|
|
599
756
|
var import_link3 = __toESM(require("next/link"));
|
|
600
|
-
var
|
|
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,
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
621
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
632
|
-
})))), /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
666
|
-
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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(
|
|
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",
|