mirror of
https://github.com/documenso/documenso.git
synced 2026-08-24 23:32:29 +10:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
835c55e2ca | ||
|
|
ae02169e97 |
@@ -1,8 +0,0 @@
|
|||||||
# Config files
|
|
||||||
*.config.js
|
|
||||||
*.config.cjs
|
|
||||||
|
|
||||||
# Statically hosted javascript files
|
|
||||||
apps/*/public/*.js
|
|
||||||
apps/*/public/*.cjs
|
|
||||||
scripts/
|
|
||||||
@@ -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'],
|
|
||||||
};
|
|
||||||
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
+1
-1
@@ -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,
|
||||||
})}
|
})}
|
||||||
>
|
>
|
||||||
|
|||||||
+4
-4
@@ -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.
|
||||||
|
|||||||
+3
-3
@@ -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
|
||||||
|
|||||||
+4
-4
@@ -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
|
||||||
|
|||||||
+5
-5
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
+2
-2
@@ -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>
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -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 I’m Timur</Trans>
|
<Trans>Hey I’m 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
Reference in New Issue
Block a user