()
| 269 | } |
| 270 | |
| 271 | renderThanksStep() { |
| 272 | const hasError = !!this.redeemError; |
| 273 | const hasInfo = !!this.redeemInfo; |
| 274 | const inputKind = this.getInputKind(this.accessInput); |
| 275 | const submitButton = this.getSubmitButtonConfig(inputKind); |
| 276 | const hintText = this.isRedeeming && this.redeemProgress?.message |
| 277 | ? this.redeemProgress.message |
| 278 | : this.getInputHint(inputKind); |
| 279 | const submitToneClass = inputKind === 'inviteCode' |
| 280 | ? 'invite-submit-redeem' |
| 281 | : 'invite-submit-email'; |
| 282 | const isSubmitDisabled = this.isRedeeming || !this.accessInput.trim(); |
| 283 | const feedbackText = hasError ? this.redeemError : this.redeemInfo; |
| 284 | const feedbackClass = hasError ? 'text-red-500' : 'text-emerald-600 dark:text-emerald-400'; |
| 285 | const modalClass = this.animateOnNextRender |
| 286 | ? `${MODAL_CLASSES} welcome-modal-enter` |
| 287 | : MODAL_CLASSES; |
| 288 | |
| 289 | return ` |
| 290 | <div id="welcome-theme-toggle" class="theme-toggle-container" role="radiogroup" aria-label="Theme selection" data-theme="${themeManager.getPreference()}" style="position:fixed;top:12px;right:12px;z-index:9999"> |
| 291 | <div class="theme-toggle-indicator"></div> |
| 292 | <button type="button" class="theme-toggle-btn" data-theme-option="light" aria-checked="${themeManager.getPreference() === 'light'}" title="Light"> |
| 293 | <svg class="w-[18px] h-[18px]" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"> |
| 294 | <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1.5m0 15V21m9-9h-1.5M4.5 12H3m15.364-6.364-1.06 1.06M6.697 17.303l-1.06 1.06m0-12.728 1.06 1.06m9.607 9.607 1.06 1.06M12 8.25a3.75 3.75 0 1 1 0 7.5 3.75 3.75 0 0 1 0-7.5z"></path> |
| 295 | </svg> |
| 296 | </button> |
| 297 | <button type="button" class="theme-toggle-btn" data-theme-option="dark" aria-checked="${themeManager.getPreference() === 'dark'}" title="Dark"> |
| 298 | <svg class="w-[18px] h-[18px]" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"> |
| 299 | <path stroke-linecap="round" stroke-linejoin="round" d="M21 12.79A9 9 0 0 1 11.21 3 7.5 7.5 0 1 0 21 12.79z"></path> |
| 300 | </svg> |
| 301 | </button> |
| 302 | <button type="button" class="theme-toggle-btn" data-theme-option="system" aria-checked="${themeManager.getPreference() === 'system'}" title="System"> |
| 303 | <svg class="w-[18px] h-[18px]" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5"> |
| 304 | <path stroke-linecap="round" stroke-linejoin="round" d="M9 17v2h6v-2m2 0h.75A2.25 2.25 0 0 0 20 14.75V7.25A2.25 2.25 0 0 0 17.75 5H6.25A2.25 2.25 0 0 0 4 7.25v7.5A2.25 2.25 0 0 0 6.25 17H7.5"></path> |
| 305 | </svg> |
| 306 | </button> |
| 307 | </div> |
| 308 | |
| 309 | <div role="dialog" aria-modal="true" class="${modalClass}" style="padding:28px 28px 20px"> |
| 310 | <style> |
| 311 | @keyframes welcomeModalIn { |
| 312 | from { opacity: 0; transform: scale(0.97) translateY(6px); } |
| 313 | to { opacity: 1; transform: scale(1) translateY(0); } |
| 314 | } |
| 315 | .welcome-modal-enter { |
| 316 | animation: welcomeModalIn 0.2s ease-out; |
| 317 | } |
| 318 | .welcome-modal-glass { |
| 319 | background: hsl(var(--color-background) / 0.72); |
| 320 | backdrop-filter: blur(20px) saturate(1.2); |
| 321 | -webkit-backdrop-filter: blur(20px) saturate(1.2); |
| 322 | } |
| 323 | #welcome-panel { |
| 324 | background: rgba(0,0,0,0.35) !important; |
| 325 | backdrop-filter: blur(4px) !important; |
| 326 | -webkit-backdrop-filter: blur(4px) !important; |
| 327 | } |
| 328 | .invite-input-wrapper { |
no test coverage detected