Compare commits

...
306 changed files with 7480 additions and 15119 deletions
-8
View File
@@ -1,8 +0,0 @@
# Config files
*.config.js
*.config.cjs
# Statically hosted javascript files
apps/*/public/*.js
apps/*/public/*.cjs
scripts/
-16
View File
@@ -1,16 +0,0 @@
/** @type {import('eslint').Linter.Config} */
module.exports = {
root: true,
extends: ['@documenso/eslint-config'],
rules: {
'@next/next/no-img-element': 'off',
'no-unreachable': 'error',
'react-hooks/exhaustive-deps': 'off',
},
settings: {
next: {
rootDir: ['apps/*/'],
},
},
ignorePatterns: ['lingui.config.ts', 'packages/lib/translations/**/*.js'],
};
+33
View File
@@ -0,0 +1,33 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 100,
"tabWidth": 2,
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "always",
"importOrder": [
"^server-only|client-only$",
"^react$",
"^next(/.*)?$",
"<THIRD_PARTY_MODULES>",
"^@documenso/(.*)$",
"^~/(.*)$",
"^[./]"
],
"importOrderSeparation": true,
"importOrderSortSpecifiers": true,
"sortTailwindcss": {
"functions": ["cn", "cva"]
},
"sortPackageJson": false,
"ignorePatterns": [
"packages/lib/translations/**/*.js",
"*.test.ts",
"apps/docs/content/**/*.mdx",
"*.css",
"*.po",
"*.md",
"*.json"
]
}
+50
View File
@@ -0,0 +1,50 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["typescript", "import", "react", "nextjs", "promise"],
"env": { "browser": true, "node": true, "es2022": true },
"categories": { "correctness": "error" },
"rules": {
"eslint/no-unused-vars": [
"warn",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "after-used",
"argsIgnorePattern": "^_",
"destructuredArrayIgnorePattern": "^_"
}
],
"eslint/no-promise-executor-return": "error",
"eslint/prefer-promise-reject-errors": "error",
"eslint/no-unreachable": "error",
"typescript/no-floating-promises": "error",
"typescript/no-misused-promises": ["error", { "checksVoidReturn": { "attributes": false } }],
"typescript/promise-function-async": "error",
"typescript/require-await": "error",
"typescript/consistent-type-assertions": ["warn", { "assertionStyle": "never" }],
"typescript/consistent-type-imports": [
"warn",
{
"prefer": "type-imports",
"fixStyle": "separate-type-imports",
"disallowTypeAnnotations": false
}
],
"react/no-unescaped-entities": "off",
"react/exhaustive-deps": "off",
"nextjs/no-html-link-for-pages": "off",
"nextjs/no-img-element": "off"
},
"ignorePatterns": [
"*.config.js",
"*.config.cjs",
"apps/*/public/*.js",
"apps/*/public/*.cjs",
"scripts/",
"lingui.config.ts",
"packages/lib/translations/**/*.js"
]
}
-20
View File
@@ -1,20 +0,0 @@
node_modules
.next
public
**/**/node_modules
**/**/.next
**/**/public
packages/lib/translations/**/*.js
*.lock
*.log
*.test.ts
.gitignore
.npmignore
.prettierignore
.DS_Store
.eslintignore
# Docs MDX - Prettier strips indentation from code blocks inside components
apps/docs/content/**/*.mdx
+81 -83
View File
@@ -40,104 +40,102 @@ export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...
const { logoSrc, fonts } = await loadAssets(); const { logoSrc, fonts } = await loadAssets();
return new ImageResponse( return new ImageResponse(
( <div
style={{
display: 'flex',
flexDirection: 'column',
width: '100%',
height: '100%',
backgroundColor: 'white',
padding: '60px 80px',
fontFamily: 'Inter',
position: 'relative',
}}
>
{/* Green accent bar */}
<div
style={{
position: 'absolute',
top: 0,
left: 0,
right: 0,
height: '6px',
backgroundColor: '#6DC947',
}}
/>
{/* Top: Logo */}
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '16px',
}}
>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src={logoSrc} alt="Documenso" height="28" />
<span
style={{
color: '#D4D4D8',
fontSize: '28px',
fontWeight: 400,
}}
>
|
</span>
<span style={{ color: '#71717A', fontSize: '20px', fontWeight: 400 }}>Docs</span>
</div>
{/* Middle: Title + description */}
<div <div
style={{ style={{
display: 'flex', display: 'flex',
flexDirection: 'column', flexDirection: 'column',
width: '100%', flex: 1,
height: '100%', justifyContent: 'center',
backgroundColor: 'white', gap: '16px',
padding: '60px 80px',
fontFamily: 'Inter',
position: 'relative',
}} }}
> >
{/* Green accent bar */} <h1
<div
style={{ style={{
position: 'absolute', color: '#18181B',
top: 0, fontSize: page.data.title.length > 40 ? '48px' : '56px',
left: 0, fontWeight: 700,
right: 0, lineHeight: 1.15,
height: '6px', letterSpacing: '-0.025em',
backgroundColor: '#6DC947', margin: 0,
}}
/>
{/* Top: Logo */}
<div
style={{
display: 'flex',
alignItems: 'center',
gap: '16px',
}} }}
> >
{/* eslint-disable-next-line @next/next/no-img-element */} {page.data.title}
<img src={logoSrc} alt="Documenso" height="28" /> </h1>
<span {page.data.description && (
<p
style={{ style={{
color: '#D4D4D8', color: '#71717A',
fontSize: '28px', fontSize: '22px',
fontWeight: 400, fontWeight: 400,
}} lineHeight: 1.4,
>
|
</span>
<span style={{ color: '#71717A', fontSize: '20px', fontWeight: 400 }}>Docs</span>
</div>
{/* Middle: Title + description */}
<div
style={{
display: 'flex',
flexDirection: 'column',
flex: 1,
justifyContent: 'center',
gap: '16px',
}}
>
<h1
style={{
color: '#18181B',
fontSize: page.data.title.length > 40 ? '48px' : '56px',
fontWeight: 700,
lineHeight: 1.15,
letterSpacing: '-0.025em',
margin: 0, margin: 0,
maxWidth: '900px',
overflow: 'hidden',
textOverflow: 'ellipsis',
display: '-webkit-box',
WebkitLineClamp: 2,
WebkitBoxOrient: 'vertical',
}} }}
> >
{page.data.title} {page.data.description}
</h1> </p>
{page.data.description && ( )}
<p
style={{
color: '#71717A',
fontSize: '22px',
fontWeight: 400,
lineHeight: 1.4,
margin: 0,
maxWidth: '900px',
overflow: 'hidden',
textOverflow: 'ellipsis',
display: '-webkit-box',
WebkitLineClamp: 2,
WebkitBoxOrient: 'vertical',
}}
>
{page.data.description}
</p>
)}
</div>
{/* Bottom: URL */}
<div style={{ display: 'flex', alignItems: 'center' }}>
<span style={{ color: '#A1A1AA', fontSize: '16px', fontWeight: 400 }}>
docs.documenso.com{page.url}
</span>
</div>
</div> </div>
),
{/* Bottom: URL */}
<div style={{ display: 'flex', alignItems: 'center' }}>
<span style={{ color: '#A1A1AA', fontSize: '16px', fontWeight: 400 }}>
docs.documenso.com{page.url}
</span>
</div>
</div>,
{ {
width: 1200, width: 1200,
height: 630, height: 630,
+5 -2
View File
@@ -6,17 +6,20 @@
"dev": "next dev -p 3003", "dev": "next dev -p 3003",
"build": "next build", "build": "next build",
"start": "next start -p 3003", "start": "next start -p 3003",
"lint:fix": "next lint --fix", "lint:fix": "oxlint --type-aware --fix .",
"clean": "rimraf .next && rimraf node_modules" "clean": "rimraf .next && rimraf node_modules"
}, },
"dependencies": { "dependencies": {
"@documenso/prisma": "*", "@documenso/prisma": "*",
"luxon": "^3.7.2", "luxon": "^3.7.2",
"next": "15.5.12" "next": "15.5.12",
"react": "^18",
"react-dom": "^18"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^20", "@types/node": "^20",
"@types/react": "18.3.27", "@types/react": "18.3.27",
"@types/react-dom": "^18",
"typescript": "5.6.2" "typescript": "5.6.2"
} }
} }
@@ -122,7 +122,7 @@ export const AccountDeleteDialog = ({ className }: AccountDeleteDialogProps) =>
<Label> <Label>
<Trans> <Trans>
Please type{' '} Please type{' '}
<span className="text-muted-foreground font-semibold">{user.email}</span> to <span className="font-semibold text-muted-foreground">{user.email}</span> to
confirm. confirm.
</Trans> </Trans>
</Label> </Label>
@@ -115,7 +115,7 @@ export function AssistantConfirmationDialog({
<div className="mt-4 flex flex-col gap-4"> <div className="mt-4 flex flex-col gap-4">
{!isEditingNextSigner && ( {!isEditingNextSigner && (
<div> <div>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans> <Trans>
The next recipient to sign this document will be{' '} The next recipient to sign this document will be{' '}
<span className="font-semibold">{form.watch('name')}</span> ( <span className="font-semibold">{form.watch('name')}</span> (
@@ -165,7 +165,7 @@ export const DocumentMoveToFolderDialog = ({
</DialogHeader> </DialogHeader>
<div className="relative"> <div className="relative">
<Search className="text-muted-foreground absolute left-2 top-3 h-4 w-4" /> <Search className="absolute left-2 top-3 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder={_(msg`Search folders...`)} placeholder={_(msg`Search folders...`)}
value={searchTerm} value={searchTerm}
@@ -219,7 +219,7 @@ export const DocumentMoveToFolderDialog = ({
))} ))}
{searchTerm && filteredFolders?.length === 0 && ( {searchTerm && filteredFolders?.length === 0 && (
<div className="text-muted-foreground px-2 py-2 text-center text-sm"> <div className="px-2 py-2 text-center text-sm text-muted-foreground">
<Trans>No folders found</Trans> <Trans>No folders found</Trans>
</div> </div>
)} )}
@@ -183,7 +183,7 @@ export const DocumentResendDialog = ({ document, recipients }: DocumentResendDia
<DialogClose asChild> <DialogClose asChild>
<Button <Button
type="button" type="button"
className="dark:bg-muted dark:hover:bg-muted/80 flex-1 bg-black/5 hover:bg-black/10" className="flex-1 bg-black/5 hover:bg-black/10 dark:bg-muted dark:hover:bg-muted/80"
variant="secondary" variant="secondary"
disabled={isSubmitting} disabled={isSubmitting}
> >
@@ -132,7 +132,7 @@ export const EnvelopeDownloadDialog = ({
{Array.from({ length: 1 }).map((_, index) => ( {Array.from({ length: 1 }).map((_, index) => (
<div <div
key={index} key={index}
className="border-border bg-card flex items-center gap-2 rounded-lg border p-4" className="flex items-center gap-2 rounded-lg border border-border bg-card p-4"
> >
<Skeleton className="h-10 w-10 flex-shrink-0 rounded-lg" /> <Skeleton className="h-10 w-10 flex-shrink-0 rounded-lg" />
@@ -149,20 +149,20 @@ export const EnvelopeDownloadDialog = ({
envelopeItems.map((item) => ( envelopeItems.map((item) => (
<div <div
key={item.id} key={item.id}
className="border-border bg-card hover:bg-accent/50 flex items-center gap-4 rounded-lg border p-4 transition-colors" className="flex items-center gap-4 rounded-lg border border-border bg-card p-4 transition-colors hover:bg-accent/50"
> >
<div className="flex-shrink-0"> <div className="flex-shrink-0">
<div className="bg-primary/10 flex h-10 w-10 items-center justify-center rounded-lg"> <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
<FileTextIcon className="text-primary h-5 w-5" /> <FileTextIcon className="h-5 w-5 text-primary" />
</div> </div>
</div> </div>
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
{/* Todo: Envelopes - Fix overflow */} {/* Todo: Envelopes - Fix overflow */}
<h4 className="text-foreground truncate text-sm font-medium" title={item.title}> <h4 className="truncate text-sm font-medium text-foreground" title={item.title}>
{item.title} {item.title}
</h4> </h4>
<p className="text-muted-foreground mt-0.5 text-xs"> <p className="mt-0.5 text-xs text-muted-foreground">
<Trans>PDF Document</Trans> <Trans>PDF Document</Trans>
</p> </p>
</div> </div>
@@ -134,7 +134,7 @@ export const FolderDeleteDialog = ({ folder, isOpen, onOpenChange }: FolderDelet
<FormLabel> <FormLabel>
<Trans> <Trans>
Confirm by typing:{' '} Confirm by typing:{' '}
<span className="font-sm text-destructive font-semibold"> <span className="font-sm font-semibold text-destructive">
{deleteMessage} {deleteMessage}
</span> </span>
</Trans> </Trans>
@@ -129,7 +129,7 @@ export const FolderMoveDialog = ({
</DialogHeader> </DialogHeader>
<div className="relative"> <div className="relative">
<Search className="text-muted-foreground absolute left-2 top-3 h-4 w-4" /> <Search className="absolute left-2 top-3 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder={t`Search folders...`} placeholder={t`Search folders...`}
value={searchTerm} value={searchTerm}
@@ -357,9 +357,9 @@ const BillingPlanForm = ({
<button <button
onClick={() => onChange('')} onClick={() => onChange('')}
className={cn( className={cn(
'hover:border-primary flex cursor-pointer items-center space-x-2 rounded-md border p-4 transition-all hover:shadow-sm', 'flex cursor-pointer items-center space-x-2 rounded-md border p-4 transition-all hover:border-primary hover:shadow-sm',
{ {
'ring-primary/10 border-primary ring-2 ring-offset-1': '' === value, 'border-primary ring-2 ring-primary/10 ring-offset-1': '' === value,
}, },
)} )}
disabled={!canCreateFreeOrganisation} disabled={!canCreateFreeOrganisation}
@@ -390,9 +390,9 @@ const BillingPlanForm = ({
key={plan[billingPeriod]?.id} key={plan[billingPeriod]?.id}
onClick={() => onChange(plan[billingPeriod]?.id ?? '')} onClick={() => onChange(plan[billingPeriod]?.id ?? '')}
className={cn( className={cn(
'hover:border-primary flex cursor-pointer items-center space-x-2 rounded-md border p-4 transition-all hover:shadow-sm', 'flex cursor-pointer items-center space-x-2 rounded-md border p-4 transition-all hover:border-primary hover:shadow-sm',
{ {
'ring-primary/10 border-primary ring-2 ring-offset-1': 'border-primary ring-2 ring-primary/10 ring-offset-1':
plan[billingPeriod]?.id === value, plan[billingPeriod]?.id === value,
}, },
)} )}
@@ -403,7 +403,7 @@ const BillingPlanForm = ({
</div> </div>
<div className="whitespace-nowrap text-right text-sm font-medium"> <div className="whitespace-nowrap text-right text-sm font-medium">
<p>{plan[billingPeriod]?.friendlyPrice}</p> <p>{plan[billingPeriod]?.friendlyPrice}</p>
<span className="text-muted-foreground text-xs"> <span className="text-xs text-muted-foreground">
{billingPeriod === 'monthlyPrice' ? ( {billingPeriod === 'monthlyPrice' ? (
<Trans>per month</Trans> <Trans>per month</Trans>
) : ( ) : (
@@ -417,13 +417,13 @@ const BillingPlanForm = ({
<Link <Link
to="https://documen.so/enterprise-cta" to="https://documen.so/enterprise-cta"
target="_blank" target="_blank"
className="bg-muted/30 flex items-center space-x-2 rounded-md border p-4" className="flex items-center space-x-2 rounded-md border bg-muted/30 p-4"
> >
<div className="flex-1 font-normal"> <div className="flex-1 font-normal">
<p className="text-muted-foreground font-medium"> <p className="font-medium text-muted-foreground">
<Trans>Enterprise</Trans> <Trans>Enterprise</Trans>
</p> </p>
<p className="text-muted-foreground flex flex-row items-center gap-1"> <p className="flex flex-row items-center gap-1 text-muted-foreground">
<Trans>Contact sales here</Trans> <Trans>Contact sales here</Trans>
<ExternalLinkIcon className="h-4 w-4" /> <ExternalLinkIcon className="h-4 w-4" />
</p> </p>
@@ -434,7 +434,7 @@ const BillingPlanForm = ({
<div className="mt-6 text-center"> <div className="mt-6 text-center">
<Link <Link
to="https://documenso.com/pricing" to="https://documenso.com/pricing"
className="text-primary hover:text-primary/80 flex items-center justify-center gap-1 text-sm hover:underline" className="flex items-center justify-center gap-1 text-sm text-primary hover:text-primary/80 hover:underline"
target="_blank" target="_blank"
> >
<Trans>Compare all plans and features in detail</Trans> <Trans>Compare all plans and features in detail</Trans>
@@ -176,14 +176,14 @@ export const OrganisationEmailCreateDialog = ({
}} }}
placeholder={t`support`} placeholder={t`support`}
/> />
<div className="bg-muted text-muted-foreground absolute bottom-0 right-0 top-0 flex items-center rounded-r-md border px-3 py-2 text-sm"> <div className="absolute bottom-0 right-0 top-0 flex items-center rounded-r-md border bg-muted px-3 py-2 text-sm text-muted-foreground">
@{emailDomain.domain} @{emailDomain.domain}
</div> </div>
</div> </div>
</FormControl> </FormControl>
<FormMessage /> <FormMessage />
{!form.formState.errors.email && ( {!form.formState.errors.email && (
<span className="text-foreground/50 text-xs font-normal"> <span className="text-xs font-normal text-foreground/50">
{field.value ? ( {field.value ? (
field.value field.value
) : ( ) : (
@@ -126,7 +126,7 @@ export const OrganisationEmailDomainDeleteDialog = ({
<FormLabel> <FormLabel>
<Trans> <Trans>
Confirm by typing{' '} Confirm by typing{' '}
<span className="font-sm text-destructive font-semibold"> <span className="font-sm font-semibold text-destructive">
{deleteMessage} {deleteMessage}
</span> </span>
</Trans> </Trans>
@@ -178,7 +178,7 @@ export const OrganisationGroupCreateDialog = ({
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Select {...field} onValueChange={field.onChange}> <Select {...field} onValueChange={field.onChange}>
<SelectTrigger className="text-muted-foreground w-full"> <SelectTrigger className="w-full text-muted-foreground">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@@ -217,7 +217,7 @@ export const OrganisationGroupCreateDialog = ({
loading={isLoadingMembers} loading={isLoadingMembers}
selectedValues={field.value} selectedValues={field.value}
onChange={field.onChange} onChange={field.onChange}
className="bg-background w-full" className="w-full bg-background"
emptySelectionPlaceholder={t`Select members`} emptySelectionPlaceholder={t`Select members`}
/> />
</FormControl> </FormControl>
@@ -329,12 +329,12 @@ export const OrganisationMemberInviteDialog = ({
onValueChange={(value) => setInvitationType(value as TabTypes)} onValueChange={(value) => setInvitationType(value as TabTypes)}
> >
<TabsList className="w-full"> <TabsList className="w-full">
<TabsTrigger value="INDIVIDUAL" className="hover:text-foreground w-full"> <TabsTrigger value="INDIVIDUAL" className="w-full hover:text-foreground">
<MailIcon size={20} className="mr-2" /> <MailIcon size={20} className="mr-2" />
<Trans>Invite Members</Trans> <Trans>Invite Members</Trans>
</TabsTrigger> </TabsTrigger>
<TabsTrigger value="BULK" className="hover:text-foreground w-full"> <TabsTrigger value="BULK" className="w-full hover:text-foreground">
<UsersIcon size={20} className="mr-2" /> <Trans>Bulk Import</Trans> <UsersIcon size={20} className="mr-2" /> <Trans>Bulk Import</Trans>
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>
@@ -382,7 +382,7 @@ export const OrganisationMemberInviteDialog = ({
)} )}
<FormControl> <FormControl>
<Select {...field} onValueChange={field.onChange}> <Select {...field} onValueChange={field.onChange}>
<SelectTrigger className="text-muted-foreground max-w-[200px]"> <SelectTrigger className="max-w-[200px] text-muted-foreground">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@@ -447,7 +447,7 @@ export const OrganisationMemberInviteDialog = ({
<div className="mt-4 space-y-4"> <div className="mt-4 space-y-4">
<Card gradient className="h-32"> <Card gradient className="h-32">
<CardContent <CardContent
className="text-muted-foreground/80 hover:text-muted-foreground/90 flex h-full cursor-pointer flex-col items-center justify-center rounded-lg p-0 transition-colors" className="flex h-full cursor-pointer flex-col items-center justify-center rounded-lg p-0 text-muted-foreground/80 transition-colors hover:text-muted-foreground/90"
onClick={() => fileInputRef.current?.click()} onClick={() => fileInputRef.current?.click()}
> >
<Upload className="h-5 w-5" /> <Upload className="h-5 w-5" />
@@ -290,11 +290,11 @@ export const ManagePublicTemplateDialog = ({
key={row.id} key={row.id}
onClick={() => setSelectedTemplateId(row.id)} onClick={() => setSelectedTemplateId(row.id)}
> >
<TableCell className="text-muted-foreground max-w-[30ch] text-sm"> <TableCell className="max-w-[30ch] text-sm text-muted-foreground">
{row.title} {row.title}
</TableCell> </TableCell>
<TableCell className="text-muted-foreground text-sm"> <TableCell className="text-sm text-muted-foreground">
{i18n.date(row.createdAt)} {i18n.date(row.createdAt)}
</TableCell> </TableCell>
@@ -381,7 +381,7 @@ export const ManagePublicTemplateDialog = ({
</FormControl> </FormControl>
{!form.formState.errors.publicDescription && ( {!form.formState.errors.publicDescription && (
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
{remaningLength >= 0 ? ( {remaningLength >= 0 ? (
<Plural <Plural
value={remaningLength} value={remaningLength}
@@ -129,7 +129,7 @@ export const TeamEmailDeleteDialog = ({ trigger, teamName, team }: TeamEmailDele
(team.teamEmail?.name || team.emailVerification?.name) ?? '', (team.teamEmail?.name || team.emailVerification?.name) ?? '',
)} )}
primaryText={ primaryText={
<span className="text-foreground/80 text-sm font-semibold"> <span className="text-sm font-semibold text-foreground/80">
{team.teamEmail?.name || team.emailVerification?.name} {team.teamEmail?.name || team.emailVerification?.name}
</span> </span>
} }
@@ -198,7 +198,7 @@ export const TeamGroupCreateDialog = ({ ...props }: TeamGroupCreateDialogProps)
})), })),
); );
}} }}
className="bg-background w-full" className="w-full bg-background"
emptySelectionPlaceholder={t`Select groups`} emptySelectionPlaceholder={t`Select groups`}
/> />
</FormControl> </FormControl>
@@ -157,7 +157,7 @@ export function TemplateMoveToFolderDialog({
</DialogHeader> </DialogHeader>
<div className="relative"> <div className="relative">
<Search className="text-muted-foreground absolute left-2 top-3 h-4 w-4" /> <Search className="absolute left-2 top-3 h-4 w-4 text-muted-foreground" />
<Input <Input
placeholder={_(msg`Search folders...`)} placeholder={_(msg`Search folders...`)}
value={searchTerm} value={searchTerm}
@@ -211,7 +211,7 @@ export function TemplateMoveToFolderDialog({
))} ))}
{searchTerm && filteredFolders?.length === 0 && ( {searchTerm && filteredFolders?.length === 0 && (
<div className="text-muted-foreground px-2 py-2 text-center text-sm"> <div className="px-2 py-2 text-center text-sm text-muted-foreground">
<Trans>No folders found</Trans> <Trans>No folders found</Trans>
</div> </div>
)} )}
@@ -142,7 +142,7 @@ export default function TokenDeleteDialog({ token, onDelete, children }: TokenDe
<FormLabel> <FormLabel>
<Trans> <Trans>
Confirm by typing:{' '} Confirm by typing:{' '}
<span className="font-sm text-destructive font-semibold"> <span className="font-sm font-semibold text-destructive">
{deleteMessage} {deleteMessage}
</span> </span>
</Trans> </Trans>
@@ -132,7 +132,7 @@ export const WebhookDeleteDialog = ({ webhook, children }: WebhookDeleteDialogPr
<FormLabel> <FormLabel>
<Trans> <Trans>
Confirm by typing:{' '} Confirm by typing:{' '}
<span className="font-sm text-destructive font-semibold"> <span className="font-sm font-semibold text-destructive">
{deleteMessage} {deleteMessage}
</span> </span>
</Trans> </Trans>
@@ -140,7 +140,7 @@ export const WebhookTestDialog = ({ webhook, children }: WebhookTestDialogProps)
<h4 className="mb-2 text-sm font-medium"> <h4 className="mb-2 text-sm font-medium">
<Trans>Webhook URL</Trans> <Trans>Webhook URL</Trans>
</h4> </h4>
<p className="text-muted-foreground break-all text-sm">{webhook.webhookUrl}</p> <p className="break-all text-sm text-muted-foreground">{webhook.webhookUrl}</p>
</div> </div>
<DialogFooter> <DialogFooter>
@@ -60,11 +60,11 @@ export const ConfigureDocumentAdvancedSettings = ({
return ( return (
<div> <div>
<h3 className="text-foreground mb-1 text-lg font-medium"> <h3 className="mb-1 text-lg font-medium text-foreground">
<Trans>Advanced Settings</Trans> <Trans>Advanced Settings</Trans>
</h3> </h3>
<p className="text-muted-foreground mb-6 text-sm"> <p className="mb-6 text-sm text-muted-foreground">
<Trans>Configure additional options and preferences</Trans> <Trans>Configure additional options and preferences</Trans>
</p> </p>
@@ -100,7 +100,7 @@ export const ConfigureDocumentAdvancedSettings = ({
}))} }))}
selectedValues={field.value} selectedValues={field.value}
onChange={field.onChange} onChange={field.onChange}
className="bg-background w-full" className="w-full bg-background"
emptySelectionPlaceholder={t`Select signature types`} emptySelectionPlaceholder={t`Select signature types`}
/> />
</FormControl> </FormControl>
@@ -204,7 +204,7 @@ export const ConfigureDocumentAdvancedSettings = ({
<TooltipTrigger> <TooltipTrigger>
<InfoIcon className="mx-2 h-4 w-4" /> <InfoIcon className="mx-2 h-4 w-4" />
</TooltipTrigger> </TooltipTrigger>
<TooltipContent className="text-muted-foreground max-w-xs"> <TooltipContent className="max-w-xs text-muted-foreground">
<Trans> <Trans>
Add a URL to redirect the user to once the document is signed Add a URL to redirect the user to once the document is signed
</Trans> </Trans>
@@ -279,7 +279,7 @@ export const ConfigureDocumentAdvancedSettings = ({
<FormControl> <FormControl>
<Input <Input
id="subject" id="subject"
className="bg-background mt-2" className="mt-2 bg-background"
disabled={isSubmitting || !isEmailDistribution} disabled={isSubmitting || !isEmailDistribution}
{...field} {...field}
/> />
@@ -302,7 +302,7 @@ export const ConfigureDocumentAdvancedSettings = ({
<FormControl> <FormControl>
<Textarea <Textarea
id="message" id="message"
className="bg-background mt-2 h-32 resize-none" className="mt-2 h-32 resize-none bg-background"
disabled={isSubmitting || !isEmailDistribution} disabled={isSubmitting || !isEmailDistribution}
{...field} {...field}
/> />
@@ -146,11 +146,11 @@ export const ConfigureDocumentRecipients = ({
return ( return (
<div> <div>
<h3 className="text-foreground mb-1 text-lg font-medium"> <h3 className="mb-1 text-lg font-medium text-foreground">
<Trans>Recipients</Trans> <Trans>Recipients</Trans>
</h3> </h3>
<p className="text-muted-foreground mb-6 text-sm"> <p className="mb-6 text-sm text-muted-foreground">
<Trans>Add signers and configure signing preferences</Trans> <Trans>Add signers and configure signing preferences</Trans>
</p> </p>
@@ -206,7 +206,7 @@ export const ConfigureDocumentRecipients = ({
</FormLabel> </FormLabel>
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
<span className="text-muted-foreground ml-1 cursor-help"> <span className="ml-1 cursor-help text-muted-foreground">
<HelpCircle className="h-3.5 w-3.5" /> <HelpCircle className="h-3.5 w-3.5" />
</span> </span>
</TooltipTrigger> </TooltipTrigger>
@@ -249,7 +249,7 @@ export const ConfigureDocumentRecipients = ({
{...provided.dragHandleProps} {...provided.dragHandleProps}
disabled={signer.disabled} disabled={signer.disabled}
className={cn('py-1', { className={cn('py-1', {
'bg-widget-foreground pointer-events-none rounded-md pt-2': 'pointer-events-none rounded-md bg-widget-foreground pt-2':
snapshot.isDragging, snapshot.isDragging,
})} })}
> >
@@ -144,7 +144,7 @@ export const ConfigureDocumentUpload = ({ isSubmitting = false }: ConfigureDocum
<div <div
{...getRootProps()} {...getRootProps()}
className={cn( className={cn(
'border-border bg-background relative flex min-h-[160px] cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed transition', 'relative flex min-h-[160px] cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed border-border bg-background transition',
{ {
'border-primary/50 bg-primary/5': isDragActive, 'border-primary/50 bg-primary/5': isDragActive,
'hover:bg-muted/30': 'hover:bg-muted/30':
@@ -193,21 +193,21 @@ export const ConfigureDocumentUpload = ({ isSubmitting = false }: ConfigureDocum
</FormControl> </FormControl>
{isLoading && ( {isLoading && (
<div className="bg-background/50 absolute inset-0 flex items-center justify-center rounded-lg"> <div className="absolute inset-0 flex items-center justify-center rounded-lg bg-background/50">
<Loader className="text-muted-foreground h-10 w-10 animate-spin" /> <Loader className="h-10 w-10 animate-spin text-muted-foreground" />
</div> </div>
)} )}
</div> </div>
) : ( ) : (
<div className="mt-2 rounded-lg border p-4"> <div className="mt-2 rounded-lg border p-4">
<div className="flex items-center gap-x-4"> <div className="flex items-center gap-x-4">
<div className="bg-primary/10 text-primary flex h-12 w-12 items-center justify-center rounded-md"> <div className="flex h-12 w-12 items-center justify-center rounded-md bg-primary/10 text-primary">
<FileText className="h-6 w-6" /> <FileText className="h-6 w-6" />
</div> </div>
<div className="flex-1"> <div className="flex-1">
<div className="text-sm font-medium">{documentData.name}</div> <div className="text-sm font-medium">{documentData.name}</div>
<div className="text-muted-foreground text-xs"> <div className="text-xs text-muted-foreground">
{formatFileSize(documentData.size)} {formatFileSize(documentData.size)}
</div> </div>
</div> </div>
@@ -88,11 +88,11 @@ export const ConfigureDocumentView = ({
return ( return (
<div className="flex w-full flex-col space-y-8"> <div className="flex w-full flex-col space-y-8">
<div> <div>
<h2 className="text-foreground mb-1 text-xl font-semibold"> <h2 className="mb-1 text-xl font-semibold text-foreground">
{isTemplate ? <Trans>Configure Template</Trans> : <Trans>Configure Document</Trans>} {isTemplate ? <Trans>Configure Template</Trans> : <Trans>Configure Document</Trans>}
</h2> </h2>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
{isTemplate ? ( {isTemplate ? (
<Trans>Set up your template properties and recipient information</Trans> <Trans>Set up your template properties and recipient information</Trans>
) : ( ) : (
@@ -3,7 +3,7 @@ import { Loader } from 'lucide-react';
export const EmbedClientLoading = () => { export const EmbedClientLoading = () => {
return ( return (
<div className="bg-background fixed left-0 top-0 z-[9999] flex h-full w-full items-center justify-center"> <div className="fixed left-0 top-0 z-[9999] flex h-full w-full items-center justify-center bg-background">
<Loader className="mr-2 h-4 w-4 animate-spin" /> <Loader className="mr-2 h-4 w-4 animate-spin" />
<span> <span>
@@ -12,7 +12,7 @@ export type EmbedDocumentCompletedPageProps = {
export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentCompletedPageProps) => { export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentCompletedPageProps) => {
return ( return (
<div className="embed--DocumentCompleted relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6"> <div className="embed--DocumentCompleted relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
<h3 className="text-foreground text-2xl font-semibold"> <h3 className="text-2xl font-semibold text-foreground">
<Trans>Document Completed!</Trans> <Trans>Document Completed!</Trans>
</h3> </h3>
@@ -25,7 +25,7 @@ export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentComplet
/> />
</div> </div>
<p className="text-muted-foreground mt-8 max-w-[50ch] text-center text-sm"> <p className="mt-8 max-w-[50ch] text-center text-sm text-muted-foreground">
<Trans> <Trans>
The document is now completed, please follow any instructions provided within the parent The document is now completed, please follow any instructions provided within the parent
application. application.
@@ -6,25 +6,25 @@ export const EmbedDocumentRejected = () => {
<div className="embed--DocumentRejected relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6"> <div className="embed--DocumentRejected relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
<div className="flex flex-col items-center"> <div className="flex flex-col items-center">
<div className="flex items-center gap-x-4"> <div className="flex items-center gap-x-4">
<XCircle className="text-destructive h-10 w-10" /> <XCircle className="h-10 w-10 text-destructive" />
<h2 className="max-w-[35ch] text-center text-2xl font-semibold leading-normal md:text-3xl lg:text-4xl"> <h2 className="max-w-[35ch] text-center text-2xl font-semibold leading-normal md:text-3xl lg:text-4xl">
<Trans>Document Rejected</Trans> <Trans>Document Rejected</Trans>
</h2> </h2>
</div> </div>
<div className="text-destructive mt-4 flex items-center text-center text-sm"> <div className="mt-4 flex items-center text-center text-sm text-destructive">
<Trans>You have rejected this document</Trans> <Trans>You have rejected this document</Trans>
</div> </div>
<p className="text-muted-foreground mt-6 max-w-[60ch] text-center text-sm"> <p className="mt-6 max-w-[60ch] text-center text-sm text-muted-foreground">
<Trans> <Trans>
The document owner has been notified of your decision. They may contact you with further The document owner has been notified of your decision. They may contact you with further
instructions if necessary. instructions if necessary.
</Trans> </Trans>
</p> </p>
<p className="text-muted-foreground mt-2 max-w-[60ch] text-center text-sm"> <p className="mt-2 max-w-[60ch] text-center text-sm text-muted-foreground">
<Trans>No further action is required from you at this time.</Trans> <Trans>No further action is required from you at this time.</Trans>
</p> </p>
</div> </div>
@@ -25,19 +25,19 @@ export const EmbedDocumentWaitingForTurn = () => {
return ( return (
<div className="embed--WaitingForTurn relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6"> <div className="embed--WaitingForTurn relative mx-auto flex min-h-[100dvh] max-w-screen-lg flex-col items-center justify-center p-6">
<h3 className="text-foreground text-center text-2xl font-bold"> <h3 className="text-center text-2xl font-bold text-foreground">
<Trans>Waiting for Your Turn</Trans> <Trans>Waiting for Your Turn</Trans>
</h3> </h3>
<div className="mt-8 max-w-[50ch] text-center"> <div className="mt-8 max-w-[50ch] text-center">
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans> <Trans>
It's currently not your turn to sign. Please check back soon as this document should be It's currently not your turn to sign. Please check back soon as this document should be
available for you to sign shortly. available for you to sign shortly.
</Trans> </Trans>
</p> </p>
<p className="text-muted-foreground mt-4 text-sm"> <p className="mt-4 text-sm text-muted-foreground">
<Trans>Please check with the parent application for more information.</Trans> <Trans>Please check with the parent application for more information.</Trans>
</p> </p>
</div> </div>
@@ -60,27 +60,27 @@ export function MultiSignDocumentList({ envelopes, onDocumentSelect }: MultiSign
return ( return (
<div className="mx-auto mt-16 flex w-full max-w-lg flex-col md:mt-16 md:rounded-2xl md:border md:px-8 md:py-16 md:shadow-lg"> <div className="mx-auto mt-16 flex w-full max-w-lg flex-col md:mt-16 md:rounded-2xl md:border md:px-8 md:py-16 md:shadow-lg">
<div className="flex items-center justify-center"> <div className="flex items-center justify-center">
<XCircle className="text-destructive h-16 w-16 md:h-24 md:w-24" strokeWidth={1.2} /> <XCircle className="h-16 w-16 text-destructive md:h-24 md:w-24" strokeWidth={1.2} />
</div> </div>
<h2 className="mt-12 text-xl font-bold md:text-2xl"> <h2 className="mt-12 text-xl font-bold md:text-2xl">
<Trans>It looks like we ran into an issue!</Trans> <Trans>It looks like we ran into an issue!</Trans>
</h2> </h2>
<p className="text-muted-foreground mt-6"> <p className="mt-6 text-muted-foreground">
<Trans> <Trans>
One of the documents in the current bundle has a signing role that is not compatible One of the documents in the current bundle has a signing role that is not compatible
with the current signing experience. with the current signing experience.
</Trans> </Trans>
</p> </p>
<p className="text-muted-foreground mt-2"> <p className="mt-2 text-muted-foreground">
<Trans> <Trans>
Assistants and Copy roles are currently not compatible with the multi-sign experience. Assistants and Copy roles are currently not compatible with the multi-sign experience.
</Trans> </Trans>
</p> </p>
<p className="text-muted-foreground mt-2"> <p className="mt-2 text-muted-foreground">
<Trans>Please contact the site owner for further assistance.</Trans> <Trans>Please contact the site owner for further assistance.</Trans>
</p> </p>
</div> </div>
@@ -88,12 +88,12 @@ export function MultiSignDocumentList({ envelopes, onDocumentSelect }: MultiSign
} }
return ( return (
<div className="bg-background mx-auto w-full max-w-lg md:my-12 md:rounded-2xl md:border md:p-8 md:shadow-lg"> <div className="mx-auto w-full max-w-lg bg-background md:my-12 md:rounded-2xl md:border md:p-8 md:shadow-lg">
<h2 className="text-foreground mb-1 text-lg font-semibold"> <h2 className="mb-1 text-lg font-semibold text-foreground">
<Trans>Sign Documents</Trans> <Trans>Sign Documents</Trans>
</h2> </h2>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans> <Trans>
You have been requested to sign the following documents. Review each document carefully You have been requested to sign the following documents. Review each document carefully
and complete the signing process. and complete the signing process.
@@ -103,7 +103,7 @@ export function MultiSignDocumentList({ envelopes, onDocumentSelect }: MultiSign
{/* Progress Section */} {/* Progress Section */}
<div className="mt-6"> <div className="mt-6">
<div className="flex items-center justify-between text-sm"> <div className="flex items-center justify-between text-sm">
<span className="text-muted-foreground font-medium"> <span className="font-medium text-muted-foreground">
<Trans>Progress</Trans> <Trans>Progress</Trans>
</span> </span>
<span className="text-muted-foreground"> <span className="text-muted-foreground">
@@ -120,9 +120,9 @@ export function MultiSignDocumentList({ envelopes, onDocumentSelect }: MultiSign
{envelopes.map((envelope) => ( {envelopes.map((envelope) => (
<div <div
key={envelope.document.id} key={envelope.document.id}
className="border-border flex items-center gap-4 rounded-lg border px-4 py-2" className="flex items-center gap-4 rounded-lg border border-border px-4 py-2"
> >
<span className="text-foreground flex-1 truncate text-sm font-medium"> <span className="flex-1 truncate text-sm font-medium text-foreground">
{envelope.document.title} {envelope.document.title}
</span> </span>
@@ -216,18 +216,18 @@ export const EnableAuthenticatorAppDialog = ({ onSuccess }: EnableAuthenticatorA
}} }}
/> />
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans> <Trans>
If your authenticator app does not support QR codes, you can use the If your authenticator app does not support QR codes, you can use the
following code instead: following code instead:
</Trans> </Trans>
</p> </p>
<p className="bg-muted/60 text-muted-foreground rounded-lg p-2 text-center font-mono tracking-widest"> <p className="rounded-lg bg-muted/60 p-2 text-center font-mono tracking-widest text-muted-foreground">
{setup2FAData?.secret} {setup2FAData?.secret}
</p> </p>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans> <Trans>
Once you have scanned the QR code or entered the code manually, enter the Once you have scanned the QR code or entered the code manually, enter the
code provided by your authenticator app below. code provided by your authenticator app below.
@@ -42,7 +42,7 @@ export const RecoveryCodeList = ({ recoveryCodes }: RecoveryCodeListProps) => {
{recoveryCodes.map((code) => ( {recoveryCodes.map((code) => (
<div <div
key={code} key={code}
className="bg-muted text-muted-foreground relative rounded-lg p-4 font-mono md:text-center" className="relative rounded-lg bg-muted p-4 font-mono text-muted-foreground md:text-center"
> >
<span>{code}</span> <span>{code}</span>
@@ -168,7 +168,7 @@ export const AvatarImageForm = ({ className, team, organisation }: AvatarImageFo
{hasAvatarImage && ( {hasAvatarImage && (
<button <button
type="button" type="button"
className="bg-background/70 text-destructive absolute inset-0 flex cursor-pointer items-center justify-center text-xs opacity-0 transition-opacity hover:opacity-100" className="absolute inset-0 flex cursor-pointer items-center justify-center bg-background/70 text-xs text-destructive opacity-0 transition-opacity hover:opacity-100"
disabled={form.formState.isSubmitting} disabled={form.formState.isSubmitting}
onClick={() => void onFormSubmit({ bytes: null })} onClick={() => void onFormSubmit({ bytes: null })}
> >
@@ -173,7 +173,7 @@ export function BrandingPreferencesForm({
/> />
<div className="relative flex w-full flex-col gap-y-4"> <div className="relative flex w-full flex-col gap-y-4">
{!isBrandingEnabled && <div className="bg-background/60 absolute inset-0 z-[9998]" />} {!isBrandingEnabled && <div className="absolute inset-0 z-[9998] bg-background/60" />}
<FormField <FormField
control={form.control} control={form.control}
@@ -185,7 +185,7 @@ export function BrandingPreferencesForm({
</FormLabel> </FormLabel>
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
<div className="border-border bg-background relative h-48 w-full overflow-hidden rounded-lg border"> <div className="relative h-48 w-full overflow-hidden rounded-lg border border-border bg-background">
{previewUrl ? ( {previewUrl ? (
<img <img
src={previewUrl} src={previewUrl}
@@ -193,12 +193,12 @@ export function BrandingPreferencesForm({
className="h-full w-full object-contain p-4" className="h-full w-full object-contain p-4"
/> />
) : ( ) : (
<div className="bg-muted/20 dark:bg-muted text-muted-foreground relative flex h-full w-full items-center justify-center text-sm"> <div className="relative flex h-full w-full items-center justify-center bg-muted/20 text-sm text-muted-foreground dark:bg-muted">
<Trans>Please upload a logo</Trans> <Trans>Please upload a logo</Trans>
{!hasLoadedPreview && ( {!hasLoadedPreview && (
<div className="bg-muted dark:bg-muted absolute inset-0 z-[999] flex items-center justify-center"> <div className="absolute inset-0 z-[999] flex items-center justify-center bg-muted dark:bg-muted">
<Loader className="text-muted-foreground h-8 w-8 animate-spin" /> <Loader className="h-8 w-8 animate-spin text-muted-foreground" />
</div> </div>
)} )}
</div> </div>
@@ -243,7 +243,7 @@ export function BrandingPreferencesForm({
type="button" type="button"
variant="link" variant="link"
size="sm" size="sm"
className="text-destructive text-xs" className="text-xs text-destructive"
onClick={() => { onClick={() => {
setPreviewUrl(''); setPreviewUrl('');
onChange(null); onChange(null);
@@ -184,7 +184,7 @@ export const EditorFieldCheckboxForm = ({
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Select value={field.value} onValueChange={field.onChange}> <Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger className="text-muted-foreground bg-background w-full"> <SelectTrigger className="w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Select direction`} /> <SelectValue placeholder={t`Select direction`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -214,7 +214,7 @@ export const EditorFieldCheckboxForm = ({
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Select {...field} onValueChange={field.onChange}> <Select {...field} onValueChange={field.onChange}>
<SelectTrigger className="text-muted-foreground bg-background w-full"> <SelectTrigger className="w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Select at least`} /> <SelectValue placeholder={t`Select at least`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -260,7 +260,7 @@ export const EditorFieldCheckboxForm = ({
void form.trigger(); void form.trigger();
}} }}
> >
<SelectTrigger className="text-muted-foreground bg-background mt-5 w-full"> <SelectTrigger className="mt-5 w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Pick a number`} /> <SelectValue placeholder={t`Pick a number`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -310,7 +310,7 @@ export const EditorFieldCheckboxForm = ({
<FormItem> <FormItem>
<FormControl> <FormControl>
<Checkbox <Checkbox
className="data-[state=checked]:bg-primary border-foreground/30 h-5 w-5" className="h-5 w-5 border-foreground/30 data-[state=checked]:bg-primary"
checked={field.value} checked={field.value}
onCheckedChange={field.onChange} onCheckedChange={field.onChange}
/> />
@@ -176,7 +176,7 @@ export const EditorFieldDropdownForm = ({
value={field.value ?? '-1'} value={field.value ?? '-1'}
onValueChange={(value) => field.onChange(value === '-1' ? undefined : value)} onValueChange={(value) => field.onChange(value === '-1' ? undefined : value)}
> >
<SelectTrigger className="text-muted-foreground bg-background w-full"> <SelectTrigger className="w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Default Value`} /> <SelectValue placeholder={t`Default Value`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -255,7 +255,7 @@ export const EditorGenericRequiredField = ({
onCheckedChange={field.onChange} onCheckedChange={field.onChange}
/> />
<label className="text-muted-foreground ml-2 text-sm" htmlFor="field-required"> <label className="ml-2 text-sm text-muted-foreground" htmlFor="field-required">
<Trans>Required Field</Trans> <Trans>Required Field</Trans>
</label> </label>
</div> </div>
@@ -298,7 +298,7 @@ export const EditorGenericReadOnlyField = ({
onCheckedChange={field.onChange} onCheckedChange={field.onChange}
/> />
<label className="text-muted-foreground ml-2 text-sm" htmlFor="field-read-only"> <label className="ml-2 text-sm text-muted-foreground" htmlFor="field-read-only">
<Trans>Read Only</Trans> <Trans>Read Only</Trans>
</label> </label>
</div> </div>
@@ -203,7 +203,7 @@ export const EditorFieldNumberForm = ({
value={field.value === null ? '-1' : field.value} value={field.value === null ? '-1' : field.value}
onValueChange={(value) => field.onChange(value === '-1' ? null : value)} onValueChange={(value) => field.onChange(value === '-1' ? null : value)}
> >
<SelectTrigger className="text-muted-foreground bg-background w-full"> <SelectTrigger className="w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Field format`} /> <SelectValue placeholder={t`Field format`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -140,7 +140,7 @@ export const EditorFieldRadioForm = ({
</FormLabel> </FormLabel>
<FormControl> <FormControl>
<Select value={field.value} onValueChange={field.onChange}> <Select value={field.value} onValueChange={field.onChange}>
<SelectTrigger className="text-muted-foreground bg-background w-full"> <SelectTrigger className="w-full bg-background text-muted-foreground">
<SelectValue placeholder={t`Select direction`} /> <SelectValue placeholder={t`Select direction`} />
</SelectTrigger> </SelectTrigger>
<SelectContent position="popper"> <SelectContent position="popper">
@@ -187,7 +187,7 @@ export const EditorFieldRadioForm = ({
<FormItem> <FormItem>
<FormControl> <FormControl>
<Checkbox <Checkbox
className="data-[state=checked]:bg-primary border-foreground/30 h-5 w-5" className="h-5 w-5 border-foreground/30 data-[state=checked]:bg-primary"
checked={field.value} checked={field.value}
onCheckedChange={(value) => { onCheckedChange={(value) => {
// Uncheck all other values. // Uncheck all other values.
@@ -60,7 +60,7 @@ export const EditorFieldSignatureForm = ({
<fieldset className="flex flex-col gap-2"> <fieldset className="flex flex-col gap-2">
<div> <div>
<EditorGenericFontSizeField formControl={form.control} /> <EditorGenericFontSizeField formControl={form.control} />
<p className="text-muted-foreground mt-0.5 text-xs"> <p className="mt-0.5 text-xs text-muted-foreground">
<Trans>The typed signature font size</Trans> <Trans>The typed signature font size</Trans>
</p> </p>
</div> </div>
@@ -131,7 +131,7 @@ export const OrganisationUpdateForm = () => {
<Input className="bg-background" {...field} /> <Input className="bg-background" {...field} />
</FormControl> </FormControl>
{!form.formState.errors.url && ( {!form.formState.errors.url && (
<span className="text-foreground/50 text-xs font-normal"> <span className="text-xs font-normal text-foreground/50">
{field.value ? ( {field.value ? (
`${NEXT_PUBLIC_WEBAPP_URL()}/o/${field.value}` `${NEXT_PUBLIC_WEBAPP_URL()}/o/${field.value}`
) : ( ) : (
@@ -155,7 +155,7 @@ export const PublicProfileForm = ({
</FormControl> </FormControl>
{!isPersonalLayoutMode && ( {!isPersonalLayoutMode && (
<p className="text-muted-foreground text-xs"> <p className="text-xs text-muted-foreground">
<Trans> <Trans>
You can update the profile URL by updating the team URL in the general You can update the profile URL by updating the team URL in the general
settings page. settings page.
@@ -165,7 +165,7 @@ export const PublicProfileForm = ({
<div className="h-8"> <div className="h-8">
{!form.formState.errors.url && ( {!form.formState.errors.url && (
<div className="text-muted-foreground h-8 text-sm"> <div className="h-8 text-sm text-muted-foreground">
{field.value ? ( {field.value ? (
<div> <div>
<Button <Button
@@ -229,7 +229,7 @@ export const PublicProfileForm = ({
</FormControl> </FormControl>
{!form.formState.errors.profileBio && ( {!form.formState.errors.profileBio && (
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
{remaningLength >= 0 ? ( {remaningLength >= 0 ? (
<Plural <Plural
value={remaningLength} value={remaningLength}
@@ -41,7 +41,7 @@ export const SearchParamSelector = ({ children, paramKey, isValueValid }: Search
return ( return (
<Select defaultValue={value} onValueChange={onValueChange}> <Select defaultValue={value} onValueChange={onValueChange}>
<SelectTrigger className="text-muted-foreground max-w-[200px]"> <SelectTrigger className="max-w-[200px] text-muted-foreground">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
+14 -14
View File
@@ -196,7 +196,7 @@ export const SignUpForm = ({
return ( return (
<div className={cn('flex justify-center gap-x-12', className)}> <div className={cn('flex justify-center gap-x-12', className)}>
<div className="border-border relative hidden flex-1 overflow-hidden rounded-xl border xl:flex"> <div className="relative hidden flex-1 overflow-hidden rounded-xl border border-border xl:flex">
<div className="absolute -inset-8 -z-[2] backdrop-blur"> <div className="absolute -inset-8 -z-[2] backdrop-blur">
<img <img
src={communityCardsImage} src={communityCardsImage}
@@ -205,17 +205,17 @@ export const SignUpForm = ({
/> />
</div> </div>
<div className="bg-background/50 absolute -inset-8 -z-[1] backdrop-blur-[2px]" /> <div className="absolute -inset-8 -z-[1] bg-background/50 backdrop-blur-[2px]" />
<div className="relative flex h-full w-full flex-col items-center justify-evenly"> <div className="relative flex h-full w-full flex-col items-center justify-evenly">
<div className="bg-background rounded-2xl border px-4 py-1 text-sm font-medium"> <div className="rounded-2xl border bg-background px-4 py-1 text-sm font-medium">
<Trans>User profiles are here!</Trans> <Trans>User profiles are here!</Trans>
</div> </div>
<div className="w-full max-w-md"> <div className="w-full max-w-md">
<UserProfileTimur <UserProfileTimur
rows={2} rows={2}
className="bg-background border-border rounded-2xl border shadow-md" className="rounded-2xl border border-border bg-background shadow-md"
/> />
</div> </div>
@@ -223,13 +223,13 @@ export const SignUpForm = ({
</div> </div>
</div> </div>
<div className="border-border dark:bg-background relative z-10 flex min-h-[min(850px,80vh)] w-full max-w-lg flex-col rounded-xl border bg-neutral-100 p-6"> <div className="relative z-10 flex min-h-[min(850px,80vh)] w-full max-w-lg flex-col rounded-xl border border-border bg-neutral-100 p-6 dark:bg-background">
<div className="h-20"> <div className="h-20">
<h1 className="text-xl font-semibold md:text-2xl"> <h1 className="text-xl font-semibold md:text-2xl">
<Trans>Create a new account</Trans> <Trans>Create a new account</Trans>
</h1> </h1>
<p className="text-muted-foreground mt-2 text-xs md:text-sm"> <p className="mt-2 text-xs text-muted-foreground md:text-sm">
<Trans> <Trans>
Create your account and start using state-of-the-art document signing. Open and Create your account and start using state-of-the-art document signing. Open and
beautiful signing is within your grasp. beautiful signing is within your grasp.
@@ -325,11 +325,11 @@ export const SignUpForm = ({
{hasSocialAuthEnabled && ( {hasSocialAuthEnabled && (
<> <>
<div className="relative flex items-center justify-center gap-x-4 py-2 text-xs uppercase"> <div className="relative flex items-center justify-center gap-x-4 py-2 text-xs uppercase">
<div className="bg-border h-px flex-1" /> <div className="h-px flex-1 bg-border" />
<span className="text-muted-foreground bg-transparent"> <span className="bg-transparent text-muted-foreground">
<Trans>Or</Trans> <Trans>Or</Trans>
</span> </span>
<div className="bg-border h-px flex-1" /> <div className="h-px flex-1 bg-border" />
</div> </div>
</> </>
)} )}
@@ -340,7 +340,7 @@ export const SignUpForm = ({
type="button" type="button"
size="lg" size="lg"
variant={'outline'} variant={'outline'}
className="bg-background text-muted-foreground border" className="border bg-background text-muted-foreground"
disabled={isSubmitting} disabled={isSubmitting}
onClick={onSignUpWithGoogleClick} onClick={onSignUpWithGoogleClick}
> >
@@ -356,7 +356,7 @@ export const SignUpForm = ({
type="button" type="button"
size="lg" size="lg"
variant={'outline'} variant={'outline'}
className="bg-background text-muted-foreground border" className="border bg-background text-muted-foreground"
disabled={isSubmitting} disabled={isSubmitting}
onClick={onSignUpWithMicrosoftClick} onClick={onSignUpWithMicrosoftClick}
> >
@@ -376,7 +376,7 @@ export const SignUpForm = ({
type="button" type="button"
size="lg" size="lg"
variant={'outline'} variant={'outline'}
className="bg-background text-muted-foreground border" className="border bg-background text-muted-foreground"
disabled={isSubmitting} disabled={isSubmitting}
onClick={onSignUpWithOIDCClick} onClick={onSignUpWithOIDCClick}
> >
@@ -386,7 +386,7 @@ export const SignUpForm = ({
</> </>
)} )}
<p className="text-muted-foreground mt-4 text-sm"> <p className="mt-4 text-sm text-muted-foreground">
<Trans> <Trans>
Already have an account?{' '} Already have an account?{' '}
<Link to="/signin" className="text-documenso-700 duration-200 hover:opacity-70"> <Link to="/signin" className="text-documenso-700 duration-200 hover:opacity-70">
@@ -406,7 +406,7 @@ export const SignUpForm = ({
</Button> </Button>
</form> </form>
</Form> </Form>
<p className="text-muted-foreground mt-6 text-xs"> <p className="mt-6 text-xs text-muted-foreground">
<Trans> <Trans>
By proceeding, you agree to our{' '} By proceeding, you agree to our{' '}
<Link <Link
@@ -129,7 +129,7 @@ export const TeamUpdateForm = ({ teamId, teamName, teamUrl }: UpdateTeamDialogPr
<Input className="bg-background" {...field} /> <Input className="bg-background" {...field} />
</FormControl> </FormControl>
{!form.formState.errors.url && ( {!form.formState.errors.url && (
<span className="text-foreground/50 text-xs font-normal"> <span className="text-xs font-normal text-foreground/50">
{field.value ? ( {field.value ? (
`${NEXT_PUBLIC_WEBAPP_URL()}/t/${field.value}` `${NEXT_PUBLIC_WEBAPP_URL()}/t/${field.value}`
) : ( ) : (
@@ -44,7 +44,7 @@ export const MonthlyActiveUsersChart = ({
return ( return (
<div className={className}> <div className={className}>
<div className="border-border flex flex-1 flex-col justify-center rounded-2xl border p-6 pl-2"> <div className="flex flex-1 flex-col justify-center rounded-2xl border border-border p-6 pl-2">
<div className="mb-6 flex px-4"> <div className="mb-6 flex px-4">
<h3 className="text-lg font-semibold">{title}</h3> <h3 className="text-lg font-semibold">{title}</h3>
</div> </div>
@@ -26,7 +26,7 @@ export const AdminStatsSignerConversionChart = ({
return ( return (
<div className={className}> <div className={className}>
<div className="border-border flex flex-1 flex-col justify-center rounded-2xl border p-6 pl-2"> <div className="flex flex-1 flex-col justify-center rounded-2xl border border-border p-6 pl-2">
<div className="mb-6 flex px-4"> <div className="mb-6 flex px-4">
<h3 className="text-lg font-semibold">{title}</h3> <h3 className="text-lg font-semibold">{title}</h3>
</div> </div>
@@ -60,7 +60,7 @@ export const AdminStatsUsersWithDocumentsChart = ({
return ( return (
<div className={className}> <div className={className}>
<div className="border-border flex flex-1 flex-col justify-center rounded-2xl border p-6 pl-2"> <div className="flex flex-1 flex-col justify-center rounded-2xl border border-border p-6 pl-2">
<div className="mb-6 flex h-12 px-4"> <div className="mb-6 flex h-12 px-4">
<h3 className="text-lg font-semibold">{title}</h3> <h3 className="text-lg font-semibold">{title}</h3>
</div> </div>
@@ -52,7 +52,7 @@ export const Header = ({ className, ...props }: HeaderProps) => {
return ( return (
<header <header
className={cn( className={cn(
'supports-backdrop-blur:bg-background/60 bg-background/95 sticky top-0 z-[60] flex h-16 w-full items-center border-b border-b-transparent backdrop-blur duration-200', 'supports-backdrop-blur:bg-background/60 sticky top-0 z-[60] flex h-16 w-full items-center border-b border-b-transparent bg-background/95 backdrop-blur duration-200',
scrollY > 5 && 'border-b-border', scrollY > 5 && 'border-b-border',
className, className,
)} )}
@@ -61,7 +61,7 @@ export const Header = ({ className, ...props }: HeaderProps) => {
<div className="mx-auto flex w-full max-w-screen-xl items-center justify-between gap-x-4 px-4 md:justify-normal md:px-8"> <div className="mx-auto flex w-full max-w-screen-xl items-center justify-between gap-x-4 px-4 md:justify-normal md:px-8">
<Link <Link
to={getRootHref(params)} to={getRootHref(params)}
className="focus-visible:ring-ring ring-offset-background hidden rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 md:inline" className="hidden rounded-md ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 md:inline"
> >
<BrandingLogo className="h-6 w-auto" /> <BrandingLogo className="h-6 w-auto" />
</Link> </Link>
@@ -70,10 +70,10 @@ export const Header = ({ className, ...props }: HeaderProps) => {
<Button asChild variant="outline" className="relative hidden h-10 w-10 rounded-lg md:flex"> <Button asChild variant="outline" className="relative hidden h-10 w-10 rounded-lg md:flex">
<Link to="/inbox" className="relative block h-10 w-10"> <Link to="/inbox" className="relative block h-10 w-10">
<InboxIcon className="text-muted-foreground hover:text-foreground h-5 w-5 flex-shrink-0 transition-colors" /> <InboxIcon className="h-5 w-5 flex-shrink-0 text-muted-foreground transition-colors hover:text-foreground" />
{unreadCountData && unreadCountData.count > 0 && ( {unreadCountData && unreadCountData.count > 0 && (
<span className="bg-primary text-primary-foreground absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full text-[10px] font-semibold"> <span className="absolute -right-1.5 -top-1.5 flex h-5 w-5 items-center justify-center rounded-full bg-primary text-[10px] font-semibold text-primary-foreground">
{unreadCountData.count > 99 ? '99+' : unreadCountData.count} {unreadCountData.count > 99 ? '99+' : unreadCountData.count}
</span> </span>
)} )}
@@ -86,11 +86,11 @@ export const Header = ({ className, ...props }: HeaderProps) => {
<div className="flex flex-row items-center space-x-4 md:hidden"> <div className="flex flex-row items-center space-x-4 md:hidden">
<button onClick={() => setIsCommandMenuOpen(true)}> <button onClick={() => setIsCommandMenuOpen(true)}>
<SearchIcon className="text-muted-foreground h-6 w-6" /> <SearchIcon className="h-6 w-6 text-muted-foreground" />
</button> </button>
<button onClick={() => setIsHamburgerMenuOpen(true)}> <button onClick={() => setIsHamburgerMenuOpen(true)}>
<MenuIcon className="text-muted-foreground h-6 w-6" /> <MenuIcon className="h-6 w-6 text-muted-foreground" />
</button> </button>
<AppCommandMenu open={isCommandMenuOpen} onOpenChange={setIsCommandMenuOpen} /> <AppCommandMenu open={isCommandMenuOpen} onOpenChange={setIsCommandMenuOpen} />
@@ -86,7 +86,7 @@ export const AppNavDesktop = ({
key={href} key={href}
to={href} to={href}
className={cn( className={cn(
'text-muted-foreground dark:text-muted-foreground/60 focus-visible:ring-ring ring-offset-background rounded-md font-medium leading-5 hover:opacity-80 focus-visible:outline-none focus-visible:ring-2', 'rounded-md font-medium leading-5 text-muted-foreground ring-offset-background hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring dark:text-muted-foreground/60',
{ {
'text-foreground dark:text-muted-foreground': pathname?.startsWith(href), 'text-foreground dark:text-muted-foreground': pathname?.startsWith(href),
}, },
@@ -102,7 +102,7 @@ export const AppNavDesktop = ({
<Button <Button
variant="outline" variant="outline"
className="text-muted-foreground flex w-full max-w-96 items-center justify-between rounded-lg" className="flex w-full max-w-96 items-center justify-between rounded-lg text-muted-foreground"
onClick={() => setIsCommandMenuOpen(true)} onClick={() => setIsCommandMenuOpen(true)}
> >
<div className="flex items-center"> <div className="flex items-center">
@@ -111,7 +111,7 @@ export const AppNavDesktop = ({
</div> </div>
<div> <div>
<div className="text-muted-foreground bg-muted flex items-center rounded-md px-1.5 py-0.5 text-xs tracking-wider"> <div className="flex items-center rounded-md bg-muted px-1.5 py-0.5 text-xs tracking-wider text-muted-foreground">
{modifierKey}+K {modifierKey}+K
</div> </div>
</div> </div>
@@ -97,13 +97,13 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
{menuNavigationLinks.map(({ href, text }) => ( {menuNavigationLinks.map(({ href, text }) => (
<Link <Link
key={href} key={href}
className="text-foreground hover:text-foreground/80 flex items-center gap-2 text-2xl font-semibold" className="flex items-center gap-2 text-2xl font-semibold text-foreground hover:text-foreground/80"
to={href} to={href}
onClick={() => handleMenuItemClick()} onClick={() => handleMenuItemClick()}
> >
{text} {text}
{href === '/inbox' && unreadCountData && unreadCountData.count > 0 && ( {href === '/inbox' && unreadCountData && unreadCountData.count > 0 && (
<span className="bg-primary text-primary-foreground flex h-6 min-w-[1.5rem] items-center justify-center rounded-full px-1.5 text-xs font-semibold"> <span className="flex h-6 min-w-[1.5rem] items-center justify-center rounded-full bg-primary px-1.5 text-xs font-semibold text-primary-foreground">
{unreadCountData.count > 99 ? '99+' : unreadCountData.count} {unreadCountData.count > 99 ? '99+' : unreadCountData.count}
</span> </span>
)} )}
@@ -111,7 +111,7 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
))} ))}
<button <button
className="text-foreground hover:text-foreground/80 text-2xl font-semibold" className="text-2xl font-semibold text-foreground hover:text-foreground/80"
onClick={async () => authClient.signOut()} onClick={async () => authClient.signOut()}
> >
<Trans>Sign Out</Trans> <Trans>Sign Out</Trans>
@@ -123,7 +123,7 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
<ThemeSwitcher /> <ThemeSwitcher />
</div> </div>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
© {new Date().getFullYear()} Documenso, Inc. © {new Date().getFullYear()} Documenso, Inc.
<br /> <br />
<Trans>All rights reserved.</Trans> <Trans>All rights reserved.</Trans>
@@ -38,7 +38,7 @@ export const DirectTemplateAuthPageView = () => {
<Trans>Authentication required</Trans> <Trans>Authentication required</Trans>
</h1> </h1>
<p className="text-muted-foreground mt-2 text-sm"> <p className="mt-2 text-sm text-muted-foreground">
<Trans>You need to be logged in to view this page.</Trans> <Trans>You need to be logged in to view this page.</Trans>
</p> </p>
@@ -151,7 +151,7 @@ export const AccessAuth2FAForm = ({ onSubmit, token, error }: AccessAuth2FAFormP
<h3 className="text-lg font-semibold"> <h3 className="text-lg font-semibold">
<Trans>Choose verification method</Trans> <Trans>Choose verification method</Trans>
</h3> </h3>
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans>Please select how you'd like to receive your verification code.</Trans> <Trans>Please select how you'd like to receive your verification code.</Trans>
</p> </p>
</div> </div>
@@ -175,7 +175,7 @@ export const AccessAuth2FAForm = ({ onSubmit, token, error }: AccessAuth2FAFormP
<div className="font-medium"> <div className="font-medium">
<Trans>Email verification</Trans> <Trans>Email verification</Trans>
</div> </div>
<div className="text-muted-foreground text-sm"> <div className="text-sm text-muted-foreground">
<Trans>We'll send a 6-digit code to your email</Trans> <Trans>We'll send a 6-digit code to your email</Trans>
</div> </div>
</div> </div>
@@ -194,7 +194,7 @@ export const AccessAuth2FAForm = ({ onSubmit, token, error }: AccessAuth2FAFormP
<div className="font-medium"> <div className="font-medium">
<Trans>Authenticator app</Trans> <Trans>Authenticator app</Trans>
</div> </div>
<div className="text-muted-foreground text-sm"> <div className="text-sm text-muted-foreground">
<Trans>Use your authenticator app to generate a code</Trans> <Trans>Use your authenticator app to generate a code</Trans>
</div> </div>
</div> </div>
@@ -216,7 +216,7 @@ export const AccessAuth2FAForm = ({ onSubmit, token, error }: AccessAuth2FAFormP
</h3> </h3>
</div> </div>
<div className="text-muted-foreground text-sm"> <div className="text-sm text-muted-foreground">
{selectedMethod === 'email' ? ( {selectedMethod === 'email' ? (
<Trans> <Trans>
We've sent a 6-digit verification code to your email. Please enter it below to We've sent a 6-digit verification code to your email. Please enter it below to
@@ -262,7 +262,7 @@ export const AccessAuth2FAForm = ({ onSubmit, token, error }: AccessAuth2FAFormP
{expiresAt && millisecondsRemaining !== null && ( {expiresAt && millisecondsRemaining !== null && (
<div <div
className={cn('text-muted-foreground mt-2 text-center text-sm', { className={cn('mt-2 text-center text-sm text-muted-foreground', {
'text-destructive': millisecondsRemaining <= 0, 'text-destructive': millisecondsRemaining <= 0,
})} })}
> >
@@ -47,7 +47,7 @@ export const DocumentSigningAttachmentsPopover = ({
<h4 className="font-medium"> <h4 className="font-medium">
<Trans>Attachments</Trans> <Trans>Attachments</Trans>
</h4> </h4>
<p className="text-muted-foreground mt-1 text-sm"> <p className="mt-1 text-sm text-muted-foreground">
<Trans>Documents and resources related to this envelope.</Trans> <Trans>Documents and resources related to this envelope.</Trans>
</p> </p>
</div> </div>
@@ -60,14 +60,14 @@ export const DocumentSigningAttachmentsPopover = ({
title={attachment.data} title={attachment.data}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="border-border hover:bg-muted/50 group flex items-center justify-between rounded-md border px-3 py-2.5 transition duration-200" className="group flex items-center justify-between rounded-md border border-border px-3 py-2.5 transition duration-200 hover:bg-muted/50"
> >
<div className="flex flex-1 items-center gap-2.5"> <div className="flex flex-1 items-center gap-2.5">
<div className="bg-muted rounded p-2"> <div className="rounded bg-muted p-2">
<PaperclipIcon className="h-4 w-4" /> <PaperclipIcon className="h-4 w-4" />
</div> </div>
<span className="text-muted-foreground hover:text-foreground block truncate text-sm underline"> <span className="block truncate text-sm text-muted-foreground underline hover:text-foreground">
{attachment.label} {attachment.label}
</span> </span>
</div> </div>
@@ -123,7 +123,7 @@ export const DocumentSigningAuthDialog = ({
{/* Show chooser if no auth type is selected and there are multiple options */} {/* Show chooser if no auth type is selected and there are multiple options */}
{!selectedAuthType && validAuthTypes.length > 1 && ( {!selectedAuthType && validAuthTypes.length > 1 && (
<div className="space-y-4"> <div className="space-y-4">
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
<Trans>Choose your preferred authentication method:</Trans> <Trans>Choose your preferred authentication method:</Trans>
</p> </p>
<div className="grid gap-2"> <div className="grid gap-2">
@@ -145,7 +145,7 @@ export const DocumentSigningAuthDialog = ({
.exhaustive()} .exhaustive()}
</div> </div>
<div className="text-muted-foreground text-sm"> <div className="text-sm text-muted-foreground">
{match(authType) {match(authType)
.with(DocumentAuth.ACCOUNT, () => <Trans>Sign in to your account</Trans>) .with(DocumentAuth.ACCOUNT, () => <Trans>Sign in to your account</Trans>)
.with(DocumentAuth.PASSKEY, () => ( .with(DocumentAuth.PASSKEY, () => (
@@ -54,7 +54,7 @@ export const DocumentSigningAuthPageView = ({
<Trans>Authentication required</Trans> <Trans>Authentication required</Trans>
</h1> </h1>
<p className="text-muted-foreground mt-2 text-sm"> <p className="mt-2 text-sm text-muted-foreground">
{email ? ( {email ? (
<Trans> <Trans>
You need to be logged in as <strong>{email}</strong> to view this page. You need to be logged in as <strong>{email}</strong> to view this page.
@@ -184,9 +184,9 @@ export const DocumentSigningAuthProvider = ({
// Assume that a user must be logged in for any auth requirements. // Assume that a user must be logged in for any auth requirements.
const isAuthRedirectRequired = Boolean( const isAuthRedirectRequired = Boolean(
derivedRecipientActionAuth && derivedRecipientActionAuth &&
derivedRecipientActionAuth.length > 0 && derivedRecipientActionAuth.length > 0 &&
!derivedRecipientActionAuth.includes(DocumentAuth.EXPLICIT_NONE) && !derivedRecipientActionAuth.includes(DocumentAuth.EXPLICIT_NONE) &&
user?.email !== recipient.email, user?.email !== recipient.email,
); );
const refetchPasskeys = async () => { const refetchPasskeys = async () => {
@@ -167,7 +167,7 @@ export const DocumentSigningAutoSign = ({ recipient, fields }: DocumentSigningAu
</DialogTitle> </DialogTitle>
</DialogHeader> </DialogHeader>
<div className="text-muted-foreground max-w-[50ch]"> <div className="max-w-[50ch] text-muted-foreground">
<p> <p>
<Trans> <Trans>
When you sign a document, we can automatically fill in and sign the following fields When you sign a document, we can automatically fill in and sign the following fields
@@ -265,8 +265,8 @@ export const DocumentSigningCheckboxField = ({
type="Checkbox" type="Checkbox"
> >
{isLoading && ( {isLoading && (
<div className="bg-background absolute inset-0 z-20 flex items-center justify-center rounded-md"> <div className="absolute inset-0 z-20 flex items-center justify-center rounded-md bg-background">
<Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" /> <Loader className="h-5 w-5 animate-spin text-primary md:h-8 md:w-8" />
</div> </div>
)} )}
@@ -300,7 +300,7 @@ export const DocumentSigningCheckboxField = ({
{!item.value.includes('empty-value-') && item.value && ( {!item.value.includes('empty-value-') && item.value && (
<Label <Label
htmlFor={`checkbox-${field.id}-${item.id}`} htmlFor={`checkbox-${field.id}-${item.id}`}
className="text-foreground ml-1.5 text-xs font-normal" className="ml-1.5 text-xs font-normal text-foreground"
> >
{item.value} {item.value}
</Label> </Label>
@@ -334,7 +334,7 @@ export const DocumentSigningCheckboxField = ({
{!item.value.includes('empty-value-') && item.value && ( {!item.value.includes('empty-value-') && item.value && (
<Label <Label
htmlFor={`checkbox-${field.id}-${item.id}`} htmlFor={`checkbox-${field.id}-${item.id}`}
className="text-foreground ml-1.5 text-xs font-normal" className="ml-1.5 text-xs font-normal text-foreground"
> >
{item.value} {item.value}
</Label> </Label>
@@ -136,13 +136,13 @@ export const DocumentSigningDateField = ({
tooltipText={isDifferentTime ? tooltipText : undefined} tooltipText={isDifferentTime ? tooltipText : undefined}
> >
{isLoading && ( {isLoading && (
<div className="bg-background absolute inset-0 flex items-center justify-center rounded-md"> <div className="absolute inset-0 flex items-center justify-center rounded-md bg-background">
<Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" /> <Loader className="h-5 w-5 animate-spin text-primary md:h-8 md:w-8" />
</div> </div>
)} )}
{!field.inserted && ( {!field.inserted && (
<p className="group-hover:text-primary text-foreground group-hover:text-recipient-green text-[clamp(0.425rem,25cqw,0.825rem)] duration-200"> <p className="text-[clamp(0.425rem,25cqw,0.825rem)] text-foreground duration-200 group-hover:text-primary group-hover:text-recipient-green">
<Trans>Date</Trans> <Trans>Date</Trans>
</p> </p>
)} )}
@@ -151,7 +151,7 @@ export const DocumentSigningDateField = ({
<div className="flex h-full w-full items-center"> <div className="flex h-full w-full items-center">
<p <p
className={cn( className={cn(
'text-foreground w-full whitespace-nowrap text-left text-[clamp(0.425rem,25cqw,0.825rem)] duration-200', 'w-full whitespace-nowrap text-left text-[clamp(0.425rem,25cqw,0.825rem)] text-foreground duration-200',
{ {
'!text-center': parsedFieldMeta?.textAlign === 'center', '!text-center': parsedFieldMeta?.textAlign === 'center',
'!text-right': parsedFieldMeta?.textAlign === 'right', '!text-right': parsedFieldMeta?.textAlign === 'right',
@@ -12,7 +12,7 @@ export const DocumentSigningDisclosure = ({
...props ...props
}: DocumentSigningDisclosureProps) => { }: DocumentSigningDisclosureProps) => {
return ( return (
<p className={cn('text-muted-foreground text-xs', className)} {...props}> <p className={cn('text-xs text-muted-foreground', className)} {...props}>
<Trans> <Trans>
By proceeding with your electronic signature, you acknowledge and consent that it will be By proceeding with your electronic signature, you acknowledge and consent that it will be
used to sign the given document and holds the same legal validity as a handwritten used to sign the given document and holds the same legal validity as a handwritten
@@ -171,17 +171,17 @@ export const DocumentSigningDropdownField = ({
type="Dropdown" type="Dropdown"
> >
{isLoading && ( {isLoading && (
<div className="bg-background absolute inset-0 flex items-center justify-center rounded-md"> <div className="absolute inset-0 flex items-center justify-center rounded-md bg-background">
<Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" /> <Loader className="h-5 w-5 animate-spin text-primary md:h-8 md:w-8" />
</div> </div>
)} )}
{!field.inserted && ( {!field.inserted && (
<p className="group-hover:text-primary text-foreground flex flex-col items-center justify-center duration-200"> <p className="flex flex-col items-center justify-center text-foreground duration-200 group-hover:text-primary">
<Select value={localChoice} onValueChange={handleSelectItem}> <Select value={localChoice} onValueChange={handleSelectItem}>
<SelectTrigger <SelectTrigger
className={cn( className={cn(
'text-foreground z-10 h-full w-full border-none ring-0 focus:border-none focus:ring-0', 'z-10 h-full w-full border-none text-foreground ring-0 focus:border-none focus:ring-0',
)} )}
> >
<SelectValue <SelectValue
@@ -201,7 +201,7 @@ export const DocumentSigningDropdownField = ({
)} )}
{field.inserted && ( {field.inserted && (
<p className="text-foreground text-[clamp(0.425rem,25cqw,0.825rem)] duration-200"> <p className="text-[clamp(0.425rem,25cqw,0.825rem)] text-foreground duration-200">
{field.customText} {field.customText}
</p> </p>
)} )}
@@ -180,10 +180,10 @@ export const DocumentSigningFieldContainer = ({
className={cn( className={cn(
'absolute -top-16 left-0 right-0 rounded-md p-2 text-center text-xs text-gray-700', 'absolute -top-16 left-0 right-0 rounded-md p-2 text-center text-xs text-gray-700',
{ {
'bg-foreground/5 border-border border': !field.inserted, 'border border-border bg-foreground/5': !field.inserted,
}, },
{ {
'bg-documenso-200 border-primary border': field.inserted, 'border border-primary bg-documenso-200': field.inserted,
}, },
)} )}
> >
@@ -4,15 +4,15 @@ import { cn } from '@documenso/ui/lib/utils';
export const DocumentSigningFieldsLoader = () => { export const DocumentSigningFieldsLoader = () => {
return ( return (
<div className="bg-background absolute inset-0 flex items-center justify-center rounded-md"> <div className="absolute inset-0 flex items-center justify-center rounded-md bg-background">
<Loader className="text-primary h-5 w-5 animate-spin md:h-8 md:w-8" /> <Loader className="h-5 w-5 animate-spin text-primary md:h-8 md:w-8" />
</div> </div>
); );
}; };
export const DocumentSigningFieldsUninserted = ({ children }: { children: React.ReactNode }) => { export const DocumentSigningFieldsUninserted = ({ children }: { children: React.ReactNode }) => {
return ( return (
<p className="text-foreground group-hover:text-recipient-green whitespace-pre-wrap text-[clamp(0.425rem,25cqw,0.825rem)] duration-200"> <p className="whitespace-pre-wrap text-[clamp(0.425rem,25cqw,0.825rem)] text-foreground duration-200 group-hover:text-recipient-green">
{children} {children}
</p> </p>
); );
@@ -37,7 +37,7 @@ export const DocumentSigningFieldsInserted = ({
<div className="flex h-full w-full items-center overflow-hidden"> <div className="flex h-full w-full items-center overflow-hidden">
<p <p
className={cn( className={cn(
'text-foreground w-full whitespace-pre-wrap text-left text-[clamp(0.425rem,25cqw,0.825rem)] duration-200', 'w-full whitespace-pre-wrap text-left text-[clamp(0.425rem,25cqw,0.825rem)] text-foreground duration-200',
{ {
'!text-center': textAlign === 'center', '!text-center': textAlign === 'center',
'!text-right': textAlign === 'right', '!text-right': textAlign === 'right',
@@ -170,7 +170,7 @@ export const DocumentSigningRadioField = ({
{!item.value.includes('empty-value-') && item.value && ( {!item.value.includes('empty-value-') && item.value && (
<Label <Label
htmlFor={`option-${field.id}-${item.id}`} htmlFor={`option-${field.id}-${item.id}`}
className="text-foreground ml-1.5 text-xs font-normal" className="ml-1.5 text-xs font-normal text-foreground"
> >
{item.value} {item.value}
</Label> </Label>
@@ -194,7 +194,7 @@ export const DocumentSigningRadioField = ({
{!item.value.includes('empty-value-') && item.value && ( {!item.value.includes('empty-value-') && item.value && (
<Label <Label
htmlFor={`option-${field.id}-${item.id}`} htmlFor={`option-${field.id}-${item.id}`}
className="text-foreground ml-1.5 text-xs font-normal" className="ml-1.5 text-xs font-normal text-foreground"
> >
{item.value} {item.value}
</Label> </Label>
@@ -279,7 +279,7 @@ export const DocumentSigningTextField = ({
{parsedFieldMeta?.characterLimit !== undefined && {parsedFieldMeta?.characterLimit !== undefined &&
parsedFieldMeta?.characterLimit > 0 && parsedFieldMeta?.characterLimit > 0 &&
!userInputHasErrors && ( !userInputHasErrors && (
<div className="text-muted-foreground text-sm"> <div className="text-sm text-muted-foreground">
<Plural <Plural
value={charactersRemaining} value={charactersRemaining}
one="1 character remaining" one="1 character remaining"
@@ -143,7 +143,7 @@ export const DocumentAttachmentsPopover = ({
<h4 className="font-medium"> <h4 className="font-medium">
<Trans>Attachments</Trans> <Trans>Attachments</Trans>
</h4> </h4>
<p className="text-muted-foreground mt-1 text-sm"> <p className="mt-1 text-sm text-muted-foreground">
<Trans>Add links to relevant documents or resources.</Trans> <Trans>Add links to relevant documents or resources.</Trans>
</p> </p>
</div> </div>
@@ -153,7 +153,7 @@ export const DocumentAttachmentsPopover = ({
{attachments?.data.map((attachment) => ( {attachments?.data.map((attachment) => (
<div <div
key={attachment.id} key={attachment.id}
className="border-border flex items-center justify-between rounded-md border p-2" className="flex items-center justify-between rounded-md border border-border p-2"
> >
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<p className="truncate text-sm font-medium">{attachment.label}</p> <p className="truncate text-sm font-medium">{attachment.label}</p>
@@ -161,7 +161,7 @@ export const DocumentAttachmentsPopover = ({
href={attachment.data} href={attachment.data}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="text-muted-foreground hover:text-foreground truncate text-xs underline" className="truncate text-xs text-muted-foreground underline hover:text-foreground"
> >
{attachment.data} {attachment.data}
</a> </a>
@@ -69,7 +69,7 @@ export const DocumentPageViewDropdown = ({ envelope }: DocumentPageViewDropdownP
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger> <DropdownMenuTrigger>
<MoreHorizontal className="text-muted-foreground h-5 w-5" /> <MoreHorizontal className="h-5 w-5 text-muted-foreground" />
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="w-52" align="end" forceMount> <DropdownMenuContent className="w-52" align="end" forceMount>
@@ -50,7 +50,7 @@ export const DocumentPageViewInformation = ({
}, [isMounted, envelope, userId]); }, [isMounted, envelope, userId]);
return ( return (
<section className="dark:bg-background text-foreground border-border bg-widget flex flex-col rounded-xl border"> <section className="flex flex-col rounded-xl border border-border bg-widget text-foreground dark:bg-background">
<h1 className="px-4 py-3 font-medium"> <h1 className="px-4 py-3 font-medium">
<Trans>Information</Trans> <Trans>Information</Trans>
</h1> </h1>
@@ -88,7 +88,7 @@ export const DocumentRecipientLinkCopyDialog = ({
</DialogDescription> </DialogDescription>
</DialogHeader> </DialogHeader>
<ul className="text-muted-foreground divide-y rounded-lg border"> <ul className="divide-y rounded-lg border text-muted-foreground">
{recipients.length === 0 && ( {recipients.length === 0 && (
<li className="flex flex-col items-center justify-center py-6 text-sm"> <li className="flex flex-col items-center justify-center py-6 text-sm">
<Trans>No recipients</Trans> <Trans>No recipients</Trans>
@@ -99,9 +99,9 @@ export const DocumentRecipientLinkCopyDialog = ({
<li key={recipient.id} className="flex items-center justify-between px-4 py-3 text-sm"> <li key={recipient.id} className="flex items-center justify-between px-4 py-3 text-sm">
<AvatarWithText <AvatarWithText
avatarFallback={recipient.email.slice(0, 1).toUpperCase()} avatarFallback={recipient.email.slice(0, 1).toUpperCase()}
primaryText={<p className="text-muted-foreground text-sm">{recipient.email}</p>} primaryText={<p className="text-sm text-muted-foreground">{recipient.email}</p>}
secondaryText={ secondaryText={
<p className="text-muted-foreground/70 text-xs"> <p className="text-xs text-muted-foreground/70">
{_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)} {_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)}
</p> </p>
} }
@@ -278,13 +278,13 @@ export const EnvelopeEditorFieldDragDrop = ({
onMouseDown={() => setSelectedField(field.type)} onMouseDown={() => setSelectedField(field.type)}
data-selected={selectedField === field.type ? true : undefined} data-selected={selectedField === field.type ? true : undefined}
className={cn( className={cn(
'border-border group flex h-12 cursor-pointer items-center justify-center rounded-lg border px-4 transition-colors', 'group flex h-12 cursor-pointer items-center justify-center rounded-lg border border-border px-4 transition-colors',
RECIPIENT_COLOR_STYLES[selectedRecipientColor].fieldButton, RECIPIENT_COLOR_STYLES[selectedRecipientColor].fieldButton,
)} )}
> >
<p <p
className={cn( className={cn(
'text-muted-foreground font-noto group-data-[selected]:text-foreground flex items-center justify-center gap-x-1.5 text-sm font-normal', 'flex items-center justify-center gap-x-1.5 font-noto text-sm font-normal text-muted-foreground group-data-[selected]:text-foreground',
field.className, field.className,
{ {
'group-hover:text-recipient-green': selectedRecipientColor === 'green', 'group-hover:text-recipient-green': selectedRecipientColor === 'green',
@@ -306,7 +306,7 @@ export const EnvelopeEditorFieldDragDrop = ({
{selectedField && ( {selectedField && (
<div <div
className={cn( className={cn(
'text-muted-foreground dark:text-muted-background font-noto pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white ring-2 transition duration-200 [container-type:size]', 'dark:text-muted-background pointer-events-none fixed z-50 flex cursor-pointer flex-col items-center justify-center rounded-[2px] bg-white font-noto text-muted-foreground ring-2 transition duration-200 [container-type:size]',
RECIPIENT_COLOR_STYLES[selectedRecipientColor].base, RECIPIENT_COLOR_STYLES[selectedRecipientColor].base,
selectedField === FieldType.SIGNATURE && 'font-signature', selectedField === FieldType.SIGNATURE && 'font-signature',
{ {
@@ -72,7 +72,7 @@ export const EnvelopeItemTitleInput = ({
disabled={disabled} disabled={disabled}
style={{ width: `${inputWidth}px` }} style={{ width: `${inputWidth}px` }}
className={cn( className={cn(
'text-foreground hover:outline-muted-foreground focus:outline-muted-foreground rounded-sm border-0 bg-transparent p-1 text-sm font-medium outline-none hover:outline hover:outline-1 focus:outline focus:outline-1', 'rounded-sm border-0 bg-transparent p-1 text-sm font-medium text-foreground outline-none hover:outline hover:outline-1 hover:outline-muted-foreground focus:outline focus:outline-1 focus:outline-muted-foreground',
className, className,
{ {
'outline-red-500': isError, 'outline-red-500': isError,
@@ -58,19 +58,19 @@ export const FolderCard = ({ folder, onMove, onSettings, onDelete }: FolderCardP
return ( return (
<Link to={formatPath()} data-folder-id={folder.id} data-folder-name={folder.name}> <Link to={formatPath()} data-folder-id={folder.id} data-folder-name={folder.name}>
<Card className="hover:bg-muted/50 border-border h-full border transition-all"> <Card className="h-full border border-border transition-all hover:bg-muted/50">
<CardContent className="p-4"> <CardContent className="p-4">
<div className="flex min-w-0 items-center gap-3"> <div className="flex min-w-0 items-center gap-3">
<FolderIcon className="text-documenso h-6 w-6 flex-shrink-0" /> <FolderIcon className="h-6 w-6 flex-shrink-0 text-documenso" />
<div className="flex w-full min-w-0 items-center justify-between"> <div className="flex w-full min-w-0 items-center justify-between">
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<h3 className="flex min-w-0 items-center gap-2 font-medium"> <h3 className="flex min-w-0 items-center gap-2 font-medium">
<span className="truncate">{folder.name}</span> <span className="truncate">{folder.name}</span>
{folder.pinned && <PinIcon className="text-documenso h-3 w-3 flex-shrink-0" />} {folder.pinned && <PinIcon className="h-3 w-3 flex-shrink-0 text-documenso" />}
</h3> </h3>
<div className="text-muted-foreground mt-1 flex space-x-2 truncate text-xs"> <div className="mt-1 flex space-x-2 truncate text-xs text-muted-foreground">
<span> <span>
{folder.type === FolderType.TEMPLATE ? ( {folder.type === FolderType.TEMPLATE ? (
<Plural <Plural
@@ -143,17 +143,17 @@ export const FolderCard = ({ folder, onMove, onSettings, onDelete }: FolderCardP
export const FolderCardEmpty = ({ type }: { type: FolderType }) => { export const FolderCardEmpty = ({ type }: { type: FolderType }) => {
return ( return (
<Card className="hover:bg-muted/50 border-border h-full border transition-all"> <Card className="h-full border border-border transition-all hover:bg-muted/50">
<CardContent className="p-4"> <CardContent className="p-4">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<FolderPlusIcon className="text-muted-foreground/60 h-6 w-6" /> <FolderPlusIcon className="h-6 w-6 text-muted-foreground/60" />
<div> <div>
<h3 className="text-muted-foreground flex items-center gap-2 font-medium"> <h3 className="flex items-center gap-2 font-medium text-muted-foreground">
<Trans>Create folder</Trans> <Trans>Create folder</Trans>
</h3> </h3>
<div className="text-muted-foreground/60 mt-1 flex space-x-2 truncate text-xs"> <div className="mt-1 flex space-x-2 truncate text-xs text-muted-foreground/60">
{type === FolderType.DOCUMENT ? ( {type === FolderType.DOCUMENT ? (
<Trans>Organise your documents</Trans> <Trans>Organise your documents</Trans>
) : ( ) : (
@@ -81,11 +81,11 @@ export const GenericErrorLayout = ({
<div className="inset-0 mx-auto flex h-full flex-grow items-center justify-center px-6 py-32"> <div className="inset-0 mx-auto flex h-full flex-grow items-center justify-center px-6 py-32">
<div> <div>
<p className="text-muted-foreground font-semibold">{_(subHeading)}</p> <p className="font-semibold text-muted-foreground">{_(subHeading)}</p>
<h1 className="mt-3 text-2xl font-bold md:text-3xl">{_(heading)}</h1> <h1 className="mt-3 text-2xl font-bold md:text-3xl">{_(heading)}</h1>
<p className="text-muted-foreground mt-4 text-sm">{_(message)}</p> <p className="mt-4 text-sm text-muted-foreground">{_(message)}</p>
<div className="mt-6 flex gap-x-2.5 gap-y-4 md:items-center"> <div className="mt-6 flex gap-x-2.5 gap-y-4 md:items-center">
{secondaryButton || {secondaryButton ||
@@ -83,7 +83,7 @@ export const LegacyFieldWarningPopover = ({
</Button> </Button>
} }
> >
<p className="text-muted-foreground text-sm"> <p className="text-sm text-muted-foreground">
{type === 'document' ? ( {type === 'document' ? (
<Trans> <Trans>
This document is using legacy field insertion, we recommend using the new field This document is using legacy field insertion, we recommend using the new field
@@ -54,7 +54,7 @@ export const MenuSwitcher = () => {
primaryText={user.name} primaryText={user.name}
secondaryText={_(msg`Personal Account`)} secondaryText={_(msg`Personal Account`)}
rightSideComponent={ rightSideComponent={
<ChevronsUpDown className="text-muted-foreground ml-auto h-4 w-4" /> <ChevronsUpDown className="ml-auto h-4 w-4 text-muted-foreground" />
} }
textSectionClassName="hidden lg:flex" textSectionClassName="hidden lg:flex"
/> />
@@ -66,7 +66,7 @@ export const MenuSwitcher = () => {
align="end" align="end"
forceMount forceMount
> >
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link <Link
to="/settings/organisations?action=add-organisation" to="/settings/organisations?action=add-organisation"
className="flex items-center justify-between" className="flex items-center justify-between"
@@ -78,34 +78,34 @@ export const MenuSwitcher = () => {
<DropdownMenuSeparator /> <DropdownMenuSeparator />
{isUserAdmin && ( {isUserAdmin && (
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/admin"> <Link to="/admin">
<Trans>Admin panel</Trans> <Trans>Admin panel</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
)} )}
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/inbox"> <Link to="/inbox">
<Trans>Personal Inbox</Trans> <Trans>Personal Inbox</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/settings/profile"> <Link to="/settings/profile">
<Trans>User settings</Trans> <Trans>User settings</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem <DropdownMenuItem
className="text-muted-foreground px-4 py-2" className="px-4 py-2 text-muted-foreground"
onClick={() => setLanguageSwitcherOpen(true)} onClick={() => setLanguageSwitcherOpen(true)}
> >
<Trans>Language</Trans> <Trans>Language</Trans>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem <DropdownMenuItem
className="text-destructive/90 hover:!text-destructive px-4 py-2" className="px-4 py-2 text-destructive/90 hover:!text-destructive"
onSelect={async () => authClient.signOut()} onSelect={async () => authClient.signOut()}
> >
<Trans>Sign Out</Trans> <Trans>Sign Out</Trans>
@@ -130,7 +130,7 @@ export const OrgMenuSwitcher = () => {
primaryText={dropdownMenuAvatarText.primaryText} primaryText={dropdownMenuAvatarText.primaryText}
secondaryText={dropdownMenuAvatarText.secondaryText} secondaryText={dropdownMenuAvatarText.secondaryText}
rightSideComponent={ rightSideComponent={
<ChevronsUpDown className="text-muted-foreground ml-auto h-4 w-4" /> <ChevronsUpDown className="ml-auto h-4 w-4 text-muted-foreground" />
} }
textSectionClassName="hidden lg:flex" textSectionClassName="hidden lg:flex"
/> />
@@ -139,7 +139,7 @@ export const OrgMenuSwitcher = () => {
<DropdownMenuContent <DropdownMenuContent
className={cn( className={cn(
'divide-border z-[60] ml-6 flex w-full divide-x p-0 md:ml-0 md:min-w-[40rem]', 'z-[60] ml-6 flex w-full divide-x divide-border p-0 md:ml-0 md:min-w-[40rem]',
)} )}
align="end" align="end"
forceMount forceMount
@@ -148,7 +148,7 @@ export const OrgMenuSwitcher = () => {
{/* Organisations column */} {/* Organisations column */}
<div className="flex w-full flex-col md:w-1/3"> <div className="flex w-full flex-col md:w-1/3">
<div className="flex h-12 items-center border-b p-2"> <div className="flex h-12 items-center border-b p-2">
<h3 className="text-muted-foreground flex items-center px-2 text-sm font-medium"> <h3 className="flex items-center px-2 text-sm font-medium text-muted-foreground">
<Building2Icon className="mr-2 h-3.5 w-3.5" /> <Building2Icon className="mr-2 h-3.5 w-3.5" />
<Trans>Organisations</Trans> <Trans>Organisations</Trans>
</h3> </h3>
@@ -162,7 +162,7 @@ export const OrgMenuSwitcher = () => {
> >
<DropdownMenuItem <DropdownMenuItem
className={cn( className={cn(
'text-muted-foreground w-full px-4 py-2', 'w-full px-4 py-2 text-muted-foreground',
org.id === currentOrganisation?.id && !hoveredOrgId && 'bg-accent', org.id === currentOrganisation?.id && !hoveredOrgId && 'bg-accent',
org.id === hoveredOrgId && 'bg-accent', org.id === hoveredOrgId && 'bg-accent',
)} )}
@@ -186,7 +186,7 @@ export const OrgMenuSwitcher = () => {
<div className="absolute bottom-0 right-0 top-0 flex items-center justify-center"> <div className="absolute bottom-0 right-0 top-0 flex items-center justify-center">
<Link <Link
to={`/o/${org.url}/settings`} to={`/o/${org.url}/settings`}
className="text-muted-foreground mr-2 rounded-sm border p-1 transition-opacity duration-200 group-hover:opacity-100 md:opacity-0" className="mr-2 rounded-sm border p-1 text-muted-foreground transition-opacity duration-200 group-hover:opacity-100 md:opacity-0"
> >
<Settings2Icon className="h-3.5 w-3.5" /> <Settings2Icon className="h-3.5 w-3.5" />
</Link> </Link>
@@ -207,7 +207,7 @@ export const OrgMenuSwitcher = () => {
{/* Teams column */} {/* Teams column */}
<div className="hidden w-1/3 flex-col md:flex"> <div className="hidden w-1/3 flex-col md:flex">
<div className="flex h-12 items-center border-b p-2"> <div className="flex h-12 items-center border-b p-2">
<h3 className="text-muted-foreground flex items-center px-2 text-sm font-medium"> <h3 className="flex items-center px-2 text-sm font-medium text-muted-foreground">
<UsersIcon className="mr-2 h-3.5 w-3.5" /> <UsersIcon className="mr-2 h-3.5 w-3.5" />
<Trans>Teams</Trans> <Trans>Teams</Trans>
</h3> </h3>
@@ -219,7 +219,7 @@ export const OrgMenuSwitcher = () => {
<div className="group relative" key={team.id}> <div className="group relative" key={team.id}>
<DropdownMenuItem <DropdownMenuItem
className={cn( className={cn(
'text-muted-foreground w-full px-4 py-2', 'w-full px-4 py-2 text-muted-foreground',
team.id === currentTeam?.id && 'bg-accent', team.id === currentTeam?.id && 'bg-accent',
)} )}
asChild asChild
@@ -239,7 +239,7 @@ export const OrgMenuSwitcher = () => {
<div className="absolute bottom-0 right-0 top-0 flex items-center justify-center"> <div className="absolute bottom-0 right-0 top-0 flex items-center justify-center">
<Link <Link
to={`/t/${team.url}/settings`} to={`/t/${team.url}/settings`}
className="text-muted-foreground mr-2 rounded-sm border p-1 opacity-0 transition-opacity duration-200 group-hover:opacity-100" className="mr-2 rounded-sm border p-1 text-muted-foreground opacity-0 transition-opacity duration-200 group-hover:opacity-100"
> >
<Settings2Icon className="h-3.5 w-3.5" /> <Settings2Icon className="h-3.5 w-3.5" />
</Link> </Link>
@@ -248,7 +248,7 @@ export const OrgMenuSwitcher = () => {
</div> </div>
)) ))
) : ( ) : (
<div className="text-muted-foreground my-12 flex items-center justify-center px-2 text-center text-sm"> <div className="my-12 flex items-center justify-center px-2 text-center text-sm text-muted-foreground">
<Trans>Select an organisation to view teams</Trans> <Trans>Select an organisation to view teams</Trans>
</div> </div>
)} )}
@@ -268,14 +268,14 @@ export const OrgMenuSwitcher = () => {
{/* Settings column */} {/* Settings column */}
<div className="hidden w-1/3 flex-col md:flex"> <div className="hidden w-1/3 flex-col md:flex">
<div className="flex h-12 items-center border-b p-2"> <div className="flex h-12 items-center border-b p-2">
<h3 className="text-muted-foreground flex items-center px-2 text-sm font-medium"> <h3 className="flex items-center px-2 text-sm font-medium text-muted-foreground">
<SettingsIcon className="mr-2 h-3.5 w-3.5" /> <SettingsIcon className="mr-2 h-3.5 w-3.5" />
<Trans>Settings</Trans> <Trans>Settings</Trans>
</h3> </h3>
</div> </div>
<div className="flex-1 overflow-y-auto p-1.5"> <div className="flex-1 overflow-y-auto p-1.5">
{isUserAdmin && ( {isUserAdmin && (
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/admin"> <Link to="/admin">
<Trans>Admin panel</Trans> <Trans>Admin panel</Trans>
</Link> </Link>
@@ -287,7 +287,7 @@ export const OrgMenuSwitcher = () => {
'MANAGE_ORGANISATION', 'MANAGE_ORGANISATION',
currentOrganisation.currentOrganisationRole, currentOrganisation.currentOrganisationRole,
) && ( ) && (
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to={`/o/${currentOrganisation.url}/settings`}> <Link to={`/o/${currentOrganisation.url}/settings`}>
<Trans>Organisation settings</Trans> <Trans>Organisation settings</Trans>
</Link> </Link>
@@ -295,34 +295,34 @@ export const OrgMenuSwitcher = () => {
)} )}
{currentTeam && canExecuteTeamAction('MANAGE_TEAM', currentTeam.currentTeamRole) && ( {currentTeam && canExecuteTeamAction('MANAGE_TEAM', currentTeam.currentTeamRole) && (
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to={`/t/${currentTeam.url}/settings`}> <Link to={`/t/${currentTeam.url}/settings`}>
<Trans>Team settings</Trans> <Trans>Team settings</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
)} )}
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/inbox"> <Link to="/inbox">
<Trans>Personal Inbox</Trans> <Trans>Personal Inbox</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link to="/settings/profile"> <Link to="/settings/profile">
<Trans>Account</Trans> <Trans>Account</Trans>
</Link> </Link>
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuItem <DropdownMenuItem
className="text-muted-foreground px-4 py-2" className="px-4 py-2 text-muted-foreground"
onClick={() => setLanguageSwitcherOpen(true)} onClick={() => setLanguageSwitcherOpen(true)}
> >
<Trans>Language</Trans> <Trans>Language</Trans>
</DropdownMenuItem> </DropdownMenuItem>
{currentOrganisation && ( {currentOrganisation && (
<DropdownMenuItem className="text-muted-foreground px-4 py-2" asChild> <DropdownMenuItem className="px-4 py-2 text-muted-foreground" asChild>
<Link <Link
to={{ to={{
pathname: `/o/${currentOrganisation.url}/support`, pathname: `/o/${currentOrganisation.url}/support`,
@@ -335,7 +335,7 @@ export const OrgMenuSwitcher = () => {
)} )}
<DropdownMenuItem <DropdownMenuItem
className="text-muted-foreground hover:!text-muted-foreground px-4 py-2" className="px-4 py-2 text-muted-foreground hover:!text-muted-foreground"
onSelect={async () => authClient.signOut()} onSelect={async () => authClient.signOut()}
> >
<Trans>Sign Out</Trans> <Trans>Sign Out</Trans>
@@ -90,7 +90,7 @@ export const OrganisationInvitations = ({ className }: { className?: string }) =
className="w-full max-w-none py-4" className="w-full max-w-none py-4"
avatarFallback={invitation.organisation.name.slice(0, 1)} avatarFallback={invitation.organisation.name.slice(0, 1)}
primaryText={ primaryText={
<span className="text-foreground/80 font-semibold"> <span className="font-semibold text-foreground/80">
{invitation.organisation.name} {invitation.organisation.name}
</span> </span>
} }
@@ -47,7 +47,7 @@ export const PeriodSelector = () => {
return ( return (
<Select defaultValue={period} onValueChange={onPeriodChange}> <Select defaultValue={period} onValueChange={onPeriodChange}>
<SelectTrigger className="text-muted-foreground max-w-[200px]"> <SelectTrigger className="max-w-[200px] text-muted-foreground">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
@@ -23,7 +23,7 @@ export const SettingsHeader = ({
<div> <div>
<h3 className="text-lg font-medium">{title}</h3> <h3 className="text-lg font-medium">{title}</h3>
<p className="text-muted-foreground text-sm md:mt-2">{subtitle}</p> <p className="text-sm text-muted-foreground md:mt-2">{subtitle}</p>
</div> </div>
{children} {children}
@@ -47,7 +47,7 @@ export const StackAvatar = ({ first, zIndex, fallbackText = '', type }: StackAva
return ( return (
<Avatar <Avatar
className={` ${zIndexClass} ${firstClass} dark:border-border h-10 w-10 border-2 border-solid border-white`} className={` ${zIndexClass} ${firstClass} h-10 w-10 border-2 border-solid border-white dark:border-border`}
> >
<AvatarFallback className={classes}>{fallbackText}</AvatarFallback> <AvatarFallback className={classes}>{fallbackText}</AvatarFallback>
</Avatar> </Avatar>
@@ -46,7 +46,7 @@ export const TeamEmailDropdown = ({ team }: TeamEmailDropdownProps) => {
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger> <DropdownMenuTrigger>
<MoreHorizontal className="text-muted-foreground h-5 w-5" /> <MoreHorizontal className="h-5 w-5 text-muted-foreground" />
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="w-52" align="start" forceMount> <DropdownMenuContent className="w-52" align="start" forceMount>
@@ -133,8 +133,8 @@ export const TemplatePageViewDocumentsTable = ({
<InfoIcon className="mx-2 h-4 w-4" /> <InfoIcon className="mx-2 h-4 w-4" />
</TooltipTrigger> </TooltipTrigger>
<TooltipContent className="text-foreground max-w-md space-y-2 !p-0"> <TooltipContent className="max-w-md space-y-2 !p-0 text-foreground">
<ul className="text-muted-foreground space-y-0.5 divide-y [&>li]:p-4"> <ul className="space-y-0.5 divide-y text-muted-foreground [&>li]:p-4">
<li> <li>
<h2 className="mb-2 flex flex-row items-center font-semibold"> <h2 className="mb-2 flex flex-row items-center font-semibold">
<Trans>Template</Trans> <Trans>Template</Trans>
@@ -54,7 +54,7 @@ export const TemplatePageViewInformation = ({
}, [isMounted, template, userId]); }, [isMounted, template, userId]);
return ( return (
<section className="dark:bg-background text-foreground border-border bg-widget flex flex-col rounded-xl border"> <section className="flex flex-col rounded-xl border border-border bg-widget text-foreground dark:bg-background">
<h1 className="px-4 py-3 font-medium"> <h1 className="px-4 py-3 font-medium">
<Trans>Information</Trans> <Trans>Information</Trans>
</h1> </h1>
@@ -33,9 +33,9 @@ export const TemplatePageViewRecentActivity = ({
}; };
return ( return (
<section className="dark:bg-background border-border bg-widget flex flex-col rounded-xl border"> <section className="flex flex-col rounded-xl border border-border bg-widget dark:bg-background">
<div className="flex flex-row items-center justify-between border-b px-4 py-3"> <div className="flex flex-row items-center justify-between border-b px-4 py-3">
<h1 className="text-foreground font-medium"> <h1 className="font-medium text-foreground">
<Trans>Recent documents</Trans> <Trans>Recent documents</Trans>
</h1> </h1>
@@ -44,18 +44,18 @@ export const TemplatePageViewRecentActivity = ({
{isLoading && ( {isLoading && (
<div className="flex h-full items-center justify-center py-16"> <div className="flex h-full items-center justify-center py-16">
<Loader className="text-muted-foreground h-6 w-6 animate-spin" /> <Loader className="h-6 w-6 animate-spin text-muted-foreground" />
</div> </div>
)} )}
{isLoadingError && ( {isLoadingError && (
<div className="flex h-full flex-col items-center justify-center py-16"> <div className="flex h-full flex-col items-center justify-center py-16">
<p className="text-foreground/80 text-sm"> <p className="text-sm text-foreground/80">
<Trans>Unable to load documents</Trans> <Trans>Unable to load documents</Trans>
</p> </p>
<button <button
onClick={async () => refetch()} onClick={async () => refetch()}
className="text-foreground/70 hover:text-muted-foreground mt-2 text-sm" className="mt-2 text-sm text-foreground/70 hover:text-muted-foreground"
> >
<Trans>Click here to retry</Trans> <Trans>Click here to retry</Trans>
</button> </button>
@@ -68,11 +68,11 @@ export const TemplatePageViewRecentActivity = ({
{data.data.length > 0 && results.totalPages > 1 && ( {data.data.length > 0 && results.totalPages > 1 && (
<li className="relative flex gap-x-4"> <li className="relative flex gap-x-4">
<div className="absolute -bottom-6 left-0 top-0 flex w-6 justify-center"> <div className="absolute -bottom-6 left-0 top-0 flex w-6 justify-center">
<div className="bg-border w-px" /> <div className="w-px bg-border" />
</div> </div>
<div className="bg-widget relative flex h-6 w-6 flex-none items-center justify-center"> <div className="relative flex h-6 w-6 flex-none items-center justify-center bg-widget">
<div className="bg-widget h-1.5 w-1.5 rounded-full ring-1 ring-gray-300 dark:ring-neutral-600" /> <div className="h-1.5 w-1.5 rounded-full bg-widget ring-1 ring-gray-300 dark:ring-neutral-600" />
</div> </div>
<button <button
@@ -82,7 +82,7 @@ export const TemplatePageViewRecentActivity = ({
behavior: 'smooth', behavior: 'smooth',
}); });
}} }}
className="text-foreground/70 hover:text-muted-foreground flex items-center text-xs" className="flex items-center text-xs text-foreground/70 hover:text-muted-foreground"
> >
<Trans>View more</Trans> <Trans>View more</Trans>
</button> </button>
@@ -91,7 +91,7 @@ export const TemplatePageViewRecentActivity = ({
{results.data.length === 0 && ( {results.data.length === 0 && (
<div className="flex items-center justify-center py-4"> <div className="flex items-center justify-center py-4">
<p className="text-muted-foreground/70 text-sm"> <p className="text-sm text-muted-foreground/70">
<Trans>No recent documents</Trans> <Trans>No recent documents</Trans>
</p> </p>
</div> </div>
@@ -105,16 +105,16 @@ export const TemplatePageViewRecentActivity = ({
'absolute left-0 top-0 flex w-6 justify-center', 'absolute left-0 top-0 flex w-6 justify-center',
)} )}
> >
<div className="bg-border w-px" /> <div className="w-px bg-border" />
</div> </div>
<div className="bg-widget text-foreground/40 relative flex h-6 w-6 flex-none items-center justify-center"> <div className="relative flex h-6 w-6 flex-none items-center justify-center bg-widget text-foreground/40">
<div className="bg-widget h-1.5 w-1.5 rounded-full ring-1 ring-gray-300 dark:ring-neutral-600" /> <div className="h-1.5 w-1.5 rounded-full bg-widget ring-1 ring-gray-300 dark:ring-neutral-600" />
</div> </div>
<Link <Link
to={`${documentRootPath}/${document.envelopeId}`} to={`${documentRootPath}/${document.envelopeId}`}
className="text-muted-foreground dark:text-muted-foreground/70 flex-auto truncate py-0.5 text-xs leading-5" className="flex-auto truncate py-0.5 text-xs leading-5 text-muted-foreground dark:text-muted-foreground/70"
> >
{match(document.source) {match(document.source)
.with(DocumentSource.DOCUMENT, DocumentSource.TEMPLATE, () => ( .with(DocumentSource.DOCUMENT, DocumentSource.TEMPLATE, () => (
@@ -130,7 +130,7 @@ export const TemplatePageViewRecentActivity = ({
.exhaustive()} .exhaustive()}
</Link> </Link>
<time className="text-muted-foreground dark:text-muted-foreground/70 flex-none py-0.5 text-xs leading-5"> <time className="flex-none py-0.5 text-xs leading-5 text-muted-foreground dark:text-muted-foreground/70">
{DateTime.fromJSDate(document.createdAt).toRelative({ style: 'short' })} {DateTime.fromJSDate(document.createdAt).toRelative({ style: 'short' })}
</time> </time>
</li> </li>
@@ -24,9 +24,9 @@ export const TemplatePageViewRecipients = ({
const { _ } = useLingui(); const { _ } = useLingui();
return ( return (
<section className="dark:bg-background border-border bg-widget flex flex-col rounded-xl border"> <section className="flex flex-col rounded-xl border border-border bg-widget dark:bg-background">
<div className="flex flex-row items-center justify-between px-4 py-3"> <div className="flex flex-row items-center justify-between px-4 py-3">
<h1 className="text-foreground font-medium"> <h1 className="font-medium text-foreground">
<Trans>Recipients</Trans> <Trans>Recipients</Trans>
</h1> </h1>
@@ -43,7 +43,7 @@ export const TemplatePageViewRecipients = ({
</Link> </Link>
</div> </div>
<ul className="text-muted-foreground divide-y border-t"> <ul className="divide-y border-t text-muted-foreground">
{recipients.length === 0 && ( {recipients.length === 0 && (
<li className="flex flex-col items-center justify-center py-6 text-sm"> <li className="flex flex-col items-center justify-center py-6 text-sm">
<Trans>No recipients</Trans> <Trans>No recipients</Trans>
@@ -60,13 +60,13 @@ export const TemplatePageViewRecipients = ({
} }
primaryText={ primaryText={
isTemplateRecipientEmailPlaceholder(recipient.email) ? ( isTemplateRecipientEmailPlaceholder(recipient.email) ? (
<p className="text-muted-foreground text-sm">{recipient.name}</p> <p className="text-sm text-muted-foreground">{recipient.name}</p>
) : ( ) : (
<p className="text-muted-foreground text-sm">{recipient.email}</p> <p className="text-sm text-muted-foreground">{recipient.email}</p>
) )
} }
secondaryText={ secondaryText={
<p className="text-muted-foreground/70 text-xs"> <p className="text-xs text-muted-foreground/70">
{_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)} {_(RECIPIENT_ROLES_DESCRIPTION[recipient.role].roleName)}
</p> </p>
} }
@@ -21,17 +21,17 @@ export const UserProfileSkeleton = ({ className, user, rows = 2 }: UserProfileSk
return ( return (
<div <div
className={cn( className={cn(
'dark:bg-background flex flex-col items-center rounded-xl bg-neutral-100 p-4', 'flex flex-col items-center rounded-xl bg-neutral-100 p-4 dark:bg-background',
className, className,
)} )}
> >
<div className="border-border bg-background text-muted-foreground inline-block max-w-full truncate rounded-md border px-2.5 py-1.5 text-sm lowercase"> <div className="inline-block max-w-full truncate rounded-md border border-border bg-background px-2.5 py-1.5 text-sm lowercase text-muted-foreground">
{baseUrl.host}/u/{user.url} {baseUrl.host}/u/{user.url}
</div> </div>
<div className="mt-4"> <div className="mt-4">
<div className="bg-primary/10 rounded-full p-1.5"> <div className="rounded-full bg-primary/10 p-1.5">
<div className="bg-background flex h-20 w-20 items-center justify-center rounded-full border-2"> <div className="flex h-20 w-20 items-center justify-center rounded-full border-2 bg-background">
<User2 className="h-12 w-12 text-[hsl(228,10%,90%)]" /> <User2 className="h-12 w-12 text-[hsl(228,10%,90%)]" />
</div> </div>
</div> </div>
@@ -41,16 +41,16 @@ export const UserProfileSkeleton = ({ className, user, rows = 2 }: UserProfileSk
<div className="flex items-center justify-center gap-x-2"> <div className="flex items-center justify-center gap-x-2">
<h2 className="max-w-[12rem] truncate text-2xl font-semibold">{user.name}</h2> <h2 className="max-w-[12rem] truncate text-2xl font-semibold">{user.name}</h2>
<VerifiedIcon className="text-primary h-8 w-8" /> <VerifiedIcon className="h-8 w-8 text-primary" />
</div> </div>
<div className="dark:bg-foreground/30 mx-auto mt-4 h-2 w-52 rounded-full bg-neutral-300" /> <div className="mx-auto mt-4 h-2 w-52 rounded-full bg-neutral-300 dark:bg-foreground/30" />
<div className="dark:bg-foreground/20 mx-auto mt-2 h-2 w-36 rounded-full bg-neutral-200" /> <div className="mx-auto mt-2 h-2 w-36 rounded-full bg-neutral-200 dark:bg-foreground/20" />
</div> </div>
<div className="mt-8 w-full"> <div className="mt-8 w-full">
<div className="dark:divide-foreground/30 dark:border-foreground/30 divide-y-2 divide-neutral-200 overflow-hidden rounded-lg border-2 border-neutral-200"> <div className="divide-y-2 divide-neutral-200 overflow-hidden rounded-lg border-2 border-neutral-200 dark:divide-foreground/30 dark:border-foreground/30">
<div className="text-muted-foreground dark:bg-foreground/20 bg-neutral-50 p-4 font-medium"> <div className="bg-neutral-50 p-4 font-medium text-muted-foreground dark:bg-foreground/20">
<Trans>Documents</Trans> <Trans>Documents</Trans>
</div> </div>
@@ -59,14 +59,14 @@ export const UserProfileSkeleton = ({ className, user, rows = 2 }: UserProfileSk
.map((_, index) => ( .map((_, index) => (
<div <div
key={index} key={index}
className="bg-background flex items-center justify-between gap-x-6 p-4" className="flex items-center justify-between gap-x-6 bg-background p-4"
> >
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<File className="text-muted-foreground/80 h-8 w-8" strokeWidth={1.5} /> <File className="h-8 w-8 text-muted-foreground/80" strokeWidth={1.5} />
<div className="space-y-2"> <div className="space-y-2">
<div className="dark:bg-foreground/30 h-1.5 w-24 rounded-full bg-neutral-300 md:w-36" /> <div className="h-1.5 w-24 rounded-full bg-neutral-300 md:w-36 dark:bg-foreground/30" />
<div className="dark:bg-foreground/20 h-1.5 w-16 rounded-full bg-neutral-200 md:w-24" /> <div className="h-1.5 w-16 rounded-full bg-neutral-200 md:w-24 dark:bg-foreground/20" />
</div> </div>
</div> </div>
@@ -18,11 +18,11 @@ export const UserProfileTimur = ({ className, rows = 2 }: UserProfileTimurProps)
return ( return (
<div <div
className={cn( className={cn(
'dark:bg-background flex flex-col items-center rounded-xl bg-neutral-100 p-4', 'flex flex-col items-center rounded-xl bg-neutral-100 p-4 dark:bg-background',
className, className,
)} )}
> >
<div className="border-border bg-background text-muted-foreground inline-block max-w-full truncate rounded-md border px-2.5 py-1.5 text-sm"> <div className="inline-block max-w-full truncate rounded-md border border-border bg-background px-2.5 py-1.5 text-sm text-muted-foreground">
{baseUrl.host}/u/timur {baseUrl.host}/u/timur
</div> </div>
@@ -38,21 +38,21 @@ export const UserProfileTimur = ({ className, rows = 2 }: UserProfileTimurProps)
<div className="flex items-center justify-center gap-x-2"> <div className="flex items-center justify-center gap-x-2">
<h2 className="text-2xl font-semibold">Timur Ercan</h2> <h2 className="text-2xl font-semibold">Timur Ercan</h2>
<VerifiedIcon className="text-primary h-8 w-8" /> <VerifiedIcon className="h-8 w-8 text-primary" />
</div> </div>
<p className="text-muted-foreground mt-4 max-w-[40ch] text-center text-sm"> <p className="mt-4 max-w-[40ch] text-center text-sm text-muted-foreground">
<Trans>Hey Im Timur</Trans> <Trans>Hey Im Timur</Trans>
</p> </p>
<p className="text-muted-foreground mt-1 max-w-[40ch] text-center text-sm"> <p className="mt-1 max-w-[40ch] text-center text-sm text-muted-foreground">
<Trans>Pick any of the following agreements below and start signing to get started</Trans> <Trans>Pick any of the following agreements below and start signing to get started</Trans>
</p> </p>
</div> </div>
<div className="mt-8 w-full"> <div className="mt-8 w-full">
<div className="dark:divide-foreground/30 dark:border-foreground/30 divide-y-2 divide-neutral-200 overflow-hidden rounded-lg border-2 border-neutral-200"> <div className="divide-y-2 divide-neutral-200 overflow-hidden rounded-lg border-2 border-neutral-200 dark:divide-foreground/30 dark:border-foreground/30">
<div className="text-muted-foreground dark:bg-foreground/20 bg-neutral-50 p-4 font-medium"> <div className="bg-neutral-50 p-4 font-medium text-muted-foreground dark:bg-foreground/20">
<Trans>Documents</Trans> <Trans>Documents</Trans>
</div> </div>
@@ -61,14 +61,14 @@ export const UserProfileTimur = ({ className, rows = 2 }: UserProfileTimurProps)
.map((_, index) => ( .map((_, index) => (
<div <div
key={index} key={index}
className="bg-background flex items-center justify-between gap-x-6 p-4" className="flex items-center justify-between gap-x-6 bg-background p-4"
> >
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<File className="text-muted-foreground/80 h-8 w-8" strokeWidth={1.5} /> <File className="h-8 w-8 text-muted-foreground/80" strokeWidth={1.5} />
<div className="space-y-2"> <div className="space-y-2">
<div className="dark:bg-foreground/30 h-1.5 w-24 rounded-full bg-neutral-300 md:w-36" /> <div className="h-1.5 w-24 rounded-full bg-neutral-300 md:w-36 dark:bg-foreground/30" />
<div className="dark:bg-foreground/20 h-1.5 w-16 rounded-full bg-neutral-200 md:w-24" /> <div className="h-1.5 w-16 rounded-full bg-neutral-200 md:w-24 dark:bg-foreground/20" />
</div> </div>
</div> </div>
@@ -71,14 +71,14 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
<h2 className="text-lg font-semibold"> <h2 className="text-lg font-semibold">
<Trans>Webhook Details</Trans> <Trans>Webhook Details</Trans>
</h2> </h2>
<p className="text-muted-foreground font-mono text-xs">{webhookCall.id}</p> <p className="font-mono text-xs text-muted-foreground">{webhookCall.id}</p>
</SheetTitle> </SheetTitle>
{/* Content */} {/* Content */}
<div className="flex-1 overflow-y-auto"> <div className="flex-1 overflow-y-auto">
<div className="mt-6"> <div className="mt-6">
<div className="flex items-end justify-between"> <div className="flex items-end justify-between">
<h4 className="text-muted-foreground mb-3 text-xs font-semibold uppercase tracking-wider"> <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
<Trans>Details</Trans> <Trans>Details</Trans>
</h4> </h4>
@@ -98,15 +98,15 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
<Trans>Resend</Trans> <Trans>Resend</Trans>
</Button> </Button>
</div> </div>
<div className="border-border overflow-hidden rounded-lg border"> <div className="overflow-hidden rounded-lg border border-border">
<table className="w-full text-left text-sm"> <table className="w-full text-left text-sm">
<tbody className="divide-border bg-muted/30 divide-y"> <tbody className="divide-y divide-border bg-muted/30">
{generalWebhookDetails.map(({ header, value }, index) => ( {generalWebhookDetails.map(({ header, value }, index) => (
<tr key={index}> <tr key={index}>
<td className="text-muted-foreground border-border w-1/3 border-r px-4 py-2 font-mono text-xs"> <td className="w-1/3 border-r border-border px-4 py-2 font-mono text-xs text-muted-foreground">
{header} {header}
</td> </td>
<td className="text-foreground break-all px-4 py-2 font-mono text-xs"> <td className="break-all px-4 py-2 font-mono text-xs text-foreground">
{value} {value}
</td> </td>
</tr> </tr>
@@ -118,13 +118,13 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
{/* Payload Tabs */} {/* Payload Tabs */}
<div className="py-6"> <div className="py-6">
<div className="border-border mb-4 flex items-center gap-4 border-b"> <div className="mb-4 flex items-center gap-4 border-b border-border">
<button <button
onClick={() => setActiveTab('request')} onClick={() => setActiveTab('request')}
className={cn( className={cn(
'relative pb-2 text-sm font-medium transition-colors', 'relative pb-2 text-sm font-medium transition-colors',
activeTab === 'request' activeTab === 'request'
? 'text-foreground after:bg-primary after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5' ? 'text-foreground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary'
: 'text-muted-foreground hover:text-foreground', : 'text-muted-foreground hover:text-foreground',
)} )}
> >
@@ -136,7 +136,7 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
className={cn( className={cn(
'relative pb-2 text-sm font-medium transition-colors', 'relative pb-2 text-sm font-medium transition-colors',
activeTab === 'response' activeTab === 'response'
? 'text-foreground after:bg-primary after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5' ? 'text-foreground after:absolute after:bottom-0 after:left-0 after:right-0 after:h-0.5 after:bg-primary'
: 'text-muted-foreground hover:text-foreground', : 'text-muted-foreground hover:text-foreground',
)} )}
> >
@@ -155,7 +155,7 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
onCopySuccess={() => toast({ title: t`Copied to clipboard` })} onCopySuccess={() => toast({ title: t`Copied to clipboard` })}
/> />
</div> </div>
<pre className="bg-muted/50 border-border text-foreground overflow-x-auto rounded-lg border p-4 font-mono text-xs leading-relaxed"> <pre className="overflow-x-auto rounded-lg border border-border bg-muted/50 p-4 font-mono text-xs leading-relaxed text-foreground">
{JSON.stringify( {JSON.stringify(
activeTab === 'request' ? webhookCall.requestBody : webhookCall.responseBody, activeTab === 'request' ? webhookCall.requestBody : webhookCall.responseBody,
null, null,
@@ -166,19 +166,19 @@ export const WebhookLogsSheet = createCallable<WebhookLogsSheetProps, string | n
{activeTab === 'response' && ( {activeTab === 'response' && (
<div className="mt-6"> <div className="mt-6">
<h4 className="text-muted-foreground mb-3 text-xs font-semibold uppercase tracking-wider"> <h4 className="mb-3 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
<Trans>Response Headers</Trans> <Trans>Response Headers</Trans>
</h4> </h4>
<div className="border-border overflow-hidden rounded-lg border"> <div className="overflow-hidden rounded-lg border border-border">
<table className="w-full text-left text-sm"> <table className="w-full text-left text-sm">
<tbody className="divide-border bg-muted/30 divide-y"> <tbody className="divide-y divide-border bg-muted/30">
{Object.entries(webhookCall.responseHeaders as Record<string, string>).map( {Object.entries(webhookCall.responseHeaders as Record<string, string>).map(
([key, value]) => ( ([key, value]) => (
<tr key={key}> <tr key={key}>
<td className="text-muted-foreground border-border w-1/3 border-r px-4 py-2 font-mono text-xs"> <td className="w-1/3 border-r border-border px-4 py-2 font-mono text-xs text-muted-foreground">
{key} {key}
</td> </td>
<td className="text-foreground break-all px-4 py-2 font-mono text-xs"> <td className="break-all px-4 py-2 font-mono text-xs text-foreground">
{value as string} {value as string}
</td> </td>
</tr> </tr>
@@ -76,7 +76,7 @@ export const DocumentsTableActionDropdown = ({
return ( return (
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger data-testid="document-table-action-btn"> <DropdownMenuTrigger data-testid="document-table-action-btn">
<MoreHorizontal className="text-muted-foreground h-5 w-5" /> <MoreHorizontal className="h-5 w-5 text-muted-foreground" />
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent className="w-52" align="start" forceMount> <DropdownMenuContent className="w-52" align="start" forceMount>
@@ -38,7 +38,7 @@ export const DocumentsTableEmptyState = ({ status }: DocumentsTableEmptyStatePro
return ( return (
<div <div
className="text-muted-foreground/60 flex h-60 flex-col items-center justify-center gap-y-4" className="flex h-60 flex-col items-center justify-center gap-y-4 text-muted-foreground/60"
data-testid="empty-document-state" data-testid="empty-document-state"
> >
<Icon className="h-12 w-12" strokeWidth={1.5} /> <Icon className="h-12 w-12" strokeWidth={1.5} />
@@ -49,7 +49,7 @@ export const DocumentsTableSenderFilter = ({ teamId }: DocumentsTableSenderFilte
return ( return (
<MultiSelectCombobox <MultiSelectCombobox
emptySelectionPlaceholder={ emptySelectionPlaceholder={
<p className="text-muted-foreground font-normal"> <p className="font-normal text-muted-foreground">
<Trans> <Trans>
<span className="text-muted-foreground/70">Sender:</span> All <span className="text-muted-foreground/70">Sender:</span> All
</Trans> </Trans>
@@ -130,7 +130,7 @@ export const InboxTable = () => {
enable: isLoadingError || false, enable: isLoadingError || false,
}} }}
emptyState={ emptyState={
<div className="text-muted-foreground/60 flex h-60 flex-col items-center justify-center gap-y-4"> <div className="flex h-60 flex-col items-center justify-center gap-y-4 text-muted-foreground/60">
<p> <p>
<Trans>Documents that require your attention will appear here</Trans> <Trans>Documents that require your attention will appear here</Trans>
</p> </p>
@@ -170,8 +170,8 @@ export const InboxTable = () => {
</DataTable> </DataTable>
{isPending && ( {isPending && (
<div className="bg-background/50 absolute inset-0 flex items-center justify-center"> <div className="absolute inset-0 flex items-center justify-center bg-background/50">
<Loader className="text-muted-foreground h-8 w-8 animate-spin" /> <Loader className="h-8 w-8 animate-spin text-muted-foreground" />
</div> </div>
)} )}
</div> </div>
@@ -59,7 +59,7 @@ export const OrganisationBillingInvoicesTable = ({
<div className="flex max-w-xs items-center gap-2"> <div className="flex max-w-xs items-center gap-2">
<File className="h-6 w-6" /> <File className="h-6 w-6" />
<div className="text-foreground/80 text-sm font-semibold"> <div className="text-sm font-semibold text-foreground/80">
{DateTime.fromSeconds(row.original.created).toFormat('MMMM yyyy')} {DateTime.fromSeconds(row.original.created).toFormat('MMMM yyyy')}
</div> </div>
</div> </div>
@@ -276,12 +276,12 @@ const SummaryCard = ({
value: number; value: number;
subtitle?: string; subtitle?: string;
}) => ( }) => (
<div className="bg-card flex items-start gap-x-2 rounded-lg border px-4 py-3"> <div className="flex items-start gap-x-2 rounded-lg border bg-card px-4 py-3">
<Icon className="text-muted-foreground h-4 w-4 items-start" /> <Icon className="h-4 w-4 items-start text-muted-foreground" />
<div className="-mt-0.5 space-y-2"> <div className="-mt-0.5 space-y-2">
<p className="text-muted-foreground text-sm font-medium">{title}</p> <p className="text-sm font-medium text-muted-foreground">{title}</p>
<p className="text-2xl font-bold">{value}</p> <p className="text-2xl font-bold">{value}</p>
{subtitle && <p className="text-muted-foreground text-xs">{subtitle}</p>} {subtitle && <p className="text-xs text-muted-foreground">{subtitle}</p>}
</div> </div>
</div> </div>
); );

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