// https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ compatibilityDate: '2025-07-15', devtools: { enabled: true }, // ⚠️ Web portal ต้องใช้ port 5173 เท่านั้น — ห้ามใช้ 3000 // (3000 ถูก add-in dev server ใช้อยู่: https://localhost:3000) devServer: { port: 5173, }, modules: ['@nuxtjs/tailwindcss'], // ต้องระบุ cssPath ชัด (alias ~/ ชี้ srcDir = app/) — default แบบ relative // "assets/css/tailwind.css" จะ resolve ต่อ rootDir แล้ว fallback ไปไฟล์ default // ของ tailwindcss package แบบเงียบๆ (token/component classes ทั้งหมดหายจาก build) tailwindcss: { cssPath: '~/assets/css/tailwind.css', }, // config ทั้งหมดแยกเป็น env ได้ (กติกา: ห้าม hardcode) — override ด้วย env // NUXT_PUBLIC_API_BASE_URL / NUXT_PUBLIC_KEYCLOAK_AUTHORITY / NUXT_PUBLIC_KEYCLOAK_CLIENT_ID runtimeConfig: { public: { // เว็บเป็น top-level http page → เรียก backend ด้วย http ได้ (ไม่มีปัญหา mixed content แบบ task pane) apiBaseUrl: 'http://localhost:5075', // Keycloak dev ใช้ https:8443 (cert ของ office-addin-dev-certs — เชื่อถือได้ในเครื่อง) keycloakAuthority: 'https://localhost:8443/realms/word-versioning', keycloakClientId: 'word-versioning-web', }, }, // ~/assets/css/tailwind.css ถูก @nuxtjs/tailwindcss pick up อัตโนมัติ app: { head: { title: 'Word Versioning', htmlAttrs: { lang: 'th' }, // ฟอนต์ไทย: Sarabun (ใกล้ Sukhumvit ที่สุดบน Google Fonts) — ต้องมี 500/600 ด้วย // เพราะ UI ใช้ font-medium/font-semibold หนัก (โหลดแค่ 400/700 จะเกิด faux-bold) link: [ { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }, { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css2?family=Sarabun:wght@400;500;600;700&display=swap', }, ], // กัน dark-mode flash (FOUC) ก่อน Vue hydrate — ต้องใช้คีย์/ค่าเดียวกับ useTheme.ts script: [ { innerHTML: "(function(){try{var t=localStorage.getItem('theme-preference');if(!t){t=window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light';}if(t==='dark'){document.documentElement.classList.add('dark');}}catch(e){}})();", }, ], }, }, })