From a5e37af3e8ec3eee5e3629ff70b157523c519a7c Mon Sep 17 00:00:00 2001 From: Konrad <11725227+mKoonrad@users.noreply.github.com> Date: Fri, 14 Aug 2026 02:40:42 +0200 Subject: [PATCH 01/20] chore: update Polish translations (#3210) --- packages/lib/translations/pl/web.po | 294 ++++++++++++++-------------- 1 file changed, 147 insertions(+), 147 deletions(-) diff --git a/packages/lib/translations/pl/web.po b/packages/lib/translations/pl/web.po index 3132d7323..4aa5c117d 100644 --- a/packages/lib/translations/pl/web.po +++ b/packages/lib/translations/pl/web.po @@ -8,7 +8,7 @@ msgstr "" "Language: pl\n" "Project-Id-Version: documenso-app\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-06-23 13:05\n" +"PO-Revision-Date: 2026-08-13 14:22\n" "Last-Translator: \n" "Language-Team: Polish\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" @@ -115,7 +115,7 @@ msgstr "{0, plural, one {Anulowano # dokument.} few {Anulowano # dokumenty.} man #. placeholder {0}: successfulEnvelopeIds.length #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "{0, plural, one {# document downloaded.} other {# documents downloaded.}} {failedDownloads, plural, one {# document could not be downloaded.} other {# documents could not be downloaded.}}" -msgstr "" +msgstr "{0, plural, one {Pobrano # dokument.} few {Pobrano # dokumenty.} many {Pobrano # dokumentów.} other {Pobrano # dokumentów.}} {failedDownloads, plural, one {Nie można było pobrać # dokumentu.} few {Nie można było pobrać # dokumentów.} many {Nie można było pobrać # dokumentów.} other {Nie można było pobrać # dokumentów.}}" #. placeholder {0}: result.cancelledCount #: apps/remix/app/components/dialogs/envelopes-bulk-cancel-dialog.tsx @@ -125,7 +125,7 @@ msgstr "{0, plural, one {Anulowano # dokument.} few {Anulowano # dokumenty.} man #. placeholder {0}: successfulEnvelopeIds.length #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "{0, plural, one {# document has been downloaded.} other {# documents have been downloaded.}}" -msgstr "" +msgstr "{0, plural, one {Pobrano # dokument.} few {Pobrano # dokumenty.} many {Pobrano # dokumentów.} other {Pobrano # dokumentów.}}" #. placeholder {0}: folder._count.documents #: apps/remix/app/components/general/folder/folder-card.tsx @@ -259,7 +259,7 @@ msgstr "{0, plural, one {Wybierz folder, do którego chcesz przenieść zaznaczo #. placeholder {0}: envelopes.length #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "{0, plural, one {Select the version to download for the selected document.} other {Select the version to download for each of the # selected documents.}}" -msgstr "" +msgstr "{0, plural, one {Wybierz wersję do pobrania.} few {Wybierz wersję do pobrania dla każdego dokumentu.} many {Wybierz wersję do pobrania dla każdego dokumentu.} other {Wybierz wersję do pobrania dla każdego dokumentu.}}" #. placeholder {0}: pendingRecipients.length #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id._index.tsx @@ -335,7 +335,7 @@ msgstr "Sprawdź i {recipientActionVerb} dokument „{2}” utworzony przez uży #. placeholder {0}: planClaim.name #: apps/remix/app/components/general/settings-org-switcher.tsx msgid "{0} Plan" -msgstr "" +msgstr "Plan {0}" #. placeholder {0}: formatChipCount(totalVisibleCount, isVisibleCountCapped) #: apps/remix/app/components/general/app-command-menu.tsx @@ -710,7 +710,7 @@ msgstr "{visibleRows, plural, one {# wynik} few {# wyniki} many {# wyników} oth #: apps/remix/app/components/general/filter-pill.tsx msgid "+{extraCount} more" -msgstr "" +msgstr "+{extraCount} więcej" #. placeholder {0}: document.title #. placeholder {0}: envelope.title @@ -721,11 +721,11 @@ msgstr "Dokument <0>„{0}” nie jest już dostępny do podpisu" #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "<0>{organisationName} does not have an active subscription. Please contact the organisation administrator to renew their plan before accepting this invitation." -msgstr "" +msgstr "Organizacja <0>{organisationName} nie ma aktywnej subskrypcji. Skontaktuj się z administratorem organizacji, aby odnowić plan przed zaakceptowaniem tego zaproszenia." #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "<0>{organisationName} has reached its member limit. Please contact the organisation administrator to upgrade their plan before accepting this invitation." -msgstr "" +msgstr "Osiągnięto maksymalną liczbę użytkowników w organizacji <0>{organisationName}. Skontaktuj się z administratorem organizacji, aby zaktualizować plan przed zaakceptowaniem tego zaproszenia." #: packages/email/templates/organisation-account-link-confirmation.tsx msgid "<0>{organisationName} has requested to create an account on your behalf." @@ -777,7 +777,7 @@ msgstr "Zespół <0>{teamName} poprosił o możliwość używania Twojego ad #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "<0>{teamName} would like to use <1>{email} as their team email." -msgstr "" +msgstr "Zespół <0>{teamName} chce użyć adresu <1>{email} jako adresu e-mail zespołu." #: apps/remix/app/routes/_unauthenticated+/organisation.sso.confirmation.$token.tsx msgid "<0>Account management: Modify your account settings, permissions, and preferences" @@ -1047,7 +1047,7 @@ msgstr "Użytkownik opuścił organizację w Documenso" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "A name to help you identify this token later." -msgstr "" +msgstr "Nazwa, która pomoże Ci zidentyfikować token." #: packages/lib/jobs/definitions/emails/send-organisation-member-joined-email.handler.ts msgid "A new member has joined your organisation" @@ -1215,7 +1215,7 @@ msgstr "Konto" #: apps/remix/app/components/general/settings-scope-breadcrumb.tsx #: apps/remix/app/components/general/unified-settings-sidebar.tsx msgid "Account Settings" -msgstr "" +msgstr "Ustawienia konta" #: apps/remix/app/routes/_authenticated+/settings+/security.linked-accounts.tsx msgid "Account unlinked" @@ -1464,7 +1464,7 @@ msgstr "Dodaj domyślny tekst" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Add rate limit window" -msgstr "" +msgstr "Dodaj limit przepustowości" #: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx msgid "Add recipients" @@ -1853,7 +1853,7 @@ msgstr "Wystąpił błąd podczas wysyłania dokumentu." #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "An error occurred while downloading the documents." -msgstr "" +msgstr "Wystąpił błąd podczas ładowania dokumentów." #: apps/remix/app/components/dialogs/template-direct-link-dialog.tsx msgid "An error occurred while enabling direct link signing." @@ -2441,7 +2441,7 @@ msgstr "Obramowanie" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Border radius" -msgstr "" +msgstr "Zaokrąglenia obramowania" #: apps/remix/app/components/forms/branding-preferences-form.tsx msgid "Border Radius" @@ -2461,7 +2461,7 @@ msgstr "Kolory marki" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Brand colours, including background, foreground, primary, and border colours" -msgstr "" +msgstr "Kolorów marki, w tym kolorów tła, przycisków i obramowań" #: apps/remix/app/components/forms/branding-preferences-form.tsx msgid "Brand Details" @@ -2473,7 +2473,7 @@ msgstr "Strona internetowa marki" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Brand website and brand details" -msgstr "" +msgstr "Strony internetowej i szczegółów marki" #: apps/remix/app/components/general/admin-global-settings-section.tsx #: packages/lib/utils/settings-nav.ts @@ -2745,7 +2745,7 @@ msgstr "Nie możesz przesłać elementów po wysłaniu dokumentu" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx msgid "Capabilities enabled for this organisation." -msgstr "" +msgstr "Funkcje włączone dla organizacji." #: packages/lib/constants/recipient-roles.ts msgctxt "Recipient role name" @@ -2779,14 +2779,14 @@ msgstr "Wyśrodkuj" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.certificates.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.certificates.tsx msgid "Certificate preferences updated" -msgstr "" +msgstr "Ustawienia certyfikatu zostały zaktualizowane" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.certificates.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.certificates.tsx #: packages/lib/utils/settings-nav.ts #: packages/lib/utils/settings-nav.ts msgid "Certificates" -msgstr "" +msgstr "Certyfikaty" #: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page-renderer.tsx msgid "Change Field Type" @@ -2887,7 +2887,7 @@ msgstr "Subskrypcje" #: apps/remix/app/components/general/filter-pill.tsx msgid "Clear" -msgstr "" +msgstr "Wyczyść" #: packages/ui/primitives/data-table.tsx msgid "Clear filters" @@ -3322,7 +3322,7 @@ msgstr "Kopiuj" #: apps/remix/app/components/general/admin-license-card.tsx msgid "Copy license key" -msgstr "" +msgstr "Kopiuj klucz licencyjny" #: packages/ui/components/document/document-share-button.tsx msgid "Copy Link" @@ -3355,7 +3355,7 @@ msgstr "Kopiuj wartość" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Copy your token now. For security reasons you will not be able to see it again." -msgstr "" +msgstr "Skopiuj token. Ze względów bezpieczeństwa nie będzie można go ponownie wyświetlić." #: apps/remix/app/components/general/organisation-usage-reset-button.tsx msgid "Counter reset." @@ -3425,7 +3425,7 @@ msgstr "Utwórz organizację, aby rozpocząć." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx msgid "Create and manage API tokens. See our <0>documentation for more information." -msgstr "" +msgstr "Tworzenie i zarządzanie tokenami API. Sprawdź <0>dokumentację, aby uzyskać więcej informacji." #: apps/remix/app/components/dialogs/template-use-dialog.tsx msgid "Create and send" @@ -3433,7 +3433,7 @@ msgstr "Utwórz i wyślij" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Create API token" -msgstr "" +msgstr "Utwórz token API" #: apps/remix/app/components/dialogs/template-use-dialog.tsx msgid "Create as draft" @@ -3679,11 +3679,11 @@ msgstr "Niestandardowy plik {0} MB" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Custom branding enabled setting" -msgstr "" +msgstr "Niestandardowych ustawień marki" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Custom CSS" -msgstr "" +msgstr "Niestandardowego CSS" #: apps/remix/app/components/forms/branding-preferences-form.tsx msgid "Custom CSS is sanitised on save. Layout-breaking properties, remote URLs, and pseudo-elements are stripped automatically. Any rules dropped during sanitisation will be shown after you save." @@ -3703,7 +3703,7 @@ msgstr "Niestandardowe grupy w organizacji" #: apps/remix/app/components/general/settings-org-switcher.tsx msgid "Custom Plan" -msgstr "" +msgstr "Niestandardowy plan" #: apps/remix/app/components/forms/branding-preferences-form.tsx msgid "Customise the colours used on your signing pages." @@ -3776,7 +3776,7 @@ msgstr "Kolor obramowania." #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default date format" -msgstr "" +msgstr "Domyślny format daty" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Date Format" @@ -3784,7 +3784,7 @@ msgstr "Domyślny format daty" #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default document language" -msgstr "" +msgstr "Domyślny język dokumentu" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Document Language" @@ -3792,7 +3792,7 @@ msgstr "Domyślny język dokumentu" #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default document visibility" -msgstr "" +msgstr "Domyślna widoczność dokumentu" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Document Visibility" @@ -3820,7 +3820,7 @@ msgstr "Domyślna rola w organizacji dla nowych użytkowników" #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default recipients" -msgstr "" +msgstr "Domyślni odbiorcy" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Recipients" @@ -3836,7 +3836,7 @@ msgstr "Domyślne ustawienia zespołu. Zespoły dziedziczą domyślne ustawienia #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default signature settings" -msgstr "" +msgstr "Domyślne ustawienia podpisu" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Signature Settings" @@ -3848,7 +3848,7 @@ msgstr "Domyślne przypomnienia o podpisaniu" #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Default time zone" -msgstr "" +msgstr "Domyślna strefa czasowa" #: apps/remix/app/components/forms/document-preferences-form.tsx msgid "Default Time Zone" @@ -4040,7 +4040,7 @@ msgstr "Usuń konto użytkownika i wszystkie jego dane. Ta akcja jest nieodwraca #: apps/remix/app/components/dialogs/token-delete-dialog.tsx msgid "Delete token" -msgstr "" +msgstr "Usuń token" #: apps/remix/app/components/dialogs/webhook-delete-dialog.tsx msgid "Delete Webhook" @@ -4280,7 +4280,7 @@ msgstr "Rekordy DNS" #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "Do not proceed if you are unsure about this request." -msgstr "" +msgstr "Nie kontynuuj, jeśli nie masz pewności co do tej prośby." #: apps/remix/app/components/general/admin-license-card.tsx msgid "Documenso License" @@ -4337,7 +4337,7 @@ msgstr "Wszystkie dokumenty" #: apps/remix/app/components/general/envelope-signing/envelope-signing-complete-dialog.tsx msgid "Document already signed" -msgstr "" +msgstr "Dokument został już podpisany" #: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx msgid "Document Approved" @@ -4466,7 +4466,7 @@ msgstr "Edytor dokumentu" #: apps/remix/app/components/general/document/document-status.tsx msgid "Document expired" -msgstr "" +msgstr "Dokument wygasł" #: packages/lib/utils/document-audit-logs.ts msgctxt "Audit log format" @@ -4731,7 +4731,7 @@ msgstr "Dokumenty zostały usunięte" #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Documents downloaded" -msgstr "" +msgstr "Dokumenty zostały pobrane" #: apps/remix/app/components/dialogs/envelopes-bulk-cancel-dialog.tsx msgid "Documents partially cancelled" @@ -4743,7 +4743,7 @@ msgstr "Dokumenty zostały częściowo usunięte" #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Documents partially downloaded" -msgstr "" +msgstr "Dokumenty zostały częściowo pobrane" #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx msgid "Documents Received" @@ -4802,7 +4802,7 @@ msgstr "Nie przenoś (usuń wszystkie dokumenty)" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Done" -msgstr "" +msgstr "Gotowe" #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx #: apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -4833,7 +4833,7 @@ msgstr "Pobierz certyfikat" #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Download Documents" -msgstr "" +msgstr "Pobierz dokumenty" #: apps/remix/app/components/dialogs/envelope-download-dialog.tsx msgid "Download Files" @@ -4853,12 +4853,12 @@ msgstr "Pobierz szablon CSV" #. placeholder {0}: envelope.title #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Download version for {0}" -msgstr "" +msgstr "Pobierz wersję dla {0}" #. placeholder {0}: envelopes.length #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Downloading {progress} / {0}..." -msgstr "" +msgstr "Pobieranie {progress} / {0}..." #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx #: apps/remix/app/components/general/document/document-status.tsx @@ -5095,7 +5095,7 @@ msgstr "Adres e-mail już istnieje" #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "Email already in use" -msgstr "" +msgstr "Adres e-mail jest już zajęty" #: apps/remix/app/components/general/admin-email-blocklist-section.tsx msgid "Email Blocklist" @@ -5280,7 +5280,7 @@ msgstr "Puste pole" #: apps/remix/app/components/general/claim-limit-fields.tsx msgid "Empty quota means unlimited, 0 blocks the resource. Rate limit windows accept values like 5m, 1h or 24h." -msgstr "" +msgstr "Pusty limit oznacza brak ograniczeń, a wartość 0 blokuje dostęp do zasobu. W polach limitu przepustowości możesz wpisać wartości, takie jak np. 5 min, 1 godz." #: apps/remix/app/components/dialogs/team-inherit-member-enable-dialog.tsx msgid "Enable" @@ -5403,7 +5403,7 @@ msgstr "Wpisz" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Enter a max request count greater than 0" -msgstr "" +msgstr "Wpisz wartość większą niż 0" #: apps/remix/app/components/dialogs/folder-create-dialog.tsx msgid "Enter a name for your new folder. Folders help you organise your items." @@ -5415,7 +5415,7 @@ msgstr "Wpisz nowy tytuł" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Enter a window, e.g. 5m" -msgstr "" +msgstr "Wpisz przedział czasowy, np. 5 min" #: apps/remix/app/components/forms/subscription-claim-form.tsx msgid "Enter claim name" @@ -5652,7 +5652,7 @@ msgstr "Wystąpił błąd podczas przesyłania pliku" #: apps/remix/app/components/general/app-command-menu.tsx msgid "esc" -msgstr "" +msgstr "escape" #: apps/remix/app/components/general/webhook-logs-sheet.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks.$id._index.tsx @@ -5683,7 +5683,7 @@ msgstr "Wszyscy podpisali! Otrzymasz wiadomość z podpisanym dokumentem." #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Exceeded" -msgstr "" +msgstr "Przekroczono" #: apps/remix/app/components/dialogs/passkey-create-dialog.tsx msgid "Exceeded timeout" @@ -5721,7 +5721,7 @@ msgstr "Wygasa {0}" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Expires in" -msgstr "" +msgstr "Wygaśnie za" #. placeholder {0}: DateTime.fromMillis(Math.max(millisecondsRemaining, 0)).toFormat('mm:ss') #: apps/remix/app/components/general/document-signing/access-auth-2fa-form.tsx @@ -6132,7 +6132,7 @@ msgstr "Ogólne" #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.general.tsx msgid "General settings" -msgstr "" +msgstr "Ogólne ustawienia" #: apps/remix/app/components/dialogs/organisation-email-domain-create-dialog.tsx msgid "Generate DKIM Records" @@ -6150,7 +6150,7 @@ msgstr "Niemiecki" #: apps/remix/app/components/general/app-command-menu.tsx #: apps/remix/app/components/general/app-command-menu.tsx msgid "Global" -msgstr "" +msgstr "Domyślne" #: packages/ui/components/document/document-global-auth-action-select.tsx msgid "Global recipient action authentication" @@ -6235,7 +6235,7 @@ msgstr "Przejdź do <0>ustawień profilu publicznego, aby dodać dokumenty." #: apps/remix/app/components/general/unified-settings-layout.tsx msgid "Go to your settings" -msgstr "" +msgstr "Przejdź do ustawień" #: packages/ui/primitives/signature-pad/signature-pad-color-picker.tsx msgid "Green" @@ -6307,7 +6307,7 @@ msgstr "Tutaj możesz edytować szczegóły konta." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.general.tsx msgid "Here you can edit your team's details." -msgstr "" +msgstr "Tutaj możesz edytować szczegóły zespołu." #: apps/remix/app/routes/_authenticated+/settings+/security._index.tsx msgid "Here you can manage your password and security settings." @@ -6323,11 +6323,11 @@ msgstr "Tutaj możesz ustawić branding dla swojego zespołu." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.certificates.tsx msgid "Here you can set certificate and audit log preferences for your organisation. Teams will inherit these settings by default." -msgstr "" +msgstr "Tutaj możesz ustawić certyfikat i ustawienia dziennika logów dla swojej organizacji. Zespoły odziedziczą domyślne ustawienia." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.certificates.tsx msgid "Here you can set certificate and audit log preferences for your team." -msgstr "" +msgstr "Tutaj możesz ustawić certyfikat i ustawienia dziennika logów dla swojego zespołu." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx msgid "Here you can set document preferences for your organisation. Teams will inherit these settings by default." @@ -6335,11 +6335,11 @@ msgstr "Tutaj możesz ustawić ustawienia dokumentów dla swojej organizacji. Ze #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.reminders.tsx msgid "Here you can set expiration and signing reminder preferences for your organisation. Teams will inherit these settings by default." -msgstr "" +msgstr "Tutaj możesz skonfigurować ustawienia przypomnień o podpisaniu i wygasaniu dla swojej organizacji. Zespoły odziedziczą domyślne ustawienia." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.reminders.tsx msgid "Here you can set expiration and signing reminder preferences for your team." -msgstr "" +msgstr "Tutaj możesz skonfigurować ustawienia przypomnień o podpisaniu i wygasaniu dla swojego zespołu." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.branding.tsx msgid "Here you can set preferences and defaults for branding." @@ -6635,7 +6635,7 @@ msgstr "Kod jest nieprawidłowy. Spróbuj ponownie." #: apps/remix/app/components/general/direct-template/direct-template-invalid-page.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-invalid-direct-template-alert.tsx msgid "Invalid direct link template" -msgstr "" +msgstr "Szablon bezpośredniego linku jest nieprawidłowy" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.sso.tsx msgid "Invalid domains" @@ -6689,7 +6689,7 @@ msgstr "Zaproszenie zostało zaakceptowane!" #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "Invitation already accepted" -msgstr "" +msgstr "Zaproszenie zostało już zaakceptowane" #: apps/remix/app/components/general/organisations/organisation-invitations.tsx #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx @@ -6818,7 +6818,7 @@ msgstr "Dołączył {0}" #: apps/remix/app/components/general/unified-settings-sidebar-mobile.tsx msgid "Jump to" -msgstr "" +msgstr "Przejdź do" #: apps/remix/app/routes/_authenticated+/admin+/teams.$id.tsx msgid "Key identifiers and relationships for this team." @@ -6990,7 +6990,7 @@ msgstr "Czy chcesz mieć własny profil publiczny z umowami?" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Limit reached" -msgstr "" +msgstr "Limit został osiągnięty" #: apps/remix/app/components/general/claim-limit-fields.tsx msgid "Limits" @@ -7299,7 +7299,7 @@ msgstr "Maks." #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Max requests" -msgstr "" +msgstr "Maksymalna liczba żądań" #: apps/remix/app/components/dialogs/template-bulk-send-dialog.tsx msgid "Maximum file size: 4MB. Maximum 100 rows per upload. Blank values will use template defaults." @@ -7397,7 +7397,7 @@ msgstr "Brak odbiorców" #: apps/remix/app/utils/toast-error-messages.ts #: apps/remix/app/utils/toast-error-messages.ts msgid "Missing signature fields" -msgstr "" +msgstr "Brak pól podpisu" #: apps/remix/app/components/general/document/document-page-view-recipients.tsx #: apps/remix/app/components/general/template/template-page-view-recipients.tsx @@ -7427,11 +7427,11 @@ msgstr "Miesięczna liczba aktywnych użytkowników: Użytkownicy, którzy zako #: apps/remix/app/components/general/claim-limit-fields.tsx msgid "Monthly quota" -msgstr "" +msgstr "Miesięczny limit" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Monthly usage" -msgstr "" +msgstr "Miesięczne wykorzystanie" #: apps/remix/app/components/dialogs/envelopes-bulk-move-dialog.tsx #: apps/remix/app/components/dialogs/folder-move-dialog.tsx @@ -7533,11 +7533,11 @@ msgstr "Ustawienia nazwy" #: apps/remix/app/components/general/app-command-menu.tsx msgid "Navigate" -msgstr "" +msgstr "Nawiguj" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Near limit" -msgstr "" +msgstr "Blisko limitu" #: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx msgid "Need to sign documents?" @@ -7643,7 +7643,7 @@ msgstr "Brak skonfigurowanych adresów dla tej domeny." #: apps/remix/app/components/tables/documents-table-empty-state.tsx msgid "No expired documents" -msgstr "" +msgstr "Brak wygasłych dokumentów" #: apps/remix/app/components/general/admin-license-card.tsx msgid "No features enabled" @@ -7682,7 +7682,7 @@ msgstr "Nie znaleziono grup" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx msgid "No inherited claim" -msgstr "" +msgstr "Brak odziedziczonych subskrypcji" #: apps/remix/app/components/general/admin-license-card.tsx msgid "No License Configured" @@ -7745,7 +7745,7 @@ msgstr "Brak odbiorców z tą rolą" #: apps/remix/app/components/tables/documents-table-empty-state.tsx msgid "No rejected documents" -msgstr "" +msgstr "Brak odrzuconych dokumentów" #: packages/ui/components/document/reminder-settings-picker.tsx msgid "No reminders" @@ -7758,7 +7758,7 @@ msgstr "Brak ograniczeń" #: apps/remix/app/components/general/app-command-menu.tsx msgid "No results for “{trimmedSearch}”" -msgstr "" +msgstr "Brak wyników dla „{trimmedSearch}”" #: packages/ui/primitives/data-table.tsx msgid "No results found" @@ -7915,7 +7915,7 @@ msgstr "Na tej stronie możesz utworzyć nowe webhooki i zarządzać obecnymi." #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Once confirmed, the following will be reset:" -msgstr "" +msgstr "Potwierdzenie akcji spowoduje zresetowanie:" #: apps/remix/app/components/dialogs/envelope-cancel-dialog.tsx #: apps/remix/app/components/dialogs/envelope-delete-dialog.tsx @@ -7974,7 +7974,7 @@ msgstr "Ups! Coś poszło nie tak." #: apps/remix/app/components/general/app-command-menu.tsx msgid "Open" -msgstr "" +msgstr "Otwórz" #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx msgid "Open menu" @@ -8209,11 +8209,11 @@ msgstr "W przeciwnym razie dokument zostanie utworzony jako wersja robocza." #: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx msgid "Overlapping fields detected" -msgstr "" +msgstr "Wykryto nakładające się pola" #: apps/remix/app/components/forms/inheritable-field.tsx msgid "Override" -msgstr "" +msgstr "Nadpisz" #: apps/remix/app/components/forms/document-preferences-form.tsx #: apps/remix/app/components/forms/email-preferences-form.tsx @@ -8423,7 +8423,7 @@ msgstr "Oczekuje od" #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx msgid "People with access to this organisation." -msgstr "" +msgstr "Użytkownicy z dostępem do organizacji." #: apps/remix/app/components/dialogs/organisation-create-dialog.tsx #: apps/remix/app/components/general/billing-plans.tsx @@ -9039,7 +9039,7 @@ msgstr "Odbiorca odrzucił dokument" #: packages/lib/utils/document-audit-logs.ts msgid "Recipient rejected the document externally" -msgstr "Odbiorca odrzucił dokument zewnętrznie" +msgstr "Odbiorca odrzucił dokument w zewnętrznej usłudze" #: apps/remix/app/components/general/admin-global-settings-section.tsx msgid "Recipient removed" @@ -9071,7 +9071,7 @@ msgstr "Odbiorca podpisał dokument" #: apps/remix/app/components/general/admin-global-settings-section.tsx msgid "Recipient signing request" -msgstr "Prośba o podpisanie wysłana do odbiorcy" +msgstr "Wysłano prośbę do odbiorcy o podpisanie" #: packages/ui/components/document/document-email-checkboxes.tsx msgid "Recipient signing request email" @@ -9116,7 +9116,7 @@ msgstr "Odbiorcy" #: apps/remix/app/components/general/envelope-editor/envelope-editor-invalid-direct-template-alert.tsx msgid "Recipients cannot use this direct link template because the following signers are missing a signature field" -msgstr "" +msgstr "Odbiorcy nie mogą używać tego szablonu bezpośredniego linku, ponieważ brakuje w nim pola podpisu dla następujących podpisujących" #: apps/remix/app/routes/_authenticated+/admin+/stats.tsx msgid "Recipients metrics" @@ -9185,7 +9185,7 @@ msgstr "Przekierowywanie" #. placeholder {0}: oidcProviderLabel || 'OIDC' #: apps/remix/app/routes/_unauthenticated+/signin.tsx msgid "Redirecting to {0}..." -msgstr "" +msgstr "Przekierowywanie do {0}..." #: apps/remix/app/components/forms/signup.tsx #: apps/remix/app/components/general/claim-account.tsx @@ -9235,7 +9235,7 @@ msgstr "Pamiętasz hasło? <0>Zaloguj się" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.reminders.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.reminders.tsx msgid "Reminder preferences updated" -msgstr "" +msgstr "Ustawienia przypomnień zostały zaktualizowane" #: packages/email/templates/document-reminder.tsx msgid "Reminder to {action} {documentName}" @@ -9327,7 +9327,7 @@ msgstr "Usuń użytkownika organizacji" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Remove rate limit" -msgstr "" +msgstr "Usuń limit przepustowości" #: apps/remix/app/components/dialogs/ai-recipient-detection-dialog.tsx msgid "Remove recipient" @@ -9489,11 +9489,11 @@ msgstr "Resetowanie weryfikacji dwuetapowej" #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "Reset branding preferences" -msgstr "" +msgstr "Zresetuj ustawienia brandingu" #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Reset document preferences" -msgstr "" +msgstr "Zresetuj ustawienia dokumentu" #: apps/remix/app/components/forms/forgot-password.tsx msgid "Reset email sent" @@ -9517,7 +9517,7 @@ msgstr "Zresetuj weryfikację dwuetapową użytkownika. Ta akcja jest nieodwraca #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "Reset to defaults" -msgstr "" +msgstr "Zresetuj ustawienia" #: apps/remix/app/components/dialogs/admin-user-reset-two-factor-dialog.tsx msgid "Reset Two Factor Authentication" @@ -9537,7 +9537,7 @@ msgstr "Rozwiąż płatność" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Resource blocked" -msgstr "" +msgstr "Zasób został zablokowany" #: apps/remix/app/components/general/webhook-logs-sheet.tsx msgid "Response" @@ -9749,7 +9749,7 @@ msgstr "Szukaj nazwy organizacji, adresu URL lub identyfikatora" #: apps/remix/app/components/general/app-command-menu.tsx msgid "Search documents, users, organisations…" -msgstr "" +msgstr "Szukaj dokumentów, użytkowników, organizacji…" #: apps/remix/app/components/general/document/document-search.tsx msgid "Search documents..." @@ -9772,7 +9772,7 @@ msgstr "Szukaj języków..." #: apps/remix/app/components/general/app-command-menu.tsx msgid "Search languages…" -msgstr "" +msgstr "Szukaj języków…" #: apps/remix/app/components/general/organisation-members-multiselect-combobox.tsx msgid "Search members by name or email" @@ -9780,19 +9780,19 @@ msgstr "Szukaj nazwy lub adresu e-mail użytkownika" #: apps/remix/app/components/tables/documents-table-sender-filter.tsx msgid "Search members..." -msgstr "" +msgstr "Szukaj użytkowników..." #: apps/remix/app/components/general/settings-org-switcher.tsx msgid "Search organisations…" -msgstr "" +msgstr "Szukaj organizacji…" #: apps/remix/app/components/general/settings-team-switcher.tsx msgid "Search teams…" -msgstr "" +msgstr "Szukaj zespołów…" #: apps/remix/app/components/general/app-command-menu.tsx msgid "Search themes…" -msgstr "" +msgstr "Szukaj motywów…" #: apps/remix/app/components/dialogs/webhook-create-dialog.tsx msgid "Secret" @@ -9812,7 +9812,7 @@ msgstr "Aktywność bezpieczeństwa" #: apps/remix/app/components/general/admin-license-status-banner.tsx msgid "See Documentation" -msgstr "Zobacz dokumentację" +msgstr "Sprawdź dokumentację" #: apps/remix/app/routes/_authenticated+/admin+/documents.$id.tsx msgid "See the background jobs tab for the status" @@ -9847,7 +9847,7 @@ msgstr "Wybierz odbiorcę" #: apps/remix/app/components/general/unified-settings-sidebar-mobile.tsx msgid "Select a section" -msgstr "" +msgstr "Wybierz sekcję" #: apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx msgid "Select a team to view its dashboard" @@ -10085,7 +10085,7 @@ msgstr "Wyślij kopertę" #: packages/ui/components/document/reminder-settings-picker.tsx msgid "Send first reminder after" -msgstr "Wyślij pierwsze przypomnienie za" +msgstr "Wyślij pierwsze przypomnienie po" #: apps/remix/app/components/forms/email-preferences-form.tsx msgid "Send on Behalf of Team" @@ -10143,7 +10143,7 @@ msgstr "Wysłano" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Sent this period" -msgstr "" +msgstr "Wysłano w tym okresie" #: apps/remix/app/routes/_authenticated+/settings+/security.sessions.tsx msgid "Session revoked" @@ -10554,11 +10554,11 @@ msgstr "Pomiń" #: apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx #: apps/remix/app/components/general/envelope-editor/envelope-editor-fields-page.tsx msgid "Some fields are placed on top of each other. This may complicate the signing process or cause fields to not work as expected." -msgstr "" +msgstr "Niektóre pola są umieszczone jedno nad drugim. Może to utrudnić podpisywanie lub spowodować, że pola nie będą działać zgodnie z oczekiwaniami." #: apps/remix/app/components/general/app-command-menu.tsx msgid "Some searches failed — results may be incomplete." -msgstr "" +msgstr "Niektóre wyszukiwania nie powiodły się. Wyniki mogą być niekompletne." #: packages/ui/primitives/document-flow/missing-signature-field-dialog.tsx msgid "Some signers have not been assigned a signature field. Please assign at least 1 signature field to each signer before proceeding." @@ -10757,7 +10757,7 @@ msgstr "Krok <0>{step} z {maxStep}" #: apps/remix/app/components/dialogs/envelopes-bulk-download-dialog.tsx msgid "Stop" -msgstr "" +msgstr "Zatrzymaj" #: apps/remix/app/components/tables/admin-organisations-table.tsx msgid "Stripe" @@ -10840,7 +10840,7 @@ msgstr "Subskrypcja została zsynchronizowana" #: apps/remix/app/components/general/use-admin-search-categories.ts msgid "Subscriptions" -msgstr "" +msgstr "Subskrypcje" #: apps/remix/app/components/dialogs/admin-organisation-create-dialog.tsx #: apps/remix/app/components/dialogs/admin-organisation-member-delete-dialog.tsx @@ -11153,7 +11153,7 @@ msgstr "Zespoły pomagają organizować pracę i współpracować z innymi. Utw #: apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx msgid "Teams that belong to this organisation." -msgstr "" +msgstr "Zespoły, które należą do organizacji." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.groups.$id.tsx msgid "Teams that this organisation group is currently assigned to" @@ -11410,7 +11410,7 @@ msgstr "Nie można było utworzyć dokumentu z powodu brakujących lub nieprawid #: apps/remix/app/utils/toast-error-messages.ts msgid "The document could not be sent because some signers do not have a signature field. Please edit the template and add a signature field for each signer." -msgstr "" +msgstr "Nie można wysłać dokumentu, ponieważ niektórzy podpisujący nie mają pola podpisu. Edytuj szablon i dodaj pola podpisu dla wszystkich podpisujących." #: apps/remix/app/components/dialogs/admin-document-delete-dialog.tsx msgid "The Document has been deleted successfully." @@ -11455,20 +11455,20 @@ msgstr "Dokument został utworzony, ale nie mógł zostać wysłany do odbiorcó #: packages/lib/utils/document-audit-logs.ts msgid "The document was rejected externally by {onBehalfOf} on behalf of {user}" -msgstr "Dokument został odrzucony zewnętrznie przez {onBehalfOf} w imieniu użytkownika {user}" +msgstr "Dokument został odrzucony w zewnętrznej usłudze przez użytkownika {onBehalfOf} w imieniu użytkownika {user}" #: packages/lib/utils/document-audit-logs.ts #: packages/lib/utils/document-audit-logs.ts msgid "The document was rejected externally by {onBehalfOf} on behalf of the recipient" -msgstr "Dokument został odrzucony zewnętrznie przez {onBehalfOf} w imieniu odbiorcy" +msgstr "Dokument został odrzucony w zewnętrznej usłudze przez użytkownika {onBehalfOf} w imieniu odbiorcy" #: packages/lib/utils/document-audit-logs.ts msgid "The document was rejected externally on behalf of {user}" -msgstr "Dokument został odrzucony zewnętrznie w imieniu użytkownika {user}" +msgstr "Dokument został odrzucony w zewnętrznej usłudze w imieniu użytkownika {user}" #: packages/lib/utils/document-audit-logs.ts msgid "The document was rejected externally on behalf of the recipient" -msgstr "Dokument został odrzucony zewnętrznie w imieniu odbiorcy" +msgstr "Dokument został odrzucony w zewnętrznej usłudze w imieniu odbiorcy" #: apps/remix/app/components/dialogs/envelope-delete-dialog.tsx msgid "The document will be hidden from your account" @@ -11566,7 +11566,7 @@ msgstr "Następujący zespół został usunięty. Nie będziesz mógł już uzys #: apps/remix/app/components/general/admin-license-card.tsx msgid "The license key has been copied to your clipboard" -msgstr "" +msgstr "Klucz licencyjny został skopiowany do schowka" #. placeholder {0}: form.watch('name') #. placeholder {1}: form.watch('email') @@ -11596,7 +11596,7 @@ msgstr "Rola w organizacji, która zostanie zastosowana dla wszystkich użytkown #: apps/remix/app/components/dialogs/admin-organisation-sync-subscription-dialog.tsx msgid "The organisation subscription has been synced with Stripe." -msgstr "Subskrypcja organizacji została zsynchronizowana ze Stripe." +msgstr "Subskrypcja organizacji została zsynchronizowana z Stripe." #: apps/remix/app/components/dialogs/admin-organisation-delete-dialog.tsx msgid "The organisation will be deleted in the background. Documents will be orphaned, not deleted." @@ -11801,7 +11801,7 @@ msgstr "Webhook, którego szukasz, mógł zostać usunięty, zmieniony lub móg #: apps/remix/app/components/general/app-command-menu.tsx msgid "Theme" -msgstr "" +msgstr "Motyw" #: packages/ui/components/document/reminder-settings-picker.tsx msgid "Then repeat every" @@ -11821,11 +11821,11 @@ msgstr "Brak zakończonych dokumentów. Utworzone lub odebrane dokumenty pojawi #: apps/remix/app/components/tables/documents-table-empty-state.tsx msgid "There are no documents with expired signing links. You can redistribute a document to renew its expiration." -msgstr "" +msgstr "Brak dokumentów z wygasłymi linkami do podpisania. Możesz ponownie udostępnić dokument, aby przedłużyć jego ważność." #: apps/remix/app/components/tables/documents-table-empty-state.tsx msgid "There are no rejected documents. Documents that a recipient declines to sign will appear here." -msgstr "" +msgstr "Brak odrzuconych dokumentów. Tutaj pojawią się dokumenty do podpisu odrzucone przez odbiorców." #: apps/remix/app/components/embed/authoring/configure-document-upload.tsx msgid "There was an error uploading your file. Please try again." @@ -11849,7 +11849,7 @@ msgstr "W Twoim imieniu mogą:" #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "They will be able to view documents associated with this email." -msgstr "" +msgstr "Będą oni mogli przeglądać dokumenty powiązane z tym adresem." #: apps/remix/app/components/forms/signin.tsx msgid "This account has been disabled. Please contact support." @@ -11886,11 +11886,11 @@ msgstr "Subskrypcja jest zablokowana i nie można ją usunąć." #: apps/remix/app/utils/toast-error-messages.ts msgid "This direct link template cannot be used because one or more signers do not have a signature field assigned." -msgstr "" +msgstr "Szablon bezpośredniego linku nie może zostać użyty, ponieważ co najmniej jeden podpisujący nie ma przypisanego pola podpisu." #: apps/remix/app/components/general/direct-template/direct-template-invalid-page.tsx msgid "This direct link template cannot be used because one or more signers do not have a signature field assigned. Please contact the sender to update the template." -msgstr "" +msgstr "Szablon bezpośredniego linku nie może zostać użyty, ponieważ co najmniej jeden podpisujący nie ma przypisanego pola podpisu. Skontaktuj się z nadawcą, aby zaktualizował szablon." #: packages/email/template-components/template-document-super-delete.tsx msgid "This document can not be recovered, if you would like to dispute the reason for future documents please contact support." @@ -11964,7 +11964,7 @@ msgstr "Dokument używa starszej metody wstawiania pól. Zalecamy użycie nowej #: apps/remix/app/components/general/envelope-signing/envelope-signing-complete-dialog.tsx msgid "This document was already signed and no further action was taken." -msgstr "" +msgstr "Dokument został już podpisany. Nie musisz nic więcej robić." #: apps/remix/app/components/general/template/template-page-view-documents-table.tsx msgid "This document was created by you or a team member using the template above." @@ -11988,7 +11988,7 @@ msgstr "Potwierdzamy odrzucenie dokumentu <0>„{documentName}” wysłanego #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "This email is already being used as a team email. Please contact your team for assistance." -msgstr "" +msgstr "Ten adres e-mail jest już używany jako adres e-mail zespołu. Skontaktuj się z zespołem, aby uzyskać pomoc." #: apps/remix/app/components/dialogs/team-email-add-dialog.tsx msgid "This email is already being used by another team." @@ -12168,11 +12168,11 @@ msgstr "Spowoduje to usunięcie wszystkich adresów e-mail powiązanych z domen #: apps/remix/app/components/dialogs/branding-preferences-reset-dialog.tsx msgid "This will reset all branding preferences to their default values and save the changes immediately." -msgstr "" +msgstr "Spowoduje to zresetowanie ustawień brandingu do wartości domyślnych." #: apps/remix/app/components/dialogs/document-preferences-reset-dialog.tsx msgid "This will reset all document preferences to their default values and save the changes immediately." -msgstr "" +msgstr "Spowoduje to zresetowanie ustawień dokumentu do wartości domyślnych." #: apps/remix/app/components/dialogs/session-logout-all-dialog.tsx msgid "This will sign you out of all other devices. You will need to sign in again on those devices to continue using your account." @@ -12457,7 +12457,7 @@ msgstr "Wyzwalacze" #: apps/remix/app/components/general/app-command-menu.tsx msgid "Try a different search or switch category." -msgstr "" +msgstr "Spróbuj innego zapytania lub zmień kategorię." #: apps/remix/app/components/dialogs/ai-field-detection-dialog.tsx #: apps/remix/app/components/dialogs/ai-field-detection-dialog.tsx @@ -12679,7 +12679,7 @@ msgstr "Odepnij" #: apps/remix/app/components/forms/form-sticky-save-bar.tsx msgid "Unsaved changes" -msgstr "" +msgstr "Niezapisane zmiany" #: apps/remix/app/routes/_authenticated+/admin+/_layout.tsx #: apps/remix/app/routes/_authenticated+/admin+/unsealed-documents._index.tsx @@ -12959,15 +12959,15 @@ msgstr "Użyj" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Use a duration with a unit, e.g. 5m, 1h, or 24h" -msgstr "" +msgstr "Użyj czasu trwania z jednostką, np. 5 min, 1 godz." #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Use a unique window for each rate limit" -msgstr "" +msgstr "Użyj unikalnego przedziału czasowego dla każdego limitu przepustowości" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Use API tokens to authenticate with the Documenso API." -msgstr "" +msgstr "Użyj tokenów API do uwierzytelniania połączenia z interfejsem Documenso." #: apps/remix/app/components/forms/2fa/disable-authenticator-app-dialog.tsx #: apps/remix/app/components/forms/signin.tsx @@ -13092,7 +13092,7 @@ msgstr "Zweryfikuj domenę" #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "Verify email" -msgstr "" +msgstr "Zweryfikuj adres e-mail" #: apps/remix/app/routes/_unauthenticated+/verify-email._index.tsx msgid "Verify Email" @@ -13104,7 +13104,7 @@ msgstr "Zweryfikuj teraz" #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "Verify team email" -msgstr "" +msgstr "Zweryfikuj adres e-mail zespołu" #: apps/remix/app/components/general/verify-email-banner.tsx msgid "Verify your email address" @@ -13177,7 +13177,7 @@ msgstr "Wyświetl powiązane dokumenty" #: apps/remix/app/components/general/use-admin-search-categories.ts msgid "View all results" -msgstr "" +msgstr "Wyświetl wszystkie wyniki" #: apps/remix/app/routes/_authenticated+/settings+/security.activity.tsx msgid "View all security activity related to your account." @@ -13333,7 +13333,7 @@ msgstr "Oczekiwanie na innych" #: packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts msgid "Waiting for others to complete signing." -msgstr "Oczekiwanie na zakończenie podpisywania przez innych." +msgstr "Oczekiwanie na zakończenie podpisywania przez innych" #: apps/remix/app/routes/_recipient+/sign.$token+/complete.tsx msgid "Waiting for others to sign" @@ -13384,7 +13384,7 @@ msgstr "Nie mogliśmy zaktualizować klucza dostępu. Spróbuj ponownie późnie #: apps/remix/app/components/general/app-command-menu.tsx msgid "We couldn’t complete the search. Try again." -msgstr "" +msgstr "Wyszukiwanie nie powiodło się. Spróbuj ponownie." #: apps/remix/app/utils/toast-error-messages.ts msgid "We couldn't convert this file. Please check it's a valid Word document or upload a PDF instead." @@ -13625,7 +13625,7 @@ msgstr "Potrzebujemy Twojego podpisu, aby podpisywać dokumenty" #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "We were unable to add you to <0>{organisationName} at this time. Please try again later, or contact the organisation administrator." -msgstr "" +msgstr "Nie mogliśmy dodać Cię do organizacji <0>{organisationName}. Spróbuj ponownie później lub skontaktuj się z administratorem organizacji." #: apps/remix/app/components/forms/2fa/recovery-code-list.tsx msgid "We were unable to copy your recovery code to your clipboard. Please try again." @@ -13677,7 +13677,7 @@ msgstr "Nie mogliśmy zaktualizować ustawień brandingu. Spróbuj ponownie pó #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.certificates.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.certificates.tsx msgid "We were unable to update your certificate preferences at this time, please try again later" -msgstr "" +msgstr "Nie mogliśmy zaktualizować ustawień certyfikatu. Spróbuj ponownie później" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.document.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.document.tsx @@ -13692,7 +13692,7 @@ msgstr "Nie mogliśmy zaktualizować ustawień adresu e-mail. Spróbuj ponownie #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.reminders.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.reminders.tsx msgid "We were unable to update your reminder preferences at this time, please try again later" -msgstr "" +msgstr "Nie mogliśmy zaktualizować ustawień przypomnień. Spróbuj ponownie później" #: apps/remix/app/components/forms/signin.tsx msgid "We were unable to verify that you're human. Please try again." @@ -13700,7 +13700,7 @@ msgstr "Nie mogliśmy potwierdzić, że jesteś człowiekiem. Spróbuj ponownie. #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "We were unable to verify this email at this time. Please try again later." -msgstr "" +msgstr "Nie mogliśmy zweryfikować adresu e-mail. Spróbuj ponownie później." #: apps/remix/app/components/general/document-signing/document-signing-auth-2fa.tsx #: apps/remix/app/components/general/document-signing/document-signing-auth-passkey.tsx @@ -13897,7 +13897,7 @@ msgstr "Szerokość:" #: apps/remix/app/components/general/rate-limit-array-input.tsx msgid "Window" -msgstr "" +msgstr "Przedział czasowy" #: apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx msgid "Withdrawing Consent" @@ -13905,7 +13905,7 @@ msgstr "Wycofanie zgody" #: apps/remix/app/components/general/organisation-usage-panel.tsx msgid "Within limit" -msgstr "" +msgstr "W ramach limitu" #: apps/remix/app/components/forms/public-profile-form.tsx msgid "Write a description to display on your public profile" @@ -14059,7 +14059,7 @@ msgstr "Zamierzasz zasubskrybować plan {planName}" #. placeholder {0}: data.organisationName #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "You are already a member of <0>{0}." -msgstr "" +msgstr "Należysz już do organizacji <0>{0}." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx msgid "You are currently on the <0>Free Plan." @@ -14303,7 +14303,7 @@ msgstr "Nie masz uprawnień do utworzenia tokena dla tego zespołu." #: apps/remix/app/components/general/unified-settings-sidebar.tsx msgid "You don't have permission to manage this organisation. Switch to another one above, or continue in your team settings below." -msgstr "" +msgstr "Nie masz uprawnień do zarządzania organizacją. Wybierz inną organizację lub kontynuuj w ustawieniach swojego zespołu." #: apps/remix/app/components/tables/user-billing-organisations-table.tsx msgid "You don't manage billing for any organisations." @@ -14319,7 +14319,7 @@ msgstr "Nie zweryfikowałeś kodu weryfikacyjnego dla dokumentu" #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "You have accepted an invitation from <0>{organisationName} to join their organisation." -msgstr "" +msgstr "Zaproszenie do organizacji <0>{organisationName} zostało zaakceptowane." #. placeholder {0}: data.teamName #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx @@ -14328,7 +14328,7 @@ msgstr "Adres e-mail zespołu <0>{0} został już zweryfikowany." #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "You have been invited by <0>{organisationName} to join their organisation." -msgstr "" +msgstr "Organizacja <0>{organisationName} zaprasza Cię do dołączenia do nich." #. placeholder {0}: organisation.name #: packages/lib/server-only/organisation/create-organisation-member-invites.ts @@ -14337,7 +14337,7 @@ msgstr "Dołącz do organizacji {0} w Documenso" #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "You have been invited to join <0>{organisationName} on Documenso." -msgstr "" +msgstr "Dołącz do organizacji <0>{organisationName} w Documenso." #: packages/email/templates/organisation-invite.tsx msgid "You have been invited to join the following organisation" @@ -14353,7 +14353,7 @@ msgstr "Sprawdź każdy dokument i podpisz je." #: apps/remix/app/routes/_unauthenticated+/organisation.invite.$token.tsx msgid "You have declined the invitation from <0>{organisationName} to join their organisation." -msgstr "" +msgstr "Odrzucono zaproszenie dołączenia do organizacji <0>{organisationName}." #. placeholder {0}: `"${envelope.title}"` #: packages/lib/jobs/definitions/emails/send-signing-email.handler.ts @@ -14363,7 +14363,7 @@ msgstr "Sprawdź i {recipientActionVerb} dokument „{0}” utworzony przez Cieb #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx msgid "You have no API tokens yet. Your tokens will be shown here once you create them." -msgstr "" +msgstr "Nie masz jeszcze żadnych tokenów API. Twoje tokeny API zostaną tutaj wyświetlone." #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.webhooks._index.tsx msgid "You have no webhooks yet. Your webhooks will be shown here once you create them." @@ -14468,7 +14468,7 @@ msgstr "Masz prawo wycofać swoją zgodę na używanie podpisów elektronicznych #: apps/remix/app/components/forms/form-sticky-save-bar.tsx msgid "You have unsaved changes" -msgstr "" +msgstr "Masz niezapisane zmiany" #: apps/remix/app/components/dialogs/team-member-update-dialog.tsx msgid "You have updated {memberName}." @@ -14484,7 +14484,7 @@ msgstr "Grupa zespołu została zaktualizowana." #: apps/remix/app/routes/_unauthenticated+/team.verify.email.$token.tsx msgid "You have verified your email address for <0>{teamName}." -msgstr "" +msgstr "Adres e-mail zespołu <0>{teamName} został zweryfikowany." #: packages/lib/utils/document-audit-logs.ts msgid "You moved the document to team" @@ -14800,7 +14800,7 @@ msgstr "Zbiorcza wysyłka szablonu „{templateName}” została zakończona." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.certificates.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.certificates.tsx msgid "Your certificate preferences have been updated" -msgstr "" +msgstr "Ustawienia certyfikatu zostały zaktualizowane" #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.billing.tsx msgid "Your current {currentProductName} plan is past due. Please update your payment information." @@ -14930,7 +14930,7 @@ msgstr "Twoja nazwa" #: apps/remix/app/components/dialogs/token-create-dialog.tsx msgid "Your new API token" -msgstr "" +msgstr "Nowy token API" #: apps/remix/app/components/forms/password.tsx #: apps/remix/app/components/forms/reset-password.tsx @@ -15043,7 +15043,7 @@ msgstr "To są Twoje kody odzyskiwania. Przechowuj je w bezpiecznym miejscu." #: apps/remix/app/routes/_authenticated+/o.$orgUrl.settings.reminders.tsx #: apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.reminders.tsx msgid "Your reminder preferences have been updated" -msgstr "" +msgstr "Ustawienia przypomnień zostały zaktualizowane" #: packages/lib/utils/document-audit-logs.ts msgid "Your remote signature was applied" From 688ef2fdf303410dce3f519ad40f77ef9f37a7d2 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Fri, 14 Aug 2026 13:02:48 +0300 Subject: [PATCH 02/20] fix: docker healtcheck (#3176) --- .../content/docs/self-hosting/deployment/docker-compose.mdx | 2 +- docker/development/compose.yml | 2 +- docker/production/compose.yml | 2 +- docker/testing/compose.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/docs/content/docs/self-hosting/deployment/docker-compose.mdx b/apps/docs/content/docs/self-hosting/deployment/docker-compose.mdx index 84e228115..a5ac58807 100644 --- a/apps/docs/content/docs/self-hosting/deployment/docker-compose.mdx +++ b/apps/docs/content/docs/self-hosting/deployment/docker-compose.mdx @@ -81,7 +81,7 @@ services: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err} - POSTGRES_DB=${POSTGRES_DB:?err} healthcheck: - test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] + test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] interval: 10s timeout: 5s retries: 5 diff --git a/docker/development/compose.yml b/docker/development/compose.yml index b694e0bf2..149a577ce 100644 --- a/docker/development/compose.yml +++ b/docker/development/compose.yml @@ -7,7 +7,7 @@ services: volumes: - documenso_database:/var/lib/postgresql/data healthcheck: - test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] + test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB'] interval: 10s timeout: 5s retries: 5 diff --git a/docker/production/compose.yml b/docker/production/compose.yml index 2a4abc6c3..5cf4ddc90 100644 --- a/docker/production/compose.yml +++ b/docker/production/compose.yml @@ -8,7 +8,7 @@ services: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err} - POSTGRES_DB=${POSTGRES_DB:?err} healthcheck: - test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER}'] + test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] interval: 10s timeout: 5s retries: 5 diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml index 110e9da6b..7251ee523 100644 --- a/docker/testing/compose.yml +++ b/docker/testing/compose.yml @@ -8,7 +8,7 @@ services: - POSTGRES_PASSWORD=password - POSTGRES_DB=documenso healthcheck: - test: ['CMD-SHELL', 'pg_isready -U documenso'] + test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB'] interval: 1s timeout: 5s retries: 5 From 283c6d274b1f7061249e2470d5ac28bf02de2acc Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 17 Aug 2026 15:23:19 +1000 Subject: [PATCH 03/20] fix: use documenso fork of skia-canvas for rendering (#3214) Use our fork of `skia-canvas` for rendering which handles encoding characters correctly with the caveat font and other similar fonts that can group glyphs like ligatures. This resolves issues with pdf text extraction where characters were unable to be extracted due to lacking any data within the cmaps. --- .npmrc | 2 +- apps/remix/vite.config.ts | 2 +- package-lock.json | 29 ++++++++++--------- package.json | 1 + packages/lib/package.json | 2 +- packages/lib/server-only/ai/pdf-to-images.ts | 2 +- .../lib/server-only/konva/skia-backend.ts | 5 ++-- packages/lib/server-only/pdf/helpers.ts | 2 +- .../server-only/pdf/insert-field-in-pdf-v2.ts | 2 +- .../lib/server-only/pdf/render-audit-logs.ts | 12 ++++---- .../lib/server-only/pdf/render-certificate.ts | 12 ++++---- .../field-renderer/render-signature-field.ts | 2 +- 12 files changed, 40 insertions(+), 33 deletions(-) diff --git a/.npmrc b/.npmrc index 75baad7f0..cbc6b6537 100644 --- a/.npmrc +++ b/.npmrc @@ -1,3 +1,3 @@ legacy-peer-deps = true prefer-dedupe = true -# min-release-age = 7 +min-release-age = 7 diff --git a/apps/remix/vite.config.ts b/apps/remix/vite.config.ts index 50d21e07d..b6cc0cb1b 100644 --- a/apps/remix/vite.config.ts +++ b/apps/remix/vite.config.ts @@ -121,7 +121,7 @@ export default defineConfig({ 'nodemailer', /playwright/, '@playwright/browser-chromium', - 'skia-canvas', + '@documenso/skia-canvas', ], }, }, diff --git a/package-lock.json b/package-lock.json index a10151db2..4c13b8e33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,7 @@ "@commitlint/cli": "^20.1.0", "@commitlint/config-conventional": "^20.0.0", "@datadog/pprof": "^5.13.5", + "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/cli": "^5.6.0", "@prisma/client": "^6.19.0", "@trpc/client": "11.8.1", @@ -3515,6 +3516,19 @@ "resolved": "packages/signing", "link": true }, + "node_modules/@documenso/skia-canvas": { + "version": "3.0.8-documenso.3", + "resolved": "https://registry.npmjs.org/@documenso/skia-canvas/-/skia-canvas-3.0.8-documenso.3.tgz", + "integrity": "sha512-IeEr7RxJigCzidsRIQu6tcMX9+bt0tG3Y5kMArCPF4/jEgunPVx3qd7Wyh34mtSNufpzmVwazxR+U2BIz3iYvQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.1.1", + "follow-redirects": "^1.15.11", + "https-proxy-agent": "^7.0.6", + "string-split-by": "^1.0.0" + } + }, "node_modules/@documenso/tailwind-config": { "resolved": "packages/tailwind-config", "link": true @@ -28728,19 +28742,6 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, - "node_modules/skia-canvas": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/skia-canvas/-/skia-canvas-3.0.8.tgz", - "integrity": "sha512-FSYKxp8Ng2vOeeOBiyPhnn6ui6FirPJXMyjk4PKl8N/OWzVrkMawUgY9zubIWHMdYtyWFn0gfX3QlRwg6HBmdg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.1.1", - "follow-redirects": "^1.15.11", - "https-proxy-agent": "^7.0.6", - "string-split-by": "^1.0.0" - } - }, "node_modules/slice-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", @@ -33231,6 +33232,7 @@ "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", + "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/core": "^5.6.0", "@lingui/macro": "^5.6.0", "@lingui/react": "^5.6.0", @@ -33269,7 +33271,6 @@ "react": "^18", "remeda": "^2.32.0", "sharp": "0.34.5", - "skia-canvas": "^3.0.8", "stripe": "^12.18.0", "ts-pattern": "^5.9.0", "zod": "^3.25.76" diff --git a/package.json b/package.json index 60e97f1c8..d4382924d 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "@commitlint/cli": "^20.1.0", "@commitlint/config-conventional": "^20.0.0", "@datadog/pprof": "^5.13.5", + "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/cli": "^5.6.0", "@prisma/client": "^6.19.0", "@trpc/client": "11.8.1", diff --git a/packages/lib/package.json b/packages/lib/package.json index 41b1f1815..27092f178 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -29,6 +29,7 @@ "@documenso/email": "*", "@documenso/prisma": "*", "@documenso/signing": "*", + "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/core": "^5.6.0", "@lingui/macro": "^5.6.0", "@lingui/react": "^5.6.0", @@ -67,7 +68,6 @@ "react": "^18", "remeda": "^2.32.0", "sharp": "0.34.5", - "skia-canvas": "^3.0.8", "stripe": "^12.18.0", "ts-pattern": "^5.9.0", "zod": "^3.25.76" diff --git a/packages/lib/server-only/ai/pdf-to-images.ts b/packages/lib/server-only/ai/pdf-to-images.ts index e14128278..fb2ee13e8 100644 --- a/packages/lib/server-only/ai/pdf-to-images.ts +++ b/packages/lib/server-only/ai/pdf-to-images.ts @@ -1,6 +1,6 @@ +import { Canvas, Image, Path2D } from '@documenso/skia-canvas'; import pMap from 'p-map'; import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf.mjs'; -import { Canvas, Image, Path2D } from 'skia-canvas'; // @ts-expect-error napi-rs/canvas satisfies the requirements globalThis.Path2D = Path2D; diff --git a/packages/lib/server-only/konva/skia-backend.ts b/packages/lib/server-only/konva/skia-backend.ts index bdcd4ec64..1e41c51ab 100644 --- a/packages/lib/server-only/konva/skia-backend.ts +++ b/packages/lib/server-only/konva/skia-backend.ts @@ -2,8 +2,9 @@ * !: This is a workaround to fix the memory leak in the skia-canvas library. * !: Internals are ported from the original `konva/skia-backend.js` file. */ + +import { Canvas, DOMMatrix, Image, Path2D } from '@documenso/skia-canvas'; import { Konva } from 'konva/lib/_CoreInternals'; -import { Canvas, DOMMatrix, Image, Path2D } from 'skia-canvas'; // @ts-expect-error skia-canvas satisfies the requirements global.DOMMatrix = DOMMatrix; @@ -37,6 +38,6 @@ Konva.Util.createImageElement = () => { return node as unknown as HTMLImageElement; }; -Konva._renderBackend = 'skia-canvas'; +Konva._renderBackend = '@documenso/skia-canvas'; export default Konva; diff --git a/packages/lib/server-only/pdf/helpers.ts b/packages/lib/server-only/pdf/helpers.ts index 2d6a1bc7e..afe53e170 100644 --- a/packages/lib/server-only/pdf/helpers.ts +++ b/packages/lib/server-only/pdf/helpers.ts @@ -1,8 +1,8 @@ import path from 'node:path'; import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error'; +import { FontLibrary } from '@documenso/skia-canvas'; import type { Recipient } from '@prisma/client'; import { FieldType } from '@prisma/client'; -import { FontLibrary } from 'skia-canvas'; import { match } from 'ts-pattern'; /** diff --git a/packages/lib/server-only/pdf/insert-field-in-pdf-v2.ts b/packages/lib/server-only/pdf/insert-field-in-pdf-v2.ts index ad2adff2c..ee337c1e9 100644 --- a/packages/lib/server-only/pdf/insert-field-in-pdf-v2.ts +++ b/packages/lib/server-only/pdf/insert-field-in-pdf-v2.ts @@ -2,8 +2,8 @@ import '../konva/skia-backend'; import type { FieldWithSignature } from '@documenso/prisma/types/field-with-signature'; +import type { Canvas } from '@documenso/skia-canvas'; import Konva from 'konva'; -import type { Canvas } from 'skia-canvas'; import { renderField } from '../../universal/field-renderer/render-field'; import { ensureFontLibrary } from './helpers'; diff --git a/packages/lib/server-only/pdf/render-audit-logs.ts b/packages/lib/server-only/pdf/render-audit-logs.ts index faf982f55..427ed8be1 100644 --- a/packages/lib/server-only/pdf/render-audit-logs.ts +++ b/packages/lib/server-only/pdf/render-audit-logs.ts @@ -1,14 +1,16 @@ +// sort-imports-ignore +import '../konva/skia-backend'; + +import fs from 'node:fs'; +import path from 'node:path'; +import type { Canvas } from '@documenso/skia-canvas'; +import { Image as SkiaImage } from '@documenso/skia-canvas'; import type { I18n } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import type { DocumentMeta, Envelope, RecipientRole } from '@prisma/client'; import Konva from 'konva'; -import 'konva/skia-backend'; -import fs from 'node:fs'; -import path from 'node:path'; import type { DateTimeFormatOptions } from 'luxon'; import { DateTime } from 'luxon'; -import type { Canvas } from 'skia-canvas'; -import { Image as SkiaImage } from 'skia-canvas'; import { match, P } from 'ts-pattern'; import { UAParser } from 'ua-parser-js'; diff --git a/packages/lib/server-only/pdf/render-certificate.ts b/packages/lib/server-only/pdf/render-certificate.ts index a30d265ee..9fa2a73c9 100644 --- a/packages/lib/server-only/pdf/render-certificate.ts +++ b/packages/lib/server-only/pdf/render-certificate.ts @@ -1,14 +1,16 @@ +// sort-imports-ignore +import '../konva/skia-backend'; + +import fs from 'node:fs'; +import path from 'node:path'; +import type { Canvas } from '@documenso/skia-canvas'; +import { Image as SkiaImage } from '@documenso/skia-canvas'; import type { I18n } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import type { Field, RecipientRole, Signature } from '@prisma/client'; import { SigningStatus } from '@prisma/client'; import Konva from 'konva'; -import 'konva/skia-backend'; -import fs from 'node:fs'; -import path from 'node:path'; import { DateTime } from 'luxon'; -import type { Canvas } from 'skia-canvas'; -import { Image as SkiaImage } from 'skia-canvas'; import { UAParser } from 'ua-parser-js'; import { renderSVG } from 'uqr'; diff --git a/packages/lib/universal/field-renderer/render-signature-field.ts b/packages/lib/universal/field-renderer/render-signature-field.ts index a43d46115..eb3d94c57 100644 --- a/packages/lib/universal/field-renderer/render-signature-field.ts +++ b/packages/lib/universal/field-renderer/render-signature-field.ts @@ -14,7 +14,7 @@ let SkiaImage: any; void (async () => { if (typeof window === 'undefined') { - const mod = await import('skia-canvas'); + const mod = await import('@documenso/skia-canvas'); SkiaImage = mod.Image; } })(); From 779de01fe8fb8c242da867b6c1fa38c70e448c3a Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Mon, 17 Aug 2026 16:58:11 +1000 Subject: [PATCH 04/20] feat: migrate to react 19 (#3107) --- apps/docs/package.json | 1 - apps/openpage-api/package.json | 2 +- .../components/general/app-command-menu.tsx | 2 +- .../document-signing-radio-field.tsx | 10 +- .../general/pdf-viewer/pdf-viewer.tsx | 2 +- apps/remix/app/entry.client.tsx | 21 + apps/remix/package.json | 8 +- package-lock.json | 3632 +++++++---------- package.json | 42 +- packages/ee/package.json | 2 +- packages/email/components.ts | 36 +- packages/email/package.json | 22 +- .../lib/client-only/hooks/use-autosave.ts | 2 +- .../providers/envelope-editor-provider.tsx | 78 +- packages/lib/package.json | 2 +- packages/trpc/package.json | 6 +- packages/ui/components/signing-card.tsx | 2 +- packages/ui/package.json | 41 +- packages/ui/primitives/command.tsx | 4 +- .../document-flow/field-content.tsx | 9 +- .../ui/primitives/recipient-role-icons.tsx | 1 + .../signature-pad/signature-pad-draw.tsx | 2 +- 22 files changed, 1532 insertions(+), 2395 deletions(-) diff --git a/apps/docs/package.json b/apps/docs/package.json index 9f345d14c..be8dfc789 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -10,7 +10,6 @@ "postinstall": "fumadocs-mdx" }, "dependencies": { - "@radix-ui/react-tabs": "^1.1.13", "fumadocs-core": "16.5.0", "fumadocs-mdx": "14.2.6", "fumadocs-ui": "16.5.0", diff --git a/apps/openpage-api/package.json b/apps/openpage-api/package.json index bcc93e039..4efc1dff8 100644 --- a/apps/openpage-api/package.json +++ b/apps/openpage-api/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@types/node": "^20", - "@types/react": "18.3.27", + "@types/react": "^19.2.17", "typescript": "5.6.2" } } diff --git a/apps/remix/app/components/general/app-command-menu.tsx b/apps/remix/app/components/general/app-command-menu.tsx index 7f245872f..32b6a7865 100644 --- a/apps/remix/app/components/general/app-command-menu.tsx +++ b/apps/remix/app/components/general/app-command-menu.tsx @@ -19,7 +19,7 @@ import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { keepPreviousData } from '@tanstack/react-query'; -import { commandScore } from 'cmdk/dist/command-score'; +import { defaultFilter as commandScore } from 'cmdk'; import { ArrowLeftIcon, CheckIcon, diff --git a/apps/remix/app/components/general/document-signing/document-signing-radio-field.tsx b/apps/remix/app/components/general/document-signing/document-signing-radio-field.tsx index 71a0cfa38..e9d6af196 100644 --- a/apps/remix/app/components/general/document-signing/document-signing-radio-field.tsx +++ b/apps/remix/app/components/general/document-signing/document-signing-radio-field.tsx @@ -146,14 +146,17 @@ export const DocumentSigningRadioField = ({ field, onSignField, onUnsignField }: {isLoading && } {!field.inserted && ( - handleSelectItem(value)} className="z-10 my-0.5 gap-y-1"> + handleSelectItem(value)} + className="z-10 my-0.5 gap-y-1" + > {values?.map((item, index) => (
{!item.value.includes('empty-value-') && item.value && ( @@ -167,14 +170,13 @@ export const DocumentSigningRadioField = ({ field, onSignField, onUnsignField }: )} {field.inserted && ( - + {values?.map((item, index) => (
{!item.value.includes('empty-value-') && item.value && ( diff --git a/apps/remix/app/components/general/pdf-viewer/pdf-viewer.tsx b/apps/remix/app/components/general/pdf-viewer/pdf-viewer.tsx index 56c5308d6..c795485f2 100644 --- a/apps/remix/app/components/general/pdf-viewer/pdf-viewer.tsx +++ b/apps/remix/app/components/general/pdf-viewer/pdf-viewer.tsx @@ -215,7 +215,7 @@ export default function PDFViewer({ type VirtualizedPageListProps = { scrollParentRef: ScrollTarget; - constraintRef: React.RefObject; + constraintRef: React.RefObject; pages: PageMeta[]; numPages: number; pdf: pdfjsLib.PDFDocumentProxy; diff --git a/apps/remix/app/entry.client.tsx b/apps/remix/app/entry.client.tsx index 0ffb3602e..f76430676 100644 --- a/apps/remix/app/entry.client.tsx +++ b/apps/remix/app/entry.client.tsx @@ -31,6 +31,26 @@ function initPosthog() { } } +/** + * Surfaces hydration recoveries (React 19 discards the server HTML and + * re-renders on the client instead of dying) so we can track how often + * extensions/early clicks interfere with hydration in the wild. + */ +function onRecoverableError(error: unknown, errorInfo: { componentStack?: string }) { + console.error('[hydration] recovered from error', error, errorInfo.componentStack); + + if (extractPostHogConfig()) { + void import('posthog-js').then(({ default: posthog }) => { + if (posthog.__loaded) { + posthog.capture('$hydration_recoverable_error', { + message: error instanceof Error ? error.message : String(error), + componentStack: errorInfo.componentStack, + }); + } + }); + } +} + async function main() { const locale = detect(fromHtmlTag('lang')) || 'en'; @@ -44,6 +64,7 @@ async function main() { , + { onRecoverableError }, ); }); diff --git a/apps/remix/package.json b/apps/remix/package.json index daa376df3..4674c249d 100644 --- a/apps/remix/package.json +++ b/apps/remix/package.json @@ -57,9 +57,9 @@ "papaparse": "^5.5.3", "posthog-js": "^1.297.2", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", "react-call": "^1.8.1", - "react-dom": "^18", + "react-dom": "^19.2.7", "react-dropzone": "^14.3.8", "react-hook-form": "^7.66.1", "react-hotkeys-hook": "^4.6.2", @@ -93,8 +93,8 @@ "@types/luxon": "^3.7.1", "@types/node": "^20", "@types/papaparse": "^5.5.0", - "@types/react": "18.3.27", - "@types/react-dom": "^18", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "@types/ua-parser-js": "^0.7.39", "cross-env": "^10.1.0", "esbuild": "^0.27.0", diff --git a/package-lock.json b/package-lock.json index 4c13b8e33..c17553bfc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,13 +20,41 @@ "@lingui/core": "^5.6.0", "@marsidev/react-turnstile": "^1.5.0", "@prisma/extension-read-replicas": "^0.4.1", + "@radix-ui/react-accordion": "^1.2.16", + "@radix-ui/react-alert-dialog": "^1.1.19", + "@radix-ui/react-aspect-ratio": "^1.1.11", + "@radix-ui/react-avatar": "^1.2.2", + "@radix-ui/react-checkbox": "^1.3.7", + "@radix-ui/react-collapsible": "^1.1.16", + "@radix-ui/react-context-menu": "^2.3.3", + "@radix-ui/react-dialog": "^1.1.19", + "@radix-ui/react-dropdown-menu": "^2.1.20", + "@radix-ui/react-hover-card": "^1.1.19", + "@radix-ui/react-label": "^2.1.11", + "@radix-ui/react-menubar": "^1.1.20", + "@radix-ui/react-navigation-menu": "^1.2.18", + "@radix-ui/react-popover": "^1.1.19", + "@radix-ui/react-progress": "^1.1.12", + "@radix-ui/react-radio-group": "^1.4.3", + "@radix-ui/react-scroll-area": "^1.2.14", + "@radix-ui/react-select": "^2.3.3", + "@radix-ui/react-separator": "^1.1.11", + "@radix-ui/react-slider": "^1.4.3", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-switch": "^1.3.3", + "@radix-ui/react-tabs": "^1.1.17", + "@radix-ui/react-toast": "^1.2.19", + "@radix-ui/react-toggle": "^1.1.14", + "@radix-ui/react-toggle-group": "^1.1.15", + "@radix-ui/react-tooltip": "^1.2.12", "ai": "^5.0.104", "cron-parser": "^5.5.0", "fflate": "^0.8.3", "luxon": "^3.7.2", "patch-package": "^8.0.1", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", + "react-dom": "^19.2.7", "typescript": "5.6.2", "zod": "^3.25.76" }, @@ -38,12 +66,14 @@ "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/cli": "^5.6.0", "@prisma/client": "^6.19.0", - "@trpc/client": "11.8.1", - "@trpc/react-query": "11.8.1", - "@trpc/server": "11.8.1", + "@trpc/client": "11.17.0", + "@trpc/react-query": "11.17.0", + "@trpc/server": "11.17.0", "@ts-rest/core": "^3.52.1", "@ts-rest/open-api": "^3.52.1", "@ts-rest/serverless": "^3.52.1", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "dotenv": "^17.2.3", "dotenv-cli": "^11.0.0", "esbuild": "^0.27.0", @@ -80,7 +110,6 @@ "version": "0.0.0", "hasInstallScript": true, "dependencies": { - "@radix-ui/react-tabs": "^1.1.13", "fumadocs-core": "16.5.0", "fumadocs-mdx": "14.2.6", "fumadocs-ui": "16.5.0", @@ -114,26 +143,6 @@ "undici-types": ">=7.24.0 <7.24.7" } }, - "apps/docs/node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "apps/docs/node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, "apps/docs/node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -254,27 +263,6 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "apps/docs/node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "apps/docs/node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.7" - } - }, "apps/docs/node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", @@ -288,12 +276,6 @@ "url": "https://paulmillr.com/funding/" } }, - "apps/docs/node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, "apps/docs/node_modules/tailwind-merge": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", @@ -362,7 +344,7 @@ }, "devDependencies": { "@types/node": "^20", - "@types/react": "18.3.27", + "@types/react": "^19.2.17", "typescript": "5.6.2" } }, @@ -413,9 +395,9 @@ "papaparse": "^5.5.3", "posthog-js": "^1.297.2", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", "react-call": "^1.8.1", - "react-dom": "^18", + "react-dom": "^19.2.7", "react-dropzone": "^14.3.8", "react-hook-form": "^7.66.1", "react-hotkeys-hook": "^4.6.2", @@ -449,8 +431,8 @@ "@types/luxon": "^3.7.1", "@types/node": "^20", "@types/papaparse": "^5.5.0", - "@types/react": "18.3.27", - "@types/react-dom": "^18", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "@types/ua-parser-js": "^0.7.39", "cross-env": "^10.1.0", "esbuild": "^0.27.0", @@ -2858,6 +2840,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", @@ -4022,31 +4005,31 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.10" + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz", - "integrity": "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.4" + "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", @@ -4054,9 +4037,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, "node_modules/@formatjs/fast-memoize": { @@ -4240,22 +4223,20 @@ } }, "node_modules/@hello-pangea/dnd": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.6.0.tgz", - "integrity": "sha512-vfZ4GydqbtUPXSLfAvKvXQ6xwRzIjUSjVU0Sx+70VOhc2xx6CdmJXJ8YhH70RpbTUGjxctslQTHul9sIOxCfFQ==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", + "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", "license": "Apache-2.0", "dependencies": { - "@babel/runtime": "^7.24.1", + "@babel/runtime": "^7.26.7", "css-box-model": "^1.2.1", - "memoize-one": "^6.0.0", "raf-schd": "^4.0.3", - "react-redux": "^8.1.3", - "redux": "^4.2.1", - "use-memo-one": "^1.1.3" + "react-redux": "^9.2.0", + "redux": "^5.0.1" }, "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, "node_modules/@hexagon/base64": { @@ -10811,32 +10792,32 @@ "license": "BSD-3-Clause" }, "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", + "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.5.tgz", + "integrity": "sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==", "license": "MIT" }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz", - "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==", + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.16.tgz", + "integrity": "sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collapsible": "1.1.12", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collapsible": "1.1.16", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -10854,17 +10835,16 @@ } }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.15.tgz", - "integrity": "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.19.tgz", + "integrity": "sha512-FA7n1f6D/DwGE0+AWxiY5LacNbbExQuEgMubeG06idEaH+mSLuf9dp/qBNqOnvbTQ+4gZ2ue1RATF1Ub91Mg5g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dialog": "1.1.19", + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -10881,31 +10861,13 @@ } } }, - "node_modules/@radix-ui/react-alert-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", + "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -10923,35 +10885,12 @@ } }, "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.8.tgz", - "integrity": "sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.11.tgz", + "integrity": "sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-aspect-ratio/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -10969,54 +10908,16 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.11.tgz", - "integrity": "sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.2.tgz", + "integrity": "sha512-sST0qh8GzOB7besQ3tMLWLyngnRuSk0gc/Hm+667KYKQFCt6Y6ZXv25WlqM7dIDK54ULCh5+CHmk4LIolzfz+A==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-avatar/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11034,19 +10935,19 @@ } }, "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", - "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.7.tgz", + "integrity": "sha512-JroKHfQBfh+fDuzpPsBC+pESkhuq8ql4hljTguz8MWnS35cISr3d/Jhl9kYrB44FlDtxCArYdDvTx+BSsJ64rQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11064,19 +10965,19 @@ } }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz", - "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.16.tgz", + "integrity": "sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11094,15 +10995,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.12.tgz", + "integrity": "sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", @@ -11119,28 +11020,10 @@ } } }, - "node_modules/@radix-ui/react-collection/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -11153,9 +11036,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.0.tgz", + "integrity": "sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -11168,17 +11051,16 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.16.tgz", - "integrity": "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.3.tgz", + "integrity": "sha512-PS+gKE0z2prJ74Y0sM+brAGK4mYOHIR7TlcV5EJgUQ6E0xMvyswkK2X4yRqyganrzsRL+WCSKAPu0NQITICRWg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-menu": "2.1.20", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -11196,25 +11078,25 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", - "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.19.tgz", + "integrity": "sha512-+HhbN2+YtkRgVirjZ2afMeutQRuGOrdkWR5+EFC58SJojGmtyNQwYzgi6tHBpOxvFHefMtPeHdgtjz0BOGxFQg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -11231,28 +11113,10 @@ } } }, - "node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", + "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -11265,16 +11129,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.15.tgz", + "integrity": "sha512-b0XaRlzn2QKuo10XyNgi2DAJDf5XC9d1nD3FJcuvCjbR7+4Ad28zmZsLsqx+hvDEzMnRuZaZxZm9gYObV6RmRA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-effect-event": "0.0.3" }, "peerDependencies": { "@types/react": "*", @@ -11292,18 +11156,18 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.16.tgz", - "integrity": "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.20.tgz", + "integrity": "sha512-slfm+rRaZRuQBvHq60lXvSVUPhid0IPtjSZzIuUlWZMUs01iYZNlGS3mJgRD3ChLQVBAYlKiL/tFyWGX+dz8Xw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-menu": "2.1.20", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -11321,9 +11185,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", - "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", + "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -11336,14 +11200,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.12.tgz", + "integrity": "sha512-jjk/lqTeNL0azUx5ZYzVrl4NgaDIrdzTNE4mABV9yBFI7FQqN7pIgzV1bTleUezP2QiTGA1BFTqY8MegDgWX9A==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11361,20 +11225,20 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.15.tgz", - "integrity": "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.19.tgz", + "integrity": "sha512-2KTgMLQtKvicznQgbindEI2RZ3QbDIwU5gabjUPwFJsormjGDz+rUvO4NANmYwzEEpTcTONUt33vBHIfTIVSfw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-popper": "1.3.3", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -11392,12 +11256,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", + "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11410,35 +11274,12 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.8.tgz", - "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.11.tgz", + "integrity": "sha512-3PKvDDxOn62k0oV1n4QtNtD2vpu+zYjXR7ojLBPaO6SPvhy53yg0vAmgNeBQeJW5rV3dffoRG+HYfLBZuzw0CQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -11456,29 +11297,29 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.16.tgz", - "integrity": "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==", + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.20.tgz", + "integrity": "sha512-VsUrXxFe9d2ScbZF0fR/oPR1+qjyeLs5p0jzG8h90puMoA9bq4SirYlXbE+USRg9Q2qTeJSFNqjw2nts8jJe4w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.3", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -11495,40 +11336,22 @@ } } }, - "node_modules/@radix-ui/react-menu/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.16.tgz", - "integrity": "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.20.tgz", + "integrity": "sha512-gzFZvybgmwYsFBWDqanycIoEYnhyk8MMnuLamdFVHUZYGp4COM+sqXiwbnn0VMWqGLeeU7GV7jm+dXRa+Wufag==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.16", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-menu": "2.1.20", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -11546,25 +11369,25 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz", - "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==", + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.18.tgz", + "integrity": "sha512-K9HiuxZ6xCwSaHcIuUpxyhy4w5gpwzWjh9dHTSbMN3Ix4qAyVObS9RlU3zMycb0PO3v9Tpk0BXMwWvXOUbVXew==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", @@ -11582,26 +11405,26 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz", - "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.19.tgz", + "integrity": "sha512-jkrTdQVxnIB8fpn0NyyxW9CTB5aCXZZelVz5z+Xmii6g5WxMqS3fInNslZ63puP39+Puu4jYohUK31y3dT87gQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.3", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -11618,40 +11441,22 @@ } } }, - "node_modules/@radix-ui/react-popover/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-popper": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", - "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.3.tgz", + "integrity": "sha512-mS7dGpyjv6b+gsDjLF7e0ia1W4Im1B1hSCy2yuXlHuvnZxHKagfDaobt/KAKt27EpZMit2pss8eJBVyVjEWM+g==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" + "@radix-ui/react-arrow": "1.1.11", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-rect": "1.1.2", + "@radix-ui/react-use-size": "1.1.2", + "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11669,13 +11474,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.13.tgz", + "integrity": "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11693,13 +11498,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.7.tgz", + "integrity": "sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11717,12 +11521,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", + "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.2.3" + "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", @@ -11739,70 +11543,14 @@ } } }, - "node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.8.tgz", - "integrity": "sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.12.tgz", + "integrity": "sha512-ZPHyI0JyzoH/rP0tq2uRaIZTj/4s8+kAbqPz+e2N8+ejHvwPJ889dHhqn+vh7PNvNeq+boAoH9yzqeoShzwF2w==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.3", - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz", - "integrity": "sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -11820,21 +11568,21 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", - "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.3.tgz", + "integrity": "sha512-WwZFjWV4s3aC1QtR3k04R+oANHtX2q6fgKlc7MCEiDNlnTxCZ3H8k3mHtEgVlOejystwk1WQgarQhNOQZ2bK1g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11852,20 +11600,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", - "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.15.tgz", + "integrity": "sha512-40svmmugfM3mUN7VUDGVE1tQGOhyi8enlGD0CNJEcMM36C1f71PKM21DFgNHUfem0XnA+d8H8oN3Z9ZpJjSslg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-is-hydrated": "0.1.1", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11883,20 +11633,20 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz", - "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.14.tgz", + "integrity": "sha512-bBODCWZK7JTbQLHs0uIP4f73wIWatakK4OS33UzkR1x897wu0PuO658a3f+6P2GEGyDzGYMuHRatMVoAk9WZTw==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -11914,32 +11664,33 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.6.tgz", - "integrity": "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.3.tgz", + "integrity": "sha512-L5RQTXz6Anxsf9CCv+pTgiAsUpyVj7rJxsGtmhFaEOJ++cVfXucv4qWfsIO0AIB4NAhi3yovWGVMKKS1Xf1Wrg==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-focus-guards": "1.1.3", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-focus-guards": "1.1.4", + "@radix-ui/react-focus-scope": "1.1.12", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.3", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.7", "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" + "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", @@ -11956,54 +11707,13 @@ } } }, - "node_modules/@radix-ui/react-select/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.8.tgz", - "integrity": "sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.11.tgz", + "integrity": "sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.4" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-separator/node_modules/@radix-ui/react-primitive": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", - "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.4" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -12021,22 +11731,22 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.6.tgz", - "integrity": "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.3.tgz", + "integrity": "sha512-CWVVj+XaTom0SKCqw1EUgb0NuiLwS+N3OFG73mVEezKEjgNIvZiu0EevMelSSU+CbX3owbqJweG2gPU31WGC5A==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/number": "1.1.2", + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12054,12 +11764,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", - "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", + "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -12072,18 +11782,18 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", - "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.3.tgz", + "integrity": "sha512-1+mlB4/lxJfk5tgJ4g+R5mUCbRpPE1T9+UsEyeLYbGgMtwiMgmuTnfKz4Mw1nHALHjuwyxw4MLd4cSHn6pNSlQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-previous": "1.1.2", + "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12101,19 +11811,19 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz", - "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.17.tgz", + "integrity": "sha512-nRyXnrAVCwjeXcHbvEbLS6ndbTeKHG1RqCP4A8Gw5L4cemDzPXdD8rAmr6wet0v57R69wGvuIIsFjHSVkZiMzQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -12131,23 +11841,23 @@ } }, "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", + "version": "1.2.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.19.tgz", + "integrity": "sha512-SxfVZfVOibWKWdkf0Xx1awW2d09fQu4V4PXDY1j5hi4MVf7MWdJZqTBJMa1KWtOr1S6GGtCk02nniZ0Iia+dHw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-collection": "1.1.12", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-callback-ref": "1.1.2", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-use-layout-effect": "1.1.2", + "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", @@ -12165,14 +11875,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", - "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.14.tgz", + "integrity": "sha512-QI/hB65XKWACA66P64A+aHxtLUgHJeJLkaQa+awUNXT6T3swndtY5DojeHA+vldrTspMTtFBd7HfZ9QGbM1Qrw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -12190,18 +11900,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.11.tgz", - "integrity": "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.15.tgz", + "integrity": "sha512-gIC5Q+Xljg7lmUdzSuDoy0t97yZn1sZl00Ra37ZvKrYdWnQLU6sWLd09yG8cIB9jUAlQfHgJ2ACAG00MFwsqSQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.11", - "@radix-ui/react-toggle": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-direction": "1.1.2", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-roving-focus": "1.1.15", + "@radix-ui/react-toggle": "1.1.14", + "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", @@ -12219,23 +11929,23 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.8.tgz", - "integrity": "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.12.tgz", + "integrity": "sha512-U3HoftgWnmla78vzQbLvKKb7bUYJxoiiqYFzp1wu/TBMyDqMZSuCl3aRICsD6EfVEwcJD2mumGDGUXLFVqQHKA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.8", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" + "@radix-ui/primitive": "1.1.5", + "@radix-ui/react-compose-refs": "1.1.3", + "@radix-ui/react-context": "1.2.0", + "@radix-ui/react-dismissable-layer": "1.1.15", + "@radix-ui/react-id": "1.1.2", + "@radix-ui/react-popper": "1.3.3", + "@radix-ui/react-portal": "1.1.13", + "@radix-ui/react-presence": "1.1.7", + "@radix-ui/react-primitive": "2.1.7", + "@radix-ui/react-slot": "1.3.0", + "@radix-ui/react-use-controllable-state": "1.2.3", + "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", @@ -12252,28 +11962,10 @@ } } }, - "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", + "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -12286,13 +11978,13 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", + "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-effect-event": "0.0.3", + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12305,30 +11997,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", + "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12341,13 +12015,10 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", + "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" @@ -12359,9 +12030,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", + "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -12374,9 +12045,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", + "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -12389,12 +12060,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", + "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.1" + "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12407,12 +12078,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", + "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" + "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", @@ -12425,12 +12096,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.7.tgz", + "integrity": "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.3" + "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", @@ -12448,293 +12119,30 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", + "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", "license": "MIT" }, - "node_modules/@react-email/body": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@react-email/body/-/body-0.2.0.tgz", - "integrity": "sha512-9GCWmVmKUAoRfloboCd+RKm6X17xn7eGL7HnpAZUnjBXBilWCxsKnLMTC/ixSHDKS/A/057M1Tx6ZUXd89sVBw==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/button": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@react-email/button/-/button-0.2.0.tgz", - "integrity": "sha512-8i+v6cMxr2emz4ihCrRiYJPp2/sdYsNNsBzXStlcA+/B9Umpm5Jj3WJKYpgTPM+aeyiqlG/MMI1AucnBm4f1oQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/code-block": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@react-email/code-block/-/code-block-0.2.0.tgz", - "integrity": "sha512-eIrPW9PIFgDopQU0e/OPpwCW2QWQDtNZDSsiN4sJO8KdMnWWnXJicnRfzrit5rHwFo+Y98i+w/Y5ScnBAFr1dQ==", - "license": "MIT", - "dependencies": { - "prismjs": "^1.30.0" - }, - "engines": { - "node": ">=22.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/code-inline": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@react-email/code-inline/-/code-inline-0.0.5.tgz", - "integrity": "sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/column": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@react-email/column/-/column-0.0.13.tgz", - "integrity": "sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/container": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@react-email/container/-/container-0.0.15.tgz", - "integrity": "sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/font": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@react-email/font/-/font-0.0.9.tgz", - "integrity": "sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/head": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@react-email/head/-/head-0.0.12.tgz", - "integrity": "sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/heading": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@react-email/heading/-/heading-0.0.15.tgz", - "integrity": "sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/hr": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/hr/-/hr-0.0.11.tgz", - "integrity": "sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/html": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/html/-/html-0.0.11.tgz", - "integrity": "sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/img": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@react-email/img/-/img-0.0.11.tgz", - "integrity": "sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/link": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@react-email/link/-/link-0.0.12.tgz", - "integrity": "sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/preview": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@react-email/preview/-/preview-0.0.13.tgz", - "integrity": "sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, "node_modules/@react-email/render": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-email/render/-/render-2.0.0.tgz", - "integrity": "sha512-rdjNj6iVzv8kRKDPFas+47nnoe6B40+nwukuXwY4FCwM7XBg6tmYr+chQryCuavUj2J65MMf6fztk1bxOUiSVA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-email/render/-/render-2.1.0.tgz", + "integrity": "sha512-F+zE3O6d6sW6Aj2UjvZAA17R7tJKM7kcq2mgV6k4HCT8jeLLFaVP2txMtH1lgqYFRMZ0Gxsd37q2PRyiXLXXxA==", "license": "MIT", "dependencies": { + "entities": "^4.5.0", "html-to-text": "^9.0.5", + "html5parser": "^3.0.0", "prettier": "^3.5.3" }, "engines": { - "node": ">=22.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" } }, - "node_modules/@react-email/row": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@react-email/row/-/row-0.0.12.tgz", - "integrity": "sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/section": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@react-email/section/-/section-0.0.16.tgz", - "integrity": "sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, - "node_modules/@react-email/tailwind": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@react-email/tailwind/-/tailwind-2.0.1.tgz", - "integrity": "sha512-/xq0IDYVY7863xPY7cdI45Xoz7M6CnIQBJcQvbqN7MNVpopfH9f+mhjayV1JGfKaxlGWuxfLKhgi9T2shsnEFg==", - "license": "MIT", - "dependencies": { - "tailwindcss": "^4.1.12" - }, - "engines": { - "node": ">=22.0.0" - }, - "peerDependencies": { - "@react-email/body": "0.2.0", - "@react-email/button": "0.2.0", - "@react-email/code-block": "0.2.0", - "@react-email/code-inline": "0.0.5", - "@react-email/container": "0.0.15", - "@react-email/heading": "0.0.15", - "@react-email/hr": "0.0.11", - "@react-email/img": "0.0.11", - "@react-email/link": "0.0.12", - "@react-email/preview": "0.0.13", - "@react-email/text": "0.1.5", - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@react-email/body": { - "optional": true - }, - "@react-email/button": { - "optional": true - }, - "@react-email/code-block": { - "optional": true - }, - "@react-email/code-inline": { - "optional": true - }, - "@react-email/container": { - "optional": true - }, - "@react-email/heading": { - "optional": true - }, - "@react-email/hr": { - "optional": true - }, - "@react-email/img": { - "optional": true - }, - "@react-email/link": { - "optional": true - }, - "@react-email/preview": { - "optional": true - } - } - }, - "node_modules/@react-email/tailwind/node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", - "license": "MIT" - }, - "node_modules/@react-email/text": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@react-email/text/-/text-0.1.5.tgz", - "integrity": "sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "react": "^18.0 || ^19.0 || ^19.0.0-rc" - } - }, "node_modules/@react-router/dev": { "version": "7.18.1", "resolved": "https://registry.npmjs.org/@react-router/dev/-/dev-7.18.1.tgz", @@ -14811,43 +14219,48 @@ } }, "node_modules/@trpc/client": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.8.1.tgz", - "integrity": "sha512-L/SJFGanr9xGABmuDoeXR4xAdHJmsXsiF9OuH+apecJ+8sUITzVT1EPeqp0ebqA6lBhEl5pPfg3rngVhi/h60Q==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/@trpc/client/-/client-11.17.0.tgz", + "integrity": "sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", + "bin": { + "intent": "bin/intent.js" + }, "peerDependencies": { - "@trpc/server": "11.8.1", + "@trpc/server": "11.17.0", "typescript": ">=5.7.2" } }, "node_modules/@trpc/react-query": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.8.1.tgz", - "integrity": "sha512-0Vu55ld/oINb4U6nIPPi7eZMhxUop6K+4QUK90RVsfSD5r+957sM80M4c8bjh/JBZUxMFv9JOhxxlWcrgHxHow==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/@trpc/react-query/-/react-query-11.17.0.tgz", + "integrity": "sha512-AGcl5YAF8NnhBmyJ6PqJqKb1M5VTGSoNRNqJ3orct4o4epdcg0GWhW+qT9q6gPzs/2ImIwYCdfFpgNGdZ9yLHA==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", "peerDependencies": { "@tanstack/react-query": "^5.80.3", - "@trpc/client": "11.8.1", - "@trpc/server": "11.8.1", + "@trpc/client": "11.17.0", + "@trpc/server": "11.17.0", "react": ">=18.2.0", - "react-dom": ">=18.2.0", "typescript": ">=5.7.2" } }, "node_modules/@trpc/server": { - "version": "11.8.1", - "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.8.1.tgz", - "integrity": "sha512-P4rzZRpEL7zDFgjxK65IdyH0e41FMFfTkQkuq0BA5tKcr7E6v9/v38DEklCpoDN6sPiB1Sigy/PUEzHENhswDA==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/@trpc/server/-/server-11.17.0.tgz", + "integrity": "sha512-jbAOUe0PpUTCYqziyu+8vYXZdDXPudZgnEhWCQ2NjKnVEjfE93RqHTt1oycZJv/HNf51YlRXfEEwSIAbb161rw==", "funding": [ "https://trpc.io/sponsor" ], "license": "MIT", + "bin": { + "intent": "bin/intent.js" + }, "peerDependencies": { "typescript": ">=5.7.2" } @@ -15423,18 +14836,6 @@ "@types/unist": "*" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", - "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", - "license": "MIT", - "dependencies": { - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "@types/react": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -15580,30 +14981,23 @@ "@types/node": "*" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.2.0" } }, "node_modules/@types/resolve": { @@ -15652,9 +15046,9 @@ "license": "MIT" }, "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, "node_modules/@types/ws": { @@ -16904,6 +16298,7 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -17062,6 +16457,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, "license": "MIT", "dependencies": { "restore-cursor": "^5.0.0" @@ -17077,6 +16473,7 @@ "version": "2.9.2", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -17270,266 +16667,19 @@ } }, "node_modules/cmdk": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz", - "integrity": "sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz", + "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==", "license": "MIT", "dependencies": { - "@radix-ui/react-dialog": "1.0.0" + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", - "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", - "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", - "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz", - "integrity": "sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-context": "1.0.0", - "@radix-ui/react-dismissable-layer": "1.0.0", - "@radix-ui/react-focus-guards": "1.0.0", - "@radix-ui/react-focus-scope": "1.0.0", - "@radix-ui/react-id": "1.0.0", - "@radix-ui/react-portal": "1.0.0", - "@radix-ui/react-presence": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-slot": "1.0.0", - "@radix-ui/react-use-controllable-state": "1.0.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.4" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz", - "integrity": "sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.0", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0", - "@radix-ui/react-use-escape-keydown": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz", - "integrity": "sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz", - "integrity": "sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-primitive": "1.0.0", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz", - "integrity": "sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz", - "integrity": "sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", - "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0", - "@radix-ui/react-use-layout-effect": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz", - "integrity": "sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz", - "integrity": "sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", - "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz", - "integrity": "sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz", - "integrity": "sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.0" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", - "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0" - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz", - "integrity": "sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "node_modules/co-body": { @@ -18192,6 +17342,19 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -20573,6 +19736,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -20715,6 +19879,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "foreground-child": "^3.3.1", @@ -20750,6 +19915,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" @@ -20759,6 +19925,7 @@ "version": "5.0.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -20771,6 +19938,7 @@ "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" @@ -21288,21 +20456,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/hono": { "version": "4.12.27", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", @@ -21380,6 +20533,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/html5parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html5parser/-/html5parser-3.0.0.tgz", + "integrity": "sha512-iNpSopa+4YHX50UOk825tBy7MghmXHo/ZpLskBYN0kAr1xhH8GlIMk5bLRXcZlfP3AnLUcSuFMu8C4MdOUxA8A==", + "license": "MIT" + }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -22085,6 +21244,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^9.0.0" @@ -22100,6 +21260,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", + "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=18" @@ -22180,9 +21341,9 @@ } }, "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -23660,6 +22821,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -23669,12 +22836,6 @@ "node": ">= 0.6" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, "node_modules/meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", @@ -25505,6 +24666,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, "license": "MIT", "dependencies": { "mimic-function": "^5.0.0" @@ -26216,6 +25378,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/picospinner": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/picospinner/-/picospinner-3.0.0.tgz", + "integrity": "sha512-lGA1TNsmy2bxvRsTI2cV01kfTwKzZjnZSDmF9llYNyMHMrU4sP87lQ5taiIKm88L3cbswjl008nwyGc3WpNvzg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", @@ -27209,13 +26380,10 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -27254,18 +26422,23 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.7" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/react-draggable": { "version": "4.4.6", "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", @@ -27297,6 +26470,726 @@ "react": ">= 16.8 || 18.0.0" } }, + "node_modules/react-email": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-email/-/react-email-6.9.0.tgz", + "integrity": "sha512-72jV+VkeeXgNWDycNDn2tIlHFLg4Hevi3pC77g63FAY1+bDgTs4b56jbZfHF1t5d+GVGb02sGS8bOwoptgvI1w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "7.29.2", + "@babel/traverse": "7.29.0", + "@react-email/render": ">=2.1.0", + "chokidar": "^4.0.3", + "commander": "^13.0.0", + "conf": "^15.0.2", + "css-tree": "3.2.1", + "debounce": "^2.0.0", + "esbuild": "^0.28.0", + "glob": "^13.0.6", + "jiti": "2.6.1", + "log-symbols": "^7.0.0", + "marked": "^15.0.12", + "mime-types": "^3.0.0", + "normalize-path": "^3.0.0", + "nypm": "0.6.6", + "picospinner": "^3.0.0", + "prismjs": "^1.30.0", + "prompts": "2.4.2", + "socket.io": "^4.8.1", + "tailwindcss": "^4.1.18", + "tsconfig-paths": "4.2.0" + }, + "bin": { + "email": "dist/cli/index.mjs" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": "^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" + } + }, + "node_modules/react-email/node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/react-email/node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/react-email/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/react-email/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/react-email/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/react-email/node_modules/citty": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.2.tgz", + "integrity": "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==", + "license": "MIT" + }, + "node_modules/react-email/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/react-email/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-email/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-email/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/react-email/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/react-email/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react-email/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/react-email/node_modules/nypm": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.6.tgz", + "integrity": "sha512-vRyr0r4cbBapw07Xw8xrj9Teq3o7MUD35rSaTcanDbW+aK2XHDgJFiU6ZTj2GBw7Q12ysdsyFss+Vdz4hQ0Y6Q==", + "license": "MIT", + "dependencies": { + "citty": "^0.2.2", + "pathe": "^2.0.3", + "tinyexec": "^1.1.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/react-email/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/react-email/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/react-email/node_modules/tailwindcss": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", + "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "license": "MIT" + }, "node_modules/react-hook-form": { "version": "7.66.1", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.1.tgz", @@ -27370,39 +27263,23 @@ "license": "MIT" }, "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, "redux": { "optional": true } @@ -27777,13 +27654,10 @@ } }, "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" }, "node_modules/reflect-metadata": { "version": "0.2.2", @@ -28113,6 +27987,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, "license": "MIT", "dependencies": { "onetime": "^7.0.0", @@ -28389,15 +28264,6 @@ "node": ">=16" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -29025,18 +28891,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", @@ -30088,6 +29942,20 @@ } } }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -30961,15 +30829,6 @@ } } }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/use-sidecar": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", @@ -32443,7 +32302,7 @@ "arctic": "^3.7.0", "hono": "^4.12.14", "luxon": "^3.7.2", - "react": "^18", + "react": "^19.2.7", "ts-pattern": "^5.9.0", "zod": "^3.25.76" } @@ -32455,27 +32314,9 @@ "dependencies": { "@documenso/nodemailer-resend": "5.0.0", "@documenso/tailwind-config": "*", - "@react-email/body": "0.2.0", - "@react-email/button": "0.2.0", - "@react-email/code-block": "0.2.0", - "@react-email/code-inline": "0.0.5", - "@react-email/column": "0.0.13", - "@react-email/container": "0.0.15", - "@react-email/font": "0.0.9", - "@react-email/head": "0.0.12", - "@react-email/heading": "0.0.15", - "@react-email/hr": "0.0.11", - "@react-email/html": "0.0.11", - "@react-email/img": "0.0.11", - "@react-email/link": "0.0.12", - "@react-email/preview": "0.0.13", - "@react-email/render": "2.0.0", - "@react-email/row": "0.0.12", - "@react-email/section": "0.0.16", - "@react-email/tailwind": "^2.0.1", - "@react-email/text": "0.1.5", + "@react-email/render": "2.1.0", "nodemailer": "^9.0.0", - "react-email": "^5.0.6", + "react-email": "^6.9.0", "resend": "^6.5.2" }, "devDependencies": { @@ -32483,720 +32324,6 @@ "@types/nodemailer": "^8.0.1" } }, - "packages/email/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "packages/email/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "packages/email/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "packages/email/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "packages/email/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "packages/email/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "packages/email/node_modules/log-symbols": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", - "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", - "license": "MIT", - "dependencies": { - "is-unicode-supported": "^2.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "packages/email/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "packages/email/node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/react-email": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/react-email/-/react-email-5.0.6.tgz", - "integrity": "sha512-DEGzWpEiC3CquPEaaEJuipNT3WZ9mK58rbkpOe4Slbgyf60PLa1wONnt5a3afbBBRbNdW2aYhIvVI41yS6UIRA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/traverse": "^7.27.0", - "chokidar": "^4.0.3", - "commander": "^13.0.0", - "conf": "^15.0.2", - "debounce": "^2.0.0", - "esbuild": "^0.25.0", - "glob": "^11.0.0", - "jiti": "2.4.2", - "log-symbols": "^7.0.0", - "mime-types": "^3.0.0", - "normalize-path": "^3.0.0", - "nypm": "0.6.0", - "ora": "^8.0.0", - "prompts": "2.4.2", - "socket.io": "^4.8.1", - "tsconfig-paths": "4.2.0" - }, - "bin": { - "email": "dist/index.js" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "packages/email/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "packages/email/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/email/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "packages/email/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "packages/eslint-config": { "name": "@documenso/eslint-config", "version": "0.0.0", @@ -33268,7 +32395,7 @@ "postcss-selector-parser": "^7.1.4", "posthog-js": "^1.297.2", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", "remeda": "^2.32.0", "sharp": "0.34.5", "stripe": "^12.18.0", @@ -33869,9 +32996,9 @@ "@documenso/prisma": "*", "@simplewebauthn/server": "^13.2.2", "@tanstack/react-query": "5.90.10", - "@trpc/client": "11.8.1", - "@trpc/react-query": "11.8.1", - "@trpc/server": "11.8.1", + "@trpc/client": "11.17.0", + "@trpc/react-query": "11.17.0", + "@trpc/server": "11.17.0", "@ts-rest/core": "^3.52.1", "formidable": "^3.5.4", "luxon": "^3.7.2", @@ -33897,52 +33024,25 @@ "license": "MIT", "dependencies": { "@documenso/lib": "*", - "@hello-pangea/dnd": "^16.6.0", + "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^3", "@lingui/macro": "^5.6.0", "@lingui/react": "^5.6.0", - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-aspect-ratio": "^1.1.8", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.16", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-hover-card": "^1.1.15", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-menubar": "^1.1.16", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-toggle-group": "^1.1.11", - "@radix-ui/react-tooltip": "^1.2.8", "@scure/base": "^1.2.6", "@tanstack/react-table": "^8.21.3", "class-variance-authority": "^0.7.1", "clsx": "^1.2.1", - "cmdk": "^0.2.1", + "cmdk": "^1.1.1", "colord": "^2.9.3", "framer-motion": "^12.43.0", "lucide-react": "^0.554.0", "luxon": "^3.7.2", "pdfjs-dist": "5.4.296", "perfect-freehand": "^1.2.2", - "react": "^18", + "react": "^19.2.7", "react-colorful": "^5.6.1", "react-day-picker": "^8.10.1", - "react-dom": "^18", + "react-dom": "^19.2.7", "react-hook-form": "^7.66.1", "react-rnd": "^10.5.2", "remeda": "^2.32.0", @@ -33955,9 +33055,9 @@ "@documenso/tailwind-config": "*", "@documenso/tsconfig": "*", "@types/luxon": "^3.7.1", - "@types/react": "18.3.27", - "@types/react-dom": "^18", - "react": "^18", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "react": "^19.2.7", "typescript": "5.6.2" } } diff --git a/package.json b/package.json index d4382924d..6e012a297 100644 --- a/package.json +++ b/package.json @@ -48,15 +48,17 @@ }, "devDependencies": { "@biomejs/biome": "2.4.8", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "@commitlint/cli": "^20.1.0", "@commitlint/config-conventional": "^20.0.0", "@datadog/pprof": "^5.13.5", "@documenso/skia-canvas": "^3.0.8-documenso.3", "@lingui/cli": "^5.6.0", "@prisma/client": "^6.19.0", - "@trpc/client": "11.8.1", - "@trpc/react-query": "11.8.1", - "@trpc/server": "11.8.1", + "@trpc/client": "11.17.0", + "@trpc/react-query": "11.17.0", + "@trpc/server": "11.17.0", "@ts-rest/core": "^3.52.1", "@ts-rest/open-api": "^3.52.1", "@ts-rest/serverless": "^3.52.1", @@ -93,13 +95,41 @@ "@lingui/conf": "^5.6.0", "@lingui/core": "^5.6.0", "@prisma/extension-read-replicas": "^0.4.1", + "@radix-ui/react-accordion": "^1.2.16", + "@radix-ui/react-alert-dialog": "^1.1.19", + "@radix-ui/react-aspect-ratio": "^1.1.11", + "@radix-ui/react-avatar": "^1.2.2", + "@radix-ui/react-checkbox": "^1.3.7", + "@radix-ui/react-collapsible": "^1.1.16", + "@radix-ui/react-context-menu": "^2.3.3", + "@radix-ui/react-dialog": "^1.1.19", + "@radix-ui/react-dropdown-menu": "^2.1.20", + "@radix-ui/react-hover-card": "^1.1.19", + "@radix-ui/react-label": "^2.1.11", + "@radix-ui/react-menubar": "^1.1.20", + "@radix-ui/react-navigation-menu": "^1.2.18", + "@radix-ui/react-popover": "^1.1.19", + "@radix-ui/react-progress": "^1.1.12", + "@radix-ui/react-radio-group": "^1.4.3", + "@radix-ui/react-scroll-area": "^1.2.14", + "@radix-ui/react-select": "^2.3.3", + "@radix-ui/react-separator": "^1.1.11", + "@radix-ui/react-slider": "^1.4.3", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-switch": "^1.3.3", + "@radix-ui/react-tabs": "^1.1.17", + "@radix-ui/react-toast": "^1.2.19", + "@radix-ui/react-toggle": "^1.1.14", + "@radix-ui/react-toggle-group": "^1.1.15", + "@radix-ui/react-tooltip": "^1.2.12", "ai": "^5.0.104", "cron-parser": "^5.5.0", "fflate": "^0.8.3", "luxon": "^3.7.2", "patch-package": "^8.0.1", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", + "react-dom": "^19.2.7", "typescript": "5.6.2", "@marsidev/react-turnstile": "^1.5.0", "zod": "^3.25.76" @@ -108,6 +138,10 @@ "lodash": "4.18.1", "pdfjs-dist": "5.4.296", "postcss": "^8.5.19", + "react": "$react", + "react-dom": "$react-dom", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "typescript": "5.6.2", "zod": "$zod", "fumadocs-mdx": { diff --git a/packages/ee/package.json b/packages/ee/package.json index 79cc3ba85..e27566f09 100644 --- a/packages/ee/package.json +++ b/packages/ee/package.json @@ -19,7 +19,7 @@ "arctic": "^3.7.0", "hono": "^4.12.14", "luxon": "^3.7.2", - "react": "^18", + "react": "^19.2.7", "ts-pattern": "^5.9.0", "zod": "^3.25.76" } diff --git a/packages/email/components.ts b/packages/email/components.ts index 3765e7190..1cb660b3c 100644 --- a/packages/email/components.ts +++ b/packages/email/components.ts @@ -1,17 +1,19 @@ -export { Body } from '@react-email/body'; -export { Button } from '@react-email/button'; -export { Column } from '@react-email/column'; -export { Container } from '@react-email/container'; -export { Font } from '@react-email/font'; -export { Head } from '@react-email/head'; -export { Heading } from '@react-email/heading'; -export { Hr } from '@react-email/hr'; -export { Html } from '@react-email/html'; -export { Img } from '@react-email/img'; -export { Link } from '@react-email/link'; -export { Preview } from '@react-email/preview'; -export { render } from '@react-email/render'; -export { Row } from '@react-email/row'; -export { Section } from '@react-email/section'; -export { Tailwind } from '@react-email/tailwind'; -export { Text } from '@react-email/text'; +export { + Body, + Button, + Column, + Container, + Font, + Head, + Heading, + Hr, + Html, + Img, + Link, + Preview, + Row, + render, + Section, + Tailwind, + Text, +} from 'react-email'; diff --git a/packages/email/package.json b/packages/email/package.json index 33426f9e5..e5ff68787 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -19,27 +19,9 @@ "dependencies": { "@documenso/nodemailer-resend": "5.0.0", "@documenso/tailwind-config": "*", - "@react-email/body": "0.2.0", - "@react-email/button": "0.2.0", - "@react-email/code-block": "0.2.0", - "@react-email/code-inline": "0.0.5", - "@react-email/column": "0.0.13", - "@react-email/container": "0.0.15", - "@react-email/font": "0.0.9", - "@react-email/head": "0.0.12", - "@react-email/heading": "0.0.15", - "@react-email/hr": "0.0.11", - "@react-email/html": "0.0.11", - "@react-email/img": "0.0.11", - "@react-email/link": "0.0.12", - "@react-email/preview": "0.0.13", - "@react-email/render": "2.0.0", - "@react-email/row": "0.0.12", - "@react-email/section": "0.0.16", - "@react-email/tailwind": "^2.0.1", - "@react-email/text": "0.1.5", + "@react-email/render": "2.1.0", "nodemailer": "^9.0.0", - "react-email": "^5.0.6", + "react-email": "^6.9.0", "resend": "^6.5.2" }, "devDependencies": { diff --git a/packages/lib/client-only/hooks/use-autosave.ts b/packages/lib/client-only/hooks/use-autosave.ts index 66e047482..8e2dee450 100644 --- a/packages/lib/client-only/hooks/use-autosave.ts +++ b/packages/lib/client-only/hooks/use-autosave.ts @@ -8,7 +8,7 @@ type SaveRequest = { export const useAutoSave = (onSave: (data: T) => Promise, options: { delay?: number } = {}) => { const { delay = 2000 } = options; - const saveTimeoutRef = useRef(); + const saveTimeoutRef = useRef(undefined); const saveQueueRef = useRef[]>([]); const isProcessingRef = useRef(false); diff --git a/packages/lib/client-only/providers/envelope-editor-provider.tsx b/packages/lib/client-only/providers/envelope-editor-provider.tsx index e61ed7ae0..ea49f638c 100644 --- a/packages/lib/client-only/providers/envelope-editor-provider.tsx +++ b/packages/lib/client-only/providers/envelope-editor-provider.tsx @@ -15,7 +15,7 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; import { useLingui } from '@lingui/react/macro'; import { EnvelopeType, Prisma, ReadStatus, SendStatus, SigningStatus } from '@prisma/client'; import type React from 'react'; -import { createContext, useCallback, useContext, useMemo, useRef, useState } from 'react'; +import { createContext, useCallback, useContext, useMemo, useRef, useState, useSyncExternalStore } from 'react'; import { useSearchParams } from 'react-router'; import type { TDocumentEmailSettings } from '../../types/document-email'; @@ -107,7 +107,39 @@ export const EnvelopeEditorProvider = ({ const [_searchParams, setSearchParams] = useSearchParams(); - const [envelope, _setEnvelope] = useState(initialEnvelope); + /** + * The envelope is kept in a ref-backed external store instead of useState so + * that async consumers (debounced autosave callbacks, flushAutosave, resetForms) + * can synchronously read the latest value via `getEnvelope`. + * + * React subscribes to the store through useSyncExternalStore, keeping renders in + * sync without maintaining a separate copy of the state. + */ + const envelopeStoreRef = useRef(initialEnvelope); + const envelopeStoreSubscribersRef = useRef(new Set<() => void>()); + + const subscribeToEnvelopeStore = useCallback((onStoreChange: () => void) => { + envelopeStoreSubscribersRef.current.add(onStoreChange); + + return () => { + envelopeStoreSubscribersRef.current.delete(onStoreChange); + }; + }, []); + + const getEnvelope = useCallback(() => envelopeStoreRef.current, []); + + const setEnvelope = useCallback((action: React.SetStateAction) => { + const next = typeof action === 'function' ? action(envelopeStoreRef.current) : action; + + envelopeStoreRef.current = next; + + for (const onStoreChange of envelopeStoreSubscribersRef.current) { + onStoreChange(); + } + }, []); + + const envelope = useSyncExternalStore(subscribeToEnvelopeStore, getEnvelope, getEnvelope); + const [autosaveError, setAutosaveError] = useState(false); const isCscMode = IS_INSTANCE_CSC_MODE(); @@ -135,8 +167,6 @@ export const EnvelopeEditorProvider = ({ }; }, [isCscMode, providedEditorConfig]); - const envelopeRef = useRef(initialEnvelope); - const externalFlushCallbacksRef = useRef Promise>>(new Map()); const pendingMutationsRef = useRef>>(new Set()); @@ -156,14 +186,6 @@ export const EnvelopeEditorProvider = ({ }); }, []); - const setEnvelope: typeof _setEnvelope = (action) => { - _setEnvelope((prev) => { - const next = typeof action === 'function' ? action(prev) : action; - envelopeRef.current = next; - return next; - }); - }; - const isEmbedded = editorConfig.embedded !== undefined; const editorFields = useEditorFields({ @@ -192,16 +214,18 @@ export const EnvelopeEditorProvider = ({ try { let recipients: TEditorEnvelope['recipients'] = []; + const currentEnvelope = getEnvelope(); + if (!isEmbedded) { const response = await setRecipientsMutation.mutateAsync({ - envelopeId: envelope.id, - envelopeType: envelope.type, + envelopeId: currentEnvelope.id, + envelopeType: currentEnvelope.type, recipients: localRecipients, }); recipients = response.data; } else { - recipients = mapLocalRecipientsToRecipients({ envelope, localRecipients }); + recipients = mapLocalRecipientsToRecipients({ envelope: currentEnvelope, localRecipients }); } setEnvelope((prev) => ({ @@ -211,9 +235,7 @@ export const EnvelopeEditorProvider = ({ })); // Reset the local fields to ensure deleted recipient fields are removed. - editorFields.resetForm( - envelope.fields.filter((field) => recipients.some((recipient) => recipient.id === field.recipientId)), - ); + editorFields.resetForm(getEnvelope().fields); setAutosaveError(false); } catch (err) { @@ -248,16 +270,18 @@ export const EnvelopeEditorProvider = ({ try { let fields: TSetEnvelopeFieldsResponse['data'] = []; + const currentEnvelope = getEnvelope(); + if (!isEmbedded) { const response = await setFieldsMutation.mutateAsync({ - envelopeId: envelope.id, - envelopeType: envelope.type, + envelopeId: currentEnvelope.id, + envelopeType: currentEnvelope.type, fields: localFields, }); fields = response.data; } else { - fields = mapLocalFieldsToFields({ envelope, localFields }); + fields = mapLocalFieldsToFields({ envelope: currentEnvelope, localFields }); } setEnvelope((prev) => ({ @@ -309,7 +333,7 @@ export const EnvelopeEditorProvider = ({ try { const response = !isEmbedded ? await updateEnvelopeMutation.mutateAsync({ - envelopeId: envelope.id, + envelopeId: getEnvelope().id, data, meta, }) @@ -467,12 +491,14 @@ export const EnvelopeEditorProvider = ({ }; const resetForms = () => { + const currentEnvelope = getEnvelope(); + editorRecipients.resetForm({ - recipients: envelopeRef.current.recipients, - documentMeta: envelopeRef.current.documentMeta, + recipients: currentEnvelope.recipients, + documentMeta: currentEnvelope.documentMeta, }); - editorFields.resetForm(envelopeRef.current.fields); + editorFields.resetForm(currentEnvelope.fields); }; const flushAutosave = async (): Promise => { @@ -488,7 +514,7 @@ export const EnvelopeEditorProvider = ({ await Promise.allSettled(Array.from(pendingMutationsRef.current)); } - return envelopeRef.current; + return getEnvelope(); }; return ( diff --git a/packages/lib/package.json b/packages/lib/package.json index 27092f178..ab1f0a836 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -65,7 +65,7 @@ "postcss-selector-parser": "^7.1.4", "posthog-js": "^1.297.2", "posthog-node": "4.18.0", - "react": "^18", + "react": "^19.2.7", "remeda": "^2.32.0", "sharp": "0.34.5", "stripe": "^12.18.0", diff --git a/packages/trpc/package.json b/packages/trpc/package.json index f68701096..5ffcec7fb 100644 --- a/packages/trpc/package.json +++ b/packages/trpc/package.json @@ -12,9 +12,9 @@ "@documenso/prisma": "*", "@simplewebauthn/server": "^13.2.2", "@tanstack/react-query": "5.90.10", - "@trpc/client": "11.8.1", - "@trpc/react-query": "11.8.1", - "@trpc/server": "11.8.1", + "@trpc/client": "11.17.0", + "@trpc/react-query": "11.17.0", + "@trpc/server": "11.17.0", "@ts-rest/core": "^3.52.1", "formidable": "^3.5.4", "luxon": "^3.7.2", diff --git a/packages/ui/components/signing-card.tsx b/packages/ui/components/signing-card.tsx index c372a8bc7..a7f731910 100644 --- a/packages/ui/components/signing-card.tsx +++ b/packages/ui/components/signing-card.tsx @@ -35,7 +35,7 @@ export const SigningCard3D = ({ className, name, signature, signingCelebrationIm const [trackMouse, setTrackMouse] = useState(false); - const timeoutRef = useRef(); + const timeoutRef = useRef(undefined); const cardX = useMotionValue(0); const cardY = useMotionValue(0); diff --git a/packages/ui/package.json b/packages/ui/package.json index 85472a456..70f51658d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -18,59 +18,32 @@ "@documenso/tailwind-config": "*", "@documenso/tsconfig": "*", "@types/luxon": "^3.7.1", - "@types/react": "18.3.27", - "@types/react-dom": "^18", - "react": "^18", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "react": "^19.2.7", "typescript": "5.6.2" }, "dependencies": { "@documenso/lib": "*", - "@hello-pangea/dnd": "^16.6.0", + "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^3", "@lingui/macro": "^5.6.0", "@lingui/react": "^5.6.0", - "@radix-ui/react-accordion": "^1.2.12", - "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-aspect-ratio": "^1.1.8", - "@radix-ui/react-avatar": "^1.1.11", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.16", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-hover-card": "^1.1.15", - "@radix-ui/react-label": "^2.1.8", - "@radix-ui/react-menubar": "^1.1.16", - "@radix-ui/react-navigation-menu": "^1.2.14", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-progress": "^1.1.8", - "@radix-ui/react-radio-group": "^1.3.8", - "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-separator": "^1.1.8", - "@radix-ui/react-slider": "^1.3.6", - "@radix-ui/react-slot": "^1.2.4", - "@radix-ui/react-switch": "^1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-toggle-group": "^1.1.11", - "@radix-ui/react-tooltip": "^1.2.8", "@scure/base": "^1.2.6", "@tanstack/react-table": "^8.21.3", "class-variance-authority": "^0.7.1", "clsx": "^1.2.1", - "cmdk": "^0.2.1", + "cmdk": "^1.1.1", "colord": "^2.9.3", "framer-motion": "^12.43.0", "lucide-react": "^0.554.0", "luxon": "^3.7.2", "pdfjs-dist": "5.4.296", "perfect-freehand": "^1.2.2", - "react": "^18", + "react": "^19.2.7", "react-colorful": "^5.6.1", "react-day-picker": "^8.10.1", - "react-dom": "^18", + "react-dom": "^19.2.7", "react-hook-form": "^7.66.1", "react-rnd": "^10.5.2", "remeda": "^2.32.0", diff --git a/packages/ui/primitives/command.tsx b/packages/ui/primitives/command.tsx index d38038216..8ea7ebbd3 100644 --- a/packages/ui/primitives/command.tsx +++ b/packages/ui/primitives/command.tsx @@ -145,7 +145,9 @@ const CommandItem = React.forwardRef< { ) { return (
- + {field.fieldMeta.values.map((item, index) => (
- + {item.value && (
); From 05f646b326c558edfd920ff1db5836da6680b2fb Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Wed, 19 Aug 2026 09:28:23 +0000 Subject: [PATCH 10/20] docs(api): document rate limit headers and 429 variants (#3133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The rate limits page claimed "No rate limit headers are currently provided" and advised a fixed 60-second wait. The middleware has been setting standard headers on every API response. ## Changes Made - Documented `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (Unix epoch seconds) on every `/api/v1`, `/api/v2`, and `/api/v2-beta` response, and `Retry-After` (seconds, min 1) on 429s. - Explained that windows are fixed epoch-aligned 1-minute buckets, so the real wait is 1–60s — clients should honor `Retry-After` instead of sleeping a fixed 60s. - Showed both 429 body shapes: the global per-IP limiter's `{ "error": ... }` vs AppError-based `code`/`message`/`statusCode`. - Covered the three distinct 429 sources: global per-IP limit, organisation windowed limits, and monthly envelope quota (which sends no rate-limit headers). - Added `/api/v2-beta/*` to the documented scope; left the verified-correct 1000/min figure and plan-limits table untouched. ## Testing Performed Docs-only change. Verified against `rate-limit-middleware.ts`, `rate-limit.ts`, `check-organisation-rate-limits.ts`, `check-monthly-quota.ts`, and the remix server router. --- .../docs/developers/api/rate-limits.mdx | 77 +++++++++++++++---- .../developers/examples/common-workflows.mdx | 7 +- 2 files changed, 68 insertions(+), 16 deletions(-) diff --git a/apps/docs/content/docs/developers/api/rate-limits.mdx b/apps/docs/content/docs/developers/api/rate-limits.mdx index 95b0a68fe..878db97b6 100644 --- a/apps/docs/content/docs/developers/api/rate-limits.mdx +++ b/apps/docs/content/docs/developers/api/rate-limits.mdx @@ -11,6 +11,12 @@ Documenso enforces rate limits on all API endpoints to ensure service stability. ## HTTP Rate Limits +The rate limit applies to: + +- `/api/v1/*` +- `/api/v2/*` +- `/api/v2-beta/*` + **Limit:** 1000 requests per minute per IP address **Response:** 429 Too Many Requests @@ -19,7 +25,7 @@ Documenso enforces rate limits on all API endpoints to ensure service stability. this value, in which case you can be rate-limited before reaching the global limit. -### Rate Limit Response +### Global per-IP 429 Response ```json { @@ -27,10 +33,22 @@ Documenso enforces rate limits on all API endpoints to ensure service stability. } ``` - - No rate limit headers are currently provided. When you receive a 429 response, wait at least 60 - seconds before retrying. - +### Rate Limit Headers + +Responses from `/api/v1/*`, `/api/v2/*`, and `/api/v2-beta/*` include these headers. The only +exception is CORS preflight (`OPTIONS`) requests, which are answered before the rate limiter runs +and carry no rate limit headers: + +| Header | Description | +| ----------------------- | ---------------------------------------------------------------------- | +| `X-RateLimit-Limit` | Maximum requests allowed in the current global window | +| `X-RateLimit-Remaining` | Requests remaining in the current global window | +| `X-RateLimit-Reset` | End of the current global window, as a Unix epoch timestamp in seconds | + +A 429 response from a windowed limiter also includes `Retry-After`, in seconds, with a minimum +value of `1`. The global API limit uses fixed, epoch-aligned one-minute buckets, so the actual wait +until the next window is between 1 and 60 seconds. Honor `Retry-After` exactly instead of sleeping +for a fixed 60 seconds. See the [Retry-After handling example](/docs/developers/examples/common-workflows#error-handling-patterns). ## Resource Limits @@ -44,24 +62,55 @@ Beyond HTTP rate limits, your account has usage limits based on your subscriptio | Total Recipients | 10 | Unlimited | Unlimited | Unlimited | | Direct Templates | 3 | Unlimited | Unlimited | Unlimited | -### Error Response +### Organisation Limit 429 Responses -When you exceed a resource limit: +Organisation windowed limits and organisation monthly quotas produce 429 responses whose body +shape depends on the API version, and neither matches the global per-IP limiter's +`{ "error": "..." }` body. + +On `/api/v1/*`, the body contains only a message: ```json { - "error": "You have reached your document limit for this month. Please upgrade your plan.", - "code": "LIMIT_EXCEEDED", - "statusCode": 400 + "message": "Too many requests, please try again later. Contact support if you require higher limits." } ``` +On `/api/v2/*` and `/api/v2-beta/*`, the body is a structured error object: + +```json +{ + "message": "Too many requests, please try again later. Contact support if you require higher limits.", + "code": "TOO_MANY_REQUESTS", + "data": { + "code": "TOO_MANY_REQUESTS", + "httpStatus": 429, + "appError": { + "code": "TOO_MANY_REQUESTS", + "message": "Too many requests, please try again later. Contact support if you require higher limits." + } + } +} +``` + +Organisation windowed limit responses include the `X-RateLimit-*` headers and `Retry-After` for +their own window. Monthly quota responses carry no quota-specific rate limit headers or +`Retry-After` because the quota is not a time window; rely on the status code and message instead. + ## Error Codes -| Code | Status | Description | -| ------------------- | ------ | ----------------------------- | -| `TOO_MANY_REQUESTS` | 429 | HTTP rate limit exceeded | -| `LIMIT_EXCEEDED` | 400 | Resource usage limit exceeded | +| Code | Status | Description | +| ------------------- | ------ | ------------------------------------------------------------------ | +| `TOO_MANY_REQUESTS` | 429 | Global per-IP, organisation windowed, or monthly quota exceeded | +| `LIMIT_EXCEEDED` | 400 | Resource usage limit exceeded | + +There are three sources of `TOO_MANY_REQUESTS` responses: + +1. The global per-IP limit, returning the `{ "error": "..." }` body shown above. +2. Organisation windowed rate limits for the `api`, `document`, and `email` counters. +3. Organisation monthly quotas for the same three counters. Every authenticated API request + consumes the `api` counter, so any endpoint can return this 429 once the monthly API quota is + exhausted — not just envelope-related ones. --- diff --git a/apps/docs/content/docs/developers/examples/common-workflows.mdx b/apps/docs/content/docs/developers/examples/common-workflows.mdx index 704bf415f..5bdf32cdf 100644 --- a/apps/docs/content/docs/developers/examples/common-workflows.mdx +++ b/apps/docs/content/docs/developers/examples/common-workflows.mdx @@ -1000,9 +1000,12 @@ async function fetchWithRetry( // Retry on rate limit if (response.status === 429) { const retryAfter = response.headers.get('Retry-After'); - const delay = retryAfter ? parseInt(retryAfter) * 1000 : baseDelayMs * Math.pow(2, attempt); + // Honor Retry-After exactly; the cap only applies to the exponential fallback. + const delay = retryAfter + ? parseInt(retryAfter) * 1000 + : Math.min(baseDelayMs * Math.pow(2, attempt), maxDelayMs); console.log(`Rate limited, waiting ${delay}ms...`); - await new Promise((resolve) => setTimeout(resolve, Math.min(delay, maxDelayMs))); + await new Promise((resolve) => setTimeout(resolve, delay)); continue; } From 914e325486561fe8bf23d8a949629681e2324da1 Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Wed, 19 Aug 2026 09:28:40 +0000 Subject: [PATCH 11/20] docs(trpc): add openapi descriptions to envelope cancel, delete and update routes (#3134) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description The envelope cancel, delete, and update routes rendered without descriptions in the generated OpenAPI reference. ## Changes Made - Added route-level OpenAPI `description` to `cancel-envelope.types.ts`, `delete-envelope.types.ts`, and `update-envelope.types.ts`. - Added field-level `.describe()` calls on request schemas, matching the style of sibling envelope-router schemas (e.g. `get-envelopes-by-ids.types.ts`, `distribute-envelope.types.ts`). ## Testing Performed `npx tsc --noEmit -p packages/trpc` passes with no errors. Metadata-only change — no runtime behavior affected. --- .../envelope-router/cancel-envelope.types.ts | 5 +++-- .../envelope-router/delete-envelope.types.ts | 3 ++- .../envelope-router/update-envelope.types.ts | 20 +++++++++++++------ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/trpc/server/envelope-router/cancel-envelope.types.ts b/packages/trpc/server/envelope-router/cancel-envelope.types.ts index 06a6637fb..59ab827c1 100644 --- a/packages/trpc/server/envelope-router/cancel-envelope.types.ts +++ b/packages/trpc/server/envelope-router/cancel-envelope.types.ts @@ -8,13 +8,14 @@ export const cancelEnvelopeMeta: TrpcRouteMeta = { method: 'POST', path: '/envelope/cancel', summary: 'Cancel envelope', + description: 'Cancel a pending envelope', tags: ['Envelope'], }, }; export const ZCancelEnvelopeRequestSchema = z.object({ - envelopeId: z.string(), - reason: z.string().optional(), + envelopeId: z.string().describe('The ID of the envelope to cancel.'), + reason: z.string().describe('The reason for cancelling the envelope.').optional(), }); export const ZCancelEnvelopeResponseSchema = ZSuccessResponseSchema; diff --git a/packages/trpc/server/envelope-router/delete-envelope.types.ts b/packages/trpc/server/envelope-router/delete-envelope.types.ts index 654d24c6d..8eaf7db9e 100644 --- a/packages/trpc/server/envelope-router/delete-envelope.types.ts +++ b/packages/trpc/server/envelope-router/delete-envelope.types.ts @@ -8,12 +8,13 @@ export const deleteEnvelopeMeta: TrpcRouteMeta = { method: 'POST', path: '/envelope/delete', summary: 'Delete envelope', + description: 'Delete an envelope', tags: ['Envelope'], }, }; export const ZDeleteEnvelopeRequestSchema = z.object({ - envelopeId: z.string(), + envelopeId: z.string().describe('The ID of the envelope to delete.'), }); export const ZDeleteEnvelopeResponseSchema = ZSuccessResponseSchema; diff --git a/packages/trpc/server/envelope-router/update-envelope.types.ts b/packages/trpc/server/envelope-router/update-envelope.types.ts index c08da086f..a4a89f9ea 100644 --- a/packages/trpc/server/envelope-router/update-envelope.types.ts +++ b/packages/trpc/server/envelope-router/update-envelope.types.ts @@ -12,24 +12,32 @@ export const updateEnvelopeMeta: TrpcRouteMeta = { method: 'POST', path: '/envelope/update', summary: 'Update envelope', + description: 'Update envelope properties and settings', tags: ['Envelope'], }, }; export const ZUpdateEnvelopeRequestSchema = z.object({ - envelopeId: z.string(), + envelopeId: z.string().describe('The ID of the envelope to update.'), data: z .object({ title: ZDocumentTitleSchema.optional(), externalId: ZDocumentExternalIdSchema.nullish(), visibility: ZDocumentVisibilitySchema.optional(), - globalAccessAuth: z.array(ZDocumentAccessAuthTypesSchema).optional(), - globalActionAuth: z.array(ZDocumentActionAuthTypesSchema).optional(), - folderId: z.string().nullish(), - templateType: z.nativeEnum(TemplateType).optional(), + globalAccessAuth: z + .array(ZDocumentAccessAuthTypesSchema) + .describe('The authentication methods required to access the envelope.') + .optional(), + globalActionAuth: z + .array(ZDocumentActionAuthTypesSchema) + .describe('The authentication methods required to sign the envelope.') + .optional(), + folderId: z.string().describe('The ID of the folder containing the envelope.').nullish(), + templateType: z.nativeEnum(TemplateType).describe('The template type.').optional(), }) + .describe('The envelope properties to update.') .optional(), - meta: ZDocumentMetaUpdateSchema.optional(), + meta: ZDocumentMetaUpdateSchema.describe('The email and signing settings to update.').optional(), }); export const ZUpdateEnvelopeResponseSchema = ZEnvelopeLiteSchema; From d42254ff52cd6257380f076022c41152b08ef60e Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Wed, 19 Aug 2026 09:28:55 +0000 Subject: [PATCH 12/20] docs(api): document cancel endpoint and fix get-many body shape (#3135) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Documents API page: adds the missing Cancel Document section and fixes a fabricated request body on get-many that would fail schema validation for anyone copying the docs. ## Changes Made - Added a `## Cancel Document` section: `POST /envelope/cancel` with `{ envelopeId, reason? }`, PENDING-only (400 otherwise), not idempotent, two-stage access (404 if not visible, 401 without owner/MANAGER+), fires `DOCUMENT_CANCELLED` webhook, emails only SENT/OPENED non-CC non-rejected recipients. - Replaced the fabricated `envelopeIds: [...]` get-many body with the real nested selector: `{ "ids": { "type": "envelopeId" | "documentId" | "templateId", "ids": [...] } }` (string[] for envelopeId, number[] otherwise, 1–20 IDs). - Added the missing `### Response` for get-many (`{ "data": [...] }`) and documented silent filtering of inaccessible IDs (no 404). - Added `CANCELLED` to the status table, mermaid state diagram, transitions prose, and filter values. - Removed the nonexistent `source: "API"` value (real enum: `DOCUMENT | TEMPLATE | TEMPLATE_DIRECT_LINK`). - Fixed fabricated `pagination` wrappers to the real flat shape `{ data, count, currentPage, perPage, totalPages }`; fixed Field `id` type and mismatched code fences. - Migration guide: warned that get-many's body shape changed from `documentIds: number[]` — the breaking part of that migration. ## Testing Performed Docs-only change (plus the migration guide). Verified against the envelope-router types, `cancel-document.ts`, the cancel e2e spec, and `schema.prisma`. --- .../content/docs/developers/api/documents.mdx | 233 ++++++++++++++---- .../developers/api/migrate-to-envelopes.mdx | 4 +- 2 files changed, 189 insertions(+), 48 deletions(-) diff --git a/apps/docs/content/docs/developers/api/documents.mdx b/apps/docs/content/docs/developers/api/documents.mdx index dbe2e6a85..bd526e828 100644 --- a/apps/docs/content/docs/developers/api/documents.mdx +++ b/apps/docs/content/docs/developers/api/documents.mdx @@ -28,35 +28,62 @@ Each document contains one or more PDF files, a list of recipients, and the fiel A document object contains the following properties: -| Property | Type | Description | -| --------------- | -------------- | -------------------------------------------------------------- | -| `id` | string | Unique identifier (e.g., `envelope_abc123`) | -| `type` | string | `DOCUMENT` or `TEMPLATE` | -| `status` | string | Current status: `DRAFT`, `PENDING`, `COMPLETED`, or `REJECTED` | -| `title` | string | Document title | -| `source` | string | How the document was created: `DOCUMENT`, `TEMPLATE`, `API` | -| `visibility` | string | Who can view: `EVERYONE`, `ADMIN`, `MANAGER_AND_ABOVE` | -| `externalId` | string \| null | Your custom identifier for the document | -| `createdAt` | string | ISO 8601 timestamp | -| `updatedAt` | string | ISO 8601 timestamp | -| `completedAt` | string \| null | Timestamp when all recipients completed signing | -| `deletedAt` | string \| null | Timestamp if soft-deleted | -| `recipients` | array | List of recipients and their signing status | -| `fields` | array | Signature and form fields on the document | -| `envelopeItems` | array | PDF files attached to the document | -| `documentMeta` | object | Email settings, redirect URL, signing options | +| Property | Type | Description | +| ------------------- | -------------- | -------------------------------------------------------------------------------------------- | +| `id` | string | Unique identifier (e.g., `envelope_abc123`) | +| `secondaryId` | string | Legacy identifier in prefixed form (`document_123` for documents, `template_123` for templates) | +| `internalVersion` | number | Internal envelope schema version | +| `type` | string | `DOCUMENT` or `TEMPLATE` | +| `status` | string | Current status: `DRAFT`, `PENDING`, `COMPLETED`, `REJECTED`, or `CANCELLED` | +| `title` | string | Document title | +| `source` | string | How the document was created: `DOCUMENT`, `TEMPLATE`, `TEMPLATE_DIRECT_LINK` | +| `visibility` | string | Who can view: `EVERYONE`, `ADMIN`, `MANAGER_AND_ABOVE` | +| `templateType` | string | Template visibility: `PUBLIC`, `PRIVATE`, or `ORGANISATION` (only meaningful for templates) | +| `externalId` | string \| null | Your custom identifier for the document | +| `userId` | number | ID of the user who owns the document | +| `teamId` | number | ID of the team the document belongs to | +| `folderId` | string \| null | ID of the folder containing the document | +| `templateId` | number \| null | Legacy ID of the template this document was created from | +| `authOptions` | object \| null | Access and action authentication requirements | +| `formValues` | object \| null | Pre-filled form values | +| `publicTitle` | string | Public title shown on profile and direct-link pages | +| `publicDescription` | string | Public description shown on profile and direct-link pages | +| `createdAt` | string | ISO 8601 timestamp | +| `updatedAt` | string | ISO 8601 timestamp | +| `completedAt` | string \| null | Timestamp when all recipients completed signing | +| `deletedAt` | string \| null | Timestamp if soft-deleted | +| `recipients` | array | List of recipients and their signing status | +| `fields` | array | Signature and form fields on the document | +| `envelopeItems` | array | PDF files attached to the document | +| `directLink` | object \| null | Direct-link signing configuration (`id`, `token`, `enabled`, `directTemplateRecipientId`) | +| `team` | object | Owning team (`id`, `url`) | +| `user` | object | Document owner (`id`, `name`, `email`) | +| `documentMeta` | object | Email settings, redirect URL, signing options | + +Documents created through the API have `source: "DOCUMENT"` — there is no separate `API` source value. To tag documents created by your integration, set `externalId` when creating them. ### Example Document Object ```json { "id": "envelope_abc123xyz", + "secondaryId": "document_123", + "internalVersion": 2, "type": "DOCUMENT", "status": "PENDING", - "source": "API", + "source": "DOCUMENT", "visibility": "EVERYONE", + "templateType": "PRIVATE", "title": "Service Agreement", "externalId": "contract-2025-001", + "userId": 1, + "teamId": 1, + "folderId": null, + "templateId": null, + "authOptions": null, + "formValues": null, + "publicTitle": "", + "publicDescription": "", "createdAt": "2025-01-15T10:30:00.000Z", "updatedAt": "2025-01-15T10:35:00.000Z", "completedAt": null, @@ -73,23 +100,41 @@ A document object contains the following properties: ], "fields": [ { - "id": "field_123", + "id": 123, + "secondaryId": "field_abc123", "type": "SIGNATURE", + "recipientId": 1, + "envelopeId": "envelope_abc123xyz", + "envelopeItemId": "envelope_item_xyz", "page": 1, - "positionX": 10, - "positionY": 80, - "width": 30, - "height": 5, - "recipientId": 1 + "positionX": "10", + "positionY": "80", + "width": "30", + "height": "5", + "customText": "", + "inserted": false, + "fieldMeta": null } ], "envelopeItems": [ { "id": "envelope_item_xyz", + "envelopeId": "envelope_abc123xyz", + "documentDataId": "doc_data_abc123", "title": "contract.pdf", "order": 1 } ], + "directLink": null, + "team": { + "id": 1, + "url": "your-team" + }, + "user": { + "id": 1, + "name": "Jane Smith", + "email": "jane@example.com" + }, "documentMeta": { "subject": "Please sign this document", "message": "Hi, please review and sign this agreement.", @@ -99,6 +144,8 @@ A document object contains the following properties: } ``` +Field position and size values are stored as decimals and serialized as strings in API responses. + ## List Documents Retrieve a paginated list of documents. @@ -114,7 +161,7 @@ GET /envelope | `page` | integer | Page number (default: 1) | | `perPage` | integer | Results per page (default: 10, max: 100) | | `type` | string | Filter by `DOCUMENT` or `TEMPLATE` | -| `status` | string | Filter by status: `DRAFT`, `PENDING`, `COMPLETED`, `REJECTED` | +| `status` | string | Filter by status: `DRAFT`, `PENDING`, `COMPLETED`, `REJECTED`, `CANCELLED` | | `source` | string | Filter by creation source | | `folderId` | string | Filter by folder ID | | `orderByColumn` | string | Sort field (only `createdAt` supported) | @@ -154,8 +201,8 @@ const response = await fetch(`${BASE_URL}/envelope`, { }, }); -const { data, pagination } = await response.json(); -console.log(`Found ${pagination.totalItems} documents`); +const { data, count } = await response.json(); +console.log(`Found ${count} documents`); // Filter by status const pendingResponse = await fetch( @@ -197,12 +244,10 @@ const pendingDocs = await pendingResponse.json(); ] } ], - "pagination": { - "page": 1, - "perPage": 10, - "totalPages": 5, - "totalItems": 42 - } + "count": 42, + "currentPage": 1, + "perPage": 10, + "totalPages": 5 } ``` @@ -628,6 +673,72 @@ The response includes signing URLs for each recipient: --- +## Cancel Document + +Cancel a pending document. This changes its status from `PENDING` to `CANCELLED`. + +``` +POST /envelope/cancel +``` + +### Request Body + +| Field | Type | Required | Description | +| ------------ | ------ | -------- | ----------------------------------- | +| `envelopeId` | string | Yes | Document ID | +| `reason` | string | No | Reason for cancelling the document | + +### Code Examples + + + +```bash +curl -X POST "https://app.documenso.com/api/v2/envelope/cancel" \ + -H "Authorization: api_xxxxxxxxxxxxxxxx" \ + -H "Content-Type: application/json" \ + -d '{ + "envelopeId": "envelope_abc123", + "reason": "The agreement is no longer needed." + }' +``` + + +```typescript +const response = await fetch('https://app.documenso.com/api/v2/envelope/cancel', { + method: 'POST', + headers: { + Authorization: 'api_xxxxxxxxxxxxxxxx', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + envelopeId: 'envelope_abc123', + reason: 'The agreement is no longer needed.', + }), +}); + +const { success } = await response.json(); +``` + + + +### Response + +```json +{ + "success": true +} +``` + +### Behavior + +- Only documents in `PENDING` status can be cancelled. Other statuses return `400`. +- Cancellation is not idempotent. Cancelling the same document again returns `400`. +- The document owner and team members with `MANAGER` or higher permissions can cancel it. Requests for documents you cannot view return `404`; requests for visible documents without sufficient permissions return `401`. +- A successful cancellation fires the `DOCUMENT_CANCELLED` webhook. +- Cancellation emails are sent only to eligible non-CC, non-rejected recipients who were sent or opened the document. + +--- + ## Delete Document Delete a document. Completed documents cannot be deleted. @@ -670,7 +781,7 @@ const response = await fetch('https://app.documenso.com/api/v2/envelope/delete', const { success } = await response.json(); -```` +``` @@ -680,7 +791,7 @@ const { success } = await response.json(); { "success": true } -```` +``` --- @@ -694,9 +805,11 @@ POST /envelope/get-many ### Request Body -| Field | Type | Required | Description | -| ------------- | ----- | -------- | --------------------- | -| `envelopeIds` | array | Yes | Array of document IDs | +| Field | Type | Required | Description | +| ---------- | ------ | -------- | ---------------------------------------------------------------------------- | +| `ids` | object | Yes | ID selector containing `type` and `ids` | +| `ids.type` | string | Yes | `envelopeId`, `documentId`, or `templateId` | +| `ids.ids` | array | Yes | 1-20 IDs: strings for `envelopeId`; numbers for `documentId` or `templateId` | ### Code Examples @@ -707,12 +820,17 @@ curl -X POST "https://app.documenso.com/api/v2/envelope/get-many" \ -H "Authorization: api_xxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ - "envelopeIds": ["envelope_abc123", "envelope_def456", "envelope_ghi789"] + "ids": { + "type": "envelopeId", + "ids": ["envelope_abc123", "envelope_def456", "envelope_ghi789"] + } }' ``` ```typescript +const requestedIds = ['envelope_abc123', 'envelope_def456', 'envelope_ghi789']; + const response = await fetch('https://app.documenso.com/api/v2/envelope/get-many', { method: 'POST', headers: { @@ -720,16 +838,36 @@ const response = await fetch('https://app.documenso.com/api/v2/envelope/get-many 'Content-Type': 'application/json', }, body: JSON.stringify({ - envelopeIds: ['envelope_abc123', 'envelope_def456', 'envelope_ghi789'], + ids: { + type: 'envelopeId', + ids: requestedIds, + }, }), }); -const documents = await response.json(); +const { data } = await response.json(); -```` +``` +### Response + +```json +{ + "data": [ + { + "id": "envelope_abc123", + "type": "DOCUMENT", + "status": "PENDING", + "title": "Service Agreement" + } + ] +} +``` + +The endpoint silently omits envelopes you cannot access instead of returning `404`. Compare `data.length` with `requestedIds.length` to detect omissions. + --- ## Document Statuses @@ -740,6 +878,7 @@ const documents = await response.json(); | `PENDING` | Document has been sent. Waiting for recipients to sign. | | `COMPLETED` | All recipients have signed. Document is sealed. | | `REJECTED` | A recipient rejected the document. | +| `CANCELLED` | The document was cancelled by its owner or a team member with `MANAGER` or higher permissions. | ### Status Transitions @@ -747,11 +886,13 @@ const documents = await response.json(); flowchart LR DRAFT --> PENDING --> COMPLETED PENDING --> REJECTED + PENDING --> CANCELLED ``` - **DRAFT to PENDING**: Call the distribute endpoint - **PENDING to COMPLETED**: All recipients complete their signing - **PENDING to REJECTED**: A recipient rejects the document +- **PENDING to CANCELLED**: The document owner or a team member with `MANAGER` or higher permissions cancels the document You cannot modify recipients or fields after a document moves to `PENDING` status. @@ -773,8 +914,8 @@ flowchart LR | Parameter | Values | Description | | ---------- | ------------------------------------------- | ------------------------- | | `type` | `DOCUMENT`, `TEMPLATE` | Filter by envelope type | -| `status` | `DRAFT`, `PENDING`, `COMPLETED`, `REJECTED` | Filter by status | -| `source` | `DOCUMENT`, `TEMPLATE`, `API` | Filter by creation source | +| `status` | `DRAFT`, `PENDING`, `COMPLETED`, `REJECTED`, `CANCELLED` | Filter by status | +| `source` | `DOCUMENT`, `TEMPLATE`, `TEMPLATE_DIRECT_LINK` | Filter by creation source | | `folderId` | string | Filter by folder | ### Sorting @@ -800,10 +941,10 @@ async function getAllPendingDocuments() { }, ); - const { data, pagination } = await response.json(); + const { data, currentPage, totalPages } = await response.json(); documents.push(...data); - hasMore = page < pagination.totalPages; + hasMore = currentPage < totalPages; page++; } diff --git a/apps/docs/content/docs/developers/api/migrate-to-envelopes.mdx b/apps/docs/content/docs/developers/api/migrate-to-envelopes.mdx index 2bd5c8568..5a719e90c 100644 --- a/apps/docs/content/docs/developers/api/migrate-to-envelopes.mdx +++ b/apps/docs/content/docs/developers/api/migrate-to-envelopes.mdx @@ -119,7 +119,7 @@ Full reference in the [V2 OpenAPI reference](https://openapi.documenso.com). | ------------------------------------------------- | ----------------------------------------------------- | | `GET /api/v2/document` | `GET /api/v2/envelope` | | `GET /api/v2/document/{documentId}` | `GET /api/v2/envelope/{envelopeId}` | -| `POST /api/v2/document/get-many` | `POST /api/v2/envelope/get-many` | +| `POST /api/v2/document/get-many` | `POST /api/v2/envelope/get-many` (body changes from `documentIds: number[]` to `ids: { type: "documentId"; ids: number[] }`) | | `POST /api/v2/document/create` | `POST /api/v2/envelope/create` | | `POST /api/v2/document/create/beta` | `POST /api/v2/envelope/create` | | `POST /api/v2/document/update` | `POST /api/v2/envelope/update` | @@ -140,7 +140,7 @@ Full reference in the [V2 OpenAPI reference](https://openapi.documenso.com). | ------------------------------------- | ------------------------------------------------ | | `GET /api/v2/template` | `GET /api/v2/envelope` (with `type=TEMPLATE`) | | `GET /api/v2/template/{templateId}` | `GET /api/v2/envelope/{envelopeId}` | -| `POST /api/v2/template/get-many` | `POST /api/v2/envelope/get-many` | +| `POST /api/v2/template/get-many` | `POST /api/v2/envelope/get-many` (body changes from `templateIds: number[]` to `ids: { type: "templateId"; ids: number[] }`) | | `POST /api/v2/template/create` | `POST /api/v2/envelope/create` (`type=TEMPLATE`) | | `POST /api/v2/template/create/beta` | `POST /api/v2/envelope/create` (`type=TEMPLATE`) | | `POST /api/v2/template/update` | `POST /api/v2/envelope/update` | From 75330166cc00b29c14399bc2e391e4b4d8080c00 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Wed, 19 Aug 2026 20:34:18 +1000 Subject: [PATCH 13/20] v2.17.0 --- apps/remix/package.json | 2 +- package-lock.json | 6 +++--- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/remix/package.json b/apps/remix/package.json index b4e522572..cd49ddcd2 100644 --- a/apps/remix/package.json +++ b/apps/remix/package.json @@ -106,5 +106,5 @@ "vite-plugin-babel-macros": "^1.0.6", "vite-tsconfig-paths": "^5.1.4" }, - "version": "2.16.0" + "version": "2.17.0" } diff --git a/package-lock.json b/package-lock.json index c32ca8122..cf266782c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@documenso/root", - "version": "2.16.0", + "version": "2.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@documenso/root", - "version": "2.16.0", + "version": "2.17.0", "hasInstallScript": true, "workspaces": [ "apps/*", @@ -416,7 +416,7 @@ }, "apps/remix": { "name": "@documenso/remix", - "version": "2.16.0", + "version": "2.17.0", "dependencies": { "@cantoo/pdf-lib": "^2.5.3", "@documenso/api": "*", diff --git a/package.json b/package.json index ee0fc81fb..4770c9eec 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "apps/*", "packages/*" ], - "version": "2.16.0", + "version": "2.17.0", "scripts": { "postinstall": "patch-package", "build": "turbo run build", From ead31048962b5d1885a2a80d315684a539419523 Mon Sep 17 00:00:00 2001 From: misinierijon4-debug Date: Mon, 24 Aug 2026 08:22:48 +0200 Subject: [PATCH 14/20] fix: add type button to multiselect remove and clear buttons (#3256) --- packages/ui/primitives/multi-select-combobox.tsx | 1 + packages/ui/primitives/multiselect.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/ui/primitives/multi-select-combobox.tsx b/packages/ui/primitives/multi-select-combobox.tsx index fc867131d..5326fdaec 100644 --- a/packages/ui/primitives/multi-select-combobox.tsx +++ b/packages/ui/primitives/multi-select-combobox.tsx @@ -142,6 +142,7 @@ export function MultiSelectCombobox({ {showClearButton && !loading && (
From 1de57a9e43d73f7b3e75966c946715e69b77e94e Mon Sep 17 00:00:00 2001 From: water <672684719@qq.com> Date: Mon, 24 Aug 2026 15:05:43 +0800 Subject: [PATCH 17/20] fix(emails): remove trailing period from document pending email subject (#3213) --- .../definitions/emails/send-document-pending-email.handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts b/packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts index 3a7bf3e96..13b2b5e6e 100644 --- a/packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts +++ b/packages/lib/jobs/definitions/emails/send-document-pending-email.handler.ts @@ -93,7 +93,7 @@ export const run = async ({ payload }: { payload: TSendDocumentPendingEmailJobDe }, from: senderEmail, replyTo: replyToEmail, - subject: i18n._(msg`Waiting for others to complete signing.`), + subject: i18n._(msg`Waiting for others to complete signing`), html, text, }); From 73d58bdf31f540d7b3108c8cfbcef8345d54d2ca Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Tue, 25 Aug 2026 11:20:11 +1000 Subject: [PATCH 18/20] feat: allow admin recipient search (#3277) --- .../general/use-admin-search-categories.ts | 3 +- .../admin+/documents._index.tsx | 10 +- .../app-tests/e2e/admin/global-search.spec.ts | 95 ++++++++ .../trpc/admin/admin-find-documents.spec.ts | 226 ++++++++++++++++++ .../server-only/admin/admin-find-documents.ts | 46 +++- 5 files changed, 374 insertions(+), 6 deletions(-) create mode 100644 packages/app-tests/e2e/api/trpc/admin/admin-find-documents.spec.ts diff --git a/apps/remix/app/components/general/use-admin-search-categories.ts b/apps/remix/app/components/general/use-admin-search-categories.ts index fc950b708..547fe7afb 100644 --- a/apps/remix/app/components/general/use-admin-search-categories.ts +++ b/apps/remix/app/components/general/use-admin-search-categories.ts @@ -39,13 +39,14 @@ const ADMIN_GROUP_ICONS: Record = { /** * Admin list pages which support prefilling their search from the URL, used - * for the "View all results" links on capped groups. Teams, recipients and + * for the "View all results" links on capped groups. Teams and * subscriptions have no admin list pages. */ const ADMIN_GROUP_LIST_PATHS: Partial string>> = { document: (query) => `/admin/documents?term=${encodeURIComponent(query)}`, user: (query) => `/admin/users?search=${encodeURIComponent(query)}`, organisation: (query) => `/admin/organisations?query=${encodeURIComponent(query)}`, + recipient: (query) => `/admin/documents?term=${encodeURIComponent(`recipient:${query}`)}`, }; export type UseAdminSearchCategoriesOptions = { diff --git a/apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx b/apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx index 1f1bb5317..b8c84ff2b 100644 --- a/apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx +++ b/apps/remix/app/routes/_authenticated+/admin+/documents._index.tsx @@ -12,7 +12,7 @@ import { msg } from '@lingui/core/macro'; import { useLingui } from '@lingui/react'; import { Trans } from '@lingui/react/macro'; import { Loader } from 'lucide-react'; -import { useMemo, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { Link, useSearchParams } from 'react-router'; import { DocumentStatus } from '~/components/general/document/document-status'; @@ -30,6 +30,12 @@ export default function AdminDocumentsPage() { const page = searchParams?.get?.('page') ? Number(searchParams.get('page')) : undefined; const perPage = searchParams?.get?.('perPage') ? Number(searchParams.get('perPage')) : undefined; + const urlTerm = searchParams?.get?.('term') ?? ''; + + useEffect(() => { + setTerm(urlTerm); + }, [urlTerm]); + const { data: findDocumentsData, isPending: isFindDocumentsLoading } = trpc.admin.document.find.useQuery( { query: debouncedTerm, @@ -131,7 +137,7 @@ export default function AdminDocumentsPage() {
setTerm(e.target.value)} /> diff --git a/packages/app-tests/e2e/admin/global-search.spec.ts b/packages/app-tests/e2e/admin/global-search.spec.ts index d8a1b5fbe..ab9f2d698 100644 --- a/packages/app-tests/e2e/admin/global-search.spec.ts +++ b/packages/app-tests/e2e/admin/global-search.spec.ts @@ -437,3 +437,98 @@ test('[ADMIN][GLOBAL_SEARCH]: over-length query skips the admin search without e expect(adminSearchRequests).toHaveLength(0); }); + +test('[ADMIN][GLOBAL_SEARCH]: capped recipients group links to the admin documents page', async ({ page }) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + const recipientPrefix = `viewall-recipient-${nanoid()}`; + + // Seed 5 documents, each with one recipient email sharing the prefix, to + // hit the 5 result cap on the recipients group. + const documents = []; + + for (let i = 0; i < 5; i++) { + documents.push( + await seedPendingDocument(sender, team.id, [`${recipientPrefix}-${i}@test.documenso.com`], { + createDocumentOptions: { title: `recipient-viewall-${nanoid()}` }, + }), + ); + } + + await apiSignin({ page, email: adminUser.email }); + + await openCommandMenu(page, ADMIN_PROMPT_PLACEHOLDER); + + await page.getByPlaceholder(ADMIN_PROMPT_PLACEHOLDER).first().fill(recipientPrefix); + + await expect(page.getByText('Global Recipients', { exact: true })).toBeVisible(); + + // Only the recipients group matches the prefix, so this is its link. + const viewAllOption = page.getByRole('option').filter({ hasText: 'View all results' }).first(); + + await expect(viewAllOption.getByRole('link')).toHaveAttribute( + 'href', + `/admin/documents?term=${encodeURIComponent(`recipient:${recipientPrefix}`)}`, + ); + + await viewAllOption.click(); + + await page.waitForURL((url) => url.pathname === '/admin/documents'); + + // The term input is prefilled with the recipient query and the matching + // documents are listed. + await expect(page.getByPlaceholder(/Search by document title/)).toHaveValue(`recipient:${recipientPrefix}`); + + for (const document of documents) { + await expect(page.getByRole('link', { name: document.title })).toBeVisible(); + } +}); + +test('[ADMIN][GLOBAL_SEARCH]: view all results updates the documents page when already on it', async ({ page }) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + const recipientPrefix = `viewall-live-${nanoid()}`; + + // Seed 5 documents with recipients matching the prefix to hit the cap, and + // one control document whose recipient does not match: with a stale + // (unfiltered) query the control would show, with the filter it must not. + const documents = []; + + for (let i = 0; i < 5; i++) { + documents.push( + await seedPendingDocument(sender, team.id, [`${recipientPrefix}-${i}@test.documenso.com`], { + createDocumentOptions: { title: `recipient-live-${nanoid()}` }, + }), + ); + } + + const controlDocument = await seedPendingDocument(sender, team.id, [`control-${nanoid()}@test.documenso.com`], { + createDocumentOptions: { title: `recipient-live-control-${nanoid()}` }, + }); + + await apiSignin({ page, email: adminUser.email }); + + // Start ON the admin documents page: the buggy state initializer has + // already run with an empty term. + await page.goto('/admin/documents'); + + await expect(page.getByPlaceholder(/Search by document title/)).toBeVisible(); + + await openCommandMenu(page, ADMIN_PROMPT_PLACEHOLDER); + + await page.getByPlaceholder(ADMIN_PROMPT_PLACEHOLDER).first().fill(recipientPrefix); + + await expect(page.getByText('Global Recipients', { exact: true })).toBeVisible(); + + await page.getByRole('option').filter({ hasText: 'View all results' }).first().click(); + + await page.waitForURL((url) => url.searchParams.get('term') === `recipient:${recipientPrefix}`); + + // The same-route navigation must update both the input and the results. + await expect(page.getByPlaceholder(/Search by document title/)).toHaveValue(`recipient:${recipientPrefix}`); + + await expect(page.getByRole('link', { name: documents[0].title })).toBeVisible(); + await expect(page.getByRole('link', { name: controlDocument.title })).toHaveCount(0); +}); diff --git a/packages/app-tests/e2e/api/trpc/admin/admin-find-documents.spec.ts b/packages/app-tests/e2e/api/trpc/admin/admin-find-documents.spec.ts new file mode 100644 index 000000000..92ea6b4cc --- /dev/null +++ b/packages/app-tests/e2e/api/trpc/admin/admin-find-documents.spec.ts @@ -0,0 +1,226 @@ +import { NEXT_PUBLIC_WEBAPP_URL } from '@documenso/lib/constants/app'; +import { seedPendingDocument } from '@documenso/prisma/seed/documents'; +import { seedUser } from '@documenso/prisma/seed/users'; +import type { Page } from '@playwright/test'; +import { expect, test } from '@playwright/test'; +import { customAlphabet } from 'nanoid'; + +import { apiSignin } from '../../../fixtures/authentication'; + +const nanoid = customAlphabet('1234567890abcdef', 10); + +const WEBAPP_BASE_URL = NEXT_PUBLIC_WEBAPP_URL(); + +test.describe.configure({ mode: 'parallel' }); + +type AdminFindDocumentsResult = { + data: Array<{ envelopeId: string; title: string }>; + count: number; +}; + +const callAdminFindDocuments = async (page: Page, query: string) => { + const inputParam = encodeURIComponent(JSON.stringify({ json: { query, page: 1, perPage: 20 } })); + const url = `${WEBAPP_BASE_URL}/api/trpc/admin.document.find?input=${inputParam}`; + + const res = await page.context().request.get(url); + + return { + res, + result: res.ok() + ? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions + ((await res.json()).result.data.json as AdminFindDocumentsResult) + : null, + }; +}; + +// ─── Access control ────────────────────────────────────────────────────────── + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: non-admin user is rejected with 401', async ({ page }) => { + const { user: nonAdminUser } = await seedUser({ isAdmin: false }); + + await apiSignin({ page, email: nonAdminUser.email }); + + const { res } = await callAdminFindDocuments(page, 'recipient:anything'); + + expect(res.ok()).toBeFalsy(); + expect(res.status()).toBe(401); +}); + +// ─── recipient: prefix ─────────────────────────────────────────────────────── + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix matches by recipient email', async ({ page }) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + const recipientEmail = `recipient-find-${nanoid()}@test.documenso.com`; + + const matchingDocument = await seedPendingDocument(sender, team.id, [recipientEmail], { + createDocumentOptions: { title: `recipient-find-match-${nanoid()}` }, + }); + + const otherDocument = await seedPendingDocument(sender, team.id, [`other-${nanoid()}@test.documenso.com`], { + createDocumentOptions: { title: `recipient-find-other-${nanoid()}` }, + }); + + await apiSignin({ page, email: adminUser.email }); + + const { res, result } = await callAdminFindDocuments(page, `recipient:${recipientEmail}`); + + expect(res.ok()).toBeTruthy(); + expect(result?.count).toBe(1); + expect(result?.data.map((document) => document.envelopeId)).toContain(matchingDocument.id); + expect(result?.data.map((document) => document.envelopeId)).not.toContain(otherDocument.id); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix matches by recipient name case-insensitively', async ({ + page, +}) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + const recipientName = `recipient-name-${nanoid()}`; + const { user: recipientUser } = await seedUser({ name: recipientName }); + + const matchingDocument = await seedPendingDocument(sender, team.id, [recipientUser], { + createDocumentOptions: { title: `recipient-name-match-${nanoid()}` }, + }); + + await apiSignin({ page, email: adminUser.email }); + + // Query the uppercased name: matching must be case-insensitive. + const { res, result } = await callAdminFindDocuments(page, `recipient:${recipientName.toUpperCase()}`); + + expect(res.ok()).toBeTruthy(); + expect(result?.count).toBe(1); + expect(result?.data.map((document) => document.envelopeId)).toContain(matchingDocument.id); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix with empty value returns no results', async ({ page }) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + + await apiSignin({ page, email: adminUser.email }); + + const emptyValueSearch = await callAdminFindDocuments(page, 'recipient:'); + + expect(emptyValueSearch.res.ok()).toBeTruthy(); + expect(emptyValueSearch.result?.data).toEqual([]); + expect(emptyValueSearch.result?.count).toBe(0); + + // Whitespace-only values are treated the same as empty. + const whitespaceValueSearch = await callAdminFindDocuments(page, 'recipient: '); + + expect(whitespaceValueSearch.res.ok()).toBeTruthy(); + expect(whitespaceValueSearch.result?.data).toEqual([]); + expect(whitespaceValueSearch.result?.count).toBe(0); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix with no matches returns no results', async ({ page }) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + + await apiSignin({ page, email: adminUser.email }); + + const { res, result } = await callAdminFindDocuments(page, 'recipient:zzzz-no-such-recipient-9x7q'); + + expect(res.ok()).toBeTruthy(); + expect(result?.data).toEqual([]); + expect(result?.count).toBe(0); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix with numeric value matches by exact recipient ID', async ({ + page, +}) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + const matchingDocument = await seedPendingDocument(sender, team.id, [`recipient-id-${nanoid()}@test.documenso.com`], { + createDocumentOptions: { title: `recipient-id-match-${nanoid()}` }, + }); + + const recipient = matchingDocument.recipients[0]; + + // A decoy whose recipient email contains the ID as text: an exact ID lookup + // must exclude it, while an accidental "ID or contains" match would not. + const decoyDocument = await seedPendingDocument( + sender, + team.id, + [`decoy-${recipient.id}-${nanoid()}@test.documenso.com`], + { + createDocumentOptions: { title: `recipient-id-decoy-${nanoid()}` }, + }, + ); + + await apiSignin({ page, email: adminUser.email }); + + const { res, result } = await callAdminFindDocuments(page, `recipient:${recipient.id}`); + + expect(res.ok()).toBeTruthy(); + expect(result?.count).toBe(1); + expect(result?.data.map((document) => document.envelopeId)).toContain(matchingDocument.id); + expect(result?.data.map((document) => document.envelopeId)).not.toContain(decoyDocument.id); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix with nonexistent recipient ID returns no results', async ({ + page, +}) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + + await apiSignin({ page, email: adminUser.email }); + + // Int4 max - 1: a valid ID-shaped number that no autoincrement recipient + // sequence will plausibly reach, and that no other test seeds as text. + const { res, result } = await callAdminFindDocuments(page, 'recipient:2147483646'); + + expect(res.ok()).toBeTruthy(); + expect(result?.data).toEqual([]); + expect(result?.count).toBe(0); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: recipient prefix with oversized number falls back to text search', async ({ + page, +}) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + const { user: sender, team } = await seedUser(); + + // 99999999999999 exceeds Int4, so it cannot be an ID lookup: it must be + // treated as text (and must not 500). + const oversizedNumber = '99999999999999'; + + const matchingDocument = await seedPendingDocument( + sender, + team.id, + [`${oversizedNumber}-${nanoid()}@test.documenso.com`], + { + createDocumentOptions: { title: `recipient-oversized-${nanoid()}` }, + }, + ); + + await apiSignin({ page, email: adminUser.email }); + + const { res, result } = await callAdminFindDocuments(page, `recipient:${oversizedNumber}`); + + expect(res.ok()).toBeTruthy(); + expect(result?.data.map((document) => document.envelopeId)).toContain(matchingDocument.id); +}); + +test('[ADMIN][TRPC][FIND_DOCUMENTS]: user and team prefixes with oversized numbers return no results', async ({ + page, +}) => { + const { user: adminUser } = await seedUser({ isAdmin: true }); + + await apiSignin({ page, email: adminUser.email }); + + // 99999999999999 exceeds Int4, so it can never be a valid user or team ID. + // The ID schema must reject it so the query returns empty instead of + // overflowing Postgres and erroring. + const userSearch = await callAdminFindDocuments(page, 'user:99999999999999'); + + expect(userSearch.res.ok()).toBeTruthy(); + expect(userSearch.result?.data).toEqual([]); + expect(userSearch.result?.count).toBe(0); + + const teamSearch = await callAdminFindDocuments(page, 'team:99999999999999'); + + expect(teamSearch.res.ok()).toBeTruthy(); + expect(teamSearch.result?.data).toEqual([]); + expect(teamSearch.result?.count).toBe(0); +}); diff --git a/packages/lib/server-only/admin/admin-find-documents.ts b/packages/lib/server-only/admin/admin-find-documents.ts index 994422ba7..4643daed8 100644 --- a/packages/lib/server-only/admin/admin-find-documents.ts +++ b/packages/lib/server-only/admin/admin-find-documents.ts @@ -10,7 +10,13 @@ export interface AdminFindDocumentsOptions { perPage?: number; } -const ZPositiveIntegerSchema = z.coerce.number().int().positive(); +const MAX_POSTGRES_INT = 2147483647; + +/** + * IDs are Postgres int4 columns: values above the range can never be valid + * IDs and would make Prisma throw on overflow, so the schema rejects them. + */ +const ZPositiveIntegerSchema = z.coerce.number().int().positive().max(MAX_POSTGRES_INT); const emptyResponse = { data: [], @@ -58,7 +64,41 @@ export const adminFindDocuments = async ({ query, page = 1, perPage = 10 }: Admi } } - if (query && query?.startsWith('envelope_')) { + if (query?.startsWith('recipient:')) { + const recipientQuery = query.slice('recipient:'.length).trim(); + + if (recipientQuery.length === 0) { + return emptyResponse; + } + + // Bare numeric values are exact recipient ID lookups, consistent with the + // user: and team: prefixes. Oversized numbers cannot be IDs and fall back + // to the text search, mirroring the admin global search. + const parsedRecipientId = ZPositiveIntegerSchema.safeParse(recipientQuery); + + if (/^\d+$/.test(recipientQuery) && parsedRecipientId.success) { + termFilters = { + recipients: { + some: { + id: parsedRecipientId.data, + }, + }, + }; + } else { + termFilters = { + recipients: { + some: { + OR: [ + { email: { contains: recipientQuery, mode: 'insensitive' } }, + { name: { contains: recipientQuery, mode: 'insensitive' } }, + ], + }, + }, + }; + } + } + + if (query?.startsWith('envelope_')) { termFilters = { id: { equals: query, @@ -66,7 +106,7 @@ export const adminFindDocuments = async ({ query, page = 1, perPage = 10 }: Admi }; } - if (query && query?.startsWith('document_')) { + if (query?.startsWith('document_')) { termFilters = { secondaryId: { equals: query, From 10f2b800258079199c2f17324dc93a93de0e15c5 Mon Sep 17 00:00:00 2001 From: Catalin Pit Date: Tue, 25 Aug 2026 11:07:31 +0300 Subject: [PATCH 19/20] feat: last used column for api tokens (#3230) --- .../t.$teamUrl+/settings.tokens.tsx | 17 ++++++++++++ .../public-api/get-api-token-by-token.ts | 26 +++++++++++++++++++ .../server-only/public-api/get-api-tokens.ts | 1 + .../migration.sql | 2 ++ packages/prisma/schema.prisma | 21 ++++++++------- .../api-token-router/get-api-tokens.types.ts | 1 + 6 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 packages/prisma/migrations/20260818081941_add_api_token_last_used_property/migration.sql diff --git a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx index 239137d0b..548933f01 100644 --- a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx +++ b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/settings.tokens.tsx @@ -68,6 +68,20 @@ export default function ApiTokensPage() { return i18n.date(row.original.expires); }, }, + { + header: t`Last Used`, + cell: ({ row }) => { + if (!row.original.lastUsedAt) { + return ( + + Never + + ); + } + + return {i18n.date(row.original.lastUsedAt)}; + }, + }, { header: t`Actions`, cell: ({ row }) => ( @@ -146,6 +160,9 @@ export default function ApiTokensPage() { + + + diff --git a/packages/lib/server-only/public-api/get-api-token-by-token.ts b/packages/lib/server-only/public-api/get-api-token-by-token.ts index d25b9b902..abfab5ec3 100644 --- a/packages/lib/server-only/public-api/get-api-token-by-token.ts +++ b/packages/lib/server-only/public-api/get-api-token-by-token.ts @@ -1,9 +1,12 @@ import { prisma } from '@documenso/prisma'; import { AppError, AppErrorCode } from '../../errors/app-error'; +import { logger } from '../../utils/logger'; import { hashString } from '../auth/hash'; import { assertOrganisationRatesAndLimits } from '../rate-limit/assert-organisation-rates-and-limits'; +const LAST_USED_AT_UPDATE_INTERVAL = 60_000; // 1 minute + type GetApiTokenByTokenOptions = { token: string; @@ -96,6 +99,29 @@ export const getApiTokenByToken = async ({ token, bypassRateLimit = false }: Get }); } + // Only update the lastUsedAt after X amount of time has passed to reduce + // the number of writes to the database + if (!apiToken.lastUsedAt || apiToken.lastUsedAt.getTime() + LAST_USED_AT_UPDATE_INTERVAL < Date.now()) { + void prisma.apiToken + .updateMany({ + where: { + id: apiToken.id, + // Optimistic guard: skip if another request beat us + lastUsedAt: apiToken.lastUsedAt, + }, + data: { + lastUsedAt: new Date(), + }, + }) + .catch((err) => { + logger.warn({ + msg: 'Failed to update API token lastUsedAt', + apiTokenId: apiToken.id, + err, + }); + }); + } + return { ...apiToken, user, diff --git a/packages/lib/server-only/public-api/get-api-tokens.ts b/packages/lib/server-only/public-api/get-api-tokens.ts index 06e014a10..a97ba809d 100644 --- a/packages/lib/server-only/public-api/get-api-tokens.ts +++ b/packages/lib/server-only/public-api/get-api-tokens.ts @@ -22,6 +22,7 @@ export const getApiTokens = async ({ userId, teamId }: GetApiTokensOptions) => { name: true, createdAt: true, expires: true, + lastUsedAt: true, }, orderBy: { createdAt: 'desc', diff --git a/packages/prisma/migrations/20260818081941_add_api_token_last_used_property/migration.sql b/packages/prisma/migrations/20260818081941_add_api_token_last_used_property/migration.sql new file mode 100644 index 000000000..9b9f88927 --- /dev/null +++ b/packages/prisma/migrations/20260818081941_add_api_token_last_used_property/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "ApiToken" ADD COLUMN "lastUsedAt" TIMESTAMP(3); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 06be2eed9..13768e34f 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -220,16 +220,17 @@ enum ApiTokenAlgorithm { } model ApiToken { - id Int @id @default(autoincrement()) - name String - token String @unique - algorithm ApiTokenAlgorithm @default(SHA512) - expires DateTime? - createdAt DateTime @default(now()) - userId Int? - user User? @relation(fields: [userId], references: [id], onDelete: Cascade) - teamId Int - team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) + id Int @id @default(autoincrement()) + name String + token String @unique + algorithm ApiTokenAlgorithm @default(SHA512) + expires DateTime? + createdAt DateTime @default(now()) + lastUsedAt DateTime? + userId Int? + user User? @relation(fields: [userId], references: [id], onDelete: Cascade) + teamId Int + team Team @relation(fields: [teamId], references: [id], onDelete: Cascade) } enum SubscriptionStatus { diff --git a/packages/trpc/server/api-token-router/get-api-tokens.types.ts b/packages/trpc/server/api-token-router/get-api-tokens.types.ts index 6a690066d..c3f06d916 100644 --- a/packages/trpc/server/api-token-router/get-api-tokens.types.ts +++ b/packages/trpc/server/api-token-router/get-api-tokens.types.ts @@ -9,6 +9,7 @@ export const ZGetApiTokensResponseSchema = z.array( name: true, createdAt: true, expires: true, + lastUsedAt: true, }), ); From dd08da7ea722a8fd9aca1b0c876eb624c039f8f8 Mon Sep 17 00:00:00 2001 From: Ephraim Duncan <55143799+ephraimduncan@users.noreply.github.com> Date: Tue, 25 Aug 2026 08:29:24 +0000 Subject: [PATCH 20/20] refactor(trpc): use ts-pattern for envelope document-data resolution (#3222) --- .../server/envelope-router/create-envelope.ts | 19 ++++++------------- .../envelope-router/sign-envelope-field.ts | 7 +++---- .../server/envelope-router/use-envelope.ts | 18 +++++------------- 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/packages/trpc/server/envelope-router/create-envelope.ts b/packages/trpc/server/envelope-router/create-envelope.ts index c721ad31e..1a5038a10 100644 --- a/packages/trpc/server/envelope-router/create-envelope.ts +++ b/packages/trpc/server/envelope-router/create-envelope.ts @@ -8,6 +8,7 @@ import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-reques import { putPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server'; import { EnvelopeType } from '@prisma/client'; import type { Logger } from 'pino'; +import { match, P } from 'ts-pattern'; import { insertFormValuesInPdf } from '../../../lib/server-only/pdf/insert-form-values-in-pdf'; import { authenticatedProcedure } from '../trpc'; @@ -148,19 +149,11 @@ export const createEnvelopeRouteCaller = async ({ accessAuth: recipient.accessAuth, actionAuth: recipient.actionAuth, fields: recipient.fields?.map((field) => { - let documentDataId: string | undefined; - - if (typeof field.identifier === 'string') { - documentDataId = envelopeItems.find((item) => item.title === field.identifier)?.documentDataId; - } - - if (typeof field.identifier === 'number') { - documentDataId = envelopeItems.at(field.identifier)?.documentDataId; - } - - if (field.identifier === undefined) { - documentDataId = envelopeItems.at(0)?.documentDataId; - } + const documentDataId = match(field.identifier) + .with(P.string, (title) => envelopeItems.find((item) => item.title === title)?.documentDataId) + .with(P.number, (index) => envelopeItems.at(index)?.documentDataId) + .with(undefined, () => envelopeItems.at(0)?.documentDataId) + .exhaustive(); if (!documentDataId) { throw new AppError(AppErrorCode.NOT_FOUND, { diff --git a/packages/trpc/server/envelope-router/sign-envelope-field.ts b/packages/trpc/server/envelope-router/sign-envelope-field.ts index ef1828fee..54f4129a5 100644 --- a/packages/trpc/server/envelope-router/sign-envelope-field.ts +++ b/packages/trpc/server/envelope-router/sign-envelope-field.ts @@ -39,8 +39,8 @@ export const signEnvelopeFieldRoute = procedure const field = await prisma.field.findFirst({ where: { id: fieldId, - recipient: { - ...(recipient.role === RecipientRole.ASSISTANT + recipient: + recipient.role === RecipientRole.ASSISTANT ? { signingStatus: { not: SigningStatus.SIGNED, @@ -52,8 +52,7 @@ export const signEnvelopeFieldRoute = procedure } : { id: recipient.id, - }), - }, + }, }, include: { envelope: { diff --git a/packages/trpc/server/envelope-router/use-envelope.ts b/packages/trpc/server/envelope-router/use-envelope.ts index 769e598fa..608b430d9 100644 --- a/packages/trpc/server/envelope-router/use-envelope.ts +++ b/packages/trpc/server/envelope-router/use-envelope.ts @@ -6,6 +6,7 @@ import { createDocumentFromTemplate } from '@documenso/lib/server-only/template/ import { putNormalizedPdfFileServerSide } from '@documenso/lib/universal/upload/put-file.server'; import { formatSigningLink } from '@documenso/lib/utils/recipients'; import { EnvelopeType } from '@prisma/client'; +import { match, P } from 'ts-pattern'; import { authenticatedProcedure } from '../trpc'; import { useEnvelopeMeta, ZUseEnvelopeRequestSchema, ZUseEnvelopeResponseSchema } from './use-envelope.types'; @@ -87,20 +88,11 @@ export const useEnvelopeRoute = authenticatedProcedure // Map custom document data using identifiers const customDocumentDataMapped = customDocumentData?.map((mapping) => { - let documentDataId: string | undefined; - // Find the uploaded file by identifier - if (typeof mapping.identifier === 'string') { - documentDataId = uploadedFiles.find((file) => file.name === mapping.identifier)?.documentDataId; - } - - if (typeof mapping.identifier === 'number') { - documentDataId = uploadedFiles.at(mapping.identifier)?.documentDataId; - } - - if (mapping.identifier === undefined) { - documentDataId = uploadedFiles.at(0)?.documentDataId; - } + const documentDataId = match(mapping.identifier) + .with(P.string, (name) => uploadedFiles.find((file) => file.name === name)?.documentDataId) + .with(P.number, (index) => uploadedFiles.at(index)?.documentDataId) + .exhaustive(); if (!documentDataId) { throw new AppError(AppErrorCode.NOT_FOUND, {