Sync Dev

Merged
BO
3mo ago
+2440-1610

What does this PR aim to accomplish?:

Promotes dev to master, releasing 3.5.4 as a production release (master is currently on 3.5.0).

This rolls up four prereleases:

VersionPRChange
3.5.1#986Fix Violentmonkey SyntaxError — wrap async init block in an IIFE
3.5.2#989Use Monaco Editor in submitpage.php, with code saving on edit
3.5.3#992Eliminate dark-mode flash (FOUC/CLS) in MonochromeUI / NewBootstrap
3.5.4#997Pin Monaco to 0.52.2 to stop intermittent editor load failures

How does this PR accomplish the above?:

A straight merge of dev into master. Merging triggers UpdateToRelease.js, which flips "Prerelease": false on the 3.5.4 entry in Update.json and cuts the production release.

Verification done before opening:

  • Merge is conflict-free — confirmed with git merge-tree --write-tree origin/master origin/dev (exit 0). 31 commits ahead.
  • All checks green on dev HEAD (0da6227): CodeQL, Prerelease, Sync.
  • Versions are in sync at 3.5.4 across package.json, XMOJ.user.js @version, and the Update.json key.
  • The master-only changes to ads.txt and index.html are preserved — dev has not touched either file since the merge base (ec4cadc), so the merge takes master's side and does not resurrect the removed Google Ads script.

Not included in this release (both target dev, CI-only, no userscript impact): #995 actions/setup-node 4→7, #996 actions/labeler 4→7.


By submitting this pull request, I confirm the following:

  1. I have read and understood the contributor's guide, as well as this entire template. I understand which branch to base my commits and Pull Requests against.
  2. I have commented on my proposed changes within the code.
  3. I have tested my changes.
  4. I am willing to help maintain this change if there are issues with it later.
  5. It is compatible with the GNU General Public License v3.0
  6. I have squashed any insignificant commits. (git rebase)
  7. I have checked that another pull request for this purpose does not exist.
  8. I have considered and confirmed that this submission will be valuable to others.
  9. I accept that this submission may not be used, and the pull request can be closed at the will of the maintainer.
  10. I give this submission freely and claim no ownership to its content.
  11. I have verified that my changes work correctly in both the new UI and the old/classic UI.

Note on items 3 and 11: these were verified manually by the maintainer, not by automation — this repo has no automated test suite. The browser checks (Monaco loading on submitpage.php, dark-mode behaviour) were done by hand.


  • I have read the above and my PR is ready for review. Check this box to confirm

🤖 Generated with Claude Code


Summary by cubic

Release 3.5.4 by merging the latest dev into master. Ships the Monaco-based submit editor, removes dark-mode flash on the new UI, and fixes intermittent editor load errors.

  • New Features

    • Replace the submit editor on submitpage.php with monaco-editor, including auto-save while editing.
  • Bug Fixes

    • Fix Violentmonkey top-level await error by wrapping async init in an IIFE.
    • Remove dark-mode FOUC/CLS in MonochromeUI/NewBootstrap with early theme/CSS injection.
    • Pin monaco-editor to 0.52.2 and make the loader single-flight to prevent random load failures.