use semibold

This commit is contained in:
miloschwartz
2026-04-25 15:42:19 -07:00
parent 8e16ff07a9
commit 6f6c24b6df
27 changed files with 95 additions and 87 deletions

View File

@@ -836,7 +836,14 @@ export default function BillingPage() {
</SettingsSectionHeader>
<SettingsSectionBody>
{/* Plan Cards Grid */}
<div className={cn("grid grid-cols-1 gap-4", visiblePlanOptions.length === 5 ? "md:grid-cols-5" : "md:grid-cols-4")}>
<div
className={cn(
"grid grid-cols-1 gap-4",
visiblePlanOptions.length === 5
? "md:grid-cols-5"
: "md:grid-cols-4"
)}
>
{visiblePlanOptions.map((plan) => {
const isCurrentPlan = plan.id === currentPlanId;
const planAction = getPlanAction(plan);
@@ -967,7 +974,7 @@ export default function BillingPage() {
{t("billingCurrentUsage") || "Current Usage"}
</div>
<div className="flex items-baseline gap-2">
<span className="text-3xl font-bold">
<span className="text-3xl font-semibold">
{getUserCount()}
</span>
<span className="text-lg">
@@ -1298,7 +1305,7 @@ export default function BillingPage() {
"Current Keys"}
</div>
<div className="flex items-baseline gap-2">
<span className="text-3xl font-bold">
<span className="text-3xl font-semibold">
{getLicenseKeyCount()}
</span>
<span className="text-lg">

View File

@@ -5,7 +5,7 @@ export default async function NotFound() {
return (
<div className="w-full max-w-md mx-auto p-3 md:mt-32 text-center">
<h1 className="text-6xl font-bold mb-4">404</h1>
<h1 className="text-6xl font-semibold mb-4">404</h1>
<h2 className="text-2xl font-semibold text-neutral-500 mb-4">
{t("pageNotFound")}
</h2>

View File

@@ -92,7 +92,7 @@ export default function InitialSetupPage() {
/>
</div>
<div className="text-center space-y-1">
<h1 className="text-2xl font-bold mt-1">
<h1 className="text-2xl font-semibold mt-1">
{t("initialSetupTitle")}
</h1>
<CardDescription>

View File

@@ -23,8 +23,10 @@ export default function DeviceAuthSuccessPage() {
useEffect(() => {
// Detect if we're on iOS or Android
const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera;
const isIOS = /iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream;
const userAgent =
navigator.userAgent || navigator.vendor || (window as any).opera;
const isIOS =
/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream;
const isAndroid = /android/i.test(userAgent);
if (isAndroid) {
@@ -32,7 +34,8 @@ export default function DeviceAuthSuccessPage() {
// This explicitly tells Chrome to send an intent to the app, which will bring
// SignInCodeActivity back to the foreground (it has launchMode="singleTop")
setTimeout(() => {
window.location.href = "intent://auth-success#Intent;scheme=pangolin;package=net.pangolin.Pangolin;end";
window.location.href =
"intent://auth-success#Intent;scheme=pangolin;package=net.pangolin.Pangolin;end";
}, 500);
} else if (isIOS) {
// Wait 500ms then attempt to open the app
@@ -41,7 +44,8 @@ export default function DeviceAuthSuccessPage() {
window.location.href = "pangolin://";
setTimeout(() => {
window.location.href = "https://apps.apple.com/app/pangolin/net.pangolin.Pangolin.PangoliniOS";
window.location.href =
"https://apps.apple.com/app/pangolin/net.pangolin.Pangolin.PangoliniOS";
}, 2000);
}, 500);
}
@@ -64,7 +68,7 @@ export default function DeviceAuthSuccessPage() {
<div className="flex flex-col items-center space-y-4">
<CheckCircle2 className="h-12 w-12 text-green-500" />
<div className="space-y-2">
<h3 className="text-xl font-bold text-center">
<h3 className="text-xl font-semibold text-center">
{t("deviceConnected")}
</h3>
<p className="text-center text-sm text-muted-foreground">

View File

@@ -135,7 +135,7 @@ export default async function Page(props: {
<div className="border rounded-md p-3 mb-4 bg-card">
<div className="flex flex-col items-center">
<Mail className="w-12 h-12 mb-4 text-primary" />
<h2 className="text-2xl font-bold mb-2 text-center">
<h2 className="text-2xl font-semibold mb-2 text-center">
{t("inviteAlready")}
</h2>
<p className="text-center">

View File

@@ -65,7 +65,7 @@ export default async function Page(props: {
<div className="border rounded-md p-3 mb-4 bg-card">
<div className="flex flex-col items-center">
<Mail className="w-12 h-12 mb-4 text-primary" />
<h2 className="text-2xl font-bold mb-2 text-center">
<h2 className="text-2xl font-semibold mb-2 text-center">
{t("inviteAlready")}
</h2>
<p className="text-center">

View File

@@ -5,7 +5,7 @@ export default async function NotFound() {
return (
<div className="w-full max-w-md mx-auto p-3 md:mt-32 text-center">
<h1 className="text-6xl font-bold mb-4">404</h1>
<h1 className="text-6xl font-semibold mb-4">404</h1>
<h2 className="text-2xl font-semibold text-neutral-500 mb-4">
{t("pageNotFound")}
</h2>

View File

@@ -143,7 +143,7 @@ export default function AccessToken({ token, resourceId }: AccessTokenProps) {
) : (
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-center text-2xl font-bold">
<CardTitle className="text-center text-2xl font-semibold">
{renderTitle()}
</CardTitle>
</CardHeader>

View File

@@ -58,12 +58,12 @@ export default function AccessTokenSection({
<TabsContent value="token" className="space-y-4">
<div className="space-y-1">
<div className="font-bold">{t("tokenId")}</div>
<div className="font-semibold">{t("tokenId")}</div>
<CopyToClipboard text={tokenId} isLink={false} />
</div>
<div className="space-y-1">
<div className="font-bold">{t("token")}</div>
<div className="font-semibold">{t("token")}</div>
<CopyToClipboard text={token} isLink={false} />
</div>
</TabsContent>

View File

@@ -92,7 +92,7 @@ export default function ConfirmDeleteDialog({
<CredenzaBody>
<div className="mb-4 break-all overflow-hidden">
{dialog}
<div className="mt-2 mb-6 font-bold text-destructive">
<div className="mt-2 mb-6 font-semibold text-destructive">
{warningText || t("cannotbeUndone")}
</div>
@@ -142,7 +142,9 @@ export default function ConfirmDeleteDialog({
form="confirm-delete-form"
loading={loading}
disabled={loading || !isConfirmed}
className={!isConfirmed && !loading ? "opacity-50" : ""}
className={
!isConfirmed && !loading ? "opacity-50" : ""
}
>
{buttonText}
</Button>

View File

@@ -107,7 +107,7 @@ export function DNSRecordsDataTable<TData, TValue>({
<CardHeader className="flex flex-col space-y-4 sm:flex-row sm:items-center sm:justify-between sm:space-y-0 pb-4">
<div className="flex flex-row space-y-3 w-full sm:mr-2 gap-2 justify-between">
<div className="relative w-full sm:max-w-sm flex flex-row gap-4 items-center">
<h1 className="font-bold">{t("dnsRecord")}</h1>
<h1 className="font-semibold">{t("dnsRecord")}</h1>
<Badge variant="secondary">{t("required")}</Badge>
</div>
<Link

View File

@@ -252,7 +252,7 @@ export default function DeleteAccountConfirmDialog({
</>
)}
</div>
<p className="text-sm font-bold text-destructive">
<p className="text-sm font-semibold text-destructive">
{t("cannotbeUndone")}
</p>
</>

View File

@@ -204,7 +204,7 @@ export default function InviteStatusCard({
<div className="flex items-center justify-center min-h-screen">
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-center text-2xl font-bold">
<CardTitle className="text-center text-2xl font-semibold">
{loading ? t("checkingInvite") : t("inviteNotAccepted")}
</CardTitle>
</CardHeader>

View File

@@ -720,7 +720,7 @@ export default function MemberResourcesPortal({
<TooltipProvider>
<Tooltip>
<TooltipTrigger className="min-w-0 max-w-full">
<CardTitle className="text-lg font-bold text-foreground truncate group-hover:text-primary transition-colors">
<CardTitle className="text-lg font-semibold text-foreground truncate group-hover:text-primary transition-colors">
{
resource.name
}
@@ -822,7 +822,7 @@ export default function MemberResourcesPortal({
<TooltipProvider>
<Tooltip>
<TooltipTrigger className="min-w-0 max-w-full">
<CardTitle className="text-lg font-bold text-foreground truncate group-hover:text-primary transition-colors">
<CardTitle className="text-lg font-semibold text-foreground truncate group-hover:text-primary transition-colors">
{
siteResource.name
}

View File

@@ -32,9 +32,7 @@ export function OptionSelect<TValue extends string>({
}: OptionSelectProps<TValue>) {
return (
<div className={className}>
{label && (
<p className="font-bold mb-3">{label}</p>
)}
{label && <p className="font-semibold mb-3">{label}</p>}
<div
className={cn(
"grid gap-2",
@@ -51,7 +49,11 @@ export function OptionSelect<TValue extends string>({
<Button
key={option.value}
type="button"
variant={isSelected ? "squareOutlinePrimary" : "squareOutline"}
variant={
isSelected
? "squareOutlinePrimary"
: "squareOutline"
}
className={cn(
"flex-1 min-w-30 shadow-none",
isSelected && "bg-primary/10"

View File

@@ -86,7 +86,7 @@ export function OrgSelector({
<div className="flex items-center justify-between w-full min-w-0">
<div className="flex items-center min-w-0 flex-1">
<div className="flex flex-col items-start min-w-0 flex-1 gap-1">
<span className="font-bold">
<span className="font-semibold">
{t("org")}
</span>
<span className="text-sm text-muted-foreground truncate w-full text-left">

View File

@@ -70,7 +70,7 @@ export default function OrganizationLandingCard(
return (
<Card>
<CardHeader>
<CardTitle className="flex items-center text-3xl font-bold">
<CardTitle className="flex items-center text-3xl font-semibold">
{orgData.overview.orgName}
</CardTitle>
</CardHeader>
@@ -82,7 +82,7 @@ export default function OrganizationLandingCard(
className="flex flex-col items-center p-4 bg-secondary rounded-lg"
>
{stat.icon}
<span className="mt-2 text-2xl font-bold">
<span className="mt-2 text-2xl font-semibold">
{stat.value}
</span>
<span className="text-sm text-muted-foreground">

View File

@@ -17,7 +17,7 @@ export default function ResourceAccessDenied() {
return (
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-center text-2xl font-bold">
<CardTitle className="text-center text-2xl font-semibold">
{t("accessDenied")}
</CardTitle>
</CardHeader>

View File

@@ -15,7 +15,7 @@ export default async function ResourceNotFound() {
return (
<Card className="w-full max-w-md">
<CardHeader>
<CardTitle className="text-center text-2xl font-bold">
<CardTitle className="text-center text-2xl font-semibold">
{t("resourceNotFound")}
</CardTitle>
</CardHeader>

View File

@@ -38,7 +38,7 @@ export function SettingsSectionTitle({
children: React.ReactNode;
}) {
return (
<h2 className="text-1xl font-bold tracking-tight flex items-center gap-2">
<h2 className="text-1xl font-semibold tracking-tight flex items-center gap-2">
{children}
</h2>
);

View File

@@ -16,7 +16,7 @@ export default function SettingsSectionTitle({
<h2
className={`text-${
size ? size : "2xl"
} font-bold tracking-tight`}
} font-semibold tracking-tight`}
>
{title}
</h2>

View File

@@ -199,7 +199,7 @@ function OverviewColumn({
<div className="border-b px-5 py-5">
<div className="flex items-start justify-between gap-4">
<div className="text-lg space-y-0.5 pb-6">
<h2 className="text-1xl font-bold tracking-tight flex items-center gap-2">
<h2 className="text-1xl font-semibold tracking-tight flex items-center gap-2">
{title}
</h2>
<p className="text-muted-foreground text-sm">

View File

@@ -77,8 +77,12 @@ sudo install -d -m 0755 /etc/newt
sudo tee /etc/newt/newt.env > /dev/null << 'EOF'
NEWT_ID=${id}
NEWT_SECRET=${secret}
PANGOLIN_ENDPOINT=${endpoint}${!acceptClients ? `
DISABLE_CLIENTS=true` : ""}
PANGOLIN_ENDPOINT=${endpoint}${
!acceptClients
? `
DISABLE_CLIENTS=true`
: ""
}
EOF
sudo chmod 600 /etc/newt/newt.env`
},
@@ -232,9 +236,7 @@ WantedBy=default.target`
<OptionSelect<string>
label={
platform === "windows"
? t("architecture")
: t("method")
platform === "windows" ? t("architecture") : t("method")
}
options={getArchitectures(platform).map((arch) => ({
value: arch,
@@ -247,7 +249,9 @@ WantedBy=default.target`
/>
<div className="pt-4">
<p className="font-bold mb-3">{t("siteConfiguration")}</p>
<p className="font-semibold mb-3">
{t("siteConfiguration")}
</p>
<div className="flex items-center space-x-2 mb-2">
<CheckboxWithLabel
id="acceptClients"
@@ -269,7 +273,7 @@ WantedBy=default.target`
</div>
<div className="pt-4">
<p className="font-bold mb-3">{t("commands")}</p>
<p className="font-semibold mb-3">{t("commands")}</p>
{platform === "kubernetes" && (
<p className="text-sm text-muted-foreground mb-3">
For more and up to date Kubernetes installation

View File

@@ -122,9 +122,7 @@ curl -o olm.exe -L "https://github.com/fosrl/olm/releases/download/${version}/ol
<OptionSelect<string>
label={
platform === "docker"
? t("method")
: t("architecture")
platform === "docker" ? t("method") : t("architecture")
}
options={getArchitectures(platform).map((arch) => ({
value: arch,
@@ -137,33 +135,31 @@ curl -o olm.exe -L "https://github.com/fosrl/olm/releases/download/${version}/ol
/>
<div className="pt-4">
<p className="font-bold mb-3">{t("commands")}</p>
<div className="mt-2 space-y-3">
{commands.map((item, index) => {
const commandText =
typeof item === "string"
? item
: item.command;
const title =
typeof item === "string"
? undefined
: item.title;
<p className="font-semibold mb-3">{t("commands")}</p>
<div className="mt-2 space-y-3">
{commands.map((item, index) => {
const commandText =
typeof item === "string" ? item : item.command;
const title =
typeof item === "string"
? undefined
: item.title;
return (
<div key={index}>
{title && (
<p className="text-sm font-medium mb-1.5">
{title}
</p>
)}
<CopyTextBox
text={commandText}
outline={true}
/>
</div>
);
})}
</div>
return (
<div key={index}>
{title && (
<p className="text-sm font-medium mb-1.5">
{title}
</p>
)}
<CopyTextBox
text={commandText}
outline={true}
/>
</div>
);
})}
</div>
</div>
</SettingsSectionBody>
</SettingsSection>

View File

@@ -57,7 +57,7 @@ export const tagVariants = cva(
},
textStyle: {
normal: "font-normal",
bold: "font-bold",
bold: "font-semibold",
italic: "italic",
underline: "underline",
lineThrough: "line-through"