2025-08-06 14:31:16 +02:00
|
|
|
export default defineNuxtConfig({
|
|
|
|
|
ssr: false,
|
|
|
|
|
compatibilityDate: "2024-11-01",
|
|
|
|
|
devtools: { enabled: true },
|
2025-08-07 02:56:53 +02:00
|
|
|
|
|
|
|
|
// Add startup logging
|
|
|
|
|
hooks: {
|
|
|
|
|
'ready': () => {
|
|
|
|
|
console.log('🚀 MonacoUSA Portal Nuxt is ready!')
|
|
|
|
|
console.log('Environment:', process.env.NODE_ENV)
|
|
|
|
|
console.log('Port:', process.env.NUXT_PORT || process.env.PORT || 3000)
|
|
|
|
|
},
|
|
|
|
|
'listen': (server, { host, port }) => {
|
|
|
|
|
console.log(`🌐 Server listening on http://${host}:${port}`)
|
|
|
|
|
}
|
|
|
|
|
},
|
2025-08-30 18:25:21 +02:00
|
|
|
modules: ["vuetify-nuxt-module", "@vueuse/motion/nuxt"],
|
2025-08-31 13:10:45 +02:00
|
|
|
css: ["~/assets/scss/main.scss"],
|
2025-08-06 14:31:16 +02:00
|
|
|
app: {
|
|
|
|
|
head: {
|
|
|
|
|
titleTemplate: "%s • MonacoUSA Portal",
|
|
|
|
|
title: "MonacoUSA Portal",
|
|
|
|
|
meta: [
|
|
|
|
|
{ property: "og:title", content: "MonacoUSA Portal" },
|
2025-08-08 21:10:00 +02:00
|
|
|
{ property: "og:image", content: "/MONACOUSA-Flags_376x376.png" },
|
2025-08-06 14:31:16 +02:00
|
|
|
{ name: "twitter:card", content: "summary_large_image" },
|
|
|
|
|
{ name: "viewport", content: "width=device-width, initial-scale=1" },
|
|
|
|
|
{ name: "apple-mobile-web-app-capable", content: "yes" },
|
|
|
|
|
{ name: "apple-mobile-web-app-status-bar-style", content: "default" },
|
|
|
|
|
{ name: "apple-mobile-web-app-title", content: "MonacoUSA Portal" },
|
2025-08-08 21:10:00 +02:00
|
|
|
{ name: "theme-color", content: "#a31515" },
|
|
|
|
|
],
|
|
|
|
|
link: [
|
|
|
|
|
{ rel: "icon", type: "image/png", sizes: "32x32", href: "/favicon-32x32.png" },
|
|
|
|
|
{ rel: "icon", type: "image/png", sizes: "192x192", href: "/icon-192x192.png" },
|
|
|
|
|
{ rel: "apple-touch-icon", sizes: "180x180", href: "/apple-touch-icon.png" },
|
|
|
|
|
{ rel: "shortcut icon", href: "/favicon-32x32.png" },
|
2025-08-06 14:31:16 +02:00
|
|
|
],
|
|
|
|
|
htmlAttrs: {
|
|
|
|
|
lang: "en",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
nitro: {
|
|
|
|
|
experimental: {
|
|
|
|
|
wasm: true
|
|
|
|
|
}
|
|
|
|
|
},
|
2025-08-14 10:46:12 +02:00
|
|
|
vite: {
|
|
|
|
|
optimizeDeps: {
|
2025-08-14 10:51:26 +02:00
|
|
|
exclude: ['sharp']
|
2025-08-14 10:46:12 +02:00
|
|
|
}
|
|
|
|
|
},
|
2025-08-06 14:31:16 +02:00
|
|
|
runtimeConfig: {
|
|
|
|
|
// Server-side configuration
|
|
|
|
|
keycloak: {
|
|
|
|
|
issuer: process.env.NUXT_KEYCLOAK_ISSUER || "",
|
|
|
|
|
clientId: process.env.NUXT_KEYCLOAK_CLIENT_ID || "monacousa-portal",
|
|
|
|
|
clientSecret: process.env.NUXT_KEYCLOAK_CLIENT_SECRET || "",
|
2025-08-09 19:01:44 +02:00
|
|
|
callbackUrl: process.env.NUXT_KEYCLOAK_CALLBACK_URL || "https://portal.monacousa.org/auth/callback",
|
2025-08-06 14:31:16 +02:00
|
|
|
},
|
2025-08-07 17:50:09 +02:00
|
|
|
keycloakAdmin: {
|
|
|
|
|
issuer: process.env.NUXT_KEYCLOAK_ISSUER || "",
|
|
|
|
|
clientId: process.env.NUXT_KEYCLOAK_ADMIN_CLIENT_ID || "admin-cli",
|
|
|
|
|
clientSecret: process.env.NUXT_KEYCLOAK_ADMIN_CLIENT_SECRET || "",
|
|
|
|
|
},
|
2025-08-06 14:31:16 +02:00
|
|
|
nocodb: {
|
|
|
|
|
url: process.env.NUXT_NOCODB_URL || "",
|
|
|
|
|
token: process.env.NUXT_NOCODB_TOKEN || "",
|
|
|
|
|
baseId: process.env.NUXT_NOCODB_BASE_ID || "",
|
2025-08-12 04:25:35 +02:00
|
|
|
eventsBaseId: process.env.NUXT_NOCODB_EVENTS_BASE_ID || "",
|
|
|
|
|
eventsTableId: process.env.NUXT_NOCODB_EVENTS_TABLE_ID || "",
|
2025-08-12 12:24:16 +02:00
|
|
|
rsvpTableId: process.env.NUXT_NOCODB_RSVP_TABLE_ID || "",
|
2025-08-06 14:31:16 +02:00
|
|
|
},
|
|
|
|
|
minio: {
|
|
|
|
|
endPoint: process.env.NUXT_MINIO_ENDPOINT || "s3.monacousa.org",
|
|
|
|
|
port: parseInt(process.env.NUXT_MINIO_PORT || "443"),
|
|
|
|
|
useSSL: process.env.NUXT_MINIO_USE_SSL !== "false",
|
|
|
|
|
accessKey: process.env.NUXT_MINIO_ACCESS_KEY || "",
|
|
|
|
|
secretKey: process.env.NUXT_MINIO_SECRET_KEY || "",
|
|
|
|
|
bucketName: process.env.NUXT_MINIO_BUCKET_NAME || "monacousa-portal",
|
|
|
|
|
},
|
|
|
|
|
sessionSecret: process.env.NUXT_SESSION_SECRET || "",
|
|
|
|
|
encryptionKey: process.env.NUXT_ENCRYPTION_KEY || "",
|
2025-08-09 16:55:59 +02:00
|
|
|
jwtSecret: process.env.NUXT_JWT_SECRET || process.env.NUXT_SESSION_SECRET || "",
|
2025-08-06 14:31:16 +02:00
|
|
|
public: {
|
|
|
|
|
// Client-side configuration
|
|
|
|
|
appName: "MonacoUSA Portal",
|
2025-08-09 18:10:33 +02:00
|
|
|
domain: process.env.NUXT_PUBLIC_DOMAIN || "https://portal.monacousa.org",
|
2025-08-09 18:44:33 +02:00
|
|
|
keycloakIssuer: process.env.NUXT_KEYCLOAK_ISSUER || "https://auth.monacousa.org/realms/monacousa",
|
2025-08-30 18:25:21 +02:00
|
|
|
motion: {
|
|
|
|
|
directives: {
|
|
|
|
|
'pop-bottom': {
|
|
|
|
|
initial: {
|
|
|
|
|
scale: 0,
|
|
|
|
|
opacity: 0,
|
|
|
|
|
y: 100
|
|
|
|
|
},
|
|
|
|
|
visible: {
|
|
|
|
|
scale: 1,
|
|
|
|
|
opacity: 1,
|
|
|
|
|
y: 0,
|
|
|
|
|
transition: {
|
|
|
|
|
type: 'spring',
|
|
|
|
|
stiffness: 250,
|
|
|
|
|
damping: 25
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'fade-in': {
|
|
|
|
|
initial: {
|
|
|
|
|
opacity: 0
|
|
|
|
|
},
|
|
|
|
|
enter: {
|
|
|
|
|
opacity: 1,
|
|
|
|
|
transition: {
|
|
|
|
|
duration: 600
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'slide-up': {
|
|
|
|
|
initial: {
|
|
|
|
|
y: 100,
|
|
|
|
|
opacity: 0
|
|
|
|
|
},
|
|
|
|
|
enter: {
|
|
|
|
|
y: 0,
|
|
|
|
|
opacity: 1,
|
|
|
|
|
transition: {
|
|
|
|
|
type: 'spring',
|
|
|
|
|
stiffness: 100,
|
|
|
|
|
damping: 20
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'glass-fade': {
|
|
|
|
|
initial: {
|
|
|
|
|
opacity: 0,
|
|
|
|
|
scale: 0.95,
|
|
|
|
|
filter: 'blur(10px)'
|
|
|
|
|
},
|
|
|
|
|
enter: {
|
|
|
|
|
opacity: 1,
|
|
|
|
|
scale: 1,
|
|
|
|
|
filter: 'blur(0px)',
|
|
|
|
|
transition: {
|
|
|
|
|
duration: 500,
|
|
|
|
|
type: 'spring',
|
|
|
|
|
stiffness: 200
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-06 14:31:16 +02:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
vuetify: {
|
|
|
|
|
vuetifyOptions: {
|
|
|
|
|
theme: {
|
|
|
|
|
defaultTheme: "monacousa",
|
|
|
|
|
themes: {
|
|
|
|
|
monacousa: {
|
2025-08-31 13:10:45 +02:00
|
|
|
dark: false,
|
2025-08-06 14:31:16 +02:00
|
|
|
colors: {
|
2025-08-31 13:10:45 +02:00
|
|
|
// Monaco Red Spectrum (from design-system.md)
|
|
|
|
|
primary: "#dc2626", // monaco-red-600
|
|
|
|
|
'primary-50': "#fef2f2",
|
|
|
|
|
'primary-100': "#fee2e2",
|
|
|
|
|
'primary-200': "#fecaca",
|
|
|
|
|
'primary-300': "#fca5a5",
|
|
|
|
|
'primary-400': "#f87171",
|
|
|
|
|
'primary-500': "#ef4444",
|
|
|
|
|
'primary-600': "#dc2626", // Primary Brand Color
|
|
|
|
|
'primary-700': "#b91c1c",
|
|
|
|
|
'primary-800': "#991b1b",
|
|
|
|
|
'primary-900': "#7f1d1d",
|
|
|
|
|
|
|
|
|
|
// Neutral Palette
|
2025-08-06 14:31:16 +02:00
|
|
|
secondary: "#ffffff",
|
2025-08-31 13:10:45 +02:00
|
|
|
accent: "#f4f4f5",
|
|
|
|
|
background: "#ffffff",
|
|
|
|
|
surface: "#fafafa",
|
|
|
|
|
'on-background': "#18181b",
|
|
|
|
|
'on-surface': "#18181b",
|
|
|
|
|
|
|
|
|
|
// Semantic Colors
|
|
|
|
|
error: "#ef4444",
|
|
|
|
|
warning: "#f59e0b",
|
|
|
|
|
info: "#0ea5e9",
|
|
|
|
|
success: "#10b981",
|
|
|
|
|
|
|
|
|
|
// Custom Properties for Glass Effects
|
|
|
|
|
'glass-bg': "rgba(255, 255, 255, 0.7)",
|
|
|
|
|
'glass-border': "rgba(255, 255, 255, 0.3)",
|
|
|
|
|
'glass-dark': "rgba(0, 0, 0, 0.7)",
|
|
|
|
|
},
|
|
|
|
|
variables: {
|
|
|
|
|
'border-color': '#e4e4e7',
|
|
|
|
|
'border-opacity': 0.12,
|
|
|
|
|
'high-emphasis-opacity': 0.87,
|
|
|
|
|
'medium-emphasis-opacity': 0.60,
|
|
|
|
|
'disabled-opacity': 0.38,
|
|
|
|
|
'idle-opacity': 0.04,
|
|
|
|
|
'hover-opacity': 0.08,
|
|
|
|
|
'focus-opacity': 0.12,
|
|
|
|
|
'selected-opacity': 0.12,
|
|
|
|
|
'activated-opacity': 0.12,
|
|
|
|
|
'pressed-opacity': 0.16,
|
|
|
|
|
'dragged-opacity': 0.08,
|
|
|
|
|
'shadow-glass': '0 8px 32px rgba(0, 0, 0, 0.1)',
|
|
|
|
|
'shadow-monaco': '0 10px 40px rgba(220, 38, 38, 0.15)',
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
monacousa_dark: {
|
|
|
|
|
dark: true,
|
|
|
|
|
colors: {
|
|
|
|
|
// Dark theme aligned with design system
|
|
|
|
|
primary: "#ef4444", // Brighter red for dark mode
|
|
|
|
|
'primary-600': "#dc2626",
|
|
|
|
|
'primary-700': "#b91c1c",
|
|
|
|
|
|
|
|
|
|
secondary: "#fafafa",
|
|
|
|
|
accent: "#3f3f46",
|
|
|
|
|
background: "#18181b", // gray-900
|
|
|
|
|
surface: "#27272a", // gray-800
|
|
|
|
|
'on-background': "#fafafa",
|
|
|
|
|
'on-surface': "#f4f4f5",
|
|
|
|
|
|
|
|
|
|
error: "#f87171",
|
|
|
|
|
warning: "#fbbf24",
|
|
|
|
|
info: "#38bdf8",
|
|
|
|
|
success: "#34d399",
|
|
|
|
|
|
|
|
|
|
'glass-bg': "rgba(0, 0, 0, 0.7)",
|
|
|
|
|
'glass-border': "rgba(255, 255, 255, 0.1)",
|
2025-08-06 14:31:16 +02:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-08-31 13:10:45 +02:00
|
|
|
variations: {
|
|
|
|
|
colors: ['primary', 'secondary', 'accent'],
|
|
|
|
|
lighten: 4,
|
|
|
|
|
darken: 4,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
defaults: {
|
|
|
|
|
VCard: {
|
|
|
|
|
elevation: 0,
|
|
|
|
|
rounded: 'xl',
|
|
|
|
|
},
|
|
|
|
|
VBtn: {
|
|
|
|
|
elevation: 0,
|
|
|
|
|
rounded: 'xl',
|
|
|
|
|
class: 'text-none font-medium',
|
|
|
|
|
},
|
|
|
|
|
VNavigationDrawer: {
|
|
|
|
|
elevation: 0,
|
|
|
|
|
},
|
|
|
|
|
VAppBar: {
|
|
|
|
|
elevation: 0,
|
|
|
|
|
flat: true,
|
|
|
|
|
},
|
|
|
|
|
VTextField: {
|
|
|
|
|
variant: 'outlined',
|
|
|
|
|
rounded: 'xl',
|
|
|
|
|
},
|
|
|
|
|
VSelect: {
|
|
|
|
|
variant: 'outlined',
|
|
|
|
|
rounded: 'xl',
|
|
|
|
|
},
|
2025-08-06 14:31:16 +02:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-08-10 16:25:05 +02:00
|
|
|
});
|