119 Commits

Author SHA1 Message Date
claude 974a9c4fb3 fix(typst): restore HeadingMark+HeadingTitle with character-level bleed guard
Build and Deploy Verso / deploy (push) Successful in 10m0s
The single-HeadingLine token approach caused everything after the first
heading to be unparsed. Reverting to the two-token structure but adding a
backward character scan in headingTitleTokenizer: after canShift(), walk
backward past whitespace and require '=' immediately before the current
position. Body-text positions in LALR-merged states will have a letter or
closing bracket there instead, so the tokenizer returns without accepting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 18:17:17 +00:00
claude 34025dc084 fix(typst): use HeadingLine single token to fix inline element highlighting
Build and Deploy Verso / deploy (push) Successful in 9m35s
The two-token approach (HeadingMark + HeadingTitle) caused LALR state
merging: the parser state waiting for HeadingTitle after HeadingMark was
merged into body-text item* states. In those merged states the
headingTitleTokenizer fired for every paragraph line, swallowing bold,
italic, math and inline function tokens — leaving body text black.

Fix: collapse the heading into a single HeadingLine external token that
covers the entire heading line (= prefix + title). A single-token Heading
rule leaves no post-token parser state waiting for a second token, so no
LALR merging can occur. The ViewPlugin and all HeadingMark/HeadingTitle
infrastructure are removed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 16:55:09 +00:00
claude 0099672015 fix(typst): restore HeadingTitle token to fix broken syntax highlighting
Build and Deploy Verso / deploy (push) Successful in 10m12s
Removing HeadingTitle from the grammar left HeadingTitle? undeclared,
causing the Lezer grammar compiler to fail and producing no parser
output — hence everything rendered as unstyled black text.

Dual approach to prevent heading style bleed:
- HeadingTitle exists in grammar with contextual: true + canShift guard
  (prevents it from matching in body-text LALR states)
- HeadingTitle is intentionally absent from styleTags so even spurious
  matches cannot apply heading colour to body text
- ViewPlugin styles heading titles by finding HeadingMark nodes and
  extending tok-heading decoration to end-of-line

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 15:38:38 +00:00
claude a5ca432396 Fix heading bleeding and smooth_pdf_transition translation
Build and Deploy Verso / deploy (push) Successful in 13m35s
Two fixes:

1. Heading style bleeding (Typst): the HeadingTitle external token approach
   was unreliable — even with contextual:true and canShift(), body text was
   being styled as headings. Remove HeadingTitle from the grammar entirely.
   Instead, a ViewPlugin (headingLinePlugin in languages/typst/index.ts)
   walks the syntax tree, finds HeadingMark nodes, and decorates the rest of
   the line with tok-heading class + bold. This is unconditionally correct
   because it is based on the syntax tree rather than the LR tokenizer state.

2. smooth_pdf_transition raw key shown in all locales: the key was in the
   JSON locale files but missing from extracted-translations.json, which is
   the allowlist the webpack translation loader uses to decide what to bundle.
   Add it there so all locales (including fr, es, de already added) resolve
   to their translated strings.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 14:22:16 +00:00
claude 07c72cf7e5 typst: stop heading title at // or /* comment markers
Build and Deploy Verso / deploy (push) Successful in 9m24s
headingTitleTokenizer now stops reading when it encounters '//' or '/*',
so '= Heading // note' correctly produces a HeadingTitle token for 'Heading'
and a LineComment for the rest of the line.  Without this, the comment was
consumed into HeadingTitle, getting heading highlight and appearing verbatim
in the file outline.

Also strip trailing line comments from heading titles in the regex-based
document outline scanner, which reads raw text independently of the tree.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 08:27:02 +00:00
claude 2f3e3e7363 fix(typst): make HeadingTitle an external token to end LALR conflicts
Build and Deploy Verso / deploy (push) Has been cancelled
Any item shared between headingTitleItem and document-level item causes
a shift/reduce conflict: the LALR automaton merges the two contexts and
makes the shared token ambiguous. The only structural fix is to make
HeadingTitle a terminal (external tokenizer) that reads greedily to EOL,
giving the LR state machine a context-isolated token that can never
collide with document-level item tokens.

