• main.js
  • import "bootstrap";
    import { createApp, h } from "vue";
    import contenteditable from "vue-contenteditable";
    import Toast from "vue-toastification";
    import "vue-toastification/dist/index.css";
    import App from "./App.vue";
    import "./assets/app.scss";
    import "./assets/vue-datepicker.scss";
    import { i18n } from "./i18n";
    import { FontAwesomeIcon } from "./icon.js";
    import datetime from "./mixins/datetime";
    import mobile from "./mixins/mobile";
    import publicMixin from "./mixins/public";
    import socket from "./mixins/socket";
    import theme from "./mixins/theme";
    import lang from "./mixins/lang";
    import { router } from "./router";
    import { appName } from "./util.ts";
    import dayjs from "dayjs";
    import timezone from "./modules/dayjs/plugin/timezone";
    import utc from "dayjs/plugin/utc";
    import relativeTime from "dayjs/plugin/relativeTime";
    import { loadToastSettings } from "./util-frontend";
    dayjs.extend(utc);
    dayjs.extend(timezone);
    dayjs.extend(relativeTime);
    
    const app = createApp({
        mixins: [
            socket,
            theme,
            mobile,
            datetime,
            publicMixin,
            lang,
        ],
        data() {
            return {
                appName: appName
            };
        },
        render: () => h(App),
    });
    
    app.use(router);
    app.use(i18n);
    
    app.use(Toast, loadToastSettings());
    app.component("Editable", contenteditable);
    app.component("FontAwesomeIcon", FontAwesomeIcon);
    
    app.mount("#app");
    
    // Expose the vue instance for development
    if (process.env.NODE_ENV === "development") {
        console.log("Dev Only: window.app is the vue instance");
        window.app = app._instance;
    }