diff --git a/app/assets/styles/main.scss b/app/assets/styles/main.scss index c014f50..5ccf224 100644 --- a/app/assets/styles/main.scss +++ b/app/assets/styles/main.scss @@ -1,5 +1,6 @@ @use "utils.scss"; @use "overrides-components.scss"; +@use "scrollbar.scss"; :root { font-size: 15px; diff --git a/app/assets/styles/scrollbar.scss b/app/assets/styles/scrollbar.scss new file mode 100644 index 0000000..f5bec72 --- /dev/null +++ b/app/assets/styles/scrollbar.scss @@ -0,0 +1,14 @@ +// Fix: Scrollbar causing layout shift +* { + scrollbar-width: thin; + scrollbar-color: #888 transparent; +} + +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: transparent; +} diff --git a/app/components/AppLoading.vue b/app/components/AppLoading.vue deleted file mode 100644 index b9fcc80..0000000 --- a/app/components/AppLoading.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - Đang tải dữ liệu - {{ ellipsis }} - - - - - - diff --git a/app/components/Modal.vue b/app/components/Modal.vue index c247016..4d66d9e 100644 --- a/app/components/Modal.vue +++ b/app/components/Modal.vue @@ -141,13 +141,18 @@ function closeOnEsc(e) { onMounted(() => { window.addEventListener("keydown", closeOnEsc); + const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; + document.documentElement.style.cssText += ` ;padding-right: ${scrollbarWidth}px;`; document.documentElement.classList.add("is-clipped"); }); onUnmounted(() => { window.removeEventListener("keydown", closeOnEsc); const remaining = document.getElementsByClassName("modal-background").length; - if (remaining === 0) document.documentElement.classList.remove("is-clipped"); + if (remaining === 0) { + document.documentElement.classList.remove("is-clipped"); + document.documentElement.style.removeProperty("padding-right"); + } }); const loaded = ref(false); diff --git a/app/pages/index.vue b/app/pages/index.vue index 43e6710..f28ddff 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,8 +1,5 @@ - - - - + { - const store = useStore(); +export default defineNuxtPlugin(async (nuxtApp) => { const { $getapi, $readyapi } = nuxtApp; const connlist = $readyapi([ "common", @@ -19,7 +18,6 @@ export default defineNuxtPlugin((nuxtApp) => { async function getReady() { try { await $getapi(notReadyConns); - store.ready = true; } catch (error) { showError({ statusCode: 500, @@ -27,5 +25,5 @@ export default defineNuxtPlugin((nuxtApp) => { }); } } - if (notReadyConns.length > 0) getReady(); + if (notReadyConns.length > 0) await getReady(); }); diff --git a/app/plugins/05-artificial-delay.js b/app/plugins/05-artificial-delay.js new file mode 100644 index 0000000..cd76cda --- /dev/null +++ b/app/plugins/05-artificial-delay.js @@ -0,0 +1,12 @@ +export default defineNuxtPlugin(async () => { + const loadTime = performance.now(); + const minDuration = 2000; + + if (loadTime < minDuration) { + await new Promise((r) => setTimeout(r, minDuration - loadTime)); + } + + // nuxtApp.hook('app:mounted', () => { + // console.log('app.mount() completed at', performance.now()) + // }); +}); diff --git a/app/spa-loading-template.html b/app/spa-loading-template.html new file mode 100644 index 0000000..ec8490d --- /dev/null +++ b/app/spa-loading-template.html @@ -0,0 +1,68 @@ + + + + + + + + + + diff --git a/app/stores/index.js b/app/stores/index.js index 089e8c8..e6f5230 100644 --- a/app/stores/index.js +++ b/app/stores/index.js @@ -2,7 +2,6 @@ import { defineStore } from "pinia"; export const useStore = defineStore("erp-dev", { state: () => ({ - ready: false, viewport: null, login: null, token: null,
- Đang tải dữ liệu - {{ ellipsis }} -