Skip to content

Conversation

gerteck
Copy link
Contributor

@gerteck gerteck commented Mar 6, 2025

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • DevOps
  • Improve developer experience
  • Others, please explain:

Overview of PR:

Fixes #2597 - Steps Needed for Vue Migration.

MarkBind (v5.5.3) is currently using Vue 2. However, Vue 2 has reached EOL in 2023 and limits the extensibility and maintainability of MarkBind, especially the vue-components package, and external dependencies for Vue 2 components that are no longer actively maintained. (UI Library Package). This PR migrates MarkBind from Vue 2 to Vue 3. This builds on extensive efforts from #2224 - Vue Migration attempt 2 years ago by @EltonGohJH, which has helped immensely to set the foundation for this PR.

There are no functional changes to how MarkBind behaves:

  • SSR is preserved and (fully) functional
  • Hydration is preserved and (fully) functional
  • Vue components preserved using Options API (vs. Composition API)

Overview of changes:

Some basic understanding of both Vue 2, Vue 3 and a good understanding of MarkBind (in particular with regards to SSR, Hydrating, Bundling) is needed to review? the PR. I have previously linked some hopefully helpful resources in issue #2597 to help in understanding this PR.

The Vue migration involves major changes in 3 out of 4 packages of Markbind, namely the core, core-web, and vue-components. Changes in cli are only functional snapshot tests. Changes have been separated into commits that are aim to be modular and digestable.

