@strands.gg/accui 0.2.13 → 0.2.14

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.
Files changed (48) hide show
  1. package/dist/accui.css +1 -1
  2. package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js +1 -1
  3. package/dist/nuxt/runtime/composables/useStrandsAuth.es.js +1 -1
  4. package/dist/nuxt/runtime/plugin.client.cjs.js +1 -1
  5. package/dist/nuxt/runtime/plugin.client.es.js +1 -1
  6. package/dist/nuxt/runtime/plugin.server.cjs.js +1 -1
  7. package/dist/nuxt/runtime/plugin.server.es.js +1 -1
  8. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
  9. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +1 -1
  10. package/dist/nuxt-v4/runtime/plugin.client.cjs.js +1 -1
  11. package/dist/nuxt-v4/runtime/plugin.client.es.js +1 -1
  12. package/dist/nuxt-v4/runtime/plugin.server.cjs.js +1 -1
  13. package/dist/nuxt-v4/runtime/plugin.server.es.js +1 -1
  14. package/dist/strands-auth-ui.cjs.js +5 -2
  15. package/dist/strands-auth-ui.cjs.js.map +1 -1
  16. package/dist/strands-auth-ui.es.js +3348 -1626
  17. package/dist/strands-auth-ui.es.js.map +1 -1
  18. package/dist/types/index.d.ts +30 -0
  19. package/dist/types/index.d.ts.map +1 -1
  20. package/dist/{useStrandsAuth-CJsQ5cew.cjs → useStrandsAuth-DE3JScoq.cjs} +2 -2
  21. package/dist/{useStrandsAuth-CJsQ5cew.cjs.map → useStrandsAuth-DE3JScoq.cjs.map} +1 -1
  22. package/dist/{useStrandsAuth-OsoGbmZh.js → useStrandsAuth-DVIEH9Nm.js} +2 -2
  23. package/dist/{useStrandsAuth-OsoGbmZh.js.map → useStrandsAuth-DVIEH9Nm.js.map} +1 -1
  24. package/dist/useStrandsConfig-BIACvByo.cjs +2 -0
  25. package/dist/useStrandsConfig-BIACvByo.cjs.map +1 -0
  26. package/dist/useStrandsConfig-DK37s9ZC.js +120 -0
  27. package/dist/useStrandsConfig-DK37s9ZC.js.map +1 -0
  28. package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts +12 -0
  29. package/dist/vue/components/StrandsBackupCodesModal.vue.d.ts.map +1 -0
  30. package/dist/vue/components/StrandsConfirmModal.vue.d.ts +22 -0
  31. package/dist/vue/components/StrandsConfirmModal.vue.d.ts.map +1 -0
  32. package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts +12 -0
  33. package/dist/vue/components/StrandsEmailMfaSetupModal.vue.d.ts.map +1 -0
  34. package/dist/vue/components/StrandsMfaModal.vue.d.ts +12 -0
  35. package/dist/vue/components/StrandsMfaModal.vue.d.ts.map +1 -0
  36. package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts +12 -0
  37. package/dist/vue/components/StrandsTotpSetupModal.vue.d.ts.map +1 -0
  38. package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
  39. package/dist/vue/components/index.d.ts +5 -0
  40. package/dist/vue/components/index.d.ts.map +1 -1
  41. package/dist/vue/composables/useStrandsConfig.d.ts.map +1 -1
  42. package/dist/vue/composables/useStrandsMfa.d.ts +37 -0
  43. package/dist/vue/composables/useStrandsMfa.d.ts.map +1 -0
  44. package/package.json +1 -1
  45. package/dist/useStrandsConfig-BDUymyIP.cjs +0 -2
  46. package/dist/useStrandsConfig-BDUymyIP.cjs.map +0 -1
  47. package/dist/useStrandsConfig-DMkkLRCA.js +0 -102
  48. package/dist/useStrandsConfig-DMkkLRCA.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"strands-auth-ui.cjs.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/strands_icon_path.svg?raw","../../../apps/accounts-ui/src/vue/ui/UiLoader.vue","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/vue/plugins/StrandsUIPlugin.ts","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 text-black rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n\n<style scoped>\n/* \n BITWARDEN & PASSWORD MANAGER STYLE PREVENTION\n =============================================\n \n These styles use !important to prevent password managers (Bitwarden, 1Password, etc.)\n from overriding our input styling. Password managers often inject their own CSS that\n can break our design system.\n \n If you need to modify input styles, edit these CSS rules rather than just the Tailwind\n classes, as password managers may override the Tailwind classes.\n*/\n\n/* Base input styles - override password manager modifications */\ninput[type=\"email\"],\ninput[type=\"password\"],\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"tel\"],\ninput[type=\"url\"] {\n /* Force our styles to take precedence over password manager modifications */\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important; /* gray-300 */\n border-radius: 0.5rem !important; /* rounded-lg */\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important; /* shadow-sm */\n color: black !important;\n font-family: inherit !important;\n font-size: 0.875rem !important; /* text-sm */\n line-height: 1.25rem !important;\n padding: 0.625rem 0.75rem !important; /* py-2.5 px-3 */\n transition: border-color 0.2s, box-shadow 0.2s !important;\n}\n\n/* Focus state overrides */\ninput[type=\"email\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus {\n border-color: rgb(234 0 168) !important; /* strands-500 */\n box-shadow: 0 0 0 3px rgb(234 0 168 / 0.1) !important; /* strands-500 with opacity */\n outline: none !important;\n}\n\n/* Error state overrides */\ninput.border-red-300 {\n border-color: rgb(252 165 165) !important; /* red-300 */\n}\n\ninput.border-red-300:focus {\n border-color: rgb(239 68 68) !important; /* red-500 */\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.1) !important; /* red-500 with opacity */\n}\n\n/* Disabled state overrides */\ninput:disabled {\n background-color: rgb(249 250 251) !important; /* gray-50 */\n color: rgb(107 114 128) !important; /* gray-500 */\n cursor: not-allowed !important;\n}\n\n/* Bitwarden and other password manager specific overrides */\ninput[data-bwautofill],\ninput[data-lpignore],\ninput[data-form-type],\ninput[data-1p-ignore] {\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important;\n}\n\n/* Override webkit autofill styling */\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px white inset !important;\n -webkit-text-fill-color: black !important;\n border: 1px solid rgb(209 213 219) !important;\n border-radius: 0.5rem !important;\n transition: background-color 5000s ease-in-out 0s !important;\n}\n\n/* Ensure password inputs have proper padding for our eye icon */\ninput[type=\"password\"] {\n padding-right: 2.5rem !important; /* pr-10 for our eye icon */\n}\n\n/* Hide browser password reveal buttons */\ninput::-ms-reveal,\ninput::-ms-clear {\n display: none !important;\n}\n\n/* Additional size-specific overrides to maintain consistency */\ninput.px-3.py-2 {\n padding: 0.5rem 0.75rem !important; /* sm size */\n}\n\ninput.px-3.py-2\\.5 {\n padding: 0.625rem 0.75rem !important; /* md size - default */\n}\n\ninput.px-4.py-3 {\n padding: 0.75rem 1rem !important; /* lg size */\n}\n\n/* Icon padding overrides */\ninput.pl-10 {\n padding-left: 2.5rem !important;\n}\n\ninput.pr-10 {\n padding-right: 2.5rem !important;\n}\n</style>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"<svg width=\\\"302\\\" height=\\\"438\\\" viewBox=\\\"0 0 302 438\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M71.5001 96C71.5001 96 132 106 137 61.5C142 17 117.5 3.50005 94.5001 1.50003C71.5001 -0.499996 16.0001 8.5 2.00014 72.5C-6.5 130.5 71.5003 227.5 165 218C258.5 208.5 280.758 148.5 283.5 121C286.242 93.5 277.5 61.5 238.5 61.5C153 61.5 150.501 185 170.5 235C190.5 285 199 279 213 314C227.001 349 217.296 411.458 183 427C129.456 450.65 92 426 78.5 407.5C65 389 68.0003 357 94.5001 344.5C121 332 212.41 393.5 301.5 361\\\" stroke=\\\"black\\\"/>\\n</svg>\\n\"","<template>\n <div :class=\"containerClasses\">\n <div class=\"relative\">\n <!-- Simple SVG with fun animated path -->\n <svg :width=\"size\" :height=\"size\" viewBox=\"0 0 500 500\">\n <!-- Fun wavy path inspired by Strands -->\n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"semiColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n \n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"solidColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"animate-draw-line\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n </svg>\n </div>\n \n <!-- Optional text -->\n <p v-if=\"text\" :class=\"textClasses\">{{ text }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport logo from '../../../assets/strands_icon_path.svg?raw'\n\nconst path = logo.replace(/<svg[^>]*>/, '').replace(/<\\/svg>/, '').trim()\nconst d = path.match(/d=\"([^\"]*)\"/)?.[1] || ''\n\ninterface Props {\n size?: number\n variant?: 'light' | 'dark' | 'auto'\n text?: string\n centered?: boolean\n weight?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 80,\n variant: 'auto',\n centered: true,\n weight: 30,\n});\n\nconst containerClasses = computed(() => [\n 'flex flex-col items-center gap-4',\n props.centered ? 'justify-center' : '',\n].filter(Boolean).join(' '))\n\nconst textClasses = computed(() => [\n 'text-sm font-medium',\n props.variant === 'light' \n ? 'text-gray-600' \n : props.variant === 'dark'\n ? 'text-gray-300'\n : 'text-gray-600 dark:text-gray-300'\n].filter(Boolean).join(' '))\n\nconst semiColor = computed(() => \n props.variant === 'light' ? '#EA00A810'\n : props.variant === 'dark' ? '#ffffff10'\n : '#ffffff10'\n)\n\nconst solidColor = computed(() => \n props.variant === 'light' ? '#EA00A8'\n : props.variant === 'dark' ? '#ffffff'\n : '#ffffff'\n)\n</script>\n\n<style scoped>\n@keyframes draw-line {\n 0% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: 1000;\n }\n 100% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: -100;\n }\n}\n\n.animate-draw-line {\n animation: draw-line .8s linear infinite;\n}\n</style>","<template>\n <div v-if=\"shouldShowSecuredBy\" class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\n\n// Get configuration\nconst { config } = useStrandsConfig(props.config)\n\n// Hide \"Secured by\" logo when using Strands' own domain\nconst shouldShowSecuredBy = computed(() => {\n const baseUrl = config.value.baseUrl\n return baseUrl !== 'https://accounts.strands.gg'\n})\n</script>","export default \"data:image/png;base64,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\"","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n icon?: string\n iconUrl?: string\n auth_url: string\n scopes: string[]\n enabled: boolean\n metadata?: Record<string, string>\n}\n\nexport interface OAuthProvidersResponse {\n providers: OAuthProvider[]\n redirect_url: string\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const url = getUrl('oauthProviders')\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n // The API returns { providers: [...], redirect_url: \"...\" }\n providers.value = result.providers || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n // Find the provider and use its auth_url directly\n const provider = providers.value.find(p => p.id === providerId)\n if (!provider) {\n throw new Error(`OAuth provider '${providerId}' not found`)\n }\n \n if (!provider.auth_url) {\n throw new Error(`No auth URL configured for provider '${providerId}'`)\n }\n \n window.location.href = provider.auth_url\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset\" class=\"mb-8\">\n <StrandsUiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </StrandsUiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div>\n <!-- Email -->\n <div :class=\"['email-field-spacing', (!isPasswordReset && !isSignUp) ? 'has-password' : 'no-password']\">\n <StrandsUiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n </div>\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"password-fade\">\n <div v-if=\"!isPasswordReset && !isSignUp\" class=\"mb-4\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <StrandsUiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <StrandsUiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <StrandsUiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\">\n <div v-if=\"isPasswordReset\" class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Need help -->\n <Transition name=\"support-fade\">\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </Transition>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink, StrandsUiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\nconsole.log('support email:', getSupportEmail())\n\n// Authentication state management\nconst { setAuthData } = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string): Promise<AuthResponse> {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result: AuthResponse = await response.json()\n return result\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n \n return result.message\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n \n // Store the authentication data (tokens + user info)\n setAuthData(response)\n \n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Simple fade transition - gentle and smooth */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 350ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Modern height-fade transition using interpolate-size for smooth height: auto */\n.height-fade-enter-active,\n.height-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support */\n@supports (interpolate-size: allow-keywords) {\n .height-fade-enter-active,\n .height-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n max-height: 300px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Support block transition - gentle fade with subtle scale */\n.support-fade-enter-active,\n.support-fade-leave-active {\n transition: all 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.support-fade-enter-from {\n opacity: 0;\n transform: scale(0.97) translateY(8px);\n}\n\n.support-fade-leave-to {\n opacity: 0;\n transform: scale(0.99) translateY(-4px);\n}\n\n.support-fade-enter-to,\n.support-fade-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Expand transition - for alerts using modern height animation */\n.expand-enter-active,\n.expand-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for expand */\n@supports (interpolate-size: allow-keywords) {\n .expand-enter-active,\n .expand-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for expand in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n max-height: 150px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Loading pulse animation */\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n/* Slide up animation for main container - elegant entrance */\n@keyframes slide-up {\n from {\n opacity: 0;\n transform: translateY(24px) scale(0.96);\n filter: blur(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n filter: blur(0px);\n }\n}\n\n.animate-slide-up {\n animation: slide-up 600ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Fade in animation for alerts - gentle appearance */\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: scale(0.97) translateY(6px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.animate-fade-in {\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Email field spacing animation */\n.email-field-spacing {\n transition: margin-bottom 500ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.email-field-spacing.has-password {\n margin-bottom: 1rem; /* mb-4 equivalent */\n}\n\n.email-field-spacing.no-password {\n margin-bottom: 0;\n}\n\n/* Password field transition - optimized for form layout */\n.password-fade-enter-active,\n.password-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for password field */\n@supports (interpolate-size: allow-keywords) {\n .password-fade-enter-active,\n .password-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for password field in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n max-height: 120px;\n transform: scale(1) translateY(0);\n }\n}\n</style>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <StrandsUiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </StrandsUiLink>\n </div>\n <StrandsUiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <StrandsUiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { setAuthData } = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Call the sign-in API endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email,\n password: form.password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Store the authentication data (tokens + user info)\n setAuthData(authData)\n \n // Emit success with user data\n emit('success', authData.user)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Sign in failed'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <!-- Success State -->\n <StrandsUiCard v-if=\"signupSuccess\" variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">📧</div>\n <h1 class=\"text-2xl font-bold text-gray-900 mb-2\">{{ successTitle }}</h1>\n <p class=\"text-gray-600 mb-4\">{{ successMessage }}</p>\n <div v-if=\"successEmail\" class=\"text-sm text-gray-500 mb-4\">\n <strong>{{ successEmail }}</strong>\n </div>\n <p class=\"text-sm text-gray-500 mb-6\">\n Click the link in your email to complete your account setup. The link will expire in 24 hours.\n </p>\n <StrandsUiButton\n variant=\"outline\"\n full-width\n @click=\"resetToForm\"\n >\n Send Another Link\n </StrandsUiButton>\n </div>\n </StrandsUiCard>\n\n <!-- Signup Form -->\n <StrandsUiCard v-else variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <StrandsUiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\nconst signupSuccess = ref(false)\nconst successMessage = ref('')\nconst successTitle = ref('Magic Link Sent!')\nconst successEmail = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n const signUpUrl = getUrl('signUp')\n console.log('Attempting sign up to URL:', signUpUrl)\n \n const response = await fetch(signUpUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email\n }),\n })\n\n if (process.env['NODE_ENV'] === 'development') {\n console.log('Sign up response status:', response.status)\n }\n\n if (!response.ok) {\n let errorMessage = `Sign up failed (${response.status})`\n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch {\n const errorText = await response.text()\n errorMessage = errorText || errorMessage\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n console.log('Magic link sign up success:', result)\n \n // Handle success state internally\n signupSuccess.value = true\n successEmail.value = form.email\n successMessage.value = result.message || 'Magic link sent! Check your email.'\n \n // Set appropriate title based on message content\n if (result.message) {\n if (result.message.includes('already have an account') || result.message.includes('Welcome back')) {\n successTitle.value = 'Welcome Back!'\n } else if (result.message.includes('Magic link sent') || result.message.includes('Check your email')) {\n successTitle.value = 'Magic Link Sent!'\n } else {\n successTitle.value = 'Success!'\n }\n }\n \n // Still emit for any parent that might need it\n emit('success', {\n email: form.email,\n message: result.message || 'Magic link sent! Check your email.'\n })\n } catch (err) {\n console.error('Sign up error:', err)\n \n let errorMessage = 'Unable to send magic link. Please try again.'\n \n if (err instanceof Error) {\n if (err.message.includes('fetch')) {\n errorMessage = 'Unable to connect to authentication service. Please check your internet connection and try again.'\n } else if (err.message.includes('CORS')) {\n const supportEmail = getSupportEmail()\n errorMessage = supportEmail \n ? `Authentication service configuration error. Please contact ${supportEmail}.`\n : 'Authentication service configuration error.'\n } else {\n errorMessage = err.message\n }\n }\n \n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst resetToForm = () => {\n signupSuccess.value = false\n successMessage.value = ''\n successTitle.value = 'Magic Link Sent!'\n successEmail.value = ''\n form.email = ''\n error.value = ''\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">🎉</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome to Strands!</h1>\n <p class=\"text-neutral-600 mb-4\">\n Your account has been created successfully.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n You are now signed in and can access your dashboard.\n </p>\n <StrandsUiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-red-500 text-6xl mb-4\">❌</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Invalid Link</h1>\n <p class=\"text-neutral-600 mb-4\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n Please request a new magic link to complete your registration.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Complete Your Registration</h1>\n <p class=\"text-neutral-600\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"mt-2\">\n <p class=\"text-sm text-neutral-500\">Creating account for: <span class=\"font-medium text-neutral-700\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"space-y-6\">\n <!-- Username -->\n <div>\n <StrandsUiInput\n id=\"username\"\n v-model=\"form.username\"\n type=\"text\"\n label=\"Username\"\n placeholder=\"Choose a username\"\n autocomplete=\"username\"\n required\n :error=\"fieldErrors.username\"\n />\n </div>\n\n <!-- First Name -->\n <div>\n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <StrandsUiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"mt-2 text-xs text-neutral-500\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"mt-6 animate-fade-in\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-yellow-500 text-6xl mb-4\">⚠️</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Missing Token</h1>\n <p class=\"text-neutral-600 mb-4\">\n No registration token was provided.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Auth composable for token storage\nconst { setAuthData } = useStrandsAuth()\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.username.trim() && form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n// Watch for username requirements\nwatch(\n () => form.username,\n (username) => {\n if (username && username.length < 2) {\n fieldErrors.username = 'Username must be at least 2 characters long'\n } else {\n fieldErrors.username = ''\n }\n }\n)\n\n// Auth configuration\nconst authConfig = computed(() => ({\n baseUrl: props.config?.baseUrl || 'http://localhost:8000',\n referrerUrl: props.redirectUrl || 'http://localhost:3001'\n}))\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (authConfig.value.referrerUrl) {\n console.log('Redirecting to referrer:', authConfig.value.referrerUrl)\n window.location.href = authConfig.value.referrerUrl\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(`${authConfig.value.baseUrl}/api/v1/auth/complete-registration`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n username: form.username,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result: AuthResponse = await response.json()\n console.log('Registration success:', result)\n \n // Store authentication data if tokens are present\n if (result.access_token && result.refresh_token && result.user) {\n setAuthData(result)\n console.log('Auth tokens stored successfully for user:', result.user.email)\n } else {\n console.warn('Registration response missing auth tokens or user data')\n }\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-xl max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-gray-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div \n v-if=\"currentUser?.avatar\"\n class=\"w-24 h-24 rounded-full shadow-large overflow-hidden\"\n >\n <img \n :src=\"currentUser.avatar\" \n :alt=\"`${currentUser.firstName} ${currentUser.lastName}`\"\n class=\"w-full h-full object-cover\"\n />\n </div>\n <div \n v-else\n class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\"\n >\n {{ getInitials(currentUser?.firstName, currentUser?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"triggerFileUpload\"\n :disabled=\"uploading\"\n >\n <StrandsUiLoader v-if=\"uploading\" :size=\"24\" variant=\"dark\" />\n <svg v-else class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200 disabled:opacity-50\"\n @click=\"triggerFileUpload\"\n :disabled=\"uploading\"\n >\n {{ uploading ? 'Uploading...' : 'Change photo' }}\n </button>\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden\"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Personal Information</h3>\n \n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.firstName\"\n />\n\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.lastName\"\n />\n\n <!-- Email Change Section -->\n <div class=\"space-y-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Email Address</h4>\n <p class=\"text-sm text-gray-600\">{{ currentUser?.email }}</p>\n <p v-if=\"!currentUser?.emailVerified\" class=\"text-sm text-amber-600 font-medium\">⚠️ Email not verified</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showEmailChange = !showEmailChange\"\n >\n {{ showEmailChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showEmailChange\" class=\"space-y-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"emailChangeForm.newEmail\"\n type=\"email\"\n placeholder=\"New email address\"\n autocomplete=\"email\"\n :error=\"emailChangeForm.errors.newEmail\"\n />\n <StrandsUiInput\n v-model=\"emailChangeForm.password\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n :error=\"emailChangeForm.errors.password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleEmailChange\"\n :disabled=\"!isEmailChangeFormValid || emailChangeLoading\"\n >\n {{ emailChangeLoading ? 'Updating...' : 'Update Email' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Password</h4>\n <p class=\"text-sm text-gray-600\">Last updated {{ passwordLastUpdated }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showPasswordChange\" class=\"space-y-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-gray-600\">\n {{ currentUser?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <StrandsUiButton\n :variant=\"currentUser?.mfaEnabled ? 'secondary' : 'primary'\"\n size=\"sm\"\n @click=\"handleMFAToggle\"\n >\n {{ currentUser?.mfaEnabled ? 'Disable' : 'Enable' }}\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Active Sessions</h4>\n <p class=\"text-sm text-gray-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"$emit('manage-sessions')\"\n disabled\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons - Only show when changes are made -->\n <div v-if=\"hasChanges\" class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-gray-200 animate-slide-up\">\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ loading ? 'Saving changes...' : 'Save changes' }}\n </StrandsUiButton>\n\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-gray-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLink, StrandsUiLoader } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { User } from '../../types'\n\ninterface Props {\n user?: User\n config?: StrandsAuthConfig\n autoFetch?: boolean // Whether to automatically fetch user profile on mount\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n autoFetch: true\n})\nconst emit = defineEmits<Emits>()\n\n// Get configuration and authentication \nconst { getSupportEmail, config: strandsConfig, getUrl } = useStrandsConfig(props.config)\nconst { fetchProfile, updateProfile, changeEmail, currentUser: authUser, currentSession, isAuthenticated, refreshToken } = useStrandsAuth()\n\n// Internal user state\nconst internalUser = ref<User | null>(null)\nconst fetchingProfile = ref(false)\n\n// Use authenticated user from composable, fallback to prop, then internal state\nconst currentUser = computed(() => {\n const user = authUser.value || props.user || internalUser.value\n console.log('Current user computed:', {\n hasAuthUser: !!authUser.value,\n hasPropUser: !!props.user,\n hasInternalUser: !!internalUser.value,\n selectedUser: user,\n avatar: user?.avatar\n })\n return user\n})\n\nconst loading = ref(false)\nconst uploading = ref(false)\nconst showPasswordChange = ref(false)\nconst showEmailChange = ref(false)\nconst emailChangeLoading = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([])\nconst fileInputRef = ref<HTMLInputElement | null>(null)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst emailChangeForm = reactive({\n newEmail: '',\n password: '',\n errors: {\n newEmail: '',\n password: ''\n }\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst hasChanges = computed(() => {\n const user = currentUser.value\n if (!user) return false\n return (\n form.firstName !== (user.firstName || '') ||\n form.lastName !== (user.lastName || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst isEmailChangeFormValid = computed(() => {\n return (\n emailChangeForm.newEmail &&\n emailChangeForm.password &&\n emailChangeForm.newEmail !== currentUser.value?.email &&\n emailChangeForm.newEmail.includes('@')\n )\n})\n\nconst passwordLastUpdated = computed(() => {\n const user = currentUser.value\n if (!user) return 'Never'\n \n // Use passwordUpdatedAt if available, otherwise fall back to createdAt\n const updateDate = user.passwordUpdatedAt || user.createdAt\n if (!updateDate) return 'Never'\n \n const date = new Date(updateDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n if (diffDays < 365) {\n const months = Math.floor(diffDays / 30)\n return months === 1 ? '1 month ago' : `${months} months ago`\n }\n const years = Math.floor(diffDays / 365)\n return years === 1 ? '1 year ago' : `${years} years ago`\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Fetch user profile from API\nconst fetchUserProfile = async () => {\n if (!props.autoFetch || props.user || !isAuthenticated.value) return // Skip if disabled, user prop provided, or not authenticated\n \n fetchingProfile.value = true\n try {\n await fetchProfile()\n // The fetchProfile from composable will update authUser, so currentUser computed will reflect the change\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Failed to load profile'\n errorMessage.value = errorMsg\n emit('error', errorMsg)\n } finally {\n fetchingProfile.value = false\n }\n}\n\n// Initialize form with user data\nwatch(() => currentUser.value, (user) => {\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email // Keep for display but not for editing\n }\n}, { immediate: true })\n\n// Fetch profile on mount if needed\nonMounted(() => {\n fetchUserProfile()\n})\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n const updatedUser = await updateProfile({\n firstName: form.firstName,\n lastName: form.lastName,\n })\n \n if (updatedUser) {\n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update profile'\n errorMessage.value = error\n emit('error', error)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleEmailChange = async () => {\n if (!isEmailChangeFormValid.value) return\n\n // Clear previous errors\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n clearMessages()\n emailChangeLoading.value = true\n\n try {\n const result = await changeEmail(emailChangeForm.newEmail, emailChangeForm.password)\n \n successMessage.value = result.message || 'Email updated successfully. Please verify your new email address.'\n showEmailChange.value = false\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update email'\n \n // Try to parse specific field errors\n if (error.includes('password')) {\n emailChangeForm.errors.password = 'Invalid password'\n } else if (error.includes('email')) {\n emailChangeForm.errors.newEmail = error\n } else {\n errorMessage.value = error\n }\n \n emit('error', error)\n } finally {\n emailChangeLoading.value = false\n }\n}\n\nconst triggerFileUpload = () => {\n if (uploading.value) return\n fileInputRef.value?.click()\n}\n\nconst handleFileSelect = async (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n \n if (!file) return\n \n // Validate file type\n if (!file.type.startsWith('image/')) {\n errorMessage.value = 'Please select an image file'\n return\n }\n \n // Validate file size (5MB limit)\n const maxSize = 5 * 1024 * 1024\n if (file.size > maxSize) {\n errorMessage.value = 'File size must be less than 5MB'\n return\n }\n \n await uploadAvatar(file)\n}\n\nconst uploadAvatar = async (file: File) => {\n uploading.value = true\n clearMessages()\n \n try {\n // Check if we have an access token\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available. Please sign in again.')\n }\n \n // Create form data\n const formData = new FormData()\n formData.append('avatar', file)\n \n // Upload to API endpoint\n const response = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!response.ok) {\n // Handle authentication errors\n if (response.status === 401) {\n // Try to refresh token and retry once\n try {\n console.log('Access token expired, attempting to refresh...')\n const refreshed = await refreshToken()\n if (refreshed && currentSession.value?.accessToken) {\n console.log('Token refreshed successfully, retrying avatar upload...')\n // Retry the upload with new token\n const retryResponse = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!retryResponse.ok) {\n const errorData = await retryResponse.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${retryResponse.status} ${retryResponse.statusText}`)\n }\n \n // Use the retry response for processing\n const retryResult = await retryResponse.json()\n console.log('Avatar upload retry success:', retryResult)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', retryResult.avatar_url)\n authUser.value.avatar = retryResult.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = retryResult.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload retry')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload retry:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n return\n } else {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } catch (refreshError) {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${response.status} ${response.statusText}`)\n }\n }\n \n const result = await response.json()\n console.log('Avatar upload success:', result)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', result.avatar_url)\n authUser.value.avatar = result.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = result.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n \n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to upload avatar'\n errorMessage.value = error\n emit('error', error)\n } finally {\n uploading.value = false\n // Reset file input\n if (fileInputRef.value) {\n fileInputRef.value.value = ''\n }\n }\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !currentUser.value?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n const user = currentUser.value\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email\n }\n clearMessages()\n showPasswordChange.value = false\n showEmailChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n}\n\n</script>\n\n<style scoped>\n.expand-enter-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px; /* Approximate max height for password form */\n opacity: 1;\n transform: translateY(0);\n}\n</style>\n\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message -->\n <StrandsUiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-6\">\n <!-- QR Code Section -->\n <div class=\"text-center\">\n <div class=\"w-48 h-48 bg-gray-100 rounded-lg mx-auto mb-4 flex items-center justify-center\">\n <div class=\"text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h.01M12 12v4.01\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\">Scan this QR code with your authenticator app</p>\n </div>\n\n <!-- Setup Key -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Setup Key (manual entry)</label>\n <div class=\"p-3 bg-gray-50 rounded border text-sm font-mono break-all\">\n XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX\n </div>\n </div>\n\n <!-- Verification Code Input -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Verification Code</label>\n <input \n type=\"text\" \n placeholder=\"Enter 6-digit code\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-strands-500 focus:border-strands-500\"\n maxlength=\"6\"\n />\n <p class=\"text-xs text-gray-500 mt-1\">Enter the 6-digit code from your authenticator app</p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 pt-4\">\n <button \n type=\"button\"\n class=\"flex-1 bg-strands-500 text-white py-2 px-4 rounded-md hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-colors\"\n >\n Enable 2FA\n </button>\n <button \n type=\"button\"\n class=\"flex-1 bg-gray-200 text-gray-800 py-2 px-4 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors\"\n @click=\"$emit('back')\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'back'): void\n}\n\ndefineEmits<Emits>()\n</script>","<template>\n <div v-if=\"isAuthenticated && !showLoading\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback && !showLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"showLoading\" class=\"animate-fade-in py-8\">\n <slot name=\"loading\">\n <StrandsUiLoader\n :size=\"64\" \n text=\"Checking authentication...\" \n variant=\"auto\" \n :show-particles=\"true\" \n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nwithDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\n// Local loading state to ensure loading shows on first render\nconst isComponentReady = ref(false)\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\n// Show loading until both auth is initialized AND component is ready\nconst showLoading = computed(() => isLoading.value || !isComponentReady.value)\n\nonMounted(() => {\n // Add a small delay to ensure we show loading state\n setTimeout(() => {\n isComponentReady.value = true\n }, 100)\n})\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-fade-in py-8\">\n <slot name=\"loading\">\n <StrandsUiLoader \n :size=\"64\"\n text=\"Checking authentication...\"\n variant=\"auto\"\n :show-particles=\"true\"\n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => h('g', [\n h('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n h('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => h('g', { fill: 'currentColor' }, [\n h('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n h('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n h('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n h('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : h('path', { d: '' })\n})\n</script>\n","import type { App } from 'vue'\n\n// Import all UI components\nimport StrandsUiAlert from '../ui/UiAlert.vue'\nimport StrandsUiButton from '../ui/UiButton.vue'\nimport StrandsUiCard from '../ui/UiCard.vue'\nimport StrandsUiInput from '../ui/UiInput.vue'\nimport StrandsUiLink from '../ui/UiLink.vue'\nimport StrandsUiTabs from '../ui/UiTabs.vue'\nimport StrandsUiLoader from '../ui/UiLoader.vue'\n\n// Global components map\nconst components = {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\nexport interface StrandsUIOptions {\n prefix?: string\n}\n\nexport default {\n install(app: App, options: StrandsUIOptions = {}) {\n const { prefix = '' } = options\n\n // Register all components globally\n Object.entries(components).forEach(([name, component]) => {\n const componentName = prefix ? `${prefix}${name}` : name\n app.component(componentName, component)\n })\n }\n}\n\n// Export individual components for tree-shaking\nexport {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\n// Export types\nexport type {\n ButtonVariant,\n ButtonSize,\n InputType,\n CardVariant,\n LinkVariant,\n AlertVariant,\n} from '../ui/index'","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_hoisted_1","_hoisted_2","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","$setup","_createElementVNode","_hoisted_3","_hoisted_4","$props","_createCommentVNode","_renderSlot","_ctx","_createTextVNode","_hoisted_6","_cache","buttonClasses","sizeClasses","widthClasses","$event","_toDisplayString","cardClasses","paddingClasses","shadowClasses","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","event","target","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","tag","linkProps","baseProps","linkClasses","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","activeTabIndex","modelValue","toRefs","watch","_Fragment","_renderList","_normalizeStyle","logo","path","d","containerClasses","textClasses","semiColor","solidColor","config","useStrandsConfig","shouldShowSecuredBy","_imports_0","useOAuthProviders","options","getUrl","providers","loading","error","enabledProviders","provider","fetchProviders","url","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","p","getProviderById","getProviderIcon","getSupportEmail","setAuthData","useStrandsAuth","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isPasswordMatch","isFormValid","PASSWORD_STRENGTH_CONFIGS","getPasswordStrength","score","handleAuth","handleOAuthAuth","newMode","_hoisted_11","_hoisted_13","_hoisted_15","_hoisted_18","_createVNode","_Transition","_hoisted_12","_withModifiers","_hoisted_14","_hoisted_16","_hoisted_17","authData","signupSuccess","successMessage","successTitle","successEmail","signUpUrl","supportEmail","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_21","registrationComplete","invalidToken","fieldErrors","hasRequiredFields","passwordMinLength","hasValidToken","username","authConfig","parts","payload","redirectToReferrer","key","errorText","strandsConfig","fetchProfile","updateProfile","changeEmail","authUser","currentSession","isAuthenticated","refreshToken","internalUser","fetchingProfile","currentUser","user","uploading","showPasswordChange","showEmailChange","emailChangeLoading","activeSessions","fileInputRef","emailChangeForm","passwordForm","errors","hasChanges","isPasswordFormValid","isEmailChangeFormValid","passwordLastUpdated","updateDate","date","diffMs","diffDays","months","years","getInitials","fetchUserProfile","errorMsg","clearMessages","handleUpdateProfile","updatedUser","handlePasswordChange","resolve","handleEmailChange","triggerFileUpload","handleFileSelect","file","maxSize","uploadAvatar","formData","retryResponse","retryResult","refreshError","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_39","_hoisted_29","_hoisted_30","_hoisted_34","_hoisted_38","isSubmitted","_createStaticVNode","isComponentReady","isLoading","signOut","showLoading","args","provideStrandsConfig","iconClass","viewBox","icons","h","iconComponent","icon","components","StrandsUiAlert","StrandsUiButton","StrandsUiCard","StrandsUiInput","StrandsUiLink","StrandsUiTabs","StrandsUiLoader","StrandsUIPlugin","app","prefix","name","component","componentName","isValidEmail","validatePassword","isValid","strength","isValidName","isRequired","passwordsMatch","confirmation","first","last","formatDate","debounce","func","wait","timeout"],"mappings":"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"}
