fix: minor tw4 fixes and lint tw format

This commit is contained in:
Scott Wilson
2025-10-10 10:41:20 -07:00
parent bf5a291e87
commit 29b2333781
838 changed files with 3509 additions and 3511 deletions
+18 -18
View File
@@ -23,29 +23,29 @@ export const getDefaultOnPremFeatures = (): TFeatureSet => ({
identitiesUsed: 0, identitiesUsed: 0,
dynamicSecret: false, dynamicSecret: false,
secretVersioning: true, secretVersioning: true,
pitRecovery: false, pitRecovery: true,
ipAllowlisting: false, ipAllowlisting: false,
rbac: false, rbac: true,
githubOrgSync: false, githubOrgSync: false,
customRateLimits: false, customRateLimits: false,
customAlerts: false, customAlerts: false,
secretAccessInsights: false, secretAccessInsights: false,
auditLogs: false, auditLogs: true,
auditLogsRetentionDays: 0, auditLogsRetentionDays: 30,
auditLogStreams: false, auditLogStreams: false,
auditLogStreamLimit: 3, auditLogStreamLimit: 3,
samlSSO: false, samlSSO: true,
enforceGoogleSSO: false, enforceGoogleSSO: false,
hsm: false, hsm: false,
oidcSSO: false, oidcSSO: true,
scim: false, scim: true,
ldap: false, ldap: true,
groups: false, groups: true,
status: null, status: null,
trial_end: null, trial_end: null,
has_used_trial: true, has_used_trial: true,
secretApproval: false, secretApproval: true,
secretRotation: false, secretRotation: true,
caCrl: false, caCrl: false,
instanceUserManagement: false, instanceUserManagement: false,
externalKms: false, externalKms: false,
@@ -57,17 +57,17 @@ export const getDefaultOnPremFeatures = (): TFeatureSet => ({
pkiEst: false, pkiEst: false,
enforceMfa: false, enforceMfa: false,
projectTemplates: false, projectTemplates: false,
kmip: false, kmip: true,
gateway: false, gateway: true,
sshHostGroups: false, sshHostGroups: true,
secretScanning: false, secretScanning: true,
enterpriseSecretSyncs: false, enterpriseSecretSyncs: false,
enterpriseCertificateSyncs: false, enterpriseCertificateSyncs: false,
enterpriseAppConnections: false, enterpriseAppConnections: false,
fips: false, fips: false,
eventSubscriptions: false, eventSubscriptions: true,
machineIdentityAuthTemplates: false, machineIdentityAuthTemplates: true,
pam: false pam: true
}); });
export const setupLicenseRequestWithStore = ( export const setupLicenseRequestWithStore = (
@@ -17,7 +17,7 @@ export const AppConnectionOption = ({
<components.Option isSelected={isSelected} {...props}> <components.Option isSelected={isSelected} {...props}>
<div className="flex flex-row items-center justify-between"> <div className="flex flex-row items-center justify-between">
{isCreateOption ? ( {isCreateOption ? (
<div className="flex items-center gap-x-1 text-mineshaft-400"> <div className="text-mineshaft-400 flex items-center gap-x-1">
<FontAwesomeIcon icon={faPlus} size="sm" /> <FontAwesomeIcon icon={faPlus} size="sm" />
<span className="mr-auto">Create New Connection</span> <span className="mr-auto">Create New Connection</span>
</div> </div>
@@ -26,8 +26,8 @@ export const AppConnectionOption = ({
<p className="truncate">{children}</p> <p className="truncate">{children}</p>
{!props.data.projectId && ( {!props.data.projectId && (
<Tooltip content="This connection belongs to your organization."> <Tooltip content="This connection belongs to your organization.">
<div className="mr-auto ml-2"> <div className="ml-2 mr-auto">
<Badge className="flex h-5 w-min items-center gap-1 bg-mineshaft-400/50 whitespace-nowrap text-bunker-300 hover:text-bunker-300"> <Badge className="bg-mineshaft-400/50 text-bunker-300 hover:text-bunker-300 flex h-5 w-min items-center gap-1 whitespace-nowrap">
<FontAwesomeIcon icon={faBuilding} size="sm" /> <FontAwesomeIcon icon={faBuilding} size="sm" />
Organization Organization
</Badge> </Badge>
@@ -35,7 +35,7 @@ export const AppConnectionOption = ({
</Tooltip> </Tooltip>
)} )}
{isSelected && ( {isSelected && (
<FontAwesomeIcon className="ml-2 text-primary" icon={faCheckCircle} size="sm" /> <FontAwesomeIcon className="text-primary ml-2" icon={faCheckCircle} size="sm" />
)} )}
</> </>
)} )}
@@ -90,8 +90,8 @@ export default function CodeInputStep({
return ( return (
<div className="mx-auto h-full w-full pb-4 md:px-8"> <div className="mx-auto h-full w-full pb-4 md:px-8">
<p className="text-md flex justify-center text-bunker-200">{t("signup.step2-message")}</p> <p className="text-md text-bunker-200 flex justify-center">{t("signup.step2-message")}</p>
<p className="text-md my-1 flex justify-center font-medium text-bunker-200">{email} </p> <p className="text-md text-bunker-200 my-1 flex justify-center font-medium">{email} </p>
<div className="mx-auto hidden w-max min-w-[20rem] md:block"> <div className="mx-auto hidden w-max min-w-[20rem] md:block">
<ReactCodeInput <ReactCodeInput
name="" name=""
@@ -100,7 +100,7 @@ export default function CodeInputStep({
fields={6} fields={6}
onChange={setCode} onChange={setCode}
{...props} {...props}
className="mt-6 mb-2" className="mb-2 mt-6"
/> />
</div> </div>
<div className="mx-auto mt-4 block w-max md:hidden"> <div className="mx-auto mt-4 block w-max md:hidden">
@@ -111,11 +111,11 @@ export default function CodeInputStep({
fields={6} fields={6}
onChange={setCode} onChange={setCode}
{...propsPhone} {...propsPhone}
className="mt-2 mb-2" className="mb-2 mt-2"
/> />
</div> </div>
{codeError && <Error text={t("signup.step2-code-error")} />} {codeError && <Error text={t("signup.step2-code-error")} />}
<div className="mx-auto mt-2 flex w-1/4 max-w-xs min-w-[20rem] flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-[19%]"> <div className="mx-auto mt-2 flex w-1/4 min-w-[20rem] max-w-xs flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-[19%]">
<div className="text-l w-full py-1 text-lg"> <div className="text-l w-full py-1 text-lg">
<Button <Button
type="submit" type="submit"
@@ -135,9 +135,9 @@ export default function CodeInputStep({
<div className="mx-auto flex max-h-24 w-full max-w-md flex-col items-center justify-center pt-2"> <div className="mx-auto flex max-h-24 w-full max-w-md flex-col items-center justify-center pt-2">
<div className="flex flex-row items-baseline gap-1 text-sm"> <div className="flex flex-row items-baseline gap-1 text-sm">
<span className="text-bunker-400">{t("signup.step2-resend-alert")}</span> <span className="text-bunker-400">{t("signup.step2-resend-alert")}</span>
<div className="text-md mt-2 flex flex-row text-bunker-400"> <div className="text-md text-bunker-400 mt-2 flex flex-row">
<button disabled={isLoading} onClick={resendVerificationEmail} type="button"> <button disabled={isLoading} onClick={resendVerificationEmail} type="button">
<span className="cursor-pointer duration-200 hover:text-bunker-200 hover:underline hover:decoration-primary-700 hover:underline-offset-4"> <span className="hover:text-bunker-200 hover:decoration-primary-700 cursor-pointer duration-200 hover:underline hover:underline-offset-4">
{isResendingVerificationEmail {isResendingVerificationEmail
? t("signup.step2-resend-progress") ? t("signup.step2-resend-progress")
: t("signup.step2-resend-submit")} : t("signup.step2-resend-submit")}
@@ -145,7 +145,7 @@ export default function CodeInputStep({
</button> </button>
</div> </div>
</div> </div>
<p className="pb-2 text-sm text-bunker-400">{t("signup.step2-spam-alert")}</p> <p className="text-bunker-400 pb-2 text-sm">{t("signup.step2-spam-alert")}</p>
</div> </div>
</div> </div>
); );
@@ -55,7 +55,7 @@ export default function EnterEmailStep({
return ( return (
<div> <div>
<div className="mx-auto w-full md:px-6"> <div className="mx-auto w-full md:px-6">
<p className="flex justify-center bg-linear-to-b from-white to-bunker-200 bg-clip-text text-xl font-medium text-transparent"> <p className="bg-linear-to-b to-bunker-200 flex justify-center from-white bg-clip-text text-xl font-medium text-transparent">
{t("signup.step1-start")} {t("signup.step1-start")}
</p> </p>
<div className="m-auto mt-8 flex w-1/4 min-w-[20rem] flex-col items-center justify-center rounded-lg lg:w-1/6"> <div className="m-auto mt-8 flex w-1/4 min-w-[20rem] flex-col items-center justify-center rounded-lg lg:w-1/6">
@@ -68,12 +68,12 @@ export default function EnterEmailStep({
className="h-12" className="h-12"
/> />
{emailError && ( {emailError && (
<p className="mt-1.5 ml-1.5 w-full text-left text-xs text-red-600"> <p className="ml-1.5 mt-1.5 w-full text-left text-xs text-red-600">
Please enter a valid email. Please enter a valid email.
</p> </p>
)} )}
</div> </div>
<div className="mx-auto mt-2 flex w-1/4 max-w-xs min-w-[20rem] flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-1/6"> <div className="mx-auto mt-2 flex w-1/4 min-w-[20rem] max-w-xs flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-1/6">
<div className="text-l w-full py-1 text-lg"> <div className="text-l w-full py-1 text-lg">
<Button <Button
type="submit" type="submit"
@@ -92,10 +92,10 @@ export default function EnterEmailStep({
</div> </div>
</div> </div>
</div> </div>
<div className="mx-auto mt-2 mb-48 flex w-full max-w-md flex-col items-center justify-center pt-2 md:mb-16 md:pb-2"> <div className="mx-auto mb-48 mt-2 flex w-full max-w-md flex-col items-center justify-center pt-2 md:mb-16 md:pb-2">
<Link to="/login"> <Link to="/login">
<button type="button" className="w-max pb-3 duration-200 hover:opacity-90"> <button type="button" className="w-max pb-3 duration-200 hover:opacity-90">
<span className="cursor-pointer text-sm text-mineshaft-400 duration-200 hover:text-bunker-200 hover:underline hover:decoration-primary-700 hover:underline-offset-4"> <span className="text-mineshaft-400 hover:text-bunker-200 hover:decoration-primary-700 cursor-pointer text-sm duration-200 hover:underline hover:underline-offset-4">
{t("signup.already-have-account")} {t("signup.already-have-account")}
</span> </span>
</button> </button>
@@ -23,7 +23,7 @@ export default function InitialSignupStep({
return ( return (
<div className="mx-auto flex w-full flex-col items-center justify-center"> <div className="mx-auto flex w-full flex-col items-center justify-center">
<h1 className="mb-8 bg-linear-to-b from-white to-bunker-200 bg-clip-text text-center text-xl font-medium text-transparent"> <h1 className="bg-linear-to-b to-bunker-200 mb-8 from-white bg-clip-text text-center text-xl font-medium text-transparent">
{t("signup.initial-title")} {t("signup.initial-title")}
</h1> </h1>
<RegionSelect /> <RegionSelect />
@@ -90,12 +90,12 @@ export default function InitialSignupStep({
</Button> </Button>
</div> </div>
)} )}
<div className="mt-6 w-1/4 min-w-[20rem] px-8 text-center text-xs text-bunker-400 lg:w-1/6"> <div className="text-bunker-400 mt-6 w-1/4 min-w-[20rem] px-8 text-center text-xs lg:w-1/6">
{t("signup.create-policy")} {t("signup.create-policy")}
</div> </div>
<div className="mt-2 flex flex-row text-xs text-bunker-400"> <div className="text-bunker-400 mt-2 flex flex-row text-xs">
<Link to="/login"> <Link to="/login">
<span className="cursor-pointer duration-200 hover:text-bunker-200 hover:underline hover:decoration-primary-700 hover:underline-offset-4"> <span className="hover:text-bunker-200 hover:decoration-primary-700 cursor-pointer duration-200 hover:underline hover:underline-offset-4">
{t("signup.already-have-account")} {t("signup.already-have-account")}
</span> </span>
</Link> </Link>
+16 -16
View File
@@ -159,7 +159,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
<div className="mb-6 text-center text-lg font-bold text-white"> <div className="mb-6 text-center text-lg font-bold text-white">
Your organization requires mobile authentication to be configured. Your organization requires mobile authentication to be configured.
</div> </div>
<div className="mx-auto w-max pt-4 pb-4 md:mb-16 md:px-8"> <div className="mx-auto w-max pb-4 pt-4 md:mb-16 md:px-8">
<TotpRegistration <TotpRegistration
shouldCenterQr shouldCenterQr
onComplete={async () => { onComplete={async () => {
@@ -173,7 +173,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
} }
return ( return (
<div className="mx-auto w-max pt-6 pb-6 md:mb-16 md:px-8"> <div className="mx-auto w-max pb-6 pt-6 md:mb-16 md:px-8">
{!hideLogo && ( {!hideLogo && (
<Link to="/"> <Link to="/">
<div className="mb-4 flex justify-center"> <div className="mb-4 flex justify-center">
@@ -183,14 +183,14 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
)} )}
{method === MfaMethod.EMAIL && ( {method === MfaMethod.EMAIL && (
<> <>
<p className="text-l flex justify-center text-bunker-300">{t("mfa.step2-message")}</p> <p className="text-l text-bunker-300 flex justify-center">{t("mfa.step2-message")}</p>
<p className="text-l my-1 flex justify-center font-medium text-bunker-300">{email}</p> <p className="text-l text-bunker-300 my-1 flex justify-center font-medium">{email}</p>
</> </>
)} )}
{method === MfaMethod.TOTP && ( {method === MfaMethod.TOTP && (
<div className="mb-8 text-center"> <div className="mb-8 text-center">
<h2 className="mb-3 text-xl font-medium text-bunker-100">Two-Factor Authentication</h2> <h2 className="text-bunker-100 mb-3 text-xl font-medium">Two-Factor Authentication</h2>
<p className="mx-auto max-w-md text-sm leading-relaxed text-bunker-300"> <p className="text-bunker-300 mx-auto max-w-md text-sm leading-relaxed">
{showRecoveryCodeInput {showRecoveryCodeInput
? "Enter one of your backup recovery codes" ? "Enter one of your backup recovery codes"
: "Enter the verification code from your authenticator app"} : "Enter the verification code from your authenticator app"}
@@ -207,13 +207,13 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
type="text" type="text"
fields={6} fields={6}
onChange={setMfaCode} onChange={setMfaCode}
className="mt-6 mb-2" className="mb-2 mt-6"
{...codeInputProps} {...codeInputProps}
/> />
</div> </div>
)} )}
{method === MfaMethod.TOTP && ( {method === MfaMethod.TOTP && (
<div className="mt-8 mb-6 flex justify-center"> <div className="mb-6 mt-8 flex justify-center">
<ReactCodeInput <ReactCodeInput
key={showRecoveryCodeInput ? "recovery" : "totp"} key={showRecoveryCodeInput ? "recovery" : "totp"}
name="" name=""
@@ -236,13 +236,13 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
type="text" type="text"
fields={6} fields={6}
onChange={setMfaCode} onChange={setMfaCode}
className="mt-2 mb-2" className="mb-2 mt-2"
{...codeInputPropsPhone} {...codeInputPropsPhone}
/> />
</div> </div>
)} )}
{method === MfaMethod.TOTP && ( {method === MfaMethod.TOTP && (
<div className="mt-4 mb-6 flex justify-center"> <div className="mb-6 mt-4 flex justify-center">
<ReactCodeInput <ReactCodeInput
key={showRecoveryCodeInput ? "recovery-mobile" : "totp-mobile"} key={showRecoveryCodeInput ? "recovery-mobile" : "totp-mobile"}
name="" name=""
@@ -264,7 +264,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
size="md" size="md"
type="submit" type="submit"
isFullWidth isFullWidth
className="h-11 rounded-lg font-medium shadow-xs transition-all duration-200 hover:shadow-md" className="shadow-xs h-11 rounded-lg font-medium transition-all duration-200 hover:shadow-md"
colorSchema="primary" colorSchema="primary"
variant="outline_bg" variant="outline_bg"
isLoading={isLoading} isLoading={isLoading}
@@ -282,7 +282,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
setShowRecoveryCodeInput(!showRecoveryCodeInput); setShowRecoveryCodeInput(!showRecoveryCodeInput);
setMfaCode(""); setMfaCode("");
}} }}
className="text-bunker-400 transition-colors duration-200 hover:text-bunker-200 hover:underline hover:decoration-primary-700 hover:underline-offset-4" className="text-bunker-400 hover:text-bunker-200 hover:decoration-primary-700 transition-colors duration-200 hover:underline hover:underline-offset-4"
> >
{showRecoveryCodeInput ? "Use authenticator code" : "Use a recovery code"} {showRecoveryCodeInput ? "Use authenticator code" : "Use a recovery code"}
</button> </button>
@@ -311,7 +311,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
</div> </div>
} }
> >
<span className="cursor-help text-bunker-400 transition-colors duration-200 hover:text-bunker-200"> <span className="text-bunker-400 hover:text-bunker-200 cursor-help transition-colors duration-200">
Lost your recovery codes? Lost your recovery codes?
</span> </span>
</Tooltip> </Tooltip>
@@ -322,9 +322,9 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
<div className="mx-auto flex max-h-24 w-full max-w-md flex-col items-center justify-center pt-2"> <div className="mx-auto flex max-h-24 w-full max-w-md flex-col items-center justify-center pt-2">
<div className="flex flex-row items-baseline gap-1 text-sm"> <div className="flex flex-row items-baseline gap-1 text-sm">
<span className="text-bunker-400">{t("signup.step2-resend-alert")}</span> <span className="text-bunker-400">{t("signup.step2-resend-alert")}</span>
<div className="text-md mt-2 flex flex-row text-bunker-400"> <div className="text-md text-bunker-400 mt-2 flex flex-row">
<button disabled={isLoadingResend} onClick={handleResendMfaCode} type="button"> <button disabled={isLoadingResend} onClick={handleResendMfaCode} type="button">
<span className="cursor-pointer duration-200 hover:text-bunker-200 hover:underline hover:decoration-primary-700 hover:underline-offset-4"> <span className="hover:text-bunker-200 hover:decoration-primary-700 cursor-pointer duration-200 hover:underline hover:underline-offset-4">
{isLoadingResend {isLoadingResend
? t("signup.step2-resend-progress") ? t("signup.step2-resend-progress")
: t("signup.step2-resend-submit")} : t("signup.step2-resend-submit")}
@@ -332,7 +332,7 @@ export const Mfa = ({ successCallback, closeMfa, hideLogo, email, method }: Prop
</button> </button>
</div> </div>
</div> </div>
<p className="pb-2 text-sm text-bunker-400">{t("signup.step2-spam-alert")}</p> <p className="text-bunker-400 pb-2 text-sm">{t("signup.step2-spam-alert")}</p>
</div> </div>
)} )}
</div> </div>
@@ -41,26 +41,26 @@ export default function TeamInviteStep(): JSX.Element {
}; };
return ( return (
<div className="mx-auto mb-64 h-full w-max min-w-lg px-8 pb-4 md:mb-32"> <div className="min-w-lg mx-auto mb-64 h-full w-max px-8 pb-4 md:mb-32">
<p className="flex justify-center bg-linear-to-b from-white to-bunker-200 bg-clip-text text-2xl font-medium text-transparent"> <p className="bg-linear-to-b to-bunker-200 flex justify-center from-white bg-clip-text text-2xl font-medium text-transparent">
{t("signup.step5-invite-team")} {t("signup.step5-invite-team")}
</p> </p>
<p className="mt-4 mb-6 flex justify-center text-center text-bunker-400 md:mx-8"> <p className="text-bunker-400 mb-6 mt-4 flex justify-center text-center md:mx-8">
{t("signup.step5-subtitle")} {t("signup.step5-subtitle")}
</p> </p>
<div className="mx-auto mb-6 w-max rounded-xl border border-mineshaft-500 bg-mineshaft-800 px-8 pt-6 pb-4 drop-shadow-xl"> <div className="border-mineshaft-500 bg-mineshaft-800 mx-auto mb-6 w-max rounded-xl border px-8 pb-4 pt-6 drop-shadow-xl">
<div> <div>
<div className="pb-1 pl-1 text-sm font-medium text-bunker-300"> <div className="text-bunker-300 pb-1 pl-1 text-sm font-medium">
<span>Emails</span> <span>Emails</span>
</div> </div>
<textarea <textarea
className="ring-opacity-70 h-20 w-full min-w-120 rounded-md border border-mineshaft-500 bg-mineshaft-900/70 px-2 py-1 text-sm text-bunker-300 ring-primary-800 outline-hidden placeholder:text-bunker-400 focus:ring-2" className="min-w-120 border-mineshaft-500 bg-mineshaft-900/70 text-bunker-300 ring-primary-800 outline-hidden placeholder:text-bunker-400 h-20 w-full rounded-md border px-2 py-1 text-sm ring-opacity-70 focus:ring-2"
value={emails} value={emails}
onChange={(e) => setEmails(e.target.value)} onChange={(e) => setEmails(e.target.value)}
placeholder="[email protected], [email protected]..." placeholder="[email protected], [email protected]..."
/> />
</div> </div>
<div className="mx-auto mt-2 flex w-full flex-row items-end justify-end text-sm md:mt-4 md:mb-2 md:max-w-md md:min-w-120"> <div className="md:min-w-120 mx-auto mt-2 flex w-full flex-row items-end justify-end text-sm md:mb-2 md:mt-4 md:max-w-md">
<Button <Button
onClick={() => { onClick={() => {
if (serverDetails?.emailConfigured) { if (serverDetails?.emailConfigured) {
@@ -84,7 +84,7 @@ export default function TeamInviteStep(): JSX.Element {
onOpenChange={(isOpen) => handlePopUpToggle("setUpEmail", isOpen)} onOpenChange={(isOpen) => handlePopUpToggle("setUpEmail", isOpen)}
/> />
</div> </div>
<div className="mx-auto mt-4 mb-2 flex max-h-24 max-w-max min-w-[20rem] flex-row items-center justify-center px-4 text-lg md:p-2"> <div className="mx-auto mb-2 mt-4 flex max-h-24 min-w-[20rem] max-w-max flex-row items-center justify-center px-4 text-lg md:p-2">
<Button <Button
onClick={redirectToHome} onClick={redirectToHome}
size="sm" size="sm"
@@ -139,12 +139,12 @@ export default function UserInfoStep({
return ( return (
<div className="mx-auto mb-36 h-full w-max rounded-xl md:mb-16 md:px-8"> <div className="mx-auto mb-36 h-full w-max rounded-xl md:mb-16 md:px-8">
<p className="text-medium mx-8 mb-6 flex justify-center bg-linear-to-b from-white to-bunker-200 bg-clip-text text-xl font-bold text-transparent md:mx-16"> <p className="text-medium bg-linear-to-b to-bunker-200 mx-8 mb-6 flex justify-center from-white bg-clip-text text-xl font-bold text-transparent md:mx-16">
{t("signup.step3-message")} {t("signup.step3-message")}
</p> </p>
<div className="mx-auto mb-36 h-full w-max rounded-xl py-6 md:mb-16 md:border md:border-mineshaft-600 md:bg-mineshaft-800 md:px-8"> <div className="md:border-mineshaft-600 md:bg-mineshaft-800 mx-auto mb-36 h-full w-max rounded-xl py-6 md:mb-16 md:border md:px-8">
<div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6"> <div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6">
<p className="mb-1 ml-1 w-full text-left text-sm font-medium text-bunker-300"> <p className="text-bunker-300 mb-1 ml-1 w-full text-left text-sm font-medium">
Your Name Your Name
</p> </p>
<Input <Input
@@ -156,13 +156,13 @@ export default function UserInfoStep({
className="h-12" className="h-12"
/> />
{nameError && ( {nameError && (
<p className="mt-1 ml-1 w-full text-left text-xs text-red-600"> <p className="ml-1 mt-1 w-full text-left text-xs text-red-600">
Please, specify your name Please, specify your name
</p> </p>
)} )}
</div> </div>
<div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6"> <div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6">
<p className="mb-1 ml-1 w-full text-left text-sm font-medium text-bunker-300"> <p className="text-bunker-300 mb-1 ml-1 w-full text-left text-sm font-medium">
Organization Name Organization Name
</p> </p>
<Input <Input
@@ -174,13 +174,13 @@ export default function UserInfoStep({
className="h-12" className="h-12"
/> />
{organizationNameError && ( {organizationNameError && (
<p className="mt-1 ml-1 w-full text-left text-xs text-red-600"> <p className="ml-1 mt-1 w-full text-left text-xs text-red-600">
Please, specify your organization name Please, specify your organization name
</p> </p>
)} )}
</div> </div>
<div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6"> <div className="relative z-0 flex w-full min-w-[20rem] flex-col items-center justify-end rounded-lg py-2 lg:w-1/6">
<p className="mb-1 ml-1 w-full text-left text-sm font-medium text-bunker-300"> <p className="text-bunker-300 mb-1 ml-1 w-full text-left text-sm font-medium">
Where did you hear about us? <span className="font-light">(optional)</span> Where did you hear about us? <span className="font-light">(optional)</span>
</p> </p>
<Input <Input
@@ -219,7 +219,7 @@ export default function UserInfoStep({
<div> <div>
<FontAwesomeIcon <FontAwesomeIcon
icon={faXmark} icon={faXmark}
className="text-md mr-2.5 ml-0.5 text-red" className="text-md text-red ml-0.5 mr-2.5"
/> />
</div> </div>
<p className="text-sm text-gray-400">{errors[key as keyof Errors]}</p> <p className="text-sm text-gray-400">{errors[key as keyof Errors]}</p>
@@ -232,7 +232,7 @@ export default function UserInfoStep({
</div> </div>
)} )}
</div> </div>
<div className="mx-auto mt-2 flex w-1/4 max-w-xs min-w-[20rem] flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-[19%]"> <div className="mx-auto mt-2 flex w-1/4 min-w-[20rem] max-w-xs flex-col items-center justify-center text-center text-sm md:max-w-md md:text-left lg:w-[19%]">
<div className="text-l w-full py-1 text-lg"> <div className="text-l w-full py-1 text-lg">
<Button <Button
type="submit" type="submit"
+2 -2
View File
@@ -4,8 +4,8 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
const Error = ({ text }: { text: string }): JSX.Element => { const Error = ({ text }: { text: string }): JSX.Element => {
return ( return (
<div className="relative m-auto flex w-fit flex-row items-center justify-center rounded-full"> <div className="relative m-auto flex w-fit flex-row items-center justify-center rounded-full">
<FontAwesomeIcon icon={faExclamationTriangle} className="mx-2 mt-1.5 mb-2 text-red" /> <FontAwesomeIcon icon={faExclamationTriangle} className="text-red mx-2 mb-2 mt-1.5" />
{text && <p className="relative top-0 mr-2 py-1 text-sm text-red">{text}</p>} {text && <p className="text-red relative top-0 mr-2 py-1 text-sm">{text}</p>}
</div> </div>
); );
}; };
+6 -6
View File
@@ -48,7 +48,7 @@ const InputField = ({
placeholder={placeholder} placeholder={placeholder}
value={value} value={value}
required={isRequired} required={isRequired}
className="text-md w-full min-w-16 rounded-md border border-gray-600 bg-bunker-800 p-2 text-gray-400 outline-hidden" className="text-md bg-bunker-800 outline-hidden w-full min-w-16 rounded-md border border-gray-600 p-2 text-gray-400"
name={name} name={name}
readOnly readOnly
autoComplete={autoComplete} autoComplete={autoComplete}
@@ -59,7 +59,7 @@ const InputField = ({
} }
return ( return (
<div className="w-full flex-col"> <div className="w-full flex-col">
<div className="mb-0.5 flex flex-row items-center text-mineshaft-300"> <div className="text-mineshaft-300 mb-0.5 flex flex-row items-center">
<p className="mr-1 text-sm font-medium">{label}</p> <p className="mr-1 text-sm font-medium">{label}</p>
</div> </div>
<div <div
@@ -75,11 +75,11 @@ const InputField = ({
required={isRequired} required={isRequired}
className={`${ className={`${
blurred blurred
? "text-bunker-800 group-hover:text-gray-400 focus:text-gray-400 active:text-gray-400" ? "text-bunker-800 focus:text-gray-400 active:text-gray-400 group-hover:text-gray-400"
: "" : ""
} ${ } ${
error ? "focus:ring-red/50" : "focus:ring-primary/50" error ? "focus:ring-red/50" : "focus:ring-primary/50"
} text-md peer relative w-full min-w-16 rounded-md bg-mineshaft-900 p-2 text-gray-400 outline-hidden duration-200 focus:ring-4`} } text-md bg-mineshaft-900 outline-hidden peer relative w-full min-w-16 rounded-md p-2 text-gray-400 duration-200 focus:ring-4`}
name={name} name={name}
spellCheck="false" spellCheck="false"
autoComplete={autoComplete} autoComplete={autoComplete}
@@ -101,7 +101,7 @@ const InputField = ({
</button> </button>
)} )}
{blurred && ( {blurred && (
<div className="peer absolute flex h-10 w-fit max-w-xl items-center overflow-hidden rounded-md text-clip text-gray-400/50 group-hover:hidden peer-hover:hidden peer-focus:hidden peer-active:invisible"> <div className="peer absolute flex h-10 w-fit max-w-xl items-center overflow-hidden text-clip rounded-md text-gray-400/50 group-hover:hidden peer-hover:hidden peer-focus:hidden peer-active:invisible">
<p className="ml-2" /> <p className="ml-2" />
{value {value
.split("") .split("")
@@ -121,7 +121,7 @@ const InputField = ({
</div> </div>
)} */} )} */}
</div> </div>
{error && <p className="mx-0 mt-0.5 mb-2 max-w-xs text-xs text-red">{errorText}</p>} {error && <p className="text-red mx-0 mb-2 mt-0.5 max-w-xs text-xs">{errorText}</p>}
</div> </div>
); );
}; };
@@ -29,7 +29,7 @@ export const TtlFormLabel = ({ label }: { label: string }) => (
<FontAwesomeIcon <FontAwesomeIcon
icon={faQuestionCircle} icon={faQuestionCircle}
size="sm" size="sm"
className="relative right-1 mt-0.5 text-mineshaft-300" className="text-mineshaft-300 relative right-1 mt-0.5"
/> />
</Tooltip> </Tooltip>
} }
@@ -63,7 +63,7 @@ export const WishForm = () => {
open={isOpen} open={isOpen}
> >
<PopoverTrigger asChild> <PopoverTrigger asChild>
<div className="text-md mb-3 w-full pl-5 duration-200 hover:text-mineshaft-200"> <div className="text-md hover:text-mineshaft-200 mb-3 w-full pl-5 duration-200">
<FontAwesomeIcon icon={faRocketchat} className="mr-2" /> <FontAwesomeIcon icon={faRocketchat} className="mr-2" />
Request a feature Request a feature
</div> </div>
@@ -72,7 +72,7 @@ export const WishForm = () => {
hideCloseBtn hideCloseBtn
align="start" align="start"
alignOffset={20} alignOffset={20}
className="mb-1 w-auto border border-mineshaft-600 bg-mineshaft-900 p-4 drop-shadow-2xl" className="border-mineshaft-600 bg-mineshaft-900 mb-1 w-auto border p-4 drop-shadow-2xl"
sticky="always" sticky="always"
> >
<form onSubmit={handleSubmit(createWish)}> <form onSubmit={handleSubmit(createWish)}>
@@ -82,7 +82,7 @@ export const WishForm = () => {
errorText={errors?.text?.message} errorText={errors?.text?.message}
> >
<TextArea <TextArea
className="border border-mineshaft-600 bg-black/10 text-sm focus:ring-0" className="border-mineshaft-600 border bg-black/10 text-sm focus:ring-0"
variant="outline" variant="outline"
placeholder="Wish for anything! Help us improve the platform." placeholder="Wish for anything! Help us improve the platform."
reSize="none" reSize="none"
@@ -10,7 +10,7 @@ export const NoEnvironmentsBanner = ({ projectId }: IProps) => {
const navigate = useNavigate(); const navigate = useNavigate();
return ( return (
<div className="mt-4 flex w-full flex-row items-center rounded-md border border-primary-600/70 bg-primary/[.07] p-4 text-base text-white"> <div className="border-primary-600/70 bg-primary/[.07] mt-4 flex w-full flex-row items-center rounded-md border p-4 text-base text-white">
<div className="flex w-full flex-col text-sm"> <div className="flex w-full flex-col text-sm">
<span className="mb-2 text-lg font-medium">No environments in your project was found</span> <span className="mb-2 text-lg font-medium">No environments in your project was found</span>
<p> <p>
@@ -44,7 +44,7 @@ export const UpgradePlanModal = ({ text, isOpen, onOpenChange }: Props): JSX.Ele
return ( return (
<Modal isOpen={isOpen} onOpenChange={onOpenChange}> <Modal isOpen={isOpen} onOpenChange={onOpenChange}>
<ModalContent title="Unleash Infisical's Full Power"> <ModalContent title="Unleash Infisical's Full Power">
<p className="mb-2 text-bunker-300">{text}</p> <p className="text-bunker-300 mb-2">{text}</p>
<p className="text-bunker-300"> <p className="text-bunker-300">
Upgrade and get access to this, as well as to other powerful enhancements. Upgrade and get access to this, as well as to other powerful enhancements.
</p> </p>
@@ -58,15 +58,15 @@ export const RecoveryCodesDownload = ({
<Modal isOpen={isOpen} onOpenChange={hasDownloaded ? handleClose : () => {}}> <Modal isOpen={isOpen} onOpenChange={hasDownloaded ? handleClose : () => {}}>
<ModalContent title="Recovery Codes" className="max-w-md"> <ModalContent title="Recovery Codes" className="max-w-md">
<div className="space-y-4"> <div className="space-y-4">
<div className="rounded-sm border border-yellow bg-yellow/10 p-2 px-3 text-xs text-yellow"> <div className="border-yellow bg-yellow/10 text-yellow rounded-sm border p-2 px-3 text-xs">
Save these codes securely. Each can only be used once. Save these codes securely. Each can only be used once.
</div> </div>
<div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="border-mineshaft-600 bg-mineshaft-900 rounded-lg border p-4">
<div className="grid grid-cols-2 gap-x-6 gap-y-2 font-mono text-sm"> <div className="grid grid-cols-2 gap-x-6 gap-y-2 font-mono text-sm">
{recoveryCodes.map((code, index) => ( {recoveryCodes.map((code, index) => (
<div key={code} className="flex items-center text-mineshaft-200"> <div key={code} className="text-mineshaft-200 flex items-center">
<span className="w-8 text-right text-mineshaft-400">{index + 1}.</span> <span className="text-mineshaft-400 w-8 text-right">{index + 1}.</span>
<span className="pl-2">{code}</span> <span className="pl-2">{code}</span>
</div> </div>
))} ))}
@@ -96,11 +96,11 @@ export const RecoveryCodesDownload = ({
</div> </div>
{hasDownloaded ? ( {hasDownloaded ? (
<p className="text-center text-xs text-mineshaft-400"> <p className="text-mineshaft-400 text-center text-xs">
Recovery codes downloaded. You can now close this modal. Recovery codes downloaded. You can now close this modal.
</p> </p>
) : ( ) : (
<p className="text-center text-xs text-mineshaft-400"> <p className="text-mineshaft-400 text-center text-xs">
Download the recovery codes to continue. Download the recovery codes to continue.
</p> </p>
)} )}
@@ -73,7 +73,7 @@ const TotpRegistration = ({ onComplete, shouldCenterQr }: Props) => {
return ( return (
<> <>
<div className="flex max-w-lg flex-col text-bunker-200"> <div className="text-bunker-200 flex max-w-lg flex-col">
<div className="mb-8"> <div className="mb-8">
1. Download a two-step verification app (Duo, Google Authenticator, etc.) and scan the QR 1. Download a two-step verification app (Duo, Google Authenticator, etc.) and scan the QR
code. code.
@@ -66,33 +66,33 @@ export default function NavHeader({
return ( return (
<div className="flex flex-row items-center pt-6"> <div className="flex flex-row items-center pt-6">
<div className="mr-2 flex h-5 w-5 min-w-5 items-center justify-center rounded-md bg-primary text-sm text-black"> <div className="bg-primary mr-2 flex h-5 w-5 min-w-5 items-center justify-center rounded-md text-sm text-black">
{currentOrg?.name?.charAt(0)} {currentOrg?.name?.charAt(0)}
</div> </div>
<Link <Link
to="/organization/projects" to="/organization/projects"
className="truncate pl-0.5 text-sm font-medium text-primary/80 hover:text-primary" className="text-primary/80 hover:text-primary truncate pl-0.5 text-sm font-medium"
> >
{currentOrg?.name} {currentOrg?.name}
</Link> </Link>
{isProjectRelated && ( {isProjectRelated && (
<> <>
<FontAwesomeIcon icon={faAngleRight} className="mr-3 ml-3 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-3 text-xs text-gray-400" />
<div className="truncate text-sm font-medium text-bunker-300">{currentProject?.name}</div> <div className="text-bunker-300 truncate text-sm font-medium">{currentProject?.name}</div>
</> </>
)} )}
{isOrganizationRelated && ( {isOrganizationRelated && (
<> <>
<FontAwesomeIcon icon={faAngleRight} className="mr-3 ml-3 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-3 text-xs text-gray-400" />
<div className="text-sm font-medium text-bunker-300">Organization Settings</div> <div className="text-bunker-300 text-sm font-medium">Organization Settings</div>
</> </>
)} )}
<FontAwesomeIcon icon={faAngleRight} className="mr-3 ml-3 text-sm text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-3 text-sm text-gray-400" />
{pageName === "Secrets" ? ( {pageName === "Secrets" ? (
<Link <Link
to="/projects/secret-management/$projectId/overview" to="/projects/secret-management/$projectId/overview"
params={{ projectId: currentProject.id }} params={{ projectId: currentProject.id }}
className="text-sm font-medium text-primary/80 hover:text-primary" className="text-primary/80 hover:text-primary text-sm font-medium"
> >
{pageName} {pageName}
</Link> </Link>
@@ -101,15 +101,15 @@ export default function NavHeader({
)} )}
{currentEnv && secretPath === "/" && ( {currentEnv && secretPath === "/" && (
<> <>
<FontAwesomeIcon icon={faAngleRight} className="mr-1.5 ml-3 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-1.5 text-xs text-gray-400" />
<div className="rounded-md pl-3 hover:bg-bunker-100/10"> <div className="hover:bg-bunker-100/10 rounded-md pl-3">
<Tooltip content="Select environment"> <Tooltip content="Select environment">
<Select <Select
value={currentEnv} value={currentEnv}
onValueChange={(value) => { onValueChange={(value) => {
if (value && onEnvChange) onEnvChange(value); if (value && onEnvChange) onEnvChange(value);
}} }}
className="border-none bg-transparent pl-0 text-sm font-medium text-primary/80 hover:text-primary" className="text-primary/80 hover:text-primary border-none bg-transparent pl-0 text-sm font-medium"
dropdownContainerClassName="text-bunker-200 bg-mineshaft-800 border border-mineshaft-600 drop-shadow-2xl" dropdownContainerClassName="text-bunker-200 bg-mineshaft-800 border border-mineshaft-600 drop-shadow-2xl"
> >
{userAvailableEnvs?.map(({ name, slug }) => ( {userAvailableEnvs?.map(({ name, slug }) => (
@@ -124,11 +124,11 @@ export default function NavHeader({
)} )}
{isFolderMode && routerEnvSlug && Boolean(secretPathSegments.length) && ( {isFolderMode && routerEnvSlug && Boolean(secretPathSegments.length) && (
<div className="flex items-center space-x-3"> <div className="flex items-center space-x-3">
<FontAwesomeIcon icon={faAngleRight} className="mr-1.5 ml-3 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-1.5 text-xs text-gray-400" />
<Link <Link
to="/projects/secret-management/$projectId/secrets/$envSlug" to="/projects/secret-management/$projectId/secrets/$envSlug"
params={{ projectId: currentProject.id, envSlug: routerEnvSlug }} params={{ projectId: currentProject.id, envSlug: routerEnvSlug }}
className="text-sm font-medium text-primary/80 hover:text-primary" className="text-primary/80 hover:text-primary text-sm font-medium"
> >
{userAvailableEnvs?.find(({ slug }) => slug === currentEnv)?.name} {userAvailableEnvs?.find(({ slug }) => slug === currentEnv)?.name}
</Link> </Link>
@@ -143,7 +143,7 @@ export default function NavHeader({
className="flex items-center space-x-3" className="flex items-center space-x-3"
key={`breadcrumb-secret-path-${folderName}`} key={`breadcrumb-secret-path-${folderName}`}
> >
<FontAwesomeIcon icon={faAngleRight} className="mr-1.5 ml-3 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-1.5 text-xs text-gray-400" />
{index + 1 === secretPathSegments?.length ? ( {index + 1 === secretPathSegments?.length ? (
<div className="flex items-center space-x-2"> <div className="flex items-center space-x-2">
<span <span
@@ -195,7 +195,7 @@ export default function NavHeader({
}} }}
search={(query) => ({ ...query, secretPath: newSecretPath })} search={(query) => ({ ...query, secretPath: newSecretPath })}
className={twMerge( className={twMerge(
"text-sm transition-all hover:text-primary", "hover:text-primary text-sm transition-all",
isHoveringCopyButton ? "text-primary" : "text-primary/80" isHoveringCopyButton ? "text-primary" : "text-primary/80"
)} )}
> >
@@ -207,7 +207,7 @@ export default function NavHeader({
})} })}
{isProtectedBranch && ( {isProtectedBranch && (
<Tooltip content={`Protected by policy ${protectionPolicyName}`}> <Tooltip content={`Protected by policy ${protectionPolicyName}`}>
<FontAwesomeIcon icon={faLock} className="ml-2 text-primary" /> <FontAwesomeIcon icon={faLock} className="text-primary ml-2" />
</Tooltip> </Tooltip>
)} )}
</div> </div>
@@ -108,7 +108,7 @@ export const RegionSelect = () => {
</Select> </Select>
<Modal> <Modal>
<ModalTrigger asChild> <ModalTrigger asChild>
<button type="button" className="mt-1 text-right text-xs text-mineshaft-400 underline"> <button type="button" className="text-mineshaft-400 mt-1 text-right text-xs underline">
Help me pick a data region Help me pick a data region
</button> </button>
</ModalTrigger> </ModalTrigger>
@@ -122,17 +122,17 @@ export const RegionSelect = () => {
<span className="mr-2 inline-block w-4">{flag}</span> <span className="mr-2 inline-block w-4">{flag}</span>
{value.toUpperCase()} Region {value.toUpperCase()} Region
</p> </p>
<ul className="mt-2 ml-6 flex flex-col gap-1"> <ul className="ml-6 mt-2 flex flex-col gap-1">
<li> <li>
<FontAwesomeIcon size="xs" className="mr-0.5 text-green" icon={faCheck} /> Fastest <FontAwesomeIcon size="xs" className="text-green mr-0.5" icon={faCheck} /> Fastest
option if you are based in {value === Region.US ? "the" : ""} {label} option if you are based in {value === Region.US ? "the" : ""} {label}
</li> </li>
<li> <li>
<FontAwesomeIcon size="xs" className="mr-0.5 text-green" icon={faCheck} /> Data <FontAwesomeIcon size="xs" className="text-green mr-0.5" icon={faCheck} /> Data
storage compliance for this region storage compliance for this region
</li> </li>
<li> <li>
<FontAwesomeIcon size="xs" className="mr-0.5 text-green" icon={faCheck} /> Hosted <FontAwesomeIcon size="xs" className="text-green mr-0.5" icon={faCheck} /> Hosted
in {regionLocation} in {regionLocation}
</li> </li>
</ul> </ul>
@@ -57,7 +57,7 @@ export const SecretDashboardPathBreadcrumb = ({
type: "info" type: "info"
}); });
}} }}
className="opacity-0 transition duration-75 group-hover:opacity-100 hover:bg-bunker-100/10" className="hover:bg-bunker-100/10 opacity-0 transition duration-75 group-hover:opacity-100"
> >
<FontAwesomeIcon <FontAwesomeIcon
icon={!isCopying ? faCopy : faCheck} icon={!isCopying ? faCopy : faCheck}
@@ -76,7 +76,7 @@ export const SecretDashboardPathBreadcrumb = ({
}} }}
search={(query) => ({ ...query, secretPath: newSecretPath })} search={(query) => ({ ...query, secretPath: newSecretPath })}
className={twMerge( className={twMerge(
"text-sm transition-all hover:text-primary", "hover:text-primary text-sm transition-all",
isCopying && "text-primary" isCopying && "text-primary"
)} )}
> >
@@ -38,7 +38,7 @@ export const NotificationContent = ({
{copyActions.map((action) => ( {copyActions.map((action) => (
<div className="flex flex-row items-center gap-2" key={`copy-${action.name}`}> <div className="flex flex-row items-center gap-2" key={`copy-${action.name}`}>
{action.label && ( {action.label && (
<span className="ml-2 text-xs text-mineshaft-400">{action.label}</span> <span className="text-mineshaft-400 ml-2 text-xs">{action.label}</span>
)} )}
<CopyButton <CopyButton
value={action.value} value={action.value}
@@ -9,11 +9,11 @@ type Props = {
export const LastLoginSection = ({ lastLoginTime, lastLoginAuthMethod }: Props) => ( export const LastLoginSection = ({ lastLoginTime, lastLoginAuthMethod }: Props) => (
<div> <div>
<div className="mb-2 flex items-center gap-2 border-b border-mineshaft-600 pb-1"> <div className="border-mineshaft-600 mb-2 flex items-center gap-2 border-b pb-1">
<div className="font-medium">Last Login</div> <div className="font-medium">Last Login</div>
</div> </div>
<div className="mb-2 flex items-center gap-2 text-sm"> <div className="mb-2 flex items-center gap-2 text-sm">
<div className="flex items-center justify-center rounded-sm bg-mineshaft-700 p-3"> <div className="bg-mineshaft-700 flex items-center justify-center rounded-sm p-3">
<FontAwesomeIcon icon={faShield} className="h-4 w-4" /> <FontAwesomeIcon icon={faShield} className="h-4 w-4" />
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
@@ -22,7 +22,7 @@ export const LastLoginSection = ({ lastLoginTime, lastLoginAuthMethod }: Props)
</div> </div>
</div> </div>
<div className="flex items-center gap-2 text-sm"> <div className="flex items-center gap-2 text-sm">
<div className="flex items-center justify-center rounded-sm bg-mineshaft-700 p-3"> <div className="bg-mineshaft-700 flex items-center justify-center rounded-sm p-3">
<FontAwesomeIcon icon={faClock} className="h-4 w-4" /> <FontAwesomeIcon icon={faClock} className="h-4 w-4" />
</div> </div>
<div className="flex flex-col"> <div className="flex flex-col">
@@ -107,20 +107,20 @@ const AccessTreeContent = ({ permissions, subject, onClose }: AccessTreeProps) =
"mt-4 w-full", "mt-4 w-full",
viewMode === ViewMode.Modal && "fixed inset-0 z-50 p-10", viewMode === ViewMode.Modal && "fixed inset-0 z-50 p-10",
viewMode === ViewMode.Undocked && viewMode === ViewMode.Undocked &&
"fixed bottom-4 left-20 z-50 h-[40%] w-[38%] min-w-lg lg:w-[34%]" "min-w-lg fixed bottom-4 left-20 z-50 h-[40%] w-[38%] lg:w-[34%]"
)} )}
> >
<div <div
className={twMerge( className={twMerge(
"mb-4 h-full w-full rounded-lg border border-mineshaft-600 bg-mineshaft-900 transition-transform duration-500", "border-mineshaft-600 bg-mineshaft-900 mb-4 h-full w-full rounded-lg border transition-transform duration-500",
viewMode === ViewMode.Docked ? "relative p-4" : "relative p-0" viewMode === ViewMode.Docked ? "relative p-4" : "relative p-0"
)} )}
> >
{viewMode === ViewMode.Docked && ( {viewMode === ViewMode.Docked && (
<div className="mb-4 flex items-start justify-between border-b border-mineshaft-400 pb-4"> <div className="border-mineshaft-400 mb-4 flex items-start justify-between border-b pb-4">
<div> <div>
<h3 className="text-lg font-medium text-mineshaft-100">Access Tree</h3> <h3 className="text-mineshaft-100 text-lg font-medium">Access Tree</h3>
<p className="text-sm leading-3 text-mineshaft-400"> <p className="text-mineshaft-400 text-sm leading-3">
Visual access policies for the configured role. Visual access policies for the configured role.
</p> </p>
</div> </div>
@@ -129,7 +129,7 @@ const AccessTreeContent = ({ permissions, subject, onClose }: AccessTreeProps) =
variant="outline_bg" variant="outline_bg"
colorSchema="secondary" colorSchema="secondary"
type="submit" type="submit"
className="h-10 rounded-r-none bg-mineshaft-700" className="bg-mineshaft-700 h-10 rounded-r-none"
leftIcon={<FontAwesomeIcon icon={faWindowRestore} />} leftIcon={<FontAwesomeIcon icon={faWindowRestore} />}
onClick={handleToggleView} onClick={handleToggleView}
> >
@@ -139,7 +139,7 @@ const AccessTreeContent = ({ permissions, subject, onClose }: AccessTreeProps) =
variant="outline_bg" variant="outline_bg"
colorSchema="secondary" colorSchema="secondary"
type="submit" type="submit"
className="h-10 rounded-l-none bg-mineshaft-600" className="bg-mineshaft-600 h-10 rounded-l-none"
leftIcon={<FontAwesomeIcon icon={faUpRightAndDownLeftFromCenter} />} leftIcon={<FontAwesomeIcon icon={faUpRightAndDownLeftFromCenter} />}
onClick={handleToggleModalView} onClick={handleToggleModalView}
> >
@@ -156,7 +156,7 @@ const AccessTreeContent = ({ permissions, subject, onClose }: AccessTreeProps) =
> >
<div className="h-full w-full"> <div className="h-full w-full">
<ReactFlow <ReactFlow
className="rounded-md border border-mineshaft" className="border-mineshaft rounded-md border"
nodes={nodes} nodes={nodes}
edges={edges} edges={edges}
edgeTypes={EdgeTypes} edgeTypes={EdgeTypes}
@@ -191,7 +191,7 @@ const AccessTreeContent = ({ permissions, subject, onClose }: AccessTreeProps) =
<SelectItem <SelectItem
key={env.slug} key={env.slug}
value={env.slug} value={env.slug}
className="relative py-2 pr-8 pl-6 text-sm hover:bg-mineshaft-700" className="hover:bg-mineshaft-700 relative py-2 pl-6 pr-8 text-sm"
> >
<div className="ml-3 truncate font-medium">{env.name}</div> <div className="ml-3 truncate font-medium">{env.name}</div>
</SelectItem> </SelectItem>
@@ -39,12 +39,12 @@ const ErrorDisplay = ({
return ( return (
<div className="flex h-full w-full flex-col gap-2"> <div className="flex h-full w-full flex-col gap-2">
<div className="flex items-center gap-2 text-mineshaft-100"> <div className="text-mineshaft-100 flex items-center gap-2">
<FontAwesomeIcon icon={faExclamationTriangle} className="text-red" /> <FontAwesomeIcon icon={faExclamationTriangle} className="text-red" />
<p> <p>
Error displaying access tree. Please contact{" "} Error displaying access tree. Please contact{" "}
<a <a
className="inline cursor-pointer text-mineshaft-200 underline decoration-primary-500 underline-offset-4 duration-200 hover:text-mineshaft-100" className="text-mineshaft-200 decoration-primary-500 hover:text-mineshaft-100 inline cursor-pointer underline underline-offset-4 duration-200"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
href="mailto:[email protected]" href="mailto:[email protected]"
@@ -55,13 +55,13 @@ const ErrorDisplay = ({
</p> </p>
</div> </div>
<div className="relative flex flex-1 flex-col overflow-hidden"> <div className="relative flex flex-1 flex-col overflow-hidden">
<pre className="thin-scrollbar w-full flex-1 overflow-y-auto rounded-sm bg-mineshaft-700 p-2 text-xs whitespace-pre-wrap text-mineshaft-100"> <pre className="thin-scrollbar bg-mineshaft-700 text-mineshaft-100 w-full flex-1 overflow-y-auto whitespace-pre-wrap rounded-sm p-2 text-xs">
{display} {display}
</pre> </pre>
<IconButton <IconButton
variant="plain" variant="plain"
colorSchema="secondary" colorSchema="secondary"
className="absolute top-2 right-4" className="absolute right-4 top-2"
ariaLabel="Copy secret value" ariaLabel="Copy secret value"
onClick={copyToClipboard} onClick={copyToClipboard}
> >
@@ -51,7 +51,7 @@ export const PermissionSimulation = ({
onClick={handlePermissionSimulation} onClick={handlePermissionSimulation}
rightIcon={ rightIcon={
<FontAwesomeIcon <FontAwesomeIcon
className="pl-1 text-sm text-bunker-300 hover:text-primary hover:opacity-80" className="text-bunker-300 hover:text-primary pl-1 text-sm hover:opacity-80"
icon={faChevronDown} icon={faChevronDown}
/> />
} }
@@ -65,9 +65,9 @@ export const PermissionSimulation = ({
<Panel <Panel
onClick={handlePermissionSimulation} onClick={handlePermissionSimulation}
position="top-left" position="top-left"
className={`group flex flex-col gap-2 pr-4 pb-4 ${expand ? "" : "cursor-pointer"}`} className={`group flex flex-col gap-2 pb-4 pr-4 ${expand ? "" : "cursor-pointer"}`}
> >
<div className="flex w-[20rem] flex-col gap-1.5 rounded-sm border border-mineshaft-600 bg-mineshaft-800 p-2 font-inter text-gray-200"> <div className="border-mineshaft-600 bg-mineshaft-800 font-inter flex w-[20rem] flex-col gap-1.5 rounded-sm border p-2 text-gray-200">
<div> <div>
<div className="flex w-full items-center justify-between"> <div className="flex w-full items-center justify-between">
<span className="text-sm">Permission Simulation</span> <span className="text-sm">Permission Simulation</span>
@@ -83,7 +83,7 @@ export const PermissionSimulation = ({
</IconButton> </IconButton>
</div> </div>
{expand && ( {expand && (
<p className="mt-1 mb-2 text-xs text-mineshaft-400"> <p className="text-mineshaft-400 mb-2 mt-1 text-xs">
Evaluate conditional policies to see what permissions will be granted given a secret Evaluate conditional policies to see what permissions will be granted given a secret
name or tags name or tags
</p> </p>
@@ -96,7 +96,7 @@ export const PermissionSimulation = ({
<Select <Select
value={subject} value={subject}
onValueChange={(value) => setSubject(value as ProjectPermissionSub)} onValueChange={(value) => setSubject(value as ProjectPermissionSub)}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
> >
@@ -119,7 +119,7 @@ export const PermissionSimulation = ({
<Select <Select
value={environment} value={environment}
onValueChange={setEnvironment} onValueChange={setEnvironment}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-76" dropdownContainerClassName="max-w-76"
> >
@@ -32,17 +32,17 @@ export const FolderNode = ({
<> <>
<Handle <Handle
type="target" type="target"
className="pointer-events-none cursor-pointer! opacity-0" className="cursor-pointer! pointer-events-none opacity-0"
position={Position.Top} position={Position.Top}
/> />
<div <div
className={`flex ${hasMinimalAccess ? "" : "opacity-40"} h-full w-full flex-col items-center justify-center rounded-md border border-mineshaft bg-mineshaft-800 px-2 py-3 font-inter shadow-lg transition-opacity duration-500`} className={`flex ${hasMinimalAccess ? "" : "opacity-40"} border-mineshaft bg-mineshaft-800 font-inter h-full w-full flex-col items-center justify-center rounded-md border px-2 py-3 shadow-lg transition-opacity duration-500`}
> >
<div className="flex items-center space-x-2 text-xs text-mineshaft-100"> <div className="text-mineshaft-100 flex items-center space-x-2 text-xs">
<FontAwesomeIcon className="mb-0.5 font-medium text-yellow" icon={faFolder} /> <FontAwesomeIcon className="text-yellow mb-0.5 font-medium" icon={faFolder} />
<span>{parentId ? `/${name}` : "/"}</span> <span>{parentId ? `/${name}` : "/"}</span>
</div> </div>
<div className="mt-1.5 flex w-full flex-wrap items-center justify-center gap-x-2 gap-y-1 rounded-sm bg-mineshaft-600 px-2 py-1 text-xs"> <div className="bg-mineshaft-600 mt-1.5 flex w-full flex-wrap items-center justify-center gap-x-2 gap-y-1 rounded-sm px-2 py-1 text-xs">
{Object.entries(actions).map(([action, access]) => { {Object.entries(actions).map(([action, access]) => {
const { className, icon } = AccessMap[access]; const { className, icon } = AccessMap[access];
@@ -70,7 +70,7 @@ export const FolderNode = ({
</div> </div>
<Handle <Handle
type="source" type="source"
className="pointer-events-none cursor-pointer! opacity-0" className="cursor-pointer! pointer-events-none opacity-0"
position={Position.Bottom} position={Position.Bottom}
/> />
</> </>
@@ -68,7 +68,7 @@ export const AccessTreeSecretPathInput = ({
> >
{isExpanded ? ( {isExpanded ? (
<div <div
className="flex h-10 w-10 cursor-pointer items-center justify-center text-mineshaft-300 hover:text-white" className="text-mineshaft-300 flex h-10 w-10 cursor-pointer items-center justify-center hover:text-white"
onClick={toggleSearch} onClick={toggleSearch}
role="button" role="button"
tabIndex={0} tabIndex={0}
@@ -83,7 +83,7 @@ export const AccessTreeSecretPathInput = ({
) : ( ) : (
<Tooltip position="bottom" content="Search Paths"> <Tooltip position="bottom" content="Search Paths">
<div <div
className="flex h-10 w-10 cursor-pointer items-center justify-center text-mineshaft-300 hover:text-white" className="text-mineshaft-300 flex h-10 w-10 cursor-pointer items-center justify-center hover:text-white"
onClick={toggleSearch} onClick={toggleSearch}
role="button" role="button"
tabIndex={0} tabIndex={0}
@@ -26,11 +26,11 @@ type ConditionDisplayProps = {
const ConditionDisplay = ({ _key: key, value, operator }: ConditionDisplayProps) => { const ConditionDisplay = ({ _key: key, value, operator }: ConditionDisplayProps) => {
return ( return (
<li> <li>
<span className="font-medium text-mineshaft-100 capitalize">{camelCaseToSpaces(key)}</span>{" "} <span className="text-mineshaft-100 font-medium capitalize">{camelCaseToSpaces(key)}</span>{" "}
<span className="text-mineshaft-200"> <span className="text-mineshaft-200">
{formatedConditionsOperatorNames[operator as PermissionConditionOperators]} {formatedConditionsOperatorNames[operator as PermissionConditionOperators]}
</span>{" "} </span>{" "}
<span className="rounded-sm bg-mineshaft-600 p-0.5 font-mono"> <span className="bg-mineshaft-600 rounded-sm p-0.5 font-mono">
{typeof value === "string" ? value : value.join(", ")} {typeof value === "string" ? value : value.join(", ")}
</span> </span>
. .
@@ -45,13 +45,13 @@ export const FolderNodeTooltipContent = ({ action, access, actionRuleMap, subjec
case PermissionAccess.Full: case PermissionAccess.Full:
component = ( component = (
<> <>
<div className="flex items-center gap-1.5 text-green capitalize"> <div className="text-green flex items-center gap-1.5 capitalize">
<FontAwesomeIcon icon={faCheckCircle} size="xs" /> <FontAwesomeIcon icon={faCheckCircle} size="xs" />
<span>Full {formatActionName(action)} Permissions</span> <span>Full {formatActionName(action)} Permissions</span>
</div> </div>
<p className="text-mineshaft-200"> <p className="text-mineshaft-200">
Policy grants unconditional{" "} Policy grants unconditional{" "}
<span className="font-medium text-mineshaft-100"> <span className="text-mineshaft-100 font-medium">
{formatActionName(action).toLowerCase()} {formatActionName(action).toLowerCase()}
</span>{" "} </span>{" "}
permission for {subject.replaceAll("-", " ")} in this folder. permission for {subject.replaceAll("-", " ")} in this folder.
@@ -62,13 +62,13 @@ export const FolderNodeTooltipContent = ({ action, access, actionRuleMap, subjec
case PermissionAccess.Partial: case PermissionAccess.Partial:
component = ( component = (
<> <>
<div className="flex items-center gap-1.5 text-yellow capitalize"> <div className="text-yellow flex items-center gap-1.5 capitalize">
<FontAwesomeIcon icon={faCircleMinus} className="text-yellow" size="xs" /> <FontAwesomeIcon icon={faCircleMinus} className="text-yellow" size="xs" />
<span>Conditional {formatActionName(action)} Permissions</span> <span>Conditional {formatActionName(action)} Permissions</span>
</div> </div>
<p className="mb-1 text-mineshaft-200"> <p className="text-mineshaft-200 mb-1">
Policy conditionally allows{" "} Policy conditionally allows{" "}
<span className="font-medium text-mineshaft-100"> <span className="text-mineshaft-100 font-medium">
{formatActionName(action).toLowerCase()} {formatActionName(action).toLowerCase()}
</span>{" "} </span>{" "}
permission for {subject.replaceAll("-", " ")} in this folder. permission for {subject.replaceAll("-", " ")} in this folder.
@@ -137,13 +137,13 @@ export const FolderNodeTooltipContent = ({ action, access, actionRuleMap, subjec
case PermissionAccess.None: case PermissionAccess.None:
component = ( component = (
<> <>
<div className="flex items-center gap-1.5 text-red capitalize"> <div className="text-red flex items-center gap-1.5 capitalize">
<FontAwesomeIcon icon={faCircleXmark} size="xs" /> <FontAwesomeIcon icon={faCircleXmark} size="xs" />
<span>No {formatActionName(action)} Permissions</span> <span>No {formatActionName(action)} Permissions</span>
</div> </div>
<p className="text-mineshaft-200"> <p className="text-mineshaft-200">
Policy always forbids{" "} Policy always forbids{" "}
<span className="font-medium text-mineshaft-100"> <span className="text-mineshaft-100 font-medium">
{formatActionName(action).toLowerCase()} {formatActionName(action).toLowerCase()}
</span>{" "} </span>{" "}
permission for {subject.replaceAll("-", " ")} in this folder. permission for {subject.replaceAll("-", " ")} in this folder.
@@ -157,7 +157,7 @@ export const FolderNodeTooltipContent = ({ action, access, actionRuleMap, subjec
return ( return (
<NodeToolbar <NodeToolbar
className="rounded-md border border-mineshaft-600 bg-mineshaft-800 px-4 py-2 text-sm font-light text-bunker-100" className="border-mineshaft-600 bg-mineshaft-800 text-bunker-100 rounded-md border px-4 py-2 text-sm font-light"
isVisible isVisible
position={Position.Bottom} position={Position.Bottom}
> >
@@ -11,7 +11,7 @@ import { createRoleNode } from "../utils";
const getSubjectIcon = (subject: ProjectPermissionSub) => { const getSubjectIcon = (subject: ProjectPermissionSub) => {
switch (subject) { switch (subject) {
case ProjectPermissionSub.Secrets: case ProjectPermissionSub.Secrets:
return <FontAwesomeIcon icon={faKey} className="h-4 w-4 text-bunker-300" />; return <FontAwesomeIcon icon={faKey} className="text-bunker-300 h-4 w-4" />;
case ProjectPermissionSub.SecretFolders: case ProjectPermissionSub.SecretFolders:
return <FontAwesomeIcon icon={faFolder} className="h-4 w-4 text-yellow-700" />; return <FontAwesomeIcon icon={faFolder} className="h-4 w-4 text-yellow-700" />;
case ProjectPermissionSub.DynamicSecrets: case ProjectPermissionSub.DynamicSecrets:
@@ -19,7 +19,7 @@ const getSubjectIcon = (subject: ProjectPermissionSub) => {
case ProjectPermissionSub.SecretImports: case ProjectPermissionSub.SecretImports:
return <FontAwesomeIcon icon={faFileImport} className="h-4 w-4 text-green-700" />; return <FontAwesomeIcon icon={faFileImport} className="h-4 w-4 text-green-700" />;
default: default:
return <FontAwesomeIcon icon={faKey} className="h-4 w-4 text-bunker-300" />; return <FontAwesomeIcon icon={faKey} className="text-bunker-300 h-4 w-4" />;
} }
}; };
@@ -40,18 +40,18 @@ export const RoleNode = ({
<> <>
<Handle <Handle
type="target" type="target"
className="pointer-events-none cursor-pointer! opacity-0" className="cursor-pointer! pointer-events-none opacity-0"
position={Position.Top} position={Position.Top}
/> />
<div className="flex h-14 w-full flex-col items-center justify-center rounded-md border border-mineshaft bg-mineshaft-800 px-2 py-3 font-inter shadow-lg transition-opacity duration-500"> <div className="border-mineshaft bg-mineshaft-800 font-inter flex h-14 w-full flex-col items-center justify-center rounded-md border px-2 py-3 shadow-lg transition-opacity duration-500">
<div className="flex items-center space-x-2 text-mineshaft-100"> <div className="text-mineshaft-100 flex items-center space-x-2">
{getSubjectIcon(subject)} {getSubjectIcon(subject)}
<span className="text-sm">{formatLabel(subject)} Access</span> <span className="text-sm">{formatLabel(subject)} Access</span>
</div> </div>
</div> </div>
<Handle <Handle
type="source" type="source"
className="pointer-events-none cursor-pointer! opacity-0" className="cursor-pointer! pointer-events-none opacity-0"
position={Position.Bottom} position={Position.Bottom}
/> />
</> </>
@@ -12,10 +12,10 @@ export const ShowMoreButtonNode = ({
const tooltipText = `${remaining} ${remaining === 1 ? "folder is" : "folders are"} hidden. Click to show ${remaining > 10 ? "10 more" : ""}`; const tooltipText = `${remaining} ${remaining === 1 ? "folder is" : "folders are"} hidden. Click to show ${remaining > 10 ? "10 more" : ""}`;
return ( return (
<div className="flex h-full w-full items-center justify-center rounded-md border border-mineshaft-600 bg-mineshaft-800 p-2"> <div className="border-mineshaft-600 bg-mineshaft-800 flex h-full w-full items-center justify-center rounded-md border p-2">
<Handle <Handle
type="target" type="target"
className="pointer-events-none cursor-pointer! opacity-0" className="cursor-pointer! pointer-events-none opacity-0"
position={Position.Top} position={Position.Top}
/> />
@@ -51,11 +51,11 @@ const Content = ({ pkiSync, onComplete }: ContentProps) => {
handleTriggerImportCertificates(); handleTriggerImportCertificates();
}} }}
> >
<p className="mb-8 text-sm text-mineshaft-200"> <p className="text-mineshaft-200 mb-8 text-sm">
Are you sure you want to import certificates from this {destinationName} destination into Are you sure you want to import certificates from this {destinationName} destination into
Infisical? Infisical?
</p> </p>
<p className="mb-6 text-xs text-bunker-300"> <p className="text-bunker-300 mb-6 text-xs">
This operation will retrieve certificates from {destinationName} and make them available in This operation will retrieve certificates from {destinationName} and make them available in
your PKI subscriber. Only certificates that are not already imported will be processed. your PKI subscriber. Only certificates that are not already imported will be processed.
</p> </p>
@@ -69,16 +69,16 @@ export const PkiSyncImportStatusBadge = ({ pkiSync, className, mini }: Props) =>
label = "Failed to Import Certificates"; label = "Failed to Import Certificates";
icon = faTriangleExclamation; icon = faTriangleExclamation;
tooltipContent = ( tooltipContent = (
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
{failureMessage && ( {failureMessage && (
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs"> <div className="text-xs">
{mini ? "Failed to Import Certificates" : "Failure Reason"} {mini ? "Failed to Import Certificates" : "Failure Reason"}
</div> </div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs">{failureMessage}</div> <div className="bg-mineshaft-600 rounded-sm p-2 text-xs">{failureMessage}</div>
</div> </div>
)} )}
</div> </div>
@@ -17,10 +17,10 @@ export const PkiSyncModalHeader = ({ destination, isConfigured }: Props) => {
<img <img
alt={`${destinationDetails.name} logo`} alt={`${destinationDetails.name} logo`}
src={`/images/integrations/${destinationDetails.image}`} src={`/images/integrations/${destinationDetails.image}`}
className="h-12 w-12 rounded-md bg-bunker-500 p-2" className="bg-bunker-500 h-12 w-12 rounded-md p-2"
/> />
<div> <div>
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
{destinationDetails.name} Certificate Sync {destinationDetails.name} Certificate Sync
<a <a
target="_blank" target="_blank"
@@ -28,8 +28,8 @@ export const PkiSyncModalHeader = ({ destination, isConfigured }: Props) => {
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -38,7 +38,7 @@ export const PkiSyncModalHeader = ({ destination, isConfigured }: Props) => {
</div> </div>
</a> </a>
</div> </div>
<p className="text-sm leading-4 text-mineshaft-400"> <p className="text-mineshaft-400 text-sm leading-4">
{isConfigured {isConfigured
? `Edit ${destinationDetails.name} Certificate Sync` ? `Edit ${destinationDetails.name} Certificate Sync`
: `Sync certificates to ${destinationDetails.name}`} : `Sync certificates to ${destinationDetails.name}`}
@@ -51,7 +51,7 @@ const Content = ({ pkiSync, onComplete }: ContentProps) => {
handleTriggerRemoveCertificates(); handleTriggerRemoveCertificates();
}} }}
> >
<p className="mb-8 text-sm text-mineshaft-200"> <p className="text-mineshaft-200 mb-8 text-sm">
Are you sure you want to remove certificates synced by Infisical from this {destinationName}{" "} Are you sure you want to remove certificates synced by Infisical from this {destinationName}{" "}
destination? destination?
</p> </p>
@@ -69,16 +69,16 @@ export const PkiSyncRemoveStatusBadge = ({ pkiSync, className, mini }: Props) =>
label = "Failed to Remove Certificates"; label = "Failed to Remove Certificates";
icon = faTriangleExclamation; icon = faTriangleExclamation;
tooltipContent = ( tooltipContent = (
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
{failureMessage && ( {failureMessage && (
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs"> <div className="text-xs">
{mini ? "Failed to Remove Certificates" : "Failure Reason"} {mini ? "Failed to Remove Certificates" : "Failure Reason"}
</div> </div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs">{failureMessage}</div> <div className="bg-mineshaft-600 rounded-sm p-2 text-xs">{failureMessage}</div>
</div> </div>
)} )}
</div> </div>
@@ -46,7 +46,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
<Spinner size="lg" className="text-mineshaft-500" /> <Spinner size="lg" className="text-mineshaft-500" />
<p className="mt-4 text-sm text-mineshaft-400">Loading options...</p> <p className="text-mineshaft-400 mt-4 text-sm">Loading options...</p>
</div> </div>
); );
} }
@@ -60,7 +60,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
placeholder="Search options..." placeholder="Search options..."
className="bg-mineshaft-800 placeholder:text-mineshaft-400" className="bg-mineshaft-800 placeholder:text-mineshaft-400"
/> />
<div className="grid h-118 grid-cols-4 content-start gap-2"> <div className="h-118 grid grid-cols-4 content-start gap-2">
{filteredOptions.slice(offset, perPage * page)?.map(({ destination, enterprise }) => { {filteredOptions.slice(offset, perPage * page)?.map(({ destination, enterprise }) => {
const { image, name } = PKI_SYNC_MAP[destination]; const { image, name } = PKI_SYNC_MAP[destination];
return ( return (
@@ -72,7 +72,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
? handlePopUpOpen("upgradePlan") ? handlePopUpOpen("upgradePlan")
: onSelect(destination) : onSelect(destination)
} }
className="group relative flex h-28 cursor-pointer flex-col items-center justify-center overflow-hidden rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600" className="border-mineshaft-600 bg-mineshaft-700 hover:bg-mineshaft-600 group relative flex h-28 cursor-pointer flex-col items-center justify-center overflow-hidden rounded-md border p-4 duration-200"
> >
<img <img
src={`/images/integrations/${image}`} src={`/images/integrations/${image}`}
@@ -109,7 +109,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
service you're looking for,`}{" "} service you're looking for,`}{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://infisical.com/slack" href="https://infisical.com/slack"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -118,7 +118,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
or{" "} or{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://github.com/Infisical/infisical/discussions" href="https://github.com/Infisical/infisical/discussions"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -129,7 +129,7 @@ export const PkiSyncSelect = ({ onSelect }: Props) => {
</> </>
} }
> >
<div className="-ml-3 flex items-center gap-1.5 text-mineshaft-400"> <div className="text-mineshaft-400 -ml-3 flex items-center gap-1.5">
<span className="text-xs"> <span className="text-xs">
Don&#39;t see the third-party service you&#39;re looking for? Don&#39;t see the third-party service you&#39;re looking for?
</span> </span>
@@ -65,7 +65,7 @@ export const PkiSyncTable = ({ pkiSyncs, onEdit, onDelete, onTrigger }: Props) =
{pkiSyncs.map((pkiSync) => ( {pkiSyncs.map((pkiSync) => (
<Tr <Tr
key={pkiSync.id} key={pkiSync.id}
className="cursor-pointer hover:bg-mineshaft-700" className="hover:bg-mineshaft-700 cursor-pointer"
onClick={() => onEdit(pkiSync)} onClick={() => onEdit(pkiSync)}
> >
<Td>{pkiSync.name}</Td> <Td>{pkiSync.name}</Td>
@@ -32,7 +32,7 @@ export const AwsCertificateManagerPkiSyncFields = () => {
<Select <Select
value={field.value} value={field.value}
onValueChange={field.onChange} onValueChange={field.onChange}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select an AWS region" placeholder="Select an AWS region"
> >
@@ -124,12 +124,12 @@ export const CreatePkiSyncForm = ({ destination, onComplete, onCancel }: Props)
if (showConfirmation) if (showConfirmation)
return ( return (
<> <>
<div className="flex flex-col rounded-xs border border-l-2 border-mineshaft-600 border-l-primary bg-mineshaft-700/80 px-4 py-3"> <div className="rounded-xs border-mineshaft-600 border-l-primary bg-mineshaft-700/80 flex flex-col border border-l-2 px-4 py-3">
<div className="mb-1 flex items-center text-sm"> <div className="mb-1 flex items-center text-sm">
<FontAwesomeIcon icon={faInfoCircle} size="sm" className="mr-1.5 text-primary" /> <FontAwesomeIcon icon={faInfoCircle} size="sm" className="text-primary mr-1.5" />
Certificate Sync Behavior Certificate Sync Behavior
</div> </div>
<p className="mt-1 text-sm text-bunker-200"> <p className="text-bunker-200 mt-1 text-sm">
Only certificates managed by Infisical will be affected during sync operations. Only certificates managed by Infisical will be affected during sync operations.
Certificates not created or managed by Infisical will remain untouched, and changes made Certificates not created or managed by Infisical will remain untouched, and changes made
to Infisical-managed certificates directly in the destination service may be overwritten to Infisical-managed certificates directly in the destination service may be overwritten
@@ -162,7 +162,7 @@ export const CreatePkiSyncForm = ({ destination, onComplete, onCancel }: Props)
<form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}> <form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}>
<FormProvider {...formMethods}> <FormProvider {...formMethods}>
<Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}> <Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}>
<Tab.List className="-pb-1 mb-6 w-full border-b-2 border-mineshaft-600"> <Tab.List className="-pb-1 border-mineshaft-600 mb-6 w-full border-b-2">
{FORM_TABS.map((tab, index) => ( {FORM_TABS.map((tab, index) => (
<Tab <Tab
onClick={async (e) => { onClick={async (e) => {
@@ -171,9 +171,9 @@ export const CreatePkiSyncForm = ({ destination, onComplete, onCancel }: Props)
setSelectedTabIndex((prev) => (isEnabled ? index : prev)); setSelectedTabIndex((prev) => (isEnabled ? index : prev));
}} }}
className={({ selected }) => className={({ selected }) =>
`-mb-[0.14rem] w-30 ${index > selectedTabIndex ? "opacity-30" : ""} px-4 py-2 text-sm font-medium outline-hidden disabled:opacity-60 ${ `-mb-[0.14rem] whitespace-nowrap ${index > selectedTabIndex ? "opacity-30" : ""} outline-hidden px-4 py-2 text-sm font-medium disabled:opacity-60 ${
selected selected
? "border-b-2 border-mineshaft-300 text-mineshaft-200" ? "border-mineshaft-300 text-mineshaft-200 border-b-2"
: "text-bunker-300" : "text-bunker-300"
}` }`
} }
@@ -207,7 +207,7 @@ export const CreatePkiSyncForm = ({ destination, onComplete, onCancel }: Props)
errorText={error?.message} errorText={error?.message}
> >
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id="auto-sync-enabled" id="auto-sync-enabled"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -40,7 +40,7 @@ export const PkiSyncConnectionField = ({ onChange: callback }: Props) => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Specify the {appName} Connection to use to connect to {connectionName} and configure Specify the {appName} Connection to use to connect to {connectionName} and configure
destination parameters. destination parameters.
</p> </p>
@@ -69,7 +69,7 @@ export const PkiSyncConnectionField = ({ onChange: callback }: Props) => {
name="connection" name="connection"
/> />
{availableConnections?.length === 0 && ( {availableConnections?.length === 0 && (
<p className="-mt-2.5 mb-2.5 text-xs text-yellow"> <p className="text-yellow -mt-2.5 mb-2.5 text-xs">
<FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} /> <FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} />
{canCreateConnection ? ( {canCreateConnection ? (
<> <>
@@ -9,7 +9,7 @@ export const PkiSyncDetailsFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Provide a name and description for this Certificate Sync. Provide a name and description for this Certificate Sync.
</p> </p>
<Controller <Controller
@@ -18,7 +18,7 @@ export const PkiSyncOptionsFields = ({ destination }: Props) => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300">Configure how certificates should be synced.</p> <p className="text-bunker-300 mb-4 text-sm">Configure how certificates should be synced.</p>
{/* {/*
TODO: Re-enable this when we have a way to import certificates TODO: Re-enable this when we have a way to import certificates
<Controller <Controller
@@ -64,7 +64,7 @@ export const PkiSyncOptionsFields = ({ destination }: Props) => {
render={({ field: { value, onChange }, fieldState: { error } }) => ( render={({ field: { value, onChange }, fieldState: { error } }) => (
<FormControl isError={Boolean(error)} errorText={error?.message}> <FormControl isError={Boolean(error)} errorText={error?.message}>
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id="can-remove-certificates" id="can-remove-certificates"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -121,7 +121,7 @@ export const PkiSyncOptionsFields = ({ destination }: Props) => {
<span className="text-yellow"> <span className="text-yellow">
Character restrictions for {syncOption.name}: Character restrictions for {syncOption.name}:
</span> </span>
<div className="text-xs text-bunker-300"> <div className="text-bunker-300 text-xs">
The following characters are not allowed:{" "} The following characters are not allowed:{" "}
{syncOption.forbiddenCharacters.split("").join(" ")} {syncOption.forbiddenCharacters.split("").join(" ")}
</div> </div>
@@ -34,8 +34,8 @@ export const PkiSyncReviewFields = () => {
return ( return (
<div className="mb-4 flex flex-col gap-6"> <div className="mb-4 flex flex-col gap-6">
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Source</span> <span className="text-mineshaft-300 text-sm">Source</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="PKI Subscriber"> <GenericFieldLabel label="PKI Subscriber">
@@ -44,8 +44,8 @@ export const PkiSyncReviewFields = () => {
</div> </div>
</div> </div>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Destination</span> <span className="text-mineshaft-300 text-sm">Destination</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Connection">{connection?.name}</GenericFieldLabel> <GenericFieldLabel label="Connection">{connection?.name}</GenericFieldLabel>
@@ -58,8 +58,8 @@ export const PkiSyncReviewFields = () => {
</div> </div>
</div> </div>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Sync Options</span> <span className="text-mineshaft-300 text-sm">Sync Options</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Auto-Sync"> <GenericFieldLabel label="Auto-Sync">
@@ -86,8 +86,8 @@ export const PkiSyncReviewFields = () => {
</div> </div>
</div> </div>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Details</span> <span className="text-mineshaft-300 text-sm">Details</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Name">{name}</GenericFieldLabel> <GenericFieldLabel label="Name">{name}</GenericFieldLabel>
@@ -16,7 +16,7 @@ export const PkiSyncSourceFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Specify the PKI subscriber where you would like to sync certificates from. Specify the PKI subscriber where you would like to sync certificates from.
</p> </p>
@@ -83,9 +83,9 @@ export const ProjectOverviewChangeSection = ({ showSlugField = false }: Props) =
}; };
return ( return (
<div className="mb-6 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="border-mineshaft-600 bg-mineshaft-900 mb-6 rounded-lg border p-4">
<div className="justify-betweens flex"> <div className="justify-betweens flex">
<h2 className="mb-8 flex-1 text-xl font-medium text-mineshaft-100">Project Overview</h2> <h2 className="text-mineshaft-100 mb-8 flex-1 text-xl font-medium">Project Overview</h2>
<div className="space-x-2"> <div className="space-x-2">
<Button <Button
variant="outline_bg" variant="outline_bg"
@@ -200,7 +200,7 @@ export const ProjectOverviewChangeSection = ({ showSlugField = false }: Props) =
placeholder="Project description" placeholder="Project description"
{...field} {...field}
rows={3} rows={3}
className="thin-scrollbar max-w-md resize-none! bg-mineshaft-800" className="thin-scrollbar resize-none! bg-mineshaft-800 max-w-md"
isDisabled={!isAllowed} isDisabled={!isAllowed}
/> />
</FormControl> </FormControl>
@@ -202,7 +202,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => {
<div <div
key={el.value} key={el.value}
className={twMerge( className={twMerge(
"flex cursor-pointer flex-col items-center gap-2 rounded-sm border border-mineshaft-600 px-2 py-4 opacity-75 transition-all hover:border-primary-400 hover:bg-mineshaft-600", "border-mineshaft-600 hover:border-primary-400 hover:bg-mineshaft-600 flex cursor-pointer flex-col items-center gap-2 rounded-sm border px-2 py-4 opacity-75 transition-all",
field.value === el.value && "border-primary-400 bg-mineshaft-600 opacity-100" field.value === el.value && "border-primary-400 bg-mineshaft-600 opacity-100"
)} )}
onClick={() => field.onChange(el.value)} onClick={() => field.onChange(el.value)}
@@ -238,7 +238,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => {
placeholder="Project description" placeholder="Project description"
{...field} {...field}
rows={3} rows={3}
className="thin-scrollbar w-full resize-none! bg-mineshaft-900" className="thin-scrollbar resize-none! bg-mineshaft-900 w-full"
/> />
</FormControl> </FormControl>
)} )}
@@ -311,7 +311,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => {
onValueChange={(e) => { onValueChange={(e) => {
onChange(e); onChange(e);
}} }}
className="mb-12 w-full bg-mineshaft-600" className="bg-mineshaft-600 mb-12 w-full"
position="popper" position="popper"
dropdownContainerClassName="max-w-none -top-1" dropdownContainerClassName="max-w-none -top-1"
side="top" side="top"
@@ -333,7 +333,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => {
</AccordionContent> </AccordionContent>
</AccordionItem> </AccordionItem>
</Accordion> </Accordion>
<div className="absolute right-0 bottom-0 mr-6 mb-6 flex items-start justify-end"> <div className="absolute bottom-0 right-0 mb-6 mr-6 flex items-start justify-end">
<ModalClose> <ModalClose>
<Button colorSchema="secondary" variant="plain" className="py-2"> <Button colorSchema="secondary" variant="plain" className="py-2">
Cancel Cancel
+3 -3
View File
@@ -13,15 +13,15 @@ export const RoleOption = ({
<div> <div>
<p className="truncate">{children}</p> <p className="truncate">{children}</p>
{props.data.description ? ( {props.data.description ? (
<p className="truncate text-xs leading-4 text-mineshaft-400"> <p className="text-mineshaft-400 truncate text-xs leading-4">
{props.data.description} {props.data.description}
</p> </p>
) : ( ) : (
<p className="text-xs leading-4 text-mineshaft-400/50">No Description</p> <p className="text-mineshaft-400/50 text-xs leading-4">No Description</p>
)} )}
</div> </div>
{isSelected && ( {isSelected && (
<FontAwesomeIcon className="ml-2 text-primary" icon={faCheckCircle} size="sm" /> <FontAwesomeIcon className="text-primary ml-2" icon={faCheckCircle} size="sm" />
)} )}
</div> </div>
</components.Option> </components.Option>
@@ -115,7 +115,7 @@ export const CreateSecretRotationV2Modal = ({ onOpenChange, isOpen, ...props }:
selectedRotation ? ( selectedRotation ? (
<SecretRotationV2ModalHeader isConfigured={false} type={selectedRotation} /> <SecretRotationV2ModalHeader isConfigured={false} type={selectedRotation} />
) : ( ) : (
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
Add Secret Rotation Add Secret Rotation
<a <a
target="_blank" target="_blank"
@@ -123,8 +123,8 @@ export const CreateSecretRotationV2Modal = ({ onOpenChange, isOpen, ...props }:
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -72,7 +72,7 @@ export const DeleteSecretRotationV2Modal = ({
> >
<Switch <Switch
containerClassName="mt-4" containerClassName="mt-4"
className="bg-mineshaft-400/50 shadow-inner data-[state=checked]:bg-red/50" className="bg-mineshaft-400/50 data-[state=checked]:bg-red/50 shadow-inner"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
isChecked={revokeGeneratedCredentials} isChecked={revokeGeneratedCredentials}
onCheckedChange={setRevokeGeneratedCredentials} onCheckedChange={setRevokeGeneratedCredentials}
@@ -80,13 +80,13 @@ export const DeleteSecretRotationV2Modal = ({
> >
Revoke Credentials Revoke Credentials
</Switch> </Switch>
<p className="mt-1 font-inter text-sm text-mineshaft-400"> <p className="font-inter text-mineshaft-400 mt-1 text-sm">
Generated credentials will {revokeGeneratedCredentials ? "" : "not"} be revoked on deletion Generated credentials will {revokeGeneratedCredentials ? "" : "not"} be revoked on deletion
{revokeGeneratedCredentials ? "" : " and remain active"}. {revokeGeneratedCredentials ? "" : " and remain active"}.
</p> </p>
<Switch <Switch
containerClassName="mt-4" containerClassName="mt-4"
className="bg-mineshaft-400/50 shadow-inner data-[state=checked]:bg-red/50" className="bg-mineshaft-400/50 data-[state=checked]:bg-red/50 shadow-inner"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
isChecked={deleteSecrets} isChecked={deleteSecrets}
onCheckedChange={setDeleteSecrets} onCheckedChange={setDeleteSecrets}
@@ -94,7 +94,7 @@ export const DeleteSecretRotationV2Modal = ({
> >
Delete Secrets Delete Secrets
</Switch> </Switch>
<p className="mt-1 font-inter text-sm text-mineshaft-400"> <p className="font-inter text-mineshaft-400 mt-1 text-sm">
Rotation secrets will {deleteSecrets ? "" : "not"} be removed from your project on deletion. Rotation secrets will {deleteSecrets ? "" : "not"} be removed from your project on deletion.
</p> </p>
</DeleteActionModal> </DeleteActionModal>
@@ -48,7 +48,7 @@ const Content = ({ secretRotation, onComplete }: ContentProps) => {
return ( return (
<div> <div>
<p className="mb-8 text-sm text-mineshaft-200"> <p className="text-mineshaft-200 mb-8 text-sm">
Are you sure you want to rotate the secrets for this {rotationType} Rotation? Are you sure you want to rotate the secrets for this {rotationType} Rotation?
</p> </p>
<div className="mt-8 flex w-full items-center justify-between gap-2"> <div className="mt-8 flex w-full items-center justify-between gap-2">
@@ -17,10 +17,10 @@ export const SecretRotationV2ModalHeader = ({ type, isConfigured }: Props) => {
<img <img
alt={`${destinationDetails.name} logo`} alt={`${destinationDetails.name} logo`}
src={`/images/integrations/${destinationDetails.image}`} src={`/images/integrations/${destinationDetails.image}`}
className="h-12 w-12 rounded-md bg-bunker-500 p-2" className="bg-bunker-500 h-12 w-12 rounded-md p-2"
/> />
<div> <div>
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
{destinationDetails.name} Rotation {destinationDetails.name} Rotation
<a <a
target="_blank" target="_blank"
@@ -28,8 +28,8 @@ export const SecretRotationV2ModalHeader = ({ type, isConfigured }: Props) => {
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -38,7 +38,7 @@ export const SecretRotationV2ModalHeader = ({ type, isConfigured }: Props) => {
</div> </div>
</a> </a>
</div> </div>
<p className="text-sm leading-4 text-mineshaft-400"> <p className="text-mineshaft-400 text-sm leading-4">
{isConfigured {isConfigured
? `Edit ${destinationDetails.name} Rotation` ? `Edit ${destinationDetails.name} Rotation`
: `Rotate ${destinationDetails.name}`} : `Rotate ${destinationDetails.name}`}
@@ -16,7 +16,7 @@ export const SecretRotationV2Select = ({ onSelect }: Props) => {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
<Spinner size="lg" className="text-mineshaft-500" /> <Spinner size="lg" className="text-mineshaft-500" />
<p className="mt-4 text-sm text-mineshaft-400">Loading options...</p> <p className="text-mineshaft-400 mt-4 text-sm">Loading options...</p>
</div> </div>
); );
} }
@@ -31,7 +31,7 @@ export const SecretRotationV2Select = ({ onSelect }: Props) => {
type="button" type="button"
key={type} key={type}
onClick={() => onSelect(type)} onClick={() => onSelect(type)}
className="group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600" className="border-mineshaft-600 bg-mineshaft-700 hover:bg-mineshaft-600 group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border p-4 duration-200"
> >
<img <img
src={`/images/integrations/${image}`} src={`/images/integrations/${image}`}
@@ -56,7 +56,7 @@ export const SecretRotationV2Select = ({ onSelect }: Props) => {
service you're looking for,`}{" "} service you're looking for,`}{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://infisical.com/slack" href="https://infisical.com/slack"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -65,7 +65,7 @@ export const SecretRotationV2Select = ({ onSelect }: Props) => {
or{" "} or{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://github.com/Infisical/infisical/discussions" href="https://github.com/Infisical/infisical/discussions"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -76,7 +76,7 @@ export const SecretRotationV2Select = ({ onSelect }: Props) => {
</> </>
} }
> >
<div className="group relative flex h-28 flex-col items-center justify-center rounded-md border border-dashed border-mineshaft-600 bg-mineshaft-800 p-4 hover:bg-mineshaft-900/50"> <div className="border-mineshaft-600 bg-mineshaft-800 hover:bg-mineshaft-900/50 group relative flex h-28 flex-col items-center justify-center rounded-md border border-dashed p-4">
<FontAwesomeIcon className="mt-auto text-3xl" icon={faWrench} /> <FontAwesomeIcon className="mt-auto text-3xl" icon={faWrench} />
<div className="mt-auto max-w-xs text-center text-xs font-medium text-gray-300 duration-200 group-hover:text-gray-200"> <div className="mt-auto max-w-xs text-center text-xs font-medium text-gray-300 duration-200 group-hover:text-gray-200">
Coming Soon Coming Soon
@@ -31,18 +31,18 @@ export const SecretRotationV2StatusBadge = ({ secretRotation, className }: Props
position="left" position="left"
className="max-w-sm select-text" className="max-w-sm select-text"
content={ content={
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs">Failure Reason</div> <div className="text-xs">Failure Reason</div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs break-words"> <div className="bg-mineshaft-600 break-words rounded-sm p-2 text-xs">
{errorMessage} {errorMessage}
</div> </div>
</div> </div>
{nextRotationAt && ( {nextRotationAt && (
<span className="text-xs text-mineshaft-300"> <span className="text-mineshaft-300 text-xs">
Next rotation attempt on {format(nextRotationAt, "MM/dd/yyyy")} at{" "} Next rotation attempt on {format(nextRotationAt, "MM/dd/yyyy")} at{" "}
{format(nextRotationAt, "h:mm aa")}. {format(nextRotationAt, "h:mm aa")}.
</span> </span>
@@ -67,7 +67,7 @@ export const SecretRotationV2StatusBadge = ({ secretRotation, className }: Props
return ( return (
<Badge <Badge
className={twMerge( className={twMerge(
"flex h-5 w-min items-center gap-1.5 bg-mineshaft-400/50 whitespace-nowrap text-bunker-300", "bg-mineshaft-400/50 text-bunker-300 flex h-5 w-min items-center gap-1.5 whitespace-nowrap",
className className
)} )}
> >
@@ -48,7 +48,7 @@ const Content = ({ secretRotation }: ContentProps) => {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
<Spinner size="lg" className="text-mineshaft-500" /> <Spinner size="lg" className="text-mineshaft-500" />
<p className="mt-4 text-sm text-mineshaft-400">Loading generated credentials...</p> <p className="text-mineshaft-400 mt-4 text-sm">Loading generated credentials...</p>
</div> </div>
); );
} }
@@ -56,7 +56,7 @@ const Content = ({ secretRotation }: ContentProps) => {
if (!generatedCredentialsResponse) { if (!generatedCredentialsResponse) {
return ( return (
<div className="flex w-full justify-center"> <div className="flex w-full justify-center">
<p className="text-sm text-red">No generated credentials found for this rotation.</p> <p className="text-red text-sm">No generated credentials found for this rotation.</p>
</div> </div>
); );
} }
@@ -126,14 +126,14 @@ const Content = ({ secretRotation }: ContentProps) => {
{Component} {Component}
{!IS_ROTATION_DUAL_CREDENTIALS[type] && ( {!IS_ROTATION_DUAL_CREDENTIALS[type] && (
<NoticeBannerV2 title={`${appName} Retired Credentials Behavior`}> <NoticeBannerV2 title={`${appName} Retired Credentials Behavior`}>
<p className="text-sm text-mineshaft-300"> <p className="text-mineshaft-300 text-sm">
Due to {SECRET_ROTATION_MAP[type].name} Rotations utilizing a single credential set, Due to {SECRET_ROTATION_MAP[type].name} Rotations utilizing a single credential set,
retired credentials will not be able to authenticate with {appName} during their{" "} retired credentials will not be able to authenticate with {appName} during their{" "}
<a <a
target="_blank" target="_blank"
href="https://infisical.com/docs/documentation/platform/secret-rotation/overview#how-rotation-works" href="https://infisical.com/docs/documentation/platform/secret-rotation/overview#how-rotation-works"
rel="noopener noreferrer" rel="noopener noreferrer"
className="underline decoration-primary underline-offset-2 hover:text-mineshaft-200" className="decoration-primary hover:text-mineshaft-200 underline underline-offset-2"
> >
inactive period inactive period
</a> </a>
@@ -142,7 +142,7 @@ const Content = ({ secretRotation }: ContentProps) => {
</NoticeBannerV2> </NoticeBannerV2>
)} )}
{nextRotationAt && ( {nextRotationAt && (
<div className="flex items-center gap-x-1.5 text-sm text-mineshaft-200"> <div className="text-mineshaft-200 flex items-center gap-x-1.5 text-sm">
<FontAwesomeIcon icon={faRotate} className="text-mineshaft-400" /> <FontAwesomeIcon icon={faRotate} className="text-mineshaft-400" />
<span> <span>
Next rotation occurs on: {format(nextRotationAt, "MM/dd/yyyy")} at{" "} Next rotation occurs on: {format(nextRotationAt, "MM/dd/yyyy")} at{" "}
@@ -21,7 +21,7 @@ export const CredentialDisplay = ({ children, label, isSensitive }: Props) => {
return ( return (
<GenericFieldLabel label={label}> <GenericFieldLabel label={label}>
{children ? ( {children ? (
<div className="flex w-full items-center gap-1 text-mineshaft-100"> <div className="text-mineshaft-100 flex w-full items-center gap-1">
{showCredential ? children : "****************************"} {showCredential ? children : "****************************"}
<Tooltip content={`Copy ${label}`}> <Tooltip content={`Copy ${label}`}>
<IconButton <IconButton
@@ -14,31 +14,31 @@ export const ViewRotationGeneratedCredentialsDisplay = ({
return ( return (
<> <>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-100"> <span className="text-mineshaft-100 text-sm">
<FontAwesomeIcon icon={faCheck} className="mr-1.5 text-green" /> <FontAwesomeIcon icon={faCheck} className="text-green mr-1.5" />
Current Credentials Current Credentials
</span> </span>
</div> </div>
<p className="text-sm text-mineshaft-300"> <p className="text-mineshaft-300 text-sm">
The active credential set currently mapped to the rotation secrets. The active credential set currently mapped to the rotation secrets.
</p> </p>
<div className="flex flex-col gap-x-8 gap-y-2 rounded-sm border border-mineshaft-600 bg-mineshaft-700 p-2"> <div className="border-mineshaft-600 bg-mineshaft-700 flex flex-col gap-x-8 gap-y-2 rounded-sm border p-2">
{activeCredentials} {activeCredentials}
</div> </div>
</div> </div>
{inactiveCredentials && ( {inactiveCredentials && (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-100"> <span className="text-mineshaft-100 text-sm">
<FontAwesomeIcon icon={faClockRotateLeft} className="mr-1.5 text-yellow" /> <FontAwesomeIcon icon={faClockRotateLeft} className="text-yellow mr-1.5" />
Retired Credentials Retired Credentials
</span> </span>
</div> </div>
<p className="text-sm text-mineshaft-300"> <p className="text-mineshaft-300 text-sm">
The retired credential set that will be revoked during the next rotation cycle. The retired credential set that will be revoked during the next rotation cycle.
</p> </p>
<div className="flex flex-col gap-x-8 gap-y-2 rounded-sm border border-mineshaft-600 bg-mineshaft-700 p-2"> <div className="border-mineshaft-600 bg-mineshaft-700 flex flex-col gap-x-8 gap-y-2 rounded-sm border p-2">
{inactiveCredentials} {inactiveCredentials}
</div> </div>
</div> </div>
@@ -26,7 +26,7 @@ export const SecretRotationV2ConfigurationFields = ({ isUpdate, environments }:
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Configure the connection rotation strategy for this Secret Rotation. Configure the connection rotation strategy for this Secret Rotation.
</p> </p>
{!isUpdate && environments && ( {!isUpdate && environments && (
@@ -90,7 +90,7 @@ export const SecretRotationV2ConfigurationFields = ({ isUpdate, environments }:
}); });
} }
}} }}
className="bg-mineshaft-700 text-white scheme-dark" className="bg-mineshaft-700 scheme-dark text-white"
/> />
</FormControl> </FormControl>
); );
@@ -113,7 +113,7 @@ export const SecretRotationV2ConfigurationFields = ({ isUpdate, environments }:
errorText={error?.message} errorText={error?.message}
> >
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id="auto-rotation-enabled" id="auto-rotation-enabled"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -126,7 +126,7 @@ export const SecretRotationV2ConfigurationFields = ({ isUpdate, environments }:
}} }}
/> />
{!IS_ROTATION_DUAL_CREDENTIALS[type] && isAutoRotationEnabled && ( {!IS_ROTATION_DUAL_CREDENTIALS[type] && isAutoRotationEnabled && (
<div className="rounded-sm border border-yellow bg-yellow/10 p-2 px-3 text-xs text-yellow"> <div className="border-yellow bg-yellow/10 text-yellow rounded-sm border p-2 px-3 text-xs">
<FontAwesomeIcon icon={faWarning} className="mr-1" /> Due to{" "} <FontAwesomeIcon icon={faWarning} className="mr-1" /> Due to{" "}
{SECRET_ROTATION_MAP[type].name} Rotations rotating a single credential set, auto-rotation {SECRET_ROTATION_MAP[type].name} Rotations rotating a single credential set, auto-rotation
may result in service interruptions. If you need to ensure service continuity, we may result in service interruptions. If you need to ensure service continuity, we
@@ -135,7 +135,7 @@ export const SecretRotationV2ConfigurationFields = ({ isUpdate, environments }:
href="https://infisical.com/docs/documentation/platform/secret-rotation/overview#how-rotation-works" href="https://infisical.com/docs/documentation/platform/secret-rotation/overview#how-rotation-works"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="underline decoration-yellow underline-offset-2 hover:text-mineshaft-200" className="decoration-yellow hover:text-mineshaft-200 underline underline-offset-2"
> >
Read more Read more
</a> </a>
@@ -105,7 +105,7 @@ export const SecretRotationV2ConnectionField = ({ onChange: callback, isUpdate }
name="connection" name="connection"
/> />
{!isUpdate && !isPending && !availableConnections?.length && !canCreateConnection && ( {!isUpdate && !isPending && !availableConnections?.length && !canCreateConnection && (
<p className="-mt-2.5 mb-2.5 text-xs text-yellow"> <p className="text-yellow -mt-2.5 mb-2.5 text-xs">
<FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} /> <FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} />
You do not have access to any {appName} Connections. Contact an admin to create one. You do not have access to any {appName} Connections. Contact an admin to create one.
</p> </p>
@@ -9,7 +9,7 @@ export const SecretRotationV2DetailsFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Provide a name and description for this Secret Rotation. Provide a name and description for this Secret Rotation.
</p> </p>
<Controller <Controller
@@ -183,7 +183,7 @@ export const SecretRotationV2Form = ({
<form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}> <form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}>
<FormProvider {...formMethods}> <FormProvider {...formMethods}>
<Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}> <Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}>
<Tab.List className="-pb-1 mb-6 w-full border-b-2 border-mineshaft-600"> <Tab.List className="-pb-1 border-mineshaft-600 mb-6 w-full border-b-2">
{FORM_TABS.map((tab, index) => ( {FORM_TABS.map((tab, index) => (
<Tab <Tab
onClick={async (e) => { onClick={async (e) => {
@@ -192,9 +192,9 @@ export const SecretRotationV2Form = ({
setSelectedTabIndex((prev) => (isEnabled ? index : prev)); setSelectedTabIndex((prev) => (isEnabled ? index : prev));
}} }}
className={({ selected }) => className={({ selected }) =>
`-mb-[0.14rem] w-30 ${index > selectedTabIndex ? "opacity-30" : ""} px-4 py-2 text-sm font-medium outline-hidden disabled:opacity-60 ${ `-mb-[0.14rem] whitespace-nowrap ${index > selectedTabIndex ? "opacity-30" : ""} outline-hidden px-4 py-2 text-sm font-medium disabled:opacity-60 ${
selected selected
? "border-b-2 border-mineshaft-300 text-mineshaft-200" ? "border-mineshaft-300 text-mineshaft-200 border-b-2"
: "text-bunker-300" : "text-bunker-300"
}` }`
} }
@@ -27,7 +27,7 @@ export const LdapPasswordRotationParametersFields = () => {
tooltipText={ tooltipText={
<> <>
<span>Determines how the rotation will be performed:</span> <span>Determines how the rotation will be performed:</span>
<ul className="mt-2 ml-4 flex list-disc flex-col gap-2"> <ul className="ml-4 mt-2 flex list-disc flex-col gap-2">
<li> <li>
<span className="font-medium">Connection Principal</span> - The Connection <span className="font-medium">Connection Principal</span> - The Connection
principal will rotate the target principal&#39;s password. principal will rotate the target principal&#39;s password.
@@ -66,7 +66,7 @@ export const LdapPasswordRotationParametersFields = () => {
); );
onChange(val); onChange(val);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
> >
@@ -127,10 +127,10 @@ export const LdapPasswordRotationParametersFields = () => {
)} )}
</div> </div>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Password Requirements</span> <span className="text-mineshaft-300 text-sm">Password Requirements</span>
</div> </div>
<div className="grid grid-cols-2 gap-x-3 gap-y-1 rounded-sm border border-mineshaft-600 bg-mineshaft-700 px-3 pt-3"> <div className="border-mineshaft-600 bg-mineshaft-700 grid grid-cols-2 gap-x-3 gap-y-1 rounded-sm border px-3 pt-3">
<Controller <Controller
control={control} control={control}
name="parameters.passwordRequirements.length" name="parameters.passwordRequirements.length"
@@ -31,7 +31,7 @@ export const RedisCredentialsRotationParametersFields = () => {
</p> </p>
<p> <p>
The default value is{" "} The default value is{" "}
<code className="rounded-sm bg-mineshaft-700 px-1 py-0.5 font-mono font-medium text-bunker-300"> <code className="bg-mineshaft-700 text-bunker-300 rounded-sm px-1 py-0.5 font-mono font-medium">
~* +@all ~* +@all
</code> </code>
. You can modify it to suit your needs. . You can modify it to suit your needs.
@@ -39,7 +39,7 @@ export const RedisCredentialsRotationParametersFields = () => {
<p> <p>
For more information, please refer to the{" "} For more information, please refer to the{" "}
<a <a
className="font-medium text-primary-500 underline hover:text-primary-600" className="text-primary-500 hover:text-primary-600 font-medium underline"
href="https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/" href="https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
@@ -61,10 +61,10 @@ export const RedisCredentialsRotationParametersFields = () => {
</div> </div>
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Password Requirements</span> <span className="text-mineshaft-300 text-sm">Password Requirements</span>
</div> </div>
<div className="grid grid-cols-2 gap-x-3 gap-y-1 rounded-sm border border-mineshaft-600 bg-mineshaft-700 px-3 pt-3"> <div className="border-mineshaft-600 bg-mineshaft-700 grid grid-cols-2 gap-x-3 gap-y-1 rounded-sm border px-3 pt-3">
<Controller <Controller
control={control} control={control}
name="parameters.passwordRequirements.length" name="parameters.passwordRequirements.length"
@@ -33,7 +33,7 @@ export const SecretRotationV2ParametersFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Configure the required parameters for this Secret Rotation. Configure the required parameters for this Secret Rotation.
</p> </p>
<Component /> <Component />
@@ -62,19 +62,19 @@ export const SqlCredentialsRotationParametersFields = () => {
name="parameters.username2" name="parameters.username2"
/> />
<NoticeBannerV2 title="Example Create User Statement"> <NoticeBannerV2 title="Example Create User Statement">
<p className="mb-3 text-sm text-mineshaft-300"> <p className="text-mineshaft-300 mb-3 text-sm">
Infisical requires two database users to be created for rotation. Infisical requires two database users to be created for rotation.
</p> </p>
<p className="mb-3 text-sm text-mineshaft-300"> <p className="text-mineshaft-300 mb-3 text-sm">
These users are intended to be solely managed by Infisical. Altering their login after These users are intended to be solely managed by Infisical. Altering their login after
rotation may cause unexpected failure. rotation may cause unexpected failure.
</p> </p>
<p className="mb-3 text-sm text-mineshaft-300"> <p className="text-mineshaft-300 mb-3 text-sm">
Below is an example statement for creating the required users. You may need to modify it Below is an example statement for creating the required users. You may need to modify it
to suit your needs. to suit your needs.
</p> </p>
<p className="mb-3 text-sm"> <p className="mb-3 text-sm">
<pre className="max-h-40 overflow-y-auto rounded-sm border border-mineshaft-700 bg-mineshaft-800 p-2 whitespace-pre-wrap text-mineshaft-300"> <pre className="border-mineshaft-700 bg-mineshaft-800 text-mineshaft-300 max-h-40 overflow-y-auto whitespace-pre-wrap rounded-sm border p-2">
{rotationOption!.template.createUserStatement} {rotationOption!.template.createUserStatement}
</pre> </pre>
</p> </p>
@@ -46,8 +46,8 @@ export const SecretRotationV2ReviewFields = () => {
return ( return (
<div className="mb-4 flex flex-col gap-6"> <div className="mb-4 flex flex-col gap-6">
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Configuration</span> <span className="text-mineshaft-300 text-sm">Configuration</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Connection">{connection.name}</GenericFieldLabel> <GenericFieldLabel label="Connection">{connection.name}</GenericFieldLabel>
@@ -63,8 +63,8 @@ export const SecretRotationV2ReviewFields = () => {
</div> </div>
<Component /> <Component />
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Details</span> <span className="text-mineshaft-300 text-sm">Details</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Name">{name}</GenericFieldLabel> <GenericFieldLabel label="Name">{name}</GenericFieldLabel>
@@ -8,8 +8,8 @@ type Props = {
export const SecretRotationReviewSection = ({ label, children }: Props) => { export const SecretRotationReviewSection = ({ label, children }: Props) => {
return ( return (
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">{label}</span> <span className="text-mineshaft-300 text-sm">{label}</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2">{children}</div> <div className="flex flex-wrap gap-x-8 gap-y-2">{children}</div>
</div> </div>
@@ -33,7 +33,7 @@ export const SecretRotationV2SecretsMappingFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Map the rotated credentials to secrets in your Infisical project. Map the rotated credentials to secrets in your Infisical project.
</p> </p>
<Component /> <Component />
@@ -32,13 +32,13 @@ export const SecretsMappingTable = ({ items }: Props) => {
<tr key={name}> <tr key={name}>
<td className="whitespace-nowrap"> <td className="whitespace-nowrap">
<div className="mb-4 flex h-full items-start justify-center"> <div className="mb-4 flex h-full items-start justify-center">
<Badge className="pointer-events-none flex h-[36px] w-full items-center justify-center gap-1.5 border border-mineshaft-600 bg-mineshaft-600 whitespace-nowrap text-bunker-200"> <Badge className="border-mineshaft-600 bg-mineshaft-600 text-bunker-200 pointer-events-none flex h-[36px] w-full items-center justify-center gap-1.5 whitespace-nowrap border">
<FontAwesomeIcon icon={faKey} /> <FontAwesomeIcon icon={faKey} />
<span>{name}</span> <span>{name}</span>
</Badge> </Badge>
</div> </div>
</td> </td>
<td className="pr-5 pl-5 whitespace-nowrap"> <td className="whitespace-nowrap pl-5 pr-5">
<div className="mb-4 flex items-center justify-center"> <div className="mb-4 flex items-center justify-center">
<FontAwesomeIcon className="text-mineshaft-400" icon={faArrowRight} /> <FontAwesomeIcon className="text-mineshaft-400" icon={faArrowRight} />
</div> </div>
@@ -108,7 +108,7 @@ export const CreateSecretScanningDataSourceModal = ({ onOpenChange, isOpen, ...p
selectedDataSource ? ( selectedDataSource ? (
<SecretScanningDataSourceModalHeader isConfigured={false} type={selectedDataSource} /> <SecretScanningDataSourceModalHeader isConfigured={false} type={selectedDataSource} />
) : ( ) : (
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
Add Data Source Add Data Source
<a <a
target="_blank" target="_blank"
@@ -116,8 +116,8 @@ export const CreateSecretScanningDataSourceModal = ({ onOpenChange, isOpen, ...p
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -58,7 +58,7 @@ export const DeleteSecretScanningDataSourceModal = ({
deleteKey={name} deleteKey={name}
onDeleteApproved={handleDeleteDataSource} onDeleteApproved={handleDeleteDataSource}
> >
<p className="mt-1 font-inter text-sm text-mineshaft-400"> <p className="font-inter text-mineshaft-400 mt-1 text-sm">
Findings associated with this data source will be preserved. Findings associated with this data source will be preserved.
</p> </p>
</DeleteActionModal> </DeleteActionModal>
@@ -17,10 +17,10 @@ export const SecretScanningDataSourceModalHeader = ({ type, isConfigured }: Prop
<img <img
alt={`${dataSourceDetails.name} logo`} alt={`${dataSourceDetails.name} logo`}
src={`/images/integrations/${dataSourceDetails.image}`} src={`/images/integrations/${dataSourceDetails.image}`}
className="h-12 rounded-md bg-bunker-500 p-2" className="bg-bunker-500 h-12 rounded-md p-2"
/> />
<div> <div>
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
{dataSourceDetails.name} Data Source {dataSourceDetails.name} Data Source
<a <a
target="_blank" target="_blank"
@@ -28,8 +28,8 @@ export const SecretScanningDataSourceModalHeader = ({ type, isConfigured }: Prop
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -38,7 +38,7 @@ export const SecretScanningDataSourceModalHeader = ({ type, isConfigured }: Prop
</div> </div>
</a> </a>
</div> </div>
<p className="text-sm leading-4 text-mineshaft-400"> <p className="text-mineshaft-400 text-sm leading-4">
{isConfigured ? "Edit" : "Connect a"} {dataSourceDetails.name} Data Source {isConfigured ? "Edit" : "Connect a"} {dataSourceDetails.name} Data Source
</p> </p>
</div> </div>
@@ -19,7 +19,7 @@ export const SecretScanningDataSourceSelect = ({ onSelect }: Props) => {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
<Spinner size="lg" className="text-mineshaft-500" /> <Spinner size="lg" className="text-mineshaft-500" />
<p className="mt-4 text-sm text-mineshaft-400">Loading options...</p> <p className="text-mineshaft-400 mt-4 text-sm">Loading options...</p>
</div> </div>
); );
} }
@@ -34,7 +34,7 @@ export const SecretScanningDataSourceSelect = ({ onSelect }: Props) => {
type="button" type="button"
key={type} key={type}
onClick={() => onSelect(type)} onClick={() => onSelect(type)}
className="group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600" className="border-mineshaft-600 bg-mineshaft-700 hover:bg-mineshaft-600 group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border p-4 duration-200"
> >
<img <img
src={`/images/integrations/${image}`} src={`/images/integrations/${image}`}
@@ -59,7 +59,7 @@ export const SecretScanningDataSourceSelect = ({ onSelect }: Props) => {
service you're looking for,`}{" "} service you're looking for,`}{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://infisical.com/slack" href="https://infisical.com/slack"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -68,7 +68,7 @@ export const SecretScanningDataSourceSelect = ({ onSelect }: Props) => {
or{" "} or{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://github.com/Infisical/infisical/discussions" href="https://github.com/Infisical/infisical/discussions"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -79,7 +79,7 @@ export const SecretScanningDataSourceSelect = ({ onSelect }: Props) => {
</> </>
} }
> >
<div className="group relative flex h-28 flex-col items-center justify-center rounded-md border border-dashed border-mineshaft-600 bg-mineshaft-800 p-4 hover:bg-mineshaft-900/50"> <div className="border-mineshaft-600 bg-mineshaft-800 hover:bg-mineshaft-900/50 group relative flex h-28 flex-col items-center justify-center rounded-md border border-dashed p-4">
<FontAwesomeIcon className="mt-auto text-3xl" icon={faWrench} /> <FontAwesomeIcon className="mt-auto text-3xl" icon={faWrench} />
<div className="mt-auto max-w-xs text-center text-xs font-medium text-gray-300 duration-200 group-hover:text-gray-200"> <div className="mt-auto max-w-xs text-center text-xs font-medium text-gray-300 duration-200 group-hover:text-gray-200">
Coming Soon Coming Soon
@@ -34,17 +34,17 @@ export const SecretScanningScanStatusBadge = ({
position="left" position="left"
className="max-w-sm select-text" className="max-w-sm select-text"
content={ content={
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs">Failure Reason</div> <div className="text-xs">Failure Reason</div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs break-words"> <div className="bg-mineshaft-600 break-words rounded-sm p-2 text-xs">
{errorMessage} {errorMessage}
</div> </div>
{scannedAt && ( {scannedAt && (
<div className="mt-1 text-xs text-mineshaft-400"> <div className="text-mineshaft-400 mt-1 text-xs">
Attempted {formatDistance(new Date(scannedAt), new Date(), { addSuffix: true })} Attempted {formatDistance(new Date(scannedAt), new Date(), { addSuffix: true })}
</div> </div>
)} )}
@@ -110,7 +110,7 @@ export const BitbucketDataSourceConfigFields = () => {
onValueChange={(val) => { onValueChange={(val) => {
setValue("config.includeRepos", val === ScanMethod.AllRepositories ? ["*"] : []); setValue("config.includeRepos", val === ScanMethod.AllRepositories ? ["*"] : []);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
isDisabled={!connectionId} isDisabled={!connectionId}
@@ -61,7 +61,7 @@ export const GitHubDataSourceConfigFields = () => {
onValueChange={(val) => { onValueChange={(val) => {
setValue("config.includeRepos", val === ScanMethod.AllRepositories ? ["*"] : []); setValue("config.includeRepos", val === ScanMethod.AllRepositories ? ["*"] : []);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
isDisabled={!connectionId} isDisabled={!connectionId}
@@ -85,13 +85,13 @@ export const GitLabDataSourceConfigFields = () => {
<ul className="flex list-disc flex-col gap-3 pl-4"> <ul className="flex list-disc flex-col gap-3 pl-4">
<li> <li>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">Project</span>: Scan an <span className="text-bunker-200 font-medium">Project</span>: Scan an
individual GitLab project. individual GitLab project.
</p> </p>
</li> </li>
<li> <li>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">Group</span>: Scan one or more <span className="text-bunker-200 font-medium">Group</span>: Scan one or more
projects belonging to a GitLab group. projects belonging to a GitLab group.
</p> </p>
</li> </li>
@@ -105,7 +105,7 @@ export const GitLabDataSourceConfigFields = () => {
onChange(v); onChange(v);
clearAllFields(); clearAllFields();
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
isDisabled={isUpdate} isDisabled={isUpdate}
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -207,7 +207,7 @@ export const GitLabDataSourceConfigFields = () => {
onValueChange={(val) => { onValueChange={(val) => {
setValue("config.includeProjects", val === ScanMethod.AllProjects ? ["*"] : []); setValue("config.includeProjects", val === ScanMethod.AllProjects ? ["*"] : []);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
isDisabled={!connectionId} isDisabled={!connectionId}
@@ -25,7 +25,7 @@ export const SecretScanningDataSourceConfigFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300">Connect and configure your Data Source.</p> <p className="text-bunker-300 mb-4 text-sm">Connect and configure your Data Source.</p>
<Component /> <Component />
<Controller <Controller
control={control} control={control}
@@ -42,7 +42,7 @@ export const SecretScanningDataSourceConfigFields = () => {
errorText={error?.message} errorText={error?.message}
> >
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id="auto-scan-enabled" id="auto-scan-enabled"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -106,7 +106,7 @@ export const SecretScanningDataSourceConnectionField = ({
name="connection" name="connection"
/> />
{!isUpdate && !isPending && !availableConnections?.length && !canCreateConnection && ( {!isUpdate && !isPending && !availableConnections?.length && !canCreateConnection && (
<p className="-mt-2.5 mb-2.5 text-xs text-yellow"> <p className="text-yellow -mt-2.5 mb-2.5 text-xs">
<FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} /> <FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} />
You do not have access to any {connectionName} Connections. Contact an admin to create You do not have access to any {connectionName} Connections. Contact an admin to create
one. one.
@@ -9,7 +9,7 @@ export const SecretScanningDataSourceDetailsFields = () => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Provide a name and description for this Data Source. Provide a name and description for this Data Source.
</p> </p>
<Controller <Controller
@@ -136,7 +136,7 @@ export const SecretScanningDataSourceForm = ({
<form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}> <form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}>
<FormProvider {...formMethods}> <FormProvider {...formMethods}>
<Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}> <Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}>
<Tab.List className="-pb-1 mb-6 w-full border-b-2 border-mineshaft-600"> <Tab.List className="-pb-1 border-mineshaft-600 mb-6 w-full border-b-2">
{FORM_TABS.map((tab, index) => ( {FORM_TABS.map((tab, index) => (
<Tab <Tab
onClick={async (e) => { onClick={async (e) => {
@@ -145,9 +145,9 @@ export const SecretScanningDataSourceForm = ({
setSelectedTabIndex((prev) => (isEnabled ? index : prev)); setSelectedTabIndex((prev) => (isEnabled ? index : prev));
}} }}
className={({ selected }) => className={({ selected }) =>
`-mb-[0.14rem] w-30 ${index > selectedTabIndex ? "opacity-30" : ""} px-4 py-2 text-sm font-medium outline-hidden disabled:opacity-60 ${ `-mb-[0.14rem] whitespace-nowrap ${index > selectedTabIndex ? "opacity-30" : ""} outline-hidden px-4 py-2 text-sm font-medium disabled:opacity-60 ${
selected selected
? "border-b-2 border-mineshaft-300 text-mineshaft-200" ? "border-mineshaft-300 text-mineshaft-200 border-b-2"
: "text-bunker-300" : "text-bunker-300"
}` }`
} }
@@ -25,8 +25,8 @@ export const SecretScanningDataSourceReviewFields = () => {
<div className="mb-4 flex flex-col gap-6"> <div className="mb-4 flex flex-col gap-6">
<Component /> <Component />
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Details</span> <span className="text-mineshaft-300 text-sm">Details</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2"> <div className="flex flex-wrap gap-x-8 gap-y-2">
<GenericFieldLabel label="Name">{name}</GenericFieldLabel> <GenericFieldLabel label="Name">{name}</GenericFieldLabel>
@@ -7,8 +7,8 @@ type Props = {
export const SecretScanningDataSourceConfigReviewSection = ({ children }: Props) => { export const SecretScanningDataSourceConfigReviewSection = ({ children }: Props) => {
return ( return (
<div className="flex flex-col gap-3"> <div className="flex flex-col gap-3">
<div className="w-full border-b border-mineshaft-600"> <div className="border-mineshaft-600 w-full border-b">
<span className="text-sm text-mineshaft-300">Configuration</span> <span className="text-mineshaft-300 text-sm">Configuration</span>
</div> </div>
<div className="flex flex-wrap gap-x-8 gap-y-2">{children}</div> <div className="flex flex-wrap gap-x-8 gap-y-2">{children}</div>
</div> </div>
@@ -58,7 +58,7 @@ export const DeleteSecretSyncModal = ({ isOpen, onOpenChange, secretSync, onComp
> >
<Switch <Switch
containerClassName="mt-4" containerClassName="mt-4"
className="bg-mineshaft-400/50 shadow-inner data-[state=checked]:bg-red/50" className="bg-mineshaft-400/50 data-[state=checked]:bg-red/50 shadow-inner"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
isChecked={removeSecrets} isChecked={removeSecrets}
onCheckedChange={setRemoveSecrets} onCheckedChange={setRemoveSecrets}
@@ -77,7 +77,7 @@ const Content = ({ secretSync, onComplete }: ContentProps) => {
return ( return (
<form onSubmit={handleSubmit(handleTriggerImportSecrets)}> <form onSubmit={handleSubmit(handleTriggerImportSecrets)}>
<p className="mb-8 text-sm text-mineshaft-200"> <p className="text-mineshaft-200 mb-8 text-sm">
Are you sure you want to import secrets from this {destinationName} destination into Are you sure you want to import secrets from this {destinationName} destination into
Infiscal? Infiscal?
</p> </p>
@@ -100,7 +100,7 @@ const Content = ({ secretSync, onComplete }: ContentProps) => {
return ( return (
<li key={name}> <li key={name}>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">{name}</span>: {description} <span className="text-bunker-200 font-medium">{name}</span>: {description}
</p> </p>
</li> </li>
); );
@@ -115,7 +115,7 @@ const Content = ({ secretSync, onComplete }: ContentProps) => {
<Select <Select
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => onChange(val)}
className="w-full border border-mineshaft-500" className="border-mineshaft-500 w-full border"
position="popper" position="popper"
placeholder="Select an option..." placeholder="Select an option..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -69,16 +69,16 @@ export const SecretSyncImportStatusBadge = ({ secretSync, className, mini }: Pro
label = "Failed to Import Secrets"; label = "Failed to Import Secrets";
icon = faTriangleExclamation; icon = faTriangleExclamation;
tooltipContent = ( tooltipContent = (
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
{failureMessage && ( {failureMessage && (
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs"> <div className="text-xs">
{mini ? "Failed to Import Secrets" : "Failure Reason"} {mini ? "Failed to Import Secrets" : "Failure Reason"}
</div> </div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs">{failureMessage}</div> <div className="bg-mineshaft-600 rounded-sm p-2 text-xs">{failureMessage}</div>
</div> </div>
)} )}
</div> </div>
@@ -17,10 +17,10 @@ export const SecretSyncModalHeader = ({ destination, isConfigured }: Props) => {
<img <img
alt={`${destinationDetails.name} logo`} alt={`${destinationDetails.name} logo`}
src={`/images/integrations/${destinationDetails.image}`} src={`/images/integrations/${destinationDetails.image}`}
className="h-12 w-12 rounded-md bg-bunker-500 p-2" className="bg-bunker-500 h-12 w-12 rounded-md p-2"
/> />
<div> <div>
<div className="flex items-center text-mineshaft-300"> <div className="text-mineshaft-300 flex items-center">
{destinationDetails.name} Sync {destinationDetails.name} Sync
<a <a
target="_blank" target="_blank"
@@ -28,8 +28,8 @@ export const SecretSyncModalHeader = ({ destination, isConfigured }: Props) => {
className="mb-1 ml-1" className="mb-1 ml-1"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
<div className="inline-block rounded-md bg-yellow/20 px-1.5 text-sm text-yellow opacity-80 hover:opacity-100"> <div className="bg-yellow/20 text-yellow inline-block rounded-md px-1.5 text-sm opacity-80 hover:opacity-100">
<FontAwesomeIcon icon={faBookOpen} className="mr-1 mb-[0.03rem] text-[12px]" /> <FontAwesomeIcon icon={faBookOpen} className="mb-[0.03rem] mr-1 text-[12px]" />
<span>Docs</span> <span>Docs</span>
<FontAwesomeIcon <FontAwesomeIcon
icon={faArrowUpRightFromSquare} icon={faArrowUpRightFromSquare}
@@ -38,7 +38,7 @@ export const SecretSyncModalHeader = ({ destination, isConfigured }: Props) => {
</div> </div>
</a> </a>
</div> </div>
<p className="text-sm leading-4 text-mineshaft-400"> <p className="text-mineshaft-400 text-sm leading-4">
{isConfigured {isConfigured
? `Edit ${destinationDetails.name} Sync` ? `Edit ${destinationDetails.name} Sync`
: `Sync secrets to ${destinationDetails.name}`} : `Sync secrets to ${destinationDetails.name}`}
@@ -46,7 +46,7 @@ const Content = ({ secretSync, onComplete }: ContentProps) => {
return ( return (
<> <>
<p className="mb-8 text-sm text-mineshaft-200"> <p className="text-mineshaft-200 mb-8 text-sm">
Are you sure you want to remove synced secrets from this {destinationName} destination? Are you sure you want to remove synced secrets from this {destinationName} destination?
</p> </p>
<div className="mt-8 flex w-full items-center justify-between gap-2"> <div className="mt-8 flex w-full items-center justify-between gap-2">
@@ -69,16 +69,16 @@ export const SecretSyncRemoveStatusBadge = ({ secretSync, className, mini }: Pro
label = "Failed to Remove Secrets"; label = "Failed to Remove Secrets";
icon = faTriangleExclamation; icon = faTriangleExclamation;
tooltipContent = ( tooltipContent = (
<div className="flex flex-col gap-2 py-1 whitespace-normal"> <div className="flex flex-col gap-2 whitespace-normal py-1">
{failureMessage && ( {failureMessage && (
<div> <div>
<div className="mb-2 flex self-start text-red"> <div className="text-red mb-2 flex self-start">
<FontAwesomeIcon icon={faXmark} className="ml-1 pt-0.5 pr-1.5 text-sm" /> <FontAwesomeIcon icon={faXmark} className="ml-1 pr-1.5 pt-0.5 text-sm" />
<div className="text-xs"> <div className="text-xs">
{mini ? "Failed to Remove Secrets" : "Failure Reason"} {mini ? "Failed to Remove Secrets" : "Failure Reason"}
</div> </div>
</div> </div>
<div className="rounded-sm bg-mineshaft-600 p-2 text-xs">{failureMessage}</div> <div className="bg-mineshaft-600 rounded-sm p-2 text-xs">{failureMessage}</div>
</div> </div>
)} )}
</div> </div>
@@ -44,7 +44,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
<Spinner size="lg" className="text-mineshaft-500" /> <Spinner size="lg" className="text-mineshaft-500" />
<p className="mt-4 text-sm text-mineshaft-400">Loading options...</p> <p className="text-mineshaft-400 mt-4 text-sm">Loading options...</p>
</div> </div>
); );
} }
@@ -58,7 +58,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
placeholder="Search options..." placeholder="Search options..."
className="bg-mineshaft-800 placeholder:text-mineshaft-400" className="bg-mineshaft-800 placeholder:text-mineshaft-400"
/> />
<div className="grid h-118 grid-cols-4 content-start gap-2"> <div className="h-118 grid grid-cols-4 content-start gap-2">
{filteredOptions.slice(offset, perPage * page)?.map(({ destination, enterprise }) => { {filteredOptions.slice(offset, perPage * page)?.map(({ destination, enterprise }) => {
const { image, name } = SECRET_SYNC_MAP[destination]; const { image, name } = SECRET_SYNC_MAP[destination];
return ( return (
@@ -70,7 +70,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
? handlePopUpOpen("upgradePlan") ? handlePopUpOpen("upgradePlan")
: onSelect(destination) : onSelect(destination)
} }
className="group relative flex h-28 cursor-pointer flex-col items-center justify-center overflow-hidden rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600" className="border-mineshaft-600 bg-mineshaft-700 hover:bg-mineshaft-600 group relative flex h-28 cursor-pointer flex-col items-center justify-center overflow-hidden rounded-md border p-4 duration-200"
> >
<img <img
src={`/images/integrations/${image}`} src={`/images/integrations/${image}`}
@@ -107,7 +107,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
service you're looking for,`}{" "} service you're looking for,`}{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://infisical.com/slack" href="https://infisical.com/slack"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -116,7 +116,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
or{" "} or{" "}
<a <a
target="_blank" target="_blank"
className="underline hover:text-mineshaft-300" className="hover:text-mineshaft-300 underline"
href="https://github.com/Infisical/infisical/discussions" href="https://github.com/Infisical/infisical/discussions"
rel="noopener noreferrer" rel="noopener noreferrer"
> >
@@ -127,7 +127,7 @@ export const SecretSyncSelect = ({ onSelect }: Props) => {
</> </>
} }
> >
<div className="-ml-3 flex items-center gap-1.5 text-mineshaft-400"> <div className="text-mineshaft-400 -ml-3 flex items-center gap-1.5">
<span className="text-xs"> <span className="text-xs">
Don&#39;t see the third-party service you&#39;re looking for? Don&#39;t see the third-party service you&#39;re looking for?
</span> </span>
@@ -138,12 +138,12 @@ export const CreateSecretSyncForm = ({
if (showConfirmation) if (showConfirmation)
return ( return (
<> <>
<div className="flex flex-col rounded-xs border border-l-2 border-mineshaft-600 border-l-primary bg-mineshaft-700/80 px-4 py-3"> <div className="rounded-xs border-mineshaft-600 border-l-primary bg-mineshaft-700/80 flex flex-col border border-l-2 px-4 py-3">
<div className="mb-1 flex items-center text-sm"> <div className="mb-1 flex items-center text-sm">
<FontAwesomeIcon icon={faInfoCircle} size="sm" className="mr-1.5 text-primary" /> <FontAwesomeIcon icon={faInfoCircle} size="sm" className="text-primary mr-1.5" />
Secret Sync Behavior Secret Sync Behavior
</div> </div>
<p className="mt-1 text-sm text-bunker-200"> <p className="text-bunker-200 mt-1 text-sm">
Secret Syncs are the source of truth for connected third-party services. Any secret, Secret Syncs are the source of truth for connected third-party services. Any secret,
including associated data, not present or imported in Infisical before syncing will be including associated data, not present or imported in Infisical before syncing will be
overwritten, and changes made directly in the connected service outside of infisical may overwritten, and changes made directly in the connected service outside of infisical may
@@ -176,7 +176,7 @@ export const CreateSecretSyncForm = ({
<form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}> <form className={twMerge(isFinalStep && "max-h-[70vh] overflow-y-auto")}>
<FormProvider {...formMethods}> <FormProvider {...formMethods}>
<Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}> <Tab.Group selectedIndex={selectedTabIndex} onChange={setSelectedTabIndex}>
<Tab.List className="-pb-1 mb-6 w-full border-b-2 border-mineshaft-600"> <Tab.List className="-pb-1 border-mineshaft-600 mb-6 w-full border-b-2">
{FORM_TABS.map((tab, index) => ( {FORM_TABS.map((tab, index) => (
<Tab <Tab
onClick={async (e) => { onClick={async (e) => {
@@ -185,9 +185,9 @@ export const CreateSecretSyncForm = ({
setSelectedTabIndex((prev) => (isEnabled ? index : prev)); setSelectedTabIndex((prev) => (isEnabled ? index : prev));
}} }}
className={({ selected }) => className={({ selected }) =>
`-mb-[0.14rem] w-30 ${index > selectedTabIndex ? "opacity-30" : ""} px-4 py-2 text-sm font-medium outline-hidden disabled:opacity-60 ${ `-mb-[0.14rem] whitespace-nowrap ${index > selectedTabIndex ? "opacity-30" : ""} outline-hidden px-4 py-2 text-sm font-medium disabled:opacity-60 ${
selected selected
? "border-b-2 border-mineshaft-300 text-mineshaft-200" ? "border-mineshaft-300 text-mineshaft-200 border-b-2"
: "text-bunker-300" : "text-bunker-300"
}` }`
} }
@@ -221,7 +221,7 @@ export const CreateSecretSyncForm = ({
errorText={error?.message} errorText={error?.message}
> >
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id="auto-sync-enabled" id="auto-sync-enabled"
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -24,9 +24,9 @@ export const DuplicateDestinationConfirmationModal = ({
destination. Proceeding may cause conflicts or overwrite existing data. destination. Proceeding may cause conflicts or overwrite existing data.
</p> </p>
{duplicateProjectId && ( {duplicateProjectId && (
<p className="mt-2 text-xs text-mineshaft-400"> <p className="text-mineshaft-400 mt-2 text-xs">
Duplicate found in project ID:{" "} Duplicate found in project ID:{" "}
<code className="rounded-sm bg-mineshaft-600 px-1 py-0.5 text-mineshaft-200"> <code className="bg-mineshaft-600 text-mineshaft-200 rounded-sm px-1 py-0.5">
{duplicateProjectId} {duplicateProjectId}
</code> </code>
</p> </p>
@@ -46,7 +46,7 @@ export const SecretSyncConnectionField = ({ onChange: callback }: Props) => {
return ( return (
<> <>
<p className="mb-4 text-sm text-bunker-300"> <p className="text-bunker-300 mb-4 text-sm">
Specify the {appName} Connection to use to connect to {connectionName} and configure Specify the {appName} Connection to use to connect to {connectionName} and configure
destination parameters. destination parameters.
</p> </p>
@@ -89,7 +89,7 @@ export const SecretSyncConnectionField = ({ onChange: callback }: Props) => {
name="connection" name="connection"
/> />
{!isPending && !availableConnections?.length && !canCreateConnection && ( {!isPending && !availableConnections?.length && !canCreateConnection && (
<p className="-mt-2.5 mb-2.5 text-xs text-yellow"> <p className="text-yellow -mt-2.5 mb-2.5 text-xs">
<FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} /> <FontAwesomeIcon className="mr-1" size="xs" icon={faInfoCircle} />
You do not have access to any {appName} Connections. Contact an admin to create one. You do not have access to any {appName} Connections. Contact an admin to create one.
</p> </p>
@@ -38,15 +38,15 @@ export const AwsParameterStoreSyncFields = () => {
<> <>
The path is required and will be prepended to the key schema. For example, if you The path is required and will be prepended to the key schema. For example, if you
have a path of{" "} have a path of{" "}
<code className="rounded-sm bg-mineshaft-600 px-0.5 py-px text-sm text-mineshaft-300"> <code className="bg-mineshaft-600 text-mineshaft-300 rounded-sm px-0.5 py-px text-sm">
/demo/path/ /demo/path/
</code>{" "} </code>{" "}
and a key schema of{" "} and a key schema of{" "}
<code className="rounded-sm bg-mineshaft-600 px-0.5 py-px text-sm text-mineshaft-300"> <code className="bg-mineshaft-600 text-mineshaft-300 rounded-sm px-0.5 py-px text-sm">
INFISICAL_{"{{secretKey}}"} INFISICAL_{"{{secretKey}}"}
</code> </code>
, then the result will be{" "} , then the result will be{" "}
<code className="rounded-sm bg-mineshaft-600 px-0.5 py-px text-sm text-mineshaft-300"> <code className="bg-mineshaft-600 text-mineshaft-300 rounded-sm px-0.5 py-px text-sm">
/demo/path/INFISICAL_{"{{secretKey}}"} /demo/path/INFISICAL_{"{{secretKey}}"}
</code> </code>
</> </>
@@ -40,13 +40,13 @@ export const AwsSecretsManagerSyncFields = () => {
<ul className="flex list-disc flex-col gap-3 pl-4"> <ul className="flex list-disc flex-col gap-3 pl-4">
<li> <li>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">One-To-One</span>: Each <span className="text-bunker-200 font-medium">One-To-One</span>: Each
Infisical secret will be mapped to a separate AWS Secrets Manager secret. Infisical secret will be mapped to a separate AWS Secrets Manager secret.
</p> </p>
</li> </li>
<li> <li>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">Many-To-One</span>: All <span className="text-bunker-200 font-medium">Many-To-One</span>: All
Infisical secrets will be mapped to a single AWS Secrets Manager secret. Infisical secrets will be mapped to a single AWS Secrets Manager secret.
</p> </p>
</li> </li>
@@ -63,7 +63,7 @@ export const AwsSecretsManagerSyncFields = () => {
onChange(val); onChange(val);
setValue("syncOptions.syncSecretMetadataAsTags", false); setValue("syncOptions.syncSecretMetadataAsTags", false);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select an option..." placeholder="Select an option..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -76,7 +76,7 @@ export const CloudflarePagesSyncFields = () => {
<Select <Select
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => onChange(val)}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select an environment..." placeholder="Select an environment..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -119,7 +119,7 @@ export const GcpSyncFields = () => {
return ( return (
<li key={name}> <li key={name}>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">{name}</span>: {description} <span className="text-bunker-200 font-medium">{name}</span>: {description}
</p> </p>
</li> </li>
); );
@@ -133,7 +133,7 @@ export const GcpSyncFields = () => {
<Select <Select
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => onChange(val)}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
isDisabled={!projectId} isDisabled={!projectId}
@@ -79,7 +79,7 @@ export const GitHubSyncFields = () => {
onValueChange={(val) => { onValueChange={(val) => {
onChange(val); onChange(val);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select a scope..." placeholder="Select a scope..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -131,7 +131,7 @@ export const GitHubSyncFields = () => {
onChange(val); onChange(val);
setValue("destinationConfig.selectedRepositoryIds", undefined); setValue("destinationConfig.selectedRepositoryIds", undefined);
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select visibility..." placeholder="Select visibility..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -41,7 +41,7 @@ const SecretProtectionOption = ({
}) => { }) => {
return ( return (
<Switch <Switch
className="bg-mineshaft-400/80 shadow-inner data-[state=checked]:bg-green/80" className="bg-mineshaft-400/80 data-[state=checked]:bg-green/80 shadow-inner"
id={id} id={id}
thumbClassName="bg-mineshaft-800" thumbClassName="bg-mineshaft-800"
onCheckedChange={onChange} onCheckedChange={onChange}
@@ -108,7 +108,7 @@ export const GitLabSyncFields = () => {
setValue("destinationConfig.groupId", ""); setValue("destinationConfig.groupId", "");
setValue("destinationConfig.groupName", ""); setValue("destinationConfig.groupName", "");
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select a scope..." placeholder="Select a scope..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -135,7 +135,7 @@ export const HumanitecSyncFields = () => {
return ( return (
<li key={name}> <li key={name}>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">{name}</span>: {description} <span className="text-bunker-200 font-medium">{name}</span>: {description}
</p> </p>
</li> </li>
); );
@@ -150,7 +150,7 @@ export const HumanitecSyncFields = () => {
onChange(val); onChange(val);
setValue("destinationConfig.env", ""); setValue("destinationConfig.env", "");
}} }}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select a scope..." placeholder="Select a scope..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -66,7 +66,7 @@ export const RenderSyncFields = () => {
return ( return (
<li key={name}> <li key={name}>
<p className="text-mineshaft-300"> <p className="text-mineshaft-300">
<span className="font-medium text-bunker-200">{name}</span>: {description} <span className="text-bunker-200 font-medium">{name}</span>: {description}
</p> </p>
</li> </li>
); );
@@ -78,7 +78,7 @@ export const RenderSyncFields = () => {
<Select <Select
value={value} value={value}
onValueChange={(val) => onChange(val)} onValueChange={(val) => onChange(val)}
className="w-full border border-mineshaft-500 capitalize" className="border-mineshaft-500 w-full border capitalize"
position="popper" position="popper"
placeholder="Select a scope..." placeholder="Select a scope..."
dropdownContainerClassName="max-w-none" dropdownContainerClassName="max-w-none"
@@ -120,7 +120,7 @@ export const TeamCitySyncFields = () => {
)} )}
/> />
<span className="text-sm text-bunker-300"> <span className="text-bunker-300 text-sm">
Not selecting a Build Configuration will sync your secrets to the entire project. Not selecting a Build Configuration will sync your secrets to the entire project.
</span> </span>
</> </>

Some files were not shown because too many files have changed in this diff Show More