diff --git a/frontend/app/[team]/access/layout.tsx b/frontend/app/[team]/access/layout.tsx index 57e0d32c9..d7d3e6720 100644 --- a/frontend/app/[team]/access/layout.tsx +++ b/frontend/app/[team]/access/layout.tsx @@ -71,32 +71,35 @@ export default function AccessLayout({ return (

Access

setTabIndex(index)}> - - {tabs.map((tab) => ( - - {({ selected }) => ( - - {tab.name} - - )} - - ))} - + {/* overflow-x-auto lives on the wrapper so the tabs' -mb-px underline isn't clipped */} +
+ + {tabs.map((tab) => ( + + {({ selected }) => ( + + {tab.name} + + )} + + ))} + +
{children}
diff --git a/frontend/app/[team]/access/members/page.tsx b/frontend/app/[team]/access/members/page.tsx index bd98caccf..7e3a54c78 100644 --- a/frontend/app/[team]/access/members/page.tsx +++ b/frontend/app/[team]/access/members/page.tsx @@ -94,7 +94,7 @@ export default function Members({ params }: { params: { team: string } }) {

Manage organisation members.

-
+
@@ -126,6 +126,7 @@ export default function Members({ params }: { params: { team: string } }) { membersLoading && !membersData ? ( ) : ( +
@@ -212,6 +213,7 @@ export default function Members({ params }: { params: { team: string } }) { ))}
+
) ) : ( 0 ? ( - +
+
))} -
@@ -133,7 +134,8 @@ export default function NetworkPolicies({ params }: { params: { team: string } }
+ +
) : ( 0 ? ( - +
+
))} -
@@ -214,7 +217,8 @@ export default function NetworkPolicies({ params }: { params: { team: string } }
+ +
) : ( Manage service accounts.

-
+
@@ -100,7 +100,8 @@ export default function ServiceAccounts({ params }: { params: { team: string } } ) : ( - +
+
))} -
@@ -166,7 +167,8 @@ export default function ServiceAccounts({ params }: { params: { team: string } }
+ +
) ) : ( {
-
-
-
+
+
+
setSearchQuery(e.target.value)} /> @@ -1002,7 +1002,7 @@ export const AppSecrets = ({ team, app }: { team: string; app: string }) => {
-
+
{unsavedChanges && (
-
+
diff --git a/frontend/app/[team]/apps/[app]/access/layout.tsx b/frontend/app/[team]/apps/[app]/access/layout.tsx index ec4732c9f..2922ce507 100644 --- a/frontend/app/[team]/apps/[app]/access/layout.tsx +++ b/frontend/app/[team]/apps/[app]/access/layout.tsx @@ -52,7 +52,7 @@ export default function AccessLayout({ return (

Access

@@ -60,15 +60,15 @@ export default function AccessLayout({
setTabIndex(index)}> -
- +
+ {tabs.map((tab) => ( {({ selected }) => ( ))} -
{children}
+
{children}
diff --git a/frontend/app/[team]/apps/[app]/access/members/_components/AddMemberDialog.tsx b/frontend/app/[team]/apps/[app]/access/members/_components/AddMemberDialog.tsx index a8714f506..93cc03b1c 100644 --- a/frontend/app/[team]/apps/[app]/access/members/_components/AddMemberDialog.tsx +++ b/frontend/app/[team]/apps/[app]/access/members/_components/AddMemberDialog.tsx @@ -304,7 +304,7 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => { }) return ( - + {({ open }) => ( <> @@ -322,7 +322,7 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => { leaveFrom="transform scale-100 opacity-100" leaveTo="transform scale-95 opacity-0" > - +
@@ -357,7 +357,7 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => { {({ active }) => (
{ @@ -472,7 +472,7 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => {

-
+
Member
@@ -482,9 +482,9 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => {
{selectedMembers.map((member, index) => ( -
+
@@ -499,7 +499,7 @@ export const AddMemberDialog = ({ appId }: { appId: string }) => {
-
+
{userCanReadEnvironments ? ( {userCanReadAppMembers ? (
-
+
@@ -121,7 +121,8 @@ export default function Members({ params }: { params: { team: string; app: strin )}
- +
+
))} -
@@ -186,7 +187,8 @@ export default function Members({ params }: { params: { team: string; app: strin
+ +
) : ( +
{userCanReadTokens ? (
{keyring !== null && ( -
-
+
+
setActivePanel('secrets')} className={clsx( - 'p-4 cursor-pointer border-l rounded-r-lg transition ease -ml-px w-60', + 'p-3 md:p-4 cursor-pointer whitespace-nowrap border-b md:border-b-0 md:border-l rounded-t-lg md:rounded-t-none md:rounded-r-lg transition ease md:-ml-px md:w-60', activePanel === 'secrets' ? 'bg-zinc-300 dark:bg-zinc-800 font-semibold border-emerald-500' : 'bg-zinc-200 dark:bg-zinc-900 hover:font-semibold border-neutral-500/40' @@ -269,7 +269,7 @@ export default function Tokens({ params }: { params: { team: string; app: string role="button" onClick={() => setActivePanel('kms')} className={clsx( - 'p-4 cursor-pointer border-l rounded-r-lg transition ease -ml-px w-60', + 'p-3 md:p-4 cursor-pointer whitespace-nowrap border-b md:border-b-0 md:border-l rounded-t-lg md:rounded-t-none md:rounded-r-lg transition ease md:-ml-px md:w-60', activePanel === 'kms' ? 'bg-zinc-300 dark:bg-zinc-800 font-semibold border-emerald-500' : 'bg-zinc-200 dark:bg-zinc-900 hover:font-semibold border-neutral-500/40' @@ -282,7 +282,7 @@ export default function Tokens({ params }: { params: { team: string; app: string
)}
-
+
{app && activePanel === 'secrets' && ( )} diff --git a/frontend/app/[team]/apps/[app]/environments/[environment]/[[...path]]/page.tsx b/frontend/app/[team]/apps/[app]/environments/[environment]/[[...path]]/page.tsx index 8551f630a..f5c96a194 100644 --- a/frontend/app/[team]/apps/[app]/environments/[environment]/[[...path]]/page.tsx +++ b/frontend/app/[team]/apps/[app]/environments/[environment]/[[...path]]/page.tsx @@ -1209,6 +1209,7 @@ export default function EnvironmentPath({ return ( handleAddSecret(true)} menuContent={
@@ -1259,7 +1260,7 @@ export default function EnvironmentPath({
} > - New Secret + New Secret
) } @@ -1379,15 +1380,15 @@ export default function EnvironmentPath({ filterMenuOpen ? 'z-30' : 'z-5' )} > -
-
-
+
+
+
setSearchQuery(e.target.value)} /> @@ -1415,7 +1416,7 @@ export default function EnvironmentPath({
-
+
{unsavedChanges && ( diff --git a/frontend/app/[team]/apps/[app]/layout.tsx b/frontend/app/[team]/apps/[app]/layout.tsx index 256ee0d27..79a11379c 100644 --- a/frontend/app/[team]/apps/[app]/layout.tsx +++ b/frontend/app/[team]/apps/[app]/layout.tsx @@ -70,16 +70,16 @@ export default function AppLayout({ return (
{loading && (
)} {app && ( -
-
+
+

{app.name}

-
+
{app.id} @@ -92,25 +92,28 @@ export default function AppLayout({ )} setTabIndex(index)}> - - {tabs.map((tab) => ( - - {({ selected }) => ( - - {tab.name} - - )} - - ))} - + {/* overflow-x-auto lives on the wrapper so the tabs' -mb-px underline isn't clipped */} +
+ + {tabs.map((tab) => ( + + {({ selected }) => ( + + {tab.name} + + )} + + ))} + +
{children}
diff --git a/frontend/app/[team]/apps/[app]/logs/page.tsx b/frontend/app/[team]/apps/[app]/logs/page.tsx index 36e54564b..e7c1574d9 100644 --- a/frontend/app/[team]/apps/[app]/logs/page.tsx +++ b/frontend/app/[team]/apps/[app]/logs/page.tsx @@ -34,7 +34,7 @@ export default function Logs({ params }: { params: { team: string; app: string } ) return ( -
+
{organisation?.role!.name!.toLowerCase() === 'owner' ? ( setTabIndex(index)}> diff --git a/frontend/app/[team]/apps/[app]/settings/page.tsx b/frontend/app/[team]/apps/[app]/settings/page.tsx index 839c24552..46605a438 100644 --- a/frontend/app/[team]/apps/[app]/settings/page.tsx +++ b/frontend/app/[team]/apps/[app]/settings/page.tsx @@ -90,9 +90,9 @@ export default function AppSettings({ params }: { params: { team: string; app: s

App

App name and information

-
+
-
+

- {app.id} + {app.id}

diff --git a/frontend/app/[team]/apps/page.tsx b/frontend/app/[team]/apps/page.tsx index d2435542d..f1a28f520 100644 --- a/frontend/app/[team]/apps/page.tsx +++ b/frontend/app/[team]/apps/page.tsx @@ -55,7 +55,7 @@ export default function AppsHome({ params }: { params: { team: string } }) { return (

Apps

diff --git a/frontend/app/[team]/integrations/layout.tsx b/frontend/app/[team]/integrations/layout.tsx index 36f1911ca..5eadd127d 100644 --- a/frontend/app/[team]/integrations/layout.tsx +++ b/frontend/app/[team]/integrations/layout.tsx @@ -67,7 +67,7 @@ export default function AccessLayout({ return (

{params.team} Integrations

diff --git a/frontend/app/[team]/layout.tsx b/frontend/app/[team]/layout.tsx index 27bc5d681..7c2e29fe2 100644 --- a/frontend/app/[team]/layout.tsx +++ b/frontend/app/[team]/layout.tsx @@ -105,16 +105,22 @@ export default function RootLayout({ return (
{showUnlockDialog && } {showNav && } {showNav && } -
+
-
+
{children}
diff --git a/frontend/app/[team]/logs/page.tsx b/frontend/app/[team]/logs/page.tsx index 58f4a2a50..696606c3d 100644 --- a/frontend/app/[team]/logs/page.tsx +++ b/frontend/app/[team]/logs/page.tsx @@ -16,7 +16,7 @@ export default function OrgLogs({ params }: { params: { team: string } }) { ) return ( -
+

Audit Logs

diff --git a/frontend/app/[team]/recovery/page.tsx b/frontend/app/[team]/recovery/page.tsx index 097d77a65..2ac21e039 100644 --- a/frontend/app/[team]/recovery/page.tsx +++ b/frontend/app/[team]/recovery/page.tsx @@ -195,16 +195,16 @@ export default function Recovery({ params }: { params: { team: string } }) { return ( <> -
-
+
+
-
-
-

+
+
+

Account Recovery

-

+

This wizard will help you restore access to your Phase Account. Please enter your recovery phrase below {skipPasswordStep @@ -216,23 +216,25 @@ export default function Recovery({ params }: { params: { team: string } }) {

{org && ( -
-
+
+
{session?.user?.name} - {session?.user?.email} + + {session?.user?.email} +
-
+

{org.name}

diff --git a/frontend/app/[team]/settings/page.tsx b/frontend/app/[team]/settings/page.tsx index af17be6d1..6615ecae0 100644 --- a/frontend/app/[team]/settings/page.tsx +++ b/frontend/app/[team]/settings/page.tsx @@ -138,7 +138,7 @@ export default function Settings({ params }: { params: { team: string } }) {
Public key
- + {activeOrganisation?.identityKey}
diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 8e3dec806..418b60915 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -2,6 +2,18 @@ @tailwind components; @tailwind utilities; +/* Height of the fixed mobile bottom nav; collapses to 0 above the md breakpoint so + layout paddings and viewport-height calcs can reference it unconditionally */ +:root { + --mobile-tabbar-height: calc(3.5rem + env(safe-area-inset-bottom)); +} + +@media (min-width: 768px) { + :root { + --mobile-tabbar-height: 0px; + } +} + :root { --max-width: 1100px; --border-radius: 12px; diff --git a/frontend/app/onboard/page.tsx b/frontend/app/onboard/page.tsx index ff479f09a..43376ef38 100644 --- a/frontend/app/onboard/page.tsx +++ b/frontend/app/onboard/page.tsx @@ -349,9 +349,9 @@ const Onboard = () => { const isSudoPasswordStep = !skipSudoStep && step === 1 return ( -
+
{!licenseActivated() ? ( -
+
{
) : (
-
e.stopPropagation()}> +
e.stopPropagation()}> {id} diff --git a/frontend/components/apps/AppsView.tsx b/frontend/components/apps/AppsView.tsx index 1339f6312..3e10982d2 100644 --- a/frontend/components/apps/AppsView.tsx +++ b/frontend/components/apps/AppsView.tsx @@ -86,15 +86,15 @@ export const AppsView = ({ return (
{!noApps && ( -
-
-
+
+
+
setSearchQuery(e.target.value)} /> diff --git a/frontend/components/auth/UnlockKeyringDialog.tsx b/frontend/components/auth/UnlockKeyringDialog.tsx index 5bfcf9471..03adba2b9 100644 --- a/frontend/components/auth/UnlockKeyringDialog.tsx +++ b/frontend/components/auth/UnlockKeyringDialog.tsx @@ -249,7 +249,7 @@ export default function UnlockKeyringDialog(props: { organisation: OrganisationT leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > - + {!devicePasswordExists && ( @@ -274,9 +274,9 @@ export default function UnlockKeyringDialog(props: { organisation: OrganisationT
-
+
-
+
@@ -285,7 +285,7 @@ export default function UnlockKeyringDialog(props: { organisation: OrganisationT {session?.user?.name} - + {session?.user?.email}
@@ -301,7 +301,7 @@ export default function UnlockKeyringDialog(props: { organisation: OrganisationT
-
+
-
+
-
+
+
+ +
+ + {/* z-10 keeps Headless UI dialogs (also z-10, portaled later in ) painting above the nav */} +
+ aria-label={link.name} + aria-current={link.active ? 'page' : undefined} + title={link.name} + > + {link.icon} + + {link.name === 'Access Control' ? 'Access' : link.name} + + + ))} + -
+ ) } diff --git a/frontend/components/logs/AuditLogs.tsx b/frontend/components/logs/AuditLogs.tsx index dc84eec4a..9bfbc479f 100644 --- a/frontend/components/logs/AuditLogs.tsx +++ b/frontend/components/logs/AuditLogs.tsx @@ -1073,29 +1073,32 @@ export default function AuditLogs() { <> {userCanReadLogs ? (
- {/* Resource type tabs. The backend scopes non-global roles to - their accessible apps/envs and excludes 'stream' events (org- - wide egress config), so that tab would be permanently empty + {/* Resource type tabs. overflow-x-auto lives on the wrapper so the + -mb-px underline isn't clipped. The backend scopes non-global + roles to their accessible apps/envs and excludes 'stream' events + (org-wide egress config), so that tab would be permanently empty for them — hide it. */} -
- {RESOURCE_TABS.filter( - (tab) => - tab.key !== 'stream' || - userHasGlobalAccess(organisation?.role?.permissions) - ).map((tab) => ( - - ))} +
+
+ {RESOURCE_TABS.filter( + (tab) => + tab.key !== 'stream' || + userHasGlobalAccess(organisation?.role?.permissions) + ).map((tab) => ( + + ))} +
{/* Toolbar */} @@ -1137,7 +1140,7 @@ export default function AuditLogs() { > {/* Event types */}
@@ -1366,7 +1369,8 @@ export default function AuditLogs() {
{/* Table */} - +
+
@@ -1417,7 +1421,8 @@ export default function AuditLogs() { -
+ +
) : (
- +
+
@@ -332,7 +333,8 @@ export default function KMSLogs(props: { app: string }) { -
+ +
) } diff --git a/frontend/components/logs/SecretLogs.tsx b/frontend/components/logs/SecretLogs.tsx index 2f683ad4e..cdf3f240c 100644 --- a/frontend/components/logs/SecretLogs.tsx +++ b/frontend/components/logs/SecretLogs.tsx @@ -608,7 +608,7 @@ export default function SecretLogs(props: { app: string }) { > {/* Event types */}
@@ -887,7 +887,8 @@ export default function SecretLogs(props: { app: string }) {
- +
+
@@ -933,7 +934,8 @@ export default function SecretLogs(props: { app: string }) { -
+ +
) : ( { props.mnemonic ? inputs[index] === mnemonicWords[index] : false return ( -
+
{[...Array(inputs.length)].map((n, index) => (
{ readOnly={isCorrect(index) ? true : false} //maxLength={25} className={clsx( - 'font-mono w-full ph-no-capture', + 'font-mono w-full text-sm ph-no-capture', isCorrect(index) && '!bg-emerald-400/20 !text-emerald-500' )} /> diff --git a/frontend/components/onboarding/Stepper.tsx b/frontend/components/onboarding/Stepper.tsx index 954ad635f..058447c3f 100644 --- a/frontend/components/onboarding/Stepper.tsx +++ b/frontend/components/onboarding/Stepper.tsx @@ -18,7 +18,7 @@ export const Stepper = ({ steps, activeStep, align = 'center' }: StepperProps) = const ICON_WRAPPER_BASE = 'rounded-full transition duration-500 ease-in-out h-8 w-8 border text-center flex justify-center items-center text-xs' const LABEL_BASE = - 'absolute top-0 -ml-10 text-center mt-12 w-32 text-2xs font-medium uppercase tracking-widest' + 'absolute top-0 -ml-8 text-center mt-12 w-24 text-2xs font-medium uppercase tracking-widest sm:-ml-10 sm:w-32' const THREAD_BASE = 'flex-auto border-t transition duration-500 ease-in-out' // Defensive clamp: if a parent shrinks `steps` while `activeStep` is @@ -37,7 +37,7 @@ export const Stepper = ({ steps, activeStep, align = 'center' }: StepperProps) = return (
{steps.length > 1 && ( -
+
{steps.map((step: Step, index: number) => ( <>