1
+ {"version":3,"file":"strands-auth-ui.cjs.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/strands_icon_path.svg?raw","../../../apps/accounts-ui/src/vue/ui/UiLoader.vue","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsMfa.ts","../../../apps/accounts-ui/src/vue/components/StrandsTotpSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsEmailMfaSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsBackupCodesModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfirmModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsMfaModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/vue/plugins/StrandsUIPlugin.ts","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button :type=\"type\" :disabled=\"disabled || loading\" :class=\"buttonClasses\" @click=\"$emit('click', $event)\">\n <span v-if=\"loading\" class=\"flex items-center justify-center gap-2\">\n <svg class=\"animate-spin w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"m4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n <span>{{ loadingText || 'Loading...' }}</span>\n </span>\n <span v-else class=\"flex items-center justify-center gap-2\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'primary' | 'secondary' | 'ghost' | 'outline'\n size?: 'sm' | 'md' | 'lg'\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n loading?: boolean\n loadingText?: string\n fullWidth?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n fullWidth: false\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst buttonClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center justify-center font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm rounded-md',\n md: 'px-4 py-2.5 text-sm rounded-lg',\n lg: 'px-6 py-3 text-base rounded-lg'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'bg-strands-500 text-white hover:bg-strands-600 shadow-sm',\n secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',\n ghost: 'text-strands-500 hover:text-strands-600 hover:bg-strands-50',\n outline: 'border border-strands-500 text-strands-500 hover:bg-strands-500 hover:text-white'\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant],\n widthClasses\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"border-b border-gray-200 pb-4 mb-6\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"border-t border-gray-200 pt-4 mt-6\">\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'default' | 'modern' | 'minimal'\n padding?: 'sm' | 'md' | 'lg'\n shadow?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'default',\n padding: 'md',\n shadow: 'sm'\n})\n\nconst cardClasses = computed(() => {\n const baseClasses = ['bg-white border border-gray-200']\n\n // Variant classes\n const variantClasses = {\n default: 'rounded-lg',\n modern: 'rounded-2xl backdrop-blur-lg',\n minimal: 'rounded-md'\n }\n\n // Padding classes\n const paddingClasses = {\n sm: 'p-4',\n md: 'p-6',\n lg: 'p-8'\n }\n\n // Shadow classes\n const shadowClasses = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant],\n paddingClasses[props.padding],\n shadowClasses[props.shadow]\n ].filter(Boolean).join(' ')\n})\n</script>\n","<template>\n <div class=\"space-y-1\">\n <label v-if=\"label\" :for=\"inputId\" class=\"block text-sm font-medium text-gray-700\">\n {{ label }}\n <span v-if=\"required\" class=\"text-red-500\">*</span>\n </label>\n\n <div class=\"relative\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 rounded-md\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21\" />\n </svg>\n <svg v-else class=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </button>\n\n <!-- Icon slot -->\n <div v-if=\"$slots['icon']\" class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"text-sm text-red-600\">{{ error }}</p>\n <p v-else-if=\"helpText\" class=\"text-sm text-gray-500\">{{ helpText }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, useSlots } from 'vue'\n\ninterface Props {\n modelValue?: string | number\n type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url'\n label?: string\n placeholder?: string\n disabled?: boolean\n required?: boolean\n error?: string\n helpText?: string\n autocomplete?: string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n type: 'text',\n size: 'md'\n})\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n blur: [event: FocusEvent]\n focus: [event: FocusEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 text-black rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n\n<style scoped>\n/* \n BITWARDEN & PASSWORD MANAGER STYLE PREVENTION\n =============================================\n \n These styles use !important to prevent password managers (Bitwarden, 1Password, etc.)\n from overriding our input styling. Password managers often inject their own CSS that\n can break our design system.\n \n If you need to modify input styles, edit these CSS rules rather than just the Tailwind\n classes, as password managers may override the Tailwind classes.\n*/\n\n/* Base input styles - override password manager modifications */\ninput[type=\"email\"],\ninput[type=\"password\"],\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"tel\"],\ninput[type=\"url\"] {\n /* Force our styles to take precedence over password manager modifications */\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important; /* gray-300 */\n border-radius: 0.5rem !important; /* rounded-lg */\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important; /* shadow-sm */\n color: black !important;\n font-family: inherit !important;\n font-size: 0.875rem !important; /* text-sm */\n line-height: 1.25rem !important;\n padding: 0.625rem 0.75rem !important; /* py-2.5 px-3 */\n transition: border-color 0.2s, box-shadow 0.2s !important;\n}\n\n/* Focus state overrides */\ninput[type=\"email\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus {\n border-color: rgb(234 0 168) !important; /* strands-500 */\n box-shadow: 0 0 0 3px rgb(234 0 168 / 0.1) !important; /* strands-500 with opacity */\n outline: none !important;\n}\n\n/* Error state overrides */\ninput.border-red-300 {\n border-color: rgb(252 165 165) !important; /* red-300 */\n}\n\ninput.border-red-300:focus {\n border-color: rgb(239 68 68) !important; /* red-500 */\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.1) !important; /* red-500 with opacity */\n}\n\n/* Disabled state overrides */\ninput:disabled {\n background-color: rgb(249 250 251) !important; /* gray-50 */\n color: rgb(107 114 128) !important; /* gray-500 */\n cursor: not-allowed !important;\n}\n\n/* Bitwarden and other password manager specific overrides */\ninput[data-bwautofill],\ninput[data-lpignore],\ninput[data-form-type],\ninput[data-1p-ignore] {\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important;\n}\n\n/* Override webkit autofill styling */\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px white inset !important;\n -webkit-text-fill-color: black !important;\n border: 1px solid rgb(209 213 219) !important;\n border-radius: 0.5rem !important;\n transition: background-color 5000s ease-in-out 0s !important;\n}\n\n/* Ensure password inputs have proper padding for our eye icon */\ninput[type=\"password\"] {\n padding-right: 2.5rem !important; /* pr-10 for our eye icon */\n}\n\n/* Hide browser password reveal buttons */\ninput::-ms-reveal,\ninput::-ms-clear {\n display: none !important;\n}\n\n/* Additional size-specific overrides to maintain consistency */\ninput.px-3.py-2 {\n padding: 0.5rem 0.75rem !important; /* sm size */\n}\n\ninput.px-3.py-2\\.5 {\n padding: 0.625rem 0.75rem !important; /* md size - default */\n}\n\ninput.px-4.py-3 {\n padding: 0.75rem 1rem !important; /* lg size */\n}\n\n/* Icon padding overrides */\ninput.pl-10 {\n padding-left: 2.5rem !important;\n}\n\ninput.pr-10 {\n padding-right: 2.5rem !important;\n}\n</style>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"<svg width=\\\"302\\\" height=\\\"438\\\" viewBox=\\\"0 0 302 438\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M71.5001 96C71.5001 96 132 106 137 61.5C142 17 117.5 3.50005 94.5001 1.50003C71.5001 -0.499996 16.0001 8.5 2.00014 72.5C-6.5 130.5 71.5003 227.5 165 218C258.5 208.5 280.758 148.5 283.5 121C286.242 93.5 277.5 61.5 238.5 61.5C153 61.5 150.501 185 170.5 235C190.5 285 199 279 213 314C227.001 349 217.296 411.458 183 427C129.456 450.65 92 426 78.5 407.5C65 389 68.0003 357 94.5001 344.5C121 332 212.41 393.5 301.5 361\\\" stroke=\\\"black\\\"/>\\n</svg>\\n\"","<template>\n <div :class=\"containerClasses\">\n <div class=\"relative\">\n <!-- Simple SVG with fun animated path -->\n <svg :width=\"size\" :height=\"size\" viewBox=\"0 0 500 500\">\n <!-- Fun wavy path inspired by Strands -->\n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"semiColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n \n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"solidColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"animate-draw-line\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n </svg>\n </div>\n \n <!-- Optional text -->\n <p v-if=\"text\" :class=\"textClasses\">{{ text }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport logo from '../../../assets/strands_icon_path.svg?raw'\n\nconst path = logo.replace(/<svg[^>]*>/, '').replace(/<\\/svg>/, '').trim()\nconst d = path.match(/d=\"([^\"]*)\"/)?.[1] || ''\n\ninterface Props {\n size?: number\n variant?: 'light' | 'dark' | 'auto'\n text?: string\n centered?: boolean\n weight?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 80,\n variant: 'auto',\n centered: true,\n weight: 30,\n});\n\nconst containerClasses = computed(() => [\n 'flex flex-col items-center gap-4',\n props.centered ? 'justify-center' : '',\n].filter(Boolean).join(' '))\n\nconst textClasses = computed(() => [\n 'text-sm font-medium',\n props.variant === 'light' \n ? 'text-gray-600' \n : props.variant === 'dark'\n ? 'text-gray-300'\n : 'text-gray-600 dark:text-gray-300'\n].filter(Boolean).join(' '))\n\nconst semiColor = computed(() => \n props.variant === 'light' ? '#EA00A810'\n : props.variant === 'dark' ? '#ffffff10'\n : '#ffffff10'\n)\n\nconst solidColor = computed(() => \n props.variant === 'light' ? '#EA00A8'\n : props.variant === 'dark' ? '#ffffff'\n : '#ffffff'\n)\n</script>\n\n<style scoped>\n@keyframes draw-line {\n 0% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: 1000;\n }\n 100% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: -100;\n }\n}\n\n.animate-draw-line {\n animation: draw-line .8s linear infinite;\n}\n</style>","<template>\n <div v-if=\"shouldShowSecuredBy\" class=\"flex items-center justify-center gap-2 mt-4 -mb-4 pt-4 border-t border-neutral-200\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-12 w-auto\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\n\n// Get configuration\nconst { config } = useStrandsConfig(props.config)\n\n// Hide \"Secured by\" logo when using Strands' own domain\nconst shouldShowSecuredBy = computed(() => {\n const baseUrl = config.value.baseUrl\n return baseUrl !== 'https://accounts.strands.gg'\n})\n</script>","export default \"data:image/png;base64,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\"","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n icon?: string\n iconUrl?: string\n auth_url: string\n scopes: string[]\n enabled: boolean\n metadata?: Record<string, string>\n}\n\nexport interface OAuthProvidersResponse {\n providers: OAuthProvider[]\n redirect_url: string\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl } = useStrandsConfig()\n \n const providers = ref<OAuthProvider[]>([])\n const loading = ref(false)\n const error = ref<string | null>(null)\n\n const enabledProviders = computed(() => \n providers.value.filter(provider => provider.enabled)\n )\n\n const fetchProviders = async () => {\n loading.value = true\n error.value = null\n\n try {\n const url = getUrl('oauthProviders')\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n // The API returns { providers: [...], redirect_url: \"...\" }\n providers.value = result.providers || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n params.append('redirect_url', mergedOptions.redirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n // Find the provider and use its auth_url directly\n const provider = providers.value.find(p => p.id === providerId)\n if (!provider) {\n throw new Error(`OAuth provider '${providerId}' not found`)\n }\n \n if (!provider.auth_url) {\n throw new Error(`No auth URL configured for provider '${providerId}'`)\n }\n \n window.location.href = provider.auth_url\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset\" class=\"mb-8\">\n <StrandsUiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </StrandsUiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div>\n <!-- Email -->\n <div :class=\"['email-field-spacing', (!isPasswordReset && !isSignUp) ? 'has-password' : 'no-password']\">\n <StrandsUiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n </div>\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"password-fade\">\n <div v-if=\"!isPasswordReset && !isSignUp\" class=\"mb-4\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <StrandsUiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <StrandsUiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !isFormValid\" :loading=\"loading\"\n :loading-text=\"isPasswordReset ? 'Sending link...' : isSignUp ? 'Sending magic link...' : 'Signing in...'\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <StrandsUiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\">\n <div v-if=\"isPasswordReset\" class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Need help -->\n <Transition name=\"support-fade\">\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </Transition>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink, StrandsUiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n // Fallback config if no global config is provided\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'password-reset-sent', email: string): void\n (e: 'mode-changed', mode: 'signin' | 'signup' | 'reset-password'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n mode: 'signin',\n redirectUrl: '/',\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\nconsole.log('support email:', getSupportEmail())\n\n// Authentication state management\nconst { setAuthData } = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string): Promise<AuthResponse> {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result: AuthResponse = await response.json()\n return result\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n \n return result.message\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst loading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n password: '',\n confirmPassword: ''\n})\n\nconst isSignUp = computed(() => currentMode.value === 'signup')\nconst isPasswordReset = computed(() => currentMode.value === 'reset-password')\n\nconst isPasswordMatch = computed(() => {\n return form.password === form.confirmPassword\n})\n\nconst isFormValid = computed(() => {\n if (isPasswordReset.value) {\n return form.email.trim() && !isPasswordResetSubmitted.value\n }\n\n if (isSignUp.value) {\n return form.email.trim()\n }\n\n return form.email.trim() && form.password\n})\n\n// Password strength constants for better performance\nconst PASSWORD_STRENGTH_CONFIGS = {\n weak: {\n label: 'Weak',\n color: 'border-red-300',\n bgColor: 'bg-red-400',\n textColor: 'text-red-600',\n width: 33\n },\n medium: {\n label: 'Medium',\n color: 'border-yellow-300',\n bgColor: 'bg-yellow-400',\n textColor: 'text-yellow-600',\n width: 66\n },\n strong: {\n label: 'Strong',\n color: 'border-emerald-300',\n bgColor: 'bg-emerald-400',\n textColor: 'text-emerald-600',\n width: 100\n }\n} as const\n\nconst getPasswordStrength = (password: string) => {\n let score = 0\n\n if (password.length >= 8) score += 1\n if (password.length >= 12) score += 1\n if (/[a-z]/.test(password)) score += 1\n if (/[A-Z]/.test(password)) score += 1\n if (/[0-9]/.test(password)) score += 1\n if (/[^A-Za-z0-9]/.test(password)) score += 1\n\n const config = score <= 2 ? PASSWORD_STRENGTH_CONFIGS.weak \n : score <= 4 ? PASSWORD_STRENGTH_CONFIGS.medium \n : PASSWORD_STRENGTH_CONFIGS.strong\n\n return { score, ...config }\n}\n\nconst handleAuth = async () => {\n loading.value = true\n error.value = ''\n\n try {\n if (isPasswordReset.value) {\n // Handle password reset\n await authApi.requestPasswordReset(form.email)\n isPasswordResetSubmitted.value = true\n emit('password-reset-sent', form.email)\n } else if (isSignUp.value) {\n // Handle sign up\n const response = await authApi.signUp(\n form.email,\n form.password,\n form.firstName,\n form.lastName\n )\n emit('success', response.user)\n } else {\n // Handle sign in\n const response = await authApi.signIn(form.email, form.password)\n \n // Store the authentication data (tokens + user info)\n setAuthData(response)\n \n emit('success', response.user)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Simple fade transition - gentle and smooth */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 350ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Modern height-fade transition using interpolate-size for smooth height: auto */\n.height-fade-enter-active,\n.height-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support */\n@supports (interpolate-size: allow-keywords) {\n .height-fade-enter-active,\n .height-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n max-height: 300px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Support block transition - gentle fade with subtle scale */\n.support-fade-enter-active,\n.support-fade-leave-active {\n transition: all 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.support-fade-enter-from {\n opacity: 0;\n transform: scale(0.97) translateY(8px);\n}\n\n.support-fade-leave-to {\n opacity: 0;\n transform: scale(0.99) translateY(-4px);\n}\n\n.support-fade-enter-to,\n.support-fade-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Expand transition - for alerts using modern height animation */\n.expand-enter-active,\n.expand-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for expand */\n@supports (interpolate-size: allow-keywords) {\n .expand-enter-active,\n .expand-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for expand in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n max-height: 150px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Loading pulse animation */\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n/* Slide up animation for main container - elegant entrance */\n@keyframes slide-up {\n from {\n opacity: 0;\n transform: translateY(24px) scale(0.96);\n filter: blur(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n filter: blur(0px);\n }\n}\n\n.animate-slide-up {\n animation: slide-up 600ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Fade in animation for alerts - gentle appearance */\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: scale(0.97) translateY(6px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.animate-fade-in {\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Email field spacing animation */\n.email-field-spacing {\n transition: margin-bottom 500ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.email-field-spacing.has-password {\n margin-bottom: 1rem; /* mb-4 equivalent */\n}\n\n.email-field-spacing.no-password {\n margin-bottom: 0;\n}\n\n/* Password field transition - optimized for form layout */\n.password-fade-enter-active,\n.password-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for password field */\n@supports (interpolate-size: allow-keywords) {\n .password-fade-enter-active,\n .password-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for password field in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n max-height: 120px;\n transform: scale(1) translateY(0);\n }\n}\n</style>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-neutral-700\">Password</span>\n <StrandsUiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </StrandsUiLink>\n </div>\n <StrandsUiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <StrandsUiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { setAuthData } = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Call the sign-in API endpoint\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email,\n password: form.password,\n }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const authData: AuthResponse = await response.json()\n \n // Store the authentication data (tokens + user info)\n setAuthData(authData)\n \n // Emit success with user data\n emit('success', authData.user)\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Sign in failed'\n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <!-- Success State -->\n <StrandsUiCard v-if=\"signupSuccess\" variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">📧</div>\n <h1 class=\"text-2xl font-bold text-gray-900 mb-2\">{{ successTitle }}</h1>\n <p class=\"text-gray-600 mb-4\">{{ successMessage }}</p>\n <div v-if=\"successEmail\" class=\"text-sm text-gray-500 mb-4\">\n <strong>{{ successEmail }}</strong>\n </div>\n <p class=\"text-sm text-gray-500 mb-6\">\n Click the link in your email to complete your account setup. The link will expire in 24 hours.\n </p>\n <StrandsUiButton\n variant=\"outline\"\n full-width\n @click=\"resetToForm\"\n >\n Send Another Link\n </StrandsUiButton>\n </div>\n </StrandsUiCard>\n\n <!-- Signup Form -->\n <StrandsUiCard v-else variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <StrandsUiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/',\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\nconst signupSuccess = ref(false)\nconst successMessage = ref('')\nconst successTitle = ref('Magic Link Sent!')\nconst successEmail = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n const signUpUrl = getUrl('signUp')\n console.log('Attempting sign up to URL:', signUpUrl)\n \n const response = await fetch(signUpUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email\n }),\n })\n\n if (process.env['NODE_ENV'] === 'development') {\n console.log('Sign up response status:', response.status)\n }\n\n if (!response.ok) {\n let errorMessage = `Sign up failed (${response.status})`\n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch {\n const errorText = await response.text()\n errorMessage = errorText || errorMessage\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n console.log('Magic link sign up success:', result)\n \n // Handle success state internally\n signupSuccess.value = true\n successEmail.value = form.email\n successMessage.value = result.message || 'Magic link sent! Check your email.'\n \n // Set appropriate title based on message content\n if (result.message) {\n if (result.message.includes('already have an account') || result.message.includes('Welcome back')) {\n successTitle.value = 'Welcome Back!'\n } else if (result.message.includes('Magic link sent') || result.message.includes('Check your email')) {\n successTitle.value = 'Magic Link Sent!'\n } else {\n successTitle.value = 'Success!'\n }\n }\n \n // Still emit for any parent that might need it\n emit('success', {\n email: form.email,\n message: result.message || 'Magic link sent! Check your email.'\n })\n } catch (err) {\n console.error('Sign up error:', err)\n \n let errorMessage = 'Unable to send magic link. Please try again.'\n \n if (err instanceof Error) {\n if (err.message.includes('fetch')) {\n errorMessage = 'Unable to connect to authentication service. Please check your internet connection and try again.'\n } else if (err.message.includes('CORS')) {\n const supportEmail = getSupportEmail()\n errorMessage = supportEmail \n ? `Authentication service configuration error. Please contact ${supportEmail}.`\n : 'Authentication service configuration error.'\n } else {\n errorMessage = err.message\n }\n }\n \n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst resetToForm = () => {\n signupSuccess.value = false\n successMessage.value = ''\n successTitle.value = 'Magic Link Sent!'\n successEmail.value = ''\n form.email = ''\n error.value = ''\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">🎉</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome to Strands!</h1>\n <p class=\"text-neutral-600 mb-4\">\n Your account has been created successfully.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n You are now signed in and can access your dashboard.\n </p>\n <StrandsUiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-red-500 text-6xl mb-4\">❌</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Invalid Link</h1>\n <p class=\"text-neutral-600 mb-4\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n Please request a new magic link to complete your registration.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Complete Your Registration</h1>\n <p class=\"text-neutral-600\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"mt-2\">\n <p class=\"text-sm text-neutral-500\">Creating account for: <span class=\"font-medium text-neutral-700\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"space-y-6\">\n <!-- Username -->\n <div>\n <StrandsUiInput\n id=\"username\"\n v-model=\"form.username\"\n type=\"text\"\n label=\"Username\"\n placeholder=\"Choose a username\"\n autocomplete=\"username\"\n required\n :error=\"fieldErrors.username\"\n />\n </div>\n\n <!-- First Name -->\n <div>\n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <StrandsUiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"mt-2 text-xs text-neutral-500\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"mt-6 animate-fade-in\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-yellow-500 text-6xl mb-4\">⚠️</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Missing Token</h1>\n <p class=\"text-neutral-600 mb-4\">\n No registration token was provided.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Auth composable for token storage\nconst { setAuthData } = useStrandsAuth()\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n username: '',\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.username.trim() && form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n// Watch for username requirements\nwatch(\n () => form.username,\n (username) => {\n if (username && username.length < 2) {\n fieldErrors.username = 'Username must be at least 2 characters long'\n } else {\n fieldErrors.username = ''\n }\n }\n)\n\n// Auth configuration\nconst authConfig = computed(() => ({\n baseUrl: props.config?.baseUrl || 'http://localhost:8000',\n referrerUrl: props.redirectUrl || 'http://localhost:3001'\n}))\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (authConfig.value.referrerUrl) {\n console.log('Redirecting to referrer:', authConfig.value.referrerUrl)\n window.location.href = authConfig.value.referrerUrl\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(`${authConfig.value.baseUrl}/api/v1/auth/complete-registration`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n username: form.username,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result: AuthResponse = await response.json()\n console.log('Registration success:', result)\n \n // Store authentication data if tokens are present\n if (result.access_token && result.refresh_token && result.user) {\n setAuthData(result)\n console.log('Auth tokens stored successfully for user:', result.user.email)\n } else {\n console.warn('Registration response missing auth tokens or user data')\n }\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","import { ref, computed } from 'vue'\nimport type { \n MfaDevice, \n MfaDevicesResponse, \n TotpSetupResponse, \n BackupCodesResponse \n} from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\nimport { useStrandsAuth } from './useStrandsAuth'\n\nconst mfaDevices = ref<MfaDevice[]>([])\nconst mfaEnabled = ref(false)\nconst loading = ref(false)\n\nexport function useStrandsMfa() {\n const { getUrl } = useStrandsConfig()\n const { currentSession } = useStrandsAuth()\n\n const hasMfaDevices = computed(() => mfaDevices.value.length > 0)\n const activeMfaDevices = computed(() => mfaDevices.value.filter(d => d.is_active))\n\n // Helper function to make authenticated requests\n const makeAuthenticatedRequest = async (url: string, options: RequestInit = {}) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = `Request failed: ${response.status} ${response.statusText}`\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorMessage\n } catch {\n // If parsing fails, use the original error text\n if (errorText) {\n errorMessage = errorText\n }\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n // Get all MFA devices for the user\n const fetchMfaDevices = async (): Promise<MfaDevicesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaDevices'), {\n method: 'GET',\n })\n\n mfaDevices.value = response.devices || []\n mfaEnabled.value = response.mfa_enabled || false\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Setup TOTP (authenticator app)\n const setupTotp = async (deviceName: string): Promise<TotpSetupResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaTotpSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Verify TOTP setup\n const verifyTotpSetup = async (deviceId: string, totpCode: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaTotpVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n totp_code: totpCode,\n }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Setup email-based MFA\n const setupEmailMfa = async (deviceName: string): Promise<{ device_id: string; email: string }> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Send email verification code\n const sendEmailMfaCode = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaEmailSend'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n } finally {\n loading.value = false\n }\n }\n\n // Verify email MFA code\n const verifyEmailMfaCode = async (deviceId: string, code: string): Promise<boolean> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n code: code,\n }),\n })\n\n return response.verified || false\n } finally {\n loading.value = false\n }\n }\n\n // Disable an MFA device\n const disableMfaDevice = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaDeviceDisable'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Regenerate backup codes for TOTP device\n const regenerateBackupCodes = async (deviceId: string): Promise<BackupCodesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaBackupCodes'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Helper function to get device type icon\n const getDeviceTypeIcon = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return '📱' // Authenticator app\n case 'email':\n return '📧' // Email\n case 'hardware':\n return '🔑' // Hardware key\n case 'passkey':\n return '🔐' // Passkey\n default:\n return '🔒' // Generic security\n }\n }\n\n // Helper function to get device type name\n const getDeviceTypeName = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return 'Authenticator App'\n case 'email':\n return 'Email Verification'\n case 'hardware':\n return 'Hardware Key'\n case 'passkey':\n return 'Passkey'\n default:\n return 'Unknown'\n }\n }\n\n // Helper function to format last used date\n const formatLastUsed = (lastUsedAt?: string | Date): string => {\n if (!lastUsedAt) return 'Never'\n \n const date = new Date(lastUsedAt)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n \n return date.toLocaleDateString()\n }\n\n return {\n // State\n mfaDevices: computed(() => mfaDevices.value),\n mfaEnabled: computed(() => mfaEnabled.value),\n loading: computed(() => loading.value),\n hasMfaDevices,\n activeMfaDevices,\n\n // Methods\n fetchMfaDevices,\n setupTotp,\n verifyTotpSetup,\n setupEmailMfa,\n sendEmailMfaCode,\n verifyEmailMfaCode,\n disableMfaDevice,\n regenerateBackupCodes,\n\n // Helper methods\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n }\n}","<template>\n <div v-if=\"show\" class=\"fixed inset-0 z-50 overflow-y-auto\">\n <!-- Backdrop -->\n <div class=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300\"></div>\n \n <!-- Modal -->\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <div class=\"bg-white rounded-xl shadow-xl w-full max-w-md animate-slide-up\">\n <!-- Header -->\n <div class=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <h2 class=\"text-xl font-bold text-gray-900\">Setup Authenticator App</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" 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\" />\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"p-6\">\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Name Your Device</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Give this authenticator a memorable name (e.g., \"iPhone\", \"Work Phone\")\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"deviceName\"\n label=\"Device Name\"\n placeholder=\"My Authenticator\"\n :error=\"deviceNameError\"\n :disabled=\"loading\"\n />\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"startSetup\"\n :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\"\n >\n Continue\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: QR Code and Setup -->\n <div v-if=\"step === 2\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Scan QR Code</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.)\n </p>\n </div>\n\n <!-- QR Code -->\n <div class=\"flex justify-center bg-gray-50 p-4 rounded-lg\">\n <div\n v-if=\"totpSetupData?.qr_code_url\"\n class=\"bg-white p-4 rounded-lg shadow-sm\"\n v-html=\"totpSetupData.qr_code_url\"\n ></div>\n <div v-else class=\"flex items-center justify-center w-32 h-32\">\n <StrandsUiLoader :size=\"24\" />\n </div>\n </div>\n\n <!-- Manual Entry -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <p class=\"text-xs text-gray-600 mb-2\">\n Can't scan? Enter this code manually:\n </p>\n <code class=\"text-xs font-mono bg-white px-2 py-1 rounded border break-all\">\n {{ totpSetupData?.secret || '...' }}\n </code>\n </div>\n\n <!-- Backup Codes Preview -->\n <div v-if=\"totpSetupData?.backup_codes\" class=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-yellow-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-yellow-800\">Save Your Backup Codes</p>\n <p class=\"text-sm text-yellow-700 mt-1\">\n After setup, you'll receive backup codes. Store them safely - they're your only way to recover access if you lose your device.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"step = 3\"\n :disabled=\"loading\"\n >\n I've Added It\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Verification -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Verify Setup</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Enter the 6-digit code from your authenticator app to complete setup\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"verificationCode\"\n label=\"Verification Code\"\n placeholder=\"123456\"\n maxlength=\"6\"\n :error=\"verificationError\"\n :disabled=\"loading\"\n @input=\"onVerificationCodeInput\"\n />\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 2\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"verifySetup\"\n :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\"\n >\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 4: Success & Backup Codes -->\n <div v-if=\"step === 4\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">TOTP Setup Complete!</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n Your authenticator app is now active for two-factor authentication.\n </p>\n </div>\n\n <!-- Backup Codes -->\n <div class=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2 mb-3\">\n <svg class=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-red-800\">Save These Backup Codes</p>\n <p class=\"text-sm text-red-700 mt-1\">\n Store these codes in a safe place. Each code can only be used once.\n </p>\n </div>\n </div>\n\n <div class=\"bg-white rounded border p-3\">\n <div class=\"grid grid-cols-2 gap-2 text-sm font-mono\">\n <div\n v-for=\"(code, index) in totpSetupData?.backup_codes\"\n :key=\"index\"\n class=\"text-center py-1\"\n >\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-center mt-3\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"copyBackupCodes\"\n >\n 📋 Copy Codes\n </StrandsUiButton>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-4\">\n <StrandsUiButton\n variant=\"primary\"\n @click=\"finish\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { TotpSetupResponse } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupTotp, verifyTotpSetup, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst totpSetupData = ref<TotpSetupResponse | null>(null)\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n totpSetupData.value = null\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupTotp(deviceName.value.trim())\n totpSetupData.value = response\n step.value = 2\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup TOTP'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!totpSetupData.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n await verifyTotpSetup(totpSetupData.value.device_id, verificationCode.value)\n step.value = 4\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst copyBackupCodes = async () => {\n if (!totpSetupData.value?.backup_codes) return\n\n try {\n const codesText = totpSetupData.value.backup_codes.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n<style scoped>\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n</style>","<template>\n <div v-if=\"show\" class=\"fixed inset-0 z-50 overflow-y-auto\">\n <!-- Backdrop -->\n <div class=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300\"></div>\n \n <!-- Modal -->\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <div class=\"bg-white rounded-xl shadow-xl w-full max-w-md animate-slide-up\">\n <!-- Header -->\n <div class=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <h2 class=\"text-xl font-bold text-gray-900\">Setup Email 2FA</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" 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\" />\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"p-6\">\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Name Your Email 2FA</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Give this email 2FA method a memorable name (e.g., \"Personal Email\", \"Work Email\")\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"deviceName\"\n label=\"Device Name\"\n placeholder=\"Personal Email\"\n :error=\"deviceNameError\"\n :disabled=\"loading\"\n />\n\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-blue-800\">Email 2FA</p>\n <p class=\"text-sm text-blue-700 mt-1\">\n Verification codes will be sent to your registered email address when logging in.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"startSetup\"\n :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\"\n >\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: Test Verification -->\n <div v-if=\"step === 2\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Test Email 2FA</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n We've sent a test verification code to your email. Enter it below to complete setup.\n </p>\n </div>\n\n <div class=\"bg-green-50 border border-green-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-green-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-green-800\">Code Sent!</p>\n <p class=\"text-sm text-green-700 mt-1\">\n Check your email inbox for the verification code.\n </p>\n </div>\n </div>\n </div>\n\n <StrandsUiInput\n v-model=\"verificationCode\"\n label=\"Verification Code\"\n placeholder=\"123456\"\n maxlength=\"6\"\n :error=\"verificationError\"\n :disabled=\"loading\"\n @input=\"onVerificationCodeInput\"\n />\n\n <div class=\"flex justify-between\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"resendCode\"\n :disabled=\"loading || cooldownActive\"\n >\n {{ cooldownActive ? `Resend in ${cooldownSeconds}s` : 'Resend Code' }}\n </StrandsUiButton>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"verifySetup\"\n :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\"\n >\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Success -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Email 2FA Setup Complete!</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n Email verification is now active for your account. You'll receive codes at your registered email address.\n </p>\n </div>\n\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-blue-800\">How it works</p>\n <p class=\"text-sm text-blue-700 mt-1\">\n When logging in, you'll receive a 6-digit code at your email address. Enter this code to complete authentication.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-4\">\n <StrandsUiButton\n variant=\"primary\"\n @click=\"finish\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onBeforeUnmount } from 'vue'\nimport { StrandsUiButton, StrandsUiInput } from '../ui'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupEmailMfa, sendEmailMfaCode, verifyEmailMfaCode, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst emailMfaDeviceId = ref<string | null>(null)\nconst cooldownActive = ref(false)\nconst cooldownSeconds = ref(0)\n\nlet cooldownInterval: NodeJS.Timeout | null = null\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n emailMfaDeviceId.value = null\n cooldownActive.value = false\n cooldownSeconds.value = 0\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n})\n\nonBeforeUnmount(() => {\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupEmailMfa(deviceName.value.trim())\n emailMfaDeviceId.value = response.device_id\n step.value = 2\n startCooldown()\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup email MFA'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!emailMfaDeviceId.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n const verified = await verifyEmailMfaCode(emailMfaDeviceId.value, verificationCode.value)\n if (verified) {\n step.value = 3\n } else {\n verificationError.value = 'Invalid verification code'\n }\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst resendCode = async () => {\n if (!emailMfaDeviceId.value || cooldownActive.value) {\n return\n }\n\n try {\n await sendEmailMfaCode(emailMfaDeviceId.value)\n startCooldown()\n } catch (error) {\n console.error('Failed to resend code:', error)\n }\n}\n\nconst startCooldown = () => {\n cooldownActive.value = true\n cooldownSeconds.value = 30\n\n cooldownInterval = setInterval(() => {\n cooldownSeconds.value -= 1\n if (cooldownSeconds.value <= 0) {\n cooldownActive.value = false\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n }, 1000)\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n<style scoped>\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n</style>","<template>\n <div v-if=\"show\" class=\"fixed inset-0 z-50 overflow-y-auto\">\n <!-- Backdrop -->\n <div class=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300\"></div>\n \n <!-- Modal -->\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <div class=\"bg-white rounded-xl shadow-xl w-full max-w-md animate-slide-up\">\n <!-- Header -->\n <div class=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <h2 class=\"text-xl font-bold text-gray-900\">Backup Codes</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" 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\" />\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"p-6\">\n <div v-if=\"loading\" class=\"flex items-center justify-center py-8\">\n <StrandsUiLoader :size=\"24\" />\n <span class=\"ml-3 text-gray-600\">Loading backup codes...</span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <!-- Device Info -->\n <div v-if=\"device\" class=\"bg-gray-50 rounded-lg p-4\">\n <div class=\"flex items-center space-x-3\">\n <span class=\"text-2xl\">📱</span>\n <div>\n <h3 class=\"font-medium text-gray-900\">{{ device.device_name }}</h3>\n <p class=\"text-sm text-gray-500\">{{ getDeviceTypeName(device.device_type) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Warning -->\n <div class=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-red-800\">Important Security Information</p>\n <ul class=\"text-sm text-red-700 mt-1 space-y-1\">\n <li>• Each backup code can only be used once</li>\n <li>• Store these codes in a safe place</li>\n <li>• Use backup codes if you lose access to your authenticator</li>\n <li>• Regenerating codes will invalidate all previous codes</li>\n </ul>\n </div>\n </div>\n </div>\n\n <!-- Backup Codes -->\n <div v-if=\"backupCodes.length > 0\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-3\">Your Backup Codes</h3>\n <div class=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div class=\"grid grid-cols-2 gap-2 text-sm font-mono\">\n <div\n v-for=\"(code, index) in backupCodes\"\n :key=\"index\"\n class=\"text-center py-2 bg-gray-50 rounded\"\n >\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-center mt-4 space-x-3\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"copyBackupCodes\"\n >\n 📋 Copy All Codes\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"downloadBackupCodes\"\n >\n 💾 Download\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"pt-4 border-t border-gray-200\">\n <div class=\"flex justify-between\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"regenerateCodes\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n 🔄 Regenerate Codes\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"closeModal\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Regeneration Warning -->\n <div v-if=\"showRegenerateWarning\" class=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-yellow-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-yellow-800\">Regenerate Backup Codes?</p>\n <p class=\"text-sm text-yellow-700 mt-1\">\n This will invalidate all current backup codes. Make sure to save the new ones.\n </p>\n <div class=\"flex space-x-2 mt-3\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"confirmRegenerate\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n Yes, Regenerate\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showRegenerateWarning = false\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n device?: MfaDevice | null\n}\n\ninterface Emits {\n (e: 'close'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { regenerateBackupCodes, loading, getDeviceTypeName } = useStrandsMfa()\n\n// State\nconst backupCodes = ref<string[]>([])\nconst showRegenerateWarning = ref(false)\n\n// Load backup codes when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow && props.device) {\n showRegenerateWarning.value = false\n // For now, we'll use the device's backup codes if available\n // In a real implementation, you might fetch fresh codes or show cached ones\n backupCodes.value = []\n }\n})\n\nonMounted(async () => {\n if (props.show && props.device) {\n // Initialize with empty codes - user needs to regenerate to see them\n backupCodes.value = []\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst regenerateCodes = () => {\n showRegenerateWarning.value = true\n}\n\nconst confirmRegenerate = async () => {\n if (!props.device) return\n\n try {\n const response = await regenerateBackupCodes(props.device.id)\n backupCodes.value = response.backup_codes\n showRegenerateWarning.value = false\n } catch (error) {\n console.error('Failed to regenerate backup codes:', error)\n // Show error message\n }\n}\n\nconst copyBackupCodes = async () => {\n if (backupCodes.value.length === 0) return\n\n try {\n const codesText = backupCodes.value.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst downloadBackupCodes = () => {\n if (backupCodes.value.length === 0) return\n\n const deviceName = props.device?.device_name || 'device'\n const timestamp = new Date().toISOString().split('T')[0]\n const filename = `strands-backup-codes-${deviceName}-${timestamp}.txt`\n \n const content = [\n 'Strands Account Backup Codes',\n '============================',\n '',\n `Device: ${props.device?.device_name}`,\n `Generated: ${new Date().toLocaleString()}`,\n '',\n 'IMPORTANT:',\n '- Each code can only be used once',\n '- Store these codes in a safe place',\n '- Use these if you lose access to your authenticator',\n '',\n 'Backup Codes:',\n ...backupCodes.value.map((code, index) => `${index + 1}. ${code}`),\n '',\n '============================',\n ].join('\\n')\n\n const blob = new Blob([content], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n}\n</script>\n\n<style scoped>\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n</style>","<template>\n <div v-if=\"show\" class=\"fixed inset-0 z-50 overflow-y-auto\">\n <!-- Backdrop -->\n <div class=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300\"></div>\n \n <!-- Modal -->\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <div class=\"bg-white rounded-xl shadow-xl w-full max-w-sm animate-slide-up\">\n <!-- Header -->\n <div class=\"p-6 border-b border-gray-200\">\n <h2 class=\"text-lg font-bold text-gray-900\">{{ title }}</h2>\n </div>\n\n <!-- Content -->\n <div class=\"p-6\">\n <p class=\"text-sm text-gray-600 mb-6\">{{ message }}</p>\n\n <div class=\"flex justify-end space-x-3\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n {{ cancelText }}\n </StrandsUiButton>\n <StrandsUiButton\n :variant=\"variant\"\n @click=\"handleConfirm\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ confirmText }}\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { StrandsUiButton } from '../ui'\n\ntype ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline'\n\ninterface Props {\n show: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n variant?: ButtonVariant\n}\n\ninterface Emits {\n (e: 'confirm'): void\n (e: 'cancel'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'primary'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\n\nconst handleConfirm = () => {\n loading.value = true\n emit('confirm')\n // Note: Parent component should handle resetting loading state\n // by either closing the modal or setting loading to false\n}\n\nconst handleCancel = () => {\n emit('cancel')\n}\n</script>\n\n<style scoped>\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n</style>","<template>\n <div v-if=\"showModal\" class=\"fixed inset-0 z-50 overflow-y-auto\">\n <!-- Backdrop -->\n <div \n class=\"fixed inset-0 bg-black bg-opacity-50 transition-opacity duration-300\"\n @click=\"closeModal\"\n ></div>\n \n <!-- Modal -->\n <div class=\"flex min-h-full items-center justify-center p-4\">\n <div class=\"bg-white rounded-xl shadow-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto animate-slide-up\">\n <!-- Header -->\n <div class=\"flex items-center justify-between p-6 border-b border-gray-200\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-6 h-6\" 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\" />\n </svg>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"p-6\">\n <!-- Loading State -->\n <div v-if=\"mfaLoading\" class=\"flex items-center justify-center py-12\">\n <StrandsUiLoader :size=\"32\" />\n <span class=\"ml-3 text-gray-600\">Loading MFA settings...</span>\n </div>\n\n <!-- Content when loaded -->\n <div v-else class=\"space-y-6\">\n <!-- MFA Status Overview -->\n <div class=\"bg-gray-50 rounded-xl p-4\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h3 class=\"font-semibold text-gray-900\">Two-Factor Authentication</h3>\n <p class=\"text-sm text-gray-600\">\n {{ mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <div class=\"flex items-center\">\n <span v-if=\"mfaEnabled\" class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n ✓ Enabled\n </span>\n <span v-else class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-600\">\n Not Enabled\n </span>\n </div>\n </div>\n </div>\n\n <!-- Active Devices -->\n <div v-if=\"activeMfaDevices.length > 0\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Active Devices</h3>\n <div class=\"space-y-3\">\n <div\n v-for=\"device in activeMfaDevices\"\n :key=\"device.id\"\n class=\"flex items-center justify-between p-4 bg-white border border-gray-200 rounded-lg hover:shadow-sm transition-shadow duration-200\"\n >\n <div class=\"flex items-center space-x-3\">\n <span class=\"text-2xl\">{{ getDeviceTypeIcon(device.device_type) }}</span>\n <div>\n <h4 class=\"font-medium text-gray-900\">{{ device.device_name }}</h4>\n <p class=\"text-sm text-gray-500\">\n {{ getDeviceTypeName(device.device_type) }} • Last used {{ formatLastUsed(device.last_used_at) }}\n </p>\n </div>\n </div>\n <div class=\"flex items-center space-x-2\">\n <!-- Backup codes button for TOTP devices -->\n <StrandsUiButton\n v-if=\"device.device_type === 'totp'\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showBackupCodes(device)\"\n :disabled=\"mfaLoading\"\n >\n Backup Codes\n </StrandsUiButton>\n \n <!-- Test email MFA -->\n <StrandsUiButton\n v-if=\"device.device_type === 'email'\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"testEmailMfa(device)\"\n :disabled=\"mfaLoading\"\n >\n Send Test Code\n </StrandsUiButton>\n\n <!-- Remove device -->\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"confirmDisableDevice(device)\"\n :disabled=\"mfaLoading\"\n >\n Remove\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Add New Device -->\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Add New Device</h3>\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <!-- TOTP Setup -->\n <div class=\"p-4 border border-gray-200 rounded-lg hover:shadow-sm transition-shadow duration-200\">\n <div class=\"flex items-center space-x-3 mb-3\">\n <span class=\"text-2xl\">📱</span>\n <div>\n <h4 class=\"font-medium text-gray-900\">Authenticator App</h4>\n <p class=\"text-sm text-gray-500\">Google Authenticator, Authy, etc.</p>\n </div>\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"startTotpSetup\"\n :disabled=\"mfaLoading\"\n class=\"w-full\"\n >\n Setup TOTP\n </StrandsUiButton>\n </div>\n\n <!-- Email MFA Setup -->\n <div class=\"p-4 border border-gray-200 rounded-lg hover:shadow-sm transition-shadow duration-200\">\n <div class=\"flex items-center space-x-3 mb-3\">\n <span class=\"text-2xl\">📧</span>\n <div>\n <h4 class=\"font-medium text-gray-900\">Email Verification</h4>\n <p class=\"text-sm text-gray-500\">Codes sent to your email</p>\n </div>\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"startEmailMfaSetup\"\n :disabled=\"mfaLoading\"\n class=\"w-full\"\n >\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Coming Soon -->\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 opacity-60\">\n <div class=\"p-4 border border-gray-200 rounded-lg\">\n <div class=\"flex items-center space-x-3 mb-3\">\n <span class=\"text-2xl\">🔑</span>\n <div>\n <h4 class=\"font-medium text-gray-900\">Hardware Key</h4>\n <p class=\"text-sm text-gray-500\">YubiKey, etc. (Coming Soon)</p>\n </div>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n disabled\n class=\"w-full\"\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n\n <div class=\"p-4 border border-gray-200 rounded-lg\">\n <div class=\"flex items-center space-x-3 mb-3\">\n <span class=\"text-2xl\">🔐</span>\n <div>\n <h4 class=\"font-medium text-gray-900\">Passkey</h4>\n <p class=\"text-sm text-gray-500\">FIDO2/WebAuthn (Coming Soon)</p>\n </div>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n disabled\n class=\"w-full\"\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOTP Setup Modal -->\n <StrandsTotpSetupModal\n v-if=\"showTotpSetup\"\n :show=\"showTotpSetup\"\n @close=\"showTotpSetup = false\"\n @success=\"handleTotpSetupSuccess\"\n />\n\n <!-- Email MFA Setup Modal -->\n <StrandsEmailMfaSetupModal\n v-if=\"showEmailMfaSetup\"\n :show=\"showEmailMfaSetup\"\n @close=\"showEmailMfaSetup = false\"\n @success=\"handleEmailMfaSetupSuccess\"\n />\n\n <!-- Backup Codes Modal -->\n <StrandsBackupCodesModal\n v-if=\"showBackupCodesModal\"\n :show=\"showBackupCodesModal\"\n :device=\"selectedDevice\"\n @close=\"showBackupCodesModal = false\"\n />\n\n <!-- Confirm Disable Modal -->\n <StrandsConfirmModal\n v-if=\"showConfirmDisable\"\n :show=\"showConfirmDisable\"\n title=\"Remove MFA Device\"\n :message=\"`Are you sure you want to remove '${selectedDevice?.device_name}'? This action cannot be undone.`\"\n confirm-text=\"Remove Device\"\n cancel-text=\"Keep Device\"\n variant=\"secondary\"\n @confirm=\"handleDisableDevice\"\n @cancel=\"showConfirmDisable = false\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport StrandsTotpSetupModal from './StrandsTotpSetupModal.vue'\nimport StrandsEmailMfaSetupModal from './StrandsEmailMfaSetupModal.vue'\nimport StrandsBackupCodesModal from './StrandsBackupCodesModal.vue'\nimport StrandsConfirmModal from './StrandsConfirmModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'mfa-updated'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\n// MFA composable\nconst {\n mfaDevices,\n mfaEnabled,\n loading: mfaLoading,\n activeMfaDevices,\n fetchMfaDevices,\n disableMfaDevice,\n sendEmailMfaCode,\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n} = useStrandsMfa()\n\n// Modal states\nconst showModal = computed(() => props.show)\nconst showTotpSetup = ref(false)\nconst showEmailMfaSetup = ref(false)\nconst showBackupCodesModal = ref(false)\nconst showConfirmDisable = ref(false)\nconst selectedDevice = ref<MfaDevice | null>(null)\n\n// Load MFA devices when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n await fetchMfaDevices()\n }\n})\n\nonMounted(async () => {\n if (props.show) {\n await fetchMfaDevices()\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startTotpSetup = () => {\n showTotpSetup.value = true\n}\n\nconst startEmailMfaSetup = () => {\n showEmailMfaSetup.value = true\n}\n\nconst showBackupCodes = (device: MfaDevice) => {\n selectedDevice.value = device\n showBackupCodesModal.value = true\n}\n\nconst testEmailMfa = async (device: MfaDevice) => {\n try {\n await sendEmailMfaCode(device.id)\n // Show success message or toast\n console.log('Test code sent to email')\n } catch (error) {\n console.error('Failed to send test code:', error)\n // Show error message\n }\n}\n\nconst confirmDisableDevice = (device: MfaDevice) => {\n selectedDevice.value = device\n showConfirmDisable.value = true\n}\n\nconst handleDisableDevice = async () => {\n if (selectedDevice.value) {\n try {\n await disableMfaDevice(selectedDevice.value.id)\n showConfirmDisable.value = false\n selectedDevice.value = null\n emit('mfa-updated')\n } catch (error) {\n console.error('Failed to disable MFA device:', error)\n // Show error message\n }\n }\n}\n\nconst handleTotpSetupSuccess = async () => {\n showTotpSetup.value = false\n await fetchMfaDevices()\n emit('mfa-updated')\n}\n\nconst handleEmailMfaSetupSuccess = async () => {\n showEmailMfaSetup.value = false\n await fetchMfaDevices()\n emit('mfa-updated')\n}\n</script>\n\n<style scoped>\n.animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n</style>","<template>\n <div class=\"w-full min-w-xl max-w-2xl mx-auto animate-slide-up\">\n <div class=\"card-modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Profile Settings</h1>\n <p class=\"text-gray-600\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center mb-8\">\n <div class=\"relative group\">\n <div \n v-if=\"currentUser?.avatar\"\n class=\"w-24 h-24 rounded-full shadow-large overflow-hidden\"\n >\n <img \n :src=\"currentUser.avatar\" \n :alt=\"`${currentUser.firstName} ${currentUser.lastName}`\"\n class=\"w-full h-full object-cover\"\n />\n </div>\n <div \n v-else\n class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large\"\n >\n {{ getInitials(currentUser?.firstName, currentUser?.lastName) }}\n </div>\n <button\n class=\"absolute inset-0 rounded-full bg-black/40 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200\"\n @click=\"triggerFileUpload\"\n :disabled=\"uploading\"\n >\n <StrandsUiLoader v-if=\"uploading\" :size=\"24\" variant=\"dark\" />\n <svg v-else class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </button>\n </div>\n <button\n class=\"mt-3 text-sm text-strands-600 hover:text-strands-700 font-medium transition-colors duration-200 disabled:opacity-50\"\n @click=\"triggerFileUpload\"\n :disabled=\"uploading\"\n >\n {{ uploading ? 'Uploading...' : 'Change photo' }}\n </button>\n <input\n ref=\"fileInputRef\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden\"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"space-y-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <!-- Personal Information -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Personal Information</h3>\n \n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.firstName\"\n />\n\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.lastName\"\n />\n\n <!-- Email Change Section -->\n <div class=\"space-y-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Email Address</h4>\n <p class=\"text-sm text-gray-600\">{{ currentUser?.email }}</p>\n <p v-if=\"!currentUser?.emailVerified\" class=\"text-sm text-amber-600 font-medium\">⚠️ Email not verified</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showEmailChange = !showEmailChange\"\n >\n {{ showEmailChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showEmailChange\" class=\"space-y-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"emailChangeForm.newEmail\"\n type=\"email\"\n placeholder=\"New email address\"\n autocomplete=\"email\"\n :error=\"emailChangeForm.errors.newEmail\"\n />\n <StrandsUiInput\n v-model=\"emailChangeForm.password\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n :error=\"emailChangeForm.errors.password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleEmailChange\"\n :disabled=\"!isEmailChangeFormValid || emailChangeLoading\"\n >\n {{ emailChangeLoading ? 'Updating...' : 'Update Email' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Password</h4>\n <p class=\"text-sm text-gray-600\">Last updated {{ passwordLastUpdated }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showPasswordChange\" class=\"space-y-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-gray-600\">\n {{ currentUser?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <StrandsUiButton\n :variant=\"currentUser?.mfaEnabled ? 'secondary' : 'primary'\"\n size=\"sm\"\n @click=\"showMfaModal = true\"\n >\n {{ currentUser?.mfaEnabled ? 'Manage' : 'Setup' }}\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Active Sessions</h4>\n <p class=\"text-sm text-gray-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"$emit('manage-sessions')\"\n disabled\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons - Only show when changes are made -->\n <div v-if=\"hasChanges\" class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-gray-200 animate-slide-up\">\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ loading ? 'Saving changes...' : 'Save changes' }}\n </StrandsUiButton>\n\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\" clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-gray-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </div>\n\n <!-- MFA Management Modal -->\n <StrandsMfaModal\n :show=\"showMfaModal\"\n @close=\"showMfaModal = false\"\n @mfa-updated=\"handleMfaUpdated\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLink, StrandsUiLoader } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaModal from './StrandsMfaModal.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { User } from '../../types'\n\ninterface Props {\n user?: User\n config?: StrandsAuthConfig\n autoFetch?: boolean // Whether to automatically fetch user profile on mount\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n autoFetch: true\n})\nconst emit = defineEmits<Emits>()\n\n// Get configuration and authentication \nconst { getSupportEmail, config: strandsConfig, getUrl } = useStrandsConfig(props.config)\nconst { fetchProfile, updateProfile, changeEmail, currentUser: authUser, currentSession, isAuthenticated, refreshToken } = useStrandsAuth()\n\n// Internal user state\nconst internalUser = ref<User | null>(null)\nconst fetchingProfile = ref(false)\n\n// Use authenticated user from composable, fallback to prop, then internal state\nconst currentUser = computed(() => {\n const user = authUser.value || props.user || internalUser.value\n console.log('Current user computed:', {\n hasAuthUser: !!authUser.value,\n hasPropUser: !!props.user,\n hasInternalUser: !!internalUser.value,\n selectedUser: user,\n avatar: user?.avatar\n })\n return user\n})\n\nconst loading = ref(false)\nconst uploading = ref(false)\nconst showPasswordChange = ref(false)\nconst showEmailChange = ref(false)\nconst emailChangeLoading = ref(false)\nconst showMfaModal = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([])\nconst fileInputRef = ref<HTMLInputElement | null>(null)\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst emailChangeForm = reactive({\n newEmail: '',\n password: '',\n errors: {\n newEmail: '',\n password: ''\n }\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst hasChanges = computed(() => {\n const user = currentUser.value\n if (!user) return false\n return (\n form.firstName !== (user.firstName || '') ||\n form.lastName !== (user.lastName || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst isEmailChangeFormValid = computed(() => {\n return (\n emailChangeForm.newEmail &&\n emailChangeForm.password &&\n emailChangeForm.newEmail !== currentUser.value?.email &&\n emailChangeForm.newEmail.includes('@')\n )\n})\n\nconst passwordLastUpdated = computed(() => {\n const user = currentUser.value\n if (!user) return 'Never'\n \n // Use passwordUpdatedAt if available, otherwise fall back to createdAt\n const updateDate = user.passwordUpdatedAt || user.createdAt\n if (!updateDate) return 'Never'\n \n const date = new Date(updateDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n if (diffDays < 365) {\n const months = Math.floor(diffDays / 30)\n return months === 1 ? '1 month ago' : `${months} months ago`\n }\n const years = Math.floor(diffDays / 365)\n return years === 1 ? '1 year ago' : `${years} years ago`\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Fetch user profile from API\nconst fetchUserProfile = async () => {\n if (!props.autoFetch || props.user || !isAuthenticated.value) return // Skip if disabled, user prop provided, or not authenticated\n \n fetchingProfile.value = true\n try {\n await fetchProfile()\n // The fetchProfile from composable will update authUser, so currentUser computed will reflect the change\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Failed to load profile'\n errorMessage.value = errorMsg\n emit('error', errorMsg)\n } finally {\n fetchingProfile.value = false\n }\n}\n\n// Initialize form with user data\nwatch(() => currentUser.value, (user) => {\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email // Keep for display but not for editing\n }\n}, { immediate: true })\n\n// Fetch profile on mount if needed\nonMounted(() => {\n fetchUserProfile()\n})\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n const updatedUser = await updateProfile({\n firstName: form.firstName,\n lastName: form.lastName,\n })\n \n if (updatedUser) {\n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update profile'\n errorMessage.value = error\n emit('error', error)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleEmailChange = async () => {\n if (!isEmailChangeFormValid.value) return\n\n // Clear previous errors\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n clearMessages()\n emailChangeLoading.value = true\n\n try {\n const result = await changeEmail(emailChangeForm.newEmail, emailChangeForm.password)\n \n successMessage.value = result.message || 'Email updated successfully. Please verify your new email address.'\n showEmailChange.value = false\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update email'\n \n // Try to parse specific field errors\n if (error.includes('password')) {\n emailChangeForm.errors.password = 'Invalid password'\n } else if (error.includes('email')) {\n emailChangeForm.errors.newEmail = error\n } else {\n errorMessage.value = error\n }\n \n emit('error', error)\n } finally {\n emailChangeLoading.value = false\n }\n}\n\nconst triggerFileUpload = () => {\n if (uploading.value) return\n fileInputRef.value?.click()\n}\n\nconst handleFileSelect = async (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n \n if (!file) return\n \n // Validate file type\n if (!file.type.startsWith('image/')) {\n errorMessage.value = 'Please select an image file'\n return\n }\n \n // Validate file size (5MB limit)\n const maxSize = 5 * 1024 * 1024\n if (file.size > maxSize) {\n errorMessage.value = 'File size must be less than 5MB'\n return\n }\n \n await uploadAvatar(file)\n}\n\nconst uploadAvatar = async (file: File) => {\n uploading.value = true\n clearMessages()\n \n try {\n // Check if we have an access token\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available. Please sign in again.')\n }\n \n // Create form data\n const formData = new FormData()\n formData.append('avatar', file)\n \n // Upload to API endpoint\n const response = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!response.ok) {\n // Handle authentication errors\n if (response.status === 401) {\n // Try to refresh token and retry once\n try {\n console.log('Access token expired, attempting to refresh...')\n const refreshed = await refreshToken()\n if (refreshed && currentSession.value?.accessToken) {\n console.log('Token refreshed successfully, retrying avatar upload...')\n // Retry the upload with new token\n const retryResponse = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!retryResponse.ok) {\n const errorData = await retryResponse.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${retryResponse.status} ${retryResponse.statusText}`)\n }\n \n // Use the retry response for processing\n const retryResult = await retryResponse.json()\n console.log('Avatar upload retry success:', retryResult)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', retryResult.avatar_url)\n authUser.value.avatar = retryResult.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = retryResult.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload retry')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload retry:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n return\n } else {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } catch (refreshError) {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${response.status} ${response.statusText}`)\n }\n }\n \n const result = await response.json()\n console.log('Avatar upload success:', result)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', result.avatar_url)\n authUser.value.avatar = result.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = result.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n \n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to upload avatar'\n errorMessage.value = error\n emit('error', error)\n } finally {\n uploading.value = false\n // Reset file input\n if (fileInputRef.value) {\n fileInputRef.value.value = ''\n }\n }\n}\n\nconst handleMfaUpdated = async () => {\n // Refresh the user profile to get updated MFA status\n try {\n await fetchProfile()\n successMessage.value = 'MFA settings updated successfully'\n emit('mfa-toggle', currentUser.value?.mfaEnabled || false)\n } catch (err) {\n console.error('Failed to refresh profile after MFA update:', err)\n }\n}\n\nconst handleCancel = () => {\n const user = currentUser.value\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email\n }\n clearMessages()\n showPasswordChange.value = false\n showEmailChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n}\n\n</script>\n\n<style scoped>\n.expand-enter-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px; /* Approximate max height for password form */\n opacity: 1;\n transform: translateY(0);\n}\n</style>\n\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message -->\n <StrandsUiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\" />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <div class=\"max-w-md mx-auto bg-white rounded-lg shadow-lg p-6\">\n <div class=\"text-center mb-6\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Secure your account with 2FA</p>\n </div>\n\n <div class=\"space-y-6\">\n <!-- QR Code Section -->\n <div class=\"text-center\">\n <div class=\"w-48 h-48 bg-gray-100 rounded-lg mx-auto mb-4 flex items-center justify-center\">\n <div class=\"text-gray-400\">\n <svg class=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v1m6 11h2m-6 0h-2v4m0-11v3m0 0h.01M12 12h4.01M12 12h.01M12 12v4.01\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-600\">Scan this QR code with your authenticator app</p>\n </div>\n\n <!-- Setup Key -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Setup Key (manual entry)</label>\n <div class=\"p-3 bg-gray-50 rounded border text-sm font-mono break-all\">\n XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX\n </div>\n </div>\n\n <!-- Verification Code Input -->\n <div>\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">Verification Code</label>\n <input \n type=\"text\" \n placeholder=\"Enter 6-digit code\"\n class=\"w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-strands-500 focus:border-strands-500\"\n maxlength=\"6\"\n />\n <p class=\"text-xs text-gray-500 mt-1\">Enter the 6-digit code from your authenticator app</p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 pt-4\">\n <button \n type=\"button\"\n class=\"flex-1 bg-strands-500 text-white py-2 px-4 rounded-md hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-colors\"\n >\n Enable 2FA\n </button>\n <button \n type=\"button\"\n class=\"flex-1 bg-gray-200 text-gray-800 py-2 px-4 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 transition-colors\"\n @click=\"$emit('back')\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'back'): void\n}\n\ndefineEmits<Emits>()\n</script>","<template>\n <div v-if=\"isAuthenticated && !showLoading\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback && !showLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"showLoading\" class=\"animate-fade-in py-8\">\n <slot name=\"loading\">\n <StrandsUiLoader\n :size=\"64\" \n text=\"Checking authentication...\" \n variant=\"auto\" \n :show-particles=\"true\" \n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nwithDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\n// Local loading state to ensure loading shows on first render\nconst isComponentReady = ref(false)\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\n// Show loading until both auth is initialized AND component is ready\nconst showLoading = computed(() => isLoading.value || !isComponentReady.value)\n\nonMounted(() => {\n // Add a small delay to ensure we show loading state\n setTimeout(() => {\n isComponentReady.value = true\n }, 100)\n})\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-fade-in py-8\">\n <slot name=\"loading\">\n <StrandsUiLoader \n :size=\"64\"\n text=\"Checking authentication...\"\n variant=\"auto\"\n :show-particles=\"true\"\n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => h('g', [\n h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => h('g', [\n h('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n h('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => h('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => h('g', { fill: 'currentColor' }, [\n h('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n h('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n h('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n h('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => h('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : h('path', { d: '' })\n})\n</script>\n","import type { App } from 'vue'\n\n// Import all UI components\nimport StrandsUiAlert from '../ui/UiAlert.vue'\nimport StrandsUiButton from '../ui/UiButton.vue'\nimport StrandsUiCard from '../ui/UiCard.vue'\nimport StrandsUiInput from '../ui/UiInput.vue'\nimport StrandsUiLink from '../ui/UiLink.vue'\nimport StrandsUiTabs from '../ui/UiTabs.vue'\nimport StrandsUiLoader from '../ui/UiLoader.vue'\n\n// Global components map\nconst components = {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\nexport interface StrandsUIOptions {\n prefix?: string\n}\n\nexport default {\n install(app: App, options: StrandsUIOptions = {}) {\n const { prefix = '' } = options\n\n // Register all components globally\n Object.entries(components).forEach(([name, component]) => {\n const componentName = prefix ? `${prefix}${name}` : name\n app.component(componentName, component)\n })\n }\n}\n\n// Export individual components for tree-shaking\nexport {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\n// Export types\nexport type {\n ButtonVariant,\n ButtonSize,\n InputType,\n CardVariant,\n LinkVariant,\n AlertVariant,\n} from '../ui/index'","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_hoisted_1","_hoisted_2","_hoisted_5","_openBlock","_createElementBlock","_normalizeClass","$setup","_createElementVNode","_hoisted_3","_hoisted_4","$props","_createCommentVNode","_renderSlot","_ctx","_createTextVNode","_hoisted_6","_cache","buttonClasses","sizeClasses","widthClasses","$event","_toDisplayString","cardClasses","paddingClasses","shadowClasses","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","event","target","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","tag","linkProps","baseProps","linkClasses","_createBlock","_resolveDynamicComponent","_mergeProps","_withCtx","tabButtons","underlineStyle","currentTabIndex","isAnimating","handleTabClick","value","index","nextTick","animateUnderlineStretch","newIndex","newTab","container","newRect","containerRect","newLeft","newWidth","currentRect","currentLeft","currentWidth","isMovingRight","stretchLeft","stretchWidth","onMounted","activeIndex","tab","activeTabIndex","modelValue","toRefs","watch","_Fragment","_renderList","_normalizeStyle","logo","path","d","containerClasses","textClasses","semiColor","solidColor","config","useStrandsConfig","shouldShowSecuredBy","_imports_0","useOAuthProviders","options","getUrl","providers","loading","error","enabledProviders","provider","fetchProviders","url","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","p","getProviderById","getProviderIcon","getSupportEmail","setAuthData","useStrandsAuth","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isPasswordMatch","isFormValid","PASSWORD_STRENGTH_CONFIGS","getPasswordStrength","score","handleAuth","handleOAuthAuth","newMode","_hoisted_11","_hoisted_13","_hoisted_15","_hoisted_18","_createVNode","_Transition","_hoisted_12","_withModifiers","_hoisted_14","_hoisted_16","_hoisted_17","authData","signupSuccess","successMessage","successTitle","successEmail","signUpUrl","supportEmail","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_21","registrationComplete","invalidToken","fieldErrors","hasRequiredFields","passwordMinLength","hasValidToken","username","authConfig","parts","payload","redirectToReferrer","key","errorText","mfaDevices","mfaEnabled","useStrandsMfa","currentSession","hasMfaDevices","activeMfaDevices","makeAuthenticatedRequest","fetchMfaDevices","setupTotp","deviceName","verifyTotpSetup","deviceId","totpCode","setupEmailMfa","sendEmailMfaCode","verifyEmailMfaCode","code","disableMfaDevice","regenerateBackupCodes","getDeviceTypeIcon","deviceType","getDeviceTypeName","formatLastUsed","lastUsedAt","date","diffMs","diffDays","step","deviceNameError","verificationCode","verificationError","totpSetupData","newShow","codesText","_createStaticVNode","emailMfaDeviceId","cooldownActive","cooldownSeconds","cooldownInterval","onBeforeUnmount","closeModal","startSetup","startCooldown","onVerificationCodeInput","verifySetup","resendCode","backupCodes","showRegenerateWarning","timestamp","filename","content","blob","link","mfaLoading","showModal","showTotpSetup","showEmailMfaSetup","showBackupCodesModal","showConfirmDisable","selectedDevice","device","_hoisted_23","_hoisted_24","_hoisted_25","strandsConfig","fetchProfile","updateProfile","changeEmail","authUser","isAuthenticated","refreshToken","internalUser","fetchingProfile","currentUser","user","uploading","showPasswordChange","showEmailChange","emailChangeLoading","showMfaModal","activeSessions","fileInputRef","emailChangeForm","passwordForm","errors","hasChanges","isPasswordFormValid","isEmailChangeFormValid","passwordLastUpdated","updateDate","months","years","getInitials","fetchUserProfile","errorMsg","clearMessages","handleUpdateProfile","updatedUser","handlePasswordChange","resolve","handleEmailChange","triggerFileUpload","handleFileSelect","file","maxSize","uploadAvatar","formData","retryResponse","retryResult","refreshError","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_39","_hoisted_29","_hoisted_30","_hoisted_34","_hoisted_38","isSubmitted","isComponentReady","isLoading","signOut","showLoading","args","provideStrandsConfig","iconClass","viewBox","icons","h","iconComponent","icon","components","StrandsUiAlert","StrandsUiButton","StrandsUiCard","StrandsUiInput","StrandsUiLink","StrandsUiTabs","StrandsUiLoader","StrandsUIPlugin","app","prefix","name","component","componentName","isValidEmail","validatePassword","isValid","strength","isValidName","isRequired","passwordsMatch","confirmation","first","last","formatDate","debounce","func","wait","timeout"],"mappings":"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"}