@autenticar-me/vue 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -4
- package/dist/components/SignIn.vue.d.ts +6 -3
- package/dist/components/SignIn.vue.d.ts.map +1 -1
- package/dist/components/SignUp.vue.d.ts +6 -3
- package/dist/components/SignUp.vue.d.ts.map +1 -1
- package/dist/index.cjs +43 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/dist/vue.css +0 -1761
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/tokens.ts","../src/utils/fetch-user.ts","../src/composables/useAtm.ts","../src/composables/useAuth.ts","../src/components/Modals/Modal.vue","../src/composables/useAtmClient.ts","../src/utils/device.ts","../src/components/SignIn.vue","../src/components/Notification.vue","../src/components/SignUp.vue","../src/components/Modals/SignInModal.vue","../src/components/Buttons/SignInButton.vue","../src/components/Modals/SignUpModal.vue","../src/components/Buttons/SignUpButton.vue","../src/components/UserProfile.vue","../src/components/AuthSwitcher.vue","../src/components/Buttons/SignOutButton.vue","../src/components/Layout/SignedIn.vue","../src/components/Layout/SignedOut.vue","../src/utils/fetch-configurations.ts","../src/plugin.ts"],"sourcesContent":["import UniversalCookie from 'universal-cookie'\n\nexport const writeAccessTokenInCookie = (accessToken: string | null): void => {\n const cookies = new UniversalCookie()\n\n if (accessToken === null) {\n cookies.remove('atm_access_token')\n } else {\n cookies.set('atm_access_token', accessToken)\n }\n}\n\nexport const getAccessToken = async (): Promise<string | null> => {\n const cookies = new UniversalCookie()\n return cookies.get('atm_access_token')\n}\n\nexport const writeRefreshTokenInCookie = (refreshToken: string | null): void => {\n const cookies = new UniversalCookie()\n\n if (refreshToken === null) {\n cookies.remove('atm_refresh_token')\n } else {\n cookies.set('atm_refresh_token', refreshToken)\n }\n}\n\nexport const getRefreshToken = async (): Promise<string | null> => {\n const cookies = new UniversalCookie()\n return cookies.get('atm_refresh_token')\n}\n","import type { Ref } from 'vue'\nimport type { AtmClient } from '@autenticar-me/client-js'\nimport { getAccessToken } from './tokens'\n\nexport const fetchUser = async (client: Ref<AtmClient>, user: Ref): Promise<void> => {\n let accessToken = await getAccessToken()\n\n if (accessToken == null) {\n user.value = null\n return\n }\n\n const response: any = await client.value.account(accessToken).getProfile()\n\n user.value = {\n id: response.id,\n username: response.username,\n firstName: response.first_name,\n lastName: response.last_name,\n primaryEmailAddress: response.primary_email_address,\n primaryEmailAddressId: response.primary_email_address_id,\n profileImage: response.profile_image,\n attributes: response.attributes.map((atribute: any) => ({\n key: atribute.key,\n mode: atribute.mode,\n value: atribute.value,\n })),\n }\n}\n","import { inject, type ComputedRef, type Ref } from 'vue';\nimport type { User } from '../types/user.type';\nimport type { AtmClient } from '@autenticar-me/client-js';\nimport type { Configurations } from '../types/configurations.type';\n\nexport function useAtm(): Atm {\n const ctx = inject<Atm>('atm');\n\n if (!ctx) {\n throw new Error('[Autenticar.me] É necessário configurar o plugin no main.ts');\n }\n\n return ctx;\n}\n\nexport type Atm = {\n client: Ref<AtmClient>;\n user: Ref<undefined | null | User>;\n configurations: Ref<undefined | null | Configurations>;\n isSignedIn: ComputedRef<boolean>;\n isLoaded: Ref<boolean>;\n}\n","import { fetchUser } from '../utils/fetch-user'\nimport { getAccessToken, writeAccessTokenInCookie } from '../utils/tokens'\nimport { useAtm } from './useAtm'\n\nexport function useAuth() {\n const { client, user } = useAtm()\n\n const signInByAccessToken = async (accessToken: string): Promise<void> => {\n writeAccessTokenInCookie(accessToken)\n await fetchUser(client, user)\n }\n\n const logout = async (): Promise<void> => {\n const accessToken = await getAccessToken()\n\n if (accessToken == null) {\n return\n }\n\n await client.value.account(accessToken).logout()\n\n user.value = null\n\n writeAccessTokenInCookie(null)\n }\n\n return {\n user,\n signInByAccessToken,\n getAccessToken,\n fetchUser,\n logout,\n };\n}\n","<script lang=\"ts\" setup>\nconst { title, maxWidth } = defineProps({\n title: {\n type: String,\n required: false,\n default: null,\n },\n maxWidth: {\n type: Number,\n required: false,\n default: 672,\n },\n})\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n</script>\n\n<template>\n <div class=\"atm-overlay\">\n <div class=\"atm-container\" :style=\"{maxWidth: `${maxWidth}px`}\">\n <div class=\"atm-fade-layer\">\n <div class=\"atm-fade-bg\"></div>\n </div>\n\n <div class=\"atm-modal\">\n <button class=\"atm-close-button\" @click=\"close()\">\n <svg class=\"atm-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n </button>\n\n <div class=\"atm-modal-content\">\n <h3 class=\"atm-modal-title\" v-if=\"title\">{{ title }}</h3>\n\n <div>\n <slot/>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.atm-overlay {\n position: fixed;\n inset: 0;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n overflow-y: auto;\n padding: 1.5rem 0;\n}\n\n.atm-container {\n padding: 0 1.5rem;\n width: 100%;\n margin: auto;\n}\n\n.atm-fade-layer {\n position: fixed;\n inset: 0;\n transition: opacity 0.2s ease;\n pointer-events: none;\n}\n\n.atm-fade-bg {\n position: absolute;\n inset: 0;\n opacity: 0.75;\n}\n\n.atm-modal {\n position: relative;\n display: inline-block;\n vertical-align: bottom;\n background-color: #ffffff;\n border-radius: 0.5rem;\n text-align: left;\n box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);\n transform: translate(0);\n transition: all 0.2s ease-in-out;\n max-width: 32rem;\n width: 100%;\n max-height: calc(100vh - 3rem);\n display: flex;\n flex-direction: column;\n}\n\n.atm-close-button {\n position: absolute;\n top: 1rem;\n right: 1rem;\n color: #9ca3af;\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n}\n\n.atm-close-button:hover {\n color: #4b5563;\n}\n\n.atm-icon {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.atm-modal-content {\n padding: 1.25rem;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.atm-modal-title {\n font-size: 1.125rem;\n font-weight: 500;\n color: #111827;\n margin: 0;\n margin-bottom: 0.75rem;\n}\n\n@media (max-width: 768px) {\n .atm-overlay {\n padding: 1rem 0;\n }\n\n .atm-container {\n padding: 0 1rem;\n }\n\n .atm-modal {\n border-radius: 0.375rem;\n max-height: calc(100vh - 2rem);\n }\n\n .atm-modal-content {\n padding: 1rem;\n }\n\n .atm-modal-title {\n font-size: 1rem;\n margin-bottom: 0.75rem;\n }\n\n .atm-close-button {\n top: 0.75rem;\n right: 0.75rem;\n }\n\n .atm-icon {\n width: 1.25rem;\n height: 1.25rem;\n }\n}\n\n@media (max-width: 480px) {\n .atm-overlay {\n padding: 0.5rem 0;\n }\n\n .atm-container {\n padding: 0 0.5rem;\n }\n\n .atm-modal {\n border-radius: 0.25rem;\n max-width: 100%;\n max-height: calc(100vh - 1rem);\n }\n\n .atm-modal-content {\n padding: 0.875rem;\n }\n\n .atm-modal-title {\n font-size: 0.9375rem;\n margin-bottom: 0.625rem;\n }\n\n .atm-close-button {\n top: 0.5rem;\n right: 0.5rem;\n }\n}\n\n@media (max-width: 360px) {\n .atm-overlay {\n padding: 0.25rem 0;\n }\n\n .atm-container {\n padding: 0 0.25rem;\n }\n\n .atm-modal {\n max-height: calc(100vh - 0.5rem);\n }\n\n .atm-modal-content {\n padding: 0.75rem;\n }\n\n .atm-modal-title {\n font-size: 0.875rem;\n margin-bottom: 0.5rem;\n }\n}\n</style>","import { useAtm } from './useAtm'\n\nexport function useAtmClient() {\n const { client } = useAtm()\n return client.value\n}\n","import type { AtmClient } from '@autenticar-me/client-js'\n\nconst DEVICE_TOKEN_KEY = 'atm_device_token'\n\nexport const getDeviceToken = async (client: AtmClient): Promise<string> => {\n try {\n const storedToken = localStorage.getItem(DEVICE_TOKEN_KEY)\n\n if (storedToken) {\n return storedToken\n }\n\n const response = await fetch(`${client.getProjectUrl()}/api/v1/devices`, {\n method: 'POST',\n headers: {\n 'accept': 'application/json',\n 'x-public-key': client.getPublicKey(),\n },\n })\n\n if (!response.ok) {\n const errorBody = await response.json()\n throw new Error(errorBody.message || 'Falha ao criar o token do dispositivo.')\n }\n\n const data = await response.json()\n\n if (!data.token) {\n throw new Error('O token do dispositivo não foi retornado pelo servidor.')\n }\n\n localStorage.setItem(DEVICE_TOKEN_KEY, data.token)\n return data.token\n } catch (error) {\n throw error\n }\n}\n\nexport const clearDeviceToken = (): void => {\n localStorage.removeItem(DEVICE_TOKEN_KEY)\n}\n","<script lang=\"ts\" setup>\nimport { ref, computed, inject, onMounted, watch, nextTick } from 'vue'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport { useAuth } from '../composables/useAuth'\nimport { useAtm } from '../composables/useAtm'\nimport { writeRefreshTokenInCookie } from '../utils/tokens'\nimport { getDeviceToken } from '../utils/device'\n\ninterface Form {\n emailAddress: string\n password: string\n}\n\ntype Step = 'email' | 'password' | 'email_link' | 'choose_strategy' | 'forgot_password_message'\n\ninterface Strategy {\n strategy: string\n email_address_id?: string\n}\n\nconst emit = defineEmits([\n 'completed',\n 'sign-up',\n])\n\nconst showNotification = inject<(message: string, type?: 'error' | 'success' | 'warning') => void>('showNotification')\n\nconst form = ref<Form>({\n emailAddress: '',\n password: '',\n})\n\nconst currentStep = ref<Step>('email')\nconst signInStep = ref<any>(null)\nconst availableStrategies = ref<Strategy[]>([])\nconst selectedStrategy = ref<Strategy | null>(null)\nconst serverStep = ref<string | null>(null)\nconst isLoading = ref(false)\nconst emailInput = ref<HTMLInputElement | null>(null)\nconst passwordInput = ref<HTMLInputElement | null>(null)\n\nconst fieldErrors = ref<Record<string, string[]>>({\n emailAddress: [],\n password: [],\n})\n\nconst client = useAtmClient()\nconst { signInByAccessToken } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\nconst logoUrl = computed(() => configurations.value?.project?.logo || '')\n\nconst buttonText = computed(() => {\n if (currentStep.value === 'email') return 'Entrar'\n if (currentStep.value === 'choose_strategy') return ''\n if (currentStep.value === 'forgot_password_message') return ''\n return 'Finalizar'\n})\n\nconst showEmailField = computed(() => currentStep.value === 'email' || currentStep.value === 'forgot_password_message')\nconst showPasswordField = computed(() => currentStep.value === 'password')\nconst showStrategyChoice = computed(() => currentStep.value === 'choose_strategy')\n\nconst labelText = computed(() => {\n if (configurations.value?.username?.enable === false) {\n return 'Email'\n }\n return 'Email ou Nome de usuário'\n})\n\nconst inputPlaceholder = computed(() => {\n if (configurations.value?.username?.enable === false) {\n return 'email@exemplo.com'\n }\n return \"email@exemplo.com ou seu username\"\n})\n\nconst processAvailableStrategies = (stepData: any) => {\n const strategies = stepData?.supported?.first_factors || []\n return {\n password: strategies.find((s: Strategy) => s.strategy === 'password'),\n emailLink: strategies.find((s: Strategy) => s.strategy === 'email_link')\n }\n}\n\nconst clearErrors = () => {\n fieldErrors.value = {\n emailAddress: [],\n password: [],\n }\n}\n\nconst handleEmailStep = async (): Promise<boolean> => {\n if (!form.value.emailAddress.trim()) {\n showNotification?.('Email ou nome de usuário é obrigatório')\n return false\n }\n\n try {\n const deviceToken = await getDeviceToken(client)\n const stepData = await client.auth().signInByEmailAddress(form.value.emailAddress, deviceToken)\n signInStep.value = stepData\n serverStep.value = stepData.step\n\n const strategies = processAvailableStrategies(stepData)\n\n if (strategies.password) {\n selectedStrategy.value = strategies.password\n currentStep.value = 'password'\n } else if (strategies.emailLink) {\n availableStrategies.value = [strategies.emailLink].filter(Boolean) as Strategy[]\n currentStep.value = 'choose_strategy'\n } else {\n showNotification?.('Nenhum método de autenticação disponível')\n return false\n }\n return true\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n if (error.errors.email_address) {\n fieldErrors.value.emailAddress = error.errors.email_address\n }\n } else {\n showNotification?.(error.message || 'Erro ao verificar email')\n }\n return false\n }\n}\n\nconst selectStrategy = (strategy: Strategy) => {\n selectedStrategy.value = strategy\n currentStep.value = strategy.strategy as Step\n if (strategy.strategy === 'email_link') {\n handleEmailLinkStep()\n }\n}\n\nconst handlePasswordStep = async (): Promise<boolean> => {\n if (!form.value.password.trim()) {\n showNotification?.('Senha é obrigatória')\n return false\n }\n\n try {\n if (!signInStep.value) {\n showNotification?.('Estado de autenticação inválido')\n return false\n }\n\n if (serverStep.value !== 'first_factor') {\n showNotification?.('Etapa inválida para autenticação com senha')\n return false\n }\n\n const attemptToken = (signInStep.value as any).sign_in_attempt_token\n if (!attemptToken) {\n showNotification?.('Token de tentativa não encontrado')\n return false\n }\n\n const response = await client.auth().authenticateWithPassword(signInStep.value.id, attemptToken, form.value.password)\n if (response?.step) {\n serverStep.value = response.step\n signInStep.value = { ...signInStep.value, ...response }\n }\n return true\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n if (error.errors.password) {\n fieldErrors.value.password = error.errors.password\n }\n } else {\n showNotification?.(error.message || 'Senha incorreta')\n }\n return false\n }\n}\n\nconst handleEmailLinkStep = async (): Promise<boolean> => {\n try {\n await (client.auth() as any).sendEmailLink(signInStep.value.id, selectedStrategy.value?.email_address_id!)\n showNotification?.('Link de verificação enviado para seu email', 'success')\n return true\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao enviar link de verificação')\n return false\n }\n}\n\nconst sendResetPasswordLink = async () => {\n if (!form.value.emailAddress.trim()) {\n showNotification?.('Informe o email para enviar o link de recuperação')\n return\n }\n try {\n await client.auth().resetPassword({ email_address: form.value.emailAddress })\n currentStep.value = 'forgot_password_message'\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao solicitar recuperação de senha')\n }\n}\n\nconst completeAuthentication = async () => {\n try {\n const attemptToken = (signInStep.value as any).sign_in_attempt_token\n if (!attemptToken) {\n showNotification?.('Token de tentativa não encontrado')\n isLoading.value = false\n return\n }\n\n const tokens = await client.auth().generateTokens(signInStep.value.id, attemptToken)\n\n signInByAccessToken(tokens.access_token)\n writeRefreshTokenInCookie(tokens.refresh_token)\n\n showNotification?.('Login realizado com sucesso!', 'success')\n setTimeout(() => {\n emit('completed')\n }, 1000)\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao finalizar autenticação')\n isLoading.value = false\n }\n}\n\nconst submit = async () => {\n if (isLoading.value) return\n clearErrors()\n\n try {\n isLoading.value = true\n let stepSuccess = false\n let shouldCompleteAuth = false\n\n if (currentStep.value === 'email') {\n stepSuccess = await handleEmailStep()\n if (stepSuccess) {\n isLoading.value = false\n }\n } else if (currentStep.value === 'password') {\n stepSuccess = await handlePasswordStep()\n if (stepSuccess) {\n shouldCompleteAuth = true\n }\n } else if (currentStep.value === 'choose_strategy') {\n return\n } else if (currentStep.value === 'email_link') {\n return\n } else if (currentStep.value === 'forgot_password_message') {\n return\n }\n\n if (shouldCompleteAuth) {\n await completeAuthentication()\n } else if (!stepSuccess) {\n isLoading.value = false\n }\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n const mappedErrors: Record<string, string[]> = {}\n if (error.errors.email_address) {\n mappedErrors.emailAddress = error.errors.email_address\n }\n if (error.errors.password) {\n mappedErrors.password = error.errors.password\n }\n fieldErrors.value = { ...fieldErrors.value, ...mappedErrors }\n } else {\n showNotification?.(error.message || 'Erro durante o processo de login')\n }\n isLoading.value = false\n }\n}\n\nconst signUp = () => emit('sign-up')\n\nonMounted(() => {\n nextTick(() => {\n if (emailInput.value) {\n emailInput.value.focus()\n }\n })\n})\n\nwatch(currentStep, (newStep) => {\n nextTick(() => {\n if (newStep === 'password' && passwordInput.value) {\n passwordInput.value.focus()\n }\n })\n})\n</script>\n\n<template>\n <form v-if=\"configurations\" @submit.prevent=\"submit()\">\n <div class=\"atm-login-container\">\n <div class=\"atm-logo-container\">\n <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\" class=\"atm-logo-image\" />\n <div v-else class=\"atm-logo-placeholder\">Logo</div>\n </div>\n\n <h2 class=\"atm-project-name\">{{ configurations.project.name }}</h2>\n <p class=\"atm-welcome-text\">Bem-vindo de volta! Faça login para continuar</p>\n\n <div v-if=\"currentStep !== 'forgot_password_message'\">\n <div class=\"atm-form-group\" v-if=\"showEmailField\">\n <label class=\"atm-input-label\">{{ labelText }}</label>\n <input ref=\"emailInput\" type=\"text\" class=\"atm-input-field\" :placeholder=\"inputPlaceholder\"\n v-model=\"form.emailAddress\" :disabled=\"currentStep !== 'email' || isLoading\" />\n <div v-if=\"fieldErrors.emailAddress.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.emailAddress[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"showPasswordField\">\n <label class=\"atm-input-label\">Senha</label>\n <input ref=\"passwordInput\" type=\"password\" class=\"atm-input-field\" placeholder=\"Digite sua senha\"\n v-model=\"form.password\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.password[0] }}\n </div>\n <div class=\"atm-alternative-options\" style=\"margin-top: 4px;\">\n <button type=\"button\" @click=\"sendResetPasswordLink()\" class=\"atm-forgot-password-link\"\n :disabled=\"isLoading\">\n Esqueci a minha senha\n </button>\n </div>\n </div>\n\n <div v-if=\"showStrategyChoice\" class=\"atm-strategy-choice\">\n <p class=\"atm-strategy-title\">Escolha como deseja fazer login:</p>\n <div class=\"atm-strategy-buttons\">\n <button v-for=\"strategy in availableStrategies\" :key=\"strategy.strategy\"\n @click=\"selectStrategy(strategy)\" type=\"button\" class=\"atm-strategy-button\"\n :disabled=\"isLoading\">\n <span v-if=\"strategy.strategy === 'email_link'\">Usar link por email</span>\n </button>\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"currentStep === 'email_link'\">\n <p class=\"atm-email-link-text\">\n Link de verificação enviado para seu email. Verifique sua caixa de entrada.\n </p>\n </div>\n </div>\n\n <div v-else class=\"atm-forgot-password-message\"\n style=\"text-align: center; color: #333; margin-bottom: 16px;\">\n <p>Foi enviado um link para resetar a senha para o email <strong>{{ form.emailAddress }}</strong>.\n Verifique sua caixa de entrada.</p>\n </div>\n\n <button v-if=\"buttonText\" type=\"submit\" class=\"atm-login-button\" :disabled=\"isLoading\">\n <span v-if=\"!isLoading\">{{ buttonText }}</span>\n <span v-else class=\"button-spinner\">\n <svg class=\"spinner-svg\" viewBox=\"0 0 50 50\">\n <circle class=\"spinner-circle\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"5\" />\n </svg>\n <span v-if=\"currentStep === 'email'\">Verificando...</span>\n <span v-else>Entrando...</span>\n </span>\n </button>\n\n <div class=\"atm-footer-links\">\n <p class=\"atm-signup-text\">\n Ainda não tem uma conta? <a @click=\"signUp()\" class=\"atm-signup-link\">Cadastre aqui</a>\n </p>\n\n <p class=\"atm-powered-by\">\n Secured by <strong>Autenticar.me</strong>\n </p>\n </div>\n </div>\n </form>\n</template>\n\n<style scoped>\n.atm-login-container {\n background: #ffffff;\n border-radius: 8px;\n font-family: 'Segoe UI', system-ui, sans-serif;\n text-align: center;\n}\n\n.atm-logo-container {\n margin-bottom: 12px;\n}\n\n.atm-logo-placeholder {\n width: 44px;\n height: 44px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n font-size: 11px;\n}\n\n.atm-logo-image {\n max-width: 44px;\n max-height: 44px;\n margin: 0 auto;\n display: block;\n border-radius: 4px;\n object-fit: contain;\n}\n\n.atm-project-name {\n margin: 0 0 4px 0;\n font-size: 18px;\n color: v-bind('atmPrimaryColor');\n font-weight: 600;\n}\n\n.atm-welcome-text {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n}\n\n.atm-form-group {\n margin-bottom: 12px;\n text-align: left;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-input-field:disabled {\n background-color: #f5f5f5;\n cursor: not-allowed;\n}\n\n.atm-field-error {\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n text-align: left;\n}\n\n.atm-alternative-options {\n margin-top: 8px;\n text-align: center;\n}\n\n.atm-forgot-password-link {\n font-size: 12px;\n background: none;\n border: none;\n color: v-bind('atmSecondaryColor');\n cursor: pointer;\n text-decoration: none;\n padding: 0;\n font-family: inherit;\n}\n\n.atm-forgot-password-link:hover:not(:disabled) {\n text-decoration: underline;\n}\n\n.atm-forgot-password-link:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.atm-strategy-choice {\n text-align: center;\n margin-bottom: 12px;\n}\n\n.atm-strategy-title {\n font-size: 14px;\n color: #666;\n margin-bottom: 12px;\n}\n\n.atm-strategy-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.atm-strategy-button {\n width: 100%;\n padding: 10px;\n background: #f8f9fa;\n color: #333;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.atm-strategy-button:hover:not(:disabled) {\n background: #e9ecef;\n border-color: v-bind('atmPrimaryColor');\n}\n\n.atm-strategy-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.atm-email-link-text {\n font-size: 14px;\n color: #666;\n margin: 0;\n text-align: center;\n}\n\n.atm-login-button {\n width: 100%;\n padding: 10px;\n margin-top: 4px;\n background: v-bind('atmPrimaryColor');\n color: #fff;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.atm-login-button:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n}\n\n.atm-login-button:disabled {\n opacity: 0.8;\n cursor: not-allowed;\n transform: none;\n}\n\n.button-spinner {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: #fff;\n font-weight: 500;\n}\n\n.spinner-svg {\n animation: spin 1s linear infinite;\n width: 18px;\n height: 18px;\n stroke: #fff;\n}\n\n.spinner-circle {\n stroke-dasharray: 90, 150;\n stroke-linecap: round;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.atm-footer-links {\n margin-top: 16px;\n font-size: 13px;\n}\n\n.atm-signup-text {\n color: #666;\n margin-bottom: 6px;\n}\n\n.atm-signup-link {\n color: v-bind('atmSecondaryColor');\n text-decoration: none;\n cursor: pointer;\n}\n\n.atm-signup-link:hover {\n text-decoration: underline;\n}\n\n.atm-powered-by {\n color: #999;\n font-size: 11px;\n margin: 0;\n}\n\n@media (max-width: 768px) {\n .atm-project-name {\n font-size: 17px;\n }\n\n .atm-welcome-text {\n font-size: 13px;\n margin-bottom: 14px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-login-button {\n font-size: 13px;\n padding: 9px;\n min-height: 40px;\n }\n\n .atm-strategy-button {\n padding: 9px;\n font-size: 13px;\n }\n\n .atm-footer-links {\n margin-top: 14px;\n font-size: 12px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logo-placeholder {\n width: 40px;\n height: 40px;\n font-size: 10px;\n }\n\n .atm-logo-image {\n max-width: 40px;\n max-height: 40px;\n }\n\n .atm-project-name {\n font-size: 16px;\n margin-bottom: 4px;\n }\n\n .atm-welcome-text {\n font-size: 12px;\n margin-bottom: 12px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 7px 9px;\n font-size: 13px;\n }\n\n .atm-login-button {\n font-size: 13px;\n padding: 9px;\n min-height: 38px;\n }\n\n .atm-forgot-password-link {\n font-size: 11px;\n }\n\n .atm-strategy-title {\n font-size: 13px;\n margin-bottom: 10px;\n }\n\n .atm-strategy-button {\n padding: 9px;\n font-size: 13px;\n }\n\n .atm-email-link-text {\n font-size: 13px;\n }\n\n .atm-footer-links {\n margin-top: 12px;\n font-size: 12px;\n }\n\n .atm-powered-by {\n font-size: 10px;\n }\n\n .spinner-svg {\n width: 16px;\n height: 16px;\n }\n\n .button-spinner {\n gap: 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logo-placeholder {\n width: 36px;\n height: 36px;\n font-size: 9px;\n }\n\n .atm-logo-image {\n max-width: 36px;\n max-height: 36px;\n }\n\n .atm-project-name {\n font-size: 15px;\n margin-bottom: 3px;\n }\n\n .atm-welcome-text {\n font-size: 11px;\n margin-bottom: 10px;\n }\n\n .atm-form-group {\n margin-bottom: 8px;\n }\n\n .atm-input-label {\n font-size: 11px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 6px 8px;\n font-size: 12px;\n }\n\n .atm-login-button {\n font-size: 12px;\n padding: 8px;\n min-height: 36px;\n }\n\n .atm-strategy-button {\n padding: 8px;\n font-size: 12px;\n }\n\n .atm-footer-links {\n margin-top: 10px;\n font-size: 11px;\n }\n\n .spinner-svg {\n width: 14px;\n height: 14px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\ninterface Props {\n show: boolean\n message: string\n type?: 'error' | 'success' | 'warning'\n}\n\nwithDefaults(defineProps<Props>(), {\n type: 'error'\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"atm-notification\">\n <div v-if=\"show\" class=\"atm-notification-container\">\n <div class=\"atm-notification\" :class=\"`atm-notification--${type}`\">\n {{ message }}\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n.atm-notification-container {\n font-family: Arial, Helvetica, sans-serif;\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 99999;\n pointer-events: none;\n}\n\n.atm-notification {\n padding: 12px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n min-width: 250px;\n max-width: 350px;\n pointer-events: auto;\n}\n\n.atm-notification--error {\n background: #ff3333;\n color: #FFF;\n}\n\n.atm-notification--success {\n background: #00a622;\n color: #FFF;\n}\n\n.atm-notification--warning {\n background: #ffa500;\n color: #FFF;\n}\n\n.atm-notification-enter-active {\n transition: all 0.3s ease-out;\n}\n\n.atm-notification-leave-active {\n transition: all 0.3s ease-in;\n}\n\n.atm-notification-enter-from {\n transform: translateX(100%);\n opacity: 0;\n}\n\n.atm-notification-leave-to {\n transform: translateX(100%);\n opacity: 0;\n}\n\n@media (max-width: 768px) {\n .atm-notification-container {\n top: 16px;\n right: 16px;\n left: 16px;\n }\n\n .atm-notification {\n min-width: auto;\n max-width: 100%;\n padding: 11px 14px;\n font-size: 13px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-notification-container {\n top: 12px;\n right: 12px;\n left: 12px;\n }\n\n .atm-notification {\n padding: 10px 12px;\n font-size: 12px;\n border-radius: 5px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-notification-container {\n top: 10px;\n right: 10px;\n left: 10px;\n }\n\n .atm-notification {\n padding: 9px 11px;\n font-size: 11px;\n border-radius: 4px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, nextTick } from 'vue'\nimport { useAtm } from '../composables/useAtm'\nimport Notification from './Notification.vue'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport { useAuth } from '../composables/useAuth'\nimport { writeRefreshTokenInCookie } from '../utils/tokens'\nimport { getDeviceToken } from '../utils/device'\n\ntype NotificationType = 'error' | 'success' | 'warning'\n\ninterface FormData {\n first_name: string\n last_name: string\n email_address: string\n password: string\n confirm_password: string\n}\n\ninterface NotificationData {\n show: boolean\n message: string\n type: NotificationType\n}\n\nconst emit = defineEmits<{\n (e: 'completed'): void\n (e: 'sign-in'): void\n}>()\n\nconst { configurations } = useAtm()\n\nconst form = ref<FormData>({\n first_name: '',\n last_name: '',\n email_address: '',\n password: '',\n confirm_password: '',\n})\n\nconst notification = ref<NotificationData>({\n show: false,\n message: '',\n type: 'error',\n})\n\nconst isLoading = ref(false)\nconst firstNameInput = ref<HTMLInputElement | null>(null)\nconst emailInput = ref<HTMLInputElement | null>(null)\n\nconst fieldErrors = ref<Record<string, string[]>>({\n first_name: [],\n last_name: [],\n email_address: [],\n password: [],\n confirm_password: [],\n})\n\nconst showNotification = (message: string, type: NotificationType = 'error'): void => {\n notification.value = {\n show: true,\n message,\n type,\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nonMounted(() => {\n nextTick(() => {\n if (hasFirstName.value && firstNameInput.value) {\n firstNameInput.value.focus()\n } else if (emailInput.value) {\n emailInput.value.focus()\n }\n })\n})\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\nconst logoUrl = computed(() => configurations.value?.project?.logo || '')\n\nconst hasFirstName = computed(() => configurations.value?.firstName?.required === true)\nconst hasLastName = computed(() => configurations.value?.lastName?.required === true)\nconst hasPassword = computed(() => configurations.value?.password?.enable !== false)\nconst lengthConfig = computed(() => configurations.value?.password?.length)\n\nconst validatePassword = (): string | null => {\n const password = form.value.password\n const minLength = lengthConfig.value?.min ?? 8\n const maxLength = lengthConfig.value?.max ?? 64\n\n if (password.length < minLength) {\n return `Senha deve ter pelo menos ${minLength} caracteres`\n }\n\n if (password.length > maxLength) {\n return `Senha deve ter no máximo ${maxLength} caracteres`\n }\n\n if (configurations.value?.password?.uppercase && !/[A-Z]/.test(password)) {\n return 'Senha deve conter pelo menos uma letra maiúscula'\n }\n\n if (configurations.value?.password?.lowercase && !/[a-z]/.test(password)) {\n return 'Senha deve conter pelo menos uma letra minúscula'\n }\n\n if (configurations.value?.password?.numbers && !/\\d/.test(password)) {\n return 'Senha deve conter pelo menos um número'\n }\n\n if (configurations.value?.password?.symbols && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n return 'Senha deve conter pelo menos um símbolo especial'\n }\n\n return null\n}\n\nconst client = useAtmClient()\nconst { signInByAccessToken } = useAuth()\n\nconst clearErrors = () => {\n fieldErrors.value = {\n first_name: [],\n last_name: [],\n email_address: [],\n password: [],\n confirm_password: [],\n }\n}\n\nconst submit = async () => {\n if (isLoading.value) return\n clearErrors()\n\n if (hasFirstName.value && !form.value.first_name.trim()) {\n showNotification('Nome é obrigatório')\n return\n }\n\n if (hasLastName.value && !form.value.last_name.trim()) {\n showNotification('Sobrenome é obrigatório')\n return\n }\n\n if (!form.value.email_address.trim()) {\n showNotification('Email é obrigatório')\n return\n }\n\n if (hasPassword.value) {\n if (!form.value.password.trim()) {\n showNotification('Senha é obrigatória')\n return\n }\n\n const passwordError = validatePassword()\n if (passwordError) {\n showNotification(passwordError)\n return\n }\n\n if (!form.value.confirm_password.trim()) {\n showNotification('Confirmação de senha é obrigatória')\n return\n }\n\n if (form.value.password !== form.value.confirm_password) {\n showNotification('Senhas não coincidem')\n return\n }\n }\n\n try {\n isLoading.value = true\n\n await client.auth().register({\n first_name: form.value.first_name,\n last_name: form.value.last_name,\n email_address: form.value.email_address,\n password: form.value.password,\n })\n\n showNotification('Conta criada com sucesso!', 'success')\n\n const deviceToken = await getDeviceToken(client)\n const signInStep = await client.auth().signInByEmailAddress(form.value.email_address, deviceToken)\n\n const attemptToken = (signInStep as any).token\n if (!attemptToken) {\n throw new Error('Token de tentativa não encontrado')\n }\n\n await client.auth().authenticateWithPassword(signInStep.id, attemptToken, form.value.password)\n const tokens = await client.auth().generateTokens(signInStep.id, attemptToken)\n\n signInByAccessToken(tokens.access_token)\n writeRefreshTokenInCookie(tokens.refresh_token)\n\n showNotification('Login realizado com sucesso!', 'success')\n setTimeout(() => {\n emit('completed')\n }, 1000)\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n fieldErrors.value = { ...fieldErrors.value, ...error.errors }\n } else {\n showNotification(error.message || 'Erro ao registrar usuário', 'error')\n }\n isLoading.value = false\n }\n}\n\nconst signIn = (): void => emit('sign-in')\n</script>\n\n<template>\n <Notification :show=\"notification.show\" :message=\"notification.message\" :type=\"notification.type\" />\n\n <form v-if=\"configurations\" @submit.prevent=\"submit\">\n <div class=\"atm-signup-container\">\n <div class=\"atm-logo-container\">\n <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\" class=\"atm-logo-image\" />\n <div v-else class=\"atm-logo-placeholder\">Logo</div>\n </div>\n\n <h2 class=\"atm-project-name\">{{ configurations.project.name }}</h2>\n <p class=\"atm-welcome-text\">Crie sua conta para começar</p>\n\n <div class=\"atm-form-group\" v-if=\"hasFirstName\">\n <label class=\"atm-input-label\">\n Primeiro Nome {{ configurations.firstName?.required ? '*' : '' }}\n </label>\n <input ref=\"firstNameInput\" type=\"text\" class=\"atm-input-field\" v-model=\"form.first_name\"\n placeholder=\"Digite seu primeiro nome\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.first_name.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.first_name[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasLastName\">\n <label class=\"atm-input-label\">\n Sobrenome {{ configurations.lastName?.required ? '*' : '' }}\n </label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"form.last_name\" placeholder=\"Digite seu sobrenome\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.last_name.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.last_name[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Email ou Nome de usuário *</label>\n <input ref=\"emailInput\" type=\"text\" class=\"atm-input-field\" v-model=\"form.email_address\"\n placeholder=\"email@exemplo.com ou seuusername\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.email_address.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.email_address[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasPassword\">\n <label class=\"atm-input-label\">Senha *</label>\n <input type=\"password\" class=\"atm-input-field\" v-model=\"form.password\" placeholder=\"\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.password[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasPassword\">\n <label class=\"atm-input-label\">Confirmar Senha *</label>\n <input type=\"password\" class=\"atm-input-field\" v-model=\"form.confirm_password\" placeholder=\"\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.confirm_password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.confirm_password[0] }}\n </div>\n </div>\n\n <button type=\"submit\" class=\"atm-signup-button\" :disabled=\"isLoading\">\n <span v-if=\"!isLoading\">Criar Conta</span>\n <span v-else class=\"button-spinner\">\n <svg class=\"spinner-svg\" viewBox=\"0 0 50 50\">\n <circle class=\"spinner-circle\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"5\" />\n </svg>\n Criando...\n </span>\n </button>\n\n <div class=\"atm-footer-links\">\n <p class=\"atm-login-text\">\n Já tem uma conta? <a @click=\"signIn\" class=\"atm-login-link\"\n :class=\"{ 'disabled-link': isLoading }\">Faça login</a>\n </p>\n\n <p class=\"atm-powered-by\">Secured by <strong>Autenticar.me</strong></p>\n </div>\n </div>\n </form>\n</template>\n\n<style scoped>\n.atm-signup-container {\n width: 100%;\n border-radius: 8px;\n font-family: 'Segoe UI', system-ui, sans-serif;\n text-align: center;\n}\n\n.atm-logo-container {\n margin-bottom: 12px;\n}\n\n.atm-logo-placeholder {\n width: 44px;\n height: 44px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n font-size: 11px;\n}\n\n.atm-logo-image {\n max-width: 44px;\n max-height: 44px;\n margin: 0 auto;\n display: block;\n border-radius: 4px;\n object-fit: contain;\n}\n\n.atm-project-name {\n margin: 0 0 4px 0;\n font-size: 18px;\n color: v-bind('atmPrimaryColor');\n font-weight: 600;\n}\n\n.atm-welcome-text {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n}\n\n.atm-form-group {\n margin-bottom: 12px;\n text-align: left;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-input-field:disabled {\n background-color: #f5f5f5;\n cursor: not-allowed;\n}\n\n.atm-field-error {\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n text-align: left;\n}\n\n.atm-signup-button {\n width: 100%;\n padding: 10px;\n margin-top: 4px;\n background: v-bind('atmPrimaryColor');\n color: #fff;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.atm-signup-button:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n}\n\n.atm-signup-button:disabled {\n opacity: 0.8;\n cursor: not-allowed;\n transform: none;\n}\n\n.button-spinner {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: #fff;\n font-weight: 500;\n}\n\n.spinner-svg {\n animation: spin 1s linear infinite;\n width: 18px;\n height: 18px;\n stroke: #fff;\n}\n\n.spinner-circle {\n stroke-dasharray: 90, 150;\n stroke-linecap: round;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.atm-footer-links {\n margin-top: 16px;\n font-size: 13px;\n}\n\n.atm-login-text {\n color: #666;\n margin-bottom: 6px;\n}\n\n.atm-login-link {\n color: v-bind('atmSecondaryColor');\n text-decoration: none;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-login-link:hover:not(.disabled-link) {\n text-decoration: underline;\n}\n\n.atm-login-link.disabled-link {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.atm-powered-by {\n color: #999;\n font-size: 11px;\n margin: 0;\n}\n\n@media (max-width: 768px) {\n .atm-project-name {\n font-size: 17px;\n }\n\n .atm-welcome-text {\n font-size: 13px;\n margin-bottom: 14px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-signup-button {\n font-size: 13px;\n padding: 9px;\n min-height: 40px;\n }\n\n .atm-footer-links {\n margin-top: 14px;\n font-size: 12px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logo-placeholder {\n width: 40px;\n height: 40px;\n font-size: 10px;\n }\n\n .atm-logo-image {\n max-width: 40px;\n max-height: 40px;\n }\n\n .atm-project-name {\n font-size: 16px;\n margin-bottom: 4px;\n }\n\n .atm-welcome-text {\n font-size: 12px;\n margin-bottom: 12px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 7px 9px;\n font-size: 13px;\n }\n\n .atm-signup-button {\n font-size: 13px;\n padding: 9px;\n min-height: 38px;\n }\n\n .atm-footer-links {\n margin-top: 12px;\n font-size: 12px;\n }\n\n .atm-powered-by {\n font-size: 10px;\n }\n\n .spinner-svg {\n width: 16px;\n height: 16px;\n }\n\n .button-spinner {\n gap: 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logo-placeholder {\n width: 36px;\n height: 36px;\n font-size: 9px;\n }\n\n .atm-logo-image {\n max-width: 36px;\n max-height: 36px;\n }\n\n .atm-project-name {\n font-size: 15px;\n margin-bottom: 3px;\n }\n\n .atm-welcome-text {\n font-size: 11px;\n margin-bottom: 10px;\n }\n\n .atm-form-group {\n margin-bottom: 8px;\n }\n\n .atm-input-label {\n font-size: 11px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 6px 8px;\n font-size: 12px;\n }\n\n .atm-signup-button {\n font-size: 12px;\n padding: 8px;\n min-height: 36px;\n }\n\n .atm-footer-links {\n margin-top: 10px;\n font-size: 11px;\n }\n\n .spinner-svg {\n width: 14px;\n height: 14px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport Modal from './Modal.vue'\nimport SignIn from '../SignIn.vue'\nimport SignUp from '../SignUp.vue'\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n\nconst component = ref<'sign-up' | 'sign-in'>('sign-in')\n\nconst signUp = () => component.value = 'sign-up'\n\nconst signIn = () => component.value = 'sign-in'\n\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1024)\n\nconst maxWidth = computed(() => {\n if (windowWidth.value <= 360) return 340\n if (windowWidth.value <= 480) return windowWidth.value - 20\n if (windowWidth.value <= 768) return 400\n return 420\n})\n\nconst updateWidth = () => {\n windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n window.addEventListener('resize', updateWidth)\n})\n\nonUnmounted(() => {\n window.removeEventListener('resize', updateWidth)\n})\n</script>\n\n<template>\n <Modal :max-width=\"maxWidth\" @close=\"close()\">\n <SignIn\n v-if=\"component === 'sign-in'\"\n @sign-up=\"signUp()\"\n @completed=\"close()\"\n />\n\n <SignUp\n v-if=\"component === 'sign-up'\"\n @sign-in=\"signIn()\"\n @completed=\"close()\"\n />\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed, provide } from 'vue'\nimport SignInModal from '../Modals/SignInModal.vue'\nimport Notification from '../Notification.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst showSignInModal = ref(false)\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\n\nconst notification = ref({\n show: false,\n message: '',\n type: 'error' as 'error' | 'success' | 'warning'\n})\n\nconst showNotification = (message: string, type: 'error' | 'success' | 'warning' = 'error') => {\n notification.value = {\n show: true,\n message,\n type\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nprovide('showNotification', showNotification)\n\nconst signIn = () => {\n showSignInModal.value = true\n}\n</script>\n\n<template>\n <Notification \n :show=\"notification.show\" \n :message=\"notification.message\" \n :type=\"notification.type\" \n />\n\n <SignInModal v-if=\"showSignInModal\" @close=\"() => showSignInModal = false\"/>\n\n <button @click=\"signIn()\" class=\"atm-signin-btn\">\n Entrar\n </button>\n</template>\n\n<style scoped>\n.atm-signin-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n min-height: 44px;\n}\n\n.atm-signin-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-signin-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-signin-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-signin-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport Modal from './Modal.vue'\nimport SignIn from '../SignIn.vue'\nimport SignUp from '../SignUp.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst { configurations } = useAtm()\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n\nconst component = ref<'sign-up' | 'sign-in'>('sign-up')\nconst isRegistrationAllowed = computed(() => configurations.value?.register?.enable !== false)\n\nconst signUp = () => component.value = 'sign-up'\n\nconst signIn = () => component.value = 'sign-in'\n\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1024)\n\nconst maxWidth = computed(() => {\n if (windowWidth.value <= 360) return 340\n if (windowWidth.value <= 480) return windowWidth.value - 20\n if (windowWidth.value <= 768) return 400\n return 420\n})\n\nconst updateWidth = () => {\n windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n window.addEventListener('resize', updateWidth)\n})\n\nonUnmounted(() => {\n window.removeEventListener('resize', updateWidth)\n})\n</script>\n\n<template>\n <Modal :max-width=\"maxWidth\" @close=\"close()\">\n <SignIn\n v-if=\"component === 'sign-in'\"\n @sign-up=\"signUp()\"\n @completed=\"close()\"\n />\n\n <SignUp\n v-if=\"component === 'sign-up' && isRegistrationAllowed\"\n @sign-in=\"signIn()\"\n @completed=\"close()\"\n />\n\n <div v-else-if=\"component === 'sign-up'\" style=\"padding: 24px; text-align: center;\">\n <p style=\"margin-bottom: 16px;\">Registro não está disponível no momento</p>\n <button @click=\"signIn()\" style=\"padding: 12px 24px; background: #007bff; color: white; border: none; border-radius: 6px; cursor: pointer;\">Fazer login</button>\n </div>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport SignUpModal from '../Modals/SignUpModal.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst showSignUpModal = ref(false)\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst isRegistrationAllowed = computed(() => configurations.value?.register?.enable !== false)\n\nconst signUp = () => {\n showSignUpModal.value = true\n}\n</script>\n\n<template>\n <SignUpModal v-if=\"showSignUpModal\" @close=\"() => showSignUpModal = false\" />\n\n <button v-if=\"isRegistrationAllowed\" @click=\"signUp()\" class=\"atm-signup-btn\">\n Cadastrar-se\n </button>\n</template>\n\n<style scoped>\n.atm-signup-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n min-height: 44px;\n}\n\n.atm-signup-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-signup-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-signup-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-signup-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted, provide } from 'vue'\nimport { useAuth } from '../composables/useAuth'\nimport { useAtm } from '../composables/useAtm'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport Notification from './Notification.vue'\nimport type { Session, Device } from '../types/session.type'\n\ninterface ProfileFormData {\n firstName: string\n lastName: string\n primaryEmailAddress: string\n}\n\ninterface NotificationData {\n show: boolean\n message: string\n type: 'error' | 'success' | 'warning'\n}\n\ninterface UpdateData {\n first_name?: string\n last_name?: string\n}\n\ninterface ProfileDataUpdated {\n first_name?: string | null\n last_name?: string | null\n primary_email_address: string\n}\n\ninterface EmailAddress {\n email_address: string\n id: string\n primary: boolean\n verified: boolean\n}\n\ntype NotificationType = 'error' | 'success' | 'warning'\n\nconst { user, logout } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\n\nconst isDropdownOpen = ref(false)\nconst isProfileModalOpen = ref(false)\nconst isEditingProfile = ref(false)\nconst buttonRef = ref<HTMLButtonElement | null>(null)\nconst emailAddresses = ref<EmailAddress[]>([])\nconst newEmail = ref<string>('')\nconst activeTab = ref<'geral' | 'emails' | 'senha' | 'sessoes'>('geral')\nconst sessions = ref<Session[]>([])\n\nconst client = useAtmClient()\n\nconst profileForm = ref<ProfileFormData>({\n firstName: '',\n lastName: '',\n primaryEmailAddress: ''\n})\n\nconst notification = ref<NotificationData>({\n show: false,\n message: '',\n type: 'error'\n})\n\nconst showNotification = (message: string, type: NotificationType = 'error') => {\n notification.value = {\n show: true,\n message,\n type\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nprovide('showNotification', showNotification)\n\nconst userInitials = computed(() => {\n if (!user.value || !user.value.firstName) return ''\n return (user.value.firstName.charAt(0) + (user.value.lastName?.charAt(0) || '')).toUpperCase()\n})\n\nconst toggleMenu = () => (isDropdownOpen.value = !isDropdownOpen.value)\n\nconst closeMenu = (event: MouseEvent) => {\n if (buttonRef.value && !buttonRef.value.contains(event.target as Node)) {\n isDropdownOpen.value = false\n }\n}\n\nconst openProfileModal = async () => {\n isDropdownOpen.value = false\n isProfileModalOpen.value = true\n activeTab.value = 'geral'\n resetProfileForm()\n await loadEmailAddresses()\n await loadSessions()\n}\n\nconst closeProfileModal = () => {\n isProfileModalOpen.value = false\n isEditingProfile.value = false\n resetProfileForm()\n emailAddresses.value = []\n newEmail.value = ''\n sessions.value = []\n activeTab.value = 'geral'\n}\n\nconst resetProfileForm = () => {\n if (user.value) {\n profileForm.value = {\n firstName: user.value.firstName || '',\n lastName: user.value.lastName || '',\n primaryEmailAddress: user.value.primaryEmailAddress || ''\n }\n }\n}\n\nconst updateProfileFormWithData = (profileDataUpdated: ProfileDataUpdated) => {\n if (profileDataUpdated.first_name) {\n profileForm.value.firstName = profileDataUpdated.first_name\n }\n if (profileDataUpdated.last_name) {\n profileForm.value.lastName = profileDataUpdated.last_name\n }\n if (profileDataUpdated.primary_email_address) {\n profileForm.value.primaryEmailAddress = profileDataUpdated.primary_email_address\n }\n}\n\nconst loadEmailAddresses = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n const emails = await client.account(token).getEmailsAddresses()\n emailAddresses.value = emails\n } catch (error: any) {\n showNotification('Erro ao carregar endereços de email', 'error')\n }\n}\n\nconst requestEmailVerification = async (emailId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).requestEmailVerification(emailId)\n showNotification('Link de verificação enviado para o email', 'success')\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao enviar verificação de email', 'error')\n }\n}\n\nconst deleteEmailAddress = async (emailId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).deleteEmailAddress(emailId)\n showNotification('Email removido com sucesso', 'success')\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao remover email', 'error')\n }\n}\n\nconst createEmailAddress = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n if (!newEmail.value.trim()) {\n showNotification('Informe o novo email', 'error')\n return\n }\n await client.account(token).createEmailAddress(newEmail.value.trim())\n showNotification('Email adicionado. Verifique sua caixa de entrada.', 'success')\n newEmail.value = ''\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao adicionar email', 'error')\n }\n}\n\nconst startEditing = () => {\n isEditingProfile.value = true\n}\n\nconst cancelEditing = () => {\n isEditingProfile.value = false\n resetProfileForm()\n}\n\nconst getCookie = (name: string) => {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\n return null;\n}\n\nconst updateProfile = async () => {\n try {\n if (!profileForm.value.firstName.trim()) {\n showNotification('Nome é obrigatório', 'error')\n return\n }\n if (!profileForm.value.lastName.trim()) {\n showNotification('Sobrenome é obrigatório', 'error')\n return\n }\n const updateData: UpdateData = {}\n if (profileForm.value.firstName !== user.value?.firstName) {\n updateData.first_name = profileForm.value.firstName.trim()\n }\n if (profileForm.value.lastName !== user.value?.lastName) {\n updateData.last_name = profileForm.value.lastName.trim()\n }\n if (Object.keys(updateData).length === 0) {\n showNotification('Nenhuma alteração foi feita', 'warning')\n isEditingProfile.value = false\n return\n }\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).updateProfile(updateData)\n const profileDataUpdated: ProfileDataUpdated = await client.account(token).getProfile()\n updateProfileFormWithData(profileDataUpdated)\n showNotification('Perfil atualizado com sucesso!', 'success')\n isEditingProfile.value = false\n } catch (error: any) {\n showNotification(error.message || 'Erro ao atualizar perfil', 'error')\n }\n}\n\nconst logoutUser = () => {\n logout()\n isDropdownOpen.value = false\n}\n\nconst sendResetPasswordLink = async () => {\n if (!user.value?.primaryEmailAddress) {\n showNotification('Informe o email para enviar o link de recuperação', 'error')\n return\n }\n try {\n await client.auth().resetPassword({ email_address: user.value.primaryEmailAddress })\n showNotification(`Foi enviado um link para resetar a senha para o email ${user.value.primaryEmailAddress}.`, 'success')\n } catch (e: any) {\n showNotification(e.message || 'Erro ao solicitar recuperação de senha', 'error')\n }\n}\n\nconst loadSessions = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n const sessionsData = await client.account(token).getSessions()\n sessions.value = sessionsData\n } catch (error: any) {\n showNotification('Erro ao carregar sessões', 'error')\n }\n}\n\nconst closeSessionById = async (sessionId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).closeSession(sessionId)\n showNotification('Sessão encerrada com sucesso', 'success')\n await loadSessions()\n } catch (error: any) {\n showNotification('Erro ao encerrar sessão', 'error')\n }\n}\n\nconst formatDate = (dateString: string) => {\n const date = new Date(dateString)\n return date.toLocaleString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n })\n}\n\nconst getDeviceIcon = (device: Device) => {\n const platform = device.platform?.toLowerCase() || ''\n const browser = device.browser?.toLowerCase() || ''\n\n if (platform.includes('windows') || platform.includes('win32') || platform.includes('win64')) {\n return 'M0,0V11H11V0ZM13,0V11H24V0ZM0,13V24H11V13ZM13,13V24H24V13Z'\n }\n\n if (platform.includes('mac') || platform.includes('darwin') || platform.includes('os x')) {\n return 'M12,1C7,1 3,5 3,10C3,14 6,17 9,18V22H15V18C18,17 21,14 21,10C21,5 17,1 12,1M12,3C15.9,3 19,6.1 19,10C19,13.4 16.6,16.2 13.4,16.8L13,16.9V20H11V16.9L10.6,16.8C7.4,16.2 5,13.4 5,10C5,6.1 8.1,3 12,3Z'\n }\n\n if (platform.includes('iphone') || platform.includes('ipad') || platform.includes('ipod') || platform.includes('ios')) {\n return 'M15.5,1H8.5C7.67,1 7,1.67 7,2.5V21.5C7,22.33 7.67,23 8.5,23H15.5C16.33,23 17,22.33 17,21.5V2.5C17,1.67 16.33,1 15.5,1M12,22C11.45,22 11,21.55 11,21C11,20.45 11.45,20 12,20C12.55,20 13,20.45 13,21C13,21.55 12.55,22 12,22M15,19H9V4H15V19Z'\n }\n\n if (platform.includes('android')) {\n return 'M16.61,15.15C16.15,15.15 15.77,15.53 15.77,16C15.77,16.46 16.15,16.85 16.61,16.85C17.07,16.85 17.46,16.46 17.46,16C17.46,15.53 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,15.53 6.57,16C6.57,16.46 6.95,16.85 7.41,16.85C7.87,16.85 8.26,16.46 8.26,16C8.26,15.53 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14Z'\n }\n\n if (platform.includes('linux') || platform.includes('ubuntu') || platform.includes('debian') || platform.includes('fedora') || platform.includes('centos') || platform.includes('arch')) {\n return 'M12,2C11.5,2 11,2.19 10.59,2.59L2.59,10.59C1.8,11.37 1.8,12.63 2.59,13.41L10.59,21.41C11.37,22.2 12.63,22.2 13.41,21.41L21.41,13.41C22.2,12.63 22.2,11.37 21.41,10.59L13.41,2.59C13,2.19 12.5,2 12,2M12,4L20,12L12,20L4,12M12.5,7V13H11V7M12.5,15V17H11V15'\n }\n\n if (platform.includes('chrome') || browser.includes('chrome')) {\n return 'M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4C14.6,4 16.94,5.27 18.35,7.25L15.5,12C15.29,11.41 15,10.87 14.62,10.41C13.69,9.31 12.36,8.63 10.88,8.63C10.75,8.63 10.62,8.64 10.5,8.65L12,4.03C12,4.03 12,4 12,4M4.26,8.09C5.61,6.19 7.82,5 10.29,5L8.5,9.5C7.12,10.5 6.25,12.18 6.25,14.06C6.25,14.66 6.35,15.23 6.53,15.78L4.26,8.09M19.74,8.09L17.47,15.78C18.5,14.16 19.13,12.19 19.13,10.06C19.13,9.38 19.04,8.72 18.88,8.09H19.74M6.06,17C4.5,15.5 3.5,13.38 3.5,11C3.5,10.66 3.53,10.33 3.57,10H7.03C7,10.33 7,10.66 7,11C7,12.96 7.81,14.73 9.11,16L6.06,17M12,20C9.4,20 7.06,18.73 5.65,16.75L8.5,12C8.71,12.59 9,13.13 9.38,13.59C10.31,14.69 11.64,15.37 13.12,15.37C13.25,15.37 13.38,15.36 13.5,15.35L12,19.97C12,19.97 12,20 12,20M17.94,17L15.96,11C17.21,9.89 18,8.21 18,6.31C18,5.71 17.9,5.14 17.72,4.59L19.74,8.09C20.26,9.25 20.55,10.56 20.55,11.94C20.55,14.27 19.64,16.38 18.18,17.91L17.94,17Z'\n }\n\n if (browser.includes('firefox') || browser.includes('mozilla')) {\n return 'M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M15.84,15.5C15.57,16.17 15.16,16.75 14.63,17.23C13.96,17.82 13.17,18.21 12.29,18.42C11.38,18.63 10.47,18.63 9.56,18.42C9,18.29 8.5,18.06 8.04,17.75C7.27,17.23 6.69,16.5 6.32,15.63C5.95,14.76 5.79,13.81 5.86,12.86C5.93,11.91 6.24,11.03 6.77,10.24C7.3,9.45 8,8.84 8.84,8.45C9.68,8.06 10.58,7.93 11.5,8.07C12.41,8.21 13.24,8.59 13.94,9.18C14.64,9.77 15.16,10.53 15.45,11.38C15.74,12.23 15.79,13.13 15.59,14C15.39,14.87 14.96,15.67 14.34,16.32L15.84,15.5Z'\n }\n\n if (browser.includes('safari')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M9.5,9.5L14,12L12,14L10.5,14.5L9.5,9.5M12,11A1,1 0 0,1 13,12A1,1 0 0,1 12,13A1,1 0 0,1 11,12A1,1 0 0,1 12,11Z'\n }\n\n if (browser.includes('edge') || browser.includes('edg')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12C4,14.5 5.2,16.7 7.1,18C8,17 9.3,16.5 10.7,16.5C12.1,16.5 13.4,17 14.3,18C16.2,16.7 17.4,14.5 17.4,12C17.4,9.5 16.2,7.3 14.3,6C13.4,7 12.1,7.5 10.7,7.5C9.3,7.5 8,7 7.1,6C5.2,7.3 4,9.5 4,12M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10Z'\n }\n\n if (browser.includes('opera')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4C7.92,4 4.55,7.05 4.07,11H8.92C9.45,8.7 10.6,7 12,7C13.4,7 14.55,8.7 15.08,11H19.93C19.45,7.05 16.08,4 12,4M4.07,13C4.55,16.95 7.92,20 12,20C16.08,20 19.45,16.95 19.93,13H15.08C14.55,15.3 13.4,17 12,17C10.6,17 9.45,15.3 8.92,13H4.07Z'\n }\n\n if (platform.includes('tablet') || platform.includes('ipad')) {\n return 'M19,18H5V6H19M21,4H3C1.89,4 1,4.89 1,6V18A2,2 0 0,0 3,20H21A2,2 0 0,0 23,18V6C23,4.89 22.1,4 21,4Z'\n }\n\n return 'M17,19H7V5H17M17,1H7C5.89,1 5,1.89 5,3V21A2,2 0 0,0 7,23H17A2,2 0 0,0 19,21V3C19,1.89 18.1,1 17,1Z'\n}\n\nconst hasFullName = computed(() => {\n return !!(user.value?.firstName && user.value?.lastName);\n});\n\nonMounted(() => document.addEventListener('click', closeMenu))\nonUnmounted(() => document.removeEventListener('click', closeMenu))\n</script>\n\n<template>\n <Notification :show=\"notification.show\" :message=\"notification.message\" :type=\"notification.type\" />\n\n <div v-if=\"user\" class=\"atm-profile-container\">\n <button class=\"atm-profile-button\" @click=\"toggleMenu\" ref=\"buttonRef\">\n <div class=\"atm-profile-avatar\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\" style=\"width: 20px; height: 20px; color: white;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n <span class=\"atm-profile-name\" v-if=\"hasFullName\">{{ user.firstName }}</span>\n <svg class=\"atm-profile-arrow\" :class=\"{ 'atm-rotate': isDropdownOpen }\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n </button>\n\n <transition name=\"atm-fade\">\n <div v-if=\"isDropdownOpen\" class=\"atm-profile-menu\">\n <div class=\"atm-profile-info\">\n <div class=\"atm-profile-avatar large\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\"\n style=\"width: 40px; height: 40px; color: white;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n <div class=\"atm-profile-details\">\n <p class=\"atm-profile-fullname\" v-if=\"hasFullName\">{{ user.firstName }} {{ user.lastName }}</p>\n <p class=\"atm-profile-fullname\" v-else>Usuário</p>\n <p class=\"atm-profile-email\">{{ user.primaryEmailAddress }}</p>\n </div>\n </div>\n\n <div class=\"atm-profile-options\">\n <button class=\"atm-profile-option\" @click=\"openProfileModal\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-profile-icon\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n Meu Perfil\n </button>\n <button class=\"atm-profile-option\" @click=\"logoutUser\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-profile-icon\">\n <path fill=\"currentColor\"\n d=\"M16,17V14H9V10H16V7L21,12L16,17M14,2A2,2 0 0,1 16,4V6H14V4H5V20H14V18H16V20A2,2 0 0,1 14,22H5A2,2 0 0,1 3,20V4A2,2 0 0,1 5,2H14Z\" />\n </svg>\n Sair\n </button>\n </div>\n </div>\n </transition>\n\n <div v-if=\"isProfileModalOpen\" class=\"atm-profile-modal\" role=\"dialog\" aria-modal=\"true\"\n aria-labelledby=\"profile-modal-title\">\n <div class=\"atm-profile-overlay\" @click=\"closeProfileModal\"></div>\n <div class=\"atm-profile-content\">\n <div class=\"atm-profile-header\">\n <button @click=\"closeProfileModal\" class=\"atm-profile-close\" aria-label=\"Fechar\">×</button>\n <h2 id=\"profile-modal-title\" class=\"atm-profile-title\">Meu Perfil</h2>\n </div>\n\n <div class=\"atm-profile-tabs\">\n <button @click=\"activeTab = 'geral'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'geral' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n Geral\n </button>\n <button @click=\"activeTab = 'emails'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'emails' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z\" />\n </svg>\n Emails\n </button>\n <button @click=\"activeTab = 'senha'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'senha' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z\" />\n </svg>\n Senha\n </button>\n <button @click=\"activeTab = 'sessoes'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'sessoes' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M4,6H20V16H4M20,18A2,2 0 0,0 22,16V6C22,4.89 21.1,4 20,4H4C2.89,4 2,4.89 2,6V16A2,2 0 0,0 4,18H0V20H24V18H20Z\" />\n </svg>\n Sessões\n </button>\n </div>\n\n <div v-if=\"activeTab === 'geral'\" class=\"atm-profile-body\">\n <div class=\"atm-profile-avatar-large\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\"\n style=\"width: 80px; height: 80px; color: white; margin: 0 auto;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n\n <div v-if=\"!isEditingProfile\" class=\"atm-profile-info-grid\">\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Nome</span>\n <span class=\"atm-profile-info-value\" v-if=\"hasFullName\">{{ profileForm.firstName }}</span>\n <span class=\"atm-profile-info-value\" v-else>Não informado</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Sobrenome</span>\n <span class=\"atm-profile-info-value\" v-if=\"hasFullName\">{{ profileForm.lastName }}</span>\n <span class=\"atm-profile-info-value\" v-else>Não informado</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Email Principal</span>\n <span class=\"atm-profile-info-value\">{{ profileForm.primaryEmailAddress }}</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <button class=\"atm-edit-profile-btn\" @click=\"startEditing\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z\" />\n </svg>\n Editar Perfil\n </button>\n </div>\n </div>\n\n <div v-else class=\"atm-profile-edit-form\">\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Nome</label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"profileForm.firstName\"\n placeholder=\"Digite seu nome\" />\n </div>\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Sobrenome</label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"profileForm.lastName\"\n placeholder=\"Digite seu sobrenome\" />\n </div>\n <div class=\"atm-form-actions\">\n <button class=\"atm-save-btn\" @click=\"updateProfile\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\" />\n </svg>\n Salvar\n </button>\n <button class=\"atm-cancel-btn\" @click=\"cancelEditing\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" />\n </svg>\n Cancelar\n </button>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'emails'\" class=\"atm-profile-body\">\n <div class=\"atm-email-add-section\">\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Adicionar novo email</label>\n <div class=\"atm-badge\">\n <input v-model=\"newEmail\" type=\"email\" class=\"atm-input-field\"\n placeholder=\"novo@email.com\" />\n <button @click=\"createEmailAddress\" class=\"atm-add-email-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\" d=\"M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"atm-email-list\">\n <div v-for=\"email in emailAddresses\" :key=\"email.id\" class=\"atm-email-item\">\n <div class=\"atm-email-info\">\n <div class=\"atm-email-address\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-email-icon\">\n <path fill=\"currentColor\"\n d=\"M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z\" />\n </svg>\n <span>{{ email.email_address }}</span>\n </div>\n <div class=\"atm-email-badges\">\n <span v-if=\"email.primary\" class=\"atm-badge atm-badge-primary\">Principal</span>\n <span v-if=\"email.verified\" class=\"atm-badge atm-badge-verified\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-badge-icon\">\n <path fill=\"currentColor\"\n d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\" />\n </svg>\n Verificado\n </span>\n <span v-else class=\"atm-badge atm-badge-unverified\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-badge-icon\">\n <path fill=\"currentColor\"\n d=\"M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\" />\n </svg>\n Não verificado\n </span>\n </div>\n </div>\n <div class=\"atm-email-actions\">\n <button v-if=\"!email.verified\" @click=\"requestEmailVerification(email.id)\"\n class=\"atm-verify-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M12,1L3,5V11C3,16.55 6.84,21.74 12,23C17.16,21.74 21,16.55 21,11V5L12,1M10,17L6,13L7.41,11.59L10,14.17L16.59,7.58L18,9L10,17Z\" />\n </svg>\n Verificar\n </button>\n <button v-if=\"!email.primary\" @click=\"deleteEmailAddress(email.id)\"\n class=\"atm-delete-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z\" />\n </svg>\n Remover\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'senha'\" class=\"atm-profile-body\">\n <div class=\"atm-password-section\">\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Redefinir Senha</span>\n <span class=\"atm-profile-info-value\">\n Enviaremos um link para redefinir sua senha no email principal\n </span>\n </div>\n <div class=\"atm-profile-info-row\">\n <button class=\"atm-reset-password-btn\" @click=\"sendResetPasswordLink\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z\" />\n </svg>\n Resetar Senha\n </button>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'sessoes'\" class=\"atm-profile-body\">\n <div class=\"atm-sessions-section\">\n <div class=\"atm-sessions-info\">\n <p class=\"atm-sessions-description\">\n Gerencie os dispositivos conectados à sua conta. Você pode encerrar sessões em dispositivos que não reconhece.\n </p>\n </div>\n\n <div class=\"atm-sessions-list\">\n <div v-for=\"session in sessions\" :key=\"session.id\" class=\"atm-session-item\">\n <div class=\"atm-session-info\">\n <div class=\"atm-session-header\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-session-icon\">\n <path fill=\"currentColor\" :d=\"getDeviceIcon(session.device)\" />\n </svg>\n <div class=\"atm-session-details\">\n <div class=\"atm-session-title\">\n <span>{{ session.ip_address }}</span>\n <span v-if=\"session.current === 1\" class=\"atm-badge atm-badge-current\">Atual</span>\n </div>\n <div class=\"atm-session-device-info\" v-if=\"session.device.browser || session.device.platform\">\n <span v-if=\"session.device.browser\">\n {{ session.device.browser }}{{ session.device.browser_version ? ` ${session.device.browser_version}` : '' }}\n </span>\n <span v-if=\"session.device.browser && session.device.platform\"> • </span>\n <span v-if=\"session.device.platform\">{{ session.device.platform }}</span>\n </div>\n <div class=\"atm-session-timestamps\">\n <div class=\"atm-session-timestamp\">\n <span class=\"atm-timestamp-label\">Iniciada:</span>\n <span>{{ formatDate(session.started_at) }}</span>\n </div>\n <div class=\"atm-session-timestamp\">\n <span class=\"atm-timestamp-label\">Última atividade:</span>\n <span>{{ formatDate(session.last_activity_at) }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"atm-session-actions\">\n <button v-if=\"session.current !== 1\" @click=\"closeSessionById(session.id)\"\n class=\"atm-close-session-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" />\n </svg>\n Encerrar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n.atm-profile-container {\n position: relative;\n display: inline-block;\n font-family: 'Segoe UI', system-ui, sans-serif;\n}\n\n.atm-profile-button {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background 0.2s;\n}\n\n.atm-profile-button:hover {\n background: #f0f0f0;\n}\n\n.atm-profile-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: v-bind('atmPrimaryColor');\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 500;\n}\n\n.atm-profile-avatar.large {\n width: 48px;\n height: 48px;\n font-size: 16px;\n}\n\n.atm-profile-avatar-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.atm-profile-name {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n}\n\n.atm-profile-arrow {\n width: 16px;\n height: 16px;\n transition: transform 0.2s;\n}\n\n.atm-rotate {\n transform: rotate(180deg);\n}\n\n.atm-profile-menu {\n position: absolute;\n top: 100%;\n left: 0;\n width: 280px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n overflow: hidden;\n margin-top: 4px;\n}\n\n.atm-profile-info {\n display: flex;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.atm-profile-details {\n flex: 1;\n min-width: 0;\n}\n\n.atm-profile-fullname {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.atm-profile-email {\n margin: 4px 0 0;\n font-size: 13px;\n color: #666;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.atm-profile-options {\n padding: 8px 0;\n}\n\n.atm-profile-option {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #333;\n gap: 10px;\n transition: background 0.2s;\n}\n\n.atm-profile-option:hover {\n background: #f5f5f5;\n}\n\n.atm-profile-icon {\n width: 18px;\n height: 18px;\n color: #666;\n}\n\n.atm-fade-enter-active,\n.atm-fade-leave-active {\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.atm-fade-enter-from,\n.atm-fade-leave-to {\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.atm-profile-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.atm-profile-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n pointer-events: none;\n}\n\n.atm-profile-content {\n position: relative;\n width: 100%;\n max-width: 450px;\n background: white;\n border-radius: 12px;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);\n z-index: 1;\n max-height: calc(100vh - 3rem);\n display: flex;\n flex-direction: column;\n margin: auto;\n}\n\n.atm-profile-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n}\n\n.atm-profile-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 8px;\n margin-right: 12px;\n color: #666;\n}\n\n.atm-profile-title {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n}\n\n.atm-profile-tabs {\n display: flex;\n border-bottom: 1px solid #f0f0f0;\n background: #f8f9fa;\n}\n\n.atm-tab {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #666;\n transition: all 0.2s;\n}\n\n.atm-tab:hover {\n background: #e9ecef;\n}\n\n.atm-tab-active {\n color: v-bind('atmPrimaryColor') !important;\n background: white;\n border-bottom: 2px solid v-bind('atmPrimaryColor');\n}\n\n.atm-tab-icon {\n width: 16px;\n height: 16px;\n}\n\n.atm-profile-body {\n padding: 24px;\n text-align: center;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.atm-profile-avatar-large {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background-color: v-bind('atmPrimaryColor');\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 600;\n margin: 0 auto 20px;\n}\n\n.atm-profile-info-grid {\n width: 100%;\n text-align: left;\n margin-top: 20px;\n}\n\n.atm-profile-info-row {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n}\n\n.atm-profile-info-label {\n font-size: 13px;\n color: #666;\n margin-bottom: 4px;\n}\n\n.atm-profile-info-value {\n font-size: 16px;\n color: #333;\n font-weight: 500;\n}\n\n.atm-profile-edit-form {\n width: 100%;\n text-align: left;\n margin-top: 20px;\n}\n\n.atm-form-group {\n margin-bottom: 16px;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-form-actions {\n display: flex;\n gap: 12px;\n margin-top: 24px;\n}\n\n.atm-save-btn,\n.atm-edit-profile-btn,\n.atm-reset-password-btn,\n.atm-add-email-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n justify-content: center;\n}\n\n.atm-save-btn:hover,\n.atm-edit-profile-btn:hover,\n.atm-reset-password-btn:hover,\n.atm-add-email-btn:hover {\n opacity: 0.9;\n}\n\n.atm-cancel-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n padding: 12px;\n background: #f8f9fa;\n color: #666;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n justify-content: center;\n}\n\n.atm-cancel-btn:hover {\n background: #e9ecef;\n}\n\n.atm-btn-icon {\n width: 16px;\n height: 16px;\n}\n\n.atm-email-add-section {\n margin-bottom: 24px;\n text-align: left;\n}\n\n.atm-email-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n text-align: left;\n}\n\n.atm-email-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.atm-email-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.atm-email-address {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.atm-email-icon {\n width: 16px;\n height: 16px;\n color: v-bind('atmSecondaryColor');\n}\n\n.atm-email-badges {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.atm-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n font-size: 11px;\n font-weight: 500;\n border-radius: 12px;\n text-transform: uppercase;\n}\n\n.atm-badge-icon {\n width: 12px;\n height: 12px;\n}\n\n.atm-badge-primary {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.atm-badge-verified {\n background: #e8f5e8;\n color: #2e7d32;\n}\n\n.atm-badge-unverified {\n background: #fff3e0;\n color: #f57c00;\n}\n\n.atm-email-actions {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.atm-verify-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n background: v-bind('atmPrimaryColor');\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-verify-btn:hover {\n opacity: 0.9;\n}\n\n.atm-delete-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-delete-btn:hover {\n opacity: 0.9;\n}\n\n.atm-password-section {\n text-align: left;\n}\n\n.atm-sessions-section {\n text-align: left;\n}\n\n.atm-sessions-info {\n margin-bottom: 20px;\n}\n\n.atm-sessions-description {\n margin: 0;\n font-size: 14px;\n color: #666;\n line-height: 1.5;\n}\n\n.atm-sessions-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.atm-session-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n gap: 16px;\n}\n\n.atm-session-header {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.atm-session-icon {\n width: 24px;\n height: 24px;\n color: v-bind('atmSecondaryColor');\n flex-shrink: 0;\n}\n\n.atm-session-details {\n flex: 1;\n min-width: 0;\n}\n\n.atm-session-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 15px;\n font-weight: 600;\n color: #333;\n}\n\n.atm-session-device-info {\n font-size: 13px;\n color: #666;\n margin-bottom: 8px;\n}\n\n.atm-badge-current {\n background: #d1f4e0;\n color: #0f9d58;\n}\n\n.atm-session-timestamps {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.atm-session-timestamp {\n display: flex;\n gap: 6px;\n font-size: 13px;\n color: #666;\n}\n\n.atm-timestamp-label {\n font-weight: 500;\n color: #555;\n}\n\n.atm-session-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.atm-close-session-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n white-space: nowrap;\n}\n\n.atm-close-session-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-profile-button {\n padding: 6px 10px;\n gap: 6px;\n }\n\n .atm-profile-name {\n font-size: 13px;\n }\n\n .atm-profile-menu {\n width: 260px;\n }\n\n .atm-profile-modal {\n padding: 1rem;\n }\n\n .atm-profile-content {\n max-width: 90%;\n max-height: calc(100vh - 2rem);\n }\n\n .atm-profile-header {\n padding: 14px;\n }\n\n .atm-profile-title {\n font-size: 16px;\n }\n\n .atm-profile-body {\n padding: 20px;\n }\n\n .atm-tab {\n padding: 10px 12px;\n font-size: 13px;\n gap: 4px;\n }\n\n .atm-tab-icon {\n width: 14px;\n height: 14px;\n }\n\n .atm-profile-avatar-large {\n width: 70px;\n height: 70px;\n font-size: 22px;\n }\n\n .atm-email-item {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .atm-email-actions {\n flex-direction: row;\n width: 100%;\n }\n\n .atm-verify-btn,\n .atm-delete-btn {\n flex: 1;\n justify-content: center;\n }\n\n .atm-session-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .atm-session-actions {\n width: 100%;\n }\n\n .atm-close-session-btn {\n width: 100%;\n justify-content: center;\n }\n}\n\n@media (max-width: 480px) {\n .atm-profile-button {\n padding: 4px 8px;\n gap: 4px;\n }\n\n .atm-profile-avatar {\n width: 28px;\n height: 28px;\n font-size: 11px;\n }\n\n .atm-profile-avatar.large {\n width: 40px;\n height: 40px;\n font-size: 14px;\n }\n\n .atm-profile-name {\n font-size: 12px;\n }\n\n .atm-profile-arrow {\n width: 14px;\n height: 14px;\n }\n\n .atm-profile-menu {\n width: calc(100vw - 20px);\n max-width: 240px;\n }\n\n .atm-profile-info {\n padding: 12px;\n gap: 10px;\n }\n\n .atm-profile-fullname {\n font-size: 13px;\n }\n\n .atm-profile-email {\n font-size: 12px;\n }\n\n .atm-profile-option {\n padding: 8px 12px;\n font-size: 13px;\n gap: 8px;\n }\n\n .atm-profile-icon {\n width: 16px;\n height: 16px;\n }\n\n .atm-profile-modal {\n padding: 0.5rem;\n }\n\n .atm-profile-content {\n max-width: 95%;\n max-height: calc(100vh - 1rem);\n }\n\n .atm-profile-header {\n padding: 12px;\n }\n\n .atm-profile-close {\n font-size: 20px;\n padding: 4px;\n margin-right: 8px;\n }\n\n .atm-profile-title {\n font-size: 15px;\n }\n\n .atm-profile-body {\n padding: 16px;\n }\n\n .atm-tab {\n padding: 8px 8px;\n font-size: 12px;\n gap: 3px;\n }\n\n .atm-tab-icon {\n width: 13px;\n height: 13px;\n }\n\n .atm-profile-avatar-large {\n width: 60px;\n height: 60px;\n font-size: 20px;\n margin-bottom: 16px;\n }\n\n .atm-profile-info-label {\n font-size: 12px;\n }\n\n .atm-profile-info-value {\n font-size: 14px;\n }\n\n .atm-input-label {\n font-size: 12px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-form-actions {\n flex-direction: column;\n gap: 8px;\n }\n\n .atm-save-btn,\n .atm-cancel-btn,\n .atm-edit-profile-btn,\n .atm-reset-password-btn {\n width: 100%;\n padding: 10px;\n font-size: 13px;\n }\n\n .atm-email-item {\n padding: 10px;\n }\n\n .atm-email-address {\n font-size: 13px;\n }\n\n .atm-badge {\n font-size: 10px;\n padding: 2px 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-profile-button {\n padding: 4px 6px;\n }\n\n .atm-profile-avatar {\n width: 26px;\n height: 26px;\n font-size: 10px;\n }\n\n .atm-profile-name {\n display: none;\n }\n\n .atm-profile-menu {\n width: calc(100vw - 16px);\n max-width: 220px;\n }\n\n .atm-profile-modal {\n padding: 0.25rem;\n }\n\n .atm-profile-content {\n max-width: 98%;\n max-height: calc(100vh - 0.5rem);\n }\n\n .atm-profile-body {\n padding: 12px;\n }\n\n .atm-tab {\n padding: 8px 6px;\n font-size: 11px;\n flex-direction: column;\n gap: 2px;\n }\n\n .atm-profile-avatar-large {\n width: 50px;\n height: 50px;\n font-size: 18px;\n }\n\n .atm-email-item {\n padding: 8px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAuth } from '../composables/useAuth'\nimport SignInButton from './Buttons/SignInButton.vue'\nimport SignUpButton from './Buttons/SignUpButton.vue'\nimport UserProfile from './UserProfile.vue'\n\nconst { user } = useAuth()\n</script>\n\n<template>\n <div>\n <UserProfile v-if=\"user?.id\" />\n\n <template v-else>\n <div class=\"atm-auth-buttons\">\n <SignInButton />\n <SignUpButton />\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n.atm-auth-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n}\n\n@media (max-width: 768px) {\n .atm-auth-buttons {\n gap: 14px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-auth-buttons {\n gap: 12px;\n flex-direction: column;\n }\n}\n\n@media (max-width: 360px) {\n .atm-auth-buttons {\n gap: 10px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAuth } from '../../composables/useAuth'\nimport { useAtm } from '../../composables/useAtm'\nimport { computed } from 'vue'\n\nconst { logout, user } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\n</script>\n\n<template>\n <button v-if=\"user\" @click=\"logout()\" class=\"atm-logout-btn\">\n Sair\n </button>\n</template>\n\n<style scoped>\n.atm-logout-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n min-height: 44px;\n}\n\n.atm-logout-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-logout-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logout-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logout-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>","<script lang=\"ts\" setup>\nimport { useAtm } from '../../composables/useAtm'\n\nconst { isSignedIn } = useAtm()\n</script>\n\n<template>\n <div v-if=\"isSignedIn\">\n <slot/>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useAtm } from '../../composables/useAtm'\n\nconst { isLoaded, isSignedIn } = useAtm()\n</script>\n\n<template>\n <div v-if=\"isLoaded && ! isSignedIn\">\n <slot/>\n </div>\n</template>\n","import type { Ref } from 'vue'\nimport type { AtmClient } from '@autenticar-me/client-js'\n\nexport const fetchConfigurations = async (client: Ref<AtmClient>, configurations: Ref): Promise<void> => {\n const response = await client.value.project().configurations() as any\n\n configurations.value = {\n project: {\n name: response.project.name,\n domain: response.project.domain,\n },\n design: {\n primaryColor: response.design.primary_color,\n secondaryColor: response.design.secondary_color,\n },\n username: {\n enable: response.username.enable,\n length: {\n min: response.username.length.min,\n max: response.username.length.max,\n },\n },\n password: {\n enable: response.password.enable,\n },\n firstName: {\n required: response.first_name.required,\n },\n lastName: {\n required: response.last_name.required,\n },\n register: {\n enable: response.register.enable,\n },\n }\n}\n","import { computed, ref, type Plugin } from 'vue';\nimport type { User } from './types/user.type';\nimport { AtmClient } from '@autenticar-me/client-js';\nimport { fetchUser } from './utils/fetch-user';\nimport type { Configurations } from './types/configurations.type';\nimport { fetchConfigurations } from './utils/fetch-configurations';\n\nexport type PluginOptions = {\n domain: string;\n publicKey: string;\n}\n\nexport const atmPlugin: Plugin<[PluginOptions]> = {\n install(app, pluginOptions) {\n const atmClient = new AtmClient({\n domain: pluginOptions.domain,\n publicKey: pluginOptions.publicKey,\n ssl: false,\n })\n\n const client = ref<AtmClient>(atmClient)\n\n const user = ref<undefined | null | User>(null)\n\n const configurations = ref<undefined | null | Configurations>(null)\n\n const isSignedIn = computed(() => user.value !== undefined && user.value !== null)\n const isLoaded = ref(false)\n\n Promise.all([\n fetchUser(client as any, user),\n fetchConfigurations(client as any, configurations)\n ])\n .then(() => isLoaded.value = true)\n\n app.provide('atm', {\n client,\n user,\n configurations,\n isSignedIn,\n isLoaded,\n })\n }\n}\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_renderSlot","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_vModelText","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_Fragment","_renderList","_hoisted_20","_hoisted_21","_hoisted_24","_hoisted_27","_hoisted_28","_createBlock","_Teleport","_createVNode","_Transition","_normalizeClass","_hoisted_9","_hoisted_19","_hoisted_22","_hoisted_25","_hoisted_26","SignInModal","SignUpModal","_normalizeStyle","UserProfile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/tokens.ts","../src/utils/fetch-user.ts","../src/composables/useAtm.ts","../src/composables/useAuth.ts","../src/components/Modals/Modal.vue","../src/composables/useAtmClient.ts","../src/utils/device.ts","../src/components/SignIn.vue","../src/components/Notification.vue","../src/components/SignUp.vue","../src/components/Modals/SignInModal.vue","../src/components/Buttons/SignInButton.vue","../src/components/Modals/SignUpModal.vue","../src/components/Buttons/SignUpButton.vue","../src/components/UserProfile.vue","../src/components/AuthSwitcher.vue","../src/components/Buttons/SignOutButton.vue","../src/components/Layout/SignedIn.vue","../src/components/Layout/SignedOut.vue","../src/utils/fetch-configurations.ts","../src/plugin.ts"],"sourcesContent":["import UniversalCookie from 'universal-cookie'\n\nexport const writeAccessTokenInCookie = (accessToken: string | null): void => {\n const cookies = new UniversalCookie()\n\n if (accessToken === null) {\n cookies.remove('atm_access_token')\n } else {\n cookies.set('atm_access_token', accessToken)\n }\n}\n\nexport const getAccessToken = async (): Promise<string | null> => {\n const cookies = new UniversalCookie()\n return cookies.get('atm_access_token')\n}\n\nexport const writeRefreshTokenInCookie = (refreshToken: string | null): void => {\n const cookies = new UniversalCookie()\n\n if (refreshToken === null) {\n cookies.remove('atm_refresh_token')\n } else {\n cookies.set('atm_refresh_token', refreshToken)\n }\n}\n\nexport const getRefreshToken = async (): Promise<string | null> => {\n const cookies = new UniversalCookie()\n return cookies.get('atm_refresh_token')\n}\n","import type { Ref } from 'vue'\nimport type { AtmClient } from '@autenticar-me/client-js'\nimport { getAccessToken } from './tokens'\n\nexport const fetchUser = async (client: Ref<AtmClient>, user: Ref): Promise<void> => {\n let accessToken = await getAccessToken()\n\n if (accessToken == null) {\n user.value = null\n return\n }\n\n const response: any = await client.value.account(accessToken).getProfile()\n\n user.value = {\n id: response.id,\n username: response.username,\n firstName: response.first_name,\n lastName: response.last_name,\n primaryEmailAddress: response.primary_email_address,\n primaryEmailAddressId: response.primary_email_address_id,\n profileImage: response.profile_image,\n attributes: response.attributes.map((atribute: any) => ({\n key: atribute.key,\n mode: atribute.mode,\n value: atribute.value,\n })),\n }\n}\n","import { inject, type ComputedRef, type Ref } from 'vue';\nimport type { User } from '../types/user.type';\nimport type { AtmClient } from '@autenticar-me/client-js';\nimport type { Configurations } from '../types/configurations.type';\n\nexport function useAtm(): Atm {\n const ctx = inject<Atm>('atm');\n\n if (!ctx) {\n throw new Error('[Autenticar.me] É necessário configurar o plugin no main.ts');\n }\n\n return ctx;\n}\n\nexport type Atm = {\n client: Ref<AtmClient>;\n user: Ref<undefined | null | User>;\n configurations: Ref<undefined | null | Configurations>;\n isSignedIn: ComputedRef<boolean>;\n isLoaded: Ref<boolean>;\n}\n","import { fetchUser } from '../utils/fetch-user'\nimport { getAccessToken, writeAccessTokenInCookie } from '../utils/tokens'\nimport { useAtm } from './useAtm'\n\nexport function useAuth() {\n const { client, user } = useAtm()\n\n const signInByAccessToken = async (accessToken: string): Promise<void> => {\n writeAccessTokenInCookie(accessToken)\n await fetchUser(client, user)\n }\n\n const logout = async (): Promise<void> => {\n const accessToken = await getAccessToken()\n\n if (accessToken == null) {\n return\n }\n\n await client.value.account(accessToken).logout()\n\n user.value = null\n\n writeAccessTokenInCookie(null)\n }\n\n return {\n user,\n signInByAccessToken,\n getAccessToken,\n fetchUser,\n logout,\n };\n}\n","<script lang=\"ts\" setup>\nconst { title, maxWidth } = defineProps({\n title: {\n type: String,\n required: false,\n default: null,\n },\n maxWidth: {\n type: Number,\n required: false,\n default: 672,\n },\n})\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n</script>\n\n<template>\n <div class=\"atm-overlay\">\n <div class=\"atm-container\" :style=\"{maxWidth: `${maxWidth}px`}\">\n <div class=\"atm-fade-layer\">\n <div class=\"atm-fade-bg\"></div>\n </div>\n\n <div class=\"atm-modal\">\n <button class=\"atm-close-button\" @click=\"close()\">\n <svg class=\"atm-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"></path>\n </svg>\n </button>\n\n <div class=\"atm-modal-content\">\n <h3 class=\"atm-modal-title\" v-if=\"title\">{{ title }}</h3>\n\n <div>\n <slot/>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style scoped>\n.atm-overlay {\n position: fixed;\n inset: 0;\n z-index: 99999;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n overflow-y: auto;\n padding: 1.5rem 0;\n}\n\n.atm-container {\n padding: 0 1.5rem;\n width: 100%;\n margin: auto;\n}\n\n.atm-fade-layer {\n position: fixed;\n inset: 0;\n transition: opacity 0.2s ease;\n pointer-events: none;\n}\n\n.atm-fade-bg {\n position: absolute;\n inset: 0;\n opacity: 0.75;\n}\n\n.atm-modal {\n position: relative;\n display: inline-block;\n vertical-align: bottom;\n background-color: #ffffff;\n border-radius: 0.5rem;\n text-align: left;\n box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -2px rgba(0,0,0,0.05);\n transform: translate(0);\n transition: all 0.2s ease-in-out;\n max-width: 32rem;\n width: 100%;\n max-height: calc(100vh - 3rem);\n display: flex;\n flex-direction: column;\n}\n\n.atm-close-button {\n position: absolute;\n top: 1rem;\n right: 1rem;\n color: #9ca3af;\n background: transparent;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n}\n\n.atm-close-button:hover {\n color: #4b5563;\n}\n\n.atm-icon {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.atm-modal-content {\n padding: 1.25rem;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.atm-modal-title {\n font-size: 1.125rem;\n font-weight: 500;\n color: #111827;\n margin: 0;\n margin-bottom: 0.75rem;\n}\n\n@media (max-width: 768px) {\n .atm-overlay {\n padding: 1rem 0;\n }\n\n .atm-container {\n padding: 0 1rem;\n }\n\n .atm-modal {\n border-radius: 0.375rem;\n max-height: calc(100vh - 2rem);\n }\n\n .atm-modal-content {\n padding: 1rem;\n }\n\n .atm-modal-title {\n font-size: 1rem;\n margin-bottom: 0.75rem;\n }\n\n .atm-close-button {\n top: 0.75rem;\n right: 0.75rem;\n }\n\n .atm-icon {\n width: 1.25rem;\n height: 1.25rem;\n }\n}\n\n@media (max-width: 480px) {\n .atm-overlay {\n padding: 0.5rem 0;\n }\n\n .atm-container {\n padding: 0 0.5rem;\n }\n\n .atm-modal {\n border-radius: 0.25rem;\n max-width: 100%;\n max-height: calc(100vh - 1rem);\n }\n\n .atm-modal-content {\n padding: 0.875rem;\n }\n\n .atm-modal-title {\n font-size: 0.9375rem;\n margin-bottom: 0.625rem;\n }\n\n .atm-close-button {\n top: 0.5rem;\n right: 0.5rem;\n }\n}\n\n@media (max-width: 360px) {\n .atm-overlay {\n padding: 0.25rem 0;\n }\n\n .atm-container {\n padding: 0 0.25rem;\n }\n\n .atm-modal {\n max-height: calc(100vh - 0.5rem);\n }\n\n .atm-modal-content {\n padding: 0.75rem;\n }\n\n .atm-modal-title {\n font-size: 0.875rem;\n margin-bottom: 0.5rem;\n }\n}\n</style>","import { useAtm } from './useAtm'\n\nexport function useAtmClient() {\n const { client } = useAtm()\n return client.value\n}\n","import type { AtmClient } from '@autenticar-me/client-js'\n\nconst DEVICE_TOKEN_KEY = 'atm_device_token'\n\nexport const getDeviceToken = async (client: AtmClient): Promise<string> => {\n try {\n const storedToken = localStorage.getItem(DEVICE_TOKEN_KEY)\n\n if (storedToken) {\n return storedToken\n }\n\n const response = await fetch(`${client.getProjectUrl()}/api/v1/devices`, {\n method: 'POST',\n headers: {\n 'accept': 'application/json',\n 'x-public-key': client.getPublicKey(),\n },\n })\n\n if (!response.ok) {\n const errorBody = await response.json()\n throw new Error(errorBody.message || 'Falha ao criar o token do dispositivo.')\n }\n\n const data = await response.json()\n\n if (!data.token) {\n throw new Error('O token do dispositivo não foi retornado pelo servidor.')\n }\n\n localStorage.setItem(DEVICE_TOKEN_KEY, data.token)\n return data.token\n } catch (error) {\n throw error\n }\n}\n\nexport const clearDeviceToken = (): void => {\n localStorage.removeItem(DEVICE_TOKEN_KEY)\n}\n","<script lang=\"ts\" setup>\nimport { ref, computed, inject, onMounted, watch, nextTick, getCurrentInstance } from 'vue'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport { useAuth } from '../composables/useAuth'\nimport { useAtm } from '../composables/useAtm'\nimport { writeRefreshTokenInCookie } from '../utils/tokens'\nimport { getDeviceToken } from '../utils/device'\n\ninterface Form {\n emailAddress: string\n password: string\n}\n\ntype Step = 'email' | 'password' | 'email_link' | 'choose_strategy' | 'forgot_password_message'\n\ninterface Strategy {\n strategy: string\n email_address_id?: string\n}\n\ninterface Props {\n redirect?: string\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits([\n 'completed',\n 'sign-up',\n])\n\nconst showNotification = inject<(message: string, type?: 'error' | 'success' | 'warning') => void>('showNotification')\n\nconst form = ref<Form>({\n emailAddress: '',\n password: '',\n})\n\nconst currentStep = ref<Step>('email')\nconst signInStep = ref<any>(null)\nconst availableStrategies = ref<Strategy[]>([])\nconst selectedStrategy = ref<Strategy | null>(null)\nconst serverStep = ref<string | null>(null)\nconst isLoading = ref(false)\nconst emailInput = ref<HTMLInputElement | null>(null)\nconst passwordInput = ref<HTMLInputElement | null>(null)\n\nconst fieldErrors = ref<Record<string, string[]>>({\n emailAddress: [],\n password: [],\n})\n\nconst client = useAtmClient()\nconst { signInByAccessToken } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\nconst logoUrl = computed(() => configurations.value?.project?.logo || '')\n\nconst buttonText = computed(() => {\n if (currentStep.value === 'email') return 'Entrar'\n if (currentStep.value === 'choose_strategy') return ''\n if (currentStep.value === 'forgot_password_message') return ''\n return 'Finalizar'\n})\n\nconst showEmailField = computed(() => currentStep.value === 'email' || currentStep.value === 'forgot_password_message')\nconst showPasswordField = computed(() => currentStep.value === 'password')\nconst showStrategyChoice = computed(() => currentStep.value === 'choose_strategy')\n\nconst labelText = computed(() => {\n if (configurations.value?.username?.enable === false) {\n return 'Email'\n }\n return 'Email ou Nome de usuário'\n})\n\nconst inputPlaceholder = computed(() => {\n if (configurations.value?.username?.enable === false) {\n return 'email@exemplo.com'\n }\n return \"email@exemplo.com ou seu username\"\n})\n\nconst processAvailableStrategies = (stepData: any) => {\n const strategies = stepData?.supported?.first_factors || []\n return {\n password: strategies.find((s: Strategy) => s.strategy === 'password'),\n emailLink: strategies.find((s: Strategy) => s.strategy === 'email_link')\n }\n}\n\nconst clearErrors = () => {\n fieldErrors.value = {\n emailAddress: [],\n password: [],\n }\n}\n\nconst handleEmailStep = async (): Promise<boolean> => {\n if (!form.value.emailAddress.trim()) {\n showNotification?.('Email ou nome de usuário é obrigatório')\n return false\n }\n\n try {\n const deviceToken = await getDeviceToken(client)\n const stepData = await client.auth().signInByEmailAddress(form.value.emailAddress, deviceToken)\n signInStep.value = stepData\n serverStep.value = stepData.step\n\n const strategies = processAvailableStrategies(stepData)\n\n if (strategies.password) {\n selectedStrategy.value = strategies.password\n currentStep.value = 'password'\n } else if (strategies.emailLink) {\n availableStrategies.value = [strategies.emailLink].filter(Boolean) as Strategy[]\n currentStep.value = 'choose_strategy'\n } else {\n showNotification?.('Nenhum método de autenticação disponível')\n return false\n }\n return true\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n if (error.errors.email_address) {\n fieldErrors.value.emailAddress = error.errors.email_address\n }\n } else {\n showNotification?.(error.message || 'Erro ao verificar email')\n }\n return false\n }\n}\n\nconst selectStrategy = (strategy: Strategy) => {\n selectedStrategy.value = strategy\n currentStep.value = strategy.strategy as Step\n if (strategy.strategy === 'email_link') {\n handleEmailLinkStep()\n }\n}\n\nconst handlePasswordStep = async (): Promise<boolean> => {\n if (!form.value.password.trim()) {\n showNotification?.('Senha é obrigatória')\n return false\n }\n\n try {\n if (!signInStep.value) {\n showNotification?.('Estado de autenticação inválido')\n return false\n }\n\n if (serverStep.value !== 'first_factor') {\n showNotification?.('Etapa inválida para autenticação com senha')\n return false\n }\n\n const attemptToken = (signInStep.value as any).sign_in_attempt_token\n if (!attemptToken) {\n showNotification?.('Token de tentativa não encontrado')\n return false\n }\n\n const response = await client.auth().authenticateWithPassword(signInStep.value.id, attemptToken, form.value.password)\n if (response?.step) {\n serverStep.value = response.step\n signInStep.value = { ...signInStep.value, ...response }\n }\n return true\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n if (error.errors.password) {\n fieldErrors.value.password = error.errors.password\n }\n } else {\n showNotification?.(error.message || 'Senha incorreta')\n }\n return false\n }\n}\n\nconst handleEmailLinkStep = async (): Promise<boolean> => {\n try {\n await (client.auth() as any).sendEmailLink(signInStep.value.id, selectedStrategy.value?.email_address_id!)\n showNotification?.('Link de verificação enviado para seu email', 'success')\n return true\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao enviar link de verificação')\n return false\n }\n}\n\nconst sendResetPasswordLink = async () => {\n if (!form.value.emailAddress.trim()) {\n showNotification?.('Informe o email para enviar o link de recuperação')\n return\n }\n try {\n await client.auth().resetPassword({ email_address: form.value.emailAddress })\n currentStep.value = 'forgot_password_message'\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao solicitar recuperação de senha')\n }\n}\n\nconst completeAuthentication = async () => {\n try {\n const attemptToken = (signInStep.value as any).sign_in_attempt_token\n if (!attemptToken) {\n showNotification?.('Token de tentativa não encontrado')\n isLoading.value = false\n return\n }\n\n const tokens = await client.auth().generateTokens(signInStep.value.id, attemptToken)\n\n signInByAccessToken(tokens.access_token)\n writeRefreshTokenInCookie(tokens.refresh_token)\n\n showNotification?.('Login realizado com sucesso!', 'success')\n setTimeout(() => {\n emit('completed')\n\n if (props.redirect) {\n const instance = getCurrentInstance()\n const router = instance?.appContext.config.globalProperties.$router\n\n if (router) {\n router.push(props.redirect)\n } else {\n window.location.href = props.redirect\n }\n }\n }, 1000)\n } catch (error: any) {\n showNotification?.(error.message || 'Erro ao finalizar autenticação')\n isLoading.value = false\n }\n}\n\nconst submit = async () => {\n if (isLoading.value) return\n clearErrors()\n\n try {\n isLoading.value = true\n let stepSuccess = false\n let shouldCompleteAuth = false\n\n if (currentStep.value === 'email') {\n stepSuccess = await handleEmailStep()\n if (stepSuccess) {\n isLoading.value = false\n }\n } else if (currentStep.value === 'password') {\n stepSuccess = await handlePasswordStep()\n if (stepSuccess) {\n shouldCompleteAuth = true\n }\n } else if (currentStep.value === 'choose_strategy') {\n return\n } else if (currentStep.value === 'email_link') {\n return\n } else if (currentStep.value === 'forgot_password_message') {\n return\n }\n\n if (shouldCompleteAuth) {\n await completeAuthentication()\n } else if (!stepSuccess) {\n isLoading.value = false\n }\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n const mappedErrors: Record<string, string[]> = {}\n if (error.errors.email_address) {\n mappedErrors.emailAddress = error.errors.email_address\n }\n if (error.errors.password) {\n mappedErrors.password = error.errors.password\n }\n fieldErrors.value = { ...fieldErrors.value, ...mappedErrors }\n } else {\n showNotification?.(error.message || 'Erro durante o processo de login')\n }\n isLoading.value = false\n }\n}\n\nconst signUp = () => emit('sign-up')\n\nonMounted(() => {\n nextTick(() => {\n if (emailInput.value) {\n emailInput.value.focus()\n }\n })\n})\n\nwatch(currentStep, (newStep) => {\n nextTick(() => {\n if (newStep === 'password' && passwordInput.value) {\n passwordInput.value.focus()\n }\n })\n})\n</script>\n\n<template>\n <form v-if=\"configurations\" @submit.prevent=\"submit()\">\n <div class=\"atm-login-container\">\n <div class=\"atm-logo-container\">\n <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\" class=\"atm-logo-image\" />\n <div v-else class=\"atm-logo-placeholder\">Logo</div>\n </div>\n\n <h2 class=\"atm-project-name\">{{ configurations.project.name }}</h2>\n <p class=\"atm-welcome-text\">Bem-vindo de volta! Faça login para continuar</p>\n\n <div v-if=\"currentStep !== 'forgot_password_message'\">\n <div class=\"atm-form-group\" v-if=\"showEmailField\">\n <label class=\"atm-input-label\">{{ labelText }}</label>\n <input ref=\"emailInput\" type=\"text\" class=\"atm-input-field\" :placeholder=\"inputPlaceholder\"\n v-model=\"form.emailAddress\" :disabled=\"currentStep !== 'email' || isLoading\" />\n <div v-if=\"fieldErrors.emailAddress.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.emailAddress[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"showPasswordField\">\n <label class=\"atm-input-label\">Senha</label>\n <input ref=\"passwordInput\" type=\"password\" class=\"atm-input-field\" placeholder=\"Digite sua senha\"\n v-model=\"form.password\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.password[0] }}\n </div>\n <div class=\"atm-alternative-options\" style=\"margin-top: 4px;\">\n <button type=\"button\" @click=\"sendResetPasswordLink()\" class=\"atm-forgot-password-link\"\n :disabled=\"isLoading\">\n Esqueci a minha senha\n </button>\n </div>\n </div>\n\n <div v-if=\"showStrategyChoice\" class=\"atm-strategy-choice\">\n <p class=\"atm-strategy-title\">Escolha como deseja fazer login:</p>\n <div class=\"atm-strategy-buttons\">\n <button v-for=\"strategy in availableStrategies\" :key=\"strategy.strategy\"\n @click=\"selectStrategy(strategy)\" type=\"button\" class=\"atm-strategy-button\"\n :disabled=\"isLoading\">\n <span v-if=\"strategy.strategy === 'email_link'\">Usar link por email</span>\n </button>\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"currentStep === 'email_link'\">\n <p class=\"atm-email-link-text\">\n Link de verificação enviado para seu email. Verifique sua caixa de entrada.\n </p>\n </div>\n </div>\n\n <div v-else class=\"atm-forgot-password-message\"\n style=\"text-align: center; color: #333; margin-bottom: 16px;\">\n <p>Foi enviado um link para resetar a senha para o email <strong>{{ form.emailAddress }}</strong>.\n Verifique sua caixa de entrada.</p>\n </div>\n\n <button v-if=\"buttonText\" type=\"submit\" class=\"atm-login-button\" :disabled=\"isLoading\">\n <span v-if=\"!isLoading\">{{ buttonText }}</span>\n <span v-else class=\"button-spinner\">\n <svg class=\"spinner-svg\" viewBox=\"0 0 50 50\">\n <circle class=\"spinner-circle\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"5\" />\n </svg>\n <span v-if=\"currentStep === 'email'\">Verificando...</span>\n <span v-else>Entrando...</span>\n </span>\n </button>\n\n <div class=\"atm-footer-links\">\n <p class=\"atm-signup-text\">\n Ainda não tem uma conta? <a @click=\"signUp()\" class=\"atm-signup-link\">Cadastre aqui</a>\n </p>\n\n <p class=\"atm-powered-by\">\n Secured by <strong>Autenticar.me</strong>\n </p>\n </div>\n </div>\n </form>\n</template>\n\n<style scoped>\n.atm-login-container {\n background: #ffffff;\n border-radius: 8px;\n font-family: 'Segoe UI', system-ui, sans-serif;\n text-align: center;\n}\n\n.atm-logo-container {\n margin-bottom: 12px;\n}\n\n.atm-logo-placeholder {\n width: 44px;\n height: 44px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n font-size: 11px;\n}\n\n.atm-logo-image {\n max-width: 44px;\n max-height: 44px;\n margin: 0 auto;\n display: block;\n border-radius: 4px;\n object-fit: contain;\n}\n\n.atm-project-name {\n margin: 0 0 4px 0;\n font-size: 18px;\n color: v-bind('atmPrimaryColor');\n font-weight: 600;\n}\n\n.atm-welcome-text {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n}\n\n.atm-form-group {\n margin-bottom: 12px;\n text-align: left;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-input-field:disabled {\n background-color: #f5f5f5;\n cursor: not-allowed;\n}\n\n.atm-field-error {\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n text-align: left;\n}\n\n.atm-alternative-options {\n margin-top: 8px;\n text-align: center;\n}\n\n.atm-forgot-password-link {\n font-size: 12px;\n background: none;\n border: none;\n color: v-bind('atmSecondaryColor');\n cursor: pointer;\n text-decoration: none;\n padding: 0;\n font-family: inherit;\n}\n\n.atm-forgot-password-link:hover:not(:disabled) {\n text-decoration: underline;\n}\n\n.atm-forgot-password-link:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.atm-strategy-choice {\n text-align: center;\n margin-bottom: 12px;\n}\n\n.atm-strategy-title {\n font-size: 14px;\n color: #666;\n margin-bottom: 12px;\n}\n\n.atm-strategy-buttons {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.atm-strategy-button {\n width: 100%;\n padding: 10px;\n background: #f8f9fa;\n color: #333;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.atm-strategy-button:hover:not(:disabled) {\n background: #e9ecef;\n border-color: v-bind('atmPrimaryColor');\n}\n\n.atm-strategy-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.atm-email-link-text {\n font-size: 14px;\n color: #666;\n margin: 0;\n text-align: center;\n}\n\n.atm-login-button {\n width: 100%;\n padding: 10px;\n margin-top: 4px;\n background: v-bind('atmPrimaryColor');\n color: #fff;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.atm-login-button:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n}\n\n.atm-login-button:disabled {\n opacity: 0.8;\n cursor: not-allowed;\n transform: none;\n}\n\n.button-spinner {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: #fff;\n font-weight: 500;\n}\n\n.spinner-svg {\n animation: spin 1s linear infinite;\n width: 18px;\n height: 18px;\n stroke: #fff;\n}\n\n.spinner-circle {\n stroke-dasharray: 90, 150;\n stroke-linecap: round;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.atm-footer-links {\n margin-top: 16px;\n font-size: 13px;\n}\n\n.atm-signup-text {\n color: #666;\n margin-bottom: 6px;\n}\n\n.atm-signup-link {\n color: v-bind('atmSecondaryColor');\n text-decoration: none;\n cursor: pointer;\n}\n\n.atm-signup-link:hover {\n text-decoration: underline;\n}\n\n.atm-powered-by {\n color: #999;\n font-size: 11px;\n margin: 0;\n}\n\n@media (max-width: 768px) {\n .atm-project-name {\n font-size: 17px;\n }\n\n .atm-welcome-text {\n font-size: 13px;\n margin-bottom: 14px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-login-button {\n font-size: 13px;\n padding: 9px;\n min-height: 40px;\n }\n\n .atm-strategy-button {\n padding: 9px;\n font-size: 13px;\n }\n\n .atm-footer-links {\n margin-top: 14px;\n font-size: 12px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logo-placeholder {\n width: 40px;\n height: 40px;\n font-size: 10px;\n }\n\n .atm-logo-image {\n max-width: 40px;\n max-height: 40px;\n }\n\n .atm-project-name {\n font-size: 16px;\n margin-bottom: 4px;\n }\n\n .atm-welcome-text {\n font-size: 12px;\n margin-bottom: 12px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 7px 9px;\n font-size: 13px;\n }\n\n .atm-login-button {\n font-size: 13px;\n padding: 9px;\n min-height: 38px;\n }\n\n .atm-forgot-password-link {\n font-size: 11px;\n }\n\n .atm-strategy-title {\n font-size: 13px;\n margin-bottom: 10px;\n }\n\n .atm-strategy-button {\n padding: 9px;\n font-size: 13px;\n }\n\n .atm-email-link-text {\n font-size: 13px;\n }\n\n .atm-footer-links {\n margin-top: 12px;\n font-size: 12px;\n }\n\n .atm-powered-by {\n font-size: 10px;\n }\n\n .spinner-svg {\n width: 16px;\n height: 16px;\n }\n\n .button-spinner {\n gap: 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logo-placeholder {\n width: 36px;\n height: 36px;\n font-size: 9px;\n }\n\n .atm-logo-image {\n max-width: 36px;\n max-height: 36px;\n }\n\n .atm-project-name {\n font-size: 15px;\n margin-bottom: 3px;\n }\n\n .atm-welcome-text {\n font-size: 11px;\n margin-bottom: 10px;\n }\n\n .atm-form-group {\n margin-bottom: 8px;\n }\n\n .atm-input-label {\n font-size: 11px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 6px 8px;\n font-size: 12px;\n }\n\n .atm-login-button {\n font-size: 12px;\n padding: 8px;\n min-height: 36px;\n }\n\n .atm-strategy-button {\n padding: 8px;\n font-size: 12px;\n }\n\n .atm-footer-links {\n margin-top: 10px;\n font-size: 11px;\n }\n\n .spinner-svg {\n width: 14px;\n height: 14px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\ninterface Props {\n show: boolean\n message: string\n type?: 'error' | 'success' | 'warning'\n}\n\nwithDefaults(defineProps<Props>(), {\n type: 'error'\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <Transition name=\"atm-notification\">\n <div v-if=\"show\" class=\"atm-notification-container\">\n <div class=\"atm-notification\" :class=\"`atm-notification--${type}`\">\n {{ message }}\n </div>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style scoped>\n.atm-notification-container {\n font-family: Arial, Helvetica, sans-serif;\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 99999;\n pointer-events: none;\n}\n\n.atm-notification {\n padding: 12px 16px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n min-width: 250px;\n max-width: 350px;\n pointer-events: auto;\n}\n\n.atm-notification--error {\n background: #ff3333;\n color: #FFF;\n}\n\n.atm-notification--success {\n background: #00a622;\n color: #FFF;\n}\n\n.atm-notification--warning {\n background: #ffa500;\n color: #FFF;\n}\n\n.atm-notification-enter-active {\n transition: all 0.3s ease-out;\n}\n\n.atm-notification-leave-active {\n transition: all 0.3s ease-in;\n}\n\n.atm-notification-enter-from {\n transform: translateX(100%);\n opacity: 0;\n}\n\n.atm-notification-leave-to {\n transform: translateX(100%);\n opacity: 0;\n}\n\n@media (max-width: 768px) {\n .atm-notification-container {\n top: 16px;\n right: 16px;\n left: 16px;\n }\n\n .atm-notification {\n min-width: auto;\n max-width: 100%;\n padding: 11px 14px;\n font-size: 13px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-notification-container {\n top: 12px;\n right: 12px;\n left: 12px;\n }\n\n .atm-notification {\n padding: 10px 12px;\n font-size: 12px;\n border-radius: 5px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-notification-container {\n top: 10px;\n right: 10px;\n left: 10px;\n }\n\n .atm-notification {\n padding: 9px 11px;\n font-size: 11px;\n border-radius: 4px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, nextTick, getCurrentInstance } from 'vue'\nimport { useAtm } from '../composables/useAtm'\nimport Notification from './Notification.vue'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport { useAuth } from '../composables/useAuth'\nimport { writeRefreshTokenInCookie } from '../utils/tokens'\nimport { getDeviceToken } from '../utils/device'\n\ntype NotificationType = 'error' | 'success' | 'warning'\n\ninterface FormData {\n first_name: string\n last_name: string\n email_address: string\n password: string\n confirm_password: string\n}\n\ninterface NotificationData {\n show: boolean\n message: string\n type: NotificationType\n}\n\ninterface Props {\n redirect?: string\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<{\n (e: 'completed'): void\n (e: 'sign-in'): void\n}>()\n\nconst { configurations } = useAtm()\n\nconst form = ref<FormData>({\n first_name: '',\n last_name: '',\n email_address: '',\n password: '',\n confirm_password: '',\n})\n\nconst notification = ref<NotificationData>({\n show: false,\n message: '',\n type: 'error',\n})\n\nconst isLoading = ref(false)\nconst firstNameInput = ref<HTMLInputElement | null>(null)\nconst emailInput = ref<HTMLInputElement | null>(null)\n\nconst fieldErrors = ref<Record<string, string[]>>({\n first_name: [],\n last_name: [],\n email_address: [],\n password: [],\n confirm_password: [],\n})\n\nconst showNotification = (message: string, type: NotificationType = 'error'): void => {\n notification.value = {\n show: true,\n message,\n type,\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nonMounted(() => {\n nextTick(() => {\n if (hasFirstName.value && firstNameInput.value) {\n firstNameInput.value.focus()\n } else if (emailInput.value) {\n emailInput.value.focus()\n }\n })\n})\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\nconst logoUrl = computed(() => configurations.value?.project?.logo || '')\n\nconst hasFirstName = computed(() => configurations.value?.firstName?.required === true)\nconst hasLastName = computed(() => configurations.value?.lastName?.required === true)\nconst hasPassword = computed(() => configurations.value?.password?.enable !== false)\nconst lengthConfig = computed(() => configurations.value?.password?.length)\n\nconst validatePassword = (): string | null => {\n const password = form.value.password\n const minLength = lengthConfig.value?.min ?? 8\n const maxLength = lengthConfig.value?.max ?? 64\n\n if (password.length < minLength) {\n return `Senha deve ter pelo menos ${minLength} caracteres`\n }\n\n if (password.length > maxLength) {\n return `Senha deve ter no máximo ${maxLength} caracteres`\n }\n\n if (configurations.value?.password?.uppercase && !/[A-Z]/.test(password)) {\n return 'Senha deve conter pelo menos uma letra maiúscula'\n }\n\n if (configurations.value?.password?.lowercase && !/[a-z]/.test(password)) {\n return 'Senha deve conter pelo menos uma letra minúscula'\n }\n\n if (configurations.value?.password?.numbers && !/\\d/.test(password)) {\n return 'Senha deve conter pelo menos um número'\n }\n\n if (configurations.value?.password?.symbols && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n return 'Senha deve conter pelo menos um símbolo especial'\n }\n\n return null\n}\n\nconst client = useAtmClient()\nconst { signInByAccessToken } = useAuth()\n\nconst clearErrors = () => {\n fieldErrors.value = {\n first_name: [],\n last_name: [],\n email_address: [],\n password: [],\n confirm_password: [],\n }\n}\n\nconst submit = async () => {\n if (isLoading.value) return\n clearErrors()\n\n if (hasFirstName.value && !form.value.first_name.trim()) {\n showNotification('Nome é obrigatório')\n return\n }\n\n if (hasLastName.value && !form.value.last_name.trim()) {\n showNotification('Sobrenome é obrigatório')\n return\n }\n\n if (!form.value.email_address.trim()) {\n showNotification('Email é obrigatório')\n return\n }\n\n if (hasPassword.value) {\n if (!form.value.password.trim()) {\n showNotification('Senha é obrigatória')\n return\n }\n\n const passwordError = validatePassword()\n if (passwordError) {\n showNotification(passwordError)\n return\n }\n\n if (!form.value.confirm_password.trim()) {\n showNotification('Confirmação de senha é obrigatória')\n return\n }\n\n if (form.value.password !== form.value.confirm_password) {\n showNotification('Senhas não coincidem')\n return\n }\n }\n\n try {\n isLoading.value = true\n\n await client.auth().register({\n first_name: form.value.first_name,\n last_name: form.value.last_name,\n email_address: form.value.email_address,\n password: form.value.password,\n })\n\n showNotification('Conta criada com sucesso!', 'success')\n\n const deviceToken = await getDeviceToken(client)\n const signInStep = await client.auth().signInByEmailAddress(form.value.email_address, deviceToken)\n\n const attemptToken = (signInStep as any).token\n if (!attemptToken) {\n throw new Error('Token de tentativa não encontrado')\n }\n\n await client.auth().authenticateWithPassword(signInStep.id, attemptToken, form.value.password)\n const tokens = await client.auth().generateTokens(signInStep.id, attemptToken)\n\n signInByAccessToken(tokens.access_token)\n writeRefreshTokenInCookie(tokens.refresh_token)\n\n showNotification('Login realizado com sucesso!', 'success')\n setTimeout(() => {\n emit('completed')\n\n if (props.redirect) {\n const instance = getCurrentInstance()\n const router = instance?.appContext.config.globalProperties.$router\n\n if (router) {\n router.push(props.redirect)\n } else {\n window.location.href = props.redirect\n }\n }\n }, 1000)\n } catch (error: any) {\n if (error.errors && typeof error.errors === 'object') {\n fieldErrors.value = { ...fieldErrors.value, ...error.errors }\n } else {\n showNotification(error.message || 'Erro ao registrar usuário', 'error')\n }\n isLoading.value = false\n }\n}\n\nconst signIn = (): void => emit('sign-in')\n</script>\n\n<template>\n <Notification :show=\"notification.show\" :message=\"notification.message\" :type=\"notification.type\" />\n\n <form v-if=\"configurations\" @submit.prevent=\"submit\">\n <div class=\"atm-signup-container\">\n <div class=\"atm-logo-container\">\n <img v-if=\"logoUrl\" :src=\"logoUrl\" alt=\"Logo\" class=\"atm-logo-image\" />\n <div v-else class=\"atm-logo-placeholder\">Logo</div>\n </div>\n\n <h2 class=\"atm-project-name\">{{ configurations.project.name }}</h2>\n <p class=\"atm-welcome-text\">Crie sua conta para começar</p>\n\n <div class=\"atm-form-group\" v-if=\"hasFirstName\">\n <label class=\"atm-input-label\">\n Primeiro Nome {{ configurations.firstName?.required ? '*' : '' }}\n </label>\n <input ref=\"firstNameInput\" type=\"text\" class=\"atm-input-field\" v-model=\"form.first_name\"\n placeholder=\"Digite seu primeiro nome\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.first_name.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.first_name[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasLastName\">\n <label class=\"atm-input-label\">\n Sobrenome {{ configurations.lastName?.required ? '*' : '' }}\n </label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"form.last_name\" placeholder=\"Digite seu sobrenome\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.last_name.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.last_name[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Email ou Nome de usuário *</label>\n <input ref=\"emailInput\" type=\"text\" class=\"atm-input-field\" v-model=\"form.email_address\"\n placeholder=\"email@exemplo.com ou seuusername\" :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.email_address.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.email_address[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasPassword\">\n <label class=\"atm-input-label\">Senha *</label>\n <input type=\"password\" class=\"atm-input-field\" v-model=\"form.password\" placeholder=\"\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.password[0] }}\n </div>\n </div>\n\n <div class=\"atm-form-group\" v-if=\"hasPassword\">\n <label class=\"atm-input-label\">Confirmar Senha *</label>\n <input type=\"password\" class=\"atm-input-field\" v-model=\"form.confirm_password\" placeholder=\"\"\n :disabled=\"isLoading\" />\n <div v-if=\"fieldErrors.confirm_password.length > 0\" class=\"atm-field-error\">\n {{ fieldErrors.confirm_password[0] }}\n </div>\n </div>\n\n <button type=\"submit\" class=\"atm-signup-button\" :disabled=\"isLoading\">\n <span v-if=\"!isLoading\">Criar Conta</span>\n <span v-else class=\"button-spinner\">\n <svg class=\"spinner-svg\" viewBox=\"0 0 50 50\">\n <circle class=\"spinner-circle\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"5\" />\n </svg>\n Criando...\n </span>\n </button>\n\n <div class=\"atm-footer-links\">\n <p class=\"atm-login-text\">\n Já tem uma conta? <a @click=\"signIn\" class=\"atm-login-link\"\n :class=\"{ 'disabled-link': isLoading }\">Faça login</a>\n </p>\n\n <p class=\"atm-powered-by\">Secured by <strong>Autenticar.me</strong></p>\n </div>\n </div>\n </form>\n</template>\n\n<style scoped>\n.atm-signup-container {\n width: 100%;\n border-radius: 8px;\n font-family: 'Segoe UI', system-ui, sans-serif;\n text-align: center;\n}\n\n.atm-logo-container {\n margin-bottom: 12px;\n}\n\n.atm-logo-placeholder {\n width: 44px;\n height: 44px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f0f0f0;\n border-radius: 50%;\n color: #888;\n font-size: 11px;\n}\n\n.atm-logo-image {\n max-width: 44px;\n max-height: 44px;\n margin: 0 auto;\n display: block;\n border-radius: 4px;\n object-fit: contain;\n}\n\n.atm-project-name {\n margin: 0 0 4px 0;\n font-size: 18px;\n color: v-bind('atmPrimaryColor');\n font-weight: 600;\n}\n\n.atm-welcome-text {\n margin: 0 0 16px 0;\n font-size: 14px;\n color: #666;\n}\n\n.atm-form-group {\n margin-bottom: 12px;\n text-align: left;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 4px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 8px 10px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-input-field:disabled {\n background-color: #f5f5f5;\n cursor: not-allowed;\n}\n\n.atm-field-error {\n color: #dc3545;\n font-size: 12px;\n margin-top: 4px;\n text-align: left;\n}\n\n.atm-signup-button {\n width: 100%;\n padding: 10px;\n margin-top: 4px;\n background: v-bind('atmPrimaryColor');\n color: #fff;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n min-height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.atm-signup-button:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n}\n\n.atm-signup-button:disabled {\n opacity: 0.8;\n cursor: not-allowed;\n transform: none;\n}\n\n.button-spinner {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n color: #fff;\n font-weight: 500;\n}\n\n.spinner-svg {\n animation: spin 1s linear infinite;\n width: 18px;\n height: 18px;\n stroke: #fff;\n}\n\n.spinner-circle {\n stroke-dasharray: 90, 150;\n stroke-linecap: round;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n.atm-footer-links {\n margin-top: 16px;\n font-size: 13px;\n}\n\n.atm-login-text {\n color: #666;\n margin-bottom: 6px;\n}\n\n.atm-login-link {\n color: v-bind('atmSecondaryColor');\n text-decoration: none;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-login-link:hover:not(.disabled-link) {\n text-decoration: underline;\n}\n\n.atm-login-link.disabled-link {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.atm-powered-by {\n color: #999;\n font-size: 11px;\n margin: 0;\n}\n\n@media (max-width: 768px) {\n .atm-project-name {\n font-size: 17px;\n }\n\n .atm-welcome-text {\n font-size: 13px;\n margin-bottom: 14px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 4px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-signup-button {\n font-size: 13px;\n padding: 9px;\n min-height: 40px;\n }\n\n .atm-footer-links {\n margin-top: 14px;\n font-size: 12px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logo-placeholder {\n width: 40px;\n height: 40px;\n font-size: 10px;\n }\n\n .atm-logo-image {\n max-width: 40px;\n max-height: 40px;\n }\n\n .atm-project-name {\n font-size: 16px;\n margin-bottom: 4px;\n }\n\n .atm-welcome-text {\n font-size: 12px;\n margin-bottom: 12px;\n }\n\n .atm-form-group {\n margin-bottom: 10px;\n }\n\n .atm-input-label {\n font-size: 12px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 7px 9px;\n font-size: 13px;\n }\n\n .atm-signup-button {\n font-size: 13px;\n padding: 9px;\n min-height: 38px;\n }\n\n .atm-footer-links {\n margin-top: 12px;\n font-size: 12px;\n }\n\n .atm-powered-by {\n font-size: 10px;\n }\n\n .spinner-svg {\n width: 16px;\n height: 16px;\n }\n\n .button-spinner {\n gap: 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logo-placeholder {\n width: 36px;\n height: 36px;\n font-size: 9px;\n }\n\n .atm-logo-image {\n max-width: 36px;\n max-height: 36px;\n }\n\n .atm-project-name {\n font-size: 15px;\n margin-bottom: 3px;\n }\n\n .atm-welcome-text {\n font-size: 11px;\n margin-bottom: 10px;\n }\n\n .atm-form-group {\n margin-bottom: 8px;\n }\n\n .atm-input-label {\n font-size: 11px;\n margin-bottom: 3px;\n }\n\n .atm-input-field {\n padding: 6px 8px;\n font-size: 12px;\n }\n\n .atm-signup-button {\n font-size: 12px;\n padding: 8px;\n min-height: 36px;\n }\n\n .atm-footer-links {\n margin-top: 10px;\n font-size: 11px;\n }\n\n .spinner-svg {\n width: 14px;\n height: 14px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport Modal from './Modal.vue'\nimport SignIn from '../SignIn.vue'\nimport SignUp from '../SignUp.vue'\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n\nconst component = ref<'sign-up' | 'sign-in'>('sign-in')\n\nconst signUp = () => component.value = 'sign-up'\n\nconst signIn = () => component.value = 'sign-in'\n\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1024)\n\nconst maxWidth = computed(() => {\n if (windowWidth.value <= 360) return 340\n if (windowWidth.value <= 480) return windowWidth.value - 20\n if (windowWidth.value <= 768) return 400\n return 420\n})\n\nconst updateWidth = () => {\n windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n window.addEventListener('resize', updateWidth)\n})\n\nonUnmounted(() => {\n window.removeEventListener('resize', updateWidth)\n})\n</script>\n\n<template>\n <Modal :max-width=\"maxWidth\" @close=\"close()\">\n <SignIn\n v-if=\"component === 'sign-in'\"\n @sign-up=\"signUp()\"\n @completed=\"close()\"\n />\n\n <SignUp\n v-if=\"component === 'sign-up'\"\n @sign-in=\"signIn()\"\n @completed=\"close()\"\n />\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed, provide } from 'vue'\nimport SignInModal from '../Modals/SignInModal.vue'\nimport Notification from '../Notification.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst showSignInModal = ref(false)\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\n\nconst notification = ref({\n show: false,\n message: '',\n type: 'error' as 'error' | 'success' | 'warning'\n})\n\nconst showNotification = (message: string, type: 'error' | 'success' | 'warning' = 'error') => {\n notification.value = {\n show: true,\n message,\n type\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nprovide('showNotification', showNotification)\n\nconst signIn = () => {\n showSignInModal.value = true\n}\n</script>\n\n<template>\n <Notification \n :show=\"notification.show\" \n :message=\"notification.message\" \n :type=\"notification.type\" \n />\n\n <SignInModal v-if=\"showSignInModal\" @close=\"() => showSignInModal = false\"/>\n\n <button @click=\"signIn()\" class=\"atm-signin-btn\">\n Entrar\n </button>\n</template>\n\n<style scoped>\n.atm-signin-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n min-height: 44px;\n}\n\n.atm-signin-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-signin-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-signin-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-signin-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport Modal from './Modal.vue'\nimport SignIn from '../SignIn.vue'\nimport SignUp from '../SignUp.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst { configurations } = useAtm()\n\nconst emit = defineEmits([\n 'close',\n])\n\nconst close = () => {\n emit('close')\n}\n\nconst component = ref<'sign-up' | 'sign-in'>('sign-up')\nconst isRegistrationAllowed = computed(() => configurations.value?.register?.enable !== false)\n\nconst signUp = () => component.value = 'sign-up'\n\nconst signIn = () => component.value = 'sign-in'\n\nconst windowWidth = ref(typeof window !== 'undefined' ? window.innerWidth : 1024)\n\nconst maxWidth = computed(() => {\n if (windowWidth.value <= 360) return 340\n if (windowWidth.value <= 480) return windowWidth.value - 20\n if (windowWidth.value <= 768) return 400\n return 420\n})\n\nconst updateWidth = () => {\n windowWidth.value = window.innerWidth\n}\n\nonMounted(() => {\n window.addEventListener('resize', updateWidth)\n})\n\nonUnmounted(() => {\n window.removeEventListener('resize', updateWidth)\n})\n</script>\n\n<template>\n <Modal :max-width=\"maxWidth\" @close=\"close()\">\n <SignIn\n v-if=\"component === 'sign-in'\"\n @sign-up=\"signUp()\"\n @completed=\"close()\"\n />\n\n <SignUp\n v-if=\"component === 'sign-up' && isRegistrationAllowed\"\n @sign-in=\"signIn()\"\n @completed=\"close()\"\n />\n\n <div v-else-if=\"component === 'sign-up'\" style=\"padding: 24px; text-align: center;\">\n <p style=\"margin-bottom: 16px;\">Registro não está disponível no momento</p>\n <button @click=\"signIn()\" style=\"padding: 12px 24px; background: #007bff; color: white; border: none; border-radius: 6px; cursor: pointer;\">Fazer login</button>\n </div>\n </Modal>\n</template>\n","<script setup lang=\"ts\">\nimport { ref, computed } from 'vue'\nimport SignUpModal from '../Modals/SignUpModal.vue'\nimport { useAtm } from '../../composables/useAtm'\n\nconst showSignUpModal = ref(false)\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst isRegistrationAllowed = computed(() => configurations.value?.register?.enable !== false)\n\nconst signUp = () => {\n showSignUpModal.value = true\n}\n</script>\n\n<template>\n <SignUpModal v-if=\"showSignUpModal\" @close=\"() => showSignUpModal = false\" />\n\n <button v-if=\"isRegistrationAllowed\" @click=\"signUp()\" class=\"atm-signup-btn\">\n Cadastrar-se\n </button>\n</template>\n\n<style scoped>\n.atm-signup-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.2s;\n min-height: 44px;\n}\n\n.atm-signup-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-signup-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-signup-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-signup-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { ref, computed, onMounted, onUnmounted, provide } from 'vue'\nimport { useAuth } from '../composables/useAuth'\nimport { useAtm } from '../composables/useAtm'\nimport { useAtmClient } from '../composables/useAtmClient'\nimport Notification from './Notification.vue'\nimport type { Session, Device } from '../types/session.type'\n\ninterface ProfileFormData {\n firstName: string\n lastName: string\n primaryEmailAddress: string\n}\n\ninterface NotificationData {\n show: boolean\n message: string\n type: 'error' | 'success' | 'warning'\n}\n\ninterface UpdateData {\n first_name?: string\n last_name?: string\n}\n\ninterface ProfileDataUpdated {\n first_name?: string | null\n last_name?: string | null\n primary_email_address: string\n}\n\ninterface EmailAddress {\n email_address: string\n id: string\n primary: boolean\n verified: boolean\n}\n\ntype NotificationType = 'error' | 'success' | 'warning'\n\nconst { user, logout } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\nconst atmSecondaryColor = computed(() => configurations.value?.design?.secondaryColor)\n\nconst isDropdownOpen = ref(false)\nconst isProfileModalOpen = ref(false)\nconst isEditingProfile = ref(false)\nconst buttonRef = ref<HTMLButtonElement | null>(null)\nconst emailAddresses = ref<EmailAddress[]>([])\nconst newEmail = ref<string>('')\nconst activeTab = ref<'geral' | 'emails' | 'senha' | 'sessoes'>('geral')\nconst sessions = ref<Session[]>([])\n\nconst client = useAtmClient()\n\nconst profileForm = ref<ProfileFormData>({\n firstName: '',\n lastName: '',\n primaryEmailAddress: ''\n})\n\nconst notification = ref<NotificationData>({\n show: false,\n message: '',\n type: 'error'\n})\n\nconst showNotification = (message: string, type: NotificationType = 'error') => {\n notification.value = {\n show: true,\n message,\n type\n }\n setTimeout(() => {\n notification.value.show = false\n }, 3000)\n}\n\nprovide('showNotification', showNotification)\n\nconst userInitials = computed(() => {\n if (!user.value || !user.value.firstName) return ''\n return (user.value.firstName.charAt(0) + (user.value.lastName?.charAt(0) || '')).toUpperCase()\n})\n\nconst toggleMenu = () => (isDropdownOpen.value = !isDropdownOpen.value)\n\nconst closeMenu = (event: MouseEvent) => {\n if (buttonRef.value && !buttonRef.value.contains(event.target as Node)) {\n isDropdownOpen.value = false\n }\n}\n\nconst openProfileModal = async () => {\n isDropdownOpen.value = false\n isProfileModalOpen.value = true\n activeTab.value = 'geral'\n resetProfileForm()\n await loadEmailAddresses()\n await loadSessions()\n}\n\nconst closeProfileModal = () => {\n isProfileModalOpen.value = false\n isEditingProfile.value = false\n resetProfileForm()\n emailAddresses.value = []\n newEmail.value = ''\n sessions.value = []\n activeTab.value = 'geral'\n}\n\nconst resetProfileForm = () => {\n if (user.value) {\n profileForm.value = {\n firstName: user.value.firstName || '',\n lastName: user.value.lastName || '',\n primaryEmailAddress: user.value.primaryEmailAddress || ''\n }\n }\n}\n\nconst updateProfileFormWithData = (profileDataUpdated: ProfileDataUpdated) => {\n if (profileDataUpdated.first_name) {\n profileForm.value.firstName = profileDataUpdated.first_name\n }\n if (profileDataUpdated.last_name) {\n profileForm.value.lastName = profileDataUpdated.last_name\n }\n if (profileDataUpdated.primary_email_address) {\n profileForm.value.primaryEmailAddress = profileDataUpdated.primary_email_address\n }\n}\n\nconst loadEmailAddresses = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n const emails = await client.account(token).getEmailsAddresses()\n emailAddresses.value = emails\n } catch (error: any) {\n showNotification('Erro ao carregar endereços de email', 'error')\n }\n}\n\nconst requestEmailVerification = async (emailId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).requestEmailVerification(emailId)\n showNotification('Link de verificação enviado para o email', 'success')\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao enviar verificação de email', 'error')\n }\n}\n\nconst deleteEmailAddress = async (emailId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).deleteEmailAddress(emailId)\n showNotification('Email removido com sucesso', 'success')\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao remover email', 'error')\n }\n}\n\nconst createEmailAddress = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n if (!newEmail.value.trim()) {\n showNotification('Informe o novo email', 'error')\n return\n }\n await client.account(token).createEmailAddress(newEmail.value.trim())\n showNotification('Email adicionado. Verifique sua caixa de entrada.', 'success')\n newEmail.value = ''\n await loadEmailAddresses()\n } catch (error: any) {\n showNotification('Erro ao adicionar email', 'error')\n }\n}\n\nconst startEditing = () => {\n isEditingProfile.value = true\n}\n\nconst cancelEditing = () => {\n isEditingProfile.value = false\n resetProfileForm()\n}\n\nconst getCookie = (name: string) => {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\n return null;\n}\n\nconst updateProfile = async () => {\n try {\n if (!profileForm.value.firstName.trim()) {\n showNotification('Nome é obrigatório', 'error')\n return\n }\n if (!profileForm.value.lastName.trim()) {\n showNotification('Sobrenome é obrigatório', 'error')\n return\n }\n const updateData: UpdateData = {}\n if (profileForm.value.firstName !== user.value?.firstName) {\n updateData.first_name = profileForm.value.firstName.trim()\n }\n if (profileForm.value.lastName !== user.value?.lastName) {\n updateData.last_name = profileForm.value.lastName.trim()\n }\n if (Object.keys(updateData).length === 0) {\n showNotification('Nenhuma alteração foi feita', 'warning')\n isEditingProfile.value = false\n return\n }\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).updateProfile(updateData)\n const profileDataUpdated: ProfileDataUpdated = await client.account(token).getProfile()\n updateProfileFormWithData(profileDataUpdated)\n showNotification('Perfil atualizado com sucesso!', 'success')\n isEditingProfile.value = false\n } catch (error: any) {\n showNotification(error.message || 'Erro ao atualizar perfil', 'error')\n }\n}\n\nconst logoutUser = () => {\n logout()\n isDropdownOpen.value = false\n}\n\nconst sendResetPasswordLink = async () => {\n if (!user.value?.primaryEmailAddress) {\n showNotification('Informe o email para enviar o link de recuperação', 'error')\n return\n }\n try {\n await client.auth().resetPassword({ email_address: user.value.primaryEmailAddress })\n showNotification(`Foi enviado um link para resetar a senha para o email ${user.value.primaryEmailAddress}.`, 'success')\n } catch (e: any) {\n showNotification(e.message || 'Erro ao solicitar recuperação de senha', 'error')\n }\n}\n\nconst loadSessions = async () => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n const sessionsData = await client.account(token).getSessions()\n sessions.value = sessionsData\n } catch (error: any) {\n showNotification('Erro ao carregar sessões', 'error')\n }\n}\n\nconst closeSessionById = async (sessionId: string) => {\n try {\n const token = getCookie('atm_access_token')\n if (!token) {\n showNotification('Token de acesso não encontrado', 'error')\n return\n }\n await client.account(token).closeSession(sessionId)\n showNotification('Sessão encerrada com sucesso', 'success')\n await loadSessions()\n } catch (error: any) {\n showNotification('Erro ao encerrar sessão', 'error')\n }\n}\n\nconst formatDate = (dateString: string) => {\n const date = new Date(dateString)\n return date.toLocaleString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n })\n}\n\nconst getDeviceIcon = (device: Device) => {\n const platform = device.platform?.toLowerCase() || ''\n const browser = device.browser?.toLowerCase() || ''\n\n if (platform.includes('windows') || platform.includes('win32') || platform.includes('win64')) {\n return 'M0,0V11H11V0ZM13,0V11H24V0ZM0,13V24H11V13ZM13,13V24H24V13Z'\n }\n\n if (platform.includes('mac') || platform.includes('darwin') || platform.includes('os x')) {\n return 'M12,1C7,1 3,5 3,10C3,14 6,17 9,18V22H15V18C18,17 21,14 21,10C21,5 17,1 12,1M12,3C15.9,3 19,6.1 19,10C19,13.4 16.6,16.2 13.4,16.8L13,16.9V20H11V16.9L10.6,16.8C7.4,16.2 5,13.4 5,10C5,6.1 8.1,3 12,3Z'\n }\n\n if (platform.includes('iphone') || platform.includes('ipad') || platform.includes('ipod') || platform.includes('ios')) {\n return 'M15.5,1H8.5C7.67,1 7,1.67 7,2.5V21.5C7,22.33 7.67,23 8.5,23H15.5C16.33,23 17,22.33 17,21.5V2.5C17,1.67 16.33,1 15.5,1M12,22C11.45,22 11,21.55 11,21C11,20.45 11.45,20 12,20C12.55,20 13,20.45 13,21C13,21.55 12.55,22 12,22M15,19H9V4H15V19Z'\n }\n\n if (platform.includes('android')) {\n return 'M16.61,15.15C16.15,15.15 15.77,15.53 15.77,16C15.77,16.46 16.15,16.85 16.61,16.85C17.07,16.85 17.46,16.46 17.46,16C17.46,15.53 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,15.53 6.57,16C6.57,16.46 6.95,16.85 7.41,16.85C7.87,16.85 8.26,16.46 8.26,16C8.26,15.53 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14Z'\n }\n\n if (platform.includes('linux') || platform.includes('ubuntu') || platform.includes('debian') || platform.includes('fedora') || platform.includes('centos') || platform.includes('arch')) {\n return 'M12,2C11.5,2 11,2.19 10.59,2.59L2.59,10.59C1.8,11.37 1.8,12.63 2.59,13.41L10.59,21.41C11.37,22.2 12.63,22.2 13.41,21.41L21.41,13.41C22.2,12.63 22.2,11.37 21.41,10.59L13.41,2.59C13,2.19 12.5,2 12,2M12,4L20,12L12,20L4,12M12.5,7V13H11V7M12.5,15V17H11V15'\n }\n\n if (platform.includes('chrome') || browser.includes('chrome')) {\n return 'M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4C14.6,4 16.94,5.27 18.35,7.25L15.5,12C15.29,11.41 15,10.87 14.62,10.41C13.69,9.31 12.36,8.63 10.88,8.63C10.75,8.63 10.62,8.64 10.5,8.65L12,4.03C12,4.03 12,4 12,4M4.26,8.09C5.61,6.19 7.82,5 10.29,5L8.5,9.5C7.12,10.5 6.25,12.18 6.25,14.06C6.25,14.66 6.35,15.23 6.53,15.78L4.26,8.09M19.74,8.09L17.47,15.78C18.5,14.16 19.13,12.19 19.13,10.06C19.13,9.38 19.04,8.72 18.88,8.09H19.74M6.06,17C4.5,15.5 3.5,13.38 3.5,11C3.5,10.66 3.53,10.33 3.57,10H7.03C7,10.33 7,10.66 7,11C7,12.96 7.81,14.73 9.11,16L6.06,17M12,20C9.4,20 7.06,18.73 5.65,16.75L8.5,12C8.71,12.59 9,13.13 9.38,13.59C10.31,14.69 11.64,15.37 13.12,15.37C13.25,15.37 13.38,15.36 13.5,15.35L12,19.97C12,19.97 12,20 12,20M17.94,17L15.96,11C17.21,9.89 18,8.21 18,6.31C18,5.71 17.9,5.14 17.72,4.59L19.74,8.09C20.26,9.25 20.55,10.56 20.55,11.94C20.55,14.27 19.64,16.38 18.18,17.91L17.94,17Z'\n }\n\n if (browser.includes('firefox') || browser.includes('mozilla')) {\n return 'M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M15.84,15.5C15.57,16.17 15.16,16.75 14.63,17.23C13.96,17.82 13.17,18.21 12.29,18.42C11.38,18.63 10.47,18.63 9.56,18.42C9,18.29 8.5,18.06 8.04,17.75C7.27,17.23 6.69,16.5 6.32,15.63C5.95,14.76 5.79,13.81 5.86,12.86C5.93,11.91 6.24,11.03 6.77,10.24C7.3,9.45 8,8.84 8.84,8.45C9.68,8.06 10.58,7.93 11.5,8.07C12.41,8.21 13.24,8.59 13.94,9.18C14.64,9.77 15.16,10.53 15.45,11.38C15.74,12.23 15.79,13.13 15.59,14C15.39,14.87 14.96,15.67 14.34,16.32L15.84,15.5Z'\n }\n\n if (browser.includes('safari')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4M9.5,9.5L14,12L12,14L10.5,14.5L9.5,9.5M12,11A1,1 0 0,1 13,12A1,1 0 0,1 12,13A1,1 0 0,1 11,12A1,1 0 0,1 12,11Z'\n }\n\n if (browser.includes('edge') || browser.includes('edg')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4A8,8 0 0,0 4,12C4,14.5 5.2,16.7 7.1,18C8,17 9.3,16.5 10.7,16.5C12.1,16.5 13.4,17 14.3,18C16.2,16.7 17.4,14.5 17.4,12C17.4,9.5 16.2,7.3 14.3,6C13.4,7 12.1,7.5 10.7,7.5C9.3,7.5 8,7 7.1,6C5.2,7.3 4,9.5 4,12M12,10A2,2 0 0,1 14,12A2,2 0 0,1 12,14A2,2 0 0,1 10,12A2,2 0 0,1 12,10Z'\n }\n\n if (browser.includes('opera')) {\n return 'M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2M12,4C7.92,4 4.55,7.05 4.07,11H8.92C9.45,8.7 10.6,7 12,7C13.4,7 14.55,8.7 15.08,11H19.93C19.45,7.05 16.08,4 12,4M4.07,13C4.55,16.95 7.92,20 12,20C16.08,20 19.45,16.95 19.93,13H15.08C14.55,15.3 13.4,17 12,17C10.6,17 9.45,15.3 8.92,13H4.07Z'\n }\n\n if (platform.includes('tablet') || platform.includes('ipad')) {\n return 'M19,18H5V6H19M21,4H3C1.89,4 1,4.89 1,6V18A2,2 0 0,0 3,20H21A2,2 0 0,0 23,18V6C23,4.89 22.1,4 21,4Z'\n }\n\n return 'M17,19H7V5H17M17,1H7C5.89,1 5,1.89 5,3V21A2,2 0 0,0 7,23H17A2,2 0 0,0 19,21V3C19,1.89 18.1,1 17,1Z'\n}\n\nconst hasFullName = computed(() => {\n return !!(user.value?.firstName && user.value?.lastName);\n});\n\nonMounted(() => document.addEventListener('click', closeMenu))\nonUnmounted(() => document.removeEventListener('click', closeMenu))\n</script>\n\n<template>\n <Notification :show=\"notification.show\" :message=\"notification.message\" :type=\"notification.type\" />\n\n <div v-if=\"user\" class=\"atm-profile-container\">\n <button class=\"atm-profile-button\" @click=\"toggleMenu\" ref=\"buttonRef\">\n <div class=\"atm-profile-avatar\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\" style=\"width: 20px; height: 20px; color: white;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n <span class=\"atm-profile-name\" v-if=\"hasFullName\">{{ user.firstName }}</span>\n <svg class=\"atm-profile-arrow\" :class=\"{ 'atm-rotate': isDropdownOpen }\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\" d=\"M7,10L12,15L17,10H7Z\" />\n </svg>\n </button>\n\n <transition name=\"atm-fade\">\n <div v-if=\"isDropdownOpen\" class=\"atm-profile-menu\">\n <div class=\"atm-profile-info\">\n <div class=\"atm-profile-avatar large\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\"\n style=\"width: 40px; height: 40px; color: white;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n <div class=\"atm-profile-details\">\n <p class=\"atm-profile-fullname\" v-if=\"hasFullName\">{{ user.firstName }} {{ user.lastName }}</p>\n <p class=\"atm-profile-fullname\" v-else>Usuário</p>\n <p class=\"atm-profile-email\">{{ user.primaryEmailAddress }}</p>\n </div>\n </div>\n\n <div class=\"atm-profile-options\">\n <button class=\"atm-profile-option\" @click=\"openProfileModal\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-profile-icon\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n Meu Perfil\n </button>\n <button class=\"atm-profile-option\" @click=\"logoutUser\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-profile-icon\">\n <path fill=\"currentColor\"\n d=\"M16,17V14H9V10H16V7L21,12L16,17M14,2A2,2 0 0,1 16,4V6H14V4H5V20H14V18H16V20A2,2 0 0,1 14,22H5A2,2 0 0,1 3,20V4A2,2 0 0,1 5,2H14Z\" />\n </svg>\n Sair\n </button>\n </div>\n </div>\n </transition>\n\n <div v-if=\"isProfileModalOpen\" class=\"atm-profile-modal\" role=\"dialog\" aria-modal=\"true\"\n aria-labelledby=\"profile-modal-title\">\n <div class=\"atm-profile-overlay\" @click=\"closeProfileModal\"></div>\n <div class=\"atm-profile-content\">\n <div class=\"atm-profile-header\">\n <button @click=\"closeProfileModal\" class=\"atm-profile-close\" aria-label=\"Fechar\">×</button>\n <h2 id=\"profile-modal-title\" class=\"atm-profile-title\">Meu Perfil</h2>\n </div>\n\n <div class=\"atm-profile-tabs\">\n <button @click=\"activeTab = 'geral'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'geral' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n Geral\n </button>\n <button @click=\"activeTab = 'emails'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'emails' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z\" />\n </svg>\n Emails\n </button>\n <button @click=\"activeTab = 'senha'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'senha' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z\" />\n </svg>\n Senha\n </button>\n <button @click=\"activeTab = 'sessoes'\"\n :class=\"['atm-tab', { 'atm-tab-active': activeTab === 'sessoes' }]\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-tab-icon\">\n <path fill=\"currentColor\"\n d=\"M4,6H20V16H4M20,18A2,2 0 0,0 22,16V6C22,4.89 21.1,4 20,4H4C2.89,4 2,4.89 2,6V16A2,2 0 0,0 4,18H0V20H24V18H20Z\" />\n </svg>\n Sessões\n </button>\n </div>\n\n <div v-if=\"activeTab === 'geral'\" class=\"atm-profile-body\">\n <div class=\"atm-profile-avatar-large\" :style=\"user?.profileImage ? {} : { backgroundColor: atmPrimaryColor }\">\n <template v-if=\"user?.profileImage\">\n <img :src=\"user.profileImage\" alt=\"Profile\" class=\"atm-profile-avatar-img\" />\n </template>\n <template v-else-if=\"hasFullName\">\n <span>{{ userInitials }}</span>\n </template>\n <template v-else>\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\"\n style=\"width: 80px; height: 80px; color: white; margin: 0 auto;\">\n <path fill=\"currentColor\"\n d=\"M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z\" />\n </svg>\n </template>\n </div>\n\n <div v-if=\"!isEditingProfile\" class=\"atm-profile-info-grid\">\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Nome</span>\n <span class=\"atm-profile-info-value\" v-if=\"hasFullName\">{{ profileForm.firstName }}</span>\n <span class=\"atm-profile-info-value\" v-else>Não informado</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Sobrenome</span>\n <span class=\"atm-profile-info-value\" v-if=\"hasFullName\">{{ profileForm.lastName }}</span>\n <span class=\"atm-profile-info-value\" v-else>Não informado</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Email Principal</span>\n <span class=\"atm-profile-info-value\">{{ profileForm.primaryEmailAddress }}</span>\n </div>\n <div class=\"atm-profile-info-row\">\n <button class=\"atm-edit-profile-btn\" @click=\"startEditing\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z\" />\n </svg>\n Editar Perfil\n </button>\n </div>\n </div>\n\n <div v-else class=\"atm-profile-edit-form\">\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Nome</label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"profileForm.firstName\"\n placeholder=\"Digite seu nome\" />\n </div>\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Sobrenome</label>\n <input type=\"text\" class=\"atm-input-field\" v-model=\"profileForm.lastName\"\n placeholder=\"Digite seu sobrenome\" />\n </div>\n <div class=\"atm-form-actions\">\n <button class=\"atm-save-btn\" @click=\"updateProfile\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\" />\n </svg>\n Salvar\n </button>\n <button class=\"atm-cancel-btn\" @click=\"cancelEditing\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" />\n </svg>\n Cancelar\n </button>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'emails'\" class=\"atm-profile-body\">\n <div class=\"atm-email-add-section\">\n <div class=\"atm-form-group\">\n <label class=\"atm-input-label\">Adicionar novo email</label>\n <div class=\"atm-badge\">\n <input v-model=\"newEmail\" type=\"email\" class=\"atm-input-field\"\n placeholder=\"novo@email.com\" />\n <button @click=\"createEmailAddress\" class=\"atm-add-email-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\" d=\"M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"atm-email-list\">\n <div v-for=\"email in emailAddresses\" :key=\"email.id\" class=\"atm-email-item\">\n <div class=\"atm-email-info\">\n <div class=\"atm-email-address\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-email-icon\">\n <path fill=\"currentColor\"\n d=\"M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z\" />\n </svg>\n <span>{{ email.email_address }}</span>\n </div>\n <div class=\"atm-email-badges\">\n <span v-if=\"email.primary\" class=\"atm-badge atm-badge-primary\">Principal</span>\n <span v-if=\"email.verified\" class=\"atm-badge atm-badge-verified\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-badge-icon\">\n <path fill=\"currentColor\"\n d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\" />\n </svg>\n Verificado\n </span>\n <span v-else class=\"atm-badge atm-badge-unverified\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-badge-icon\">\n <path fill=\"currentColor\"\n d=\"M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z\" />\n </svg>\n Não verificado\n </span>\n </div>\n </div>\n <div class=\"atm-email-actions\">\n <button v-if=\"!email.verified\" @click=\"requestEmailVerification(email.id)\"\n class=\"atm-verify-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M12,1L3,5V11C3,16.55 6.84,21.74 12,23C17.16,21.74 21,16.55 21,11V5L12,1M10,17L6,13L7.41,11.59L10,14.17L16.59,7.58L18,9L10,17Z\" />\n </svg>\n Verificar\n </button>\n <button v-if=\"!email.primary\" @click=\"deleteEmailAddress(email.id)\"\n class=\"atm-delete-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z\" />\n </svg>\n Remover\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'senha'\" class=\"atm-profile-body\">\n <div class=\"atm-password-section\">\n <div class=\"atm-profile-info-row\">\n <span class=\"atm-profile-info-label\">Redefinir Senha</span>\n <span class=\"atm-profile-info-value\">\n Enviaremos um link para redefinir sua senha no email principal\n </span>\n </div>\n <div class=\"atm-profile-info-row\">\n <button class=\"atm-reset-password-btn\" @click=\"sendResetPasswordLink\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z\" />\n </svg>\n Resetar Senha\n </button>\n </div>\n </div>\n </div>\n\n <div v-if=\"activeTab === 'sessoes'\" class=\"atm-profile-body\">\n <div class=\"atm-sessions-section\">\n <div class=\"atm-sessions-info\">\n <p class=\"atm-sessions-description\">\n Gerencie os dispositivos conectados à sua conta. Você pode encerrar sessões em dispositivos que não reconhece.\n </p>\n </div>\n\n <div class=\"atm-sessions-list\">\n <div v-for=\"session in sessions\" :key=\"session.id\" class=\"atm-session-item\">\n <div class=\"atm-session-info\">\n <div class=\"atm-session-header\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-session-icon\">\n <path fill=\"currentColor\" :d=\"getDeviceIcon(session.device)\" />\n </svg>\n <div class=\"atm-session-details\">\n <div class=\"atm-session-title\">\n <span>{{ session.ip_address }}</span>\n <span v-if=\"session.current === 1\" class=\"atm-badge atm-badge-current\">Atual</span>\n </div>\n <div class=\"atm-session-device-info\" v-if=\"session.device.browser || session.device.platform\">\n <span v-if=\"session.device.browser\">\n {{ session.device.browser }}{{ session.device.browser_version ? ` ${session.device.browser_version}` : '' }}\n </span>\n <span v-if=\"session.device.browser && session.device.platform\"> • </span>\n <span v-if=\"session.device.platform\">{{ session.device.platform }}</span>\n </div>\n <div class=\"atm-session-timestamps\">\n <div class=\"atm-session-timestamp\">\n <span class=\"atm-timestamp-label\">Iniciada:</span>\n <span>{{ formatDate(session.started_at) }}</span>\n </div>\n <div class=\"atm-session-timestamp\">\n <span class=\"atm-timestamp-label\">Última atividade:</span>\n <span>{{ formatDate(session.last_activity_at) }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"atm-session-actions\">\n <button v-if=\"session.current !== 1\" @click=\"closeSessionById(session.id)\"\n class=\"atm-close-session-btn\" type=\"button\">\n <svg viewBox=\"0 0 24 24\" class=\"atm-btn-icon\">\n <path fill=\"currentColor\"\n d=\"M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z\" />\n </svg>\n Encerrar\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style>\n.atm-profile-container {\n position: relative;\n display: inline-block;\n font-family: 'Segoe UI', system-ui, sans-serif;\n}\n\n.atm-profile-button {\n display: flex;\n align-items: center;\n gap: 8px;\n background: none;\n border: none;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: background 0.2s;\n}\n\n.atm-profile-button:hover {\n background: #f0f0f0;\n}\n\n.atm-profile-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background-color: v-bind('atmPrimaryColor');\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 500;\n}\n\n.atm-profile-avatar.large {\n width: 48px;\n height: 48px;\n font-size: 16px;\n}\n\n.atm-profile-avatar-img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n.atm-profile-name {\n font-size: 14px;\n color: #333;\n font-weight: 500;\n}\n\n.atm-profile-arrow {\n width: 16px;\n height: 16px;\n transition: transform 0.2s;\n}\n\n.atm-rotate {\n transform: rotate(180deg);\n}\n\n.atm-profile-menu {\n position: absolute;\n top: 100%;\n left: 0;\n width: 280px;\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n overflow: hidden;\n margin-top: 4px;\n}\n\n.atm-profile-info {\n display: flex;\n gap: 12px;\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.atm-profile-details {\n flex: 1;\n min-width: 0;\n}\n\n.atm-profile-fullname {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.atm-profile-email {\n margin: 4px 0 0;\n font-size: 13px;\n color: #666;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.atm-profile-options {\n padding: 8px 0;\n}\n\n.atm-profile-option {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 10px 16px;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n font-size: 14px;\n color: #333;\n gap: 10px;\n transition: background 0.2s;\n}\n\n.atm-profile-option:hover {\n background: #f5f5f5;\n}\n\n.atm-profile-icon {\n width: 18px;\n height: 18px;\n color: #666;\n}\n\n.atm-fade-enter-active,\n.atm-fade-leave-active {\n transition: opacity 0.2s, transform 0.2s;\n}\n\n.atm-fade-enter-from,\n.atm-fade-leave-to {\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.atm-profile-modal {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 9999;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow-y: auto;\n padding: 1.5rem;\n}\n\n.atm-profile-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n pointer-events: none;\n}\n\n.atm-profile-content {\n position: relative;\n width: 100%;\n max-width: 450px;\n background: white;\n border-radius: 12px;\n box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);\n z-index: 1;\n max-height: calc(100vh - 3rem);\n display: flex;\n flex-direction: column;\n margin: auto;\n}\n\n.atm-profile-header {\n padding: 16px;\n border-bottom: 1px solid #f0f0f0;\n display: flex;\n align-items: center;\n}\n\n.atm-profile-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n padding: 8px;\n margin-right: 12px;\n color: #666;\n}\n\n.atm-profile-title {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n}\n\n.atm-profile-tabs {\n display: flex;\n border-bottom: 1px solid #f0f0f0;\n background: #f8f9fa;\n}\n\n.atm-tab {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 16px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: #666;\n transition: all 0.2s;\n}\n\n.atm-tab:hover {\n background: #e9ecef;\n}\n\n.atm-tab-active {\n color: v-bind('atmPrimaryColor') !important;\n background: white;\n border-bottom: 2px solid v-bind('atmPrimaryColor');\n}\n\n.atm-tab-icon {\n width: 16px;\n height: 16px;\n}\n\n.atm-profile-body {\n padding: 24px;\n text-align: center;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.atm-profile-avatar-large {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background-color: v-bind('atmPrimaryColor');\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 600;\n margin: 0 auto 20px;\n}\n\n.atm-profile-info-grid {\n width: 100%;\n text-align: left;\n margin-top: 20px;\n}\n\n.atm-profile-info-row {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n}\n\n.atm-profile-info-label {\n font-size: 13px;\n color: #666;\n margin-bottom: 4px;\n}\n\n.atm-profile-info-value {\n font-size: 16px;\n color: #333;\n font-weight: 500;\n}\n\n.atm-profile-edit-form {\n width: 100%;\n text-align: left;\n margin-top: 20px;\n}\n\n.atm-form-group {\n margin-bottom: 16px;\n}\n\n.atm-input-label {\n display: block;\n margin-bottom: 6px;\n font-size: 13px;\n color: #555;\n font-weight: 500;\n}\n\n.atm-input-field {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n box-sizing: border-box;\n transition: border-color 0.2s;\n}\n\n.atm-input-field:focus {\n outline: none;\n border-color: v-bind('atmPrimaryColor');\n box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.1);\n}\n\n.atm-form-actions {\n display: flex;\n gap: 12px;\n margin-top: 24px;\n}\n\n.atm-save-btn,\n.atm-edit-profile-btn,\n.atm-reset-password-btn,\n.atm-add-email-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n justify-content: center;\n}\n\n.atm-save-btn:hover,\n.atm-edit-profile-btn:hover,\n.atm-reset-password-btn:hover,\n.atm-add-email-btn:hover {\n opacity: 0.9;\n}\n\n.atm-cancel-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n padding: 12px;\n background: #f8f9fa;\n color: #666;\n border: 1px solid #ddd;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n justify-content: center;\n}\n\n.atm-cancel-btn:hover {\n background: #e9ecef;\n}\n\n.atm-btn-icon {\n width: 16px;\n height: 16px;\n}\n\n.atm-email-add-section {\n margin-bottom: 24px;\n text-align: left;\n}\n\n.atm-email-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n text-align: left;\n}\n\n.atm-email-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 6px;\n border: 1px solid #e9ecef;\n}\n\n.atm-email-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n}\n\n.atm-email-address {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.atm-email-icon {\n width: 16px;\n height: 16px;\n color: v-bind('atmSecondaryColor');\n}\n\n.atm-email-badges {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.atm-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n font-size: 11px;\n font-weight: 500;\n border-radius: 12px;\n text-transform: uppercase;\n}\n\n.atm-badge-icon {\n width: 12px;\n height: 12px;\n}\n\n.atm-badge-primary {\n background: #e3f2fd;\n color: #1976d2;\n}\n\n.atm-badge-verified {\n background: #e8f5e8;\n color: #2e7d32;\n}\n\n.atm-badge-unverified {\n background: #fff3e0;\n color: #f57c00;\n}\n\n.atm-email-actions {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.atm-verify-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n background: v-bind('atmPrimaryColor');\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-verify-btn:hover {\n opacity: 0.9;\n}\n\n.atm-delete-btn {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n}\n\n.atm-delete-btn:hover {\n opacity: 0.9;\n}\n\n.atm-password-section {\n text-align: left;\n}\n\n.atm-sessions-section {\n text-align: left;\n}\n\n.atm-sessions-info {\n margin-bottom: 20px;\n}\n\n.atm-sessions-description {\n margin: 0;\n font-size: 14px;\n color: #666;\n line-height: 1.5;\n}\n\n.atm-sessions-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.atm-session-item {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px;\n background: #f8f9fa;\n border-radius: 8px;\n border: 1px solid #e9ecef;\n gap: 16px;\n}\n\n.atm-session-header {\n display: flex;\n gap: 12px;\n align-items: flex-start;\n}\n\n.atm-session-icon {\n width: 24px;\n height: 24px;\n color: v-bind('atmSecondaryColor');\n flex-shrink: 0;\n}\n\n.atm-session-details {\n flex: 1;\n min-width: 0;\n}\n\n.atm-session-title {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 15px;\n font-weight: 600;\n color: #333;\n}\n\n.atm-session-device-info {\n font-size: 13px;\n color: #666;\n margin-bottom: 8px;\n}\n\n.atm-badge-current {\n background: #d1f4e0;\n color: #0f9d58;\n}\n\n.atm-session-timestamps {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.atm-session-timestamp {\n display: flex;\n gap: 6px;\n font-size: 13px;\n color: #666;\n}\n\n.atm-timestamp-label {\n font-weight: 500;\n color: #555;\n}\n\n.atm-session-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.atm-close-session-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n background: #dc3545;\n color: white;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n white-space: nowrap;\n}\n\n.atm-close-session-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-profile-button {\n padding: 6px 10px;\n gap: 6px;\n }\n\n .atm-profile-name {\n font-size: 13px;\n }\n\n .atm-profile-menu {\n width: 260px;\n }\n\n .atm-profile-modal {\n padding: 1rem;\n }\n\n .atm-profile-content {\n max-width: 90%;\n max-height: calc(100vh - 2rem);\n }\n\n .atm-profile-header {\n padding: 14px;\n }\n\n .atm-profile-title {\n font-size: 16px;\n }\n\n .atm-profile-body {\n padding: 20px;\n }\n\n .atm-tab {\n padding: 10px 12px;\n font-size: 13px;\n gap: 4px;\n }\n\n .atm-tab-icon {\n width: 14px;\n height: 14px;\n }\n\n .atm-profile-avatar-large {\n width: 70px;\n height: 70px;\n font-size: 22px;\n }\n\n .atm-email-item {\n flex-direction: column;\n gap: 12px;\n align-items: flex-start;\n }\n\n .atm-email-actions {\n flex-direction: row;\n width: 100%;\n }\n\n .atm-verify-btn,\n .atm-delete-btn {\n flex: 1;\n justify-content: center;\n }\n\n .atm-session-item {\n flex-direction: column;\n align-items: flex-start;\n }\n\n .atm-session-actions {\n width: 100%;\n }\n\n .atm-close-session-btn {\n width: 100%;\n justify-content: center;\n }\n}\n\n@media (max-width: 480px) {\n .atm-profile-button {\n padding: 4px 8px;\n gap: 4px;\n }\n\n .atm-profile-avatar {\n width: 28px;\n height: 28px;\n font-size: 11px;\n }\n\n .atm-profile-avatar.large {\n width: 40px;\n height: 40px;\n font-size: 14px;\n }\n\n .atm-profile-name {\n font-size: 12px;\n }\n\n .atm-profile-arrow {\n width: 14px;\n height: 14px;\n }\n\n .atm-profile-menu {\n width: calc(100vw - 20px);\n max-width: 240px;\n }\n\n .atm-profile-info {\n padding: 12px;\n gap: 10px;\n }\n\n .atm-profile-fullname {\n font-size: 13px;\n }\n\n .atm-profile-email {\n font-size: 12px;\n }\n\n .atm-profile-option {\n padding: 8px 12px;\n font-size: 13px;\n gap: 8px;\n }\n\n .atm-profile-icon {\n width: 16px;\n height: 16px;\n }\n\n .atm-profile-modal {\n padding: 0.5rem;\n }\n\n .atm-profile-content {\n max-width: 95%;\n max-height: calc(100vh - 1rem);\n }\n\n .atm-profile-header {\n padding: 12px;\n }\n\n .atm-profile-close {\n font-size: 20px;\n padding: 4px;\n margin-right: 8px;\n }\n\n .atm-profile-title {\n font-size: 15px;\n }\n\n .atm-profile-body {\n padding: 16px;\n }\n\n .atm-tab {\n padding: 8px 8px;\n font-size: 12px;\n gap: 3px;\n }\n\n .atm-tab-icon {\n width: 13px;\n height: 13px;\n }\n\n .atm-profile-avatar-large {\n width: 60px;\n height: 60px;\n font-size: 20px;\n margin-bottom: 16px;\n }\n\n .atm-profile-info-label {\n font-size: 12px;\n }\n\n .atm-profile-info-value {\n font-size: 14px;\n }\n\n .atm-input-label {\n font-size: 12px;\n }\n\n .atm-input-field {\n padding: 8px 10px;\n font-size: 13px;\n }\n\n .atm-form-actions {\n flex-direction: column;\n gap: 8px;\n }\n\n .atm-save-btn,\n .atm-cancel-btn,\n .atm-edit-profile-btn,\n .atm-reset-password-btn {\n width: 100%;\n padding: 10px;\n font-size: 13px;\n }\n\n .atm-email-item {\n padding: 10px;\n }\n\n .atm-email-address {\n font-size: 13px;\n }\n\n .atm-badge {\n font-size: 10px;\n padding: 2px 6px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-profile-button {\n padding: 4px 6px;\n }\n\n .atm-profile-avatar {\n width: 26px;\n height: 26px;\n font-size: 10px;\n }\n\n .atm-profile-name {\n display: none;\n }\n\n .atm-profile-menu {\n width: calc(100vw - 16px);\n max-width: 220px;\n }\n\n .atm-profile-modal {\n padding: 0.25rem;\n }\n\n .atm-profile-content {\n max-width: 98%;\n max-height: calc(100vh - 0.5rem);\n }\n\n .atm-profile-body {\n padding: 12px;\n }\n\n .atm-tab {\n padding: 8px 6px;\n font-size: 11px;\n flex-direction: column;\n gap: 2px;\n }\n\n .atm-profile-avatar-large {\n width: 50px;\n height: 50px;\n font-size: 18px;\n }\n\n .atm-email-item {\n padding: 8px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAuth } from '../composables/useAuth'\nimport SignInButton from './Buttons/SignInButton.vue'\nimport SignUpButton from './Buttons/SignUpButton.vue'\nimport UserProfile from './UserProfile.vue'\n\nconst { user } = useAuth()\n</script>\n\n<template>\n <div>\n <UserProfile v-if=\"user?.id\" />\n\n <template v-else>\n <div class=\"atm-auth-buttons\">\n <SignInButton />\n <SignUpButton />\n </div>\n </template>\n </div>\n</template>\n\n<style scoped>\n.atm-auth-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n}\n\n@media (max-width: 768px) {\n .atm-auth-buttons {\n gap: 14px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-auth-buttons {\n gap: 12px;\n flex-direction: column;\n }\n}\n\n@media (max-width: 360px) {\n .atm-auth-buttons {\n gap: 10px;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useAuth } from '../../composables/useAuth'\nimport { useAtm } from '../../composables/useAtm'\nimport { computed } from 'vue'\n\nconst { logout, user } = useAuth()\nconst { configurations } = useAtm()\n\nconst atmPrimaryColor = computed(() => configurations.value?.design?.primaryColor)\n</script>\n\n<template>\n <button v-if=\"user\" @click=\"logout()\" class=\"atm-logout-btn\">\n Sair\n </button>\n</template>\n\n<style scoped>\n.atm-logout-btn {\n padding: 12px;\n margin-top: 8px;\n background: v-bind('atmPrimaryColor');\n color: #FFF;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: opacity 0.2s;\n min-height: 44px;\n}\n\n.atm-logout-btn:hover {\n opacity: 0.9;\n}\n\n@media (max-width: 768px) {\n .atm-logout-btn {\n padding: 11px;\n font-size: 13px;\n min-height: 42px;\n }\n}\n\n@media (max-width: 480px) {\n .atm-logout-btn {\n padding: 10px;\n font-size: 13px;\n min-height: 40px;\n }\n}\n\n@media (max-width: 360px) {\n .atm-logout-btn {\n padding: 9px;\n font-size: 12px;\n min-height: 38px;\n }\n}\n</style>","<script lang=\"ts\" setup>\nimport { useAtm } from '../../composables/useAtm'\n\nconst { isSignedIn } = useAtm()\n</script>\n\n<template>\n <div v-if=\"isSignedIn\">\n <slot/>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useAtm } from '../../composables/useAtm'\n\nconst { isLoaded, isSignedIn } = useAtm()\n</script>\n\n<template>\n <div v-if=\"isLoaded && ! isSignedIn\">\n <slot/>\n </div>\n</template>\n","import type { Ref } from 'vue'\nimport type { AtmClient } from '@autenticar-me/client-js'\n\nexport const fetchConfigurations = async (client: Ref<AtmClient>, configurations: Ref): Promise<void> => {\n const response = await client.value.project().configurations() as any\n\n configurations.value = {\n project: {\n name: response.project.name,\n domain: response.project.domain,\n },\n design: {\n primaryColor: response.design.primary_color,\n secondaryColor: response.design.secondary_color,\n },\n username: {\n enable: response.username.enable,\n length: {\n min: response.username.length.min,\n max: response.username.length.max,\n },\n },\n password: {\n enable: response.password.enable,\n },\n firstName: {\n required: response.first_name.required,\n },\n lastName: {\n required: response.last_name.required,\n },\n register: {\n enable: response.register.enable,\n },\n }\n}\n","import { computed, ref, type Plugin } from 'vue';\nimport type { User } from './types/user.type';\nimport { AtmClient } from '@autenticar-me/client-js';\nimport { fetchUser } from './utils/fetch-user';\nimport type { Configurations } from './types/configurations.type';\nimport { fetchConfigurations } from './utils/fetch-configurations';\n\nexport type PluginOptions = {\n domain: string;\n publicKey: string;\n}\n\nexport const atmPlugin: Plugin<[PluginOptions]> = {\n install(app, pluginOptions) {\n const atmClient = new AtmClient({\n domain: pluginOptions.domain,\n publicKey: pluginOptions.publicKey,\n ssl: false,\n })\n\n const client = ref<AtmClient>(atmClient)\n\n const user = ref<undefined | null | User>(null)\n\n const configurations = ref<undefined | null | Configurations>(null)\n\n const isSignedIn = computed(() => user.value !== undefined && user.value !== null)\n const isLoaded = ref(false)\n\n Promise.all([\n fetchUser(client as any, user),\n fetchConfigurations(client as any, configurations)\n ])\n .then(() => isLoaded.value = true)\n\n app.provide('atm', {\n client,\n user,\n configurations,\n isSignedIn,\n isLoaded,\n })\n }\n}\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","_renderSlot","_unref","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_vModelText","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_Fragment","_renderList","_hoisted_20","_hoisted_21","_hoisted_24","_hoisted_27","_hoisted_28","_createBlock","_Teleport","_createVNode","_Transition","_normalizeClass","_hoisted_9","_hoisted_19","_hoisted_22","_hoisted_25","_hoisted_26","SignInModal","SignUpModal","_normalizeStyle","UserProfile"],"mappings":"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"}
|