Most core plugins do not use jQuery. Dropdowns, overlays, tooltips, popovers, tabs, and similar components use plain JavaScript. Positioning behavior uses @floating-ui/dom.
Four plugins gate themselves behind a third-party global and stay off if it is missing: Datatable checks for window.jQuery and window.DataTable (from datatables.net), File Upload checks for window._ and window.Dropzone (from lodash and dropzone), Range Slider checks for window.noUiSlider, and Datepicker checks for window.VanillaCalendarPro (from vanilla-calendar-pro). None of that affects dropdowns, overlays, tabs, or tooltips.
Range Slider uses the JavaScript API from noUiSlider. Preline UI remains responsible for the Tailwind CSS markup and behavior wrapper, so you do not need to bring in noUiSlider CSS just to make Preline UI styling work.
That check happens exactly once, and the timing is what makes it a Blazor-specific trap. Preline UI builds its internal plugin registry the moment the script is parsed, and for Datatable, File Upload, Range Slider, and Datepicker it captures the constructor to use for the entire lifetime of the page, not the outcome of a live check. In a traditional multi-page app this is harmless, since a full navigation re-parses the script on every page and the checks run fresh. Blazor Server and WebAssembly load js/preline.js once, in the root component, and reuse that same parsed script across every in-app navigation over the SignalR circuit or client-side router. If window.jQuery, window._, window.noUiSlider, or window.VanillaCalendarPro is not already defined at that one moment, the corresponding plugin is permanently disabled for the rest of the session: loading the library afterward, on the page that actually needs it, and calling autoInit again will not construct it, because the constructor Preline UI captured for that plugin type is already null.
Datepicker is easy to miss here because its calendar engine, vanilla-calendar-pro, isn't an obviously optional add-on the way jQuery or Dropzone are — it's easy to assume Preline UI bundles it. It doesn't: load vanilla-calendar-pro's own build as a plain global script, the same way as the other three.
Load these dependencies unconditionally in the same root component that loads Preline UI, before the preline.js <script> tag, even on pages that do not use Datatable, File Upload, Range Slider, or Datepicker. Do not defer them to the component that needs them, and do not inject them dynamically through IJSRuntime once the app has already started, since by then Preline UI's script has already parsed and locked in its decision.
This is a real tradeoff: every page pays for the extra script weight even when it never renders a Datatable, File Upload, Range Slider, or Datepicker. That cost buys the only setup where those four plugins actually construct under Blazor's single-script-lifetime model.