Removes headingTitleItem sub-rule, HeadingText token, and updates
styleTags to match HeadingTitle directly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 21:14:18 +00:00
claude 045d458875 feat(editor): native Lezer grammar for Typst syntax highlighting
Build and Deploy Verso / deploy (push) Has been cancelled
Replace the StreamLanguage tokenizer with a full LR grammar compiled by
@lezer/generator, giving Typst the same parse-tree infrastructure that
LaTeX and BibTeX already use.

Grammar features:
- Headings (=, ==, …) via SOL-detecting external tokenizer
- Code expressions (#keyword, #func(args), #ident.method, #{…}, #[…])
- Named argument highlighting (key: value in function calls)
- Inline and display math ($…$)
- Strong (*…*) and emphasis (_…_) with bold/italic formatting
- Raw blocks (```lang…```) and inline raw (`…`)
- Nested block comments (/* /* */ */) via depth-tracking external tokenizer
- Labels (<name>) and references (@name)
- Backslash escapes

Infrastructure changes:
- lezer-typst/typst.grammar — new Lezer grammar
- lezer-typst/tokens.mjs — external tokenizers for context-sensitive lexing
- scripts/lezer-latex/generate.mjs — Typst added to grammars array so the
  existing lezer-latex:generate script (and Dockerfile step) compile it
- .gitignore — generated typst.mjs / typst.terms.mjs excluded from git

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 19:49:17 +00:00
claude 2c0f387cef feat(editor): use @codemirror/lang-yaml for Quarto YAML frontmatter
Build and Deploy Verso / deploy (push) Successful in 12m20s
Replace the custom regex-based ViewPlugin with the official
@codemirror/lang-yaml package. yamlFrontmatter({ content: mdLS })
wraps the Markdown language with a mixed parser: the leading ---/---
block is handed to the full Lezer YAML parser (proper key/value/scalar/
anchor/alias highlighting), while the document body continues to use
the Markdown parser. The manual Frontmatter extension import is also
removed since yamlFrontmatter handles frontmatter recognition itself.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 18:30:35 +00:00
claude f9788a1c69 feat(editor): improve syntax highlighting for Typst and Quarto documents
Build and Deploy Verso / deploy (push) Successful in 10m50s
Typst: heading tokenizer now colors the entire heading line (not just the
'=' prefix), and bold/italic markers (*/_) map to strong/emphasis tags
rather than the generic operator tag. A typstHighlightStyle applies
bold/italic formatting even when the active theme lacks .tok-heading.

Quarto: enable @lezer/markdown's Frontmatter extension so the YAML header
is no longer mis-parsed as Setext headings. A new ViewPlugin decorates
frontmatter lines with type-appropriate CSS classes: keys (tok-typeName),
string/bool/number values, comments, and the --- delimiter markers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 17:42:51 +00:00
claude 8272d6de88 Editor/dashboard polish: PDF publish, Typst outline, bigger branding
Build and Deploy Verso / deploy (push) Successful in 9m29s
- Hide the Present button when the current output is a PDF (it only makes
  sense for HTML/RevealJS decks).
- Publish now supports PDF projects: snapshot output.pdf and serve it inline
  via a small index.html wrapper at /p/:token, so link holders can view the
  PDF straight from the published version.
- Add a Typst document outline (scans '=' headings) wired into the file
  outline panel.
- Dashboard branding: enlarge the instance-name/version text and let the
  sidebar Verso wordmark span the full column width.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 08:33:56 +00:00
claude 4fc86ebd3d Editor: qmd/typst autocomplete, format column, compiler gating, Verso loader
Build and Deploy Verso / deploy (push) Successful in 9m48s
- Add a Typst language (stream highlighting + completions) for .typ, and
  Quarto completions (code chunks, callouts, cross-refs) for .qmd/markdown.
- Project dashboard: new Format column (Quarto/Typst/LaTeX) from the cheap
  project compiler field, surfaced through the projects list API.
- Compiler dropdown: grey out engines that don't match the root file's
  extension (.qmd->Quarto, .typ->Typst, .tex->LaTeX engines).
- Replace the Overleaf fill loader with an animated Verso logo: the four
  quadrant circles drift on their own orbits while colour warms up with load
  progress; reused on the token-access screen too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 07:47:31 +00:00
claude 56d66b109e Outline: ignore YAML frontmatter and strip Quarto attribute blocks
Build and Deploy Verso / deploy (push) Successful in 12m25s
Two fixes to the Markdown/Quarto file outline:

1. The last frontmatter line (e.g. `format: typst`) appeared as a
   heading. The Lezer Markdown grammar has no frontmatter support, so it
   reads the closing `---` of the YAML block as a Setext underline and
   promotes the line above it to a heading. Detect the leading
   `---`...`---`/`...` block and skip any heading inside it.

2. Pandoc/Quarto attribute blocks were shown in titles, e.g.
   `## Slide {.smaller auto-animate="true"}`. Strip a trailing `{...}`
   from the extracted title.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 08:30:15 +00:00
claude b6c1a2d5ce Fix empty titles in Markdown/Quarto file outline
Build and Deploy Verso / deploy (push) Successful in 12m13s
The outline entries showed up at the right lines and jumped correctly,
but their titles were blank. The text-extraction walked the heading
node's children and collected non-HeaderMark child text — but in the
Lezer Markdown grammar a heading has NO child node for its text; the
only children are the HeaderMark nodes. The title text lives in the
gaps between marks, so the walk collected nothing.

Slice the whole heading's source instead and strip the markers:
leading/trailing '#'s for ATX headings and the '==='/'---' underline
for Setext headings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 08:04:42 +00:00
claude 1e5ce6c068 Add document outline support for Markdown/Quarto files
Build and Deploy Verso / deploy (push) Successful in 10m47s
outline.ts: export NestingLevel so it can be used outside the file.

markdown/document-outline.ts: new enterMarkdownNode function that walks
  the Lezer Markdown syntax tree and extracts ATXHeading1-6 and
  SetextHeading1-2 nodes, mapping them to the same NestingLevel enum
  used by the LaTeX outline (Section→SubSection→SubSubSection…).
  Wrapped in makeProjectionStateField for incremental updates.

markdown/index.ts: register markdownDocumentOutline as a CodeMirror
  extension in the Markdown LanguageSupport so the StateField is active
  whenever a .qmd file is open.

codemirror-outline.tsx: fall back to markdownDocumentOutline when the
  LaTeX documentOutline StateField is not present in the editor state
  (i.e. when the active language is Markdown, not LaTeX).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 14:35:01 +00:00
Alf Eaton efab968153 Treat qmd and rmd extensions as Markdown (#33786)
GitOrigin-RevId: 89d79e958ea08f3388bde8dc561b04f87a1b6549
2026-05-20 08:06:36 +00:00
Malik Glossop e2de08ca86 Merge pull request #33146 from overleaf/copilot/fix-code-folding-bug
Fix code folding when a comment or blank line precedes an indented sectioning command

GitOrigin-RevId: 2a955311c1ce073b2eb80fdfbf45d00705e22d69
2026-05-05 08:05:57 +00:00
Copilot e59cbc61cf Merge pull request #33134 from overleaf/copilot/fix-autocomplete-subparagraph
GitOrigin-RevId: 2ca0b9ab5de393b9b0a256c81450f57d933376fc
2026-04-29 08:06:08 +00:00
Alf Eaton fdadfaab45 Remove non-LaTeX file extensions (#32339)
GitOrigin-RevId: 370a27838ddc017b5b0926e47d550729d54d73aa
2026-04-22 08:06:35 +00:00
Domagoj Kriskovic 138f7f8023 feat: add Python support with Pyodide integration
GitOrigin-RevId: 382ce102c43050aace691dd89d825a94abf347a8
2026-03-09 09:05:34 +00:00
Malik Glossop ab5be2261b Merge pull request #31952 from overleaf/mg-context-menu-autocomplete
Do not open autocomplete menu after right-click in empty curly braces

GitOrigin-RevId: c5f6cce9a093ce0f3aad08f5968e743ce373efc9
2026-03-06 09:14:21 +00:00
Domagoj Kriskovic 0d71cc18fd [web] linting errors for visual bibtex editor
GitOrigin-RevId: 8c527eb314e21233f6be648b1a1cdb039db8d9b1
2026-02-19 09:05:13 +00:00
Eric Mc Sween d9cf720566 Merge pull request #31239 from overleaf/em-bibtex-grammar
Improvements to the lezer grammar for BibTeX

GitOrigin-RevId: 33ece6f3c6a34380aa7b2a46ff624aff3ccf8a10
2026-02-05 09:05:44 +00:00
Mathias Jakobsen 0110ac4715 [web] Convert LaTeX linter to Typescript (#29483)
GitOrigin-RevId: ec79e95db03bbea60da01eb8b35989978e1ec33a
2025-11-11 09:05:39 +00:00
Mathias Jakobsen f9d0f7e3ee Merge pull request #28893 from overleaf/mj-linter-brace-check
[web] Allow braces in documentclass options

GitOrigin-RevId: 9675d3fc760a3b7d402c5a9df57a0cf183a1e648
2025-10-09 08:05:31 +00:00
Alf Eaton 141aca070a Add support for \subfile (#28517)
* Add \subfile to LaTeX grammar
* Handle \subfile in word count
* Show tooltip for \subfile in Visual Editor
* Add subfile completions

GitOrigin-RevId: d9c4308581bd3f25accb97f2191ffe1e5a64764e
2025-09-18 08:05:39 +00:00
Alf Eaton 8d1f12e6ea Ensure variables are defined when handling message from lint worker (#27561)
GitOrigin-RevId: 69e18c41707be360eb30657780915efb0d1c9aa7
2025-08-07 08:05:37 +00:00
Alf Eaton 677ebf3590 Use "*:placeholder" as placeholder label (#27520)
GitOrigin-RevId: eb6566e8cab401675df21a54d0b1035fd6e8a8df
2025-08-01 08:05:58 +00:00
andrew rumble f871130773 Disable lint warnings for stubbed class
GitOrigin-RevId: bcee2d1ea4fcb5543fa31fd2174641e55d6c4d39
2025-06-11 08:06:00 +00:00
andrew rumble 4960569648 Remove unused full arguments
As distinct from removing destructured props.

GitOrigin-RevId: d02ad8d36fb532559ed2899268d7b699f2f2fa37
2025-06-11 08:05:46 +00:00
Alf Eaton fe4f41501f Parse labels from environment options (#24189)
GitOrigin-RevId: e51eed7521f6e32e614f8b38092a0b0219f7f186
2025-03-11 09:05:31 +00:00
Alf Eaton 36acad4d1b Rename $SectioningCommand to $SectioningCtrlSeq or $Section (#21534)
GitOrigin-RevId: 5b3173d82ec4c00fe69e2ab059bf48a872a4ca3e
2024-11-18 09:04:51 +00:00
Alf Eaton 2dee905361 Merge pull request #21535 from overleaf/ae-grammar-grouping
* Move $MathContainer grouping into the LaTeX grammar
* Remove $Environment grouping from NodeProp.group

GitOrigin-RevId: 96c74edd818bf84acf4b492702864c3c71a9bee3
2024-11-18 09:04:46 +00:00
Alf Eaton 66fee7a794 Only use the LaTeX indent service for when inserting a line break (#21530)
GitOrigin-RevId: 15c5e5afdee59badc833fe2deb13a80b3c409862
2024-11-12 09:05:30 +00:00
Alf Eaton db8d7a7af0 Upgrade CodeMirror dependencies (#20618)
GitOrigin-RevId: c1d45e73784fd26db09e9930bc504d2d78c05b12
2024-11-08 09:04:39 +00:00
Alf Eaton 562a4e4ce6 Avoid spell checking list environment arguments (#21483)
GitOrigin-RevId: 8fe56c53b503abddcc4f0d996707e3df12309362
2024-11-06 09:05:17 +00:00
Alf Eaton 7fa8c01e31 Disable spell check in setlength arguments (#21491)
GitOrigin-RevId: 279f5df7c97b6a6caa5a344bf50b0747402cf61d
2024-11-06 09:05:13 +00:00
Alf Eaton 3d5bceffee Disable spell check for figure environment optional argument (#21417)
GitOrigin-RevId: cbf6a072b9675a69176123d14ec34d97a0277b0a
2024-10-31 09:04:45 +00:00
Alf Eaton c0d6a9c5f0 Use noSpellCheckProp NodeProp to exclude node types from spell check (#21335)
GitOrigin-RevId: 91ba72285b0f01c3c00fdb1a64c30e9ff67f72f5
2024-10-28 09:05:16 +00:00
Alf Eaton b81472329e Use cls for documentclass completion type (#20981)
GitOrigin-RevId: 938eaac212c7e08600db111563094c0447fafb9b
2024-10-14 11:09:21 +00:00
Mathias Jakobsen ee2e95ec01 Merge pull request #20987 from overleaf/mj-write-and-cite-settings-icons
[web] Add setting icons to Write and Cite section headers

GitOrigin-RevId: 18e5eefeb1271d17812b83f152e4d464a66185f8
2024-10-14 11:08:09 +00:00
Alf Eaton 53d6b4dfd0 Set workerPublicPath in webpack config (#20629)
GitOrigin-RevId: 3fba33a6b52bf2a91f3126efc9d76f6f1dfbc1c4
2024-10-14 11:06:45 +00:00
ilkin-overleaf 35728d7681 Merge pull request #20436 from overleaf/ii-bs5-editor-toolbar
[web] BS5 editor toolbar

GitOrigin-RevId: a517fd52d648d165e89231d6f5551c026a951c43
2024-10-01 08:04:42 +00:00
David 9cf94e57d3 Include \def, \let, \newenvironment and \renewenvironment commands in the math preview (#20197)
* Include \def commands in command definitions

* Allow command name to be in CtrlSym

* Pull nodeIntersectsChange check out of branches

* Fix \def handling

* Add handling for \newenvironment and \renewenvironment

* Allow \def to have optional arguments

* :x
Revert "Add handling for \newenvironment and \renewenvironment"

This reverts commit a70d3a0a13ed552daf3b761893e3f8609f0b0fc8.

* Add let commands to defintions

* Add environment names to math preview

* Ignore let command definitions in autocomplete

* Move nodeIntersectsChange check back into each block

* Add childOfNodeWithType utility and use to get command names

* commandNameText -> commandName

* Only include environment definitions

* Rename documentEnvironmentNames to documentEnvironments

* EnvironmentName -> Environment

* Format

GitOrigin-RevId: 9c5d701423ae786e5ff91960b4bcd94cd35d21c8
2024-09-17 08:04:53 +00:00
Mathias Jakobsen a46219b055 Merge pull request #19308 from overleaf/mj-mendeley-search
[web+third-party-references] Add Mendeley search to Write & Cite

GitOrigin-RevId: 97c32076a178a71e37b0b57c543e98e44ef84f44
2024-08-15 08:05:11 +00:00
Eric Mc Sween c117483761 Merge pull request #19882 from overleaf/mj-tcblisting
[web] Mark tcblisting as verbatim

GitOrigin-RevId: a64602b2b0d41c32e5f8612f190c6f5f8382f94b
2024-08-14 08:04:59 +00:00
Mathias Jakobsen 39f10a82bb Merge pull request #19834 from overleaf/mj-cite-key-search-teardown
[web] Tear down cite-key-search event

GitOrigin-RevId: 24cc18c276f166fbe474c99e384f8572ce7ee0ec
2024-08-08 08:04:30 +00:00
Mathias Jakobsen 7aaa78e635 Merge pull request #19788 from overleaf/mj-cite-key-search-ref-providers
[web] Add ref provider info to cite-key-search event

GitOrigin-RevId: 1f3828e3f5305f06190332b637860fde606f7484
2024-08-07 08:04:19 +00:00
Alf Eaton 603ff28df0 Add text formatting commands to the LaTeX grammar (#19607)
GitOrigin-RevId: f69cd323992c80de3f0a458a637fa8f160017076
2024-08-02 08:06:11 +00:00
Mathias Jakobsen 6d5e503aba Merge pull request #19672 from overleaf/mj-fix-event-segmentation-cite
[web] Fix BQ even segmentation

GitOrigin-RevId: 1332e6dc1214129f1c1d628e138a3ad066c10bf6
2024-07-31 08:04:39 +00:00
Mathias Jakobsen 4eb88a6d1a Merge pull request #19531 from overleaf/mj-cite-key-analytics
[web] Add analytics for cite key searches

GitOrigin-RevId: f9215a6db8defb4d7c8356e997b671223cfcfb70
2024-07-31 08:04:23 +00:00