Commit History Overview

  1. Commit: Adapt processing logic to use Vue 3.3.11 - vue is updated for the core library.

    • This entails changes in API to both the renderFunction generation function, and the renderToString function. There is no documentation for the renderFunction generation function, you need to directly reference the type definitions from vuejs source code as specified by npm package description.
    • I also update the bundled vue binary to V3.3.11 here.
  2. Commit: Migrate Vue Components - I update the configurations for Vue Components to Vue3 (test, lint).

    • I also update configuration dependencies in the vue-components package (vue-style-loader, jest-env-jsdom).
    • Next, I update minimal syntax changes in all components (and directives). Reviewers can refer to the vue migration guide to look at syntax changes or API changes that are mentioned there.
    • Naturally, vue component dependencies are also updated (floating-vue, vue-final-modal, portal-vue). Every component or configuration dependency updated probably has some separate form of migration guide online.
    • Changes are largely minimal.
  3. Commit: Update core-web package 1 - Update dependencies for core-web (bundling). Update configuration for webpack.

  4. Commit: Update core-web package 2 - Update the essential webpage js logic index.js in core-web.

    • Simply put, this entails using the new renderFunction that we previously generated in commit 1 and registering the vue components in commit 2.
    • Additionally, I fixed a bug in the webpack config that I did not detect previously. (see commit message for details).
    • Binaries for Vue components and markbind.js are regenerated.
  5. Commit: Fix Hydration Issue for Question component - Fixed issue that I did not detect previously, related to commit 2.

  6. Commit: Update Vue Testcases and Snapshots - As per title. I also realized ( Some Vue components tests are erroneous #2610 ), so I amended the erroneous tests. No point keeping useless tests.

    • There are some API changes to the testing so they were updated.
  7. Commit: Merge master: PR updated with necessary changes from pre-requisite PRs.

    • Basically, the PRs decouples plugins from using Vue. (They were using a workaround that works with Vue 2, but can't be done with Vue 3.) Thanks to these PRs, we don't need to worry about vue migration affecting plugins. Coincidentally, the PRs also enhance efficiency and fix other bugs identified.
  8. Update license txt file as per MIT License

  9. Commit: Update CLI Snapshots - Snapshots for test generated sites are regenerated and commited.

    • Don't be intimidated - actually there's no real change in most if not all of the html files. It's only because I updated the vue.js file name to better reflect the vue version. (which is awesome - means no change in HTML rendered!)
    • Ignore the changes to the renderfunction binary (*.renderjs), it is not meaningful. I realized that the render function is unnecessarily compared. This causes a lot of issues like pollution, unnecessary increased test load. I will see if I can make a separate PR to address this issue to increase developers quality of life. Related to Test site improvements #1637.
  10. Congratulations for getting this far. There's no other unrelated initial changes. (Further changes and bug fixes are detailed in comment history below, or resolved comments in code review)

Changelog in comment history:

Changelog (Beyond initial PR changes):

  • Built the CS2103 website on gh-pages (serves updated version)
  • Update modal opening animation (update breaking syntax)
  • Update dropdown functionality (hide submenus - update breaking syntax with new logic)
  • Fix tree diagram functionality (whitespace issue - vue breaking change)
  • Fix spacing between elements (whitespace issue - vue breaking change)
  • Investigate render warning (invalid HTML in docs)
  • Fix to images not loaded, panel somehow missing (register plugins in new Vue instance, Retriever.vue)
  • Updated fix to navbar content not properly handled (update breaking vue CSS scoped syntax)
  • Update Question hydration error - (disable animations for this PR for now)
  • Add docs for how MarkBind uses Vue & Update outdated docs on vue
  • Fix whitespace issue in site-nav / page-nav (update portal-vue breaking syntax)
  • Closeable Directive fixed (update hook)
  • Fixed Pic component on load computation of height and width
  • Fixed Thumbnail and Annotate components @load handling case where it does not fire.

Issues Fixed

Fixes #2597 - Steps Needed for Vue Migration
Fixes #2084 - Investigate Vue Migration

Fixes #2610 - removed irrelevant ineffective tests that don't work.

Fixes #2171 - reloading logic abstracted into savePageRenderFnForHotReload method in PageVueServerRenderer, to reduce coupling from Page/index.js.

Fixes #1536 - scopedSlots have been replaced to slots as per Vue 3 migration


Others

Related PRs for Reference:
#2596 - Unformatted Vue Migration PR (Closed)
#1534 - Vue 2 SSR to Resolve FOUC

Related PRs (not needed for Reference):
Additionally, I have tried as best as possible to isolate any separable changes into separate PRs from this PR for ease of code review and understanding. It is not necessary to look through those changes. These PRs, which include both enhancement and code maintanence, include:

I don't think it is feasible to further break down this PR (tests would not work).

Additionally, during the migration process, I have identified some issues, such as #2610, #2612, #2613, #2615, #2623, #2627, #2629, #2630, #2631, #2624. Most of these issues are not addressed in the scope of this PR, but a review of this PR might provide context to tackle these issues separately. Also, there are definitely regressions or changes due to change in dependencies, especially for the vue components. These can also be tackled separately in the future. Appreciate the help to identify any regressions if spotted and raising appropriate issues after the Vue Migration has been merged.

To-do: (Done)

  • Update documentation on Vue related sections. From what I can see, the writing components section. Most sections are general enough that it doesn't really need much changes for correctness. I may raise a separate issue and add on to the documentation and make changes separately.
  • I have added a "Vue Integration" page for Dev Guide documentation.

Testing instructions:

Some general tests I could think of:

  1. Run Tests

    • npm run test for core, cli, and vue-components.
  2. Build & Serve Sample Site

    • markbind init, markbind build, markbind serve.
    • Verify components render correctly and interact as expected.
  3. Check SSR & Hydration

    • Confirm no hydration mismatch or console warnings.
    • Verify correct server-rendered HTML and client hydration.
  4. Plugin Compatibility

    • Test various plugins to ensure migration has no side effects.
  5. Cross-browser Check

    • Open site in Chrome, Firefox, Safari, and Edge.

Proposed commit message: (wrap lines at 72 characters)

Migrate from Vue 2 to Vue 3

Vue 2 has reached end-of-life in 2023, limiting maintainability,
extensibility of MarkBind. This commit migrates the codebase
(core, CLI, and vue-components) to Vue 3.3.11.

The migration includes major updates to server-side rendering
logic, hydration, component syntax, bundling setup (Webpack),
and test configurations. Vue 2 dependencies and deprecated
APIs have been replaced accordingly. Snapshot tests and test
site output have also been updated to reflect new Vue version.

This migration improves future extensibility and compatibility
with modern tooling and Vue ecosystem packages.


Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No unrelated changes (Best effort)

Reviewer checklist:

Indicate the SEMVER impact of the PR:

  • Major (when you make incompatible API changes)
  • Minor (when you add functionality in a backward compatible manner)
  • Patch (when you make backward compatible bug fixes)

At the end of the review, please label the PR with the appropriate label: r.Major, r.Minor, r.Patch.


Breaking change release note preparation (if applicable):

  • To be included in the release note for any feature that is made obsolete/breaking

Give a brief explanation note about:

  • what was the old feature that was made obsolete
  • any replacement feature (if any), and
  • how the author should modify his website to migrate from the old feature to the replacement feature (if possible).

This release deprecates support for Vue 2 and introduces full support for Vue 3.

Summary of Breaking Changes:
Vue 2 is no longer supported. All components and internal rendering logic now use Vue 3.3.11. Vue 2-based plugins and custom components must be updated to comply with Vue 3 syntax and API. Deprecated HTML5 syntax support is removed, such as <font>, <big>, and similar tags that are no longer rendered or styled reliably.

Scoped slots API (scopedSlots) has been replaced by the new slots API as per Vue 3 standards. Internal test and SSR setup has been restructured to reflect modern Vue 3 testing libraries and bundling practices.

What Site Authors Need to Do:
If you are using custom Vue components and directives, please migrate them using the Vue 3 Migration Guide. If your site uses deprecated HTML tags, replace them with semantic HTML5 alternatives or appropriate CSS styling. If you have extended MarkBind through plugins that rely on Vue APIs, refer to updated documentation for best practices post-migration.

gerteck added 3 commits March 6, 2025 17:57
compileTemplate and renderToString are now included as
dependencies of the main vue package, alongside API changes
to methods provided.

Bundled vue js file has also been updated.
Update syntax as well as dependencies, libraries
to be Vue 3 compatible
Rebuild markbind bundles as well as vue bundles
Vue now needs to be externalized for both client and server
@gerteck gerteck force-pushed the branch-vueMigrationFormatted branch from 7e3f433 to 6bcf6db Compare March 6, 2025 16:47
gerteck added 6 commits March 7, 2025 00:48
Further update core-web package.
Vue needs to be externalized separately for server ('vue') and
web-client ('Vue'), or it fails for case-sensitive systems
e.g. Ubuntu. Also update index.js to use compiled render function
and use updated Vue application mounting API.
When question component not used in quiz, certain buttons
are rendered on server-side but not on client.

Change the visibility of these buttons to hidden, but maintain
in the DOM to prevent hydration mismatch.
Vue testcases overhauled due to changes in API.
Additionally, improvement can be made to vue testcases in the
future as snapshots make it hard to diagnose if change
is intended or unexpected bug causing side effect.
@gerteck
Copy link
Contributor Author

gerteck commented Mar 10, 2025

Site is live and running on Vue 3!

Preview at: https://deploy-preview-2622--markbind-master.netlify.app/

Go to the console and type: Vue.version. We're running on Vue version 3.3.11.

Ready for review - in the meantime, will try to author a separate PR to aid with PR-review.

@gerteck gerteck changed the title Vue Migration Reformatted Vue 3 Migration Mar 10, 2025
@gerteck gerteck mentioned this pull request Mar 10, 2025
14 tasks
@EltonGohJH
Copy link
Contributor

Hi hi @gerteck,
As mentioned, I think we could deploy a Netlify version of CS2103T for @damithc to test.

Prof @damithc can do that as a first layer of sanity test IMO.

@EltonGohJH
Copy link
Contributor

Anyways, thanks @gerteck for continuing this feature. Some of the solutions to the problem I had were ingenious, to say the least.

I will try to review and comment on the core SSR flow but likely need someone to help with a in depth check on the other parts like whether all the vue components are functioning.

CC @lhw-1

@tlylt
Copy link
Contributor

tlylt commented Mar 11, 2025

@gerteck great work 🚀
Just started playing around with the deployed site to check for any defects. One minor thing I noticed when comparing against https://markbind-master.netlify.app/

  • The quiz's next icon animates from the top left to bottom right when clicked.

Please see video comparing the deployed preview and current master

Screen.Recording.2025-03-11.at.9.35.50.PM.mov

@gerteck
Copy link
Contributor Author

gerteck commented Mar 12, 2025

@gerteck great work 🚀 Just started playing around with the deployed site to check for any defects. One minor thing I noticed when comparing against https://markbind-master.netlify.app/

  • The quiz's next icon animates from the top left to bottom right when clicked.

Thank you for your help on this PR! I also noted that popovers also lost their spacing:

Picture1

It's could be because the vue component libraries were updated or some differences in the configuration syntax, since I made minimal changes enough just to satisfy any errors and warnings.

After investigation, I have found that this is because of whitespace preservation in the rendering of the HTML.

<button class="btn btn-secondary">Popover on top</button>
<button class="btn btn-secondary">Popover on top</button>
<button class="btn btn-secondary">Popover on top</button>

The gaps between each button is a result of the newline being parsed as whitespace between each button. However, Vue 3 automatically condenses and removes this whitespace, causing the resulting removal of the gap.

app.config.compilerOptions.whitespace = 'preserve';

This will be added during the rendering process on server side to restore previous Vue 2 default behavior.

@gerteck
Copy link
Contributor Author

gerteck commented Mar 12, 2025

Hi hi @gerteck, As mentioned, I think we could deploy a Netlify version of CS2103T for @damithc to test.

Thank you @EltonGohJH for making time to look through the PR! Would not have been able to work on this without your previous work on it. Agreed on the suggestion.

@gerteck
Copy link
Contributor Author

gerteck commented Mar 13, 2025

Currently I forked the CS2103 website and deployed it on my own gh-pages as like a quick draft to view it running on Vue 3 for now, to check for any major regressions first.

I didn't update the Agolia plugin API Keys and stuff so it will redirect to the original site.

Copy link
Contributor

@tlylt tlylt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some more issues I noticed on the rendered site:

  • The tree diagram functionality is no longer working:
    • Screenshot 2025-03-13 at 9 19 05 PM
  • Modal opening animation is gone (before: a smooth transition to the opened modal, now: immediate opening of modal window)

@damithc
Copy link
Contributor

damithc commented Mar 13, 2025

One issue I noticed: 2nd level drop-down menus do not disappear as they should

image

@lhw-1 lhw-1 added this to the v6.0.0 milestone Mar 13, 2025
@tlylt
Copy link
Contributor

tlylt commented Mar 13, 2025

Tried serving the markbind docs locally with this branch and got this warning:

 v5.5.3
info: Website generation started at 6:45:41 AM
info: Building assets...
info: Assets built
info: Generating pages...
[------------------------------------------------------------] 0 / 60 pages builtunsafe attribute name: tim"
[@vue/server-renderer] Skipped rendering unsafe attribute name: tim"
unsafe attribute name: xu"
[@vue/server-renderer] Skipped rendering unsafe attribute name: xu"
[============================================================] 60 / 60 pages built

due to

      <td align="center" valign="top" width="14.28%"><a href="http://tim-siu.github.io"><img src="https://avatars.githubusercontent.com/u/61866948?v=4?s=100" width="100px;" alt="Shuyao "Tim" Xu"/><br /><sub><b>Shuyao "Tim" Xu</b></sub></a><br /><a href="https://github.com/MarkBind/markbind/commits?author=Tim-Siu" title="Code">💻</a></td>

this is generated code so probably out of our control, but am wondering if we have a way to disable check for vue server-renderer just for this part..

$children has been in depreciated in Vue 3, causing
logic in dropdown to stop working.

Replace logic by using inject and provide by maintaining
a list of submenus in the dropdown manually.
bind() should be migrated to mount()
@gerteck
Copy link
Contributor Author

gerteck commented Mar 24, 2025

Just Pushed a fix for the closeable directive.

I initially updated the directive's bind() hook to beforeMount() based on the official Vue migration guide. However, this change caused the directive to stop working correctly — since the DOM mutations need to happen after the element is mounted.

I've now fixed this by updating the hook from beforeMount() to mounted(), ensuring all DOM manipulations and event bindings happen after the element is fully available in the DOM.

The closeable directive works now: https://deploy-preview-2622--markbind-master.netlify.app/userguide/reusingcontents#allowing-users-to-remove-some-contents

@gerteck
Copy link
Contributor Author

gerteck commented Mar 24, 2025


Links for convenience:


Edit: I am including this for easier reference in latest comment

Changelog (Beyond initial PR changes):

  • Built the CS2103 website on gh-pages (serves updated version)
  • Update modal opening animation (update breaking syntax)
  • Update dropdown functionality (hide submenus - update breaking syntax with new logic)
  • Fix tree diagram functionality (whitespace issue - vue breaking change)
  • Fix spacing between elements (whitespace issue - vue breaking change)
  • Investigate render warning (invalid HTML in docs)
  • Fix to images not loaded, panel somehow missing (register plugins in new Vue instance, Retriever.vue)
  • Updated fix to navbar content not properly handled (update breaking vue CSS scoped syntax)
  • Update Question hydration error - (disable animations for this PR for now)
  • Add docs for how MarkBind uses Vue & Update outdated docs on vue
  • Fix whitespace issue in site-nav / page-nav (update portal-vue breaking syntax)
  • Closeable Directive fixed (update hook)
  • Fixed Pic component on load computation of height and width
  • Fixed Thumbnail and Annotate components @load handling case where it does not fire.

To Do:

  • Investigate hydration errors in served CS2103 site. (if any)

Issues outside scope of this PR:

  • Re-enable animations for Question
  • Refactor styling for site-nav, page-nav, overlaysource
  • Refactor closable directive (issue has been made)

@gerteck
Copy link
Contributor Author

gerteck commented Mar 24, 2025

I have found some panels not loading when I serve it locally: (It works online tho after deployment)

image

However, looking into the cs2103 website code, I am not too sure how the panel is including the src:

Picture1

I don't think i understand how unit-inElsewhere works, so I can't really debug it

@damithc
Copy link
Contributor

damithc commented Mar 24, 2025

I don't think i understand how unit-inElsewhere works, so I can't really debug it

@gerteck This is a case of using a feature called boilerplate (that feature saves us from having to duplicate a boilerplate file in multiple folders). The unit-inElsewhere-asFlat.md is actually in the _markbind\boilerplates folder but MarkBind is supposed to act as if the file is in the the folder specified in front of it (in this case, ../../../uml/sequenceDiagrams/parallelPaths).

@Incogdino
Copy link
Contributor

image

The images appear to be loading at max width on the vue 3 site as compared to the 2103 site

@lhw-1
Copy link
Contributor

lhw-1 commented Mar 28, 2025

Ah, same observation as @Incogdino. Left is on vue 2, right is on vue 3.

image

@lhw-1
Copy link
Contributor

lhw-1 commented Mar 29, 2025

I've taken a closer look at both of the CS2103T site deployments, and apart from the image size issue and the previously mentioned site-nav and page-nav whitespaces (which we can tackle outside of this PR, as per comment), there does not seem to be major issues.

As discussed with @damithc, we're pushing for this to be merged in within the next 2 days, after which we will release MarkBind v6.0.0. @MarkBind/active-devs let's proceed with the final round of checks and testing, and @gerteck do let us know your plans for this PR if there are any remaining.

@lhw-1 lhw-1 added the r.Major Version resolver: increment by 1.0.0 label Mar 29, 2025
@gerteck
Copy link
Contributor Author

gerteck commented Mar 29, 2025

I've taken a closer look at both of the CS2103T site deployments, and apart from the image size issue and the previously mentioned site-nav and page-nav whitespaces (which we can tackle outside of this PR, as per comment), there does not seem to be major issues.

As discussed with @damithc, we're pushing for this to be merged in within the next 2 days, after which we will release MarkBind v6.0.0. @MarkBind/active-devs let's proceed with the final round of checks and testing, and @gerteck do let us know your plans for this PR if there are any remaining.

Thank you for your help!

I am looking into the image size issue, I have isolated and identified the regression, and can push a fix in the next hour or so.

Otherwise, my plan would be that any other changes. if not major or functionality breaking can be left to be fixed after the PR has been merged.

Edit:

@gerteck
Copy link
Contributor Author

gerteck commented Mar 29, 2025

For anyone who wants to understand the latest commit (and preceeding commit):

pic

The pictures did not resize and defaulted to max size was because the method to set height and width was not firing, which were set to fire on load event. It did not fire on Vue 3 hydration, but did so for Vue 2.

The reason the load event fired in Vue 2 but not in Vue 3 is likely due to a difference in hydration behavior between Vue 2 and Vue 3 during SSR (Server-Side Rendering). In short, it seems like:

  • Vue 2: load event fired after hydration of DOM.
  • Vue 3: likely the onload event is fired before Vue runs and hydrates the DOM.

This seems to be a somewhat known (?) issue through search.

It could be that that when the component is hydrated in Vue 3, the image is already in the DOM and is marked as loaded and not fire load event for performance reasons. Or that Vue 2 retriggers the load event etc. I don’t know the exact reason.

Load Event

What I’ve done is to add a mounted routine to run the height and width calculation and setting if the image is already loaded, to be sure that it runs in any case.

This @load listener is also used in Annotate, Thumbnail, so I will check it and push changes if needed as well
Thumbnail also visibly has this issue (sizing inside the thumbnail):

  • Left is Vue 3, Right is Vue 2 (has since been updated to be as per right image).
  • The thumbnail is not resizing to fit the size attribute, also because load is not being fired.

image

Thumbnails now fixed:

Sizing of pics also now fixed:

Additionally, update binary and test shots
@IanCheah
Copy link
Contributor

IanCheah commented Mar 30, 2025

Hi @gerteck, I have noticed a little differences under Admin Info/Ip/Week2.

Difference 1

Vue 3: https://gerteck.github.io/cs2103-website/admin/ip-w2.html
Vue 2: https://nus-cs2103-ay2425s2.github.io/website/admin/ip-w2.html
image
On the left is Vue3, right is Vue2. There seem to be a little issue with the rendering of the mermaid diagram.
image

Difference 2

1pbmxtj1
Under the same page, there should be tabs that allow students to choose between Sourcetree or Cli but that is missing in the Vue3 version.

@gerteck
Copy link
Contributor Author

gerteck commented Mar 30, 2025

Hi @gerteck, I have noticed a little differences under Admin Info/Ip/Week2.

Thanks @IanCheah for your help! I will have to investigate the tabs issue.

Regarding the mermaid rendering, it seems related to CORS and seems to be quite flaky, it could have been a regression, or rather, side effect from my previous PR (#2614) shifting mermaid to load on demand for efficiency. I can only replicate the issue sometimes. It seems that some investigate on that is due as well, though I suppose if we support offline loading (#2548) and bundle it together it should totally resolve the issue - since it is likely due to CORS.

Sometimes it works:

image

But I also encountered when I had the CORS issue as well. But the flakyness would definitely explain why it was not spotted earlier. Could be issue on mermaid CDN (header issue, CORS)?

I think we should postpone this issue till after the migration, and set up a separate issue to tackle this? Otherwise, any more commits will continue to balloon this PR. What do you think?

This is such active devs may work on it in parallel, and if there are any breaking functionalities that we have not found, the previous markbind version can be used to generate existing websites.

@IanCheah
Copy link
Contributor

I think we should postpone this issue till after the migration, and set up a separate issue to tackle this? Otherwise, any more commits will continue to balloon this PR. What do you think?

Yep I agree! Adding more commits may balloon the pr and even potentially introduce unforseen errors. We can set up a separate issue once the pr is merged.

Copy link
Contributor

@lhw-1 lhw-1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for all your work, @gerteck!

This has no doubt been a massive undertaking on your part, and your efforts in documenting all the steps are greatly appreciated - I'm sure future devs will benefit from your efforts. Thanks to @EltonGohJH who started this effort 2 years ago, as well as to all the devs who helped to review and test this PR as well (@tlylt, @Tim-Siu, @Incogdino, @IanCheah, and of course @damithc)!

LGTM, and if there are no other updates, we can proceed with the planned release tonight 👍

As discussed, the release will be after the Mermaid rendering PR

@damithc
Copy link
Contributor

damithc commented Mar 30, 2025

I think we should postpone this issue till after the migration, and set up a separate issue to tackle this? Otherwise, any more commits will continue to balloon this PR. What do you think?

Yup, that should be fine. But it needs to be fixed before releasing V6, as it breaks current usages.

@damithc
Copy link
Contributor

damithc commented Mar 30, 2025

This has no doubt been a massive undertaking on your part, and your efforts in documenting all the steps are greatly appreciated - I'm sure future devs will benefit from your efforts. Thanks to @EltonGohJH who started this effort 2 years ago, as well as to all the devs who helped to review and test this PR as well (@tlylt, @Tim-Siu, @Incogdino, @IanCheah,

I second that 💯 👍

@lhw-1 lhw-1 changed the title Vue 3 Migration Migrate from Vue 2 to Vue 3 Mar 30, 2025
@lhw-1 lhw-1 merged commit 240a1cf into MarkBind:master Mar 30, 2025
10 checks passed
Copy link

@lhw-1 Each PR must have a SEMVER impact label, please remember to label the PR properly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
r.Major Version resolver: increment by 1.0.0
Projects
None yet
8 participants