3669 Commits
Author SHA1 Message Date
Eric Mc Sween 0ec99c7e3e Merge pull request #37028 from overleaf/em-bibtex-stream-parser
[web] add a streaming bibtex parser

GitOrigin-RevId: 5397ba546a3d5b3436a80eab0467244969b280d0
2026-09-17 12:08:28 +00:00
Eric Mc Sween 0f22a44d1a Merge pull request #37005 from overleaf/em-bibtex-grammar-fixes
[web] match biber in three bibtex parsing edge cases

GitOrigin-RevId: da7e2c0b9f137e7debfe26f09c531a61a135e40e
2026-09-17 12:08:25 +00:00
Eric Mc Sween 7d3d60f2ba Merge pull request #36920 from overleaf/em-shared-frontend-backend
Move shared bibtex model classes to services/web/shared

GitOrigin-RevId: ef768d4f7bcf7b9c4b41844450b0256ecb46fdae
2026-09-17 12:08:21 +00:00
Antoine ClausseandClaude Opus 5 943edd29f3 [monorepo] lint .mts/.cts files (#37001)
* [monorepo] lint .mts/.cts files

ESLint's `files` globs listed `{js,jsx,mjs,cjs,ts,tsx}` but never the
module-scoped TypeScript extensions, so every `.mts` file in the repo was
silently skipped with "File ignored because no matching configuration was
supplied" -- 21 files today, all in services/web, and more as backend code
migrates to TypeScript (`.mts` is the extension runtime-loaded backend TS
has to use, since services/web has no `"type": "module"`).

Each extension list now carries the c/m variants of the languages it
already allowed, canonicalised to one of:

    {js,cjs,mjs}                      JS only
    {js,cjs,mjs,jsx}                  JS + JSX
    {js,cjs,mjs,ts,cts,mts}           JS + TS, no JSX
    {ts,cts,mts,tsx}                  TS only
    {js,cjs,mjs,jsx,ts,cts,mts,tsx}   everything

No list gains a language it did not already have, and none gains JSX
where it was previously excluded, so backend globs keep excluding
jsx/tsx and TS-only rule blocks keep excluding JS.

Both the extension declaration and the plugin/parser block in
services/web/eslint.config.mjs are widened together: widening only the
rule blocks makes `@overleaf/*` rules match files the plugin
registration does not, which fails with "could not find plugin
@overleaf".

The root global-ignores shim (`services/**/*.{mjs,cjs,ts,tsx}` and
friends) is deliberately left alone -- it replicates ESLint v8's file
walker so pre-existing debt in never-linted files stays off the build.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Fix eslint errors

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
GitOrigin-RevId: 084d0d054db9db6b5e3dd26de56d14358ab5edf7
2026-09-17 12:07:47 +00:00
KristinaandJimmy Domagala-Tang 44910202f3 [web] open comments and changes via url (#36546)
* [web] open a comment from a URL

* [web] add "View comment" button to digest email

* [web] open a tracked change from a URL

* [web] add "View suggestion" button to digest email

* [web] open the review panel from an open=review-panel URL

* [web] drop the digest email CTA and collapse the deep links to t=review

* [web] add an Open project button to the section overflow row and plain-text view links

* [web] validate the comment and change deep-link ids as object ids

* [web] collapse the deep-link resolvers into a single DeepLink component

* fix: scrolling into view when below the fold

* fix: address claude review

* fix: style adjustments

* fix: updating types to accomodate accepted/rejected changes

---------

Co-authored-by: Jimmy Domagala-Tang <jimmy.domagala-tang@overleaf.com>
GitOrigin-RevId: dab535591a93e1c3849a6b2a0dcc3e3934354385
2026-09-17 12:07:22 +00:00
Eric Mc Sween 5dc8c2b0c3 Merge pull request #36949 from overleaf/em-bibtex-crlf-upload-fix
[web] fix bibtex parser dropping fields on CRLF/CR line endings

GitOrigin-RevId: 6174bedeed92a014c2d7210afb6f39387e8608a8
2026-09-17 12:07:19 +00:00
ThomasandClaude Opus 4.8 42b29f0107 Support separate header logo images for light and dark themes (#36362)
Server Pro/CE admins can set a custom header logo via OVERLEAF_HEADER_IMAGE_URL,
but the same image is used for both the light and dark navbar themes. A logo
with good contrast on one background can be hard to see on the other (e.g. a
dark logo on the dark dashboard navbar).

Add two optional env vars, OVERLEAF_HEADER_IMAGE_URL_LIGHT and
OVERLEAF_HEADER_IMAGE_URL_DARK, each falling back to OVERLEAF_HEADER_IMAGE_URL
when unset, so existing configurations are unaffected. The light/dark fallback is
resolved server-side and exposed to the frontend as customLogo (light-effective)
and customLogoDark (dark-effective); the two theme-aware navbars (project
dashboard and library) pick between them using the existing overall-theme hook,
so the logo tracks both the user's theme setting and live OS theme changes.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
GitOrigin-RevId: 587a5679c650717cba6251e6d612146f434e8730
2026-09-17 12:05:54 +00:00
roo hutton e6ceb4fec4 Merge pull request #36864 from overleaf/rh-36644-cancel-spinner-fallback
Fix cancellation flow if downgrade upsell plan is not available

GitOrigin-RevId: c34f7f37057d5e0c08cbdd5f8524a7c5f00ae8b4
2026-09-17 12:05:27 +00:00
David 5e615cd261 Merge pull request #36620 from overleaf/copilot/fix-default-trash-view
Default Trash nav item to the current location

GitOrigin-RevId: 939284aecc4a002394430e9e2850125825d599de
2026-09-17 12:05:20 +00:00
David 90be47c5e1 Merge pull request #36649 from overleaf/dp-cleanup-library-feature-flag
Remove the overleaf-library feature flag

GitOrigin-RevId: ebeabd43c9e44dbc2344b4e8e7e5b9095fcc86e0
2026-09-17 12:04:13 +00:00
Malik Glossop 2a489d6517 Merge pull request #35985 from overleaf/mg-history-ot-comments-preserve
HistoryOT - Preserve comments on cut/paste/undo

GitOrigin-RevId: 3c53da9abe599ab80ccc20960a46c6380d597831
2026-09-17 12:03:53 +00:00
Malik Glossop 863e33af78 Merge pull request #35982 from overleaf/mg-history-ot-comments
HistoryOT - Fix comments being dropped and crashing on detached ranges

GitOrigin-RevId: 0906a55a51a6fda9ac828efcbe72989573161261
2026-09-17 12:03:46 +00:00
Brian Gough 538d04ddb8 Merge pull request #36664 from overleaf/lg-wordcount-sync-resources
[clsi] sync project resources for word count

GitOrigin-RevId: fe96c936e7aba22ab94416a102dcb7e4835e1256
2026-09-17 12:03:09 +00:00
Jessica Lawshe 2c8e2781c7 Merge pull request #35038 from overleaf/th-add-v1-blocked-domain
Add 'passmail' to the list of domains blocked in v1

GitOrigin-RevId: 6c12800d03af0ad838f60a13fcf7d77d321b03c6
2026-09-17 12:02:17 +00:00
Jessica Lawshe 49a00ef0e2 Merge pull request #36310 from overleaf/jel-confirm-existing-email
[web] Check if domain captured by group when showing confirm email UI

GitOrigin-RevId: bb6add82e083497c8036739d877610a47e35ecfd
2026-09-17 12:02:03 +00:00
Jakob Ackermann 640a2e1c60 [web] remove unused link=false flag from /user/oauth-unlink (#36566)
GitOrigin-RevId: 5a8af17bf339df62a6cf54d6c372bff4cbe88eb3
2026-09-17 12:01:23 +00:00
ilkin-overleaf 7cfdd0f75a Merge pull request #36230 from overleaf/ii-workspaces-projects-page
Empty states for the project list views

GitOrigin-RevId: 3ce8e327bb675f3c63763e7599396020a4252025
2026-09-17 12:00:54 +00:00
Jimmy Domagala-TangandTim Gibbon baa9cf78d9 Adding 2025 and 2026 incremental compiles options (#35850)
* feat: adding 2025 and 2026 incremental compiles options

* feat: remove dmtcp from compiler list and autoselect checkpointing version with labs inclusion

* feat: updating seccomp profile for checkpointing

* feat: disable non-premium dmtcp compiles, and align checkpoint version detection between clsi and web

* feat: adding in reminder of checkpoint experiment, and using session based split test retrieval

* Increase Packer build.sh timeout from 1h15m to 1h30m as build takes approx 1h

* fix: moving checkpointing check from tag name based to hasCheckpointing flag set as part of allowed_images, and removing uneeded seccomp rule

* feat: move variant/ image selection to CLSI, and have web control only what options to set for a compile. removing uneeded extra variants from webs list of allowed images

* feat: adding compile timer as a query string as well

---------

Co-authored-by: Tim Gibbon <tim.gibbon@overleaf.com>
GitOrigin-RevId: cdbdf76a62dcd5a585925f18d64b6cb9cd6ed373
2026-09-17 12:00:46 +00:00
Antoine ClausseandClaude Fable 5 0e510226fa [web] Format paused reactivation date in UTC via shared helper (#36600)
The paused branch of getFormattedRenewalDate formatted the reactivation
date in the viewer's local timezone with a hand-rolled format literal,
while the surrounding dates are UTC. Compute the reactivation date in
UTC and format it with formatPaymentDate.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
GitOrigin-RevId: 1f1679c1988c696c16c78bd11152d6a39a20c4e1
2026-09-17 12:00:22 +00:00
Mathias Jakobsen 0dd792b146 Merge pull request #36677 from overleaf/mj-fix-tag-hsl
[web] Allow derived HSL values for tags

GitOrigin-RevId: c9617a8b289e361f3dd438c7d81d8b3c1d5cb645
2026-09-17 11:59:32 +00:00
Olzhas Askar 6053781e57 Merge pull request #36496 from overleaf/oa-annual-events
[web] Subscription event segmentation

GitOrigin-RevId: fdc25ac7bc7320ed82617b7c27c12a17eb31d723
2026-09-17 11:59:20 +00:00
Mathias Jakobsen 1f9873e391 Merge pull request #36575 from overleaf/mj-generic-modals-themes
[web] Add dark mode to ide modals

GitOrigin-RevId: cd8e95e2286df46510a377ff9a69c4ab646ceabd
2026-09-17 11:59:00 +00:00
John Lees-MillerandClaude Opus 5 1ecdd122d0 Add Stripe migration features for stage 7 testing (part 2) (#35890)
* upsert: migrate US/CA PayPal without a payment method when flagged

getPaymentMethod no longer throws for a PayPal billing agreement destined for
Stripe US/CA when the account is flagged ignore_payment_method; instead it
returns null so the customer is migrated without a default payment method
(the send_invoice paymentMethodPending flow). Unflagged accounts still throw.

* finalize: expect the plan-code remap for legacy-plan subscriptions

When a subscription carries legacy_remap=1 metadata, compare the Stripe product's planCode against the recorded target plan code instead of the raw Recurly plan code, so the intentional remap is not misread as drift (the price is preserved, so the amount comparison is unchanged). Clear the legacy_remap metadata during post-migration cleanup.

* finalize: expect the assistant add-on reprice

When a subscription carries assist_addon_repriced=1 metadata, compare the assistant item against the recorded target amount (Stripe minor units) instead of the raw Recurly amount, so the intended reprice is not misread as drift. Clear the reprice metadata during post-migration cleanup.

* create_coupons: create migration coupons by name with amount_off, currency and product scope

Create the pipeline's per-region coupon_specs_<region>.csv coupons by name (idempotent, auto-paginated), supporting amount_off + currency (fixed) or percent_off, duration, and applies_to.products, with no promotion code. Region comes from the existing --region flag. The existing name-based percent-off + promotion-code path is unchanged.

* finalize: schedule the pending change as a phase 2

For a subscription flagged pending_change_scheduled, compare drift against the current Recurly state (not the pending change), then in Step 7 release the toolkit schedule and create a fresh two-phase subscription schedule (current until renewal; pending state from renewal with proration disabled and end_behavior release), clearing the scheduling metadata once the schedule exists.

* finalize: flag address-pending migrations and push the needs_to_update_address trait

When a migrated subscription carries metadata.addressPending, append -address-pending to the finalization status and push needs_to_update_address to customer.io (alongside the existing tax-info-pending handling), so the customer can be driven to add a billing address. The flag stays on the subscription so the customer.updated webhook can enable automatic_tax and clear it once the address resolves.

* webhook: heal address-pending migrations when the tax location resolves

On customer.updated (address/tax change), for a customer whose location is no longer unrecognized_location, enable automatic_tax on their migrated subscriptions still flagged metadata.addressPending and clear the flag. Enabling automatic_tax is rejected by Stripe while the location is still invalid, so the update is a safe idempotent no-op until the address is fixed; the cancellation state is never touched.

* cron: cancel unresolved address-pending subscriptions before they renew untaxed

Backstop for the address-pending cohort: searches the address-pending subscriptions in a region and, for any about to renew (within a configurable lead window) whose customer location is still unrecognized_location, cancels it at period end so it never renews untaxed. Skips subscriptions that are already cancelling and those whose location has resolved (healed by the webhook). Dry-run unless --commit.

* upsert: set tax.validate_location=auto on customer update

Conform PAN-copied customers to the account's default tax-location validation. Uses 'auto' rather than 'immediately' (which throws for country-only addresses and would break the address-pending migration flow).

* finalize-migration: send payment method info to customer.io

Add payment_method (card/paypal/none) and needs_to_add_payment_method
traits to the stripe_migration customer.io payload so the migration
email campaign can personalise per payment method without enumerating
the full cross-join. The payment method is read from the already-fetched
customer/subscription (default_payment_method now expanded on that fetch),
so no extra Stripe request is made. Also report a -payment-method-pending
status suffix in the CSV output.

* upsert: flag customers whose address Stripe cannot resolve

After pushing the Recurly address, read customer.tax.automatic_tax; when it is 'unrecognized_location', record address_unrecognized in the output so the subscription is migrated untaxed (address-pending) instead of failing at the billing-migration toolkit. This is the authoritative, region-agnostic detector (covers US/CA country-only and broken non-US addresses, e.g. India with a postal but no state/city). Adds isCustomerAddressUnrecognized helper + unit tests.

* Close reactivation-without-valid-address loophole

* webhook: detect newly-set address/tax with !== undefined

Review follow-up: the address-pending heal guard used a truthy check, which
would miss an address newly set from empty. Harmonise with _billingChanges,
which already uses !== undefined.

* upsert: set tax.validate_location via customerParams

Review follow-up: move the tax.validate_location='auto' directive into the
assembled customerParams instead of overriding it inline at the update call,
so it also appears in the dry-run output.

* create_coupons: guard migration coupons against ambiguous discount specs

Review follow-up: throw a clear per-coupon error if a migration coupon spec
has neither or both of amount_off/percent_off, catching data-processing
issues instead of silently sending percent_off=NaN.

* Rely on presence of customer.tax

* webhook: cover the address-pending heal path in unit tests

The customer.updated fixtures carried no `tax` hash and the mocked region
client had no `stripe` property, so the one test that reached the heal branch
threw and was swallowed by the caller's error handler. The heal logic had no
real coverage as a result.

Add the missing fixture fields and tests covering the heal itself, the
still-unrecognized early return, the skip rules for unflagged and cancelled
subscriptions, the Stripe rejection path that leaves the flag set, and the
missing-tax guard.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
GitOrigin-RevId: 8162e3e0f01e136d3aa560c22e98f43e36da4eb5
2026-09-17 11:58:48 +00:00
Domagoj Kriskovic d7b4ef33ed Add "New" badge to library nav link and a feedback link on the library page
GitOrigin-RevId: 6c936ca8168dd718c4eaf806f426d5c00078add8
2026-09-17 11:58:32 +00:00
Andrew Rumble d9b8aa1322 Merge pull request #36592 from overleaf/ar-remove-unused-output-zip-query-params
[web] remove unused query params from download all link

GitOrigin-RevId: e6c1ac8d8c7f369d7ea99c39ed0f0c3c596580b7
2026-09-17 11:58:00 +00:00
Alf EatonandMathias Jakobsen 8c869db734 Replace unload handlers with visibilitychange (#36387)
Co-authored-by: Mathias Jakobsen <mathias.jakobsen@overleaf.com>
GitOrigin-RevId: 3b52b09445597d93eb5fdfa5a343fbc2fac14d6c
2026-09-17 11:57:24 +00:00
Mathias Jakobsen aac9e669a3 Merge pull request #36548 from overleaf/jd-upload-file-delete-icon
[web] Use themed danger colour for figure modal's remove icon

GitOrigin-RevId: b881d3a08d22636c5c521a114499b650af6e6c82
2026-09-17 11:57:18 +00:00
ilkin-overleaf 0113c8ee9f Merge pull request #35936 from overleaf/ii-workspaces-subscription-admin-settings
Shared Workspace settings for subscription admins

GitOrigin-RevId: 61cc45a48aaf1709905e98b3cccf09b50e2afa84
2026-09-17 11:57:14 +00:00
Mathias Jakobsen 51ae580da9 Merge pull request #36539 from overleaf/mj-misc-dark-mode-modals-core1
[web] Add dark mode to misc editor modals

GitOrigin-RevId: 3d7bd45476b0f814abfc26fa3da3eecca54342e8
2026-09-17 11:57:06 +00:00
Mathias Jakobsen 034b9e35be Merge pull request #36573 from overleaf/mj-review-panel-modal-theme
[web] Add theme support to review panel modal

GitOrigin-RevId: e5bfc4a4affdb6352e81bbf835d64832ec249422
2026-09-17 11:57:02 +00:00
Alexandre Bourdin 329eca74c1 Merge pull request #36210 from overleaf/ab-fix-focus-mode-shortcut-linux
[web] Fix Focus mode shortcut showing Mac control glyph on non-Mac platforms

GitOrigin-RevId: d2f9f068ab9a2585813fbb777a6ab4fb41d386a2
2026-09-17 11:56:40 +00:00
Domagoj Kriskovic 0adf9ea45c [visual-markdown-editor] Support for images for in project files
GitOrigin-RevId: 488ebcfc6429cfa2ce4f919f8c736822c80fdca1
2026-09-17 11:56:36 +00:00
Mathias Jakobsen 531718c874 Merge pull request #36521 from overleaf/mj-project-list-themed-modals
[web] Add theme support to most project list modals

GitOrigin-RevId: fd61f096c2a3f021795c30a490c7fe2d4dc13100
2026-09-17 11:55:59 +00:00
Antoine Clausse b2139b170c [web] Remove SubscriptionFormatters, format subscription dates in the frontend (#36409) (#36476)
* Reapply "[web] Remove SubscriptionFormatters, format subscription dates in the…"

This reverts commit 2939e71e5b919529cbb8a602916d5f597d117792.

* Fixup after rename conflict: `nextPaymentDueDate`->`periodEnd`

GitOrigin-RevId: c024a3a2cd08c1f8f9d4c99f9ba6f018d334439e
2026-09-17 11:55:52 +00:00
Eric Mc Sween 2d3474fbdb Merge pull request #36494 from overleaf/em-remove-visual-options
Remove the Options object from the visual editor extensions

GitOrigin-RevId: f06e60b88ef77d3a670d7d956d1a86c116d71873
2026-09-17 11:55:18 +00:00
Mathias Jakobsen 33e2a1e282 Merge pull request #36526 from overleaf/mj-command-palette-network-stall-files
[web] Avoid searching files when network is stalled

GitOrigin-RevId: 08707b1c8a7e0088e8fee6ead3e74bdd807514c7
2026-09-17 11:55:12 +00:00
Mathias Jakobsen 1edb50de7b Merge pull request #36505 from overleaf/mj-themed-url-field
[web] Enable dark mode url fields

GitOrigin-RevId: 97e820e773e9d1528a5e852f10fa31fab84a185b
2026-09-17 11:55:09 +00:00
Kristina 3e11985e59 [web] prevent dangling comments by using the thread's doc id in operations (#36423)
GitOrigin-RevId: 9f3ddf282a058e92419e772b583169ac8bfe4af9
2026-09-17 11:54:06 +00:00
Mathias Jakobsen 2cb515ac2f Merge pull request #36463 from overleaf/mj-themed-history-modals
[web] Add theme support to history modals

GitOrigin-RevId: 10cc2176b91213342e066fad8ff0eba265d868ec
2026-09-17 11:54:00 +00:00
Mathias Jakobsen 6a800028be Merge pull request #36474 from overleaf/mj-themed-file-tree-modals
[web] Add dark mode file tree modals

GitOrigin-RevId: 8bfd548eedd16fd6848a9d6460cdd7f1be50d759
2026-09-17 11:53:55 +00:00
Mathias Jakobsen 99f0b2d562 Merge pull request #36446 from overleaf/mj-themed-keyboard-shortcuts
[web] Add theme support to keyboard shortcuts modal

GitOrigin-RevId: c92088cbe81a58431627b2343df5d90b68f2bc60
2026-09-17 11:53:51 +00:00
Mathias Jakobsen 67478b1b56 Merge pull request #36453 from overleaf/mj-themed-table-generator-modals
[web] Add dark mode support for table generator modals

GitOrigin-RevId: aeb0d0e8eae2b4257c287cc322d1eb7b8d9b9a35
2026-09-17 11:53:48 +00:00
Mathias Jakobsen dfda63f060 Merge pull request #36470 from overleaf/mj-themed-uppy-figure-modal
[web] Use themed uppy in figure modal

GitOrigin-RevId: 54e92a40516a947befdd4d1f758dae631703672f
2026-09-17 11:53:44 +00:00
Mathias Jakobsen a7c830ee23 Merge pull request #36438 from overleaf/mj-themed-figure-modal
[web] Support theming in figure modal

GitOrigin-RevId: 31fcc5b8585cb9f81ff073fbc07b7b36e04ba54d
2026-09-17 11:53:41 +00:00
Mathias Jakobsen e8ee19d17d Merge pull request #36408 from overleaf/mj-context-menu-flag-teardown
[web] Tear down editor-context-menu flag

GitOrigin-RevId: 80cc2ebaf62ec1bd6064b0f96b884d159a9d4b5f
2026-09-17 11:53:38 +00:00
Mathias Jakobsen 06b4124aca Merge pull request #36407 from overleaf/mj-tabs-teardown
[web] Tear down tabs feature flag

GitOrigin-RevId: c25a3abe5c4b85f9802751bb1882385ed9c50a4a
2026-09-17 11:53:28 +00:00
Mathias Jakobsen 57697c6c56 Merge pull request #36405 from overleaf/mj-remove-context-menu-survey
[web] Remove context menu survey

GitOrigin-RevId: 841705a3874e870ee38968aa56e7db7eea1c3f01
2026-09-17 11:53:25 +00:00
Antoine Clausse 07835f92b3 Merge pull request #36475 from overleaf/revert-36409-ac-remove-subscription-formatters
Revert "[web] Remove SubscriptionFormatters, format subscription dates in the frontend"

GitOrigin-RevId: d4c6bb600f7315c27016a45a8250a61b46de0119
2026-09-17 11:52:51 +00:00
Antoine Clausse ba4f024f34 [web] Remove SubscriptionFormatters, format subscription dates in the frontend (#36409)
* [web] Remove SubscriptionFormatters, format subscription dates in the frontend

Replace the server-formatted nextPaymentDueAt/nextPaymentDueDate/
trialEndsAtFormatted fields with the raw periodEnd date and format in
the React dashboard (same strings as before, English + UTC). Also
consolidate hand-rolled trial checks onto isInFreeTrial /
SubscriptionHelper.isInTrial.

* [web] Remove the now-unused dateformat dependency

* [web] Address review: payment-dates unit test, UTC dates in acceptance test

Add a dedicated unit test asserting the exact formatted strings from
formatPaymentDate/formatPaymentDateTime, and use explicit UTC timestamps
in the SubscriptionDashboard acceptance fixtures instead of
local-timezone Date constructors.

GitOrigin-RevId: 16ac4f1098b14ef9f1478d22cf39c1357ead7dea
2026-09-17 11:52:44 +00:00
Eric Mc Sween 62e4164269 Merge pull request #36345 from overleaf/em-library-design-review
[web] Library design review fixes

GitOrigin-RevId: dfd1846d275eb975906a2fe8a8c4dee057c51d1f
2026-09-17 11:52:11 +00:00