diff --git a/templates/user/auth/signin_inner.tmpl b/templates/user/auth/signin_inner.tmpl
index 3c6ea78f78..62211fccfb 100644
--- a/templates/user/auth/signin_inner.tmpl
+++ b/templates/user/auth/signin_inner.tmpl
@@ -1,6 +1,6 @@
-

+
{{if or (not .LinkAccountMode) (and .LinkAccountMode .LinkAccountModeSignIn)}}
{{template "base/alert" .}}
diff --git a/web_src/js/index.ts b/web_src/js/index.ts
index a042432f14..ff495be82e 100644
--- a/web_src/js/index.ts
+++ b/web_src/js/index.ts
@@ -1,11 +1,10 @@
import '../fomantic/build/fomantic.js';
import '../css/index.css';
// MokoGIT: vendored Bootstrap 5.3.3 JS bundle (incl. Popper; registers the data-bs-* API).
+// `` (templates/base/head.tmpl) makes Bootstrap's getjQuery() return
+// null, so it never registers jQuery plugins and never clobbers Fomantic's $.fn.{dropdown,
+// modal,tab,...}. Bootstrap's data-bs-* data-API keeps working (it's bound independently).
import './vendor/bootstrap/bootstrap.bundle.min.js';
-// Hand Fomantic's jQuery plugin names back after Bootstrap's defineJQueryPlugin clobbers
-// them (dropdown/modal/tab/…); keeps Bootstrap's data-bs-* API working. MUST stay right
-// after the bundle import above.
-import './vendor/bootstrap/noconflict.ts';
import {initDashboardRepoList} from './features/dashboard.ts';
import {initGlobalCopyToClipboardListener} from './features/clipboard.ts';
diff --git a/web_src/js/vendor/bootstrap/noconflict.ts b/web_src/js/vendor/bootstrap/noconflict.ts
deleted file mode 100644
index 7e9497fccc..0000000000
--- a/web_src/js/vendor/bootstrap/noconflict.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-// MokoGIT: Bootstrap 5 / Fomantic-UI jQuery-plugin no-conflict shim.
-//
-// Bootstrap 5 dropped its own jQuery dependency but still registers jQuery plugins
-// (via `defineJQueryPlugin`) when it detects jQuery on the page. Those plugin names
-// — dropdown, modal, tab, collapse, tooltip, popover, toast, button, … — collide with
-// Fomantic-UI, which Gitea drives through the very same `$.fn.*` names. The clobber
-// makes `$.fn.dropdown.settings` undefined, so Gitea's Fomantic init throws
-// (`Cannot set properties of undefined (setting 'fullTextSearch')`) and aborts the
-// whole client init pipeline.
-//
-// Bootstrap keeps the previous implementation on each plugin's `.noConflict()`. Calling
-// it hands the name back to Fomantic. We do NOT lose Bootstrap behavior: the mobile
-// rewrite drives Bootstrap purely through the `data-bs-*` data-API (collapse drawers,
-// table-responsive is CSS-only), which is bound to document-level event handlers at
-// bundle load and does not depend on the jQuery interface.
-//
-// This module MUST be imported immediately AFTER the Bootstrap bundle in index.ts so it
-// runs after `defineJQueryPlugin` has clobbered the names.
-import $ from 'jquery';
-
-const collidingPlugins = [
- 'alert', 'button', 'carousel', 'collapse', 'dropdown', 'modal',
- 'offcanvas', 'popover', 'scrollspy', 'tab', 'toast', 'tooltip',
-];
-
-for (const name of collidingPlugins) {
- const plugin = ($.fn as Record
)[name];
- if (plugin && typeof plugin.noConflict === 'function') {
- // Restores the pre-Bootstrap implementation (Fomantic's, or undefined if Fomantic
- // never defined it — harmless, since nothing uses the jQuery interface for it).
- plugin.noConflict();
- }
-}