@strands.gg/accui 0.2.11 → 0.2.13

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 (64) hide show
  1. package/dist/accui.css +1 -1
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/nuxt/module.cjs.js +1 -1
  5. package/dist/nuxt/module.cjs.js.map +1 -1
  6. package/dist/nuxt/module.d.ts.map +1 -1
  7. package/dist/nuxt/module.es.js +23 -14
  8. package/dist/nuxt/module.es.js.map +1 -1
  9. package/dist/nuxt/runtime/composables/useStrandsAuth.cjs.js +1 -1
  10. package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts +4 -3
  11. package/dist/nuxt/runtime/composables/useStrandsAuth.d.ts.map +1 -1
  12. package/dist/nuxt/runtime/composables/useStrandsAuth.es.js +1 -1
  13. package/dist/nuxt/runtime/plugin.client.cjs.js +1 -1
  14. package/dist/nuxt/runtime/plugin.client.es.js +1 -1
  15. package/dist/nuxt/runtime/plugin.server.cjs.js +1 -1
  16. package/dist/nuxt/runtime/plugin.server.es.js +1 -1
  17. package/dist/nuxt/types.d.ts +0 -1
  18. package/dist/nuxt/types.d.ts.map +1 -1
  19. package/dist/nuxt-v4/module.cjs.js +5 -5
  20. package/dist/nuxt-v4/module.cjs.js.map +1 -1
  21. package/dist/nuxt-v4/module.d.ts.map +1 -1
  22. package/dist/nuxt-v4/module.es.js +27 -19
  23. package/dist/nuxt-v4/module.es.js.map +1 -1
  24. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.cjs.js +1 -1
  25. package/dist/nuxt-v4/runtime/composables/useStrandsAuth.es.js +1 -1
  26. package/dist/nuxt-v4/runtime/plugin.client.cjs.js +1 -1
  27. package/dist/nuxt-v4/runtime/plugin.client.es.js +1 -1
  28. package/dist/nuxt-v4/runtime/plugin.server.cjs.js +1 -1
  29. package/dist/nuxt-v4/runtime/plugin.server.es.js +1 -1
  30. package/dist/nuxt-v4/types.d.ts +0 -1
  31. package/dist/nuxt-v4/types.d.ts.map +1 -1
  32. package/dist/strands-auth-ui.cjs.js +4 -11
  33. package/dist/strands-auth-ui.cjs.js.map +1 -1
  34. package/dist/strands-auth-ui.es.js +1254 -1146
  35. package/dist/strands-auth-ui.es.js.map +1 -1
  36. package/dist/types/index.d.ts +3 -1
  37. package/dist/types/index.d.ts.map +1 -1
  38. package/dist/useStrandsAuth-CJsQ5cew.cjs +2 -0
  39. package/dist/useStrandsAuth-CJsQ5cew.cjs.map +1 -0
  40. package/dist/{useStrandsAuth-CPyy4tH6.js → useStrandsAuth-OsoGbmZh.js} +102 -67
  41. package/dist/useStrandsAuth-OsoGbmZh.js.map +1 -0
  42. package/dist/useStrandsConfig-BDUymyIP.cjs +2 -0
  43. package/dist/useStrandsConfig-BDUymyIP.cjs.map +1 -0
  44. package/dist/useStrandsConfig-DMkkLRCA.js +102 -0
  45. package/dist/useStrandsConfig-DMkkLRCA.js.map +1 -0
  46. package/dist/utils/validation.d.ts +0 -1
  47. package/dist/utils/validation.d.ts.map +1 -1
  48. package/dist/vue/components/SignedIn.vue.d.ts +1 -1
  49. package/dist/vue/components/SignedOut.vue.d.ts +1 -1
  50. package/dist/vue/components/StrandsUserProfile.vue.d.ts +4 -12
  51. package/dist/vue/components/StrandsUserProfile.vue.d.ts.map +1 -1
  52. package/dist/vue/composables/useStrandsAuth.d.ts +4 -3
  53. package/dist/vue/composables/useStrandsAuth.d.ts.map +1 -1
  54. package/dist/vue/composables/useStrandsConfig.d.ts.map +1 -1
  55. package/dist/vue/ui/UiLoader.vue.d.ts +2 -2
  56. package/dist/vue/ui/UiLoader.vue.d.ts.map +1 -1
  57. package/package.json +11 -1
  58. package/dist/useStrandsAuth-CPyy4tH6.js.map +0 -1
  59. package/dist/useStrandsAuth-C_MiRZbU.cjs +0 -2
  60. package/dist/useStrandsAuth-C_MiRZbU.cjs.map +0 -1
  61. package/dist/useStrandsConfig-R8O__glt.cjs +0 -2
  62. package/dist/useStrandsConfig-R8O__glt.cjs.map +0 -1
  63. package/dist/useStrandsConfig-j-Bfv_s7.js +0 -98
  64. package/dist/useStrandsConfig-j-Bfv_s7.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"strands-auth-ui.es.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/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/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","<template>\n <div :class=\"containerClasses\">\n <div class=\"relative\">\n <!-- Main animated SVG -->\n <svg :width=\"size\" :height=\"size\" viewBox=\"0 0 100 100\" class=\"animate-spin-slow\">\n <!-- Outer decorative ring -->\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"45\"\n fill=\"none\"\n :stroke=\"variant === 'light' ? 'rgba(234, 0, 168, 0.1)' : 'rgba(255, 255, 255, 0.1)'\"\n stroke-width=\"1\"\n class=\"animate-pulse\"\n />\n \n <!-- Main animated path - Strands \"S\" inspired curve -->\n <path\n d=\"M 25 20 \n Q 50 10, 75 20\n Q 85 35, 75 50\n Q 50 60, 25 50\n Q 15 65, 25 80\n Q 50 90, 75 80\"\n fill=\"none\"\n :stroke=\"gradientId\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"animate-draw\"\n />\n \n <!-- Secondary path for extra visual interest -->\n <path\n d=\"M 30 25\n Q 50 15, 70 25\n Q 75 40, 70 50\n Q 50 55, 30 50\n Q 25 60, 30 75\n Q 50 85, 70 75\"\n fill=\"none\"\n :stroke=\"variant === 'light' ? 'rgba(234, 0, 168, 0.3)' : 'rgba(255, 255, 255, 0.3)'\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"animate-draw-delayed\"\n />\n \n <!-- Center pulsing dot -->\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"3\"\n :fill=\"variant === 'light' ? '#EA00A8' : '#ffffff'\"\n class=\"animate-pulse-center\"\n />\n \n <!-- Gradient definitions -->\n <defs>\n <linearGradient :id=\"`gradient-${componentId}`\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" :stop-color=\"variant === 'light' ? '#EA00A8' : '#ffffff'\" stop-opacity=\"1\">\n <animate attributeName=\"stop-opacity\" values=\"1;0.5;1\" dur=\"2s\" repeatCount=\"indefinite\"/>\n </stop>\n <stop offset=\"50%\" :stop-color=\"variant === 'light' ? '#FF6B9D' : '#ffffff'\" stop-opacity=\"0.8\">\n <animate attributeName=\"stop-opacity\" values=\"0.8;0.3;0.8\" dur=\"2s\" repeatCount=\"indefinite\"/>\n </stop>\n <stop offset=\"100%\" :stop-color=\"variant === 'light' ? '#FFB7D7' : '#ffffff'\" stop-opacity=\"0.6\">\n <animate attributeName=\"stop-opacity\" values=\"0.6;0.2;0.6\" dur=\"2s\" repeatCount=\"indefinite\"/>\n </stop>\n </linearGradient>\n </defs>\n </svg>\n \n <!-- Floating particles for extra flair -->\n <div v-if=\"showParticles\" class=\"absolute inset-0 pointer-events-none\">\n <div \n v-for=\"i in 3\" \n :key=\"i\"\n :class=\"particleClasses\"\n :style=\"{ \n animationDelay: `${i * 0.5}s`,\n left: `${20 + i * 30}%`,\n top: `${30 + i * 20}%`\n }\"\n ></div>\n </div>\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\ninterface Props {\n size?: number\n variant?: 'light' | 'dark' | 'auto'\n text?: string\n showParticles?: boolean\n centered?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 48,\n variant: 'auto',\n showParticles: true,\n centered: true\n})\n\n// Generate unique component ID for gradient\nconst componentId = ref(Math.random().toString(36).substr(2, 9))\n\nconst gradientId = computed(() => `url(#gradient-${componentId.value})`)\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 animate-pulse',\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 particleClasses = computed(() => [\n 'absolute w-1 h-1 rounded-full animate-float',\n props.variant === 'light'\n ? 'bg-strands-400'\n : props.variant === 'dark'\n ? 'bg-white/40'\n : 'bg-strands-400 dark:bg-white/40'\n].filter(Boolean).join(' '))\n</script>\n\n<style scoped>\n@keyframes draw {\n 0% {\n stroke-dasharray: 0 200;\n stroke-dashoffset: 0;\n }\n 50% {\n stroke-dasharray: 100 200;\n stroke-dashoffset: -50;\n }\n 100% {\n stroke-dasharray: 0 200;\n stroke-dashoffset: -200;\n }\n}\n\n@keyframes draw-delayed {\n 0%, 25% {\n stroke-dasharray: 0 200;\n stroke-dashoffset: 0;\n }\n 75% {\n stroke-dasharray: 100 200;\n stroke-dashoffset: -50;\n }\n 100% {\n stroke-dasharray: 0 200;\n stroke-dashoffset: -200;\n }\n}\n\n@keyframes spin-slow {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes pulse-center {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.2);\n }\n}\n\n@keyframes float {\n 0%, 100% {\n transform: translateY(0px) translateX(0px);\n opacity: 0.3;\n }\n 33% {\n transform: translateY(-10px) translateX(5px);\n opacity: 0.7;\n }\n 66% {\n transform: translateY(-5px) translateX(-5px);\n opacity: 1;\n }\n}\n\n.animate-draw {\n animation: draw 3s ease-in-out infinite;\n}\n\n.animate-draw-delayed {\n animation: draw-delayed 3s ease-in-out infinite;\n}\n\n.animate-spin-slow {\n animation: spin-slow 8s linear infinite;\n}\n\n.animate-pulse-center {\n animation: pulse-center 2s ease-in-out infinite;\n}\n\n.animate-float {\n animation: float 4s ease-in-out 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,iVBORw0KGgoAAAANSUhEUgAABVgAAAJ1CAYAAAAsb5u3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAKYmSURBVHgB7P1Nc1RZfu99/3ZKQuqqapfwqVJVux1RyRVxtwd2BOIM7IF9B8kZ3J74CsQZVMEI8QoQrwDxCoBXgBgJGNyIOJ74GtwkET4De3CjirAH9om4yIpwn+oS3UbVDRR6yNzX+ufeCULoIR/23rnW3t9PhFqCokHK3E/rt/7rvyKhMN9rtT4p1eP0I1L0Vfqf6umHImnW/bfZQ/6K1v7PseLvaoo2pXg91sTmnL5eFwBgaHatrqk2H6njrsW10+76atfkupJrc+/6XBcAAAAAjFdr/2dyovGIhMy90MPZbW03aootSHWDc7mBejdUnVUx7ORZd//mt7FqTU4mADjYhh5YkNoY07UaAAAAAIrwNiey4PVzXWoKmSJgzcC+AXpDnlU2uTd5M05OpEcErgCq7LlWG+6qOO+uiefdNXGeMBUAAABA1ZATZY+AdQjJUv9ooaPobE1xI8ABesu99Wvu4y4nEYAysxUFu3rjgtSaC1TjRQJVAAAAAPhAy300Y0WPvtA3a8LACFj7ZFVPNkCX4gWVq/dey/1MN6bciXRSl1oCgBLoXbMJVQEAAACgf2l165obS92llUD/CFiPUMEB+gonEIBQJdWq21fdpNESoSoAAAAAjKxFUV5/CFj3SfqpxucrPkBvup//7pwurQgAPJdMhkWX3Q1tgWAVAAAAAHKxMuXCVoLWgxGwqlf1tGVVqi5Y7W5ShUSrpujaZ/TfAOChNFi9Lq7bAAAAAFCUZuSCVlY/v6/SAesLrdZ3VbvMctJjMUsBwBsEqwAAAAAwdk2XFV0hK0pUMmBlcD6cSNHypE7cPqkLmwKAgtmk2I6iO+LaDQAAAAC+oChPFQtYCVYz0YrcDAWl4ACK0tu8Kla8LAAAAACAd6pelFeJgHVDq4vuR73qvpwXMmEnzuf65oYAIEc/6P6Cm9S56b6sCwAAAADgs5YU36jipumlDljTilVbTloX8tCaUnyOfhsAspZWrd6JFS8IAAAAABCSyrUNKGXASiuAQrXca33tC32zJgDIgFWt1hTfYfNBAAAAAAhWq0rVrKUKWF/owfyOOraUtCEUipYBAEaVVq1ejxUvCQAAAAAQPJcX3ZrUiRtl781aioCVQbkf7KRxIes1AcCAXmi1vqPosWjpAgAAAABlU/oWk8EHrL/Tg6sddZZZSuqNlSlNX6vqrnEABvdb3b/sJshucR0HAAAAgNJyOVF8rawtA4INWGkH4LV1F7KeI2QFcJznum+rD5YFAAAAACi9sraYDC5gTdsBXGVA7j1CVgCHsmv5jrZskmxRAAAAAIAqWZnTxSsqkaAC1udabcSK7ogefaEgZAXwgTRctX6r8wIAAAAAVJHLjOILZenLWlMgkmWkbIASmPm0Qg0AupLNrLaeinAVAAAAAKps3jY6tjGiSsD7CtZ0Z+mHYjAerEjRrc/1zTUBqLT0es5EGQAAAACgpzWl+FzolaxeV7D+Tg+u7iqi0ilwseIlq0AWgMoiXAUAAAAAHKBehkpWLytY042sbGfpJaE0YkUXvtA3awJQKYSrAAAAAIBjBF3J6l3AykC81DbdyXKmLA2MARyPazoAAAAAoE8uZJ0+E+Jm6V61CHiu1UbaEqAulNFsUvb9cFYAKiHtoV0XAAAAAABHs02Rg8yNvAlYrUdn7MK32IVwQpnVrf2DAJTehu7dET20AQAAAAD9m3ch600FxouA1QbhseJloRKst+5vdf+yAJRWurHdogAAAAAAGMxiaJulj7UHq5X8WumvqHCqIvqxAiW1odVFd3u5IwAAAAAAhlRTtPiZvrmrAIytgjXZ+GTL+q0SrlaT9WMlgAFKxq7tkaLglnMAAAAAAPzSUXzLxpgKwFgCVnaVRqrxG91bEoBSSFYl0EsbAAAAAJCJYDZLLzxgfaEH87uKrHK1LlSeOwCvh7g7HIAPpRvY1QUAAAAAQDaC2Cy90IA1CVc7VDdhr9kQd4cD8D7ru2ob2AkAAAAAgAzZWPMH3V+Qxwrb5IpwFUeJFJ/7XJeaAhAc2r68r1b/WFPzn7rPn2jy9KxqsycUzU51P+zrzua24s2d7p/dXX+h9nevu5931zff/v4gJudnNdWY6/5bE+7fPuzf2f12UzvN52q3Xgk4zCDHrx1LdlyNcvza3zu98Mv0+P2k+2s7jnt/v7G/d/vJhjt+N7r/DgAAACpp0z05njqpC14+EBYSsBKuog/NOV08JwDB2dA927BuURVlgZCFnNPnf+mCoj/tBlTDsgBp69Gvtb32676C0D+685eaXjylQbxe/he9uvGvypr93BP1jwR1g+xQ2PE7444hCzhP2PHrfj0sO37f3H3Wd5D/yc0z+tnSrzSIn279u15ee6ph9MLbaISfcRjDHg+9a0uROq3XA0/CjOt1HUbb/XydACaZQnpN8zbMMXkYO598fE3tuIz3TF4Bvh6r+4VwTR3XaznKtWsc3/OwE+XjECta+0LfXJCHcg9YCVfRv/jKnC6tCEAwrDWAu5XcUQXZ4Hfmcl0zS382Uih1mF5Y9WaldeB/Hyac6nnlAqrXLqjKgr0OP3dBr1XRImEP1G9u/3tmr3HW7KHd3q+Prv4qt/ftzcozvXZB/mGDi1GO3z9c+adDz4vDWJXsJ3f+Kpdz9Tj2Gtg5t+UmTvo1zORJVmyC5/fuNe5noPUzdwx9tPwXY3ldR9FxP1un9bI7AN759sXb6mgfBpd2X/n41n8N7jXNk1XJ//7C/xwhrDipP3r412+r431mP6sdh/Z554kdlz+y8qRCQjpW9/Lxmmqv4aePz431tRzkfmrG+f77/uy6nwtZL7iQdU2eyTVgZdkoBtSa08XxjCYADMw2qNvRVuU2LbSHno+u/3m36q8I9sDz+sa/fBAonXz6t0NXt9nf+Z+n/l5ZsHB1ZpFL90E2zz3uDjJ8YcGqhap5TQrsZwOKn2792wcV0/Z9fPbiv2tY249+rR8X/rHvP+/DIMtei9+d+h99DbI+dtcXCy3H6ZW75rxePrrS3V7PP372dyoTO1+tHcWWu96OI9Sy13TWXdsJVz9k741dU4dhx2logdVedix2j81H/6Ht5nMqXUss9GN1v0FXZmXJl9eyn/tpjw/fs40PApnUaU1p+oxvrQJy2+SKcBVDqP9G99gkBwjErravqmLXeKvWssFvkYFiUiH6V90gc+9D1yhLh7N6eOstL8fBphf+RL6wY/ePn/2fhVYbdgNd9+/N7gs3rZfrSD4d7Pu3Kt1xD1gGOVemPTinPrr6Z8f/GRcEl40dKx9f/4vuIPfk0/+Pe8/qKpL9+4SrB7PXZpglsycWfhl8YNVdMeOuC3/08P/dnZxKVo18LpRLGY7V/ey8tRUrdk21Z4Girql2fvjyWvZzPzW+vP/TBd/3RlDf1hvvsqNcAlbCVQzLHZDXrSpOALxm1/lY8bIqoltV5B4MP7l1ZmyDXxtcWRWeLR/yRdH9IUMTfTpikJgBO14sKBrnsWsDrHFWkPoSRFif2+Ps3eRrnLqbmh3zfZQtCNjPzh2b3LJgoKhQ4MR5fyZlfDTM/a+M9yl7Hph9/N8KPTaRv7I/U9mzQO+aam178uTTs3LST/3478eX93/Ko9fuOJGi6zYmlUdyCVhduPpQhKsYzuyWthYFwGvuOn9dFWEPRRYO+dBj1AINC8s+GrJ3Zdai2fEHiD6rjTmAsqpVO158GGiMc5n+xFd+BIH9HA8+DbCnjvlexn18F6W3isBCgbzvAzWuqZkr80TA3mOToDV8ZZ+06rGf848e/k23EjuvjZx8uz/1swmsL+//xOmwgv4dz/YCyTxgfa77N92neeFIkbTpEve1jnTbfX2tpuhCW/Ep+5jTxeigD/tvkeJz9mdjxTfcX9O0v0cl4w7KqwLgrXSmcFEV0AtXfXvo/fjmGfmAMMBPNmDpVVz7JBlU/XVld0YPbvB8zPtUlTCgp7eS4eMcWyMwaYVh9IJW681etfOyTKJPq3VvtErsvI5Z71qt9PH9+DIZHKDGc6025IlJZciFq9dd8EcPzYM1XZj67aSi5h90onlqiGa8v9CllvvUSn/5dsc0O6Dc373oAtuzKkflcN1+ps91qSkA3vFtpjAvvXCVfngIiQ8bOh3FzquPrhe7gVNVKi1RDOsrbL3ybMOlrDcbqurkQ56qFFpYBbxVs75e/pcPNheE/6o4ad17Zvn9hf+p3fUXwviFOEkTJysrm/JAZgHrD7q/UKV+fMexytLYhaA1RY+GDVT7lQaR9qENrS4qOcDqCphPJwmAd2zyw13bGiq5XqUd4SpC4nu42pN37zUgb0lv47/VizP/wI7unutsbqtqbBLAjtHfX/knjk94r7c6wK6ngexeD/80fCnQy6RFgC0XjRTfVMVZqJos+Y/Pfa6LJ+d08cpn+mYtz3B1vzldWnH/7qm0hUDIvCr1BpCIK9J7NYSQCtgrlHB1HDqeDNiCGzgeE8x0Kh7c9EKBLKtOCcOyF/9YzdfUqqxpGRCW9nfVDRftOvppxtfT0Pjy/ocacvsyRs0kYN1R9FjV3tSqaaHqS02f+lIXl3xIzr/QpWXr2ap3LQWC01a0IADeSHuvNlRy1l+PAUl/qlgZ5CPC1aOFdJx2Wq/li+MC1Jjzv1sl+HGGLS/arZcCssK9ASHpHq8P/0ZZ8G0C0Kd7+7HCnejzokBv5IDV+q6qguFq0gIgvvFK01apes5C1SIrVfthPVtdyHrOfbmuALmD8/ILPQxrGzugxHYqUL1qD3e2tA79aa+Xbp/FIFk7CwbQh2t/58fApv3t8f3lfAqDj+uHR7+8xM+WfqWP3EcWfDlWy2S34vcpQtZwVP1YNVONuUzaCPn2fNrPShpf3v+QK6ljRZc1ZiMFrEkvvmr1Xe0Fq1atalWivoWq+1nIOqXpUEPW2S1tLQrA2KXVq4squY9y3B26jGwZUdWXCY+bVVxbFR0Ot732a/lgp/n82D9jS8R3mhsaNxucHrdcffdbwoAe27gti6WtPrz3ZUNo9S5kZRM1v3GsJj6+eUaj8ulaauFqO6CAdWvtPxSwhXEX6A0dsNpgO67ITtKplnvsvWK9VUMIVvc66b7XUENWd4CeF4Cx26nIxlYzi6eEwby+8S/CeNjxSsX18WygNe4+rPbvb/UZ9Pqw+/fr2/927J/56da/e9PfdtwsuPpZBlWsNhnAa5otO/8JrrNdfo18cKwmkufxukbRHuCem7dXfT4n+/D+2/2nn8lgj81u682SxijSkDZ0z8LVRZWcVay2pRtf6uItBe57F4pPBNgv14XDJ08GFGgDZeSu+c9U8nYwP7/zl7kErNv2wPTkefehyZbU7q8Ks4H5RP0T1eof6UTjc02cPuk+zylvz6P7yoq9btOX60cuQazNnqhc9Yy99z+ee6w8jGvZpx2/vWXs41pyOszrmrT/+HNNuvNr73GY1XF5VHXK9qP/cGHk/xpo44jjzqksvu+972VPd1B695nerLT6+jsOe12Vw/frO3s9f3fqf4y8UVW/r2kVl3xvuvN+mADCXsdPbp3hOHVeL/+LF5M4OFi/x6op8zXAzvPNEZ+f7PWzSegTZ+c+eC2zfO0Oupcau59uP/p1dzKyX0e9/3l/z/Zs9ZO7NoS6ydUem3O6OLalXUMFrBtaXVTJq1ctWO0ovv1aM7dCqlY9zoYezLu5CbtaBdPbtCNdK0PADYQqaQcT5ZMSeeSPn/1dpg8vNgv8+yv/PNRg0L4P60Nly79rOT1AZxmw9sMCIwuxR/XTyjMVZTJ9H4aVZ8Ca14TAXsng4D/cz/G8u3TtoMo6GwBYi4LJ+VmdOP/LQiYHsnxdp9ykxuzj/6ZR/e7U3xdaefjzFff+Xx7t/c/z+Nwvq9fZKpIG6VPbC8zssx2jebNKpdfLxYRXs26CZWrE861bWV1gxdS0+35HuacNG7D2K4vzqt/XtPe8MTV/svBQN+/XEcXI4rm1O/k/wL2rd00t4rj97cn/78gTVofJ4vrZk0UYfJysJ9X/0z2zlCBIPZRtQD+ujecnNSDrabCjrVJvdBIpWttV55r1L1XJzOnr9d/o3o2adFOBSNsEELACY+JDw/C82eA/y3D1zd2WXi79/4d+MLSHnvaKVZE96z4AfnLzTCHhQAheutC6KN1QqDF6KJS1vNtZ2HFnx3A/A/Bez1D7sCqNXvXdqCEFcJCX156OFGTb9dSupR9d/VUuk1dWKfVa4VQHWshe5DU1sgCzXu5rg4VVg76mdt2ccMelbe5jx1BeE6s9NkFnAQvw091n2upzxcJ+3aA13ZQqj3u+PecMUv05iD+4c3T26d+6wHj0kNheA9vo8HVO36uxPSKyGqe8KkeV6pHaihbcp6bGYOAerLvatnC1rnJqJWn3NxfKGK72pNWgTYWjMe5mxUDFLajkTiz8qbJiA9Y/LP5TZrPuFly9OPMP3YdBevPBZFEJfBA7dm3Q/YchK6+NPbT/YfGfu38Pxyt805sI+F16nGd9jE418g/HUD7d1QJrv+5eO3vH5naOFaa9iTBgFPac2ztu7Z7/5m62K4wmT+c3/LdzLss9BGyjw7xaNljQnNWkut3zrE1I2bmQ8/K48qOBAtZkY6t4rE1j89KRbr/S9JlxlRIXra34ivsUTOuDHb0pfcAD+Oi3um/nXuknOKxiJAudISpX+mVVhbYEyZem/RgPq6qdymEZvlU02HLxrKoa7O+x45WQFb6ya6qFWa9vZ1t1ZNVcwCjs2LTrcZ4Tqx9d/bPK9UVHfnqTq1n2953KueWQTbZl1Sqj2zv15hllrTsZcj27yZDNc6Xv+NYzu6s38xqDgQLWXdWCWVY+gG7V6pe6uFSmXqvHsQpdF5bfVjCiswJQuI7i86qArJbfW8VJnstu7O/+/YV/ZIOKCvv4+l8oa9YrOI+KBkJWhODV0tNuS4ys5Fl1hWqxoPU/z/xD5pWBxgKhny39SkCW7Fkiq0KAIjbx6k5iZLTi7ISbXMs6FKY1wPDSNgGF6ztgtY2tXCBXqipC9/PcrVLV6n4nNGOtAloKAxWswHg0VHJZ9jb96fb/UhHYBbia7FjN+uHdelpu5bhxWDvd7A3wmfXMzmqQbZu/AFmxZdhZVwb2UMWKPLxyzxVZybvlStatAqyFU1bnFK0BRmNtAjQGA1SwRqXZ2CqSNm1n+i90abFKVav7nez+7PENhWH2e63WBaAwG3pgSyvqKrksBxe76y9UFELW6vnZ1Wyrjez4+SnHTRl6bAle1suwgSxZiPXT7X9TFujBijzkcc+nihV5sNByJ8cewlnLslWAVZtmsdLIzk1aA4xs9rlWGypYXwGrVa+qPIPsVqzauXSjp8qb06UVBVLFGo2pzBuoqkidhiogmj2hLIxj2Y0NuLJc2gp/2UN7VpUMpuhqBvu3sqoQBPKQ1WSDDYypCkQe8rjnWxUrkLWdb7OpYZsoaMLq5bV1ZcUmLUZdbfRxhptm/eQmuKvUGmCvtqLC+7D2WcFamurVprUEmNPX2Z1BpRBGFas7WE8LQGFiqRL9V2sZBazj0l3aOuCDEz0xw5N1a4Ciqxm6uw0/+g8BvrJjNKtBaBT4fQX+GuaefxSbDMh7MyFUT2jPmbYC7VXGrQKGZcFqVpXl9j68qlhrgL1qYxjLHhuwlqV6tSPdntPFc1VuCXCYKc2suU8hvC4NASjSWHZfDJUFteOoWrJQYNAel9sBLd1CYuZyXVmxjVPGUc3wZqUlwGdZhQKhT9zBX8Pc84+T5f0FMHFGK1aKfFZ5vfyvLmjNrvL2o+Xhlvh/+vicsmLXirjaq4cKH8tOHv9Hwq9ejRXf+FKXloUDWS/WH7R6O/L/va6/0MPZk4Tkx7LXaUc7dXfs1yN1ZuN0ksS9x1/1/kzsoqBIcW93n9a734+/S/6sWlG3pcbEppvbbvG6V4v1rHHHDVshD8DC1emFX44lRLLeUbYTaj8z5t2l4fRuDYo9qGdZYTSu97/IHsXAMNrfvVIW02S0CECe7J5vH1ndF6YX/rS74WHFgxhkKKtrYLy5rSLZeTCbUcBpy/y33JhgkJD44+t/nllrAJtMD6kXbk5mbU+RIlewHxmwlqF61cLVLwhXj3VCM7d2tOV9mL6rNzYL0RS6bOOvCcmCsHoans67ULTu3stuMBYp+d/ogP9vZAvAD/z9d386+RMdub/PBW73Nt2v3cUpch+db92Qf512G2VWfM+aMvjk5n91DzPPx1QdmDxI/Wzp/6WJ0yffe0CzQdOOC7fa3252/xyDqIL8mM3rPDGf3VyHVS+PqxdXbwn2BJsAwVPRpwSjCINteDWbUcBqYdjk/EnCGGQmi83+7Jmh6OfV3qacH2W0qagVPvTbkimpeh19gyxDMcU7nWRPET8CVne5vaygxVe+SDZxwjGsOnFD95ryfBl+2qi4qQqyqtRtbTdc/HnWHdsWpM73Kgz3Bqix8pH+Ww33VSP5FztvQ1f3q0fu99c/16WmUApxhXoet1svlRUbpJx8+rfuoeZf9PpW8bumW3j1col5j6yMulQsq1YM0+d/qaxs3X2mcbIqVgJW+Cqrpf1MYh1s1MkdquDfyb6K9U8IWJGZE2dHPy53xnS+22ZyM+65K4uQ2M7Pj5Z+1deYIMvWANZPtqobW+1X9D4+h/ZgfaHVuoLueRlfmSNcHUgSkvmtShtdWaBqy7Q3dP+mC7+f7mjrRaT4oTu2l5RUrY59+XYvdHWfb8aKHrvv85n7uPOD7i8IQYsq1H+103qtLFnI+vHNM/rjZ3+nmcU6S0UD1q38HXLAadUD22u/VhassigrVmE9TvGPBE/w10RG51qn4GWtobDlsp0hw2er2CS4ft+buy1lZfJ0dvcZVJtNok5msPJm+1E2z1CDyrrP8UfX/+LYieWfXf1Vpq0B6Hn/nkLHtIcGrDsB9161tgCEq4Ob1PSK/FdXiSWh6r0lF1I+3tXWMwst00A1lLCr7j4WLQh2P8cLC1stJBaCE1coYLUZ3k4OgzZ7UPr5nb/SZy/+uz59+DfdsHVyfuzzIhjQjxf+0Q1i+6/6tAfzn27/W3dJWBbVA8nSzWyOm3G2B+ihogK+svOsltGEWGg7aBfFzv8f3bVxkNfHqlatL+LrCu+EfZittf/I7PnFKu2YEEYW+tkPoB9ZTVIPo9cqIAt2Xh31mtAaIHd1FeioFgENBYieq8OzNgEuFFv3PFipq2QsVHVh6qJ73c/vaKvR+/28lvoXJa1udT9XtOiC1paY+AiGNQO3FhBV0nYDuFqGmwjtd2Lhl90PY4Mh+/ds0LjzxAKv15ntWorsWWD6h8V/1sulp91KUnsQrtU/+uDP2Ie9j1kvYc0ylLfjDcDBfpZRz7021/Mj2TXyd6f+vnsttf7S9nl/sGcrS6wK2K6phNWHi9PniayeXybqn9CGASOxTZqyaFth1avjnpDNulWAbYS7dUBo/JF7zbKa3KM1wIFmbd+aX+hSSwU4MGANdXMrFwfc/pJwdSQuFHsiAtZCJLu0R9dduDpfgd3a627+7o4LWq9HilYm1bl7sqCLHAYXqT0bH7g1WnltP9nIdJf2o9hDlA2G7N/72dKfvf39nbS6cPfbJKQb91JuvK/XLqDoBaplag9gsmjJQeCCrFnIN7N4SlnYIaDqi93vCAJGt+WCqKyeXybmPyVgxVDsGmrtsaYXsukZb5Pa49ZrFTCbUW9Ue31sJdHeVid238nq3kNrgMO5kZflWy0V4JAK1iA3t1r/UheXhBHF6/I8WClyBiJrSbXq9lVb9t8LVUOvVB1QPVa8vKNo8bnuE7R6K6pMe4CebvA05sY4NkDaP39tgV6v0nV3/UcGoxWUZQWrDwNnW9JqFS7DVoSw/A1Zs+rJLDcXGVffQFRTlitgptz9ZktAf3otjGwjzunF/yOzKkwLCn153u21CvgogxUO3RD6+l90W570fm3Vq1ng2ehoHXUKK2b7IGC1za12wmsP0GorviCMrC01J+S3yaSKtaWAJH1Ia1d3tMXmT4m3QeuGVmkd4JmO4tmoYhWsSZC56V2P1Kl9la72wGnf6/aj/6hs4Ppfnv2dRtVbemoPo76/hhNfZbPpQa+NwbjZ92D9aT+585c6MUDVlf3/3tz9v/XTrf/FRAMyYwPcP3r415ltLmK2A9qJ/cTCn+q/ZFD9aOek9aqmeqp4WU6cWYsAVMvM+T8d6PrXeyax5+UsV9j0WFDYCyB90W0VcPlUJgHyz5Z+1a06t2d5C1ezuvfQGuBonQKLhz4IWAMMV10oGJ8LtaLRN/Y6buieTYV6u2Q9DqhNQK8NQNw9rypWq9qfeq91wJQ7j6lm9UZdFbTlQkvfN6Hq9qzbs5zIHtBsUGsVuFV5sMqiF1ZNH3cHBtMuXLCwz+clkbWMHr59Wrbc2+gm6Wf78YF9bU2evW1RbVZ5ZRVJM27yqpbhxj5WeRXSTvfdnz2Dn9/OY5sMtBDCrqkoTrcPq7umZhHUTJxmI86q2btHwLhZuGrXD9+uod1e/Ff+qbthbRZsw6ufbv87rQEKVJM+VUEOaBEQVnsA29SKcDVbkdSq0g7ieXg/WEUf6juKnj3X/VuTOnHDNlwTxiZS9JUq6Kdb/66f2Qx1hpVMeetVuJruA1YatqI/FrJ8cnPe60Agq+oGH/uW9nowhhNHIVTdAHD+U/f5k+5y1rx6bld9iWbvnrQTUBVvGdgEVBb3itrsCQHjYM8oP174n94WC2yv/bq7QVUWPWbtXP3k5hllwcJfWgP0pa6CvBewBtgeoPUFm1plrqP428jjHow+V7ASrI7GTZgsWRsFdy2imhWFy7qZfdF6jfLtIdCWV7FUqD95LHHLSpRhZV37O44HhO/koNdnFxhlWaF6FJ/6Bo7T9MKfELAWLP4xm2mqqKBzBdirV7nq+/XzlXu2tgmkmkfnCa0B+lZYeX5t7y9Caw9grQGEzLlwlerBAVmwuqF7j124amVQDWEUvWrWMW85VGl1VVSvmX3IbKnXHz/7u+4SpImAqnHHxQaUvlYtZ1lNFNKyZeAwtbStRN8fBQ2E2WDkHfp4Fi/LgCWkVTwIny2V/88z/xBESNjuXuf/Rb6wft+2+g59GU/A6oYZZxUIWgPkx722XgesLsT0pkHQCz2cdUHgTYLV7NkmWD/o/kN7jQUU6NXS00x35R0Xq2a1nbHzWgpbJr4G0Qf1JR2WbewFIB+sGngnq4350D8m0BAaCwetavWle+YO6fi1QNOXCv2XV/5Z8M++gDWYgIjWADmyHqzyWJFNio/yOz24uqutZ7asXchFpHhhR1tPrX2JUKS6Km7z3P+vFCGrBYfW8uDj638uAED2Xt34125vPqRYZl64LAMq+rAibzYZtXX3mZe94fvxBxdsdsYcCtt9h0m9gdRVkLcB64YezCuYQXV8Q8CYvHDnirUDaKtzKy6w3LzCrGXA4/QaBRTCBitlCVnNR8t/QchacZ3WawHIllWuvl72Z8koMCr6sCJvNvn/8zt/1W1nZUUAM4t1hWTcrQK6LWm473jrbcAaqdNQGFpzurQiYAysL+iOOk9FO4Ci1d3t5LH1uhVQEAtZX5z5h+4scRkQsgJANpJJuMf0vwOAEVgbq17YGlLQOs5WAXbvgb/2tAgIpf8q1at5izzqceoLW6K+oXtPrS+oMC6z1uv2t7p/WUCBbJa4uxyoBEtxLGT9aOlXAgAMx9oB/O7U//CmD5936AcKYEB7q1pD2aB1HK0CaA3gv7cBqwuOQlh+S/VqATqKvQ5Y3bH6nQqU9FqNrGqVJeoecMfnCiErivZm5Vl3l1N7sAk9aP345hk2vtqnChuE1Fj2CYyktynL7y/8I5sKHaHNhnoAhmThqoWsIay4KrpVAK0BwtANWNNduuvyX1MoQl3onhfPdf8hvVb940LWW/RkRdFsQG0PNjbADj1o/fmdv6TP2h676y9UerzfwMDsum8Vq3bd/9F9ULV6vPa3FbielhiTB/CBrbj65OYZ+c5aBRS1XwOtAcLQDVh39SaIoKJNe4BCRIq+ksdiRblfxWwjK9u9Pla8IPho1nqyErLmpiUcqp3OIP/u1N93lwdtBzjgtgqBn9EqoMvn94+BLlA8O+9+WnnWvb5bKwCrWCVY7V9ZNocMSa3+kbLSoQIZnrDnVCsI8J3dK/JGa4CRtVSQbsDaCWPDnuYvdKklFMHr0KrmHn2VI1t+vuvCO1HJ6zsLWR9af1wBY2KtA6yq6T/TsPXN3WfBVLZ+dPXPqGJ1ttx75qssA9ZQepoB42YV7btPNrrXdyY5BmP3vzcrLaFY0ewJZSUmYIVHZhZPed8uwO4Zr3JsFUBrgLDUkv+pnZbnXAj8SMhdWhHo9XL4KMcZiOe6f916fNISIBj1HUUP0zYnyIg7xyg/GVC7O6h8pj8s/nO3snVv4OprNY+Fq1WuYrX37OW1p16HAVlWEtGDFehPb1frTx/+DRMTfbIgutejFsWb+Cq7ClYmFeAbaxfg+94B1iogrwILrquZaKkgk8mnuC7PxYrXhNxF6jRi+S3WRC5pxYbu3XHH2aIQGmvncNN9viJkIiZgHZmFd20XuFroaizMnJw/6R4QP9fU2TlNua99qB61KtbXy/+qkDyP7qsqbKBrO9RmEY5O1D8RgP6dWPilPp2f1Ss3EWN9WMvoTdoKAWGrZVTByhLk6rFrwM6T5xpGrzVF7auPu5NRJ3IMQa1VgBUv+Mqe137vrqWzj88pSz/d/nfOy8B0A9bY/93RW7QHKIY7Fs7Lc1OaailDVv3oArqHCqNVBg62+Bvd+/ZLXbwljMxNNHwXWR0rMmMPXtbDL+njlwSaFrjaw+m0G8RPnj7pfl18IbaFvFYVQH/BwdjrZksyJw7oe9duvc60iqG7XDOLgPU0hf7AoCw0+KOHf9Ptw1rWkNUHNfc617rX1fevdXbvtHCBqsqjTbjniSwQ5FTP9pMNbWW4kseeKWcW65q5fEpZsmux/b0+rzqyZ+nXLhD96Go2q8PsWfIVrQGy0lJBJr8Po39hU8id9bLc8T9k3DypC5lV16XhqtXds1lS4GrS9Q09aM7p63VhJFEBG8kh3bnefWyng/Zelev0wp9o6uwXhQWu9u8RsB7Pqo9twHBi4U+PrSi1qtNd95rapgTd93kE9v/PYpkyS52B4VnLgN31fyCAyojd7yyEsDDGwsHjrqndvrjrm3rNRi8fsNcysxYwPxJkYzS9YgJbHfXR8p9nGrT+7Oqfed/j2Xqlzpz/ZXfSaFRWEcvkUjaseEgFmZyU6r4vCXcvyRMhdzuKrst/mYVnSaC8xWZW5ZFuevXwTJYhfDXF66KCtXDvV7kmgZgNPq25fy3HcOyEC3NxNHsPrAdYv2ywa8uL7WPUyrf2d6+VFQvwRw18gXGyHtf7K8TfVZR//LYNS9ZLVe3f+KOHf93thceAdzT2Pn36+NxAkz527Ura7MzpxZl/4D3YI8velDvcH5ARmwixfQlsVU9Wm1RZ4YHvq67s2vTT3WfuZ+7/mfEg9vpR/JCduMDioVocRLg0QUVaztKd2BfluY70rTKQhKsR4Wr51He1HcJEgddqqlU6oE4qSWeTJU7phw3ai+6Z2ts463fphll5Nc+fcD+rD/1gfWXv/SDh6n4fjfqQneEmafazAGXT7VWcDkataupHF4Jarz7bZDBLFvCNOmiGXRP/fOiK+mSZcLZLj0OXZcDa9nRTToTLKjpt2XxWbNUVMKiJbvFQMUIIWDdZ8pu/NGwMQUsjStoCEK6WVax46blWG8LQ3FC1ktdcG7hZc/rPXvx3nXz6t90lob2P2cf/rfv7swNW3WSlF7TakvM8sAHS4UYdvE6OGGBnWXF6wvNdeIGs9KqnXl572m3ZkZWfLf2qG7RieNZmZRST9JN+z4mzGQasrexWTAA9FrJmdR1m1RWGkdcm6QepRe6xX34jXM3Zc923ir+6AjDq7MOenqt1obRiRTeFoaWbClaqjKG3ZPG4MM3+u4Wv4xpg20PqizP/V6aBgZmY/1Q4WBaBejTCDs8WFGX1ftvSaaqVUSU/3fr3bkVrltfMT27Stn8UNa5BmbH7U1b92q0SnBYyyEN32fztf1MWWHWFYRRZsGkB61fyWEf6UciNhaux4mUF4nNdamoEu9q+Iza0qoL5H7S6LAwtKnC3RR9ML9b7DtLswW6cA2wbAL269lRZqo0QACJf3V20Mxr09jZSwzudjCq2iq5sjz5lgNkvu2ZaL+Ss2ETb9MIvBYzbiQyPQ/qvIk9bGW5OFfHMisEUWrBZc+Ga1xWsUYH9EqomtHDVaWoE7ue96X7eBaES3OTRVatYFobSUZxJv+NQDLrk0AbYU2Ncbm0tA7LsLzhR/0jw1/aT7DY6yGqzCbyvVvA5xKTIYKw/68sMJ6Y+vnmGKiqM3c+u/kpZ2X40/GaMwHEyXY0zz/AOAyk2YJXnqlZFVZQ0bFxWQEbZ4CoNk5eEKrF2ELQKGFJNUaUmt4YJK35+5y/HOsB+k2U1wKeENT7baT5XVmxigGAoe0VXsE5kUImc18Z5vrJ2AVntymzvt/VjBcbFNvvK8rqT5X0GOEi8ua1M8AyDAWS1SXq/LGCty2MErNmyzX82dO9piGHjhOI1DeF3enA1tDAZmVnc0ANaQgwhVq0pHGncA2wLCrLuxQo/Zf1eEwy9084oZJwqsPWC9VzMoo9l/GNGg92A/OHKP2d2Ln109c+YrMDYfJThagSbbKH/KoAymih4Rbz3FazIxgut1l2weidWZBs8hRg4bQ7Tf9V+7o46y0KFdahiHULaDLxSG10N4+PrfzHWnpZtBkSVkWVLCAuGiq649FkWIevU2eJahmR1zaniBI2911lttmLhKpMVGAdr9ZLlNXzr0X8IAEpoc9Q9fAblfQXrbkkrWDe0ulhEf0irWH2u+w93FNnIbFGB6khPNCALV93P/TiWaNRSbQ07D4Rh0AO7D3/08K+pYkLuttey64+XbNR2RkjEGQSN9poW1Zd55nJdWWivV3MOzVoFUMWKUFmw+tHyXyhLP936XwLyxsQuxqDwsSwVrGPwW91fcI/id3a09WJD9x7bbucWAGURuNrf8YP7+zd0/+Zz3XsRdwPG8Dd2qg3RHmBXNatcrAuV586D68LAIumRcCx7YAw9rKriUuHQZN0mwHafziqoy8tU43NNL/xJ7oOy3W+zqQQvYgMxey2yCnLbrdeqIgvUX9/4F2WBKlYUyY63Tx+fU5a23b2lXbF+zCie3c8zQ3ss9KkzhrHspFC4juLze37ZiBQ1Yum6C1zlAtd0WW60Hin+rqOoVXNDKvuDsSY222pvTmhiNlJ7tqOa+9yZdf/fuvs7vrK/y/0d7utErPKY0sxAAWu6qVXwwTIy07BerOmyd/TNetZEwvFsswnrYfbqxr+qSBMsFa4UW9psbSmy8smt/6qdJ8+9GlxbgPDR1V9pZunP3uszalWHWe4Cv9euVXJe1sgs+LSPrDZSOkhWfRctZKxyz0U7nuw4q2UQ3lsVq/19MddR5MiujbMuXM16wmkrw/YzwGFmLp9SVnhmRb9qY9hTxPuA9Re61FL5HBX8pf1RYwtdXbQRW/Vd+p86muh+3en+XqTkT1Qg/lg5qQt9r2NLWgOwqRXe11Fn0X0KbnO3cbKeNW7Sx8492mz0obdkr6iQ1aoBahktTa3qUuHQWIjzs6t/ltn73quG+vHc47GHrIcFqz1WJWh/xjYpylqWgahVsW7mFLDaOW+TOVnYoX9z91r98zt/qVHZcWkTH3lNAAC9cDXrnu82MfxmpSUgTzYpkNW9y1BxjT61xlFcRYuAgqW9IAkrBuCC5Lv9/llrkbCTbOQFvMdd7C4X0fe4hPo+/5CErEUsEzZUA1SPVchltUFPjw18Ps2hKqpfSTj15/rjZ/9n9/w5Kjy2AdrMYl1ZswrWrM4Bq2DNo2WIvT8/v/NXysr2o+x6+oZqa+0/MnvfbQKgqB68qBabWDn59G9z2VDzVUatMoDDZN3Wwp6DOgSs6E9TY+B9wPq9VusqkVhRBovQKqU1yM5vu9q2Xpt1Ya9WpMhaLKzEim+4o/BK78OF1+fefa1rHel2+mfLuJR+dltvqGAdUDRE/+Oqs5Do04d/k2tgZQOtLKsB8lzSjGxluUFPjx2rNoD/qMBekhYaWEXWZy/++7HB6l6f3PyvuWwqtJ3hLtoWtmU50ZJHCL7TfK6qy3rCwqph2fAKWeltRjj7+L/l8jxB9Sry1nu2yPTexeoL9KmmaCx7idCDtXgNYQAWCPZnQ6uLLkCseoDWUne2Jn7ibmvrrzTVOjVAe4W9nunh7Cd6M+9C10UXup5VCYJr93NcdZ+Whb5NamZ9R1u0CRiQbSD06fxsdyOVrAcw9qD6Rw//WlnZJlwNSi8UyrIXq+lWkrrB/PTlU/r9hX/MZQled9Oq87/U9OL/MXSbA/s+bXLBguYs2XmaZVW4hcZW0WgtDUZ5LX929VcDBdD9sGClyv1X98qy7UZvw8M82ligOrqtQNy16MTCn2Z63u9H9SryclzLn1HsPOGZFX3Z/EzfjKVIyAJWBs4FsfYAMdWVg9hs91nanfRdrd5O8ZF7jdwxtW67ve8qXsuyZ3EazDbTj/T47b7GDYVr1n6OQaqiq876H2/onrUJuCoMpLekd+rsnAvE/j3ZSGdE0y64/cT9nVk+sPKwGp5uKOQG4LUcqpom3cTAHz/7u25V85u7z7S19uuhN++x7++Eu+LaOZBlWGAhbdYBq/28Vhmc5bllAau9lm9WnrnJln/tO2i1wam9Dxai57HsnGDlnawnLMa14SHCZNfIifpH3VUpk6dncw9Ve+yaRPUqsmLH8dT8p+7zJ937c57tUlh9gT6NbQWm9wHrhCZKE/7SHmBgfQeGu6q58Ceuqzqa7ue9+1Iza8NWqA4qDSWbadB6R4FOFqTnYVPom7UJiJPqXwwh6Rt56m1gZQ+Hg1a0WUVLXmHL9tr/VhYsFLJQ+bAlspOnP1UW/osLrAo1e0K+sVDo91f+ubvEPi92rNnHz+8k4aNVPLa/e31g5aMFApF7nbphwVcfd8NBG2jlFRTY92XHWda7tudRGWx61wB77ey1POh1TM6dEzrhwuhJ9/PlGbLkMUDtBUWHyap/5JQ7tjqH/Dt2PNi1ddDjwsL6LN93qziedu+3rWDYe623SbZBvrfjXtMog2uTBXr/pUK9Y497Te36NaoT7vU89j5l18sxtZOwCYDXTAB477hj1WRxDbC2O58Me/0r+Di2Y7eollbHPdMeJYvriLFn/2G0W68r36d2kD18Mv+3N3TvmTwOSmqKLoyrvDdrvr/WvmkrPtVPwJpWrz5TyVm1akfx7deauVVUqHqUH7S6HIVZNbw5pelTJz14DUPirl+WBpR2tYMFVUVuUGLhig22d7/ddA9BL9/rqdkLq6yaZcKFVHmGLW33PfznmX/QKOzh0yp1rboWB/vdqb/P5WH341tnusvwquj3V/5JWxlXYNmxbJttjSv4KIJVrmW5hH3mct0dh//Vq9fs9fK/DFxB+vOVv8y0RcRhLBw4rm2EhdHWBmZcG8/5bphjOFlR8pdsROZsnntM33WPcawe7g/uvp935XV3U66HfxP862/3mN9f+J9VbQfUmtPF/G/oh5hMlxh7q6NOKQb0tAcY2Eq/1asuXH2scmtZL9oiq1X78YUuLf9G9zZr0k2FZXZHbxbc5xWhb7EL9wMN1L3UXQ6Yw47Ag3qdwQYvVvlFuDoeFiTNnP9lLq0CfGeVjFvKVl79bX2SZeVaNwhY+Sv5xipI298NtoHP6+V/LSRgTarC/7Ibch2k12ObcDVbWW8SFyqbeCBc9RvH6sGS6tX82wNYH+0yhNu9e8mLM/+Q+Wof//W/h08eanHSIsBbHTePoBKgPcBAWu0+Twzb2ErlDa5bkeJzNgMzp0srPoWrPV/q4i13dF9RcDgfB3VCM+699vt+gcFktYPwz5aqWUHpA3totqCmU7mHZ3Wru/Ngy8XLurTu1QB9YPsx4/G5P2hYaq+LtXApgg3eD5sUsf9GuJItW2bLa6puL3iblIO/bINUjtWD/XS3lcvmm3v1NtEsCzuWfCjmKFp7zK0AXcAafye/1VUODaEvHel2v60BVMKKuqQVgK5ZsBrCZkwW/tr3q7DMv9BDNvcbgLVUcPeLR0JpZLHRzbD9oZAdG3DYsrnK+TSfJem9/rZl0+27mHG4MnXa39voMIPKl0tPC5usOOzaeeL8nwjZYqm13ORBq3t8w2/WvxwfyuP+dZAyvv7TC5W7p6xkuen3MGqRIt8rkuoKnLUHEO0B+tVKqiKPt5OEq3WViIXLLzV9qt/XwBfp93tb4Zhta7shDKRGW4XS2LYNtzKoXo083ACqirbXfq2X16o1eG5/m19fMVtC+/r2v6tMDluSPgqfW1NYJdKg31+vRUQRDqtSq3FNzVzVKwItXP3DYgUn4QJE9eqHeit1ipDXyphxij6t1j2lPeb2AMYqWL0OWN2A/rQCR3uA/kV9LjdPqle1qPLotgNwQeWSj60A+jGl6WX3aV2B6Cg+LwwkrahuCkGzh9WXGVXoEQb4w5a2D7qxT8i21v638mTVMrYRXRlY+J7H0krfw4Bhrk9FtYg4bJdpJq2QJbsnEK6GI/q0vBssDstW6LQLattTq3+ksqlYj/7muKtXTS3qbqDjtbrC1xCOZdWb/S6J3ylRawD7uV9p+kwI7QCOcrIbDNdC6se6IAws8mBmEKMp8mEVxbJQ8A8lXN6+n/USzHujlm6rgAv/GHw/VgtYLDSsIqtiHZS9738YYzX4MN8zjnZYmF1m3YlUdxzTczUsTFq/z9r1bK39WkA/fBmj1mqqeT89/31SrRgk2gP0rfVTUgF5rLJUr1qv1dCrVveb09dWwRpKq4DZDT2YFwZCFWvYLGzhYbXc3qw804sz/1dpN2qycLWoXoI2EdHdRCzQ19LOdwKWwVnLjbK1iKiyzua2qmR3/UV35/CqTqwgfL1e6FsrxWw8iFJo+lKsVttRx/slvRMBV4DGiqiS60PbBY39hoy7qt1U+Fq7ioOvWj1I2iogiMC4o05DGBhVrB+yAY3vqGapDjseLRjMu8qzSNY32H6mojdq6YWsobULKCJcLWpDqGHFI3x/9trlGazHPx4c+sWev6Yhin+sxmvaq1q1CTZWqYSp/R3vW2+CYBzhKtffcLX7bDNZhJoPfQqO01EUcpUZfR6PEbuwpt/j0CqC3Z8PPbRuWkuAEM69YaS7zYdSxdoQBkYV64deXlv3tv9lb6lzHtUsVasMCkkvGAy5L2tv06H/PPX3+nGMgbG9ljbgC6GqsbchSBGTKbHn5/8o16fe65hXyHpYOO37awr/JNfJf9fvTv0PqlYRLDuO7XllnBMEpQxYqzHBtOJTrlJLP7fksVA3ukqXH9eFo6x8oUvL/f7hOPDeqy54vDuni+fK0hLgMCc0c0sBVLG6a8tZYSg+zRT6otf/0qflxFb1160EyKktQFmXoWdtnK+THZcWUL65G85SO6tgsYGWBQYvl9a9qcZ6tfTUu3N8LzvP7XwvKoj2+fy3gfKo31+eLSLah1REU8F2vMOqfw9Tls3q9usFUsl18inVdyVQ1mP1KHuP43GvsgphNdqgdkr4M+3X9mxlZTdgjRT53iYg0ArWzqJwFPfIOn2t3z+c9l5tKFAWrroweVEVkGx4pbvy32zIPZ7HyWYK4xK1CsiqEtP6X9qAfNxhVm+poFX95RlO2WDA92XC49b2YMBkx8AfFv+5e2xue9o2oFetat+jVbDYQMvHwKB3jvtUGdxrn2CV6kWG0dtP/G1BkdWgsheyZn1NPyxIqWLAMqhBX6MyvaZ2TbTz3SZ6eoEUwWp5VOn8t+N4b7Dqw3Fs1/uyPdPuNJ+rzAZZCV2UbsDqvrHv5LdQQxDaAxyuNUjfVbMTcPVqlcLVnkjxmgIQco/ncUsrlVsqgd1vR3uo3Tvr3QuzxlE1uLcSoKilghaK4XCvPXp9rLLRQncfJgFMN1RNA8tetWoIfWPtHN9bGTyuSs5esDqu9gl2jfF1MLqV4fHdu6ZbqJXFBIWF9IcF4fbfWBlwOHttBg0M7NwIuR+1HSt2n/3RTaDYddLOdztOCFbLJ/Rj9Si9yQGb/P9d2vbHtwmC3kRvWSTXy3IeT6nW62Qs6pXI/ue57i3FktcbB3Wka1/qoncv4GGS9gCdYndiCIQ76DZtg6dBZhusetUFrKFuJbg+p4tnVEEbuvdYngeY7tpy211bloSh/Fb3FzqKHypw0eyU/vjp36pW/1iDOm5X8wn3d360/Oc6cXZuqL//OPZAaNVar12wOq4HqY+W/0LT53+pyflZ4d17YiHPm5WWfGXH5lRjTtOX6zrhPuet97rsPHleuoHkzOIpnXDngL2Odj3Ji4Utb+62vHn9JudP6uOb85pyn/P8uftlA/jtR7/OdYKpd97Y+21f20c/P7u9d9uP/kOvlv/1yFDB/r6Pb57J/VgKSfe1c+/tT+4+N0yVdu8+PH3+T717TXs/j33ufv3jtpu0/bFbzdhuvSRIrRifj9WjdNuybG53PyeVoNtqf7v5NlgNaeIo9Gfa3rPWSzcpWO4N7+Irc7q0Is+kAattHBQ9lt9WXEgVTM+/H7S6HAXeLzQPFq7Gqp2b09cDtaVwQd0d92lR4bE2CGfK3nP1MIGcB03riysM7bnuPyzB5nNvH2pnLp/q68/bA4xtejNIzygblE81PteUC1uHDSR6D07tb12At/a/u9WzDMAwKjsWu6GROz4nTp8cOTDrhQV2nPbCgjL2NztIFud5j71uyfm+2e2xSnUjAACoOG+zwW7A+kIPZ3e05ftT76Z7EU8qEM9172kcbO/YfAwbrgZcvdptg+BbX5AiWWuPCf/fu6CuLT5K7yH2PpemfNECEgtca/WP3vt9CzLtI6uwqJZWP/UqoA4KYjqt191KAPtMNQuKZMfjZBoQ1mZPfHA+9NixaXqhapxWsSBhr99E/ZP088d9v46EqQAAAO/xOmOJel9s6J4NjuvyWu3MoOHcOAS+nD0Xw4arZkOri+5vuKPAxIoufKFvguhDmqcQri3uIn2qykF4FsrSKgAAAAAA4CM/WwP01HpfRIq8Dy476jQUgF1FwS+VzVjLeq4OH46H12rBdrQjXH3rkTw3pRrV5iP6LDnebwsAAAAAgAzZ3ik+h6um9u7L+Ik8577Z8wrDZaFnfZQSbusPLO8rqz/Q+kKXloWumqKmPOcmb9iZJwNTml52n1oCAAAAACAbrZ+SsabX9gas3lewOg3r9SePWXsAeq8mYsV3X2l6pP4YsaLgwmoLlIW3JnSiKc91FHHOZuCkLmymx38lN3UDAAAAAGTH2k3aGDOEjcPfBqyTmgkhYNWO3ni9/J72AImOdO0LXVoc5SSwsNp9WlRArDUAvTzfdzI5BlrymLsQfipkIjn+42sCAAAAAGAELmO5FkrG8jZgDSEESfhd0RiH08YgLy3bjOxLXbylEe1IDYWF1gCHiP1vQUIFa4asN45NNggAAAAAgCHYmNL3vqt71fb92vvNaJx5X9sEpBWXDVWUNR1+pekRNrN6X6ToqgJCa4AjteQ3erBmzCYbrE2IAAAAAAAYgI0lQytg2xewBtGHdXZLW4vyUIAVl1lpRS5c/FIXl7LqixFgL9sVWgMcLvI/YK0LmTuhmSX3KYj2MwAAAAAAL6xby0kF5r2AdUozawpAzdtl+OFtyDQKazaclGxfPPW5LjWVoR1FSwpIm+XQx5jwPmT7PqlAR4as9cyUpq2yuyUAAAAAAI7WcvnKBQXovYA1nD6savjWJqBq7QGsHcBLTZ/KsWQ7mF62bGx1vClNtYRKsvtK2j6jJQAAAAAADmbh6rlQ85XaAb8XQh9WbeuNVxWOFWoPsOIO+FNZtgPYb0MPrDVAXWFoubB5RThSOnmTy/GSlUnaBOTGbpCErAAAAACAQwQdrpoPAtZIcRBtAvzbAKm87QGsFYBVrFqwOqeLV/I/4DuLCoQ1XqZ6tW9eB6yRamx0lSNCVgAAAADAAYIPV80HAeukZqxXotdBSGr2uVYb8kCJ2wO0bPm7tQKwitUCD/ZQ2gNQvTqYljzWUYeANWeErAAAAACAPUoRrpoPAtZ0KW8Quz7Hiq7LH6XYKbtXrRq5A9w2r7Ieq3m1AjhIYO0BmlSv9i9SFMLEDXK2J2QtxTUTAAAAADCU9VeaPlOWXOWgHqwWsgXRh1WebHZ10h0MLow8Y0voXex7xQVJa1EYVcBde0PVXrXq57rU1BhE6jQUCPd+3xD61lHnR3mso4gK1oL8Ir1mWosNAQAAAAAqxcaCLlw9V2RBX94mD/rNXcVrE4puKgDpZlfL8kCauq+kH0paGETzsXTehZj22YsAxwJV972sJ0F6vD6uMPUgcTjtAVaoXi0XN8FAwFqwL3Rp8QettiK/ViMAAAAAAHJirShttbRKJjrsP2zo3mOF0Vd0c0rTp04GkHrb8vea4roLsBs16bSSwHVeOUrDVOsV+sT92+vSxPqcvvZyaa5VI+9o64WCUDvj6+voKxekrUQebwZX1ot8CDa0uqhkUo+QGwAAAABKKMmn4mtzurSiEpo87D+4H/qJC0Ma8t+sT1WsR0kDOftY2/v7FrxGas+6ILSefESzE4q+it9V1M3q4ODBQuVN623p/qwt8/9xItmYatOC1FeaaoVUbt3WdkNh8DakBkJkN9jvtdp01z2b2KsLAAAAAFAmrd2SbGZ1mEMDVtsd3YV1QSzbdAHjVQUQsB6GsC7RURxIe4D4tgBkym60L/TwzI62lt0vrwoAAAAAEDzb8+cnTS+Xqd/qQWqH/Yc0VW4qDLPJElMErqEAtMM5L4CgWKuXOV1css0C3S9bAgAAAAAEKWkJEF2wjdTLHq6a2lH/0doEKBhskhKyF1qtK4ylwWxuBeTMWga0FZ+znSUFAAAAAAhKpGjtpaZPfaFv1lQRRwasJzRzS+GoU8Uarp1Aqldrih4JQ6mp9qk8FlEx6RWbyPhClxapZgUAAACAYLSsavVzfXOhClWrex0ZsJ5MXoymgkEVa6gi1ULov9r6rEKzL1nbs2kb0DerZp3S9Bl3/NwQAAAAAMBLNmZ75cZuVapa3at23B+IpJAq9qhiDZQ7Eeflv6YwNHctIWDFUGyy7wtdWm4rPkXbAAAAAADwStPGajZmq1rV6l7HBqyTml5xnwJ6gahiDU0o/VdpDzCa2PP3mBYB/uu1DbCbt5jwAAAAAIBxakaKz83p4jn2qukjYE3bBIRUMVT/QavLQjDaqoVQvbpJe4CRUcGKTNjN227idjMXQSsAAAAAFOltsPq5LjWFrmMDVuNeuKCCpUjR1Rd6SJgTiI7ihjzXkZ4IQ/s+qVL22i4VrMGxm7nd1GkdAAAAAAD5iZKV7SsEq4frK2BNX7imwjG7rTdLQihOy3O1wCYZfDMZQAuIGc1UtldM6N5vHRBfEWE5AAAAAIzMglXbvOqlpk+5YPUKwerhJvv9g7bZVSw1FIikinV15SR9IELgfYuANsuQRxR5/x6frHAz7rJI+/6s2MdzrTY60mJN0fmY9hQAAAAA0BcLVV0GcndC8RqBav/6Dlhts6sdbdkGUqEMVGe3VbvpPl8QvLWhBy546/h+TK3TsHk0vm9w5awLpbJ35cVvdX+hrc6Cm3g7qwCqqQEAAACgSHtD1ZeaWT9FAdLA+g5YrbprQ/esx91VBSJSvGBVTCTu/qoprnfkPcK30fneBoKbR4mlG9R123zYpE6kTsOF/ufdQ8Q81a0AAAAAqiZZ+q91W60uxevkZqPrO2BN1FakTjABq4kV3XGfTgleCmGDq5qiR8KofG8R0BIqYU5f24SJfdyyX9sknLWwcNciF7xGNhHgfTsLAAAAAOhXGqa2lASq38aqNT9PxkXI0EABqw1MN3SvqYB6sTr1H7S6/IUuLQs+8n6Dqx11uPCMIIQ2ELHi74RKOmgTx6TKtT2bBq+zLnj9Su9aC+z/DAAAAADj0ko/b6YfrY70Y03xek21TcszaHlYjAErWLvL7m/EihoKCBteec33ajEuRiNrz3fnzDw2oRohOt6aezeb2xQAAAAAAMeoaUAHVfsEYHYnaRUAj7zQQ6tq9Lqy0c38UNk4oki18/JcR1FLAAAAAAAAQxg4YE3+T9FthafxG91bEryxqzch9DpsCiOJFXv/Ps/RfwYAAAAAAAxpqIA13ZG5pcC4H/b6C63WBU9E3gdvE4oJ3kaQbCDkfa9K3mMAAAAAADC0oQLWRHxD4aFVgEfiADaJSVtiYEixogV5jjYQAAAAAABgFEMHrHO6tKJkh7LQ0CrAH6flNyobR+d9/9WIKmUAAAAAADCCESpYu70VQ+zFSqsAT0RscFVqgbQHsOtBUwAAAAAAAEMaKWA9oZlbCrAXq2gV4IVY8r0Ha1MYWqzosgIwqRkqWAEAAAAAwNBGClhP6sJmoL1YDa0Cxuj7ACqI2eBqeGmF+KL8t55cxwAAAAAAAIYzUsBq0l6sLQXI/fA302XMKNhkAEvHY00QvA1pV7UgqldFn10AAAAAADCikQPWRLBVrLaM+c4LPfS6F2gZRap5/5rP6WvCtyHFihcVhPiJAAAAAAAARpBJwJpWsTYVpvqOth4KhWqr43v/VcLVIT3X/esKoELZtOmzCwAAAAAARpRRBatVJIZbxeo00lAIBYkUeV3B2pG+EwZmvVfDqV7V+i90qSUAAAAAAIARZBawfq5LTQVcDeZCoWX6sRbHBaxfyW8tYWC7ql1VINWrLkSnPQAAAAAAABhZZgGraSu+ooDFih6+CGB3+zJwgbbvPVhbwkDS6tUlBWJC8ZoAAAAAAABGlGnAmi63va1wze50Q1Y2vSpAXR6bVNQSBuLOnTsKx2ZadQ8AAAAAADCSTANWM6XpZfdpU+Ga39HWTSFvdXksVifkY7hwG1pddJ8aCgfVqwAAAAAAIBOZB6wndWGzI4W84ZVZZNOratulRUDfrDVApCioSYmaokcCAAAAAADIQKScbOjeY4VV0fYBFxRf+1IXbwmZ+t4FchOKnsljc7qY27lRNu5cf+o+zSscm+79PSkAAAAAAIAMZF7B2hMpDr2K1V6cm8+12hAyNen/LvO0B+hTWukdUrhqaA8AAAAAAAAyk1vAmm4gE/KGV11xd9Or1bpQJS3hWDb5ECteVmDc5M9dAQAAAAAAZCS3gNWUYMMrM7uj6DEha3Yi1WblNypYj2Hng5t8uKPwtNLJHwAAAAAAgEzkGrDahlc1RVcUvjoha3Y66ngdsHakH4VDvdDD7qSD/G/1cIDwW5cAAAAAAAC/5Bqwms/0jfU7bCp8acj60PfqS+9Firx+DWuWIeJQu9q2ytW6AtQux7UIAAAAAAB4JPeA1bQVWxVrGZZdu5B1i5B1RB3FXr9+seLvhAM91/2b7vVZUJhWfqFLLQEAAAAAAGSokIDVQo2OVJalufOErKgiF65ed+HqkgLVpj0AAAAAAADIQSEBq/lSF2+pPMtzCVlH4HuLgFgRm1ztk4arywpXk+pVAAAAAACQh8ICVlOiVgGGkHVIsectAmqKCVj3KEG46kJ9qlcBAAAAAEA+Cg1YS9YqwBCyotTKEK46zc91qSkAAAAAAIAcFBqwGmsVEClaU3lYyPr0hVbrAkqkJOEq1asAAAAAACBXhQesZlInrFVAS+VR31H0mJC1PzXVPpXHonIdm0PZ0L07ZQhXRfUqAAAAAADI2VgC1pO6sBkl/VjLhJC1T773YK0ya3fhwtXH7stFlUC7fNcZAAAAAADgmbEErCatKrutcumGrBt6MC8gMDY5YO0u3JcNlcOK9X0WAAAAAABAjsYWsJo5XVxyn9ZVLnWp8/Q3urckIBDPtdqwyQF1j99yaNN7FQAAAAAAFGCsAatxIcgF92lTJeNe2Ju2SZAAz/1OD67GJQtXYxeuUr0KAAAAAACKMPaA1UKQmqJS9km0TYJcyHpTgIfSfqt32urcUrm0vtClZQEAAAAAABRg7AGr+UzfrKl8/Vi7XMi65EKsZ2x+BZ+80IP5tN/qokqH1gAAAAAAAKA4XgSsJu3H2lQ5sfkVvGEtAXbUsXC1rvJZmdOlFQEAAAAAABTEm4DVtBVbq4CWyqlum1/RlxXjYlXUG7r3uIQtAXpabGwFAAAAAACK5lXAmmxKUyvlplc91pfV+l5WuWWAew2+EwplVau7iqxqtaHSYmMrAAAAAABQPK8CVjOnr9c7Utmr0BZpGeCvuERL5/dWrbqfa1blRWsAAAAAAAAwFt4FrOZLXXRhUOmX+tZpGYC8vNDDWTu2yl+12kVrAAAAAAAAMDZeBqzmC11ajhStqeTSlgHPqtwyANl6rtXGjrae2rFV8qrVrkjxFVoDAAAAAACAcfE2YDWTOlHmTa/2qu8oelaValYXnHvdY7ejKMhQstcOIFb0WCVqc3AUq3T/XJeaAgAAAAAAGBOvA9aTurDZVnxO1QhZK1PN6n5OrwPWSHFQAWvaDuCmhfQqfzuAvZpW6S4AAAAAAIAx8jpgNcnS39oF96XXoVyGetWsN2kbgKO867O69cyF1kuqFuu7ekUAAAAAAABj5n3Aaub09XpNUaXCFAvMXND6eEOriyqZmuctAiJFX8lj+4LVSvRZ3c8q2+m7CgAAAAAAfBBEwGo+0zdrHemaqqXu4r47G7r3tEzVrL63CPAVwWrCrgOEqwAAAAAAwBfBBKzmS128ZZvaqHrmrW2AC1rv0DYgfx1r/+sRgtV37Py364AAAAAAAAA8EVTAamxTm4qGrGaxDEFr5PmmZe6k8KJFgL3HG7p/k2A14V6Du2xqBQAAAAAAfBNcwGrSkPWuqivooDXWhO8tAsYaZD7XasO9t4/tPXav1lLVg9XU+mvNVG0jLwAAAAAAEIBIAftBqyuRosvCypTiGycD6Uv5vQuFJ7rhobc253Sx0DYB1gZgV9tX3cTBorq9d7FHi02tAAAAAACAr4IOWA0h63uasaLbX+ibNXnMwsQdbb2Qx1zAWsi5YdWq7j277v6xeSpVD0S4CgAAACA3yfj0zYJUOy3Fs258Nhu5zyoB97NsWos+9/N85361/rkuNQUgF8EHrGZD9566T/NCT8tdPG9MucDV16pW957F8pgL9U7lFepZqOpu3mdZ/n8swlUAAAAAueitIqzYuKxlWcGcLq0IQKZKEbCmFZGPRch6kBU3a/XIt6pWF7Bai4C6vFU7M6ev15URa4swqdrlWHHD/bIhHIdwFQAAAEAuqp4hRIqWP9c3Vd08HMhFKQJWQ8h6rJb7aEaK7/qwLMD3gLWm6MJnI4bSvUpVQtWBEa4CAAAAyI1tGO0+LarCOtK1L3XxlgBkojQBq0lL/O+4QGtBOEpLYw5b3Q3NwvCGvBVfGXTZRHL8vZmPVTvvXttFlv8PhXAVAAAAQG5eaLW+4/emy0XZnNL0qZO6sCkAI5tUiaQXhgtsfHWsuvtwAWC06ILOlpLNsR6d0IlmURdXF4J/F3mc78d9Vtdu6MF8pE7D/fnzu9qat4bo3Z9OGALhKgAAAIBcuXD1umC6BULuc1MARlaqgLXnC11adCGrCFn7Uncfi1ZxuaMtqyxtStG6Cw0f5Vnd6t4br2fJ3Pf31UG/nyz7j+Y7is7WFLtgtTPbC1MJVUdCuAoAAACgCA2hq63IVv82BWBkpWoRsJ8LWZcjZqdG1bTA1YWHT06os34yowDsue7ZTo035a91F/hdmOjefGunXXw6706WeZb954JwFQAAAEDu0r1bXghdHenRl7pIi0UgA6WsYO35QpeW00pWQtbhNVy42HDh4tKOeyVdMLrpQkYXuMZPXPC47l7b1py+XteA3P9/0/N8f37ibV+eeM//ImPrrzR97hR9fwAAAADkLFkSX+o6s4HUpE8FIBOlDlgNIWu20gpOF7hGjSRyjK2tgP0nF7pGLXerch/xd+733a8nNg8PXyfWu/NlqCwXst99rZklwlUAAAAAReh3r40KqQtAJkofsBoLWTe02nIzVbYknSXe+Zh3wao1yE4rPW1WsNMNX91XVvXacr9hQZr7bP1XO0wbVpgLV2/YeSkAAAAAKIgFrAxEAeShEgGrmdOllQ09sKrJh2KWplBp1ev8e7+DyupI177UpVsCAAAAgAJFiii4ApCLmirElqvbZjpKqikBFKvlLjlnvtRFwlUAAAAAhYsVE7ACyEWlAlZjO5WnIWtTAIrSndwYZkM0AAAAAAAAn1UuYDUWss7p4jnrAykAuepIt935dsbOOwEAAAAAAJRMZXqwHsQ22fmN7m26lPmmAGQq2dwstn6rKyqhF3o4+0ZvZic0MRupPdtRzX3ufLDkKNrTkmTXfU3QDAAAAABAuVQ6YDXWD3JDD5psfgVkan1X8YWyhInPtdpwUel8LJ12v5x3oWl9R1suXLU9SDuKrV1+d/O2D/ck3bul24T72NA9+9JaJVgA/cRN8DQ/16WmAAAAAABAkCKh63ut1l1YYiHrvAAMzVoC/KTp5VO6sKmAWagaq3beBaeLLiTNtRl+Uu2rtSnFN05S4QoAAADk4getrkSKLgs91j7xlACMrJI9WA+S9mU9Q19WYGgtF0ae+1IXl0IOV1+4yZYN3XscK3osxUt5h6sm/TcWdxQ9e6771wUAAAAAAIJBwLqP9WV1cccV7embCOBobhZ47ZWmz4S+1N3C1Z1usKqGxsRN8iwTsgIAAAAAEA4C1gPM6dJKW/E5JX0SARwiWdoeXfhc31wIvSWAScPVusYsCVmt7ysAAACADLUEADkgYD0ELQOAo1nV6ktNn/pC36ypBDa0uiiPNrprK1oQAAAAgMzUFAVfFALATwSsx7CWAW3F1vS5JQCm22u1LFWrPS4wviqPuIvzeQEAAADIjHvmbwkAckDA2gerZp3S9Bn35W0BFdZx50AZeq3u90IPZ2NpXn6pCwAAAEBmdtShDSCAXBCw9umkLmzO6eISG2ChoppWtfqlOwfKVLXa80ZvZuUhC34FAAAAIBNWPOU+0SYAQOYIWAdkG2BRzYqqiLoPH/EVN7lwrmxVqyHwNfgFAAAAAkYVK4DMEbAO4V01a82C1paAkrFg1TZ4s02sbFJBAAAAAFACERtZA8gBAesI5vT1ugtaT8VcoFEuK7uKz9gGb2VsBwAAAACgutKVeU0BQIYIWDNgQVRbsQWtdwWEq9tn1U0aXEl7EwEAAABA6bSTvVUoJgGQGQLWjFgg5YLWRTbBQoB6wSp9VgEAAACUno3fXchKyz8AmZkUMpX2q1zZ0OqiFF13X9cF+MmC1RuEqgAAAACqJl21d+q5VhttRQs16XT6n+rKQSTNxu5DAEqJgDUnFrR+r9XmhKIl98urAvxBsAoAAAAAKq4na1qEdUcASokWATmyGbE5XVyiPys8QSsAAAAAAACAjBGwFqDXn5WgFWOyQrAKAAAAAACQDwLWAhG0oiiRtOmOsRuvNH3SBatXCFYBAAAAAADyQcA6BgStyFHThavXXmr6lDvGlk/pwqYAAAAAAACQGza5GqN018LF77W67JLuxUjRZeW0YyHKy6pV29LdCcVrVKoCAAAAAAAUi4DVA2nQumwf6c6C10XQiuNZteqjl5peoVIVAAAAAABgPAhYPTOnSyvu08pzrTY676pagS6qVQEAAAAAAPxCwOqpNDxrWvuACalBVWt1JRtWaS1SfJdQFQAAAAAAwC8ErJ5L2wes6P2q1rMibC21NFRdjxXdfqUTTVoAAAAAAAAA+ImANSC9qlb7+re6v9BWZ6Gm6LwL4maF4PUqVaX4yUvNrBGqAgAAAAAA+I+ANVCf6RsXxFkYR9gauFZHemQ9VV2ouk6oCgAAAAAAEBYC1hI4KGyljYCfekv/3edHsWrNOX29LgAAAAAAAASLgLVk9oatG3owH6nTcIHeeXU3ysKYrHekJ1SpAgAAAAAAlA8Ba4ml1ZH2ceuZHs5+ojfzbUULNcmqW+eFvDRdoPrtpKLmH8QGVQAAAAAAAGVGwFoRacjXTD+0L3A9HbnAlf6tQ2lFitZtYyr3sU6FKgAAAAAAQLUQsFbU/sDVWEsBqT3fUTRP6NqXlTldvCIAAAAAAABUFgEr3trTUuAtC11riuttddzn2unYfS3aC/QsvNDDayepWAUAAAAAAKgsAlYcaU/ourb395MNtNqzUjTfUTybhq9W7VpPP6pgdldvLGxuCgAAAAAAAJVEwIqhpMGraR7037/Xan0yDVpj9zlOv44UfZX+kXr6eVbvtyGoKyCxousiYAUAAAAAAKgsAlbk4he61HKfWhrBhu69kP89YOdf6OEsbQIAAAAAAACqqSbAU7HiR/Lf7Ja2FgUAAAAAAIBKImCFt6JAlt67k+i8AAAAAAAAUEm0CIC3pjSztqOtO/JfgzYBAFBu1lu897X1GN9N2+CkLXFQIXbPf6M3H7QwmtDErG0AuntAiySOE+CdvddTO2/sc1vt7nP0jGY2eabGIPYeT2bvPdpw/UWI9h/XBz1jhH693P88Ndndu2dis3c/MKGdvwSs8JZdLDZ0r+m+bMhz23qz5D4tCwAQtA09mHdDffdROy3FDSW9wOt7/0wse9Dt/fl7tuJi0/1eK1bUqil+4v7E+ue61BSCYIOYJORpz0eKZjuKZ21TTvd+us/x3ve/+9lN/rr3Pzrgb+rY5pdvj4297Dgx6bFiAwc7Xjbd3+9+HX/nfr9lHzZwIgxAGdh5VVPNXUs78+kmt+5zd+PbfZMTne7/9s4pO7/S86Wl9Dxxf+Zbd01eP6HO+knOj0qxAGZHO/U992U7ftzXctdnzcYH7Nex9x5tetdfxzZpdsdTtO6uvd/ZvXpSM+sE+iiaHde7ejOfbAT+9riu28dhx/VBzxh7rpempbfPFvZMkRzjFlju2aB8LJIN0KMF93O5nzU5f91Hff/zVNz93857v7f/OdvuBzWp6eu5Gwnw2HPdW3In0035rzWni6eEICWD6+iZPNNWfIqBNpCvZPD2ZsE9Ep11D0ULcbabKzbd4+LdKfeZUGB89g7Q4+7gJQl7dEB47pH1vYE9IQB8t/daqqQ4oq582CDbBWSdR1xby2dfENNQMddoC5/smvvohE4087zWbmh10Z0jvq3QZBybo16Y6oLUs246ad7d1xtxwRt5pwHluk0uJBNWE+t5h67Jz7191U0iLyqn89ids2s1dW77VNRAwAqv+Rp8HcTNEp2jYilMBKxA9TzXqnvAja67B6H5gh50mxa2zunSipCLd4OYyL2nFqLG8wW+v0VYTz7iJwRL8MGeUPWyxrfirMlEVrjeVfJFl3OY5BxWM69jioC1GuwZ0wLVOFkJ1ZCfcpusSp+x7TivqxjNKcVXfLgHELDCexu691gBtAlwVtzN6YoQHAJWjEvvAazTXToZzyssVuFhy5ufRJpYG/fyo370ZtPdwGlpjIO4lvv3bxC0jub9MLXQSiefWDVK033cDeH880ky+KudV3LdrctvLas6csf5ky/0zZo88MI9N+2qdnnM19KDrLh76m3OB/+lzz92P254Pgm24p7P7mZVREPAWl69+4o7XhYDndh1YavuTipeGyWo/EH3F9xr8FDFa7lryoVxX/8JWOG9H7S6HCm6Lv9tTmn6FEv4wkPAiqKlQd91F04uqSRsmc4Jda75WEHkSbC6X4ugtX/JddpC1Le9cUObkMhbyz3Wr02pc5sqvsNZMLiThBsNhak1zutGr/Jf/r9+TTfAv8HKMr94ei/uVyuLc4+AtVz2LINfULmeS2y1zO1BK1vTe6wVx9U1Hi2Xx5wZZx5DwArvhdQmwF1cb3yhS8tCUAhYUbQN3XuqcgZE7sEmPudTwPM7PbjaUWfZ48GcbURwhSDgfe+WHncDVRu41IV+NWlH8SEPBn6ZiRQtf65vbqgg6WtnweqiwrLi7kk3mHQYrzSYtzYSiwpfa5SglYC1HHrHtEdtLfLUdxW3D8f3uPMYAlYEIaA2AevuBnVGCAoBK4r0XPetcnVZ5dV018FzGrMx9H8aVeWDgEB6loWkRZX0O+5Z0q4HiyqJInr/B15x+FbRgTQSJagYP0prmOsrAWvYAqriz0PruGPek8xmrHkMASuCEFCbADa7ChABK4qSDjaCqMgfxTivg4G3X6hUNeu7zU2C7lkWglbVg9aSXntzncwKcJLqON6tsCirMrZBOsJAk6MErGEq+WTBoFqHPVO4gDWWB6Y0fXJcbQJqAgLQ6TatD0McSBAMoHg7FXkwS5cCFs4CgR1tPQ14UFd3r91jq3JWidn7ZNWEu9p6FneXbIddHReAug3o3Wv+zAaJqqCdcj6bNSzIUg7cNehmXJJ2Cnt0Q/ayX1/HzdryJNf2SoSrZtEdV09/o3tV+Xkrxa6xdj1MJ+gagqn3nimSCYNEXvejYbzRm7F9LwSsCEJaxddUGBpVHcAAOM54gscxaKhgZQoErIVEupy5NJJQ9f7N57r3In2fqFgtXi9guunTQKgIUUk3RbMKcGXInl+tR3iZwzG7vlbxHMhbeuw8bqtzq4LX9lkXqty0n58xYHmUYNI+b/U0aO0e9+MMNX1CwIpguIfjRwrEliIuxAAOUpWdz+sqSIkDgcUyhKy96g8qVf1h54oNGqsSBNgxGJf02htneK39QfcXdhWVdQPG96TnAGFYRpKq1e6x01C1NXa6q1CsnzhC9f5zCxts9sGO+2eTqt0UCFgRjklNrygQ7sS6zMw4gL3Sa0JlrgvfFzBwtUFMyQOBRXvIV6CSnmVUf3iqW81ahWWtWVd5+iSrgNWWzUeKH1ZsAmTewjBC1uHZc02Fq1YPU4lWP2WVPrc85rllcO41WxBcZgUEwhoVu5t4U2HMjs5u641dmJeFIyWN8LcWO4rOuod7GwTVhS7beMsd8yqrSNqMu43Ste7e+7tl39gnGeSzt2RWrGLGBnUqOXvId0Hyo9DOj3RDCKo/PGfLWl0Q8GmZd1iPVJuN5cW+G15KKrUqGybU05CVza8G9EIPXEC99VBc4w+UtqKYddfWa0IQ7JjeVceeW5gswNCoYEVg4rsKRKToKlWsR3vXCF83o2TWqy5URlrtYKH6os3223JoKknQD6sMqUK42hP7t+PwsdJNheqC98rY83cv9/PVhQPZ+06lVi9k5Zm9X7/V/ctpEFUXDmXn1g+6/5Bjy392TO+o85RKbIyKgBVBmdLMmvu0qTD0qlhxgF5Awo0MeyyWeZATMxDJRBoILKta6u7hP5ilVxt60J04EUJSip6/B+ko5jljn97SbnGe9tTTakwcw57f3Tm1wvN7f6yAJOn3S8jqKwtX7ZgWkAECVgTF2gS4T0FVsQofsMF3BQMS9McGOTRJxweqHgi4h/+A7icd7n1hKm3IinfsWmqBj9iQaL9GyD2vi5C2k1gWBjVPyOonwlVkjYAVwXEzgWsKhwsEVheFfTo8wOIoi2kFXKlQwTo8AoGuRiiDs6gCu5CXWNAbqx2iLry1q20L0TlHD5Au6WajlgPQTmJk3ZA1UkTI6gk71wlXkTUCVgTHNvpwg7d1BSNiF8k90h6bDQFHiNVmgIOuPeFq5QOBtrYb8py9XzHvVdAsRPmN7hGklFAaknF/PUKkmH7w+6SV7YvCqOY7Eis8PGDneM2d6wIyRsCKILnZpkcKR50q1nd2CFfRBzfDf16oPMLV9+0GsFnPG72hOqcE3ADh5nOtNoTSsN6ZIiTrh7vvhLexYF4IV7MVUVE/dhau2p4P9BFGHghYEaQTmrHdo0PZ7EpWxUrfnZ7orIDjzXPOIO3HS7iaitisBwWKXchEJV85WLhK78yBNJhgIJRHOe2qZs+WdQE5IGBFkGyzq0hRU+Gob+sNy+0SdQF92NFOXaistA/kovCWu+99JaA4dSr5wmdBIeHq4JIJhupO9BLKo4x+pwdXaZOCPBGwImCd2wqIGxhfpSKvi2o09KldqmMlklpCX9KBHZNS+3SkH+W5Gc0EtLoEfWiUoB9rSxVlFcgxIfmwKlsckYZQywJKxK6HHXWWBeSIgBXBss2u3KemwjFb9SrWNGAmZEZfOuy0WkkM7A4XKfY+vLQVJgqqhQ+O4wYLtDkKlPUZFCuHhlbF4ghCKJSVux5ep+8q8kbAiqBFUkibXVW+ipXNTzCgukqkphqh0zFsYNdW55ZwoICqoNeFMpnd1fZ1BaqqqwfSNit1YRSVKo5g8x+UVbrh9KKAnBGwImiTml5RWJUyQQ9SRjXJgz4G4G5Qn6pEOopawqF6AzvhUAEFRd8KpWItOzb0gBY/gbAwgTYr2ahScYRV+IlndZRSVNnxN4pFwIqg2VJE9wAZVC9WBilANU1pqiUcyg3sHoqB3ZEmNRNEZWgtrE0o0bfOTQVpolIV1TZZRZiQqdktbS2q5Kw9j6jwQwml1at1AQUgYEXwTmgmwOWkoQ5SAAyL3pSHs02txAZ4x2mmx5D3JnSiKZRRw3akV2CqNrm1k2xqVRcy4wbM51Vi9F1FuUWXBRSEgBXBswFnpGhNYQlykAIUrK6Siajs+8APur/AplbH6wS07D4NgptC6XRUu6rApMdjSxWQViE2hKyV+rmdzX9QVklFP9dEFIeAFSXRCapNgIkV3WFXXqBq4ifCW/bgGymmor8PE4qDmkiMOdZLyZ2vCyE+u7jj8a5KjirEfLUVLaiE2PwHZbZDuxQUjIAVpfC5LjUVXrVMvUo7kwKD6kg/qmQC3JgvV7uqsct1f1rpfS4Y7vxdEUopxGeXMNtJDcZaA1CFmB83aC7dMmP69aICGiqHlpKsY+Wwj3RFbzP9aEWMN8ZiUkBJRIpvxIoaCkiyM+nqykldagnAe2r27F8ytlT1N7p3w/1sla/atKWsbXVKWRGUg6YC8wt3X9vQvaZYmlc69uziPi0rIHbtdcejrXYKrsVBP9IqxIaQp1lrExDaZNdRdrstP+K6gBKy8zUOcBLfgtG2dLemeN19bv5ixJzgezeR4kK/eqTarHvunq+pdjpWbJNxDSFzBKwoDXvgCXAwN5tuRnBOFRBrYrNb1wRU2Je6eOsHrc5HFW66b1UzuyxlHUAtuDY4xg0SHsU8wJdRkEHTlKaXd7R1ViXbUM+upyyDLUYnuZ41VQLJcROzkg6lFYfX1mMlUnw363trGtC20l++125qQw/c/bA9b89qblxyWmw4OzJaBKBUrIpV4WnYJi+qgLbaLFVA38rYIqDnC11ajJPrVUsVxFLWgazP6et1BYiWGOUVYj9Kq2J1IatNaN8u09LJNFytC7lzAcRZlQShPCrgtMLQbCs+NaeLV4qeuLTnyzldWrFxifv3z9j34aLpK9a3nBYDw4kElMxz3Xsahzf7Yg/9p9KdbkvLNsbY0Vbpln0jHxZAuhv+skou2Zk4mm+7AbKb9fxU2WhozANue0g7aFlT2hqg9P0QsxNfsYdfBWpD9+y9Dn1ZduuQzwepp59n3UN2vcQTCZtuMHZSgXrmnkc+0Zt5q0iMFc2OeO21sHlc7/OKPNqgyAbkcXJ+7J8Uqit5jUKvjirF83pa9fxMJZYei/Y+tbTvmu2C8tl0iXTZr9P9arnr+SmVjHv+iOWxtBXADVvZJk/ZGMXdJxdris6HdJ4cNgYpAi0CUDruhnlbybL7kMzuattmkq+pxNIeaPawQ+UajhVVpLozj036ftCqNbuvyzPJoK7DksT+tUIOV417yL01kfTs9NbeUMg9Q3yXXHsm1m3VRRYP6L3+Z3smUqyqpqGwBd2P8lQSkDWVwbXXPdfUNb73c1FjlJ47LkyN7/bbK9COG6uAdufBeYVXeeue199YSNxUwMpYvTpK38q9Ey5plXJDCFraf9VbybWzdu5Lz1co7R2jJL2+u+3NGsKhCFhROjYYdQ+7wS2XcoO6JXczeFSm5vmHIGBFX6oSsFYJS1kH4wZ7QfZe3csGuS7wv+tRz+GW+2i668u37ntqucB/Pe8qhz39z5p7f79XGZIO6OsKTJn6UWIwFg50FN9+pZlbpwas5twzYF9KB+xB3RdcOBx0wJpMdPpT9TyKXqg6oXhtlPHT/gkXC1x/rm0L6C678Vkl2riVjW3o5N47+cp9b9dCa/+UTviv2KSxmyBbrvJeEkchYEVJWW/D4KpYrRn3nRd6eKbMrQLcDeWJj5V18M+kZoLsO4mDpbtcLwr9arnr5ZpK4IRmlna0ZdVqhU6uJf3Doqa78zxxH+sv3TXllEf3172VIUmrkNrVkAbzZepHif6MEqwepDdgd5MwNlgPoqqyFk5fxwOVoXo16+Nwv/TvtPvvWrICIVqIk1Y3dSEIbXVsM1l5aiXk1UnppPGiOzeWCVo/xCZXKKX0ohViOFNPWwWUVk0RoRn6sV72nsTVw4Yag4lvjKt/VNbsXO5IuW9CmW7IsOI+X7P+W5/r4snP9c0F9/mWhZk+hav72fdn32uywUQw1fuh99PEYJq7is9Yb/SszyX7O+NwNqoN9ri36lUFPtFpKzteavpUHsfhQew+bPeQpEdpfEWsrgpCTTWPJ0Jqwa9OMnZu2OZY7uc5I86LtwhYUVqR4iD7maatAhoqqVi1poDjEcSXyHPdpzXAYILvvbqfbeJgu9IqQxaoRorW9gaqyS68F2+FGk7b920D+UDCptkNPSBkrQAXal1zx+W5PM+rgELWugK1E3bvxJYb251z95KlcU2W2X3Z3WvOZX0vQ/bSTcx8tB5aa4Dj2M9jzy2dZC+ZyhfHELCitPLYOKYosaKbKqn0ptIUcISIh9fSsIoZ96C7KPTNBnAqIWsVoNEnT1pWwWQD7b0VqmWp9u0JJWzqqNMQSiuZxOiGWrdUADvubdJEfpt9oYeB7iUQ5koSOyZeafqMD/tU9Kr2ouQ+3RK8FHm634d7fvlOJWX3Cff8atWslS6SIWBFqUXhLDfab976Uam0CM9wpGYFNnurDI83tmopXU5eU3TBljhZFaQbxFkVZNT7SJZs187Yn7E/mw7+c3t4jEvUGmA/axXgXtMzQwSHzV6VqlVJWAVTFa4RIYSsofejxJFa1hKg6HNtVx3vq6B2tFNXYNLVcXUFxq6BNpHmW4sXOy9sMjSACYFKij0NWF02UerwMV2FcyaQ1Qi58LbzL5CVDd17rGCXxNTOlG0ZQY8LkFdoio0DtOyBtawBU1F8OL8sDJtRN2B9Jg9YJVbc3bQifvJKM2ujDtZs44sJd2+JVDvv/s5GFg/zVplp4aEqYM8utLZRUn3vf0vfq3X3+dFLTa/43Du1CM91/6HHm1/Z0sAzqrCwnzMPNdZ7se+bXtmE22f6JqhgzR2ntvnvogJiIY1NNMlzIW3SdohW0mO2PNzxbs+edXkmlGM6CzapEyebjtdVMBuDjOv+NSmg5KyK1Z3cDQWpYxelUg5cbHmNeyBpBf5AgmytuxviBcLV8vBkt+JmHkFdepyu2MczPZz9WG9cANYNtRsagvV0+1KXKhGumt4utPa19fGM1O4G1LtuoMc14H2TOnFlR1sN+VmRUxfKZuwTnSc0c8sd87Zru6fLfDtBtQiwlgbu9fR1kuZAIQVR9n26MY0Y0+A47hj5ShVhVd5uMv3chCKbhKyrQDOaGdvEPC0CUHp2cgfcjLzUrQLsgcRmmKxqS0m1UuUbY1dQS91l2vE5q4IiWCmPiSRoXNT4NNPjynp13sqzCvJUd+n7pRX7t2zlwaD3HLsGJjuxVpOt1LB7tX1wDfiQtVZwx5Svuw4H3I8SB/BiFUl6zD+Sp+LAJhZ2uhOAfobVB0nvicsKSECbtGG8Fqp0z7R7SbqvQJErctdPjnHlExWsqAR3o152g/3zCujhosdmQzf0YK2srQLSh/ixVm0lS339WMa81ziXNwCjG1slhwWrN8bVozO9Vi+668rypGo3j1rabZNKHUVXvgxsqSmK53NFX9qPstKbWpSBXY92PWrRU3OTry7IpJVUBqyVTWyxcBhaobbKsZB1Q/fsGn1VwMFmd7Vtz8fXVBF2T3Gh8jn3c98pqN3RWJ9HqGBFJdiJ7XH1Rx+6rQIAICR1FSgJK3UtqVj1Y6dh25jDJkrSqpamkoc++3DBQXThpaZPfUG4ij6k1RiersZpzwvBc9epaz5N6k5qxq6VXq5sctfvoAo23HvbUADsPp5WuwVrLgmHmwIO4c7Hpd/qfqUmj+wZxp6Ji1hV3B5zJTkVrKiMtPrDLmZ1hWf+N7q35GZ0bwkA8B7bxfelTlzxcTOkNLBYFjCiSPGaC3a8q4zqBBY24UNpv8sVecQG5Bu6ZyFrQ56pSZ8qEC7IWegoDuIcbUs3yrByywU8V8bRdxLvacnj19+dkytubH+yamN7a4flruvWh7ahHNi9bNzXECpYURlJ9Ue4vXHcyXr9hVbrAgB09apWbVa86jvNo/zSij7vRIGENzhUy9d+l26w/EQYiQtyzisMrbKETRbwuOviFWFs3LXjO3nOje1vurDxTtXG91OazqWS1cYDPtzLCFhRKXPJ7HxTYZrdUUSrAABItGLVzlHZj6pI2wS05Jkq7YpcRj4vyZ5Qjd6+I3ITkUG08ChbIJm2Kgq4PV3Y3H0plEn3RTe+f2ZB63OtNlQB9iyTbOzaPeebGoEVWsSK1myDWV/GA7QIQAXVrrk5jqcKU4NWAQCgdRcKXPiFvm4JqBA3aFyPFdcFZMCH5ZRH2VFnfcKG0BiKVcbthBGwrvjQOz1rU5peTtvTUeVfsKg7CR+URRcU2vL5lpLNWu+W8ZzYKy18W0k2m1ajo2i+Jp12v1d3799s/OF503Ifm+45qOXGAN9NKmr+QSeavq1gI2BF5dgOz+7iZTOKQe7wmLYKWDvJ7vIAKsiWFb3WzBItAVBFPi577FhBCkLkbWuAHgt/3TO7MJy2avN21fBdVMDGN+NglXo/aPW2C4SuC4WyEC4O4Ng/QF3vwlb7dVPdiVU9sZ/JcgyVTDrJt6KSIGBFJQU+o9hrFRD0LpsAMCgLV5NlRUA1uXPAqjfkk5A2/ME7Ae3W3hKbBQ0lkP6rzTJX6gW+yXKwSlT93nB3/ob7SZbsCSANXV3gGrXcGf5trdsKIXa/ntgsY/gaIgJWVJLNKP5W96+4B4+HClPD+rSUfekAAPQQrgJAZlZC2a096bGHYVj/Vf9fu3JWr/bYmHNDqzfEPhqFSqvfbaVTGdszzEeK590xtZCc3xYkd3rha0vd9gjRprVJcH/uu44LY2vqbBLCFoOAFZX1mb5ZcxeiprozQ+FxF847L/TwzEmWyQIouUjR2pwuLgo4hvXyqqnmBh8d699V37MBU13vVxDV1Z/W/q+TgUvs7r2RG7B0fkx6vdU2bQCz676e0cwm92b4rK34hgLhzmPOpSHF/vdf3ZzSzJpKzn7GHW3dFL1YC+Xu/003Ob+gaqmr++yTRK/2v/Z1vCeETSet1veGsFTBZoeAFZXmHjCvTCiyDa9CvOHVt/VmyX1eFgCUV+ulTpRqd2GMzk0wzu7qjVVwWIWWbYrQeLcpQjKkyGhxYH3/19Hbvm7x23+lN4CZkC1N3NJz3bMBTEtJONRKeqfW1i2EndTMOgEsxiiY6lVj545vbTFCYCvdAqj8XavCtZBerOMSP3H/U7WA9Vjp5lGNvSHsQVWw1vu1VwFb1v6veSBgRaXZA2bINzz7vl9odYUNrwCUlO0Ueo4NrWCB6o7euIFSzYWp8YILMevaF7r4FCakA5i31WNJQJSEsHsD2F4fNcJXFCWk6lWMIvK9elVpAFYJaS9WAtYCxao1u9swYlD15CNu9Cpg9/Z/VXfiONl4i+eWDxGwovJsB1V3wbAm8AE8iHyIDa8AlFftwi/0dUuoJFvuP5n0GDvvBqYNpSFlGfQC2F4ftb3hq3smWd8bvFI5ggwFVb2K4cUBbKpUhfYAPUkv1nBb04XI7pvuNW8pgHMhIGlekmy8tf+5pdadNInXqxy6ErAC6s7MXHMXhccKExteASgdFzfd+IJQqXKSpf9bixaqul+GsMQ1D+8Fr/aRVrza+UAPPwyN6tVKOS2/NasWwLhA6lFMwFoo2yCV1gyF6D63xN2WDO9CV3X74OrJCZ2ozPleEwCl4eRtBSpmZ0oA5bJiqwuEytjQg/kN3b/pwtVn7mHcNgNpCG/1eqYp0NU28EKT6tXqiDyfjOlI36piJjW9IhTKhV1NYVzc80q85ILXhy5wfeEC18dusnjJnvdUYgSsQGpK08t6f7fgkNR/4y5YAoDwtaiyqg5bgWEP3W64/dQexGMqNIGcxHeFyog9n4yZVNRUxaQVfC2hMGkRVVPwQSOZQO88dc99z2xSvYxhKwErkLKbnpthCXanancyX7ellQKAoMU3qLIqvxdarVuwmrbnaQhAnlpzurQiVIL1r5bnOt0+05X0SChUxKS9j+o2qf4ubF1dfBHAdasfBKzAHoG3Cpjd1huqWAEEy4Vta4QA5WYTgc91//qOomciWAWK0hQqY9L/TX02q7txX0xv+YKl4/uW4Ku6i8Hv2HOhC1vvhB60ErAC+4TcKiBSdJUqVgCh6qhzTSgtawewo62nseJlAShMRHuASolU830sUOGQcYKAdSyoYg3EYhq0PrZnRgWIgBXYJ/BWAVSxAghSR7pNa4Dyeq77N9N2AHUBKFIrreBCRbhJrLo85u73P6qiqlu5O17p6qimEIqGPTNa0BpaRSsBK3CAkFsFUMUKIEAtNyC8JZRO2mvVqlaZ/APGoylUSkex1+OAiGXyLaFw9GINUiO01gEErMAhAm4VQBUrgKC48O0u1avl80IP5neSqtXS7RILhIL2ANUTKfI6YI0VbarC3PtDFesYBL7XStVZ64DHthmWPEfAChwi5FYBVLECCEirI60IpfJb3b+8qw4tAYDx2qQ9QPXEnlew1hRXOmDtqFPZFgnjFvJeK0g2w/K9mpWAFThCwDNds1vaWhQAeI7q1fKxcLWjeCV29yIBGCcq5Sqoptqn8lhEwNUSxsIKqNqKz7kvKx3yB65bzepryErAChwj1Jkud3KfFwB4jurVcumFqwIwdu76+kioHN8rWIFxSib142tCyOrWm/U3uuddW0QCVuAYAbcKaDzXakMA4K8VqlfLw3quEq4C/phgMyF4KNZExXuwUsE6bnO6tBKz6VXwXJh587nuX5dHCFiBPlirgEjRmgITK/LqggMA76ux2UBJ2FKtHXUeCoA36L8KH7XVZnk2xu4LXVomZA2few+XfQpZCViBPk3qhFWxhvZA0GCzKwCeWp/T11RXlYDdZ6wfltjQCvAJ11cAOAIhazn4FLISsAJ9slYBHSm4C/C23njXmwQA3OMQ1aslsatte6itC4A33DPrdwIAHImQtRx8CVkJWIEBfKmLt9ynpgISKTorAPBMO7BrKQ62odVF91DLRB7gn6YAAMeykLWm6ILCW62KPSxktc1WNUYErMCA2uFteMVmVwB802Rzq7Kg1zfgIza4gq8mNFHp9mWRItq3eegzfbPmxvlnxCZkQesovrWhB/MaEwJWYEAWCoS2jKDjQlYBgCfcNemRELx0KVZdALxT9Z3a4a9I7UoHjC4AImD1lI3zpzRtISttrMLlzq/Ow3HtQ0PACgzhhGasVUAwD65upnSspfIAsFdNtaYQtBdardtSLAHwEpsIVpe7NnvdfzdSjQpWeMv2XZnTxaVI8TlRzRqqero/QOEIWIEh2IXXPb5cUzjq37vBsABg/FoM/MO3Q2sAwGdUr8JbHXWqHrB+JXjvc11quqD1FBtghcn2BxhHm0QCVmBIc7q0ooA2EHAn+6IAYPyaQtBeJBN2CwLgKyaxKswFeF4H7J2KV3DGtAgIim2A1VZsQetdISjxGIoBCFiBEUQBzWi5h62zAoCxi58IQdtJ+nozQAQAD7kgyPcK5rqqrS4ExXqzuqB1kaA1OIVv9k3ACozAlg4onGqsxriaPQPAOxNUVgWP9gCA51pCZUX+v/91VVQ6FqsLQSJoDU/RVawErMCIQqpibWu7IQAYn036r4ZtQw/mxeAQ8FpH+lGorJpqXlewugDitCpqV2/mheDtDVpdhHdFTGr5rJE+uxaCgBUYUUhVrLuKGwKA8SFcDV5nUQC8Fvm/RBw56ihqyW91VVZEwFoiFrTaviy2GZa77p6zqtaITQa9E6td2L4BkwIwMqtijRU15Dk3o0IfVgBj05G+FYLmBg5nY5WHDYTiZDDUSn+r9eGfiWb3bUoyq3c9aOsCAI+01d6csKubx77Xat3CKVVMXOHq3bLrFV0908PZj/Vmwb3XjZqi8zE968fOPcdddZ+WVQACViADdkHd0D0boPl+AZ233j8ndYGZNQDj0BKC9cINiHfcfUSBSqpKoqZttOYetls76qxnNcC3sGBCE7OR2u6jNttRx4Wyqrt/5yslIaz7fdUZaAHIm13XfB+XTCSbJa6oehpCqZ1Kxtkr6Ydsk6W2ooW00IkK5vGYtfchDcFzRcAaOHugr6k2X1PsHtrtIT7uNc62DxtMzB7yMN/68HO0GSn+zpaV1NTZnNTMOkFc/2LFt6MANv5Ie/80BQAFm1BMi4CAtd3zRrf+JjDu+WjNPdfczvPBut+gNqls2albEGtLRdvueS3tR2jPagy8AGTF64C1U8Gl8kkfyE5dqJS97QTtGeATNxbvuKDd5QZnXVYzz8RrMTrJ5EZTOSNgDYhVHibhWO2sC/Ma707IOB3ufDjoOWIYVN/3Wb2/J+p+jrSjLTfjcs+WzrkBcbRu4av7M+sErwc7oZlb7jXzPmBtJw80TQFAwWJNcO8IWCewPt7uYfr2T5pePuXRM0v6vfQmGpr7/7sNwG3S3Hqmp8FrXbQhADAgF96suxFdXZ5y17fz7tOSKiRSp1GmFjsYXPoM0NSe+38vdE3680Zn0/OWCdeMWaCtAhCwes5C1R29WXCHxOVdbblANZrVoXFq9tIZlYb7Kr0hJMHrhu613PfiBgidb90NsknoKtnP716Xpjxf+lHlnTsBjNecvqaCNWyh3D9a7m534csAj7f0HLGPtd7v7R18uWexy2LgBeAYcbcwxmv1qvVhjZNQGXjPvtD1Vu/3exOubXXc59pp6wVPxetICnl2ImD1lPWIcAHmdQtV1Q1VvVuUV4+6syuRNXC+noau6aAgfjLlLhAnK9i43P3sd+X/ZlcNAUDxqF4NXwjB3vorTZ/zqWp1VHsHXz9o1Q2w2IUawHGsJY/fG125a9mC9gRKZZb2MG8I6NNBE66mN+lq/d4JXwcya6F13sUeBKweSVoAbC1adUKcDmICW0Ywn3xEi+4G8rbKNVLnUVUC1ynNrLmw+Y78VmejqzDYhikCyqMlBCtZUbPl+zWpdOEqAAyj7cZeE/Jb2iagEgHrTgD7dCAMeyZdzdr+/24hovV5j5ONNetpAFtno03TtryKgLUKnuu+Vasuleygf1vl2gtc1b0YlLfCNZQ2ATvaqSvniwtGV0t68PA+oSwIvQKW9ID3uhqq1VZ8gXAVAJKN99yYxOuNrpxGhYo+GgIKcFSF5t6WQ7bJ5oSir6rU87WIzfUIWMcsbQVwx+cm5Bmqu4/FPRWutnSlaRWuee7sWzQ3/HwUe38TzX/2BqPrqEMFK0qjI/0oBMuWosVer6uJb1Splx8A9MGe9Rvy2LbeLLlPyyqxDa0uis0K4YGDNtnqOaDna10lC15r0qfKGQHrmCR9WCxYrfRsljthY9u4a8mFrfbrZtLDdGI97I1Q/O951En7+iKRzvLLNx367KFEanbrQ7A8nwhuzenSigAAe30rz8eakSLbuG9ZpUZ7AN9YkVu6caRt3mnjLethOnvAauKW+9h0eUWrt7l3mQrD9jqs52vScqDTcK/X2XTj85BzhLpyRsA6Br/Tg6u76iyLJsT7NZINojpv2wm4i9mjEzrRDGnpiF10fV+SUwtnJ+iqqwsAPNDpbqDg7eRhUwCA99QUNd21+6r8Vrewq6yhlbUBrMhKVe8l+91su/MhPrAt4yFrdOr2P5Hi+d7m3r2cYkrxjSrsMbMneL1lv7bztSMtuuvL+QDD1rpyVhMKYye1u8g+bKtziwbDx6q7j0V3MXu4o60X7kL2+LnuLdkMigIQeb6ZS8faxeItOzflIYJwADhe1F39AgDYa0InmgpAXNIKT1ux6sLVZWHskgK3rWf2fmSQw9Tdx+KOomcWoKtibDLkC11a/FwXXZ4QXxGb2L6HgLUgSUuArafupF4QhmHl6DddNPjUha3P3MedH3R/wddgzH2vT+QxgruEzcBt6P5Nu+HKT3Vfj3EAlVOXpyY1Q09xANjn5Pu7jfuskfYpLZUdWgN4wULQvArcLLC1XEIVZe2Z5nTxVEe6pjA2s60rZwSsBfit7l/eVfRULPfNSl2eV7f6XsGqCldQp5XktrzDzWJGjw9bJuKLHb1hUgYADrdZkR2oAWBgLgDyuujjneh6mYoKrGJS3c2dMU4FVREvVrGSda8vdfFWW/EZUc1KD9a82cXVZkyEPDWSzcL86d0aKWr5vduyZu0hpiqD0qTnztaie0fOu1C+oYBUYaOr793Dz2TS18gqq+vpb7ds2W9Ze3IByExlwlW7l7l72HkBQJ9q3XGRQgh/6rvatu/zmgJnoV663wrGzDYVVwEsxP2t7rc+0zeVbVlkm0a7Md25iW4BU3ULC6lgzVGvHF0oUl37qlttCXiyU2BxdtTxfrniG70pdRWrDURtuZEdA3YsJC0m/N5J9SDuIn25jG0C9r4/7kb8LH1/FpW8R/axaBXGVmlsD6oCgAp7oQfz1mpKyW7HvqGVDeCpdKI6iIkoF1ItFT1my1oyERY9Zr+V8UvHTw0VpKN4JZT9YvJiIWuU9GWtLALWnKQ7Bi4L49ZIloBH1kagsHYCvwhgR8EJTZQytEve3yRUVTJr2VDYZnf1pjQ3616LhqTvbV/vT909qD61nssCME4tYSxsNZSbuPW51RRBAuC3YKrq3JjtTsgT62788VC0BfTCeMZPncdVD1nTSZ2mKooWATkgXPVTOpP4tp2AC+I2O4qaNcVPYtWac/o666rTljy+wUZql2JAlMx01866c64R2vL/fqW7qzYVMHuf3Hl2Pm3VMOixN2tV6S5kvfCFvlkTALxT2nAvbQnwsK1OQ34jYAU85p6h1tyz5FWFwSbWLaQ8o8Ckmx01BC/E4xmHz6Yh67kcsoWQfKuKngtUsGaMcDUccRLaLCRLkztPrcLVBTgPrQIyi+UpkefLceJAZ1ffLS231g/3XsTdZTjdc66h8mqEumTKvm+rKM5iQzF3vgZd1QCEzOPNG2e/L+F1war2k0r/IO5tpXwPgLIIqU1Aaj60ndnT73dRQBqyVnv1XexruNxSzqhgzZCdRISr4doTuC7YUNIqXN3X7uIQrUfqPJrUzPpgm0JFLfe3VnqJQBaSDarezFv1o72eSZWqG+rL823EMuYCSutRGsRsfvKebV8dNVA9wGzarP6cACAVKbJBTCl63iebo9RuxsnzSDAmkiB4RQB8ZW0CQqliNdanX3O66HU/x3SlgW3qw5gPe3VX3z3X/eXP9c0NVYx7Lpv19Bkm94kmAtaMJA/E8Z0qBT5l12sp4L5quHBryd08bXZy3X3dsrYCNjNz1A7nHXV+jLpBIAZhDyrb2m64V+7s/kC14ubdTfqmu0l7u7tq0gYgup5zq4bGb3Rv6UtdZANBoFAT63Zn81FNchNw4Qes1mvVdp524WpwS+47iggXAI8F1iagx+uQNd18kJ6rOJQV37nx2+ykTtwYrFArbB33HONpDkLAGoI9M1f0oCq/efeAMt+rcrWbvvNe6Dp4pet4+NAioFed6l5Le01Pu9+yPqp1YumD2e6qP+j+E5/6kOZYrXooF6Zcd//uSpUeVIBxa6u9OeHvpGG3jcpRk54+SyenbrbVCTakdNfly+66vMx1GfCTXR/duKWp8FpqWcg6P6X4wkmPNhHuTYiJ8T+OYeM3N75deKHVcz4dw3ly4epZ+amlnBGwZsCdMLZ0ty5U1Xuha1rp2nLDUF9L48fC+rPVVJt3QXR9b5gqqnwHYn1IN/SgNc7G6e/aNuRerXqY2W29WXKflwWgEL9wgwJ3b7PwzMvBZIibAfaq/uNy9BDnugx4zj1xPwr0ejO/o+jxhlZvzOnSisaod90OYPNB+MU2b3tWhZYBtrJ7x9PrjAu7v1POCFhHZJvtiIbW+FC9iuFqUs29U5fa82nvFQtS3dfd12O2an1Tc2KN05/+RveuFb1MPnmorJ3f1daie7gca8jijq+r7ni7RbUUUBzb6Cr2t89cMO1DShasvpVcl1dXqlKhA4RmUtMrbmLcJqNCrLqsu6vMHTfRd3ZK8Y2irzNlvW6jWNYywB3Di+6rsU8W5GVXtcu+tvabUC33AiUC1hEk6Xy3YgIoPQtP3+jN7GQSltaTADX6SkmvuG6I6h7a0ge26L3LKqFq9mrSTXeDPp3nQ+beDcbcO7roWUg+u+WCXpVkYxsgBB3F30Ye99q06+Jvdf/FZ/rmrjxUgQG6bUT40N07zjH5BfjHzssftHo7Cnv8uuiuM9Y2YKWIoJVgFTmop5MFl9346kao7Y0Oku5LtCRPdbqbkOeLgHUEabhaFxAg643iHrKW9/z6qz3/ua5kdrs3w23hqSb2BKfxnv99/ysUKPOHzA09cGF5xz1MyipV55NKVT8rj8uysQ0QipqidXctuCyPuRB45bnu131ZgpdMVFnVv85XZIBum748rVKvOSAkJzRzy52jttlV6L1De8/ATfecendKamZ1zemt2HpXXADkwsL7hh3DZQhaA9iXaLOIFnsErEOiNQBKoOFC1YZQBm8fMl0U+sQFj83jNluznrgTmpi1dg4uNjntHk6tCtkFqp3Z90N0rwW9sQ0QGjfgbFqE6TtbgveD7s+fUOfaOEK+dxs41q66cLVRwQF6t9ecTf65QeNdrtGAP0pSxbpXQ248syMbn1vY2p0IfOJ+vtaUplpHPQv3VudNdP+Ovc/CtDVDoXpBa8taB2Q5WVCUZGV3N1yty1+F7F/C7jJDcifAM1G9CsB/rQN+r66ScI+/N77QpWUFolcVkbTZiOvKKXhJN9nzKtRx39Om+55CWjbccg+87vvtfHtCoq9kyj3/vFBYgWEhIZ9NWk0qWugoOltTXMVQ9Tito/6bnWvudXsyqXit6HOtt3LD3rthrsuBXm9b6Z9cdz/7o6JD8EHuhSW6n3WPc3u9xx2gpJVmNpatynWqtf83fDyuxqylwdk5sOnLcb1fUhAX3VGA3Gu6lrymM2u+t9z5nR5c7aiz7Pv51JEK2b+EgHUIIZ+sAFAym3O6eFKee+EG8Dvq2H3D2/6VONbKODbW8M0PWnWBZeR1m4BDtNxH0w1aHlll0yjLxN5VqEbz6WaODTHpnqVCzrXkfdy+4ybqFoSWe83PFdTP0u6FdVWcuw7d+lzfXNOYWJuwElWxwhPumFr2pUVPiTKbpgvtHtkqoiKWuPcjmaR54+6d3efBhoJQO1PE60fAOgSqVwHAH5EbFPq8BNXC1V11HlMpUQouhJg+U+UNfMoyYEkr0FpKKnBaLmT77uA/V/vUNnO0ftRWaRclGz1yLucv13Mt3ajW9+WMRdt0IeuZvELWH3R/wZ1DD4W9XGBy8ZzGoIJVrCiILyFrGYvi7Nmlo6hpKz7cs8n6cS3hsmTXjG1tN9z3cDbA/sRuYv3iKRWAHqwDSnuv1gUA8EInmTltykPJIL5jA0oGMOVQdw+X9rB+QRVly9XcoDz4AUs6MHhbUR4dWnMQp/99/9aOyFl9V9tWXZdLhR8b1R7IBW7dMCLzwC+5F8Y3hf0av9G9pSKWre5noYz7t2/UJN4XZMr6oD/X6hP6b2fPnl3c88iC+2zVo7JNqJ/rnk0YryctX+LvXADbqqmzuetCxV8MMWG2d58O92w021up4/6tevTu+wiKGys+UkGoYB0Q1asA4J2xVYAcxwZODF7KqJhlRr5yz0JW+dcQkK/NKU2fyro6J61efSYcKI9VIe6aYcHtonCQsbY6cu/NU9G+CNkb+7M5bR3f0zruD5S5L3Fb8alfFNTiqyb0jepVAPCStwMDd5O9KpROrHaleza6AMaL/moovdktbS0qYzv0nTxSnE+P5YZwmFnrTasxcdfzsfWBRanN25JywRf14z5K3P6o+YsC908gYB0ID2QA4KFZ2wVankm/p7pQOpGis6qwtLqtsn1oURw3UDmvjEVU6x0n0wmkNDysC4dqKxrbpF16Pb8tIFuzbW03BIxdfFcFImDtEw8HAOCvmuK6vNNmEF9ejapXZsSKGZCjCJleR+28jQlYj5PxpGXE630MNyAf66TdlKaX1ccSYmAQu4obAsarNadLKyoQAWufclouAwDIQEcdD8MuBpVltqOduirshGZsUxaqWJG3WdtwQxnZ1Ruuy33JboIwpkClH2M9Lq3PcaT4ioBs1QWMVfEtrQhY+1fpfmsAgMFEir4SSqzaFco2IKeKFUWYUi2zcy1SjZ6Afcg4FD0tHCvLiYRhWKuAmP7aYxElk5UrKpka5z7Gq/DqVUPA2off6r6FqzyQAYCnaqp5V0nnBircN0qMqiyqWFGMLFcoxF62k/FPlhOEEWOovkx6cE/5QpeW3aemUKi2dMNdm75T+XDuY4zGM2FEwNqHjuLMG+wDALITq+NdyMOgstxiRZV/f62KteMGhgJylOVkRoeJr7507PTOSIl3ps6UL5N27aRVQEsoysqXunhL5cS5j3FZGUf1qiFg7Q/tAQDAX610F1yvMKgsN/cA9amgdGC4LiAAERMjfcn4+sZrHpBf6FLLHQEXxOqEIrTaJW/LMO7WF6iksZ5XBKzHeK7VhngwAACfNQVgjGpsjoLcZLlcndYtfcvydeI170PHo/B/Tl+7SbP4mpArFwKdSwJtANmJb4zzvCJgPUZHaggA4CufZ/8ZVKISbDDunpcYjAPlwf2rYJFn4b8tr+W6nh97bQlXgWy58+r2uFoD9EwKR3Kz5mcVGNuJsC3drSl2s48T66801TqlC+8t87By/QlNzEZqu5t5NO/+fD3d6c9u7pXeGRlAGOxaF6t24Rf6uiU/MUBFZVirgA3ds571DWEsbGAxqajZUfxQADAiu67/oFU3XoyuC5mJFd/4UpfK2ncVGJd1d81a0pgRsB6voUBY2OAeqm+/0syt/YHqfvtmzJp7/9szPZz9RG/mLXh1H2fdTcAC17oAwBNpuHouWcbmLbsOE7KiMqY0fWFHW0/FM0Oh0on1G72NUlzQ3RRBN4AMfKFLyy5kFSFrNmwizIWrywKQJVvReEEeIGA9gvVfjRWM1m5GfVzScLaZfnQf1q3idUq1efdvNGqSVfVS5QpgXJruWnTF48rVHgJWVMpJ9/zgnhfOTSh6LELWoqy76+GFvc9/keIbsaKGgOG1hEK5c9bbTaUIWbMRK77rwtWxV9gBJdPyqZ8xPViPFAURIiaVC/keVPZ3f6Zv1qzsek4Xz7zS9Mmaogs2Cyd2DwZQjKYLDs65axCbAgCeYgfq4tgyU3sm2389/FyXmjaQV0m4n+U7ZSTyOMQqMV7zPtQUe/06Wcgal3zH+5ytv9YM4SqQLa/CVUPAeoQ4kOoLWxZW9EFlVa57A1d3YJ9yr9iV9IG+JQDIzttg1YIDAR5wE4w/CgdKWnfUzolgJS/2+p754ohlpieSgXxLeE/seYhVUrzmfaip5v3rZNccK7AR7+lAbHz8StPnjmvhV0YURCBH3oWrhoD1aKflv1av59Y42YFtO7a5G++iC0FO2YN/lOw82RQADCf0YLUllFZEUHOkPSFrS8hE0ns6qVo9rv+0tWtwx+gVlUCU4TFUo4K1Xy1lJCKM60usThCvkxXYuFDjjLi298XCVRsfVzFcFec+8rPuY7hqCFiPFkCLAD+XatiD/+cu+LVgpNdOgOpWlBhtMrJViorVLJe1wj8R97Nj2bOAPQCL1yoL1nv6yKrV/dJWAcEv6c3yXKOCtT/Z3r+ilnCsWBPBHJsWaqTX9qZwKLv+Wriq6moJyFivItzX6mgC1kO80EPbmMT3zUm6VaPyXK+dANWtKJmWPTjZBIJVE9GXajRphctKmVoB0Ouv3AhY+9MbiLvzYU0YRmuU3tNl6JuYbfA0wYRoHyZUy+x16qhDO5U+HFeV7ptk9eLFczz/fsieaTturDvIhFgZnynca0ChATKz57zyuiKcgPUQO9qpy39NBYjqVoQqvbDfTge7p+zBqXeBTx6iussxCdUG0Fvy+lLTp9xreqVcPVZjBvIlNqkZ3t8+2UD8c31zgYF4/3rXRvecdGbU62LgIetmlsHTlKZawrE6GVaduud8rpXHC/Y1sutLshcH47hUK1btnA8t/MYt4jl4P16P4a2Hcl4RsB4iUtv36lW7aAW/QyzVrQhE08JTCwFtY7fDBrtWUU5fqr41e6/p3qC6XKiUKrH1k9XspzYSBuLH2zvplOW1MeCQNdPraHretoSjbGZbTUnI0oegXyObRJtyk0FVn0RLly6fGe78Kd8zY43x/D7xbXsGikuQ4RRlkN7zvoiEA21oddG9PHfkMXeglf79e67VRlvRgrtAn1UQPXFRIk13gj1yg9yVYQa4P2h1OVJ0XXjLbpJt6e6E4rVyVaoebkP3Xsj/djMYkFWy22SLMDSuke9LVkjEt19r5laeE072XBUnz7d1BSG+knU7LHddtgqYq8JhVmxFiTLEvfBotjKqLM9F32u1PqHosYK5xowuuX5HV77QNyO1winZedJKiqfGx7c8Z+95bueJyzfsOeiycCBrLbWrzjVfe60ehgrWQ8T+3xQqMRtsFyEbxNqsRVL1El+xk40dSZGT5p6+queslcWwA91epVbEchBjYfW14yqAy8gdT7eF0nHva+WX/o2qd42seiVHXhWrh7Hrr/XEDeV1b+dQAeUGuSOFIGVXU/RIGeNeeKRWmZ6L0t6sp9K2WS2V30py/f5m5OuKO08yP/fGqKkx862v7d5+4nae2AreiB71B2kmYfQ3F0ILVw0VrIfwvbKiIz1yQcWCKsyqMNwhPO/C8PPulw0BwxmpUrUf6QyqXU/qqg7bBOyuu1athHhzzIptmLijraeq1ntfdplXd1VdeFWVmeheI/OuWD1KABU0uZ1rz3X/oXv9K/0cfYhcqs7Se+EzUcV6gOyrtH1S4mdgC4FuZBmOp/fCxwqcTRzuKj4z7ud/z647R15bqWjtyvycGgcC1kP4vnyI5Ykf2tNO4LQIXHGIpFpI63mHqgepQNDaDQys51KVqlSPU5YHZnS1rPqvypMGeUrPFbtGNlRe3g0gkiW99ppH9tzrSzumlvUyzOsezeTXh/IORX6r+wsdxQ+FvZq2YkoVUKJn4Fyv4WVon2M7vfuyGZF7PVd8CC37fU3SoHUx/Z7rKrle+7iaaiuh9Fg9DgHrIXw5GQ9jy8mSXctxkGfuwfnn2m64B8UG/VvhtKzq23p/vtTM+rg3VEofMu360lD4rK3CE0LVo1WxJ1kJ2dLqK4Sr+dtTyWH377rC1xzHpN4wemFrpNp597TpAu+xVP6suHD1Wt6vFRVD7ynk+lbRavUPFNVz2UcWtLvryuUAK8gLmxxLxwk+TXj1JatetFlKn79tMm2cVaxDrQyw66Ubvy7WFJ2Py1f978aPkbsGnmiW7RpIwHoI3wNWn2aGQmCB6yd6M0+FazUkPXqjphscPnEh+5qvgYjd9CfdMWkPmgrkIWrvaxtCWOCbDT2Yj9RpuNlaG9h/KgJXL7n7v/XFdAMF/VhTvP5KM2sc6+Nhg/G2OgsBDjC6oarP96B+9J6fbG8C+3Dnxlf2++7zrDtHRn4/fDjXeqGyCwbmK3RdtonnH93P3RrHMdpr82X3Qhd+fJXFseQz7ikf2lM5723Bwbg3Zw3g2tSy/3Gv07duXLDua6GFPXu79MSq5+sq3rqbvBqpl6jdhz/WGxsvNkINW9MVpGs2fiz79Y+A9RC+B6xl79dThN7Dnfs46x56LNyqC0Hau+zf5xv8UfaErV71FN4bqMaqNcuyfANAeDxvBdRdKUF4AgCD8aRyvmvcoSryUfSKhV6Veh4rjkNoi1iGsfmwCFgPQQVr9diFd0q1+bStwGl3csyXsBy/FHqzYDZjWtbQb98EQF3FVLi23HXPZlq/s5DAdm9mOTQAH/UqK8dwnTRvr5VuYqz5B5VviRsAjEtvtU9B1/bu9ZxCgmrIswXRuPb5GNOYcS/Gj3sQsB6CHqwwdoN3F4o6oev49G5WblLh26pftHvHo908D1hi3v3sXq/ZA47R1r6v3y4NtCVr0sT6K021CAgAhC4ZmLdnbbDRUTybLmmvp/95Vu+uj/UD/u+t9PNm+sG1EgA8sP8ZeE9riUOv6+kYone9bim9ptt4wv23lg/7MmB8esVVbXXm9zwrDHU8+fZ8cMyzUPfzQWPGfT+jafU+288auWehqBuoWnsZtSjE+RAB6yE2dM+qQ6/KU+4Av/2lLi4Jhevd4O1iXFPttLu5N0TomgnCVAAAAAAAEJpJ4UBxN533On+uC2ORLh2xj7UXbuZrR9EzYSBpkNpSsoziW3eutXbUWSdMBQAAAAAAoSFgPUStu9ujv9KmxhizXdWuWhyPA7WULDFYdxMW30XdX7O8EgAAAAAAlAsB6yGSXlt+V7C+0MPZkwRVY+WOkwVVT8t9WIV3tyfd3v509GMBAAAAAABVQ8B6iJpqLjjyuzJxt7t7rprCWGxodVGBtGqIFa1F3UmDbij83UF/Jqnajt8G9lHa1Ho3/UxoCgAAAAAA8CEC1kNYP8gJz/cAayuy6smmUDirHt7R1nWFYfMLfXNBAAAAAAAAyFxNONCMZrxfeu/evMvCWOxq+6rC2WhsTQAAAAAAAMgFAesh0t6mLflt9re6X8UeoGP1Qqt1KV5SIGqKHgkAAAAAAAC5IGA9QqRoXZ7rKL4pFGpH0fXYhdsKxIRONAUAAAAAAIBcELAe4bDNgDxT/43uBVNNGbq0YnhRgehIj9JqbAAAAAAAAOSAgPVIsfcVrMa9ideTZevIk21sFVrFcE0x/VcBAAAAAAByRMB6pIkgAlZndkfRYwsAhdzsavu6wtnYymzO6dKKAAAAAAAAkBsC1iPM6WsLWENZXl3f1vYdIRcbWl2MA9rYKkX1KgAAAAAAQM4IWI8XShWrIsULG7pHyJoxa78QKQpuMzF3PNwVAAAAAAAAckXAeoxIeqSwLD7X/eDCQF9ZuGrtF2IptPYLrc91qSkAAAAAAADkioD1WGFsdLWXLWW3SlZ6so7GXj8Xrj5UWH1XU/ENAQAAAAAAIHcErMdIqwBD6cO61+KOth5bBeb/0979JEdxn3Ec/rYEgSWuSoRZeXSCiBNEOoGtTSytLE6AfALECcAnsFgNeAOcgPEJrJyAyYqySBWTqjgBw0ynWxoCIjiRBs2fnnmeqmYGlTYatTafevv9hZFUn189CbyWBuonnQAAAAAwdgLr6TR1l+Va/Xj7YX5oZCScpuEu25000/61bHcDAAAAwNgJrKdQpGzyaeytZPDT8zy4Ff6vei1AFVefpLlxNX3rAQAAAAAmpginUkW3F2neQUcf6l5MufGZ6caPGh5oVe9cbfLEb2clWxsBAAAAYCJMsJ5eU9cEvK8OiE/raVYHYJ30PO31ep1Cmh1X62lr06sAAAAAEySwnlLD1wScUKbce51XPx2mvROquPrgTnkcV1tptu7wUDYAAAAAJsSKgDMY7uZcz3zpVsn19kq297Ng6qnVKqzeScOnVt8pbyzi7xEAAABgmgTWMxgGuSeZT91FCa31eoQ3+fVWmXI386O7kq3VAAAAADBRAusZHeb+0zT/UfL/pVuH1otJZ94OwxqG1ZvVz7dbNv/Asg+YXgUAAACYBoH1jI73lhbfZzHslykeX83Xjd4/O99h9UhnJVsbAQAAAGDiBNYRLMAU64e61dUpUt5r0iFKw5UOtzJ/e3NP6KdcvTZn08YAAAAATSGwjmDBplhPqG6Y3iBFFVsHj2dtjcDxpOrLtTJLX1YxeGdOp1U/tL+SrRsBAAAAYCoE1hEd5n592NV66JYpDpZS/piUB5OccH0bVKvbuIqqqaJq1hYkqh6pY/eblNdNrwIAAABMj8A6ouHj50/CxxxUn003GfylusG69fWmukYNgc/Sbi1nuQqn/TqgtooUX+Q4breywMqUt69mey8AAAAATI3A+gkOc/9u9XIznFo9dVlF0l7eXR9zJe8mUVvhY7or2VoNAAAAAFN1IYzsYi7tvc6rLyMCnlp5Mp4yon7KjQAAAAAwdUthZJ9ls1ekdMAQE1WvBrB3FQAAAGA2WBFwDqwKYIKsBgAAAACYISZYz0G9KqB66QbGzGoAAAAAgNkisJ6DelXAMHz1AmNiNQAAAADA7LEi4Bwdpr1TfaTfB85fZyVbplcBAAAAZowJ1nO0ku39esowcL66fYepAQAAAMwkE6xj8HPa+0WKbwLnYun6Sv58EAAAAABmjgnWMfhdLu9WL4IYn2yQfCuuAgAAAMwugXUMhodebVZvu4ER1esmPs/W3QAAAAAws6wIGKNnabeWUzyp3rYCZ1DF1XtXs70TAAAAAGaawDpmIisjOFjJ1vUAAAAAMPOsCBiza9muT4DfiHUBnE73l1zaCAAAAACNILBOgMjKKR3dJ6vZ7AUAAACARrAiYIJe5OGV13lVrwtYC5x0FFfrGB8AAAAAGkNgnYLD3K9Phr8ZOCauAgAAADSUFQFTsJKt3TLl7UBy8EsuXRdXAQAAAJpJYJ2Sq9neW0qxGXtZF1aR4lF9oJWdqwAAAADNZUXAlD1Lu7Wcot7L2goLY5B893m2dgMAAABAowmsM+LntPeKFLfC3Kvi6rdVXL0bAAAAABpPYJ0hf8uDrwYp78Q067zqFilv/CHbnQAAAAAwF+xgnSG/z9eP6tPky5T3wrzp1L9bcRUAAABgvphgnVGHae/keGVAKzSafasAAAAA80tgnWEv8vDKr3m5azdrY1kJAAAAADDnBNYGeJZ260KW7pQpvwqNUE+t/iuX9laz2QsAAAAAc0tgbRBrAxrB1CoAAADAAhFYG0honT3VH1JvkPK7f+byXVOrAAAAAItDYG0woXVm7PdT3r6W7W4AAAAAWCgC6xwQWqemU1Rh1ToAAAAAgMUlsM6RYWj9pnq7HsZJWAUAAADgiMA6h56l3VpK9orj2Mr5EVYBAAAAOEFgnWN1aF0+mmYtblb/XQtn9vbwqkGyb8cqAAAAAB8SWBfEe1Otf4pdrafRqf44Hv8jl/ZXs9kLAAAAAHyEwLqAnqe9Pkh2xNb/0i1T3jOtCgAAAMBpCawL7jA/rJXpfzWMretZPEdRdSnp2K0KAAAAwFkJrPxHvUbgYpbW+hnUwfWPmcO9rfVO1TI5qB//f5PykUlVAAAAAD6FwMpvehtcqxC5vpTUwXU9DVMH1erfTlL+WF0HplQBAAAAOE8CK2dSrxRYStl6L7peyexMunaLFAf9lH+9UEXV1xkcmFAFAAAAYJwEVs7F2/BaVlc/aS2n+KJ6X8fXK9VNVn39KMSObPhof696262vQfL35eOg2hVSAQAAAJgWgZWJeZqHVy7n5VFovVBF19/6vjLLvX76dUzNy1zurWazFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYbf8G0BTJndBUESgAAAAASUVORK5CYII=\"","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 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 {{ 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=\"handleImageUpload\"\n >\n <svg 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\"\n @click=\"handleImageUpload\"\n >\n Change photo\n </button>\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 required\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 required\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.lastName\"\n />\n\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 :disabled=\"loading || fetchingProfile\"\n :error=\"errors.email\"\n >\n <template v-if=\"form.email !== currentUser?.email\" #help>\n <p class=\"text-yellow-600\">Changing your email will require verification</p>\n </template>\n </StrandsUiInput>\n\n <StrandsUiInput\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n label=\"Phone number\"\n placeholder=\"Enter your phone number\"\n autocomplete=\"tel\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.phone\"\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 30 days ago</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 <div v-if=\"showPasswordChange\" class=\"space-y-3\">\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 </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 >\n Manage\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-gray-200\">\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n :disabled=\"loading || !hasChanges\"\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 { StrandsUiAlert, StrandsUiButton, StrandsUiInput, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface User {\n id: string\n email: string\n firstName: string\n lastName: string\n phone?: string\n avatar?: string\n mfaEnabled: boolean\n createdAt: string\n updatedAt: string\n}\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 } = useStrandsConfig(props.config)\nconst { fetchProfile, updateProfile, currentUser: authUser, isAuthenticated } = 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(() => authUser.value || props.user || internalUser.value)\n\nconst loading = ref(false)\nconst showPasswordChange = ref(false)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([\n { id: '1', device: 'Chrome on Mac', location: 'San Francisco, CA', lastActive: '2 minutes ago', current: true },\n { id: '2', device: 'Safari on iPhone', location: 'San Francisco, CA', lastActive: '1 hour ago', current: false },\n])\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: '',\n phone: ''\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 form.email !== user.email ||\n form.phone !== (user.phone || '')\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 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\n form.phone = user.phone || ''\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 email: form.email,\n phone: form.phone || undefined,\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 handleImageUpload = () => {\n // Integration point: Implement image upload functionality\n // Example: Open file picker, upload to storage, update user avatar\n emit('error', 'Image upload functionality not yet implemented')\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 form.phone = user.phone || ''\n }\n clearMessages()\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n}\n</script>","<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","// 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// Phone validation (basic)\nexport const isValidPhone = (phone: string): boolean => {\n const phoneRegex = /^[\\+]?[1-9][\\d]{0,15}$/\n return phoneRegex.test(phone.replace(/[\\s\\-\\(\\)]/g, ''))\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","componentId","gradientId","containerClasses","textClasses","particleClasses","_hoisted_11","i","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_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","fetchProfile","updateProfile","authUser","isAuthenticated","internalUser","fetchingProfile","currentUser","showPasswordChange","activeSessions","passwordForm","errors","hasChanges","user","isPasswordFormValid","getInitials","fetchUserProfile","errorMsg","clearMessages","updatedUser","resolve","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_28","_createSlots","_hoisted_23","_hoisted_27","isSubmitted","_createStaticVNode","isComponentReady","isLoading","signOut","showLoading","args","provideStrandsConfig","iconClass","viewBox","icons","h","iconComponent","icon","isValidEmail","validatePassword","isValid","strength","isValidName","name","isValidPhone","phone","isRequired","passwordsMatch","confirmation","first","last","formatDate","date","debounce","func","wait","timeout"],"mappings":"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"}
1
+ {"version":3,"file":"strands-auth-ui.es.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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"}