@strands.gg/accui 1.6.5 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accui.css +5169 -630
- package/dist/nuxt/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt/runtime/plugin.client.cjs.js.map +1 -1
- package/dist/nuxt/runtime/plugin.client.es.js +2 -2
- package/dist/nuxt/runtime/plugin.client.es.js.map +1 -1
- package/dist/nuxt/runtime/plugin.server.cjs.js +1 -1
- package/dist/nuxt/runtime/plugin.server.cjs.js.map +1 -1
- package/dist/nuxt/runtime/plugin.server.es.js +2 -2
- package/dist/nuxt/runtime/plugin.server.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.client.es.js +2 -2
- package/dist/nuxt-v4/runtime/plugin.client.es.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.server.cjs.js +2 -2
- package/dist/nuxt-v4/runtime/plugin.server.cjs.js.map +1 -1
- package/dist/nuxt-v4/runtime/plugin.server.es.js +3 -3
- package/dist/nuxt-v4/runtime/plugin.server.es.js.map +1 -1
- package/dist/strands-auth-ui.cjs.js +5179 -8548
- package/dist/strands-auth-ui.cjs.js.map +1 -1
- package/dist/strands-auth-ui.es.js +5180 -8549
- package/dist/strands-auth-ui.es.js.map +1 -1
- package/package.json +1 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strands-auth-ui.cjs.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/strands_icon_path.svg?raw","../../../apps/accounts-ui/src/vue/ui/UiLoader.vue","../../../apps/accounts-ui/src/vue/ui/UiToggle.vue","../../../apps/accounts-ui/src/vue/ui/UiAvatarEditor.vue","../../../apps/accounts-ui/src/vue/ui/UiAvatarEditorSimple.vue","../../../node_modules/canvas-confetti/dist/confetti.module.mjs","../../../apps/accounts-ui/src/vue/utils/sounds.ts","../../../apps/accounts-ui/src/vue/ui/UiLevelProgress.vue","../../../apps/accounts-ui/src/vue/ui/UiModal.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/utils/slots.ts","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsMfa.ts","../../../apps/accounts-ui/src/vue/components/StrandsMfaVerification.vue","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../node_modules/lucide-vue-next/dist/esm/shared/src/utils.js","../../../node_modules/lucide-vue-next/dist/esm/defaultAttributes.js","../../../node_modules/lucide-vue-next/dist/esm/Icon.js","../../../node_modules/lucide-vue-next/dist/esm/createLucideIcon.js","../../../node_modules/lucide-vue-next/dist/esm/icons/key-round.js","../../../node_modules/lucide-vue-next/dist/esm/icons/mail.js","../../../node_modules/lucide-vue-next/dist/esm/icons/settings.js","../../../node_modules/lucide-vue-next/dist/esm/icons/shield.js","../../../node_modules/lucide-vue-next/dist/esm/icons/smartphone.js","../../../node_modules/lucide-vue-next/dist/esm/icons/trash-2.js","../../../node_modules/qrcode/lib/can-promise.js","../../../node_modules/qrcode/lib/core/utils.js","../../../node_modules/qrcode/lib/core/error-correction-level.js","../../../node_modules/qrcode/lib/core/bit-buffer.js","../../../node_modules/qrcode/lib/core/bit-matrix.js","../../../node_modules/qrcode/lib/core/alignment-pattern.js","../../../node_modules/qrcode/lib/core/finder-pattern.js","../../../node_modules/qrcode/lib/core/mask-pattern.js","../../../node_modules/qrcode/lib/core/error-correction-code.js","../../../node_modules/qrcode/lib/core/galois-field.js","../../../node_modules/qrcode/lib/core/polynomial.js","../../../node_modules/qrcode/lib/core/reed-solomon-encoder.js","../../../node_modules/qrcode/lib/core/version-check.js","../../../node_modules/qrcode/lib/core/regex.js","../../../node_modules/qrcode/lib/core/mode.js","../../../node_modules/qrcode/lib/core/version.js","../../../node_modules/qrcode/lib/core/format-info.js","../../../node_modules/qrcode/lib/core/numeric-data.js","../../../node_modules/qrcode/lib/core/alphanumeric-data.js","../../../node_modules/qrcode/lib/core/byte-data.js","../../../node_modules/qrcode/lib/core/kanji-data.js","../../../node_modules/dijkstrajs/dijkstra.js","../../../node_modules/qrcode/lib/core/segments.js","../../../node_modules/qrcode/lib/core/qrcode.js","../../../node_modules/qrcode/lib/renderer/utils.js","../../../node_modules/qrcode/lib/renderer/canvas.js","../../../node_modules/qrcode/lib/renderer/svg-tag.js","../../../node_modules/qrcode/lib/browser.js","../../../apps/accounts-ui/src/vue/components/StrandsTotpSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsEmailMfaSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsHardwareKeySetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsBackupCodesModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfirmModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsMfaModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsSettingsModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserButton.vue","../../../apps/accounts-ui/src/vue/plugins/StrandsUIPlugin.ts","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"flex items-start\">\n <div class=\"flex-shrink-0\">\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" :d=\"iconPath\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n\n <div class=\"ml-3 flex-1\">\n <h3 v-if=\"title\" :class=\"titleClasses\">{{ title }}</h3>\n <div :class=\"messageClasses\">\n <slot>{{ message }}</slot>\n </div>\n </div>\n\n <div v-if=\"dismissible\" class=\"ml-auto pl-3\">\n <button type=\"button\" :class=\"dismissClasses\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"h-5 w-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n variant?: 'success' | 'error' | 'warning' | 'info'\n title?: string\n message?: string\n dismissible?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'info',\n dismissible: false\n})\n\ndefineEmits<{\n dismiss: []\n}>()\n\nconst alertClasses = computed(() => {\n const baseClasses = ['rounded-lg border p-4']\n\n const variantClasses = {\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n info: 'bg-blue-50 border-blue-200 text-blue-800'\n }\n\n return [\n ...baseClasses,\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst titleClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-800',\n error: 'text-red-800',\n warning: 'text-yellow-800',\n info: 'text-blue-800'\n }\n\n return [\n 'text-sm font-medium mb-1',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst messageClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-700',\n error: 'text-red-700',\n warning: 'text-yellow-700',\n info: 'text-blue-700'\n }\n\n return [\n 'text-sm',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst dismissClasses = computed(() => {\n const variantClasses = {\n success: 'text-green-400 hover:text-green-500',\n error: 'text-red-400 hover:text-red-500',\n warning: 'text-yellow-400 hover:text-yellow-500',\n info: 'text-blue-400 hover:text-blue-500'\n }\n\n return [\n 'inline-flex rounded-md p-1.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',\n variantClasses[props.variant]\n ].join(' ')\n})\n\nconst iconPath = computed(() => {\n const icons = {\n success: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z',\n error: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z',\n warning: 'M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z',\n info: 'M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z'\n }\n\n return icons[props.variant]\n})\n</script>\n","<template>\n <button \n :type=\"type\" \n :disabled=\"disabled || loading\" \n :class=\"buttonClasses\" \n :style=\"buttonStyles\"\n @click=\"$emit('click', $event)\"\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\"\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 color?: string | `${string}-${100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950}`\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\n// Helper function to generate CSS custom property for colors\nconst getColorVar = (color: string): string => {\n // If color already includes a shade (e.g., 'red-500'), use as-is\n if (color.includes('-')) {\n return `var(--color-${color})`\n }\n // Otherwise, default to 500 shade for primary colors\n return `var(--color-${color}-500)`\n}\n\n// Helper function to get hover color (typically +100 shade)\nconst getHoverColorVar = (color: string): string => {\n if (color.includes('-')) {\n const [colorName, shade] = color.split('-')\n const shadeNum = parseInt(shade, 10)\n const hoverShade = Math.min(shadeNum + 100, 900) // Cap at 900\n return `var(--color-${colorName}-${hoverShade})`\n }\n return `var(--color-${color}-600)`\n}\n\n// Helper function to get lighter variant for ghost/outline hover states\nconst getLightColorVar = (color: string): string => {\n if (color.includes('-')) {\n const [colorName] = color.split('-')\n return `var(--color-${colorName}-50)`\n }\n return `var(--color-${color}-50)`\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 // Dynamic color support\n const getVariantClasses = (variant: string, color?: string) => {\n if (color) {\n const primaryColor = getColorVar(color)\n const hoverColor = getHoverColorVar(color)\n const lightColor = getLightColorVar(color)\n \n switch (variant) {\n case 'primary':\n return {\n backgroundColor: primaryColor,\n color: 'white',\n '--hover-bg': hoverColor,\n boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)'\n }\n case 'secondary':\n return {\n backgroundColor: primaryColor,\n color: 'white',\n '--hover-bg': hoverColor\n }\n case 'ghost':\n return {\n color: primaryColor,\n '--hover-color': hoverColor,\n '--hover-bg': lightColor\n }\n case 'outline':\n return {\n border: `1px solid ${primaryColor}`,\n color: primaryColor,\n '--hover-bg': primaryColor,\n '--hover-color': 'white'\n }\n default:\n return {}\n }\n }\n\n // Default variant classes when no color is specified\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 return variantClasses[variant as keyof typeof variantClasses] || ''\n }\n\n // Width classes\n const widthClasses = props.fullWidth ? 'w-full' : ''\n\n const classes = [\n ...baseClasses,\n sizeClasses[props.size],\n widthClasses\n ].filter(Boolean).join(' ')\n\n // If color prop is provided, we need to handle styling differently\n if (props.color) {\n const variantClass = props.variant === 'ghost' ? ' ghost-variant' : props.variant === 'outline' ? ' outline-variant' : ''\n return classes + ' custom-color-button' + variantClass\n }\n\n return [\n classes,\n getVariantClasses(props.variant)\n ].filter(Boolean).join(' ')\n})\n\n// Computed styles for dynamic color support\nconst buttonStyles = computed(() => {\n if (!props.color) return {}\n \n const primaryColor = getColorVar(props.color)\n const hoverColor = getHoverColorVar(props.color)\n const lightColor = getLightColorVar(props.color)\n \n switch (props.variant) {\n case 'primary':\n return {\n backgroundColor: primaryColor,\n color: 'white',\n boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)'\n }\n case 'secondary':\n return {\n backgroundColor: primaryColor,\n color: 'white'\n }\n case 'ghost':\n return {\n color: primaryColor\n }\n case 'outline':\n return {\n borderColor: primaryColor,\n color: primaryColor,\n borderWidth: '1px',\n borderStyle: 'solid'\n }\n default:\n return {\n backgroundColor: primaryColor,\n color: 'white'\n }\n }\n})\n</script>\n\n<style scoped>\n/* Custom color button hover effects */\n.custom-color-button:hover:not(:disabled) {\n filter: brightness(0.9);\n}\n\n.custom-color-button.ghost-variant:hover:not(:disabled) {\n filter: brightness(1);\n opacity: 0.8;\n}\n\n.custom-color-button.outline-variant:hover:not(:disabled) {\n filter: brightness(1);\n opacity: 0.9;\n}\n</style>\n","<template>\n <div :class=\"cardClasses\">\n <div v-if=\"$slots['header']\" class=\"card-header border-b border-gray-200 pb-4\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"card-content space-y-6\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"card-footer border-t border-gray-200 pt-4\">\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' | 'clean'\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 // Clean variant has no styling at all\n if (props.variant === 'clean') {\n return ''\n }\n\n const baseClasses = ['bg-white text-black border border-gray-200 flex flex-col gap-3']\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>","<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\" :name=\"name\" :inputmode=\"inputmode\" :maxlength=\"maxlength\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" @keydown=\"$emit('keydown', $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\">{{ typeof error === 'string' ? error : error.message }}</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 | { message: string }\n helpText?: string\n autocomplete?: string\n name?: string\n inputmode?: 'text' | 'numeric' | 'decimal' | 'tel' | 'search' | 'email' | 'url'\n maxlength?: number | 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 keydown: [event: KeyboardEvent]\n}>()\n\nconst slots = useSlots()\nconst showPassword = ref(false)\nconst inputId = ref(`input-${Math.random().toString(36).substr(2, 9)}`)\n\nconst computedType = computed(() => {\n if (props.type === 'password') {\n return showPassword.value ? 'text' : 'password'\n }\n return props.type\n})\n\nconst inputClasses = computed(() => {\n const baseClasses = [\n 'block w-full border-gray-300 text-black rounded-lg shadow-sm focus-visible:ring-strands-500 focus-visible:border-strands-500 transition-colors duration-200 disabled:bg-gray-50 disabled:text-gray-500'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'px-3 py-2 text-sm',\n md: 'px-3 py-2.5 text-sm',\n lg: 'px-4 py-3 text-base'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'border-red-300 focus-visible:ring-red-500 focus-visible:border-red-500'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'pl-10' : ''\n const passwordPadding = props.type === 'password' ? 'pr-10' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n\n<style scoped>\n/* \n BITWARDEN & PASSWORD MANAGER STYLE PREVENTION\n =============================================\n \n These styles use !important to prevent password managers (Bitwarden, 1Password, etc.)\n from overriding our input styling. Password managers often inject their own CSS that\n can break our design system.\n \n If you need to modify input styles, edit these CSS rules rather than just the Tailwind\n classes, as password managers may override the Tailwind classes.\n*/\n\n/* Base input styles - override password manager modifications */\ninput[type=\"email\"],\ninput[type=\"password\"],\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"tel\"],\ninput[type=\"url\"] {\n /* Force our styles to take precedence over password manager modifications */\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important; /* gray-300 */\n border-radius: 0.5rem !important; /* rounded-lg */\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important; /* shadow-sm */\n color: black !important;\n font-family: inherit !important;\n font-size: 0.875rem !important; /* text-sm */\n line-height: 1.25rem !important;\n padding: 0.625rem 0.75rem !important; /* py-2.5 px-3 */\n transition: border-color 0.2s, box-shadow 0.2s !important;\n}\n\n/* Focus state overrides */\ninput[type=\"email\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus {\n border-color: rgb(234 0 168) !important; /* strands-500 */\n box-shadow: 0 0 0 3px rgb(234 0 168 / 0.1) !important; /* strands-500 with opacity */\n outline: none !important;\n}\n\n/* Error state overrides */\ninput.border-red-300 {\n border-color: rgb(252 165 165) !important; /* red-300 */\n}\n\ninput.border-red-300:focus {\n border-color: rgb(239 68 68) !important; /* red-500 */\n box-shadow: 0 0 0 3px rgb(239 68 68 / 0.1) !important; /* red-500 with opacity */\n}\n\n/* Disabled state overrides */\ninput:disabled {\n background-color: rgb(249 250 251) !important; /* gray-50 */\n color: rgb(107 114 128) !important; /* gray-500 */\n cursor: not-allowed !important;\n}\n\n/* Bitwarden and other password manager specific overrides */\ninput[data-bwautofill],\ninput[data-lpignore],\ninput[data-form-type],\ninput[data-1p-ignore] {\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important;\n}\n\n/* Override webkit autofill styling */\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px white inset !important;\n -webkit-text-fill-color: black !important;\n border: 1px solid rgb(209 213 219) !important;\n border-radius: 0.5rem !important;\n transition: background-color 5000s ease-in-out 0s !important;\n}\n\n/* Ensure password inputs have proper padding for our eye icon */\ninput[type=\"password\"] {\n padding-right: 2.5rem !important; /* pr-10 for our eye icon */\n}\n\n/* Hide browser password reveal buttons */\ninput::-ms-reveal,\ninput::-ms-clear {\n display: none !important;\n}\n\n/* Additional size-specific overrides to maintain consistency */\ninput.px-3.py-2 {\n padding: 0.5rem 0.75rem !important; /* sm size */\n}\n\ninput.px-3.py-2\\.5 {\n padding: 0.625rem 0.75rem !important; /* md size - default */\n}\n\ninput.px-4.py-3 {\n padding: 0.75rem 1rem !important; /* lg size */\n}\n\n/* Icon padding overrides */\ninput.pl-10 {\n padding-left: 2.5rem !important;\n}\n\ninput.pr-10 {\n padding-right: 2.5rem !important;\n}\n</style>\n","<template>\n <component :is=\"tag\" :class=\"linkClasses\" v-bind=\"linkProps\" @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n href?: string\n to?: string | object\n variant?: 'primary' | 'secondary' | 'ghost' | 'underline'\n size?: 'sm' | 'md' | 'lg'\n disabled?: boolean\n external?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n variant: 'primary',\n size: 'md',\n disabled: false,\n external: false\n})\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst tag = computed(() => {\n if (props.to) return 'router-link'\n if (props.href) return 'a'\n return 'button'\n})\n\nconst linkProps = computed(() => {\n const baseProps: Record<string, any> = {}\n\n if (props.to) {\n baseProps['to'] = props.to\n } else if (props.href) {\n baseProps['href'] = props.href\n if (props.external) {\n baseProps['target'] = '_blank'\n baseProps['rel'] = 'noopener noreferrer'\n }\n } else {\n baseProps['type'] = 'button'\n }\n\n if (props.disabled) {\n baseProps['disabled'] = true\n baseProps['aria-disabled'] = true\n }\n\n return baseProps\n})\n\nconst linkClasses = computed(() => {\n const baseClasses = [\n 'inline-flex items-center font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base'\n }\n\n // Variant classes\n const variantClasses = {\n primary: 'text-strands-500 hover:text-strands-600',\n secondary: 'text-gray-600 hover:text-gray-800',\n ghost: 'text-gray-500 hover:text-gray-700 hover:bg-gray-100 px-2 py-1 rounded',\n underline: 'text-strands-500 hover:text-strands-600 underline decoration-strands-500 underline-offset-2'\n }\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n variantClasses[props.variant]\n ].filter(Boolean).join(' ')\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n","<template>\n <div class=\"relative\">\n <!-- Tab List -->\n <div class=\"relative flex border-b border-neutral-200\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" :class=\"[\n 'relative flex-1 py-4 px-6 font-medium text-sm transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-strands-500 focus-visible:ring-offset-2 focus-visible:ring-offset-white',\n 'hover:text-strands-600',\n modelValue === tab.value\n ? 'text-strands-600'\n : 'text-neutral-600'\n ]\" :aria-selected=\"modelValue === tab.value\" :aria-controls=\"`tabpanel-${tab.value}`\" :id=\"`tab-${tab.value}`\"\n role=\"tab\" @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div\n class=\"absolute bottom-[-2px] h-[3px] bg-strands-500 rounded-full transition-all duration-150 ease-[cubic-bezier(0.25,0.46,0.45,0.94)]\"\n :style=\"underlineStyle\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, watch, toRefs } from 'vue'\n\ninterface Tab {\n label: string\n value: string\n}\n\ninterface Props {\n modelValue: string\n tabs: Tab[]\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst tabButtons = ref<HTMLElement[]>([])\nconst underlineStyle = ref({\n width: '0px',\n left: '0px',\n opacity: '0'\n})\n\nlet currentTabIndex = -1\nlet isAnimating = false\n\nconst handleTabClick = async (value: string, index: number) => {\n if (isAnimating) return\n\n emit('update:modelValue', value)\n await nextTick()\n animateUnderlineStretch(index)\n}\n\nconst animateUnderlineStretch = async (newIndex: number) => {\n if (!tabButtons.value[newIndex] || newIndex === currentTabIndex) return\n\n isAnimating = true\n const newTab = tabButtons.value[newIndex]\n const container = newTab.parentElement\n\n if (!container) return\n\n const newRect = newTab.getBoundingClientRect()\n const containerRect = container.getBoundingClientRect()\n const newLeft = newRect.left - containerRect.left\n const newWidth = newRect.width\n\n if (currentTabIndex === -1) {\n // Initial load - just appear at the new position\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n isAnimating = false\n return\n }\n\n const currentTab = tabButtons.value[currentTabIndex]\n const currentRect = currentTab.getBoundingClientRect()\n const currentLeft = currentRect.left - containerRect.left\n const currentWidth = currentRect.width\n\n // Determine stretch direction and calculate stretch dimensions\n const isMovingRight = newIndex > currentTabIndex\n const stretchLeft = isMovingRight ? currentLeft : newLeft\n const stretchWidth = isMovingRight\n ? (newLeft + newWidth) - currentLeft\n : (currentLeft + currentWidth) - newLeft\n\n // Phase 1: Stretch to span both tabs\n underlineStyle.value = {\n width: `${stretchWidth}px`,\n left: `${stretchLeft}px`,\n opacity: '1'\n }\n\n // Phase 2: After stretch animation, contract to new position\n setTimeout(() => {\n underlineStyle.value = {\n width: `${newWidth}px`,\n left: `${newLeft}px`,\n opacity: '1'\n }\n currentTabIndex = newIndex\n setTimeout(() => {\n isAnimating = false\n }, 150) // Match the CSS transition duration\n }, 120) // Stretch duration\n}\n\n// Initialize underline position\nonMounted(async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n\n// Watch for external prop changes\nconst activeTabIndex = computed(() =>\n props.tabs.findIndex(tab => tab.value === props.modelValue)\n)\n\n// Update underline when active tab changes externally\nconst { modelValue } = toRefs(props)\nwatch(modelValue, async () => {\n await nextTick()\n const activeIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (activeIndex !== -1) {\n animateUnderlineStretch(activeIndex)\n }\n})\n</script>\n","export default \"<svg width=\\\"302\\\" height=\\\"438\\\" viewBox=\\\"0 0 302 438\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M71.5001 96C71.5001 96 132 106 137 61.5C142 17 117.5 3.50005 94.5001 1.50003C71.5001 -0.499996 16.0001 8.5 2.00014 72.5C-6.5 130.5 71.5003 227.5 165 218C258.5 208.5 280.758 148.5 283.5 121C286.242 93.5 277.5 61.5 238.5 61.5C153 61.5 150.501 185 170.5 235C190.5 285 199 279 213 314C227.001 349 217.296 411.458 183 427C129.456 450.65 92 426 78.5 407.5C65 389 68.0003 357 94.5001 344.5C121 332 212.41 393.5 301.5 361\\\" stroke=\\\"black\\\"/>\\n</svg>\\n\"","<template>\n <div :class=\"containerClasses\">\n <div class=\"relative\">\n <!-- Simple SVG with fun animated path -->\n <svg :width=\"size\" :height=\"size\" viewBox=\"0 0 500 500\">\n <!-- Fun wavy path inspired by Strands -->\n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"semiColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n \n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"solidColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"animate-draw-line\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n </svg>\n </div>\n \n <!-- Optional text -->\n <p v-if=\"text\" :class=\"textClasses\">{{ text }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport logo from '../../../assets/strands_icon_path.svg?raw'\n\nconst path = logo.replace(/<svg[^>]*>/, '').replace(/<\\/svg>/, '').trim()\nconst d = path.match(/d=\"([^\"]*)\"/)?.[1] || ''\n\ninterface Props {\n size?: number\n variant?: 'light' | 'dark' | 'auto'\n text?: string\n centered?: boolean\n weight?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 80,\n variant: 'auto',\n centered: true,\n weight: 30,\n});\n\nconst containerClasses = computed(() => [\n 'flex flex-col items-center gap-4',\n props.centered ? 'justify-center' : '',\n].filter(Boolean).join(' '))\n\nconst textClasses = computed(() => [\n 'text-sm font-medium',\n props.variant === 'light' \n ? 'text-gray-600' \n : props.variant === 'dark'\n ? 'text-gray-300'\n : 'text-gray-600 dark:text-gray-300'\n].filter(Boolean).join(' '))\n\nconst semiColor = computed(() => \n props.variant === 'light' ? '#EA00A810'\n : props.variant === 'dark' ? '#ffffff10'\n : '#ffffff10'\n)\n\nconst solidColor = computed(() => \n props.variant === 'light' ? '#EA00A8'\n : props.variant === 'dark' ? '#ffffff'\n : '#ffffff'\n)\n</script>\n\n<style scoped>\n@keyframes draw-line {\n 0% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: 1000;\n }\n 100% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: -100;\n }\n}\n\n.animate-draw-line {\n animation: draw-line .8s linear infinite;\n}\n</style>","<template>\n <button\n type=\"button\"\n :class=\"toggleClasses\"\n :aria-pressed=\"modelValue\"\n :aria-labelledby=\"id ? `${id}-label` : undefined\"\n @click=\"handleToggle\"\n >\n <span class=\"ui-toggle-thumb\" :class=\"thumbClasses\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n modelValue?: boolean\n disabled?: boolean\n id?: string\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: false,\n disabled: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst toggleClasses = computed(() => [\n 'ui-toggle',\n {\n 'ui-toggle--on': props.modelValue,\n 'ui-toggle--off': !props.modelValue,\n 'ui-toggle--disabled': props.disabled\n }\n])\n\nconst thumbClasses = computed(() => [\n {\n 'ui-toggle-thumb--on': props.modelValue,\n 'ui-toggle-thumb--off': !props.modelValue\n }\n])\n\nconst handleToggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n</script>\n\n<style scoped>\n.ui-toggle {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 2.75rem;\n height: 1.5rem;\n border: 2px solid transparent;\n border-radius: 9999px;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n outline: none;\n background-color: transparent;\n padding: 0;\n}\n\n.ui-toggle:focus {\n box-shadow: 0 0 0 3px rgba(234, 0, 168, 0.1);\n}\n\n.ui-toggle--off {\n background-color: #d1d5db;\n}\n\n.ui-toggle--on {\n background-color: #ea00a8;\n}\n\n.ui-toggle--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ui-toggle-thumb {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n background-color: white;\n border-radius: 50%;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n transition: transform 0.2s ease-in-out;\n}\n\n.ui-toggle-thumb--off {\n transform: translateX(0);\n}\n\n.ui-toggle-thumb--on {\n transform: translateX(1.25rem);\n}\n\n/* Dark mode support */\n@media (prefers-color-scheme: dark) {\n .ui-toggle--off {\n background-color: #4b5563;\n }\n \n .ui-toggle-thumb {\n background-color: #f9fafb;\n }\n}\n</style>","<template>\n <div class=\"avatar-editor\">\n <!-- File Upload Area -->\n <div v-if=\"!imageData\" class=\"relative overflow-hidden rounded-xl border-2 border-dashed border-gray-200 bg-white p-16 text-center cursor-pointer transition-all duration-300 hover:border-pink-400 upload-area\" @click=\"triggerFileUpload\" @drop=\"handleDrop\" @dragover.prevent @dragenter.prevent>\n <div class=\"upload-content\">\n <div class=\"upload-icon-container\">\n <svg class=\"upload-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 class=\"upload-title\">Upload your photo</h3>\n <p class=\"upload-text\">Drag and drop or click to browse</p>\n <div class=\"upload-formats\">\n <span class=\"format-badge\">JPG</span>\n <span class=\"format-badge\">PNG</span>\n <span class=\"format-badge\">GIF</span>\n </div>\n <p class=\"upload-limit\">Up to 5MB</p>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden\"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Image Editor -->\n <div v-else class=\"editor-container p-6\">\n <div class=\"flex gap-8\">\n <!-- Left: Canvas -->\n <div class=\"flex-1 flex items-center justify-center\">\n <div class=\"p-6\">\n <div class=\"relative border-2 border-gray-200 rounded-xl bg-white shadow-lg\" :style=\"{ width: canvasSize + 'px', height: canvasSize + 'px' }\">\n <canvas\n ref=\"backgroundCanvas\"\n :width=\"canvasSize\"\n :height=\"canvasSize\"\n class=\"block\"\n />\n \n <!-- Dark overlay outside crop area -->\n <div class=\"absolute inset-0 pointer-events-none\">\n <svg class=\"w-full h-full\" :viewBox=\"`0 0 ${canvasSize} ${canvasSize}`\">\n <defs>\n <mask id=\"crop-mask\">\n <rect x=\"0\" y=\"0\" :width=\"canvasSize\" :height=\"canvasSize\" fill=\"white\" />\n <rect :x=\"cropArea.x\" :y=\"cropArea.y\" :width=\"cropArea.size\" :height=\"cropArea.size\" fill=\"black\" />\n </mask>\n </defs>\n <rect x=\"0\" y=\"0\" :width=\"canvasSize\" :height=\"canvasSize\" fill=\"black\" opacity=\"0.4\" mask=\"url(#crop-mask)\" />\n </svg>\n </div>\n \n <!-- Crop Overlay -->\n <div\n class=\"absolute border-2 border-pink-500 cursor-move rounded-lg\"\n :style=\"{\n left: cropArea.x + 'px',\n top: cropArea.y + 'px',\n width: cropArea.size + 'px',\n height: cropArea.size + 'px',\n background: 'rgba(234, 0, 168, 0.05)'\n }\"\n @mousedown=\"startDrag\"\n >\n <div class=\"absolute -top-2 -left-2 w-4 h-4 bg-white border-2 border-pink-500 rounded-full cursor-nw-resize hover:bg-pink-50 transition-colors\" @mousedown=\"(e) => startResize(e, 'nw')\"></div>\n <div class=\"absolute -top-2 -right-2 w-4 h-4 bg-white border-2 border-pink-500 rounded-full cursor-ne-resize hover:bg-pink-50 transition-colors\" @mousedown=\"(e) => startResize(e, 'ne')\"></div>\n <div class=\"absolute -bottom-2 -left-2 w-4 h-4 bg-white border-2 border-pink-500 rounded-full cursor-sw-resize hover:bg-pink-50 transition-colors\" @mousedown=\"(e) => startResize(e, 'sw')\"></div>\n <div class=\"absolute -bottom-2 -right-2 w-4 h-4 bg-white border-2 border-pink-500 rounded-full cursor-se-resize hover:bg-pink-50 transition-colors\" @mousedown=\"(e) => startResize(e, 'se')\"></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Right: Controls -->\n <div class=\"w-80 flex flex-col gap-6\">\n <!-- Preview -->\n <div class=\"bg-white border border-gray-200 rounded-xl p-5 shadow-sm\">\n <h3 class=\"text-sm font-semibold text-gray-700 mb-3\">Preview</h3>\n <div class=\"flex justify-center\">\n <div class=\"rounded-full border-2 border-gray-300 overflow-hidden bg-white\" :style=\"{ width: previewSize + 'px', height: previewSize + 'px' }\">\n <canvas\n ref=\"previewCanvas\"\n :width=\"previewSize\"\n :height=\"previewSize\"\n class=\"w-full h-full\"\n />\n </div>\n </div>\n </div>\n\n <!-- Zoom Controls -->\n <div class=\"bg-white border border-gray-200 rounded-xl p-5 shadow-sm\">\n <div class=\"flex items-center gap-2 mb-3\">\n <svg class=\"w-4 h-4 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n <h3 class=\"text-sm font-semibold text-gray-700\">Zoom</h3>\n </div>\n <div class=\"space-y-3\">\n <div class=\"flex items-center gap-3\">\n <button @click=\"zoom = Math.max(minZoom, zoom - 0.1); updateCanvas()\" class=\"w-8 h-8 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-700 font-bold transition-colors\">−</button>\n <div class=\"flex-1 relative\">\n <input\n type=\"range\"\n v-model.number=\"zoom\"\n :min=\"minZoom\"\n :max=\"maxZoom\"\n :step=\"0.1\"\n class=\"w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer zoom-slider\"\n @input=\"updateCanvas\"\n />\n </div>\n <button @click=\"zoom = Math.min(maxZoom, zoom + 0.1); updateCanvas()\" class=\"w-8 h-8 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-700 font-bold transition-colors\">+</button>\n </div>\n <div class=\"text-center text-xs font-medium text-gray-600\">{{ Math.round(zoom * 100) }}%</div>\n </div>\n </div>\n\n <!-- Position Controls -->\n <div class=\"bg-white border border-gray-200 rounded-xl p-5 shadow-sm\">\n <div class=\"flex items-center gap-2 mb-3\">\n <svg class=\"w-4 h-4 text-gray-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n <h3 class=\"text-sm font-semibold text-gray-700\">Position</h3>\n </div>\n <div class=\"grid grid-cols-3 gap-2 w-fit mx-auto\">\n <div></div>\n <button @click=\"moveImage(0, -10)\" class=\"w-9 h-9 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-600 hover:text-gray-800 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M14.707 12.707a1 1 0 01-1.414 0L10 9.414l-3.293 3.293a1 1 0 01-1.414-1.414l4-4a1 1 0 011.414 0l4 4a1 1 0 010 1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <div></div>\n \n <button @click=\"moveImage(-10, 0)\" class=\"w-9 h-9 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-600 hover:text-gray-800 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <button @click=\"resetPosition\" class=\"w-9 h-9 bg-pink-100 hover:bg-pink-200 rounded-lg flex items-center justify-center text-pink-600 hover:text-pink-700 transition-all shadow-sm\" title=\"Reset to center\">\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm1-11a1 1 0 10-2 0v2H7a1 1 0 100 2h2v2a1 1 0 102 0v-2h2a1 1 0 100-2h-2V7z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <button @click=\"moveImage(10, 0)\" class=\"w-9 h-9 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-600 hover:text-gray-800 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n \n <div></div>\n <button @click=\"moveImage(0, 10)\" class=\"w-9 h-9 bg-gray-100 hover:bg-gray-200 rounded-lg flex items-center justify-center text-gray-600 hover:text-gray-800 transition-all\">\n <svg class=\"w-4 h-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\" clip-rule=\"evenodd\" />\n </svg>\n </button>\n <div></div>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-3 p-5 bg-gradient-to-r from-gray-50 to-white border border-gray-200 rounded-xl shadow-sm\">\n <UiButton variant=\"secondary\" @click=\"clearImage\" size=\"sm\" class=\"flex-1\">\n Cancel\n </UiButton>\n <UiButton variant=\"primary\" @click=\"cropAndUpload\" :disabled=\"uploading\" :loading=\"uploading\" size=\"sm\" class=\"flex-1\">\n {{ uploading ? 'Uploading...' : 'Save Avatar' }}\n </UiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, onMounted, nextTick, watch } from 'vue'\nimport UiButton from './UiButton.vue'\n\ninterface Props {\n size?: number\n previewSize?: number\n maxFileSize?: number\n uploading?: boolean\n preselectedFile?: File | null\n}\n\ninterface Emits {\n (e: 'upload', file: File): void\n (e: 'error', error: string): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 400,\n previewSize: 96,\n maxFileSize: 5 * 1024 * 1024 // 5MB\n})\n\nconst emit = defineEmits<Emits>()\n\n// Refs\nconst fileInput = ref<HTMLInputElement>()\nconst backgroundCanvas = ref<HTMLCanvasElement>()\nconst previewCanvas = ref<HTMLCanvasElement>()\n\n// State\nconst imageData = ref<string>('')\nconst originalImage = ref<HTMLImageElement>()\nconst canvasSize = ref(props.size)\nconst previewSize = ref(props.previewSize)\n\n// Image position and zoom\nconst imagePos = reactive({ x: 0, y: 0 })\nconst zoom = ref(1)\nconst minZoom = ref(0.1)\nconst maxZoom = ref(3)\n\n// Crop area (always center of canvas)\nconst cropArea = reactive({\n x: 0,\n y: 0,\n size: 0\n})\n\n// Drag state\nconst isDragging = ref(false)\nconst isResizing = ref(false)\nconst resizeHandle = ref('')\nconst dragStart = reactive({ x: 0, y: 0, imageX: 0, imageY: 0 })\nconst resizeStart = reactive({ \n x: 0, \n y: 0, \n cropX: 0, \n cropY: 0, \n cropSize: 0 \n})\n\nonMounted(() => {\n // Initialize crop area to center of canvas\n const cropSize = Math.min(canvasSize.value * 0.8, 256) // Max 256px crop area\n cropArea.x = (canvasSize.value - cropSize) / 2\n cropArea.y = (canvasSize.value - cropSize) / 2\n cropArea.size = cropSize\n \n // Ensure canvas is ready after mount\n nextTick(() => {\n if (backgroundCanvas.value) {\n const ctx = backgroundCanvas.value.getContext('2d')\n if (ctx) {\n // Initialize with checkered background\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, canvasSize.value, canvasSize.value)\n \n const checkSize = 10\n ctx.fillStyle = '#f0f0f0'\n for (let y = 0; y < canvasSize.value; y += checkSize * 2) {\n for (let x = 0; x < canvasSize.value; x += checkSize * 2) {\n ctx.fillRect(x, y, checkSize, checkSize)\n ctx.fillRect(x + checkSize, y + checkSize, checkSize, checkSize)\n }\n }\n }\n }\n })\n})\n\nconst triggerFileUpload = () => {\n fileInput.value?.click()\n}\n\nconst handleFileSelect = (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst handleDrop = (event: DragEvent) => {\n event.preventDefault()\n const file = event.dataTransfer?.files[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst processFile = (file: File) => {\n // Validate file\n if (!file.type.startsWith('image/')) {\n emit('error', 'Please select an image file')\n return\n }\n\n if (file.size > props.maxFileSize) {\n emit('error', `File size must be less than ${Math.round(props.maxFileSize / 1024 / 1024)}MB`)\n return\n }\n\n // Read file\n const reader = new FileReader()\n reader.onload = (e) => {\n const result = e.target?.result as string\n loadImage(result)\n }\n reader.readAsDataURL(file)\n}\n\nconst loadImage = (dataUrl: string) => {\n imageData.value = dataUrl\n \n const img = new Image()\n img.crossOrigin = 'anonymous' // Allow cross-origin images\n \n img.onload = () => {\n originalImage.value = img\n \n // Calculate initial zoom to fit image\n const scaleX = canvasSize.value / img.width\n const scaleY = canvasSize.value / img.height\n const fitScale = Math.min(scaleX, scaleY)\n \n // Set zoom to show full image with some padding\n zoom.value = fitScale * 0.9\n \n // Make sure zoom is within bounds\n if (zoom.value < minZoom.value) zoom.value = minZoom.value\n if (zoom.value > maxZoom.value) zoom.value = maxZoom.value\n \n // Center the image\n centerImage()\n \n // Force immediate canvas update\n setTimeout(() => {\n updateCanvas()\n }, 0)\n }\n \n img.onerror = (err) => {\n console.error('Failed to load image:', err)\n emit('error', 'Failed to load image. Please try a different file.')\n }\n \n img.src = dataUrl\n}\n\nconst centerImage = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n}\n\nconst updateCanvas = () => {\n if (!originalImage.value || !backgroundCanvas.value) {\n return\n }\n \n const canvas = backgroundCanvas.value\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n return\n }\n \n // Clear canvas with checkered background\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n \n // Draw checkered pattern\n const checkSize = 10\n ctx.fillStyle = '#f0f0f0'\n for (let y = 0; y < canvas.height; y += checkSize * 2) {\n for (let x = 0; x < canvas.width; x += checkSize * 2) {\n ctx.fillRect(x, y, checkSize, checkSize)\n ctx.fillRect(x + checkSize, y + checkSize, checkSize, checkSize)\n }\n }\n \n // Draw image\n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n // Save context state\n ctx.save()\n \n // Draw the image\n ctx.drawImage(img, imagePos.x, imagePos.y, scaledWidth, scaledHeight)\n \n // Restore context\n ctx.restore()\n \n // Update preview\n updatePreview()\n}\n\nconst updatePreview = () => {\n if (!originalImage.value || !previewCanvas.value || !backgroundCanvas.value) return\n \n const preview = previewCanvas.value\n const previewCtx = preview.getContext('2d')\n const mainCanvas = backgroundCanvas.value\n \n if (!previewCtx) return\n \n // Clear preview\n previewCtx.clearRect(0, 0, preview.width, preview.height)\n \n // Create circular clipping path\n previewCtx.save()\n previewCtx.beginPath()\n previewCtx.arc(preview.width / 2, preview.width / 2, preview.width / 2, 0, Math.PI * 2)\n previewCtx.clip()\n \n // Copy crop area from main canvas to preview\n previewCtx.drawImage(\n mainCanvas,\n cropArea.x, cropArea.y, cropArea.size, cropArea.size,\n 0, 0, preview.width, preview.height\n )\n \n previewCtx.restore()\n}\n\nconst moveImage = (deltaX: number, deltaY: number) => {\n imagePos.x += deltaX\n imagePos.y += deltaY\n updateCanvas()\n}\n\nconst resetPosition = () => {\n centerImage()\n updateCanvas()\n}\n\nconst startDrag = (event: MouseEvent) => {\n // Don't start dragging if we're already resizing\n if (isResizing.value) return\n \n isDragging.value = true\n dragStart.x = event.clientX\n dragStart.y = event.clientY\n dragStart.imageX = imagePos.x\n dragStart.imageY = imagePos.y\n \n document.addEventListener('mousemove', handleDrag)\n document.addEventListener('mouseup', stopDrag)\n}\n\nconst handleDrag = (event: MouseEvent) => {\n if (!isDragging.value) return\n \n const deltaX = event.clientX - dragStart.x\n const deltaY = event.clientY - dragStart.y\n \n imagePos.x = dragStart.imageX + deltaX\n imagePos.y = dragStart.imageY + deltaY\n \n updateCanvas()\n}\n\nconst stopDrag = () => {\n isDragging.value = false\n document.removeEventListener('mousemove', handleDrag)\n document.removeEventListener('mouseup', stopDrag)\n}\n\nconst startResize = (event: MouseEvent, handle: string) => {\n event.preventDefault()\n event.stopPropagation()\n \n isResizing.value = true\n resizeHandle.value = handle\n \n resizeStart.x = event.clientX\n resizeStart.y = event.clientY\n resizeStart.cropX = cropArea.x\n resizeStart.cropY = cropArea.y\n resizeStart.cropSize = cropArea.size\n \n document.addEventListener('mousemove', handleResize)\n document.addEventListener('mouseup', stopResize)\n}\n\nconst handleResize = (event: MouseEvent) => {\n if (!isResizing.value) return\n \n const deltaX = event.clientX - resizeStart.x\n const deltaY = event.clientY - resizeStart.y\n \n const minSize = 50 // Minimum crop size\n const maxSize = Math.min(canvasSize.value * 0.9, 300) // Maximum crop size\n \n let newX = resizeStart.cropX\n let newY = resizeStart.cropY\n let newSize = resizeStart.cropSize\n \n switch (resizeHandle.value) {\n case 'nw':\n // Top-left handle: move position and adjust size\n newX = resizeStart.cropX + deltaX\n newY = resizeStart.cropY + deltaY\n newSize = resizeStart.cropSize - Math.max(deltaX, deltaY)\n break\n case 'ne':\n // Top-right handle: move Y position and adjust size\n newY = resizeStart.cropY + deltaY\n newSize = resizeStart.cropSize + deltaX - deltaY\n break\n case 'sw':\n // Bottom-left handle: move X position and adjust size\n newX = resizeStart.cropX + deltaX\n newSize = resizeStart.cropSize - deltaX + deltaY\n break\n case 'se':\n // Bottom-right handle: just adjust size\n newSize = resizeStart.cropSize + Math.max(deltaX, deltaY)\n break\n }\n \n // Constrain size\n newSize = Math.max(minSize, Math.min(maxSize, newSize))\n \n // Constrain position to stay within canvas\n newX = Math.max(0, Math.min(canvasSize.value - newSize, newX))\n newY = Math.max(0, Math.min(canvasSize.value - newSize, newY))\n \n // Update crop area\n cropArea.x = newX\n cropArea.y = newY\n cropArea.size = newSize\n \n updatePreview()\n}\n\nconst stopResize = () => {\n isResizing.value = false\n resizeHandle.value = ''\n document.removeEventListener('mousemove', handleResize)\n document.removeEventListener('mouseup', stopResize)\n}\n\nconst cropAndUpload = async () => {\n if (!originalImage.value || !backgroundCanvas.value) return\n \n // Create a new canvas for the cropped result\n const cropCanvas = document.createElement('canvas')\n cropCanvas.width = 256\n cropCanvas.height = 256\n const cropCtx = cropCanvas.getContext('2d')\n if (!cropCtx) return\n \n // Draw the cropped area to the new canvas\n cropCtx.drawImage(\n backgroundCanvas.value,\n cropArea.x, cropArea.y, cropArea.size, cropArea.size,\n 0, 0, 256, 256\n )\n \n // Convert to blob and emit\n cropCanvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], 'avatar.jpg', { type: 'image/jpeg' })\n emit('upload', file)\n }\n }, 'image/jpeg', 0.9)\n}\n\nconst clearImage = () => {\n imageData.value = ''\n originalImage.value = undefined\n if (fileInput.value) {\n fileInput.value.value = ''\n }\n}\n\n// Watch zoom changes\nwatch(zoom, () => {\n updateCanvas()\n})\n\n// Watch for preselected file\nwatch(() => props.preselectedFile, (file) => {\n if (file) {\n processFile(file)\n }\n}, { immediate: true })\n</script>\n\n<style>\n/* Container */\n.avatar-editor {\n width: 100%;\n}\n\n/* Upload Area - custom styles only, classes handled inline */\n.upload-area {\n /* Custom hover effects handled here */\n}\n\n.upload-content {\n position: relative;\n z-index: 10;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1.5rem;\n}\n\n.upload-icon-container {\n position: relative;\n}\n\n.upload-icon {\n width: 4rem;\n height: 4rem;\n color: #9ca3af;\n transition: all 0.3s;\n}\n\n.upload-area:hover .upload-icon {\n color: #ea00a8;\n transform: scale(1.1);\n}\n\n.upload-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #111827;\n}\n\n.upload-text {\n color: #4b5563;\n font-size: 1.125rem;\n}\n\n.upload-formats {\n display: flex;\n gap: 0.5rem;\n}\n\n.format-badge {\n padding: 0.25rem 0.75rem;\n background-color: #f3f4f6;\n color: #4b5563;\n font-size: 0.75rem;\n font-weight: 500;\n border-radius: 9999px;\n}\n\n.upload-limit {\n font-size: 0.875rem;\n color: #6b7280;\n}\n\n/* Editor Container */\n.editor-container {\n height: 100%;\n}\n\n.editor-layout {\n display: flex;\n gap: 1.5rem;\n height: 100%;\n}\n\n/* Canvas Section */\n.canvas-section {\n @apply flex-1 flex items-center justify-center min-h-0;\n}\n\n.canvas-wrapper {\n @apply flex items-center justify-center p-6;\n}\n\n.canvas-container {\n @apply relative border-2 border-gray-200 rounded-xl overflow-hidden bg-white;\n @apply shadow-lg transition-shadow hover:shadow-xl;\n box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n}\n\n.background-canvas {\n @apply block;\n background-color: #fafafa;\n}\n\n/* Crop Overlay */\n.crop-overlay {\n @apply absolute cursor-move;\n transition: all 0.15s ease;\n}\n\n.crop-overlay:hover {\n transform: scale(1.002);\n}\n\n.crop-border {\n @apply w-full h-full border-2 border-strands-500 rounded-lg;\n background: rgba(234, 0, 168, 0.08);\n box-shadow: \n 0 0 0 9999px rgba(0, 0, 0, 0.3),\n inset 0 0 0 2px rgba(255, 255, 255, 0.8);\n}\n\n.crop-handle {\n @apply absolute w-3 h-3 bg-white border-2 border-strands-500 rounded-full;\n @apply hover:bg-strands-50 hover:border-strands-600 transition-all duration-150;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.crop-handle-nw {\n @apply -top-1 -left-1 cursor-nw-resize;\n}\n\n.crop-handle-ne {\n @apply -top-1 -right-1 cursor-ne-resize;\n}\n\n.crop-handle-sw {\n @apply -bottom-1 -left-1 cursor-sw-resize;\n}\n\n.crop-handle-se {\n @apply -bottom-1 -right-1 cursor-se-resize;\n}\n\n/* Controls Section */\n.controls-section {\n @apply w-80 flex flex-col gap-5;\n}\n\n/* Cards */\n.preview-card,\n.control-card {\n @apply bg-white border border-gray-200 rounded-xl;\n @apply shadow-sm hover:shadow-md transition-shadow duration-200;\n}\n\n.card-header {\n @apply flex items-center gap-3 px-5 py-4 border-b border-gray-100;\n background: linear-gradient(to right, #fafafa, #ffffff);\n}\n\n.card-icon {\n @apply w-4 h-4 text-gray-600;\n}\n\n.card-title {\n @apply font-semibold text-gray-900 text-sm tracking-wide;\n}\n\n/* Preview */\n.preview-container {\n @apply p-6 flex justify-center;\n background: linear-gradient(135deg, #fafafa 0%, #ffffff 100%);\n}\n\n.preview-circle {\n @apply rounded-full border-2 border-gray-300 overflow-hidden bg-white;\n @apply shadow-lg;\n box-shadow: \n 0 4px 12px rgba(0, 0, 0, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.8);\n}\n\n.preview-canvas {\n @apply w-full h-full;\n}\n\n/* Zoom Controls */\n.zoom-controls {\n @apply p-5;\n}\n\n.zoom-slider-container {\n @apply flex items-center gap-3 mb-4;\n}\n\n.zoom-btn {\n @apply w-8 h-8 flex items-center justify-center bg-gray-100 hover:bg-strands-100 rounded-lg text-sm font-bold text-gray-700 hover:text-strands-600;\n @apply transition-all duration-150 hover:shadow-sm;\n}\n\n.zoom-slider {\n @apply flex-1 h-2 bg-gray-200 rounded-full appearance-none cursor-pointer;\n @apply focus:outline-none focus:ring-2 focus:ring-strands-400 focus:ring-opacity-50;\n}\n\n.zoom-slider::-webkit-slider-thumb {\n @apply appearance-none w-5 h-5 bg-strands-500 rounded-full cursor-pointer;\n @apply shadow-md hover:shadow-lg transition-shadow;\n border: 2px solid white;\n}\n\n.zoom-value {\n @apply text-xs font-mono text-gray-600 text-center font-semibold;\n}\n\n/* Position Controls */\n.position-controls {\n @apply p-5;\n}\n\n.position-grid {\n @apply grid grid-cols-3 gap-2 w-fit mx-auto;\n}\n\n.position-btn {\n @apply w-9 h-9 flex items-center justify-center bg-gray-100 hover:bg-gray-200 rounded-lg;\n @apply transition-all duration-150 text-gray-600 hover:text-gray-800;\n @apply hover:shadow-sm active:scale-95;\n}\n\n.center-btn {\n @apply bg-strands-100 text-strands-600 hover:bg-strands-200 hover:text-strands-700;\n @apply ring-2 ring-strands-200;\n}\n\n/* Actions */\n.actions-card {\n @apply flex gap-3 p-5 bg-gradient-to-r from-gray-50 to-gray-100 border border-gray-200 rounded-xl;\n @apply shadow-sm;\n}\n\n.hidden {\n @apply sr-only;\n}\n\n/* Zoom Slider Styling */\n.zoom-slider {\n background: linear-gradient(to right, #e5e7eb 0%, #e5e7eb 100%);\n}\n\n.zoom-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n appearance: none;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #ea00a8;\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n transition: all 0.15s ease;\n}\n\n.zoom-slider::-webkit-slider-thumb:hover {\n background: #d1007a;\n transform: scale(1.1);\n box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);\n}\n\n.zoom-slider::-moz-range-thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #ea00a8;\n cursor: pointer;\n border: 2px solid white;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n transition: all 0.15s ease;\n}\n\n.zoom-slider::-moz-range-thumb:hover {\n background: #d1007a;\n transform: scale(1.1);\n}\n\n/* Enhanced upload area styling */\n.upload-area {\n border: 2px dashed #d1d5db;\n transition: all 0.3s ease;\n}\n\n.upload-area:hover {\n border-color: #ea00a8;\n background: linear-gradient(135deg, #fef7f0 0%, #fef2f2 100%);\n}\n\n.upload-area:hover .upload-icon {\n color: #ea00a8;\n transform: scale(1.05);\n}\n</style>","<template>\n <div class=\"avatar-editor-simple\">\n <!-- File Upload Area -->\n <div v-if=\"!imageData\" \n class=\"upload-area\"\n @click=\"triggerFileUpload\" \n @drop=\"handleDrop\" \n @dragover.prevent \n @dragenter.prevent>\n <div class=\"upload-content\">\n <svg class=\"w-12 h-12 text-gray-400 mb-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" \n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-1\">Upload your photo</h3>\n <p class=\"text-sm text-gray-500 mb-4\">Drag and drop or click to browse</p>\n <div class=\"flex gap-2 justify-center text-xs text-gray-400\">\n <span class=\"px-2 py-1 bg-gray-100 rounded\">JPG</span>\n <span class=\"px-2 py-1 bg-gray-100 rounded\">PNG</span>\n <span class=\"px-2 py-1 bg-gray-100 rounded\">GIF</span>\n </div>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden\"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Image Editor -->\n <div v-else class=\"editor-container\">\n <div class=\"editor-main\">\n <!-- Canvas with fixed circular crop -->\n <div class=\"canvas-container\">\n <canvas\n ref=\"canvas\"\n :width=\"canvasSize\"\n :height=\"canvasSize\"\n class=\"canvas\"\n @mousedown=\"startDrag\"\n @wheel=\"handleWheel\"\n />\n <!-- Fixed circular overlay -->\n <div class=\"crop-overlay\">\n <svg class=\"absolute inset-0 w-full h-full pointer-events-none\">\n <defs>\n <mask id=\"circle-mask\">\n <rect x=\"0\" y=\"0\" :width=\"canvasSize\" :height=\"canvasSize\" fill=\"white\" />\n <circle \n :cx=\"canvasSize / 2\" \n :cy=\"canvasSize / 2\" \n :r=\"cropRadius\" \n fill=\"black\" \n />\n </mask>\n </defs>\n <rect \n x=\"0\" \n y=\"0\" \n :width=\"canvasSize\" \n :height=\"canvasSize\" \n fill=\"black\" \n opacity=\"0.5\" \n mask=\"url(#circle-mask)\" \n />\n <circle \n :cx=\"canvasSize / 2\" \n :cy=\"canvasSize / 2\" \n :r=\"cropRadius\" \n fill=\"none\" \n stroke=\"white\" \n stroke-width=\"2\"\n class=\"drop-shadow-md\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Simple Controls -->\n <div class=\"controls\">\n <!-- Zoom Slider -->\n <div class=\"zoom-control\">\n <button @click=\"zoom = Math.max(minZoom, zoom - 0.1); constrainImagePosition(); updateCanvas()\" \n class=\"zoom-button\">\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=\"M20 12H4\" />\n </svg>\n </button>\n <input\n type=\"range\"\n v-model.number=\"zoom\"\n :min=\"minZoom\"\n :max=\"maxZoom\"\n :step=\"0.01\"\n class=\"zoom-slider\"\n @input=\"constrainImagePosition(); updateCanvas()\"\n />\n <button @click=\"zoom = Math.min(maxZoom, zoom + 0.1); constrainImagePosition(); updateCanvas()\" \n class=\"zoom-button\">\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=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"action-buttons\">\n <button @click=\"resetImage\" class=\"btn-secondary\">\n Reset\n </button>\n <button @click=\"clearImage\" class=\"btn-secondary\">\n Change Photo\n </button>\n <button @click=\"cropAndUpload\" :disabled=\"uploading\" class=\"btn-primary\">\n {{ uploading ? 'Saving...' : 'Save Avatar' }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Preview -->\n <div class=\"preview-section\">\n <h3 class=\"text-sm font-medium text-gray-700 mb-3\">Preview</h3>\n <div class=\"preview-container\">\n <canvas\n ref=\"previewCanvas\"\n :width=\"previewSize\"\n :height=\"previewSize\"\n class=\"preview-canvas\"\n />\n </div>\n <p class=\"text-xs text-gray-500 mt-3 text-center\">\n Drag image to reposition<br>\n Scroll to zoom\n </p>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, onMounted, nextTick, watch } from 'vue'\n\ninterface Props {\n size?: number\n previewSize?: number\n maxFileSize?: number\n uploading?: boolean\n preselectedFile?: File | null\n}\n\ninterface Emits {\n (e: 'upload', file: File): void\n (e: 'error', error: string): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 300,\n previewSize: 100,\n maxFileSize: 5 * 1024 * 1024, // 5MB\n uploading: false\n})\n\nconst emit = defineEmits<Emits>()\n\n// Refs\nconst fileInput = ref<HTMLInputElement>()\nconst canvas = ref<HTMLCanvasElement>()\nconst previewCanvas = ref<HTMLCanvasElement>()\n\n// State\nconst imageData = ref<string>('')\nconst originalImage = ref<HTMLImageElement>()\nconst canvasSize = ref(props.size)\nconst previewSize = ref(props.previewSize)\nconst cropRadius = ref(props.size / 2.5) // Fixed circular crop area\n\n// Image position and zoom\nconst imagePos = reactive({ x: 0, y: 0 })\nconst zoom = ref(1)\nconst minZoom = ref(0.1)\nconst maxZoom = ref(3)\n\n// Drag state\nconst isDragging = ref(false)\nconst isResetting = ref(false)\nconst dragStart = reactive({ x: 0, y: 0, imageX: 0, imageY: 0 })\n\nonMounted(() => {\n if (canvas.value) {\n const ctx = canvas.value.getContext('2d')\n if (ctx) {\n ctx.fillStyle = '#f9fafb'\n ctx.fillRect(0, 0, canvasSize.value, canvasSize.value)\n }\n }\n})\n\nconst triggerFileUpload = () => {\n fileInput.value?.click()\n}\n\nconst handleFileSelect = (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst handleDrop = (event: DragEvent) => {\n event.preventDefault()\n const file = event.dataTransfer?.files[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst processFile = (file: File) => {\n // Validate file\n if (!file.type.startsWith('image/')) {\n emit('error', 'Please select an image file')\n return\n }\n\n if (file.size > props.maxFileSize) {\n emit('error', `File size must be less than ${Math.round(props.maxFileSize / 1024 / 1024)}MB`)\n return\n }\n\n // Read file\n const reader = new FileReader()\n reader.onload = (e) => {\n const result = e.target?.result as string\n loadImage(result)\n }\n reader.readAsDataURL(file)\n}\n\nconst loadImage = (dataUrl: string) => {\n imageData.value = dataUrl\n \n const img = new Image()\n img.onload = () => {\n originalImage.value = img\n \n // Disable watcher during initial load\n isResetting.value = true\n \n // Calculate initial zoom to ensure image covers the circular crop\n // The minimum zoom should ensure the image is large enough to cover the entire circle\n const scale = Math.max(\n (cropRadius.value * 2) / img.width,\n (cropRadius.value * 2) / img.height\n )\n \n const initialZoom = scale * 1.2 // Start slightly zoomed in for better coverage\n minZoom.value = scale // This is the minimum - image must cover the circle\n \n // Calculate and set position directly\n const scaledWidth = img.width * initialZoom\n const scaledHeight = img.height * initialZoom\n \n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Set the zoom\n zoom.value = initialZoom\n \n // Apply position constraints to ensure image covers the circle\n constrainImagePosition()\n \n // Re-enable watcher\n nextTick(() => {\n isResetting.value = false\n })\n \n // Update canvas\n nextTick(() => {\n updateCanvas()\n })\n }\n \n img.src = dataUrl\n}\n\nconst centerImage = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n // Center the image to the canvas center\n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Apply position constraints to ensure image covers the circle\n constrainImagePosition()\n}\n\nconst updateCanvas = () => {\n if (!originalImage.value || !canvas.value) return\n \n const ctx = canvas.value.getContext('2d')\n if (!ctx) return\n \n // Clear canvas\n ctx.fillStyle = '#f9fafb'\n ctx.fillRect(0, 0, canvasSize.value, canvasSize.value)\n \n // Draw image\n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n ctx.drawImage(img, imagePos.x, imagePos.y, scaledWidth, scaledHeight)\n \n // Update preview\n updatePreview()\n}\n\nconst updatePreview = () => {\n if (!originalImage.value || !previewCanvas.value || !canvas.value) return\n \n const previewCtx = previewCanvas.value.getContext('2d')\n if (!previewCtx) return\n \n // Clear preview\n previewCtx.fillStyle = '#ffffff'\n previewCtx.fillRect(0, 0, previewSize.value, previewSize.value)\n \n // Create circular clipping\n previewCtx.save()\n previewCtx.beginPath()\n previewCtx.arc(previewSize.value / 2, previewSize.value / 2, previewSize.value / 2, 0, Math.PI * 2)\n previewCtx.clip()\n \n // Calculate the crop area from the center of the canvas\n const cropX = canvasSize.value / 2 - cropRadius.value\n const cropY = canvasSize.value / 2 - cropRadius.value\n const cropSize = cropRadius.value * 2\n \n // Draw the cropped area to preview\n previewCtx.drawImage(\n canvas.value,\n cropX, cropY, cropSize, cropSize,\n 0, 0, previewSize.value, previewSize.value\n )\n \n previewCtx.restore()\n}\n\nconst startDrag = (event: MouseEvent) => {\n if (!originalImage.value) return\n \n isDragging.value = true\n dragStart.x = event.clientX\n dragStart.y = event.clientY\n dragStart.imageX = imagePos.x\n dragStart.imageY = imagePos.y\n \n document.addEventListener('mousemove', handleDrag)\n document.addEventListener('mouseup', stopDrag)\n}\n\nconst constrainImagePosition = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n // Calculate the bounds to ensure the image always covers the circle\n const circleLeft = canvasSize.value / 2 - cropRadius.value\n const circleTop = canvasSize.value / 2 - cropRadius.value\n const circleRight = canvasSize.value / 2 + cropRadius.value\n const circleBottom = canvasSize.value / 2 + cropRadius.value\n \n // The image's right edge must be at least at the circle's right edge\n const maxX = circleRight - scaledWidth\n // The image's left edge must be at most at the circle's left edge\n const minX = circleLeft\n \n // The image's bottom edge must be at least at the circle's bottom edge\n const maxY = circleBottom - scaledHeight\n // The image's top edge must be at most at the circle's top edge\n const minY = circleTop\n \n // Apply constraints\n imagePos.x = Math.min(minX, Math.max(maxX, imagePos.x))\n imagePos.y = Math.min(minY, Math.max(maxY, imagePos.y))\n}\n\nconst handleDrag = (event: MouseEvent) => {\n if (!isDragging.value) return\n \n const deltaX = event.clientX - dragStart.x\n const deltaY = event.clientY - dragStart.y\n \n imagePos.x = dragStart.imageX + deltaX\n imagePos.y = dragStart.imageY + deltaY\n \n // Apply position constraints to keep image within bounds\n constrainImagePosition()\n \n updateCanvas()\n}\n\nconst stopDrag = () => {\n isDragging.value = false\n document.removeEventListener('mousemove', handleDrag)\n document.removeEventListener('mouseup', stopDrag)\n}\n\nconst handleWheel = (event: WheelEvent) => {\n event.preventDefault()\n \n const delta = event.deltaY > 0 ? -0.05 : 0.05\n const newZoom = Math.max(minZoom.value, Math.min(maxZoom.value, zoom.value + delta))\n \n if (newZoom !== zoom.value && originalImage.value) {\n // Zoom from the center of the current image\n const img = originalImage.value\n const currentWidth = img.width * zoom.value\n const currentHeight = img.height * zoom.value\n \n // Calculate current image center\n const imageCenterX = imagePos.x + currentWidth / 2\n const imageCenterY = imagePos.y + currentHeight / 2\n \n // Calculate new dimensions\n const newWidth = img.width * newZoom\n const newHeight = img.height * newZoom\n \n // Update position to keep the image center at the same location\n imagePos.x = imageCenterX - newWidth / 2\n imagePos.y = imageCenterY - newHeight / 2\n \n zoom.value = newZoom\n \n // Apply position constraints after zoom\n constrainImagePosition()\n \n updateCanvas()\n }\n}\n\nconst resetImage = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n \n // Disable watcher during reset\n isResetting.value = true\n \n // Reset to initial zoom that ensures the image covers the crop circle\n const scale = Math.max(\n (cropRadius.value * 2) / img.width,\n (cropRadius.value * 2) / img.height\n )\n \n const targetZoom = scale * 1.2 // Slightly zoomed in for better coverage\n \n // Calculate and set position directly\n const scaledWidth = img.width * targetZoom\n const scaledHeight = img.height * targetZoom\n \n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Set the zoom\n zoom.value = targetZoom\n \n // Apply position constraints\n constrainImagePosition()\n \n // Re-enable watcher\n nextTick(() => {\n isResetting.value = false\n })\n \n updateCanvas()\n}\n\nconst cropAndUpload = async () => {\n if (!originalImage.value || !canvas.value) return\n \n // Create a new canvas for the cropped result\n const cropCanvas = document.createElement('canvas')\n cropCanvas.width = 256\n cropCanvas.height = 256\n const cropCtx = cropCanvas.getContext('2d')\n if (!cropCtx) return\n \n // White background\n cropCtx.fillStyle = '#ffffff'\n cropCtx.fillRect(0, 0, 256, 256)\n \n // Create circular clipping\n cropCtx.save()\n cropCtx.beginPath()\n cropCtx.arc(128, 128, 128, 0, Math.PI * 2)\n cropCtx.clip()\n \n // Calculate the crop area\n const cropX = canvasSize.value / 2 - cropRadius.value\n const cropY = canvasSize.value / 2 - cropRadius.value\n const cropSize = cropRadius.value * 2\n \n // Draw the cropped area\n cropCtx.drawImage(\n canvas.value,\n cropX, cropY, cropSize, cropSize,\n 0, 0, 256, 256\n )\n \n cropCtx.restore()\n \n // Convert to blob\n cropCanvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], 'avatar.jpg', { type: 'image/jpeg' })\n emit('upload', file)\n }\n }, 'image/jpeg', 0.9)\n}\n\nconst clearImage = () => {\n imageData.value = ''\n originalImage.value = undefined\n \n // Reset all state to defaults\n zoom.value = 1\n minZoom.value = 0.1\n imagePos.x = 0\n imagePos.y = 0\n \n if (fileInput.value) {\n fileInput.value.value = ''\n }\n}\n\n// Watch zoom changes and maintain image center\nwatch(zoom, (newZoom, oldZoom) => {\n if (isResetting.value) {\n // Skip during reset operations\n return\n }\n \n if (newZoom !== oldZoom && originalImage.value && oldZoom > 0 && oldZoom !== 1) {\n // Only adjust position if this isn't the initial load (oldZoom !== 1)\n // This handles zoom changes from the slider and wheel\n const img = originalImage.value\n const oldWidth = img.width * oldZoom\n const oldHeight = img.height * oldZoom\n \n // Calculate current image center\n const imageCenterX = imagePos.x + oldWidth / 2\n const imageCenterY = imagePos.y + oldHeight / 2\n \n // Calculate new dimensions\n const newWidth = img.width * newZoom\n const newHeight = img.height * newZoom\n \n // Update position to keep the image center at the same location\n imagePos.x = imageCenterX - newWidth / 2\n imagePos.y = imageCenterY - newHeight / 2\n }\n \n updateCanvas()\n})\n\n// Watch for preselected file\nwatch(() => props.preselectedFile, (file) => {\n if (file) {\n processFile(file)\n }\n}, { immediate: true })\n</script>\n\n<style>\n.avatar-editor-simple {\n width: 100%;\n}\n\n/* Upload Area */\n.upload-area {\n border: 2px dashed #e5e7eb;\n border-radius: 12px;\n padding: 3rem;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s;\n background: white;\n}\n\n.upload-area:hover {\n border-color: #ea00a8;\n background: #fef2f9;\n}\n\n.upload-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Editor Container */\n.editor-container {\n display: flex;\n gap: 2rem;\n}\n\n.editor-main {\n flex: 1;\n}\n\n/* Canvas Container */\n.canvas-container {\n position: relative;\n width: 300px;\n height: 300px;\n margin: 0 auto;\n border-radius: 12px;\n overflow: hidden;\n background: #f9fafb;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n}\n\n.canvas {\n display: block;\n cursor: move;\n}\n\n.crop-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* Controls */\n.controls {\n margin-top: 1.5rem;\n space-y: 1rem;\n}\n\n.zoom-control {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n background: white;\n padding: 0.75rem;\n border-radius: 8px;\n border: 1px solid #e5e7eb;\n}\n\n.zoom-button {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f3f4f6;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.zoom-button:hover {\n background: #e5e7eb;\n color: #1f2937;\n}\n\n.zoom-slider {\n flex: 1;\n height: 6px;\n background: #e5e7eb;\n border-radius: 3px;\n outline: none;\n -webkit-appearance: none;\n}\n\n.zoom-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 18px;\n height: 18px;\n background: #ea00a8;\n border: 2px solid white;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.zoom-slider::-moz-range-thumb {\n width: 18px;\n height: 18px;\n background: #ea00a8;\n border: 2px solid white;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Action Buttons */\n.action-buttons {\n display: flex;\n gap: 0.75rem;\n margin-top: 1rem;\n}\n\n.btn-primary,\n.btn-secondary {\n padding: 0.625rem 1.25rem;\n border-radius: 8px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid transparent;\n}\n\n.btn-primary {\n background: #ea00a8;\n color: white;\n flex: 1;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: #d10096;\n}\n\n.btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: white;\n color: #4b5563;\n border-color: #e5e7eb;\n}\n\n.btn-secondary:hover {\n background: #f9fafb;\n color: #1f2937;\n}\n\n/* Preview Section */\n.preview-section {\n width: 150px;\n padding: 1rem;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n height: fit-content;\n}\n\n.preview-container {\n width: 100px;\n height: 100px;\n margin: 0 auto;\n border-radius: 50%;\n overflow: hidden;\n border: 2px solid #e5e7eb;\n background: white;\n}\n\n.preview-canvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n</style>","// canvas-confetti v1.9.3 built on 2024-04-30T22:19:17.794Z\nvar module = {};\n\n// source content\n/* globals Map */\n\n(function main(global, module, isWorker, workerSize) {\n var canUseWorker = !!(\n global.Worker &&\n global.Blob &&\n global.Promise &&\n global.OffscreenCanvas &&\n global.OffscreenCanvasRenderingContext2D &&\n global.HTMLCanvasElement &&\n global.HTMLCanvasElement.prototype.transferControlToOffscreen &&\n global.URL &&\n global.URL.createObjectURL);\n\n var canUsePaths = typeof Path2D === 'function' && typeof DOMMatrix === 'function';\n var canDrawBitmap = (function () {\n // this mostly supports ssr\n if (!global.OffscreenCanvas) {\n return false;\n }\n\n var canvas = new OffscreenCanvas(1, 1);\n var ctx = canvas.getContext('2d');\n ctx.fillRect(0, 0, 1, 1);\n var bitmap = canvas.transferToImageBitmap();\n\n try {\n ctx.createPattern(bitmap, 'no-repeat');\n } catch (e) {\n return false;\n }\n\n return true;\n })();\n\n function noop() {}\n\n // create a promise if it exists, otherwise, just\n // call the function directly\n function promise(func) {\n var ModulePromise = module.exports.Promise;\n var Prom = ModulePromise !== void 0 ? ModulePromise : global.Promise;\n\n if (typeof Prom === 'function') {\n return new Prom(func);\n }\n\n func(noop, noop);\n\n return null;\n }\n\n var bitmapMapper = (function (skipTransform, map) {\n // see https://github.com/catdad/canvas-confetti/issues/209\n // creating canvases is actually pretty expensive, so we should create a\n // 1:1 map for bitmap:canvas, so that we can animate the confetti in\n // a performant manner, but also not store them forever so that we don't\n // have a memory leak\n return {\n transform: function(bitmap) {\n if (skipTransform) {\n return bitmap;\n }\n\n if (map.has(bitmap)) {\n return map.get(bitmap);\n }\n\n var canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n var ctx = canvas.getContext('2d');\n ctx.drawImage(bitmap, 0, 0);\n\n map.set(bitmap, canvas);\n\n return canvas;\n },\n clear: function () {\n map.clear();\n }\n };\n })(canDrawBitmap, new Map());\n\n var raf = (function () {\n var TIME = Math.floor(1000 / 60);\n var frame, cancel;\n var frames = {};\n var lastFrameTime = 0;\n\n if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {\n frame = function (cb) {\n var id = Math.random();\n\n frames[id] = requestAnimationFrame(function onFrame(time) {\n if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {\n lastFrameTime = time;\n delete frames[id];\n\n cb();\n } else {\n frames[id] = requestAnimationFrame(onFrame);\n }\n });\n\n return id;\n };\n cancel = function (id) {\n if (frames[id]) {\n cancelAnimationFrame(frames[id]);\n }\n };\n } else {\n frame = function (cb) {\n return setTimeout(cb, TIME);\n };\n cancel = function (timer) {\n return clearTimeout(timer);\n };\n }\n\n return { frame: frame, cancel: cancel };\n }());\n\n var getWorker = (function () {\n var worker;\n var prom;\n var resolves = {};\n\n function decorate(worker) {\n function execute(options, callback) {\n worker.postMessage({ options: options || {}, callback: callback });\n }\n worker.init = function initWorker(canvas) {\n var offscreen = canvas.transferControlToOffscreen();\n worker.postMessage({ canvas: offscreen }, [offscreen]);\n };\n\n worker.fire = function fireWorker(options, size, done) {\n if (prom) {\n execute(options, null);\n return prom;\n }\n\n var id = Math.random().toString(36).slice(2);\n\n prom = promise(function (resolve) {\n function workerDone(msg) {\n if (msg.data.callback !== id) {\n return;\n }\n\n delete resolves[id];\n worker.removeEventListener('message', workerDone);\n\n prom = null;\n\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n worker.addEventListener('message', workerDone);\n execute(options, id);\n\n resolves[id] = workerDone.bind(null, { data: { callback: id }});\n });\n\n return prom;\n };\n\n worker.reset = function resetWorker() {\n worker.postMessage({ reset: true });\n\n for (var id in resolves) {\n resolves[id]();\n delete resolves[id];\n }\n };\n }\n\n return function () {\n if (worker) {\n return worker;\n }\n\n if (!isWorker && canUseWorker) {\n var code = [\n 'var CONFETTI, SIZE = {}, module = {};',\n '(' + main.toString() + ')(this, module, true, SIZE);',\n 'onmessage = function(msg) {',\n ' if (msg.data.options) {',\n ' CONFETTI(msg.data.options).then(function () {',\n ' if (msg.data.callback) {',\n ' postMessage({ callback: msg.data.callback });',\n ' }',\n ' });',\n ' } else if (msg.data.reset) {',\n ' CONFETTI && CONFETTI.reset();',\n ' } else if (msg.data.resize) {',\n ' SIZE.width = msg.data.resize.width;',\n ' SIZE.height = msg.data.resize.height;',\n ' } else if (msg.data.canvas) {',\n ' SIZE.width = msg.data.canvas.width;',\n ' SIZE.height = msg.data.canvas.height;',\n ' CONFETTI = module.exports.create(msg.data.canvas);',\n ' }',\n '}',\n ].join('\\n');\n try {\n worker = new Worker(URL.createObjectURL(new Blob([code])));\n } catch (e) {\n // eslint-disable-next-line no-console\n typeof console !== undefined && typeof console.warn === 'function' ? console.warn('🎊 Could not load worker', e) : null;\n\n return null;\n }\n\n decorate(worker);\n }\n\n return worker;\n };\n })();\n\n var defaults = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n x: 0.5,\n y: 0.5,\n shapes: ['square', 'circle'],\n zIndex: 100,\n colors: [\n '#26ccff',\n '#a25afd',\n '#ff5e7e',\n '#88ff5a',\n '#fcff42',\n '#ffa62d',\n '#ff36ff'\n ],\n // probably should be true, but back-compat\n disableForReducedMotion: false,\n scalar: 1\n };\n\n function convert(val, transform) {\n return transform ? transform(val) : val;\n }\n\n function isOk(val) {\n return !(val === null || val === undefined);\n }\n\n function prop(options, name, transform) {\n return convert(\n options && isOk(options[name]) ? options[name] : defaults[name],\n transform\n );\n }\n\n function onlyPositiveInt(number){\n return number < 0 ? 0 : Math.floor(number);\n }\n\n function randomInt(min, max) {\n // [min, max)\n return Math.floor(Math.random() * (max - min)) + min;\n }\n\n function toDecimal(str) {\n return parseInt(str, 16);\n }\n\n function colorsToRgb(colors) {\n return colors.map(hexToRgb);\n }\n\n function hexToRgb(str) {\n var val = String(str).replace(/[^0-9a-f]/gi, '');\n\n if (val.length < 6) {\n val = val[0]+val[0]+val[1]+val[1]+val[2]+val[2];\n }\n\n return {\n r: toDecimal(val.substring(0,2)),\n g: toDecimal(val.substring(2,4)),\n b: toDecimal(val.substring(4,6))\n };\n }\n\n function getOrigin(options) {\n var origin = prop(options, 'origin', Object);\n origin.x = prop(origin, 'x', Number);\n origin.y = prop(origin, 'y', Number);\n\n return origin;\n }\n\n function setCanvasWindowSize(canvas) {\n canvas.width = document.documentElement.clientWidth;\n canvas.height = document.documentElement.clientHeight;\n }\n\n function setCanvasRectSize(canvas) {\n var rect = canvas.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function getCanvas(zIndex) {\n var canvas = document.createElement('canvas');\n\n canvas.style.position = 'fixed';\n canvas.style.top = '0px';\n canvas.style.left = '0px';\n canvas.style.pointerEvents = 'none';\n canvas.style.zIndex = zIndex;\n\n return canvas;\n }\n\n function ellipse(context, x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {\n context.save();\n context.translate(x, y);\n context.rotate(rotation);\n context.scale(radiusX, radiusY);\n context.arc(0, 0, 1, startAngle, endAngle, antiClockwise);\n context.restore();\n }\n\n function randomPhysics(opts) {\n var radAngle = opts.angle * (Math.PI / 180);\n var radSpread = opts.spread * (Math.PI / 180);\n\n return {\n x: opts.x,\n y: opts.y,\n wobble: Math.random() * 10,\n wobbleSpeed: Math.min(0.11, Math.random() * 0.1 + 0.05),\n velocity: (opts.startVelocity * 0.5) + (Math.random() * opts.startVelocity),\n angle2D: -radAngle + ((0.5 * radSpread) - (Math.random() * radSpread)),\n tiltAngle: (Math.random() * (0.75 - 0.25) + 0.25) * Math.PI,\n color: opts.color,\n shape: opts.shape,\n tick: 0,\n totalTicks: opts.ticks,\n decay: opts.decay,\n drift: opts.drift,\n random: Math.random() + 2,\n tiltSin: 0,\n tiltCos: 0,\n wobbleX: 0,\n wobbleY: 0,\n gravity: opts.gravity * 3,\n ovalScalar: 0.6,\n scalar: opts.scalar,\n flat: opts.flat\n };\n }\n\n function updateFetti(context, fetti) {\n fetti.x += Math.cos(fetti.angle2D) * fetti.velocity + fetti.drift;\n fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity;\n fetti.velocity *= fetti.decay;\n\n if (fetti.flat) {\n fetti.wobble = 0;\n fetti.wobbleX = fetti.x + (10 * fetti.scalar);\n fetti.wobbleY = fetti.y + (10 * fetti.scalar);\n\n fetti.tiltSin = 0;\n fetti.tiltCos = 0;\n fetti.random = 1;\n } else {\n fetti.wobble += fetti.wobbleSpeed;\n fetti.wobbleX = fetti.x + ((10 * fetti.scalar) * Math.cos(fetti.wobble));\n fetti.wobbleY = fetti.y + ((10 * fetti.scalar) * Math.sin(fetti.wobble));\n\n fetti.tiltAngle += 0.1;\n fetti.tiltSin = Math.sin(fetti.tiltAngle);\n fetti.tiltCos = Math.cos(fetti.tiltAngle);\n fetti.random = Math.random() + 2;\n }\n\n var progress = (fetti.tick++) / fetti.totalTicks;\n\n var x1 = fetti.x + (fetti.random * fetti.tiltCos);\n var y1 = fetti.y + (fetti.random * fetti.tiltSin);\n var x2 = fetti.wobbleX + (fetti.random * fetti.tiltCos);\n var y2 = fetti.wobbleY + (fetti.random * fetti.tiltSin);\n\n context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';\n\n context.beginPath();\n\n if (canUsePaths && fetti.shape.type === 'path' && typeof fetti.shape.path === 'string' && Array.isArray(fetti.shape.matrix)) {\n context.fill(transformPath2D(\n fetti.shape.path,\n fetti.shape.matrix,\n fetti.x,\n fetti.y,\n Math.abs(x2 - x1) * 0.1,\n Math.abs(y2 - y1) * 0.1,\n Math.PI / 10 * fetti.wobble\n ));\n } else if (fetti.shape.type === 'bitmap') {\n var rotation = Math.PI / 10 * fetti.wobble;\n var scaleX = Math.abs(x2 - x1) * 0.1;\n var scaleY = Math.abs(y2 - y1) * 0.1;\n var width = fetti.shape.bitmap.width * fetti.scalar;\n var height = fetti.shape.bitmap.height * fetti.scalar;\n\n var matrix = new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n fetti.x,\n fetti.y\n ]);\n\n // apply the transform matrix from the confetti shape\n matrix.multiplySelf(new DOMMatrix(fetti.shape.matrix));\n\n var pattern = context.createPattern(bitmapMapper.transform(fetti.shape.bitmap), 'no-repeat');\n pattern.setTransform(matrix);\n\n context.globalAlpha = (1 - progress);\n context.fillStyle = pattern;\n context.fillRect(\n fetti.x - (width / 2),\n fetti.y - (height / 2),\n width,\n height\n );\n context.globalAlpha = 1;\n } else if (fetti.shape === 'circle') {\n context.ellipse ?\n context.ellipse(fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI) :\n ellipse(context, fetti.x, fetti.y, Math.abs(x2 - x1) * fetti.ovalScalar, Math.abs(y2 - y1) * fetti.ovalScalar, Math.PI / 10 * fetti.wobble, 0, 2 * Math.PI);\n } else if (fetti.shape === 'star') {\n var rot = Math.PI / 2 * 3;\n var innerRadius = 4 * fetti.scalar;\n var outerRadius = 8 * fetti.scalar;\n var x = fetti.x;\n var y = fetti.y;\n var spikes = 5;\n var step = Math.PI / spikes;\n\n while (spikes--) {\n x = fetti.x + Math.cos(rot) * outerRadius;\n y = fetti.y + Math.sin(rot) * outerRadius;\n context.lineTo(x, y);\n rot += step;\n\n x = fetti.x + Math.cos(rot) * innerRadius;\n y = fetti.y + Math.sin(rot) * innerRadius;\n context.lineTo(x, y);\n rot += step;\n }\n } else {\n context.moveTo(Math.floor(fetti.x), Math.floor(fetti.y));\n context.lineTo(Math.floor(fetti.wobbleX), Math.floor(y1));\n context.lineTo(Math.floor(x2), Math.floor(y2));\n context.lineTo(Math.floor(x1), Math.floor(fetti.wobbleY));\n }\n\n context.closePath();\n context.fill();\n\n return fetti.tick < fetti.totalTicks;\n }\n\n function animate(canvas, fettis, resizer, size, done) {\n var animatingFettis = fettis.slice();\n var context = canvas.getContext('2d');\n var animationFrame;\n var destroy;\n\n var prom = promise(function (resolve) {\n function onDone() {\n animationFrame = destroy = null;\n\n context.clearRect(0, 0, size.width, size.height);\n bitmapMapper.clear();\n\n done();\n resolve();\n }\n\n function update() {\n if (isWorker && !(size.width === workerSize.width && size.height === workerSize.height)) {\n size.width = canvas.width = workerSize.width;\n size.height = canvas.height = workerSize.height;\n }\n\n if (!size.width && !size.height) {\n resizer(canvas);\n size.width = canvas.width;\n size.height = canvas.height;\n }\n\n context.clearRect(0, 0, size.width, size.height);\n\n animatingFettis = animatingFettis.filter(function (fetti) {\n return updateFetti(context, fetti);\n });\n\n if (animatingFettis.length) {\n animationFrame = raf.frame(update);\n } else {\n onDone();\n }\n }\n\n animationFrame = raf.frame(update);\n destroy = onDone;\n });\n\n return {\n addFettis: function (fettis) {\n animatingFettis = animatingFettis.concat(fettis);\n\n return prom;\n },\n canvas: canvas,\n promise: prom,\n reset: function () {\n if (animationFrame) {\n raf.cancel(animationFrame);\n }\n\n if (destroy) {\n destroy();\n }\n }\n };\n }\n\n function confettiCannon(canvas, globalOpts) {\n var isLibCanvas = !canvas;\n var allowResize = !!prop(globalOpts || {}, 'resize');\n var hasResizeEventRegistered = false;\n var globalDisableForReducedMotion = prop(globalOpts, 'disableForReducedMotion', Boolean);\n var shouldUseWorker = canUseWorker && !!prop(globalOpts || {}, 'useWorker');\n var worker = shouldUseWorker ? getWorker() : null;\n var resizer = isLibCanvas ? setCanvasWindowSize : setCanvasRectSize;\n var initialized = (canvas && worker) ? !!canvas.__confetti_initialized : false;\n var preferLessMotion = typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion)').matches;\n var animationObj;\n\n function fireLocal(options, size, done) {\n var particleCount = prop(options, 'particleCount', onlyPositiveInt);\n var angle = prop(options, 'angle', Number);\n var spread = prop(options, 'spread', Number);\n var startVelocity = prop(options, 'startVelocity', Number);\n var decay = prop(options, 'decay', Number);\n var gravity = prop(options, 'gravity', Number);\n var drift = prop(options, 'drift', Number);\n var colors = prop(options, 'colors', colorsToRgb);\n var ticks = prop(options, 'ticks', Number);\n var shapes = prop(options, 'shapes');\n var scalar = prop(options, 'scalar');\n var flat = !!prop(options, 'flat');\n var origin = getOrigin(options);\n\n var temp = particleCount;\n var fettis = [];\n\n var startX = canvas.width * origin.x;\n var startY = canvas.height * origin.y;\n\n while (temp--) {\n fettis.push(\n randomPhysics({\n x: startX,\n y: startY,\n angle: angle,\n spread: spread,\n startVelocity: startVelocity,\n color: colors[temp % colors.length],\n shape: shapes[randomInt(0, shapes.length)],\n ticks: ticks,\n decay: decay,\n gravity: gravity,\n drift: drift,\n scalar: scalar,\n flat: flat\n })\n );\n }\n\n // if we have a previous canvas already animating,\n // add to it\n if (animationObj) {\n return animationObj.addFettis(fettis);\n }\n\n animationObj = animate(canvas, fettis, resizer, size , done);\n\n return animationObj.promise;\n }\n\n function fire(options) {\n var disableForReducedMotion = globalDisableForReducedMotion || prop(options, 'disableForReducedMotion', Boolean);\n var zIndex = prop(options, 'zIndex', Number);\n\n if (disableForReducedMotion && preferLessMotion) {\n return promise(function (resolve) {\n resolve();\n });\n }\n\n if (isLibCanvas && animationObj) {\n // use existing canvas from in-progress animation\n canvas = animationObj.canvas;\n } else if (isLibCanvas && !canvas) {\n // create and initialize a new canvas\n canvas = getCanvas(zIndex);\n document.body.appendChild(canvas);\n }\n\n if (allowResize && !initialized) {\n // initialize the size of a user-supplied canvas\n resizer(canvas);\n }\n\n var size = {\n width: canvas.width,\n height: canvas.height\n };\n\n if (worker && !initialized) {\n worker.init(canvas);\n }\n\n initialized = true;\n\n if (worker) {\n canvas.__confetti_initialized = true;\n }\n\n function onResize() {\n if (worker) {\n // TODO this really shouldn't be immediate, because it is expensive\n var obj = {\n getBoundingClientRect: function () {\n if (!isLibCanvas) {\n return canvas.getBoundingClientRect();\n }\n }\n };\n\n resizer(obj);\n\n worker.postMessage({\n resize: {\n width: obj.width,\n height: obj.height\n }\n });\n return;\n }\n\n // don't actually query the size here, since this\n // can execute frequently and rapidly\n size.width = size.height = null;\n }\n\n function done() {\n animationObj = null;\n\n if (allowResize) {\n hasResizeEventRegistered = false;\n global.removeEventListener('resize', onResize);\n }\n\n if (isLibCanvas && canvas) {\n if (document.body.contains(canvas)) {\n document.body.removeChild(canvas); \n }\n canvas = null;\n initialized = false;\n }\n }\n\n if (allowResize && !hasResizeEventRegistered) {\n hasResizeEventRegistered = true;\n global.addEventListener('resize', onResize, false);\n }\n\n if (worker) {\n return worker.fire(options, size, done);\n }\n\n return fireLocal(options, size, done);\n }\n\n fire.reset = function () {\n if (worker) {\n worker.reset();\n }\n\n if (animationObj) {\n animationObj.reset();\n }\n };\n\n return fire;\n }\n\n // Make default export lazy to defer worker creation until called.\n var defaultFire;\n function getDefaultFire() {\n if (!defaultFire) {\n defaultFire = confettiCannon(null, { useWorker: true, resize: true });\n }\n return defaultFire;\n }\n\n function transformPath2D(pathString, pathMatrix, x, y, scaleX, scaleY, rotation) {\n var path2d = new Path2D(pathString);\n\n var t1 = new Path2D();\n t1.addPath(path2d, new DOMMatrix(pathMatrix));\n\n var t2 = new Path2D();\n // see https://developer.mozilla.org/en-US/docs/Web/API/DOMMatrix/DOMMatrix\n t2.addPath(t1, new DOMMatrix([\n Math.cos(rotation) * scaleX,\n Math.sin(rotation) * scaleX,\n -Math.sin(rotation) * scaleY,\n Math.cos(rotation) * scaleY,\n x,\n y\n ]));\n\n return t2;\n }\n\n function shapeFromPath(pathData) {\n if (!canUsePaths) {\n throw new Error('path confetti are not supported in this browser');\n }\n\n var path, matrix;\n\n if (typeof pathData === 'string') {\n path = pathData;\n } else {\n path = pathData.path;\n matrix = pathData.matrix;\n }\n\n var path2d = new Path2D(path);\n var tempCanvas = document.createElement('canvas');\n var tempCtx = tempCanvas.getContext('2d');\n\n if (!matrix) {\n // attempt to figure out the width of the path, up to 1000x1000\n var maxSize = 1000;\n var minX = maxSize;\n var minY = maxSize;\n var maxX = 0;\n var maxY = 0;\n var width, height;\n\n // do some line skipping... this is faster than checking\n // every pixel and will be mostly still correct\n for (var x = 0; x < maxSize; x += 2) {\n for (var y = 0; y < maxSize; y += 2) {\n if (tempCtx.isPointInPath(path2d, x, y, 'nonzero')) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n }\n\n width = maxX - minX;\n height = maxY - minY;\n\n var maxDesiredSize = 10;\n var scale = Math.min(maxDesiredSize/width, maxDesiredSize/height);\n\n matrix = [\n scale, 0, 0, scale,\n -Math.round((width/2) + minX) * scale,\n -Math.round((height/2) + minY) * scale\n ];\n }\n\n return {\n type: 'path',\n path: path,\n matrix: matrix\n };\n }\n\n function shapeFromText(textData) {\n var text,\n scalar = 1,\n color = '#000000',\n // see https://nolanlawson.com/2022/04/08/the-struggle-of-using-native-emoji-on-the-web/\n fontFamily = '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"EmojiOne Color\", \"Android Emoji\", \"Twemoji Mozilla\", \"system emoji\", sans-serif';\n\n if (typeof textData === 'string') {\n text = textData;\n } else {\n text = textData.text;\n scalar = 'scalar' in textData ? textData.scalar : scalar;\n fontFamily = 'fontFamily' in textData ? textData.fontFamily : fontFamily;\n color = 'color' in textData ? textData.color : color;\n }\n\n // all other confetti are 10 pixels,\n // so this pixel size is the de-facto 100% scale confetti\n var fontSize = 10 * scalar;\n var font = '' + fontSize + 'px ' + fontFamily;\n\n var canvas = new OffscreenCanvas(fontSize, fontSize);\n var ctx = canvas.getContext('2d');\n\n ctx.font = font;\n var size = ctx.measureText(text);\n var width = Math.ceil(size.actualBoundingBoxRight + size.actualBoundingBoxLeft);\n var height = Math.ceil(size.actualBoundingBoxAscent + size.actualBoundingBoxDescent);\n\n var padding = 2;\n var x = size.actualBoundingBoxLeft + padding;\n var y = size.actualBoundingBoxAscent + padding;\n width += padding + padding;\n height += padding + padding;\n\n canvas = new OffscreenCanvas(width, height);\n ctx = canvas.getContext('2d');\n ctx.font = font;\n ctx.fillStyle = color;\n\n ctx.fillText(text, x, y);\n\n var scale = 1 / scalar;\n\n return {\n type: 'bitmap',\n // TODO these probably need to be transfered for workers\n bitmap: canvas.transferToImageBitmap(),\n matrix: [scale, 0, 0, scale, -width * scale / 2, -height * scale / 2]\n };\n }\n\n module.exports = function() {\n return getDefaultFire().apply(this, arguments);\n };\n module.exports.reset = function() {\n getDefaultFire().reset();\n };\n module.exports.create = confettiCannon;\n module.exports.shapeFromPath = shapeFromPath;\n module.exports.shapeFromText = shapeFromText;\n}((function () {\n if (typeof window !== 'undefined') {\n return window;\n }\n\n if (typeof self !== 'undefined') {\n return self;\n }\n\n return this || {};\n})(), module, false));\n\n// end source content\n\nexport default module.exports;\nexport var create = module.exports.create;\n","/**\n * Sound effects utility functions using Web Audio API\n * These generate sounds programmatically without needing external audio files\n */\n\nexport class SoundEffects {\n private static audioContext: AudioContext | null = null;\n\n /**\n * Get or create a shared AudioContext\n */\n private static getAudioContext(): AudioContext | null {\n try {\n if (!this.audioContext) {\n this.audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n }\n // Resume context if it's suspended (some browsers require user interaction)\n if (this.audioContext.state === 'suspended') {\n this.audioContext.resume();\n }\n return this.audioContext;\n } catch (error) {\n console.warn('Audio context not available:', error);\n return null;\n }\n }\n\n /**\n * Play a level up sound effect\n * A pleasant major chord with arpeggio and bell overtones\n */\n static playLevelUp(level?: number, userSettings?: any): void {\n const milestones = [10, 25, 50, 100, 150, 200];\n const isMilestone = level && milestones.includes(level);\n \n // Check user settings for audio preferences\n if (userSettings) {\n // For milestone levels, check milestone sounds setting\n if (isMilestone && userSettings.milestoneSounds === false) {\n return;\n }\n // For regular levels, check level up sounds setting\n if (!isMilestone && userSettings.levelUpSounds === false) {\n return;\n }\n }\n \n if (isMilestone) {\n this.playMilestoneLevelUp();\n } else {\n this.playRegularLevelUp();\n }\n }\n\n /**\n * Play regular level up sound for normal levels\n */\n private static playRegularLevelUp(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const duration = 0.8;\n const now = audioContext.currentTime;\n \n // Create three oscillators for a pleasant C major chord\n const frequencies = [523.25, 659.25, 783.99]; // C5, E5, G5\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n // Use sine wave for a clean, pleasant sound\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n // Add a slight pitch bend up for a magical effect\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.05, now + duration * 0.1);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.02, now + duration);\n \n // Volume envelope with delay for each note (arpeggio effect)\n const delay = index * 0.05;\n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.15, now + delay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + duration);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + duration);\n });\n \n // Add a subtle bell/chime overtone\n const bellOscillator = audioContext.createOscillator();\n const bellGain = audioContext.createGain();\n \n bellOscillator.connect(bellGain);\n bellGain.connect(audioContext.destination);\n \n bellOscillator.type = 'triangle';\n bellOscillator.frequency.setValueAtTime(1046.5, now); // C6\n \n bellGain.gain.setValueAtTime(0, now);\n bellGain.gain.linearRampToValueAtTime(0.08, now + 0.01);\n bellGain.gain.exponentialRampToValueAtTime(0.001, now + 0.3);\n \n bellOscillator.start(now);\n bellOscillator.stop(now + 0.3);\n }\n\n /**\n * Play epic milestone level up sound for special levels (10, 25, 50, 100, 150, 200)\n * A longer, more elaborate celebration with multiple chord progressions\n */\n private static playMilestoneLevelUp(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n \n // Extended duration for milestone celebration\n const totalDuration = 2.5;\n \n // First chord progression: C Major -> F Major -> G Major -> C Major\n const chordProgression = [\n { time: 0.0, frequencies: [523.25, 659.25, 783.99] }, // C Major (C5, E5, G5)\n { time: 0.4, frequencies: [587.33, 698.46, 880.00] }, // F Major (D5, F5, A5)\n { time: 0.8, frequencies: [622.25, 783.99, 987.77] }, // G Major (D#5, G5, B5)\n { time: 1.2, frequencies: [523.25, 659.25, 783.99] }, // C Major (C5, E5, G5)\n ];\n \n // Play chord progression\n chordProgression.forEach((chord, chordIndex) => {\n chord.frequencies.forEach((freq, noteIndex) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now + chord.time);\n \n // Add slight pitch bend for magic\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.03, now + chord.time + 0.05);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.01, now + chord.time + 0.35);\n \n // Staggered note delays for arpeggio effect\n const noteDelay = noteIndex * 0.03;\n gainNode.gain.setValueAtTime(0, now + chord.time);\n gainNode.gain.linearRampToValueAtTime(0.12, now + chord.time + noteDelay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.02, now + chord.time + 0.35);\n gainNode.gain.exponentialRampToValueAtTime(0.001, now + chord.time + 0.4);\n \n oscillator.start(now + chord.time + noteDelay);\n oscillator.stop(now + chord.time + 0.45);\n });\n });\n \n // High-frequency sparkle effects throughout\n for (let i = 0; i < 8; i++) {\n const sparkleTime = now + 0.2 + (i * 0.15);\n const sparkleOsc = audioContext.createOscillator();\n const sparkleGain = audioContext.createGain();\n \n sparkleOsc.connect(sparkleGain);\n sparkleGain.connect(audioContext.destination);\n \n sparkleOsc.type = 'sine';\n const sparkleFreq = 1568 + (Math.random() * 800); // High frequencies for sparkle\n sparkleOsc.frequency.setValueAtTime(sparkleFreq, sparkleTime);\n sparkleOsc.frequency.exponentialRampToValueAtTime(sparkleFreq * 1.5, sparkleTime + 0.1);\n \n sparkleGain.gain.setValueAtTime(0, sparkleTime);\n sparkleGain.gain.linearRampToValueAtTime(0.06, sparkleTime + 0.01);\n sparkleGain.gain.exponentialRampToValueAtTime(0.001, sparkleTime + 0.12);\n \n sparkleOsc.start(sparkleTime);\n sparkleOsc.stop(sparkleTime + 0.15);\n }\n \n // Grand finale - triumphant high C chord\n const finaleTime = now + 1.6;\n const finaleFrequencies = [1046.5, 1318.5, 1567.98]; // C6, E6, G6\n \n finaleFrequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'triangle'; // Triangle wave for bell-like quality\n oscillator.frequency.setValueAtTime(freq, finaleTime);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.02, finaleTime + 0.8);\n \n const delay = index * 0.02;\n gainNode.gain.setValueAtTime(0, finaleTime);\n gainNode.gain.linearRampToValueAtTime(0.15, finaleTime + delay + 0.03);\n gainNode.gain.exponentialRampToValueAtTime(0.001, finaleTime + 0.9);\n \n oscillator.start(finaleTime + delay);\n oscillator.stop(finaleTime + 0.95);\n });\n }\n\n /**\n * Play a success/completion sound\n * A short, bright confirmation tone\n */\n static playSuccess(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n \n // Two quick ascending notes\n const frequencies = [659.25, 830.61]; // E5, G#5\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n const delay = index * 0.1;\n const duration = 0.15;\n \n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.2, now + delay + 0.01);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + duration);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + duration);\n });\n }\n\n /**\n * Play an error/failure sound\n * A low, descending tone\n */\n static playError(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sawtooth';\n oscillator.frequency.setValueAtTime(200, now);\n oscillator.frequency.exponentialRampToValueAtTime(100, now + 0.3);\n \n gainNode.gain.setValueAtTime(0.15, now);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.3);\n \n oscillator.start(now);\n oscillator.stop(now + 0.3);\n }\n\n /**\n * Play a click/button press sound\n * A very short, soft click\n */\n static playClick(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(1000, now);\n \n gainNode.gain.setValueAtTime(0.1, now);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.03);\n \n oscillator.start(now);\n oscillator.stop(now + 0.03);\n }\n\n /**\n * Play a notification sound\n * A gentle two-tone chime\n */\n static playNotification(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const frequencies = [880, 1174.66]; // A5, D6\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n const delay = index * 0.15;\n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.12, now + delay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + 0.4);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + 0.4);\n });\n }\n\n /**\n * Play an XP gain sound\n * A quick, ascending glissando\n */\n static playXpGain(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(440, now); // A4\n oscillator.frequency.exponentialRampToValueAtTime(880, now + 0.15); // A5\n \n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.15, now + 0.01);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.2);\n \n oscillator.start(now);\n oscillator.stop(now + 0.2);\n }\n}\n\n// Export individual functions for convenience\nexport const playLevelUp = (level?: number, userSettings?: any) => SoundEffects.playLevelUp(level, userSettings);\nexport const playSuccess = () => SoundEffects.playSuccess();\nexport const playError = () => SoundEffects.playError();\nexport const playClick = () => SoundEffects.playClick();\nexport const playNotification = () => SoundEffects.playNotification();\nexport const playXpGain = () => SoundEffects.playXpGain();","<template>\n <div class=\"level-progress-container\">\n <svg :width=\"size\" :height=\"size\" :viewBox=\"`0 0 ${viewBox} ${viewBox}`\" style=\"position: relative;\">\n <!-- Level Up Overlay -->\n <g v-if=\"levelUpActive\">\n <circle\n :cx=\"center\"\n :cy=\"center\"\n :r=\"innerCircleRadius\"\n fill=\"#a800ff\"\n opacity=\"0.92\"\n />\n <text\n :x=\"center\"\n :y=\"center + 15\"\n text-anchor=\"middle\"\n font-size=\"38\"\n font-weight=\"bold\"\n fill=\"#fff\"\n style=\"font-family: 'Montserrat', sans-serif;\"\n >Level Up</text>\n </g>\n \n <!-- Background Arc (gray portion) -->\n <path\n v-if=\"animatedValue >= 0 && animatedValue < props.max\"\n :d=\"backgroundArcPath\"\n stroke=\"#ddd\"\n :stroke-width=\"thickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Label Arc (top, thicker) -->\n <path\n :d=\"staticArcPath\"\n :stroke=\"staticArcGradient\"\n :stroke-width=\"labelThickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Invisible arc for curved label text -->\n <path\n :id=\"'labelTextArc'\"\n :d=\"labelTextArcPath\"\n stroke=\"transparent\"\n fill=\"none\"\n transform=\"scale(-1, 1) translate(-400, 0)\"\n />\n \n <!-- Progress Arc (XP bar) -->\n <path\n v-if=\"animatedValue > 0 && animatedValue < props.max\"\n :d=\"progressArcPath\"\n :stroke=\"progressArcGradient\"\n :stroke-width=\"thickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Curved Label Text -->\n <text \n font-size=\"30\" \n font-weight=\"bold\" \n fill=\"var(--color-purple-100)\" \n style=\"font-family: 'Montserrat', sans-serif; letter-spacing: 8px;\"\n >\n <textPath\n xlink:href=\"#labelTextArc\"\n startOffset=\"50%\"\n text-anchor=\"middle\"\n alignment-baseline=\"hanging\"\n dominant-baseline=\"hanging\"\n text-length=\"100%\"\n >\n {{ levelLabel }}\n </textPath>\n </text>\n \n <!-- Gradient Definitions -->\n <defs>\n <linearGradient id=\"staticGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stop-color=\"var(--color-strands-500)\" />\n <stop offset=\"100%\" stop-color=\"var(--color-strands-600)\" />\n </linearGradient>\n\n <linearGradient \n id=\"progressGradient\" \n gradientUnits=\"userSpaceOnUse\" \n :x1=\"progressGradientStart.x\" \n :y1=\"progressGradientStart.y\" \n :x2=\"progressGradientEnd.x\" \n :y2=\"progressGradientEnd.y\"\n >\n <stop offset=\"0%\" stop-color=\"var(--color-strands-600)\" />\n <stop offset=\"100%\" stop-color=\"var(--color-strands-400)\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport confetti from 'canvas-confetti';\nimport { playLevelUp } from '../utils/sounds';\n\n// ============================================================================\n// Props & Emits\n// ============================================================================\nconst props = defineProps<{\n value: number;\n max: number;\n level: number;\n levelLabel?: string;\n size?: number;\n thickness?: number;\n labelThickness?: number;\n staticArcAngle?: number;\n gapAngle?: number;\n userSettings?: any;\n}>();\n\nconst emit = defineEmits(['levelup']);\n\n// ============================================================================\n// Constants & Configuration\n// ============================================================================\nconst VIEW_BOX_SIZE = 400;\nconst ARC_PADDING = 18; // Extra space from edge\nconst INNER_GAP = 18; // Gap between progress ring and inner circle\nconst ANIMATION_DURATION = 600; // ms\n\n// Label arc configuration\nconst LABEL_SPACING = 8; // px, matches letter-spacing in template\nconst LABEL_FONT_SIZE = 30; // px, matches font-size in template\nconst LABEL_EXTRA_DEGREES = 12; // Extra spacing in degrees\nconst LABEL_CHAR_DEGREES = 8; // Degrees per character\n\n// ============================================================================\n// Component State\n// ============================================================================\nconst levelUpActive = ref(false);\nconst animatedValue = ref(props.value);\nconst animationDirection = ref<'forward' | 'backward'>('forward');\nlet animationFrame: number | null = null;\nlet prevValue = props.value;\nlet prevLevel = props.level;\n\n// ============================================================================\n// Computed Properties - Dimensions\n// ============================================================================\nconst viewBox = VIEW_BOX_SIZE;\nconst size = props.size ?? VIEW_BOX_SIZE;\nconst center = VIEW_BOX_SIZE / 2;\nconst thickness = computed(() => props.thickness ?? 24);\nconst labelThickness = computed(() => props.labelThickness ?? 46);\nconst gapAngle = computed(() => props.gapAngle ?? 16);\n\n// Radius calculations\nconst radius = computed(() => (VIEW_BOX_SIZE - thickness.value) / 2 - ARC_PADDING);\nconst labelRadius = computed(() => (VIEW_BOX_SIZE - labelThickness.value) / 1.9 - ARC_PADDING);\nconst textLabelRadius = computed(() => labelRadius.value + 10);\nconst innerCircleRadius = computed(() => radius.value - thickness.value / 2 - INNER_GAP);\n\n// ============================================================================\n// Computed Properties - Arc Angles\n// ============================================================================\nconst labelLength = computed(() => props.levelLabel?.length ?? 0);\nconst staticArcAngle = computed(() => {\n // Estimate arc angle needed for label\n return labelLength.value * LABEL_CHAR_DEGREES + LABEL_EXTRA_DEGREES;\n});\n\nconst labelStart = computed(() => -staticArcAngle.value / 2);\nconst labelEnd = computed(() => staticArcAngle.value / 2);\n\n// ============================================================================\n// Computed Properties - Arc Paths\n// ============================================================================\nconst staticArcPath = computed(() =>\n describeArc(center, center, labelRadius.value, labelStart.value, labelEnd.value)\n);\n\nconst labelTextArcPath = computed(() =>\n // Top arc: right to left, so text is right-side up at the top after rotation\n describeArc(center, center, textLabelRadius.value, -90, 90)\n);\n\nconst progressArcPath = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n return describeArc(center, center, radius.value, xpArcStart, xpArcEnd);\n});\n\nconst backgroundArcPath = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n const grayArcStart = progress === 0 ? xpArcStart : xpArcEnd + gapAngle.value;\n const grayArcEnd = labelStart.value - gapAngle.value + 360;\n return describeArc(center, center, radius.value, grayArcStart, grayArcEnd);\n});\n\n// ============================================================================\n// Computed Properties - Gradients\n// ============================================================================\nconst staticArcGradient = computed(() => 'url(#staticGradient)');\nconst progressArcGradient = computed(() => 'url(#progressGradient)');\n\nconst progressGradientStart = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n return polarToCartesian(center, center, radius.value, xpArcStart);\n});\n\nconst progressGradientEnd = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n return polarToCartesian(center, center, radius.value, xpArcEnd);\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number) {\n const rad = (angle - 90) * Math.PI / 180.0;\n return {\n x: cx + r * Math.cos(rad),\n y: cy + r * Math.sin(rad),\n };\n}\n\nfunction describeArc(cx: number, cy: number, r: number, startAngle: number, endAngle: number) {\n const start = polarToCartesian(cx, cy, r, endAngle % 360);\n const end = polarToCartesian(cx, cy, r, startAngle % 360);\n const sweep = ((endAngle - startAngle + 360) % 360);\n const largeArcFlag = sweep <= 180 ? '0' : '1';\n return [\n 'M', start.x, start.y,\n 'A', r, r, 0, largeArcFlag, 0, end.x, end.y\n ].join(' ');\n}\n\nfunction easeInOut(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ============================================================================\n// Animation Functions\n// ============================================================================\nfunction animateProgress(newValue: number, oldValue: number) {\n if (animationFrame) cancelAnimationFrame(animationFrame);\n \n const start = oldValue;\n const change = newValue - start;\n const startTime = performance.now();\n \n function step(now: number) {\n const elapsed = now - startTime;\n const t = Math.min(elapsed / ANIMATION_DURATION, 1);\n const eased = easeInOut(t);\n animatedValue.value = start + change * eased;\n \n if (t < 1) {\n animationFrame = requestAnimationFrame(step);\n } else {\n animatedValue.value = newValue;\n animationFrame = null;\n }\n }\n \n animationFrame = requestAnimationFrame(step);\n}\n\nfunction triggerLevelUp() {\n levelUpActive.value = true;\n playLevelUp(props.level, props.userSettings);\n emit('levelup');\n \n // More confetti for milestone levels\n const milestones = [10, 25, 50, 100, 150, 200];\n const isMilestone = milestones.includes(props.level);\n \n confetti({\n particleCount: isMilestone ? 150 : 80,\n angle: 90,\n spread: isMilestone ? 100 : 70,\n origin: { x: 0.5, y: 0 },\n colors: isMilestone ? ['#ea00a8', '#ff6b9d', '#ffb7d7', '#b8006f', '#9333ea', '#a855f7'] : undefined\n });\n \n // Extra confetti bursts for milestones\n if (isMilestone) {\n setTimeout(() => {\n confetti({\n particleCount: 100,\n angle: 45,\n spread: 80,\n origin: { x: 0.2, y: 0.6 },\n colors: ['#ea00a8', '#ff6b9d', '#ffb7d7']\n });\n }, 300);\n \n setTimeout(() => {\n confetti({\n particleCount: 100,\n angle: 135,\n spread: 80,\n origin: { x: 0.8, y: 0.6 },\n colors: ['#9333ea', '#a855f7', '#c084fc']\n });\n }, 500);\n }\n \n setTimeout(() => {\n levelUpActive.value = false;\n }, isMilestone ? 2000 : 1200);\n}\n\n// ============================================================================\n// Watchers\n// ============================================================================\nwatch(() => props.value, (newValue) => {\n animationDirection.value = newValue >= prevValue ? 'forward' : 'backward';\n animateProgress(newValue, prevValue);\n prevValue = newValue;\n});\n\nwatch(() => props.level, (newLevel) => {\n if (newLevel !== prevLevel && newLevel > prevLevel) {\n triggerLevelUp();\n }\n prevLevel = newLevel;\n});\n</script>\n\n<style scoped>\n.level-progress-container {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px;\n}\n</style>","<template>\n\t<teleport to=\"body\">\n\t\t<div v-if=\"open\" class=\"modal-overlay\" @click=\"handleOverlayClick\">\n\t\t\t<div \n\t\t\t\tclass=\"modal-container\" \n\t\t\t\t:class=\"{ 'modal-container-fullscreen-mobile': fullscreenOnMobile }\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t<div class=\"modal-card\">\n\t\t\t\t\t<div v-if=\"$slots['header']\" class=\"modal-header\">\n\t\t\t\t\t\t<slot name=\"header\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"modal-content\">\n\t\t\t\t\t\t<slot />\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div v-if=\"$slots['footer']\" class=\"modal-footer\">\n\t\t\t\t\t\t<slot name=\"footer\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</teleport>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n\topen?: boolean\n\tcloseOnOverlayClick?: boolean\n\tfullscreenOnMobile?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\topen: false,\n\tcloseOnOverlayClick: true,\n\tfullscreenOnMobile: true\n})\n\nconst emit = defineEmits<{\n\tclose: []\n}>()\n\nconst handleOverlayClick = () => {\n\tif (props.closeOnOverlayClick) {\n\t\temit('close')\n\t}\n}\n</script>\n\n<style scoped>\n.modal-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: rgba(0, 0, 0, 0.8);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 1rem;\n\tz-index: 50;\n}\n\n.modal-container {\n\tbackground: white;\n\tborder-radius: 0.5rem;\n\tbox-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n\tpadding: 1.5rem;\n\tmax-width: calc(100vw - 2rem);\n\tmax-height: calc(100vh - 2rem);\n\toverflow-y: auto;\n\twidth: auto;\n}\n\n.modal-header {\n\tpadding-bottom: 1rem;\n\tborder-bottom: 1px solid #e5e7eb;\n\tmargin-bottom: 1.5rem;\n}\n\n.modal-content {\n\t/* Let content flow naturally */\n}\n\n.modal-footer {\n\tpadding-top: 1rem;\n\tborder-top: 1px solid #e5e7eb;\n\tmargin-top: 1.5rem;\n}\n\n/* Fullscreen on mobile */\n@media (max-width: 768px) {\n\t.modal-container-fullscreen-mobile {\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\tmax-width: 100vw;\n\t\tmax-height: 100vh;\n\t\tborder-radius: 0;\n\t\tpadding: 1rem;\n\t}\n}\n\n/* Scrollbar styling */\n.modal-container::-webkit-scrollbar {\n\twidth: 6px;\n}\n\n.modal-container::-webkit-scrollbar-track {\n\tbackground: #f1f5f9;\n\tborder-radius: 3px;\n}\n\n.modal-container::-webkit-scrollbar-thumb {\n\tbackground: #cbd5e1;\n\tborder-radius: 3px;\n}\n\n.modal-container::-webkit-scrollbar-thumb:hover {\n\tbackground: #94a3b8;\n}\n</style>","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVgAAAHgCAYAAABQLAbaAAAEt2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNDgwIgogICB0aWZmOkltYWdlV2lkdGg9IjEzNjgiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLzEiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLzEiCiAgIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIxMzY4IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDgwIgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIw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rYdCFBEBYXQHawB8r7uGOCph1YlP9yoKH2PS1V0EEREREREREZlFW8B6BZN5xLgbTELOcR5rdATEp7prOIeru4A4qiAxjZh0rwYAxwMQERERERER0Xu0BawAUIWc0vn4nZIQ66UY7G7fDSSk0R2sYMDasnr36ozuOpqVhNzQXQMRERERERERmUdrwFpfbrv4/7N3P8lNJGvb/79Z5l/E+/ziyBEHA6MuVoBYAWIF2JPGGiFWgFmBzQqAFWBGkj2xWYHFClCvgOoRjdwd0om3z/NiZFX+BlUC4baxZEvKzKrrE8HpPnRj3w1SqerKO+90WcMlVQaYPR16tRCx6wJ+5gomcV1DaAaYN65rmEI/77oXEREREREREfmB04AV4CrXt4C+6zouoTrg6KXrIkogdl3Az1jSkF/DC9el2QBqjsuYhrpXRURERERERORUzgPWZdb6KYR84BVAQ4delduxRgRMrEczNpigFiUizDvXNYiIiIiIiIiIn4zrAka6tA4Iq6PtH1J4fpv1V67rKJpPNOMlzEfXdfzMCuvevJd816X1Aai6rmMK/RXWl10XISIiIiIiIiJ+ct7BOmKwoXexEsHLQ5o113UUzRXPxwMQ9oiLhco7vUMKV0HjAURERERERETkJ7wJWPMDZEI+8AoAi9nr0Yxd1yELlbguIASHNGsWu+W6jmkZ7FvXNYiIiIiIiIiIv7wJWKEQB14BVAaYA4Wss2OIKq5rOEfor9m569GMLeaN6zouIMkXf0RERERERERETuVVwLrMWj/CPHVdxwzECllnJyX1OmBN4T+ua/BZj73KAHOA/6MeThH+6BIRERERERERmS+vAlaAf/N4H2i7rmMG8pB1z+twMAQG4/XvYQQ91zX47JivbwgyXIVhMa5FIiIiIiIiIjJH3gWsAEPsU4qx7ToecKSQ9ZJSrNe/fxb7u+safHXIzkuLXXVdxwVt36GeuC5CRERERERERPzmZcB6h3qSQlG25lYVskoZHbKzabEbruu4qKHGA4iIiIiIiIjIBLwMWAFus/6K4mzPVch6Cb6PCLCYInRbz1Qerm65ruMS2upeFREREREREZFJeBuwQqFGBYBC1guzno8IiLBFeY3ORAHCVYy6V0VERERERERkQl4HrAUbFQAKWaXgihCuAu2b1NuuixARERERERGRMHgdsEI2KsBg9l3XMUPV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\"","export const slotHasContent = (slotName: string, slots: any) => {\n const slot = slots[slotName];\n if (!slot) return false;\n if (typeof slot === 'function') {\n const vnodes = slot();\n return Array.isArray(vnodes) && vnodes.length > 0;\n }\n return Array.isArray(slot) && slot.length > 0;\n};","<template>\n <div v-if=\"shouldShowSecuredBy\"\n class=\"flex items-center gap-2 pt-4 border-t border-neutral-200\"\n :class=\"hasDefaultSlot ? 'justify-between' : 'justify-center'\">\n <slot name=\"default\" />\n\n <!-- Secured by logo - Right side when sign out present, center when alone -->\n <div v-if=\"shouldShowSecuredBy\" class=\"flex-shrink-0\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"h-8\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { slotHasContent } from '../../utils/slots';\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\n\n// Get configuration\nconst { config } = useStrandsConfig(props.config)\n\n// Hide \"Secured by\" logo when using Strands' own domain\nconst shouldShowSecuredBy = computed(() => {\n const baseUrl = config.value.baseUrl\n return baseUrl !== 'https://accounts.strands.gg'\n})\n\nconst slots = useSlots()\nconst hasDefaultSlot = computed(() => slotHasContent('default', slots))\n</script>","import { ref, computed } from 'vue'\nimport type { \n MfaDevice, \n MfaDevicesResponse, \n TotpSetupResponse, \n BackupCodesResponse \n} from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\nimport { useStrandsAuth } from './useStrandsAuth'\n\nconst mfaDevices = ref<MfaDevice[]>([])\nconst mfaEnabled = ref(false)\nconst loading = ref(false)\n\nexport function useStrandsMfa() {\n const { getUrl } = useStrandsConfig()\n const { currentSession } = useStrandsAuth()\n\n const hasMfaDevices = computed(() => mfaDevices.value.length > 0)\n // Filter out hardware keys and passkeys temporarily until cross-domain support is implemented\n const activeMfaDevices = computed(() => \n mfaDevices.value.filter(d => \n d.is_active && \n d.device_type !== 'hardware' && \n d.device_type !== 'passkey'\n )\n )\n\n // Helper function to make authenticated requests\n const makeAuthenticatedRequest = async (url: string, options: RequestInit = {}) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = `Request failed: ${response.status} ${response.statusText}`\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorMessage\n } catch {\n // If parsing fails, use the original error text\n if (errorText) {\n errorMessage = errorText\n }\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n // Get all MFA devices for the user\n const fetchMfaDevices = async (): Promise<MfaDevicesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaDevices'), {\n method: 'GET',\n })\n\n mfaDevices.value = response.devices || []\n mfaEnabled.value = response.mfa_enabled || false\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Setup TOTP (authenticator app)\n const setupTotp = async (deviceName: string): Promise<TotpSetupResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaTotpSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Verify TOTP setup\n const verifyTotpSetup = async (deviceId: string, totpCode: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaTotpVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n totp_code: totpCode,\n }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Setup email-based MFA\n const setupEmailMfa = async (deviceName: string): Promise<{ device_id: string; email: string }> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Send email verification code\n const sendEmailMfaCode = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaEmailSend'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n } finally {\n loading.value = false\n }\n }\n\n // Verify email MFA code\n const verifyEmailMfaCode = async (deviceId: string, code: string): Promise<boolean> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n code: code,\n }),\n })\n\n return response.verified || false\n } finally {\n loading.value = false\n }\n }\n\n // Disable an MFA device\n const disableMfaDevice = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaDeviceDisable'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Regenerate backup codes for TOTP device\n const regenerateBackupCodes = async (deviceId: string): Promise<BackupCodesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaBackupCodes'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Helper function to get device type icon\n const getDeviceTypeIcon = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return '📱' // Authenticator app\n case 'email':\n return '📧' // Email\n case 'hardware':\n return '🔑' // Hardware key\n case 'passkey':\n return '🔐' // Passkey\n default:\n return '🔒' // Generic security\n }\n }\n\n // Helper function to get device type name\n const getDeviceTypeName = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return 'Authenticator App'\n case 'email':\n return 'Email Verification'\n case 'hardware':\n return 'Hardware Key'\n case 'passkey':\n return 'Passkey'\n default:\n return 'Unknown'\n }\n }\n\n // Helper function to format last used date\n const formatLastUsed = (lastUsedAt?: string | Date): string => {\n if (!lastUsedAt) return 'Never'\n \n const date = new Date(lastUsedAt)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n \n return date.toLocaleDateString()\n }\n\n return {\n // State\n mfaDevices: computed(() => mfaDevices.value),\n mfaEnabled: computed(() => mfaEnabled.value),\n loading: computed(() => loading.value),\n hasMfaDevices,\n activeMfaDevices,\n\n // Methods\n fetchMfaDevices,\n setupTotp,\n verifyTotpSetup,\n setupEmailMfa,\n sendEmailMfaCode,\n verifyEmailMfaCode,\n disableMfaDevice,\n regenerateBackupCodes,\n\n // Helper methods\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n }\n}","<template>\n <UiModal :open=\"show\" card-class=\"max-w-md\">\n <template #header>\n <div class=\"text-center\">\n <h2 class=\"text-xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-2\">Enter your verification code to continue</p>\n </div>\n </template>\n\n <div class=\"space-y-6\">\n <!-- Loading State -->\n <div v-if=\"loading && !emailCodeSent\" class=\"flex items-center justify-center py-8\">\n <StrandsUiLoader :size=\"24\" />\n <span class=\"ml-3 text-gray-600\">{{ isSendingMfaEmail || isVerifyingMfa ? authLoadingMessage : 'Loading...' }}</span>\n </div>\n\n <!-- Verification Form -->\n <div v-else class=\"space-y-4\">\n <!-- Available MFA Methods -->\n <div v-if=\"availableMethods.length > 1\" class=\"space-y-3\">\n <p class=\"text-sm font-medium text-gray-700\">Choose verification method:</p>\n <div class=\"grid gap-2\">\n <button\n v-for=\"method in availableMethods\"\n :key=\"method.id\"\n @click=\"selectMethod(method)\"\n :class=\"[\n 'flex items-center space-x-3 p-3 border rounded-lg transition-colors duration-200',\n selectedMethod?.id === method.id\n ? 'border-strands-500 bg-strands-50 text-strands-900'\n : 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'\n ]\"\n >\n <span class=\"text-xl\">{{ getDeviceTypeIcon(method.device_type) }}</span>\n <div class=\"text-left flex-1\">\n <p class=\"font-medium\">{{ method.device_name }}</p>\n <p class=\"text-sm text-gray-500\">{{ getDeviceTypeName(method.device_type) }}</p>\n </div>\n <div v-if=\"selectedMethod?.id === method.id\" class=\"w-5 h-5 text-strands-600\">\n <svg fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n </button>\n </div>\n </div>\n\n <!-- Single Method Display -->\n <div v-else-if=\"selectedMethod\" class=\"bg-gray-50 rounded-lg p-4\">\n <div class=\"flex items-center space-x-3\">\n <span class=\"text-2xl\">{{ getDeviceTypeIcon(selectedMethod.device_type) }}</span>\n <div>\n <h3 class=\"font-medium text-gray-900\">{{ selectedMethod.device_name }}</h3>\n <p class=\"text-sm text-gray-500\">{{ getDeviceTypeName(selectedMethod.device_type) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Email MFA Code Request -->\n <div v-if=\"selectedMethod?.device_type === 'email' && !emailCodeSent\" class=\"text-center\">\n <p class=\"text-sm text-gray-600 mb-4\">Click below to receive your verification code</p>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"sendEmailCode\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n Send Verification Code\n </StrandsUiButton>\n </div>\n\n <!-- Hardware Key & Passkey Authentication -->\n <div v-if=\"selectedMethod?.device_type === 'hardware' || selectedMethod?.device_type === 'passkey'\" class=\"text-center space-y-4\">\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-center space-x-3\">\n <div class=\"w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-6 h-6 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 7a2 2 0 012 2m0 0a2 2 0 012 2v6a2 2 0 01-2 2H9a2 2 0 01-2-2V9a2 2 0 012-2m0 0V7a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h3m0 0v8m0-8h8m-8 8h8\" />\n </svg>\n </div>\n <div class=\"text-left\">\n <h4 class=\"font-medium text-blue-900\">{{ selectedMethod.device_type === 'passkey' ? 'Use your passkey' : 'Touch your hardware key' }}</h4>\n <p class=\"text-sm text-blue-700\">{{ selectedMethod.device_type === 'passkey' ? 'Use biometrics, PIN, or device security to authenticate' : 'Insert and touch your hardware key to authenticate' }}</p>\n </div>\n </div>\n </div>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"authenticateHardwareKey\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ selectedMethod.device_type === 'passkey' ? 'Authenticate with Passkey' : 'Authenticate with Hardware Key' }}\n </StrandsUiButton>\n \n <!-- Backup Codes Option for Hardware Keys -->\n <div class=\"pt-4 border-t border-gray-200\">\n <button\n @click=\"showBackupCodeInput = !showBackupCodeInput\"\n class=\"flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors\"\n >\n <svg class=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 7a2 2 0 012 2m0 0a2 2 0 012 2v6a2 2 0 01-2 2H9a2 2 0 01-2-2V9a2 2 0 012-2m0 0V7a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h3m0 0v8m0-8h8m-8 8h8\" />\n </svg>\n {{ showBackupCodeInput ? 'Hide backup code' : (selectedMethod.device_type === 'passkey' ? 'Can\\'t access your passkey? Use backup code' : 'Can\\'t access your key? Use backup code') }}\n </button>\n </div>\n\n <!-- Backup Code Input for Hardware Keys -->\n <div v-if=\"showBackupCodeInput\" class=\"space-y-4 bg-amber-50 border border-amber-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2 mb-3\">\n <svg class=\"w-5 h-5 text-amber-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-amber-800\">Backup Code Recovery</p>\n <p class=\"text-sm text-amber-700 mt-1\">\n Enter one of your backup codes. Each code can only be used once.\n </p>\n </div>\n </div>\n \n <StrandsUiInput\n v-model=\"backupCode\"\n label=\"Backup Code\"\n placeholder=\"abcd-1234\"\n :error=\"backupCodeError\"\n :disabled=\"loading\"\n @input=\"onBackupCodeInput\"\n @keydown.enter=\"verifyBackupCode\"\n class=\"font-mono\"\n />\n </div>\n </div>\n\n <!-- Code Input -->\n <div v-if=\"selectedMethod && selectedMethod.device_type !== 'hardware' && selectedMethod.device_type !== 'passkey' && (selectedMethod.device_type !== 'email' || emailCodeSent)\" class=\"space-y-4\">\n <!-- Email confirmation -->\n <div v-if=\"selectedMethod.device_type === 'email' && emailCodeSent\" class=\"bg-green-50 border border-green-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-green-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-green-800\">Code Sent!</p>\n <p class=\"text-sm text-green-700 mt-1\">Check your email for the verification code</p>\n </div>\n </div>\n </div>\n\n <!-- Code Input Field -->\n <StrandsUiInput\n v-model=\"verificationCode\"\n label=\"Verification Code\"\n :placeholder=\"selectedMethod.device_type === 'totp' ? '123456' : '123456'\"\n maxlength=\"6\"\n :error=\"verificationError\"\n :disabled=\"loading\"\n @input=\"onCodeInput\"\n @keydown.enter=\"verify\"\n autofocus\n :name=\"selectedMethod.device_type === 'totp' ? 'totp' : 'mfa-code'\"\n :autocomplete=\"selectedMethod.device_type === 'totp' ? 'one-time-code' : 'one-time-code'\"\n inputmode=\"numeric\"\n />\n\n <!-- TOTP Help -->\n <div v-if=\"selectedMethod.device_type === 'totp'\" class=\"text-sm text-gray-600\">\n Open your authenticator app and enter the 6-digit code for \"{{ selectedMethod.device_name }}\"\n </div>\n\n <!-- Email Resend -->\n <div v-if=\"selectedMethod.device_type === 'email'\" class=\"flex justify-between text-sm\">\n <button\n @click=\"sendEmailCode\"\n :disabled=\"loading || cooldownActive\"\n class=\"text-strands-600 hover:text-strands-800 disabled:text-gray-400 disabled:cursor-not-allowed\"\n >\n {{ cooldownActive ? `Resend in ${cooldownSeconds}s` : 'Resend Code' }}\n </button>\n </div>\n\n <!-- Backup Codes Option -->\n <div class=\"pt-4 border-t border-gray-200\">\n <button\n @click=\"showBackupCodeInput = !showBackupCodeInput\"\n class=\"flex items-center text-sm text-gray-600 hover:text-gray-800 transition-colors\"\n >\n <svg class=\"w-4 h-4 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 7a2 2 0 012 2m0 0a2 2 0 012 2v6a2 2 0 01-2 2H9a2 2 0 01-2-2V9a2 2 0 012-2m0 0V7a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h3m0 0v8m0-8h8m-8 8h8\" />\n </svg>\n {{ showBackupCodeInput ? 'Hide backup code' : 'Use backup code instead' }}\n </button>\n </div>\n\n <!-- Backup Code Input -->\n <div v-if=\"showBackupCodeInput\" class=\"space-y-4 bg-amber-50 border border-amber-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2 mb-3\">\n <svg class=\"w-5 h-5 text-amber-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-amber-800\">Backup Code Recovery</p>\n <p class=\"text-sm text-amber-700 mt-1\">\n Enter one of your backup codes. Each code can only be used once.\n </p>\n </div>\n </div>\n \n <StrandsUiInput\n v-model=\"backupCode\"\n label=\"Backup Code\"\n placeholder=\"abcd-1234\"\n :error=\"backupCodeError\"\n :disabled=\"loading\"\n @input=\"onBackupCodeInput\"\n @keydown.enter=\"verifyBackupCode\"\n class=\"font-mono\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"flex justify-between\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n \n <StrandsUiButton\n v-if=\"(selectedMethod && selectedMethod.device_type !== 'hardware' && selectedMethod.device_type !== 'passkey' && (selectedMethod.device_type !== 'email' || emailCodeSent)) || ((selectedMethod?.device_type === 'hardware' || selectedMethod?.device_type === 'passkey') && showBackupCodeInput)\"\n variant=\"primary\"\n @click=\"showBackupCodeInput ? verifyBackupCode() : verify()\"\n :disabled=\"(!verificationCode.trim() && !backupCode.trim()) || loading\"\n :loading=\"loading\"\n >\n {{ showBackupCodeInput ? 'Verify Backup Code' : 'Verify' }}\n </StrandsUiButton>\n </div>\n </template>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeUnmount } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n availableMfaMethods?: MfaDevice[]\n sessionId?: string | null\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n (e: 'error', error: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst {\n loading: mfaLoading,\n getDeviceTypeIcon,\n getDeviceTypeName,\n} = useStrandsMfa()\n\nconst {\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n mfaSessionId: authMfaSessionId,\n loading: authLoading,\n loadingMessage: authLoadingMessage,\n isSendingMfaEmail,\n isVerifyingMfa,\n} = useStrandsAuth()\n\nconst loading = computed(() => mfaLoading.value || authLoading.value)\n\n// State\nconst selectedMethod = ref<MfaDevice | null>(null)\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst backupCode = ref('')\nconst backupCodeError = ref('')\nconst showBackupCodeInput = ref(false)\nconst emailCodeSent = ref(false)\nconst cooldownActive = ref(false)\nconst cooldownSeconds = ref(0)\n\nlet cooldownInterval: NodeJS.Timeout | null = null\n\n// Computed - filter out WebAuthn methods temporarily until cross-domain support is implemented\nconst availableMethods = computed(() => {\n const methods = props.availableMfaMethods || []\n // Temporarily disable hardware keys and passkeys until cross-domain WebAuthn is resolved\n return methods.filter(method => \n method.device_type !== 'hardware' && \n method.device_type !== 'passkey'\n )\n})\n\n// Auto-select if only one method available\nwatch(() => availableMethods.value, (methods) => {\n if (methods.length === 1) {\n selectedMethod.value = methods[0]\n } else if (methods.length === 0) {\n selectedMethod.value = null\n }\n}, { immediate: true })\n\n// Reset when modal opens/closes\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n // Reset state\n verificationCode.value = ''\n verificationError.value = ''\n backupCode.value = ''\n backupCodeError.value = ''\n showBackupCodeInput.value = false\n emailCodeSent.value = false\n cooldownActive.value = false\n cooldownSeconds.value = 0\n \n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n\n // Loading state is already handled in useStrandsAuth when MFA is required\n\n // Auto-select method if only one available\n if (availableMethods.value.length === 1) {\n selectedMethod.value = availableMethods.value[0]\n \n // If the only method is email, automatically send the code\n if (selectedMethod.value.device_type === 'email') {\n // Small delay to ensure UI is ready\n setTimeout(async () => {\n try {\n await sendMfaEmailCode(selectedMethod.value!.id)\n emailCodeSent.value = true\n startCooldown()\n } catch (error) {\n emit('error', error instanceof Error ? error.message : 'Failed to send email code')\n // Even if auto-send fails, show the manual send button by not setting emailCodeSent to true\n }\n }, 100)\n }\n }\n } else {\n selectedMethod.value = null\n }\n})\n\nonBeforeUnmount(() => {\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst selectMethod = (method: MfaDevice) => {\n selectedMethod.value = method\n verificationCode.value = ''\n verificationError.value = ''\n emailCodeSent.value = false\n showBackupCodeInput.value = false\n}\n\nconst onCodeInput = (value: string) => {\n // Only allow digits for verification codes\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst onBackupCodeInput = (value: string) => {\n // Allow alphanumeric and hyphens for backup codes, normalize to lowercase\n // Remove any characters except letters, numbers, and hyphens\n let cleaned = value.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase()\n \n // If the user is typing continuously without hyphens, auto-format with hyphens for xxxx-xxxx pattern\n if (!/[-]/.test(cleaned) && cleaned.length > 4) {\n // Format as xxxx-xxxx pattern\n const part1 = cleaned.substring(0, 4)\n const part2 = cleaned.substring(4, 8)\n cleaned = part2 ? `${part1}-${part2}` : part1\n }\n \n // Limit to xxxx-xxxx format (8 characters plus 1 hyphen = 9 total)\n if (cleaned.replace(/-/g, '').length <= 8) {\n backupCode.value = cleaned\n }\n \n backupCodeError.value = ''\n}\n\nconst sendEmailCode = async () => {\n if (!selectedMethod.value || selectedMethod.value.device_type !== 'email') return\n\n try {\n // Use the sign-in specific MFA email code method\n await sendMfaEmailCode(selectedMethod.value.id)\n emailCodeSent.value = true\n startCooldown()\n } catch (error) {\n emit('error', error instanceof Error ? error.message : 'Failed to send email code')\n }\n}\n\nconst startCooldown = () => {\n cooldownActive.value = true\n cooldownSeconds.value = 30\n\n cooldownInterval = setInterval(() => {\n cooldownSeconds.value -= 1\n if (cooldownSeconds.value <= 0) {\n cooldownActive.value = false\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n }, 1000)\n}\n\nconst verify = async () => {\n if (!selectedMethod.value || !verificationCode.value) return\n\n verificationError.value = ''\n\n try {\n await verifyMfa(selectedMethod.value.id, verificationCode.value)\n emit('success')\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst verifyBackupCode = async () => {\n if (!backupCode.value) return\n\n backupCodeError.value = ''\n\n try {\n await verifyMfa('', backupCode.value, true) // deviceId not needed for backup codes\n emit('success')\n } catch (error) {\n backupCodeError.value = error instanceof Error ? error.message : 'Invalid backup code'\n }\n}\n\nconst authenticateHardwareKey = async () => {\n // Use sessionId from props or auth composable\n const sessionId = props.sessionId || authMfaSessionId.value\n \n if (!selectedMethod.value || (selectedMethod.value.device_type !== 'hardware' && selectedMethod.value.device_type !== 'passkey') || !sessionId) {\n emit('error', 'Missing requirements for hardware key authentication')\n return\n }\n\n try {\n // Check if WebAuthn is supported\n if (!window.navigator.credentials || !window.PublicKeyCredential) {\n throw new Error('Hardware keys are not supported in this browser')\n }\n \n // Get WebAuthn challenge from backend\n const challengeResponse = await getMfaWebAuthnChallenge(selectedMethod.value.id)\n \n // Extract the publicKey from the challenge response\n const challengeData = challengeResponse.challenge.publicKey || challengeResponse.challenge\n \n // Helper function to convert base64 to Uint8Array\n const base64ToUint8Array = (base64: string) => {\n if (!base64 || typeof base64 !== 'string') {\n return new Uint8Array(0)\n }\n const padding = '='.repeat((4 - base64.length % 4) % 4)\n const b64 = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/')\n const rawData = window.atob(b64)\n const outputArray = new Uint8Array(rawData.length)\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i)\n }\n return outputArray\n }\n \n // Use the challenge from backend with device-optimized parameters\n const isPasskey = selectedMethod.value.device_type === 'passkey'\n \n // Convert challenge and other binary fields from base64 to Uint8Array\n const publicKeyCredentialRequestOptions: any = {\n ...challengeData,\n challenge: challengeData.challenge ? base64ToUint8Array(challengeData.challenge) : new Uint8Array(32),\n timeout: isPasskey ? 300000 : (challengeData.timeout || 60000),\n userVerification: (isPasskey ? 'required' : 'discouraged') as UserVerificationRequirement\n }\n \n // Convert allowCredentials if present\n if (challengeData.allowCredentials && Array.isArray(challengeData.allowCredentials)) {\n publicKeyCredentialRequestOptions.allowCredentials = challengeData.allowCredentials.map((cred: any) => ({\n ...cred,\n id: base64ToUint8Array(cred.id)\n }))\n }\n \n // Get WebAuthn credential from hardware key\n const credential = await navigator.credentials.get({\n publicKey: publicKeyCredentialRequestOptions\n }) as PublicKeyCredential\n\n if (!credential) {\n throw new Error(`${selectedMethod.value.device_type === 'passkey' ? 'Passkey' : 'Hardware key'} authentication was cancelled`)\n }\n\n // Try to get device information from the authenticator data\n const authenticatorData = new Uint8Array((credential.response as AuthenticatorAssertionResponse).authenticatorData)\n \n // Extract AAGUID (Authenticator Attestation Globally Unique Identifier) for device identification\n // AAGUID is at bytes 37-52 of authenticator data\n let deviceInfo = 'Security Key'\n if (authenticatorData.length >= 53) {\n const aaguid = Array.from(authenticatorData.slice(37, 53))\n const aaguidHex = aaguid.map(b => b.toString(16).padStart(2, '0')).join('')\n \n // Common AAGUID to device name mapping\n const knownAAGUIDs: Record<string, string> = {\n '00000000000000000000000000000000': 'Generic Security Key',\n 'ee882879721c491397753dfcce97072a': 'YubiKey 5 Series',\n 'f8a011f38c0a4d15800617111f9edc7d': 'YubiKey 5 Series',\n '2fc0579f811347eab116bb5a8db9202a': 'YubiKey 5 Series',\n 'c5ef55ffad9a4b9fb580adcb7c15e233': 'YubiKey 5 Series',\n '6d44ba9bf6ec2e49b9300200c9a3376d': 'Google Titan Security Key',\n 'de1e552d14e14b1f9390f6d61b56e4d1': 'Feitian Security Key',\n '12ded745aa4e4b4f84be2736d6b1b2a5': 'SoloKeys Solo',\n '8876631bd4a0427f57730ec71c9e0279': 'Nitrokey FIDO2'\n }\n \n deviceInfo = knownAAGUIDs[aaguidHex] || `Security Key (${aaguidHex.substring(0, 8)}...)`\n }\n\n // Format the credential for the backend\n const credentialData = {\n id: credential.id,\n rawId: Array.from(new Uint8Array(credential.rawId)),\n response: {\n clientDataJSON: Array.from(new Uint8Array(credential.response.clientDataJSON)),\n authenticatorData: Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).authenticatorData)),\n signature: Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).signature)),\n userHandle: (credential.response as AuthenticatorAssertionResponse).userHandle ? \n Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).userHandle!)) : null\n },\n type: credential.type,\n deviceInfo: deviceInfo // Include detected device info\n }\n\n // Send the credential data to the backend using the frontend device ID\n await verifyMfa(selectedMethod.value.id, JSON.stringify(credentialData))\n \n emit('success')\n\n } catch (error) {\n console.error('Hardware key authentication error:', error)\n emit('error', error instanceof Error ? error.message : 'Hardware key authentication failed')\n }\n}\n</script>","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n icon?: string\n iconUrl?: string\n auth_url: string\n scopes: string[]\n enabled: boolean\n metadata?: Record<string, string>\n}\n\nexport interface OAuthProvidersResponse {\n providers: OAuthProvider[]\n redirect_url: string\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl, config } = 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 let url = getUrl('oauthProviders')\n \n // Add redirect_url parameter if configured\n const redirectUrl = options.redirectUrl || config.value?.oauth2RedirectUrl\n if (redirectUrl) {\n const params = new URLSearchParams()\n \n // Convert relative URLs to absolute URLs\n let absoluteRedirectUrl = redirectUrl\n if (redirectUrl.startsWith('/')) {\n // Get the current origin\n const currentOrigin = window.location.origin\n absoluteRedirectUrl = `${currentOrigin}${redirectUrl}`\n }\n \n params.append('redirect_url', absoluteRedirectUrl)\n url = `${url}?${params.toString()}`\n }\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n // The API returns { providers: [...], redirect_url: \"...\" }\n providers.value = result.providers || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n // Convert relative URLs to absolute URLs\n let absoluteRedirectUrl = mergedOptions.redirectUrl\n if (mergedOptions.redirectUrl.startsWith('/')) {\n const currentOrigin = window.location.origin\n absoluteRedirectUrl = `${currentOrigin}${mergedOptions.redirectUrl}`\n }\n params.append('redirect_url', absoluteRedirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n // Find the provider and use its auth_url directly\n const provider = providers.value.find(p => p.id === providerId)\n if (!provider) {\n throw new Error(`OAuth provider '${providerId}' not found`)\n }\n \n if (!provider.auth_url) {\n throw new Error(`No auth URL configured for provider '${providerId}'`)\n }\n \n window.location.href = provider.auth_url\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div :class=\"props.inModal ? 'auth-container-modal w-full min-w-90' : 'auth-container w-full min-w-100 max-w-md mx-auto animate-slide-up'\">\n <div :class=\"props.inModal ? 'auth-content-modal' : 'auth-content card-modern'\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"text-3xl font-bold text-gradient mb-2\">\n {{ isPasswordReset ? 'Reset password' : isSignUp ? 'Create account' : 'Welcome back' }}\n </h1>\n </Transition>\n <Transition name=\"fade\" mode=\"out-in\">\n <p :key=\"currentMode\" class=\"text-neutral-600\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link to reset your password' : isSignUp\n ?\n 'We\\'ll send you a magic link to get started' : 'Sign in to your account to continue' }}\n </p>\n </Transition>\n </div>\n\n <!-- Tab Switcher (only show for signin/signup) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset\" class=\"mb-8\">\n <StrandsUiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <!-- Generic icon for other providers -->\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </StrandsUiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition name=\"height-fade\">\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or {{ isSignUp ? 'create account' : 'sign in' }} with email</span>\n </div>\n </Transition>\n\n <!-- Auth Form -->\n <form @submit.prevent=\"handleAuth\" class=\"space-y-6\">\n <div>\n <!-- Email -->\n <div :class=\"['email-field-spacing', (!isPasswordReset && !isSignUp) ? 'has-password' : 'no-password']\">\n <StrandsUiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n </div>\n\n <!-- Password (Sign In Only) -->\n <Transition name=\"password-fade\">\n <div v-if=\"!isPasswordReset && !isSignUp\" class=\"mb-4\">\n <div class=\"flex items-center justify-between mb-2\">\n <span class=\"text-sm font-medium text-gray-700\">Password</span>\n <StrandsUiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <StrandsUiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"buttonLoading || !isFormValid\" :loading=\"buttonLoading\"\n :loading-text=\"loadingMessage\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <StrandsUiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition name=\"height-fade\">\n <div v-if=\"isPasswordReset\" class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"currentMode = 'signin'\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <Transition name=\"support-fade\" v-if=\"getSupportEmail()\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </Transition>\n </StrandsSecuredFooter>\n </div>\n \n <!-- MFA Verification Modal -->\n <StrandsMfaVerification\n :show=\"showMfaVerification\"\n :available-mfa-methods=\"availableMfaMethods\"\n @success=\"handleMfaSuccess\"\n @close=\"handleMfaClose\"\n @error=\"handleMfaError\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink, StrandsUiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaVerification from './StrandsMfaVerification.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n inModal?: boolean\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 inModal: false,\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { \n signIn, \n setAuthData, \n mfaRequired, \n availableMfaMethods,\n verifyMfa,\n sendMfaEmailCode,\n currentUser,\n loadingMessage\n} = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string): Promise<AuthResponse> {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result: AuthResponse = await response.json()\n return result\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n \n return result.message\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst buttonLoading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\nconst showMfaVerification = 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\n// Watch for MFA requirement\nwatch(mfaRequired, (required) => {\n if (required) {\n showMfaVerification.value = true\n }\n}, { immediate: true })\n\n// MFA handlers\nconst handleMfaSuccess = () => {\n showMfaVerification.value = false\n // The auth composable will have updated the user state\n emit('success', currentUser.value)\n}\n\nconst handleMfaClose = () => {\n showMfaVerification.value = false\n // Reset form or allow user to try again\n}\n\nconst handleMfaError = (errorMessage: string) => {\n error.value = errorMessage\n emit('error', errorMessage)\n}\n\nconst handleAuth = async () => {\n buttonLoading.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 using MFA-enabled composable\n const response = await signIn({\n email: form.email,\n password: form.password\n })\n \n // If MFA is not required, emit success immediately\n if (!response.mfa_required) {\n emit('success', response.user)\n }\n // If MFA is required, the MFA modal will be shown automatically\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 buttonLoading.value = false\n }\n}\n\nconst handleOAuthAuth = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to ${isSignUp.value ? 'sign up' : 'sign in'} with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\n// Watch for prop changes\nwatch(() => props.mode, (newMode) => {\n currentMode.value = newMode\n})\n\n// Watch for mode changes to clear form\nwatch(currentMode, (newMode) => {\n error.value = ''\n isPasswordResetSubmitted.value = false\n // Clear form when switching modes\n form.firstName = ''\n form.lastName = ''\n form.email = ''\n form.password = ''\n form.confirmPassword = ''\n emit('mode-changed', newMode)\n})\n</script>\n\n<style scoped>\n/* Simple fade transition - gentle and smooth */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 350ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Modern height-fade transition using interpolate-size for smooth height: auto */\n.height-fade-enter-active,\n.height-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support */\n@supports (interpolate-size: allow-keywords) {\n .height-fade-enter-active,\n .height-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .height-fade-enter-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-leave-active {\n transition: \n opacity 600ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 600ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 600ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .height-fade-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-3px);\n }\n \n .height-fade-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .height-fade-enter-to,\n .height-fade-leave-from {\n opacity: 1;\n max-height: 300px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Support block transition - gentle fade with subtle scale */\n.support-fade-enter-active,\n.support-fade-leave-active {\n transition: all 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.support-fade-enter-from {\n opacity: 0;\n transform: scale(0.97) translateY(8px);\n}\n\n.support-fade-leave-to {\n opacity: 0;\n transform: scale(0.99) translateY(-4px);\n}\n\n.support-fade-enter-to,\n.support-fade-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Expand transition - for alerts using modern height animation */\n.expand-enter-active,\n.expand-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for expand */\n@supports (interpolate-size: allow-keywords) {\n .expand-enter-active,\n .expand-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for expand in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n max-height: 150px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Loading pulse animation */\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n/* Slide up animation for main container - elegant entrance */\n@keyframes slide-up {\n from {\n opacity: 0;\n transform: translateY(24px) scale(0.96);\n filter: blur(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n filter: blur(0px);\n }\n}\n\n.animate-slide-up {\n animation: slide-up 600ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Fade in animation for alerts - gentle appearance */\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: scale(0.97) translateY(6px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.animate-fade-in {\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Email field spacing animation */\n.email-field-spacing {\n transition: margin-bottom 500ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.email-field-spacing.has-password {\n margin-bottom: 1rem; /* mb-4 equivalent */\n}\n\n.email-field-spacing.no-password {\n margin-bottom: 0;\n}\n\n/* Password field transition - optimized for form layout */\n.password-fade-enter-active,\n.password-fade-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for password field */\n@supports (interpolate-size: allow-keywords) {\n .password-fade-enter-active,\n .password-fade-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for password field in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .password-fade-enter-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-leave-active {\n transition: \n opacity 500ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 500ms cubic-bezier(0.16, 1, 0.3, 1),\n margin 500ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 500ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .password-fade-enter-from {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .password-fade-leave-to {\n opacity: 0;\n max-height: 0;\n margin-top: 0;\n margin-bottom: 0;\n transform: scale(0.995) translateY(1px);\n }\n \n .password-fade-enter-to,\n .password-fade-leave-from {\n opacity: 1;\n max-height: 120px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Modal-specific styles - removes border, radius, background, and padding */\n.auth-container-modal {\n /* Remove any container-specific styles when in modal */\n}\n\n.auth-content-modal {\n /* Remove card styling when in modal */\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n}\n</style>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome back</h1>\n <p class=\"text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth group\">\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"space-y-6\">\n <div class=\"space-y-4\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n\n <div>\n <span class=\"text-sm font-medium text-neutral-700 block mb-2\">Password</span>\n <StrandsUiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </StrandsUiButton>\n </form>\n\n <!-- Forgot password link - moved outside form to control tab order -->\n <div class=\"text-center mt-4\">\n <StrandsUiLink @click=\"$emit('forgot-password')\" class=\"text-sm\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Don't have an account?\n <StrandsUiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </StrandsUiLink>\n </p>\n </div>\n\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n \n <!-- MFA Verification Modal -->\n <StrandsMfaVerification\n :show=\"showMfaVerification\"\n :available-mfa-methods=\"availableMfaMethods\"\n :session-id=\"mfaSessionId\"\n @success=\"handleMfaSuccess\"\n @close=\"handleMfaClose\"\n @error=\"handleMfaError\"\n />\n \n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaVerification from './StrandsMfaVerification.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { \n signIn,\n mfaRequired,\n mfaSessionId,\n availableMfaMethods,\n loading: authLoading,\n currentUser,\n sendMfaEmailCode \n} = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = computed(() => authLoading.value)\nconst error = ref('')\nconst showMfaVerification = ref(false)\n\n// Watch for MFA requirement\nwatch(mfaRequired, (required) => {\n if (required) {\n showMfaVerification.value = true\n }\n})\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n error.value = ''\n \n try {\n const authData = await signIn({\n email: form.email,\n password: form.password,\n })\n \n // If MFA is not required, emit success immediately\n if (!authData.mfa_required) {\n emit('success', authData.user)\n }\n // If MFA is required, the watch on mfaRequired will show the MFA modal\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Sign in failed'\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\nconst handleMfaSuccess = () => {\n showMfaVerification.value = false\n // The auth composable will have updated the user state\n emit('success', currentUser.value)\n}\n\nconst handleMfaClose = () => {\n showMfaVerification.value = false\n // Reset form or allow user to try again\n}\n\nconst handleMfaError = (errorMessage: string) => {\n error.value = errorMessage\n emit('error', errorMessage)\n}\n\nconst handleOAuthSignIn = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <!-- Success State -->\n <StrandsUiCard v-if=\"signupSuccess\" variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">📧</div>\n <h1 class=\"text-2xl font-bold text-gray-900 mb-2\">{{ successTitle }}</h1>\n <p class=\"text-gray-600 mb-4\">{{ successMessage }}</p>\n <div v-if=\"successEmail\" class=\"text-sm text-gray-500 mb-4\">\n <strong>{{ successEmail }}</strong>\n </div>\n <p class=\"text-sm text-gray-500 mb-6\">\n Click the link in your email to complete your account setup. The link will expire in 24 hours.\n </p>\n <StrandsUiButton\n variant=\"outline\"\n full-width\n @click=\"resetToForm\"\n >\n Send Another Link\n </StrandsUiButton>\n </div>\n </StrandsUiCard>\n\n <!-- Signup Form -->\n <StrandsUiCard v-else variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Create account</h1>\n <p class=\"text-neutral-600\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"space-y-3 mb-6\">\n <StrandsUiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"w-5 h-5 flex items-center justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"w-5 h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"w-5 h-5\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"w-5 h-5\">\n <path fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" />\n <path fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" />\n <path fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" />\n <path fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" />\n </svg>\n <svg v-else-if=\"provider.id === 'github'\" class=\"w-5 h-5 fill-current\" viewBox=\"0 0 24 24\">\n <path\n d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n <div v-else class=\"w-5 h-5 rounded-full bg-neutral-300 flex items-center justify-center\">\n <span class=\"text-xs font-semibold text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"space-y-6\">\n <!-- Email -->\n <div>\n <StrandsUiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"mt-6 animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z\"\n clip-rule=\"evenodd\" />\n </svg>\n <p class=\"font-medium\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"mt-8 text-center\">\n <p class=\"text-sm text-neutral-600\">\n Already have an account?\n <button type=\"button\"\n class=\"font-semibold text-strands-500 hover:text-strands-600 transition-colors duration-200\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\nconst signupSuccess = ref(false)\nconst successMessage = ref('')\nconst successTitle = ref('Magic Link Sent!')\nconst successEmail = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n const signUpUrl = getUrl('signUp')\n console.log('Attempting sign up to URL:', signUpUrl)\n \n const response = await fetch(signUpUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email\n }),\n })\n\n if (process.env['NODE_ENV'] === 'development') {\n console.log('Sign up response status:', response.status)\n }\n\n if (!response.ok) {\n let errorMessage = `Sign up failed (${response.status})`\n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch {\n const errorText = await response.text()\n errorMessage = errorText || errorMessage\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n console.log('Magic link sign up success:', result)\n \n // Handle success state internally\n signupSuccess.value = true\n successEmail.value = form.email\n successMessage.value = result.message || 'Magic link sent! Check your email.'\n \n // Set appropriate title based on message content\n if (result.message) {\n if (result.message.includes('already have an account') || result.message.includes('Welcome back')) {\n successTitle.value = 'Welcome Back!'\n } else if (result.message.includes('Magic link sent') || result.message.includes('Check your email')) {\n successTitle.value = 'Magic Link Sent!'\n } else {\n successTitle.value = 'Success!'\n }\n }\n \n // Still emit for any parent that might need it\n emit('success', {\n email: form.email,\n message: result.message || 'Magic link sent! Check your email.'\n })\n } catch (err) {\n console.error('Sign up error:', err)\n \n let errorMessage = 'Unable to send magic link. Please try again.'\n \n if (err instanceof Error) {\n if (err.message.includes('fetch')) {\n errorMessage = 'Unable to connect to authentication service. Please check your internet connection and try again.'\n } else if (err.message.includes('CORS')) {\n const supportEmail = getSupportEmail()\n errorMessage = supportEmail \n ? `Authentication service configuration error. Please contact ${supportEmail}.`\n : 'Authentication service configuration error.'\n } else {\n errorMessage = err.message\n }\n }\n \n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst resetToForm = () => {\n signupSuccess.value = false\n successMessage.value = ''\n successTitle.value = 'Magic Link Sent!'\n successEmail.value = ''\n form.email = ''\n error.value = ''\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>","<template>\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-green-500 text-6xl mb-4\">🎉</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Welcome to Strands!</h1>\n <p class=\"text-neutral-600 mb-4\">\n Your account has been created successfully.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n You are now signed in and can access your dashboard.\n </p>\n <StrandsUiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-red-500 text-6xl mb-4\">❌</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Invalid Link</h1>\n <p class=\"text-neutral-600 mb-4\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n Please request a new magic link to complete your registration.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Complete Your Registration</h1>\n <p class=\"text-neutral-600\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"mt-2\">\n <p class=\"text-sm text-neutral-500\">Creating account for: <span class=\"font-medium text-neutral-700\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"space-y-6\">\n\n <!-- First Name -->\n <div>\n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <StrandsUiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"mt-2 text-xs text-neutral-500\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"mt-6 animate-fade-in\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"min-w-100 w-full max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"text-center\">\n <div class=\"text-yellow-500 text-6xl mb-4\">⚠️</div>\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Missing Token</h1>\n <p class=\"text-neutral-600 mb-4\">\n No registration token was provided.\n </p>\n <p class=\"text-sm text-neutral-500 mb-6\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Auth composable for token storage\nconst { setAuthData } = useStrandsAuth()\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n\n// Redirect URL fallback\nconst redirectUrl = computed(() => props.redirectUrl || window.location.origin)\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (redirectUrl.value) {\n console.log('Redirecting to referrer:', redirectUrl.value)\n window.location.href = redirectUrl.value\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(getUrl('completeRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result: AuthResponse = await response.json()\n console.log('Registration success:', result)\n \n // Store authentication data if tokens are present\n if (result.access_token && result.refresh_token && result.user) {\n setAuthData(result)\n console.log('Auth tokens stored successfully for user:', result.user.email)\n } else {\n console.warn('Registration response missing auth tokens or user data')\n }\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst isEmptyString = (value) => value === \"\";\n\nexport { isEmptyString, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h } from 'vue';\nimport { mergeClasses, toKebabCase, toPascalCase, isEmptyString } from './shared/src/utils.js';\nimport defaultAttributes from './defaultAttributes.js';\n\nconst Icon = ({\n name,\n iconNode,\n absoluteStrokeWidth,\n \"absolute-stroke-width\": absoluteStrokeWidthKebabCase,\n strokeWidth,\n \"stroke-width\": strokeWidthKebabCase,\n size = defaultAttributes.width,\n color = defaultAttributes.stroke,\n ...props\n}, { slots }) => {\n return h(\n \"svg\",\n {\n ...defaultAttributes,\n ...props,\n width: size,\n height: size,\n stroke: color,\n \"stroke-width\": isEmptyString(absoluteStrokeWidth) || isEmptyString(absoluteStrokeWidthKebabCase) || absoluteStrokeWidth === true || absoluteStrokeWidthKebabCase === true ? Number(strokeWidth || strokeWidthKebabCase || defaultAttributes[\"stroke-width\"]) * 24 / Number(size) : strokeWidth || strokeWidthKebabCase || defaultAttributes[\"stroke-width\"],\n class: mergeClasses(\n \"lucide\",\n props.class,\n ...name ? [`lucide-${toKebabCase(toPascalCase(name))}-icon`, `lucide-${toKebabCase(name)}`] : [\"lucide-icon\"]\n )\n },\n [...iconNode.map((child) => h(...child)), ...slots.default ? [slots.default()] : []]\n );\n};\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { h } from 'vue';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => (props, { slots, attrs }) => h(\n Icon,\n {\n ...attrs,\n ...props,\n iconNode,\n name: iconName\n },\n slots\n);\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst KeyRound = createLucideIcon(\"key-round\", [\n [\n \"path\",\n {\n d: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n]);\n\nexport { KeyRound as default };\n//# sourceMappingURL=key-round.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Mail = createLucideIcon(\"mail\", [\n [\"path\", { d: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n]);\n\nexport { Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Settings = createLucideIcon(\"settings\", [\n [\n \"path\",\n {\n d: \"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\",\n key: \"1i5ecw\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Settings as default };\n//# sourceMappingURL=settings.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Shield = createLucideIcon(\"shield\", [\n [\n \"path\",\n {\n d: \"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\",\n key: \"oel41y\"\n }\n ]\n]);\n\nexport { Shield as default };\n//# sourceMappingURL=shield.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Smartphone = createLucideIcon(\"smartphone\", [\n [\"rect\", { width: \"14\", height: \"20\", x: \"5\", y: \"2\", rx: \"2\", ry: \"2\", key: \"1yt0o3\" }],\n [\"path\", { d: \"M12 18h.01\", key: \"mhygvu\" }]\n]);\n\nexport { Smartphone as default };\n//# sourceMappingURL=smartphone.js.map\n","/**\n * @license lucide-vue-next v0.539.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash2 = createLucideIcon(\"trash-2\", [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n","let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n","exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n","/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n","/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n","const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n","/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n","const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n","const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n","const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n","const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n","/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n","const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n","const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n","const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n","const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n","const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n","const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n","const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n","const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n","'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n","const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n","const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n","function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n","const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n","const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n","\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n","<template>\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"max-w-md\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Setup Authenticator App</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Name Your Device</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Give this authenticator a memorable name (e.g., \"iPhone\", \"Work Phone\")\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"deviceName\"\n label=\"Device Name\"\n placeholder=\"My Authenticator\"\n :error=\"deviceNameError\"\n :disabled=\"loading\"\n />\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"startSetup\"\n :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\"\n >\n Continue\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: QR Code and Setup -->\n <div v-if=\"step === 2\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Scan QR Code</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.)\n </p>\n </div>\n\n <!-- QR Code -->\n <div class=\"flex justify-center bg-gray-50 p-4 rounded-lg\">\n <div v-if=\"qrCodeDataUrl\" class=\"bg-white p-4 rounded-lg shadow-sm\">\n <img :src=\"qrCodeDataUrl\" alt=\"TOTP QR Code\" class=\"w-48 h-48\" />\n </div>\n <div v-else class=\"flex items-center justify-center w-48 h-48\">\n <StrandsUiLoader :size=\"24\" />\n </div>\n </div>\n\n <!-- Manual Entry -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <p class=\"text-xs text-gray-600 mb-2\">\n Can't scan? Enter this code manually:\n </p>\n <code class=\"text-xs font-mono bg-white px-2 py-1 rounded border break-all text-gray-900\">\n {{ totpSetupData?.secret || '...' }}\n </code>\n </div>\n\n <!-- Backup Codes Preview -->\n <div v-if=\"totpSetupData?.backup_codes\" class=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-yellow-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-yellow-800\">Save Your Backup Codes</p>\n <p class=\"text-sm text-yellow-700 mt-1\">\n After setup, you'll receive backup codes. Store them safely - they're your only way to recover access if you lose your device.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"step = 3\"\n :disabled=\"loading\"\n >\n I've Added It\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Verification -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Verify Setup</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Enter the 6-digit code from your authenticator app to complete setup\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"verificationCode\"\n label=\"Verification Code\"\n placeholder=\"123456\"\n maxlength=\"6\"\n :error=\"verificationError\"\n :disabled=\"loading\"\n @input=\"onVerificationCodeInput\"\n />\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 2\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"verifySetup\"\n :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\"\n >\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 4: Success & Backup Codes -->\n <div v-if=\"step === 4\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">TOTP Setup Complete!</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n Your authenticator app is now active for two-factor authentication.\n </p>\n </div>\n\n <!-- Backup Codes -->\n <div class=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2 mb-3\">\n <svg class=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-red-800\">Save These Backup Codes</p>\n <p class=\"text-sm text-red-700 mt-1\">\n Store these codes in a safe place. Each code can only be used once.\n </p>\n </div>\n </div>\n\n <div class=\"bg-white rounded border p-3\">\n <div class=\"grid grid-cols-2 gap-2 text-sm font-mono text-gray-900\">\n <div\n v-for=\"(code, index) in totpSetupData?.backup_codes\"\n :key=\"index\"\n class=\"text-center py-1\"\n >\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-center mt-3\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"copyBackupCodes\"\n >\n 📋 Copy Codes\n </StrandsUiButton>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-4\">\n <StrandsUiButton\n variant=\"primary\"\n @click=\"finish\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, nextTick } from 'vue'\nimport QRCode from 'qrcode'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { TotpSetupResponse } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupTotp, verifyTotpSetup, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst totpSetupData = ref<TotpSetupResponse | null>(null)\nconst qrCodeDataUrl = ref('')\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n totpSetupData.value = null\n qrCodeDataUrl.value = ''\n }\n})\n\n// Generate QR code when TOTP setup data is available\nwatch(() => totpSetupData.value, async (newData) => {\n if (newData?.qr_code_url) {\n try {\n qrCodeDataUrl.value = await QRCode.toDataURL(newData.qr_code_url, {\n width: 192, // 48 * 4 for retina display\n margin: 2,\n color: {\n dark: '#000000',\n light: '#FFFFFF'\n }\n })\n } catch (error) {\n console.error('Failed to generate QR code:', error)\n }\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupTotp(deviceName.value.trim())\n totpSetupData.value = response\n step.value = 2\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup TOTP'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!totpSetupData.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n await verifyTotpSetup(totpSetupData.value.device_id, verificationCode.value)\n step.value = 4\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst copyBackupCodes = async () => {\n if (!totpSetupData.value?.backup_codes) return\n\n try {\n const codesText = totpSetupData.value.backup_codes.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n","<template>\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"max-w-md\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Setup Email 2FA</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Name Your Email 2FA</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Give this email 2FA method a memorable name (e.g., \"Personal Email\", \"Work Email\")\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"deviceName\"\n label=\"Device Name\"\n placeholder=\"Personal Email\"\n :error=\"deviceNameError\"\n :disabled=\"loading\"\n />\n\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-blue-800\">Email 2FA</p>\n <p class=\"text-sm text-blue-700 mt-1\">\n Verification codes will be sent to your registered email address when logging in.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"startSetup\"\n :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\"\n >\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: Test Verification -->\n <div v-if=\"step === 2\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Test Email 2FA</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n We've sent a test verification code to your email. Enter it below to complete setup.\n </p>\n </div>\n\n <div class=\"bg-green-50 border border-green-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-green-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-green-800\">Code Sent!</p>\n <p class=\"text-sm text-green-700 mt-1\">\n Check your email inbox for the verification code.\n </p>\n </div>\n </div>\n </div>\n\n <StrandsUiInput\n v-model=\"verificationCode\"\n label=\"Verification Code\"\n placeholder=\"123456\"\n maxlength=\"6\"\n :error=\"verificationError\"\n :disabled=\"loading\"\n @input=\"onVerificationCodeInput\"\n />\n\n <div class=\"flex justify-between\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"resendCode\"\n :disabled=\"loading || cooldownActive\"\n >\n {{ cooldownActive ? `Resend in ${cooldownSeconds}s` : 'Resend Code' }}\n </StrandsUiButton>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"verifySetup\"\n :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\"\n >\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Success -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Email 2FA Setup Complete!</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n Email verification is now active for your account. You'll receive codes at your registered email address.\n </p>\n </div>\n\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-blue-800\">How it works</p>\n <p class=\"text-sm text-blue-700 mt-1\">\n When logging in, you'll receive a 6-digit code at your email address. Enter this code to complete authentication.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-4\">\n <StrandsUiButton\n variant=\"primary\"\n @click=\"finish\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onBeforeUnmount } from 'vue'\nimport { StrandsUiButton, StrandsUiInput } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupEmailMfa, sendEmailMfaCode, verifyEmailMfaCode, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst emailMfaDeviceId = ref<string | null>(null)\nconst cooldownActive = ref(false)\nconst cooldownSeconds = ref(0)\n\nlet cooldownInterval: NodeJS.Timeout | null = null\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n emailMfaDeviceId.value = null\n cooldownActive.value = false\n cooldownSeconds.value = 0\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n})\n\nonBeforeUnmount(() => {\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupEmailMfa(deviceName.value.trim())\n emailMfaDeviceId.value = response.device_id\n \n // Now send the first verification code\n await sendEmailMfaCode(response.device_id)\n \n step.value = 2\n startCooldown()\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup email MFA'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!emailMfaDeviceId.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n const verified = await verifyEmailMfaCode(emailMfaDeviceId.value, verificationCode.value)\n if (verified) {\n step.value = 3\n } else {\n verificationError.value = 'Invalid verification code'\n }\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst resendCode = async () => {\n if (!emailMfaDeviceId.value || cooldownActive.value) {\n return\n }\n\n try {\n await sendEmailMfaCode(emailMfaDeviceId.value)\n startCooldown()\n } catch (error) {\n console.error('Failed to resend code:', error)\n }\n}\n\nconst startCooldown = () => {\n cooldownActive.value = true\n cooldownSeconds.value = 30\n\n cooldownInterval = setInterval(() => {\n cooldownSeconds.value -= 1\n if (cooldownSeconds.value <= 0) {\n cooldownActive.value = false\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n }, 1000)\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n","<template>\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"max-w-md\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Setup Hardware Key</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n \n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Name Your Hardware Key</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Give your hardware key a memorable name (e.g., \"YubiKey 5\", \"Work Security Key\")\n </p>\n </div>\n\n <StrandsUiInput\n v-model=\"deviceName\"\n label=\"Device Name\"\n placeholder=\"My Hardware Key\"\n :error=\"deviceNameError\"\n :disabled=\"loading\"\n />\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"startSetup\"\n :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\"\n >\n Continue\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: Hardware Key Registration -->\n <div v-if=\"step === 2\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Register Hardware Key</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Insert your hardware key and follow your browser's prompts to complete registration.\n </p>\n </div>\n\n <!-- Hardware Key Illustration -->\n <div class=\"flex justify-center bg-gray-50 p-6 rounded-lg\">\n <div class=\"text-center\">\n <div class=\"w-16 h-16 bg-blue-100 rounded-lg flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-8 h-8 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 7a2 2 0 012 2m0 0a2 2 0 012 2v6a2 2 0 01-2 2H9a2 2 0 01-2-2V9a2 2 0 012-2m0 0V7a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h3m0 0v8m0-8h8m-8 8h8\" />\n </svg>\n </div>\n <p class=\"text-sm font-medium text-gray-900\">Hardware Key Ready</p>\n <p class=\"text-xs text-gray-600 mt-1\">Click \"Register Key\" when ready</p>\n </div>\n </div>\n\n <!-- Instructions -->\n <div class=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-blue-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-blue-800\">Setup Instructions</p>\n <ul class=\"text-sm text-blue-700 mt-1 space-y-1\">\n <template v-if=\"props.deviceType === 'passkey'\">\n <li>• Your browser will prompt you to create a passkey</li>\n <li>• Use Touch ID, Face ID, Windows Hello, or PIN</li>\n <li>• Follow the prompts to complete setup</li>\n </template>\n <template v-else>\n <li>• Insert your hardware key into a USB port</li>\n <li>• Your browser will prompt you to interact with the key</li>\n <li>• Touch the key's button or sensor when prompted</li>\n </template>\n </ul>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n :disabled=\"loading\"\n >\n Back\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"handleRegisterHardwareKey\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n Register Key\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Registration In Progress -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <StrandsUiLoader :size=\"24\" class=\"text-blue-600\" />\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Registering Hardware Key</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n {{ registrationMessage }}\n </p>\n </div>\n\n <!-- Dynamic Progress Indicator -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <div class=\"flex items-center space-x-3\">\n <div class=\"flex-shrink-0\">\n <div class=\"w-6 h-6 bg-blue-600 rounded-full flex items-center justify-center\">\n <svg class=\"w-4 h-4 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n </div>\n <p class=\"text-sm text-gray-700\">Touch your hardware key to complete registration</p>\n </div>\n </div>\n </div>\n\n <!-- Step 4: Success & Backup Codes -->\n <div v-if=\"step === 4\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-green-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Hardware Key Setup Complete!</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n Your hardware key is now active for two-factor authentication.\n </p>\n </div>\n\n <!-- Backup Codes -->\n <div class=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2 mb-3\">\n <svg class=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-red-800\">Save These Backup Codes</p>\n <p class=\"text-sm text-red-700 mt-1\">\n Store these codes in a safe place. Each code can only be used once if you lose your hardware key.\n </p>\n </div>\n </div>\n\n <div class=\"bg-white rounded border p-3\">\n <div class=\"grid grid-cols-2 gap-2 text-sm font-mono text-gray-900\">\n <div\n v-for=\"(code, index) in backupCodes\"\n :key=\"index\"\n class=\"text-center py-1\"\n >\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-center mt-3\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"copyBackupCodes\"\n >\n 📋 Copy Codes\n </StrandsUiButton>\n </div>\n </div>\n\n <div class=\"flex justify-end pt-4\">\n <StrandsUiButton\n variant=\"primary\"\n @click=\"finish\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 5: Error State -->\n <div v-if=\"step === 5\" class=\"space-y-4\">\n <div class=\"text-center\">\n <div class=\"w-12 h-12 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-4\">\n <svg class=\"w-6 h-6 text-red-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Registration Failed</h3>\n <p class=\"text-sm text-gray-600 mb-6\">\n {{ errorMessage }}\n </p>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"step = 1\"\n >\n Start Over\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"closeModal\"\n >\n Close\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, withDefaults } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n\ninterface Props {\n show: boolean\n deviceType?: 'passkey' | 'hardware'\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n deviceType: 'hardware'\n})\nconst emit = defineEmits<Emits>()\n\nconst { loading: mfaLoading } = useStrandsMfa()\nconst { registerHardwareKey, completeHardwareKeyRegistration, currentSession } = useStrandsAuth()\n\n// Internal loading state for this component\nconst internalLoading = ref(false)\nconst loading = computed(() => mfaLoading.value || internalLoading.value)\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst registrationMessage = ref('Please touch your hardware key when prompted')\nconst errorMessage = ref('')\nconst backupCodes = ref<string[]>([])\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n registrationMessage.value = 'Please touch your hardware key when prompted'\n errorMessage.value = ''\n backupCodes.value = []\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\n// Get optimal authenticator selection based on device type\nconst getOptimalAuthenticatorSelection = (deviceType: 'hardware' | 'passkey') => {\n if (deviceType === 'passkey') {\n return {\n authenticatorAttachment: undefined, // Allow both platform and cross-platform for passkeys\n requireResidentKey: true, // Passkeys are resident credentials\n residentKey: 'required',\n userVerification: 'required' // Passkeys should always verify user\n }\n } else {\n // Hardware keys (YubiKey, etc.)\n return {\n authenticatorAttachment: 'cross-platform', // Prefer external authenticators like YubiKey\n requireResidentKey: false,\n residentKey: 'discouraged',\n userVerification: 'discouraged' // YubiKeys work better with discouraged\n }\n }\n}\n\n// Helper function to create a device-optimized WebAuthn challenge\nconst createOptimizedWebAuthnChallenge = (challenge: any, deviceType: 'hardware' | 'passkey') => {\n // Safe buffer conversion that creates new clean objects\n const safeBufferConvert = (data: any): Uint8Array => {\n try {\n if (!data) {\n return new Uint8Array(32) // Default 32-byte random challenge\n }\n \n // If it's already a Uint8Array, create a new clean copy\n if (data instanceof Uint8Array) {\n return new Uint8Array(data)\n }\n \n // If it has a buffer property, extract it safely\n if (data && typeof data === 'object' && data.buffer) {\n return new Uint8Array(data.buffer)\n }\n \n // If it's an array of numbers\n if (Array.isArray(data)) {\n return new Uint8Array(data)\n }\n \n // If it's a string, try base64 decode\n if (typeof data === 'string') {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n }\n \n // Fallback: create random bytes\n console.warn('Unknown data format, using random bytes:', data)\n return crypto.getRandomValues(new Uint8Array(32))\n \n } catch (error) {\n console.error('Buffer conversion failed:', error)\n return crypto.getRandomValues(new Uint8Array(32))\n }\n }\n \n try {\n // Create a completely new clean object to avoid extension conflicts\n const cleanChallenge: any = {\n rp: challenge.rp || { name: 'Strands Accounts' },\n user: {\n id: safeBufferConvert(challenge.user?.id),\n name: challenge.user?.name || 'user',\n displayName: challenge.user?.displayName || challenge.user?.name || 'User'\n },\n challenge: safeBufferConvert(challenge.challenge),\n pubKeyCredParams: challenge.pubKeyCredParams || [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -35 }, // ES384 (ECDSA w/ SHA-384) \n { type: 'public-key', alg: -36 }, // ES512 (ECDSA w/ SHA-512)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n { type: 'public-key', alg: -258 }, // RS384 (RSASSA-PKCS1-v1_5 w/ SHA-384)\n { type: 'public-key', alg: -259 }, // RS512 (RSASSA-PKCS1-v1_5 w/ SHA-512)\n { type: 'public-key', alg: -37 }, // PS256 (RSASSA-PSS w/ SHA-256)\n { type: 'public-key', alg: -38 }, // PS384 (RSASSA-PSS w/ SHA-384)\n { type: 'public-key', alg: -39 }, // PS512 (RSASSA-PSS w/ SHA-512)\n { type: 'public-key', alg: -8 } // EdDSA (Ed25519)\n ],\n timeout: challenge.timeout || (deviceType === 'passkey' ? 300000 : 120000), // Longer timeout for passkeys\n authenticatorSelection: challenge.authenticatorSelection || getOptimalAuthenticatorSelection(deviceType),\n attestation: challenge.attestation || (deviceType === 'passkey' ? 'none' : 'direct') // Different attestation preferences\n }\n \n // Only add excludeCredentials if it exists and has valid data\n if (challenge.excludeCredentials && Array.isArray(challenge.excludeCredentials) && challenge.excludeCredentials.length > 0) {\n cleanChallenge.excludeCredentials = challenge.excludeCredentials.map((cred: any) => ({\n type: 'public-key' as PublicKeyCredentialType,\n id: safeBufferConvert(cred.id)\n }))\n }\n \n return cleanChallenge as PublicKeyCredentialCreationOptions\n } catch (error) {\n console.error('Failed to create clean challenge:', error)\n throw new Error('Unable to process WebAuthn challenge data')\n }\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n step.value = 2\n}\n\nconst handleRegisterHardwareKey = async () => {\n internalLoading.value = true\n step.value = 3\n registrationMessage.value = `Starting ${props.deviceType === 'passkey' ? 'passkey' : 'hardware key'} registration...`\n\n try {\n // Check if WebAuthn is supported\n if (!window.navigator.credentials || !window.PublicKeyCredential) {\n throw new Error('WebAuthn is not supported in this browser')\n }\n\n // Check for platform authenticator support (better YubiKey detection)\n try {\n const available = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?.()\n console.log('Platform authenticator available:', available)\n \n // Also check if conditional mediation is supported (indicates modern WebAuthn support)\n if (PublicKeyCredential.isConditionalMediationAvailable) {\n const conditionalMediationAvailable = await PublicKeyCredential.isConditionalMediationAvailable()\n console.log('Conditional mediation available:', conditionalMediationAvailable)\n }\n } catch (checkError) {\n console.warn('Could not check authenticator availability:', checkError)\n // Continue anyway as this is not critical\n }\n\n // Use composable for API call\n if (!currentSession.value?.accessToken) {\n throw new Error('Not authenticated. Please sign in again.')\n }\n \n const { device_id, challenge } = await registerHardwareKey(deviceName.value.trim(), currentSession.value.accessToken)\n\n console.log('WebAuthn challenge received:', JSON.stringify(challenge, null, 2))\n console.log('Device ID:', device_id)\n \n // Validate challenge structure\n if (!challenge || typeof challenge !== 'object') {\n throw new Error('Invalid challenge received from server')\n }\n \n // Log the raw challenge properties to debug the extension issue\n console.log('Challenge properties:', Object.keys(challenge))\n console.log('Challenge.challenge type:', typeof challenge.challenge, challenge.challenge)\n console.log('Challenge.user type:', typeof challenge.user, challenge.user)\n if (challenge.user) {\n console.log('Challenge.user.id type:', typeof challenge.user.id, challenge.user.id)\n }\n \n // Try to create a device-specific challenge optimized for the device type\n const processedChallenge = createOptimizedWebAuthnChallenge(challenge, props.deviceType)\n console.log('Processed challenge for WebAuthn:', processedChallenge)\n \n registrationMessage.value = 'Please touch your hardware key now...'\n\n // Create WebAuthn credential\n const credential = await navigator.credentials.create({\n publicKey: processedChallenge\n }) as PublicKeyCredential\n\n if (!credential) {\n throw new Error('Hardware key registration was cancelled')\n }\n\n console.log('WebAuthn credential created:', credential)\n registrationMessage.value = 'Completing registration...'\n\n // Complete registration via API using composable\n const response = credential.response as AuthenticatorAttestationResponse\n \n try {\n // Validate credential components before processing\n console.log('Credential structure:', {\n id: credential.id,\n rawId: credential.rawId,\n response: response,\n type: credential.type\n })\n \n if (!credential.rawId) {\n throw new Error('Missing rawId in credential')\n }\n if (!response.clientDataJSON) {\n throw new Error('Missing clientDataJSON in credential response')\n }\n if (!response.attestationObject) {\n throw new Error('Missing attestationObject in credential response')\n }\n \n // Safe ArrayBuffer to Array conversion\n const rawIdArray = credential.rawId instanceof ArrayBuffer ? \n Array.from(new Uint8Array(credential.rawId)) : \n Array.from(credential.rawId)\n \n const clientDataArray = response.clientDataJSON instanceof ArrayBuffer ?\n Array.from(new Uint8Array(response.clientDataJSON)) :\n Array.from(response.clientDataJSON)\n \n const attestationArray = response.attestationObject instanceof ArrayBuffer ?\n Array.from(new Uint8Array(response.attestationObject)) :\n Array.from(response.attestationObject)\n \n const credentialPayload = {\n id: credential.id,\n rawId: rawIdArray,\n response: {\n clientDataJSON: clientDataArray,\n attestationObject: attestationArray\n },\n type: credential.type\n }\n \n console.log('Sending credential payload:', credentialPayload)\n const result = await completeHardwareKeyRegistration(device_id, credentialPayload, currentSession.value.accessToken)\n console.log('Registration completed successfully:', result)\n backupCodes.value = result.backup_codes || []\n step.value = 4\n } catch (credError) {\n console.error('Error processing WebAuthn credential:', credError)\n throw new Error(`Failed to process hardware key data: ${credError instanceof Error ? credError.message : String(credError)}`)\n }\n\n } catch (error) {\n console.error('Hardware key registration error:', error)\n \n // Provide user-friendly error messages for common YubiKey issues\n let userErrorMessage = 'Hardware key registration failed'\n \n if (error instanceof Error) {\n const errorMsg = error.message.toLowerCase()\n \n if (errorMsg.includes('not supported') || errorMsg.includes('webauthn')) {\n userErrorMessage = 'WebAuthn is not supported in this browser. Please use Chrome, Firefox, Safari, or Edge.'\n } else if (errorMsg.includes('cancelled') || errorMsg.includes('aborted')) {\n userErrorMessage = 'Hardware key registration was cancelled. Please try again and touch your key when prompted.'\n } else if (errorMsg.includes('timeout')) {\n userErrorMessage = 'Hardware key registration timed out. Please ensure your key is connected and try again.'\n } else if (errorMsg.includes('not allowed') || errorMsg.includes('invalid state')) {\n userErrorMessage = 'This hardware key may already be registered or cannot be used. Try a different key or contact support.'\n } else if (errorMsg.includes(\"can't be used\") || errorMsg.includes('newer or different')) {\n userErrorMessage = 'Your hardware key is not compatible. Please ensure you have a FIDO2/WebAuthn compatible key like YubiKey 5 Series, and that it\\'s properly connected.'\n } else if (errorMsg.includes('user verification') || errorMsg.includes('pin')) {\n userErrorMessage = 'Hardware key verification failed. If your key has a PIN, please enter it when prompted.'\n } else {\n userErrorMessage = error.message\n }\n }\n \n errorMessage.value = userErrorMessage\n step.value = 5\n } finally {\n internalLoading.value = false\n }\n}\n\nconst copyBackupCodes = async () => {\n if (!backupCodes.value.length) return\n\n try {\n const codesText = backupCodes.value.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>","<template>\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"max-w-md\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Backup Codes</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <div v-if=\"loading\" class=\"flex items-center justify-center py-8\">\n <StrandsUiLoader :size=\"24\" />\n <span class=\"ml-3 text-gray-600\">Loading backup codes...</span>\n </div>\n\n <div v-else class=\"space-y-6\">\n <!-- Device Info -->\n <div v-if=\"device\" class=\"bg-gray-50 rounded-lg p-4\">\n <div class=\"flex items-center space-x-3\">\n <span class=\"text-2xl\">📱</span>\n <div>\n <h3 class=\"font-medium text-gray-900\">{{ device.device_name }}</h3>\n <p class=\"text-sm text-gray-500\">{{ getDeviceTypeName(device.device_type) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Warning -->\n <div class=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-red-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-red-800\">Important Security Information</p>\n <ul class=\"text-sm text-red-700 mt-1 space-y-1\">\n <li>• Each backup code can only be used once</li>\n <li>• Store these codes in a safe place</li>\n <li>• Use backup codes if you lose access to your authenticator</li>\n <li>• Regenerating codes will invalidate all previous codes</li>\n </ul>\n </div>\n </div>\n </div>\n\n <!-- Backup Codes -->\n <div v-if=\"backupCodes.length > 0\">\n <h3 class=\"text-lg font-semibold text-gray-900 mb-3\">Your Backup Codes</h3>\n <div class=\"bg-white border border-gray-200 rounded-lg p-4\">\n <div class=\"grid grid-cols-2 gap-2 text-sm font-mono\">\n <div\n v-for=\"(code, index) in backupCodes\"\n :key=\"index\"\n class=\"text-center py-2 bg-gray-50 rounded\"\n >\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-center mt-4 space-x-3\">\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"copyBackupCodes\"\n >\n 📋 Copy All Codes\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"downloadBackupCodes\"\n >\n 💾 Download\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"pt-4 border-t border-gray-200\">\n <div class=\"flex justify-between\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"regenerateCodes\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n 🔄 Regenerate Codes\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"primary\"\n @click=\"closeModal\"\n >\n Done\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Regeneration Warning -->\n <div v-if=\"showRegenerateWarning\" class=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-yellow-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-yellow-800\">Regenerate Backup Codes?</p>\n <p class=\"text-sm text-yellow-700 mt-1\">\n This will invalidate all current backup codes. Make sure to save the new ones.\n </p>\n <div class=\"flex space-x-2 mt-3\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"confirmRegenerate\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n Yes, Regenerate\n </StrandsUiButton>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showRegenerateWarning = false\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n device?: MfaDevice | null\n}\n\ninterface Emits {\n (e: 'close'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { regenerateBackupCodes, loading, getDeviceTypeName } = useStrandsMfa()\n\n// State\nconst backupCodes = ref<string[]>([])\nconst showRegenerateWarning = ref(false)\n\n// Load backup codes when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow && props.device) {\n showRegenerateWarning.value = false\n // For now, we'll use the device's backup codes if available\n // In a real implementation, you might fetch fresh codes or show cached ones\n backupCodes.value = []\n }\n})\n\nonMounted(async () => {\n if (props.show && props.device) {\n // Initialize with empty codes - user needs to regenerate to see them\n backupCodes.value = []\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst regenerateCodes = () => {\n showRegenerateWarning.value = true\n}\n\nconst confirmRegenerate = async () => {\n if (!props.device) return\n\n try {\n const response = await regenerateBackupCodes(props.device.id)\n backupCodes.value = response.backup_codes\n showRegenerateWarning.value = false\n } catch (error) {\n console.error('Failed to regenerate backup codes:', error)\n // Show error message\n }\n}\n\nconst copyBackupCodes = async () => {\n if (backupCodes.value.length === 0) return\n\n try {\n const codesText = backupCodes.value.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst downloadBackupCodes = () => {\n if (backupCodes.value.length === 0) return\n\n const deviceName = props.device?.device_name || 'device'\n const timestamp = new Date().toISOString().split('T')[0]\n const filename = `strands-backup-codes-${deviceName}-${timestamp}.txt`\n \n const content = [\n 'Strands Account Backup Codes',\n '============================',\n '',\n `Device: ${props.device?.device_name}`,\n `Generated: ${new Date().toLocaleString()}`,\n '',\n 'IMPORTANT:',\n '- Each code can only be used once',\n '- Store these codes in a safe place',\n '- Use these if you lose access to your authenticator',\n '',\n 'Backup Codes:',\n ...backupCodes.value.map((code, index) => `${index + 1}. ${code}`),\n '',\n '============================',\n ].join('\\n')\n\n const blob = new Blob([content], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n}\n</script>\n\n","<template>\n <UiModal :open=\"show\" card-class=\"max-w-sm\">\n <template #header>\n <h2 class=\"text-lg font-bold text-gray-900\">{{ title }}</h2>\n </template>\n <p class=\"text-sm text-gray-600 mb-6\">{{ message }}</p>\n\n <div class=\"flex justify-end space-x-3\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n {{ cancelText }}\n </StrandsUiButton>\n <StrandsUiButton\n :variant=\"variant\"\n @click=\"handleConfirm\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ confirmText }}\n </StrandsUiButton>\n </div>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { StrandsUiButton } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\n\ntype ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline'\n\ninterface Props {\n show: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n variant?: ButtonVariant\n}\n\ninterface Emits {\n (e: 'confirm'): void\n (e: 'cancel'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'primary'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\n\nconst handleConfirm = () => {\n loading.value = true\n emit('confirm')\n // Note: Parent component should handle resetting loading state\n // by either closing the modal or setting loading to false\n}\n\nconst handleCancel = () => {\n emit('cancel')\n}\n</script>\n\n","<template>\n <UiModal :open=\"showModal\" @close=\"closeModal\" card-class=\"max-w-4xl\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <button\n @click=\"closeModal\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors duration-200\"\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Loading State -->\n <div v-if=\"mfaLoading\" class=\"flex items-center justify-center py-12\">\n <StrandsUiLoader :size=\"32\" />\n <span class=\"ml-3 text-gray-600\">Loading MFA settings...</span>\n </div>\n\n <!-- Tab Navigation -->\n <div v-else class=\"space-y-6\">\n <!-- MFA Status Overview -->\n <div class=\"bg-gray-50 rounded-xl p-4\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h3 class=\"font-semibold text-gray-900\">Two-Factor Authentication</h3>\n <p class=\"text-sm text-gray-600\">\n {{ mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <div class=\"flex items-center\">\n <span v-if=\"mfaEnabled\" class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n <Shield :size=\"12\" class=\"mr-1\" />\n Enabled\n </span>\n <span v-else class=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-600\">\n Not Enabled\n </span>\n </div>\n </div>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"border-b border-gray-200\">\n <nav class=\"-mb-px flex space-x-8\" aria-label=\"Tabs\">\n <button\n @click=\"activeTab = 'add'\"\n :class=\"[\n activeTab === 'add' \n ? 'border-[var(--strands-primary)] text-[var(--strands-primary)]' \n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300',\n 'whitespace-nowrap py-2 px-1 border-b-2 font-medium text-sm transition-colors'\n ]\"\n >\n Add New Device\n </button>\n <button\n v-if=\"activeMfaDevices.length > 0\"\n @click=\"activeTab = 'manage'\"\n :class=\"[\n activeTab === 'manage' \n ? 'border-[var(--strands-primary)] text-[var(--strands-primary)]' \n : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300',\n 'whitespace-nowrap py-2 px-1 border-b-2 font-medium text-sm transition-colors'\n ]\"\n >\n Active Devices ({{ activeMfaDevices.length }})\n </button>\n </nav>\n </div>\n\n <!-- Tab Content: Add New Device -->\n <div v-if=\"activeTab === 'add'\" class=\"space-y-6\">\n <div>\n <h3 class=\"text-xl font-semibold text-gray-900 mb-6\">Choose Your Authentication Method</h3>\n <div class=\"space-y-4\">\n <!-- TOTP Setup -->\n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startTotpSetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Smartphone :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Authenticator App</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Use Google Authenticator, Authy, or any TOTP-compatible app to generate secure codes\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startTotpSetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <!-- Email MFA Setup -->\n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startEmailMfaSetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Mail :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Email Verification</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Receive verification codes directly in your email inbox for easy access\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startEmailMfaSetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <!-- Hardware Key Setup - Temporarily Disabled -->\n <!-- \n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startHardwareKeySetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <KeyRound :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Hardware Security Key</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Use YubiKey, FIDO2, or other physical security keys for ultimate protection\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startHardwareKeySetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <-- Passkey Setup - Temporarily Disabled -->\n <!-- \n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startPasskeySetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Shield :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Passkey</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Use your device's built-in biometrics, PIN, or cross-device passkeys\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startPasskeySetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n -->\n </div>\n </div>\n </div>\n\n <!-- Tab Content: Active Devices -->\n <div v-else-if=\"activeTab === 'manage' && activeMfaDevices.length > 0\" class=\"space-y-6\">\n <div>\n <h3 class=\"text-xl font-semibold text-gray-900 mb-6\">Manage Your Active Devices</h3>\n <div class=\"max-h-96 overflow-y-auto space-y-4 pr-2\">\n <div\n v-for=\"device in activeMfaDevices\"\n :key=\"device.id\"\n class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200\"\n >\n <div class=\"flex items-start justify-between\">\n <div class=\"flex items-start space-x-4\">\n <div class=\"flex-shrink-0 w-14 h-14 rounded-xl flex items-center justify-center\"\n :class=\"getDeviceIconBackground(device.device_type)\">\n <component :is=\"getDeviceIconComponent(device.device_type)\" :size=\"24\" class=\"text-gray-600\" />\n </div>\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">{{ device.device_name }}</h4>\n <p class=\"text-sm text-gray-600 mt-1\">\n {{ getDeviceTypeName(device.device_type) }}\n </p>\n <p class=\"text-xs text-gray-500 mt-2\">\n Last used {{ formatLastUsed(device.last_used_at) }}\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <!-- Backup codes button for TOTP, Hardware Key, and Passkey devices -->\n <StrandsUiButton\n v-if=\"device.device_type === 'totp' || device.device_type === 'hardware' || device.device_type === 'passkey'\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showBackupCodes(device)\"\n :disabled=\"mfaLoading\"\n >\n <KeyRound :size=\"14\" class=\"mr-2\" />\n Backup Codes\n </StrandsUiButton>\n \n <!-- Test email MFA -->\n <StrandsUiButton\n v-if=\"device.device_type === 'email'\"\n variant=\"secondary\"\n size=\"sm\"\n @click=\"testEmailMfa(device)\"\n :disabled=\"mfaLoading\"\n >\n <Mail :size=\"14\" class=\"mr-2\" />\n Send Test Code\n </StrandsUiButton>\n\n <!-- Remove device -->\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"confirmDisableDevice(device)\"\n :disabled=\"mfaLoading\"\n class=\"text-red-600 hover:bg-red-50 hover:text-red-700 border-red-200\"\n >\n <Trash2 :size=\"14\" class=\"mr-2\" />\n Remove\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOTP Setup Modal -->\n <StrandsTotpSetupModal\n v-if=\"showTotpSetup\"\n :show=\"showTotpSetup\"\n @close=\"showTotpSetup = false\"\n @success=\"handleTotpSetupSuccess\"\n />\n\n <!-- Email MFA Setup Modal -->\n <StrandsEmailMfaSetupModal\n v-if=\"showEmailMfaSetup\"\n :show=\"showEmailMfaSetup\"\n @close=\"showEmailMfaSetup = false\"\n @success=\"handleEmailMfaSetupSuccess\"\n />\n\n <!-- Hardware Key Setup Modal -->\n <StrandsHardwareKeySetupModal\n v-if=\"showHardwareKeySetup\"\n :show=\"showHardwareKeySetup\"\n :device-type=\"'hardware'\"\n @close=\"showHardwareKeySetup = false\"\n @success=\"handleHardwareKeySetupSuccess\"\n />\n\n <!-- Passkey Setup Modal -->\n <StrandsHardwareKeySetupModal\n v-if=\"showPasskeySetup\"\n :show=\"showPasskeySetup\"\n :device-type=\"'passkey'\"\n @close=\"showPasskeySetup = false\"\n @success=\"handlePasskeySetupSuccess\"\n />\n\n <!-- Backup Codes Modal -->\n <StrandsBackupCodesModal\n v-if=\"showBackupCodesModal\"\n :show=\"showBackupCodesModal\"\n :device=\"selectedDevice\"\n @close=\"showBackupCodesModal = false\"\n />\n\n </UiModal>\n\n <!-- Confirm Disable Modal -->\n <StrandsConfirmModal\n v-if=\"showConfirmDisable\"\n :show=\"showConfirmDisable\"\n title=\"Remove MFA Device\"\n :message=\"`Are you sure you want to remove '${selectedDevice?.device_name}'? This action cannot be undone.`\"\n confirm-text=\"Remove Device\"\n cancel-text=\"Keep Device\"\n variant=\"secondary\"\n @confirm=\"handleDisableDevice\"\n @cancel=\"showConfirmDisable = false\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport { Smartphone, Mail, KeyRound, Shield, Trash2 } from 'lucide-vue-next'\nimport UiModal from '../ui/UiModal.vue'\nimport StrandsTotpSetupModal from './StrandsTotpSetupModal.vue'\nimport StrandsEmailMfaSetupModal from './StrandsEmailMfaSetupModal.vue'\nimport StrandsHardwareKeySetupModal from './StrandsHardwareKeySetupModal.vue'\nimport StrandsBackupCodesModal from './StrandsBackupCodesModal.vue'\nimport StrandsConfirmModal from './StrandsConfirmModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'mfa-updated'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\n// MFA composable\nconst {\n mfaDevices,\n mfaEnabled,\n loading: mfaLoading,\n activeMfaDevices,\n fetchMfaDevices,\n disableMfaDevice,\n sendEmailMfaCode,\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n} = useStrandsMfa()\n\n// Modal states\nconst showModal = computed(() => props.show)\nconst activeTab = ref<'add' | 'manage'>('add')\nconst showTotpSetup = ref(false)\nconst showEmailMfaSetup = ref(false)\nconst showHardwareKeySetup = ref(false)\nconst showPasskeySetup = ref(false)\nconst showBackupCodesModal = ref(false)\nconst showConfirmDisable = ref(false)\nconst selectedDevice = ref<MfaDevice | null>(null)\n\n// Load MFA devices when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n await fetchMfaDevices()\n }\n})\n\nonMounted(async () => {\n if (props.show) {\n await fetchMfaDevices()\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startTotpSetup = () => {\n showTotpSetup.value = true\n}\n\nconst startEmailMfaSetup = () => {\n showEmailMfaSetup.value = true\n}\n\nconst startHardwareKeySetup = () => {\n showHardwareKeySetup.value = true\n}\n\nconst startPasskeySetup = () => {\n showPasskeySetup.value = true\n}\n\nconst showBackupCodes = (device: MfaDevice) => {\n selectedDevice.value = device\n showBackupCodesModal.value = true\n}\n\nconst testEmailMfa = async (device: MfaDevice) => {\n try {\n await sendEmailMfaCode(device.id)\n // Show success message or toast\n console.log('Test code sent to email')\n } catch (error) {\n console.error('Failed to send test code:', error)\n // Show error message\n }\n}\n\nconst confirmDisableDevice = (device: MfaDevice) => {\n selectedDevice.value = device\n showConfirmDisable.value = true\n}\n\nconst handleDisableDevice = async () => {\n if (selectedDevice.value) {\n try {\n await disableMfaDevice(selectedDevice.value.id)\n showConfirmDisable.value = false\n selectedDevice.value = null\n emit('mfa-updated')\n } catch (error) {\n console.error('Failed to disable MFA device:', error)\n // Show error message\n }\n }\n}\n\nconst handleTotpSetupSuccess = async () => {\n showTotpSetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handleEmailMfaSetupSuccess = async () => {\n showEmailMfaSetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handleHardwareKeySetupSuccess = async () => {\n showHardwareKeySetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handlePasskeySetupSuccess = async () => {\n showPasskeySetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst getDeviceIconBackground = (deviceType: string) => {\n switch (deviceType) {\n case 'totp':\n return 'bg-blue-50 group-hover:bg-blue-100'\n case 'email':\n return 'bg-green-50 group-hover:bg-green-100'\n case 'hardware':\n return 'bg-purple-50 group-hover:bg-purple-100'\n case 'passkey':\n return 'bg-indigo-50 group-hover:bg-indigo-100'\n default:\n return 'bg-gray-50 group-hover:bg-gray-100'\n }\n}\n\nconst getDeviceIconComponent = (deviceType: string) => {\n switch (deviceType) {\n case 'totp':\n return Smartphone\n case 'email':\n return Mail\n case 'hardware':\n return KeyRound\n case 'passkey':\n return Shield\n default:\n return Shield\n }\n}\n</script>\n\n","<template>\n <UiModal :open=\"true\" @close=\"$emit('close')\" card-class=\"max-w-lg\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Settings</h2>\n <button \n class=\"text-gray-400 hover:text-gray-600 transition-colors\"\n @click=\"$emit('close')\"\n type=\"button\"\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n\n <!-- Audio Preferences Section -->\n <div class=\"space-y-6\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-4\">Audio Preferences</h3>\n \n <!-- Level Up Sounds Toggle -->\n <div class=\"bg-gray-50 border border-gray-200 rounded-lg p-4 mb-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-1\">\n <label for=\"level-up-sounds\" class=\"block text-sm font-medium text-gray-900 mb-1\">\n Level Up Sounds\n </label>\n <p class=\"text-xs text-gray-600\">\n Play sound effects when you level up\n </p>\n </div>\n <UiToggle\n id=\"level-up-sounds\"\n v-model=\"localSettings.levelUpSounds\"\n @update:model-value=\"updateSetting('levelUpSounds', $event)\"\n />\n </div>\n </div>\n\n <!-- Milestone Level Up Sounds Toggle -->\n <div class=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-1\">\n <label for=\"milestone-sounds\" class=\"block text-sm font-medium text-gray-900 mb-1\">\n Milestone Level Sounds\n </label>\n <p class=\"text-xs text-gray-600\">\n Play special celebration sounds for milestone levels (10, 25, 50, 100, 150, 200)\n </p>\n </div>\n <UiToggle\n id=\"milestone-sounds\"\n v-model=\"localSettings.milestoneSounds\"\n @update:model-value=\"updateSetting('milestoneSounds', $event)\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"flex justify-end gap-3\">\n <UiButton \n variant=\"secondary\" \n @click=\"$emit('close')\"\n >\n Close\n </UiButton>\n <UiButton \n variant=\"primary\" \n @click=\"saveSettings\"\n :loading=\"saving\"\n >\n {{ saving ? 'Saving...' : 'Save Settings' }}\n </UiButton>\n </div>\n </template>\n </UiModal>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, watch } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport UiButton from '../ui/UiButton.vue'\nimport UiToggle from '../ui/UiToggle.vue'\nimport UiModal from '../ui/UiModal.vue'\n\ninterface AudioSettings {\n levelUpSounds: boolean\n milestoneSounds: boolean\n}\n\ninterface Props {\n open?: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'settings-updated', settings: AudioSettings): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n open: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { currentUser, updateUserSettings } = useStrandsAuth()\nconst saving = ref(false)\n\n// Initialize local settings from user settings or defaults\nconst localSettings = reactive<AudioSettings>({\n levelUpSounds: currentUser.value?.settings?.levelUpSounds ?? true,\n milestoneSounds: currentUser.value?.settings?.milestoneSounds ?? true\n})\n\n// Watch for changes in user settings\nwatch(() => currentUser.value?.settings, (newSettings) => {\n if (newSettings) {\n localSettings.levelUpSounds = newSettings.levelUpSounds ?? true\n localSettings.milestoneSounds = newSettings.milestoneSounds ?? true\n }\n}, { deep: true })\n\nconst handleOverlayClick = () => {\n emit('close')\n}\n\nconst updateSetting = (key: keyof AudioSettings, value: boolean) => {\n localSettings[key] = value\n}\n\nconst saveSettings = async () => {\n if (saving.value) return\n \n saving.value = true\n \n try {\n // Update settings on server\n await updateUserSettings({\n ...currentUser.value?.settings,\n ...localSettings\n })\n \n // Emit updated settings to parent\n emit('settings-updated', { ...localSettings })\n \n // Close modal\n emit('close')\n } catch (error) {\n console.error('Failed to save settings:', error)\n // TODO: Show error message to user\n } finally {\n saving.value = false\n }\n}\n</script>\n\n","<template>\n <div :class=\"inModal ? 'profile-container-modal w-full' : 'profile-container w-full max-w-4xl mx-auto animate-slide-up'\">\n <div :class=\"inModal ? 'profile-content-modal flex flex-col gap-6' : 'profile-content card-modern flex flex-col gap-6'\">\n <!-- Header -->\n <div class=\"text-center flex flex-col gap-2\">\n <h1 class=\"text-2xl md:text-3xl font-bold text-gradient\">Profile Settings</h1>\n <p class=\"text-gray-600 text-sm md:text-base\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"flex flex-col items-center\">\n <div class=\"relative\">\n <!-- Progress Ring Container -->\n <div class=\"relative group\">\n <!-- Progress Ring SVG -->\n <StrandsUiLevelProgress\n v-if=\"currentUser\"\n :size=\"140\" \n :value=\"currentUser.xp\" \n :max=\"currentUser.next_level_xp\" \n :level=\"currentUser.level\" \n :level-label=\"`LEVEL ${currentUser.level}`\"\n :user-settings=\"currentUser.settings\"\n class=\"absolute z-10 top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 pointer-events-none\" \n />\n\n <!-- Avatar -->\n <div \n v-if=\"currentUser?.avatar\"\n class=\"w-24 h-24 rounded-full shadow-large overflow-hidden relative\"\n >\n <img \n :src=\"currentUser.avatar\" \n :alt=\"`${currentUser.firstName} ${currentUser.lastName}`\"\n class=\"w-full h-full object-cover\"\n />\n </div>\n <div \n v-else\n class=\"w-24 h-24 rounded-full bg-gradient-to-r from-strands-400 to-strands-600 flex items-center justify-center text-white text-2xl font-bold shadow-large relative z-10\"\n >\n {{ getInitials(currentUser?.firstName, currentUser?.lastName) }}\n </div>\n \n <!-- Upload Overlay -->\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 z-20\"\n @click=\"triggerAvatarUpload\"\n :disabled=\"uploading\"\n >\n <StrandsUiLoader v-if=\"uploading\" :size=\"24\" variant=\"dark\" />\n <svg v-else class=\"w-6 h-6 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\" />\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 13a3 3 0 11-6 0 3 3 0 616 0z\" />\n </svg>\n </button>\n </div>\n </div>\n \n <!-- Hidden file input for avatar selection -->\n <input\n ref=\"avatarFileInput\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden\"\n @change=\"handleAvatarFileSelect\"\n />\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"flex flex-col gap-4 md:gap-6\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6\">\n <!-- Personal Information -->\n <div class=\"flex flex-col gap-3 md:gap-4\">\n <h3 class=\"text-lg font-semibold text-gray-900\">Personal Information</h3>\n \n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.firstName\"\n />\n\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.lastName\"\n />\n\n <!-- Email Change Section -->\n <div class=\"flex flex-col gap-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Email Address</h4>\n <p class=\"text-sm text-gray-600\">{{ currentUser?.email }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showEmailChange = !showEmailChange\"\n >\n {{ showEmailChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showEmailChange\" class=\"flex flex-col gap-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"emailChangeForm.newEmail\"\n type=\"email\"\n placeholder=\"New email address\"\n autocomplete=\"email\"\n :error=\"emailChangeForm.errors.newEmail\"\n />\n <StrandsUiInput\n v-model=\"emailChangeForm.password\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n :error=\"emailChangeForm.errors.password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleEmailChange\"\n :disabled=\"!isEmailChangeFormValid || emailChangeLoading\"\n >\n {{ emailChangeLoading ? 'Updating...' : 'Update Email' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Username Change Section -->\n <div class=\"flex flex-col gap-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Username</h4>\n <p class=\"text-sm text-gray-600\">\n {{ currentUser?.username || 'No username set' }}\n </p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n :disabled=\"!usernameChangeData.canChange || usernameChangeLoading\"\n @click=\"handleToggleUsernameChange\"\n >\n {{\n usernameChangeData.cooldownEnd\n ? `Wait ${usernameChangeData.daysRemaining} day${usernameChangeData.daysRemaining === 1 ? '' : 's'}`\n : showUsernameChange\n ? 'Cancel'\n : (currentUser?.username\n ? 'Change'\n : 'Set Username')\n }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showUsernameChange\" class=\"flex flex-col gap-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"usernameForm.username\"\n type=\"text\"\n placeholder=\"Enter username (3-30 characters)\"\n autocomplete=\"username\"\n :error=\"usernameForm.errors.username\"\n />\n <div v-if=\"usernameAvailability.message\" class=\"text-xs\" :class=\"usernameAvailability.available ? 'text-green-600' : 'text-red-600'\">\n {{ usernameAvailability.message }}\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleUsernameChange\"\n :disabled=\"!isUsernameChangeFormValid || usernameChangeLoading\"\n >\n {{ usernameChangeLoading ? 'Updating...' : 'Update Username' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"flex flex-col gap-3 md:gap-4\">\n <h3 class=\"text-lg font-semibold text-gray-900\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"flex flex-col gap-4 p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Password</h4>\n <p class=\"text-sm text-gray-600\">Last updated {{ passwordLastUpdated }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showPasswordChange\" class=\"flex flex-col gap-3 overflow-hidden\">\n <StrandsUiInput\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex-1 flex flex-col gap-3\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Two-Factor Authentication</h4>\n <p class=\"text-sm text-gray-600\">\n {{ currentUser?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n \n <!-- Device Type Chips -->\n <div v-if=\"mfaDeviceChips.length > 0\" class=\"flex flex-wrap gap-2\">\n <div\n v-for=\"chip in mfaDeviceChips\"\n :key=\"chip.type\"\n :class=\"[\n 'inline-flex items-center gap-1.5 px-2.5 py-1 rounded-lg text-xs font-medium border transition-colors',\n chip.color\n ]\"\n >\n <component :is=\"chip.icon\" :size=\"12\" />\n <span>{{ chip.count }}</span>\n <span>{{ chip.label }}</span>\n </div>\n </div>\n </div>\n <StrandsUiButton\n :variant=\"currentUser?.mfaEnabled ? 'secondary' : 'primary'\"\n size=\"sm\"\n @click=\"showMfaModal = true\"\n class=\"flex-shrink-0\"\n >\n {{ currentUser?.mfaEnabled ? 'Manage' : 'Setup' }}\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"p-4 bg-gray-50 rounded-xl\">\n <div class=\"flex items-center justify-between gap-2\">\n <div>\n <h4 class=\"font-medium text-gray-900\">Active Sessions</h4>\n <p class=\"text-sm text-gray-600\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"$emit('manage-sessions')\"\n disabled\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons - Only show when changes are made -->\n <div v-if=\"hasChanges\" class=\"flex flex-col sm:flex-row gap-3 pt-6 border-t border-gray-200 animate-slide-up\">\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ loading ? 'Saving changes...' : 'Save changes' }}\n </StrandsUiButton>\n\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 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=\"animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"flex items-start gap-3\">\n <svg class=\"w-4 h-4 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 \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <div class=\"flex gap-4 items-stretch\">\n <!-- Sign Out button -->\n <StrandsUiButton\n variant=\"secondary\"\n color=\"red\"\n @click=\"handleSignOut\"\n :disabled=\"signingOut\"\n class=\"w-full sm:w-auto\"\n >\n {{ signingOut ? 'Signing out...' : 'Sign Out' }}\n </StrandsUiButton>\n\n <!-- Settings button -->\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"showSettingsModal = true\"\n class=\"w-full sm:w-auto\"\n >\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=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\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 </svg>\n </StrandsUiButton>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"text-gray-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </div>\n\n <!-- MFA Management Modal -->\n <StrandsMfaModal\n :show=\"showMfaModal\"\n @close=\"showMfaModal = false\"\n @mfa-updated=\"handleMfaUpdated\"\n />\n\n <!-- Settings Modal -->\n <StrandsSettingsModal\n v-if=\"showSettingsModal\"\n @close=\"showSettingsModal = false\"\n @settings-updated=\"handleSettingsUpdated\"\n />\n\n <!-- Avatar Editor Modal -->\n <div v-if=\"showAvatarEditor\" class=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4\">\n <div class=\"bg-white rounded-xl shadow-2xl max-w-4xl w-full max-h-[90vh] overflow-y-auto\">\n <div class=\"p-6 flex flex-col gap-6\">\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-gray-900\">Edit Avatar</h2>\n <button\n @click=\"handleAvatarEditorClose\"\n class=\"text-gray-400 hover:text-gray-600 transition-colors\"\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n \n <StrandsUiAvatarEditorSimple\n :uploading=\"uploading\"\n :preselected-file=\"selectedImageFile\"\n @upload=\"handleAvatarUpload\"\n @error=\"handleAvatarError\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLink, StrandsUiLoader, StrandsUiAvatarEditorSimple, StrandsUiLevelProgress } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaModal from './StrandsMfaModal.vue'\nimport StrandsSettingsModal from './StrandsSettingsModal.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport { Smartphone, Mail, KeyRound } from 'lucide-vue-next'\nimport type { User } from '../../types'\n\ninterface Props {\n user?: User\n config?: StrandsAuthConfig\n autoFetch?: boolean // Whether to automatically fetch user profile on mount\n inModal?: boolean // Whether the component is being displayed inside a modal\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n autoFetch: true,\n inModal: false\n})\nconst emit = defineEmits<Emits>()\n\n// Get configuration and authentication \nconst { getSupportEmail, getUrl } = useStrandsConfig(props.config)\nconst { fetchProfile, updateProfile, changeEmail, changeUsername, getUsernameCooldown, checkUsernameAvailability, currentUser: authUser, currentSession, isAuthenticated, refreshToken, signOut } = useStrandsAuth()\nconst { activeMfaDevices, fetchMfaDevices } = useStrandsMfa()\n\n// Internal user state\nconst internalUser = ref<User | null>(null)\nconst fetchingProfile = ref(false)\n\n// Use authenticated user from composable, fallback to prop, then internal state\nconst currentUser = computed(() => {\n const user = authUser.value || props.user || internalUser.value\n console.log('Current user computed:', {\n hasAuthUser: !!authUser.value,\n hasPropUser: !!props.user,\n hasInternalUser: !!internalUser.value,\n selectedUser: user,\n avatar: user?.avatar\n })\n return user\n})\n\nconst loading = ref(false)\nconst uploading = ref(false)\nconst signingOut = ref(false)\nconst showPasswordChange = ref(false)\nconst showEmailChange = ref(false)\nconst emailChangeLoading = ref(false)\nconst showUsernameChange = ref(false)\nconst usernameChangeLoading = ref(false)\nconst showMfaModal = ref(false)\nconst showSettingsModal = ref(false)\nconst showAvatarEditor = ref(false)\nconst selectedImageFile = ref<File | null>(null)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([])\n\n// Username change state\nconst usernameChangeData = reactive({\n canChange: true,\n cooldownEnd: null as Date | null,\n daysRemaining: 0\n})\n\nconst usernameAvailability = reactive({\n available: false,\n message: '',\n checking: false\n})\n\n// Temporary total XP state for testing (accumulates infinitely)\n\n// Refs\nconst avatarFileInput = ref<HTMLInputElement>()\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst emailChangeForm = reactive({\n newEmail: '',\n password: '',\n errors: {\n newEmail: '',\n password: ''\n }\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst usernameForm = reactive({\n username: '',\n errors: {\n username: ''\n }\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst hasChanges = computed(() => {\n const user = currentUser.value\n if (!user) return false\n return (\n form.firstName !== (user.firstName || '') ||\n form.lastName !== (user.lastName || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst isEmailChangeFormValid = computed(() => {\n return (\n emailChangeForm.newEmail &&\n emailChangeForm.password &&\n emailChangeForm.newEmail !== currentUser.value?.email &&\n emailChangeForm.newEmail.includes('@')\n )\n})\n\nconst isUsernameChangeFormValid = computed(() => {\n const usernameRegex = /^[a-zA-Z0-9_-]{3,30}$/\n return (\n usernameForm.username &&\n usernameRegex.test(usernameForm.username) &&\n usernameForm.username !== currentUser.value?.username &&\n !usernameAvailability.checking\n )\n})\n\nconst passwordLastUpdated = computed(() => {\n const user = currentUser.value\n if (!user) return 'Never'\n \n // Use passwordUpdatedAt if available, otherwise fall back to createdAt\n const updateDate = user.passwordUpdatedAt || user.createdAt\n if (!updateDate) return 'Never'\n \n const date = new Date(updateDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n if (diffDays < 365) {\n const months = Math.floor(diffDays / 30)\n return months === 1 ? '1 month ago' : `${months} months ago`\n }\n const years = Math.floor(diffDays / 365)\n return years === 1 ? '1 year ago' : `${years} years ago`\n})\n\nconst deviceTypeCounts = computed(() => {\n const devices = activeMfaDevices.value || []\n const counts = {\n totp: 0,\n email: 0,\n hardware: 0,\n passkey: 0\n }\n \n devices.forEach(device => {\n if (device.device_type in counts) {\n counts[device.device_type as keyof typeof counts]++\n }\n })\n \n return counts\n})\n\nconst mfaDeviceChips = computed(() => {\n const chips = []\n const counts = deviceTypeCounts.value\n \n if (counts.totp > 0) {\n chips.push({\n type: 'totp',\n count: counts.totp,\n label: counts.totp === 1 ? 'Auth app' : 'Auth apps',\n icon: Smartphone,\n color: 'bg-blue-50 text-blue-700 border-blue-200'\n })\n }\n \n if (counts.email > 0) {\n chips.push({\n type: 'email',\n count: counts.email,\n label: 'Email',\n icon: Mail,\n color: 'bg-green-50 text-green-700 border-green-200'\n })\n }\n \n if (counts.hardware > 0 || counts.passkey > 0) {\n const totalHardware = counts.hardware + counts.passkey\n chips.push({\n type: 'hardware',\n count: totalHardware,\n label: totalHardware === 1 ? 'Key' : 'Keys',\n icon: KeyRound,\n color: 'bg-purple-50 text-purple-700 border-purple-200'\n })\n }\n \n return chips\n})\n\n// Calculate XP required for a specific level using the provided formula\nconst getXpForLevel = (level: number): number => {\n if (level <= 1) return 0\n \n let totalXp = 0\n for (let i = 1; i < level; i++) {\n // Formula: xp = 4 * i + Math.pow(1.5, i / 4) + xp\n // This accumulates XP required for each level\n totalXp += 4 * i + Math.pow(1.5, i / 4)\n }\n return Math.floor(totalXp)\n}\n\n// Calculate level from total XP\nconst getLevelFromXp = (totalXp: number): number => {\n let level = 1\n let cumulativeXp = 0\n \n // Keep incrementing level while totalXp is greater than required\n while (true) {\n const xpForNextLevel = getXpForLevel(level + 1)\n if (totalXp < xpForNextLevel) {\n break\n }\n level++\n // Safety check to prevent infinite loops\n if (level > 1000) break\n }\n \n return level\n}\n\n// Leveling system computed properties\nconst userLevel = computed(() => {\n return getLevelFromXp(currentUser.value?.xp || 0)\n})\n\nconst currentExp = computed(() => {\n const level = userLevel.value\n const xpForCurrentLevel = getXpForLevel(level)\n // Current XP within the level (progress toward next level)\n return (currentUser.value?.xp || 0) - xpForCurrentLevel\n})\n\nconst expToNextLevel = computed(() => {\n const level = userLevel.value\n const xpForCurrentLevel = getXpForLevel(level)\n const xpForNextLevel = getXpForLevel(level + 1)\n // XP needed to complete this level\n return xpForNextLevel - xpForCurrentLevel\n})\n\nconst progressPercentage = computed(() => {\n return Math.round((currentExp.value / expToNextLevel.value) * 100)\n})\n\nconst totalCircumference = computed(() => {\n const radius = 54\n return 2 * Math.PI * radius\n})\n\nconst progressLength = computed(() => {\n const progress = progressPercentage.value / 100\n return progress * totalCircumference.value\n})\n\nconst progressGapLength = computed(() => {\n // Create visible gap between progress and remaining background\n const smallGap = (totalCircumference.value * 5) / 360 // 5 degree gap\n const remaining = totalCircumference.value - progressLength.value - smallGap\n return remaining\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Fetch user profile from API\nconst fetchUserProfile = async () => {\n if (!props.autoFetch || props.user || !isAuthenticated.value) return // Skip if disabled, user prop provided, or not authenticated\n \n fetchingProfile.value = true\n try {\n await fetchProfile()\n // Also fetch MFA devices when profile is loaded\n if (isAuthenticated.value) {\n await fetchMfaDevices()\n }\n // The fetchProfile from composable will update authUser, so currentUser computed will reflect the change\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Failed to load profile'\n errorMessage.value = errorMsg\n emit('error', errorMsg)\n } finally {\n fetchingProfile.value = false\n }\n}\n\n// Initialize form with user data\nwatch(() => currentUser.value, (user) => {\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email // Keep for display but not for editing\n }\n}, { immediate: true })\n\n// Fetch profile on mount if needed\nonMounted(() => {\n fetchUserProfile()\n})\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n const updatedUser = await updateProfile({\n firstName: form.firstName,\n lastName: form.lastName,\n })\n \n if (updatedUser) {\n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update profile'\n errorMessage.value = error\n emit('error', error)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleEmailChange = async () => {\n if (!isEmailChangeFormValid.value) return\n\n // Clear previous errors\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n clearMessages()\n emailChangeLoading.value = true\n\n try {\n const result = await changeEmail(emailChangeForm.newEmail, emailChangeForm.password)\n \n successMessage.value = result.message || 'Email updated successfully. Please verify your new email address.'\n showEmailChange.value = false\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update email'\n \n // Try to parse specific field errors\n if (error.includes('password')) {\n emailChangeForm.errors.password = 'Invalid password'\n } else if (error.includes('email')) {\n emailChangeForm.errors.newEmail = error\n } else {\n errorMessage.value = error\n }\n \n emit('error', error)\n } finally {\n emailChangeLoading.value = false\n }\n}\n\nconst handleToggleUsernameChange = async () => {\n if (!showUsernameChange.value) {\n // When opening, check cooldown status\n usernameChangeLoading.value = true\n try {\n const cooldownData = await getUsernameCooldown()\n usernameChangeData.canChange = cooldownData.can_change\n usernameChangeData.cooldownEnd = cooldownData.cooldown_end ? new Date(cooldownData.cooldown_end) : null\n usernameChangeData.daysRemaining = cooldownData.days_remaining || 0\n \n if (usernameChangeData.canChange) {\n showUsernameChange.value = true\n usernameForm.username = currentUser.value?.username || ''\n } else {\n errorMessage.value = `You can change your username again in ${usernameChangeData.daysRemaining} days`\n }\n } catch (err) {\n errorMessage.value = 'Failed to check username cooldown'\n showUsernameChange.value = true // Allow opening anyway\n } finally {\n usernameChangeLoading.value = false\n }\n } else {\n // When closing, reset form\n showUsernameChange.value = false\n usernameForm.username = ''\n usernameForm.errors.username = ''\n usernameAvailability.available = false\n usernameAvailability.message = ''\n }\n}\n\nconst handleUsernameChange = async () => {\n if (!isUsernameChangeFormValid.value) {\n // First check if username is valid format\n const usernameRegex = /^[a-zA-Z0-9_-]{3,30}$/\n if (!usernameRegex.test(usernameForm.username)) {\n usernameForm.errors.username = 'Username must be 3-30 characters and contain only letters, numbers, hyphens, and underscores'\n return\n }\n \n // Check availability before attempting to update\n usernameAvailability.checking = true\n usernameAvailability.message = 'Checking availability...'\n \n try {\n const result = await checkUsernameAvailability(usernameForm.username)\n usernameAvailability.available = result.available\n usernameAvailability.message = result.message\n \n if (!result.available) {\n usernameForm.errors.username = 'Username is not available'\n return\n }\n } catch (err) {\n usernameForm.errors.username = 'Failed to check username availability'\n return\n } finally {\n usernameAvailability.checking = false\n }\n }\n\n clearMessages()\n usernameChangeLoading.value = true\n\n try {\n const result = await changeUsername(usernameForm.username)\n \n successMessage.value = result.message || 'Username updated successfully'\n showUsernameChange.value = false\n usernameForm.username = ''\n usernameForm.errors.username = ''\n usernameAvailability.available = false\n usernameAvailability.message = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update username'\n \n if (error.includes('taken')) {\n usernameForm.errors.username = 'Username is already taken'\n } else if (error.includes('cooldown') || error.includes('30 days')) {\n errorMessage.value = error\n showUsernameChange.value = false\n } else {\n usernameForm.errors.username = error\n }\n \n emit('error', error)\n } finally {\n usernameChangeLoading.value = false\n }\n}\n\nconst triggerAvatarUpload = () => {\n if (uploading.value) return\n avatarFileInput.value?.click()\n}\n\nconst handleAvatarFileSelect = (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n if (file) {\n // Validate file\n if (!file.type.startsWith('image/')) {\n errorMessage.value = 'Please select an image file'\n return\n }\n \n if (file.size > 5 * 1024 * 1024) { // 5MB limit\n errorMessage.value = 'File size must be less than 5MB'\n return\n }\n \n // Store the selected file and open editor\n selectedImageFile.value = file\n showAvatarEditor.value = true\n }\n \n // Reset the input\n if (target) {\n target.value = ''\n }\n}\n\nconst handleAvatarUpload = async (file: File) => {\n await uploadAvatar(file)\n showAvatarEditor.value = false\n selectedImageFile.value = null\n}\n\nconst handleAvatarError = (error: string) => {\n errorMessage.value = error\n}\n\nconst handleAvatarEditorClose = () => {\n showAvatarEditor.value = false\n selectedImageFile.value = null\n}\n\nconst uploadAvatar = async (file: File) => {\n uploading.value = true\n clearMessages()\n \n try {\n // Check if we have an access token\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available. Please sign in again.')\n }\n \n // Create form data\n const formData = new FormData()\n formData.append('avatar', file)\n \n // Upload to API endpoint\n const response = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!response.ok) {\n // Handle authentication errors\n if (response.status === 401) {\n // Try to refresh token and retry once\n try {\n console.log('Access token expired, attempting to refresh...')\n const refreshed = await refreshToken()\n if (refreshed && currentSession.value?.accessToken) {\n console.log('Token refreshed successfully, retrying avatar upload...')\n // Retry the upload with new token\n const retryResponse = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!retryResponse.ok) {\n const errorData = await retryResponse.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${retryResponse.status} ${retryResponse.statusText}`)\n }\n \n // Use the retry response for processing\n const retryResult = await retryResponse.json()\n console.log('Avatar upload retry success:', retryResult)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', retryResult.avatar_url)\n authUser.value.avatar = retryResult.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = retryResult.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload retry')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload retry:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n return\n } else {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } catch (refreshError) {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${response.status} ${response.statusText}`)\n }\n }\n \n const result = await response.json()\n console.log('Avatar upload success:', result)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', result.avatar_url)\n authUser.value.avatar = result.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = result.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n \n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to upload avatar'\n errorMessage.value = error\n emit('error', error)\n } finally {\n uploading.value = false\n }\n}\n\nconst handleMfaUpdated = async () => {\n // Refresh the user profile and MFA devices to get updated status\n try {\n await fetchProfile()\n await fetchMfaDevices()\n successMessage.value = 'MFA settings updated successfully'\n emit('mfa-toggle', currentUser.value?.mfaEnabled || false)\n } catch (err) {\n console.error('Failed to refresh profile after MFA update:', err)\n }\n}\n\nconst handleSettingsUpdated = (settings: any) => {\n successMessage.value = 'Settings updated successfully'\n // Settings are automatically updated in the auth composable\n // The modal already handles the API call and state updates\n}\n\nconst handleCancel = () => {\n const user = currentUser.value\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email\n }\n clearMessages()\n showPasswordChange.value = false\n showEmailChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n}\n\nconst handleSignOut = async () => {\n signingOut.value = true\n clearMessages()\n \n try {\n await signOut()\n // The signOut function from useStrandsAuth will handle navigation and token clearing\n successMessage.value = 'Signed out successfully'\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to sign out'\n errorMessage.value = error\n emit('error', error)\n signingOut.value = false\n }\n}\n\n// Initialize username cooldown data when component mounts\nonMounted(async () => {\n if (currentUser.value && isAuthenticated.value) {\n try {\n const cooldownData = await getUsernameCooldown()\n usernameChangeData.canChange = cooldownData.can_change\n usernameChangeData.cooldownEnd = cooldownData.cooldown_end ? new Date(cooldownData.cooldown_end) : null\n usernameChangeData.daysRemaining = cooldownData.days_remaining || 0\n } catch (err) {\n console.error('Failed to fetch username cooldown:', err)\n }\n }\n})\n\n</script>\n\n<style scoped>\n/* Modal-specific styles - removes border, radius, background, and padding */\n.profile-container-modal {\n /* Remove any container-specific styles when in modal */\n}\n\n.profile-content-modal {\n /* Remove card styling when in modal */\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n}\n\n.expand-enter-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px; /* Approximate max height for password form */\n opacity: 1;\n transform: translateY(0);\n}\n</style>\n\n","<template>\n <div class=\"w-full min-w-100 max-w-md mx-auto animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"text-center mb-8\">\n <h1 class=\"text-3xl font-bold text-gradient mb-2\">Reset password</h1>\n <p class=\"text-neutral-600\">Enter your email address and we'll send you a link to reset your password</p>\n </div>\n\n <!-- Reset Form -->\n <form @submit.prevent=\"handlePasswordReset\" class=\"space-y-6\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message -->\n <StrandsUiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"mt-6 animate-fade-in\" />\n\n <!-- Error Message -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"mt-6 animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"mt-8 text-center\">\n <StrandsUiLink @click=\"$emit('back-to-signin')\" class=\"inline-flex items-center gap-2\">\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"mt-6 text-center\">\n <p class=\"text-neutral-400 text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>","<template>\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"max-w-5xl\">\n <template #header>\n <div class=\"flex items-center justify-between\">\n <div>\n <h2 class=\"text-2xl font-bold text-gray-900\">Two-Factor Authentication</h2>\n <p class=\"text-gray-600 mt-1\">Add extra security to your account</p>\n </div>\n <div class=\"text-right\">\n <span class=\"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium\" \n :class=\"mfaEnabled || activeMfaDevices.length > 0 ? 'bg-green-100 text-green-800' : 'bg-gray-100 text-gray-800'\">\n {{ mfaEnabled || activeMfaDevices.length > 0 ? 'Enabled' : 'Not Enabled' }}\n </span>\n </div>\n </div>\n </template>\n\n <div class=\"space-y-8\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"flex items-center justify-center py-16\">\n <StrandsUiLoader :size=\"32\" />\n <span class=\"ml-3 text-gray-600\">Loading MFA settings...</span>\n </div>\n\n <!-- MFA Options -->\n <div v-else class=\"space-y-8\">\n <!-- Current MFA Status -->\n <div v-if=\"mfaEnabled || activeMfaDevices.length > 0\" class=\"bg-green-50 border border-green-200 rounded-xl p-6\">\n <div class=\"flex items-center space-x-3\">\n <div class=\"w-10 h-10 bg-green-100 rounded-full flex items-center justify-center\">\n <Shield :size=\"20\" class=\"text-green-600\" />\n </div>\n <div>\n <span class=\"text-green-800 font-medium text-lg\">2FA is currently enabled on your account</span>\n <p class=\"text-green-700 text-sm mt-1\">Your account has additional security protection</p>\n </div>\n </div>\n </div>\n\n <!-- Setup Options -->\n <div>\n <h3 class=\"text-xl font-semibold text-gray-900 mb-6\">Choose Your Authentication Method</h3>\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <!-- TOTP Setup -->\n <div class=\"group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer\"\n @click=\"startTotpSetup\">\n <div class=\"flex flex-col items-center text-center space-y-4\">\n <div class=\"w-16 h-16 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Smartphone :size=\"28\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"space-y-2\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Authenticator App</h4>\n <p class=\"text-sm text-gray-500 leading-relaxed\">Use Google Authenticator, Authy, or any TOTP-compatible app to generate secure codes</p>\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startTotpSetup\"\n :disabled=\"loading\"\n class=\"w-full mt-4\"\n >\n Setup Authenticator\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Email MFA Setup -->\n <div class=\"group p-8 border border-gray-200 rounded-xl hover:shadow-lg hover:border-[var(--strands-primary)] transition-all duration-200 cursor-pointer\"\n @click=\"startEmailMfaSetup\">\n <div class=\"flex flex-col items-center text-center space-y-4\">\n <div class=\"w-16 h-16 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Mail :size=\"28\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"space-y-2\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Email Verification</h4>\n <p class=\"text-sm text-gray-500 leading-relaxed\">Receive verification codes directly in your email inbox for easy access</p>\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startEmailMfaSetup\"\n :disabled=\"loading\"\n class=\"w-full mt-4\"\n >\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Hardware Key Setup - Temporarily Disabled -->\n <div class=\"group p-8 border border-gray-300 rounded-xl bg-gray-50 opacity-60 cursor-not-allowed\">\n <div class=\"flex flex-col items-center text-center space-y-4\">\n <div class=\"w-16 h-16 bg-gray-200 rounded-xl flex items-center justify-center\">\n <KeyRound :size=\"28\" class=\"text-gray-400\" />\n </div>\n <div class=\"space-y-2\">\n <h4 class=\"font-semibold text-gray-500 text-lg\">Hardware Key & Passkeys</h4>\n <p class=\"text-sm text-gray-400 leading-relaxed\">Temporarily unavailable - cross-domain support coming soon</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"md\"\n disabled\n class=\"w-full mt-4\"\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Manage Existing --> \n <div v-if=\"activeMfaDevices.length > 0\" class=\"border-t border-gray-200 pt-8\">\n <div class=\"flex items-center justify-between\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900\">Manage Existing Methods</h3>\n <p class=\"text-gray-600 text-sm mt-1\">{{ activeMfaDevices.length }} device(s) currently active</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"md\"\n @click=\"openMfaModal\"\n :disabled=\"loading\"\n >\n <Settings :size=\"16\" class=\"mr-2\" />\n Manage Devices\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"flex justify-end space-x-3\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"closeModal\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </template>\n </UiModal>\n\n <!-- TOTP Setup Modal -->\n <StrandsTotpSetupModal\n v-if=\"showTotpSetup\"\n :show=\"showTotpSetup\"\n @close=\"showTotpSetup = false\"\n @success=\"handleSetupSuccess\"\n />\n\n <!-- Email MFA Setup Modal -->\n <StrandsEmailMfaSetupModal\n v-if=\"showEmailMfaSetup\"\n :show=\"showEmailMfaSetup\"\n @close=\"showEmailMfaSetup = false\"\n @success=\"handleSetupSuccess\"\n />\n\n <!-- Hardware Key Setup Modal -->\n <StrandsHardwareKeySetupModal\n v-if=\"showHardwareKeySetup\"\n :show=\"showHardwareKeySetup\"\n @close=\"showHardwareKeySetup = false\"\n @success=\"handleSetupSuccess\"\n />\n\n <!-- Full MFA Management Modal -->\n <StrandsMfaModal\n v-if=\"showMfaModal\"\n :show=\"showMfaModal\"\n @close=\"showMfaModal = false\"\n @mfa-updated=\"handleMfaUpdated\"\n />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport StrandsTotpSetupModal from './StrandsTotpSetupModal.vue'\nimport StrandsEmailMfaSetupModal from './StrandsEmailMfaSetupModal.vue'\nimport StrandsHardwareKeySetupModal from './StrandsHardwareKeySetupModal.vue'\nimport StrandsMfaModal from './StrandsMfaModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport { Smartphone, Mail, KeyRound, Shield, Settings } from 'lucide-vue-next'\n\ninterface Props {\n show?: boolean\n}\n\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'close'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n show: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst {\n mfaDevices,\n mfaEnabled,\n loading,\n activeMfaDevices,\n fetchMfaDevices,\n} = useStrandsMfa()\n\n// Modal states\nconst showTotpSetup = ref(false)\nconst showEmailMfaSetup = ref(false)\nconst showHardwareKeySetup = ref(false)\nconst showMfaModal = ref(false)\n\n// Load MFA devices when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n await fetchMfaDevices()\n }\n})\n\nonMounted(async () => {\n if (props.show) {\n await fetchMfaDevices()\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startTotpSetup = () => {\n showTotpSetup.value = true\n}\n\nconst startEmailMfaSetup = () => {\n showEmailMfaSetup.value = true\n}\n\nconst startHardwareKeySetup = () => {\n showHardwareKeySetup.value = true\n}\n\nconst openMfaModal = () => {\n showMfaModal.value = true\n}\n\nconst handleSetupSuccess = async () => {\n showTotpSetup.value = false\n showEmailMfaSetup.value = false\n showHardwareKeySetup.value = false\n await fetchMfaDevices()\n emit('success')\n}\n\nconst handleMfaUpdated = async () => {\n await fetchMfaDevices()\n}\n</script>","<template>\n <div v-if=\"isAuthenticated && !showLoading\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"!isAuthenticated && showFallback && !showLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-neutral-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-neutral-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Sign in required</h3>\n <p class=\"text-neutral-600 mb-4\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"btn-primary !w-auto px-6 py-2\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"showLoading\" class=\"animate-fade-in\">\n <slot name=\"loading\">\n <StrandsUiLoader\n :size=\"64\" \n text=\"Checking authentication...\" \n variant=\"auto\" \n :show-particles=\"true\" \n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nwithDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\n// Local loading state to ensure loading shows on first render\nconst isComponentReady = ref(false)\n\nconst { isAuthenticated, isInitializing, isSigningIn, user, signOut } = useStrandsAuth()\n\n// Show loading until both auth is initialized AND component is ready\n// Don't show loading during sign-in attempts - let StrandsAuth handle its own loading\nconst showLoading = computed(() => (isInitializing.value && !isSigningIn.value) || !isComponentReady.value)\n\nonMounted(() => {\n // Add a small delay to ensure we show loading state\n setTimeout(() => {\n isComponentReady.value = true\n }, 100)\n})\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"text-center py-8\">\n <div class=\"w-16 h-16 mx-auto mb-4 bg-strands-100 rounded-full flex items-center justify-center\">\n <svg class=\"w-8 h-8 text-strands-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n </div>\n <h3 class=\"text-lg font-semibold text-neutral-900 mb-2\">Already signed in</h3>\n <p class=\"text-neutral-600 mb-4\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"btn-secondary !w-auto px-6 py-2\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-fade-in\">\n <slot name=\"loading\">\n <StrandsUiLoader \n :size=\"64\"\n text=\"Checking authentication...\"\n variant=\"auto\"\n :show-particles=\"true\"\n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>","<template>\n <svg \n viewBox=\"0 0 22571 9413\" \n xmlns=\"http://www.w3.org/2000/svg\" \n :class=\"class\"\n role=\"img\"\n aria-label=\"Strands Services Logo\"\n >\n <g>\n <text \n x=\"3798.06\" \n y=\"7203.65\" \n style=\"font-family:'CourierNewPS-BoldMT', 'Courier New', monospace;font-weight:700;font-size:5295.12px;fill:currentColor;\"\n >\n trands\n </text>\n </g>\n <g>\n <path \n d=\"M2370.75,8047.43c-172.831,0 -349.758,-28.381 -520.19,-86.274c-362.325,-122.988 -626.515,-354.842 -724.651,-635.835c-94.464,-270.121 -70.883,-674.383 204.038,-923.606c318.411,-288.759 731.429,-170.714 1168.59,-45.891c186.811,53.375 395.367,112.962 625.668,152.923c-0.424,-11.579 -0.988,-21.181 -1.412,-28.806c-14.12,-228.042 -92.911,-347.217 -223.524,-544.618c-83.592,-126.376 -178.48,-269.696 -272.097,-466.956c-74.978,-158.006 -138.096,-327.308 -188.082,-502.822c-408.216,-4.095 -801.606,-101.666 -1135.83,-290.313c-874.468,-493.079 -1531.48,-1711.66 -1068.34,-2543.62c195.283,-350.747 599.829,-639.082 1030.5,-734.394c321.095,-71.166 618.185,-23.298 836.343,134.707c228.183,165.207 391.131,461.309 425.16,772.66c29.371,267.862 -42.784,514.825 -203.049,695.423c-247.669,279.016 -675.371,371.786 -1089.66,236.232l175.515,-536.852c194.295,63.541 396.497,32.9 491.809,-74.414c68.059,-76.673 72.436,-183.14 64.105,-259.107c-18.356,-167.889 -111.973,-316.576 -195,-376.728c-85.569,-61.988 -221.547,-76.532 -382.8,-40.666c-271.533,60.152 -542.641,248.375 -659.133,457.778c-126.942,228.042 -103.784,560.433 63.541,912.027c171.137,359.643 465.968,682.997 788.616,865.007c216.181,121.999 473.593,192.882 744.843,211.097c-19.91,-172.69 -27.111,-345.522 -20.475,-513.977c23.864,-608.865 225.642,-1098.41 567.917,-1378.28c338.604,-276.898 921.487,-426.997 1334.79,-159.7c453.119,293.136 534.452,990.394 350.041,1468.36c-164.077,425.444 -583.307,786.075 -1150.24,989.406c-130.048,46.738 -262.355,83.451 -395.226,110.28c35.583,109.432 77.379,215.192 125.105,315.446c76.673,161.253 156.17,281.558 233.126,397.767c150.521,227.619 292.854,442.67 316.152,821.517c1.694,28.522 3.248,65.659 3.53,109.431c88.534,-1.694 179.61,-7.766 273.086,-19.344c234.819,-28.947 692.521,-185.215 954.251,-408.635l202.34,499.143c-286.222,212.469 -804.15,435.189 -1087.4,470.066c-144.592,17.791 -283.817,24.851 -417.395,24.004c-75.684,261.648 -223.665,536.852 -507.34,722.674c-206.438,135.272 -466.251,204.885 -736.795,204.885l-0.424,0Zm-542.076,-1260.51c-52.669,-0 -93.617,9.743 -119.316,33.182c-79.073,71.731 -79.78,234.114 -50.127,318.977c38.69,110.702 185.116,223.523 373.057,287.347c271.956,92.346 572.576,70.319 765.882,-56.34c114.374,-74.837 189.353,-185.258 238.209,-303.303c-263.484,-45.185 -495.48,-111.409 -693.022,-167.89c-205.873,-58.881 -391.978,-111.973 -514.683,-111.973Zm1872.91,-4019.61c-153.346,0 -336.768,62.27 -471.193,172.126c-212.227,173.538 -343.828,524.708 -361.055,963.283c-5.93,149.393 1.271,302.88 20.192,455.802c110.421,-21.463 219.994,-51.257 327.167,-89.805c406.239,-145.721 710.531,-392.966 814.032,-661.11c98.842,-256.141 62.835,-666.052 -130.047,-790.875c-51.963,-33.606 -121.717,-49.421 -199.096,-49.421Z\" \n style=\"fill:currentColor;fill-rule:nonzero;\" \n />\n </g>\n </svg>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h as createElement } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => createElement('g', [\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => createElement('g', [\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0710.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => createElement('g', [\n createElement('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n createElement('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => createElement('g', { fill: 'currentColor' }, [\n createElement('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n createElement('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n createElement('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n createElement('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : createElement('path', { d: '' })\n})\n</script>\n","<template>\n <div ref=\"containerRef\">\n <SignedIn>\n <!-- Signed In State - User Button Trigger -->\n <button\n @click=\"toggleDropdown\"\n @keydown.enter=\"toggleDropdown\"\n @keydown.space.prevent=\"toggleDropdown\"\n @keydown.escape=\"closeDropdown\"\n @keydown.arrow-down.prevent=\"openDropdown\"\n class=\"relative flex items-center py-2 px-3 rounded-full bg-gray-100 text-gray-900 text-sm font-medium hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-150\"\n aria-haspopup=\"true\"\n :aria-expanded=\"showDropdown\"\n aria-label=\"User menu\"\n >\n <div class=\"flex items-center\" style=\"gap: 0.75rem;\">\n <!-- User Info -->\n <div v-if=\"!hideUser\" class=\"flex flex-col items-start\">\n <div class=\"text-sm font-medium text-gray-900 leading-tight\">\n {{ displayName }}\n </div>\n </div>\n \n <!-- Avatar with Level Progress Ring -->\n <div class=\"relative flex-shrink-0\">\n <div class=\"relative w-8 h-8\">\n <!-- Avatar Image -->\n <img\n v-if=\"user?.avatar\"\n :src=\"user.avatar\"\n :alt=\"`${user.firstName || user.email}'s avatar`\"\n class=\"w-8 h-8 rounded-full object-cover\"\n />\n \n <!-- Default Avatar -->\n <div v-else class=\"w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center\">\n <svg class=\"w-5 h-5 text-gray-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n </div>\n </div>\n\n <!-- Dropdown Arrow -->\n <svg \n class=\"w-4 h-4 text-gray-400 transition-transform duration-150\" \n :class=\"{ 'transform rotate-180': showDropdown }\"\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n\n <!-- Dropdown Menu -->\n <Transition name=\"dropdown\">\n <div\n v-if=\"showDropdown\"\n class=\"absolute right-0 top-full mt-2 w-72 bg-white rounded-lg shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none z-50\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n @keydown.escape=\"closeDropdown\"\n @keydown.arrow-up.prevent=\"focusPrevious\"\n @keydown.arrow-down.prevent=\"focusNext\"\n @keydown.home.prevent=\"focusFirst\"\n @keydown.end.prevent=\"focusLast\"\n >\n <div class=\"p-2\">\n <!-- User Info Header -->\n <div class=\"flex items-center gap-4 p-3 rounded-lg bg-gray-50\">\n <div v-if=\"user\" class=\"relative\">\n <StrandsUiLevelProgress\n :size=\"80\" \n :value=\"user.xp\" \n :max=\"user.next_level_xp\" \n :level=\"user.level\" \n :level-label=\"`LEVEL ${user.level}`\"\n :user-settings=\"user.settings\"\n class=\"absolute z-10 top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 pointer-events-none\" \n />\n <img\n v-if=\"user?.avatar\"\n :src=\"user.avatar\"\n :alt=\"`${user.firstName || user.email}'s avatar`\"\n class=\"w-14 h-14 rounded-full object-cover\"\n />\n <div v-else class=\"w-14 h-14 rounded-full bg-gray-200 flex items-center justify-center\">\n <svg class=\"w-5 h-5 text-gray-600\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n </div>\n <div class=\"flex-1 min-w-0 text-left\">\n <div class=\"text-sm font-medium text-gray-900 truncate\">{{ displayName }}</div>\n <div class=\"text-sm text-gray-500 truncate\">{{ user?.email }}</div>\n </div>\n </div>\n\n <div class=\"h-px bg-gray-200 my-2\"></div>\n\n <!-- Menu Items -->\n <div class=\"space-y-1\">\n <button\n ref=\"profileButtonRef\"\n @click=\"openProfile\"\n class=\"w-full flex items-center space-x-3 px-3 py-2 text-sm text-gray-700 rounded-lg hover:bg-gray-100 focus:bg-gray-100 focus:outline-none transition-colors duration-150\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <svg class=\"w-4 h-4 text-gray-400\" 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 Profile\n </button>\n\n <button\n @click=\"handleSignOut\"\n class=\"w-full flex items-center space-x-3 px-3 py-2 text-sm text-red-600 rounded-lg hover:bg-red-50 focus:bg-red-50 focus:outline-none transition-colors duration-150\"\n role=\"menuitem\"\n tabindex=\"-1\"\n >\n <svg class=\"w-4 h-4 text-red-500\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\" />\n </svg>\n Sign Out\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </button>\n\n <!-- Profile Modal -->\n <StrandsUiModal\n :open=\"showProfileModal\"\n @close=\"closeProfile\"\n :fullscreen-on-mobile=\"false\"\n >\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-semibold text-gray-900\">User Profile</h2>\n <button\n @click=\"closeProfile\"\n class=\"p-1 rounded-lg text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n aria-label=\"Close profile\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n \n <StrandsUserProfile\n @profile-updated=\"handleProfileUpdated\"\n @error=\"handleProfileError\"\n in-modal\n />\n </StrandsUiModal>\n\n <!-- Fallback Slot - Sign In Button (shown when not authenticated) -->\n <template #fallback>\n <button\n @click=\"openSignIn\"\n class=\"relative flex items-center gap-2 py-2 px-4 rounded-full bg-strands-500 text-white text-sm font-medium hover:bg-strands-600 focus:outline-none focus:ring-2 focus:ring-strands-500 focus:ring-offset-2 transition-all duration-150\"\n aria-label=\"Sign in\"\n >\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=\"M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1\" />\n </svg>\n <span>Sign In</span>\n </button>\n\n <!-- Sign In Modal -->\n <StrandsUiModal\n :open=\"showSignInModal\"\n @close=\"closeSignIn\"\n :fullscreen-on-mobile=\"false\"\n >\n <template #header>\n <div class=\"flex items-center justify-between\">\n <h2 class=\"text-xl font-semibold text-gray-900\">Sign In</h2>\n <button\n @click=\"closeSignIn\"\n class=\"p-1 rounded-lg text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n aria-label=\"Close sign in\"\n >\n <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n \n <StrandsAuth\n @signed-in=\"handleSignedIn\"\n @error=\"handleSignInError\"\n :redirect-url=\"redirectUrl\"\n in-modal\n />\n </StrandsUiModal>\n </template>\n </SignedIn>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLevelProgress, StrandsUiModal } from '../ui'\nimport { StrandsAuth, StrandsUserProfile, SignedIn } from '.'\n\ninterface Props {\n hideUser?: boolean\n variant?: 'minimal' | 'compact' | 'full'\n redirectUrl?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n hideUser: false,\n variant: 'minimal',\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<{\n 'profile-updated': []\n 'signed-out': []\n 'signed-in': []\n}>()\n\n// Auth composable\nconst { currentUser: user, signOut } = useStrandsAuth()\n\n// Component state\nconst showDropdown = ref(false)\nconst showProfileModal = ref(false)\nconst showSignInModal = ref(false)\nconst containerRef = ref<HTMLElement>()\nconst profileButtonRef = ref<HTMLButtonElement>()\n\n// User display logic\nconst displayName = computed(() => {\n if (!user.value) return 'User'\n \n if (user.value.username) {\n return user.value.username\n }\n \n if (user.value.firstName && user.value.lastName) {\n return `${user.value.firstName} ${user.value.lastName}`\n }\n \n if (user.value.firstName) {\n return user.value.firstName\n }\n \n return user.value.email || 'User'\n})\n\n// Dropdown management\nconst toggleDropdown = () => {\n showDropdown.value = !showDropdown.value\n \n if (showDropdown.value) {\n nextTick(() => {\n profileButtonRef.value?.focus()\n })\n }\n}\n\nconst openDropdown = () => {\n showDropdown.value = true\n nextTick(() => {\n profileButtonRef.value?.focus()\n })\n}\n\nconst closeDropdown = () => {\n showDropdown.value = false\n}\n\n// Keyboard navigation for dropdown\nconst focusNext = () => {\n // Simple implementation - can be enhanced\n}\n\nconst focusPrevious = () => {\n // Simple implementation - can be enhanced\n}\n\nconst focusFirst = () => {\n profileButtonRef.value?.focus()\n}\n\nconst focusLast = () => {\n // Focus the last item (sign out button)\n}\n\n// Profile modal management\nconst openProfile = () => {\n showProfileModal.value = true\n closeDropdown()\n}\n\nconst closeProfile = () => {\n showProfileModal.value = false\n}\n\nconst handleProfileUpdated = () => {\n emit('profile-updated')\n}\n\nconst handleProfileError = (error: string) => {\n console.error('Profile error:', error)\n}\n\n// Sign in modal management\nconst openSignIn = () => {\n showSignInModal.value = true\n}\n\nconst closeSignIn = () => {\n showSignInModal.value = false\n}\n\nconst handleSignedIn = () => {\n closeSignIn()\n emit('signed-in')\n}\n\nconst handleSignInError = (error: string) => {\n console.error('Sign in error:', error)\n}\n\n// Sign out handler\nconst handleSignOut = async () => {\n try {\n await signOut()\n closeDropdown()\n emit('signed-out')\n } catch (error) {\n console.error('Sign out error:', error)\n }\n}\n\n// Click outside to close dropdown\nconst handleClickOutside = (event: Event) => {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n closeDropdown()\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n\n<style scoped>\n/* Transitions */\n.dropdown-enter-active,\n.dropdown-leave-active {\n transition: all 0.15s ease;\n}\n\n.dropdown-enter-from,\n.dropdown-leave-to {\n opacity: 0;\n transform: scale(0.95) translateY(4px);\n}\n\n.dropdown-enter-to,\n.dropdown-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Responsive adjustments */\n@media (max-width: 640px) {\n .dropdown-menu {\n width: 16rem; /* w-64 */\n }\n}\n</style>","import type { App } from 'vue'\n\n// Import all UI components\nimport StrandsUiAlert from '../ui/UiAlert.vue'\nimport StrandsUiButton from '../ui/UiButton.vue'\nimport StrandsUiCard from '../ui/UiCard.vue'\nimport StrandsUiInput from '../ui/UiInput.vue'\nimport StrandsUiLink from '../ui/UiLink.vue'\nimport StrandsUiTabs from '../ui/UiTabs.vue'\nimport StrandsUiLoader from '../ui/UiLoader.vue'\n\n// Global components map\nconst components = {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\nexport interface StrandsUIOptions {\n prefix?: string\n}\n\nexport default {\n install(app: App, options: StrandsUIOptions = {}) {\n const { prefix = '' } = options\n\n // Register all components globally\n Object.entries(components).forEach(([name, component]) => {\n const componentName = prefix ? `${prefix}${name}` : name\n app.component(componentName, component)\n })\n }\n}\n\n// Export individual components for tree-shaking\nexport {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\n// Export types\nexport type {\n ButtonVariant,\n ButtonSize,\n InputType,\n CardVariant,\n LinkVariant,\n AlertVariant,\n} from '../ui/index'","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["computed","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_5","title","_renderSlot","message","dismissible","_hoisted_6","$emit","type","disabled","loading","loadingText","$slots","useSlots","ref","label","required","_hoisted_4","modelValue","placeholder","autocomplete","name","inputmode","maxlength","_hoisted_7","_hoisted_8","error","_hoisted_9","_toDisplayString","helpText","_hoisted_10","_createBlock","_resolveDynamicComponent","_mergeProps","nextTick","onMounted","toRefs","watch","_Fragment","_renderList","tabs","_normalizeClass","_unref","size","weight","text","id","reactive","canvas","_normalizeStyle","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_createVNode","UiButton","uploading","_hoisted_16","module","worker","fettis","_hoisted_11","levelLabel","_Teleport","open","fullscreenOnMobile","useStrandsConfig","useStrandsAuth","onBeforeUnmount","UiModal","show","_hoisted_34","_hoisted_12","_hoisted_21","_createTextVNode","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_Transition","StrandsUiTabs","StrandsUiLink","StrandsUiAlert","StrandsSecuredFooter","StrandsMfaVerification","StrandsUiCard","token","h","utils","version","exports","require$$0","maskPattern","errorCorrectionLevel","require$$1","mode","require$$2","require$$3","require$$4","segments","bitBuffer","dijkstra","require$$5","require$$6","require$$7","regex","require$$8","require$$9","require$$10","require$$11","require$$12","svgTag","canPromise","QRCode","device","cancelText","variant","confirmText","mfaEnabled","StrandsTotpSetupModal","StrandsEmailMfaSetupModal","StrandsHardwareKeySetupModal","StrandsBackupCodesModal","StrandsConfirmModal","getInitials","inModal","StrandsMfaModal","StrandsSettingsModal","StrandsUiAvatarEditorSimple","showFallback","class","provideStrandsConfig","createElement","fill","stroke","ariaHidden","onUnmounted","SignedIn","redirectUrl","hideUser"],"mappings":"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AAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA;AAGd,QAAM,qBAAqB;AAAA;AAAA,IAEzB;AAAA,IAAG;AAAA,IAAI;AAAA,IAAI;AAAA,IACX;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAI;AAAA,IACZ;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IACb;AAAA,IAAI;AAAA,IAAI;AAAA,IAAK;AAAA,IACb;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAI;AAAA,IAAK;AAAA,IAAK;AAAA,IACd;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IACf;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,IAAK;AAAA,IAAK;AAAA,IAAM;AAAA,IAChB;AAAA,I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","x_google_ignoreList":[11,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62]}
|
|
1
|
+
{"version":3,"file":"strands-auth-ui.cjs.js","sources":["../../../apps/accounts-ui/src/vue/ui/UiAlert.vue","../../../apps/accounts-ui/src/vue/utils/contrast.ts","../../../apps/accounts-ui/src/vue/ui/UiButton.vue","../../../apps/accounts-ui/src/vue/ui/UiCard.vue","../../../apps/accounts-ui/src/vue/ui/UiInput.vue","../../../apps/accounts-ui/src/vue/ui/UiLink.vue","../../../apps/accounts-ui/src/vue/ui/UiTabs.vue","../../../apps/accounts-ui/assets/strands_icon_path.svg?raw","../../../apps/accounts-ui/src/vue/ui/UiLoader.vue","../../../apps/accounts-ui/src/vue/ui/UiToggle.vue","../../../apps/accounts-ui/src/vue/ui/UiAvatarEditor.vue","../../../apps/accounts-ui/src/vue/utils/sounds.ts","../../../apps/accounts-ui/src/vue/ui/UiLevelProgress.vue","../../../apps/accounts-ui/src/vue/ui/UiModal.vue","../../../apps/accounts-ui/assets/secured_by_strands_services.png","../../../apps/accounts-ui/src/utils/slots.ts","../../../apps/accounts-ui/src/vue/components/StrandsSecuredFooter.vue","../../../apps/accounts-ui/src/vue/composables/useStrandsMfa.ts","../../../apps/accounts-ui/src/vue/components/StrandsMfaVerification.vue","../../../apps/accounts-ui/src/vue/composables/useOAuthProviders.ts","../../../apps/accounts-ui/src/vue/components/StrandsAuth.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignIn.vue","../../../apps/accounts-ui/src/vue/components/StrandsSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsCompleteSignUp.vue","../../../apps/accounts-ui/src/vue/components/StrandsTotpSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsEmailMfaSetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsHardwareKeySetupModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsBackupCodesModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfirmModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsMfaModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsSettingsModal.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserProfile.vue","../../../apps/accounts-ui/src/vue/components/StrandsPasswordReset.vue","../../../apps/accounts-ui/src/vue/components/StrandsMFASetup.vue","../../../apps/accounts-ui/src/vue/components/SignedIn.vue","../../../apps/accounts-ui/src/vue/components/SignedOut.vue","../../../apps/accounts-ui/src/vue/components/StrandsLogo.vue","../../../apps/accounts-ui/src/vue/components/StrandsConfigProvider.vue","../../../apps/accounts-ui/src/vue/components/SvgIcon.vue","../../../apps/accounts-ui/src/vue/components/StrandsUserButton.vue","../../../apps/accounts-ui/src/vue/plugins/StrandsUIPlugin.ts","../../../apps/accounts-ui/src/utils/validation.ts"],"sourcesContent":["<template>\n <div class=\"accui-component-scope\">\n <div :class=\"alertClasses\" role=\"alert\">\n <div class=\"alert-content\">\n <div class=\"alert-icon-container\">\n <svg class=\"alert-main-icon\" 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=\"alert-text-container\">\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=\"alert-dismiss-container\">\n <button type=\"button\" class=\"alert-dismiss-button\" @click=\"$emit('dismiss')\">\n <span class=\"sr-only\">Dismiss</span>\n <svg class=\"alert-dismiss-icon\" 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 </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 variantClasses = {\n success: 'alert alert-success',\n error: 'alert alert-error',\n warning: 'alert alert-warning',\n info: 'alert alert-info'\n }\n\n return variantClasses[props.variant]\n})\n\nconst titleClasses = computed(() => {\n return 'alert-title'\n})\n\nconst messageClasses = computed(() => {\n return 'alert-message'\n})\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\n<style scoped>\n/* Base Alert Container */\n.alert {\n position: relative;\n padding: 1rem;\n border-radius: 0.5rem;\n border: 1px solid;\n font-family: var(--font-sans);\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.05);\n transition: all 0.15s ease;\n animation: alertSlideIn 0.2s ease-out;\n}\n\n.alert:hover {\n box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.08);\n}\n\n/* Alert Animation */\n@keyframes alertSlideIn {\n from {\n opacity: 0;\n transform: translateY(-4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Alert base layout styles */\n.alert-content {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert-icon-container {\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert-text-container {\n flex: 1;\n min-width: 0; /* Ensure text can wrap */\n}\n\n/* Alert main icon */\n.alert-main-icon {\n width: 1.25rem;\n height: 1.25rem;\n flex-shrink: 0;\n}\n\n/* Alert typography */\n.alert-title {\n font-size: 0.875rem;\n font-weight: 600;\n margin: 0 0 0.25rem 0;\n line-height: 1.4;\n}\n\n.alert-message {\n font-size: 0.875rem;\n line-height: 1.5;\n margin: 0;\n}\n\n/* Dismiss container */\n.alert-dismiss-container {\n margin-left: auto;\n padding-left: 0.75rem;\n flex-shrink: 0;\n}\n\n/* Dismiss button */\n.alert-dismiss-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 0.375rem;\n width: 1.75rem;\n height: 1.75rem;\n background: none;\n border: none;\n cursor: pointer;\n opacity: 0.6;\n transition: all 0.15s ease;\n}\n\n.alert-dismiss-button:hover {\n opacity: 1;\n background: rgba(0, 0, 0, 0.05);\n}\n\n.alert-dismiss-button:focus-visible {\n outline: 2px solid var(--strands-500);\n outline-offset: 2px;\n opacity: 1;\n}\n\n/* Alert dismiss icon */\n.alert-dismiss-icon {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n\n/* SUCCESS VARIANT */\n.alert-success {\n background: #f0fdf4;\n border-color: #bbf7d0;\n color: #166534;\n}\n\n.alert-success .alert-main-icon {\n color: #16a34a;\n}\n\n/* ERROR VARIANT */\n.alert-error {\n background: #fef2f2;\n border-color: #fecaca;\n color: #991b1b;\n}\n\n.alert-error .alert-main-icon {\n color: #dc2626;\n}\n\n/* WARNING VARIANT */\n.alert-warning {\n background: #fefce8;\n border-color: #fde68a;\n color: #92400e;\n}\n\n.alert-warning .alert-main-icon {\n color: #d97706;\n}\n\n/* INFO VARIANT */\n.alert-info {\n background: #eff6ff;\n border-color: #bfdbfe;\n color: #1e40af;\n}\n\n.alert-info .alert-main-icon {\n color: #2563eb;\n}\n\n/* Accessibility enhancements */\n@media (prefers-reduced-motion: reduce) {\n .alert {\n animation: none;\n transition: none;\n }\n}\n\n/* Screen reader only text */\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n</style>\n","/**\n * WCAG 3.0 APCA-based contrast calculation utilities\n * Provides perceptually accurate text contrast determination for accessibility\n */\n\n// APCA constants (WCAG 3.0)\nconst mainTRC = 2.4 // 2.4 exponent emulates actual monitor perception\nconst sRco = 0.2126729, sGco = 0.7151522, sBco = 0.0721750 // sRGB coefficients\nconst normBG = 0.56, normTXT = 0.57, revTXT = 0.62, revBG = 0.65 // G-4g constants\nconst blkThrs = 0.022, blkClmp = 1.414, scaleBoW = 1.14, scaleWoB = 1.14\n\n// Color map for base colors\nconst colorMap: Record<string, string> = {\n 'red': '#ef4444', 'blue': '#3b82f6', 'green': '#10b981', 'yellow': '#eab308',\n 'purple': '#8b5cf6', 'pink': '#ec4899', 'gray': '#6b7280', 'indigo': '#6366f1',\n 'orange': '#f97316', 'teal': '#14b8a6', 'cyan': '#06b6d4', 'emerald': '#10b981',\n 'lime': '#84cc16', 'amber': '#f59e0b', 'rose': '#f43f5e', 'slate': '#64748b',\n 'zinc': '#71717a', 'neutral': '#737373', 'stone': '#78716c', 'strands': '#EA00A8',\n 'primary': '#EA00A8'\n}\n\n/**\n * Convert hex color to RGB values\n */\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex)\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null\n}\n\n/**\n * APCA sRGB to Y (luminance) conversion - WCAG 3.0 method\n */\nexport const sRGBtoY = (r: number, g: number, b: number): number => {\n // Normalize to 0-1 and apply 2.4 gamma (APCA method)\n const rLin = Math.pow(r / 255, mainTRC)\n const gLin = Math.pow(g / 255, mainTRC)\n const bLin = Math.pow(b / 255, mainTRC)\n \n // Calculate Y using APCA coefficients\n let y = sRco * rLin + sGco * gLin + sBco * bLin\n \n // APCA black level adjustment\n if (y < blkThrs) {\n y += Math.pow(blkThrs - y, blkClmp)\n }\n \n return y\n}\n\n/**\n * APCA contrast calculation\n * Returns contrast value between -108 and 105\n */\nexport const calcAPCA = (txtY: number, bgY: number): number => {\n let sapc = 0\n\n // Determine polarity and calculate contrast\n if (bgY > txtY) {\n // White text on dark background\n sapc = (Math.pow(bgY, normBG) - Math.pow(txtY, normTXT)) * scaleWoB\n return (sapc * 100) < 15 ? 0 : (sapc * 100) - 15\n } else {\n // Dark text on light background \n sapc = (Math.pow(bgY, revBG) - Math.pow(txtY, revTXT)) * scaleBoW\n return (sapc * 100) > -15 ? 0 : (sapc * 100) + 15\n }\n}\n\n/**\n * Get effective RGB color considering shades and opacity modifications\n */\nexport const getEffectiveRgb = (colorProp: string): { r: number; g: number; b: number } => {\n const baseColorName = colorProp.includes('-') ? colorProp.split('-')[0] : \n colorProp.includes('/') ? colorProp.split('/')[0] : colorProp\n \n const baseColorHex = colorMap[baseColorName] || '#6b7280'\n const baseRgb = hexToRgb(baseColorHex) || { r: 107, g: 114, b: 128 }\n \n let effectiveRgb = { ...baseRgb }\n \n // Handle shade modifications\n if (colorProp.includes('-')) {\n const shade = parseInt(colorProp.split('-')[1], 10)\n if (!isNaN(shade) && shade !== 500) {\n if (shade < 500) {\n // Lighter shades - mix with white (gentle progression)\n const mixPercent = ((500 - shade) / 400) * 0.45\n effectiveRgb.r = Math.round(baseRgb.r + (255 - baseRgb.r) * mixPercent)\n effectiveRgb.g = Math.round(baseRgb.g + (255 - baseRgb.g) * mixPercent)\n effectiveRgb.b = Math.round(baseRgb.b + (255 - baseRgb.b) * mixPercent)\n } else {\n // Darker shades - mix with black (gentle progression)\n const mixPercent = ((shade - 500) / 450) * 0.45\n effectiveRgb.r = Math.round(baseRgb.r * (1 - mixPercent))\n effectiveRgb.g = Math.round(baseRgb.g * (1 - mixPercent))\n effectiveRgb.b = Math.round(baseRgb.b * (1 - mixPercent))\n }\n }\n }\n \n // Handle opacity modifications\n if (colorProp.includes('/')) {\n const opacity = parseInt(colorProp.split('/')[1], 10)\n if (!isNaN(opacity)) {\n const opacityRatio = opacity / 100\n const whiteRgb = { r: 255, g: 255, b: 255 }\n effectiveRgb.r = Math.round(effectiveRgb.r * opacityRatio + whiteRgb.r * (1 - opacityRatio))\n effectiveRgb.g = Math.round(effectiveRgb.g * opacityRatio + whiteRgb.g * (1 - opacityRatio))\n effectiveRgb.b = Math.round(effectiveRgb.b * opacityRatio + whiteRgb.b * (1 - opacityRatio))\n }\n }\n \n return effectiveRgb\n}\n\n/**\n * Calculate APCA contrast score between two colors\n * @param textColor RGB object or hex string for text color\n * @param backgroundColor RGB object or hex string for background color\n * @returns APCA contrast score (-108 to 105)\n */\nexport const getAPCAContrast = (\n textColor: { r: number; g: number; b: number } | string,\n backgroundColor: { r: number; g: number; b: number } | string\n): number => {\n const textRgb = typeof textColor === 'string' ? hexToRgb(textColor) : textColor\n const bgRgb = typeof backgroundColor === 'string' ? hexToRgb(backgroundColor) : backgroundColor\n \n if (!textRgb || !bgRgb) return 0\n \n const textY = sRGBtoY(textRgb.r, textRgb.g, textRgb.b)\n const bgY = sRGBtoY(bgRgb.r, bgRgb.g, bgRgb.b)\n \n return calcAPCA(textY, bgY)\n}\n\n/**\n * Get APCA contrast threshold based on font weight and size\n * WCAG 3.0 APCA thresholds vary based on font characteristics\n */\nexport const getAPCAThreshold = (fontWeight: number = 400, fontSize: number = 16): number => {\n // WCAG 3.0 APCA thresholds based on font weight and size\n // Higher font weights require less contrast\n \n if (fontWeight >= 700) {\n // Bold text (700+)\n if (fontSize >= 24) return 30 // Large bold text\n if (fontSize >= 18) return 35 // Medium bold text \n return 40 // Regular bold text\n } else if (fontWeight >= 600) {\n // Semi-bold text (600-699)\n if (fontSize >= 24) return 35 // Large semi-bold text\n if (fontSize >= 18) return 40 // Medium semi-bold text\n return 45 // Regular semi-bold text\n } else if (fontWeight >= 500) {\n // Medium text (500-599) - typical for buttons\n if (fontSize >= 24) return 40 // Large medium text\n if (fontSize >= 18) return 45 // Medium medium text\n return 50 // Regular medium text (buttons)\n } else {\n // Normal text (400 and below)\n if (fontSize >= 24) return 45 // Large normal text\n if (fontSize >= 18) return 50 // Medium normal text\n return 60 // Regular normal text\n }\n}\n\n/**\n * Determine optimal text color (black or white) for a given background\n * Uses WCAG 3.0 APCA algorithm for accurate contrast assessment\n * @param colorProp Color property string (e.g., 'red-500', 'blue/50')\n * @param fontWeight Font weight (300-900, default 400)\n * @param fontSize Font size in pixels (default 16)\n * @returns '#000000' for black text or '#ffffff' for white text\n */\nexport const getContrastTextColor = (\n colorProp: string, \n fontWeight: number = 400, \n fontSize: number = 16\n): string => {\n // Get background color RGB\n const bgRgb = getEffectiveRgb(colorProp)\n const bgY = sRGBtoY(bgRgb.r, bgRgb.g, bgRgb.b)\n \n // Test black text (0,0,0) and white text (255,255,255)\n const blackY = sRGBtoY(0, 0, 0)\n const whiteY = sRGBtoY(255, 255, 255)\n \n const blackContrast = Math.abs(calcAPCA(blackY, bgY))\n const whiteContrast = Math.abs(calcAPCA(whiteY, bgY))\n \n // Get appropriate threshold based on font characteristics\n const threshold = getAPCAThreshold(fontWeight, fontSize)\n \n // Choose text color based on which provides better contrast\n if (blackContrast >= threshold && whiteContrast >= threshold) {\n // Both work, choose the one with higher contrast\n return blackContrast > whiteContrast ? '#000000' : '#ffffff'\n } else if (blackContrast >= threshold) {\n return '#000000'\n } else if (whiteContrast >= threshold) {\n return '#ffffff'\n } else {\n // Neither meets ideal threshold, choose the better one\n return blackContrast > whiteContrast ? '#000000' : '#ffffff'\n }\n}\n\n/**\n * Check if a color combination meets WCAG 3.0 APCA standards\n * @param textColor Text color (RGB object or hex string)\n * @param backgroundColor Background color (RGB object or hex string)\n * @param fontWeight Font weight (300-900, default 400)\n * @param fontSize Font size in pixels (default 16)\n * @returns boolean indicating if contrast is sufficient\n */\nexport const meetsAPCAStandard = (\n textColor: { r: number; g: number; b: number } | string,\n backgroundColor: { r: number; g: number; b: number } | string,\n fontWeight: number = 400,\n fontSize: number = 16\n): boolean => {\n const contrast = Math.abs(getAPCAContrast(textColor, backgroundColor))\n const threshold = getAPCAThreshold(fontWeight, fontSize)\n \n return contrast >= threshold\n}\n\n/**\n * Generate color value from color prop (for CSS generation)\n */\nexport const getColorValue = (color: string): string => {\n // Handle color with shade (e.g., 'red-600')\n if (color.includes('-')) {\n const [colorName, shade] = color.split('-')\n const baseColor = colorMap[colorName]\n if (baseColor && shade) {\n const shadeNum = parseInt(shade, 10)\n \n // Generate proper shade variations with fallbacks\n if (shadeNum === 500) {\n return baseColor // Base color\n }\n \n // Use CSS color-mix for better browser support with fallbacks\n if (shadeNum < 500) {\n // Lighter shades - mix with white (gentle progression)\n const mixPercent = Math.round(((500 - shadeNum) / 400) * 45) // Gentler progression\n const clampedPercent = Math.min(Math.max(mixPercent, 3), 45) // Reduced extremes\n return `color-mix(in srgb, ${baseColor} ${100 - clampedPercent}%, white ${clampedPercent}%)`\n } else {\n // Darker shades - mix with black (gentle progression)\n const mixPercent = Math.round(((shadeNum - 500) / 450) * 45) // Gentler progression\n const clampedPercent = Math.min(Math.max(mixPercent, 3), 45) // Reduced extremes\n return `color-mix(in srgb, ${baseColor} ${100 - clampedPercent}%, black ${clampedPercent}%)`\n }\n }\n }\n \n // Handle color with opacity (e.g., 'red/50')\n if (color.includes('/')) {\n const [colorName, opacity] = color.split('/')\n const baseColor = colorMap[colorName] || colorName\n const opacityPercent = parseInt(opacity, 10)\n // Provide fallback for browsers without relative color support\n const fallbackColor = colorMap[colorName] || colorName\n return `light-dark(hsl(from ${baseColor} h s l / ${opacityPercent}%), color-mix(in srgb, ${fallbackColor} ${opacityPercent}%, transparent))`\n }\n \n // Return base color or fallback to CSS custom property\n return colorMap[color] || `var(--color-${color}, ${color})`\n}","<template>\n <button \n :type=\"type\" \n :disabled=\"disabled || loading\" \n :class=\"buttonClasses\" \n :style=\"buttonStyles\"\n @click=\"$emit('click', $event)\"\n >\n <span v-if=\"loading\" class=\"button-loading-content\">\n <svg class=\"button-loading-icon\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"button-loading-track\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\" />\n <path class=\"button-loading-spinner\" 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=\"button-content\">\n <slot name=\"icon\" />\n <slot />\n </span>\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { getContrastTextColor, getColorValue } from '../utils/contrast'\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 * Color prop supports multiple formats:\n * - Base colors: 'red', 'blue', 'green', 'strands', etc.\n * - Shades: 'red-600', 'blue-500', etc. (100-950)\n * - Opacity: 'red/50', 'blue/80', etc. (0-100)\n * Uses CSS relative color syntax for dynamic shading and opacity\n */\n color?: string\n /**\n * Font weight for the button text\n * Affects WCAG 3.0 APCA contrast calculation thresholds\n * Higher weights require less contrast\n */\n fontWeight?: 400 | 500 | 600 | 700\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 fontWeight: 600\n})\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\n// Get hover color using color-mix for better browser support\nconst getHoverColor = (color: string): string => {\n const baseColor = getColorValue(color)\n // Use color-mix to darken by mixing with black for better browser support\n return `color-mix(in srgb, ${baseColor} 85%, black 15%)`\n}\n\n// Get hover contrast color for the darker hover state\nconst getHoverContrastColor = (color: string, fontWeight: number, fontSize: number): string => {\n // For hover state, we calculate contrast against a darker version\n const hoverColorForContrast = color.includes('-') \n ? `${color.split('-')[0]}-${Math.min(parseInt(color.split('-')[1]) + 100, 950)}` \n : `${color}-600`\n return getContrastTextColor(hoverColorForContrast, fontWeight, fontSize)\n}\n\n// Get light variant for ghost/outline hover states\nconst getLightColor = (color: string): string => {\n const baseColor = getColorValue(color)\n // Use relative color with high lightness and low opacity\n return `hsl(from ${baseColor} h s 95% / 0.8)`\n}\n\nconst buttonClasses = computed(() => {\n const classes = [\n 'ui-button',\n `ui-button-${props.variant}`,\n `ui-button-${props.size}`,\n props.fullWidth ? 'ui-button-full-width' : '',\n props.color ? 'ui-button-custom-color' : ''\n ].filter(Boolean).join(' ')\n\n return classes\n})\n\n// Get font characteristics based on button size\nconst getFontCharacteristics = (size: string) => {\n switch (size) {\n case 'sm':\n return { fontSize: 14 } // 0.875rem = 14px\n case 'lg':\n return { fontSize: 16 } // 1rem = 16px\n default: // 'md'\n return { fontSize: 14 } // 0.875rem = 14px\n }\n}\n\n// Computed styles for dynamic color support\nconst buttonStyles = computed(() => {\n if (!props.color) return {}\n \n const { fontSize } = getFontCharacteristics(props.size)\n const fontWeight = props.fontWeight || 600\n \n const primaryColor = getColorValue(props.color)\n const hoverColor = getHoverColor(props.color)\n const lightColor = getLightColor(props.color)\n const contrastColor = getContrastTextColor(props.color || 'gray', fontWeight, fontSize)\n const hoverContrastColor = getHoverContrastColor(props.color || 'gray', fontWeight, fontSize)\n \n // For secondary buttons, we need to calculate contrast against the light background\n // The light background is very light, so we'll use a much lighter version for contrast calculation\n const lightColorForContrast = `${props.color}-100` // Use the 100 shade for contrast calculation\n const lightContrastColor = getContrastTextColor(lightColorForContrast, fontWeight, fontSize)\n \n const baseStyles = {\n '--button-color': primaryColor,\n '--button-hover-color': hoverColor,\n '--button-light-color': lightColor,\n '--button-contrast-color': contrastColor,\n '--button-hover-contrast-color': hoverContrastColor,\n '--button-light-contrast-color': lightContrastColor,\n fontWeight: fontWeight\n }\n \n switch (props.variant) {\n case 'primary':\n return {\n ...baseStyles,\n backgroundColor: primaryColor,\n color: contrastColor,\n boxShadow: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n '--button-text-color': contrastColor\n }\n case 'secondary':\n return {\n ...baseStyles,\n backgroundColor: lightColor,\n color: lightContrastColor,\n border: `1px solid ${getLightColor(props.color)}`,\n '--button-text-color': lightContrastColor\n }\n case 'ghost':\n return {\n ...baseStyles,\n color: primaryColor,\n backgroundColor: 'transparent',\n '--button-text-color': primaryColor\n }\n case 'outline':\n return {\n ...baseStyles,\n borderColor: primaryColor,\n color: primaryColor,\n backgroundColor: 'transparent',\n borderWidth: '1px',\n borderStyle: 'solid',\n '--button-text-color': primaryColor\n }\n default:\n return {\n ...baseStyles,\n backgroundColor: primaryColor,\n color: contrastColor,\n '--button-text-color': contrastColor\n }\n }\n})\n</script>\n\n<style scoped>\n/* Base button styles */\n.ui-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n transition: all 0.15s ease;\n border: none;\n cursor: pointer;\n text-decoration: none;\n outline: none;\n position: relative;\n}\n\n.ui-button:focus-visible {\n outline: 2px solid var(--strands-primary, #EA00A8);\n outline-offset: 2px;\n}\n\n.ui-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Size variants */\n.ui-button-sm {\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n border-radius: 0.375rem;\n}\n\n.ui-button-md {\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n border-radius: 0.5rem;\n}\n\n.ui-button-lg {\n padding: 0.75rem 1.5rem;\n font-size: 1rem;\n border-radius: 0.5rem;\n}\n\n/* Width variant */\n.ui-button-full-width {\n width: 100%;\n}\n\n/* Color variants */\n.ui-button-primary {\n background-color: #EA00A8;\n color: white;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n.ui-button-primary:hover:not(:disabled) {\n background-color: #B8006F;\n box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.15);\n transform: translateY(-1px);\n}\n\n.ui-button-secondary {\n background-color: #f3f4f6;\n color: #374151;\n border: 1px solid #d1d5db;\n}\n\n.ui-button-secondary:hover:not(:disabled) {\n background-color: #e5e7eb;\n border-color: #9ca3af;\n box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.08);\n transform: translateY(-0.5px);\n}\n\n.ui-button-ghost {\n background-color: transparent;\n color: var(--strands-primary, #EA00A8);\n}\n\n.ui-button-ghost:hover:not(:disabled) {\n background-color: rgba(234, 0, 168, 0.1);\n color: #B8006F;\n transform: translateY(-0.5px);\n}\n\n.ui-button-outline {\n background-color: transparent;\n color: var(--strands-primary, #EA00A8);\n border: 1px solid var(--strands-primary, #EA00A8);\n}\n\n.ui-button-outline:hover:not(:disabled) {\n background-color: var(--strands-primary, #EA00A8);\n color: white;\n box-shadow: 0 2px 6px 0 rgba(234, 0, 168, 0.25);\n transform: translateY(-0.5px);\n}\n\n/* Custom color support with relative colors */\n.ui-button-custom-color {\n /* Styles will be applied via the style attribute using CSS custom properties */\n}\n\n.ui-button-custom-color:hover:not(:disabled) {\n background-color: var(--button-hover-color) !important;\n color: var(--button-hover-contrast-color) !important;\n box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.12) !important;\n transform: translateY(-1px);\n}\n\n.ui-button-custom-color.ui-button-primary:hover:not(:disabled) {\n box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.15) !important;\n}\n\n.ui-button-custom-color.ui-button-ghost:hover:not(:disabled) {\n background-color: var(--button-light-color) !important;\n color: var(--button-color) !important;\n}\n\n.ui-button-custom-color.ui-button-outline:hover:not(:disabled) {\n background-color: var(--button-color) !important;\n color: white !important;\n}\n\n.ui-button-custom-color.ui-button-secondary:hover:not(:disabled) {\n background-color: var(--button-color) !important;\n color: white !important;\n}\n\n/* Content styles */\n.button-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n color: inherit;\n}\n\n.button-loading-content {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n color: inherit;\n}\n\n.button-loading-icon {\n width: 1rem;\n height: 1rem;\n animation: spin 1s linear infinite;\n}\n\n.button-loading-track {\n opacity: 0.25;\n}\n\n.button-loading-spinner {\n opacity: 0.75;\n}\n\n/* Animations */\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Active state */\n.ui-button:active:not(:disabled) {\n transform: translateY(1px);\n}\n\n/* Loading state */\n.ui-button:has(.button-loading-content) {\n position: relative;\n}\n\n/* Utility classes for compatibility */\n.ui-button.w-full {\n width: 100%;\n}\n\n.ui-button.mt-4 {\n margin-top: 1rem;\n}\n\n.ui-button.mr-2 {\n margin-right: 0.5rem;\n}\n\n.ui-button.ml-3 {\n margin-left: 0.75rem;\n}\n\n@media (min-width: 640px) {\n .ui-button.sm\\:w-auto {\n width: auto;\n }\n}\n\n/* Additional utility support */\n.ui-button.mfa-setup-method-button {\n width: 100%;\n margin-top: 1rem;\n}\n\n.ui-button.hardware-key-setup-method-button {\n width: 100%;\n margin-top: 1rem;\n}\n\n.ui-button.profile-method-button {\n width: 100%;\n margin-top: 1rem;\n}\n</style>","<template>\n <div \n class=\"ui-card\"\n :class=\"[\n `ui-card-${variant}`,\n `ui-card-padding-${padding}`,\n `ui-card-shadow-${shadow}`\n ]\">\n <div v-if=\"$slots['header']\" class=\"ui-card-header\">\n <slot name=\"header\" />\n </div>\n\n <div class=\"ui-card-content\">\n <slot />\n </div>\n\n <div v-if=\"$slots['footer']\" class=\"ui-card-footer\">\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' | 'clean'\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\n// Card styling is handled by CSS classes\n</script>\n\n<style scoped>\n.ui-card {\n background: white;\n color: black;\n border: 1px solid #e5e7eb;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n/* Variants */\n.ui-card-default {\n border-radius: 0.5rem;\n}\n\n.ui-card-modern {\n border-radius: 1rem;\n box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n backdrop-filter: blur(16px);\n}\n\n.ui-card-minimal {\n border-radius: 0.375rem;\n}\n\n.ui-card-clean {\n background: transparent;\n border: none;\n box-shadow: none;\n}\n\n/* Padding */\n.ui-card-padding-sm {\n padding: 1rem;\n}\n\n.ui-card-padding-md {\n padding: 1.5rem;\n}\n\n.ui-card-padding-lg {\n padding: 2rem;\n}\n\n/* Shadows */\n.ui-card-shadow-none {\n box-shadow: none;\n}\n\n.ui-card-shadow-sm {\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.ui-card-shadow-md {\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\n}\n\n.ui-card-shadow-lg {\n box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);\n}\n\n/* Header and Footer */\n.ui-card-header {\n border-bottom: 1px solid #e5e7eb;\n padding-bottom: 1rem;\n}\n\n.ui-card-footer {\n border-top: 1px solid #e5e7eb;\n padding-top: 1rem;\n}\n\n.ui-card-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <div class=\"input-container\">\n <label v-if=\"label\" :for=\"inputId\" class=\"input-label\">\n {{ label }}\n <span v-if=\"required\" class=\"input-required\">*</span>\n </label>\n\n <div class=\"input-wrapper\">\n <input :id=\"inputId\" :type=\"computedType\" :value=\"modelValue\" :placeholder=\"placeholder\" :disabled=\"disabled\"\n :required=\"required\" :autocomplete=\"autocomplete\" :name=\"name\" :inputmode=\"inputmode\" :maxlength=\"maxlength\" :class=\"inputClasses\" @input=\"handleInput\"\n @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\" @keydown=\"$emit('keydown', $event)\" />\n\n <!-- Password visibility toggle -->\n <button v-if=\"type === 'password'\" type=\"button\"\n class=\"input-password-toggle\"\n @click=\"togglePasswordVisibility\">\n <svg v-if=\"showPassword\" class=\"input-toggle-icon\" 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=\"input-toggle-icon\" 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=\"input-icon-container\">\n <slot name=\"icon\" />\n </div>\n </div>\n\n <!-- Help text or error message -->\n <p v-if=\"error\" class=\"input-error-text\">{{ typeof error === 'string' ? error : error.message }}</p>\n <p v-else-if=\"helpText\" class=\"input-help-text\">{{ helpText }}</p>\n </div>\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 | { message: string }\n helpText?: string\n autocomplete?: string\n name?: string\n inputmode?: 'text' | 'numeric' | 'decimal' | 'tel' | 'search' | 'email' | 'url'\n maxlength?: number | 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 keydown: [event: KeyboardEvent]\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 'input-field'\n ]\n\n // Size classes\n const sizeClasses = {\n sm: 'input-size-sm',\n md: 'input-size-md', // default styling\n lg: 'input-size-lg'\n }\n\n // Error state\n const errorClasses = props.error\n ? 'input-error'\n : ''\n\n // Icon padding\n const iconPadding = slots['icon'] ? 'input-with-icon' : ''\n const passwordPadding = props.type === 'password' ? 'input-with-password' : ''\n\n return [\n ...baseClasses,\n sizeClasses[props.size],\n errorClasses,\n iconPadding,\n passwordPadding\n ].filter(Boolean).join(' ')\n})\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n\nconst togglePasswordVisibility = () => {\n showPassword.value = !showPassword.value\n}\n</script>\n\n<style scoped>\n/* Input Component Semantic CSS */\n.input-container {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.input-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n margin-bottom: 0.5rem;\n}\n\n.input-required {\n color: #dc2626;\n}\n\n.input-wrapper {\n position: relative;\n}\n\n.input-field {\n width: 100%;\n padding: 0.75rem 1rem;\n border: 1px solid #d1d5db;\n border-radius: 0.5rem;\n background-color: white;\n color: #111827;\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n outline: none;\n}\n\n.input-size-sm {\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n}\n\n.input-size-md {\n padding: 0.75rem 1rem;\n font-size: 0.875rem;\n}\n\n.input-size-lg {\n padding: 0.75rem 1rem;\n font-size: 1rem;\n}\n\n.input-error {\n border-color: #fca5a5;\n}\n\n.input-with-icon {\n padding-left: 2.5rem;\n}\n\n.input-with-password {\n padding-right: 2.5rem;\n}\n\n.input-icon-container {\n position: absolute;\n inset: 0 auto 0 0;\n padding-left: 0.75rem;\n display: flex;\n align-items: center;\n pointer-events: none;\n}\n\n.input-error-text {\n font-size: 0.875rem;\n color: #dc2626;\n}\n\n.input-help-text {\n font-size: 0.875rem;\n color: #6b7280;\n}\n\n/* \n BITWARDEN & PASSWORD MANAGER STYLE PREVENTION\n =============================================\n \n These styles use !important to prevent password managers (Bitwarden, 1Password, etc.)\n from overriding our input styling. Password managers often inject their own CSS that\n can break our design system.\n \n If you need to modify input styles, edit these CSS rules rather than just the Tailwind\n classes, as password managers may override the Tailwind classes.\n*/\n\n/* Base input styles - override password manager modifications */\ninput[type=\"email\"],\ninput[type=\"password\"],\ninput[type=\"text\"],\ninput[type=\"number\"],\ninput[type=\"tel\"],\ninput[type=\"url\"] {\n /* Force our styles to take precedence over password manager modifications */\n background-color: white !important;\n background-image: none !important;\n border: 1px solid var(--gray-300) !important;\n border-radius: var(--radius-lg) !important;\n box-shadow: var(--shadow-sm) !important;\n color: var(--gray-900) !important;\n font-family: inherit !important;\n font-size: var(--text-sm) !important;\n line-height: 1.25rem !important;\n padding: var(--space-3) var(--space-4) !important;\n transition: border-color 0.2s, box-shadow 0.2s !important;\n width: 100% !important;\n}\n\n/* Focus state overrides */\ninput[type=\"email\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"url\"]:focus {\n border-color: var(--strands-500) !important;\n box-shadow: 0 0 0 2px rgba(234, 0, 168, 0.2) !important;\n outline: none !important;\n}\n\n/* Error state overrides */\ninput.input-error {\n border-color: var(--red-300) !important;\n}\n\ninput.input-error:focus {\n border-color: var(--red-500) !important;\n box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2) !important;\n}\n\n/* Disabled state overrides */\ninput:disabled {\n background-color: var(--gray-50) !important;\n color: var(--gray-500) !important;\n cursor: not-allowed !important;\n}\n\n/* Bitwarden and other password manager specific overrides */\ninput[data-bwautofill],\ninput[data-lpignore],\ninput[data-form-type],\ninput[data-1p-ignore] {\n background-color: white !important;\n background-image: none !important;\n border: 1px solid rgb(209 213 219) !important;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05) !important;\n}\n\n/* Override webkit autofill styling */\ninput:-webkit-autofill,\ninput:-webkit-autofill:hover,\ninput:-webkit-autofill:focus,\ninput:-webkit-autofill:active {\n -webkit-box-shadow: 0 0 0 30px white inset !important;\n -webkit-text-fill-color: black !important;\n border: 1px solid rgb(209 213 219) !important;\n border-radius: 0.5rem !important;\n transition: background-color 5000s ease-in-out 0s !important;\n}\n\n/* Ensure password inputs have proper padding for our eye icon */\ninput[type=\"password\"] {\n padding-right: 2.5rem !important; /* pr-10 for our eye icon */\n}\n\n/* Hide browser password reveal buttons */\ninput::-ms-reveal,\ninput::-ms-clear {\n display: none !important;\n}\n\n/* Additional size-specific overrides to maintain consistency */\ninput.px-3.py-2 {\n padding: 0.5rem 0.75rem !important; /* sm size */\n}\n\ninput.px-3.py-2\\.5 {\n padding: 0.625rem 0.75rem !important; /* md size - default */\n}\n\ninput.px-4.py-3 {\n padding: 0.75rem 1rem !important; /* lg size */\n}\n\n/* Icon padding overrides */\ninput.pl-10 {\n padding-left: 2.5rem !important;\n}\n\ninput.pr-10 {\n padding-right: 2.5rem !important;\n}\n\n/* Password toggle button styling */\n.input-password-toggle {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n padding-right: 0.75rem;\n color: #9ca3af;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 0.375rem;\n transition: color 0.2s ease;\n}\n\n.input-password-toggle:hover {\n color: #6b7280;\n}\n\n.input-password-toggle:focus-visible {\n outline: 2px solid var(--strands-500);\n outline-offset: 2px;\n}\n\n.input-toggle-icon {\n width: 1.25rem;\n height: 1.25rem;\n flex-shrink: 0;\n}\n</style>\n","<template>\n <component :is=\"tag\" \n class=\"ui-link\"\n :class=\"[\n `ui-link-${variant}`,\n `ui-link-${size}`,\n { 'ui-link-disabled': disabled },\n { 'ui-link-custom-color': color }\n ]\"\n :style=\"linkStyles\"\n v-bind=\"linkProps\" \n @click=\"handleClick\">\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { getContrastTextColor, getColorValue } from '../utils/contrast'\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 * Color prop supports multiple formats (similar to UiButton):\n * - Base colors: 'red', 'blue', 'green', 'strands', etc.\n * - Shades: 'red-600', 'blue-500', etc. (100-950)\n * - Opacity: 'red/50', 'blue/80', etc. (0-100)\n */\n color?: string\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\n// Color generation is now handled by the utility\n\n// Get hover color using color-mix for better browser support\nconst getHoverColor = (color: string): string => {\n const baseColor = getColorValue(color)\n // Use color-mix to darken by mixing with black for better browser support\n return `color-mix(in srgb, ${baseColor} 85%, black 15%)`\n}\n\n// Contrast and color generation now handled by utility imports\n\n// Computed styles for dynamic color support\nconst linkStyles = computed(() => {\n if (!props.color) return {}\n \n const primaryColor = getColorValue(props.color)\n const hoverColor = getHoverColor(props.color)\n \n const baseStyles = {\n '--link-color': primaryColor,\n '--link-hover-color': hoverColor,\n color: primaryColor\n }\n \n if (props.variant === 'underline') {\n return {\n ...baseStyles,\n textDecorationColor: primaryColor\n }\n }\n \n return baseStyles\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n}\n</script>\n\n<style scoped>\n.ui-link {\n display: inline-flex;\n align-items: center;\n font-weight: 500;\n text-decoration: none;\n transition: color 0.2s ease, text-decoration 0.2s ease;\n cursor: pointer;\n background: none;\n border: none;\n padding: 0;\n line-height: inherit;\n}\n\n.ui-link:focus-visible {\n outline: 2px solid #EA00A8;\n outline-offset: 2px;\n border-radius: 2px;\n}\n\n.ui-link-disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* Sizes */\n.ui-link-sm {\n font-size: 0.75rem;\n}\n\n.ui-link-md {\n font-size: 0.875rem;\n}\n\n.ui-link-lg {\n font-size: 1rem;\n}\n\n/* Variants */\n.ui-link-primary {\n color: #EA00A8;\n background: none;\n border: none;\n padding: 0;\n}\n\n.ui-link-primary:hover {\n color: #B8006F;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.ui-link-secondary {\n color: #6b7280;\n background: none;\n border: none;\n padding: 0;\n}\n\n.ui-link-secondary:hover {\n color: #1f2937;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n\n.ui-link-ghost {\n color: #6b7280;\n background: none;\n border: none;\n padding: 0;\n position: relative;\n}\n\n.ui-link-ghost:hover {\n color: #374151;\n}\n\n.ui-link-ghost::after {\n content: '';\n position: absolute;\n bottom: -2px;\n left: 0;\n width: 0;\n height: 1px;\n background-color: #374151;\n transition: width 0.3s ease;\n}\n\n.ui-link-ghost:hover::after {\n width: 100%;\n}\n\n.ui-link-underline {\n color: #EA00A8;\n text-decoration: underline;\n text-decoration-color: #EA00A8;\n text-underline-offset: 2px;\n background: none;\n border: none;\n padding: 0;\n}\n\n.ui-link-underline:hover {\n color: #B8006F;\n text-decoration-color: #B8006F;\n}\n\n/* Icon support */\n.ui-link svg {\n flex-shrink: 0;\n}\n\n/* Custom color support with relative colors */\n.ui-link-custom-color {\n color: var(--link-color);\n}\n\n.ui-link-custom-color:hover:not(.ui-link-disabled) {\n color: var(--link-hover-color);\n}\n\n.ui-link-custom-color.ui-link-underline {\n text-decoration-color: var(--link-color);\n}\n\n.ui-link-custom-color.ui-link-underline:hover:not(.ui-link-disabled) {\n text-decoration-color: var(--link-hover-color);\n}\n</style>\n","<template>\n <div class=\"tabs-container\">\n <div class=\"tabs-wrapper\">\n <!-- Tab List -->\n <div class=\"tabs-list\" role=\"tablist\">\n <button v-for=\"(tab, index) in tabs\" :key=\"tab.value\" ref=\"tabButtons\" \n class=\"tab-button\"\n :class=\"{ 'tab-button-active': modelValue === tab.value }\"\n :aria-selected=\"modelValue === tab.value\" \n :aria-controls=\"`tabpanel-${tab.value}`\" \n :id=\"`tab-${tab.value}`\"\n role=\"tab\" \n @click=\"handleTabClick(tab.value, index)\">\n {{ tab.label }}\n </button>\n\n <!-- Animated stretching underline -->\n <div class=\"tab-underline\" :style=\"underlineStyle\" />\n </div>\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\n<style scoped>\n.tabs-container {\n /* Container styling if needed */\n}\n\n.tabs-wrapper {\n position: relative;\n}\n\n.tabs-list {\n position: relative;\n display: flex;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.tab-button {\n position: relative;\n flex: 1;\n padding: 1rem 1.5rem;\n font-weight: 500;\n font-size: 0.875rem;\n color: #6b7280;\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.tab-button:hover {\n color: #EA00A8;\n}\n\n.tab-button:focus-visible {\n outline: none;\n color: #EA00A8;\n}\n\n.tab-button-active {\n color: #EA00A8;\n}\n\n.tab-underline {\n position: absolute;\n bottom: -3px;\n height: 5px;\n background-color: #EA00A8;\n border-radius: 9999px;\n transition: all 0.15s ease;\n}\n</style>\n","export default \"<svg width=\\\"302\\\" height=\\\"438\\\" viewBox=\\\"0 0 302 438\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<path d=\\\"M71.5001 96C71.5001 96 132 106 137 61.5C142 17 117.5 3.50005 94.5001 1.50003C71.5001 -0.499996 16.0001 8.5 2.00014 72.5C-6.5 130.5 71.5003 227.5 165 218C258.5 208.5 280.758 148.5 283.5 121C286.242 93.5 277.5 61.5 238.5 61.5C153 61.5 150.501 185 170.5 235C190.5 285 199 279 213 314C227.001 349 217.296 411.458 183 427C129.456 450.65 92 426 78.5 407.5C65 389 68.0003 357 94.5001 344.5C121 332 212.41 393.5 301.5 361\\\" stroke=\\\"black\\\"/>\\n</svg>\\n\"","<template>\n <div class=\"loader-container\" :class=\"{ 'loader-centered': centered }\">\n <div class=\"loader-icon\">\n <!-- Simple SVG with fun animated path -->\n <svg :width=\"size\" :height=\"size\" viewBox=\"0 0 500 500\">\n <!-- Fun wavy path inspired by Strands -->\n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"semiColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n \n <path\n :d=\"d\"\n fill=\"none\"\n :stroke=\"solidColor\"\n :stroke-width=\"weight\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n class=\"loader-animated-path\"\n transform=\"translate(81, 13) scale(1.0)\"\n />\n </svg>\n </div>\n \n <!-- Optional text -->\n <p v-if=\"text\" class=\"loader-text\" :class=\"{ [`loader-text-${variant}`]: variant !== 'auto' }\">{{ text }}</p>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\n\nimport logo from '../../../assets/strands_icon_path.svg?raw'\n\nconst path = logo.replace(/<svg[^>]*>/, '').replace(/<\\/svg>/, '').trim()\nconst d = path.match(/d=\"([^\"]*)\"/)?.[1] || ''\n\ninterface Props {\n size?: number\n variant?: 'light' | 'dark' | 'auto'\n text?: string\n centered?: boolean\n weight?: number\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 80,\n variant: 'auto',\n centered: true,\n weight: 30,\n});\n\n// Computed colors for the loader animation\n\nconst semiColor = computed(() => \n props.variant === 'light' ? '#EA00A810'\n : props.variant === 'dark' ? '#ffffff10'\n : '#ffffff10'\n)\n\nconst solidColor = computed(() => \n props.variant === 'light' ? '#EA00A8'\n : props.variant === 'dark' ? '#ffffff'\n : '#ffffff'\n)\n</script>\n\n<style scoped>\n.loader-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1rem;\n}\n\n.loader-centered {\n justify-content: center;\n}\n\n.loader-icon {\n position: relative;\n}\n\n.loader-text {\n font-size: 0.875rem;\n font-weight: 500;\n color: #6b7280;\n}\n\n.loader-text-light {\n color: #6b7280;\n}\n\n.loader-text-dark {\n color: #d1d5db;\n}\n\n@keyframes draw-line {\n 0% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: 1000;\n }\n 100% {\n stroke-dasharray: 100 1000;\n stroke-dashoffset: -100;\n }\n}\n\n.loader-animated-path {\n animation: draw-line 0.8s linear infinite;\n}\n</style>","<template>\n <button\n type=\"button\"\n :class=\"toggleClasses\"\n :aria-pressed=\"modelValue\"\n :aria-labelledby=\"id ? `${id}-label` : undefined\"\n @click=\"handleToggle\"\n >\n <span class=\"ui-toggle-thumb\" :class=\"thumbClasses\" />\n </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\ninterface Props {\n modelValue?: boolean\n disabled?: boolean\n id?: string\n}\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: false,\n disabled: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst toggleClasses = computed(() => [\n 'ui-toggle',\n {\n 'ui-toggle--on': props.modelValue,\n 'ui-toggle--off': !props.modelValue,\n 'ui-toggle--disabled': props.disabled\n }\n])\n\nconst thumbClasses = computed(() => [\n {\n 'ui-toggle-thumb--on': props.modelValue,\n 'ui-toggle-thumb--off': !props.modelValue\n }\n])\n\nconst handleToggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n</script>\n\n<style scoped>\n.ui-toggle {\n position: relative;\n display: inline-flex;\n align-items: center;\n width: 2.75rem;\n height: 1.5rem;\n border: 2px solid transparent;\n border-radius: 9999px;\n cursor: pointer;\n transition: all 0.2s ease-in-out;\n outline: none;\n background-color: transparent;\n padding: 0;\n}\n\n.ui-toggle:focus {\n box-shadow: 0 0 0 3px rgba(234, 0, 168, 0.1);\n}\n\n.ui-toggle--off {\n background-color: #d1d5db;\n}\n\n.ui-toggle--on {\n background-color: #ea00a8;\n}\n\n.ui-toggle--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.ui-toggle-thumb {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n background-color: white;\n border-radius: 50%;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n transition: transform 0.2s ease-in-out;\n}\n\n.ui-toggle-thumb--off {\n transform: translateX(0);\n}\n\n.ui-toggle-thumb--on {\n transform: translateX(1.25rem);\n}\n\n/* Dark mode support */\n@media (prefers-color-scheme: dark) {\n .ui-toggle--off {\n background-color: #4b5563;\n }\n \n .ui-toggle-thumb {\n background-color: #f9fafb;\n }\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <div class=\"avatar-editor-simple\">\n <!-- File Upload Area -->\n <div v-if=\"!imageData\" \n class=\"upload-area\"\n @click=\"triggerFileUpload\" \n @drop=\"handleDrop\" \n @dragover.prevent \n @dragenter.prevent>\n <div class=\"upload-content\">\n <svg class=\"upload-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" \n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n <h3 class=\"upload-title\">Upload your photo</h3>\n <p class=\"upload-subtitle\">Drag and drop or click to browse</p>\n <div class=\"upload-formats\">\n <span class=\"format-tag\">JPG</span>\n <span class=\"format-tag\">PNG</span>\n <span class=\"format-tag\">GIF</span>\n </div>\n </div>\n <input\n ref=\"fileInput\"\n type=\"file\"\n accept=\"image/*\"\n class=\"hidden-input\"\n @change=\"handleFileSelect\"\n />\n </div>\n\n <!-- Image Editor -->\n <div v-else class=\"editor-container\">\n <div class=\"editor-main\">\n <!-- Canvas with fixed circular crop -->\n <div class=\"canvas-container\">\n <canvas\n ref=\"canvas\"\n :width=\"canvasSize\"\n :height=\"canvasSize\"\n class=\"canvas\"\n @mousedown=\"startDrag\"\n @wheel=\"handleWheel\"\n />\n <!-- Fixed circular overlay -->\n <div class=\"crop-overlay\">\n <svg class=\"crop-svg\">\n <defs>\n <mask id=\"circle-mask\">\n <rect x=\"0\" y=\"0\" :width=\"canvasSize\" :height=\"canvasSize\" fill=\"white\" />\n <circle \n :cx=\"canvasSize / 2\" \n :cy=\"canvasSize / 2\" \n :r=\"cropRadius\" \n fill=\"black\" \n />\n </mask>\n </defs>\n <rect \n x=\"0\" \n y=\"0\" \n :width=\"canvasSize\" \n :height=\"canvasSize\" \n fill=\"black\" \n opacity=\"0.5\" \n mask=\"url(#circle-mask)\" \n />\n <circle \n :cx=\"canvasSize / 2\" \n :cy=\"canvasSize / 2\" \n :r=\"cropRadius\" \n fill=\"none\" \n stroke=\"white\" \n stroke-width=\"2\"\n class=\"crop-circle\"\n />\n </svg>\n </div>\n </div>\n\n <!-- Simple Controls -->\n <div class=\"controls\">\n <!-- Zoom Slider -->\n <div class=\"zoom-control\">\n <button @click=\"zoom = Math.max(minZoom, zoom - 0.1); constrainImagePosition(); updateCanvas()\" \n class=\"zoom-button\">\n <svg class=\"zoom-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 12H4\" />\n </svg>\n </button>\n <input\n type=\"range\"\n v-model.number=\"zoom\"\n :min=\"minZoom\"\n :max=\"maxZoom\"\n :step=\"0.01\"\n class=\"zoom-slider\"\n @input=\"constrainImagePosition(); updateCanvas()\"\n />\n <button @click=\"zoom = Math.min(maxZoom, zoom + 0.1); constrainImagePosition(); updateCanvas()\" \n class=\"zoom-button\">\n <svg class=\"zoom-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4v16m8-8H4\" />\n </svg>\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"action-buttons\">\n <button @click=\"resetImage\" class=\"btn-secondary\">\n Reset\n </button>\n <button @click=\"clearImage\" class=\"btn-secondary\">\n Change Photo\n </button>\n <button @click=\"cropAndUpload\" :disabled=\"uploading\" class=\"btn-primary\">\n {{ uploading ? 'Saving...' : 'Save Avatar' }}\n </button>\n </div>\n </div>\n </div>\n\n <!-- Preview -->\n <div class=\"preview-section\">\n <h3 class=\"preview-title\">Preview</h3>\n <div class=\"preview-container\">\n <canvas\n ref=\"previewCanvas\"\n :width=\"previewSize\"\n :height=\"previewSize\"\n class=\"preview-canvas\"\n />\n </div>\n <p class=\"preview-instructions\">\n Drag image to reposition<br>\n Scroll to zoom\n </p>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, onMounted, nextTick, watch } from 'vue'\n\ninterface Props {\n size?: number\n previewSize?: number\n maxFileSize?: number\n uploading?: boolean\n preselectedFile?: File | null\n}\n\ninterface Emits {\n (e: 'upload', file: File): void\n (e: 'error', error: string): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n size: 300,\n previewSize: 100,\n maxFileSize: 5 * 1024 * 1024, // 5MB\n uploading: false\n})\n\nconst emit = defineEmits<Emits>()\n\n// Refs\nconst fileInput = ref<HTMLInputElement>()\nconst canvas = ref<HTMLCanvasElement>()\nconst previewCanvas = ref<HTMLCanvasElement>()\n\n// State\nconst imageData = ref<string>('')\nconst originalImage = ref<HTMLImageElement>()\nconst canvasSize = ref(props.size)\nconst previewSize = ref(props.previewSize)\nconst cropRadius = ref(props.size / 2.5) // Fixed circular crop area\n\n// Image position and zoom\nconst imagePos = reactive({ x: 0, y: 0 })\nconst zoom = ref(1)\nconst minZoom = ref(0.1)\nconst maxZoom = ref(3)\n\n// Drag state\nconst isDragging = ref(false)\nconst isResetting = ref(false)\nconst dragStart = reactive({ x: 0, y: 0, imageX: 0, imageY: 0 })\n\nonMounted(() => {\n if (canvas.value) {\n const ctx = canvas.value.getContext('2d')\n if (ctx) {\n ctx.fillStyle = '#f9fafb'\n ctx.fillRect(0, 0, canvasSize.value, canvasSize.value)\n }\n }\n})\n\nconst triggerFileUpload = () => {\n fileInput.value?.click()\n}\n\nconst handleFileSelect = (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst handleDrop = (event: DragEvent) => {\n event.preventDefault()\n const file = event.dataTransfer?.files[0]\n if (file) {\n processFile(file)\n }\n}\n\nconst processFile = (file: File) => {\n // Validate file\n if (!file.type.startsWith('image/')) {\n emit('error', 'Please select an image file')\n return\n }\n\n if (file.size > props.maxFileSize) {\n emit('error', `File size must be less than ${Math.round(props.maxFileSize / 1024 / 1024)}MB`)\n return\n }\n\n // Read file\n const reader = new FileReader()\n reader.onload = (e) => {\n const result = e.target?.result as string\n loadImage(result)\n }\n reader.readAsDataURL(file)\n}\n\nconst loadImage = (dataUrl: string) => {\n imageData.value = dataUrl\n \n const img = new Image()\n img.onload = () => {\n originalImage.value = img\n \n // Disable watcher during initial load\n isResetting.value = true\n \n // Calculate initial zoom to ensure image covers the circular crop\n // The minimum zoom should ensure the image is large enough to cover the entire circle\n const scale = Math.max(\n (cropRadius.value * 2) / img.width,\n (cropRadius.value * 2) / img.height\n )\n \n const initialZoom = scale * 1.2 // Start slightly zoomed in for better coverage\n minZoom.value = scale // This is the minimum - image must cover the circle\n \n // Calculate and set position directly\n const scaledWidth = img.width * initialZoom\n const scaledHeight = img.height * initialZoom\n \n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Set the zoom\n zoom.value = initialZoom\n \n // Apply position constraints to ensure image covers the circle\n constrainImagePosition()\n \n // Re-enable watcher\n nextTick(() => {\n isResetting.value = false\n })\n \n // Update canvas\n nextTick(() => {\n updateCanvas()\n })\n }\n \n img.src = dataUrl\n}\n\nconst centerImage = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n // Center the image to the canvas center\n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Apply position constraints to ensure image covers the circle\n constrainImagePosition()\n}\n\nconst updateCanvas = () => {\n if (!originalImage.value || !canvas.value) return\n \n const ctx = canvas.value.getContext('2d')\n if (!ctx) return\n \n // Clear canvas\n ctx.fillStyle = '#f9fafb'\n ctx.fillRect(0, 0, canvasSize.value, canvasSize.value)\n \n // Draw image\n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n ctx.drawImage(img, imagePos.x, imagePos.y, scaledWidth, scaledHeight)\n \n // Update preview\n updatePreview()\n}\n\nconst updatePreview = () => {\n if (!originalImage.value || !previewCanvas.value || !canvas.value) return\n \n const previewCtx = previewCanvas.value.getContext('2d')\n if (!previewCtx) return\n \n // Clear preview\n previewCtx.fillStyle = '#ffffff'\n previewCtx.fillRect(0, 0, previewSize.value, previewSize.value)\n \n // Create circular clipping\n previewCtx.save()\n previewCtx.beginPath()\n previewCtx.arc(previewSize.value / 2, previewSize.value / 2, previewSize.value / 2, 0, Math.PI * 2)\n previewCtx.clip()\n \n // Calculate the crop area from the center of the canvas\n const cropX = canvasSize.value / 2 - cropRadius.value\n const cropY = canvasSize.value / 2 - cropRadius.value\n const cropSize = cropRadius.value * 2\n \n // Draw the cropped area to preview\n previewCtx.drawImage(\n canvas.value,\n cropX, cropY, cropSize, cropSize,\n 0, 0, previewSize.value, previewSize.value\n )\n \n previewCtx.restore()\n}\n\nconst startDrag = (event: MouseEvent) => {\n if (!originalImage.value) return\n \n isDragging.value = true\n dragStart.x = event.clientX\n dragStart.y = event.clientY\n dragStart.imageX = imagePos.x\n dragStart.imageY = imagePos.y\n \n document.addEventListener('mousemove', handleDrag)\n document.addEventListener('mouseup', stopDrag)\n}\n\nconst constrainImagePosition = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n const scaledWidth = img.width * zoom.value\n const scaledHeight = img.height * zoom.value\n \n // Calculate the bounds to ensure the image always covers the circle\n const circleLeft = canvasSize.value / 2 - cropRadius.value\n const circleTop = canvasSize.value / 2 - cropRadius.value\n const circleRight = canvasSize.value / 2 + cropRadius.value\n const circleBottom = canvasSize.value / 2 + cropRadius.value\n \n // The image's right edge must be at least at the circle's right edge\n const maxX = circleRight - scaledWidth\n // The image's left edge must be at most at the circle's left edge\n const minX = circleLeft\n \n // The image's bottom edge must be at least at the circle's bottom edge\n const maxY = circleBottom - scaledHeight\n // The image's top edge must be at most at the circle's top edge\n const minY = circleTop\n \n // Apply constraints\n imagePos.x = Math.min(minX, Math.max(maxX, imagePos.x))\n imagePos.y = Math.min(minY, Math.max(maxY, imagePos.y))\n}\n\nconst handleDrag = (event: MouseEvent) => {\n if (!isDragging.value) return\n \n const deltaX = event.clientX - dragStart.x\n const deltaY = event.clientY - dragStart.y\n \n imagePos.x = dragStart.imageX + deltaX\n imagePos.y = dragStart.imageY + deltaY\n \n // Apply position constraints to keep image within bounds\n constrainImagePosition()\n \n updateCanvas()\n}\n\nconst stopDrag = () => {\n isDragging.value = false\n document.removeEventListener('mousemove', handleDrag)\n document.removeEventListener('mouseup', stopDrag)\n}\n\nconst handleWheel = (event: WheelEvent) => {\n event.preventDefault()\n \n const delta = event.deltaY > 0 ? -0.05 : 0.05\n const newZoom = Math.max(minZoom.value, Math.min(maxZoom.value, zoom.value + delta))\n \n if (newZoom !== zoom.value && originalImage.value) {\n // Zoom from the center of the current image\n const img = originalImage.value\n const currentWidth = img.width * zoom.value\n const currentHeight = img.height * zoom.value\n \n // Calculate current image center\n const imageCenterX = imagePos.x + currentWidth / 2\n const imageCenterY = imagePos.y + currentHeight / 2\n \n // Calculate new dimensions\n const newWidth = img.width * newZoom\n const newHeight = img.height * newZoom\n \n // Update position to keep the image center at the same location\n imagePos.x = imageCenterX - newWidth / 2\n imagePos.y = imageCenterY - newHeight / 2\n \n zoom.value = newZoom\n \n // Apply position constraints after zoom\n constrainImagePosition()\n \n updateCanvas()\n }\n}\n\nconst resetImage = () => {\n if (!originalImage.value) return\n \n const img = originalImage.value\n \n // Disable watcher during reset\n isResetting.value = true\n \n // Reset to initial zoom that ensures the image covers the crop circle\n const scale = Math.max(\n (cropRadius.value * 2) / img.width,\n (cropRadius.value * 2) / img.height\n )\n \n const targetZoom = scale * 1.2 // Slightly zoomed in for better coverage\n \n // Calculate and set position directly\n const scaledWidth = img.width * targetZoom\n const scaledHeight = img.height * targetZoom\n \n imagePos.x = (canvasSize.value - scaledWidth) / 2\n imagePos.y = (canvasSize.value - scaledHeight) / 2\n \n // Set the zoom\n zoom.value = targetZoom\n \n // Apply position constraints\n constrainImagePosition()\n \n // Re-enable watcher\n nextTick(() => {\n isResetting.value = false\n })\n \n updateCanvas()\n}\n\nconst cropAndUpload = async () => {\n if (!originalImage.value || !canvas.value) return\n \n // Create a new canvas for the cropped result\n const cropCanvas = document.createElement('canvas')\n cropCanvas.width = 256\n cropCanvas.height = 256\n const cropCtx = cropCanvas.getContext('2d')\n if (!cropCtx) return\n \n // White background\n cropCtx.fillStyle = '#ffffff'\n cropCtx.fillRect(0, 0, 256, 256)\n \n // Create circular clipping\n cropCtx.save()\n cropCtx.beginPath()\n cropCtx.arc(128, 128, 128, 0, Math.PI * 2)\n cropCtx.clip()\n \n // Calculate the crop area\n const cropX = canvasSize.value / 2 - cropRadius.value\n const cropY = canvasSize.value / 2 - cropRadius.value\n const cropSize = cropRadius.value * 2\n \n // Draw the cropped area\n cropCtx.drawImage(\n canvas.value,\n cropX, cropY, cropSize, cropSize,\n 0, 0, 256, 256\n )\n \n cropCtx.restore()\n \n // Convert to blob\n cropCanvas.toBlob((blob) => {\n if (blob) {\n const file = new File([blob], 'avatar.jpg', { type: 'image/jpeg' })\n emit('upload', file)\n }\n }, 'image/jpeg', 0.9)\n}\n\nconst clearImage = () => {\n imageData.value = ''\n originalImage.value = undefined\n \n // Reset all state to defaults\n zoom.value = 1\n minZoom.value = 0.1\n imagePos.x = 0\n imagePos.y = 0\n \n if (fileInput.value) {\n fileInput.value.value = ''\n }\n}\n\n// Watch zoom changes and maintain image center\nwatch(zoom, (newZoom, oldZoom) => {\n if (isResetting.value) {\n // Skip during reset operations\n return\n }\n \n if (newZoom !== oldZoom && originalImage.value && oldZoom > 0 && oldZoom !== 1) {\n // Only adjust position if this isn't the initial load (oldZoom !== 1)\n // This handles zoom changes from the slider and wheel\n const img = originalImage.value\n const oldWidth = img.width * oldZoom\n const oldHeight = img.height * oldZoom\n \n // Calculate current image center\n const imageCenterX = imagePos.x + oldWidth / 2\n const imageCenterY = imagePos.y + oldHeight / 2\n \n // Calculate new dimensions\n const newWidth = img.width * newZoom\n const newHeight = img.height * newZoom\n \n // Update position to keep the image center at the same location\n imagePos.x = imageCenterX - newWidth / 2\n imagePos.y = imageCenterY - newHeight / 2\n }\n \n updateCanvas()\n})\n\n// Watch for preselected file\nwatch(() => props.preselectedFile, (file) => {\n if (file) {\n processFile(file)\n }\n}, { immediate: true })\n</script>\n\n<style>\n.avatar-editor-simple {\n width: 100%;\n}\n\n/* Upload Area */\n.upload-area {\n border: 2px dashed #e5e7eb;\n border-radius: 12px;\n padding: 3rem;\n text-align: center;\n cursor: pointer;\n transition: all 0.2s;\n background: white;\n}\n\n.upload-area:hover {\n border-color: #ea00a8;\n background: #fef2f9;\n}\n\n.upload-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.upload-icon {\n width: 3rem;\n height: 3rem;\n color: #9ca3af;\n margin-bottom: 1rem;\n}\n\n.upload-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.25rem;\n}\n\n.upload-subtitle {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.upload-formats {\n display: flex;\n gap: 0.5rem;\n justify-content: center;\n font-size: 0.75rem;\n color: #9ca3af;\n}\n\n.format-tag {\n padding: 0.25rem 0.5rem;\n background-color: #f3f4f6;\n border-radius: 0.25rem;\n}\n\n.hidden-input {\n display: none;\n}\n\n/* Editor Container */\n.editor-container {\n display: flex;\n gap: 2rem;\n}\n\n.editor-main {\n flex: 1;\n}\n\n/* Canvas Container */\n.canvas-container {\n position: relative;\n width: 300px;\n height: 300px;\n margin: 0 auto;\n border-radius: 12px;\n overflow: hidden;\n background: #f9fafb;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n}\n\n.canvas {\n display: block;\n cursor: move;\n}\n\n.crop-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n.crop-svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n\n.crop-circle {\n filter: drop-shadow(0 4px 3px rgba(0, 0, 0, 0.07)) drop-shadow(0 2px 2px rgba(0, 0, 0, 0.06));\n}\n\n.zoom-icon {\n width: 1rem;\n height: 1rem;\n}\n\n.preview-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n margin-bottom: 0.75rem;\n}\n\n.preview-instructions {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.75rem;\n text-align: center;\n}\n\n/* Controls */\n.controls {\n margin-top: 1.5rem;\n space-y: 1rem;\n}\n\n.zoom-control {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n background: white;\n padding: 0.75rem;\n border-radius: 8px;\n border: 1px solid #e5e7eb;\n}\n\n.zoom-button {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: #f3f4f6;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n color: #4b5563;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.zoom-button:hover {\n background: #e5e7eb;\n color: #1f2937;\n}\n\n.zoom-slider {\n flex: 1;\n height: 6px;\n background: #e5e7eb;\n border-radius: 3px;\n outline: none;\n -webkit-appearance: none;\n}\n\n.zoom-slider::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 18px;\n height: 18px;\n background: #ea00a8;\n border: 2px solid white;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n.zoom-slider::-moz-range-thumb {\n width: 18px;\n height: 18px;\n background: #ea00a8;\n border: 2px solid white;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Action Buttons */\n.action-buttons {\n display: flex;\n gap: 0.75rem;\n margin-top: 1rem;\n}\n\n.btn-primary,\n.btn-secondary {\n padding: 0.625rem 1.25rem;\n border-radius: 8px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n border: 1px solid transparent;\n}\n\n.btn-primary {\n background: #ea00a8;\n color: white;\n flex: 1;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: #d10096;\n}\n\n.btn-primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.btn-secondary {\n background: white;\n color: #4b5563;\n border-color: #e5e7eb;\n}\n\n.btn-secondary:hover {\n background: #f9fafb;\n color: #1f2937;\n}\n\n/* Preview Section */\n.preview-section {\n width: 150px;\n padding: 1rem;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n height: fit-content;\n}\n\n.preview-container {\n width: 100px;\n height: 100px;\n margin: 0 auto;\n border-radius: 50%;\n overflow: hidden;\n border: 2px solid #e5e7eb;\n background: white;\n}\n\n.preview-canvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n</style>","/**\n * Sound effects utility functions using Web Audio API\n * These generate sounds programmatically without needing external audio files\n */\n\nexport class SoundEffects {\n private static audioContext: AudioContext | null = null;\n\n /**\n * Get or create a shared AudioContext\n */\n private static getAudioContext(): AudioContext | null {\n try {\n if (!this.audioContext) {\n this.audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n }\n // Resume context if it's suspended (some browsers require user interaction)\n if (this.audioContext.state === 'suspended') {\n this.audioContext.resume();\n }\n return this.audioContext;\n } catch (error) {\n console.warn('Audio context not available:', error);\n return null;\n }\n }\n\n /**\n * Play a level up sound effect\n * A pleasant major chord with arpeggio and bell overtones\n */\n static playLevelUp(level?: number, userSettings?: any): void {\n const milestones = [10, 25, 50, 100, 150, 200];\n const isMilestone = level && milestones.includes(level);\n \n // Check user settings for audio preferences\n if (userSettings) {\n // For milestone levels, check milestone sounds setting\n if (isMilestone && userSettings.milestoneSounds === false) {\n return;\n }\n // For regular levels, check level up sounds setting\n if (!isMilestone && userSettings.levelUpSounds === false) {\n return;\n }\n }\n \n if (isMilestone) {\n this.playMilestoneLevelUp();\n } else {\n this.playRegularLevelUp();\n }\n }\n\n /**\n * Play regular level up sound for normal levels\n */\n private static playRegularLevelUp(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const duration = 0.8;\n const now = audioContext.currentTime;\n \n // Create three oscillators for a pleasant C major chord\n const frequencies = [523.25, 659.25, 783.99]; // C5, E5, G5\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n // Use sine wave for a clean, pleasant sound\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n // Add a slight pitch bend up for a magical effect\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.05, now + duration * 0.1);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.02, now + duration);\n \n // Volume envelope with delay for each note (arpeggio effect)\n const delay = index * 0.05;\n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.15, now + delay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + duration);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + duration);\n });\n \n // Add a subtle bell/chime overtone\n const bellOscillator = audioContext.createOscillator();\n const bellGain = audioContext.createGain();\n \n bellOscillator.connect(bellGain);\n bellGain.connect(audioContext.destination);\n \n bellOscillator.type = 'triangle';\n bellOscillator.frequency.setValueAtTime(1046.5, now); // C6\n \n bellGain.gain.setValueAtTime(0, now);\n bellGain.gain.linearRampToValueAtTime(0.08, now + 0.01);\n bellGain.gain.exponentialRampToValueAtTime(0.001, now + 0.3);\n \n bellOscillator.start(now);\n bellOscillator.stop(now + 0.3);\n }\n\n /**\n * Play epic milestone level up sound for special levels (10, 25, 50, 100, 150, 200)\n * A longer, more elaborate celebration with multiple chord progressions\n */\n private static playMilestoneLevelUp(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n \n // Extended duration for milestone celebration\n const totalDuration = 2.5;\n \n // First chord progression: C Major -> F Major -> G Major -> C Major\n const chordProgression = [\n { time: 0.0, frequencies: [523.25, 659.25, 783.99] }, // C Major (C5, E5, G5)\n { time: 0.4, frequencies: [587.33, 698.46, 880.00] }, // F Major (D5, F5, A5)\n { time: 0.8, frequencies: [622.25, 783.99, 987.77] }, // G Major (D#5, G5, B5)\n { time: 1.2, frequencies: [523.25, 659.25, 783.99] }, // C Major (C5, E5, G5)\n ];\n \n // Play chord progression\n chordProgression.forEach((chord, chordIndex) => {\n chord.frequencies.forEach((freq, noteIndex) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now + chord.time);\n \n // Add slight pitch bend for magic\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.03, now + chord.time + 0.05);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.01, now + chord.time + 0.35);\n \n // Staggered note delays for arpeggio effect\n const noteDelay = noteIndex * 0.03;\n gainNode.gain.setValueAtTime(0, now + chord.time);\n gainNode.gain.linearRampToValueAtTime(0.12, now + chord.time + noteDelay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.02, now + chord.time + 0.35);\n gainNode.gain.exponentialRampToValueAtTime(0.001, now + chord.time + 0.4);\n \n oscillator.start(now + chord.time + noteDelay);\n oscillator.stop(now + chord.time + 0.45);\n });\n });\n \n // High-frequency sparkle effects throughout\n for (let i = 0; i < 8; i++) {\n const sparkleTime = now + 0.2 + (i * 0.15);\n const sparkleOsc = audioContext.createOscillator();\n const sparkleGain = audioContext.createGain();\n \n sparkleOsc.connect(sparkleGain);\n sparkleGain.connect(audioContext.destination);\n \n sparkleOsc.type = 'sine';\n const sparkleFreq = 1568 + (Math.random() * 800); // High frequencies for sparkle\n sparkleOsc.frequency.setValueAtTime(sparkleFreq, sparkleTime);\n sparkleOsc.frequency.exponentialRampToValueAtTime(sparkleFreq * 1.5, sparkleTime + 0.1);\n \n sparkleGain.gain.setValueAtTime(0, sparkleTime);\n sparkleGain.gain.linearRampToValueAtTime(0.06, sparkleTime + 0.01);\n sparkleGain.gain.exponentialRampToValueAtTime(0.001, sparkleTime + 0.12);\n \n sparkleOsc.start(sparkleTime);\n sparkleOsc.stop(sparkleTime + 0.15);\n }\n \n // Grand finale - triumphant high C chord\n const finaleTime = now + 1.6;\n const finaleFrequencies = [1046.5, 1318.5, 1567.98]; // C6, E6, G6\n \n finaleFrequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'triangle'; // Triangle wave for bell-like quality\n oscillator.frequency.setValueAtTime(freq, finaleTime);\n oscillator.frequency.exponentialRampToValueAtTime(freq * 1.02, finaleTime + 0.8);\n \n const delay = index * 0.02;\n gainNode.gain.setValueAtTime(0, finaleTime);\n gainNode.gain.linearRampToValueAtTime(0.15, finaleTime + delay + 0.03);\n gainNode.gain.exponentialRampToValueAtTime(0.001, finaleTime + 0.9);\n \n oscillator.start(finaleTime + delay);\n oscillator.stop(finaleTime + 0.95);\n });\n }\n\n /**\n * Play a success/completion sound\n * A short, bright confirmation tone\n */\n static playSuccess(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n \n // Two quick ascending notes\n const frequencies = [659.25, 830.61]; // E5, G#5\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n const delay = index * 0.1;\n const duration = 0.15;\n \n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.2, now + delay + 0.01);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + duration);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + duration);\n });\n }\n\n /**\n * Play an error/failure sound\n * A low, descending tone\n */\n static playError(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sawtooth';\n oscillator.frequency.setValueAtTime(200, now);\n oscillator.frequency.exponentialRampToValueAtTime(100, now + 0.3);\n \n gainNode.gain.setValueAtTime(0.15, now);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.3);\n \n oscillator.start(now);\n oscillator.stop(now + 0.3);\n }\n\n /**\n * Play a click/button press sound\n * A very short, soft click\n */\n static playClick(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(1000, now);\n \n gainNode.gain.setValueAtTime(0.1, now);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.03);\n \n oscillator.start(now);\n oscillator.stop(now + 0.03);\n }\n\n /**\n * Play a notification sound\n * A gentle two-tone chime\n */\n static playNotification(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const frequencies = [880, 1174.66]; // A5, D6\n \n frequencies.forEach((freq, index) => {\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(freq, now);\n \n const delay = index * 0.15;\n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.12, now + delay + 0.02);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + delay + 0.4);\n \n oscillator.start(now + delay);\n oscillator.stop(now + delay + 0.4);\n });\n }\n\n /**\n * Play an XP gain sound\n * A quick, ascending glissando\n */\n static playXpGain(): void {\n const audioContext = this.getAudioContext();\n if (!audioContext) return;\n\n const now = audioContext.currentTime;\n const oscillator = audioContext.createOscillator();\n const gainNode = audioContext.createGain();\n \n oscillator.connect(gainNode);\n gainNode.connect(audioContext.destination);\n \n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(440, now); // A4\n oscillator.frequency.exponentialRampToValueAtTime(880, now + 0.15); // A5\n \n gainNode.gain.setValueAtTime(0, now);\n gainNode.gain.linearRampToValueAtTime(0.15, now + 0.01);\n gainNode.gain.exponentialRampToValueAtTime(0.01, now + 0.2);\n \n oscillator.start(now);\n oscillator.stop(now + 0.2);\n }\n}\n\n// Export individual functions for convenience\nexport const playLevelUp = (level?: number, userSettings?: any) => SoundEffects.playLevelUp(level, userSettings);\nexport const playSuccess = () => SoundEffects.playSuccess();\nexport const playError = () => SoundEffects.playError();\nexport const playClick = () => SoundEffects.playClick();\nexport const playNotification = () => SoundEffects.playNotification();\nexport const playXpGain = () => SoundEffects.playXpGain();","<template>\n <div class=\"level-progress-container\">\n <svg :width=\"size\" :height=\"size\" :viewBox=\"`0 0 ${viewBox} ${viewBox}`\" style=\"position: relative;\">\n <!-- Level Up Overlay -->\n <g v-if=\"levelUpActive\">\n <circle\n :cx=\"center\"\n :cy=\"center\"\n :r=\"innerCircleRadius\"\n fill=\"#a800ff\"\n opacity=\"0.92\"\n />\n <text\n :x=\"center\"\n :y=\"center + 15\"\n text-anchor=\"middle\"\n font-size=\"38\"\n font-weight=\"bold\"\n fill=\"#fff\"\n style=\"font-family: 'Montserrat', sans-serif;\"\n >Level Up</text>\n </g>\n \n <!-- Background Arc (gray portion) -->\n <path\n v-if=\"animatedValue >= 0 && animatedValue < props.max\"\n :d=\"backgroundArcPath\"\n stroke=\"#ddd\"\n :stroke-width=\"thickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Label Arc (top, thicker) -->\n <path\n :d=\"staticArcPath\"\n :stroke=\"staticArcGradient\"\n :stroke-width=\"labelThickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Invisible arc for curved label text -->\n <path\n :id=\"'labelTextArc'\"\n :d=\"labelTextArcPath\"\n stroke=\"transparent\"\n fill=\"none\"\n transform=\"scale(-1, 1) translate(-400, 0)\"\n />\n \n <!-- Progress Arc (XP bar) -->\n <path\n v-if=\"animatedValue > 0 && animatedValue < props.max\"\n :d=\"progressArcPath\"\n :stroke=\"progressArcGradient\"\n :stroke-width=\"thickness\"\n fill=\"none\"\n stroke-linecap=\"round\"\n />\n \n <!-- Curved Label Text -->\n <text \n font-size=\"30\" \n font-weight=\"bold\" \n fill=\"var(--purple-100)\" \n style=\"font-family: 'Montserrat', sans-serif; letter-spacing: 8px;\"\n >\n <textPath\n xlink:href=\"#labelTextArc\"\n startOffset=\"50%\"\n text-anchor=\"middle\"\n alignment-baseline=\"hanging\"\n dominant-baseline=\"hanging\"\n text-length=\"100%\"\n >\n {{ levelLabel }}\n </textPath>\n </text>\n \n <!-- Gradient Definitions -->\n <defs>\n <linearGradient id=\"staticGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\">\n <stop offset=\"0%\" stop-color=\"var(--strands-500)\" />\n <stop offset=\"100%\" stop-color=\"var(--strands-600)\" />\n </linearGradient>\n\n <linearGradient \n id=\"progressGradient\" \n gradientUnits=\"userSpaceOnUse\" \n :x1=\"progressGradientStart.x\" \n :y1=\"progressGradientStart.y\" \n :x2=\"progressGradientEnd.x\" \n :y2=\"progressGradientEnd.y\"\n >\n <stop offset=\"0%\" stop-color=\"var(--strands-600)\" />\n <stop offset=\"100%\" stop-color=\"var(--strands-400)\" />\n </linearGradient>\n </defs>\n </svg>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { playLevelUp } from '../utils/sounds';\n\n// ============================================================================\n// Props & Emits\n// ============================================================================\nconst props = defineProps<{\n value: number;\n max: number;\n level: number;\n levelLabel?: string;\n size?: number;\n thickness?: number;\n labelThickness?: number;\n staticArcAngle?: number;\n gapAngle?: number;\n userSettings?: any;\n}>();\n\nconst emit = defineEmits(['levelup']);\n\n// ============================================================================\n// Constants & Configuration\n// ============================================================================\nconst VIEW_BOX_SIZE = 400;\nconst ARC_PADDING = 18; // Extra space from edge\nconst INNER_GAP = 18; // Gap between progress ring and inner circle\nconst ANIMATION_DURATION = 600; // ms\n\n// Label arc configuration\nconst LABEL_SPACING = 8; // px, matches letter-spacing in template\nconst LABEL_FONT_SIZE = 30; // px, matches font-size in template\nconst LABEL_EXTRA_DEGREES = 12; // Extra spacing in degrees\nconst LABEL_CHAR_DEGREES = 8; // Degrees per character\n\n// ============================================================================\n// Component State\n// ============================================================================\nconst levelUpActive = ref(false);\nconst animatedValue = ref(props.value);\nconst animationDirection = ref<'forward' | 'backward'>('forward');\nlet animationFrame: number | null = null;\nlet prevValue = props.value;\nlet prevLevel = props.level;\n\n// ============================================================================\n// Computed Properties - Dimensions\n// ============================================================================\nconst viewBox = VIEW_BOX_SIZE;\nconst size = props.size ?? VIEW_BOX_SIZE;\nconst center = VIEW_BOX_SIZE / 2;\nconst thickness = computed(() => props.thickness ?? 24);\nconst labelThickness = computed(() => props.labelThickness ?? 46);\nconst gapAngle = computed(() => props.gapAngle ?? 16);\n\n// Radius calculations\nconst radius = computed(() => (VIEW_BOX_SIZE - thickness.value) / 2 - ARC_PADDING);\nconst labelRadius = computed(() => (VIEW_BOX_SIZE - labelThickness.value) / 1.9 - ARC_PADDING);\nconst textLabelRadius = computed(() => labelRadius.value + 10);\nconst innerCircleRadius = computed(() => radius.value - thickness.value / 2 - INNER_GAP);\n\n// ============================================================================\n// Computed Properties - Arc Angles\n// ============================================================================\nconst labelLength = computed(() => props.levelLabel?.length ?? 0);\nconst staticArcAngle = computed(() => {\n // Estimate arc angle needed for label\n return labelLength.value * LABEL_CHAR_DEGREES + LABEL_EXTRA_DEGREES;\n});\n\nconst labelStart = computed(() => -staticArcAngle.value / 2);\nconst labelEnd = computed(() => staticArcAngle.value / 2);\n\n// ============================================================================\n// Computed Properties - Arc Paths\n// ============================================================================\nconst staticArcPath = computed(() =>\n describeArc(center, center, labelRadius.value, labelStart.value, labelEnd.value)\n);\n\nconst labelTextArcPath = computed(() =>\n // Top arc: right to left, so text is right-side up at the top after rotation\n describeArc(center, center, textLabelRadius.value, -90, 90)\n);\n\nconst progressArcPath = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n return describeArc(center, center, radius.value, xpArcStart, xpArcEnd);\n});\n\nconst backgroundArcPath = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n const grayArcStart = progress === 0 ? xpArcStart : xpArcEnd + gapAngle.value;\n const grayArcEnd = labelStart.value - gapAngle.value + 360;\n return describeArc(center, center, radius.value, grayArcStart, grayArcEnd);\n});\n\n// ============================================================================\n// Computed Properties - Gradients\n// ============================================================================\nconst staticArcGradient = computed(() => 'url(#staticGradient)');\nconst progressArcGradient = computed(() => 'url(#progressGradient)');\n\nconst progressGradientStart = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n return polarToCartesian(center, center, radius.value, xpArcStart);\n});\n\nconst progressGradientEnd = computed(() => {\n const xpArcStart = labelEnd.value + gapAngle.value;\n const availableSweep = 360 - staticArcAngle.value - 3 * gapAngle.value;\n const progress = Math.max(0, Math.min(1, animatedValue.value / props.max));\n const xpArcSweep = availableSweep * progress;\n const xpArcEnd = xpArcStart + xpArcSweep;\n return polarToCartesian(center, center, radius.value, xpArcEnd);\n});\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\nfunction polarToCartesian(cx: number, cy: number, r: number, angle: number) {\n const rad = (angle - 90) * Math.PI / 180.0;\n return {\n x: cx + r * Math.cos(rad),\n y: cy + r * Math.sin(rad),\n };\n}\n\nfunction describeArc(cx: number, cy: number, r: number, startAngle: number, endAngle: number) {\n const start = polarToCartesian(cx, cy, r, endAngle % 360);\n const end = polarToCartesian(cx, cy, r, startAngle % 360);\n const sweep = ((endAngle - startAngle + 360) % 360);\n const largeArcFlag = sweep <= 180 ? '0' : '1';\n return [\n 'M', start.x, start.y,\n 'A', r, r, 0, largeArcFlag, 0, end.x, end.y\n ].join(' ');\n}\n\nfunction easeInOut(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n}\n\n// ============================================================================\n// Animation Functions\n// ============================================================================\nfunction animateProgress(newValue: number, oldValue: number) {\n if (animationFrame) cancelAnimationFrame(animationFrame);\n \n const start = oldValue;\n const change = newValue - start;\n const startTime = performance.now();\n \n function step(now: number) {\n const elapsed = now - startTime;\n const t = Math.min(elapsed / ANIMATION_DURATION, 1);\n const eased = easeInOut(t);\n animatedValue.value = start + change * eased;\n \n if (t < 1) {\n animationFrame = requestAnimationFrame(step);\n } else {\n animatedValue.value = newValue;\n animationFrame = null;\n }\n }\n \n animationFrame = requestAnimationFrame(step);\n}\n\nfunction triggerLevelUp() {\n levelUpActive.value = true;\n playLevelUp(props.level, props.userSettings);\n emit('levelup');\n \n // Check if this is a milestone level for longer display\n const milestones = [10, 25, 50, 100, 150, 200];\n const isMilestone = milestones.includes(props.level);\n \n setTimeout(() => {\n levelUpActive.value = false;\n }, isMilestone ? 2000 : 1200);\n}\n\n// ============================================================================\n// Watchers\n// ============================================================================\nwatch(() => props.value, (newValue) => {\n animationDirection.value = newValue >= prevValue ? 'forward' : 'backward';\n animateProgress(newValue, prevValue);\n prevValue = newValue;\n});\n\nwatch(() => props.level, (newLevel) => {\n if (newLevel !== prevLevel && newLevel > prevLevel) {\n triggerLevelUp();\n }\n prevLevel = newLevel;\n});\n</script>\n\n<style scoped>\n.level-progress-container {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 12px;\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n\t<teleport to=\"body\">\n\t\t<div v-if=\"open\" class=\"modal-overlay\" @click=\"handleOverlayClick\">\n\t\t\t<div \n\t\t\t\tclass=\"modal-container\" \n\t\t\t\t:class=\"{ 'modal-container-fullscreen-mobile': fullscreenOnMobile }\"\n\t\t\t\t@click.stop\n\t\t\t>\n\t\t\t\t<div class=\"modal-card\">\n\t\t\t\t\t<div v-if=\"$slots['header']\" class=\"modal-header\">\n\t\t\t\t\t\t<slot name=\"header\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div class=\"modal-content\">\n\t\t\t\t\t\t<slot />\n\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t<div v-if=\"$slots['footer']\" class=\"modal-footer\">\n\t\t\t\t\t\t<slot name=\"footer\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n\topen?: boolean\n\tcloseOnOverlayClick?: boolean\n\tfullscreenOnMobile?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n\topen: false,\n\tcloseOnOverlayClick: true,\n\tfullscreenOnMobile: true\n})\n\nconst emit = defineEmits<{\n\tclose: []\n}>()\n\nconst handleOverlayClick = () => {\n\tif (props.closeOnOverlayClick) {\n\t\temit('close')\n\t}\n}\n</script>\n\n<style scoped>\n.modal-overlay {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tbackground: rgba(0, 0, 0, 0.8);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 1rem;\n\tz-index: 50;\n\tfont-family: var(--font-sans);\n\t-webkit-font-smoothing: antialiased;\n}\n\n.modal-container {\n\tbackground: white;\n\tborder-radius: 0.5rem;\n\tbox-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n\tpadding: 1.5rem;\n\tmax-width: calc(100vw - 2rem);\n\tmax-height: calc(100vh - 2rem);\n\toverflow-y: auto;\n\twidth: auto;\n}\n\n.modal-header {\n\tpadding-bottom: 1rem;\n\tborder-bottom: 1px solid #e5e7eb;\n\tmargin-bottom: 1.5rem;\n}\n\n.modal-footer {\n\tpadding-top: 1rem;\n\tborder-top: 1px solid #e5e7eb;\n\tmargin-top: 1.5rem;\n}\n\n/* Fullscreen on mobile */\n@media (max-width: 768px) {\n\t.modal-container-fullscreen-mobile {\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\tmax-width: 100vw;\n\t\tmax-height: 100vh;\n\t\tborder-radius: 0;\n\t\tpadding: 1rem;\n\t}\n}\n\n/* Scrollbar styling */\n.modal-container::-webkit-scrollbar {\n\twidth: 6px;\n}\n\n.modal-container::-webkit-scrollbar-track {\n\tbackground: #f1f5f9;\n\tborder-radius: 3px;\n}\n\n.modal-container::-webkit-scrollbar-thumb {\n\tbackground: #cbd5e1;\n\tborder-radius: 3px;\n}\n\n.modal-container::-webkit-scrollbar-thumb:hover {\n\tbackground: #94a3b8;\n}\n</style>","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABVgAAAHgCAYAAABQLAbaAAAEt2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iNDgwIgogICB0aWZmOkltYWdlV2lkdGg9IjEzNjgiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLzEiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLzEiCiAgIGV4aWY6UGl4ZWxYRGltZW5zaW9uPSIxMzY4IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNDgwIgogICBleGlmOkNvbG9yU3BhY2U9IjEiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIw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rYdCFBEBYXQHawB8r7uGOCph1YlP9yoKH2PS1V0EEREREREREZlFW8B6BZN5xLgbTELOcR5rdATEp7prOIeru4A4qiAxjZh0rwYAxwMQERERERER0Xu0BawAUIWc0vn4nZIQ66UY7G7fDSSk0R2sYMDasnr36ozuOpqVhNzQXQMRERERERERmUdrwFpfbrv4/7N3P8lNJGvb/79Z5l/E+/ziyBEHA6MuVoBYAWIF2JPGGiFWgFmBzQqAFWBGkj2xWYHFClCvgOoRjdwd0om3z/NiZFX+BlUC4baxZEvKzKrrE8HpPnRj3w1SqerKO+90WcMlVQaYPR16tRCx6wJ+5gomcV1DaAaYN65rmEI/77oXEREREREREfmB04AV4CrXt4C+6zouoTrg6KXrIkogdl3Az1jSkF/DC9el2QBqjsuYhrpXRURERERERORUzgPWZdb6KYR84BVAQ4delduxRgRMrEczNpigFiUizDvXNYiIiIiIiIiIn4zrAka6tA4Iq6PtH1J4fpv1V67rKJpPNOMlzEfXdfzMCuvevJd816X1Aai6rmMK/RXWl10XISIiIiIiIiJ+ct7BOmKwoXexEsHLQ5o113UUzRXPxwMQ9oiLhco7vUMKV0HjAURERERERETkJ7wJWPMDZEI+8AoAi9nr0Yxd1yELlbguIASHNGsWu+W6jmkZ7FvXNYiIiIiIiIiIv7wJWKEQB14BVAaYA4Wss2OIKq5rOEfor9m569GMLeaN6zouIMkXf0RERERERERETuVVwLrMWj/CPHVdxwzECllnJyX1OmBN4T+ua/BZj73KAHOA/6MeThH+6BIRERERERERmS+vAlaAf/N4H2i7rmMG8pB1z+twMAQG4/XvYQQ91zX47JivbwgyXIVhMa5FIiIiIiIiIjJH3gWsAEPsU4qx7ToecKSQ9ZJSrNe/fxb7u+safHXIzkuLXXVdxwVt36GeuC5CRERERERERPzmZcB6h3qSQlG25lYVskoZHbKzabEbruu4qKHGA4iIiIiIiIjIBLwMWAFus/6K4mzPVch6Cb6PCLCYInRbz1Qerm65ruMS2upeFREREREREZFJeBuwQqFGBYBC1guzno8IiLBFeY3ORAHCVYy6V0VERERERERkQl4HrAUbFQAKWaXgihCuAu2b1NuuixARERERERGRMHgdsEI2KsBg9l3XMUPV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\"","export const slotHasContent = (slotName: string, slots: any) => {\n const slot = slots[slotName];\n if (!slot) return false;\n if (typeof slot === 'function') {\n const vnodes = slot();\n return Array.isArray(vnodes) && vnodes.length > 0;\n }\n return Array.isArray(slot) && slot.length > 0;\n};","<template>\n <div class=\"accui-component-scope\">\n <div v-if=\"shouldShowSecuredBy\"\n class=\"secured-footer\"\n :class=\"{ 'secured-footer-with-content': hasDefaultSlot, 'secured-footer-centered': !hasDefaultSlot }\">\n <slot name=\"default\" />\n\n <!-- Secured by logo - Right side when sign out present, center when alone -->\n <div v-if=\"shouldShowSecuredBy\" class=\"secured-logo\">\n <img src=\"/assets/secured_by_strands_services.png\" class=\"secured-logo-image\" />\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { slotHasContent } from '../../utils/slots';\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\n\n// Get configuration\nconst { config } = useStrandsConfig(props.config)\n\n// Hide \"Secured by\" logo when using Strands' own domain\nconst shouldShowSecuredBy = computed(() => {\n const baseUrl = config.value.baseUrl\n return baseUrl !== 'https://accounts.strands.gg'\n})\n\nconst slots = useSlots()\nconst hasDefaultSlot = computed(() => slotHasContent('default', slots))\n</script>\n\n<style scoped>\n.secured-footer {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 1rem;\n border-top: 1px solid #e5e7eb;\n}\n\n.secured-footer-with-content {\n justify-content: space-between;\n}\n\n.secured-footer-centered {\n justify-content: center;\n}\n\n.secured-logo {\n flex-shrink: 0;\n}\n\n.secured-logo-image {\n height: 2rem;\n}\n</style>","import { ref, computed } from 'vue'\nimport type { \n MfaDevice, \n MfaDevicesResponse, \n TotpSetupResponse, \n BackupCodesResponse \n} from '../../types'\nimport { useStrandsConfig } from './useStrandsConfig'\nimport { useStrandsAuth } from './useStrandsAuth'\n\nconst mfaDevices = ref<MfaDevice[]>([])\nconst mfaEnabled = ref(false)\nconst loading = ref(false)\n\nexport function useStrandsMfa() {\n const { getUrl } = useStrandsConfig()\n const { currentSession } = useStrandsAuth()\n\n const hasMfaDevices = computed(() => mfaDevices.value.length > 0)\n // Filter out hardware keys and passkeys temporarily until cross-domain support is implemented\n const activeMfaDevices = computed(() => \n mfaDevices.value.filter(d => \n d.is_active && \n d.device_type !== 'hardware' && \n d.device_type !== 'passkey'\n )\n )\n\n // Helper function to make authenticated requests\n const makeAuthenticatedRequest = async (url: string, options: RequestInit = {}) => {\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available')\n }\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${currentSession.value.accessToken}`,\n ...options.headers,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n let errorMessage = `Request failed: ${response.status} ${response.statusText}`\n \n try {\n const errorData = JSON.parse(errorText)\n errorMessage = errorData.message || errorMessage\n } catch {\n // If parsing fails, use the original error text\n if (errorText) {\n errorMessage = errorText\n }\n }\n \n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n // Get all MFA devices for the user\n const fetchMfaDevices = async (): Promise<MfaDevicesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaDevices'), {\n method: 'GET',\n })\n\n mfaDevices.value = response.devices || []\n mfaEnabled.value = response.mfa_enabled || false\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Setup TOTP (authenticator app)\n const setupTotp = async (deviceName: string): Promise<TotpSetupResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaTotpSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Verify TOTP setup\n const verifyTotpSetup = async (deviceId: string, totpCode: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaTotpVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n totp_code: totpCode,\n }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Setup email-based MFA\n const setupEmailMfa = async (deviceName: string): Promise<{ device_id: string; email: string }> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailSetup'), {\n method: 'POST',\n body: JSON.stringify({ device_name: deviceName }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Send email verification code\n const sendEmailMfaCode = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaEmailSend'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n } finally {\n loading.value = false\n }\n }\n\n // Verify email MFA code\n const verifyEmailMfaCode = async (deviceId: string, code: string): Promise<boolean> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaEmailVerify'), {\n method: 'POST',\n body: JSON.stringify({\n device_id: deviceId,\n code: code,\n }),\n })\n\n return response.verified || false\n } finally {\n loading.value = false\n }\n }\n\n // Disable an MFA device\n const disableMfaDevice = async (deviceId: string): Promise<void> => {\n loading.value = true\n try {\n await makeAuthenticatedRequest(getUrl('mfaDeviceDisable'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n // Refresh devices list\n await fetchMfaDevices()\n } finally {\n loading.value = false\n }\n }\n\n // Regenerate backup codes for TOTP device\n const regenerateBackupCodes = async (deviceId: string): Promise<BackupCodesResponse> => {\n loading.value = true\n try {\n const response = await makeAuthenticatedRequest(getUrl('mfaBackupCodes'), {\n method: 'POST',\n body: JSON.stringify({ device_id: deviceId }),\n })\n\n return response\n } finally {\n loading.value = false\n }\n }\n\n // Helper function to get device type icon\n const getDeviceTypeIcon = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return '📱' // Authenticator app\n case 'email':\n return '📧' // Email\n case 'hardware':\n return '🔑' // Hardware key\n case 'passkey':\n return '🔐' // Passkey\n default:\n return '🔒' // Generic security\n }\n }\n\n // Helper function to get device type name\n const getDeviceTypeName = (deviceType: string): string => {\n switch (deviceType) {\n case 'totp':\n return 'Authenticator App'\n case 'email':\n return 'Email Verification'\n case 'hardware':\n return 'Hardware Key'\n case 'passkey':\n return 'Passkey'\n default:\n return 'Unknown'\n }\n }\n\n // Helper function to format last used date\n const formatLastUsed = (lastUsedAt?: string | Date): string => {\n if (!lastUsedAt) return 'Never'\n \n const date = new Date(lastUsedAt)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n \n return date.toLocaleDateString()\n }\n\n return {\n // State\n mfaDevices: computed(() => mfaDevices.value),\n mfaEnabled: computed(() => mfaEnabled.value),\n loading: computed(() => loading.value),\n hasMfaDevices,\n activeMfaDevices,\n\n // Methods\n fetchMfaDevices,\n setupTotp,\n verifyTotpSetup,\n setupEmailMfa,\n sendEmailMfaCode,\n verifyEmailMfaCode,\n disableMfaDevice,\n regenerateBackupCodes,\n\n // Helper methods\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n }\n}","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" card-class=\"mfa-verification-modal\" class=\"mfa-verification-modal-wrapper\">\n <template #header>\n <div class=\"mfa-verification-header\">\n <h2 class=\"mfa-verification-title\">Two-Factor Authentication</h2>\n <p class=\"mfa-verification-subtitle\">Enter your verification code to continue</p>\n </div>\n </template>\n\n <div class=\"mfa-verification-content\">\n <!-- Loading State -->\n <div v-if=\"loading && !emailCodeSent\" class=\"mfa-verification-loading\">\n <StrandsUiLoader :size=\"24\" />\n <span class=\"mfa-verification-loading-text\">{{ isSendingMfaEmail || isVerifyingMfa ? authLoadingMessage :\n 'Loading...' }}</span>\n </div>\n\n <!-- Verification Form -->\n <div v-else class=\"mfa-verification-form\">\n <!-- Available MFA Methods -->\n <div v-if=\"availableMethods.length > 1\" class=\"mfa-methods-section\">\n <p class=\"mfa-methods-title\">Choose verification method:</p>\n <div class=\"mfa-methods-grid\">\n <button v-for=\"method in availableMethods\" :key=\"method.id\" @click=\"selectMethod(method)\" :class=\"[\n 'mfa-method-button',\n selectedMethod?.id === method.id ? 'mfa-method-button-selected' : 'mfa-method-button-default'\n ]\">\n <component :is=\"getDeviceIconComponent(method.device_type)\" :size=\"20\" class=\"mfa-method-icon\" />\n <div class=\"mfa-method-info\">\n <p class=\"mfa-method-name\">{{ method.device_name }}</p>\n <p class=\"mfa-method-type\">{{ getDeviceTypeName(method.device_type) }}</p>\n </div>\n <div v-if=\"selectedMethod?.id === method.id\" class=\"mfa-method-check\">\n <IconCheckCircle :size=\"20\" />\n </div>\n </button>\n </div>\n </div>\n\n <!-- Single Method Display -->\n <div v-else-if=\"selectedMethod\" class=\"mfa-single-method\">\n <div class=\"mfa-single-method-content\">\n <component :is=\"getDeviceIconComponent(selectedMethod.device_type)\" :size=\"24\" class=\"mfa-single-method-icon\" />\n <div>\n <h3 class=\"mfa-single-method-name\">{{ selectedMethod.device_name }}</h3>\n <p class=\"mfa-single-method-type\">{{ getDeviceTypeName(selectedMethod.device_type) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Email MFA Code Request -->\n <div v-if=\"selectedMethod?.device_type === 'email' && !emailCodeSent\" class=\"mfa-email-request\">\n <p class=\"mfa-email-request-text\">Click below to receive your verification code</p>\n <StrandsUiButton variant=\"primary\" @click=\"sendEmailCode\" :disabled=\"loading\" :loading=\"loading\">\n Send Verification Code\n </StrandsUiButton>\n </div>\n\n <!-- Hardware Key & Passkey Authentication -->\n <div v-if=\"selectedMethod?.device_type === 'hardware' || selectedMethod?.device_type === 'passkey'\"\n class=\"mfa-hardware-section\">\n <div class=\"mfa-hardware-prompt\">\n <div class=\"mfa-hardware-prompt-content\">\n <div class=\"mfa-hardware-prompt-icon\">\n <component :is=\"selectedMethod.device_type === 'passkey' ? IconShield : IconKeyRound\" :size=\"24\" class=\"mfa-hardware-icon-svg\" />\n </div>\n <div class=\"mfa-hardware-prompt-text\">\n <h4 class=\"mfa-hardware-prompt-title\">{{ selectedMethod.device_type === 'passkey' ? 'Use your passkey'\n :\n 'Touch your hardware key' }}</h4>\n <p class=\"mfa-hardware-prompt-description\">{{ selectedMethod.device_type === 'passkey' ? 'Use biometrics, PIN, or device security to authenticate' : 'Insert and touch your hardware key to authenticate' }}</p>\n </div>\n </div>\n </div>\n <StrandsUiButton variant=\"primary\" @click=\"authenticateHardwareKey\" :disabled=\"loading\" :loading=\"loading\">\n {{ selectedMethod.device_type === 'passkey' ? 'Authenticate with Passkey' : 'Authenticate with Hardware Key' }}\n </StrandsUiButton>\n\n <!-- Backup Codes Option for Hardware Keys -->\n <div class=\"mfa-backup-option\">\n <StrandsUiButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"showBackupCodeInput = !showBackupCodeInput\"\n class=\"mfa-backup-toggle-button\">\n <IconKeyRound :size=\"16\" class=\"mfa-backup-toggle-icon\" />\n {{ showBackupCodeInput ? 'Hide backup code' : (selectedMethod.device_type === 'passkey' ? 'Can\\'t access your passkey? Use backup code' : 'Can\\'t access your key? Use backup code') }}\n </StrandsUiButton>\n </div>\n\n <!-- Backup Code Input for Hardware Keys -->\n <div v-if=\"showBackupCodeInput\" class=\"mfa-backup-input-section\">\n <div class=\"mfa-backup-warning\">\n <IconAlertTriangle :size=\"20\" class=\"mfa-backup-warning-icon\" />\n <div>\n <p class=\"mfa-backup-warning-title\">Backup Code Recovery</p>\n <p class=\"mfa-backup-warning-description\">\n Enter one of your backup codes. Each code can only be used once.\n </p>\n </div>\n </div>\n\n <StrandsUiInput v-model=\"backupCode\" label=\"Backup Code\" placeholder=\"abcd-1234\" :error=\"backupCodeError\"\n :disabled=\"loading\" @input=\"onBackupCodeInput\" @keydown.enter=\"verifyBackupCode\" class=\"mfa-backup-input\" />\n </div>\n </div>\n\n <!-- Code Input -->\n <div\n v-if=\"selectedMethod && selectedMethod.device_type !== 'hardware' && selectedMethod.device_type !== 'passkey' && (selectedMethod.device_type !== 'email' || emailCodeSent)\"\n class=\"mfa-code-section\">\n <!-- Email confirmation -->\n <div v-if=\"selectedMethod.device_type === 'email' && emailCodeSent\"\n class=\"mfa-email-confirmation\">\n <div class=\"mfa-email-confirmation-content\">\n <IconCheckCircle :size=\"20\" class=\"mfa-email-confirmation-icon\" />\n <div>\n <p class=\"mfa-email-confirmation-title\">Code Sent!</p>\n <p class=\"mfa-email-confirmation-description\">Check your email for the verification code</p>\n </div>\n </div>\n </div>\n\n <!-- Code Input Field -->\n <StrandsUiInput v-model=\"verificationCode\" label=\"Verification Code\"\n :placeholder=\"selectedMethod.device_type === 'totp' ? '123456' : '123456'\" maxlength=\"6\"\n :error=\"verificationError\" :disabled=\"loading\" @input=\"onCodeInput\" @keydown.enter=\"verify\" autofocus\n :name=\"selectedMethod.device_type === 'totp' ? 'totp' : 'mfa-code'\"\n :autocomplete=\"selectedMethod.device_type === 'totp' ? 'one-time-code' : 'one-time-code'\"\n inputmode=\"numeric\" />\n\n <!-- TOTP Help -->\n <div v-if=\"selectedMethod.device_type === 'totp'\" class=\"mfa-totp-help\">\n Open your authenticator app and enter the 6-digit code for \n <span class=\"mfa-device-name-text\">\"{{ selectedMethod.device_name }}\"</span>\n </div>\n\n <!-- Email Resend -->\n <div v-if=\"selectedMethod.device_type === 'email'\" class=\"mfa-email-resend\">\n <StrandsUiButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"sendEmailCode\"\n :disabled=\"loading || cooldownActive\"\n class=\"mfa-resend-button\">\n {{ cooldownActive ? `Resend in ${cooldownSeconds}s` : 'Resend Code' }}\n </StrandsUiButton>\n </div>\n\n <!-- Backup Codes Option -->\n <div class=\"mfa-backup-option\">\n <StrandsUiButton\n variant=\"ghost\"\n size=\"sm\"\n @click=\"showBackupCodeInput = !showBackupCodeInput\"\n class=\"mfa-backup-toggle-button\">\n <IconKeyRound :size=\"16\" class=\"mfa-backup-toggle-icon\" />\n {{ showBackupCodeInput ? 'Hide backup code' : 'Use backup code instead' }}\n </StrandsUiButton>\n </div>\n\n <!-- Backup Code Input -->\n <div v-if=\"showBackupCodeInput\" class=\"mfa-backup-input-section\">\n <div class=\"mfa-backup-warning\">\n <IconAlertTriangle :size=\"20\" class=\"mfa-backup-warning-icon\" />\n <div>\n <p class=\"mfa-backup-warning-title\">Backup Code Recovery</p>\n <p class=\"mfa-backup-warning-description\">\n Enter one of your backup codes. Each code can only be used once.\n </p>\n </div>\n </div>\n\n <StrandsUiInput v-model=\"backupCode\" label=\"Backup Code\" placeholder=\"abcd-1234\" :error=\"backupCodeError\"\n :disabled=\"loading\" @input=\"onBackupCodeInput\" @keydown.enter=\"verifyBackupCode\" class=\"mfa-backup-input\" />\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"mfa-verification-footer\">\n <StrandsUiButton variant=\"secondary\" @click=\"closeModal\" :disabled=\"loading\">\n Cancel\n </StrandsUiButton>\n\n <StrandsUiButton\n v-if=\"(selectedMethod && selectedMethod.device_type !== 'hardware' && selectedMethod.device_type !== 'passkey' && (selectedMethod.device_type !== 'email' || emailCodeSent)) || ((selectedMethod?.device_type === 'hardware' || selectedMethod?.device_type === 'passkey') && showBackupCodeInput)\"\n variant=\"primary\" @click=\"showBackupCodeInput ? verifyBackupCode() : verify()\"\n :disabled=\"(!verificationCode.trim() && !backupCode.trim()) || loading\" :loading=\"loading\">\n {{ showBackupCodeInput ? 'Verify Backup Code' : 'Verify' }}\n </StrandsUiButton>\n </div>\n </template>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeUnmount } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { MfaDevice } from '../../types'\n// Simple SVG icon components to replace lucide icons\nconst IconSmartphone = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>`,\n props: ['size']\n}\n\nconst IconMail = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m4 4 16 0 0 16 -16 0 z\"/><path d=\"m22 6-10 7L2 6\"/></svg>`,\n props: ['size']\n}\n\nconst IconKeyRound = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\"/><path d=\"m21 2-9.6 9.6\"/><path d=\"m15.5 7.5 3 3L22 7l-3-3\"/></svg>`,\n props: ['size']\n}\n\nconst IconShield = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>`,\n props: ['size']\n}\n\nconst IconCheckCircle = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/><polyline points=\"22,4 12,14.01 9,11.01\"/></svg>`,\n props: ['size']\n}\n\nconst IconCheck = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><polyline points=\"20,6 9,17 4,12\"/></svg>`,\n props: ['size']\n}\n\nconst IconAlertTriangle = { \n template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"/><path d=\"M12 9v4\"/><path d=\"m12 17 .01 0\"/></svg>`,\n props: ['size']\n}\n\ninterface Props {\n show: boolean\n availableMfaMethods?: MfaDevice[]\n sessionId?: string | null\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n (e: 'error', error: string): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst {\n loading: mfaLoading,\n getDeviceTypeIcon,\n getDeviceTypeName,\n} = useStrandsMfa()\n\nconst {\n verifyMfa,\n sendMfaEmailCode,\n getMfaWebAuthnChallenge,\n mfaSessionId: authMfaSessionId,\n loading: authLoading,\n loadingMessage: authLoadingMessage,\n isSendingMfaEmail,\n isVerifyingMfa,\n} = useStrandsAuth()\n\nconst loading = computed(() => mfaLoading.value || authLoading.value)\n\n// State\nconst selectedMethod = ref<MfaDevice | null>(null)\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst backupCode = ref('')\nconst backupCodeError = ref('')\nconst showBackupCodeInput = ref(false)\nconst emailCodeSent = ref(false)\nconst cooldownActive = ref(false)\nconst cooldownSeconds = ref(0)\n\nlet cooldownInterval: NodeJS.Timeout | null = null\n\n// Computed - filter out WebAuthn methods temporarily until cross-domain support is implemented\nconst availableMethods = computed(() => {\n const methods = props.availableMfaMethods || []\n // Temporarily disable hardware keys and passkeys until cross-domain WebAuthn is resolved\n return methods.filter(method =>\n method.device_type !== 'hardware' &&\n method.device_type !== 'passkey'\n )\n})\n\n// Auto-select if only one method available\nwatch(() => availableMethods.value, (methods) => {\n if (methods.length === 1) {\n selectedMethod.value = methods[0]\n } else if (methods.length === 0) {\n selectedMethod.value = null\n }\n}, { immediate: true })\n\n// Reset when modal opens/closes\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n // Reset state\n verificationCode.value = ''\n verificationError.value = ''\n backupCode.value = ''\n backupCodeError.value = ''\n showBackupCodeInput.value = false\n emailCodeSent.value = false\n cooldownActive.value = false\n cooldownSeconds.value = 0\n\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n\n // Loading state is already handled in useStrandsAuth when MFA is required\n\n // Auto-select method if only one available\n if (availableMethods.value.length === 1) {\n selectedMethod.value = availableMethods.value[0]\n\n // If the only method is email, automatically send the code\n if (selectedMethod.value.device_type === 'email') {\n // Small delay to ensure UI is ready\n setTimeout(async () => {\n try {\n await sendMfaEmailCode(selectedMethod.value!.id)\n emailCodeSent.value = true\n startCooldown()\n } catch (error) {\n emit('error', error instanceof Error ? error.message : 'Failed to send email code')\n // Even if auto-send fails, show the manual send button by not setting emailCodeSent to true\n }\n }, 100)\n }\n }\n } else {\n selectedMethod.value = null\n }\n})\n\nonBeforeUnmount(() => {\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst selectMethod = (method: MfaDevice) => {\n selectedMethod.value = method\n verificationCode.value = ''\n verificationError.value = ''\n emailCodeSent.value = false\n showBackupCodeInput.value = false\n}\n\nconst onCodeInput = (value: string) => {\n // Only allow digits for verification codes\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst onBackupCodeInput = (value: string) => {\n // Allow alphanumeric and hyphens for backup codes, normalize to lowercase\n // Remove any characters except letters, numbers, and hyphens\n let cleaned = value.replace(/[^a-zA-Z0-9-]/g, '').toLowerCase()\n\n // If the user is typing continuously without hyphens, auto-format with hyphens for xxxx-xxxx pattern\n if (!/[-]/.test(cleaned) && cleaned.length > 4) {\n // Format as xxxx-xxxx pattern\n const part1 = cleaned.substring(0, 4)\n const part2 = cleaned.substring(4, 8)\n cleaned = part2 ? `${part1}-${part2}` : part1\n }\n\n // Limit to xxxx-xxxx format (8 characters plus 1 hyphen = 9 total)\n if (cleaned.replace(/-/g, '').length <= 8) {\n backupCode.value = cleaned\n }\n\n backupCodeError.value = ''\n}\n\nconst sendEmailCode = async () => {\n if (!selectedMethod.value || selectedMethod.value.device_type !== 'email') return\n\n try {\n // Use the sign-in specific MFA email code method\n await sendMfaEmailCode(selectedMethod.value.id)\n emailCodeSent.value = true\n startCooldown()\n } catch (error) {\n emit('error', error instanceof Error ? error.message : 'Failed to send email code')\n }\n}\n\nconst startCooldown = () => {\n cooldownActive.value = true\n cooldownSeconds.value = 30\n\n cooldownInterval = setInterval(() => {\n cooldownSeconds.value -= 1\n if (cooldownSeconds.value <= 0) {\n cooldownActive.value = false\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n }, 1000)\n}\n\nconst verify = async () => {\n if (!selectedMethod.value || !verificationCode.value) return\n\n verificationError.value = ''\n\n try {\n await verifyMfa(selectedMethod.value.id, verificationCode.value)\n emit('success')\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst verifyBackupCode = async () => {\n if (!backupCode.value) return\n\n backupCodeError.value = ''\n\n try {\n await verifyMfa('', backupCode.value, true) // deviceId not needed for backup codes\n emit('success')\n } catch (error) {\n backupCodeError.value = error instanceof Error ? error.message : 'Invalid backup code'\n }\n}\n\nconst getDeviceIconComponent = (deviceType: string) => {\n switch (deviceType) {\n case 'totp':\n return IconSmartphone\n case 'email':\n return IconMail\n case 'hardware':\n return IconKeyRound\n case 'passkey':\n return IconShield\n default:\n return IconShield\n }\n}\n\nconst authenticateHardwareKey = async () => {\n // Use sessionId from props or auth composable\n const sessionId = props.sessionId || authMfaSessionId.value\n\n if (!selectedMethod.value || (selectedMethod.value.device_type !== 'hardware' && selectedMethod.value.device_type !== 'passkey') || !sessionId) {\n emit('error', 'Missing requirements for hardware key authentication')\n return\n }\n\n try {\n // Check if WebAuthn is supported\n if (!window.navigator.credentials || !window.PublicKeyCredential) {\n throw new Error('Hardware keys are not supported in this browser')\n }\n\n // Get WebAuthn challenge from backend\n const challengeResponse = await getMfaWebAuthnChallenge(selectedMethod.value.id)\n\n // Extract the publicKey from the challenge response\n const challengeData = challengeResponse.challenge.publicKey || challengeResponse.challenge\n\n // Helper function to convert base64 to Uint8Array\n const base64ToUint8Array = (base64: string) => {\n if (!base64 || typeof base64 !== 'string') {\n return new Uint8Array(0)\n }\n const padding = '='.repeat((4 - base64.length % 4) % 4)\n const b64 = (base64 + padding).replace(/-/g, '+').replace(/_/g, '/')\n const rawData = window.atob(b64)\n const outputArray = new Uint8Array(rawData.length)\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i)\n }\n return outputArray\n }\n\n // Use the challenge from backend with device-optimized parameters\n const isPasskey = selectedMethod.value.device_type === 'passkey'\n\n // Convert challenge and other binary fields from base64 to Uint8Array\n const publicKeyCredentialRequestOptions: any = {\n ...challengeData,\n challenge: challengeData.challenge ? base64ToUint8Array(challengeData.challenge) : new Uint8Array(32),\n timeout: isPasskey ? 300000 : (challengeData.timeout || 60000),\n userVerification: (isPasskey ? 'required' : 'discouraged') as UserVerificationRequirement\n }\n\n // Convert allowCredentials if present\n if (challengeData.allowCredentials && Array.isArray(challengeData.allowCredentials)) {\n publicKeyCredentialRequestOptions.allowCredentials = challengeData.allowCredentials.map((cred: any) => ({\n ...cred,\n id: base64ToUint8Array(cred.id)\n }))\n }\n\n // Get WebAuthn credential from hardware key\n const credential = await navigator.credentials.get({\n publicKey: publicKeyCredentialRequestOptions\n }) as PublicKeyCredential\n\n if (!credential) {\n throw new Error(`${selectedMethod.value.device_type === 'passkey' ? 'Passkey' : 'Hardware key'} authentication was cancelled`)\n }\n\n // Try to get device information from the authenticator data\n const authenticatorData = new Uint8Array((credential.response as AuthenticatorAssertionResponse).authenticatorData)\n\n // Extract AAGUID (Authenticator Attestation Globally Unique Identifier) for device identification\n // AAGUID is at bytes 37-52 of authenticator data\n let deviceInfo = 'Security Key'\n if (authenticatorData.length >= 53) {\n const aaguid = Array.from(authenticatorData.slice(37, 53))\n const aaguidHex = aaguid.map(b => b.toString(16).padStart(2, '0')).join('')\n\n // Common AAGUID to device name mapping\n const knownAAGUIDs: Record<string, string> = {\n '00000000000000000000000000000000': 'Generic Security Key',\n 'ee882879721c491397753dfcce97072a': 'YubiKey 5 Series',\n 'f8a011f38c0a4d15800617111f9edc7d': 'YubiKey 5 Series',\n '2fc0579f811347eab116bb5a8db9202a': 'YubiKey 5 Series',\n 'c5ef55ffad9a4b9fb580adcb7c15e233': 'YubiKey 5 Series',\n '6d44ba9bf6ec2e49b9300200c9a3376d': 'Google Titan Security Key',\n 'de1e552d14e14b1f9390f6d61b56e4d1': 'Feitian Security Key',\n '12ded745aa4e4b4f84be2736d6b1b2a5': 'SoloKeys Solo',\n '8876631bd4a0427f57730ec71c9e0279': 'Nitrokey FIDO2'\n }\n\n deviceInfo = knownAAGUIDs[aaguidHex] || `Security Key (${aaguidHex.substring(0, 8)}...)`\n }\n\n // Format the credential for the backend\n const credentialData = {\n id: credential.id,\n rawId: Array.from(new Uint8Array(credential.rawId)),\n response: {\n clientDataJSON: Array.from(new Uint8Array(credential.response.clientDataJSON)),\n authenticatorData: Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).authenticatorData)),\n signature: Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).signature)),\n userHandle: (credential.response as AuthenticatorAssertionResponse).userHandle ?\n Array.from(new Uint8Array((credential.response as AuthenticatorAssertionResponse).userHandle!)) : null\n },\n type: credential.type,\n deviceInfo: deviceInfo // Include detected device info\n }\n\n // Send the credential data to the backend using the frontend device ID\n await verifyMfa(selectedMethod.value.id, JSON.stringify(credentialData))\n\n emit('success')\n\n } catch (error) {\n console.error('Hardware key authentication error:', error)\n emit('error', error instanceof Error ? error.message : 'Hardware key authentication failed')\n }\n}\n</script>\n\n<style scoped>\n/* Modal width control - Extreme override for MFA verification */\n.mfa-verification-modal-wrapper :deep(.modal-overlay) {\n align-items: center !important;\n justify-content: center !important;\n}\n\n.mfa-verification-modal-wrapper :deep(.modal-container) {\n width: 32rem !important;\n max-width: 32rem !important;\n min-width: 32rem !important;\n /* Critical: Force the modal to maintain fixed width */\n flex-shrink: 0 !important;\n flex-grow: 0 !important;\n flex-basis: auto !important;\n box-sizing: border-box !important;\n /* Override any auto width */\n width: 512px !important;\n}\n\n@media (max-width: 36rem) {\n .mfa-verification-modal-wrapper :deep(.modal-container) {\n width: calc(100vw - 2rem) !important;\n min-width: auto !important;\n max-width: calc(100vw - 2rem) !important;\n }\n}\n\n/* Force content to respect modal bounds */\n.mfa-verification-modal-wrapper :deep(.modal-content) {\n width: 100% !important;\n max-width: 100% !important;\n overflow: hidden !important;\n box-sizing: border-box !important;\n}\n\n/* Force all descendant elements to wrap and not overflow */\n.mfa-verification-modal-wrapper :deep(.modal-content *) {\n max-width: 100% !important;\n word-wrap: break-word !important;\n overflow-wrap: break-word !important;\n box-sizing: border-box !important;\n}</style>\n\n<!-- Additional global style to ensure it overrides everything -->\n<style>\n/* Global override for MFA verification modal width issue */\n.mfa-verification-modal-wrapper .modal-container {\n width: 32rem !important;\n max-width: 32rem !important;\n min-width: 32rem !important;\n flex-shrink: 0 !important;\n flex-grow: 0 !important;\n box-sizing: border-box !important;\n}\n\n@media (max-width: 36rem) {\n .mfa-verification-modal-wrapper .modal-container {\n width: calc(100vw - 2rem) !important;\n min-width: auto !important;\n max-width: calc(100vw - 2rem) !important;\n }\n}\n\n/* Force text wrapping globally for this modal */\n.mfa-verification-modal-wrapper .modal-content * {\n max-width: 100% !important;\n word-wrap: break-word !important;\n overflow-wrap: break-word !important;\n box-sizing: border-box !important;\n}\n\n/* Header */\n.mfa-verification-header {\n text-align: center;\n}\n\n.mfa-verification-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.mfa-verification-subtitle {\n color: #4b5563;\n margin-top: 0.5rem;\n}\n\n/* Content */\n.mfa-verification-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n max-width: 100%;\n overflow: hidden;\n}\n\n/* Loading */\n.mfa-verification-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem 0;\n}\n\n.mfa-verification-loading-text {\n margin-left: 0.75rem;\n color: #4b5563;\n}\n\n/* Form */\n.mfa-verification-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 100%;\n overflow: hidden;\n}\n\n/* Methods section */\n.mfa-methods-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.mfa-methods-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n}\n\n.mfa-methods-grid {\n display: grid;\n gap: 0.5rem;\n}\n\n/* Method buttons */\n.mfa-method-button {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.75rem;\n border: 1px solid;\n border-radius: 0.5rem;\n transition: all 0.2s ease;\n cursor: pointer;\n background: none;\n text-align: left;\n width: 100%;\n}\n\n.mfa-method-button-default {\n border-color: #e5e7eb;\n background-color: transparent;\n}\n\n.mfa-method-button-default:hover {\n border-color: #d1d5db;\n background-color: #f9fafb;\n}\n\n.mfa-method-button-selected {\n border-color: var(--strands-primary, #EA00A8);\n background-color: rgba(234, 0, 168, 0.05);\n color: var(--strands-primary, #EA00A8);\n}\n\n.mfa-method-icon {\n color: var(--strands-primary, #EA00A8);\n}\n\n.mfa-method-info {\n text-align: left;\n flex: 1;\n}\n\n.mfa-method-name {\n font-weight: 500;\n margin: 0;\n}\n\n.mfa-method-type {\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n}\n\n.mfa-method-check {\n color: var(--strands-primary, #EA00A8);\n}\n\n/* Single method display */\n.mfa-single-method {\n background-color: #f9fafb;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.mfa-single-method-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.mfa-single-method-icon {\n color: var(--strands-primary, #EA00A8);\n}\n\n.mfa-single-method-name {\n font-weight: 500;\n color: #111827;\n margin: 0;\n}\n\n.mfa-single-method-type {\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n}\n\n/* Email request */\n.mfa-email-request {\n text-align: center;\n}\n\n.mfa-email-request-text {\n font-size: 0.875rem;\n color: #4b5563;\n margin-bottom: 1rem;\n}\n\n/* Hardware section */\n.mfa-hardware-section {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.mfa-hardware-prompt {\n background-color: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.mfa-hardware-prompt-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.mfa-hardware-prompt-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dbeafe;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mfa-hardware-icon-svg {\n width: 1.5rem;\n height: 1.5rem;\n color: #2563eb;\n}\n\n.mfa-hardware-prompt-text {\n text-align: left;\n}\n\n.mfa-hardware-prompt-title {\n font-weight: 500;\n color: #1e3a8a;\n margin: 0;\n}\n\n.mfa-hardware-prompt-description {\n font-size: 0.875rem;\n color: #1d4ed8;\n margin: 0;\n}\n\n/* Backup option */\n.mfa-backup-option {\n padding-top: 1rem;\n border-top: 1px solid #e5e7eb;\n display: flex;\n justify-content: center;\n}\n\n.mfa-backup-toggle-button {\n font-size: 0.875rem;\n color: #6b7280;\n justify-content: flex-start;\n gap: 0.5rem;\n}\n\n.mfa-backup-toggle-button:hover {\n color: #374151;\n background-color: #f9fafb;\n}\n\n.mfa-backup-toggle-icon {\n flex-shrink: 0;\n}\n\n/* Backup input section */\n.mfa-backup-input-section {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n background-color: #fffbeb;\n border: 1px solid #fde68a;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.mfa-backup-warning {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.75rem;\n}\n\n.mfa-backup-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #d97706;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.mfa-backup-warning-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #92400e;\n margin: 0;\n}\n\n.mfa-backup-warning-description {\n font-size: 0.875rem;\n color: #b45309;\n margin-top: 0.25rem;\n}\n\n.mfa-backup-input {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, 'Liberation Mono', Menlo, monospace;\n}\n\n/* Code section */\n.mfa-code-section {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 100%;\n overflow: hidden;\n}\n\n/* Email confirmation */\n.mfa-email-confirmation {\n background-color: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.mfa-email-confirmation-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.mfa-email-confirmation-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #059669;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.mfa-email-confirmation-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #166534;\n margin: 0;\n}\n\n.mfa-email-confirmation-description {\n font-size: 0.875rem;\n color: #15803d;\n margin-top: 0.25rem;\n}\n\n/* TOTP help - Force aggressive text wrapping */\n.mfa-totp-help {\n font-size: 0.875rem;\n color: #4b5563;\n line-height: 1.5;\n /* Force wrapping at all costs */\n word-wrap: break-word !important;\n overflow-wrap: anywhere !important;\n word-break: break-word !important;\n hyphens: auto !important;\n white-space: normal !important;\n /* Ensure no overflow */\n max-width: 100% !important;\n width: 100% !important;\n overflow: hidden !important;\n display: block !important;\n box-sizing: border-box !important;\n}\n\n.mfa-device-name-text {\n /* Break device names aggressively to prevent expansion */\n word-break: break-all !important;\n overflow-wrap: anywhere !important;\n word-wrap: break-word !important;\n display: inline !important;\n max-width: 100% !important;\n overflow: hidden !important;\n}\n\n/* Email resend */\n.mfa-email-resend {\n display: flex;\n justify-content: flex-end;\n font-size: 0.875rem;\n}\n\n.mfa-resend-button {\n color: var(--strands-primary, #EA00A8);\n font-size: 0.875rem;\n}\n\n.mfa-resend-button:hover:not(:disabled) {\n color: #B8006F;\n background-color: rgba(234, 0, 168, 0.05);\n}\n\n.mfa-resend-button:disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n\n/* Footer */\n.mfa-verification-footer {\n display: flex;\n justify-content: space-between;\n}\n\n/* Backup input field */\n.mfa-backup-input {\n font-family: ui-monospace, SFMono-Regular, 'SF Mono', Consolas, 'Liberation Mono', Menlo, monospace;\n}\n</style>","import { ref, computed } from 'vue'\nimport { useStrandsConfig } from './useStrandsConfig'\n\nexport interface OAuthProvider {\n id: string\n name: string\n displayName?: string\n icon?: string\n iconUrl?: string\n auth_url: string\n scopes: string[]\n enabled: boolean\n metadata?: Record<string, string>\n}\n\nexport interface OAuthProvidersResponse {\n providers: OAuthProvider[]\n redirect_url: string\n}\n\nexport interface OAuthProviderDetailsResponse {\n success: boolean\n data: {\n provider: OAuthProvider\n authUrl: string\n state?: string\n }\n error?: {\n code: string\n message: string\n details?: any\n }\n}\n\nexport interface UseOAuthProvidersOptions {\n redirectUrl?: string\n scopes?: string[]\n}\n\nexport function useOAuthProviders(options: UseOAuthProvidersOptions = {}) {\n const { getUrl, config } = 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 let url = getUrl('oauthProviders')\n \n // Add redirect_url parameter if configured\n const redirectUrl = options.redirectUrl || config.value?.oauth2RedirectUrl\n if (redirectUrl) {\n const params = new URLSearchParams()\n \n // Convert relative URLs to absolute URLs\n let absoluteRedirectUrl = redirectUrl\n if (redirectUrl.startsWith('/')) {\n // Get the current origin\n const currentOrigin = window.location.origin\n absoluteRedirectUrl = `${currentOrigin}${redirectUrl}`\n }\n \n params.append('redirect_url', absoluteRedirectUrl)\n url = `${url}?${params.toString()}`\n }\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProvidersResponse = await response.json()\n \n // The API returns { providers: [...], redirect_url: \"...\" }\n providers.value = result.providers || []\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch OAuth providers'\n error.value = errorMessage\n } finally {\n loading.value = false\n }\n }\n\n const getProviderAuthUrl = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ): Promise<string> => {\n const mergedOptions = { ...options, ...customOptions }\n \n // Build query parameters\n const params = new URLSearchParams()\n \n if (mergedOptions.redirectUrl) {\n // Convert relative URLs to absolute URLs\n let absoluteRedirectUrl = mergedOptions.redirectUrl\n if (mergedOptions.redirectUrl.startsWith('/')) {\n const currentOrigin = window.location.origin\n absoluteRedirectUrl = `${currentOrigin}${mergedOptions.redirectUrl}`\n }\n params.append('redirect_url', absoluteRedirectUrl)\n }\n \n if (mergedOptions.scopes && mergedOptions.scopes.length > 0) {\n params.append('scopes', mergedOptions.scopes.join(','))\n }\n\n const queryString = params.toString()\n const providerUrl = getUrl('oauthProvider').replace('{provider_id}', providerId)\n const fullUrl = queryString ? `${providerUrl}?${queryString}` : providerUrl\n\n try {\n const response = await fetch(fullUrl, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result: OAuthProviderDetailsResponse = await response.json()\n \n if (!result.success) {\n throw new Error(result.error?.message || 'Failed to get OAuth auth URL')\n }\n\n return result.data.authUrl\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to get OAuth auth URL'\n throw new Error(errorMessage)\n }\n }\n\n const redirectToProvider = async (\n providerId: string, \n customOptions?: Partial<UseOAuthProvidersOptions>\n ) => {\n try {\n // Find the provider and use its auth_url directly\n const provider = providers.value.find(p => p.id === providerId)\n if (!provider) {\n throw new Error(`OAuth provider '${providerId}' not found`)\n }\n \n if (!provider.auth_url) {\n throw new Error(`No auth URL configured for provider '${providerId}'`)\n }\n \n window.location.href = provider.auth_url\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Failed to redirect to OAuth provider'\n throw err\n }\n }\n\n const getProviderById = (providerId: string) => {\n return providers.value.find(provider => provider.id === providerId)\n }\n\n const getProviderIcon = (provider: OAuthProvider): string => {\n // Return custom icon URL if provided, otherwise use built-in icons\n if (provider.iconUrl) {\n return provider.iconUrl\n }\n\n // Built-in SVG icons for common providers\n switch (provider.id.toLowerCase()) {\n case 'google':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik0yMi41NiAxMi4yNWMwLS43OC0uMDctMS41My0uMi0yLjI1SDEydjQuMjZoNS45MmMtLjI2IDEuMzctMS4wNCAyLjUzLTIuMjEgMy4zMXYyLjc3aDMuNTdjMi4wOC0xLjkyIDMuMjgtNC43NCAzLjI4LTguMDl6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTEyIDIzYzIuOTcgMCA1LjQ2LS45OCA3LjI4LTIuNjZsLTMuNTctMi43N2MtLjk4LjY2LTIuMjMgMS4wNi0zLjcxIDEuMDYtMi44NiAwLTUuMjktMS45My02LjE2LTQuNTNIMi4xOHYyLjg0QzMuOTkgMjAuNTMgNy43IDIzIDEyIDIzeiIvPjxwYXRoIGZpbGw9IiNGQkJDMDUiIGQ9Ik01Ljg0IDE0LjA5Yy0uMjItLjY2LS4zNS0xLjM2LS4zNS0yLjA5cy4xMy0xLjQzLjM1LTIuMDlWNy4wN0gyLjE4QzEuNDMgOC41NSAxIDEwLjIyIDEgMTJzLjQzIDMuNDUgMS4xOCA0LjkzbDIuODUtMi4yMi44MS0uNjJ6Ii8+PHBhdGggZmlsbD0iI0VBNDMzNSIgZD0iTTEyIDUuMzhjMS42MiAwIDMuMDYuNTYgNC4yMSAxLjY0bDMuMTUtMy4xNUMxNy40NSAyLjA5IDE0Ljk3IDEgMTIgMSA3LjcgMSAzLjk5IDMuNDcgMi4xOCA3LjA3bDMuNjYgMi44NGMuODctMi42IDMuMy00LjUzIDYuMTYtNC41M3oiLz48L3N2Zz4='\n case 'github':\n return 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJjdXJyZW50Q29sb3IiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDBoLTEyYy02LjYyNiAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDIgMy40MzggOS44IDguMjA3IDExLjM4Ny41OTkuMTExLjc5My0uMjYxLjc5My0uNTc3di0yLjIzNGMtMy4zMzguNzI2LTQuMDMzLTEuNDE2LTQuMDMzLTEuNDE2LS41NDYtMS4zODctMS4zMzMtMS43NTYtMS4zMzMtMS43NTYtMS4wODktLjc0NS4wODMtLjcyOS4wODMtLjcyOSAxLjIwNS4wODQgMS44MzkgMS4yMzcgMS44MzkgMS4yMzcgMS4wNyAxLjgzNCAyLjgwNyAxLjMwNCAzLjQ5Mi45OTcuMTA3LS43NzUuNDE4LTEuMzA1Ljc2Mi0xLjYwNC0yLjY2NS0uMzA1LTUuNDY3LTEuMzM0LTUuNDY3LTUuOTMxIDAtMS4zMTEuNDY5LTIuMzgxIDEuMjM2LTMuMjIxLS4xMjQtLjMwMy0uNTM1LTEuNTI0LjExNy0zLjE3NiAwIDAgMS4wMDgtLjMyMiAzLjMwMSAxLjIzLjk1Ny0uMjY2IDEuOTgzLS4zOTkgMy4wMDMtLjQwNCAxLjAyLjAwNSAyLjA0Ny4xMzggMy4wMDYuNDA0IDIuMjkxLTEuNTUyIDMuMjk3LTEuMjMgMy4yOTctMS4yMy42NTMgMS42NTMuMjQyIDIuODc0LjExOCAzLjE3Ni43Ny44NCAxLjIzNSAxLjkxMSAxLjIzNSAzLjIyMSAwIDQuNjA5LTIuODA3IDUuNjI0LTUuNDc5IDUuOTIxLjQzLjM3Mi44MjMgMS4xMDIuODIzIDIuMjIydjMuMjkzYzAgLjMxOS4xOTIuNjk0LjgwMS41NzYgNC43NjUtMS41ODkgOC4xOTktNi4wODYgOC4xOTktMTEuMzg2IDAtNi42MjctNS4zNzMtMTItMTItMTJ6Ii8+PC9zdmc+'\n case 'microsoft':\n case 'azure':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxyZWN0IGZpbGw9IiNmMjUwMjIiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIvPjxyZWN0IGZpbGw9IiM3ZmJhMDAiIHg9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48cmVjdCBmaWxsPSIjMDBhNGVmIiB5PSIxMyIgd2lkdGg9IjExIiBoZWlnaHQ9IjExIi8+PHJlY3QgZmlsbD0iI2ZmYjkwMCIgeD0iMTMiIHk9IjEzIiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiLz48L3N2Zz4='\n case 'discord':\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM1ODY1RjIiPjxwYXRoIGQ9Ik0yMC4zMTcgNC4zNjk2QTE5Ljc5MTMgMTkuNzkxMyAwIDAgMCAxOC4yMDU4IDMuMzY5NmMtLjk2NDIuMzU2NC0xLjk5NTguNjE1NC0zLjA1OC43NzNhMTQuNzI0NCAxNC43MjQ0IDAgMCAwLTYuMjk1NCAwIDEzLjU0OTQgMTMuNTQ5NCAwIDAgMC0zLjA1OC0uNzczIDEzLjY5MyAxMy42OTMgMCAwIDAtNS4wNjc2LTEuMjc5NCAyMC4xOTg0IDIwLjE5ODQgMCAwIDAtMi42NDk3IDkuMTE2MyAyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4IDIuNjNjMS4zMzIyLjEyNTggMi42NjUuMTcyMiA0LjA0NC4xNzIyaDEuMzE1NGMxLjM3OSAwIDIuNzExOC0uMDQ2NCA0LjA0NC0uMTcyMmEyMC4yODE4IDIwLjI4MTggMCAwIDAgMi4zNzU4LTIuNjMgMjAuMTk4NCAyMC4xOTg0IDAgMCAwIDIuNjQ5Ny05LjExNjNBMTkuNzkxMyAxOS43OTEzIDAgMCAwIDIwLjMxNyA0LjM2OTZ6TTE4LjE5IDEyQzE3LjY3IDE0LjQ5IDEzLjk5IDE2IDEyIDE2UzYuMzMgMTQuNDkgNS44MSAxMmMuNTItMi40OSA0LjE5LTQgNi4xOS00UzE3LjY3IDkuNTEgMTguMTkgMTJ6Ii8+PC9zdmc+'\n default:\n // Return a generic icon for unknown providers\n return 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48dGV4dCB4PSIxMiIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IndoaXRlIiBmb250LXNpemU9IjEyIj57cHJvdmlkZXIuaWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC90ZXh0Pjwvc3ZnPg=='\n }\n }\n\n return {\n providers: computed(() => providers.value),\n enabledProviders,\n loading: computed(() => loading.value),\n error: computed(() => error.value),\n fetchProviders,\n getProviderAuthUrl,\n redirectToProvider,\n getProviderById,\n getProviderIcon\n }\n}\n","<template>\n <div class=\"accui-component-scope\">\n <div :class=\"props.inModal ? 'auth-container-modal auth-full-width auth-min-width' : 'auth-container auth-full-width auth-min-width auth-max-width auth-center auth-slide-up'\">\n <div :class=\"props.inModal ? 'auth-content-modal' : 'auth-content auth-card-modern'\">\n <!-- Header -->\n <div class=\"auth-header\">\n <Transition name=\"fade\" mode=\"out-in\">\n <h1 :key=\"currentMode\" class=\"auth-title\">\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=\"auth-subtitle\">\n {{ isPasswordReset ? 'Enter your email address and we\\'ll send you a link' : 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 \n name=\"smooth-height\" \n @before-enter=\"onBeforeEnter\" \n @enter=\"onEnter\" \n @before-leave=\"onBeforeLeave\" \n @leave=\"onLeave\" \n @after-leave=\"onAfterLeave\"\n >\n <div v-if=\"!isPasswordReset\" class=\"auth-tabs-container\">\n <StrandsUiTabs v-model=\"currentMode\" :tabs=\"[\n { label: 'Sign In', value: 'signin' },\n { label: 'Sign Up', value: 'signup' }\n ]\" />\n </div>\n </Transition>\n\n <!-- OAuth Providers (not shown for password reset) -->\n <Transition \n name=\"smooth-height\" \n @before-enter=\"onBeforeEnter\" \n @enter=\"onEnter\" \n @before-leave=\"onBeforeLeave\" \n @leave=\"onLeave\" \n @after-leave=\"onAfterLeave\"\n >\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"auth-oauth-providers\">\n <StrandsUiButton \n v-for=\"provider in displayProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthAuth(provider.id)\" \n class=\"auth-oauth-button\"\n >\n <div class=\"auth-oauth-icon-container\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"auth-oauth-icon\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"auth-oauth-icon\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"auth-oauth-icon\">\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=\"auth-oauth-icon auth-oauth-github\" 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=\"auth-oauth-generic-icon\">\n <span class=\"auth-oauth-generic-text\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"auth-oauth-text\">\n Continue with {{ provider.displayName || provider.name.charAt(0).toUpperCase() + provider.name.slice(1) }}\n </span>\n </StrandsUiButton>\n </div>\n </Transition>\n\n <!-- Divider (not shown for password reset) -->\n <Transition \n name=\"smooth-height\" \n @before-enter=\"onBeforeEnter\" \n @enter=\"onEnter\" \n @before-leave=\"onBeforeLeave\" \n @leave=\"onLeave\" \n @after-leave=\"onAfterLeave\"\n >\n <div v-if=\"!isPasswordReset && displayProviders?.length\" class=\"auth-divider\">\n <span class=\"auth-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=\"auth-form\">\n <div>\n <!-- Email -->\n <div :class=\"['email-field-spacing', (!isPasswordReset && !isSignUp) ? 'has-password' : 'no-password']\">\n <StrandsUiInput v-model=\"form.email\" type=\"email\" label=\"Email address\" placeholder=\"Enter your email\" required\n autocomplete=\"email\" :error=\"error && !form.email ? 'Email is required' : ''\" />\n </div>\n\n <!-- Password (Sign In Only) -->\n <Transition \n name=\"smooth-height\" \n @before-enter=\"onBeforeEnter\" \n @enter=\"onEnter\" \n @before-leave=\"onBeforeLeave\" \n @leave=\"onLeave\" \n @after-leave=\"onAfterLeave\"\n >\n <div v-if=\"!isPasswordReset && !isSignUp\" class=\"auth-password-field\">\n <div class=\"auth-password-header\">\n <span class=\"auth-password-label\">Password</span>\n <StrandsUiLink variant=\"primary\" size=\"sm\" @click=\"currentMode = 'reset-password'\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <StrandsUiInput v-model=\"form.password\" type=\"password\"\n placeholder=\"Enter your password\" required\n autocomplete=\"current-password\"\n :error=\"error && !form.password ? 'Password is required' : ''\" />\n </div>\n </Transition>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"buttonLoading || !isFormValid\" :loading=\"buttonLoading\"\n :loading-text=\"loadingMessage\">\n {{ isPasswordReset\n ? (isPasswordResetSubmitted\n ? 'Link sent!'\n : 'Send reset link')\n : isSignUp\n ? 'Send magic link'\n : 'Sign in'\n }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message for Password Reset -->\n <Transition name=\"expand\" mode=\"out-in\">\n <StrandsUiAlert v-if=\"isPasswordReset && isPasswordResetSubmitted\" key=\"reset-success\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"auth-success-alert\" />\n </Transition>\n\n <!-- Back to Sign In (Password Reset Only) -->\n <Transition \n name=\"smooth-height\" \n @before-enter=\"onBeforeEnter\" \n @enter=\"onEnter\" \n @before-leave=\"onBeforeLeave\" \n @leave=\"onLeave\" \n @after-leave=\"onAfterLeave\"\n >\n <div v-if=\"isPasswordReset\" class=\"auth-back-link-container\">\n <StrandsUiLink @click=\"currentMode = 'signin'\" class=\"auth-back-link\">\n <svg class=\"auth-back-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n </Transition>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"auth-error-alert\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <Transition name=\"support-fade\" v-if=\"getSupportEmail()\">\n <p class=\"auth-support-text\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </Transition>\n </StrandsSecuredFooter>\n </div>\n </div>\n \n <!-- MFA Verification Modal -->\n <StrandsMfaVerification\n :show=\"showMfaVerification\"\n :available-mfa-methods=\"availableMfaMethods\"\n @success=\"handleMfaSuccess\"\n @close=\"handleMfaClose\"\n @error=\"handleMfaError\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, watch, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink, StrandsUiTabs } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaVerification from './StrandsMfaVerification.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n mode?: 'signin' | 'signup' | 'reset-password'\n redirectUrl?: string\n inModal?: boolean\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 inModal: false,\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { \n signIn, \n setAuthData, \n mfaRequired, \n availableMfaMethods,\n verifyMfa,\n sendMfaEmailCode,\n currentUser,\n loadingMessage\n} = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider,\n getProviderIcon\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\n// Computed property to determine which providers to show\nconst displayProviders = computed(() => {\n // Only show providers from API\n return enabledProviders.value\n})\n\n// Auth API functions\nconst authApi = {\n async signIn(email: string, password: string): Promise<AuthResponse> {\n const response = await fetch(getUrl('signIn'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password }),\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Invalid email or password')\n } else if (response.status === 403) {\n throw new Error('Please verify your email address before signing in')\n } else {\n throw new Error(`Sign in failed: ${response.status} ${response.statusText}`)\n }\n }\n\n const result: AuthResponse = await response.json()\n return result\n },\n\n async signUp(email: string, password: string, firstName: string, lastName: string) {\n const response = await fetch(getUrl('signUp'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email, password, firstName, lastName }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n \n return result.message\n },\n\n async requestPasswordReset(email: string) {\n // Integration point: This endpoint needs to be added to the accounts-api\n // For now, we'll show a placeholder message\n throw new Error('Password reset functionality is not yet implemented in the API. Please contact support.')\n \n /* When the endpoint is added, use this:\n const response = await fetch(getUrl('passwordReset'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ email }),\n })\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.error?.message || `HTTP ${response.status}: ${response.statusText}`)\n }\n\n const result = await response.json()\n if (!result.success) {\n throw new Error(result.error?.message || 'Password reset request failed')\n }\n\n return result.data\n */\n }\n}\n\nconst currentMode = ref(props.mode)\nconst buttonLoading = ref(false)\nconst error = ref('')\nconst isPasswordResetSubmitted = ref(false)\nconst showMfaVerification = 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\n// Watch for MFA requirement\nwatch(mfaRequired, (required) => {\n if (required) {\n showMfaVerification.value = true\n }\n}, { immediate: true })\n\n// MFA handlers\nconst handleMfaSuccess = () => {\n showMfaVerification.value = false\n // The auth composable will have updated the user state\n emit('success', currentUser.value)\n}\n\nconst handleMfaClose = () => {\n showMfaVerification.value = false\n // Reset form or allow user to try again\n}\n\nconst handleMfaError = (errorMessage: string) => {\n error.value = errorMessage\n emit('error', errorMessage)\n}\n\nconst handleAuth = async () => {\n buttonLoading.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 using MFA-enabled composable\n const response = await signIn({\n email: form.email,\n password: form.password\n })\n \n // If MFA is not required, emit success immediately\n if (!response.mfa_required) {\n emit('success', response.user)\n }\n // If MFA is required, the MFA modal will be shown automatically\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 buttonLoading.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\n// Enhanced transition handlers with staggered timing for multiple elements\nlet transitionCounter = 0\n\nconst onBeforeEnter = (el: Element) => {\n const element = el as HTMLElement\n // Set initial state immediately without any margins or padding\n element.style.height = '0'\n element.style.opacity = '0'\n element.style.marginTop = '0'\n element.style.marginBottom = '0'\n element.style.paddingTop = '0'\n element.style.paddingBottom = '0'\n element.style.overflow = 'hidden'\n}\n\nconst onEnter = (el: Element, done: () => void) => {\n const element = el as HTMLElement\n \n // Add small stagger delay for multiple elements\n const currentIndex = transitionCounter++\n const staggerDelay = currentIndex * 50 // 50ms stagger\n \n setTimeout(() => {\n // Force a reflow to ensure the initial state is applied\n element.offsetHeight\n \n // Get the natural height by temporarily removing height constraint\n element.style.height = 'auto'\n const height = element.offsetHeight\n element.style.height = '0'\n \n // Force another reflow\n element.offsetHeight\n \n // Start the transition\n element.style.transition = 'height 350ms cubic-bezier(0.23, 1, 0.32, 1), opacity 350ms cubic-bezier(0.23, 1, 0.32, 1), margin 350ms cubic-bezier(0.23, 1, 0.32, 1), padding 350ms cubic-bezier(0.23, 1, 0.32, 1)'\n \n // Apply final state\n requestAnimationFrame(() => {\n element.style.height = height + 'px'\n element.style.opacity = '1'\n element.style.marginTop = ''\n element.style.marginBottom = ''\n element.style.paddingTop = ''\n element.style.paddingBottom = ''\n })\n \n // Clean up after transition\n setTimeout(() => {\n element.style.height = ''\n element.style.transition = ''\n element.style.overflow = ''\n done()\n }, 350)\n }, staggerDelay)\n}\n\nconst onBeforeLeave = (el: Element) => {\n const element = el as HTMLElement\n // Set the current height explicitly before starting transition\n const height = element.offsetHeight\n element.style.height = height + 'px'\n element.style.overflow = 'hidden'\n \n // Reset counter when elements start leaving\n transitionCounter = 0\n}\n\nconst onLeave = (el: Element, done: () => void) => {\n const element = el as HTMLElement\n \n // Add small stagger delay for leave transitions too\n const currentIndex = transitionCounter++\n const staggerDelay = currentIndex * 30 // 30ms stagger for leaving\n \n setTimeout(() => {\n // Force a reflow\n element.offsetHeight\n \n // Start the transition with slightly faster leave animation\n element.style.transition = 'height 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1), margin 300ms cubic-bezier(0.23, 1, 0.32, 1), padding 300ms cubic-bezier(0.23, 1, 0.32, 1)'\n \n // Apply final state\n requestAnimationFrame(() => {\n element.style.height = '0'\n element.style.opacity = '0'\n element.style.marginTop = '0'\n element.style.marginBottom = '0'\n element.style.paddingTop = '0'\n element.style.paddingBottom = '0'\n })\n \n // Clean up after transition\n setTimeout(() => {\n element.style.height = ''\n element.style.opacity = ''\n element.style.margin = ''\n element.style.padding = ''\n element.style.transition = ''\n element.style.overflow = ''\n done()\n }, 300)\n }, staggerDelay)\n}\n\nconst onAfterLeave = (el: Element) => {\n const element = el as HTMLElement\n // Final cleanup - ensure all inline styles are removed\n element.style.height = ''\n element.style.opacity = ''\n element.style.margin = ''\n element.style.padding = ''\n element.style.transition = ''\n element.style.overflow = ''\n}\n</script>\n\n<style scoped>\n/* Simple fade transition - gentle and smooth */\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 350ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n/* Smooth height transitions - handled entirely by JavaScript */\n.smooth-height-enter-active,\n.smooth-height-leave-active {\n /* JavaScript handles all transition logic */\n}\n\n/* Support block transition - gentle fade with subtle scale */\n.support-fade-enter-active,\n.support-fade-leave-active {\n transition: all 400ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.support-fade-enter-from {\n opacity: 0;\n transform: scale(0.97) translateY(8px);\n}\n\n.support-fade-leave-to {\n opacity: 0;\n transform: scale(0.99) translateY(-4px);\n}\n\n.support-fade-enter-to,\n.support-fade-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Expand transition - for alerts using modern height animation */\n.expand-enter-active,\n.expand-leave-active {\n overflow: hidden;\n}\n\n/* Modern browsers with interpolate-size support for expand */\n@supports (interpolate-size: allow-keywords) {\n .expand-enter-active,\n .expand-leave-active {\n interpolate-size: allow-keywords;\n }\n \n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n height: auto;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Fallback for expand in older browsers */\n@supports not (interpolate-size: allow-keywords) {\n .expand-enter-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-leave-active {\n transition: \n opacity 550ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 550ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 550ms cubic-bezier(0.16, 1, 0.3, 1);\n }\n \n .expand-enter-from {\n opacity: 0;\n max-height: 0;\n transform: scale(0.99) translateY(-2px);\n }\n \n .expand-leave-to {\n opacity: 0;\n max-height: 0;\n transform: scale(0.997) translateY(1px);\n }\n \n .expand-enter-to,\n .expand-leave-from {\n opacity: 1;\n max-height: 150px;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Loading pulse animation */\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n}\n\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n\n/* Slide up animation for main container - elegant entrance */\n@keyframes slide-up {\n from {\n opacity: 0;\n transform: translateY(24px) scale(0.96);\n filter: blur(2px);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n filter: blur(0px);\n }\n}\n\n.animate-slide-up {\n animation: slide-up 600ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Fade in animation for alerts - gentle appearance */\n@keyframes fade-in {\n from {\n opacity: 0;\n transform: scale(0.97) translateY(6px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.animate-fade-in {\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Email field spacing animation */\n.email-field-spacing {\n transition: margin-bottom 500ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.email-field-spacing.has-password {\n margin-bottom: 1rem; /* mb-4 equivalent */\n}\n\n.email-field-spacing.no-password {\n margin-bottom: 0;\n}\n\n/* Password field transitions now handled by JavaScript smooth-height system */\n\n/* Auth Container Styles */\n.auth-full-width {\n width: 100%;\n}\n\n.auth-min-width {\n min-width: 100px;\n}\n\n.auth-max-width {\n max-width: 28rem;\n}\n\n.auth-center {\n margin-left: auto;\n margin-right: auto;\n}\n\n.auth-slide-up {\n animation: slide-up 600ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n.auth-card-modern {\n background: white;\n border-radius: 0.5rem;\n padding: 2rem;\n box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n}\n\n/* Header Styles */\n.auth-header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.auth-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 100%);\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.auth-subtitle {\n color: #737373;\n}\n\n/* Tabs Container */\n.auth-tabs-container {\n margin-bottom: 2rem;\n}\n\n/* OAuth Provider Styles */\n.auth-oauth-providers {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1.5rem;\n}\n\n.auth-oauth-button {\n /* Button styles will be handled by the UiButton component */\n}\n\n.auth-oauth-icon-container {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.auth-oauth-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.auth-oauth-github {\n fill: currentColor;\n}\n\n.auth-oauth-generic-icon {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background-color: #d4d4d8;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.auth-oauth-generic-text {\n font-size: 0.75rem;\n font-weight: 600;\n color: #525252;\n}\n\n.auth-oauth-text {\n font-weight: 500;\n}\n\n/* Divider Styles */\n.auth-divider {\n position: relative;\n margin: 1.5rem 0;\n text-align: center;\n}\n\n.auth-divider::before {\n content: '';\n position: absolute;\n top: 50%;\n left: 0;\n right: 0;\n height: 1px;\n background: #e5e5e5;\n}\n\n.auth-divider-text {\n background: white;\n padding: 0 1rem;\n color: #737373;\n font-size: 0.875rem;\n position: relative;\n z-index: 1;\n}\n\n/* Form Styles */\n.auth-form {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.auth-password-field {\n margin-bottom: 1rem;\n}\n\n.auth-password-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 0.5rem;\n}\n\n.auth-password-label {\n font-size: 0.875rem;\n font-weight: 500;\n color: #374151;\n}\n\n/* Alert Styles */\n.auth-success-alert {\n margin-top: 1.5rem;\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n.auth-error-alert {\n margin-top: 1.5rem;\n animation: fade-in 400ms cubic-bezier(0.25, 0.46, 0.45, 0.94);\n}\n\n/* Back Link Styles */\n.auth-back-link-container {\n margin-top: 2rem;\n text-align: center;\n}\n\n.auth-back-link {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.auth-back-icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Support Text */\n.auth-support-text {\n color: #a3a3a3;\n font-size: 0.875rem;\n}\n\n/* Modal-specific styles - removes border, radius, background, and padding */\n.auth-container-modal {\n /* Remove any container-specific styles when in modal */\n}\n\n.auth-content-modal {\n /* Remove card styling when in modal */\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n}\n\n</style>","<template>\n <div class=\"accui-component-scope\">\n <div class=\"accui-w-full accui-min-w-100 accui-max-w-md accui-mx-auto accui-animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"accui-text-center accui-mb-8\">\n <h1 class=\"accui-text-3xl accui-font-bold accui-text-gradient accui-mb-2\">Welcome back</h1>\n <p class=\"accui-text-neutral-600\">Sign in to your account to continue</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"accui-space-y-3 accui-mb-6\">\n <StrandsUiButton v-for=\"provider in enabledProviders\" :key=\"provider.id\" variant=\"outline\" full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignIn(provider.id)\" class=\"btn-oauth accui-group\">\n <div class=\"accui-w-5 accui-h-5 accui-flex accui-items-center accui-justify-center\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"accui-w-5 accui-h-5\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"accui-w-5 accui-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=\"accui-w-5 accui-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=\"accui-w-5 accui-h-5 accui-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=\"accui-w-5 accui-h-5 accui-rounded-full accui-bg-neutral-300 accui-flex accui-items-center accui-justify-center\">\n <span class=\"accui-text-xs accui-font-semibold accui-text-neutral-600\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"accui-font-medium\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or sign in with email</span>\n </div>\n\n <!-- Email/Password Form -->\n <form @submit.prevent=\"handleSignIn\" class=\"accui-gap-6 accui-flex accui-flex-col\">\n <div>\n <!-- Email -->\n <div class=\"email-field-spacing has-password\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required\n :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n\n <!-- Password -->\n <div class=\"accui-mb-4\">\n <span class=\"accui-text-sm accui-font-medium accui-text-neutral-700 accui-block accui-mb-2\">Password</span>\n <StrandsUiInput id=\"password\" v-model=\"form.password\" type=\"password\" placeholder=\"Enter your password\"\n autocomplete=\"current-password\" required :error=\"error ? 'Invalid email or password' : undefined\" />\n </div>\n </div>\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email || !form.password\"\n :loading=\"loading\" :loading-text=\"'Signing in...'\">\n Sign in\n </StrandsUiButton>\n </form>\n\n <!-- Forgot password link - moved outside form to control tab order -->\n <div class=\"accui-text-center accui-mt-4\">\n <StrandsUiLink @click=\"$emit('forgot-password')\" class=\"accui-text-sm\">\n Forgot password?\n </StrandsUiLink>\n </div>\n\n <!-- Error Alert -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"accui-mt-6 accui-animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Sign up link -->\n <div class=\"accui-mt-8 accui-text-center\">\n <p class=\"accui-text-sm accui-text-neutral-600\">\n Don't have an account?\n <StrandsUiLink @click=\"$emit('switch-to-signup')\">\n Sign up\n </StrandsUiLink>\n </p>\n </div>\n\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"accui-text-neutral-400 accui-text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n \n <!-- MFA Verification Modal -->\n <StrandsMfaVerification\n :show=\"showMfaVerification\"\n :available-mfa-methods=\"availableMfaMethods\"\n :session-id=\"mfaSessionId\"\n @success=\"handleMfaSuccess\"\n @close=\"handleMfaClose\"\n @error=\"handleMfaError\"\n />\n \n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaVerification from './StrandsMfaVerification.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'forgot-password'): void\n (e: 'switch-to-signup'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Authentication state management\nconst { \n signIn,\n mfaRequired,\n mfaSessionId,\n availableMfaMethods,\n loading: authLoading,\n currentUser,\n sendMfaEmailCode \n} = useStrandsAuth()\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = computed(() => authLoading.value)\nconst error = ref('')\nconst showMfaVerification = ref(false)\n\n// Watch for MFA requirement\nwatch(mfaRequired, (required) => {\n if (required) {\n showMfaVerification.value = true\n }\n})\n\nconst form = reactive({\n email: '',\n password: ''\n})\n\nconst handleSignIn = async () => {\n error.value = ''\n \n try {\n const authData = await signIn({\n email: form.email,\n password: form.password,\n })\n \n // If MFA is not required, emit success immediately\n if (!authData.mfa_required) {\n emit('success', authData.user)\n }\n // If MFA is required, the watch on mfaRequired will show the MFA modal\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Sign in failed'\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n\nconst handleMfaSuccess = () => {\n showMfaVerification.value = false\n // The auth composable will have updated the user state\n emit('success', currentUser.value)\n}\n\nconst handleMfaClose = () => {\n showMfaVerification.value = false\n // Reset form or allow user to try again\n}\n\nconst handleMfaError = (errorMessage: string) => {\n error.value = errorMessage\n emit('error', errorMessage)\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>\n\n<style scoped>\n/* Email field spacing to match StrandsAuth */\n.email-field-spacing {\n transition: margin-bottom 500ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.email-field-spacing.has-password {\n margin-bottom: 1rem; /* mb-4 equivalent */\n}\n\n.email-field-spacing.no-password {\n margin-bottom: 0;\n}\n\n/* Override accui- prefixed Tailwind classes with CSS properties */\n.accui-w-full {\n width: 100%;\n}\n\n.accui-min-w-100 {\n min-width: 25rem;\n}\n\n.accui-max-w-md {\n max-width: 28rem;\n}\n\n.accui-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n.accui-animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n.accui-text-center {\n text-align: center;\n}\n\n.accui-mb-8 {\n margin-bottom: 2rem;\n}\n\n.accui-text-3xl {\n font-size: 1.875rem;\n}\n\n.accui-font-bold {\n font-weight: 700;\n}\n\n.accui-text-gradient {\n background: linear-gradient(to right, var(--strands-500, #EA00A8), var(--strands-600, #db2777));\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n}\n\n.accui-mb-2 {\n margin-bottom: 0.5rem;\n}\n\n.accui-text-neutral-600 {\n color: var(--neutral-600, #525252);\n}\n\n.accui-space-y-3 > * + * {\n margin-top: 0.75rem;\n}\n\n.accui-mb-6 {\n margin-bottom: 1.5rem;\n}\n\n.accui-w-5 {\n width: 1.25rem;\n}\n\n.accui-h-5 {\n height: 1.25rem;\n}\n\n.accui-flex {\n display: flex;\n}\n\n.accui-items-center {\n align-items: center;\n}\n\n.accui-justify-center {\n justify-content: center;\n}\n\n.accui-rounded-full {\n border-radius: 50%;\n}\n\n.accui-bg-neutral-300 {\n background-color: var(--neutral-300, #d4d4d4);\n}\n\n.accui-text-xs {\n font-size: 0.75rem;\n}\n\n.accui-font-semibold {\n font-weight: 600;\n}\n\n.accui-text-neutral-600 {\n color: var(--neutral-600, #525252);\n}\n\n.accui-font-medium {\n font-weight: 500;\n}\n\n.accui-gap-6 {\n gap: 1.5rem;\n}\n\n.accui-flex-col {\n flex-direction: column;\n}\n\n.accui-mb-4 {\n margin-bottom: 1rem;\n}\n\n.accui-text-sm {\n font-size: 0.875rem;\n}\n\n.accui-text-neutral-700 {\n color: var(--neutral-700, #404040);\n}\n\n.accui-block {\n display: block;\n}\n\n.accui-mt-4 {\n margin-top: 1rem;\n}\n\n.accui-mt-6 {\n margin-top: 1.5rem;\n}\n\n.accui-animate-fade-in {\n animation: fadeIn 0.2s ease-out;\n}\n\n.accui-mt-8 {\n margin-top: 2rem;\n}\n\n.accui-text-neutral-400 {\n color: var(--neutral-400, #a3a3a3);\n}\n\n.accui-fill-current {\n fill: currentColor;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <div class=\"signup-container\">\n <!-- Success State -->\n <StrandsUiCard v-if=\"signupSuccess\" variant=\"modern\">\n <div class=\"signup-success\">\n <div class=\"signup-success-icon\">📧</div>\n <h1 class=\"signup-success-title\">{{ successTitle }}</h1>\n <p class=\"signup-success-message\">{{ successMessage }}</p>\n <div v-if=\"successEmail\" class=\"signup-success-email\">\n <strong>{{ successEmail }}</strong>\n </div>\n <p class=\"signup-success-instructions\">\n Click the link in your email to complete your account setup. The link will expire in 24 hours.\n </p>\n <StrandsUiButton\n variant=\"outline\"\n full-width\n @click=\"resetToForm\"\n >\n Send Another Link\n </StrandsUiButton>\n </div>\n </StrandsUiCard>\n\n <!-- Signup Form -->\n <StrandsUiCard v-else variant=\"modern\">\n <!-- Header -->\n <div class=\"signup-header\">\n <h1 class=\"signup-title\">Create account</h1>\n <p class=\"signup-subtitle\">We'll send you a magic link to get started</p>\n </div>\n\n <!-- OAuth Providers -->\n <div v-if=\"enabledProviders?.length\" class=\"oauth-providers\">\n <StrandsUiButton \n v-for=\"provider in enabledProviders\" \n :key=\"provider.id\" \n variant=\"outline\" \n full-width\n :disabled=\"oauthLoading\"\n @click=\"handleOAuthSignUp(provider.id)\" \n class=\"btn-oauth group\"\n >\n <div class=\"oauth-icon-container\">\n <!-- Dynamic provider icons -->\n <div v-if=\"provider.icon || provider.iconUrl\" class=\"oauth-icon\">\n <img :src=\"provider.icon || provider.iconUrl\" :alt=\"`${provider.displayName || provider.name} icon`\" class=\"oauth-icon-image\" />\n </div>\n <!-- Built-in SVG icons for common providers -->\n <svg v-else-if=\"provider.id === 'google'\" viewBox=\"0 0 24 24\" class=\"oauth-icon\">\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=\"oauth-icon oauth-icon-github\" 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=\"oauth-icon-fallback\">\n <span class=\"oauth-icon-fallback-text\">{{ (provider.displayName || provider.name).charAt(0).toUpperCase() }}</span>\n </div>\n </div>\n <span class=\"oauth-button-text\">Continue with {{ provider.displayName || provider.name }}</span>\n </StrandsUiButton>\n </div>\n\n <!-- Divider -->\n <div v-if=\"enabledProviders?.length\" class=\"divider-with-text\">\n <span class=\"divider-text\">Or create account with email</span>\n </div>\n\n <!-- Sign Up Form -->\n <form @submit.prevent=\"handleSignUp\" class=\"signup-form\">\n <!-- Email -->\n <div>\n <StrandsUiInput\n id=\"email\"\n v-model=\"form.email\"\n type=\"email\"\n label=\"Email address\"\n placeholder=\"Enter your email address\"\n autocomplete=\"email\"\n required\n :error=\"error\"\n />\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading\"\n :loading=\"loading\"\n loading-text=\"Sending magic link...\"\n >\n Send magic link\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <div v-if=\"error\" class=\"signup-error\">\n <div class=\"signup-error-content\">\n <div class=\"signup-error-icon-container\">\n <svg class=\"signup-error-icon\" 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=\"signup-error-message\">{{ error }}</p>\n </div>\n </div>\n </div>\n\n <!-- Sign in link -->\n <div class=\"signup-signin-link\">\n <p class=\"signup-signin-text\">\n Already have an account?\n <button type=\"button\"\n class=\"signup-signin-button\"\n @click=\"$emit('switch-to-signin')\">\n Sign in\n </button>\n </p>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"signup-support-text\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useOAuthProviders } from '../composables/useOAuthProviders'\n\ninterface Props {\n redirectUrl?: string\n oauthScopes?: string[]\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', user: any): void\n (e: 'error', error: string): void\n (e: 'switch-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n oauthScopes: () => []\n})\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// OAuth providers management\nconst { \n enabledProviders, \n loading: oauthLoading, \n error: oauthError,\n fetchProviders,\n redirectToProvider\n} = useOAuthProviders({\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n})\n\n// Fetch OAuth providers on component mount\nonMounted(() => {\n fetchProviders().catch(err => {\n console.warn('Failed to fetch OAuth providers:', err)\n })\n})\n\nconst loading = ref(false)\nconst error = ref('')\nconst signupSuccess = ref(false)\nconst successMessage = ref('')\nconst successTitle = ref('Magic Link Sent!')\nconst successEmail = ref('')\n\nconst form = reactive({\n email: ''\n})\n\nconst isFormValid = computed(() => {\n return form.email.trim() && form.email.includes('@')\n})\n\nconst handleSignUp = async () => {\n loading.value = true\n error.value = ''\n\n try {\n const signUpUrl = getUrl('signUp')\n console.log('Attempting sign up to URL:', signUpUrl)\n \n const response = await fetch(signUpUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n email: form.email\n }),\n })\n\n if (process.env['NODE_ENV'] === 'development') {\n console.log('Sign up response status:', response.status)\n }\n\n if (!response.ok) {\n let errorMessage = `Sign up failed (${response.status})`\n try {\n const errorData = await response.json()\n errorMessage = errorData.message || errorData.error || errorMessage\n } catch {\n const errorText = await response.text()\n errorMessage = errorText || errorMessage\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n console.log('Magic link sign up success:', result)\n \n // Handle success state internally\n signupSuccess.value = true\n successEmail.value = form.email\n successMessage.value = result.message || 'Magic link sent! Check your email.'\n \n // Set appropriate title based on message content\n if (result.message) {\n if (result.message.includes('already have an account') || result.message.includes('Welcome back')) {\n successTitle.value = 'Welcome Back!'\n } else if (result.message.includes('Magic link sent') || result.message.includes('Check your email')) {\n successTitle.value = 'Magic Link Sent!'\n } else {\n successTitle.value = 'Success!'\n }\n }\n \n // Still emit for any parent that might need it\n emit('success', {\n email: form.email,\n message: result.message || 'Magic link sent! Check your email.'\n })\n } catch (err) {\n console.error('Sign up error:', err)\n \n let errorMessage = 'Unable to send magic link. Please try again.'\n \n if (err instanceof Error) {\n if (err.message.includes('fetch')) {\n errorMessage = 'Unable to connect to authentication service. Please check your internet connection and try again.'\n } else if (err.message.includes('CORS')) {\n const supportEmail = getSupportEmail()\n errorMessage = supportEmail \n ? `Authentication service configuration error. Please contact ${supportEmail}.`\n : 'Authentication service configuration error.'\n } else {\n errorMessage = err.message\n }\n }\n \n error.value = errorMessage\n emit('error', errorMessage)\n } finally {\n loading.value = false\n }\n}\n\nconst resetToForm = () => {\n signupSuccess.value = false\n successMessage.value = ''\n successTitle.value = 'Magic Link Sent!'\n successEmail.value = ''\n form.email = ''\n error.value = ''\n}\n\nconst handleOAuthSignUp = async (providerId: string) => {\n try {\n await redirectToProvider(providerId, {\n redirectUrl: props.redirectUrl,\n scopes: props.oauthScopes\n })\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign up with ${providerId}`\n error.value = errorMessage\n emit('error', errorMessage)\n }\n}\n</script>\n\n<style scoped>\n.signup-container {\n width: 100%;\n min-width: 25rem;\n max-width: 28rem;\n margin: 0 auto;\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Success State */\n.signup-success {\n text-align: center;\n}\n\n.signup-success-icon {\n color: #10b981;\n font-size: 3.75rem;\n margin-bottom: 1rem;\n}\n\n.signup-success-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #111827;\n margin-bottom: 0.5rem;\n}\n\n.signup-success-message {\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.signup-success-email {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.signup-success-instructions {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Header */\n.signup-header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.signup-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 50%, #B8006F 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.signup-subtitle {\n color: #6b7280;\n}\n\n/* OAuth Providers */\n.oauth-providers {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1.5rem;\n}\n\n.oauth-icon-container {\n width: 1.25rem;\n height: 1.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.oauth-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.oauth-icon-image {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.oauth-icon-github {\n fill: currentColor;\n}\n\n.oauth-icon-fallback {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n background-color: #d1d5db;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.oauth-icon-fallback-text {\n font-size: 0.75rem;\n font-weight: 600;\n color: #6b7280;\n}\n\n.oauth-button-text {\n font-weight: 500;\n}\n\n/* Form */\n.signup-form {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n/* Error Alert */\n.signup-error {\n margin-top: 1.5rem;\n animation: fadeIn 0.3s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.signup-error-content {\n background-color: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.signup-error-icon-container {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.signup-error-icon {\n width: 1rem;\n height: 1rem;\n margin-top: 0.125rem;\n flex-shrink: 0;\n color: #dc2626;\n}\n\n.signup-error-message {\n font-weight: 500;\n color: #dc2626;\n}\n\n/* Sign in link */\n.signup-signin-link {\n margin-top: 2rem;\n text-align: center;\n}\n\n.signup-signin-text {\n font-size: 0.875rem;\n color: #6b7280;\n}\n\n.signup-signin-button {\n font-weight: 600;\n color: #EA00A8;\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.2s ease;\n margin-left: 0.25rem;\n}\n\n.signup-signin-button:hover {\n color: #B8006F;\n}\n\n/* Support text */\n.signup-support-text {\n color: #9ca3af;\n font-size: 0.875rem;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .signup-container {\n min-width: auto;\n max-width: none;\n width: 100%;\n }\n \n .signup-title {\n font-size: 1.5rem;\n }\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <!-- Success State -->\n <div v-if=\"registrationComplete\" class=\"complete-signup-container\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"complete-signup-success\">\n <div class=\"complete-signup-success-icon\">🎉</div>\n <h1 class=\"complete-signup-success-title\">Welcome to Strands!</h1>\n <p class=\"complete-signup-success-message\">\n Your account has been created successfully.\n </p>\n <p class=\"complete-signup-success-instructions\">\n You are now signed in and can access your dashboard.\n </p>\n <StrandsUiButton \n variant=\"primary\" \n full-width \n @click=\"redirectToReferrer\"\n >\n Go to Dashboard\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Invalid Token State -->\n <div v-else-if=\"invalidToken\" class=\"complete-signup-container\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"complete-signup-error\">\n <div class=\"complete-signup-error-icon\">❌</div>\n <h1 class=\"complete-signup-error-title\">Invalid Link</h1>\n <p class=\"complete-signup-error-message\">\n This registration link is invalid or has expired.\n </p>\n <p class=\"complete-signup-error-instructions\">\n Please request a new magic link to complete your registration.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('request-new-link')\"\n >\n Request New Link\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n\n <!-- Registration Form -->\n <div v-else-if=\"token\" class=\"complete-signup-container\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"complete-signup-header\">\n <h1 class=\"complete-signup-title\">Complete Your Registration</h1>\n <p class=\"complete-signup-subtitle\">Set up your account details to finish registration</p>\n <div v-if=\"email\" class=\"complete-signup-email-info\">\n <p class=\"complete-signup-email-text\">Creating account for: <span class=\"complete-signup-email-highlight\">{{ email }}</span></p>\n </div>\n </div>\n\n <!-- Registration Form -->\n <form @submit.prevent=\"handleCompleteSignUp\" class=\"complete-signup-form\">\n\n <!-- First Name -->\n <div>\n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First Name (Optional)\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :error=\"fieldErrors.firstName\"\n />\n </div>\n\n <!-- Last Name -->\n <div>\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last Name (Optional)\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :error=\"fieldErrors.lastName\"\n />\n </div>\n\n <!-- Password -->\n <div>\n <StrandsUiInput\n id=\"password\"\n v-model=\"form.password\"\n type=\"password\"\n label=\"Password\"\n placeholder=\"Create a strong password\"\n autocomplete=\"new-password\"\n required\n minlength=\"8\"\n :error=\"fieldErrors.password\"\n />\n <div class=\"complete-signup-password-hint\">\n Password must be at least 8 characters long\n </div>\n </div>\n\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n full-width\n :disabled=\"loading || !isFormValid\"\n :loading=\"loading\"\n loading-text=\"Creating account...\"\n >\n Complete Registration\n </StrandsUiButton>\n </form>\n\n <!-- Error Alert -->\n <StrandsUiAlert \n v-if=\"error\" \n variant=\"error\" \n :message=\"error\" \n class=\"complete-signup-error-alert\" \n dismissible \n @dismiss=\"error = ''\"\n />\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"complete-signup-support\">\n <p class=\"complete-signup-support-text\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n\n </div>\n\n <!-- No Token State -->\n <div v-else class=\"complete-signup-container\">\n <StrandsUiCard variant=\"modern\">\n <div class=\"complete-signup-warning\">\n <div class=\"complete-signup-warning-icon\">⚠️</div>\n <h1 class=\"complete-signup-warning-title\">Missing Token</h1>\n <p class=\"complete-signup-warning-message\">\n No registration token was provided.\n </p>\n <p class=\"complete-signup-warning-instructions\">\n This page requires a valid registration token from the magic link in your email.\n </p>\n <StrandsUiButton\n variant=\"primary\"\n full-width\n @click=\"$emit('start-registration')\"\n >\n Start Registration\n </StrandsUiButton>\n </div>\n <StrandsSecuredFooter />\n </StrandsUiCard>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport type { AuthResponse } from '../../types'\n\ninterface Props {\n token?: string\n redirectUrl?: string\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', result: any): void\n (e: 'error', error: string): void\n (e: 'invalid-token'): void\n (e: 'request-new-link'): void\n (e: 'start-registration'): void\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getUrl, getSupportEmail } = useStrandsConfig(props.config)\n\n// Auth composable for token storage\nconst { setAuthData } = useStrandsAuth()\n\n// State management\nconst registrationComplete = ref(false)\nconst invalidToken = ref(false)\nconst loading = ref(false)\nconst error = ref('')\nconst email = ref('')\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n password: ''\n})\n\nconst fieldErrors = reactive({\n firstName: '',\n lastName: '',\n password: ''\n})\n\n// Validate form\nconst isFormValid = computed(() => {\n const hasRequiredFields = form.password.trim()\n const passwordMinLength = form.password.length >= 8\n const hasValidToken = !!props.token\n \n return hasRequiredFields && passwordMinLength && hasValidToken\n})\n\n// Watch for password length\nwatch(\n () => form.password,\n (password) => {\n if (password && password.length < 8) {\n fieldErrors.password = 'Password must be at least 8 characters long'\n } else {\n fieldErrors.password = ''\n }\n }\n)\n\n\n// Redirect URL fallback\nconst redirectUrl = computed(() => props.redirectUrl || window.location.origin)\n\n// Extract email from JWT token for display\nonMounted(() => {\n if (props.token) {\n try {\n const parts = props.token.split('.')\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]))\n if (payload.email) {\n email.value = payload.email\n }\n }\n } catch (err) {\n console.warn('Could not decode token for email display:', err)\n }\n }\n})\n\nconst redirectToReferrer = () => {\n if (redirectUrl.value) {\n console.log('Redirecting to referrer:', redirectUrl.value)\n window.location.href = redirectUrl.value\n }\n}\n\nconst handleCompleteSignUp = async () => {\n if (!props.token) {\n error.value = 'Registration token is required'\n return\n }\n\n // Clear all errors\n error.value = ''\n Object.keys(fieldErrors).forEach(key => {\n fieldErrors[key as keyof typeof fieldErrors] = ''\n })\n\n // Validate form\n if (!isFormValid.value) {\n error.value = 'Please fill in all required fields correctly'\n return\n }\n\n loading.value = true\n\n try {\n const response = await fetch(getUrl('completeRegistration'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token: props.token,\n password: form.password,\n first_name: form.firstName || null,\n last_name: form.lastName || null\n }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`Failed to complete registration: ${errorText}`)\n }\n\n const result: AuthResponse = await response.json()\n console.log('Registration success:', result)\n \n // Store authentication data if tokens are present\n if (result.access_token && result.refresh_token && result.user) {\n setAuthData(result)\n console.log('Auth tokens stored successfully for user:', result.user.email)\n } else {\n console.warn('Registration response missing auth tokens or user data')\n }\n \n registrationComplete.value = true\n emit('success', result)\n \n // Redirect to referrer URL after successful registration\n setTimeout(() => {\n redirectToReferrer()\n }, 2000) // Give user 2 seconds to see the success message\n } catch (err) {\n if (err instanceof Error) {\n if (err.message.includes('CONFLICT') || err.message.includes('409')) {\n error.value = 'This account already exists. Please try signing in instead.'\n } else if (err.message.includes('BAD_REQUEST') || err.message.includes('400')) {\n error.value = 'Invalid or expired registration link. Please request a new one.'\n invalidToken.value = true\n emit('invalid-token')\n } else {\n error.value = err.message\n }\n } else {\n error.value = 'Failed to complete registration. Please try again.'\n }\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<style scoped>\n.complete-signup-container {\n width: 100%;\n min-width: 25rem;\n max-width: 28rem;\n margin: 0 auto;\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Success State */\n.complete-signup-success {\n text-align: center;\n}\n\n.complete-signup-success-icon {\n color: #10b981;\n font-size: 3.75rem;\n margin-bottom: 1rem;\n}\n\n.complete-signup-success-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 50%, #B8006F 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.complete-signup-success-message {\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.complete-signup-success-instructions {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Error State */\n.complete-signup-error {\n text-align: center;\n}\n\n.complete-signup-error-icon {\n color: #dc2626;\n font-size: 3.75rem;\n margin-bottom: 1rem;\n}\n\n.complete-signup-error-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 50%, #B8006F 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.complete-signup-error-message {\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.complete-signup-error-instructions {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Warning State */\n.complete-signup-warning {\n text-align: center;\n}\n\n.complete-signup-warning-icon {\n color: #f59e0b;\n font-size: 3.75rem;\n margin-bottom: 1rem;\n}\n\n.complete-signup-warning-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 50%, #B8006F 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.complete-signup-warning-message {\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.complete-signup-warning-instructions {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Header */\n.complete-signup-header {\n text-align: center;\n margin-bottom: 2rem;\n}\n\n.complete-signup-title {\n font-size: 1.875rem;\n font-weight: 700;\n background: linear-gradient(135deg, #EA00A8 0%, #FF6B9D 50%, #B8006F 100%);\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n margin-bottom: 0.5rem;\n}\n\n.complete-signup-subtitle {\n color: #6b7280;\n}\n\n.complete-signup-email-info {\n margin-top: 0.5rem;\n}\n\n.complete-signup-email-text {\n font-size: 0.875rem;\n color: #6b7280;\n}\n\n.complete-signup-email-highlight {\n font-weight: 500;\n color: #374151;\n}\n\n/* Form */\n.complete-signup-form {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.complete-signup-password-hint {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n color: #6b7280;\n}\n\n/* Error Alert */\n.complete-signup-error-alert {\n margin-top: 1.5rem;\n animation: fadeIn 0.3s ease-out;\n}\n\n/* Support */\n.complete-signup-support {\n margin-top: 1.5rem;\n text-align: center;\n}\n\n.complete-signup-support-text {\n color: #9ca3af;\n font-size: 0.875rem;\n}\n\n/* Responsive */\n@media (max-width: 640px) {\n .complete-signup-container {\n min-width: auto;\n max-width: none;\n width: 100%;\n }\n \n .complete-signup-title,\n .complete-signup-success-title,\n .complete-signup-error-title,\n .complete-signup-warning-title {\n font-size: 1.5rem;\n }\n \n .complete-signup-success-icon,\n .complete-signup-error-icon,\n .complete-signup-warning-icon {\n font-size: 3rem;\n }\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"modal-card\">\n <template #header>\n <div class=\"modal-header\">\n <h2 class=\"modal-title\">Setup Authenticator App</h2>\n <button @click=\"closeModal\" class=\"modal-close-button\">\n <svg class=\"modal-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"step-container\">\n <div>\n <h3 class=\"step-title\">Name Your Device</h3>\n <p class=\"step-description\">\n Give this authenticator a memorable name (e.g., \"iPhone\", \"Work Phone\")\n </p>\n </div>\n\n <StrandsUiInput v-model=\"deviceName\" label=\"Device Name\" placeholder=\"My Authenticator\" :error=\"deviceNameError\"\n :disabled=\"loading\" />\n\n <div class=\"step-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"closeModal\" :disabled=\"loading\">\n Cancel\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"startSetup\" :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\">\n Continue\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: QR Code and Setup -->\n <div v-if=\"step === 2\" class=\"step-container\">\n <div>\n <h3 class=\"step-title\">Scan QR Code</h3>\n <p class=\"step-description\">\n Scan this QR code with your authenticator app (Google Authenticator, Authy, etc.)\n </p>\n </div>\n\n <!-- QR Code -->\n <div class=\"qr-container\">\n <div v-if=\"qrCodeDataUrl\" class=\"qr-wrapper\">\n <img :src=\"qrCodeDataUrl\" alt=\"TOTP QR Code\" class=\"qr-image\" />\n </div>\n <div v-else class=\"qr-loading\">\n <StrandsUiLoader :size=\"24\" />\n </div>\n </div>\n\n <!-- Manual Entry -->\n <div class=\"manual-entry\">\n <p class=\"manual-label\">\n Can't scan? Enter this code manually:\n </p>\n <code class=\"manual-code\">\n {{ totpSetupData?.secret || '...' }}\n </code>\n </div>\n\n <!-- Backup Codes Preview -->\n <div v-if=\"totpSetupData?.backup_codes\" class=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <div class=\"flex items-start space-x-2\">\n <svg class=\"w-5 h-5 text-yellow-600 mt-0.5 flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"text-sm font-medium text-yellow-800\">Save Your Backup Codes</p>\n <p class=\"text-sm text-yellow-700 mt-1\">\n After setup, you'll receive backup codes. Store them safely - they're your only way to recover access if\n you\n lose your device.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"flex justify-end space-x-3 pt-4\">\n <StrandsUiButton variant=\"secondary\" @click=\"step = 1\" :disabled=\"loading\">\n Back\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"step = 3\" :disabled=\"loading\">\n I've Added It\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Verification -->\n <div v-if=\"step === 3\" class=\"space-y-4\">\n <div>\n <h3 class=\"text-lg font-semibold text-gray-900 mb-2\">Verify Setup</h3>\n <p class=\"text-sm text-gray-600 mb-4\">\n Enter the 6-digit code from your authenticator app to complete setup\n </p>\n </div>\n\n <StrandsUiInput v-model=\"verificationCode\" label=\"Verification Code\" placeholder=\"123456\" maxlength=\"6\"\n :error=\"verificationError\" :disabled=\"loading\" @input=\"onVerificationCodeInput\" />\n\n <div class=\"totp-setup-step-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"step = 2\" :disabled=\"loading\">\n Back\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"verifySetup\" :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\">\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 4: Success & Backup Codes -->\n <div v-if=\"step === 4\" class=\"totp-setup-step\">\n <div class=\"totp-setup-success\">\n <div class=\"totp-setup-success-icon\">\n <svg class=\"totp-setup-check-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"totp-setup-step-title\">TOTP Setup Complete!</h3>\n <p class=\"totp-setup-success-description\">\n Your authenticator app is now active for two-factor authentication.\n </p>\n </div>\n\n <!-- Backup Codes -->\n <div class=\"totp-setup-backup-codes\">\n <div class=\"totp-setup-backup-header\">\n <svg class=\"totp-setup-backup-warning-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"totp-setup-backup-header-title\">Save These Backup Codes</p>\n <p class=\"totp-setup-backup-header-description\">\n Store these codes in a safe place. Each code can only be used once.\n </p>\n </div>\n </div>\n\n <div class=\"totp-setup-backup-grid-wrapper\">\n <div class=\"totp-setup-backup-grid\">\n <div v-for=\"(code, index) in totpSetupData?.backup_codes\" :key=\"index\" class=\"totp-setup-backup-code\">\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"totp-setup-backup-actions\">\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"copyBackupCodes\">\n 📋 Copy Codes\n </StrandsUiButton>\n </div>\n </div>\n\n <div class=\"totp-setup-final-actions\">\n <StrandsUiButton variant=\"primary\" @click=\"finish\">\n Done\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, nextTick } from 'vue'\n// QRCode library removed - using external QR service or manual display\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { TotpSetupResponse } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupTotp, verifyTotpSetup, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst totpSetupData = ref<TotpSetupResponse | null>(null)\nconst qrCodeDataUrl = ref('')\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n totpSetupData.value = null\n qrCodeDataUrl.value = ''\n }\n})\n\n// Generate QR code using external service when TOTP setup data is available\nwatch(() => totpSetupData.value, async (newData) => {\n if (newData?.qr_code_url) {\n try {\n // Use a QR code generation service\n const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=192x192&data=${encodeURIComponent(newData.qr_code_url)}&bgcolor=ffffff&color=000000`\n qrCodeDataUrl.value = qrUrl\n } catch (error) {\n console.error('Failed to generate QR code:', error)\n }\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupTotp(deviceName.value.trim())\n totpSetupData.value = response\n step.value = 2\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup TOTP'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!totpSetupData.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n await verifyTotpSetup(totpSetupData.value.device_id, verificationCode.value)\n step.value = 4\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst copyBackupCodes = async () => {\n if (!totpSetupData.value?.backup_codes) return\n\n try {\n const codesText = totpSetupData.value.backup_codes.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n<style scoped>\n/* Modal container */\n.totp-setup-modal {\n max-width: 28rem;\n}\n\n/* Header */\n.totp-setup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.totp-setup-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.totp-setup-close-button {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n}\n\n.totp-setup-close-button:hover {\n color: #4b5563;\n}\n\n.totp-setup-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Steps */\n.totp-setup-step {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.totp-setup-step-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.5rem;\n}\n\n.totp-setup-step-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.totp-setup-step-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n}\n\n/* QR Code */\n.totp-setup-qr-container {\n display: flex;\n justify-content: center;\n background-color: #f9fafb;\n padding: 1rem;\n border-radius: 0.5rem;\n}\n\n.totp-setup-qr-wrapper {\n background-color: white;\n padding: 1rem;\n border-radius: 0.5rem;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n.totp-setup-qr-image {\n width: 12rem;\n height: 12rem;\n}\n\n.totp-setup-qr-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12rem;\n height: 12rem;\n}\n\n/* Manual Entry */\n.totp-setup-manual-entry {\n background-color: #f9fafb;\n padding: 1rem;\n border-radius: 0.5rem;\n}\n\n.totp-setup-manual-label {\n font-size: 0.75rem;\n color: #6b7280;\n margin-bottom: 0.5rem;\n}\n\n.totp-setup-manual-code {\n font-size: 0.75rem;\n font-family: 'SF Mono', Monaco, Inconsolata, 'Roboto Mono', Consolas, 'Courier New', monospace;\n background-color: white;\n padding: 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid #e5e7eb;\n word-break: break-all;\n color: #111827;\n display: block;\n}\n\n/* Backup Preview */\n.totp-setup-backup-preview {\n background-color: #fefce8;\n border: 1px solid #fde047;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.totp-setup-backup-warning {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.totp-setup-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #d97706;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.totp-setup-backup-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #92400e;\n}\n\n.totp-setup-backup-description {\n font-size: 0.875rem;\n color: #a16207;\n margin-top: 0.25rem;\n}\n\n/* Success */\n.totp-setup-success {\n text-align: center;\n}\n\n.totp-setup-success-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dcfce7;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem;\n}\n\n.totp-setup-check-icon {\n width: 1.5rem;\n height: 1.5rem;\n color: #16a34a;\n}\n\n.totp-setup-success-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Backup Codes */\n.totp-setup-backup-codes {\n background-color: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.totp-setup-backup-header {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.75rem;\n}\n\n.totp-setup-backup-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #dc2626;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.totp-setup-backup-header-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #991b1b;\n}\n\n.totp-setup-backup-header-description {\n font-size: 0.875rem;\n color: #b91c1c;\n margin-top: 0.25rem;\n}\n\n.totp-setup-backup-grid-wrapper {\n background-color: white;\n border-radius: 0.25rem;\n border: 1px solid #e5e7eb;\n padding: 0.75rem;\n}\n\n.totp-setup-backup-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.5rem;\n font-size: 0.875rem;\n font-family: 'SF Mono', Monaco, Inconsolata, 'Roboto Mono', Consolas, 'Courier New', monospace;\n color: #111827;\n}\n\n.totp-setup-backup-code {\n text-align: center;\n padding: 0.25rem 0;\n}\n\n.totp-setup-backup-actions {\n display: flex;\n justify-content: center;\n margin-top: 0.75rem;\n}\n\n.totp-setup-final-actions {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n}\n\n/* Semantic CSS classes replacing Tailwind */\n.modal-card {\n max-width: 28rem;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.modal-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.modal-close-button {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n}\n\n.modal-close-button:hover {\n color: #6b7280;\n}\n\n.modal-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n.step-container {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.step-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.5rem;\n}\n\n.step-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n.step-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n}\n\n.qr-container {\n display: flex;\n justify-content: center;\n background-color: #f9fafb;\n padding: 1rem;\n border-radius: 0.5rem;\n}\n\n.qr-wrapper {\n background-color: white;\n padding: 1rem;\n border-radius: 0.5rem;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n.qr-image {\n width: 12rem;\n height: 12rem;\n}\n\n.qr-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 12rem;\n height: 12rem;\n}\n\n.manual-entry {\n background-color: #f9fafb;\n padding: 1rem;\n border-radius: 0.5rem;\n}\n\n.manual-label {\n font-size: 0.75rem;\n color: #6b7280;\n margin-bottom: 0.5rem;\n}\n\n.manual-code {\n font-size: 0.75rem;\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace;\n background-color: white;\n padding: 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid #e5e7eb;\n word-break: break-all;\n color: #111827;\n display: block;\n}\n\n.backup-preview {\n background-color: #fefce8;\n border: 1px solid #fde047;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-warning {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #d97706;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.backup-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #92400e;\n}\n\n.backup-description {\n font-size: 0.875rem;\n color: #a16207;\n margin-top: 0.25rem;\n}\n\n.success-container {\n text-align: center;\n}\n\n.success-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dcfce7;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem;\n}\n\n.success-check-icon {\n width: 1.5rem;\n height: 1.5rem;\n color: #16a34a;\n}\n\n.success-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n.backup-codes-container {\n background-color: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-codes-header {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.75rem;\n}\n\n.backup-codes-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #dc2626;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.backup-codes-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #991b1b;\n}\n\n.backup-codes-description {\n font-size: 0.875rem;\n color: #b91c1c;\n margin-top: 0.25rem;\n}\n\n.backup-codes-grid-wrapper {\n background-color: white;\n border-radius: 0.25rem;\n border: 1px solid #e5e7eb;\n padding: 0.75rem;\n}\n\n.backup-codes-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.5rem;\n font-size: 0.875rem;\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace;\n color: #111827;\n}\n\n.backup-code {\n text-align: center;\n padding: 0.25rem 0;\n}\n\n.backup-actions {\n display: flex;\n justify-content: center;\n margin-top: 0.75rem;\n}\n\n.final-actions {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n}\n</style>\n","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"email-mfa-setup-modal\">\n <template #header>\n <div class=\"email-mfa-setup-header\">\n <h2 class=\"email-mfa-setup-title\">Setup Email 2FA</h2>\n <button @click=\"closeModal\" class=\"email-mfa-setup-close-button\">\n <svg class=\"email-mfa-setup-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"email-mfa-setup-step\">\n <div>\n <h3 class=\"email-mfa-setup-step-title\">Name Your Email 2FA</h3>\n <p class=\"email-mfa-setup-step-description\">\n Give this email 2FA method a memorable name (e.g., \"Personal Email\", \"Work Email\")\n </p>\n </div>\n\n <StrandsUiInput v-model=\"deviceName\" label=\"Device Name\" placeholder=\"Personal Email\" :error=\"deviceNameError\"\n :disabled=\"loading\" />\n\n <div class=\"email-mfa-setup-info\">\n <div class=\"email-mfa-setup-info-content\">\n <svg class=\"email-mfa-setup-info-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"email-mfa-setup-info-title\">Email 2FA</p>\n <p class=\"email-mfa-setup-info-description\">\n Verification codes will be sent to your registered email address when logging in.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"email-mfa-setup-step-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"closeModal\" :disabled=\"loading\">\n Cancel\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"startSetup\" :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\">\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: Test Verification -->\n <div v-if=\"step === 2\" class=\"email-mfa-setup-step\">\n <div>\n <h3 class=\"email-mfa-setup-step-title\">Test Email 2FA</h3>\n <p class=\"email-mfa-setup-step-description\">\n We've sent a test verification code to your email. Enter it below to complete setup.\n </p>\n </div>\n\n <div class=\"email-mfa-setup-success-notification\">\n <div class=\"email-mfa-setup-success-content\">\n <svg class=\"email-mfa-setup-success-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"email-mfa-setup-success-title\">Code Sent!</p>\n <p class=\"email-mfa-setup-success-description\">\n Check your email inbox for the verification code.\n </p>\n </div>\n </div>\n </div>\n\n <StrandsUiInput v-model=\"verificationCode\" label=\"Verification Code\" placeholder=\"123456\" maxlength=\"6\"\n :error=\"verificationError\" :disabled=\"loading\" @input=\"onVerificationCodeInput\" />\n\n <div class=\"email-mfa-setup-resend-section\">\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"resendCode\" :disabled=\"loading || cooldownActive\">\n {{ cooldownActive ? `Resend in ${cooldownSeconds}s` : 'Resend Code' }}\n </StrandsUiButton>\n </div>\n\n <div class=\"email-mfa-setup-step-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"step = 1\" :disabled=\"loading\">\n Back\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"verifySetup\" :disabled=\"verificationCode.length !== 6 || loading\"\n :loading=\"loading\">\n Verify & Enable\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Success -->\n <div v-if=\"step === 3\" class=\"email-mfa-setup-step\">\n <div class=\"email-mfa-setup-completion\">\n <div class=\"email-mfa-setup-completion-icon\">\n <svg class=\"email-mfa-setup-check-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"email-mfa-setup-step-title\">Email 2FA Setup Complete!</h3>\n <p class=\"email-mfa-setup-completion-description\">\n Email verification is now active for your account. You'll receive codes at your registered email address.\n </p>\n </div>\n\n <div class=\"email-mfa-setup-info\">\n <div class=\"email-mfa-setup-info-content\">\n <svg class=\"email-mfa-setup-info-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"email-mfa-setup-info-title\">How it works</p>\n <p class=\"email-mfa-setup-info-description\">\n When logging in, you'll receive a 6-digit code at your email address. Enter this code to complete\n authentication.\n </p>\n </div>\n </div>\n </div>\n\n <div class=\"email-mfa-setup-final-actions\">\n <StrandsUiButton variant=\"primary\" @click=\"finish\">\n Done\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onBeforeUnmount } from 'vue'\nimport { StrandsUiButton, StrandsUiInput } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { setupEmailMfa, sendEmailMfaCode, verifyEmailMfaCode, loading } = useStrandsMfa()\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst verificationCode = ref('')\nconst verificationError = ref('')\nconst emailMfaDeviceId = ref<string | null>(null)\nconst cooldownActive = ref(false)\nconst cooldownSeconds = ref(0)\n\nlet cooldownInterval: NodeJS.Timeout | null = null\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n verificationCode.value = ''\n verificationError.value = ''\n emailMfaDeviceId.value = null\n cooldownActive.value = false\n cooldownSeconds.value = 0\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n})\n\nonBeforeUnmount(() => {\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n\n try {\n const response = await setupEmailMfa(deviceName.value.trim())\n emailMfaDeviceId.value = response.device_id\n\n // Now send the first verification code\n await sendEmailMfaCode(response.device_id)\n\n step.value = 2\n startCooldown()\n } catch (error) {\n deviceNameError.value = error instanceof Error ? error.message : 'Failed to setup email MFA'\n }\n}\n\nconst onVerificationCodeInput = (value: string) => {\n // Only allow digits\n verificationCode.value = value.replace(/\\D/g, '').slice(0, 6)\n verificationError.value = ''\n}\n\nconst verifySetup = async () => {\n if (!emailMfaDeviceId.value || !verificationCode.value) {\n return\n }\n\n verificationError.value = ''\n\n try {\n const verified = await verifyEmailMfaCode(emailMfaDeviceId.value, verificationCode.value)\n if (verified) {\n step.value = 3\n } else {\n verificationError.value = 'Invalid verification code'\n }\n } catch (error) {\n verificationError.value = error instanceof Error ? error.message : 'Invalid verification code'\n }\n}\n\nconst resendCode = async () => {\n if (!emailMfaDeviceId.value || cooldownActive.value) {\n return\n }\n\n try {\n await sendEmailMfaCode(emailMfaDeviceId.value)\n startCooldown()\n } catch (error) {\n console.error('Failed to resend code:', error)\n }\n}\n\nconst startCooldown = () => {\n cooldownActive.value = true\n cooldownSeconds.value = 30\n\n cooldownInterval = setInterval(() => {\n cooldownSeconds.value -= 1\n if (cooldownSeconds.value <= 0) {\n cooldownActive.value = false\n if (cooldownInterval) {\n clearInterval(cooldownInterval)\n cooldownInterval = null\n }\n }\n }, 1000)\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n<style scoped>\n/* Modal container */\n.email-mfa-setup-modal {\n max-width: 28rem;\n}\n\n/* Header */\n.email-mfa-setup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.email-mfa-setup-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.email-mfa-setup-close-button {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n}\n\n.email-mfa-setup-close-button:hover {\n color: #4b5563;\n}\n\n.email-mfa-setup-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Steps */\n.email-mfa-setup-step {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.email-mfa-setup-step-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.5rem;\n}\n\n.email-mfa-setup-step-description {\n font-size: 0.875rem;\n color: #4b5563;\n margin-bottom: 1rem;\n}\n\n.email-mfa-setup-step-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n}\n\n/* Info box */\n.email-mfa-setup-info {\n background-color: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.email-mfa-setup-info-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.email-mfa-setup-info-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #2563eb;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.email-mfa-setup-info-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #1e3a8a;\n margin: 0;\n}\n\n.email-mfa-setup-info-description {\n font-size: 0.875rem;\n color: #1d4ed8;\n margin-top: 0.25rem;\n}\n\n/* Success notification */\n.email-mfa-setup-success-notification {\n background-color: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.email-mfa-setup-success-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.email-mfa-setup-success-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #059669;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.email-mfa-setup-success-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #166534;\n margin: 0;\n}\n\n.email-mfa-setup-success-description {\n font-size: 0.875rem;\n color: #15803d;\n margin-top: 0.25rem;\n}\n\n/* Resend section */\n.email-mfa-setup-resend-section {\n display: flex;\n justify-content: space-between;\n}\n\n/* Completion */\n.email-mfa-setup-completion {\n text-align: center;\n}\n\n.email-mfa-setup-completion-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dcfce7;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem;\n}\n\n.email-mfa-setup-check-icon {\n width: 1.5rem;\n height: 1.5rem;\n color: #16a34a;\n}\n\n.email-mfa-setup-completion-description {\n font-size: 0.875rem;\n color: #4b5563;\n margin-bottom: 1.5rem;\n}\n\n/* Final actions */\n.email-mfa-setup-final-actions {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n}\n</style>\n","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"hardware-key-setup-modal\">\n <template #header>\n <div class=\"hardware-key-setup-header\">\n <h2 class=\"hardware-key-setup-title\">Setup Hardware Key</h2>\n <button @click=\"closeModal\" class=\"hardware-key-setup-close\">\n <svg class=\"hardware-key-setup-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n\n <!-- Step 1: Device Name -->\n <div v-if=\"step === 1\" class=\"hardware-key-setup-step\">\n <div>\n <h3 class=\"hardware-key-setup-step-title\">Name Your Hardware Key</h3>\n <p class=\"hardware-key-setup-step-description\">\n Give your hardware key a memorable name (e.g., \"YubiKey 5\", \"Work Security Key\")\n </p>\n </div>\n\n <StrandsUiInput v-model=\"deviceName\" label=\"Device Name\" placeholder=\"My Hardware Key\" :error=\"deviceNameError\"\n :disabled=\"loading\" />\n\n <div class=\"hardware-key-setup-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"closeModal\" :disabled=\"loading\">\n Cancel\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"startSetup\" :disabled=\"!deviceName.trim() || loading\"\n :loading=\"loading\">\n Continue\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 2: Hardware Key Registration -->\n <div v-if=\"step === 2\" class=\"hardware-key-setup-step\">\n <div>\n <h3 class=\"hardware-key-setup-step-title\">Register Hardware Key</h3>\n <p class=\"hardware-key-setup-step-description\">\n Insert your hardware key and follow your browser's prompts to complete registration.\n </p>\n </div>\n\n <!-- Hardware Key Illustration -->\n <div class=\"hardware-key-setup-illustration\">\n <div class=\"hardware-key-setup-illustration-content\">\n <div class=\"hardware-key-setup-icon-container\">\n <svg class=\"hardware-key-setup-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M15 7a2 2 0 012 2m0 0a2 2 0 012 2v6a2 2 0 01-2 2H9a2 2 0 01-2-2V9a2 2 0 012-2m0 0V7a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h3m0 0v8m0-8h8m-8 8h8\" />\n </svg>\n </div>\n <p class=\"hardware-key-setup-status\">Hardware Key Ready</p>\n <p class=\"hardware-key-setup-substatus\">Click \"Register Key\" when ready</p>\n </div>\n </div>\n\n <!-- Instructions -->\n <div class=\"hardware-key-setup-instructions\">\n <div class=\"hardware-key-setup-instructions-header\">\n <svg class=\"hardware-key-setup-info-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"hardware-key-setup-instructions-title\">Setup Instructions</p>\n <ul class=\"hardware-key-setup-instructions-list\">\n <template v-if=\"props.deviceType === 'passkey'\">\n <li>• Your browser will prompt you to create a passkey</li>\n <li>• Use Touch ID, Face ID, Windows Hello, or PIN</li>\n <li>• Follow the prompts to complete setup</li>\n </template>\n <template v-else>\n <li>• Insert your hardware key into a USB port</li>\n <li>• Your browser will prompt you to interact with the key</li>\n <li>• Touch the key's button or sensor when prompted</li>\n </template>\n </ul>\n </div>\n </div>\n </div>\n\n <div class=\"hardware-key-setup-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"step = 1\" :disabled=\"loading\">\n Back\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"handleRegisterHardwareKey\" :disabled=\"loading\" :loading=\"loading\">\n Register Key\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 3: Registration In Progress -->\n <div v-if=\"step === 3\" class=\"hardware-key-setup-step\">\n <div class=\"hardware-key-setup-progress\">\n <div class=\"hardware-key-setup-progress-icon\">\n <StrandsUiLoader :size=\"24\" class=\"hardware-key-setup-loader\" />\n </div>\n <h3 class=\"hardware-key-setup-step-title\">Registering Hardware Key</h3>\n <p class=\"hardware-key-setup-progress-message\">\n {{ registrationMessage }}\n </p>\n </div>\n\n <!-- Dynamic Progress Indicator -->\n <div class=\"hardware-key-setup-progress-indicator\">\n <div class=\"hardware-key-setup-progress-content\">\n <div class=\"hardware-key-setup-progress-check\">\n <div class=\"hardware-key-setup-check-icon\">\n <svg class=\"hardware-key-setup-check\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n </div>\n <p class=\"hardware-key-setup-progress-text\">Touch your hardware key to complete registration</p>\n </div>\n </div>\n </div>\n\n <!-- Step 4: Success & Backup Codes -->\n <div v-if=\"step === 4\" class=\"hardware-key-setup-step\">\n <div class=\"hardware-key-setup-success\">\n <div class=\"hardware-key-setup-success-icon\">\n <svg class=\"hardware-key-setup-success-check\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\" />\n </svg>\n </div>\n <h3 class=\"hardware-key-setup-step-title\">Hardware Key Setup Complete!</h3>\n <p class=\"hardware-key-setup-success-message\">\n Your hardware key is now active for two-factor authentication.\n </p>\n </div>\n\n <!-- Backup Codes -->\n <div class=\"hardware-key-setup-backup-codes\">\n <div class=\"hardware-key-setup-backup-codes-header\">\n <svg class=\"hardware-key-setup-warning-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"hardware-key-setup-backup-codes-title\">Save These Backup Codes</p>\n <p class=\"hardware-key-setup-backup-codes-description\">\n Store these codes in a safe place. Each code can only be used once if you lose your hardware key.\n </p>\n </div>\n </div>\n\n <div class=\"hardware-key-setup-codes-container\">\n <div class=\"hardware-key-setup-codes-grid\">\n <div v-for=\"(code, index) in backupCodes\" :key=\"index\" class=\"hardware-key-setup-code\">\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"hardware-key-setup-copy-action\">\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"copyBackupCodes\">\n 📋 Copy Codes\n </StrandsUiButton>\n </div>\n </div>\n\n <div class=\"hardware-key-setup-final-action\">\n <StrandsUiButton variant=\"primary\" @click=\"finish\">\n Done\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Step 5: Error State -->\n <div v-if=\"step === 5\" class=\"hardware-key-setup-step\">\n <div class=\"hardware-key-setup-error\">\n <div class=\"hardware-key-setup-error-icon\">\n <svg class=\"hardware-key-setup-error-x\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </div>\n <h3 class=\"hardware-key-setup-step-title\">Registration Failed</h3>\n <p class=\"hardware-key-setup-error-message\">\n {{ errorMessage }}\n </p>\n </div>\n\n <div class=\"hardware-key-setup-actions\">\n <StrandsUiButton variant=\"secondary\" @click=\"step = 1\">\n Start Over\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"closeModal\">\n Close\n </StrandsUiButton>\n </div>\n </div>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, computed, withDefaults } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n\ninterface Props {\n show: boolean\n deviceType?: 'passkey' | 'hardware'\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'success'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n deviceType: 'hardware'\n})\nconst emit = defineEmits<Emits>()\n\nconst { loading: mfaLoading } = useStrandsMfa()\nconst { registerHardwareKey, completeHardwareKeyRegistration, currentSession } = useStrandsAuth()\n\n// Internal loading state for this component\nconst internalLoading = ref(false)\nconst loading = computed(() => mfaLoading.value || internalLoading.value)\n\n// State\nconst step = ref(1)\nconst deviceName = ref('')\nconst deviceNameError = ref('')\nconst registrationMessage = ref('Please touch your hardware key when prompted')\nconst errorMessage = ref('')\nconst backupCodes = ref<string[]>([])\n\n// Reset when modal opens/closes\nwatch(() => props.show, (newShow) => {\n if (newShow) {\n // Reset state\n step.value = 1\n deviceName.value = ''\n deviceNameError.value = ''\n registrationMessage.value = 'Please touch your hardware key when prompted'\n errorMessage.value = ''\n backupCodes.value = []\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\n// Get optimal authenticator selection based on device type\nconst getOptimalAuthenticatorSelection = (deviceType: 'hardware' | 'passkey') => {\n if (deviceType === 'passkey') {\n return {\n authenticatorAttachment: undefined, // Allow both platform and cross-platform for passkeys\n requireResidentKey: true, // Passkeys are resident credentials\n residentKey: 'required',\n userVerification: 'required' // Passkeys should always verify user\n }\n } else {\n // Hardware keys (YubiKey, etc.)\n return {\n authenticatorAttachment: 'cross-platform', // Prefer external authenticators like YubiKey\n requireResidentKey: false,\n residentKey: 'discouraged',\n userVerification: 'discouraged' // YubiKeys work better with discouraged\n }\n }\n}\n\n// Helper function to create a device-optimized WebAuthn challenge\nconst createOptimizedWebAuthnChallenge = (challenge: any, deviceType: 'hardware' | 'passkey') => {\n // Safe buffer conversion that creates new clean objects\n const safeBufferConvert = (data: any): Uint8Array => {\n try {\n if (!data) {\n return new Uint8Array(32) // Default 32-byte random challenge\n }\n\n // If it's already a Uint8Array, create a new clean copy\n if (data instanceof Uint8Array) {\n return new Uint8Array(data)\n }\n\n // If it has a buffer property, extract it safely\n if (data && typeof data === 'object' && data.buffer) {\n return new Uint8Array(data.buffer)\n }\n\n // If it's an array of numbers\n if (Array.isArray(data)) {\n return new Uint8Array(data)\n }\n\n // If it's a string, try base64 decode\n if (typeof data === 'string') {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n }\n\n // Fallback: create random bytes\n console.warn('Unknown data format, using random bytes:', data)\n return crypto.getRandomValues(new Uint8Array(32))\n\n } catch (error) {\n console.error('Buffer conversion failed:', error)\n return crypto.getRandomValues(new Uint8Array(32))\n }\n }\n\n try {\n // Create a completely new clean object to avoid extension conflicts\n const cleanChallenge: any = {\n rp: challenge.rp || { name: 'Strands Accounts' },\n user: {\n id: safeBufferConvert(challenge.user?.id),\n name: challenge.user?.name || 'user',\n displayName: challenge.user?.displayName || challenge.user?.name || 'User'\n },\n challenge: safeBufferConvert(challenge.challenge),\n pubKeyCredParams: challenge.pubKeyCredParams || [\n { type: 'public-key', alg: -7 }, // ES256 (ECDSA w/ SHA-256)\n { type: 'public-key', alg: -35 }, // ES384 (ECDSA w/ SHA-384) \n { type: 'public-key', alg: -36 }, // ES512 (ECDSA w/ SHA-512)\n { type: 'public-key', alg: -257 }, // RS256 (RSASSA-PKCS1-v1_5 w/ SHA-256)\n { type: 'public-key', alg: -258 }, // RS384 (RSASSA-PKCS1-v1_5 w/ SHA-384)\n { type: 'public-key', alg: -259 }, // RS512 (RSASSA-PKCS1-v1_5 w/ SHA-512)\n { type: 'public-key', alg: -37 }, // PS256 (RSASSA-PSS w/ SHA-256)\n { type: 'public-key', alg: -38 }, // PS384 (RSASSA-PSS w/ SHA-384)\n { type: 'public-key', alg: -39 }, // PS512 (RSASSA-PSS w/ SHA-512)\n { type: 'public-key', alg: -8 } // EdDSA (Ed25519)\n ],\n timeout: challenge.timeout || (deviceType === 'passkey' ? 300000 : 120000), // Longer timeout for passkeys\n authenticatorSelection: challenge.authenticatorSelection || getOptimalAuthenticatorSelection(deviceType),\n attestation: challenge.attestation || (deviceType === 'passkey' ? 'none' : 'direct') // Different attestation preferences\n }\n\n // Only add excludeCredentials if it exists and has valid data\n if (challenge.excludeCredentials && Array.isArray(challenge.excludeCredentials) && challenge.excludeCredentials.length > 0) {\n cleanChallenge.excludeCredentials = challenge.excludeCredentials.map((cred: any) => ({\n type: 'public-key' as PublicKeyCredentialType,\n id: safeBufferConvert(cred.id)\n }))\n }\n\n return cleanChallenge as PublicKeyCredentialCreationOptions\n } catch (error) {\n console.error('Failed to create clean challenge:', error)\n throw new Error('Unable to process WebAuthn challenge data')\n }\n}\n\nconst startSetup = async () => {\n if (!deviceName.value.trim()) {\n deviceNameError.value = 'Device name is required'\n return\n }\n\n deviceNameError.value = ''\n step.value = 2\n}\n\nconst handleRegisterHardwareKey = async () => {\n internalLoading.value = true\n step.value = 3\n registrationMessage.value = `Starting ${props.deviceType === 'passkey' ? 'passkey' : 'hardware key'} registration...`\n\n try {\n // Check if WebAuthn is supported\n if (!window.navigator.credentials || !window.PublicKeyCredential) {\n throw new Error('WebAuthn is not supported in this browser')\n }\n\n // Check for platform authenticator support (better YubiKey detection)\n try {\n const available = await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?.()\n console.log('Platform authenticator available:', available)\n\n // Also check if conditional mediation is supported (indicates modern WebAuthn support)\n if (PublicKeyCredential.isConditionalMediationAvailable) {\n const conditionalMediationAvailable = await PublicKeyCredential.isConditionalMediationAvailable()\n console.log('Conditional mediation available:', conditionalMediationAvailable)\n }\n } catch (checkError) {\n console.warn('Could not check authenticator availability:', checkError)\n // Continue anyway as this is not critical\n }\n\n // Use composable for API call\n if (!currentSession.value?.accessToken) {\n throw new Error('Not authenticated. Please sign in again.')\n }\n\n const { device_id, challenge } = await registerHardwareKey(deviceName.value.trim(), currentSession.value.accessToken)\n\n console.log('WebAuthn challenge received:', JSON.stringify(challenge, null, 2))\n console.log('Device ID:', device_id)\n\n // Validate challenge structure\n if (!challenge || typeof challenge !== 'object') {\n throw new Error('Invalid challenge received from server')\n }\n\n // Log the raw challenge properties to debug the extension issue\n console.log('Challenge properties:', Object.keys(challenge))\n console.log('Challenge.challenge type:', typeof challenge.challenge, challenge.challenge)\n console.log('Challenge.user type:', typeof challenge.user, challenge.user)\n if (challenge.user) {\n console.log('Challenge.user.id type:', typeof challenge.user.id, challenge.user.id)\n }\n\n // Try to create a device-specific challenge optimized for the device type\n const processedChallenge = createOptimizedWebAuthnChallenge(challenge, props.deviceType)\n console.log('Processed challenge for WebAuthn:', processedChallenge)\n\n registrationMessage.value = 'Please touch your hardware key now...'\n\n // Create WebAuthn credential\n const credential = await navigator.credentials.create({\n publicKey: processedChallenge\n }) as PublicKeyCredential\n\n if (!credential) {\n throw new Error('Hardware key registration was cancelled')\n }\n\n console.log('WebAuthn credential created:', credential)\n registrationMessage.value = 'Completing registration...'\n\n // Complete registration via API using composable\n const response = credential.response as AuthenticatorAttestationResponse\n\n try {\n // Validate credential components before processing\n console.log('Credential structure:', {\n id: credential.id,\n rawId: credential.rawId,\n response: response,\n type: credential.type\n })\n\n if (!credential.rawId) {\n throw new Error('Missing rawId in credential')\n }\n if (!response.clientDataJSON) {\n throw new Error('Missing clientDataJSON in credential response')\n }\n if (!response.attestationObject) {\n throw new Error('Missing attestationObject in credential response')\n }\n\n // Safe ArrayBuffer to Array conversion\n const rawIdArray = credential.rawId instanceof ArrayBuffer ?\n Array.from(new Uint8Array(credential.rawId)) :\n Array.from(credential.rawId)\n\n const clientDataArray = response.clientDataJSON instanceof ArrayBuffer ?\n Array.from(new Uint8Array(response.clientDataJSON)) :\n Array.from(response.clientDataJSON)\n\n const attestationArray = response.attestationObject instanceof ArrayBuffer ?\n Array.from(new Uint8Array(response.attestationObject)) :\n Array.from(response.attestationObject)\n\n const credentialPayload = {\n id: credential.id,\n rawId: rawIdArray,\n response: {\n clientDataJSON: clientDataArray,\n attestationObject: attestationArray\n },\n type: credential.type\n }\n\n console.log('Sending credential payload:', credentialPayload)\n const result = await completeHardwareKeyRegistration(device_id, credentialPayload, currentSession.value.accessToken)\n console.log('Registration completed successfully:', result)\n backupCodes.value = result.backup_codes || []\n step.value = 4\n } catch (credError) {\n console.error('Error processing WebAuthn credential:', credError)\n throw new Error(`Failed to process hardware key data: ${credError instanceof Error ? credError.message : String(credError)}`)\n }\n\n } catch (error) {\n console.error('Hardware key registration error:', error)\n\n // Provide user-friendly error messages for common YubiKey issues\n let userErrorMessage = 'Hardware key registration failed'\n\n if (error instanceof Error) {\n const errorMsg = error.message.toLowerCase()\n\n if (errorMsg.includes('not supported') || errorMsg.includes('webauthn')) {\n userErrorMessage = 'WebAuthn is not supported in this browser. Please use Chrome, Firefox, Safari, or Edge.'\n } else if (errorMsg.includes('cancelled') || errorMsg.includes('aborted')) {\n userErrorMessage = 'Hardware key registration was cancelled. Please try again and touch your key when prompted.'\n } else if (errorMsg.includes('timeout')) {\n userErrorMessage = 'Hardware key registration timed out. Please ensure your key is connected and try again.'\n } else if (errorMsg.includes('not allowed') || errorMsg.includes('invalid state')) {\n userErrorMessage = 'This hardware key may already be registered or cannot be used. Try a different key or contact support.'\n } else if (errorMsg.includes(\"can't be used\") || errorMsg.includes('newer or different')) {\n userErrorMessage = 'Your hardware key is not compatible. Please ensure you have a FIDO2/WebAuthn compatible key like YubiKey 5 Series, and that it\\'s properly connected.'\n } else if (errorMsg.includes('user verification') || errorMsg.includes('pin')) {\n userErrorMessage = 'Hardware key verification failed. If your key has a PIN, please enter it when prompted.'\n } else {\n userErrorMessage = error.message\n }\n }\n\n errorMessage.value = userErrorMessage\n step.value = 5\n } finally {\n internalLoading.value = false\n }\n}\n\nconst copyBackupCodes = async () => {\n if (!backupCodes.value.length) return\n\n try {\n const codesText = backupCodes.value.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst finish = () => {\n emit('success')\n}\n</script>\n\n<style scoped>\n/* Modal container */\n.hardware-key-setup-modal {\n max-width: 28rem;\n}\n\n/* Header */\n.hardware-key-setup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.hardware-key-setup-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.hardware-key-setup-close {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n border-radius: 0.25rem;\n}\n\n.hardware-key-setup-close:hover {\n color: #4b5563;\n}\n\n.hardware-key-setup-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Step container */\n.hardware-key-setup-step {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.hardware-key-setup-step-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.5rem;\n}\n\n.hardware-key-setup-step-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1rem;\n}\n\n/* Actions */\n.hardware-key-setup-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding-top: 1rem;\n}\n\n.hardware-key-setup-final-action {\n display: flex;\n justify-content: flex-end;\n padding-top: 1rem;\n}\n\n/* Illustration */\n.hardware-key-setup-illustration {\n display: flex;\n justify-content: center;\n background-color: #f9fafb;\n padding: 1.5rem;\n border-radius: 0.5rem;\n}\n\n.hardware-key-setup-illustration-content {\n text-align: center;\n}\n\n.hardware-key-setup-icon-container {\n width: 4rem;\n height: 4rem;\n background-color: #dbeafe;\n border-radius: 0.5rem;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem auto;\n}\n\n.hardware-key-setup-icon {\n width: 2rem;\n height: 2rem;\n color: #2563eb;\n}\n\n.hardware-key-setup-status {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n}\n\n.hardware-key-setup-substatus {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n/* Instructions */\n.hardware-key-setup-instructions {\n background-color: #eff6ff;\n border: 1px solid #bfdbfe;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.hardware-key-setup-instructions-header {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.hardware-key-setup-info-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #2563eb;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.hardware-key-setup-instructions-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #1e40af;\n}\n\n.hardware-key-setup-instructions-list {\n font-size: 0.875rem;\n color: #1d4ed8;\n margin-top: 0.25rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n/* Progress states */\n.hardware-key-setup-progress {\n text-align: center;\n}\n\n.hardware-key-setup-progress-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dbeafe;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem auto;\n}\n\n.hardware-key-setup-loader {\n color: #2563eb;\n}\n\n.hardware-key-setup-progress-message {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n.hardware-key-setup-progress-indicator {\n background-color: #f9fafb;\n padding: 1rem;\n border-radius: 0.5rem;\n}\n\n.hardware-key-setup-progress-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.hardware-key-setup-progress-check {\n flex-shrink: 0;\n}\n\n.hardware-key-setup-check-icon {\n width: 1.5rem;\n height: 1.5rem;\n background-color: #2563eb;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.hardware-key-setup-check {\n width: 1rem;\n height: 1rem;\n color: white;\n}\n\n.hardware-key-setup-progress-text {\n font-size: 0.875rem;\n color: #374151;\n}\n\n/* Success state */\n.hardware-key-setup-success {\n text-align: center;\n}\n\n.hardware-key-setup-success-icon {\n width: 3rem;\n height: 3rem;\n background-color: #dcfce7;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem auto;\n}\n\n.hardware-key-setup-success-check {\n width: 1.5rem;\n height: 1.5rem;\n color: #16a34a;\n}\n\n.hardware-key-setup-success-message {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n/* Backup codes */\n.hardware-key-setup-backup-codes {\n background-color: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.hardware-key-setup-backup-codes-header {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n margin-bottom: 0.75rem;\n}\n\n.hardware-key-setup-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #dc2626;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.hardware-key-setup-backup-codes-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #991b1b;\n}\n\n.hardware-key-setup-backup-codes-description {\n font-size: 0.875rem;\n color: #b91c1c;\n margin-top: 0.25rem;\n}\n\n.hardware-key-setup-codes-container {\n background-color: white;\n border-radius: 0.25rem;\n border: 1px solid #d1d5db;\n padding: 0.75rem;\n}\n\n.hardware-key-setup-codes-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.5rem;\n font-size: 0.875rem;\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Consolas, \"Liberation Mono\", Menlo, monospace;\n color: #111827;\n}\n\n.hardware-key-setup-code {\n text-align: center;\n padding: 0.25rem 0;\n}\n\n.hardware-key-setup-copy-action {\n display: flex;\n justify-content: center;\n margin-top: 0.75rem;\n}\n\n/* Error state */\n.hardware-key-setup-error {\n text-align: center;\n}\n\n.hardware-key-setup-error-icon {\n width: 3rem;\n height: 3rem;\n background-color: #fee2e2;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1rem auto;\n}\n\n.hardware-key-setup-error-x {\n width: 1.5rem;\n height: 1.5rem;\n color: #dc2626;\n}\n\n.hardware-key-setup-error-message {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"backup-codes-modal\">\n <template #header>\n <div class=\"backup-codes-header\">\n <h2 class=\"backup-codes-title\">Backup Codes</h2>\n <button @click=\"closeModal\" class=\"backup-codes-close-button\">\n <svg class=\"backup-codes-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <div v-if=\"loading\" class=\"backup-codes-loading\">\n <StrandsUiLoader :size=\"24\" />\n <span class=\"backup-codes-loading-text\">Loading backup codes...</span>\n </div>\n\n <div v-else class=\"backup-codes-content\">\n <!-- Device Info -->\n <div v-if=\"device\" class=\"backup-codes-device-info\">\n <div class=\"backup-codes-device-content\">\n <span class=\"backup-codes-device-icon\">📱</span>\n <div>\n <h3 class=\"backup-codes-device-name\">{{ device.device_name }}</h3>\n <p class=\"backup-codes-device-type\">{{ getDeviceTypeName(device.device_type) }}</p>\n </div>\n </div>\n </div>\n\n <!-- Warning -->\n <div class=\"backup-codes-warning\">\n <div class=\"backup-codes-warning-content\">\n <svg class=\"backup-codes-warning-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"backup-codes-warning-title\">Important Security Information</p>\n <ul class=\"backup-codes-warning-list\">\n <li>• Each backup code can only be used once</li>\n <li>• Store these codes in a safe place</li>\n <li>• Use backup codes if you lose access to your authenticator</li>\n <li>• Regenerating codes will invalidate all previous codes</li>\n </ul>\n </div>\n </div>\n </div>\n\n <!-- Backup Codes -->\n <div v-if=\"backupCodes.length > 0\">\n <h3 class=\"backup-codes-section-title\">Your Backup Codes</h3>\n <div class=\"backup-codes-grid-wrapper\">\n <div class=\"backup-codes-grid\">\n <div v-for=\"(code, index) in backupCodes\" :key=\"index\" class=\"backup-codes-code-item\">\n {{ code }}\n </div>\n </div>\n </div>\n\n <div class=\"backup-codes-actions\">\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"copyBackupCodes\">\n 📋 Copy All Codes\n </StrandsUiButton>\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"downloadBackupCodes\">\n 💾 Download\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"backup-codes-main-actions\">\n <div class=\"backup-codes-main-actions-content\">\n <StrandsUiButton variant=\"secondary\" @click=\"regenerateCodes\" :disabled=\"loading\" :loading=\"loading\">\n 🔄 Regenerate Codes\n </StrandsUiButton>\n <StrandsUiButton variant=\"primary\" @click=\"closeModal\">\n Done\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Regeneration Warning -->\n <div v-if=\"showRegenerateWarning\" class=\"backup-codes-regenerate-warning\">\n <div class=\"backup-codes-regenerate-content\">\n <svg class=\"backup-codes-regenerate-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\"\n d=\"M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z\"\n clip-rule=\"evenodd\" />\n </svg>\n <div>\n <p class=\"backup-codes-regenerate-title\">Regenerate Backup Codes?</p>\n <p class=\"backup-codes-regenerate-description\">\n This will invalidate all current backup codes. Make sure to save the new ones.\n </p>\n <div class=\"backup-codes-regenerate-actions\">\n <StrandsUiButton variant=\"primary\" size=\"sm\" @click=\"confirmRegenerate\" :disabled=\"loading\"\n :loading=\"loading\">\n Yes, Regenerate\n </StrandsUiButton>\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"showRegenerateWarning = false\">\n Cancel\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n device?: MfaDevice | null\n}\n\ninterface Emits {\n (e: 'close'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\nconst { regenerateBackupCodes, loading, getDeviceTypeName } = useStrandsMfa()\n\n// State\nconst backupCodes = ref<string[]>([])\nconst showRegenerateWarning = ref(false)\n\n// Load backup codes when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow && props.device) {\n showRegenerateWarning.value = false\n // For now, we'll use the device's backup codes if available\n // In a real implementation, you might fetch fresh codes or show cached ones\n backupCodes.value = []\n }\n})\n\nonMounted(async () => {\n if (props.show && props.device) {\n // Initialize with empty codes - user needs to regenerate to see them\n backupCodes.value = []\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst regenerateCodes = () => {\n showRegenerateWarning.value = true\n}\n\nconst confirmRegenerate = async () => {\n if (!props.device) return\n\n try {\n const response = await regenerateBackupCodes(props.device.id)\n backupCodes.value = response.backup_codes\n showRegenerateWarning.value = false\n } catch (error) {\n console.error('Failed to regenerate backup codes:', error)\n // Show error message\n }\n}\n\nconst copyBackupCodes = async () => {\n if (backupCodes.value.length === 0) return\n\n try {\n const codesText = backupCodes.value.join('\\n')\n await navigator.clipboard.writeText(codesText)\n // Could show a toast here\n console.log('Backup codes copied to clipboard')\n } catch (error) {\n console.error('Failed to copy backup codes:', error)\n }\n}\n\nconst downloadBackupCodes = () => {\n if (backupCodes.value.length === 0) return\n\n const deviceName = props.device?.device_name || 'device'\n const timestamp = new Date().toISOString().split('T')[0]\n const filename = `strands-backup-codes-${deviceName}-${timestamp}.txt`\n\n const content = [\n 'Strands Account Backup Codes',\n '============================',\n '',\n `Device: ${props.device?.device_name}`,\n `Generated: ${new Date().toLocaleString()}`,\n '',\n 'IMPORTANT:',\n '- Each code can only be used once',\n '- Store these codes in a safe place',\n '- Use these if you lose access to your authenticator',\n '',\n 'Backup Codes:',\n ...backupCodes.value.map((code, index) => `${index + 1}. ${code}`),\n '',\n '============================',\n ].join('\\n')\n\n const blob = new Blob([content], { type: 'text/plain' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n}\n</script>\n\n<style scoped>\n/* Modal container */\n.backup-codes-modal {\n max-width: 28rem;\n}\n\n/* Header */\n.backup-codes-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.backup-codes-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.backup-codes-close-button {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n}\n\n.backup-codes-close-button:hover {\n color: #4b5563;\n}\n\n.backup-codes-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Loading */\n.backup-codes-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem 0;\n}\n\n.backup-codes-loading-text {\n margin-left: 0.75rem;\n color: #4b5563;\n}\n\n/* Content */\n.backup-codes-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n/* Device info */\n.backup-codes-device-info {\n background-color: #f9fafb;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-codes-device-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.backup-codes-device-icon {\n font-size: 1.5rem;\n}\n\n.backup-codes-device-name {\n font-weight: 500;\n color: #111827;\n margin: 0;\n}\n\n.backup-codes-device-type {\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n}\n\n/* Warning */\n.backup-codes-warning {\n background-color: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-codes-warning-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.backup-codes-warning-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #dc2626;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.backup-codes-warning-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #991b1b;\n margin: 0;\n}\n\n.backup-codes-warning-list {\n font-size: 0.875rem;\n color: #b91c1c;\n margin-top: 0.25rem;\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n list-style: none;\n padding: 0;\n}\n\n/* Section title */\n.backup-codes-section-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 0.75rem;\n}\n\n/* Codes grid */\n.backup-codes-grid-wrapper {\n background-color: white;\n border: 1px solid #e5e7eb;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-codes-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 0.5rem;\n font-size: 0.875rem;\n font-family: 'SF Mono', Monaco, Inconsolata, 'Roboto Mono', Consolas, 'Courier New', monospace;\n}\n\n.backup-codes-code-item {\n text-align: center;\n padding: 0.5rem 0;\n background-color: #f9fafb;\n border-radius: 0.25rem;\n}\n\n/* Actions */\n.backup-codes-actions {\n display: flex;\n justify-content: center;\n margin-top: 1rem;\n gap: 0.75rem;\n}\n\n.backup-codes-main-actions {\n padding-top: 1rem;\n border-top: 1px solid #e5e7eb;\n}\n\n.backup-codes-main-actions-content {\n display: flex;\n justify-content: space-between;\n}\n\n/* Regenerate warning */\n.backup-codes-regenerate-warning {\n background-color: #fefce8;\n border: 1px solid #fde047;\n border-radius: 0.5rem;\n padding: 1rem;\n}\n\n.backup-codes-regenerate-content {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n}\n\n.backup-codes-regenerate-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #d97706;\n margin-top: 0.125rem;\n flex-shrink: 0;\n}\n\n.backup-codes-regenerate-title {\n font-size: 0.875rem;\n font-weight: 500;\n color: #92400e;\n margin: 0;\n}\n\n.backup-codes-regenerate-description {\n font-size: 0.875rem;\n color: #a16207;\n margin-top: 0.25rem;\n}\n\n.backup-codes-regenerate-actions {\n display: flex;\n gap: 0.5rem;\n margin-top: 0.75rem;\n}\n</style>\n","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" card-class=\"confirm-modal\">\n <template #header>\n <h2 class=\"confirm-modal-title\">{{ title }}</h2>\n </template>\n \n <p class=\"confirm-modal-message\">{{ message }}</p>\n\n <div class=\"confirm-modal-actions\">\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n {{ cancelText }}\n </StrandsUiButton>\n <StrandsUiButton\n :variant=\"variant\"\n @click=\"handleConfirm\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ confirmText }}\n </StrandsUiButton>\n </div>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { StrandsUiButton } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\n\ntype ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline'\n\ninterface Props {\n show: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n variant?: ButtonVariant\n}\n\ninterface Emits {\n (e: 'confirm'): void\n (e: 'cancel'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'primary'\n})\n\nconst emit = defineEmits<Emits>()\n\nconst loading = ref(false)\n\nconst handleConfirm = () => {\n loading.value = true\n emit('confirm')\n // Note: Parent component should handle resetting loading state\n // by either closing the modal or setting loading to false\n}\n\nconst handleCancel = () => {\n emit('cancel')\n}\n</script>\n\n<style scoped>\n.confirm-modal {\n max-width: 24rem;\n}\n\n.confirm-modal-title {\n font-size: 1.125rem;\n font-weight: 700;\n color: #111827;\n}\n\n.confirm-modal-message {\n font-size: 0.875rem;\n color: #6b7280;\n margin-bottom: 1.5rem;\n}\n\n.confirm-modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n}\n</style>\n","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"showModal\" @close=\"closeModal\" card-class=\"mfa-modal-card\">\n <template #header>\n <div class=\"mfa-modal-header\">\n <h2 class=\"mfa-modal-title\">Two-Factor Authentication</h2>\n <button @click=\"closeModal\" class=\"mfa-modal-close\">\n <svg class=\"mfa-modal-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n <!-- Loading State -->\n <div v-if=\"mfaLoading\" class=\"mfa-loading\">\n <StrandsUiLoader :size=\"32\" />\n <span class=\"mfa-loading-text\">Loading MFA settings...</span>\n </div>\n\n <!-- Tab Navigation -->\n <div v-else class=\"mfa-content\">\n <!-- MFA Status Overview -->\n <div class=\"mfa-status-overview\">\n <div class=\"mfa-status-content\">\n <div>\n <h3 class=\"mfa-status-title\">Two-Factor Authentication</h3>\n <p class=\"mfa-status-subtitle\">\n {{ mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n <div class=\"mfa-status-badges\">\n <span v-if=\"mfaEnabled\" class=\"mfa-status-badge mfa-status-badge-enabled\">\n <Shield :size=\"12\" class=\"mfa-badge-icon\" />\n Enabled\n </span>\n <span v-else class=\"mfa-status-badge mfa-status-badge-disabled\">\n Not Enabled\n </span>\n </div>\n </div>\n </div>\n\n <!-- Tab Navigation -->\n <div class=\"mfa-tabs-container\">\n <nav class=\"mfa-tabs-nav\" aria-label=\"Tabs\">\n <button @click=\"activeTab = 'add'\" :class=\"[\n 'mfa-tab-button',\n activeTab === 'add' ? 'mfa-tab-button-active' : 'mfa-tab-button-inactive'\n ]\">\n Add New Device\n </button>\n <button v-if=\"activeMfaDevices.length > 0\" @click=\"activeTab = 'manage'\" :class=\"[\n 'mfa-tab-button',\n activeTab === 'manage' ? 'mfa-tab-button-active' : 'mfa-tab-button-inactive'\n ]\">\n Active Devices ({{ activeMfaDevices.length }})\n </button>\n </nav>\n </div>\n\n <!-- Tab Content: Add New Device -->\n <div v-if=\"activeTab === 'add'\" class=\"mfa-add-devices\">\n <div>\n <h3 class=\"mfa-section-title\">Choose Your Authentication Method</h3>\n <div class=\"mfa-device-options\">\n <!-- TOTP Setup -->\n <div class=\"mfa-device-option\" @click=\"startTotpSetup\">\n <div class=\"mfa-device-layout\">\n <div class=\"mfa-device-icon-container mfa-device-icon-totp\">\n <Smartphone :size=\"24\" class=\"mfa-device-icon\" />\n </div>\n <div class=\"mfa-device-content\">\n <div class=\"mfa-device-info\">\n <h4 class=\"mfa-device-title\">Authenticator App</h4>\n <p class=\"mfa-device-description\">\n Use Google Authenticator, Authy, or any TOTP-compatible app to generate secure codes\n </p>\n </div>\n </div>\n <div class=\"mfa-device-action\">\n <StrandsUiButton variant=\"primary\" size=\"md\" @click.stop=\"startTotpSetup\" :disabled=\"mfaLoading\">\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <!-- Email MFA Setup -->\n <div class=\"mfa-device-option\" @click=\"startEmailMfaSetup\">\n <div class=\"mfa-device-layout\">\n <div class=\"mfa-device-icon-container mfa-device-icon-email\">\n <Mail :size=\"24\" class=\"mfa-device-icon\" />\n </div>\n <div class=\"mfa-device-content\">\n <div class=\"mfa-device-info\">\n <h4 class=\"mfa-device-title\">Email Verification</h4>\n <p class=\"mfa-device-description\">\n Receive verification codes directly in your email inbox for easy access\n </p>\n </div>\n </div>\n <div class=\"mfa-device-action\">\n <StrandsUiButton variant=\"primary\" size=\"md\" @click.stop=\"startEmailMfaSetup\"\n :disabled=\"mfaLoading\">\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <!-- Hardware Key Setup - Temporarily Disabled -->\n <!-- \n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startHardwareKeySetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <KeyRound :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Hardware Security Key</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Use YubiKey, FIDO2, or other physical security keys for ultimate protection\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startHardwareKeySetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n\n <-- Passkey Setup - Temporarily Disabled -->\n <!-- \n <div class=\"group p-6 bg-white border border-gray-200 rounded-xl hover:border-gray-300 hover:shadow-md transition-all duration-200 cursor-pointer\" @click=\"startPasskeySetup\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex-shrink-0 w-14 h-14 bg-[var(--strands-primary)] bg-opacity-10 rounded-xl flex items-center justify-center group-hover:bg-[var(--strands-primary)] group-hover:bg-opacity-15 transition-colors\">\n <Shield :size=\"24\" class=\"text-[var(--strands-primary)]\" />\n </div>\n <div class=\"flex items-start space-x-4\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"font-semibold text-gray-900 text-lg\">Passkey</h4>\n <p class=\"text-xs text-gray-500 mt-2\">\n Use your device's built-in biometrics, PIN, or cross-device passkeys\n </p>\n </div>\n </div>\n <div class=\"flex flex-col space-y-2 ml-4\">\n <StrandsUiButton\n variant=\"primary\"\n size=\"md\"\n @click.stop=\"startPasskeySetup\"\n :disabled=\"mfaLoading\"\n >\n Setup\n </StrandsUiButton>\n </div>\n </div>\n </div>\n -->\n </div>\n </div>\n </div>\n\n <!-- Tab Content: Active Devices -->\n <div v-else-if=\"activeTab === 'manage' && activeMfaDevices.length > 0\" class=\"mfa-manage-devices\">\n <div>\n <h3 class=\"mfa-section-title\">Manage Your Active Devices</h3>\n <div class=\"mfa-devices-list\">\n <div v-for=\"device in activeMfaDevices\" :key=\"device.id\" class=\"mfa-device-card\">\n <div class=\"mfa-device-card-content\">\n <div class=\"mfa-device-card-info\">\n <div class=\"mfa-device-card-icon-container\" :class=\"getDeviceIconBackground(device.device_type)\">\n <component :is=\"getDeviceIconComponent(device.device_type)\" :size=\"24\"\n class=\"mfa-device-card-icon\" />\n </div>\n <div class=\"mfa-device-card-details\">\n <h4 class=\"mfa-device-card-name\">{{ device.device_name }}</h4>\n <p class=\"mfa-device-card-type\">\n {{ getDeviceTypeName(device.device_type) }}\n </p>\n <p class=\"mfa-device-card-last-used\">\n Last used {{ formatLastUsed(device.last_used_at) }}\n </p>\n </div>\n </div>\n <div class=\"mfa-device-card-actions\">\n <!-- Backup codes button for TOTP, Hardware Key, and Passkey devices -->\n <StrandsUiButton\n v-if=\"device.device_type === 'totp' || device.device_type === 'hardware' || device.device_type === 'passkey'\"\n variant=\"secondary\" size=\"sm\" @click=\"showBackupCodes(device)\" :disabled=\"mfaLoading\">\n <KeyRound :size=\"14\" class=\"mfa-button-icon\" />\n Backup Codes\n </StrandsUiButton>\n\n <!-- Test email MFA -->\n <StrandsUiButton v-if=\"device.device_type === 'email'\" variant=\"secondary\" size=\"sm\"\n @click=\"testEmailMfa(device)\" :disabled=\"mfaLoading\">\n <Mail :size=\"14\" class=\"mfa-button-icon\" />\n Send Test Code\n </StrandsUiButton>\n\n <!-- Remove device -->\n <StrandsUiButton variant=\"secondary\" size=\"sm\" @click=\"confirmDisableDevice(device)\"\n :disabled=\"mfaLoading\" class=\"mfa-remove-button\">\n <Trash2 :size=\"14\" class=\"mfa-button-icon\" />\n Remove\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOTP Setup Modal -->\n <StrandsTotpSetupModal v-if=\"showTotpSetup\" :show=\"showTotpSetup\" @close=\"showTotpSetup = false\"\n @success=\"handleTotpSetupSuccess\" />\n\n <!-- Email MFA Setup Modal -->\n <StrandsEmailMfaSetupModal v-if=\"showEmailMfaSetup\" :show=\"showEmailMfaSetup\" @close=\"showEmailMfaSetup = false\"\n @success=\"handleEmailMfaSetupSuccess\" />\n\n <!-- Hardware Key Setup Modal -->\n <StrandsHardwareKeySetupModal v-if=\"showHardwareKeySetup\" :show=\"showHardwareKeySetup\" :device-type=\"'hardware'\"\n @close=\"showHardwareKeySetup = false\" @success=\"handleHardwareKeySetupSuccess\" />\n\n <!-- Passkey Setup Modal -->\n <StrandsHardwareKeySetupModal v-if=\"showPasskeySetup\" :show=\"showPasskeySetup\" :device-type=\"'passkey'\"\n @close=\"showPasskeySetup = false\" @success=\"handlePasskeySetupSuccess\" />\n\n <!-- Backup Codes Modal -->\n <StrandsBackupCodesModal v-if=\"showBackupCodesModal\" :show=\"showBackupCodesModal\" :device=\"selectedDevice\"\n @close=\"showBackupCodesModal = false\" />\n\n </UiModal>\n\n <!-- Confirm Disable Modal -->\n <StrandsConfirmModal v-if=\"showConfirmDisable\" :show=\"showConfirmDisable\" title=\"Remove MFA Device\"\n :message=\"`Are you sure you want to remove '${selectedDevice?.device_name}'? This action cannot be undone.`\"\n confirm-text=\"Remove Device\" cancel-text=\"Keep Device\" variant=\"secondary\" @confirm=\"handleDisableDevice\"\n @cancel=\"showConfirmDisable = false\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\n// Inline SVG icon components replacing lucide-vue-next\nconst Smartphone = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>`, props: ['size'] }\nconst Mail = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m4 4 16 0c1.1 0 2 .9 2 2l0 12c0 1.1-.9 2-2 2l-16 0c-1.1 0-2-.9-2-2l0-12c0-1.1.9-2 2-2z\"/><polyline points=\"22,6 12,13 2,6\"/></svg>`, props: ['size'] }\nconst KeyRound = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/></svg>`, props: ['size'] }\nconst Shield = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/></svg>`, props: ['size'] }\nconst Trash2 = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m3 6 18 0\"/><path d=\"m19 6-1 14c0 1-1 2-2 2l-8 0c-1 0-2-1-2-2l-1-14\"/><path d=\"m8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\"/><line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\"/></svg>`, props: ['size'] }\nimport UiModal from '../ui/UiModal.vue'\nimport StrandsTotpSetupModal from './StrandsTotpSetupModal.vue'\nimport StrandsEmailMfaSetupModal from './StrandsEmailMfaSetupModal.vue'\nimport StrandsHardwareKeySetupModal from './StrandsHardwareKeySetupModal.vue'\nimport StrandsBackupCodesModal from './StrandsBackupCodesModal.vue'\nimport StrandsConfirmModal from './StrandsConfirmModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\nimport type { MfaDevice } from '../../types'\n\ninterface Props {\n show: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'mfa-updated'): void\n}\n\nconst props = defineProps<Props>()\nconst emit = defineEmits<Emits>()\n\n// MFA composable\nconst {\n mfaDevices,\n mfaEnabled,\n loading: mfaLoading,\n activeMfaDevices,\n fetchMfaDevices,\n disableMfaDevice,\n sendEmailMfaCode,\n getDeviceTypeIcon,\n getDeviceTypeName,\n formatLastUsed,\n} = useStrandsMfa()\n\n// Modal states\nconst showModal = computed(() => props.show)\nconst activeTab = ref<'add' | 'manage'>('add')\nconst showTotpSetup = ref(false)\nconst showEmailMfaSetup = ref(false)\nconst showHardwareKeySetup = ref(false)\nconst showPasskeySetup = ref(false)\nconst showBackupCodesModal = ref(false)\nconst showConfirmDisable = ref(false)\nconst selectedDevice = ref<MfaDevice | null>(null)\n\n// Load MFA devices when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n await fetchMfaDevices()\n }\n})\n\nonMounted(async () => {\n if (props.show) {\n await fetchMfaDevices()\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startTotpSetup = () => {\n showTotpSetup.value = true\n}\n\nconst startEmailMfaSetup = () => {\n showEmailMfaSetup.value = true\n}\n\nconst startHardwareKeySetup = () => {\n showHardwareKeySetup.value = true\n}\n\nconst startPasskeySetup = () => {\n showPasskeySetup.value = true\n}\n\nconst showBackupCodes = (device: MfaDevice) => {\n selectedDevice.value = device\n showBackupCodesModal.value = true\n}\n\nconst testEmailMfa = async (device: MfaDevice) => {\n try {\n await sendEmailMfaCode(device.id)\n // Show success message or toast\n console.log('Test code sent to email')\n } catch (error) {\n console.error('Failed to send test code:', error)\n // Show error message\n }\n}\n\nconst confirmDisableDevice = (device: MfaDevice) => {\n selectedDevice.value = device\n showConfirmDisable.value = true\n}\n\nconst handleDisableDevice = async () => {\n if (selectedDevice.value) {\n try {\n await disableMfaDevice(selectedDevice.value.id)\n showConfirmDisable.value = false\n selectedDevice.value = null\n emit('mfa-updated')\n } catch (error) {\n console.error('Failed to disable MFA device:', error)\n // Show error message\n }\n }\n}\n\nconst handleTotpSetupSuccess = async () => {\n showTotpSetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handleEmailMfaSetupSuccess = async () => {\n showEmailMfaSetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handleHardwareKeySetupSuccess = async () => {\n showHardwareKeySetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst handlePasskeySetupSuccess = async () => {\n showPasskeySetup.value = false\n await fetchMfaDevices()\n activeTab.value = 'manage' // Switch to manage tab after setup\n emit('mfa-updated')\n}\n\nconst getDeviceIconBackground = (deviceType: string) => {\n switch (deviceType) {\n case 'totp':\n return 'mfa-device-bg-blue'\n case 'email':\n return 'mfa-device-bg-green'\n case 'hardware':\n return 'mfa-device-bg-purple'\n case 'passkey':\n return 'mfa-device-bg-indigo'\n default:\n return 'mfa-device-bg-gray'\n }\n}\n\nconst getDeviceIconComponent = (deviceType: string) => {\n switch (deviceType) {\n case 'totp':\n return Smartphone\n case 'email':\n return Mail\n case 'hardware':\n return KeyRound\n case 'passkey':\n return Shield\n default:\n return Shield\n }\n}\n</script>\n\n<style scoped>\n/* Modal styles */\n.mfa-modal-card {\n max-width: 56rem;\n}\n\n.mfa-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mfa-modal-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #111827;\n}\n\n.mfa-modal-close {\n color: #9ca3af;\n background: none;\n border: none;\n cursor: pointer;\n transition: color 0.2s ease;\n}\n\n.mfa-modal-close:hover {\n color: #4b5563;\n}\n\n.mfa-modal-close-icon {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n/* Loading state */\n.mfa-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 3rem 0;\n}\n\n.mfa-loading-text {\n margin-left: 0.75rem;\n color: #4b5563;\n}\n\n/* Main content */\n.mfa-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n/* Status overview */\n.mfa-status-overview {\n background-color: #f9fafb;\n border-radius: 0.75rem;\n padding: 1rem;\n}\n\n.mfa-status-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mfa-status-title {\n font-weight: 600;\n color: #111827;\n}\n\n.mfa-status-subtitle {\n font-size: 0.875rem;\n color: #4b5563;\n}\n\n.mfa-status-badges {\n display: flex;\n align-items: center;\n}\n\n.mfa-status-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.125rem 0.625rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 500;\n}\n\n.mfa-status-badge-enabled {\n background-color: #dcfce7;\n color: #166534;\n}\n\n.mfa-status-badge-disabled {\n background-color: #f3f4f6;\n color: #4b5563;\n}\n\n.mfa-badge-icon {\n margin-right: 0.25rem;\n}\n\n/* Tab navigation */\n.mfa-tabs-container {\n border-bottom: 1px solid #e5e7eb;\n}\n\n.mfa-tabs-nav {\n margin-bottom: -1px;\n display: flex;\n gap: 2rem;\n}\n\n.mfa-tab-button {\n white-space: nowrap;\n padding: 0.5rem 0.25rem;\n border-bottom: 2px solid transparent;\n font-weight: 500;\n font-size: 0.875rem;\n background: none;\n border-top: none;\n border-left: none;\n border-right: none;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.mfa-tab-button-active {\n border-bottom-color: var(--strands-primary, #EA00A8);\n color: var(--strands-primary, #EA00A8);\n}\n\n.mfa-tab-button-inactive {\n border-bottom-color: transparent;\n color: #6b7280;\n}\n\n.mfa-tab-button-inactive:hover {\n color: #374151;\n border-bottom-color: #d1d5db;\n}\n\n/* Section titles */\n.mfa-section-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 1.5rem;\n}\n\n/* Add devices section */\n.mfa-add-devices {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.mfa-device-options {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.mfa-device-option {\n padding: 1.5rem;\n background-color: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n group: hover;\n}\n\n.mfa-device-option:hover {\n border-color: #d1d5db;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n}\n\n.mfa-device-layout {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mfa-device-icon-container {\n flex-shrink: 0;\n width: 3.5rem;\n height: 3.5rem;\n border-radius: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s ease;\n}\n\n.mfa-device-icon-totp {\n background-color: rgba(59, 130, 246, 0.1);\n}\n\n.mfa-device-option:hover .mfa-device-icon-totp {\n background-color: rgba(59, 130, 246, 0.15);\n}\n\n.mfa-device-icon-email {\n background-color: rgba(16, 185, 129, 0.1);\n}\n\n.mfa-device-option:hover .mfa-device-icon-email {\n background-color: rgba(16, 185, 129, 0.15);\n}\n\n.mfa-device-icon {\n color: var(--strands-primary, #EA00A8);\n}\n\n.mfa-device-content {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n margin-left: 1rem;\n margin-right: 1rem;\n}\n\n.mfa-device-info {\n min-width: 0;\n flex: 1;\n}\n\n.mfa-device-title {\n font-weight: 600;\n color: #111827;\n font-size: 1.125rem;\n}\n\n.mfa-device-description {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.5rem;\n}\n\n.mfa-device-action {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin-left: 1rem;\n}\n\n/* Manage devices section */\n.mfa-manage-devices {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.mfa-devices-list {\n max-height: 24rem;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding-right: 0.5rem;\n}\n\n.mfa-device-card {\n padding: 1.5rem;\n background-color: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 0.75rem;\n transition: all 0.2s ease;\n}\n\n.mfa-device-card:hover {\n border-color: #d1d5db;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n}\n\n.mfa-device-card-content {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n}\n\n.mfa-device-card-info {\n display: flex;\n align-items: flex-start;\n gap: 1rem;\n}\n\n.mfa-device-card-icon-container {\n flex-shrink: 0;\n width: 3.5rem;\n height: 3.5rem;\n border-radius: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mfa-device-card-icon {\n color: #4b5563;\n}\n\n.mfa-device-card-details {\n min-width: 0;\n flex: 1;\n}\n\n.mfa-device-card-name {\n font-weight: 600;\n color: #111827;\n font-size: 1.125rem;\n}\n\n.mfa-device-card-type {\n font-size: 0.875rem;\n color: #4b5563;\n margin-top: 0.25rem;\n}\n\n.mfa-device-card-last-used {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.5rem;\n}\n\n.mfa-device-card-actions {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n margin-left: 1rem;\n}\n\n.mfa-button-icon {\n margin-right: 0.5rem;\n}\n\n.mfa-remove-button {\n color: #dc2626;\n border-color: #fecaca;\n}\n\n.mfa-remove-button:hover {\n background-color: #fef2f2;\n color: #b91c1c;\n}\n\n/* Device type background colors */\n.mfa-device-bg-blue {\n background-color: #eff6ff;\n}\n\n.mfa-device-card:hover .mfa-device-bg-blue {\n background-color: #dbeafe;\n}\n\n.mfa-device-bg-green {\n background-color: #f0fdf4;\n}\n\n.mfa-device-card:hover .mfa-device-bg-green {\n background-color: #dcfce7;\n}\n\n.mfa-device-bg-purple {\n background-color: #faf5ff;\n}\n\n.mfa-device-card:hover .mfa-device-bg-purple {\n background-color: #f3e8ff;\n}\n\n.mfa-device-bg-indigo {\n background-color: #eef2ff;\n}\n\n.mfa-device-card:hover .mfa-device-bg-indigo {\n background-color: #e0e7ff;\n}\n\n.mfa-device-bg-gray {\n background-color: #f9fafb;\n}\n\n.mfa-device-card:hover .mfa-device-bg-gray {\n background-color: #f3f4f6;\n}\n\n/* Responsive design */\n@media (max-width: 768px) {\n .mfa-device-layout {\n flex-direction: column;\n align-items: flex-start;\n gap: 1rem;\n }\n\n .mfa-device-content {\n margin-left: 0;\n margin-right: 0;\n width: 100%;\n }\n\n .mfa-device-action {\n margin-left: 0;\n width: 100%;\n }\n\n .mfa-device-card-content {\n flex-direction: column;\n gap: 1rem;\n }\n\n .mfa-device-card-actions {\n margin-left: 0;\n width: 100%;\n }\n}\n\n</style>\n","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"true\" @close=\"$emit('close')\" card-class=\"max-w-lg\">\n <template #header>\n <div class=\"settings-header\">\n <h2 class=\"settings-title\">Settings</h2>\n <button \n class=\"settings-close-button\"\n @click=\"$emit('close')\"\n type=\"button\"\n >\n <svg class=\"settings-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n\n <!-- Audio Preferences Section -->\n <div class=\"settings-content\">\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">Audio Preferences</h3>\n \n <!-- Level Up Sounds Toggle -->\n <div class=\"settings-option\">\n <div class=\"settings-option-content\">\n <div class=\"settings-option-info\">\n <label for=\"level-up-sounds\" class=\"settings-option-label\">\n Level Up Sounds\n </label>\n <p class=\"settings-option-description\">\n Play sound effects when you level up\n </p>\n </div>\n <UiToggle\n id=\"level-up-sounds\"\n v-model=\"localSettings.levelUpSounds\"\n @update:model-value=\"updateSetting('levelUpSounds', $event)\"\n />\n </div>\n </div>\n\n <!-- Milestone Level Up Sounds Toggle -->\n <div class=\"settings-option\">\n <div class=\"settings-option-content\">\n <div class=\"settings-option-info\">\n <label for=\"milestone-sounds\" class=\"settings-option-label\">\n Milestone Level Sounds\n </label>\n <p class=\"settings-option-description\">\n Play special celebration sounds for milestone levels (10, 25, 50, 100, 150, 200)\n </p>\n </div>\n <UiToggle\n id=\"milestone-sounds\"\n v-model=\"localSettings.milestoneSounds\"\n @update:model-value=\"updateSetting('milestoneSounds', $event)\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"settings-footer\">\n <UiButton \n variant=\"secondary\" \n @click=\"$emit('close')\"\n >\n Close\n </UiButton>\n <UiButton \n variant=\"primary\" \n @click=\"saveSettings\"\n :loading=\"saving\"\n >\n {{ saving ? 'Saving...' : 'Save Settings' }}\n </UiButton>\n </div>\n </template>\n </UiModal>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, watch } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport UiButton from '../ui/UiButton.vue'\nimport UiToggle from '../ui/UiToggle.vue'\nimport UiModal from '../ui/UiModal.vue'\n\ninterface AudioSettings {\n levelUpSounds: boolean\n milestoneSounds: boolean\n}\n\ninterface Props {\n open?: boolean\n}\n\ninterface Emits {\n (e: 'close'): void\n (e: 'settings-updated', settings: AudioSettings): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n open: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { currentUser, updateUserSettings } = useStrandsAuth()\nconst saving = ref(false)\n\n// Initialize local settings from user settings or defaults\nconst localSettings = reactive<AudioSettings>({\n levelUpSounds: currentUser.value?.settings?.levelUpSounds ?? true,\n milestoneSounds: currentUser.value?.settings?.milestoneSounds ?? true\n})\n\n// Watch for changes in user settings\nwatch(() => currentUser.value?.settings, (newSettings) => {\n if (newSettings) {\n localSettings.levelUpSounds = newSettings.levelUpSounds ?? true\n localSettings.milestoneSounds = newSettings.milestoneSounds ?? true\n }\n}, { deep: true })\n\nconst handleOverlayClick = () => {\n emit('close')\n}\n\nconst updateSetting = (key: keyof AudioSettings, value: boolean) => {\n localSettings[key] = value\n}\n\nconst saveSettings = async () => {\n if (saving.value) return\n \n saving.value = true\n \n try {\n // Update settings on server\n await updateUserSettings({\n ...currentUser.value?.settings,\n ...localSettings\n })\n \n // Emit updated settings to parent\n emit('settings-updated', { ...localSettings })\n \n // Close modal\n emit('close')\n } catch (error) {\n console.error('Failed to save settings:', error)\n // TODO: Show error message to user\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<style scoped>\n.settings-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.settings-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n.settings-close-button {\n color: #9ca3af;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n transition: color 0.2s ease;\n}\n\n.settings-close-button:hover {\n color: #6b7280;\n}\n\n.settings-close-icon {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.settings-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.settings-section {\n /* Section container */\n}\n\n.settings-section-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 1rem;\n}\n\n.settings-option {\n background-color: #f9fafb;\n border: 1px solid #e5e7eb;\n border-radius: 0.5rem;\n padding: 1rem;\n margin-bottom: 1rem;\n}\n\n.settings-option:last-child {\n margin-bottom: 0;\n}\n\n.settings-option-content {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.settings-option-info {\n flex: 1;\n}\n\n.settings-option-label {\n display: block;\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n margin-bottom: 0.25rem;\n}\n\n.settings-option-description {\n font-size: 0.75rem;\n color: #6b7280;\n}\n\n.settings-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n}\n\n/* Override Tailwind classes with CSS properties */\n.max-w-lg {\n max-width: 32rem;\n}\n</style>\n\n","<template>\n <div class=\"accui-component-scope\">\n <div :class=\"inModal ? 'profile-container-modal profile-container-width' : 'profile-container profile-container-width profile-max-width profile-centered profile-animated'\">\n <div :class=\"inModal ? 'profile-content-modal profile-content-layout' : 'profile-content profile-card-modern profile-content-layout'\">\n <!-- Header -->\n <div class=\"profile-header\">\n <h1 class=\"profile-title\">Profile Settings</h1>\n <p class=\"profile-subtitle\">Manage your account information and preferences</p>\n </div>\n\n <!-- Profile Image Section -->\n <div class=\"profile-image-section\">\n <div class=\"profile-image-container\">\n <!-- Progress Ring Container -->\n <div class=\"profile-image-wrapper\">\n <!-- Progress Ring SVG -->\n <StrandsUiLevelProgress\n v-if=\"currentUser\"\n :size=\"140\" \n :value=\"currentUser.xp | 0\" \n :max=\"currentUser.next_level_xp | 1\" \n :level=\"currentUser.level | 0\" \n :level-label=\"`LEVEL ${currentUser.level | 0}`\"\n :user-settings=\"currentUser.settings\"\n class=\"profile-progress-ring\" \n />\n\n <!-- Avatar -->\n <div \n v-if=\"currentUser?.avatar\"\n class=\"profile-avatar profile-avatar-with-image\"\n >\n <img \n :src=\"currentUser.avatar\" \n :alt=\"`${currentUser.firstName} ${currentUser.lastName}`\"\n class=\"profile-avatar-image\"\n />\n </div>\n <div \n v-else\n class=\"profile-avatar profile-avatar-initials\"\n >\n {{ getInitials(currentUser?.firstName, currentUser?.lastName) }}\n </div>\n \n <!-- Upload Overlay -->\n <button\n class=\"profile-upload-overlay\"\n @click=\"triggerAvatarUpload\"\n :disabled=\"uploading\"\n >\n <StrandsUiLoader v-if=\"uploading\" :size=\"24\" variant=\"dark\" />\n <svg v-else class=\"profile-upload-icon\" 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 616 0z\" />\n </svg>\n </button>\n </div>\n </div>\n \n <!-- Hidden file input for avatar selection -->\n <input\n ref=\"avatarFileInput\"\n type=\"file\"\n accept=\"image/*\"\n class=\"profile-file-input\"\n @change=\"handleAvatarFileSelect\"\n />\n </div>\n\n <!-- Profile Form -->\n <form @submit.prevent=\"handleUpdateProfile\" class=\"profile-form\">\n <div class=\"profile-form-grid\">\n <!-- Personal Information -->\n <div class=\"profile-section\">\n <h3 class=\"profile-section-title\">Personal Information</h3>\n \n <StrandsUiInput\n id=\"firstName\"\n v-model=\"form.firstName\"\n type=\"text\"\n label=\"First name\"\n placeholder=\"Enter your first name\"\n autocomplete=\"given-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.firstName\"\n />\n\n <StrandsUiInput\n id=\"lastName\"\n v-model=\"form.lastName\"\n type=\"text\"\n label=\"Last name\"\n placeholder=\"Enter your last name\"\n autocomplete=\"family-name\"\n :disabled=\"loading || fetchingProfile\"\n :error=\"errors.lastName\"\n />\n\n <!-- Email Change Section -->\n <div class=\"profile-setting-card\">\n <div class=\"profile-setting-header\">\n <div>\n <h4 class=\"profile-setting-title\">Email Address</h4>\n <p class=\"profile-setting-subtitle\">{{ currentUser?.email }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showEmailChange = !showEmailChange\"\n >\n {{ showEmailChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showEmailChange\" class=\"profile-change-form\">\n <StrandsUiInput\n v-model=\"emailChangeForm.newEmail\"\n type=\"email\"\n placeholder=\"New email address\"\n autocomplete=\"email\"\n :error=\"emailChangeForm.errors.newEmail\"\n />\n <StrandsUiInput\n v-model=\"emailChangeForm.password\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n :error=\"emailChangeForm.errors.password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleEmailChange\"\n :disabled=\"!isEmailChangeFormValid || emailChangeLoading\"\n >\n {{ emailChangeLoading ? 'Updating...' : 'Update Email' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Username Change Section -->\n <div class=\"profile-field-section\">\n <div class=\"profile-field-header\">\n <div>\n <h4 class=\"profile-field-title\">Username</h4>\n <p class=\"profile-field-subtitle\">\n {{ currentUser?.username || 'No username set' }}\n </p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n :disabled=\"!usernameChangeData.canChange || usernameChangeLoading\"\n @click=\"handleToggleUsernameChange\"\n >\n {{\n usernameChangeData.cooldownEnd\n ? `Wait ${usernameChangeData.daysRemaining} day${usernameChangeData.daysRemaining === 1 ? '' : 's'}`\n : showUsernameChange\n ? 'Cancel'\n : (currentUser?.username\n ? 'Change'\n : 'Set Username')\n }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showUsernameChange\" class=\"profile-change-form\">\n <StrandsUiInput\n v-model=\"usernameForm.username\"\n type=\"text\"\n placeholder=\"Enter username (3-30 characters)\"\n autocomplete=\"username\"\n :error=\"usernameForm.errors.username\"\n />\n <div v-if=\"usernameAvailability.message\" class=\"profile-availability-message\" :class=\"usernameAvailability.available ? 'success' : 'error'\">\n {{ usernameAvailability.message }}\n </div>\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handleUsernameChange\"\n :disabled=\"!isUsernameChangeFormValid || usernameChangeLoading\"\n >\n {{ usernameChangeLoading ? 'Updating...' : 'Update Username' }}\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n </div>\n\n <!-- Security Settings -->\n <div class=\"profile-password-section\">\n <h3 class=\"profile-section-title\">Security Settings</h3>\n \n <!-- Password Change -->\n <div class=\"profile-field-section\">\n <div class=\"profile-field-header\">\n <div>\n <h4 class=\"profile-field-title\">Password</h4>\n <p class=\"profile-field-subtitle\">Last updated {{ passwordLastUpdated }}</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"showPasswordChange = !showPasswordChange\"\n >\n {{ showPasswordChange ? 'Cancel' : 'Change' }}\n </StrandsUiButton>\n </div>\n\n <Transition name=\"expand\">\n <div v-if=\"showPasswordChange\" class=\"profile-change-form\">\n <StrandsUiInput\n v-model=\"passwordForm.current\"\n type=\"password\"\n placeholder=\"Current password\"\n autocomplete=\"current-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.new\"\n type=\"password\"\n placeholder=\"New password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiInput\n v-model=\"passwordForm.confirm\"\n type=\"password\"\n placeholder=\"Confirm new password\"\n autocomplete=\"new-password\"\n />\n <StrandsUiButton\n variant=\"primary\"\n size=\"sm\"\n @click=\"handlePasswordChange\"\n :disabled=\"!isPasswordFormValid\"\n >\n Update Password\n </StrandsUiButton>\n </div>\n </Transition>\n </div>\n\n <!-- Two-Factor Authentication -->\n <div class=\"profile-field-section\">\n <div class=\"profile-field-header profile-field-header-vertical\">\n <div class=\"profile-mfa-content\">\n <div>\n <h4 class=\"profile-field-title\">Two-Factor Authentication</h4>\n <p class=\"profile-field-subtitle\">\n {{ currentUser?.mfaEnabled ? 'Enabled' : 'Add extra security to your account' }}\n </p>\n </div>\n \n <!-- Device Type Chips -->\n <div v-if=\"mfaDeviceChips.length > 0\" class=\"profile-mfa-chips\">\n <div\n v-for=\"chip in mfaDeviceChips\"\n :key=\"chip.type\"\n :class=\"[\n 'mfa-device-chip',\n chip.color\n ]\"\n >\n <component :is=\"chip.icon\" :size=\"12\" />\n <span>{{ chip.count }}</span>\n <span>{{ chip.label }}</span>\n </div>\n </div>\n </div>\n <StrandsUiButton\n :variant=\"currentUser?.mfaEnabled ? 'secondary' : 'primary'\"\n size=\"sm\"\n @click=\"showMfaModal = true\"\n class=\"profile-toggle-container\"\n >\n {{ currentUser?.mfaEnabled ? 'Manage' : 'Setup' }}\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Active Sessions -->\n <div class=\"profile-field-section\">\n <div class=\"profile-field-header\">\n <div>\n <h4 class=\"profile-field-title\">Active Sessions</h4>\n <p class=\"profile-field-subtitle\">{{ activeSessions.length }} active device(s)</p>\n </div>\n <StrandsUiButton\n variant=\"secondary\"\n size=\"sm\"\n @click=\"$emit('manage-sessions')\"\n disabled\n >\n Coming Soon\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Action Buttons - Only show when changes are made -->\n <div v-if=\"hasChanges\" class=\"profile-actions-section\">\n <StrandsUiButton\n type=\"submit\"\n variant=\"primary\"\n :disabled=\"loading\"\n :loading=\"loading\"\n >\n {{ loading ? 'Saving changes...' : 'Save changes' }}\n </StrandsUiButton>\n\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"handleCancel\"\n :disabled=\"loading\"\n >\n Cancel\n </StrandsUiButton>\n </div>\n </form>\n\n <!-- Success/Error Messages -->\n <div v-if=\"successMessage\" class=\"animate-fade-in\">\n <div class=\"alert-success\">\n <div class=\"profile-help-item\">\n <svg class=\"profile-help-icon\" 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=\"profile-alert-message\">{{ successMessage }}</p>\n </div>\n </div>\n </div>\n\n <div v-if=\"errorMessage\" class=\"animate-fade-in\">\n <div class=\"alert-error\">\n <div class=\"profile-help-item\">\n <svg class=\"profile-help-icon\" 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=\"profile-alert-message\">{{ errorMessage }}</p>\n </div>\n </div>\n </div>\n\n \n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <div class=\"profile-footer-actions\">\n <!-- Sign Out button -->\n <StrandsUiButton\n color=\"red\"\n @click=\"handleSignOut\"\n :disabled=\"signingOut\"\nclass=\"profile-sign-out-button\"\n >\n {{ signingOut ? 'Signing out...' : 'Sign Out' }}\n </StrandsUiButton>\n\n <!-- Settings button -->\n <StrandsUiButton\n variant=\"secondary\"\n @click=\"showSettingsModal = true\"\nclass=\"profile-sign-out-button\"\n >\n <svg class=\"profile-action-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" />\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 </svg>\n </StrandsUiButton>\n </div>\n\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\">\n <p class=\"profile-footer-text\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </div>\n\n <!-- MFA Management Modal -->\n <StrandsMfaModal\n :show=\"showMfaModal\"\n @close=\"showMfaModal = false\"\n @mfa-updated=\"handleMfaUpdated\"\n />\n\n <!-- Settings Modal -->\n <StrandsSettingsModal\n v-if=\"showSettingsModal\"\n @close=\"showSettingsModal = false\"\n @settings-updated=\"handleSettingsUpdated\"\n />\n\n <!-- Avatar Editor Modal -->\n <div v-if=\"showAvatarEditor\" class=\"profile-avatar-modal-overlay\">\n <div class=\"profile-avatar-modal\">\n <div class=\"profile-avatar-modal-content\">\n <div class=\"profile-avatar-modal-header\">\n <h2 class=\"profile-modal-title\">Edit Avatar</h2>\n <button\n @click=\"handleAvatarEditorClose\"\n class=\"profile-avatar-modal-close\"\n >\n <svg class=\"profile-avatar-modal-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n \n <StrandsUiAvatarEditor\n :uploading=\"uploading\"\n :preselected-file=\"selectedImageFile\"\n @upload=\"handleAvatarUpload\"\n @error=\"handleAvatarError\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, watch } from 'vue'\nimport { StrandsUiButton, StrandsUiInput, StrandsUiLink, StrandsUiLoader, StrandsUiLevelProgress } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport StrandsMfaModal from './StrandsMfaModal.vue'\nimport StrandsSettingsModal from './StrandsSettingsModal.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n// Inline SVG icon components replacing lucide-vue-next\nconst Smartphone = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>`, props: ['size'] }\nconst Mail = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m4 4 16 0c1.1 0 2 .9 2 2l0 12c0 1.1-.9 2-2 2l-16 0c-1.1 0-2-.9-2-2l0-12c0-1.1.9-2 2-2z\"/><polyline points=\"22,6 12,13 2,6\"/></svg>`, props: ['size'] }\nconst KeyRound = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/></svg>`, props: ['size'] }\nimport type { User } from '../../types'\n\ninterface Props {\n user?: User\n config?: StrandsAuthConfig\n autoFetch?: boolean // Whether to automatically fetch user profile on mount\n inModal?: boolean // Whether the component is being displayed inside a modal\n}\n\ninterface Emits {\n (e: 'profile-updated', user: User): void\n (e: 'error', error: string): void\n (e: 'manage-sessions'): void\n (e: 'mfa-toggle', enabled: boolean): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n autoFetch: true,\n inModal: false\n})\nconst emit = defineEmits<Emits>()\n\n// Get configuration and authentication \nconst { getSupportEmail, getUrl } = useStrandsConfig(props.config)\nconst { fetchProfile, updateProfile, changeEmail, changeUsername, getUsernameCooldown, checkUsernameAvailability, currentUser: authUser, currentSession, isAuthenticated, refreshToken, signOut } = useStrandsAuth()\nconst { activeMfaDevices, fetchMfaDevices } = useStrandsMfa()\n\n// Internal user state\nconst internalUser = ref<User | null>(null)\nconst fetchingProfile = ref(false)\n\n// Use authenticated user from composable, fallback to prop, then internal state\nconst currentUser = computed(() => {\n const user = authUser.value || props.user || internalUser.value\n console.log('Current user computed:', {\n hasAuthUser: !!authUser.value,\n hasPropUser: !!props.user,\n hasInternalUser: !!internalUser.value,\n selectedUser: user,\n avatar: user?.avatar\n })\n return user\n})\n\nconst loading = ref(false)\nconst uploading = ref(false)\nconst signingOut = ref(false)\nconst showPasswordChange = ref(false)\nconst showEmailChange = ref(false)\nconst emailChangeLoading = ref(false)\nconst showUsernameChange = ref(false)\nconst usernameChangeLoading = ref(false)\nconst showMfaModal = ref(false)\nconst showSettingsModal = ref(false)\nconst showAvatarEditor = ref(false)\nconst selectedImageFile = ref<File | null>(null)\nconst successMessage = ref('')\nconst errorMessage = ref('')\nconst activeSessions = ref([])\n\n// Username change state\nconst usernameChangeData = reactive({\n canChange: true,\n cooldownEnd: null as Date | null,\n daysRemaining: 0\n})\n\nconst usernameAvailability = reactive({\n available: false,\n message: '',\n checking: false\n})\n\n// Temporary total XP state for testing (accumulates infinitely)\n\n// Refs\nconst avatarFileInput = ref<HTMLInputElement>()\n\nconst form = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst emailChangeForm = reactive({\n newEmail: '',\n password: '',\n errors: {\n newEmail: '',\n password: ''\n }\n})\n\nconst passwordForm = reactive({\n current: '',\n new: '',\n confirm: ''\n})\n\nconst usernameForm = reactive({\n username: '',\n errors: {\n username: ''\n }\n})\n\nconst errors = reactive({\n firstName: '',\n lastName: '',\n email: ''\n})\n\nconst hasChanges = computed(() => {\n const user = currentUser.value\n if (!user) return false\n return (\n form.firstName !== (user.firstName || '') ||\n form.lastName !== (user.lastName || '')\n )\n})\n\nconst isPasswordFormValid = computed(() => {\n return (\n passwordForm.current &&\n passwordForm.new &&\n passwordForm.confirm &&\n passwordForm.new === passwordForm.confirm &&\n passwordForm.new.length >= 8\n )\n})\n\nconst isEmailChangeFormValid = computed(() => {\n return (\n emailChangeForm.newEmail &&\n emailChangeForm.password &&\n emailChangeForm.newEmail !== currentUser.value?.email &&\n emailChangeForm.newEmail.includes('@')\n )\n})\n\nconst isUsernameChangeFormValid = computed(() => {\n const usernameRegex = /^[a-zA-Z0-9_-]{3,30}$/\n return (\n usernameForm.username &&\n usernameRegex.test(usernameForm.username) &&\n usernameForm.username !== currentUser.value?.username &&\n !usernameAvailability.checking\n )\n})\n\nconst passwordLastUpdated = computed(() => {\n const user = currentUser.value\n if (!user) return 'Never'\n \n // Use passwordUpdatedAt if available, otherwise fall back to createdAt\n const updateDate = user.passwordUpdatedAt || user.createdAt\n if (!updateDate) return 'Never'\n \n const date = new Date(updateDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n \n if (diffDays === 0) return 'Today'\n if (diffDays === 1) return 'Yesterday'\n if (diffDays < 30) return `${diffDays} days ago`\n if (diffDays < 365) {\n const months = Math.floor(diffDays / 30)\n return months === 1 ? '1 month ago' : `${months} months ago`\n }\n const years = Math.floor(diffDays / 365)\n return years === 1 ? '1 year ago' : `${years} years ago`\n})\n\nconst deviceTypeCounts = computed(() => {\n const devices = activeMfaDevices.value || []\n const counts = {\n totp: 0,\n email: 0,\n hardware: 0,\n passkey: 0\n }\n \n devices.forEach(device => {\n if (device.device_type in counts) {\n counts[device.device_type as keyof typeof counts]++\n }\n })\n \n return counts\n})\n\nconst mfaDeviceChips = computed(() => {\n const chips = []\n const counts = deviceTypeCounts.value\n \n if (counts.totp > 0) {\n chips.push({\n type: 'totp',\n count: counts.totp,\n label: counts.totp === 1 ? 'Auth app' : 'Auth apps',\n icon: Smartphone,\n color: 'bg-blue-50 text-blue-700 border-blue-200'\n })\n }\n \n if (counts.email > 0) {\n chips.push({\n type: 'email',\n count: counts.email,\n label: 'Email',\n icon: Mail,\n color: 'bg-green-50 text-green-700 border-green-200'\n })\n }\n \n if (counts.hardware > 0 || counts.passkey > 0) {\n const totalHardware = counts.hardware + counts.passkey\n chips.push({\n type: 'hardware',\n count: totalHardware,\n label: totalHardware === 1 ? 'Key' : 'Keys',\n icon: KeyRound,\n color: 'bg-purple-50 text-purple-700 border-purple-200'\n })\n }\n \n return chips\n})\n\n// Calculate XP required for a specific level using the provided formula\nconst getXpForLevel = (level: number): number => {\n if (level <= 1) return 0\n \n let totalXp = 0\n for (let i = 1; i < level; i++) {\n // Formula: xp = 4 * i + Math.pow(1.5, i / 4) + xp\n // This accumulates XP required for each level\n totalXp += 4 * i + Math.pow(1.5, i / 4)\n }\n return Math.floor(totalXp)\n}\n\n// Calculate level from total XP\nconst getLevelFromXp = (totalXp: number): number => {\n let level = 1\n let cumulativeXp = 0\n \n // Keep incrementing level while totalXp is greater than required\n while (true) {\n const xpForNextLevel = getXpForLevel(level + 1)\n if (totalXp < xpForNextLevel) {\n break\n }\n level++\n // Safety check to prevent infinite loops\n if (level > 1000) break\n }\n \n return level\n}\n\n// Leveling system computed properties\nconst userLevel = computed(() => {\n return getLevelFromXp(currentUser.value?.xp || 0)\n})\n\nconst currentExp = computed(() => {\n const level = userLevel.value\n const xpForCurrentLevel = getXpForLevel(level)\n // Current XP within the level (progress toward next level)\n return (currentUser.value?.xp || 0) - xpForCurrentLevel\n})\n\nconst expToNextLevel = computed(() => {\n const level = userLevel.value\n const xpForCurrentLevel = getXpForLevel(level)\n const xpForNextLevel = getXpForLevel(level + 1)\n // XP needed to complete this level\n return xpForNextLevel - xpForCurrentLevel\n})\n\nconst progressPercentage = computed(() => {\n return Math.round((currentExp.value / expToNextLevel.value) * 100)\n})\n\nconst totalCircumference = computed(() => {\n const radius = 54\n return 2 * Math.PI * radius\n})\n\nconst progressLength = computed(() => {\n const progress = progressPercentage.value / 100\n return progress * totalCircumference.value\n})\n\nconst progressGapLength = computed(() => {\n // Create visible gap between progress and remaining background\n const smallGap = (totalCircumference.value * 5) / 360 // 5 degree gap\n const remaining = totalCircumference.value - progressLength.value - smallGap\n return remaining\n})\n\nconst getInitials = (firstName?: string, lastName?: string) => {\n if (!firstName && !lastName) return 'U'\n return `${firstName?.[0] || ''}${lastName?.[0] || ''}`.toUpperCase()\n}\n\n// Fetch user profile from API\nconst fetchUserProfile = async () => {\n if (!props.autoFetch || props.user || !isAuthenticated.value) return // Skip if disabled, user prop provided, or not authenticated\n \n fetchingProfile.value = true\n try {\n await fetchProfile()\n // Also fetch MFA devices when profile is loaded\n if (isAuthenticated.value) {\n await fetchMfaDevices()\n }\n // The fetchProfile from composable will update authUser, so currentUser computed will reflect the change\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Failed to load profile'\n errorMessage.value = errorMsg\n emit('error', errorMsg)\n } finally {\n fetchingProfile.value = false\n }\n}\n\n// Initialize form with user data\nwatch(() => currentUser.value, (user) => {\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email // Keep for display but not for editing\n }\n}, { immediate: true })\n\n// Fetch profile on mount if needed\nonMounted(() => {\n fetchUserProfile()\n})\n\nconst clearMessages = () => {\n successMessage.value = ''\n errorMessage.value = ''\n Object.keys(errors).forEach(key => {\n errors[key as keyof typeof errors] = ''\n })\n}\n\nconst handleUpdateProfile = async () => {\n clearMessages()\n loading.value = true\n\n try {\n const updatedUser = await updateProfile({\n firstName: form.firstName,\n lastName: form.lastName,\n })\n \n if (updatedUser) {\n successMessage.value = 'Profile updated successfully'\n emit('profile-updated', updatedUser)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update profile'\n errorMessage.value = error\n emit('error', error)\n } finally {\n loading.value = false\n }\n}\n\nconst handlePasswordChange = async () => {\n if (!isPasswordFormValid.value) return\n\n clearMessages()\n loading.value = true\n\n try {\n // Integration point: Replace with actual password change call\n // Example: await authSDK.changePassword(passwordForm.current, passwordForm.new)\n \n // Simulate API call for demo\n await new Promise(resolve => setTimeout(resolve, 1000))\n \n successMessage.value = 'Password updated successfully'\n showPasswordChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n } catch (err) {\n errorMessage.value = 'Failed to update password'\n } finally {\n loading.value = false\n }\n}\n\nconst handleEmailChange = async () => {\n if (!isEmailChangeFormValid.value) return\n\n // Clear previous errors\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n clearMessages()\n emailChangeLoading.value = true\n\n try {\n const result = await changeEmail(emailChangeForm.newEmail, emailChangeForm.password)\n \n successMessage.value = result.message || 'Email updated successfully. Please verify your new email address.'\n showEmailChange.value = false\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update email'\n \n // Try to parse specific field errors\n if (error.includes('password')) {\n emailChangeForm.errors.password = 'Invalid password'\n } else if (error.includes('email')) {\n emailChangeForm.errors.newEmail = error\n } else {\n errorMessage.value = error\n }\n \n emit('error', error)\n } finally {\n emailChangeLoading.value = false\n }\n}\n\nconst handleToggleUsernameChange = async () => {\n if (!showUsernameChange.value) {\n // When opening, check cooldown status\n usernameChangeLoading.value = true\n try {\n const cooldownData = await getUsernameCooldown()\n usernameChangeData.canChange = cooldownData.can_change\n usernameChangeData.cooldownEnd = cooldownData.cooldown_end ? new Date(cooldownData.cooldown_end) : null\n usernameChangeData.daysRemaining = cooldownData.days_remaining || 0\n \n if (usernameChangeData.canChange) {\n showUsernameChange.value = true\n usernameForm.username = currentUser.value?.username || ''\n } else {\n errorMessage.value = `You can change your username again in ${usernameChangeData.daysRemaining} days`\n }\n } catch (err) {\n errorMessage.value = 'Failed to check username cooldown'\n showUsernameChange.value = true // Allow opening anyway\n } finally {\n usernameChangeLoading.value = false\n }\n } else {\n // When closing, reset form\n showUsernameChange.value = false\n usernameForm.username = ''\n usernameForm.errors.username = ''\n usernameAvailability.available = false\n usernameAvailability.message = ''\n }\n}\n\nconst handleUsernameChange = async () => {\n if (!isUsernameChangeFormValid.value) {\n // First check if username is valid format\n const usernameRegex = /^[a-zA-Z0-9_-]{3,30}$/\n if (!usernameRegex.test(usernameForm.username)) {\n usernameForm.errors.username = 'Username must be 3-30 characters and contain only letters, numbers, hyphens, and underscores'\n return\n }\n \n // Check availability before attempting to update\n usernameAvailability.checking = true\n usernameAvailability.message = 'Checking availability...'\n \n try {\n const result = await checkUsernameAvailability(usernameForm.username)\n usernameAvailability.available = result.available\n usernameAvailability.message = result.message\n \n if (!result.available) {\n usernameForm.errors.username = 'Username is not available'\n return\n }\n } catch (err) {\n usernameForm.errors.username = 'Failed to check username availability'\n return\n } finally {\n usernameAvailability.checking = false\n }\n }\n\n clearMessages()\n usernameChangeLoading.value = true\n\n try {\n const result = await changeUsername(usernameForm.username)\n \n successMessage.value = result.message || 'Username updated successfully'\n showUsernameChange.value = false\n usernameForm.username = ''\n usernameForm.errors.username = ''\n usernameAvailability.available = false\n usernameAvailability.message = ''\n \n // Emit profile updated event\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to update username'\n \n if (error.includes('taken')) {\n usernameForm.errors.username = 'Username is already taken'\n } else if (error.includes('cooldown') || error.includes('30 days')) {\n errorMessage.value = error\n showUsernameChange.value = false\n } else {\n usernameForm.errors.username = error\n }\n \n emit('error', error)\n } finally {\n usernameChangeLoading.value = false\n }\n}\n\nconst triggerAvatarUpload = () => {\n if (uploading.value) return\n avatarFileInput.value?.click()\n}\n\nconst handleAvatarFileSelect = (event: Event) => {\n const target = event.target as HTMLInputElement\n const file = target.files?.[0]\n if (file) {\n // Validate file\n if (!file.type.startsWith('image/')) {\n errorMessage.value = 'Please select an image file'\n return\n }\n \n if (file.size > 5 * 1024 * 1024) { // 5MB limit\n errorMessage.value = 'File size must be less than 5MB'\n return\n }\n \n // Store the selected file and open editor\n selectedImageFile.value = file\n showAvatarEditor.value = true\n }\n \n // Reset the input\n if (target) {\n target.value = ''\n }\n}\n\nconst handleAvatarUpload = async (file: File) => {\n await uploadAvatar(file)\n showAvatarEditor.value = false\n selectedImageFile.value = null\n}\n\nconst handleAvatarError = (error: string) => {\n errorMessage.value = error\n}\n\nconst handleAvatarEditorClose = () => {\n showAvatarEditor.value = false\n selectedImageFile.value = null\n}\n\nconst uploadAvatar = async (file: File) => {\n uploading.value = true\n clearMessages()\n \n try {\n // Check if we have an access token\n if (!currentSession.value?.accessToken) {\n throw new Error('No access token available. Please sign in again.')\n }\n \n // Create form data\n const formData = new FormData()\n formData.append('avatar', file)\n \n // Upload to API endpoint\n const response = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!response.ok) {\n // Handle authentication errors\n if (response.status === 401) {\n // Try to refresh token and retry once\n try {\n console.log('Access token expired, attempting to refresh...')\n const refreshed = await refreshToken()\n if (refreshed && currentSession.value?.accessToken) {\n console.log('Token refreshed successfully, retrying avatar upload...')\n // Retry the upload with new token\n const retryResponse = await fetch(getUrl('avatar'), {\n method: 'POST',\n body: formData,\n headers: {\n 'Authorization': `Bearer ${currentSession.value.accessToken}`\n }\n })\n \n if (!retryResponse.ok) {\n const errorData = await retryResponse.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${retryResponse.status} ${retryResponse.statusText}`)\n }\n \n // Use the retry response for processing\n const retryResult = await retryResponse.json()\n console.log('Avatar upload retry success:', retryResult)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', retryResult.avatar_url)\n authUser.value.avatar = retryResult.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = retryResult.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload retry')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload retry:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n return\n } else {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } catch (refreshError) {\n throw new Error('Authentication expired. Please sign in again.')\n }\n } else {\n const errorData = await response.json().catch(() => ({}))\n throw new Error(errorData.message || `Upload failed: ${response.status} ${response.statusText}`)\n }\n }\n \n const result = await response.json()\n console.log('Avatar upload success:', result)\n \n // Update user avatar in the current user state\n if (authUser.value) {\n console.log('Updating authUser avatar from:', authUser.value.avatar, 'to:', result.avatar_url)\n authUser.value.avatar = result.avatar_url\n \n // Also update localStorage\n if (typeof window !== 'undefined') {\n localStorage.setItem('strands_auth_user', JSON.stringify(authUser.value))\n }\n }\n \n // Also update internal user state if present\n if (internalUser.value) {\n internalUser.value.avatar = result.avatar_url\n }\n \n // Refresh user profile from API to ensure we have the latest data\n try {\n await fetchProfile()\n console.log('Profile refreshed after avatar upload')\n } catch (refreshError) {\n console.warn('Failed to refresh profile after avatar upload:', refreshError)\n }\n \n successMessage.value = 'Avatar updated successfully'\n \n // Emit with current user data\n if (currentUser.value) {\n emit('profile-updated', currentUser.value)\n }\n \n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to upload avatar'\n errorMessage.value = error\n emit('error', error)\n } finally {\n uploading.value = false\n }\n}\n\nconst handleMfaUpdated = async () => {\n // Refresh the user profile and MFA devices to get updated status\n try {\n await fetchProfile()\n await fetchMfaDevices()\n successMessage.value = 'MFA settings updated successfully'\n emit('mfa-toggle', currentUser.value?.mfaEnabled || false)\n } catch (err) {\n console.error('Failed to refresh profile after MFA update:', err)\n }\n}\n\nconst handleSettingsUpdated = (settings: any) => {\n successMessage.value = 'Settings updated successfully'\n // Settings are automatically updated in the auth composable\n // The modal already handles the API call and state updates\n}\n\nconst handleCancel = () => {\n const user = currentUser.value\n if (user) {\n form.firstName = user.firstName || ''\n form.lastName = user.lastName || ''\n form.email = user.email\n }\n clearMessages()\n showPasswordChange.value = false\n showEmailChange.value = false\n passwordForm.current = ''\n passwordForm.new = ''\n passwordForm.confirm = ''\n emailChangeForm.newEmail = ''\n emailChangeForm.password = ''\n emailChangeForm.errors.newEmail = ''\n emailChangeForm.errors.password = ''\n}\n\nconst handleSignOut = async () => {\n signingOut.value = true\n clearMessages()\n \n try {\n await signOut()\n // The signOut function from useStrandsAuth will handle navigation and token clearing\n successMessage.value = 'Signed out successfully'\n } catch (err) {\n const error = err instanceof Error ? err.message : 'Failed to sign out'\n errorMessage.value = error\n emit('error', error)\n signingOut.value = false\n }\n}\n\n// Initialize username cooldown data when component mounts\nonMounted(async () => {\n if (currentUser.value && isAuthenticated.value) {\n try {\n const cooldownData = await getUsernameCooldown()\n usernameChangeData.canChange = cooldownData.can_change\n usernameChangeData.cooldownEnd = cooldownData.cooldown_end ? new Date(cooldownData.cooldown_end) : null\n usernameChangeData.daysRemaining = cooldownData.days_remaining || 0\n } catch (err) {\n console.error('Failed to fetch username cooldown:', err)\n }\n }\n})\n\n</script>\n\n<style scoped>\n/* Container Styles */\n.profile-container-width {\n width: 100%;\n}\n\n.profile-max-width {\n max-width: 56rem;\n}\n\n.profile-centered {\n margin: 0 auto;\n}\n\n.profile-animated {\n animation: slideUp 0.3s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.profile-content-layout {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.profile-card-modern {\n background: #ffffff;\n border: 1px solid #e5e7eb;\n border-radius: 1rem;\n padding: 2rem;\n box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);\n}\n\n/* Modal-specific styles */\n.profile-container-modal {\n /* Remove any container-specific styles when in modal */\n}\n\n.profile-content-modal {\n /* Remove card styling when in modal */\n background: transparent;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n}\n\n/* Header */\n.profile-header {\n text-align: center;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.profile-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #EA00A8;\n}\n\n.profile-subtitle {\n color: #4b5563;\n font-size: 0.875rem;\n}\n\n/* Profile Image Section */\n.profile-image-section {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.profile-image-container {\n position: relative;\n}\n\n.profile-image-wrapper {\n position: relative;\n display: inline-block;\n}\n\n.profile-image-wrapper:hover .profile-upload-overlay {\n opacity: 1;\n}\n\n.profile-progress-ring {\n position: absolute;\n z-index: 10;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n\n.profile-avatar {\n width: 6rem;\n height: 6rem;\n border-radius: 50%;\n position: relative;\n}\n\n.profile-avatar-with-image {\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n}\n\n.profile-avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.profile-avatar-initials {\n background-color: #EA00A8;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n font-size: 1.5rem;\n font-weight: 700;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);\n z-index: 10;\n}\n\n.profile-upload-overlay {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s ease;\n z-index: 20;\n border: none;\n cursor: pointer;\n}\n\n.profile-upload-overlay:disabled {\n cursor: not-allowed;\n}\n\n.profile-upload-icon {\n width: 1.5rem;\n height: 1.5rem;\n color: white;\n}\n\n.profile-file-input {\n display: none;\n}\n\n/* Profile Form */\n.profile-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.profile-form-grid {\n display: grid;\n grid-template-columns: 1fr;\n gap: 1rem;\n}\n\n@media (min-width: 768px) {\n .profile-form {\n gap: 1.5rem;\n }\n \n .profile-form-grid {\n grid-template-columns: 1fr 1fr;\n gap: 1.5rem;\n }\n \n .profile-title {\n font-size: 1.875rem;\n }\n \n .profile-subtitle {\n font-size: 1rem;\n }\n}\n\n/* Section Styles */\n.profile-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n@media (min-width: 768px) {\n .profile-section {\n gap: 1rem;\n }\n}\n\n.profile-section-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n}\n\n/* Setting Cards */\n.profile-setting-card {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n background-color: #f9fafb;\n border-radius: 0.75rem;\n}\n\n.profile-setting-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n}\n\n.profile-setting-title {\n font-weight: 500;\n color: #111827;\n}\n\n.profile-setting-subtitle {\n font-size: 0.875rem;\n color: #4b5563;\n}\n\n/* Transitions */\n.expand-enter-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-leave-active {\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.expand-enter-from {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-leave-to {\n max-height: 0;\n opacity: 0;\n transform: translateY(-10px);\n}\n\n.expand-enter-to,\n.expand-leave-from {\n max-height: 300px;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* MFA Device Chip */\n.mfa-device-chip {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n border-radius: 0.5rem;\n font-size: 0.75rem;\n font-weight: 500;\n border: 1px solid;\n transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;\n}\n\n\n/* New semantic classes for Tailwind conversion */\n.profile-change-form {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n overflow: hidden;\n}\n\n.profile-field-section {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n padding: 1rem;\n background-color: #f9fafb;\n border-radius: 0.75rem;\n}\n\n.profile-field-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n}\n\n.profile-field-header-vertical {\n align-items: flex-start;\n gap: 1rem;\n}\n\n.profile-password-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n@media (min-width: 768px) {\n .profile-password-section {\n gap: 1rem;\n }\n}\n\n.profile-mfa-content {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.profile-mfa-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n}\n\n.profile-actions-section {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding-top: 1.5rem;\n border-top: 1px solid #e5e7eb;\n animation: slideUp 0.3s ease-out;\n}\n\n@media (min-width: 640px) {\n .profile-actions-section {\n flex-direction: row;\n }\n}\n\n.profile-help-item {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.profile-help-icon {\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n\n.profile-footer-actions {\n display: flex;\n gap: 1rem;\n align-items: stretch;\n}\n\n.profile-action-icon {\n width: 1rem;\n height: 1rem;\n}\n\n.profile-footer-text {\n color: #9ca3af;\n font-size: 0.875rem;\n}\n\n/* Avatar Editor Modal */\n.profile-avatar-modal-overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 50;\n padding: 1rem;\n}\n\n.profile-avatar-modal {\n background-color: #ffffff;\n border-radius: 0.75rem;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n max-width: 56rem;\n width: 100%;\n max-height: 90vh;\n overflow-y: auto;\n}\n\n.profile-avatar-modal-content {\n padding: 1.5rem;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n\n.profile-avatar-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.profile-avatar-modal-close {\n color: #9ca3af;\n transition: color 0.2s ease;\n background: none;\n border: none;\n cursor: pointer;\n padding: 0.25rem;\n border-radius: 0.25rem;\n}\n\n.profile-avatar-modal-close:hover {\n color: #4b5563;\n}\n\n.profile-avatar-modal-close-icon {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n/* Profile field styles */\n.profile-field-title {\n font-weight: 500;\n color: #111827;\n}\n\n.profile-field-subtitle {\n font-size: 0.875rem;\n color: #6b7280;\n}\n\n.profile-availability-message {\n font-size: 0.75rem;\n}\n\n.profile-availability-message.success {\n color: #16a34a;\n}\n\n.profile-availability-message.error {\n color: #dc2626;\n}\n\n.profile-toggle-container {\n flex-shrink: 0;\n}\n\n.profile-alert-message {\n font-weight: 500;\n}\n\n.profile-modal-title {\n font-size: 1.25rem;\n font-weight: 700;\n color: #111827;\n}\n\n/* Sign out button styles */\n.profile-sign-out-button {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .profile-sign-out-button {\n width: auto;\n }\n}\n</style>\n\n","<template>\n <div class=\"accui-component-scope\">\n <div class=\"accui-w-full accui-min-w-100 accui-max-w-md accui-mx-auto accui-animate-slide-up\">\n <StrandsUiCard variant=\"modern\">\n <!-- Header -->\n <div class=\"accui-text-center accui-mb-8\">\n <h1 class=\"accui-text-3xl accui-font-bold accui-text-gradient accui-mb-2\">Reset password</h1>\n <p class=\"accui-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=\"accui-space-y-6\">\n <StrandsUiInput id=\"email\" v-model=\"form.email\" type=\"email\" label=\"Email address\"\n placeholder=\"Enter your email address\" autocomplete=\"email\" required :disabled=\"loading || isSubmitted\"\n :error=\"error ? 'Email address not found' : undefined\" />\n\n <StrandsUiButton type=\"submit\" variant=\"primary\" full-width :disabled=\"loading || !form.email.trim() || isSubmitted\"\n :loading=\"loading\" :loading-text=\"'Sending link...'\">\n {{ isSubmitted ? 'Link sent!' : 'Send reset link' }}\n </StrandsUiButton>\n </form>\n\n <!-- Success Message -->\n <StrandsUiAlert v-if=\"isSubmitted\" variant=\"success\"\n :message=\"`Check your email - We've sent a password reset link to ${form.email}`\"\n class=\"accui-mt-6 accui-animate-fade-in\" />\n\n <!-- Error Message -->\n <StrandsUiAlert v-if=\"error\" variant=\"error\" :message=\"error\" class=\"accui-mt-6 accui-animate-fade-in\" dismissible\n @dismiss=\"error = ''\" />\n\n <!-- Back to Sign In -->\n <div class=\"accui-mt-8 accui-text-center\">\n <StrandsUiLink @click=\"$emit('back-to-signin')\" class=\"accui-inline-flex accui-items-center accui-gap-2\">\n <svg class=\"accui-w-4 accui-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 19l-7-7 7-7\" />\n </svg>\n Back to sign in\n </StrandsUiLink>\n </div>\n\n <!-- Secured by footer -->\n <StrandsSecuredFooter :config=\"props.config\">\n <!-- Need help -->\n <div v-if=\"getSupportEmail()\" class=\"accui-mt-6 accui-text-center\">\n <p class=\"accui-text-neutral-400 accui-text-sm\">\n Need help?\n <StrandsUiLink variant=\"primary\" :href=\"`mailto:${getSupportEmail()}`\">\n Contact Support\n </StrandsUiLink>\n </p>\n </div>\n </StrandsSecuredFooter>\n </StrandsUiCard>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive } from 'vue'\nimport { StrandsUiCard, StrandsUiButton, StrandsUiInput, StrandsUiAlert, StrandsUiLink } from '../ui'\nimport StrandsSecuredFooter from './StrandsSecuredFooter.vue'\nimport { useStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config?: StrandsAuthConfig\n}\n\ninterface Emits {\n (e: 'success', email: string): void\n (e: 'error', error: string): void\n (e: 'back-to-signin'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {})\nconst emit = defineEmits<Emits>()\n\n// Get configuration\nconst { getSupportEmail } = useStrandsConfig(props.config)\n\nconst loading = ref(false)\nconst error = ref('')\nconst isSubmitted = ref(false)\n\nconst form = reactive({\n email: ''\n})\n\nconst handlePasswordReset = async () => {\n loading.value = true\n error.value = ''\n\n try {\n // Integration point: Replace with actual password reset API call\n console.log('Password reset request:', { email: form.email })\n\n // Simulate API call\n await new Promise(resolve => setTimeout(resolve, 1000))\n\n isSubmitted.value = true\n emit('success', form.email)\n } catch (err) {\n error.value = 'Failed to send password reset email. Please try again.'\n emit('error', error.value)\n } finally {\n loading.value = false\n }\n}\n</script>\n\n<style scoped>\n/* Override accui- prefixed Tailwind classes with CSS properties */\n.accui-w-full {\n width: 100%;\n}\n\n.accui-min-w-100 {\n min-width: 25rem;\n}\n\n.accui-max-w-md {\n max-width: 28rem;\n}\n\n.accui-mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n.accui-animate-slide-up {\n animation: slideUp 0.3s ease-out;\n}\n\n.accui-text-center {\n text-align: center;\n}\n\n.accui-mb-8 {\n margin-bottom: 2rem;\n}\n\n.accui-text-3xl {\n font-size: 1.875rem;\n}\n\n.accui-font-bold {\n font-weight: 700;\n}\n\n.accui-text-gradient {\n background: linear-gradient(to right, var(--strands-500, #EA00A8), var(--strands-600, #db2777));\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n}\n\n.accui-mb-2 {\n margin-bottom: 0.5rem;\n}\n\n.accui-text-neutral-600 {\n color: var(--neutral-600, #525252);\n}\n\n.accui-space-y-6 > * + * {\n margin-top: 1.5rem;\n}\n\n.accui-mt-6 {\n margin-top: 1.5rem;\n}\n\n.accui-animate-fade-in {\n animation: fadeIn 0.2s ease-out;\n}\n\n.accui-mt-8 {\n margin-top: 2rem;\n}\n\n.accui-inline-flex {\n display: inline-flex;\n}\n\n.accui-items-center {\n align-items: center;\n}\n\n.accui-gap-2 {\n gap: 0.5rem;\n}\n\n.accui-w-4 {\n width: 1rem;\n}\n\n.accui-h-4 {\n height: 1rem;\n}\n\n.accui-text-neutral-400 {\n color: var(--neutral-400, #a3a3a3);\n}\n\n.accui-text-sm {\n font-size: 0.875rem;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\n <UiModal :open=\"show\" @close=\"closeModal\" card-class=\"mfa-setup-modal\">\n <template #header>\n <div class=\"mfa-setup-header\">\n <div>\n <h2 class=\"mfa-setup-title\">Two-Factor Authentication</h2>\n <p class=\"mfa-setup-subtitle\">Add extra security to your account</p>\n </div>\n <div class=\"mfa-setup-status-container\">\n <span class=\"mfa-setup-status-badge\"\n :class=\"mfaEnabled || activeMfaDevices.length > 0 ? 'mfa-setup-status-enabled' : 'mfa-setup-status-disabled'\">\n {{ mfaEnabled || activeMfaDevices.length > 0 ? 'Enabled' : 'Not Enabled' }}\n </span>\n </div>\n </div>\n </template>\n\n <div class=\"mfa-setup-content\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"mfa-setup-loading\">\n <StrandsUiLoader :size=\"32\" />\n <span class=\"mfa-setup-loading-text\">Loading MFA settings...</span>\n </div>\n\n <!-- MFA Options -->\n <div v-else class=\"mfa-setup-sections\">\n <!-- Current MFA Status -->\n <div v-if=\"mfaEnabled || activeMfaDevices.length > 0\" class=\"mfa-setup-status-alert\">\n <div class=\"mfa-setup-status-content\">\n <div class=\"mfa-setup-status-icon\">\n <Shield :size=\"20\" class=\"mfa-setup-shield-icon\" />\n </div>\n <div>\n <span class=\"mfa-setup-status-title\">2FA is currently enabled on your account</span>\n <p class=\"mfa-setup-status-description\">Your account has additional security protection</p>\n </div>\n </div>\n </div>\n\n <!-- Setup Options -->\n <div>\n <h3 class=\"mfa-setup-methods-title\">Choose Your Authentication Method</h3>\n <div class=\"mfa-setup-methods-grid\">\n <!-- TOTP Setup -->\n <div class=\"mfa-setup-method-card\" @click=\"startTotpSetup\">\n <div class=\"mfa-setup-method-content\">\n <div class=\"mfa-setup-method-icon mfa-setup-totp-icon\">\n <Smartphone :size=\"28\" class=\"mfa-setup-icon-svg\" />\n </div>\n <div class=\"mfa-setup-method-info\">\n <h4 class=\"mfa-setup-method-title\">Authenticator App</h4>\n <p class=\"mfa-setup-method-description\">Use Google Authenticator, Authy, or any TOTP-compatible app\n to\n generate secure codes</p>\n </div>\n <StrandsUiButton variant=\"primary\" size=\"md\" @click.stop=\"startTotpSetup\" :disabled=\"loading\"\n class=\"mfa-setup-method-button\">\n Setup Authenticator\n </StrandsUiButton>\n </div>\n </div>\n\n <!-- Email MFA Setup -->\n <div class=\"mfa-setup-method-card\" @click=\"startEmailMfaSetup\">\n <div class=\"mfa-setup-method-content\">\n <div class=\"mfa-setup-method-icon mfa-setup-email-icon\">\n <Mail :size=\"28\" class=\"mfa-setup-icon-svg\" />\n </div>\n <div class=\"mfa-setup-method-info\">\n <h4 class=\"mfa-setup-method-title\">Email Verification</h4>\n <p class=\"mfa-setup-method-description\">Receive verification codes directly in your email inbox for\n easy\n access</p>\n </div>\n <StrandsUiButton variant=\"primary\" size=\"md\" @click.stop=\"startEmailMfaSetup\" :disabled=\"loading\"\n class=\"mfa-setup-method-button\">\n Setup Email 2FA\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Manage Existing -->\n <div v-if=\"activeMfaDevices.length > 0\" class=\"mfa-setup-manage-section\">\n <div class=\"mfa-setup-manage-header\">\n <div>\n <h3 class=\"mfa-setup-manage-title\">Manage Existing Methods</h3>\n <p class=\"mfa-setup-manage-description\">{{ activeMfaDevices.length }} device(s) currently active</p>\n </div>\n <StrandsUiButton variant=\"secondary\" size=\"md\" @click=\"openMfaModal\" :disabled=\"loading\">\n <Settings :size=\"16\" class=\"mfa-setup-manage-icon\" />\n Manage Devices\n </StrandsUiButton>\n </div>\n </div>\n </div>\n </div>\n\n <template #footer>\n <div class=\"mfa-setup-footer\">\n <StrandsUiButton variant=\"secondary\" @click=\"closeModal\" :disabled=\"loading\">\n Cancel\n </StrandsUiButton>\n </div>\n </template>\n </UiModal>\n\n <!-- TOTP Setup Modal -->\n <StrandsTotpSetupModal v-if=\"showTotpSetup\" :show=\"showTotpSetup\" @close=\"showTotpSetup = false\"\n @success=\"handleSetupSuccess\" />\n\n <!-- Email MFA Setup Modal -->\n <StrandsEmailMfaSetupModal v-if=\"showEmailMfaSetup\" :show=\"showEmailMfaSetup\" @close=\"showEmailMfaSetup = false\"\n @success=\"handleSetupSuccess\" />\n\n <!-- Hardware Key Setup Modal -->\n <StrandsHardwareKeySetupModal v-if=\"showHardwareKeySetup\" :show=\"showHardwareKeySetup\"\n @close=\"showHardwareKeySetup = false\" @success=\"handleSetupSuccess\" />\n\n <!-- Full MFA Management Modal -->\n <StrandsMfaModal v-if=\"showMfaModal\" :show=\"showMfaModal\" @close=\"showMfaModal = false\"\n @mfa-updated=\"handleMfaUpdated\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted } from 'vue'\nimport { StrandsUiButton, StrandsUiLoader } from '../ui'\nimport UiModal from '../ui/UiModal.vue'\nimport StrandsTotpSetupModal from './StrandsTotpSetupModal.vue'\nimport StrandsEmailMfaSetupModal from './StrandsEmailMfaSetupModal.vue'\nimport StrandsHardwareKeySetupModal from './StrandsHardwareKeySetupModal.vue'\nimport StrandsMfaModal from './StrandsMfaModal.vue'\nimport { useStrandsMfa } from '../composables/useStrandsMfa'\n// Inline SVG icon components replacing lucide-vue-next\nconst Smartphone = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>`, props: ['size'] }\nconst Mail = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"m4 4 16 0c1.1 0 2 .9 2 2l0 12c0 1.1-.9 2-2 2l-16 0c-1.1 0-2-.9-2-2l0-12c0-1.1.9-2 2-2z\"/><polyline points=\"22,6 12,13 2,6\"/></svg>`, props: ['size'] }\nconst KeyRound = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\"/></svg>`, props: ['size'] }\nconst Shield = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"/></svg>`, props: ['size'] }\nconst Settings = { template: `<svg :width=\"size\" :height=\"size\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`, props: ['size'] }\n\ninterface Props {\n show?: boolean\n}\n\ninterface Emits {\n (e: 'success'): void\n (e: 'error', error: string): void\n (e: 'close'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n show: false\n})\n\nconst emit = defineEmits<Emits>()\n\nconst {\n mfaDevices,\n mfaEnabled,\n loading,\n activeMfaDevices,\n fetchMfaDevices,\n} = useStrandsMfa()\n\n// Modal states\nconst showTotpSetup = ref(false)\nconst showEmailMfaSetup = ref(false)\nconst showHardwareKeySetup = ref(false)\nconst showMfaModal = ref(false)\n\n// Load MFA devices when modal opens\nwatch(() => props.show, async (newShow) => {\n if (newShow) {\n await fetchMfaDevices()\n }\n})\n\nonMounted(async () => {\n if (props.show) {\n await fetchMfaDevices()\n }\n})\n\nconst closeModal = () => {\n emit('close')\n}\n\nconst startTotpSetup = () => {\n showTotpSetup.value = true\n}\n\nconst startEmailMfaSetup = () => {\n showEmailMfaSetup.value = true\n}\n\nconst startHardwareKeySetup = () => {\n showHardwareKeySetup.value = true\n}\n\nconst openMfaModal = () => {\n showMfaModal.value = true\n}\n\nconst handleSetupSuccess = async () => {\n showTotpSetup.value = false\n showEmailMfaSetup.value = false\n showHardwareKeySetup.value = false\n await fetchMfaDevices()\n emit('success')\n}\n\nconst handleMfaUpdated = async () => {\n await fetchMfaDevices()\n}\n</script>\n\n<style scoped>\n/* Header */\n.mfa-setup-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mfa-setup-title {\n font-size: 1.5rem;\n font-weight: 700;\n color: #111827;\n}\n\n.mfa-setup-subtitle {\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n.mfa-setup-status-container {\n text-align: right;\n}\n\n.mfa-setup-status-badge {\n display: inline-flex;\n align-items: center;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.875rem;\n font-weight: 500;\n}\n\n.mfa-setup-status-enabled {\n background-color: #dcfce7;\n color: #166534;\n}\n\n.mfa-setup-status-disabled {\n background-color: #f3f4f6;\n color: #374151;\n}\n\n/* Content */\n.mfa-setup-content {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n}\n\n.mfa-setup-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4rem 0;\n}\n\n.mfa-setup-loading-text {\n margin-left: 0.75rem;\n color: #6b7280;\n}\n\n.mfa-setup-sections {\n display: flex;\n flex-direction: column;\n gap: 2rem;\n}\n\n/* Status alert */\n.mfa-setup-status-alert {\n background-color: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 0.75rem;\n padding: 1.5rem;\n}\n\n.mfa-setup-status-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.mfa-setup-status-icon {\n width: 2.5rem;\n height: 2.5rem;\n background-color: #dcfce7;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mfa-setup-shield-icon {\n color: #16a34a;\n}\n\n.mfa-setup-status-title {\n color: #166534;\n font-weight: 500;\n font-size: 1.125rem;\n}\n\n.mfa-setup-status-description {\n color: #15803d;\n font-size: 0.875rem;\n margin-top: 0.25rem;\n}\n\n/* Methods section */\n.mfa-setup-methods-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #111827;\n margin-bottom: 1.5rem;\n}\n\n.mfa-setup-methods-grid {\n display: grid;\n grid-template-columns: repeat(1, 1fr);\n gap: 1.5rem;\n}\n\n/* Method cards */\n.mfa-setup-method-card {\n padding: 2rem;\n border: 1px solid #e5e7eb;\n border-radius: 0.75rem;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.mfa-setup-method-card:hover {\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n border-color: #EA00A8;\n}\n\n.mfa-setup-method-disabled {\n border-color: #d1d5db;\n background-color: #f9fafb;\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.mfa-setup-method-disabled:hover {\n box-shadow: none;\n border-color: #d1d5db;\n}\n\n.mfa-setup-method-content {\n display: flex !important;\n flex-direction: column !important;\n align-items: center !important;\n justify-content: flex-start !important;\n text-align: center;\n gap: 1rem;\n}\n\n.mfa-setup-method-icon {\n width: 4rem;\n height: 4rem;\n border-radius: 0.75rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.mfa-setup-totp-icon {\n background-color: rgba(234, 0, 168, 0.1);\n}\n\n.mfa-setup-method-card:hover .mfa-setup-totp-icon {\n background-color: rgba(234, 0, 168, 0.15);\n}\n\n.mfa-setup-email-icon {\n background-color: rgba(234, 0, 168, 0.1);\n}\n\n.mfa-setup-method-card:hover .mfa-setup-email-icon {\n background-color: rgba(234, 0, 168, 0.15);\n}\n\n.mfa-setup-hardware-icon {\n background-color: #e5e7eb;\n}\n\n.mfa-setup-icon-svg {\n color: #EA00A8;\n}\n\n.mfa-setup-icon-disabled {\n color: #9ca3af;\n}\n\n.mfa-setup-method-info {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.mfa-setup-method-title {\n font-weight: 600;\n color: #111827;\n font-size: 1.125rem;\n margin: 0;\n}\n\n.mfa-setup-method-title-disabled {\n color: #6b7280;\n}\n\n.mfa-setup-method-description {\n max-width: 300px;\n text-wrap: balance;\n font-size: 0.875rem;\n color: #6b7280;\n line-height: 1.625;\n margin: 0;\n}\n\n.mfa-setup-method-description-disabled {\n color: #9ca3af;\n}\n\n.mfa-setup-method-button {\n width: 100%;\n margin-top: 1rem;\n}\n\n/* Manage section */\n.mfa-setup-manage-section {\n border-top: 1px solid #e5e7eb;\n padding-top: 2rem;\n}\n\n.mfa-setup-manage-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.mfa-setup-manage-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #111827;\n}\n\n.mfa-setup-manage-description {\n color: #6b7280;\n font-size: 0.875rem;\n margin-top: 0.25rem;\n}\n\n.mfa-setup-manage-icon {\n margin-right: 0.5rem;\n}\n\n/* Footer */\n.mfa-setup-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n}\n</style>","<template>\n <div v-if=\"isAuthenticated && !showLoading\" class=\"animate-fade-in\">\n <slot :user=\"user\" :signOut=\"signOut\" />\n </div>\n <div v-else-if=\"!isAuthenticated && showFallback && !showLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :signIn=\"signIn\">\n <!-- Default fallback content -->\n <div class=\"signed-in-fallback\">\n <div class=\"signed-in-icon-container\">\n <svg class=\"signed-in-icon\" 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=\"signed-in-title\">Sign in required</h3>\n <p class=\"signed-in-subtitle\">You need to be signed in to access this content.</p>\n <button\n @click=\"signIn\"\n class=\"signed-in-button\"\n >\n Sign in\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"showLoading\" class=\"animate-fade-in\">\n <slot name=\"loading\">\n <StrandsUiLoader\n :size=\"64\" \n text=\"Checking authentication...\" \n variant=\"auto\" \n :show-particles=\"true\" \n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-required'): void\n}\n\nwithDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\n// Local loading state to ensure loading shows on first render\nconst isComponentReady = ref(false)\n\nconst { isAuthenticated, isInitializing, isSigningIn, user, signOut } = useStrandsAuth()\n\n// Show loading until both auth is initialized AND component is ready\n// Don't show loading during sign-in attempts - let StrandsAuth handle its own loading\nconst showLoading = computed(() => (isInitializing.value && !isSigningIn.value) || !isComponentReady.value)\n\nonMounted(() => {\n // Add a small delay to ensure we show loading state\n setTimeout(() => {\n isComponentReady.value = true\n }, 100)\n})\n\nconst signIn = () => {\n emit('sign-in-required')\n}\n</script>\n\n<style scoped>\n.signed-in-fallback {\n text-align: center;\n padding: 2rem 0;\n}\n\n.signed-in-icon-container {\n width: 4rem;\n height: 4rem;\n margin: 0 auto 1rem;\n background-color: #f5f5f5;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.signed-in-icon {\n width: 2rem;\n height: 2rem;\n color: #a3a3a3;\n}\n\n.signed-in-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #171717;\n margin-bottom: 0.5rem;\n}\n\n.signed-in-subtitle {\n color: #525252;\n margin-bottom: 1rem;\n}\n\n.signed-in-button {\n background-color: #EA00A8;\n color: white;\n width: auto;\n padding: 0.5rem 1.5rem;\n border: none;\n border-radius: 0.5rem;\n cursor: pointer;\n font-weight: 600;\n transition: background-color 0.2s ease;\n}\n\n.signed-in-button:hover {\n background-color: #B8006F;\n}\n</style>","<template>\n <div v-if=\"!isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot :signIn=\"signIn\" :signUp=\"signUp\" />\n </div>\n <div v-else-if=\"showFallback && isAuthenticated && !isLoading\" class=\"animate-fade-in\">\n <slot name=\"fallback\" :user=\"user\" :signOut=\"signOut\">\n <!-- Default fallback content for signed in users -->\n <div class=\"signed-out-fallback\">\n <div class=\"signed-out-icon-container\">\n <svg class=\"signed-out-icon\" 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=\"signed-out-title\">Already signed in</h3>\n <p class=\"signed-out-subtitle\">You're currently signed in as {{ user?.email }}.</p>\n <button\n @click=\"signOut\"\n class=\"signed-out-button\"\n >\n Sign out\n </button>\n </div>\n </slot>\n </div>\n <div v-else-if=\"isLoading\" class=\"animate-fade-in\">\n <slot name=\"loading\">\n <StrandsUiLoader \n :size=\"64\"\n text=\"Checking authentication...\"\n variant=\"auto\"\n :show-particles=\"true\"\n />\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLoader } from '../ui'\n\ninterface Props {\n showFallback?: boolean\n}\n\ninterface Emits {\n (e: 'sign-in-clicked'): void\n (e: 'sign-up-clicked'): void\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n showFallback: true\n})\n\nconst emit = defineEmits<Emits>()\n\nconst { isAuthenticated, isLoading, user, signOut } = useStrandsAuth()\n\nconst signIn = () => {\n emit('sign-in-clicked')\n}\n\nconst signUp = () => {\n emit('sign-up-clicked')\n}\n</script>\n\n<style scoped>\n.signed-out-fallback {\n text-align: center;\n padding: 2rem 0;\n}\n\n.signed-out-icon-container {\n width: 4rem;\n height: 4rem;\n margin: 0 auto 1rem;\n background-color: #fce7f3;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.signed-out-icon {\n width: 2rem;\n height: 2rem;\n color: #db2777;\n}\n\n.signed-out-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: #171717;\n margin-bottom: 0.5rem;\n}\n\n.signed-out-subtitle {\n color: #525252;\n margin-bottom: 1rem;\n}\n\n.signed-out-button {\n background-color: #f3f4f6;\n color: #374151;\n width: auto;\n padding: 0.5rem 1.5rem;\n border: 1px solid #d1d5db;\n border-radius: 0.5rem;\n cursor: pointer;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.signed-out-button:hover {\n background-color: #e5e7eb;\n border-color: #9ca3af;\n}\n</style>","<template>\n <div class=\"accui-component-scope\">\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 </div>\n</template>\n\n<script setup lang=\"ts\">\ninterface Props {\n class?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n class: ''\n})\n</script>","<template>\n <slot />\n</template>\n\n<script setup lang=\"ts\">\nimport { onMounted } from 'vue'\nimport { provideStrandsConfig, type StrandsAuthConfig } from '../composables/useStrandsConfig'\n\ninterface Props {\n config: StrandsAuthConfig\n}\n\nconst props = defineProps<Props>()\n\n// Provide the configuration to all child components\nonMounted(() => {\n provideStrandsConfig(props.config)\n})\n\n// Also provide immediately for SSR compatibility\nprovideStrandsConfig(props.config)\n</script>\n","<template>\n <svg :class=\"iconClass\" :fill=\"fill\" :stroke=\"stroke\" :viewBox=\"viewBox\" :aria-hidden=\"ariaHidden\">\n <component :is=\"iconComponent\" />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h as createElement } from 'vue'\n\ninterface Props {\n name: string\n class?: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n fill?: string\n stroke?: string\n ariaHidden?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n class: '',\n size: 'md',\n fill: 'none',\n stroke: 'currentColor',\n ariaHidden: true\n})\n\nconst sizeClasses = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n xl: 'w-8 h-8'\n}\n\nconst iconClass = computed(() => `${sizeClasses[props.size]} ${props.class}`)\nconst viewBox = computed(() => '0 0 24 24')\n\nconst icons = {\n 'eye': () => createElement('g', [\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 12a3 3 0 11-6 0 3 3 0 016 0z' \n }),\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z' \n })\n ]),\n 'eye-slash': () => createElement('g', [\n createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2',\n d: 'M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L3 3m6.878 6.878L21 21' \n })\n ]),\n 'camera': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0710.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z' \n }),\n 'chevron-left': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M15 19l-7-7 7-7' \n }),\n 'loading': () => createElement('g', [\n createElement('circle', { \n class: 'opacity-25', \n cx: '12', \n cy: '12', \n r: '10', \n stroke: 'currentColor', \n 'stroke-width': '4' \n }),\n createElement('path', { \n class: 'opacity-75', \n fill: 'currentColor', \n d: 'm4 12a8 8 0 0 1 8-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 0 1 4 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z' \n })\n ]),\n 'check-circle': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.236 4.53L7.53 10.173a.75.75 0 00-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z', \n 'clip-rule': 'evenodd' \n }),\n 'x-circle': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z', \n 'clip-rule': 'evenodd' \n }),\n 'lock': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z' \n }),\n 'user': () => createElement('path', { \n 'stroke-linecap': 'round', \n 'stroke-linejoin': 'round', \n 'stroke-width': '2', \n d: 'M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z' \n }),\n 'google': () => createElement('g', { fill: 'currentColor' }, [\n createElement('path', { \n fill: '#4285F4', \n d: 'M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z' \n }),\n createElement('path', { \n fill: '#34A853', \n d: 'M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z' \n }),\n createElement('path', { \n fill: '#FBBC05', \n d: 'M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z' \n }),\n createElement('path', { \n fill: '#EA4335', \n d: 'M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z' \n })\n ]),\n 'github': () => createElement('path', { \n 'fill-rule': 'evenodd', \n d: 'M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z', \n 'clip-rule': 'evenodd' \n })\n}\n\nconst iconComponent = computed(() => {\n const icon = icons[props.name as keyof typeof icons]\n return icon ? icon() : createElement('path', { d: '' })\n})\n</script>\n","<template>\n <div class=\"accui-component-scope\" ref=\"containerRef\">\n <SignedIn>\n <!-- Signed In State - User Button Trigger -->\n <button @click=\"toggleDropdown\" @keydown.enter=\"toggleDropdown\" @keydown.space.prevent=\"toggleDropdown\"\n @keydown.escape=\"closeDropdown\" @keydown.arrow-down.prevent=\"openDropdown\"\n class=\"user-button\"\n aria-haspopup=\"true\" :aria-expanded=\"showDropdown\" aria-label=\"User menu\">\n <div class=\"user-button-content\">\n <!-- User Info -->\n <div v-if=\"!hideUser\" class=\"user-info\">\n <div class=\"user-name\">\n {{ displayName }}\n </div>\n </div>\n\n <!-- Avatar with Level Progress Ring -->\n <div class=\"avatar-container\">\n <div class=\"avatar-wrapper\">\n <!-- Avatar Image -->\n <img v-if=\"user?.avatar\" :src=\"user.avatar\" :alt=\"`${user.firstName || user.email}'s avatar`\"\n class=\"avatar-image\" />\n\n <!-- Default Avatar -->\n <div v-else class=\"avatar-default\">\n <svg class=\"avatar-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\"\n clip-rule=\"evenodd\" />\n </svg>\n </div>\n </div>\n </div>\n\n <!-- Dropdown Arrow -->\n <svg class=\"dropdown-arrow\" :class=\"{ 'dropdown-arrow-open': showDropdown }\" fill=\"none\" stroke=\"currentColor\"\n viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n\n <!-- Dropdown Menu -->\n <Transition name=\"dropdown\">\n <div v-if=\"showDropdown\"\n class=\"dropdown-menu\"\n role=\"menu\" aria-orientation=\"vertical\" @keydown.escape=\"closeDropdown\"\n @keydown.arrow-up.prevent=\"focusPrevious\" @keydown.arrow-down.prevent=\"focusNext\"\n @keydown.home.prevent=\"focusFirst\" @keydown.end.prevent=\"focusLast\">\n <div class=\"dropdown-content\">\n <!-- User Info Header -->\n <div class=\"dropdown-header\">\n <div v-if=\"user\" class=\"dropdown-avatar-container\">\n <StrandsUiLevelProgress :size=\"80\" :value=\"user.xp\" :max=\"user.next_level_xp\" :level=\"user.level\"\n :level-label=\"`LEVEL ${user.level}`\" :user-settings=\"user.settings\"\n class=\"level-progress-overlay\" />\n <img v-if=\"user?.avatar\" :src=\"user.avatar\" :alt=\"`${user.firstName || user.email}'s avatar`\"\n class=\"dropdown-avatar-image\" />\n <div v-else class=\"dropdown-avatar-default\">\n <svg class=\"dropdown-avatar-icon\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path fill-rule=\"evenodd\" d=\"M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z\"\n clip-rule=\"evenodd\" />\n </svg>\n </div>\n </div>\n <div class=\"dropdown-user-details\">\n <div class=\"dropdown-user-name\">{{ displayName }}</div>\n <div class=\"dropdown-user-email\">{{ user?.email }}</div>\n </div>\n </div>\n\n <div class=\"dropdown-divider\"></div>\n\n <!-- Menu Items -->\n <div class=\"dropdown-menu-items\">\n <button ref=\"profileButtonRef\" @click=\"openProfile\"\n class=\"dropdown-menu-item\"\n role=\"menuitem\" tabindex=\"-1\">\n <svg class=\"dropdown-menu-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n Profile\n </button>\n\n <button @click=\"handleSignOut\"\n class=\"dropdown-menu-item dropdown-menu-item-danger\"\n role=\"menuitem\" tabindex=\"-1\">\n <svg class=\"dropdown-menu-icon dropdown-menu-icon-danger\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\" />\n </svg>\n Sign Out\n </button>\n </div>\n </div>\n </div>\n </Transition>\n </button>\n\n <!-- Profile Modal -->\n <StrandsUiModal :open=\"showProfileModal\" @close=\"closeProfile\" :fullscreen-on-mobile=\"false\">\n <template #header>\n <div class=\"modal-header\">\n <h2 class=\"modal-title\">User Profile</h2>\n <button @click=\"closeProfile\"\n class=\"modal-close-button\"\n aria-label=\"Close profile\">\n <svg class=\"modal-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n\n <StrandsUserProfile @profile-updated=\"handleProfileUpdated\" @error=\"handleProfileError\" in-modal />\n </StrandsUiModal>\n\n <!-- Fallback Slot - Sign In Button (shown when not authenticated) -->\n <template #fallback>\n <button @click=\"openSignIn\"\n class=\"sign-in-button\"\n aria-label=\"Sign in\">\n <svg class=\"sign-in-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\"\n d=\"M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1\" />\n </svg>\n <span>Sign In</span>\n </button>\n\n <!-- Sign In Modal -->\n <StrandsUiModal :open=\"showSignInModal\" @close=\"closeSignIn\" :fullscreen-on-mobile=\"false\">\n <template #header>\n <div class=\"modal-header\">\n <h2 class=\"modal-title\">Sign In</h2>\n <button @click=\"closeSignIn\"\n class=\"modal-close-button\"\n aria-label=\"Close sign in\">\n <svg class=\"modal-close-icon\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </template>\n\n <StrandsAuth @signed-in=\"handleSignedIn\" @error=\"handleSignInError\" :redirect-url=\"redirectUrl\" in-modal />\n </StrandsUiModal>\n </template>\n </SignedIn>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, nextTick, onMounted, onUnmounted } from 'vue'\nimport { useStrandsAuth } from '../composables/useStrandsAuth'\nimport { StrandsUiLevelProgress, StrandsUiModal } from '../ui'\nimport { StrandsAuth, StrandsUserProfile, SignedIn } from '.'\n\ninterface Props {\n hideUser?: boolean\n variant?: 'minimal' | 'compact' | 'full'\n redirectUrl?: string\n}\n\nwithDefaults(defineProps<Props>(), {\n hideUser: false,\n variant: 'minimal',\n redirectUrl: '/'\n})\n\nconst emit = defineEmits<{\n 'profile-updated': []\n 'signed-out': []\n 'signed-in': []\n}>()\n\n// Auth composable\nconst { currentUser: user, signOut } = useStrandsAuth()\n\n// Component state\nconst showDropdown = ref(false)\nconst showProfileModal = ref(false)\nconst showSignInModal = ref(false)\nconst containerRef = ref<HTMLElement>()\nconst profileButtonRef = ref<HTMLButtonElement>()\n\n// User display logic\nconst displayName = computed(() => {\n if (!user.value) return 'User'\n\n if (user.value.username) {\n return user.value.username\n }\n\n if (user.value.firstName && user.value.lastName) {\n return `${user.value.firstName} ${user.value.lastName}`\n }\n\n if (user.value.firstName) {\n return user.value.firstName\n }\n\n return user.value.email || 'User'\n})\n\n// Dropdown management\nconst toggleDropdown = () => {\n showDropdown.value = !showDropdown.value\n\n if (showDropdown.value) {\n nextTick(() => {\n profileButtonRef.value?.focus()\n })\n }\n}\n\nconst openDropdown = () => {\n showDropdown.value = true\n nextTick(() => {\n profileButtonRef.value?.focus()\n })\n}\n\nconst closeDropdown = () => {\n showDropdown.value = false\n}\n\n// Keyboard navigation for dropdown\nconst focusNext = () => {\n // Simple implementation - can be enhanced\n}\n\nconst focusPrevious = () => {\n // Simple implementation - can be enhanced\n}\n\nconst focusFirst = () => {\n profileButtonRef.value?.focus()\n}\n\nconst focusLast = () => {\n // Focus the last item (sign out button)\n}\n\n// Profile modal management\nconst openProfile = () => {\n showProfileModal.value = true\n closeDropdown()\n}\n\nconst closeProfile = () => {\n showProfileModal.value = false\n}\n\nconst handleProfileUpdated = () => {\n emit('profile-updated')\n}\n\nconst handleProfileError = (error: string) => {\n console.error('Profile error:', error)\n}\n\n// Sign in modal management\nconst openSignIn = () => {\n showSignInModal.value = true\n}\n\nconst closeSignIn = () => {\n showSignInModal.value = false\n}\n\nconst handleSignedIn = () => {\n closeSignIn()\n emit('signed-in')\n}\n\nconst handleSignInError = (error: string) => {\n console.error('Sign in error:', error)\n}\n\n// Sign out handler\nconst handleSignOut = async () => {\n try {\n await signOut()\n closeDropdown()\n emit('signed-out')\n } catch (error) {\n console.error('Sign out error:', error)\n }\n}\n\n// Click outside to close dropdown\nconst handleClickOutside = (event: Event) => {\n if (containerRef.value && !containerRef.value.contains(event.target as Node)) {\n closeDropdown()\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n\n<style scoped>\n/* User Button */\n.user-button {\n position: relative;\n display: flex;\n align-items: center;\n padding: 0.5rem 0.75rem;\n border-radius: 9999px;\n background-color: #f3f4f6;\n color: #111827;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.user-button:hover {\n background-color: #d1d5db;\n}\n\n.user-button:focus {\n outline: none;\n box-shadow: 0 0 0 2px #EA00A8;\n}\n\n.user-button-content {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n}\n\n.user-info {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n}\n\n.user-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n}\n\n.avatar-container {\n position: relative;\n flex-shrink: 0;\n}\n\n.avatar-wrapper {\n position: relative;\n width: 2rem;\n height: 2rem;\n}\n\n.avatar-image {\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n object-fit: cover;\n}\n\n.avatar-default {\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n background-color: #e5e7eb;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.avatar-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #6b7280;\n}\n\n.dropdown-arrow {\n width: 1rem;\n height: 1rem;\n color: #9ca3af;\n transition: transform 0.15s;\n}\n\n.dropdown-arrow-open {\n transform: rotate(180deg);\n}\n\n/* Dropdown Menu */\n.dropdown-menu {\n position: absolute;\n right: 0;\n top: 100%;\n margin-top: 0.5rem;\n width: 18rem;\n background: white;\n border-radius: 0.5rem;\n box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.05);\n border: 1px solid #e5e7eb;\n z-index: 50;\n}\n\n.dropdown-content {\n padding: 0.5rem;\n}\n\n.dropdown-header {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 0.75rem;\n border-radius: 0.5rem;\n background-color: #f9fafb;\n}\n\n.dropdown-avatar-container {\n position: relative;\n}\n\n.level-progress-overlay {\n position: absolute;\n z-index: 10;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n\n.dropdown-avatar-image {\n width: 3.5rem;\n height: 3.5rem;\n border-radius: 50%;\n object-fit: cover;\n}\n\n.dropdown-avatar-default {\n width: 3.5rem;\n height: 3.5rem;\n border-radius: 50%;\n background-color: #e5e7eb;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.dropdown-avatar-icon {\n width: 1.25rem;\n height: 1.25rem;\n color: #6b7280;\n}\n\n.dropdown-user-details {\n flex: 1;\n min-width: 0;\n text-align: left;\n}\n\n.dropdown-user-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.dropdown-user-email {\n font-size: 0.875rem;\n color: #6b7280;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.dropdown-divider {\n height: 1px;\n background-color: #e5e7eb;\n margin: 0.5rem 0;\n}\n\n.dropdown-menu-items {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.dropdown-menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n color: #374151;\n border-radius: 0.5rem;\n border: none;\n background: none;\n cursor: pointer;\n transition: all 0.15s;\n text-align: left;\n}\n\n.dropdown-menu-item:hover,\n.dropdown-menu-item:focus {\n background-color: #f3f4f6;\n outline: none;\n}\n\n.dropdown-menu-item-danger {\n color: #dc2626;\n}\n\n.dropdown-menu-item-danger:hover,\n.dropdown-menu-item-danger:focus {\n background-color: #fef2f2;\n}\n\n.dropdown-menu-icon {\n width: 1rem;\n height: 1rem;\n color: #9ca3af;\n}\n\n.dropdown-menu-icon-danger {\n color: #ef4444;\n}\n\n/* Sign In Button */\n.sign-in-button {\n position: relative;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border-radius: 9999px;\n background-color: #EA00A8;\n color: white;\n font-size: 0.875rem;\n font-weight: 500;\n border: none;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.sign-in-button:hover {\n background-color: #B8006F;\n}\n\n.sign-in-button:focus {\n outline: none;\n box-shadow: 0 0 0 2px #EA00A8, 0 0 0 4px white;\n}\n\n.sign-in-icon {\n width: 1rem;\n height: 1rem;\n}\n\n/* Modal Styles */\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.modal-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #111827;\n}\n\n.modal-close-button {\n padding: 0.25rem;\n border-radius: 0.5rem;\n color: #9ca3af;\n background: none;\n border: none;\n cursor: pointer;\n transition: all 0.2s;\n}\n\n.modal-close-button:hover {\n color: #6b7280;\n background-color: #f3f4f6;\n}\n\n.modal-close-icon {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* Transitions */\n.dropdown-enter-active,\n.dropdown-leave-active {\n transition: all 0.15s ease;\n}\n\n.dropdown-enter-from,\n.dropdown-leave-to {\n opacity: 0;\n transform: scale(0.95) translateY(4px);\n}\n\n.dropdown-enter-to,\n.dropdown-leave-from {\n opacity: 1;\n transform: scale(1) translateY(0);\n}\n\n/* Responsive adjustments */\n@media (max-width: 640px) {\n .dropdown-menu {\n width: 16rem;\n }\n \n .user-info {\n display: none;\n }\n}\n</style>","import type { App } from 'vue'\n\n// Import all UI components\nimport StrandsUiAlert from '../ui/UiAlert.vue'\nimport StrandsUiButton from '../ui/UiButton.vue'\nimport StrandsUiCard from '../ui/UiCard.vue'\nimport StrandsUiInput from '../ui/UiInput.vue'\nimport StrandsUiLink from '../ui/UiLink.vue'\nimport StrandsUiTabs from '../ui/UiTabs.vue'\nimport StrandsUiLoader from '../ui/UiLoader.vue'\n\n// Global components map\nconst components = {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\nexport interface StrandsUIOptions {\n prefix?: string\n}\n\nexport default {\n install(app: App, options: StrandsUIOptions = {}) {\n const { prefix = '' } = options\n\n // Register all components globally\n Object.entries(components).forEach(([name, component]) => {\n const componentName = prefix ? `${prefix}${name}` : name\n app.component(componentName, component)\n })\n }\n}\n\n// Export individual components for tree-shaking\nexport {\n StrandsUiAlert,\n StrandsUiButton,\n StrandsUiCard,\n StrandsUiInput,\n StrandsUiLink,\n StrandsUiTabs,\n StrandsUiLoader,\n}\n\n// Export types\nexport type {\n ButtonVariant,\n ButtonSize,\n InputType,\n CardVariant,\n LinkVariant,\n AlertVariant,\n} from '../ui/index'","// Email validation\nexport const isValidEmail = (email: string): boolean => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n}\n\n// Password strength validation\nexport const validatePassword = (password: string): {\n isValid: boolean\n strength: 'weak' | 'medium' | 'strong'\n errors: string[]\n} => {\n const errors: string[] = []\n let score = 0\n\n if (password.length < 8) {\n errors.push('Password must be at least 8 characters long')\n } else {\n score += 1\n }\n\n if (!/[A-Z]/.test(password)) {\n errors.push('Password must contain at least one uppercase letter')\n } else {\n score += 1\n }\n\n if (!/[a-z]/.test(password)) {\n errors.push('Password must contain at least one lowercase letter')\n } else {\n score += 1\n }\n\n if (!/\\d/.test(password)) {\n errors.push('Password must contain at least one number')\n } else {\n score += 1\n }\n\n if (!/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\n errors.push('Password must contain at least one special character')\n } else {\n score += 1\n }\n\n const isValid = errors.length === 0\n let strength: 'weak' | 'medium' | 'strong' = 'weak'\n\n if (score >= 4) {\n strength = 'strong'\n } else if (score >= 3) {\n strength = 'medium'\n }\n\n return { isValid, strength, errors }\n}\n\n// Name validation\nexport const isValidName = (name: string): boolean => {\n return name.trim().length >= 2\n}\n\n\n// Generic required field validation\nexport const isRequired = (value: string): boolean => {\n return value.trim().length > 0\n}\n\n// Password confirmation validation\nexport const passwordsMatch = (password: string, confirmation: string): boolean => {\n return password === confirmation\n}\n\n// Generate user initials\nexport const getInitials = (firstName?: string, lastName?: string): string => {\n const first = firstName?.charAt(0).toUpperCase() || ''\n const last = lastName?.charAt(0).toUpperCase() || ''\n return first + last || 'U'\n}\n\n// Format date for display\nexport const formatDate = (date: string | Date): string => {\n const d = typeof date === 'string' ? new Date(date) : date\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n}\n\n// Debounce utility for input validation\nexport const debounce = <T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): ((...args: Parameters<T>) => void) => {\n let timeout: NodeJS.Timeout\n return (...args: Parameters<T>) => {\n clearTimeout(timeout)\n timeout = setTimeout(() => func(...args), wait)\n }\n}\n"],"names":["computed","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_6","title","_renderSlot","message","dismissible","_hoisted_7","$emit","type","disabled","loading","loadingText","variant","padding","shadow","$slots","useSlots","ref","label","required","_hoisted_5","modelValue","placeholder","autocomplete","name","inputmode","maxlength","_hoisted_8","_hoisted_9","error","_hoisted_10","_toDisplayString","helpText","_hoisted_11","_createBlock","_resolveDynamicComponent","_mergeProps","size","color","nextTick","onMounted","toRefs","watch","_Fragment","_renderList","tabs","_unref","_normalizeClass","centered","weight","text","id","reactive","_hoisted_14","_hoisted_15","_hoisted_17","uploading","_hoisted_18","_hoisted_19","_hoisted_20","levelLabel","_Teleport","open","fullscreenOnMobile","useStrandsConfig","useStrandsAuth","onBeforeUnmount","_createVNode","UiModal","show","_hoisted_37","_hoisted_12","_hoisted_13","_hoisted_16","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_createTextVNode","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_Transition","token","device","cancelText","confirmText","mfaEnabled","UiButton","getInitials","inModal","showFallback","class","provideStrandsConfig","createElement","fill","stroke","ariaHidden","onUnmounted","redirectUrl","hideUser"],"mappings":"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"}
|