@strands.gg/accui 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +249 -20
- package/dist/strands-auth-ui.es.js +1237 -1260
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/dist/strands-auth-ui.umd.js +1 -1
- package/dist/strands-auth-ui.umd.js.map +1 -1
- package/package.json +3 -3
|
@@ -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/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts","../../../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/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts","../../../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"],"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 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","<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 \"data:image/png;base64,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\"","<template>\n <div 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>","import { ref, computed, inject, provide } from 'vue'\n\nexport interface StrandsAuthConfig {\n baseUrl: string\n endpoints?: {\n signIn?: string\n signUp?: string\n signOut?: string\n refresh?: string\n passwordReset?: string\n passwordResetConfirm?: string\n profile?: string\n verifyEmail?: string\n oauthProviders?: string\n oauthProvider?: string\n }\n}\n\nexport interface StrandsAuthEndpoints {\n signIn: string\n signUp: string\n signOut: string\n refresh: string\n passwordReset: string\n passwordResetConfirm: string\n profile: string\n verifyEmail: string\n oauthProviders: string\n oauthProvider: string\n}\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n provide(STRANDS_CONFIG_KEY, config)\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Use injected config, then global config, then fallback\n const activeConfig = computed(() => {\n const config = injectedConfig || globalConfig.value || fallbackConfig\n \n if (!config || !config.baseUrl) {\n throw new Error(\n 'StrandsAuth configuration is required. Please provide a baseUrl using provideStrandsConfig() or pass it as a prop.'\n )\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n \n return `${baseUrl}${path}`\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\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 response = await fetch(getUrl('oauthProviders'), {\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 if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n console.error('OAuth providers fetch error:', err)\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 const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs 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\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" 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 class=\"space-y-4\">\n <!-- Email -->\n <UiInput 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\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput 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 <UiButton 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 </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert 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\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @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 </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\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 } = useStrandsConfig(props.config)\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) {\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 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 || 'Sign in failed')\n }\n\n return result.data\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 if (!result.success) {\n throw new Error(result.error?.message || 'Sign up failed')\n }\n\n return result.data\n },\n\n async requestPasswordReset(email: string) {\n // TODO: 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 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/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s 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(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiButton 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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\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 <UiInput 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 <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput 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 <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert 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 <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } 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: '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 } = 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('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiButton \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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\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 <UiInput\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 <UiButton\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 </UiButton>\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 <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } 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 } = 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('')\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 // TODO: Integrate with auth SDK to send magic link\n console.log('Magic link sign up attempt:', { email: form.email })\n emit('success', {\n email: form.email\n })\n } catch (err) {\n error.value = 'Failed to send magic link'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\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 <div class=\"w-full 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-neutral-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(user?.firstName, user?.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-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\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-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\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\" 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 Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\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 <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\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}\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 = defineProps<Props>()\nconst emit = defineEmits<Emits>()\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 if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.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// Initialize form with user data\nwatch(() => props.user, (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\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 // TODO: Integrate with auth SDK\n console.log('Profile update:', form)\n \n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\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 // TODO: Integrate with auth SDK\n console.log('Password change:', { current: '***', new: '***' })\n \n // Simulate API call\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 // TODO: Implement image upload\n console.log('Image upload clicked')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiInput 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 <UiButton 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 </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert 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 <UiAlert 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 <UiLink @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 </UiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst emit = defineEmits<Emits>()\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 // TODO: Integrate with auth SDK\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-4\">\n <p class=\"text-gray-500\">MFA setup functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement MFA setup functionality\n</script>","import { ref, computed } from 'vue'\n\n// Mock user interface\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\n// Mock session interface\ninterface Session {\n accessToken: string\n refreshToken: string\n expiresAt: Date\n}\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(false)\nconst isInitialized = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: { email: string; password: string }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign in with:', credentials)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign in\n currentUser.value = {\n id: '1',\n email: credentials.email,\n firstName: 'John',\n lastName: 'Doe',\n mfaEnabled: false,\n createdAt: '2024-01-15T10:30:00Z',\n updatedAt: '2024-01-20T14:45:00Z'\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: {\n email: string\n password: string\n firstName: string\n lastName: string\n }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign up with:', userData)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign up\n currentUser.value = {\n id: '1',\n email: userData.email,\n firstName: userData.firstName,\n lastName: userData.lastName,\n mfaEnabled: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign out')\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Refresh token')\n \n // Mock token refresh\n currentSession.value.expiresAt = new Date(Date.now() + 5 * 60 * 1000)\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Update profile:', profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isLoading.value = true\n try {\n // TODO: Check for existing session/token in localStorage, etc.\n console.log('Initializing auth state')\n \n // Mock initialization delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n // For demo purposes, we'll assume no existing session\n // In real implementation, you'd check for stored tokens here\n \n isInitialized.value = true\n } catch (error) {\n console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value),\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n initialize,\n }\n}","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" 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</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\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\" 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-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" 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\" 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 </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\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"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_5","title","_renderSlot","_ctx","message","dismissible","_hoisted_6","$emit","buttonClasses","sizeClasses","widthClasses","type","disabled","loading","_cache","$event","loadingText","cardClasses","paddingClasses","shadowClasses","$slots","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","handleInput","event","target","togglePasswordVisibility","label","required","_hoisted_4","modelValue","placeholder","autocomplete","_hoisted_7","_hoisted_8","error","_hoisted_9","_toDisplayString","helpText","_hoisted_10","tag","linkProps","baseProps","linkClasses","handleClick","_createBlock","_resolveDynamicComponent","_mergeProps","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","toRefs","watch","_Fragment","_renderList","tabs","_normalizeClass","_unref","_imports_0","DEFAULT_ENDPOINTS","STRANDS_CONFIG_KEY","globalConfig","provideStrandsConfig","config","provide","useStrandsConfig","fallbackConfig","injectedConfig","inject","activeConfig","endpoints","customEndpoints","endpoint","endpointPath","baseUrl","path","setStrandsConfig","useOAuthProviders","options","getUrl","providers","enabledProviders","provider","fetchProviders","response","errorData","_a","result","_b","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isFormValid","handleAuth","handleOAuthAuth","newMode","_createVNode","UiCard","_Transition","UiTabs","UiButton","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","UiInput","_hoisted_16","_hoisted_17","UiLink","UiAlert","_hoisted_18","StrandsSecuredFooter","handleSignIn","handleOAuthSignIn","handleSignUp","handleOAuthSignUp","showPasswordChange","successMessage","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","key","handleUpdateProfile","resolve","updatedUser","handlePasswordChange","handleImageUpload","handleMFAToggle","handleCancel","_vModelText","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","isSubmitted","handlePasswordReset","currentUser","currentSession","isLoading","isInitialized","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData","initialize","showFallback","args","class"],"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/secured_by_strands_services.png","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsConfig.ts","../../../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/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsAuth.ts","../../../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"],"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 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","<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 \"data:image/png;base64,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\"","<template>\n <div 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>","import { ref, computed, inject, provide } from 'vue'\n\nexport interface StrandsAuthConfig {\n baseUrl: string\n endpoints?: {\n signIn?: string\n signUp?: string\n signOut?: string\n refresh?: string\n passwordReset?: string\n passwordResetConfirm?: string\n profile?: string\n verifyEmail?: string\n oauthProviders?: string\n oauthProvider?: string\n }\n}\n\nexport interface StrandsAuthEndpoints {\n signIn: string\n signUp: string\n signOut: string\n refresh: string\n passwordReset: string\n passwordResetConfirm: string\n profile: string\n verifyEmail: string\n oauthProviders: string\n oauthProvider: string\n}\n\nconst DEFAULT_ENDPOINTS: StrandsAuthEndpoints = {\n signIn: '/api/v1/auth/sign-in',\n signUp: '/api/v1/auth/sign-up',\n signOut: '/api/v1/auth/sign-out',\n refresh: '/api/v1/auth/refresh',\n passwordReset: '/api/v1/auth/password-reset',\n passwordResetConfirm: '/api/v1/auth/password-reset/confirm',\n profile: '/api/v1/user/profile',\n verifyEmail: '/api/v1/auth/verify-email',\n oauthProviders: '/api/v1/oauth/providers',\n oauthProvider: '/api/v1/oauth/providers/{provider_id}'\n}\n\nconst STRANDS_CONFIG_KEY = Symbol('strands-config')\n\n// Global configuration state\nconst globalConfig = ref<StrandsAuthConfig | null>(null)\n\nexport function provideStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n provide(STRANDS_CONFIG_KEY, config)\n}\n\nexport function useStrandsConfig(fallbackConfig?: Partial<StrandsAuthConfig>) {\n // Try to get config from provide/inject first\n const injectedConfig = inject<StrandsAuthConfig | null>(STRANDS_CONFIG_KEY, null)\n \n // Use injected config, then global config, then fallback\n const activeConfig = computed(() => {\n const config = injectedConfig || globalConfig.value || fallbackConfig\n \n if (!config || !config.baseUrl) {\n throw new Error(\n 'StrandsAuth configuration is required. Please provide a baseUrl using provideStrandsConfig() or pass it as a prop.'\n )\n }\n \n return config\n })\n\n const endpoints = computed<StrandsAuthEndpoints>(() => {\n const config = activeConfig.value\n const customEndpoints = config.endpoints || {}\n \n return {\n signIn: customEndpoints.signIn || DEFAULT_ENDPOINTS.signIn,\n signUp: customEndpoints.signUp || DEFAULT_ENDPOINTS.signUp,\n signOut: customEndpoints.signOut || DEFAULT_ENDPOINTS.signOut,\n refresh: customEndpoints.refresh || DEFAULT_ENDPOINTS.refresh,\n passwordReset: customEndpoints.passwordReset || DEFAULT_ENDPOINTS.passwordReset,\n passwordResetConfirm: customEndpoints.passwordResetConfirm || DEFAULT_ENDPOINTS.passwordResetConfirm,\n profile: customEndpoints.profile || DEFAULT_ENDPOINTS.profile,\n verifyEmail: customEndpoints.verifyEmail || DEFAULT_ENDPOINTS.verifyEmail,\n oauthProviders: customEndpoints.oauthProviders || DEFAULT_ENDPOINTS.oauthProviders,\n oauthProvider: customEndpoints.oauthProvider || DEFAULT_ENDPOINTS.oauthProvider\n }\n })\n\n const getUrl = (endpoint: keyof StrandsAuthEndpoints | string) => {\n const config = activeConfig.value\n if (!config.baseUrl) {\n throw new Error('Base URL is required in configuration')\n }\n \n // If endpoint is a string key, try to find it in endpoints first\n let endpointPath: string\n if (typeof endpoint === 'string' && endpoint in endpoints.value) {\n endpointPath = endpoints.value[endpoint as keyof StrandsAuthEndpoints]\n } else if (typeof endpoint === 'string') {\n // If it's a string but not a key, treat it as a literal path\n endpointPath = endpoint\n } else {\n // It's a keyof StrandsAuthEndpoints\n endpointPath = endpoints.value[endpoint]\n }\n \n // Ensure proper URL construction with slash separation\n const baseUrl = config.baseUrl.replace(/\\/$/, '')\n const path = endpointPath.startsWith('/') ? endpointPath : `/${endpointPath}`\n \n return `${baseUrl}${path}`\n }\n\n return {\n config: activeConfig,\n endpoints,\n getUrl\n }\n}\n\n// Convenience function to set global config\nexport function setStrandsConfig(config: StrandsAuthConfig) {\n globalConfig.value = config\n}\n","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n iconUrl?: string\n redirectUrl: string\n scopes?: string[]\n enabled: boolean\n}\n\nexport interface OAuthProvidersResponse {\n success: boolean\n data: OAuthProvider[]\n error?: {\n code: string\n message: string\n details?: any\n }\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 response = await fetch(getUrl('oauthProviders'), {\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 if (!result.success) {\n throw new Error(result.error?.message || 'Failed to fetch OAuth providers')\n }\n\n providers.value = result.data || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n console.error('OAuth providers fetch error:', err)\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 const authUrl = await getProviderAuthUrl(providerId, customOptions)\n window.location.href = authUrl\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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset\" key=\"tabs\" class=\"mb-8\">\n <UiTabs 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\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"oauth\" class=\"space-y-3 mb-6\">\n <UiButton \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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" key=\"divider\" 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 class=\"space-y-4\">\n <!-- Email -->\n <UiInput 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\n <!-- Password (Sign In Only) -->\n <Transition name=\"height-fade\" mode=\"out-in\">\n <div v-if=\"!isPasswordReset && !isSignUp\" key=\"password-section\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <UiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </UiLink>\n </div>\n\n <UiInput 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 <UiButton 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 </UiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <UiAlert 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\" mode=\"out-in\">\n <div v-if=\"isPasswordReset\" key=\"back-link\" class=\"mt-8 text-center\">\n <UiLink @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 </UiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <UiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink, UiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\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 } = useStrandsConfig(props.config)\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) {\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 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 || 'Sign in failed')\n }\n\n return result.data\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 if (!result.success) {\n throw new Error(result.error?.message || 'Sign up failed')\n }\n\n return result.data\n },\n\n async requestPasswordReset(email: string) {\n // TODO: 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 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/* Fade transition */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.15s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Height-aware fade transition - smoother for content blocks */\n.height-fade-enter-active {\n transition: all 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-leave-active {\n transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n overflow: hidden;\n}\n\n.height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 0;\n padding-bottom: 0;\n transform: translateY(-10px);\n}\n\n.height-fade-enter-to,\n.height-fade-leave-from {\n opacity: 1;\n max-height: 500px;\n transform: translateY(0);\n}\n\n/* Slide fade transition */\n.slide-fade-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.slide-fade-enter-from {\n transform: translateY(25px);\n opacity: 0;\n}\n\n.slide-fade-leave-to {\n transform: translateY(-15px);\n opacity: 0;\n}\n\n/* Expand transition for height changes */\n.expand-enter-active,\n.expand-leave-active {\n transition: all 0.2s 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(-15px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-15px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Smooth transition for larger content blocks */\n.content-switch-enter-active {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-leave-active {\n transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.content-switch-enter-from {\n transform: translateY(30px);\n opacity: 0;\n}\n\n.content-switch-leave-to {\n transform: translateY(-20px);\n opacity: 0;\n}\n</style>","<template>\n <div class=\"w-full max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiButton 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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\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 <UiInput 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 <UiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </UiLink>\n </div>\n <UiInput 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 <UiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </UiButton>\n </form>\n\n <!-- Error Alert -->\n <UiAlert 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 <UiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </UiLink>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } 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: '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 } = 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('')\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // TODO: Integrate with auth SDK\n console.log('Sign in attempt:', form)\n emit('success', { email: form.email })\n } catch (err) {\n error.value = 'Invalid email or password'\n emit('error', error.value)\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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiButton \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.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"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 </UiButton>\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 <UiInput\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 <UiButton\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 </UiButton>\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 <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } 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 } = 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('')\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 // TODO: Integrate with auth SDK to send magic link\n console.log('Magic link sign up attempt:', { email: form.email })\n emit('success', {\n email: form.email\n })\n } catch (err) {\n error.value = 'Failed to send magic link'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\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 <div class=\"w-full 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-neutral-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(user?.firstName, user?.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-neutral-900 mb-4\">Personal Information</h3>\n \n <div>\n <label for=\"firstName\" class=\"label-modern\">First name</label>\n <input\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n required\n autocomplete=\"given-name\"\n :class=\"[\n 'input-modern',\n errors.firstName && 'input-error'\n ]\"\n placeholder=\"Enter your first name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.firstName\" class=\"mt-1 text-sm text-red-600\">{{ errors.firstName }}</p>\n </div>\n\n <div>\n <label for=\"lastName\" class=\"label-modern\">Last name</label>\n <input\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n required\n autocomplete=\"family-name\"\n :class=\"[\n 'input-modern',\n errors.lastName && 'input-error'\n ]\"\n placeholder=\"Enter your last name\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.lastName\" class=\"mt-1 text-sm text-red-600\">{{ errors.lastName }}</p>\n </div>\n\n <div>\n <label for=\"email\" class=\"label-modern\">Email address</label>\n <input\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n required\n autocomplete=\"email\"\n :class=\"[\n 'input-modern',\n errors.email && 'input-error'\n ]\"\n placeholder=\"Enter your email address\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.email\" class=\"mt-1 text-sm text-red-600\">{{ errors.email }}</p>\n <p v-if=\"form.email !== user?.email\" class=\"mt-1 text-sm text-yellow-600\">\n Changing your email will require verification\n </p>\n </div>\n\n <div>\n <label for=\"phone\" class=\"label-modern\">Phone number</label>\n <input\n id=\"phone\"\n v-model=\"form.phone\"\n type=\"tel\"\n autocomplete=\"tel\"\n :class=\"[\n 'input-modern',\n errors.phone && 'input-error'\n ]\"\n placeholder=\"Enter your phone number\"\n :disabled=\"loading\"\n />\n <p v-if=\"errors.phone\" class=\"mt-1 text-sm text-red-600\">{{ errors.phone }}</p>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"space-y-4\">\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-4\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"space-y-4 p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Password</h4>\n <p class=\"text-sm text-neutral-600\">Last updated 30 days ago</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </button>\n </div>\n\n <div v-if=\"showPasswordChange\" class=\"space-y-3\">\n <input\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n class=\"input-modern\"\n autocomplete=\"current-password\"\n />\n <input\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <input\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n class=\"input-modern\"\n autocomplete=\"new-password\"\n />\n <button\n type=\"button\"\n class=\"btn-primary !w-auto px-4 py-2 text-sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </button>\n </div>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-neutral-600\">\n {{ user?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <button\n type=\"button\"\n :class=\"[\n user?.mfaEnabled ? 'btn-secondary' : 'btn-primary',\n '!w-auto px-4 py-2 text-sm'\n ]\"\n @click=\"handleMFAToggle\"\n >\n {{ user?.mfaEnabled ? 'Disable' : 'Enable' }}\n </button>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-neutral-50 rounded-xl\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h4 class=\"font-medium text-neutral-900\">Active Sessions</h4>\n <p class=\"text-sm text-neutral-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <button\n type=\"button\"\n class=\"btn-secondary !w-auto px-4 py-2 text-sm\"\n @click=\"$emit('manage-sessions')\"\n >\n Manage\n </button>\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-neutral-200\">\n <button\n type=\"submit\"\n :disabled=\"loading || !hasChanges\"\n class=\"btn-primary\"\n >\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\" 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 Saving changes...\n </span>\n <span v-else>Save changes</span>\n </button>\n\n <button\n type=\"button\"\n class=\"btn-secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </button>\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 <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\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}\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 = defineProps<Props>()\nconst emit = defineEmits<Emits>()\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 if (!props.user) return false\n return (\n form.firstName !== props.user.firstName ||\n form.lastName !== props.user.lastName ||\n form.email !== props.user.email ||\n form.phone !== (props.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// Initialize form with user data\nwatch(() => props.user, (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\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 // TODO: Integrate with auth SDK\n console.log('Profile update:', form)\n \n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n const updatedUser = {\n ...props.user!,\n ...form\n }\n \n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n } catch (err) {\n errorMessage.value = 'Failed to update profile'\n emit('error', errorMessage.value)\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 // TODO: Integrate with auth SDK\n console.log('Password change:', { current: '***', new: '***' })\n \n // Simulate API call\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 // TODO: Implement image upload\n console.log('Image upload clicked')\n}\n\nconst handleMFAToggle = () => {\n emit('mfa-toggle', !props.user?.mfaEnabled)\n}\n\nconst handleCancel = () => {\n if (props.user) {\n form.firstName = props.user.firstName\n form.lastName = props.user.lastName\n form.email = props.user.email\n form.phone = props.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 max-w-md mx-auto animate-slide-up\">\n <UiCard 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 <UiInput 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 <UiButton 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 </UiButton>\n </form>\n\n <!-- Success Message -->\n <UiAlert 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 <UiAlert 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 <UiLink @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 </UiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter />\n </UiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { UiCard, UiButton, UiInput, UiAlert, UiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst emit = defineEmits<Emits>()\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 // TODO: Integrate with auth SDK\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-4\">\n <p class=\"text-gray-500\">MFA setup functionality will be implemented here.</p>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n// TODO: Implement MFA setup functionality\n</script>","import { ref, computed } from 'vue'\n\n// Mock user interface\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\n// Mock session interface\ninterface Session {\n accessToken: string\n refreshToken: string\n expiresAt: Date\n}\n\nconst currentUser = ref<User | null>(null)\nconst currentSession = ref<Session | null>(null)\nconst loading = ref(false)\nconst isLoading = ref(false)\nconst isInitialized = ref(false)\n\nexport function useStrandsAuth() {\n const isAuthenticated = computed(() => currentUser.value !== null)\n\n const signIn = async (credentials: { email: string; password: string }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign in with:', credentials)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign in\n currentUser.value = {\n id: '1',\n email: credentials.email,\n firstName: 'John',\n lastName: 'Doe',\n mfaEnabled: false,\n createdAt: '2024-01-15T10:30:00Z',\n updatedAt: '2024-01-20T14:45:00Z'\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signUp = async (userData: {\n email: string\n password: string\n firstName: string\n lastName: string\n }) => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign up with:', userData)\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n // Mock successful sign up\n currentUser.value = {\n id: '1',\n email: userData.email,\n firstName: userData.firstName,\n lastName: userData.lastName,\n mfaEnabled: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n }\n \n currentSession.value = {\n accessToken: 'mock-access-token',\n refreshToken: 'mock-refresh-token',\n expiresAt: new Date(Date.now() + 5 * 60 * 1000), // 5 minutes\n }\n \n return currentUser.value\n } finally {\n isLoading.value = false\n }\n }\n\n const signOut = async () => {\n isLoading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Sign out')\n \n // Mock API delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n currentUser.value = null\n currentSession.value = null\n } finally {\n isLoading.value = false\n }\n }\n\n const refreshToken = async () => {\n if (!currentSession.value) return\n \n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Refresh token')\n \n // Mock token refresh\n currentSession.value.expiresAt = new Date(Date.now() + 5 * 60 * 1000)\n } finally {\n loading.value = false\n }\n }\n\n const updateProfile = async (profileData: Partial<User>) => {\n loading.value = true\n try {\n // TODO: Integrate with actual auth SDK\n console.log('Update profile:', profileData)\n \n if (currentUser.value) {\n Object.assign(currentUser.value, profileData)\n }\n } finally {\n loading.value = false\n }\n }\n\n const initialize = async () => {\n if (isInitialized.value) return\n \n isLoading.value = true\n try {\n // TODO: Check for existing session/token in localStorage, etc.\n console.log('Initializing auth state')\n \n // Mock initialization delay\n await new Promise(resolve => setTimeout(resolve, 500))\n \n // For demo purposes, we'll assume no existing session\n // In real implementation, you'd check for stored tokens here\n \n isInitialized.value = true\n } catch (error) {\n console.error('Auth initialization error:', error)\n } finally {\n isLoading.value = false\n }\n }\n\n // Auto-initialize on first use\n if (!isInitialized.value) {\n initialize()\n }\n\n return {\n // State\n user: computed(() => currentUser.value),\n currentUser: computed(() => currentUser.value),\n currentSession: computed(() => currentSession.value),\n isAuthenticated,\n isLoading: computed(() => isLoading.value),\n loading: computed(() => loading.value),\n\n // Methods\n signIn,\n signUp,\n signOut,\n refreshToken,\n updateProfile,\n initialize,\n }\n}","<template>\n <div v-if=\"isAuthenticated\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"showFallback\" 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</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, user, signOut } = useStrandsAuth()\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\" 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-pulse\">\n <slot name=\"loading\">\n <!-- Default loading state -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-200 rounded-full flex items-center justify-center\">\n <svg class=\"animate-spin w-6 h-6 text-neutral-400\" 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\" 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 </div>\n <p class=\"text-neutral-500\">Checking authentication...</p>\n </div>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\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"],"names":["props","__props","alertClasses","computed","baseClasses","variantClasses","titleClasses","messageClasses","dismissClasses","iconPath","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_5","title","_renderSlot","_ctx","message","dismissible","_hoisted_6","$emit","buttonClasses","sizeClasses","widthClasses","type","disabled","loading","_cache","$event","loadingText","cardClasses","paddingClasses","shadowClasses","$slots","emit","__emit","slots","useSlots","showPassword","ref","inputId","computedType","inputClasses","errorClasses","iconPadding","passwordPadding","handleInput","event","target","togglePasswordVisibility","label","required","_hoisted_4","modelValue","placeholder","autocomplete","_hoisted_7","_hoisted_8","error","_hoisted_9","_toDisplayString","helpText","_hoisted_10","tag","linkProps","baseProps","linkClasses","handleClick","_createBlock","_resolveDynamicComponent","_mergeProps","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","toRefs","watch","_Fragment","_renderList","tabs","_normalizeClass","_unref","_imports_0","DEFAULT_ENDPOINTS","STRANDS_CONFIG_KEY","globalConfig","provideStrandsConfig","config","provide","useStrandsConfig","fallbackConfig","injectedConfig","inject","activeConfig","endpoints","customEndpoints","endpoint","endpointPath","baseUrl","path","setStrandsConfig","useOAuthProviders","options","getUrl","providers","enabledProviders","provider","fetchProviders","response","errorData","result","err","errorMessage","getProviderAuthUrl","providerId","customOptions","mergedOptions","params","queryString","providerUrl","fullUrl","redirectToProvider","authUrl","getProviderById","getProviderIcon","oauthLoading","oauthError","displayProviders","authApi","email","password","firstName","lastName","currentMode","isPasswordResetSubmitted","form","reactive","isSignUp","isPasswordReset","isFormValid","handleAuth","handleOAuthAuth","newMode","_createVNode","UiCard","_Transition","UiTabs","UiButton","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","UiInput","_hoisted_16","_hoisted_17","UiLink","UiAlert","_hoisted_18","StrandsSecuredFooter","handleSignIn","handleOAuthSignIn","handleSignUp","handleOAuthSignUp","showPasswordChange","successMessage","activeSessions","passwordForm","errors","hasChanges","isPasswordFormValid","getInitials","user","clearMessages","key","handleUpdateProfile","resolve","updatedUser","handlePasswordChange","handleImageUpload","handleMFAToggle","handleCancel","_vModelText","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_30","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","isSubmitted","handlePasswordReset","currentUser","currentSession","isLoading","isInitialized","useStrandsAuth","isAuthenticated","signIn","credentials","signUp","userData","signOut","refreshToken","updateProfile","profileData","initialize","showFallback","args","class"],"mappings":"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"}
|