From 383b5f78f0435d1bb855599e0fffd8dbc5150be3 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 2 Jan 2025 15:33:37 +1100 Subject: [PATCH] feat: migrate nextjs to rr7 --- .eslintrc.cjs | 1 + apps/remix/.bin/build.sh | 28 + apps/remix/.dockerignore | 4 + apps/remix/.gitignore | 9 + apps/remix/Dockerfile | 22 + apps/remix/Dockerfile.bun | 25 + apps/remix/Dockerfile.pnpm | 26 + apps/remix/README.md | 100 + apps/remix/app/app.css | 24 + .../dialogs/account-delete-dialog.tsx} | 20 +- .../dialogs/admin-document-delete-dialog.tsx} | 18 +- .../dialogs/admin-user-delete-dialog.tsx} | 22 +- .../dialogs/admin-user-disable-dialog.tsx} | 14 +- .../dialogs/admin-user-enable-dialog.tsx} | 11 +- .../dialogs/document-delete-dialog.tsx} | 45 +- .../dialogs/document-duplicate-dialog.tsx} | 37 +- .../dialogs/document-move-dialog.tsx} | 19 +- .../dialogs/document-resend-dialog.tsx} | 30 +- .../dialogs/passkey-create-dialog.tsx} | 9 +- ...public-profile-template-manage-dialog.tsx} | 9 +- .../dialogs/team-checkout-create-dialog.tsx} | 9 +- .../dialogs/team-create-dialog.tsx} | 23 +- .../dialogs/team-delete-dialog.tsx} | 18 +- .../dialogs/team-email-add-dialog.tsx} | 17 +- .../dialogs/team-email-delete-dialog.tsx} | 23 +- .../dialogs/team-email-update-dialog.tsx} | 21 +- .../components/dialogs/team-leave-dialog.tsx} | 17 +- .../dialogs/team-member-delete-dialog.tsx} | 11 +- .../dialogs/team-member-invite-dialog.tsx} | 38 +- .../dialogs/team-member-update-dialog.tsx} | 13 +- .../dialogs/team-transfer-dialog.tsx} | 18 +- .../dialogs/template-create-dialog.tsx} | 41 +- .../dialogs/template-delete-dialog.tsx} | 22 +- .../template-direct-link-dialog-wrapper.tsx | 10 +- .../dialogs}/template-direct-link-dialog.tsx | 40 +- .../dialogs/template-duplicate-dialog.tsx} | 16 +- .../dialogs/template-move-dialog.tsx} | 48 +- .../dialogs/template-use-dialog.tsx} | 24 +- .../dialogs/token-delete-dialog.tsx} | 25 +- .../dialogs/webhook-create-dialog.tsx} | 19 +- .../dialogs/webhook-delete-dialog.tsx} | 17 +- .../embed/embed-authentication-required.tsx} | 13 +- .../embed/embed-client-loading.tsx} | 0 .../embed-direct-template-client-page.tsx} | 34 +- .../embed/embed-document-completed.tsx} | 4 +- .../embed/embed-document-fields.tsx} | 46 +- .../embed/embed-document-signing-page.tsx} | 27 +- .../app/components/embed/embed-paywall.tsx} | 0 .../2fa/disable-authenticator-app-dialog.tsx | 13 +- .../2fa/enable-authenticator-app-dialog.tsx | 13 +- .../forms/2fa/recovery-code-list.tsx | 2 +- .../forms/2fa/view-recovery-codes-dialog.tsx | 7 +- .../app}/components/forms/avatar-image.tsx | 30 +- .../app}/components/forms/forgot-password.tsx | 20 +- .../app}/components/forms/password.tsx | 15 +- .../app}/components/forms/profile.tsx | 19 +- .../forms/public-profile-claim-dialog.tsx | 16 +- .../components/forms/public-profile-form.tsx | 13 +- .../app}/components/forms/reset-password.tsx | 20 +- .../forms/search-param-selector.tsx | 11 +- .../forms/send-confirmation-email.tsx | 12 +- .../app}/components/forms/signin.tsx | 185 +- .../app/components/forms}/signup.tsx | 76 +- .../forms/team-branding-preferences-form.tsx} | 7 +- .../forms/team-document-preferences-form.tsx} | 15 +- .../components/forms/team-update-form.tsx} | 26 +- .../app}/components/forms/token.tsx | 81 +- .../admin-stats-signer-conversion-chart.tsx} | 8 +- .../admin-stats-users-with-documents.tsx} | 10 +- .../app/components/general/app-banner.tsx | 28 + .../components/general/app-command-menu.tsx} | 64 +- .../app/components/general/app-header.tsx} | 32 +- .../components/general/app-nav-desktop.tsx} | 21 +- .../components/general/app-nav-mobile.tsx} | 28 +- .../general}/avatar-with-recipient.tsx | 10 +- .../app/components/general}/background.tsx | 0 .../app/components/general/branding-logo.tsx} | 2 +- .../app/components/general}/claim-account.tsx | 20 +- .../direct-template-configure-form.tsx} | 36 +- .../direct-template/direct-template-page.tsx} | 47 +- .../direct-template-signing-auth-page.tsx} | 11 +- .../direct-template-signing-form.tsx} | 60 +- .../document-signing-auth-2fa.tsx} | 29 +- .../document-signing-auth-account.tsx} | 36 +- .../document-signing-auth-dialog.tsx} | 26 +- .../document-signing-auth-page.tsx} | 24 +- .../document-signing-auth-passkey.tsx} | 19 +- .../document-signing-auth-provider.tsx} | 49 +- .../document-signing-auto-sign.tsx} | 42 +- .../document-signing-checkbox-field.tsx} | 43 +- .../document-signing-complete-dialog.tsx} | 16 +- .../document-signing-date-field.tsx} | 37 +- .../document-signing-disclosure.tsx} | 14 +- .../document-signing-dropdown-field.tsx} | 39 +- .../document-signing-email-field.tsx} | 42 +- .../document-signing-field-container.tsx} | 17 +- .../document-signing-form.tsx} | 46 +- .../document-signing-initials-field.tsx} | 43 +- .../document-signing-name-field.tsx} | 46 +- .../document-signing-number-field.tsx} | 40 +- .../document-signing-page-view.tsx} | 93 +- .../document-signing-provider.tsx} | 26 +- .../document-signing-radio-field.tsx} | 41 +- .../document-signing-reject-dialog.tsx} | 24 +- .../document-signing-signature-field.tsx} | 57 +- .../document-signing-text-field.tsx} | 42 +- .../document-audit-log-download-button.tsx} | 13 +- .../document-certificate-download-button.tsx} | 15 +- .../general/document/document-edit-form.tsx} | 38 +- .../document-history-sheet-changes.tsx | 2 - .../document/document-history-sheet.tsx | 4 +- .../document}/document-page-view-button.tsx | 28 +- .../document}/document-page-view-dropdown.tsx | 59 +- .../document-page-view-information.tsx | 7 +- .../document-page-view-recent-activity.tsx | 5 +- .../document-page-view-recipients.tsx | 14 +- .../document/document-read-only-fields.tsx | 8 +- .../document-recipient-link-copy-dialog.tsx | 14 +- .../general/document}/document-search.tsx | 19 +- .../general/document}/document-status.tsx | 2 +- .../general/document/document-upload.tsx} | 54 +- .../general/generic-error-layout.tsx | 126 + .../app/components/general}/menu-switcher.tsx | 63 +- .../app/components/general}/metric-card.tsx | 0 .../general}/multiselect-role-combobox.tsx | 4 +- .../components/general}/period-selector.tsx | 21 +- .../components/general}/refresh-on-focus.tsx | 10 +- .../components/general/settings-header.tsx} | 0 .../general/settings-nav-desktop.tsx} | 60 +- .../general/settings-nav-mobile.tsx} | 59 +- .../app/components/general}/stack-avatar.tsx | 0 .../general}/stack-avatars-with-tooltip.tsx | 6 +- .../app/components/general}/stack-avatars.tsx | 3 +- .../teams}/team-billing-portal-button.tsx | 5 +- .../general/teams}/team-email-dropdown.tsx | 17 +- .../teams/team-layout-billing-banner.tsx} | 15 +- .../teams/team-settings-nav-desktop.tsx} | 57 +- .../teams/team-settings-nav-mobile.tsx} | 57 +- .../general/teams}/team-transfer-status.tsx | 17 +- .../template}/template-direct-link-badge.tsx | 5 +- .../general/template/template-edit-form.tsx} | 24 +- .../template-page-view-documents-table.tsx | 36 +- .../template-page-view-information.tsx | 7 +- .../template-page-view-recent-activity.tsx | 12 +- .../template-page-view-recipients.tsx | 10 +- .../general/template}/template-type.tsx | 4 +- .../general}/user-profile-skeleton.tsx | 6 +- .../general}/user-profile-timur.tsx | 8 +- .../general}/verify-email-banner.tsx | 22 +- .../general/webhook-multiselect-combobox.tsx} | 12 +- .../tables/admin-dashboard-users-table.tsx} | 17 +- .../admin-document-recipient-item-table.tsx} | 22 +- .../tables/admin-leaderboard-table.tsx} | 6 +- .../tables/document-logs-table.tsx} | 13 +- .../tables/documents-table-action-button.tsx} | 35 +- .../documents-table-action-dropdown.tsx} | 56 +- .../tables/documents-table-empty-state.tsx} | 6 +- .../tables/documents-table-sender-filter.tsx} | 23 +- .../tables/documents-table-title.tsx} | 23 +- .../app/components/tables/documents-table.tsx | 203 + .../tables/internal-audit-log-table.tsx} | 4 +- ...ttings-public-profile-templates-table.tsx} | 13 +- .../settings-security-activity-table.tsx} | 17 +- ...ttings-security-passkey-table-actions.tsx} | 13 +- .../settings-security-passkey-table.tsx} | 21 +- .../team-settings-billing-invoices-table.tsx} | 18 +- .../team-settings-member-invites-table.tsx} | 23 +- .../tables/team-settings-members-table.tsx} | 53 +- .../templates-table-action-dropdown.tsx} | 55 +- .../components/tables/templates-table.tsx} | 127 +- .../user-settings-current-teams-table.tsx} | 29 +- ...-settings-pending-teams-table-actions.tsx} | 9 +- .../user-settings-pending-teams-table.tsx} | 24 +- .../user-settings-teams-page-table.tsx} | 37 +- apps/remix/app/entry.client.tsx | 29 + apps/remix/app/entry.server.tsx | 82 + .../src => remix/app}/providers/posthog.tsx | 29 +- .../{web/src => remix/app}/providers/team.tsx | 8 +- apps/remix/app/root.tsx | 158 + apps/remix/app/routes.ts | 13 + .../app/routes/_authenticated+/_layout.tsx | 64 + .../routes/_authenticated+/admin+/_index.tsx | 9 + .../routes/_authenticated+/admin+/_layout.tsx | 120 + .../_authenticated+/admin+/documents.$id.tsx | 165 + .../admin+/documents._index.tsx} | 75 +- .../_authenticated+/admin+/leaderboard.tsx | 66 + .../_authenticated+/admin+/site-settings.tsx | 224 + .../routes/_authenticated+/admin+/stats.tsx} | 57 +- .../_authenticated+/admin+/subscriptions.tsx} | 18 +- .../_authenticated+/admin+/users.$id.tsx} | 28 +- .../_authenticated+/admin+/users._index.tsx | 52 + .../documents+/$id._index.tsx} | 127 +- .../_authenticated+/documents+/$id.edit.tsx} | 91 +- .../_authenticated+/documents+/$id.logs.tsx} | 64 +- .../_authenticated+/documents+/_index.tsx | 156 + .../documents+/todo-loading.tsx} | 14 +- .../_authenticated+/settings+/_index.tsx | 5 + .../_authenticated+/settings+/_layout.tsx | 29 + .../_authenticated+/settings+/profile.tsx | 32 + .../settings+/public-profile+/index.tsx} | 53 +- .../settings+/security+/activity+/index.tsx | 28 + .../settings+/security+/index.tsx} | 100 +- .../settings+/security+/passkeys+/index.tsx | 31 + .../settings+/teams+/index.tsx} | 12 +- .../settings+/teams+}/team-email-usage.tsx | 7 +- .../settings+/teams+}/team-invitations.tsx | 92 +- .../settings+/tokens+/index.tsx} | 25 +- .../settings+/webhooks+/$id.tsx} | 34 +- .../settings+/webhooks+/index.tsx} | 25 +- .../_authenticated+/t.$teamUrl+/_index.tsx | 14 + .../_authenticated+/t.$teamUrl+/_layout.tsx | 147 + .../t.$teamUrl+/documents.$id._index.tsx | 5 + .../t.$teamUrl+/documents.$id.edit.tsx | 5 + .../t.$teamUrl+/documents.$id.logs.tsx | 5 + .../t.$teamUrl+/documents._index.tsx | 5 + .../t.$teamUrl+/settings+/_index.tsx} | 54 +- .../t.$teamUrl+/settings+/_layout.tsx | 40 + .../t.$teamUrl+/settings+/billing.tsx} | 46 +- .../t.$teamUrl+/settings+/members.tsx | 91 + .../t.$teamUrl+/settings+/preferences.tsx | 36 + .../t.$teamUrl+/settings+/public-profile.tsx | 21 + .../t.$teamUrl+/settings+/tokens.tsx} | 54 +- .../t.$teamUrl+/settings+/webhooks.$id.tsx} | 29 +- .../t.$teamUrl+/settings+/webhooks.tsx} | 25 +- .../t.$teamUrl+/templates.$id._index.tsx | 5 + .../t.$teamUrl+/templates.$id.edit.tsx | 5 + .../t.$teamUrl+/templates._index.tsx | 5 + .../templates+/$id._index.tsx} | 79 +- .../_authenticated+/templates+/$id.edit.tsx} | 52 +- .../_authenticated+/templates+/_index.tsx | 87 + apps/remix/app/routes/_index.tsx | 12 + .../_internal+/[__htmltopdf]+/audit-log.tsx} | 68 +- .../[__htmltopdf]+/certificate.tsx} | 67 +- apps/remix/app/routes/_profile+/_layout.tsx | 122 + .../app/routes/_profile+/p.$url.tsx} | 49 +- apps/remix/app/routes/_recipient+/_layout.tsx | 71 + .../routes/_recipient+/d.$token+/_index.tsx} | 68 +- .../_recipient+/sign.$token+/_index.tsx | 230 + .../_recipient+/sign.$token+/complete.tsx} | 138 +- .../_recipient+/sign.$token+/rejected.tsx} | 67 +- .../_recipient+/sign.$token+/waiting.tsx} | 52 +- .../remix/app/routes/_redirects+/ingest.$.tsx | 41 + .../app/routes/_unauthenticated+/_layout.tsx} | 19 +- .../articles.signature-disclosure.tsx} | 12 +- .../routes/_unauthenticated+/check-email.tsx} | 19 +- .../_unauthenticated+/forgot-password.tsx} | 21 +- .../reset-password.$token.tsx} | 34 +- .../reset-password._index.tsx} | 19 +- .../share.$slug.opengraph.tsx | 192 + .../routes/_unauthenticated+/share.$slug.tsx | 55 + .../app/routes/_unauthenticated+/signin.tsx | 74 + .../app/routes/_unauthenticated+/signup.tsx | 42 + .../team.decline.$token.tsx} | 109 +- .../_unauthenticated+/team.invite.$token.tsx} | 113 +- .../team.verify.email.$token.tsx} | 140 +- .../team.verify.transfer.token.tsx} | 95 +- .../_unauthenticated+/unverified-account.tsx} | 8 +- .../_unauthenticated+/verify-email.$token.tsx | 187 + .../verify-email._index.tsx} | 19 +- apps/remix/app/routes/api+/avatar.$id.tsx | 40 + .../routes/api+/branding.logo.team.$teamId.ts | 73 + apps/remix/app/routes/api+/health.ts | 22 + apps/remix/app/routes/api+/limits.tsx | 7 + apps/remix/app/routes/api+/locale.tsx | 19 + .../app/routes/api+/share.ts} | 18 +- apps/remix/app/routes/api+/stripe.webhook.ts | 11 + apps/remix/app/routes/api+/theme.tsx | 5 + apps/remix/app/routes/api+/webhook.trigger.ts | 17 + apps/remix/app/routes/embed+/_layout.tsx | 42 + .../app/routes/embed+/direct.$url.tsx} | 87 +- .../app/routes/embed+/sign.$url.tsx} | 90 +- apps/remix/app/storage/lang-cookie.server.ts | 6 + .../remix/app/storage/theme-session.server.ts | 20 + .../app/types/embed-base-schemas.ts} | 2 +- .../types/embed-direct-template-schema.ts} | 2 +- .../app/types/embed-document-sign-schema.ts} | 2 +- .../app/embed => remix/app/utils}/css-vars.ts | 19 + .../app/utils}/get-asset-buffer.ts | 0 apps/remix/app/utils/meta.ts | 61 + apps/remix/app/utils/super-json-loader.ts | 57 + .../app/utils}/truncate-title.ts | 0 apps/{web => remix}/example/cert.p12 | Bin apps/remix/package.json | 103 + apps/remix/public/.well-known/security.txt | 7 + .../public/android-chrome-192x192.png | Bin .../public/android-chrome-512x512.png | Bin .../public/apple-touch-icon.png | Bin apps/{web => remix}/public/favicon-16x16.png | Bin apps/{web => remix}/public/favicon-32x32.png | Bin apps/{web => remix}/public/favicon.ico | Bin apps/remix/public/fonts/caveat-regular.ttf | Bin 0 -> 256900 bytes apps/remix/public/fonts/caveat.ttf | Bin 0 -> 252080 bytes apps/remix/public/fonts/inter-bold.ttf | Bin 0 -> 316100 bytes apps/remix/public/fonts/inter-regular.ttf | Bin 0 -> 309828 bytes apps/remix/public/fonts/inter-semibold.ttf | Bin 0 -> 315756 bytes apps/remix/public/fonts/noto-sans.ttf | Bin 0 -> 582748 bytes .../{web => remix}/public/opengraph-image.jpg | Bin apps/{web => remix}/public/pdf.worker.min.js | 0 apps/{web => remix}/public/site.webmanifest | 0 .../{web => remix}/public/static/add-user.png | Bin apps/{web => remix}/public/static/clock.png | Bin .../public/static/completed.png | Bin .../public/static/delete-team.png | Bin .../public/static/delete-user.png | Bin .../{web => remix}/public/static/document.png | Bin .../{web => remix}/public/static/download.png | Bin .../public/static/early-supporter-badge.svg | 0 apps/{web => remix}/public/static/logo.png | Bin .../public/static/mail-open-alert.png | Bin .../public/static/mail-open.png | Bin apps/remix/public/static/og-share-frame2.png | Bin 0 -> 469162 bytes .../public/static/premium-user-badge.svg | 0 apps/{web => remix}/public/static/review.png | Bin .../public/static/user-plus.png | Bin apps/remix/react-router.config.ts | 6 + apps/remix/rollup.config.mjs | 52 + apps/remix/server/api/files.ts | 110 + apps/remix/server/api/files.types.ts | 38 + apps/remix/server/context.ts | 109 + apps/remix/server/main.js | 24 + apps/remix/server/middleware.ts | 66 + apps/remix/server/router.ts | 49 + apps/remix/server/trpc/hono-trpc-open-api.ts | 34 + apps/remix/server/trpc/hono-trpc-remix.ts | 25 + apps/remix/server/utils/get-loader-session.ts | 59 + .../tailwind.config.ts} | 1 + apps/remix/tsconfig.json | 34 + apps/remix/vite-env.d.ts | 9 + apps/remix/vite.config.ts | 67 + apps/web/README.md | 1 - apps/web/ambient.d.ts | 1 - apps/web/next-env.d.ts | 6 - apps/web/next.config.js | 108 - apps/web/package.json | 77 - apps/web/postcss.config.js | 6 - apps/web/process-env.d.ts | 23 - .../admin/documents/[id]/admin-actions.tsx | 81 - .../(dashboard)/admin/documents/[id]/page.tsx | 99 - .../app/(dashboard)/admin/documents/page.tsx | 21 - apps/web/src/app/(dashboard)/admin/layout.tsx | 33 - .../leaderboard/fetch-leaderboard.actions.ts | 25 - .../(dashboard)/admin/leaderboard/page.tsx | 60 - apps/web/src/app/(dashboard)/admin/nav.tsx | 112 - apps/web/src/app/(dashboard)/admin/page.tsx | 5 - .../admin/site-settings/banner-form.tsx | 208 - .../(dashboard)/admin/site-settings/page.tsx | 35 - .../admin/users/fetch-users.actions.ts | 17 - .../src/app/(dashboard)/admin/users/page.tsx | 47 - .../(dashboard)/documents/[id]/edit/page.tsx | 15 - .../(dashboard)/documents/[id]/logs/page.tsx | 15 - .../app/(dashboard)/documents/[id]/page.tsx | 15 - .../(dashboard)/documents/[id]/sent/page.tsx | 23 - .../app/(dashboard)/documents/data-table.tsx | 127 - .../documents/documents-page-view.tsx | 174 - .../src/app/(dashboard)/documents/page.tsx | 29 - .../upcoming-profile-claim-teaser.tsx | 59 - apps/web/src/app/(dashboard)/layout.tsx | 54 - .../settings/billing/billing-plans.tsx | 138 - .../billing/billing-portal-button.tsx | 70 - .../billing/create-billing-portal.action.ts | 17 - .../billing/create-checkout.action.ts | 40 - .../app/(dashboard)/settings/billing/page.tsx | 146 - .../src/app/(dashboard)/settings/layout.tsx | 31 - .../web/src/app/(dashboard)/settings/page.tsx | 8 - .../(dashboard)/settings/password/page.tsx | 5 - .../app/(dashboard)/settings/profile/page.tsx | 40 - .../settings/public-profile/page.tsx | 17 - .../settings/security/activity/page.tsx | 37 - .../settings/security/passkeys/page.tsx | 44 - .../teams/accept-team-invitation-button.tsx | 49 - .../teams/decline-team-invitation-button.tsx | 50 - .../(dashboard)/templates/[id]/edit/page.tsx | 14 - .../app/(dashboard)/templates/[id]/page.tsx | 15 - .../templates/data-table-title.tsx | 38 - .../app/(dashboard)/templates/empty-state.tsx | 22 - .../src/app/(dashboard)/templates/page.tsx | 22 - .../templates/templates-page-view.tsx | 81 - apps/web/src/app/(profile)/layout.tsx | 35 - .../src/app/(profile)/p/[url]/not-found.tsx | 37 - apps/web/src/app/(profile)/profile-header.tsx | 91 - .../app/(recipient)/d/[token]/not-found.tsx | 40 - apps/web/src/app/(recipient)/layout.tsx | 41 - .../(share)/share/[slug]/opengraph/route.tsx | 154 - .../web/src/app/(share)/share/[slug]/page.tsx | 39 - .../complete/document-preview-button.tsx | 40 - .../sign/[token]/complete/layout.tsx | 21 - .../poll-until-document-completed.tsx | 32 - .../src/app/(signing)/sign/[token]/layout.tsx | 35 - .../sign/[token]/no-longer-available.tsx | 75 - .../src/app/(signing)/sign/[token]/page.tsx | 165 - .../t/[teamUrl]/documents/[id]/edit/page.tsx | 24 - .../t/[teamUrl]/documents/[id]/logs/page.tsx | 23 - .../t/[teamUrl]/documents/[id]/page.tsx | 23 - .../(teams)/t/[teamUrl]/documents/page.tsx | 28 - .../web/src/app/(teams)/t/[teamUrl]/error.tsx | 63 - .../src/app/(teams)/t/[teamUrl]/layout.tsx | 78 - .../src/app/(teams)/t/[teamUrl]/not-found.tsx | 39 - .../(teams)/t/[teamUrl]/settings/layout.tsx | 61 - .../t/[teamUrl]/settings/members/page.tsx | 48 - .../t/[teamUrl]/settings/preferences/page.tsx | 52 - .../settings/public-profile/page.tsx | 31 - .../t/[teamUrl]/templates/[id]/edit/page.tsx | 24 - .../t/[teamUrl]/templates/[id]/page.tsx | 25 - .../(teams)/t/[teamUrl]/templates/page.tsx | 29 - .../src/app/(unauthenticated)/signin/page.tsx | 56 - .../src/app/(unauthenticated)/signup/page.tsx | 31 - .../verify-email/[token]/client.tsx | 56 - .../verify-email/[token]/page.tsx | 130 - apps/web/src/app/api/v1/openapi/page.tsx | 11 - .../app/embed/direct/[[...url]]/not-found.tsx | 3 - .../app/embed/sign/[[...url]]/not-found.tsx | 3 - apps/web/src/app/embed/util.ts | 20 - apps/web/src/app/globals.css | 1 - apps/web/src/app/layout.tsx | 102 - apps/web/src/app/not-found.tsx | 35 - apps/web/src/app/page.tsx | 7 - .../components/(dashboard)/layout/banner.tsx | 29 - .../(dashboard)/period-selector/types.ts | 6 - .../settings/layout/activity-back.tsx | 24 - .../(dashboard)/settings/token/contants.ts | 9 - .../tables/teams-member-page-data-table.tsx | 102 - apps/web/src/components/forms/signup.tsx | 284 - .../web/src/components/partials/not-found.tsx | 76 - apps/web/src/middleware.ts | 123 - apps/web/src/pages/api/auth/[...nextauth].ts | 110 - apps/web/src/pages/api/avatar/[id].tsx | 34 - .../pages/api/branding/logo/team/[teamId].ts | 59 - apps/web/src/pages/api/feature-flag/all.ts | 7 - apps/web/src/pages/api/feature-flag/get.ts | 7 - apps/web/src/pages/api/health.ts | 21 - apps/web/src/pages/api/jobs/[[...handler]].ts | 10 - apps/web/src/pages/api/limits/index.ts | 3 - .../web/src/pages/api/stripe/webhook/index.ts | 7 - apps/web/src/pages/api/trpc/[trpc].ts | 56 - apps/web/src/pages/api/v1/[...ts-rest].tsx | 17 - apps/web/src/pages/api/v1/me/index.ts | 3 - apps/web/src/pages/api/v1/openapi.json.ts | 7 - .../api/v1/zapier/list-documents/index.ts | 3 - .../pages/api/v1/zapier/subscribe/index.ts | 3 - .../pages/api/v1/zapier/unsubscribe/index.ts | 3 - apps/web/src/pages/api/v2-beta/[...trpc].ts | 60 - .../web/src/pages/api/v2-beta/openapi.json.ts | 9 - apps/web/src/pages/api/webhook/trigger.ts | 12 - apps/web/src/providers/next-auth.tsx | 15 - apps/web/src/providers/next-theme.tsx | 10 - apps/web/src/providers/plausible.tsx | 13 - apps/web/tsconfig.json | 28 - lingui.config.ts | 3 +- package-lock.json | 31911 ++++++++++------ package.json | 23 +- packages/api/hono.ts | 35 + packages/api/package.json | 4 +- packages/api/v1/api-documentation.tsx | 31 - packages/api/v1/implementation.ts | 37 +- packages/api/v1/middleware/authenticated.ts | 32 +- .../e2e/api/v1/document-sending.spec.ts | 42 +- .../e2e/api/v1/team-user-management.spec.ts | 23 +- .../e2e/document-auth/action-auth.spec.ts | 41 +- .../document-flow/stepper-component.spec.ts | 22 +- .../include-document-certificate.spec.ts | 28 +- .../app-tests/e2e/fixtures/authentication.ts | 24 +- packages/app-tests/e2e/fixtures/signature.ts | 40 + .../app-tests/e2e/teams/manage-team.spec.ts | 6 +- .../e2e/teams/search-documents.spec.ts | 12 +- .../e2e/teams/team-documents.spec.ts | 10 +- .../app-tests/e2e/teams/team-email.spec.ts | 4 +- .../app-tests/e2e/teams/team-members.spec.ts | 7 +- .../app-tests/e2e/teams/transfer-team.spec.ts | 4 +- .../e2e/templates/direct-templates.spec.ts | 18 +- .../e2e/templates/manage-templates.spec.ts | 27 +- packages/app-tests/e2e/user/auth-flow.spec.ts | 13 +- .../app-tests/e2e/user/delete-account.spec.ts | 4 +- packages/app-tests/package.json | 3 +- packages/auth/client/index.ts | 136 + packages/auth/index.ts | 2 + packages/auth/package.json | 25 + packages/auth/server/index.ts | 92 + .../auth/server/lib/errors/error-codes.ts | 29 + .../server/lib/session/session-cookies.ts | 113 + packages/auth/server/lib/session/session.ts | 146 + packages/auth/server/lib/utils/authorizer.ts | 30 + packages/auth/server/lib/utils/get-session.ts | 54 + packages/auth/server/lib/utils/redirect.ts | 28 + packages/auth/server/routes/email-password.ts | 401 + packages/auth/server/routes/google.ts | 238 + packages/auth/server/routes/passkey.ts | 146 + packages/auth/server/routes/session.ts | 10 + packages/auth/server/routes/sign-out.ts | 27 + packages/auth/server/types/context.ts | 7 + packages/auth/server/types/email-password.ts | 83 + packages/auth/server/types/passkey.ts | 8 + packages/auth/tsconfig.json | 8 + packages/ee/package.json | 2 - packages/ee/server-only/limits/client.ts | 4 +- packages/ee/server-only/limits/handler.ts | 48 +- .../ee/server-only/limits/provider/client.tsx | 2 - .../ee/server-only/limits/provider/server.tsx | 23 - .../stripe/get-checkout-session.ts | 4 - .../server-only/stripe/get-portal-session.ts | 4 - .../ee/server-only/stripe/webhook/handler.ts | 311 +- packages/email/ambient.d.ts | 1 - packages/email/components.ts | 34 +- packages/email/mailer.ts | 39 +- packages/email/package.json | 6 +- packages/email/providers/branding.tsx | 2 - packages/email/render.tsx | 7 +- .../template-confirmation-email.tsx | 2 +- .../template-document-cancel.tsx | 2 +- .../template-document-completed.tsx | 2 +- .../template-document-invite.tsx | 2 +- .../template-document-pending.tsx | 2 +- .../template-document-recipient-signed.tsx | 2 +- .../template-document-rejected.tsx | 2 +- .../template-document-rejection-confirmed.tsx | 2 +- .../template-document-self-signed.tsx | 5 +- .../template-document-super-delete.tsx | 2 +- .../template-components/template-footer.tsx | 2 +- .../template-forgot-password.tsx | 2 +- .../template-reset-password.tsx | 5 +- packages/email/templates/confirm-email.tsx | 2 +- .../email/templates/confirm-team-email.tsx | 3 +- packages/email/templates/document-cancel.tsx | 2 +- .../email/templates/document-completed.tsx | 2 +- .../document-created-from-direct-template.tsx | 5 +- packages/email/templates/document-invite.tsx | 5 +- packages/email/templates/document-pending.tsx | 2 +- .../templates/document-recipient-signed.tsx | 2 +- .../email/templates/document-rejected.tsx | 2 +- .../document-rejection-confirmed.tsx | 2 +- .../email/templates/document-self-signed.tsx | 2 +- .../email/templates/document-super-delete.tsx | 2 +- packages/email/templates/forgot-password.tsx | 2 +- .../recipient-removed-from-document.tsx | 3 +- packages/email/templates/reset-password.tsx | 3 +- packages/email/templates/team-delete.tsx | 2 +- .../email/templates/team-email-removed.tsx | 3 +- packages/email/templates/team-invite.tsx | 3 +- packages/email/templates/team-join.tsx | 3 +- packages/email/templates/team-leave.tsx | 3 +- .../email/templates/team-transfer-request.tsx | 3 +- packages/email/transports/mailchannels.ts | 10 +- packages/lib/client-only/download-pdf.ts | 2 +- .../lib/client-only/hooks/use-analytics.ts | 32 +- .../client-only/hooks/use-document-element.ts | 2 - .../hooks/use-field-item-styles.ts | 25 - .../hooks/use-field-page-coords.ts | 3 +- .../hooks/use-update-search-params.ts | 10 +- .../client-only/providers/feature-flag.tsx | 95 - .../providers/feature-flag.types.ts | 10 - .../{i18n.server.tsx => i18n-server.tsx} | 35 +- .../lib/client-only/providers/i18n.client.tsx | 2 - .../lib/client-only/providers/session.tsx | 45 + packages/lib/client-only/recipient-type.ts | 4 +- packages/lib/constants/app.ts | 25 +- packages/lib/constants/auth.ts | 54 +- packages/lib/constants/crypto.ts | 44 +- packages/lib/constants/document.ts | 5 +- packages/lib/constants/email.ts | 13 +- packages/lib/constants/feature-flags.ts | 8 +- packages/lib/constants/pdf.ts | 4 +- packages/lib/constants/recipient-roles.ts | 5 +- packages/lib/constants/teams.ts | 7 +- packages/lib/constants/template.ts | 2 +- packages/lib/errors/app-error.ts | 4 - packages/lib/jobs/client.ts | 2 + packages/lib/jobs/client/base.ts | 4 +- packages/lib/jobs/client/client.ts | 5 +- packages/lib/jobs/client/index.ts | 3 + packages/lib/jobs/client/inngest.ts | 56 +- packages/lib/jobs/client/local.ts | 50 +- packages/lib/jobs/client/trigger.ts | 73 - ...nd-password-reset-success-email.handler.ts | 12 + .../send-password-reset-success-email.ts | 31 + .../send-recipient-signed-email.handler.ts | 117 + .../emails/send-recipient-signed-email.ts | 110 +- .../emails/send-rejection-emails.handler.ts | 6 +- .../emails/send-signing-email.handler.ts | 15 +- .../emails/send-team-deleted-email.ts | 3 +- .../send-team-member-joined-email.handler.ts | 12 +- .../send-team-member-left-email.handler.ts | 12 +- .../internal/seal-document.handler.ts | 15 +- packages/lib/next-auth/auth-options.ts | 519 - packages/lib/next-auth/error-codes.ts | 24 - .../next-auth/get-server-component-session.ts | 39 - packages/lib/next-auth/get-server-session.ts | 30 - packages/lib/next-auth/guards/is-admin.ts | 5 +- packages/lib/package.json | 15 +- packages/lib/server-only/2fa/disable-2fa.ts | 10 +- packages/lib/server-only/2fa/enable-2fa.ts | 5 +- .../lib/server-only/2fa/get-backup-code.ts | 9 +- .../lib/server-only/2fa/is-2fa-availble.ts | 2 +- packages/lib/server-only/2fa/setup-2fa.ts | 7 +- packages/lib/server-only/2fa/validate-2fa.ts | 17 +- .../lib/server-only/2fa/verify-2fa-token.ts | 9 +- .../lib/server-only/2fa/verify-backup-code.ts | 8 +- .../lib/server-only/2fa/view-backup-codes.ts | 7 +- .../server-only/admin/get-all-documents.ts | 3 +- .../server-only/admin/get-recipients-stats.ts | 3 +- .../server-only/admin/get-signing-volume.ts | 3 +- .../lib/server-only/admin/get-users-stats.ts | 2 +- .../lib/server-only/admin/update-recipient.ts | 3 +- packages/lib/server-only/admin/update-user.ts | 3 +- .../create-passkey-authentication-options.ts | 2 +- .../lib/server-only/auth/create-passkey.ts | 2 +- .../lib/server-only/auth/delete-passkey.ts | 3 +- .../lib/server-only/auth/find-passkeys.ts | 5 +- .../auth/send-confirmation-email.ts | 9 +- .../server-only/auth/send-forgot-password.ts | 9 +- .../server-only/auth/send-reset-password.ts | 5 +- .../lib/server-only/auth/update-passkey.ts | 3 +- .../document-data/create-document-data.ts | 3 +- .../document-meta/upsert-document-meta.ts | 3 +- .../document/complete-document-with-token.ts | 13 +- .../document/create-document-v2.ts | 27 +- .../server-only/document/create-document.ts | 15 +- .../server-only/document/delete-document.ts | 18 +- .../document/duplicate-document-by-id.ts | 3 +- .../document/find-document-audit-logs.ts | 3 +- .../server-only/document/find-documents.ts | 13 +- .../document/get-document-by-id.ts | 4 +- .../lib/server-only/document/get-stats.ts | 10 +- .../document/is-recipient-authorized.ts | 2 +- .../document/reject-document-with-token.ts | 2 +- .../server-only/document/resend-document.tsx | 34 +- .../lib/server-only/document/seal-document.ts | 15 +- .../document/search-documents-with-keyword.ts | 6 +- .../document/send-completed-email.ts | 19 +- .../server-only/document/send-delete-email.ts | 9 +- .../server-only/document/send-document.tsx | 19 +- .../document/send-pending-email.ts | 9 +- .../document/super-delete-document.ts | 8 +- .../server-only/document/update-document.ts | 4 +- .../lib/server-only/document/update-title.ts | 2 - .../document/validate-field-auth.ts | 4 +- .../server-only/document/viewed-document.ts | 5 +- packages/lib/server-only/feature-flags/all.ts | 56 - .../get-server-component-feature-flag.ts | 26 - packages/lib/server-only/feature-flags/get.ts | 136 - .../lib/server-only/field/create-field.ts | 2 +- .../field/create-template-fields.ts | 3 +- .../lib/server-only/field/delete-field.ts | 3 +- .../get-completed-fields-for-document.ts | 3 +- .../field/get-completed-fields-for-token.ts | 3 +- .../field/remove-signed-field-with-token.ts | 3 +- .../field/set-fields-for-document.ts | 4 +- .../field/set-fields-for-template.ts | 3 +- .../field/sign-field-with-token.ts | 4 +- .../field/update-document-fields.ts | 3 +- .../lib/server-only/field/update-field.ts | 3 +- .../field/update-template-fields.ts | 3 +- .../htmltopdf/get-certificate-pdf.ts | 7 +- .../lib/server-only/http/to-next-request.ts | 9 - packages/lib/server-only/http/with-swr.ts | 28 - .../server-only/i18n/switch-i18n-language.ts | 11 - .../server-only/pdf/insert-field-in-pdf.ts | 14 +- .../profile/get-public-profile-by-url.ts | 9 +- .../public-api/create-api-token.ts | 2 +- .../public-api/delete-api-token-by-id.ts | 3 +- .../public-api/get-all-team-tokens.ts | 3 +- .../public-api/test-credentials.ts | 21 +- .../recipient/create-document-recipients.ts | 5 +- .../recipient/create-template-recipients.ts | 5 +- .../recipient/delete-document-recipient.ts | 6 +- .../server-only/recipient/delete-recipient.ts | 5 +- .../recipient/get-is-recipient-turn.ts | 3 +- .../recipient/set-document-recipients.ts | 10 +- .../recipient/set-template-recipients.ts | 5 +- .../recipient/update-document-recipients.ts | 7 +- .../server-only/recipient/update-recipient.ts | 3 +- .../recipient/update-template-recipients.ts | 5 +- packages/lib/server-only/redis/index.ts | 6 +- packages/lib/server-only/stripe/index.ts | 4 +- .../get-active-subscriptions-by-user-id.ts | 3 +- .../get-subscriptions-by-user-id.ts | 2 - .../team/accept-team-invitation.ts | 3 +- .../team/create-team-checkout-session.ts | 4 +- .../team/create-team-email-verification.ts | 15 +- .../team/create-team-member-invites.ts | 14 +- packages/lib/server-only/team/create-team.ts | 2 +- .../lib/server-only/team/delete-team-email.ts | 11 +- packages/lib/server-only/team/delete-team.ts | 12 +- .../team/find-team-member-invites.ts | 6 +- .../lib/server-only/team/find-team-members.ts | 7 +- .../server-only/team/find-teams-pending.ts | 6 +- packages/lib/server-only/team/find-teams.ts | 5 +- .../server-only/team/get-team-invitations.ts | 3 +- .../lib/server-only/team/get-team-members.ts | 3 +- .../team/get-team-public-profile.ts | 3 +- packages/lib/server-only/team/get-team.ts | 22 +- packages/lib/server-only/team/get-teams.ts | 3 +- .../team/request-team-ownership-transfer.ts | 10 +- .../team/transfer-team-ownership.ts | 2 +- .../team/update-team-branding-settings.ts | 4 +- .../team/update-team-document-settings.ts | 6 +- .../server-only/team/update-team-member.ts | 3 +- packages/lib/server-only/team/update-team.ts | 2 +- .../create-document-from-direct-template.ts | 29 +- .../create-document-from-template-legacy.ts | 3 +- .../template/create-document-from-template.ts | 9 +- .../template/create-template-direct-link.ts | 4 +- .../server-only/template/create-template.ts | 2 +- .../template/delete-template-direct-link.ts | 2 - .../server-only/template/delete-template.ts | 2 - .../template/duplicate-template.ts | 2 +- .../server-only/template/find-templates.ts | 7 +- .../get-template-by-direct-link-token.ts | 12 +- .../template/toggle-template-direct-link.ts | 2 - .../server-only/template/update-template.ts | 3 +- packages/lib/server-only/user/create-user.ts | 35 +- packages/lib/server-only/user/delete-user.ts | 3 +- .../user/find-user-security-audit-logs.ts | 3 +- .../lib/server-only/user/forgot-password.ts | 33 +- .../lib/server-only/user/get-all-users.ts | 3 +- .../user/get-monthly-completed-document.ts | 2 +- .../user/get-user-public-profile.ts | 3 +- .../lib/server-only/user/reset-password.ts | 29 +- .../lib/server-only/user/update-password.ts | 2 +- .../lib/server-only/user/update-profile.ts | 3 +- .../server-only/user/update-public-profile.ts | 2 +- packages/lib/server-only/user/verify-email.ts | 28 +- .../server-only/webhooks/create-webhook.ts | 3 +- .../get-all-webhooks-by-event-trigger.ts | 3 +- .../webhooks/trigger/execute-webhook.ts | 8 +- .../server-only/webhooks/trigger/handler.ts | 20 +- .../server-only/webhooks/trigger/schema.ts | 3 +- .../webhooks/trigger/trigger-webhook.ts | 2 +- .../webhooks/zapier/list-documents.ts | 25 +- .../server-only/webhooks/zapier/subscribe.ts | 23 +- .../webhooks/zapier/unsubscribe.ts | 23 +- packages/lib/translations/.gitignore | 1 + packages/lib/tsconfig.json | 2 +- packages/lib/types/document-audit-logs.ts | 3 +- packages/lib/types/document-email.ts | 5 +- packages/lib/types/document-visibility.ts | 3 +- packages/lib/types/document.ts | 12 +- packages/lib/types/field-meta.ts | 3 +- packages/lib/types/field.ts | 2 +- packages/lib/types/is-document-status.ts | 2 +- packages/lib/types/recipient.ts | 5 +- packages/lib/types/template.ts | 14 +- packages/lib/types/webhook-payload.ts | 7 +- .../lib/universal/extract-request-metadata.ts | 31 +- packages/lib/universal/get-base-url.ts | 7 +- packages/lib/universal/get-feature-flag.ts | 111 - packages/lib/universal/upload/delete-file.ts | 3 +- .../lib/universal/upload/get-file.server.ts | 50 + packages/lib/universal/upload/get-file.ts | 21 +- .../lib/universal/upload/put-file.server.ts | 85 + packages/lib/universal/upload/put-file.ts | 67 +- .../lib/universal/upload/server-actions.ts | 84 +- packages/lib/universal/upload/update-file.ts | 3 +- packages/lib/utils/advanced-fields-helpers.ts | 2 +- packages/lib/utils/authenticator.ts | 6 +- packages/lib/utils/avatars.ts | 9 + packages/lib/utils/billing.ts | 4 +- packages/lib/utils/debugger.ts | 17 + packages/lib/utils/document-audit-logs.ts | 7 +- packages/lib/utils/document-auth.ts | 2 +- packages/lib/utils/document-visibility.ts | 2 +- packages/lib/utils/env.ts | 20 + packages/lib/utils/fields.ts | 2 +- packages/lib/utils/i18n.ts | 61 +- packages/lib/utils/logger.ts | 8 +- .../mask-recipient-tokens-for-document.ts | 3 +- packages/lib/utils/params.ts | 2 +- packages/lib/utils/public-profiles.ts | 6 +- packages/lib/utils/recipient-formatter.ts | 2 +- packages/lib/utils/recipients.ts | 2 +- packages/lib/utils/render-email-with-i18n.tsx | 2 +- .../utils/team-global-settings-to-branding.ts | 2 +- packages/lib/utils/teams.ts | 4 +- packages/lib/utils/templates.ts | 6 +- .../migration.sql | 18 + packages/prisma/package.json | 8 +- packages/prisma/schema.prisma | 24 +- packages/signing/index.ts | 4 +- packages/signing/package.json | 2 +- .../signing/transports/google-cloud-hsm.ts | 37 +- packages/signing/transports/local-cert.ts | 15 +- packages/tailwind-config/index.d.ts | 4 + packages/tailwind-config/package.json | 3 +- packages/trpc/package.json | 1 - packages/trpc/react/index.tsx | 26 +- packages/trpc/server/admin-router/router.ts | 6 +- packages/trpc/server/auth-router/router.ts | 80 +- packages/trpc/server/auth-router/schema.ts | 2 - packages/trpc/server/context.ts | 56 +- .../trpc/server/document-router/router.ts | 75 +- .../trpc/server/document-router/schema.ts | 36 +- packages/trpc/server/field-router/router.ts | 5 +- packages/trpc/server/field-router/schema.ts | 2 +- packages/trpc/server/profile-router/router.ts | 62 +- packages/trpc/server/profile-router/schema.ts | 28 - .../trpc/server/recipient-router/router.ts | 5 +- .../trpc/server/recipient-router/schema.ts | 2 +- packages/trpc/server/team-router/schema.ts | 2 +- .../trpc/server/template-router/router.ts | 3 +- .../trpc/server/template-router/schema.ts | 4 +- packages/trpc/server/trpc.ts | 6 +- packages/trpc/server/webhook-router/schema.ts | 3 +- packages/trpc/utils/trpc-error-handler.ts | 43 + .../animate/animate-generic-fade-in-out.tsx | 2 - packages/ui/components/call-to-action.tsx | 4 +- packages/ui/components/client-only.tsx | 11 + .../ui/components/common/copy-text-button.tsx | 2 - .../common/language-switcher-dialog.tsx | 15 +- .../components/document/document-dialog.tsx | 16 +- .../document/document-download-button.tsx | 6 +- .../document/document-email-checkboxes.tsx | 2 +- .../document-global-auth-access-select.tsx | 5 +- .../document-global-auth-action-select.tsx | 5 +- .../document-send-email-message-helper.tsx | 4 +- .../document/document-share-button.tsx | 5 +- .../ui/components/field/field-tooltip.tsx | 2 +- packages/ui/components/field/field.tsx | 4 +- .../recipient-action-auth-select.tsx | 5 +- .../recipient/recipient-role-select.tsx | 6 +- packages/ui/components/signing-card.tsx | 15 +- packages/ui/icons/verified.tsx | 4 +- packages/ui/package.json | 6 +- packages/ui/primitives/accordion.tsx | 2 - packages/ui/primitives/alert-dialog.tsx | 2 - packages/ui/primitives/aspect-ratio.tsx | 2 - packages/ui/primitives/auto-sized-text.tsx | 2 - packages/ui/primitives/avatar.tsx | 2 - packages/ui/primitives/calendar.tsx | 2 - packages/ui/primitives/card.tsx | 2 - packages/ui/primitives/checkbox.tsx | 2 - packages/ui/primitives/collapsible.tsx | 2 - packages/ui/primitives/combobox.tsx | 3 +- packages/ui/primitives/command.tsx | 4 +- packages/ui/primitives/constants.ts | 5 - packages/ui/primitives/context-menu.tsx | 2 - .../ui/primitives/data-table-pagination.tsx | 2 +- packages/ui/primitives/data-table.tsx | 4 +- packages/ui/primitives/dialog.tsx | 2 - packages/ui/primitives/document-dropzone.tsx | 14 +- .../primitives/document-flow/add-fields.tsx | 29 +- .../document-flow/add-fields.types.ts | 2 +- .../primitives/document-flow/add-settings.tsx | 8 +- .../document-flow/add-settings.types.ts | 2 +- .../primitives/document-flow/add-signers.tsx | 15 +- .../document-flow/add-signers.types.ts | 4 +- .../primitives/document-flow/add-subject.tsx | 13 +- .../document-flow/add-subject.types.ts | 3 +- .../advanced-fields/checkbox.tsx | 6 +- .../document-flow/advanced-fields/radio.tsx | 6 +- .../document-flow/document-flow-root.tsx | 5 +- .../primitives/document-flow/field-icon.tsx | 16 +- .../field-item-advanced-settings.tsx | 6 +- .../primitives/document-flow/field-item.tsx | 18 +- .../checkbox-field.tsx | 5 +- .../date-field.tsx | 3 +- .../dropdown-field.tsx | 7 +- .../email-field.tsx | 3 +- .../initials-field.tsx | 3 +- .../name-field.tsx | 3 +- .../number-field.tsx | 9 +- .../radio-field.tsx | 4 +- .../text-field.tsx | 5 +- .../missing-signature-field-dialog.tsx | 4 +- .../send-document-action-dialog.tsx | 2 +- .../document-flow/show-field-item.tsx | 21 +- packages/ui/primitives/document-flow/types.ts | 4 +- .../primitives/document-password-dialog.tsx | 3 +- packages/ui/primitives/dropdown-menu.tsx | 2 - packages/ui/primitives/element-visible.tsx | 2 - packages/ui/primitives/hover-card.tsx | 2 - packages/ui/primitives/label.tsx | 5 +- packages/ui/primitives/lazy-pdf-viewer.tsx | 47 +- packages/ui/primitives/menubar.tsx | 2 - .../ui/primitives/multi-select-combobox.tsx | 6 +- packages/ui/primitives/password-input.tsx | 3 +- packages/ui/primitives/pdf-viewer.tsx | 7 +- packages/ui/primitives/pin-input.tsx | 2 - packages/ui/primitives/popover.tsx | 2 - packages/ui/primitives/progress.tsx | 2 - packages/ui/primitives/radio-group.tsx | 2 - .../ui/primitives/recipient-role-icons.tsx | 3 +- packages/ui/primitives/scroll-area.tsx | 2 - packages/ui/primitives/select.tsx | 2 - packages/ui/primitives/separator.tsx | 2 - packages/ui/primitives/sheet.tsx | 2 - packages/ui/primitives/signature-pad/point.ts | 2 +- .../signature-pad/signature-pad.tsx | 16 +- packages/ui/primitives/slider.tsx | 2 - packages/ui/primitives/switch.tsx | 2 - packages/ui/primitives/tabs.tsx | 2 - .../template-flow/add-template-fields.tsx | 21 +- .../add-template-fields.types.ts | 2 +- .../add-template-placeholder-recipients.tsx | 24 +- ...d-template-placeholder-recipients.types.ts | 2 +- .../template-flow/add-template-settings.tsx | 8 +- .../add-template-settings.types.tsx | 4 +- packages/ui/primitives/theme-switcher.tsx | 18 +- packages/ui/primitives/toaster.tsx | 2 - packages/ui/primitives/toggle.tsx | 2 - packages/ui/primitives/tooltip.tsx | 2 - 898 files changed, 31175 insertions(+), 24615 deletions(-) create mode 100755 apps/remix/.bin/build.sh create mode 100644 apps/remix/.dockerignore create mode 100644 apps/remix/.gitignore create mode 100644 apps/remix/Dockerfile create mode 100644 apps/remix/Dockerfile.bun create mode 100644 apps/remix/Dockerfile.pnpm create mode 100644 apps/remix/README.md create mode 100644 apps/remix/app/app.css rename apps/{web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx => remix/app/components/dialogs/account-delete-dialog.tsx} (91%) rename apps/{web/src/app/(dashboard)/admin/documents/[id]/super-delete-document-dialog.tsx => remix/app/components/dialogs/admin-document-delete-dialog.tsx} (90%) rename apps/{web/src/app/(dashboard)/admin/users/[id]/delete-user-dialog.tsx => remix/app/components/dialogs/admin-user-delete-dialog.tsx} (91%) rename apps/{web/src/app/(dashboard)/admin/users/[id]/disable-user-dialog.tsx => remix/app/components/dialogs/admin-user-disable-dialog.tsx} (93%) rename apps/{web/src/app/(dashboard)/admin/users/[id]/enable-user-dialog.tsx => remix/app/components/dialogs/admin-user-enable-dialog.tsx} (92%) rename apps/{web/src/app/(dashboard)/documents/delete-document-dialog.tsx => remix/app/components/dialogs/document-delete-dialog.tsx} (92%) rename apps/{web/src/app/(dashboard)/documents/duplicate-document-dialog.tsx => remix/app/components/dialogs/document-duplicate-dialog.tsx} (83%) rename apps/{web/src/app/(dashboard)/documents/move-document-dialog.tsx => remix/app/components/dialogs/document-move-dialog.tsx} (87%) rename apps/{web/src/app/(dashboard)/documents/_action-items/resend-document.tsx => remix/app/components/dialogs/document-resend-dialog.tsx} (89%) rename apps/{web/src/app/(dashboard)/settings/security/passkeys/create-passkey-dialog.tsx => remix/app/components/dialogs/passkey-create-dialog.tsx} (97%) rename apps/{web/src/components/templates/manage-public-template-dialog.tsx => remix/app/components/dialogs/public-profile-template-manage-dialog.tsx} (98%) rename apps/{web/src/components/(teams)/dialogs/create-team-checkout-dialog.tsx => remix/app/components/dialogs/team-checkout-create-dialog.tsx} (96%) rename apps/{web/src/components/(teams)/dialogs/create-team-dialog.tsx => remix/app/components/dialogs/team-create-dialog.tsx} (91%) rename apps/{web/src/components/(teams)/dialogs/delete-team-dialog.tsx => remix/app/components/dialogs/team-delete-dialog.tsx} (93%) rename apps/{web/src/components/(teams)/dialogs/add-team-email-dialog.tsx => remix/app/components/dialogs/team-email-add-dialog.tsx} (94%) rename apps/{web/src/components/(teams)/dialogs/remove-team-email-dialog.tsx => remix/app/components/dialogs/team-email-delete-dialog.tsx} (89%) rename apps/{web/src/components/(teams)/dialogs/update-team-email-dialog.tsx => remix/app/components/dialogs/team-email-update-dialog.tsx} (92%) rename apps/{web/src/components/(teams)/dialogs/leave-team-dialog.tsx => remix/app/components/dialogs/team-leave-dialog.tsx} (88%) rename apps/{web/src/components/(teams)/dialogs/delete-team-member-dialog.tsx => remix/app/components/dialogs/team-member-delete-dialog.tsx} (93%) rename apps/{web/src/components/(teams)/dialogs/invite-team-member-dialog.tsx => remix/app/components/dialogs/team-member-invite-dialog.tsx} (94%) rename apps/{web/src/components/(teams)/dialogs/update-team-member-dialog.tsx => remix/app/components/dialogs/team-member-update-dialog.tsx} (95%) rename apps/{web/src/components/(teams)/dialogs/transfer-team-dialog.tsx => remix/app/components/dialogs/team-transfer-dialog.tsx} (96%) rename apps/{web/src/app/(dashboard)/templates/new-template-dialog.tsx => remix/app/components/dialogs/template-create-dialog.tsx} (72%) rename apps/{web/src/app/(dashboard)/templates/delete-template-dialog.tsx => remix/app/components/dialogs/template-delete-dialog.tsx} (86%) rename apps/{web/src/app/(dashboard)/templates/[id] => remix/app/components/dialogs}/template-direct-link-dialog-wrapper.tsx (80%) rename apps/{web/src/app/(dashboard)/templates => remix/app/components/dialogs}/template-direct-link-dialog.tsx (97%) rename apps/{web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx => remix/app/components/dialogs/template-duplicate-dialog.tsx} (88%) rename apps/{web/src/app/(dashboard)/templates/move-template-dialog.tsx => remix/app/components/dialogs/template-move-dialog.tsx} (81%) rename apps/{web/src/app/(dashboard)/templates/use-template-dialog.tsx => remix/app/components/dialogs/template-use-dialog.tsx} (98%) rename apps/{web/src/components/(dashboard)/settings/token/delete-token-dialog.tsx => remix/app/components/dialogs/token-delete-dialog.tsx} (90%) rename apps/{web/src/components/(dashboard)/settings/webhooks/create-webhook-dialog.tsx => remix/app/components/dialogs/webhook-create-dialog.tsx} (94%) rename apps/{web/src/components/(dashboard)/settings/webhooks/delete-webhook-dialog.tsx => remix/app/components/dialogs/webhook-delete-dialog.tsx} (93%) rename apps/{web/src/app/embed/authenticate.tsx => remix/app/components/embed/embed-authentication-required.tsx} (69%) rename apps/{web/src/app/embed/client-loading.tsx => remix/app/components/embed/embed-client-loading.tsx} (100%) rename apps/{web/src/app/embed/direct/[[...url]]/client.tsx => remix/app/components/embed/embed-direct-template-client-page.tsx} (93%) rename apps/{web/src/app/embed/completed.tsx => remix/app/components/embed/embed-document-completed.tsx} (92%) rename apps/{web/src/app/embed/document-fields.tsx => remix/app/components/embed/embed-document-fields.tsx} (76%) rename apps/{web/src/app/embed/sign/[[...url]]/client.tsx => remix/app/components/embed/embed-document-signing-page.tsx} (93%) rename apps/{web/src/app/embed/paywall.tsx => remix/app/components/embed/embed-paywall.tsx} (100%) rename apps/{web/src => remix/app}/components/forms/2fa/disable-authenticator-app-dialog.tsx (96%) rename apps/{web/src => remix/app}/components/forms/2fa/enable-authenticator-app-dialog.tsx (97%) rename apps/{web/src => remix/app}/components/forms/2fa/recovery-code-list.tsx (97%) rename apps/{web/src => remix/app}/components/forms/2fa/view-recovery-codes-dialog.tsx (96%) rename apps/{web/src => remix/app}/components/forms/avatar-image.tsx (89%) rename apps/{web/src => remix/app}/components/forms/forgot-password.tsx (86%) rename apps/{web/src => remix/app}/components/forms/password.tsx (93%) rename apps/{web/src => remix/app}/components/forms/profile.tsx (91%) rename apps/{web/src => remix/app}/components/forms/public-profile-claim-dialog.tsx (93%) rename apps/{web/src => remix/app}/components/forms/public-profile-form.tsx (96%) rename apps/{web/src => remix/app}/components/forms/reset-password.tsx (92%) rename apps/{web/src => remix/app}/components/forms/search-param-selector.tsx (78%) rename apps/{web/src => remix/app}/components/forms/send-confirmation-email.tsx (91%) rename apps/{web/src => remix/app}/components/forms/signin.tsx (74%) rename apps/{web/src/components/forms/v2 => remix/app/components/forms}/signup.tsx (90%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/preferences/branding-preferences.tsx => remix/app/components/forms/team-branding-preferences-form.tsx} (98%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/preferences/document-preferences.tsx => remix/app/components/forms/team-document-preferences-form.tsx} (96%) rename apps/{web/src/components/(teams)/forms/update-team-form.tsx => remix/app/components/forms/team-update-form.tsx} (87%) rename apps/{web/src => remix/app}/components/forms/token.tsx (81%) rename apps/{web/src/app/(dashboard)/admin/stats/signer-conversion-chart.tsx => remix/app/components/general/admin-stats-signer-conversion-chart.tsx} (92%) rename apps/{web/src/app/(dashboard)/admin/stats/user-with-document.tsx => remix/app/components/general/admin-stats-users-with-documents.tsx} (93%) create mode 100644 apps/remix/app/components/general/app-banner.tsx rename apps/{web/src/components/(dashboard)/common/command-menu.tsx => remix/app/components/general/app-command-menu.tsx} (88%) rename apps/{web/src/components/(dashboard)/layout/header.tsx => remix/app/components/general/app-header.tsx} (77%) rename apps/{web/src/components/(dashboard)/layout/desktop-nav.tsx => remix/app/components/general/app-nav-desktop.tsx} (83%) rename apps/{web/src/components/(dashboard)/layout/mobile-navigation.tsx => remix/app/components/general/app-nav-mobile.tsx} (79%) rename apps/{web/src/components/(dashboard)/avatar => remix/app/components/general}/avatar-with-recipient.tsx (91%) rename apps/{web/src/components/ui => remix/app/components/general}/background.tsx (100%) rename apps/{web/src/components/branding/logo.tsx => remix/app/components/general/branding-logo.tsx} (99%) rename apps/{web/src/app/(signing)/sign/[token]/complete => remix/app/components/general}/claim-account.tsx (92%) rename apps/{web/src/app/(recipient)/d/[token]/configure-direct-template.tsx => remix/app/components/general/direct-template/direct-template-configure-form.tsx} (79%) rename apps/{web/src/app/(recipient)/d/[token]/direct-template.tsx => remix/app/components/general/direct-template/direct-template-page.tsx} (79%) rename apps/{web/src/app/(recipient)/d/[token]/signing-auth-page.tsx => remix/app/components/general/direct-template/direct-template-signing-auth-page.tsx} (88%) rename apps/{web/src/app/(recipient)/d/[token]/sign-direct-template.tsx => remix/app/components/general/direct-template/direct-template-signing-form.tsx} (84%) rename apps/{web/src/app/(signing)/sign/[token]/document-action-auth-2fa.tsx => remix/app/components/general/document-signing/document-signing-auth-2fa.tsx} (88%) rename apps/{web/src/app/(signing)/sign/[token]/document-action-auth-account.tsx => remix/app/components/general/document-signing/document-signing-auth-account.tsx} (67%) rename apps/{web/src/app/(signing)/sign/[token]/document-action-auth-dialog.tsx => remix/app/components/general/document-signing/document-signing-auth-dialog.tsx} (74%) rename apps/{web/src/app/(signing)/sign/[token]/signing-auth-page.tsx => remix/app/components/general/document-signing/document-signing-auth-page.tsx} (76%) rename apps/{web/src/app/(signing)/sign/[token]/document-action-auth-passkey.tsx => remix/app/components/general/document-signing/document-signing-auth-passkey.tsx} (93%) rename apps/{web/src/app/(signing)/sign/[token]/document-auth-provider.tsx => remix/app/components/general/document-signing/document-signing-auth-provider.tsx} (83%) rename apps/{web/src/app/(signing)/sign/[token]/auto-sign.tsx => remix/app/components/general/document-signing/document-signing-auto-sign.tsx} (86%) rename apps/{web/src/app/(signing)/sign/[token]/checkbox-field.tsx => remix/app/components/general/document-signing/document-signing-checkbox-field.tsx} (90%) rename apps/{web/src/app/(signing)/sign/[token]/sign-dialog.tsx => remix/app/components/general/document-signing/document-signing-complete-dialog.tsx} (90%) rename apps/{web/src/app/(signing)/sign/[token]/date-field.tsx => remix/app/components/general/document-signing/document-signing-date-field.tsx} (86%) rename apps/{web/src/components/general/signing-disclosure.tsx => remix/app/components/general/document-signing/document-signing-disclosure.tsx} (72%) rename apps/{web/src/app/(signing)/sign/[token]/dropdown-field.tsx => remix/app/components/general/document-signing/document-signing-dropdown-field.tsx} (88%) rename apps/{web/src/app/(signing)/sign/[token]/email-field.tsx => remix/app/components/general/document-signing/document-signing-email-field.tsx} (79%) rename apps/{web/src/app/(signing)/sign/[token]/signing-field-container.tsx => remix/app/components/general/document-signing/document-signing-field-container.tsx} (93%) rename apps/{web/src/app/(signing)/sign/[token]/form.tsx => remix/app/components/general/document-signing/document-signing-form.tsx} (89%) rename apps/{web/src/app/(signing)/sign/[token]/initials-field.tsx => remix/app/components/general/document-signing/document-signing-initials-field.tsx} (81%) rename apps/{web/src/app/(signing)/sign/[token]/name-field.tsx => remix/app/components/general/document-signing/document-signing-name-field.tsx} (86%) rename apps/{web/src/app/(signing)/sign/[token]/number-field.tsx => remix/app/components/general/document-signing/document-signing-number-field.tsx} (92%) rename apps/{web/src/app/(signing)/sign/[token]/signing-page-view.tsx => remix/app/components/general/document-signing/document-signing-page-view.tsx} (66%) rename apps/{web/src/app/(signing)/sign/[token]/provider.tsx => remix/app/components/general/document-signing/document-signing-provider.tsx} (67%) rename apps/{web/src/app/(signing)/sign/[token]/radio-field.tsx => remix/app/components/general/document-signing/document-signing-radio-field.tsx} (86%) rename apps/{web/src/app/(signing)/sign/[token]/reject-document-dialog.tsx => remix/app/components/general/document-signing/document-signing-reject-dialog.tsx} (88%) rename apps/{web/src/app/(signing)/sign/[token]/signature-field.tsx => remix/app/components/general/document-signing/document-signing-signature-field.tsx} (88%) rename apps/{web/src/app/(signing)/sign/[token]/text-field.tsx => remix/app/components/general/document-signing/document-signing-text-field.tsx} (92%) rename apps/{web/src/app/(dashboard)/documents/[id]/logs/download-audit-log-button.tsx => remix/app/components/general/document/document-audit-log-download-button.tsx} (88%) rename apps/{web/src/app/(dashboard)/documents/[id]/logs/download-certificate-button.tsx => remix/app/components/general/document/document-certificate-download-button.tsx} (88%) rename apps/{web/src/app/(dashboard)/documents/[id]/edit-document.tsx => remix/app/components/general/document/document-edit-form.tsx} (93%) rename apps/{web/src/components => remix/app/components/general}/document/document-history-sheet-changes.tsx (97%) rename apps/{web/src/components => remix/app/components/general}/document/document-history-sheet.tsx (99%) rename apps/{web/src/app/(dashboard)/documents/[id] => remix/app/components/general/document}/document-page-view-button.tsx (84%) rename apps/{web/src/app/(dashboard)/documents/[id] => remix/app/components/general/document}/document-page-view-dropdown.tsx (79%) rename apps/{web/src/app/(dashboard)/documents/[id] => remix/app/components/general/document}/document-page-view-information.tsx (92%) rename apps/{web/src/app/(dashboard)/documents/[id] => remix/app/components/general/document}/document-page-view-recent-activity.tsx (98%) rename apps/{web/src/app/(dashboard)/documents/[id] => remix/app/components/general/document}/document-page-view-recipients.tsx (94%) rename apps/{web/src/components => remix/app/components/general}/document/document-read-only-fields.tsx (97%) rename apps/{web/src/components => remix/app/components/general}/document/document-recipient-link-copy-dialog.tsx (94%) rename apps/{web/src/components/(dashboard)/document-search => remix/app/components/general/document}/document-search.tsx (74%) rename apps/{web/src/components/formatter => remix/app/components/general/document}/document-status.tsx (97%) rename apps/{web/src/app/(dashboard)/documents/upload-document.tsx => remix/app/components/general/document/document-upload.tsx} (81%) create mode 100644 apps/remix/app/components/general/generic-error-layout.tsx rename apps/{web/src/components/(dashboard)/layout => remix/app/components/general}/menu-switcher.tsx (85%) rename apps/{web/src/components/(dashboard)/metric-card => remix/app/components/general}/metric-card.tsx (100%) rename apps/{web/src/app/(dashboard)/admin/users/[id] => remix/app/components/general}/multiselect-role-combobox.tsx (96%) rename apps/{web/src/components/(dashboard)/period-selector => remix/app/components/general}/period-selector.tsx (67%) rename apps/{web/src/components/(dashboard)/refresh-on-focus => remix/app/components/general}/refresh-on-focus.tsx (69%) rename apps/{web/src/components/(dashboard)/settings/layout/header.tsx => remix/app/components/general/settings-header.tsx} (100%) rename apps/{web/src/components/(dashboard)/settings/layout/desktop-nav.tsx => remix/app/components/general/settings-nav-desktop.tsx} (65%) rename apps/{web/src/components/(dashboard)/settings/layout/mobile-nav.tsx => remix/app/components/general/settings-nav-mobile.tsx} (65%) rename apps/{web/src/components/(dashboard)/avatar => remix/app/components/general}/stack-avatar.tsx (100%) rename apps/{web/src/components/(dashboard)/avatar => remix/app/components/general}/stack-avatars-with-tooltip.tsx (97%) rename apps/{web/src/components/(dashboard)/avatar => remix/app/components/general}/stack-avatars.tsx (95%) rename apps/{web/src/components/(teams) => remix/app/components/general/teams}/team-billing-portal-button.tsx (93%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings => remix/app/components/general/teams}/team-email-dropdown.tsx (85%) rename apps/{web/src/app/(teams)/t/[teamUrl]/layout-billing-banner.tsx => remix/app/components/general/teams/team-layout-billing-banner.tsx} (92%) rename apps/{web/src/components/(teams)/settings/layout/desktop-nav.tsx => remix/app/components/general/teams/team-settings-nav-desktop.tsx} (70%) rename apps/{web/src/components/(teams)/settings/layout/mobile-nav.tsx => remix/app/components/general/teams/team-settings-nav-mobile.tsx} (72%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings => remix/app/components/general/teams}/team-transfer-status.tsx (94%) rename apps/{web/src/app/(dashboard)/templates => remix/app/components/general/template}/template-direct-link-badge.tsx (94%) rename apps/{web/src/app/(dashboard)/templates/[id]/edit/edit-template.tsx => remix/app/components/general/template/template-edit-form.tsx} (94%) rename apps/{web/src/app/(dashboard)/templates/[id] => remix/app/components/general/template}/template-page-view-documents-table.tsx (88%) rename apps/{web/src/app/(dashboard)/templates/[id] => remix/app/components/general/template}/template-page-view-information.tsx (92%) rename apps/{web/src/app/(dashboard)/templates/[id] => remix/app/components/general/template}/template-page-view-recent-activity.tsx (96%) rename apps/{web/src/app/(dashboard)/templates/[id] => remix/app/components/general/template}/template-page-view-recipients.tsx (89%) rename apps/{web/src/components/formatter => remix/app/components/general/template}/template-type.tsx (91%) rename apps/{web/src/components/ui => remix/app/components/general}/user-profile-skeleton.tsx (96%) rename apps/{web/src/components/ui => remix/app/components/general}/user-profile-timur.tsx (96%) rename apps/{web/src/components/(dashboard)/layout => remix/app/components/general}/verify-email-banner.tsx (91%) rename apps/{web/src/components/(dashboard)/settings/webhooks/trigger-multiselect-combobox.tsx => remix/app/components/general/webhook-multiselect-combobox.tsx} (90%) rename apps/{web/src/app/(dashboard)/admin/users/data-table-users.tsx => remix/app/components/tables/admin-dashboard-users-table.tsx} (92%) rename apps/{web/src/app/(dashboard)/admin/documents/[id]/recipient-item.tsx => remix/app/components/tables/admin-document-recipient-item-table.tsx} (92%) rename apps/{web/src/app/(dashboard)/admin/leaderboard/data-table-leaderboard.tsx => remix/app/components/tables/admin-leaderboard-table.tsx} (98%) rename apps/{web/src/app/(dashboard)/documents/[id]/logs/document-logs-data-table.tsx => remix/app/components/tables/document-logs-table.tsx} (94%) rename apps/{web/src/app/(dashboard)/documents/data-table-action-button.tsx => remix/app/components/tables/documents-table-action-button.tsx} (83%) rename apps/{web/src/app/(dashboard)/documents/data-table-action-dropdown.tsx => remix/app/components/tables/documents-table-action-dropdown.tsx} (82%) rename apps/{web/src/app/(dashboard)/documents/empty-state.tsx => remix/app/components/tables/documents-table-empty-state.tsx} (88%) rename apps/{web/src/app/(dashboard)/documents/data-table-sender-filter.tsx => remix/app/components/tables/documents-table-sender-filter.tsx} (73%) rename apps/{web/src/app/(dashboard)/documents/data-table-title.tsx => remix/app/components/tables/documents-table-title.tsx} (76%) create mode 100644 apps/remix/app/components/tables/documents-table.tsx rename apps/{web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/data-table.tsx => remix/app/components/tables/internal-audit-log-table.tsx} (95%) rename apps/{web/src/app/(dashboard)/settings/public-profile/public-templates-data-table.tsx => remix/app/components/tables/settings-public-profile-templates-table.tsx} (95%) rename apps/{web/src/app/(dashboard)/settings/security/activity/user-security-activity-data-table.tsx => remix/app/components/tables/settings-security-activity-table.tsx} (92%) rename apps/{web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table-actions.tsx => remix/app/components/tables/settings-security-passkey-table-actions.tsx} (95%) rename apps/{web/src/app/(dashboard)/settings/security/passkeys/user-passkeys-data-table.tsx => remix/app/components/tables/settings-security-passkey-table.tsx} (87%) rename apps/{web/src/components/(teams)/tables/team-billing-invoices-data-table.tsx => remix/app/components/tables/team-settings-billing-invoices-table.tsx} (91%) rename apps/{web/src/components/(teams)/tables/team-member-invites-data-table.tsx => remix/app/components/tables/team-settings-member-invites-table.tsx} (93%) rename apps/{web/src/components/(teams)/tables/team-members-data-table.tsx => remix/app/components/tables/team-settings-members-table.tsx} (82%) rename apps/{web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx => remix/app/components/tables/templates-table-action-dropdown.tsx} (71%) rename apps/{web/src/app/(dashboard)/templates/data-table-templates.tsx => remix/app/components/tables/templates-table.tsx} (65%) rename apps/{web/src/components/(teams)/tables/current-user-teams-data-table.tsx => remix/app/components/tables/user-settings-current-teams-table.tsx} (86%) rename apps/{web/src/components/(teams)/tables/pending-user-teams-data-table-actions.tsx => remix/app/components/tables/user-settings-pending-teams-table-actions.tsx} (85%) rename apps/{web/src/components/(teams)/tables/pending-user-teams-data-table.tsx => remix/app/components/tables/user-settings-pending-teams-table.tsx} (87%) rename apps/{web/src/components/(teams)/tables/user-settings-teams-page-data-table.tsx => remix/app/components/tables/user-settings-teams-page-table.tsx} (71%) create mode 100644 apps/remix/app/entry.client.tsx create mode 100644 apps/remix/app/entry.server.tsx rename apps/{web/src => remix/app}/providers/posthog.tsx (62%) rename apps/{web/src => remix/app}/providers/team.tsx (74%) create mode 100644 apps/remix/app/root.tsx create mode 100644 apps/remix/app/routes.ts create mode 100644 apps/remix/app/routes/_authenticated+/_layout.tsx create mode 100644 apps/remix/app/routes/_authenticated+/admin+/_index.tsx create mode 100644 apps/remix/app/routes/_authenticated+/admin+/_layout.tsx create mode 100644 apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx rename apps/{web/src/app/(dashboard)/admin/documents/document-results.tsx => remix/app/routes/_authenticated+/admin+/documents._index.tsx} (73%) create mode 100644 apps/remix/app/routes/_authenticated+/admin+/leaderboard.tsx create mode 100644 apps/remix/app/routes/_authenticated+/admin+/site-settings.tsx rename apps/{web/src/app/(dashboard)/admin/stats/page.tsx => remix/app/routes/_authenticated+/admin+/stats.tsx} (76%) rename apps/{web/src/app/(dashboard)/admin/subscriptions/page.tsx => remix/app/routes/_authenticated+/admin+/subscriptions.tsx} (83%) rename apps/{web/src/app/(dashboard)/admin/users/[id]/page.tsx => remix/app/routes/_authenticated+/admin+/users.$id.tsx} (84%) create mode 100644 apps/remix/app/routes/_authenticated+/admin+/users._index.tsx rename apps/{web/src/app/(dashboard)/documents/[id]/document-page-view.tsx => remix/app/routes/_authenticated+/documents+/$id._index.tsx} (69%) rename apps/{web/src/app/(dashboard)/documents/[id]/edit/document-edit-page-view.tsx => remix/app/routes/_authenticated+/documents+/$id.edit.tsx} (63%) rename apps/{web/src/app/(dashboard)/documents/[id]/logs/document-logs-page-view.tsx => remix/app/routes/_authenticated+/documents+/$id.logs.tsx} (77%) create mode 100644 apps/remix/app/routes/_authenticated+/documents+/_index.tsx rename apps/{web/src/app/(dashboard)/documents/[id]/loading.tsx => remix/app/routes/_authenticated+/documents+/todo-loading.tsx} (76%) create mode 100644 apps/remix/app/routes/_authenticated+/settings+/_index.tsx create mode 100644 apps/remix/app/routes/_authenticated+/settings+/_layout.tsx create mode 100644 apps/remix/app/routes/_authenticated+/settings+/profile.tsx rename apps/{web/src/app/(dashboard)/settings/public-profile/public-profile-page-view.tsx => remix/app/routes/_authenticated+/settings+/public-profile+/index.tsx} (83%) create mode 100644 apps/remix/app/routes/_authenticated+/settings+/security+/activity+/index.tsx rename apps/{web/src/app/(dashboard)/settings/security/page.tsx => remix/app/routes/_authenticated+/settings+/security+/index.tsx} (62%) create mode 100644 apps/remix/app/routes/_authenticated+/settings+/security+/passkeys+/index.tsx rename apps/{web/src/app/(dashboard)/settings/teams/page.tsx => remix/app/routes/_authenticated+/settings+/teams+/index.tsx} (74%) rename apps/{web/src/app/(dashboard)/settings/teams => remix/app/routes/_authenticated+/settings+/teams+}/team-email-usage.tsx (96%) rename apps/{web/src/app/(dashboard)/settings/teams => remix/app/routes/_authenticated+/settings+/teams+}/team-invitations.tsx (64%) rename apps/{web/src/app/(dashboard)/settings/tokens/page.tsx => remix/app/routes/_authenticated+/settings+/tokens+/index.tsx} (75%) rename apps/{web/src/app/(dashboard)/settings/webhooks/[id]/page.tsx => remix/app/routes/_authenticated+/settings+/webhooks+/$id.tsx} (90%) rename apps/{web/src/app/(dashboard)/settings/webhooks/page.tsx => remix/app/routes/_authenticated+/settings+/webhooks+/index.tsx} (85%) create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/_index.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/_layout.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.edit.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.logs.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/page.tsx => remix/app/routes/_authenticated+/t.$teamUrl+/settings+/_index.tsx} (78%) create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings+/_layout.tsx rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/billing/page.tsx => remix/app/routes/_authenticated+/t.$teamUrl+/settings+/billing.tsx} (70%) create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings+/members.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings+/preferences.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings+/public-profile.tsx rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/tokens/page.tsx => remix/app/routes/_authenticated+/t.$teamUrl+/settings+/tokens.tsx} (67%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/webhooks/[id]/page.tsx => remix/app/routes/_authenticated+/t.$teamUrl+/settings+/webhooks.$id.tsx} (91%) rename apps/{web/src/app/(teams)/t/[teamUrl]/settings/webhooks/page.tsx => remix/app/routes/_authenticated+/t.$teamUrl+/settings+/webhooks.tsx} (86%) create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id._index.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id.edit.tsx create mode 100644 apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates._index.tsx rename apps/{web/src/app/(dashboard)/templates/[id]/template-page-view.tsx => remix/app/routes/_authenticated+/templates+/$id._index.tsx} (69%) rename apps/{web/src/app/(dashboard)/templates/[id]/edit/template-edit-page-view.tsx => remix/app/routes/_authenticated+/templates+/$id.edit.tsx} (64%) create mode 100644 apps/remix/app/routes/_authenticated+/templates+/_index.tsx create mode 100644 apps/remix/app/routes/_index.tsx rename apps/{web/src/app/(internal)/%5F%5Fhtmltopdf/audit-log/page.tsx => remix/app/routes/_internal+/[__htmltopdf]+/audit-log.tsx} (83%) rename apps/{web/src/app/(internal)/%5F%5Fhtmltopdf/certificate/page.tsx => remix/app/routes/_internal+/[__htmltopdf]+/certificate.tsx} (93%) create mode 100644 apps/remix/app/routes/_profile+/_layout.tsx rename apps/{web/src/app/(profile)/p/[url]/page.tsx => remix/app/routes/_profile+/p.$url.tsx} (86%) create mode 100644 apps/remix/app/routes/_recipient+/_layout.tsx rename apps/{web/src/app/(recipient)/d/[token]/page.tsx => remix/app/routes/_recipient+/d.$token+/_index.tsx} (53%) create mode 100644 apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx rename apps/{web/src/app/(signing)/sign/[token]/complete/page.tsx => remix/app/routes/_recipient+/sign.$token+/complete.tsx} (68%) rename apps/{web/src/app/(signing)/sign/[token]/rejected/page.tsx => remix/app/routes/_recipient+/sign.$token+/rejected.tsx} (64%) rename apps/{web/src/app/(signing)/sign/[token]/waiting/page.tsx => remix/app/routes/_recipient+/sign.$token+/waiting.tsx} (67%) create mode 100644 apps/remix/app/routes/_redirects+/ingest.$.tsx rename apps/{web/src/app/(unauthenticated)/layout.tsx => remix/app/routes/_unauthenticated+/_layout.tsx} (65%) rename apps/{web/src/app/(unauthenticated)/articles/signature-disclosure/page.tsx => remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx} (95%) rename apps/{web/src/app/(unauthenticated)/check-email/page.tsx => remix/app/routes/_unauthenticated+/check-email.tsx} (63%) rename apps/{web/src/app/(unauthenticated)/forgot-password/page.tsx => remix/app/routes/_unauthenticated+/forgot-password.tsx} (65%) rename apps/{web/src/app/(unauthenticated)/reset-password/[token]/page.tsx => remix/app/routes/_unauthenticated+/reset-password.$token.tsx} (58%) rename apps/{web/src/app/(unauthenticated)/reset-password/page.tsx => remix/app/routes/_unauthenticated+/reset-password._index.tsx} (66%) create mode 100644 apps/remix/app/routes/_unauthenticated+/share.$slug.opengraph.tsx create mode 100644 apps/remix/app/routes/_unauthenticated+/share.$slug.tsx create mode 100644 apps/remix/app/routes/_unauthenticated+/signin.tsx create mode 100644 apps/remix/app/routes/_unauthenticated+/signup.tsx rename apps/{web/src/app/(unauthenticated)/team/decline/[token]/page.tsx => remix/app/routes/_unauthenticated+/team.decline.$token.tsx} (66%) rename apps/{web/src/app/(unauthenticated)/team/invite/[token]/page.tsx => remix/app/routes/_unauthenticated+/team.invite.$token.tsx} (68%) rename apps/{web/src/app/(unauthenticated)/team/verify/email/[token]/page.tsx => remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx} (70%) rename apps/{web/src/app/(unauthenticated)/team/verify/transfer/[token]/page.tsx => remix/app/routes/_unauthenticated+/team.verify.transfer.token.tsx} (66%) rename apps/{web/src/app/(unauthenticated)/unverified-account/page.tsx => remix/app/routes/_unauthenticated+/unverified-account.tsx} (84%) create mode 100644 apps/remix/app/routes/_unauthenticated+/verify-email.$token.tsx rename apps/{web/src/app/(unauthenticated)/verify-email/page.tsx => remix/app/routes/_unauthenticated+/verify-email._index.tsx} (71%) create mode 100644 apps/remix/app/routes/api+/avatar.$id.tsx create mode 100644 apps/remix/app/routes/api+/branding.logo.team.$teamId.ts create mode 100644 apps/remix/app/routes/api+/health.ts create mode 100644 apps/remix/app/routes/api+/limits.tsx create mode 100644 apps/remix/app/routes/api+/locale.tsx rename apps/{web/src/pages/api/share/index.ts => remix/app/routes/api+/share.ts} (53%) create mode 100644 apps/remix/app/routes/api+/stripe.webhook.ts create mode 100644 apps/remix/app/routes/api+/theme.tsx create mode 100644 apps/remix/app/routes/api+/webhook.trigger.ts create mode 100644 apps/remix/app/routes/embed+/_layout.tsx rename apps/{web/src/app/embed/direct/[[...url]]/page.tsx => remix/app/routes/embed+/direct.$url.tsx} (60%) rename apps/{web/src/app/embed/sign/[[...url]]/page.tsx => remix/app/routes/embed+/sign.$url.tsx} (64%) create mode 100644 apps/remix/app/storage/lang-cookie.server.ts create mode 100644 apps/remix/app/storage/theme-session.server.ts rename apps/{web/src/app/embed/base-schema.ts => remix/app/types/embed-base-schemas.ts} (84%) rename apps/{web/src/app/embed/direct/[[...url]]/schema.ts => remix/app/types/embed-direct-template-schema.ts} (90%) rename apps/{web/src/app/embed/sign/[[...url]]/schema.ts => remix/app/types/embed-document-sign-schema.ts} (87%) rename apps/{web/src/app/embed => remix/app/utils}/css-vars.ts (86%) rename apps/{web/src/helpers => remix/app/utils}/get-asset-buffer.ts (100%) create mode 100644 apps/remix/app/utils/meta.ts create mode 100644 apps/remix/app/utils/super-json-loader.ts rename apps/{web/src/helpers => remix/app/utils}/truncate-title.ts (100%) rename apps/{web => remix}/example/cert.p12 (100%) create mode 100644 apps/remix/package.json create mode 100644 apps/remix/public/.well-known/security.txt rename apps/{web => remix}/public/android-chrome-192x192.png (100%) rename apps/{web => remix}/public/android-chrome-512x512.png (100%) rename apps/{web => remix}/public/apple-touch-icon.png (100%) rename apps/{web => remix}/public/favicon-16x16.png (100%) rename apps/{web => remix}/public/favicon-32x32.png (100%) rename apps/{web => remix}/public/favicon.ico (100%) create mode 100644 apps/remix/public/fonts/caveat-regular.ttf create mode 100644 apps/remix/public/fonts/caveat.ttf create mode 100644 apps/remix/public/fonts/inter-bold.ttf create mode 100644 apps/remix/public/fonts/inter-regular.ttf create mode 100644 apps/remix/public/fonts/inter-semibold.ttf create mode 100644 apps/remix/public/fonts/noto-sans.ttf rename apps/{web => remix}/public/opengraph-image.jpg (100%) rename apps/{web => remix}/public/pdf.worker.min.js (100%) rename apps/{web => remix}/public/site.webmanifest (100%) rename apps/{web => remix}/public/static/add-user.png (100%) rename apps/{web => remix}/public/static/clock.png (100%) rename apps/{web => remix}/public/static/completed.png (100%) rename apps/{web => remix}/public/static/delete-team.png (100%) rename apps/{web => remix}/public/static/delete-user.png (100%) rename apps/{web => remix}/public/static/document.png (100%) rename apps/{web => remix}/public/static/download.png (100%) rename apps/{web => remix}/public/static/early-supporter-badge.svg (100%) rename apps/{web => remix}/public/static/logo.png (100%) rename apps/{web => remix}/public/static/mail-open-alert.png (100%) rename apps/{web => remix}/public/static/mail-open.png (100%) create mode 100644 apps/remix/public/static/og-share-frame2.png rename apps/{web => remix}/public/static/premium-user-badge.svg (100%) rename apps/{web => remix}/public/static/review.png (100%) rename apps/{web => remix}/public/static/user-plus.png (100%) create mode 100644 apps/remix/react-router.config.ts create mode 100644 apps/remix/rollup.config.mjs create mode 100644 apps/remix/server/api/files.ts create mode 100644 apps/remix/server/api/files.types.ts create mode 100644 apps/remix/server/context.ts create mode 100644 apps/remix/server/main.js create mode 100644 apps/remix/server/middleware.ts create mode 100644 apps/remix/server/router.ts create mode 100644 apps/remix/server/trpc/hono-trpc-open-api.ts create mode 100644 apps/remix/server/trpc/hono-trpc-remix.ts create mode 100644 apps/remix/server/utils/get-loader-session.ts rename apps/{web/tailwind.config.js => remix/tailwind.config.ts} (96%) create mode 100644 apps/remix/tsconfig.json create mode 100644 apps/remix/vite-env.d.ts create mode 100644 apps/remix/vite.config.ts delete mode 100644 apps/web/README.md delete mode 100644 apps/web/ambient.d.ts delete mode 100644 apps/web/next-env.d.ts delete mode 100644 apps/web/next.config.js delete mode 100644 apps/web/package.json delete mode 100644 apps/web/postcss.config.js delete mode 100644 apps/web/process-env.d.ts delete mode 100644 apps/web/src/app/(dashboard)/admin/documents/[id]/admin-actions.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/documents/[id]/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/documents/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/layout.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/leaderboard/fetch-leaderboard.actions.ts delete mode 100644 apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/nav.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/site-settings/banner-form.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/site-settings/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/admin/users/fetch-users.actions.ts delete mode 100644 apps/web/src/app/(dashboard)/admin/users/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/[id]/edit/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/[id]/logs/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/[id]/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/[id]/sent/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/data-table.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/documents-page-view.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/documents/upcoming-profile-claim-teaser.tsx delete mode 100644 apps/web/src/app/(dashboard)/layout.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/billing/billing-plans.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/billing/billing-portal-button.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/billing/create-billing-portal.action.ts delete mode 100644 apps/web/src/app/(dashboard)/settings/billing/create-checkout.action.ts delete mode 100644 apps/web/src/app/(dashboard)/settings/billing/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/layout.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/password/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/profile/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/public-profile/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/security/activity/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/security/passkeys/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/teams/accept-team-invitation-button.tsx delete mode 100644 apps/web/src/app/(dashboard)/settings/teams/decline-team-invitation-button.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/[id]/edit/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/[id]/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/data-table-title.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/empty-state.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/page.tsx delete mode 100644 apps/web/src/app/(dashboard)/templates/templates-page-view.tsx delete mode 100644 apps/web/src/app/(profile)/layout.tsx delete mode 100644 apps/web/src/app/(profile)/p/[url]/not-found.tsx delete mode 100644 apps/web/src/app/(profile)/profile-header.tsx delete mode 100644 apps/web/src/app/(recipient)/d/[token]/not-found.tsx delete mode 100644 apps/web/src/app/(recipient)/layout.tsx delete mode 100644 apps/web/src/app/(share)/share/[slug]/opengraph/route.tsx delete mode 100644 apps/web/src/app/(share)/share/[slug]/page.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/complete/document-preview-button.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/complete/layout.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/complete/poll-until-document-completed.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/layout.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/no-longer-available.tsx delete mode 100644 apps/web/src/app/(signing)/sign/[token]/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/edit/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/logs/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/error.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/layout.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/not-found.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/layout.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/members/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/preferences/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/settings/public-profile/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/edit/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx delete mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx delete mode 100644 apps/web/src/app/(unauthenticated)/signin/page.tsx delete mode 100644 apps/web/src/app/(unauthenticated)/signup/page.tsx delete mode 100644 apps/web/src/app/(unauthenticated)/verify-email/[token]/client.tsx delete mode 100644 apps/web/src/app/(unauthenticated)/verify-email/[token]/page.tsx delete mode 100644 apps/web/src/app/api/v1/openapi/page.tsx delete mode 100644 apps/web/src/app/embed/direct/[[...url]]/not-found.tsx delete mode 100644 apps/web/src/app/embed/sign/[[...url]]/not-found.tsx delete mode 100644 apps/web/src/app/embed/util.ts delete mode 100644 apps/web/src/app/globals.css delete mode 100644 apps/web/src/app/layout.tsx delete mode 100644 apps/web/src/app/not-found.tsx delete mode 100644 apps/web/src/app/page.tsx delete mode 100644 apps/web/src/components/(dashboard)/layout/banner.tsx delete mode 100644 apps/web/src/components/(dashboard)/period-selector/types.ts delete mode 100644 apps/web/src/components/(dashboard)/settings/layout/activity-back.tsx delete mode 100644 apps/web/src/components/(dashboard)/settings/token/contants.ts delete mode 100644 apps/web/src/components/(teams)/tables/teams-member-page-data-table.tsx delete mode 100644 apps/web/src/components/forms/signup.tsx delete mode 100644 apps/web/src/components/partials/not-found.tsx delete mode 100644 apps/web/src/middleware.ts delete mode 100644 apps/web/src/pages/api/auth/[...nextauth].ts delete mode 100644 apps/web/src/pages/api/avatar/[id].tsx delete mode 100644 apps/web/src/pages/api/branding/logo/team/[teamId].ts delete mode 100644 apps/web/src/pages/api/feature-flag/all.ts delete mode 100644 apps/web/src/pages/api/feature-flag/get.ts delete mode 100644 apps/web/src/pages/api/health.ts delete mode 100644 apps/web/src/pages/api/jobs/[[...handler]].ts delete mode 100644 apps/web/src/pages/api/limits/index.ts delete mode 100644 apps/web/src/pages/api/stripe/webhook/index.ts delete mode 100644 apps/web/src/pages/api/trpc/[trpc].ts delete mode 100644 apps/web/src/pages/api/v1/[...ts-rest].tsx delete mode 100644 apps/web/src/pages/api/v1/me/index.ts delete mode 100644 apps/web/src/pages/api/v1/openapi.json.ts delete mode 100644 apps/web/src/pages/api/v1/zapier/list-documents/index.ts delete mode 100644 apps/web/src/pages/api/v1/zapier/subscribe/index.ts delete mode 100644 apps/web/src/pages/api/v1/zapier/unsubscribe/index.ts delete mode 100644 apps/web/src/pages/api/v2-beta/[...trpc].ts delete mode 100644 apps/web/src/pages/api/v2-beta/openapi.json.ts delete mode 100644 apps/web/src/pages/api/webhook/trigger.ts delete mode 100644 apps/web/src/providers/next-auth.tsx delete mode 100644 apps/web/src/providers/next-theme.tsx delete mode 100644 apps/web/src/providers/plausible.tsx delete mode 100644 apps/web/tsconfig.json create mode 100644 packages/api/hono.ts delete mode 100644 packages/api/v1/api-documentation.tsx create mode 100644 packages/app-tests/e2e/fixtures/signature.ts create mode 100644 packages/auth/client/index.ts create mode 100644 packages/auth/index.ts create mode 100644 packages/auth/package.json create mode 100644 packages/auth/server/index.ts create mode 100644 packages/auth/server/lib/errors/error-codes.ts create mode 100644 packages/auth/server/lib/session/session-cookies.ts create mode 100644 packages/auth/server/lib/session/session.ts create mode 100644 packages/auth/server/lib/utils/authorizer.ts create mode 100644 packages/auth/server/lib/utils/get-session.ts create mode 100644 packages/auth/server/lib/utils/redirect.ts create mode 100644 packages/auth/server/routes/email-password.ts create mode 100644 packages/auth/server/routes/google.ts create mode 100644 packages/auth/server/routes/passkey.ts create mode 100644 packages/auth/server/routes/session.ts create mode 100644 packages/auth/server/routes/sign-out.ts create mode 100644 packages/auth/server/types/context.ts create mode 100644 packages/auth/server/types/email-password.ts create mode 100644 packages/auth/server/types/passkey.ts create mode 100644 packages/auth/tsconfig.json delete mode 100644 packages/ee/server-only/limits/provider/server.tsx delete mode 100644 packages/email/ambient.d.ts delete mode 100644 packages/lib/client-only/hooks/use-field-item-styles.ts delete mode 100644 packages/lib/client-only/providers/feature-flag.tsx delete mode 100644 packages/lib/client-only/providers/feature-flag.types.ts rename packages/lib/client-only/providers/{i18n.server.tsx => i18n-server.tsx} (68%) create mode 100644 packages/lib/client-only/providers/session.tsx create mode 100644 packages/lib/jobs/client/index.ts delete mode 100644 packages/lib/jobs/client/trigger.ts create mode 100644 packages/lib/jobs/definitions/emails/send-password-reset-success-email.handler.ts create mode 100644 packages/lib/jobs/definitions/emails/send-password-reset-success-email.ts create mode 100644 packages/lib/jobs/definitions/emails/send-recipient-signed-email.handler.ts delete mode 100644 packages/lib/next-auth/auth-options.ts delete mode 100644 packages/lib/next-auth/error-codes.ts delete mode 100644 packages/lib/next-auth/get-server-component-session.ts delete mode 100644 packages/lib/next-auth/get-server-session.ts delete mode 100644 packages/lib/server-only/feature-flags/all.ts delete mode 100644 packages/lib/server-only/feature-flags/get-server-component-feature-flag.ts delete mode 100644 packages/lib/server-only/feature-flags/get.ts delete mode 100644 packages/lib/server-only/http/to-next-request.ts delete mode 100644 packages/lib/server-only/http/with-swr.ts delete mode 100644 packages/lib/server-only/i18n/switch-i18n-language.ts delete mode 100644 packages/lib/universal/get-feature-flag.ts create mode 100644 packages/lib/universal/upload/get-file.server.ts create mode 100644 packages/lib/universal/upload/put-file.server.ts create mode 100644 packages/lib/utils/avatars.ts create mode 100644 packages/lib/utils/debugger.ts create mode 100644 packages/lib/utils/env.ts create mode 100644 packages/prisma/migrations/20250212125902_rework_sessions/migration.sql create mode 100644 packages/tailwind-config/index.d.ts create mode 100644 packages/trpc/utils/trpc-error-handler.ts create mode 100644 packages/ui/components/client-only.tsx delete mode 100644 packages/ui/primitives/constants.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ed6ecc0ac..455860ea1 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -5,6 +5,7 @@ module.exports = { rules: { '@next/next/no-img-element': 'off', 'no-unreachable': 'error', + 'react-hooks/exhaustive-deps': 'off', }, settings: { next: { diff --git a/apps/remix/.bin/build.sh b/apps/remix/.bin/build.sh new file mode 100755 index 000000000..37c5df64c --- /dev/null +++ b/apps/remix/.bin/build.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# Exit on error. +set -eo pipefail + +cd "$(dirname "$0")/.." + +start_time=$(date +%s) + +echo "[Build]: Extracting and compiling translations" +npm run translate --prefix ../../ + +echo "[Build]: Building app" +npm run build:app + +echo "[Build]: Building server" +npm run build:server + +# Copy over the entry point for the server. +cp server/main.js build/server/main.js + +# Copy over all web.js translations +cp -r ../../packages/lib/translations build/server/hono/packages/lib/translations + +# Time taken +end_time=$(date +%s) + +echo "[Build]: Done in $((end_time - start_time)) seconds" diff --git a/apps/remix/.dockerignore b/apps/remix/.dockerignore new file mode 100644 index 000000000..9b8d51471 --- /dev/null +++ b/apps/remix/.dockerignore @@ -0,0 +1,4 @@ +.react-router +build +node_modules +README.md \ No newline at end of file diff --git a/apps/remix/.gitignore b/apps/remix/.gitignore new file mode 100644 index 000000000..188507428 --- /dev/null +++ b/apps/remix/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/node_modules/ + +# React Router +/.react-router/ +/build/ + +# Vite +vite.config.*.timestamp* \ No newline at end of file diff --git a/apps/remix/Dockerfile b/apps/remix/Dockerfile new file mode 100644 index 000000000..207bf937e --- /dev/null +++ b/apps/remix/Dockerfile @@ -0,0 +1,22 @@ +FROM node:20-alpine AS development-dependencies-env +COPY . /app +WORKDIR /app +RUN npm ci + +FROM node:20-alpine AS production-dependencies-env +COPY ./package.json package-lock.json /app/ +WORKDIR /app +RUN npm ci --omit=dev + +FROM node:20-alpine AS build-env +COPY . /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN npm run build + +FROM node:20-alpine +COPY ./package.json package-lock.json /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/apps/remix/Dockerfile.bun b/apps/remix/Dockerfile.bun new file mode 100644 index 000000000..973038e8a --- /dev/null +++ b/apps/remix/Dockerfile.bun @@ -0,0 +1,25 @@ +FROM oven/bun:1 AS dependencies-env +COPY . /app + +FROM dependencies-env AS development-dependencies-env +COPY ./package.json bun.lockb /app/ +WORKDIR /app +RUN bun i --frozen-lockfile + +FROM dependencies-env AS production-dependencies-env +COPY ./package.json bun.lockb /app/ +WORKDIR /app +RUN bun i --production + +FROM dependencies-env AS build-env +COPY ./package.json bun.lockb /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN bun run build + +FROM dependencies-env +COPY ./package.json bun.lockb /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["bun", "run", "start"] \ No newline at end of file diff --git a/apps/remix/Dockerfile.pnpm b/apps/remix/Dockerfile.pnpm new file mode 100644 index 000000000..57916afc2 --- /dev/null +++ b/apps/remix/Dockerfile.pnpm @@ -0,0 +1,26 @@ +FROM node:20-alpine AS dependencies-env +RUN npm i -g pnpm +COPY . /app + +FROM dependencies-env AS development-dependencies-env +COPY ./package.json pnpm-lock.yaml /app/ +WORKDIR /app +RUN pnpm i --frozen-lockfile + +FROM dependencies-env AS production-dependencies-env +COPY ./package.json pnpm-lock.yaml /app/ +WORKDIR /app +RUN pnpm i --prod --frozen-lockfile + +FROM dependencies-env AS build-env +COPY ./package.json pnpm-lock.yaml /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN pnpm build + +FROM dependencies-env +COPY ./package.json pnpm-lock.yaml /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["pnpm", "start"] \ No newline at end of file diff --git a/apps/remix/README.md b/apps/remix/README.md new file mode 100644 index 000000000..e0d20664e --- /dev/null +++ b/apps/remix/README.md @@ -0,0 +1,100 @@ +# Welcome to React Router! + +A modern, production-ready template for building full-stack React applications using React Router. + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/remix-run/react-router-templates/tree/main/default) + +## Features + +- 🚀 Server-side rendering +- ⚡️ Hot Module Replacement (HMR) +- 📦 Asset bundling and optimization +- 🔄 Data loading and mutations +- 🔒 TypeScript by default +- 🎉 TailwindCSS for styling +- 📖 [React Router docs](https://reactrouter.com/) + +## Getting Started + +### Installation + +Install the dependencies: + +```bash +npm install +``` + +### Development + +Start the development server with HMR: + +```bash +npm run dev +``` + +Your application will be available at `http://localhost:5173`. + +## Building for Production + +Create a production build: + +```bash +npm run build +``` + +## Deployment + +### Docker Deployment + +This template includes three Dockerfiles optimized for different package managers: + +- `Dockerfile` - for npm +- `Dockerfile.pnpm` - for pnpm +- `Dockerfile.bun` - for bun + +To build and run using Docker: + +```bash +# For npm +docker build -t my-app . + +# For pnpm +docker build -f Dockerfile.pnpm -t my-app . + +# For bun +docker build -f Dockerfile.bun -t my-app . + +# Run the container +docker run -p 3000:3000 my-app +``` + +The containerized application can be deployed to any platform that supports Docker, including: + +- AWS ECS +- Google Cloud Run +- Azure Container Apps +- Digital Ocean App Platform +- Fly.io +- Railway + +### DIY Deployment + +If you're familiar with deploying Node applications, the built-in app server is production-ready. + +Make sure to deploy the output of `npm run build` + +``` +├── package.json +├── package-lock.json (or pnpm-lock.yaml, or bun.lockb) +├── build/ +│ ├── client/ # Static assets +│ └── server/ # Server-side code +``` + +## Styling + +This template comes with [Tailwind CSS](https://tailwindcss.com/) already configured for a simple default starting experience. You can use whatever CSS framework you prefer. + +--- + +Built with ❤️ using React Router. diff --git a/apps/remix/app/app.css b/apps/remix/app/app.css new file mode 100644 index 000000000..529edec77 --- /dev/null +++ b/apps/remix/app/app.css @@ -0,0 +1,24 @@ +@import '@documenso/ui/styles/theme.css'; + +@font-face { + font-family: 'Inter'; + src: url('/public/fonts/inter-regular.ttf') format('ttf'); + /* font-weight: 400; + font-style: normal; + font-display: swap; */ +} + +@font-face { + font-family: 'Caveat'; + src: url('/public/fonts/caveat.ttf') format('ttf'); + /* font-weight: 400; + font-style: normal; + font-display: swap; */ +} + +@layer base { + :root { + --font-sans: 'Inter'; + --font-signature: 'Caveat'; + } +} diff --git a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx b/apps/remix/app/components/dialogs/account-delete-dialog.tsx similarity index 91% rename from apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx rename to apps/remix/app/components/dialogs/account-delete-dialog.tsx index 2bb37e57b..5c528dfc4 100644 --- a/apps/web/src/app/(dashboard)/settings/profile/delete-account-dialog.tsx +++ b/apps/remix/app/components/dialogs/account-delete-dialog.tsx @@ -1,12 +1,11 @@ -'use client'; - import { useState } from 'react'; -import { Trans, msg } from '@lingui/macro'; +import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; -import { signOut } from 'next-auth/react'; +import { Trans } from '@lingui/react/macro'; -import type { User } from '@documenso/prisma/client'; +import { authClient } from '@documenso/auth/client'; +import { useSession } from '@documenso/lib/client-only/providers/session'; import { trpc } from '@documenso/trpc/react'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; import { Button } from '@documenso/ui/primitives/button'; @@ -23,12 +22,13 @@ import { Input } from '@documenso/ui/primitives/input'; import { Label } from '@documenso/ui/primitives/label'; import { useToast } from '@documenso/ui/primitives/use-toast'; -export type DeleteAccountDialogProps = { +export type AccountDeleteDialogProps = { className?: string; - user: User; }; -export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProps) => { +export const AccountDeleteDialog = ({ className }: AccountDeleteDialogProps) => { + const { user } = useSession(); + const { _ } = useLingui(); const { toast } = useToast(); @@ -49,7 +49,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp duration: 5000, }); - return await signOut({ callbackUrl: '/' }); + return await authClient.signOut(); } catch (err) { toast({ title: _(msg`An unknown error occurred`), @@ -118,7 +118,7 @@ export const DeleteAccountDialog = ({ className, user }: DeleteAccountDialogProp {!hasTwoFactorAuthentication && ( -
+