main.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { createApp } from "vue";
  2. import App from "./App.vue";
  3. import "@/styles/tailwind.css";
  4. import "@/styles/style.css";
  5. import Toast from "vue-toastification";
  6. import "vue-toastification/dist/index.css";
  7. import { router } from "./router/index.js";
  8. const appEl = document.getElementById("app");
  9. function mostrarErroInicial(err) {
  10. if (!appEl) return;
  11. if (appEl.dataset.mounted === "1") return;
  12. const msg = typeof err === "string" ? err : err?.message || String(err || "erro");
  13. appEl.textContent = `Erro ao iniciar: ${msg}`;
  14. }
  15. window.addEventListener("error", (e) => mostrarErroInicial(e?.error || e?.message));
  16. window.addEventListener("unhandledrejection", (e) => mostrarErroInicial(e?.reason));
  17. function aplicarTemaInicial() {
  18. let salvo = null;
  19. try {
  20. salvo = localStorage.getItem("theme");
  21. } catch {
  22. salvo = null;
  23. }
  24. const tema =
  25. salvo === "dark" || salvo === "light"
  26. ? salvo
  27. : window.matchMedia?.("(prefers-color-scheme: dark)")?.matches
  28. ? "dark"
  29. : "light";
  30. document.documentElement.classList.toggle("dark", tema === "dark");
  31. }
  32. aplicarTemaInicial();
  33. const toastOptions = {
  34. position: "top-right",
  35. timeout: 4000,
  36. closeOnClick: true,
  37. pauseOnFocusLoss: true,
  38. pauseOnHover: true,
  39. draggable: true,
  40. showCloseButtonOnHover: false,
  41. hideProgressBar: false,
  42. closeButton: "button",
  43. icon: true,
  44. rtl: false,
  45. };
  46. const app = createApp(App);
  47. app.use(router);
  48. app.use(Toast, toastOptions);
  49. app.mount("#app");
  50. if (appEl) appEl.dataset.mounted = "1";