@haloduck/ui 2.0.49 → 2.1.1
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/fesm2022/haloduck-ui.mjs +4226 -285
- package/fesm2022/haloduck-ui.mjs.map +1 -1
- package/haloduck-ui-2.1.1.tgz +0 -0
- package/index.d.ts +550 -16
- package/package.json +13 -13
- package/public/i18n/haloduck/en.json +64 -12
- package/public/i18n/haloduck/ko.json +64 -12
- package/src/tailwind.css +126 -15
- package/haloduck-ui-2.0.49.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haloduck-ui.mjs","sources":["../../../../projects/haloduck/ui/src/lib/layout/notification/notification.service.ts","../../../../projects/haloduck/ui/src/lib/control/button/button.component.ts","../../../../projects/haloduck/ui/src/lib/control/button/button.component.html","../../../../projects/haloduck/ui/src/lib/control/input/input.component.ts","../../../../projects/haloduck/ui/src/lib/control/input/input.component.html","../../../../projects/haloduck/ui/src/lib/component/authenticate/authenticate.component.ts","../../../../projects/haloduck/ui/src/lib/component/authenticate/authenticate.component.html","../../../../projects/haloduck/ui/src/lib/component/authenticate/authenticate-callback.component.ts","../../../../projects/haloduck/ui/src/lib/control/select/select-dropdown/select-dropdown.component.ts","../../../../projects/haloduck/ui/src/lib/control/select/select-dropdown/select-dropdown.component.html","../../../../projects/haloduck/ui/src/lib/control/select/select.component.ts","../../../../projects/haloduck/ui/src/lib/control/select/select.component.html","../../../../projects/haloduck/ui/src/lib/control/calendar/calendar.component.ts","../../../../projects/haloduck/ui/src/lib/control/calendar/calendar.component.html","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog-container.component.ts","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog-container.component.html","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog.service.ts","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.component.ts","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.component.html","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.service.ts","../../../../projects/haloduck/ui/src/lib/control/copy-button/copy-button.component.ts","../../../../projects/haloduck/ui/src/lib/control/copy-button/copy-button.component.html","../../../../projects/haloduck/ui/src/lib/control/date-picker/date-picker.component.ts","../../../../projects/haloduck/ui/src/lib/control/date-picker/date-picker.component.html","../../../../projects/haloduck/ui/src/lib/control/date-range/date-range.component.ts","../../../../projects/haloduck/ui/src/lib/control/date-range/date-range.component.html","../../../../projects/haloduck/ui/src/lib/control/draw-canvas/draw-canvas.component.ts","../../../../projects/haloduck/ui/src/lib/control/draw-canvas/draw-canvas.component.html","../../../../projects/haloduck/ui/src/lib/control/tag-input/tag-input.component.ts","../../../../projects/haloduck/ui/src/lib/control/tag-input/tag-input.component.html","../../../../projects/haloduck/ui/src/lib/control/file-uploader/file-uploader.component.ts","../../../../projects/haloduck/ui/src/lib/control/file-uploader/file-uploader.component.html","../../../../projects/haloduck/ui/src/lib/control/flip/flip.component.ts","../../../../projects/haloduck/ui/src/lib/control/flip/flip.component.html","../../../../projects/haloduck/ui/src/lib/control/image-viewer/image-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/image-viewer/image-viewer.component.html","../../../../projects/haloduck/ui/src/lib/control/image-uploader/image-uploader.component.ts","../../../../projects/haloduck/ui/src/lib/control/image-uploader/image-uploader.component.html","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector-option/language-selector-option.component.ts","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector-option/language-selector-option.component.html","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector.component.ts","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector.component.html","../../../../projects/haloduck/ui/src/lib/control/map-to-address/map-to-address.component.ts","../../../../projects/haloduck/ui/src/lib/control/map-to-address/map-to-address.component.html","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu-item/side-menu-item.component.ts","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu-item/side-menu-item.component.html","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu.component.ts","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu.component.html","../../../../projects/haloduck/ui/src/lib/control/stl-viewer/stl-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/stl-viewer/stl-viewer.component.html","../../../../projects/haloduck/ui/src/lib/directive/auto-load.directive.ts","../../../../projects/haloduck/ui/src/lib/control/table/table-setting.service.ts","../../../../projects/haloduck/ui/src/lib/control/table/table.component.ts","../../../../projects/haloduck/ui/src/lib/control/table/table.component.html","../../../../projects/haloduck/ui/src/lib/control/toggle/toggle.component.ts","../../../../projects/haloduck/ui/src/lib/control/toggle/toggle.component.html","../../../../projects/haloduck/ui/src/lib/control/table/table-setting.component.ts","../../../../projects/haloduck/ui/src/lib/control/tabs/tabs.component.ts","../../../../projects/haloduck/ui/src/lib/control/tabs/tabs.component.html","../../../../projects/haloduck/ui/src/lib/control/tag-viewer/tag-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/tag-viewer/tag-viewer.component.html","../../../../projects/haloduck/ui/src/lib/control/grouped/grouped.directive.ts","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.service.ts","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.component.ts","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.component.html","../../../../projects/haloduck/ui/src/lib/layout/notification/notification.component.ts","../../../../projects/haloduck/ui/src/lib/layout/notification/notification.component.html","../../../../projects/haloduck/ui/src/lib/widget/picture-name/picture-name.component.ts","../../../../projects/haloduck/ui/src/lib/widget/picture-name/picture-name.component.html","../../../../projects/haloduck/ui/src/transloco/transloco.scope.ts","../../../../projects/haloduck/ui/src/haloduck-ui.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { ulid } from 'ulid';\n\n// Flutter 앱과의 통신을 위한 전역 인터페이스 선언\ndeclare global {\n interface Window {\n FlutterApp?: {\n postMessage: (message: string) => void;\n };\n }\n}\n\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\nexport interface Notification {\n id: string;\n type: NotificationType;\n message: string;\n timeout?: number;\n timeoutRef?: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n private listNotification$ = new BehaviorSubject<Notification[]>([]);\n private listNotification: Notification[] = [];\n\n showNotification(title: string, body: string, timeout?: number, payload: any = null) {\n if (window.FlutterApp) {\n window.FlutterApp.postMessage(\n JSON.stringify({\n action: 'showNotification',\n title: title,\n body: body,\n payload: payload,\n timeout: timeout,\n }),\n );\n } else if ('Notification' in window && Notification.permission === 'granted') {\n // 웹브라우저에서 실행될 때는 기본 브라우저 알림 사용\n new Notification(title, { body: body });\n } else {\n // 기본 내부 알림 시스템 사용\n this._showNotification('info', body, timeout);\n }\n }\n\n _showNotification(type: NotificationType, message: string, timeout?: number): string {\n const id = ulid();\n const notification: Notification = { id, type, message, timeout };\n\n if (timeout && timeout > 0) {\n const timeoutRef = window.setTimeout(() => {\n this.removeNotificationById(id);\n }, timeout);\n notification.timeoutRef = timeoutRef;\n }\n\n this.listNotification.push(notification);\n this.listNotification$.next(this.listNotification);\n\n return id;\n }\n\n getListNotification(): Observable<Notification[]> {\n return this.listNotification$.asObservable();\n }\n\n removeNotificationById(id: string) {\n const notification = this.listNotification.find((n) => n.id === id);\n if (notification?.timeoutRef) {\n clearTimeout(notification.timeoutRef);\n }\n\n this.listNotification = this.listNotification.filter((n) => n.id !== id);\n this.listNotification$.next(this.listNotification);\n }\n\n constructor() {}\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'none';\n\n@Component({\n selector: 'haloduck-button',\n imports: [CommonModule],\n templateUrl: './button.component.html',\n styleUrl: './button.component.css',\n})\nexport class ButtonComponent {\n @Input() disabled: boolean | null = false;\n @Input() variant: ButtonVariant = 'primary';\n}\n","<button\n type=\"button\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'bg-light-primary text-light-on-primary dark:bg-dark-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'bg-light-primary-light text-light-on-primary-light dark:bg-dark-primary-light dark:text-dark-on-primary-light':\n variant === 'secondary' && !disabled,\n 'bg-light-danger text-light-on-danger dark:bg-dark-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n 'bg-light-background text-light-on-background dark:bg-dark-background dark:text-dark-on-background border border-light-on-background dark:border-dark-on-background':\n variant === 'none' && !disabled,\n 'bg-light-inactive text-light-on-inactive dark:bg-dark-inactive dark:text-dark-on-inactive active:animate-bounce hover:cursor-not-allowed':\n disabled,\n 'active:scale-95 transition-transform': !disabled,\n 'hover:cursor-pointer': !disabled,\n }\"\n class=\"px-4 py-1.5 rounded-lg text-sm/6 w-full text-nowrap\"\n>\n <ng-content></ng-content>\n</button>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n ViewChild,\n forwardRef,\n ChangeDetectorRef,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-input',\n templateUrl: './input.component.html',\n styleUrls: ['./input.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class InputComponent implements ControlValueAccessor, AfterViewInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @ViewChild('label') label!: ElementRef;\n @ViewChild('input') private inputElement!: ElementRef<HTMLElement>;\n\n @Input() placeholder: string = '';\n @Input() type: string = 'text';\n @Input() disabled: boolean = false;\n @Input() rows: number = 1;\n @Input() autofocus: boolean = false;\n @Input() value: string = '';\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n focus() {\n this.inputElement?.nativeElement?.focus();\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n this.onChange(this.value);\n this.onTouched();\n\n if (this.rows > 1) {\n input.style.height = 'auto';\n input.style.height = input.scrollHeight + 'px';\n }\n }\n\n onKeydown($event: KeyboardEvent) {\n if (this.rows === 1 && $event.key === 'Enter') {\n $event.preventDefault();\n $event.stopPropagation();\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (!this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n\n if (this.autofocus) {\n // Ensure change detection is complete and view is stable\n this.cdr.detectChanges();\n setTimeout(() => {\n if (this.inputElement?.nativeElement instanceof HTMLElement) {\n this.inputElement.nativeElement.focus();\n }\n }, 100);\n }\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n @if (rows > 1) {\n <textarea\n #input\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [rows]=\"rows\"\n (keydown)=\"onKeydown($event)\"\n class=\"block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-3 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary sm:text-sm/6\"\n ></textarea>\n } @else {\n <input\n #input\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n (keydown)=\"onKeydown($event)\"\n class=\"block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-3 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary sm:text-sm/6\"\n />\n }\n</div>\n","// auth.component.ts\nimport { Component, inject, Input, InjectionToken } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { signIn, resetPassword, confirmResetPassword, confirmSignIn } from 'aws-amplify/auth';\nimport {\n FormBuilder,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { NotificationService } from '../../layout/notification/notification.service';\nimport { ButtonComponent } from '../../control/button/button.component';\nimport { InputComponent } from '../../control/input/input.component';\nimport { CommonModule } from '@angular/common';\n\nexport interface SocialLoginProvider {\n name: 'google' | 'apple' | 'kakao';\n enabled: boolean;\n clientId?: string;\n redirectUrl?: string;\n state?: { [key: string]: string };\n}\n\n// InjectionToken for Social Login Providers configuration\nexport const SOCIAL_LOGIN_PROVIDERS = new InjectionToken<SocialLoginProvider[]>(\n 'SOCIAL_LOGIN_PROVIDERS',\n);\n\n// Provider function for easier configuration in ApplicationConfig\nexport function provideSocialLoginProviders(providers: SocialLoginProvider[]) {\n return {\n provide: SOCIAL_LOGIN_PROVIDERS,\n useValue: providers,\n };\n}\n\n@Component({\n selector: 'haloduck-authenticate',\n imports: [FormsModule, ReactiveFormsModule, InputComponent, ButtonComponent, CommonModule],\n templateUrl: './authenticate.component.html',\n styleUrl: './authenticate.component.css',\n})\nexport class AuthenticateComponent {\n private notificationService = inject(NotificationService);\n private injectedSocialProviders = inject(SOCIAL_LOGIN_PROVIDERS, { optional: true });\n\n @Input() metaData?: any;\n\n @Input() socialLoginProviders: SocialLoginProvider[] = this.injectedSocialProviders || [\n { name: 'google', enabled: true },\n { name: 'apple', enabled: true },\n { name: 'kakao', enabled: true },\n ];\n\n @Input() showSocialLogin: boolean = true;\n @Input() showDivider: boolean = true;\n\n loginForm: FormGroup;\n signupForm: FormGroup;\n resetForm: FormGroup;\n newPasswordForm: FormGroup;\n otpForm: FormGroup;\n\n stage: 'login' | 'signup' | 'reset' | 'newPassword' | 'otpVerify' = 'login';\n emailForReset: string = '';\n\n constructor(\n private fb: FormBuilder,\n private http: HttpClient,\n ) {\n this.loginForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n });\n\n this.signupForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n });\n\n this.resetForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n });\n\n this.newPasswordForm = fb.group({\n newPassword: ['', Validators.required],\n });\n\n this.otpForm = fb.group({\n code: ['', Validators.required],\n newPassword: ['', Validators.required],\n });\n }\n\n switchStage(stage: 'login' | 'signup' | 'reset' | 'newPassword' | 'otpVerify') {\n this.stage = stage;\n }\n\n login() {\n signIn({\n username: this.loginForm.value.email,\n password: this.loginForm.value.password,\n options: {\n authFlowType: 'USER_PASSWORD_AUTH',\n clientMetadata: this.metaData,\n },\n })\n .then((res: any) => {\n // console.log('res', res);\n // console.log('res.nextStep.signInStep', res.nextStep.signInStep);\n if (res.nextStep.signInStep === 'CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED') {\n this.switchStage('newPassword');\n } else {\n this.notificationService.showNotification('success', 'Successfully signed in.', 3000);\n }\n })\n .catch((err) => {\n if (err.code === 'NotAuthorizedException') {\n this.switchStage('reset');\n } else {\n this.notificationService.showNotification('error', 'Failed to sign in.');\n }\n });\n }\n\n confirmNewPassword() {\n confirmSignIn({\n challengeResponse: this.newPasswordForm.value.newPassword,\n options: {\n clientMetadata: this.metaData,\n },\n })\n .then(() => {\n this.notificationService.showNotification('success', 'Successfully signed in.', 3000);\n })\n .catch((err) => {\n if (err.code === 'NotAuthorizedException') {\n this.notificationService.showNotification('error', 'Failed to sign in.');\n } else if (err.code === 'InvalidPasswordException') {\n this.notificationService.showNotification('error', 'Invalid password.');\n } else {\n this.notificationService.showNotification('error', 'Failed to confirm new password.');\n }\n });\n }\n\n signup() {\n this.http.post('/api/signup', this.signupForm.value).subscribe(console.log);\n }\n\n reset() {\n resetPassword({\n username: this.resetForm.value.email,\n options: { clientMetadata: this.metaData },\n })\n .then(() => {\n this.switchStage('otpVerify');\n })\n .catch((err) => {\n this.notificationService.showNotification('error', 'Failed to request verification code.');\n });\n }\n\n verifyOtp() {\n confirmResetPassword({\n username: this.resetForm.value.email,\n confirmationCode: this.otpForm.value.code,\n newPassword: this.otpForm.value.newPassword,\n options: { clientMetadata: this.metaData },\n })\n .then(() => {\n this.notificationService.showNotification('success', 'Successfully reset password.', 3000);\n this.switchStage('login');\n })\n .catch((err) => {\n this.notificationService.showNotification('error', 'Failed to reset password.');\n });\n }\n\n get passwordValue(): string {\n return this.newPasswordForm.get('newPassword')?.value || '';\n }\n\n get isMinLength(): boolean {\n return this.passwordValue.length >= 8;\n }\n get hasUppercase(): boolean {\n return /[A-Z]/.test(this.passwordValue);\n }\n get hasLowercase(): boolean {\n return /[a-z]/.test(this.passwordValue);\n }\n get hasNumber(): boolean {\n return /[0-9]/.test(this.passwordValue);\n }\n get hasSpecialChar(): boolean {\n return /[^A-Za-z0-9]/.test(this.passwordValue);\n }\n get isPasswordValid(): boolean {\n return (\n this.isMinLength &&\n this.hasUppercase &&\n this.hasLowercase &&\n this.hasNumber &&\n this.hasSpecialChar\n );\n }\n\n get passwordRules() {\n return [\n { label: 'minimum of 8 characters', valid: this.isMinLength },\n { label: 'one uppercase letter', valid: this.hasUppercase },\n { label: 'one lowercase letter', valid: this.hasLowercase },\n { label: 'one numeric digit', valid: this.hasNumber },\n { label: 'one special character', valid: this.hasSpecialChar },\n ];\n }\n\n // Social Login Methods\n get enabledSocialProviders() {\n return this.socialLoginProviders.filter((provider) => provider.enabled);\n }\n\n isProviderEnabled(providerName: 'google' | 'apple' | 'kakao'): boolean {\n return this.socialLoginProviders.some(\n (provider) => provider.name === providerName && provider.enabled,\n );\n }\n\n loginWithGoogle() {\n try {\n // Google 로그인 로직 구현\n // 실제 구현시에는 Google OAuth2 SDK 또는 AWS Amplify의 Google 제공자를 사용\n console.log('Google login initiated');\n\n // 예시: window.location을 사용한 OAuth 리다이렉션\n const googleProvider = this.socialLoginProviders.find((p) => p.name === 'google');\n if (googleProvider?.clientId) {\n const redirectUrl = googleProvider.redirectUrl || window.location.origin;\n const googleAuthUrl = `https://accounts.google.com/oauth/authorize?client_id=${googleProvider.clientId}&redirect_uri=${redirectUrl}&scope=openid%20email%20profile&response_type=code`;\n window.location.href = googleAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Google login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Google login failed.');\n }\n }\n\n loginWithApple() {\n try {\n // Apple 로그인 로직 구현\n // 실제 구현시에는 Apple Sign In JS SDK를 사용\n console.log('Apple login initiated');\n\n const appleProvider = this.socialLoginProviders.find((p) => p.name === 'apple');\n if (appleProvider?.clientId) {\n const redirectUrl = appleProvider.redirectUrl || window.location.origin;\n const appleAuthUrl = `https://appleid.apple.com/auth/authorize?client_id=${appleProvider.clientId}&redirect_uri=${redirectUrl}&scope=name%20email&response_type=code&response_mode=form_post`;\n window.location.href = appleAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Apple login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Apple login failed.');\n }\n }\n\n loginWithKakao() {\n try {\n // KakaoTalk 로그인 로직 구현\n // 실제 구현시에는 Kakao JavaScript SDK를 사용\n console.log('Kakao login initiated');\n\n const kakaoProvider = this.socialLoginProviders.find((p) => p.name === 'kakao');\n if (kakaoProvider?.clientId) {\n const redirectUrl = kakaoProvider.redirectUrl || window.location.origin;\n const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${kakaoProvider.clientId}&redirect_uri=${redirectUrl}&response_type=code&state=${encodeURIComponent(\n JSON.stringify(kakaoProvider.state || {}),\n )}`;\n window.location.href = kakaoAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Kakao login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Kakao login failed.');\n }\n }\n\n getSocialLoginIcon(provider: string): string {\n const icons = {\n google:\n '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 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 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 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 apple:\n 'M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z',\n kakao:\n 'M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z',\n };\n return icons[provider as keyof typeof icons] || '';\n }\n\n getSocialLoginLabel(provider: string): string {\n const labels = {\n google: 'Continue with Google',\n apple: 'Continue with Apple',\n kakao: 'Continue with KakaoTalk',\n };\n return labels[provider as keyof typeof labels] || `Continue with ${provider}`;\n }\n}\n","<div class=\"flex flex-col items-center justify-center h-full\">\n <!-- auth.component.html -->\n <div\n class=\"w-full max-w-md mx-auto mt-20 p-8 shadow-lg rounded-2xl bg-light-background dark:bg-dark-background\"\n >\n @switch (stage) {\n @case ('login') {\n <!-- 소셜 로그인 버튼들 -->\n @if (showSocialLogin && enabledSocialProviders.length > 0) {\n <div class=\"mb-6\">\n <div class=\"space-y-3\">\n <!-- Google 로그인 버튼 -->\n @if (isProviderEnabled('google')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-google\"\n (click)=\"loginWithGoogle()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-gray-300 rounded-lg shadow-sm bg-white hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Google SVG 아이콘 -->\n <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\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 fill=\"#4285F4\"\n />\n <path\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 fill=\"#34A853\"\n />\n <path\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 fill=\"#FBBC05\"\n />\n <path\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 fill=\"#EA4335\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('google') }}</span>\n </button>\n }\n\n <!-- Apple 로그인 버튼 -->\n @if (isProviderEnabled('apple')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-apple\"\n (click)=\"loginWithApple()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-black rounded-lg shadow-sm bg-black hover:bg-gray-900 dark:bg-black dark:hover:bg-gray-900 text-white transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Apple SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-white\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('apple') }}</span>\n </button>\n }\n\n <!-- Kakao 로그인 버튼 -->\n @if (isProviderEnabled('kakao')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-kakao\"\n (click)=\"loginWithKakao()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-yellow-400 rounded-lg shadow-sm bg-yellow-400 hover:bg-yellow-500 text-black transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Kakao SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-black\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('kakao') }}</span>\n </button>\n }\n </div>\n\n <!-- 구분선 -->\n @if (showDivider) {\n <div class=\"relative my-6\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300 dark:border-gray-600\"></div>\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span\n class=\"px-2 bg-light-background dark:bg-dark-background text-gray-500 dark:text-gray-400\"\n >or</span\n >\n </div>\n </div>\n }\n </div>\n }\n\n <!-- 로그인 -->\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-login-email\"\n type=\"email\"\n formControlName=\"email\"\n placeholder=\"Email\"\n />\n <haloduck-input\n data-testid=\"authenticate-login-password\"\n type=\"password\"\n formControlName=\"password\"\n placeholder=\"Password\"\n />\n <haloduck-button\n data-testid=\"authenticate-login-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"login()\"\n >Sign In</haloduck-button\n >\n </form>\n }\n @case ('signup') {\n <!-- 소셜 로그인 버튼들 (회원가입) -->\n @if (showSocialLogin && enabledSocialProviders.length > 0) {\n <div class=\"mb-6\">\n <div class=\"space-y-3\">\n <!-- Google 로그인 버튼 -->\n @if (isProviderEnabled('google')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-google\"\n (click)=\"loginWithGoogle()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-gray-300 rounded-lg shadow-sm bg-white hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Google SVG 아이콘 -->\n <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\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 fill=\"#4285F4\"\n />\n <path\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 fill=\"#34A853\"\n />\n <path\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 fill=\"#FBBC05\"\n />\n <path\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 fill=\"#EA4335\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('google') }}</span>\n </button>\n }\n\n <!-- Apple 로그인 버튼 -->\n @if (isProviderEnabled('apple')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-apple\"\n (click)=\"loginWithApple()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-black rounded-lg shadow-sm bg-black hover:bg-gray-900 dark:bg-black dark:hover:bg-gray-900 text-white transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Apple SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-white\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('apple') }}</span>\n </button>\n }\n\n <!-- Kakao 로그인 버튼 -->\n @if (isProviderEnabled('kakao')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-kakao\"\n (click)=\"loginWithKakao()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-yellow-400 rounded-lg shadow-sm bg-yellow-400 hover:bg-yellow-500 text-black transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Kakao SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-black\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{ getSocialLoginLabel('kakao') }}</span>\n </button>\n }\n </div>\n\n <!-- 구분선 -->\n @if (showDivider) {\n <div class=\"relative my-6\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300 dark:border-gray-600\"></div>\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span\n class=\"px-2 bg-light-background dark:bg-dark-background text-gray-500 dark:text-gray-400\"\n >or</span\n >\n </div>\n </div>\n }\n </div>\n }\n\n <!-- 회원가입 -->\n <form [formGroup]=\"signupForm\" (ngSubmit)=\"signup()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-signup-email\"\n type=\"email\"\n formControlName=\"email\"\n placeholder=\"Email\"\n />\n <haloduck-input\n data-testid=\"authenticate-signup-password\"\n type=\"password\"\n formControlName=\"password\"\n placeholder=\"Password\"\n />\n <haloduck-button data-testid=\"authenticate-signup-submit\" type=\"submit\" variant=\"primary\"\n >Sign Up</haloduck-button\n >\n </form>\n }\n @case ('reset') {\n <!-- 비밀번호 재설정 요청 -->\n <form [formGroup]=\"resetForm\" (ngSubmit)=\"reset()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-reset-email\"\n type=\"email\"\n formControlName=\"email\"\n placeholder=\"Email\"\n />\n <haloduck-button\n data-testid=\"authenticate-reset-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"reset()\"\n >Send Verification Code</haloduck-button\n >\n </form>\n }\n @case ('otpVerify') {\n <!-- OTP 인증 후 새 비밀번호 입력 -->\n <form [formGroup]=\"otpForm\" (ngSubmit)=\"verifyOtp()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-otp-code\"\n type=\"text\"\n formControlName=\"code\"\n placeholder=\"Verification Code\"\n />\n <haloduck-input\n data-testid=\"authenticate-otp-password\"\n type=\"password\"\n formControlName=\"newPassword\"\n placeholder=\"New password\"\n />\n <haloduck-button\n data-testid=\"authenticate-otp-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"verifyOtp()\"\n >Reset Password</haloduck-button\n >\n </form>\n }\n @case ('newPassword') {\n <!-- 임시 비밀번호 → 새 비밀번호 변경 -->\n <form\n [formGroup]=\"newPasswordForm\"\n (ngSubmit)=\"confirmNewPassword()\"\n class=\"flex flex-col gap-4\"\n >\n <haloduck-input\n data-testid=\"authenticate-new-password-password\"\n type=\"password\"\n formControlName=\"newPassword\"\n placeholder=\"New password\"\n >\n </haloduck-input>\n <div class=\"text-sm flex flex-col\">\n @for (rule of passwordRules; track rule.label) {\n <span\n [class.text-light-secondary]=\"rule.valid && passwordValue !== ''\"\n [class.line-through]=\"rule.valid && passwordValue !== ''\"\n [class.text-light-danger]=\"!rule.valid && passwordValue !== ''\"\n [class.text-light-inactive]=\"passwordValue === ''\"\n >\n {{ rule.valid ? '✔' : '✗' }} {{ rule.label }}\n </span>\n }\n </div>\n <haloduck-button\n data-testid=\"authenticate-new-password-submit\"\n type=\"submit\"\n (click)=\"confirmNewPassword()\"\n variant=\"primary\"\n [disabled]=\"!isPasswordValid\"\n >Change Password</haloduck-button\n >\n </form>\n }\n }\n\n <!-- 단계 전환 탭 -->\n <div class=\"flex flex-col items-center mt-6 gap-4\">\n <div class=\"flex justify-center gap-4\">\n @if (stage !== 'login') {\n <haloduck-button\n data-testid=\"authenticate-to-signin\"\n variant=\"none\"\n (click)=\"switchStage('login')\"\n >to Sign In</haloduck-button\n >\n }\n @if (stage !== 'signup') {\n <haloduck-button\n data-testid=\"authenticate-to-signup\"\n variant=\"none\"\n (click)=\"switchStage('signup')\"\n >to Sign Up</haloduck-button\n >\n }\n @if (stage !== 'reset' && stage !== 'otpVerify' && stage !== 'newPassword') {\n <haloduck-button\n data-testid=\"authenticate-to-reset-password\"\n variant=\"secondary\"\n (click)=\"switchStage('reset')\"\n >Reset Password</haloduck-button\n >\n }\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { signIn, fetchAuthSession } from 'aws-amplify/auth';\nimport { Hub } from 'aws-amplify/utils';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { NotificationService } from '../../layout/notification/notification.service';\n\nexport interface ProcessCognitoUserResponse {\n email: string;\n authResult: {\n AccessToken: string;\n ExpiresIn: number;\n IdToken: string;\n RefreshToken: string;\n TokenType: string;\n };\n}\n\n@Component({\n selector: 'haloduck-authenticate-callback',\n standalone: true,\n imports: [CommonModule, TranslocoModule],\n providers: [provideTranslocoScope('haloduck')],\n template: `\n <div\n class=\"flex flex-col items-center justify-center min-h-screen bg-light-background dark:bg-dark-background\"\n >\n <div\n class=\"w-full max-w-md mx-auto p-8 shadow-lg rounded-2xl bg-light-background dark:bg-dark-background\"\n >\n <div class=\"text-center\">\n @if (isProcessing) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"animate-spin rounded-full h-16 w-16 border-4 border-gray-300 border-t-blue-600 dark:border-gray-600 dark:border-t-blue-400\"\n ></div>\n </div>\n <div class=\"space-y-2\">\n <h2\n class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\"\n >\n {{ 'haloduck.ui.authenticate.Processing authentication' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ 'haloduck.ui.authenticate.Processing social login...' | transloco }}\n </p>\n </div>\n </div>\n }\n\n @if (error) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"w-16 h-16 mx-auto mb-4 flex items-center justify-center rounded-full bg-red-100 dark:bg-red-900/20\"\n >\n <svg\n class=\"w-8 h-8 text-red-600 dark:text-red-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"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 clip-rule=\"evenodd\"\n ></path>\n </svg>\n </div>\n </div>\n <div class=\"space-y-4\">\n <h2\n class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\"\n >\n {{ 'haloduck.ui.authenticate.Authentication failed' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ error && error.startsWith('haloduck.ui.') ? (error | transloco) : error }}\n </p>\n <button\n (click)=\"redirectToLogin()\"\n class=\"w-full inline-flex items-center justify-center px-4 py-3 border border-transparent text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 dark:focus:ring-blue-400 transition-colors duration-200\"\n >\n {{ 'haloduck.ui.authenticate.Back to login page' | transloco }}\n </button>\n </div>\n </div>\n }\n\n @if (success) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"w-16 h-16 mx-auto mb-4 flex items-center justify-center rounded-full bg-green-100 dark:bg-green-900/20\"\n >\n <svg\n class=\"w-8 h-8 text-green-600 dark:text-green-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n 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 ></path>\n </svg>\n </div>\n </div>\n <div class=\"space-y-4\">\n <h2\n class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\"\n >\n {{ 'haloduck.ui.authenticate.Authentication successful' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ 'haloduck.ui.authenticate.Social login completed.' | transloco }}\n </p>\n <div class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ 'haloduck.ui.authenticate.Redirecting automatically...' | transloco }}\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100vh;\n }\n `,\n ],\n})\nexport class AuthenticateCallbackComponent implements OnInit {\n private route = inject(ActivatedRoute);\n private router = inject(Router);\n private notificationService = inject(NotificationService);\n\n isProcessing = true;\n error: string | null = null;\n success = false;\n\n ngOnInit(): void {\n this.handleSocialCallback();\n }\n\n private async handleSocialCallback(): Promise<void> {\n try {\n // URL의 쿼리 파라미터에서 data 추출\n const queryParams = this.route.snapshot.queryParams;\n const encodedData = queryParams['data'];\n\n if (!encodedData) {\n throw new Error('ui.authenticate.Social login data not found.');\n }\n\n // Base64 디코딩\n const decodedData = this.decodeBase64(encodedData);\n const cognitoUserResponse: ProcessCognitoUserResponse = JSON.parse(decodedData);\n\n // Amplify 로그인 처리\n await this.processAmplifyLogin(cognitoUserResponse);\n\n this.success = true;\n this.isProcessing = false;\n\n this.notificationService.showNotification('success', '소셜 로그인이 완료되었습니다.', 3000);\n\n // 로그인 성공 후 리다이렉트\n setTimeout(() => {\n this.redirectAfterLogin();\n }, 500);\n } catch (error) {\n console.error('Social callback error:', error);\n this.error = error instanceof Error ? error.message : '로그인 처리 중 오류가 발생했습니다.';\n this.isProcessing = false;\n\n this.notificationService.showNotification('error', this.error);\n }\n }\n\n private decodeBase64(encodedString: string): string {\n try {\n // URL-safe base64 디코딩을 위해 문자 치환\n const base64String = encodedString.replace(/-/g, '+').replace(/_/g, '/');\n\n // 패딩 추가 (필요한 경우)\n const padding = base64String.length % 4;\n const paddedString = padding ? base64String + '='.repeat(4 - padding) : base64String;\n\n return atob(paddedString);\n } catch (error) {\n throw new Error('ui.authenticate.Invalid data format.');\n }\n }\n\n private async processAmplifyLogin(\n cognitoUserResponse: ProcessCognitoUserResponse,\n ): Promise<void> {\n try {\n console.log('Processing Amplify login with:', {\n email: cognitoUserResponse.email,\n hasAuthResult: !!cognitoUserResponse.authResult,\n });\n\n if (cognitoUserResponse.authResult) {\n const { AccessToken, IdToken, RefreshToken } = cognitoUserResponse.authResult;\n\n // Cognito 토큰을 로컬스토리지에 저장 (Amplify가 사용할 수 있는 형태로)\n const keyPrefix = `CognitoIdentityServiceProvider.${await this.getClientId()}`;\n const username = cognitoUserResponse.email;\n\n // Amplify가 인식할 수 있는 형태로 토큰들을 저장\n localStorage.setItem(`${keyPrefix}.${username}.accessToken`, AccessToken);\n localStorage.setItem(`${keyPrefix}.${username}.idToken`, IdToken);\n localStorage.setItem(`${keyPrefix}.${username}.refreshToken`, RefreshToken);\n localStorage.setItem(`${keyPrefix}.LastAuthUser`, username);\n localStorage.setItem(`${keyPrefix}.${username}.tokenScopesAccepted`, '1');\n\n // Amplify Hub를 통해 인증 상태 변경 알림\n Hub.dispatch('auth', {\n event: 'signedIn',\n data: {\n username: cognitoUserResponse.email,\n signInDetails: {\n loginId: cognitoUserResponse.email,\n authFlowType: 'CUSTOM_AUTH',\n },\n },\n });\n\n // 세션 새로고침을 통해 Amplify가 토큰을 인식하도록 함\n try {\n await fetchAuthSession({ forceRefresh: true });\n } catch (sessionError) {\n console.warn('Session refresh failed, but tokens are stored:', sessionError);\n }\n }\n } catch (error) {\n console.error('Amplify login processing error:', error);\n throw new Error('ui.authenticate.Authentication processing failed.');\n }\n }\n\n private async getClientId(): Promise<string> {\n // Amplify 설정에서 클라이언트 ID를 가져오는 로직\n // 실제 환경에서는 Amplify.configure에서 설정된 값을 사용\n try {\n const { Amplify } = await import('aws-amplify');\n const config = Amplify.getConfig();\n return config.Auth?.Cognito?.userPoolClientId || 'default-client-id';\n } catch {\n // fallback - 환경변수나 설정파일에서 가져올 수 있습니다\n return 'default-client-id';\n }\n }\n\n public redirectToLogin(): void {\n // 로그인 페이지로 리다이렉트 (라우트는 실제 애플리케이션에 맞게 조정)\n this.router.navigate(['/auth/login']);\n }\n\n private redirectAfterLogin(): void {\n // 로그인 성공 후 리다이렉트할 페이지\n // returnUrl이 있으면 그곳으로, 없으면 기본 페이지로\n const returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';\n this.router.navigate([returnUrl]);\n }\n}\n","import { Component, EventEmitter, Input, Output, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { FormsModule } from '@angular/forms';\n\nexport interface Option {\n id?: string;\n value: string;\n isSticky?: boolean;\n isExclusive?: boolean;\n shouldManualInput?: boolean;\n manualPrefix?: string;\n}\n\n@Component({\n selector: 'haloduck-select-dropdown',\n imports: [TranslocoModule, FormsModule],\n templateUrl: './select-dropdown.component.html',\n styleUrl: './select-dropdown.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class SelectDropdownComponent {\n protected _filteredOptions = signal([] as Option[]);\n protected _options: Option[] = [];\n protected _selectedOptionIds: string[] = [];\n protected manualInputValues: Record<string, string> = {};\n protected activeManualKey: string | null = null;\n protected isComposing: boolean = false;\n\n @Output() selectedChange = new EventEmitter<string[]>();\n @Output() closeDropdown = new EventEmitter<void>();\n @Input() useFilter: boolean = false;\n @Input() multiselect: boolean = true;\n @Input() atLeastOne: boolean = false;\n @Input() asButton: boolean = false;\n @Input() set options(value: Option[] | null) {\n this._options = value || [];\n this._filteredOptions.set(this._options);\n this.seedManualInputs();\n }\n get options(): Option[] | null {\n return this._filteredOptions();\n }\n @Input() set selectedOptionIds(value: string[] | null) {\n this._selectedOptionIds = value || [];\n this.seedManualInputs();\n }\n get selectedOptions(): string[] | null {\n return this._selectedOptionIds;\n }\n\n onFilterInput(event: Event) {\n const value = (event.target as HTMLInputElement).value.toLowerCase();\n this._filteredOptions.set(\n this._options.filter(\n (opt) => opt.value.toLowerCase().includes(value) || opt.isSticky === true,\n ),\n );\n }\n\n onToggleOption(option: Option) {\n if (this.asButton) {\n this.setSelected([option.id || option.value]);\n return;\n }\n\n // Handle manual input option\n if (option.shouldManualInput) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n const typed = (this.manualInputValues[key] || '').trim();\n const isSelected = this.isOptionSelected(option);\n\n if (isSelected) {\n // Deselect current manual value\n if (this.multiselect) {\n let next: string[];\n if (prefix) {\n next = this._selectedOptionIds.filter((id) => !id.startsWith(prefix));\n } else {\n next = this._selectedOptionIds.filter((id) => id !== typed);\n }\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n // Clear input text when deselected\n this.manualInputValues[key] = '';\n // Hide input\n this.activeManualKey = null;\n } else {\n // open manual input and handle selection based on mode\n this.activeManualKey = key;\n\n // In single select mode, clear existing selections first\n if (!this.multiselect) {\n const sentinel = option.id || option.value;\n this.setSelected([sentinel]);\n }\n\n // ensure there is an entry in manualInputValues\n if (this.manualInputValues[key] === undefined) {\n this.manualInputValues[key] = '';\n }\n // focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n return;\n }\n\n // Non-manual options\n if (this.multiselect) {\n const id = option.id || option.value;\n if (option.isExclusive) {\n if (this._selectedOptionIds.includes(id)) {\n this.setSelected([]);\n } else {\n this.setSelected([id]);\n }\n } else {\n // remove any exclusive selections\n let next = this._selectedOptionIds.filter((selectedId) => !this.isIdExclusive(selectedId));\n if (!next.includes(id)) {\n next = [id, ...next];\n } else {\n next = next.filter((x) => x !== id);\n }\n this.setSelected(next);\n }\n } else {\n const id = option.id || option.value;\n if (this.atLeastOne) {\n this.setSelected([id]);\n } else {\n if (this._selectedOptionIds.includes(id)) {\n this.setSelected([]);\n } else {\n this.setSelected([id]);\n }\n }\n }\n }\n\n onEditManualInput(option: Option): void {\n const key = this.getManualKey(option);\n this.activeManualKey = key;\n\n // focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n\n getManualInputDisplayValue(option: Option): string {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n\n // manualInputValues에 저장된 값 확인\n const storedValue = this.manualInputValues[key];\n if (storedValue && storedValue.trim() !== '') {\n return storedValue;\n }\n\n // selectedOptionIds에서 prefix가 붙은 값 찾기\n if (prefix) {\n const found = this._selectedOptionIds.find(\n (id) => typeof id === 'string' && id.startsWith(prefix) && id.length > prefix.length,\n );\n if (found) {\n return found.substring(prefix.length);\n }\n }\n\n return '';\n }\n\n isOptionSelected(option: Option): boolean {\n const id = option.id || option.value;\n if (option.shouldManualInput) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix;\n const sentinel = option.id || option.value;\n\n // Check if this manual input option is currently active\n const isActive = this.activeManualKey === key;\n\n // Check if sentinel is selected (means option is selected but no manual value)\n const hasSentinel = this._selectedOptionIds.includes(sentinel);\n\n if (prefix) {\n // selected if there exists a value with prefix OR sentinel is selected OR if it's currently active\n const hasValueWithPrefix = this._selectedOptionIds.some(\n (selectedId) =>\n typeof selectedId === 'string' &&\n selectedId.startsWith(prefix) &&\n selectedId.length > prefix.length,\n );\n return hasValueWithPrefix || hasSentinel || isActive;\n }\n // no prefix: consider selected if any selected id equals current typed value (non-empty) OR sentinel OR if it's active\n const typed = (this.manualInputValues[key] || '').trim();\n const hasTypedValue = typed !== '' && this._selectedOptionIds.includes(typed);\n return hasTypedValue || hasSentinel || isActive;\n }\n return this._selectedOptionIds.includes(id);\n }\n\n private isIdExclusive(id: string): boolean {\n for (const o of this._options) {\n if (!o.isExclusive) continue;\n const refId = o.id || o.value;\n if (refId === id) return true;\n if (o.shouldManualInput && o.manualPrefix && id?.startsWith(o.manualPrefix)) {\n return true;\n }\n }\n return false;\n }\n\n private getManualKey(option: Option): string {\n return option.id || option.value;\n }\n\n private seedManualInputs(): void {\n const manualOptions = this._options.filter((o) => o.shouldManualInput);\n for (const opt of manualOptions) {\n const prefix = opt.manualPrefix || '';\n const key = this.getManualKey(opt);\n const existingWithPrefix = this._selectedOptionIds.find((id) =>\n prefix ? id?.startsWith(prefix) : false,\n );\n const value = existingWithPrefix ? existingWithPrefix.substring(prefix.length) : '';\n this.manualInputValues[key] = value;\n }\n }\n\n onManualInputChange(option: Option, value: string) {\n // IME 조합 중이면 업데이트하지 않음\n if (this.isComposing) {\n return;\n }\n\n const key = this.getManualKey(option);\n this.manualInputValues[key] = value;\n\n // 타이핑 중에는 실시간으로 선택 상태 업데이트\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const trimmed = (value || '').trim();\n\n if (this.multiselect) {\n if (option.isExclusive) {\n if (trimmed === '') {\n // 빈 값일 때는 sentinel만 유지 (선택은 유지하되 값은 없음)\n this.setSelected([sentinel]);\n } else {\n this.setSelected([`${prefix}${trimmed}`]);\n }\n } else {\n let next = this._selectedOptionIds.filter((id) => !this.isIdExclusive(id));\n // sentinel과 prefix로 시작하는 값 모두 제거\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n\n if (trimmed !== '') {\n const toAdd = `${prefix}${trimmed}`;\n next = [toAdd, ...next];\n } else {\n // 빈 값일 때는 sentinel만 추가\n next = [sentinel, ...next];\n }\n this.setSelected(next);\n }\n } else {\n // single select\n if (trimmed === '') {\n // 빈 값일 때는 sentinel만 유지 (선택은 유지하되 값은 없음)\n this.setSelected([sentinel]);\n } else {\n this.setSelected([`${prefix}${trimmed}`]);\n }\n }\n }\n\n onCompositionStart(): void {\n this.isComposing = true;\n }\n\n onCompositionEnd(option: Option, event: Event): void {\n this.isComposing = false;\n const target = event.target as HTMLInputElement;\n this.onManualInputChange(option, target.value);\n }\n\n onManualInputKeydown(option: Option, event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n // IME 조합 중이면 아무것도 하지 않음\n if (this.isComposing) {\n return;\n }\n event.preventDefault();\n // 약간의 지연을 두어 compositionend 이벤트가 먼저 처리되도록 함\n setTimeout(() => {\n this.onManualInputConfirm(option);\n }, 10);\n }\n }\n\n onManualInputConfirm(option: Option) {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n\n // 입력값이 비어있으면 선택 해제\n if (raw === '') {\n this.activeManualKey = null;\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this._selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n } else {\n // 입력값이 있으면 정상 처리\n this.onManualInputChange(option, raw);\n // 입력창 닫기\n this.activeManualKey = null;\n }\n\n // Close dropdown in single select mode after confirming input\n if (!this.multiselect) {\n this.closeDropdown.emit();\n }\n }\n\n onManualInputBlur(option: Option) {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n\n // 입력값이 비어있으면 선택 해제\n if (raw === '') {\n this.activeManualKey = null;\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this._selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n }\n // 입력값이 있으면 아무것도 하지 않음 (이미 onManualInputChange에서 처리됨)\n }\n\n private emitSelectedChange(): void {\n const payload = [...this._selectedOptionIds];\n setTimeout(() => this.selectedChange.emit(payload));\n }\n\n private setSelected(next: string[]): void {\n const sanitized = next.filter((id) => id != null);\n this._selectedOptionIds = sanitized;\n this.emitSelectedChange();\n }\n}\n","<div\n id=\"dropdown\"\n class=\"max-w-full mt-2 absolute z-40 bg-light-background dark:bg-dark-background text-light-on-background dark:text-dark-on-background border border-light-inactive dark:border-dark-inactive rounded max-h-60 flex flex-col gap-2\"\n>\n @if (useFilter && _options.length >= 5) {\n <input\n #inputFilter\n id=\"inputFilter\"\n type=\"text\"\n [placeholder]=\"'haloduck.ui.select.Keyword...' | transloco\"\n (input)=\"onFilterInput($event)\"\n class=\"text-light-inactive dark:text-dark-inactive rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-3 py-1.5 text-sm/6 bg-light-control dark:bg-dark-control m-2\"\n />\n }\n <div class=\"overflow-y-auto\">\n @for (option of _filteredOptions(); track option.id ? option.id : option.value) {\n <div\n class=\"px-3 py-2 text-sm/6 hover:bg-light-secondary/60 dark:hover:bg-dark-secondary/60 flex items-center justify-start whitespace-nowrap\"\n [class.cursor-pointer]=\"!option.shouldManualInput\"\n (click)=\"!option.shouldManualInput && onToggleOption(option)\"\n >\n @if (!asButton) {\n @if (isOptionSelected(option)) {\n <svg\n class=\"w-4 h-4 text-light-primary dark:text-dark-primary inline-block mr-2 cursor-pointer\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n (click)=\"\n option.shouldManualInput && $event.stopPropagation();\n option.shouldManualInput && onToggleOption(option)\n \"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 00-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n } @else {\n <div class=\"w-4 h-4 inline-block mr-2\"></div>\n }\n }\n @if (option.shouldManualInput && activeManualKey === (option.id || option.value)) {\n <input\n type=\"text\"\n [(ngModel)]=\"manualInputValues[option.id || option.value]\"\n [attr.data-manual-key]=\"option.id || option.value\"\n (ngModelChange)=\"onManualInputChange(option, $event)\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd(option, $event)\"\n (click)=\"$event.stopPropagation()\"\n (blur)=\"onManualInputBlur(option)\"\n (keydown)=\"onManualInputKeydown(option, $event)\"\n class=\"text-light-on-control dark:text-dark-on-control rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-2 py-1 text-sm/6 bg-light-control dark:bg-dark-control w-full\"\n />\n } @else if (option.shouldManualInput) {\n <span\n class=\"cursor-pointer flex-1\"\n (click)=\"$event.stopPropagation(); onEditManualInput(option)\"\n >\n {{ getManualInputDisplayValue(option) || option.value }}\n </span>\n } @else {\n {{ option.value }}\n }\n </div>\n }\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n Output,\n signal,\n ViewChild,\n ChangeDetectorRef,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\nimport { Option } from './select-dropdown/select-dropdown.component';\nimport { CommonModule } from '@angular/common';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ViewContainerRef } from '@angular/core';\nimport { SelectDropdownComponent } from './select-dropdown/select-dropdown.component';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\n@Component({\n selector: 'haloduck-select',\n imports: [CommonModule, FormsModule],\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class SelectComponent implements ControlValueAccessor, AfterViewInit, OnChanges {\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private overlayRef: OverlayRef | null = null;\n\n // Generate unique ID for radio button grouping\n private static instanceCounter = 0;\n readonly radioGroupName = `haloduck-select-radio-${++SelectComponent.instanceCounter}`;\n\n @Output() selectedChange = new EventEmitter<string[] | string>();\n @Input() disabled: boolean | null = false;\n @Input() loading: boolean = false;\n @Input() variant: 'primary' | 'secondary' | 'danger' | 'none' = 'none';\n @Input() asButton: boolean = false;\n @Input() useIcon: boolean = false;\n @Input() useFilter: boolean = false;\n @Input() multiselect: boolean = true;\n @Input() placeholder: string = '';\n @Input() atLeastOne: boolean = false;\n @Input() showAll: boolean = false;\n @Input() showAllItems: boolean = false;\n @Input() options: Option[] | null = null;\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() labelWidth: string = '';\n @Input() set value(value: string[] | string) {\n this.writeValue(value);\n this.onChange(this.getSelectedValue());\n }\n get value(): string | string[] | null {\n if (this.multiselect) {\n return this.selectedOptionIds;\n } else {\n if (this.selectedOptionIds.length === 0) {\n return null;\n }\n return this.selectedOptionIds[0];\n }\n }\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n @ViewChild('label') label!: ElementRef;\n\n isDropdownOpen = signal(false);\n\n selectedOptionIds: string[] = [];\n displayedSelectedOptions: Option[] = [];\n private selectedIdToDisplayOption: Record<string, Option> = {};\n\n // Manual input support for inline mode\n manualInputValues: Record<string, string> = {};\n activeManualKey: string | null = null;\n isComposing: boolean = false; // IME 조합 중 여부\n\n onClick(event: MouseEvent) {\n if (this.disabled || this.showAllItems) {\n return;\n }\n\n const originWidth = this.origin?.nativeElement?.offsetWidth || 0;\n\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n minWidth: originWidth,\n });\n\n this.overlayRef.backdropClick().subscribe(() => {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n });\n }\n\n if (!this.overlayRef.hasAttached()) {\n const portal = new ComponentPortal(SelectDropdownComponent, this.viewContainerRef);\n const componentRef: ComponentRef<SelectDropdownComponent> = this.overlayRef.attach(portal);\n componentRef.instance.options = this.options;\n componentRef.instance.selectedOptionIds = this.selectedOptionIds;\n componentRef.instance.useFilter = this.useFilter;\n componentRef.instance.multiselect = this.multiselect;\n componentRef.instance.atLeastOne = this.atLeastOne;\n componentRef.instance.asButton = this.asButton;\n\n componentRef.instance.selectedChange.subscribe((selectedOptionIds) => {\n const payload = Array.isArray(selectedOptionIds)\n ? [...selectedOptionIds]\n : selectedOptionIds;\n setTimeout(() => {\n this.selectedOptionIds = payload as string[];\n\n // Clear manual input values when selecting different options in dropdown mode\n if (!this.showAllItems) {\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const key = this.getManualKey(manualOpt);\n const prefix = manualOpt.manualPrefix || '';\n const sentinel = manualOpt.id || manualOpt.value;\n\n // Check if this manual option is still selected\n const isStillSelected = prefix\n ? this.selectedOptionIds.some(\n (id) => typeof id === 'string' && id.startsWith(prefix),\n )\n : this.selectedOptionIds.includes(sentinel);\n\n // If not selected, clear the manual input value\n if (!isStillSelected) {\n this.manualInputValues[key] = '';\n }\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n this.selectedChange.emit(payload);\n this.cdr.markForCheck();\n\n // Keep dropdown open if a manual-input option is selected (to allow typing)\n const shouldKeepOpenForManual = this.isManualSelection(this.selectedOptionIds);\n if (!this.multiselect && !shouldKeepOpenForManual) {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n }\n });\n });\n\n componentRef.instance.closeDropdown.subscribe(() => {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n });\n\n this.isDropdownOpen.set(true);\n } else {\n this.isDropdownOpen.set(false);\n this.overlayRef.detach();\n }\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (this.disabled) {\n return;\n }\n\n if (event.key === 'Enter') {\n }\n }\n\n onDeselectOption(event: Event, option: Option) {\n if (this.disabled) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n\n this.selectedOptionIds = this.selectedOptionIds.filter(\n (selected) => selected !== (option.id || option.value),\n );\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n this.selectedChange.emit(this.selectedOptionIds);\n\n this.isDropdownOpen.set(false);\n }\n\n onToggleOption(option: Option) {\n if (this.disabled) {\n return;\n }\n\n // Handle manual input option\n if (option.shouldManualInput && this.showAllItems) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const typed = (this.manualInputValues[key] || '').trim();\n const isSelected = this.isOptionSelected(option);\n\n if (isSelected) {\n // Already selected - handle toggle based on mode\n if (this.multiselect) {\n // Checkbox: always deselect when clicked again\n let next: string[];\n if (prefix) {\n // Remove all IDs that start with prefix AND the sentinel\n next = this.selectedOptionIds.filter((id) => !id.startsWith(prefix) && id !== sentinel);\n } else {\n // Remove typed value AND the sentinel\n next = this.selectedOptionIds.filter((id) => id !== typed && id !== sentinel);\n }\n this.selectedOptionIds = next;\n // Clear input text when deselected\n this.manualInputValues[key] = '';\n // Hide input\n this.activeManualKey = null;\n } else {\n // Radio: deselect only if there's no typed content\n if (typed === '') {\n this.selectedOptionIds = [];\n this.manualInputValues[key] = '';\n this.activeManualKey = null;\n } else {\n // Has typed content - keep selected, do nothing\n return;\n }\n }\n } else {\n // Open manual input\n this.activeManualKey = key;\n\n // In single select mode, clear existing selections first\n if (!this.multiselect) {\n this.selectedOptionIds = [sentinel];\n } else {\n // In multiselect mode, add sentinel if not already present\n if (!this.selectedOptionIds.includes(sentinel)) {\n this.selectedOptionIds = [sentinel, ...this.selectedOptionIds];\n }\n }\n\n // Ensure there is an entry in manualInputValues\n if (this.manualInputValues[key] === undefined) {\n this.manualInputValues[key] = '';\n }\n\n // Focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n return;\n }\n\n const id = option.id || option.value;\n\n if (this.multiselect) {\n if (option.isExclusive) {\n // Exclusive option: toggle between only this option or none\n if (this.selectedOptionIds.includes(id)) {\n this.selectedOptionIds = [];\n } else {\n this.selectedOptionIds = [id];\n\n // Clear all manual input values when selecting exclusive option\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const key = this.getManualKey(manualOpt);\n this.manualInputValues[key] = '';\n }\n this.activeManualKey = null;\n }\n } else {\n // Non-exclusive option: remove any exclusive selections first\n let next = this.selectedOptionIds.filter((selectedId) => !this.isIdExclusive(selectedId));\n\n if (next.includes(id)) {\n // Deselect\n next = next.filter((selected) => selected !== id);\n } else {\n // Select\n next = [id, ...next];\n }\n this.selectedOptionIds = next;\n }\n } else {\n // Single select mode\n\n // Clear manual input values when selecting different option\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const manualKey = this.getManualKey(manualOpt);\n const manualSentinel = manualOpt.id || manualOpt.value;\n const manualPrefix = manualOpt.manualPrefix || '';\n\n // Check if selecting a different option (not the manual input option itself)\n const isSelectingDifferent =\n id !== manualSentinel && !(manualPrefix && id.startsWith(manualPrefix));\n\n if (isSelectingDifferent) {\n this.manualInputValues[manualKey] = '';\n this.activeManualKey = null;\n }\n }\n\n if (this.atLeastOne) {\n this.selectedOptionIds = [id];\n } else {\n if (this.selectedOptionIds.includes(id)) {\n this.selectedOptionIds = [];\n } else {\n this.selectedOptionIds = [id];\n }\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n\n isOptionSelected(option: Option): boolean {\n const id = option.id || option.value;\n\n if (option.shouldManualInput && this.showAllItems) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix;\n const sentinel = option.id || option.value;\n\n if (prefix) {\n const hasValueWithPrefix = this.selectedOptionIds.some(\n (selectedId) =>\n typeof selectedId === 'string' &&\n selectedId.startsWith(prefix) &&\n selectedId.length > prefix.length,\n );\n return hasValueWithPrefix;\n }\n\n const typed = (this.manualInputValues[key] || '').trim();\n // Only consider selected if there's actual typed value, not just sentinel\n if (typed !== '') {\n return this.selectedOptionIds.includes(typed);\n }\n // If no typed value, check if there's only sentinel (which means just activated but not typed yet)\n const hasSentinel = this.selectedOptionIds.includes(sentinel);\n const hasOnlySentinel =\n hasSentinel &&\n !this.selectedOptionIds.some(\n (id) => id !== sentinel && (prefix ? id.startsWith(prefix) : false),\n );\n return hasOnlySentinel;\n }\n\n return this.selectedOptionIds.includes(id);\n }\n\n private isIdExclusive(id: string): boolean {\n const options = this.options || [];\n for (const o of options) {\n if (!o.isExclusive) continue;\n const refId = o.id || o.value;\n if (refId === id) return true;\n }\n return false;\n }\n\n getSelectedValue(): string | string[] | null {\n if (!this.multiselect) {\n if (this.selectedOptionIds.length > 0) {\n return this.selectedOptionIds[0];\n } else {\n return null;\n }\n } else {\n return this.selectedOptionIds;\n }\n }\n\n onChange = (_value: any) => {};\n onTouched = () => {};\n\n writeValue(value: string[] | string): void {\n if (Array.isArray(value)) {\n this.selectedOptionIds = value.filter((id) => id !== null && id !== undefined && id !== '');\n } else {\n this.selectedOptionIds = value !== null && value !== undefined && value !== '' ? [value] : [];\n }\n this.recomputeSelectedOptions();\n }\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.select.Select...', {}, 'haloduck')\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['options']) {\n this.recomputeSelectedOptions();\n if (this.showAllItems) {\n this.seedManualInputs();\n }\n }\n }\n\n private recomputeSelectedOptions(): void {\n const options = this.options || [];\n const result: Option[] = [];\n const nextMap: Record<string, Option> = {};\n\n const selectedIds = [...this.selectedOptionIds];\n const consumed = new Set<string>();\n\n const resolveDisplayForId = (selectedId: string): Option => {\n // 1) exact match by id or value\n const exact = options.find((opt) => (opt.id || opt.value) === selectedId);\n if (exact) {\n return exact;\n }\n // 2) manual prefix match → create synthetic option for display\n const manual = options.find((opt) => {\n if (!opt.shouldManualInput) return false;\n if (opt.manualPrefix) {\n return selectedId.startsWith(opt.manualPrefix);\n }\n // when no prefix, match by sentinel id/value\n return (opt.id || opt.value) === selectedId;\n });\n if (manual) {\n const cached = this.selectedIdToDisplayOption[selectedId];\n return cached || { ...manual, id: selectedId, value: selectedId };\n }\n // 3) fallback when options array is missing the corresponding option definition\n const cached = this.selectedIdToDisplayOption[selectedId];\n return cached || { id: selectedId, value: selectedId };\n };\n\n if (this.multiselect) {\n // Order by options sequence first\n for (const opt of options) {\n if (opt.shouldManualInput) {\n const manualId = opt.manualPrefix\n ? selectedIds.find((id) => id.startsWith(opt.manualPrefix as string))\n : selectedIds.find((id) => id === (opt.id || opt.value));\n if (manualId) {\n const display = resolveDisplayForId(manualId);\n result.push(display);\n nextMap[manualId] = display;\n consumed.add(manualId);\n }\n } else {\n const id = opt.id || opt.value;\n if (selectedIds.includes(id)) {\n const display = resolveDisplayForId(id);\n result.push(display);\n nextMap[id] = display;\n consumed.add(id);\n }\n }\n }\n // Append any remaining selected ids in their existing order\n for (const selectedId of selectedIds) {\n if (consumed.has(selectedId)) continue;\n const display = resolveDisplayForId(selectedId);\n result.push(display);\n nextMap[selectedId] = display;\n }\n } else {\n // Single select: keep as-is (only one item), but still resolve display\n for (const selectedId of selectedIds) {\n const display = resolveDisplayForId(selectedId);\n result.push(display);\n nextMap[selectedId] = display;\n }\n }\n\n this.displayedSelectedOptions = result;\n this.selectedIdToDisplayOption = nextMap;\n }\n\n private isManualSelection(selectedIds: string[]): boolean {\n const options = this.options || [];\n for (const id of selectedIds) {\n const manual = options.find((opt) => opt.shouldManualInput);\n if (!manual) continue;\n if (manual.manualPrefix) {\n if (id.startsWith(manual.manualPrefix)) return true;\n // allow initial sentinel selection to keep open\n if ((manual.id || manual.value) === id) return true;\n } else {\n if ((manual.id || manual.value) === id) return true;\n }\n }\n return false;\n }\n\n getManualKey(option: Option): string {\n // Use option.id or option.value as the unique key\n // This ensures each manual input option has a unique key\n // even if they have the same manualPrefix\n return option.id || option.value;\n }\n\n seedManualInputs(): void {\n const options = this.options || [];\n const manualOptions = options.filter((o) => o.shouldManualInput);\n for (const opt of manualOptions) {\n const prefix = opt.manualPrefix || '';\n const key = this.getManualKey(opt);\n const existingWithPrefix = this.selectedOptionIds.find((id) =>\n prefix ? id?.startsWith(prefix) : false,\n );\n const value = existingWithPrefix ? existingWithPrefix.substring(prefix.length) : '';\n this.manualInputValues[key] = value;\n }\n }\n\n onManualInputChange(option: Option, value: string): void {\n // IME 조합 중이면 업데이트하지 않음\n if (this.isComposing) {\n return;\n }\n\n const key = this.getManualKey(option);\n this.manualInputValues[key] = value;\n\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const trimmed = (value || '').trim();\n\n if (this.multiselect) {\n if (option.isExclusive) {\n if (trimmed === '') {\n this.selectedOptionIds = [sentinel];\n } else {\n this.selectedOptionIds = [`${prefix}${trimmed}`];\n }\n } else {\n let next = this.selectedOptionIds.filter((id) => !this.isIdExclusive(id));\n next = next.filter((id) => (prefix ? !id.startsWith(prefix) : id !== sentinel));\n if (trimmed !== '') {\n const toAdd = `${prefix}${trimmed}`;\n if (!next.includes(toAdd)) {\n next = [toAdd, ...next];\n }\n } else {\n if (!next.includes(sentinel)) {\n next = [sentinel, ...next];\n }\n }\n this.selectedOptionIds = next;\n }\n } else {\n if (trimmed === '') {\n this.selectedOptionIds = [sentinel];\n } else {\n this.selectedOptionIds = [`${prefix}${trimmed}`];\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n\n onCompositionStart(): void {\n this.isComposing = true;\n }\n\n onCompositionEnd(option: Option, event: Event): void {\n this.isComposing = false;\n // 조합이 끝나면 최종 값으로 업데이트\n const target = event.target as HTMLInputElement;\n this.onManualInputChange(option, target.value);\n }\n\n onManualInputKeydown(option: Option, event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n // IME 조합 중이면 아무것도 하지 않음 (compositionend가 처리)\n if (this.isComposing) {\n return;\n }\n event.preventDefault();\n // 약간의 지연을 두어 compositionend 이벤트가 먼저 처리되도록 함\n setTimeout(() => {\n this.onManualInputBlur(option);\n }, 10);\n }\n }\n\n onManualInputBlur(option: Option): void {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n if (raw === '') {\n this.activeManualKey = null;\n\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this.selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.selectedOptionIds = next;\n } else {\n this.selectedOptionIds = [];\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n }\n}\n","<div\n class=\"flex gap-2 items-center w-full\"\n [ngClass]=\"{ 'flex-col items-start': layout === 'vertical' }\"\n>\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control {{\n labelWidth\n }}\"\n [ngClass]=\"{ 'w-full': layout === 'vertical' }\"\n >\n <!-- <ng-content select=\"[slot=label]\"></ng-content> -->\n <ng-content></ng-content>\n </label>\n\n @if (showAllItems) {\n <!-- Inline options display -->\n <div class=\"w-full flex-1\">\n @if (loading) {\n <div class=\"flex-1 flex items-center gap-2 w-full h-3\">\n <div class=\"animate-pulse bg-light-inactive dark:bg-dark-inactive rounded-md h-5 w-full\">\n \n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (option of options; track option.id || option.value) {\n <label\n class=\"flex items-center gap-2 text-sm/6 text-light-on-control dark:text-dark-on-control cursor-pointer\"\n [ngClass]=\"{\n 'opacity-60 cursor-not-allowed': disabled,\n }\"\n (click)=\"$event.preventDefault()\"\n >\n @if (multiselect) {\n <!-- Checkbox for multiselect -->\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(option)\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && onToggleOption(option)\"\n class=\"appearance-none w-5 h-5 rounded bg-light-control dark:bg-dark-control border-2 border-light-inactive dark:border-dark-inactive cursor-pointer disabled:cursor-not-allowed checked:bg-light-primary checked:dark:bg-dark-primary checked:border-light-primary checked:dark:border-dark-primary relative before:content-[''] before:absolute before:inset-0 before:bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEgNEw0LjUgNy41TDExIDEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+')] before:bg-center before:bg-no-repeat before:opacity-0 checked:before:opacity-100\"\n />\n } @else {\n <!-- Radio button for single select -->\n <input\n type=\"radio\"\n [checked]=\"isOptionSelected(option)\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && onToggleOption(option)\"\n [name]=\"radioGroupName\"\n class=\"appearance-none w-5 h-5 rounded-full bg-light-control dark:bg-dark-control border-2 border-light-inactive dark:border-dark-inactive cursor-pointer disabled:cursor-not-allowed checked:bg-light-primary checked:dark:bg-dark-primary checked:border-light-primary checked:dark:border-dark-primary relative before:content-[''] before:absolute before:inset-[4px] before:rounded-full before:bg-light-on-primary before:dark:bg-dark-on-primary before:opacity-0 checked:before:opacity-100\"\n />\n }\n @if (\n option.shouldManualInput &&\n (isOptionSelected(option) || activeManualKey === (option.id || option.value))\n ) {\n <input\n type=\"text\"\n [(ngModel)]=\"manualInputValues[option.id || option.value]\"\n [attr.data-manual-key]=\"option.id || option.value\"\n (ngModelChange)=\"onManualInputChange(option, $event)\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd(option, $event)\"\n (click)=\"$event.stopPropagation()\"\n (blur)=\"onManualInputBlur(option)\"\n (keydown)=\"onManualInputKeydown(option, $event)\"\n [disabled]=\"!!disabled\"\n class=\"flex-1 text-light-on-control dark:text-dark-on-control rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-2 py-1 text-sm/6 bg-light-control dark:bg-dark-control\"\n />\n } @else {\n <span (click)=\"!disabled && onToggleOption(option)\">{{ option.value }}</span>\n }\n </label>\n }\n </div>\n }\n </div>\n } @else {\n <!-- Original dropdown display -->\n <div\n #origin\n class=\"w-full flex-1 relative overflow-visible rounded-md outline outline-light-inactive dark:outline-dark-inactive text-sm/6\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary focus:dark:outline-dark-primary':\n !disabled,\n 'bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n variant === 'secondary' && !disabled,\n 'bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeyDown($event)\"\n >\n <div\n class=\"px-3 py-1.5 text-sm/6 cursor-pointer flex flex-nowrap items-center justify-between overflow-hidden\"\n >\n @if (loading) {\n <div class=\"flex-1 flex items-center gap-2 w-full h-3\">\n <div\n class=\"animate-pulse bg-light-inactive dark:bg-dark-inactive rounded-md h-5 w-full\"\n >\n \n </div>\n </div>\n } @else {\n <div class=\"flex-1\">\n @if (!asButton && displayedSelectedOptions && displayedSelectedOptions.length > 0) {\n @if (multiselect) {\n <div class=\"flex flex-wrap gap-x-2 gap-y-1 items-start\">\n @for (option of displayedSelectedOptions; track option; let i = $index) {\n @if (showAll || i === 0) {\n <span\n class=\"bg-light-secondary dark:bg-dark-secondary rounded-md flex items-center text-xs/6 text-light-on-secondary dark:text-dark-on-secondary\"\n [ngClass]=\"{ 'w-full h-full px-4': !multiselect, 'px-1': multiselect }\"\n >\n {{ option.value }}\n @if (showAll || i === 0) {\n <div\n (click)=\"onDeselectOption($event, option)\"\n class=\"ml-2 text-light-danger dark:text-dark-danger hover:cursor-pointer\"\n >\n <svg\n class=\"w-3 h-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M10 8.586l-2.293-2.293a1 1 0 00-1.414 1.414L8.586 10l-2.293 2.293a1 1 0 001.414 1.414L10 11.414l2.293 2.293a1 1 0 001.414-1.414L11.414 10l2.293-2.293a1 1 0 00-1.414-1.414L10 8.586z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n }\n </span>\n @if (!showAll && displayedSelectedOptions.length > 1) {\n <span\n class=\"text-light-on-control/80 dark:text-dark-on-control/80 text-xs/6\"\n >\n +{{ displayedSelectedOptions.length - 1 }}\n </span>\n }\n }\n }\n </div>\n } @else {\n <span\n class=\"text-light-on-control dark:text-dark-on-control overflow-hidden overflow-ellipsis\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary dark:text-dark-on-secondary':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n }\"\n >{{ displayedSelectedOptions[0].value }}</span\n >\n }\n } @else {\n <span\n class=\"text-light-inactive dark:text-dark-inactive overflow-hidden overflow-ellipsis\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary/80 dark:text-dark-on-primary/80':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary/80 dark:text-dark-on-secondary/80':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger/80 dark:text-dark-on-danger/80':\n variant === 'danger' && !disabled,\n }\"\n >\n @if (useIcon) {\n <ng-content select=\"buttonIcon\"></ng-content>\n } @else {\n {{ placeholder }}\n }\n </span>\n }\n </div>\n }\n <div\n class=\"text-light-on-control dark:text-dark-on-control\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary/80 dark:text-dark-on-primary/80':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary/80 dark:text-dark-on-secondary/80':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger/80 dark:text-dark-on-danger/80':\n variant === 'danger' && !disabled,\n }\"\n >\n @if (isDropdownOpen()) {\n <svg\n class=\"w-4 h-4 ml-2 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n 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\"\n clip-rule=\"evenodd\"\n />\n </svg>\n } @else {\n <svg\n class=\"w-4 h-4 ml-2 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 011.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { SelectComponent } from '../select/select.component';\nimport { Option } from '../select/select-dropdown/select-dropdown.component';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { zip } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface DateRange {\n from: string;\n to: string;\n}\n\nexport interface DateRangeDropdown {\n currentYear: number;\n currentMonth: number;\n from?: string;\n listCalendarDate: CalendarDate[];\n}\n\nexport interface CalendarDate {\n datetime: string;\n date: string;\n isToday: boolean;\n isTheDate: boolean;\n isCurrentMonth: boolean;\n}\n\n@Component({\n selector: 'haloduck-calendar',\n imports: [CommonModule, SelectComponent, FormsModule, TranslocoModule],\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class CalendarComponent implements OnInit {\n private readonly translateService = inject(TranslocoService);\n @ViewChild('monthSelect', { static: false })\n monthSelect!: SelectComponent;\n @Input() singleDate: boolean = false;\n @Input() firstDayOfWeek: number = 1; // monday\n @Input() selectedDate?: string;\n @Input() selectedDateRange?: DateRange;\n @Output() dateChange = new EventEmitter<CalendarDate>();\n @Output() dateRangeChange = new EventEmitter<DateRange>();\n currentYear: number = new Date().getFullYear();\n currentMonth: number = new Date().getMonth();\n listCalendarDate: CalendarDate[] = [];\n isFromSelected: boolean = false;\n\n yearList: Option[] = [];\n monthList: Option[] = [];\n\n onAdjustYear(amount: number) {\n this.currentYear += amount;\n this.calculateDateRangeDropdown();\n }\n\n onAdjustMonth(amount: number) {\n this.currentMonth += amount;\n\n if (this.currentMonth < 0) {\n this.currentYear--;\n this.currentMonth = 11;\n } else if (this.currentMonth > 11) {\n this.currentYear++;\n this.currentMonth = 0;\n }\n\n this.calculateDateRangeDropdown();\n }\n\n onSelectCalendarDate(date: CalendarDate) {\n if (this.singleDate) {\n this.dateChange.emit(date);\n } else {\n if (!this.isFromSelected) {\n this.selectedDateRange = {\n from: date.datetime,\n to: date.datetime,\n };\n this.isFromSelected = true;\n } else {\n if (this.selectedDateRange?.from) {\n const from =\n this.selectedDateRange.from < date.datetime\n ? this.selectedDateRange.from\n : date.datetime;\n const to =\n this.selectedDateRange.from < date.datetime\n ? date.datetime\n : this.selectedDateRange.from;\n\n this.dateRangeChange.emit({\n from,\n to,\n });\n\n this.isFromSelected = false;\n }\n }\n }\n }\n\n onCalenderOpen(value: string | DateRange) {\n // const currentDate = (this.singleDate) ? () : ( value && value.from && value.to ? value.from :dateToString(new Date()));\n let currentDate: string;\n if (this.singleDate) {\n const date = value as string;\n currentDate = date ? date : dateToString(new Date());\n } else {\n const dateRange = value as DateRange;\n currentDate =\n dateRange && dateRange.from && dateRange.to ? dateRange.from : dateToString(new Date());\n }\n\n this.currentYear = parseInt(currentDate.slice(0, 4), 10);\n this.currentMonth = parseInt(currentDate.slice(5, 7), 10) - 1;\n\n this.calculateDateRangeDropdown();\n }\n\n calculateDateRangeDropdown() {\n const weekdayOfFirstOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();\n const firstOfCalendar = new Date(\n this.currentYear,\n this.currentMonth,\n 1 - weekdayOfFirstOfMonth + this.firstDayOfWeek,\n );\n if (firstOfCalendar > new Date(this.currentYear, this.currentMonth, 1)) {\n firstOfCalendar.setDate(firstOfCalendar.getDate() - 7);\n }\n const lastOfCalendar = new Date(firstOfCalendar);\n lastOfCalendar.setDate(lastOfCalendar.getDate() + 41);\n if (lastOfCalendar.getDate() > 6) {\n lastOfCalendar.setDate(lastOfCalendar.getDate() - 7);\n }\n const dateDiff =\n Math.ceil((lastOfCalendar.getTime() - firstOfCalendar.getTime()) / (1000 * 60 * 60 * 24)) + 1;\n\n this.listCalendarDate = [];\n\n for (let i = 0; i < dateDiff; i++) {\n const datetime = dateToString(firstOfCalendar);\n const date = firstOfCalendar.getDate().toString();\n const isToday = firstOfCalendar.toDateString() === new Date().toDateString();\n const isCurrentMonth = firstOfCalendar.getMonth() === this.currentMonth;\n const isTheDate =\n (this.singleDate && this.selectedDate\n ? datetime === this.selectedDate\n : this.selectedDateRange &&\n this.selectedDateRange.from &&\n this.selectedDateRange.to &&\n datetime >= this.selectedDateRange.from &&\n datetime <= this.selectedDateRange.to) || false;\n\n this.listCalendarDate.push({\n datetime,\n date,\n isToday,\n isTheDate,\n isCurrentMonth,\n });\n\n firstOfCalendar.setDate(firstOfCalendar.getDate() + 1);\n }\n }\n\n onSelectYear(year: string | string[]) {\n year = year as string;\n this.currentYear = parseInt(year, 10);\n this.calculateDateRangeDropdown();\n }\n\n onSelectMonth(month: string | string[]) {\n month = month as string;\n this.currentMonth = parseInt(month, 10);\n this.calculateDateRangeDropdown();\n }\n\n ngOnInit(): void {\n if (this.singleDate) {\n this.onCalenderOpen(this.selectedDate ?? dateToString(new Date()));\n } else {\n this.onCalenderOpen(\n this.selectedDateRange ?? {\n from: dateToString(new Date()),\n to: dateToString(new Date()),\n },\n );\n }\n }\n\n constructor() {\n const currentYear = new Date().getFullYear();\n this.translateService\n .selectTranslate('ui.calendar._year_', { year: '_year_' }, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n this.yearList = [];\n for (let i = currentYear; i >= currentYear - 150; i--) {\n this.yearList.push({\n id: i.toString(),\n value: translation.replace('_year_', i.toString()),\n });\n }\n });\n\n zip(\n this.translateService.selectTranslate('ui.calendar.January', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.February', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.March', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.April', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.May', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.June', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.July', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.August', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.September', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.October', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.November', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.December', {}, 'haloduck'),\n )\n .pipe(takeUntilDestroyed())\n .subscribe((translations) => {\n this.monthList = [\n {\n id: '0',\n value: translations[0],\n },\n {\n id: '1',\n value: translations[1],\n },\n {\n id: '2',\n value: translations[2],\n },\n {\n id: '3',\n value: translations[3],\n },\n {\n id: '4',\n value: translations[4],\n },\n {\n id: '5',\n value: translations[5],\n },\n {\n id: '6',\n value: translations[6],\n },\n {\n id: '7',\n value: translations[7],\n },\n {\n id: '8',\n value: translations[8],\n },\n {\n id: '9',\n value: translations[9],\n },\n {\n id: '10',\n value: translations[10],\n },\n {\n id: '11',\n value: translations[11],\n },\n ];\n });\n }\n}\n\n// return yyyy-mm-dd\nexport function dateToString(date: Date): string {\n return (\n date.getFullYear() +\n '-' +\n (date.getMonth() + 1).toString().padStart(2, '0') +\n '-' +\n date.getDate().toString().padStart(2, '0')\n );\n}\n","<div\n id=\"dateRangeCalendar\"\n class=\"min-w-96 brightness-125 bg-light-background dark:bg-dark-background border border-light-inactive dark:border-dark-inactive rounded text-center p-4 flex flex-col gap-4\"\n tabindex=\"1\"\n>\n <div class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustYear(-1)\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n <div class=\"flex-auto text-sm font-semibold flex justify-center\">\n <div class=\"w-32\">\n <haloduck-select\n [multiselect]=\"false\"\n [atLeastOne]=\"true\"\n [options]=\"yearList\"\n [value]=\"currentYear + ''\"\n (selectedChange)=\"onSelectYear($event)\"\n >\n </haloduck-select>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustYear(1)\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <div class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustMonth(-1)\"\n >\n <span class=\"sr-only\">이전 달</span>\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n <div class=\"flex-auto text-sm font-semibold flex justify-center\">\n <div class=\"w-32\">\n <haloduck-select\n [multiselect]=\"false\"\n [atLeastOne]=\"true\"\n [options]=\"monthList\"\n [value]=\"currentMonth + ''\"\n (selectedChange)=\"onSelectMonth($event)\"\n >\n </haloduck-select>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustMonth(1)\"\n >\n <span class=\"sr-only\">다음 달</span>\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <div>\n <div\n class=\"grid grid-cols-7 gap-[1px] text-xs/6 font-semibold text-light-on-background dark:text-dark-on-background\"\n >\n <div>{{ 'haloduck.ui.calendar.Mon' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Tue' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Wed' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Thu' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Fri' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Sat' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Sun' | transloco }}</div>\n </div>\n\n <div class=\"isolate mt-2 grid grid-cols-7 gap-[1px] rounded-lg text-sm shadow overflow-hidden\">\n @for (date of listCalendarDate; track date.datetime) {\n <button\n type=\"button\"\n (click)=\"onSelectCalendarDate(date)\"\n class=\"py-1.5 hover:cursor-pointer bg-light-alternative dark:bg-dark-alternative text-light-on-alternative dark:text-dark-on-alternative\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control text-light-on-control dark:text-dark-on-control':\n date.isCurrentMonth,\n }\"\n >\n <time\n [ngClass]=\"{\n 'font-semibold bg-light-primary-light dark:bg-dark-primary-light text-on-light-primary-light dark:text-dark-on-primary-light':\n date.isToday && date.datetime !== selectedDateRange?.from,\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n date.datetime === selectedDateRange?.from,\n 'bg-gray-500 font-semibold text-white': date.isTheDate,\n }\"\n class=\"mx-auto flex size-7 items-center justify-center rounded-full hover:font-bold\"\n >{{ date.date }}</time\n >\n </button>\n }\n </div>\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ComponentRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n Type,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\n\n@Component({\n selector: 'haloduck-dialog-container',\n templateUrl: './dialog-container.component.html',\n styleUrl: './dialog-container.component.css',\n})\nexport class DialogContainerComponent implements OnInit, AfterViewInit {\n @Input() childComponent!: Type<any>;\n @Input() data: any;\n @Output() close = new EventEmitter<void>();\n @ViewChild('dialogContainer', { read: ViewContainerRef })\n dialogContainer!: ViewContainerRef;\n\n ngAfterViewInit(): void {\n if (this.childComponent) {\n const componentRef: ComponentRef<any> = this.dialogContainer.createComponent(\n this.childComponent,\n );\n if (this.data) {\n Object.assign(componentRef.instance, { context: this.data });\n }\n\n if (this.data.classList) {\n this.data.classList.forEach((className: string) => {\n componentRef.location.nativeElement.classList.add(className);\n });\n }\n\n componentRef.location.nativeElement.classList.add('max-w-full');\n componentRef.location.nativeElement.classList.add('max-h-full');\n componentRef.location.nativeElement.classList.add('text-light-on-background');\n componentRef.location.nativeElement.classList.add('dark:text-dark-on-background');\n componentRef.location.nativeElement.classList.add('bg-light-background');\n componentRef.location.nativeElement.classList.add('dark:bg-dark-background');\n componentRef.location.nativeElement.classList.add('p-4');\n componentRef.location.nativeElement.classList.add('rounded-lg');\n componentRef.location.nativeElement.classList.add('overflow-auto');\n }\n }\n\n ngOnInit(): void {}\n\n closeDialog() {\n this.close.emit();\n }\n}\n","<div\n class=\"h-full w-full max-h-full max-w-full fixed inset-0 bg-black/50 flex items-center justify-center overflow-hidden\"\n>\n <!-- <div class=\"w-full h-full max-w-full max-h-full bg-white p-5 rounded-lg overflow-y-auto\"\n (click)=\"$event.stopPropagation()\"> -->\n <ng-container id=\"dialogContainer\" #dialogContainer></ng-container>\n <!-- </div> -->\n</div>\n","import { Injectable, Injector, TemplateRef, Type } from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DialogContainerComponent } from './dialog-container.component';\n\n@Injectable({ providedIn: 'root' })\nexport class DialogService {\n private dialogStack: OverlayRef[] = []; // 다이얼로그 스택\n\n constructor(\n private overlay: Overlay,\n private injector: Injector,\n ) {}\n\n open<T>(component: Type<T> | TemplateRef<any>, data?: any, classList?: string[]): OverlayRef {\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n panelClass: 'custom-dialog-panel',\n scrollStrategy: this.overlay.scrollStrategies.block(),\n });\n\n const portal = new ComponentPortal(DialogContainerComponent);\n const containerRef = overlayRef.attach(portal);\n\n containerRef.instance.childComponent = component as Type<T>;\n containerRef.instance.data = { ...data, overlayRef, classList };\n containerRef.instance.close.subscribe(() => this.close(overlayRef));\n\n this.dialogStack.push(overlayRef);\n\n return overlayRef;\n }\n\n close(overlayRef?: OverlayRef): void {\n if (overlayRef) {\n overlayRef.dispose();\n this.dialogStack = this.dialogStack.filter((ref) => ref !== overlayRef);\n } else {\n // 마지막 다이얼로그 닫기\n const lastOverlay = this.dialogStack.pop();\n lastOverlay?.dispose();\n }\n }\n\n closeAll(): void {\n while (this.dialogStack.length) {\n this.dialogStack.pop()?.dispose();\n }\n }\n}\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\n\nexport interface Button {\n id: string;\n label: string;\n variant: ButtonVariant;\n}\n\n@Component({\n selector: 'haloduck-confirm-dialog',\n imports: [ButtonComponent],\n templateUrl: './confirm-dialog.component.html',\n styleUrl: './confirm-dialog.component.css',\n})\nexport class ConfirmDialogComponent implements OnInit {\n private readonly dialogService = inject(DialogService);\n @Input() context!: {\n title: string;\n message: string;\n buttons: Button[];\n clickedButton$: any;\n overlayRef: any;\n };\n\n onButtonClicked(id: string) {\n this.context.clickedButton$.next(id);\n this.context.clickedButton$.complete();\n\n this.dialogService.close(this.context.overlayRef);\n }\n\n ngOnInit(): void {}\n\n constructor() {}\n}\n","<div\n class=\"w-120 max-w-full flex flex-col gap-4 text-light-on-background dark:text-dark-on-background bg-light-background dark:bg-dark-background\"\n>\n <div class=\"font-bold\">{{ context.title }}</div>\n <p>{{ context.message }}</p>\n <div class=\"flex items-center justify-center gap-4\">\n @for (button of context.buttons; track button.id) {\n <haloduck-button [variant]=\"button.variant\" (click)=\"onButtonClicked(button.id)\">{{\n button.label\n }}</haloduck-button>\n }\n </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { Button, ConfirmDialogComponent } from './confirm-dialog.component';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConfirmDialogService {\n private readonly dialogService = inject(DialogService);\n private clickedButton$!: Subject<string>;\n\n public confirm(title: string, message: string, buttons: Button[]): Observable<string> {\n this.clickedButton$ = new Subject<string>();\n\n const dialogRef = this.dialogService.open<ConfirmDialogComponent>(ConfirmDialogComponent, {\n title,\n message,\n buttons,\n clickedButton$: this.clickedButton$,\n });\n\n return this.clickedButton$.asObservable();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-copy-button',\n imports: [TranslocoModule],\n templateUrl: './copy-button.component.html',\n styleUrl: './copy-button.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class CopyButtonComponent {\n @Input() text: string = '';\n isAnimating = false;\n\n copyToClipboard($event: Event) {\n $event.preventDefault();\n $event.stopPropagation();\n\n this.isAnimating = true;\n setTimeout(() => {\n this.isAnimating = false;\n }, 500); // Animation duration\n\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(this.text);\n // .then(() => {\n // console.log('Text copied to clipboard');\n // })\n // .catch((err) => {\n // console.error('Failed to copy text: ', err);\n // });\n } else {\n const textArea = document.createElement('textarea');\n textArea.value = this.text;\n textArea.style.position = 'fixed'; // Avoid scrolling to bottom\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n try {\n document.execCommand('copy');\n // console.log('Text copied to clipboard');\n } catch (err) {\n // console.error('Failed to copy text: ', err);\n }\n document.body.removeChild(textArea);\n }\n }\n}\n","<ng-container *transloco=\"let _ts; read: 'haloduck'\">\n <button\n type=\"button\"\n class=\"group inline-flex items-center px-2 py-1 bg-light-alternative dark:bg-dark-alternative hover:brightness-125 rounded text-xs text-light-on-alternative dark:text-dark-on-alternative hover:cursor-pointer active:scale-95 transition-transform\"\n (click)=\"copyToClipboard($event)\"\n title=\"Copy to clipboard\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [class]=\"\n 'h-4 w-4 mr-1 transition-all duration-500 ' +\n (isAnimating ? 'scale-150 opacity-0' : 'scale-100 opacity-100')\n \"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n fill=\"none\"\n />\n <rect\n x=\"3\"\n y=\"3\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n fill=\"none\"\n />\n </svg>\n <span class=\"hidden group-hover:inline\">\n @if (isAnimating) {\n {{ _ts('ui.button.Copied') }}\n } @else {\n {{ _ts('ui.button.Copy') }}\n }\n </span>\n </button>\n</ng-container>\n","import {\n Component,\n ComponentRef,\n ElementRef,\n forwardRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\n\nimport { CalendarComponent, CalendarDate } from '../calendar/calendar.component';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'haloduck-date-picker',\n imports: [CommonModule, FormsModule],\n templateUrl: './date-picker.component.html',\n styleUrl: './date-picker.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePickerComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class DatePickerComponent implements ControlValueAccessor, OnInit, OnDestroy {\n destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n\n @Input() disabled: boolean = false;\n @Input() placeholder: string = '';\n @Input() firstDayOfWeek: number = 1;\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n selectedDate?: string;\n\n private overlayRef?: OverlayRef;\n\n onClick() {\n if (this.disabled) {\n return;\n }\n\n this.openCalendar();\n }\n\n onDateChange(date: CalendarDate) {\n this.selectedDate = date.datetime;\n this.onChange(this.selectedDate);\n }\n\n openCalendar() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(CalendarComponent);\n const componentRef: ComponentRef<CalendarComponent> = this.overlayRef.attach(calendarPortal);\n\n // Pass values directly to the CalendarComponent instance\n componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n componentRef.instance.singleDate = true;\n componentRef.instance.selectedDate = this.selectedDate;\n\n // Subscribe to events emitted by the CalendarComponent\n componentRef.instance.dateChange.pipe(takeUntil(this.destroy$)).subscribe((date) => {\n this.onDateChange(date);\n this.closeCalendar();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.closeCalendar();\n });\n }\n }\n\n closeCalendar() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: string): void {\n this.selectedDate = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.calendar.Pick a date.', {}, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n }\n}\n","<label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n</label>\n<div\n #origin\n class=\"py-1.5 relative mt-2 gap-2 rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary':\n !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick()\"\n>\n <div class=\"flex items-center\">\n <div\n class=\"flex-1 text-light-on-control dark:text-dark-on-control sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-inactive dark:text-dark-inactive': !selectedDate && !disabled,\n 'text-light-on-control dark:text-dark-on-control': selectedDate && !disabled,\n }\"\n >\n {{ selectedDate || placeholder }}\n </div>\n </div>\n</div>\n","import {\n Component,\n forwardRef,\n Input,\n OnDestroy,\n ComponentRef,\n ViewChild,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject, zip, takeUntil } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { TranslocoModule, TranslocoService, provideTranslocoScope } from '@jsverse/transloco';\nimport { SelectComponent } from '../select/select.component';\nimport { Option } from '../select/select-dropdown/select-dropdown.component';\nimport { DateRange, dateToString, CalendarComponent } from '../calendar/calendar.component';\n\n@Component({\n selector: 'haloduck-date-range',\n imports: [SelectComponent, CommonModule, FormsModule, TranslocoModule],\n templateUrl: './date-range.component.html',\n styleUrl: './date-range.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangeComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class DateRangeComponent implements ControlValueAccessor, OnDestroy {\n destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n\n @Input() dateRangeOptions: Option[] = [];\n @Input() disabled: boolean = false;\n @Input() placeholder: string = '';\n @Input() firstDayOfWeek: number = 1;\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n selectedDateRangeOptionId?: string;\n dateRange?: DateRange = undefined;\n\n private overlayRef?: OverlayRef;\n\n getSelectedDateRangeString(): any {\n return (\n this.dateRange &&\n this.dateRange.from &&\n this.dateRange.to &&\n this.dateRange.from + ' ~ ' + this.dateRange.to\n );\n }\n\n onClick() {\n if (this.disabled) {\n return;\n }\n\n this.openCalendar();\n }\n\n onDateRangeOptionChange(selectedOptionId: string) {\n this.selectedDateRangeOptionId = selectedOptionId;\n if (this.selectedDateRangeOptionId !== 'custom') {\n this.calculateDateRange();\n } else {\n this.openCalendar();\n }\n }\n\n onDateRangeChange(dateRange: DateRange) {\n this.dateRange = dateRange;\n this.selectedDateRangeOptionId = 'custom';\n this.onChange(this.dateRange);\n }\n\n calculateDateRange() {\n if (!this.selectedDateRangeOptionId) {\n } else if (this.selectedDateRangeOptionId !== 'custom') {\n const unit = this.selectedDateRangeOptionId.charAt(0);\n const amount = parseInt(this.selectedDateRangeOptionId.slice(1), 10);\n let from = new Date();\n let to = new Date();\n\n switch (unit) {\n case 'd':\n from = new Date(to);\n from.setDate(to.getDate() - amount);\n break;\n case 'm':\n from = new Date(to);\n from.setMonth(to.getMonth() - amount);\n break;\n case 'y':\n from = new Date(to);\n from.setFullYear(to.getFullYear() - amount);\n break;\n default:\n break;\n }\n\n this.dateRange = {\n from: dateToString(from),\n to: dateToString(to),\n };\n\n this.onChange(this.dateRange);\n }\n }\n\n getDateRangeOptionId(dateRange: DateRange): string {\n const selectedOption = this.dateRangeOptions.find((option) => {\n const unit = (option.id || option.value).charAt(0);\n const amount = parseInt((option.id || option.value).slice(1), 10);\n let from = new Date();\n let to = new Date();\n\n switch (unit) {\n case 'd':\n from = new Date(to);\n from.setDate(to.getDate() - amount);\n break;\n case 'm':\n from = new Date(to);\n from.setMonth(to.getMonth() - amount);\n break;\n case 'y':\n from = new Date(to);\n from.setFullYear(to.getFullYear() - amount);\n break;\n default:\n break;\n }\n\n return dateRange.from === dateToString(from) && dateRange.to === dateToString(to);\n });\n\n if (selectedOption) {\n return selectedOption.id || selectedOption.value;\n }\n\n return 'custom';\n }\n\n openCalendar() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(CalendarComponent);\n const componentRef: ComponentRef<CalendarComponent> = this.overlayRef.attach(calendarPortal);\n\n componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n componentRef.instance.selectedDateRange = this.dateRange;\n\n // Subscribe to events emitted by the CalendarComponent\n componentRef.instance.dateRangeChange.pipe(takeUntil(this.destroy$)).subscribe((date) => {\n this.onDateRangeChange(date);\n this.closeCalendar();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.closeCalendar();\n });\n }\n }\n\n closeCalendar() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: DateRange): void {\n this.dateRange = value;\n\n if (!value) {\n this.selectedDateRangeOptionId = undefined;\n } else {\n this.selectedDateRangeOptionId = this.getDateRangeOptionId(value);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.calendar.Pick a period.', {}, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n\n zip(\n this.translateService.selectTranslate('ui.calendar.today', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.yesterday', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.2 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.3 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a week ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.15 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a month ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.2 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.3 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.6 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a year ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.pick manually', {}, 'haloduck'),\n )\n .pipe(takeUntilDestroyed())\n .subscribe(\n ([\n today,\n yesterday,\n twoDaysAgo,\n threeDaysAgo,\n aWeekAgo,\n fifteenDaysAgo,\n aMonthAgo,\n twoMonthsAgo,\n threeMonthsAgo,\n sixMonthsAgo,\n aYearAgo,\n pickManually,\n ]) => {\n if (this.dateRangeOptions.length === 0) {\n this.dateRangeOptions = [\n {\n id: 'd0',\n value: today,\n },\n {\n id: 'd1',\n value: yesterday,\n },\n {\n id: 'd2',\n value: twoDaysAgo,\n },\n {\n id: 'd3',\n value: threeDaysAgo,\n },\n {\n id: 'd7',\n value: aWeekAgo,\n },\n {\n id: 'd15',\n value: fifteenDaysAgo,\n },\n {\n id: 'm1',\n value: aMonthAgo,\n },\n {\n id: 'm2',\n value: twoMonthsAgo,\n },\n {\n id: 'm3',\n value: threeMonthsAgo,\n },\n {\n id: 'm6',\n value: sixMonthsAgo,\n },\n {\n id: 'y1',\n value: aYearAgo,\n },\n {\n id: 'custom',\n value: pickManually,\n },\n ];\n }\n },\n );\n }\n}\n","<label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n</label>\n<div\n #origin\n class=\"relative mt-2 gap-2 rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary':\n !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick()\"\n>\n <div class=\"flex items-center\">\n <haloduck-select\n [multiselect]=\"false\"\n [disabled]=\"disabled\"\n [options]=\"dateRangeOptions\"\n [atLeastOne]=\"true\"\n (click)=\"$event.stopPropagation()\"\n variant=\"primary\"\n placeholder=\"{{ 'haloduck.ui.calendar.Period' | transloco }}\"\n [(ngModel)]=\"selectedDateRangeOptionId\"\n (ngModelChange)=\"onDateRangeOptionChange($event)\"\n >\n </haloduck-select>\n @if (getSelectedDateRangeString()) {\n <div\n class=\"flex-1 sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-on-control dark:text-dark-on-control': !disabled,\n 'text-light-on-control/60 dark:text-light-on-control/60': disabled,\n }\"\n >\n {{ getSelectedDateRangeString() }}\n </div>\n } @else {\n <div\n class=\"flex-1 sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-inactive dark:text-dark-inactive': !disabled,\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n }\"\n >\n {{ placeholder }}\n </div>\n }\n </div>\n</div>\n","import { Component, ElementRef, Input, ViewChild, AfterViewInit, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ButtonComponent } from '../button/button.component';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-draw-canvas',\n templateUrl: './draw-canvas.component.html',\n styleUrl: './draw-canvas.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DrawCanvasComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n imports: [ButtonComponent, TranslocoModule],\n})\nexport class DrawCanvasComponent implements AfterViewInit, ControlValueAccessor {\n @Input() imagePath!: string;\n @Input() lineColor: string = '#DD0000'; // Default color is black\n @ViewChild('canvas', { static: true })\n canvasRef!: ElementRef<HTMLCanvasElement>;\n\n private ctx!: CanvasRenderingContext2D;\n private isDrawing = false;\n private onChange: (file: File | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n const canvas = this.canvasRef.nativeElement;\n this.ctx = canvas.getContext('2d')!;\n this.ctx.strokeStyle = this.lineColor; // Set the initial line color\n this.loadImage();\n this.setupCanvas();\n }\n\n private loadImage(): void {\n const image = new Image();\n image.src = this.imagePath;\n image.onload = () => {\n this.ctx.drawImage(\n image,\n 0,\n 0,\n this.canvasRef.nativeElement.width,\n this.canvasRef.nativeElement.height,\n );\n };\n }\n\n private setupCanvas(): void {\n const canvas = this.canvasRef.nativeElement;\n\n // Mouse events\n canvas.addEventListener('mousedown', (event: MouseEvent) => this.startMouseDrawing(event));\n canvas.addEventListener('mousemove', (event: MouseEvent) => this.mouseDraw(event));\n canvas.addEventListener('mouseup', () => this.stopDrawing());\n canvas.addEventListener('mouseleave', () => this.stopDrawing());\n\n // Touch events\n canvas.addEventListener('touchstart', (event: TouchEvent) => this.startTouchDrawing(event));\n canvas.addEventListener('touchmove', (event: TouchEvent) => {\n event.preventDefault(); // Prevent scrolling\n this.touchDraw(event);\n });\n canvas.addEventListener('touchend', () => this.stopDrawing());\n canvas.addEventListener('touchcancel', () => this.stopDrawing());\n }\n\n private startMouseDrawing(event: MouseEvent): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.isDrawing = true;\n this.ctx.beginPath();\n this.ctx.moveTo(\n event.offsetX * (this.canvasRef.nativeElement.width / rect.width),\n event.offsetY * (this.canvasRef.nativeElement.height / rect.height),\n );\n }\n\n private mouseDraw(event: MouseEvent): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n if (!this.isDrawing) return;\n this.ctx.lineTo(\n event.offsetX * (this.canvasRef.nativeElement.width / rect.width),\n event.offsetY * (this.canvasRef.nativeElement.height / rect.height),\n );\n this.ctx.stroke();\n }\n\n private startTouchDrawing(event: TouchEvent): void {\n this.isDrawing = true;\n const touch = event.touches[0];\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.ctx.beginPath();\n this.ctx.moveTo(\n (touch.clientX - rect.left) * (this.canvasRef.nativeElement.width / rect.width),\n (touch.clientY - rect.top) * (this.canvasRef.nativeElement.height / rect.height),\n );\n }\n\n private touchDraw(event: TouchEvent): void {\n if (!this.isDrawing) return;\n const touch = event.touches[0];\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.ctx.lineTo(\n (touch.clientX - rect.left) * (this.canvasRef.nativeElement.width / rect.width),\n (touch.clientY - rect.top) * (this.canvasRef.nativeElement.height / rect.height),\n );\n this.ctx.stroke();\n }\n\n private stopDrawing(): void {\n this.isDrawing = false;\n this.ctx.closePath();\n\n this.saveDrawing();\n }\n\n saveDrawing(): void {\n const canvas = this.canvasRef.nativeElement;\n const dataUrl = canvas.toDataURL('image/png');\n\n // Convert data URL to Blob\n const blob = this.dataURLToBlob(dataUrl);\n const file = new File([blob], 'teeth.png', { type: 'image/png' });\n\n // Emit the file value to the form control\n this.onChange(file);\n }\n\n private dataURLToBlob(dataUrl: string): Blob {\n const byteString = atob(dataUrl.split(',')[1]);\n const mimeString = dataUrl.split(',')[0].split(':')[1].split(';')[0];\n const buffer = new ArrayBuffer(byteString.length);\n const dataView = new Uint8Array(buffer);\n\n for (let i = 0; i < byteString.length; i++) {\n dataView[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([buffer], { type: mimeString });\n }\n\n // ControlValueAccessor methods\n writeValue(file: File | null): void {\n // No-op: The component does not need to set the file value directly\n }\n\n registerOnChange(fn: (file: File | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n const canvas = this.canvasRef.nativeElement;\n canvas.style.pointerEvents = isDisabled ? 'none' : 'auto';\n }\n\n onReset() {\n this.loadImage();\n }\n}\n","<div class=\"draw-canvas-container flex flex-col gap-2\">\n <canvas #canvas width=\"800\" height=\"400\" class=\"max-w-full draw-canvas select-none\"></canvas>\n <haloduck-button variant=\"danger\" (click)=\"onReset()\">{{\n 'haloduck.ui.draw.Clear' | transloco\n }}</haloduck-button>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-tag-input',\n imports: [CommonModule],\n templateUrl: './tag-input.component.html',\n styleUrl: './tag-input.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TagInputComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class TagInputComponent implements ControlValueAccessor, AfterViewInit {\n @ViewChild('label') label!: ElementRef;\n @ViewChild('inputEl') inputEl!: ElementRef<HTMLInputElement>;\n\n @Input() placeholder: string = '';\n @Input() disabled: boolean = false;\n @Input() allowDuplicates: boolean = false;\n\n // Two-way binding support independent of CVA\n @Input() set value(tags: string[] | null) {\n if (Array.isArray(tags)) {\n this.tags = tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n @Output() valueChange = new EventEmitter<string[]>();\n\n tags: string[] = [];\n inputValue: string = '';\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(value: string[] | null): void {\n if (Array.isArray(value)) {\n this.tags = value.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngAfterViewInit(): void {\n // hide label if no projected content\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n focus(): void {\n this.inputEl?.nativeElement?.focus();\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.inputValue = input.value;\n this.onTouched();\n }\n\n onBlur(): void {\n if (this.disabled) return;\n this.inputValue = '';\n this.onTouched();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.disabled) return;\n\n // Commit on comma or Enter\n if (event.key === ',' || event.key === 'Enter') {\n event.preventDefault();\n this.commitCurrentInput();\n return;\n }\n\n // Backspace behavior\n if (event.key === 'Backspace') {\n if (this.inputValue.length > 0) {\n return; // default backspace in input\n }\n if (this.tags.length > 0) {\n event.preventDefault();\n this.removeTag(this.tags.length - 1);\n return;\n }\n }\n }\n\n removeTag(index: number): void {\n if (this.disabled) return;\n if (index < 0 || index >= this.tags.length) return;\n this.tags = this.tags.filter((_, i) => i !== index);\n this.emitChanges();\n }\n\n private commitCurrentInput(): void {\n const raw = this.inputValue.trim();\n if (!raw) {\n this.inputValue = '';\n return;\n }\n\n // If user pasted multiple comma-separated values, split and add all\n const parts = raw\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n for (const part of parts) {\n this.addTag(part);\n }\n\n this.inputValue = '';\n }\n\n private addTag(tag: string): void {\n if (!this.allowDuplicates) {\n const exists = this.tags.some((t) => t.toLowerCase() === tag.toLowerCase());\n if (exists) {\n return;\n }\n }\n this.tags = [...this.tags, tag];\n this.emitChanges();\n }\n\n private emitChanges(): void {\n const cleaned = this.tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n if (cleaned.length !== this.tags.length || cleaned.some((t, i) => t !== this.tags[i])) {\n this.tags = cleaned;\n }\n this.onChange(this.tags);\n this.valueChange.emit(this.tags);\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n\n <div\n class=\"tag-input-wrapper block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-2 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive sm:text-sm/6\"\n >\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (tag of tags; track tag; let i = $index) {\n <span\n class=\"inline-flex items-center gap-1 rounded-md bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary px-2 py-0.5 text-xs\"\n >\n {{ tag }}\n @if (!disabled) {\n <button\n type=\"button\"\n (click)=\"removeTag(i)\"\n class=\"text-light-on-secondary/80 hover:text-light-on-secondary dark:text-dark-on-secondary/80 dark:hover:text-dark-on-secondary hover:cursor-pointer\"\n >\n ×\n </button>\n }\n </span>\n }\n\n <input\n #inputEl\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n class=\"flex-1 min-w-[8rem] bg-transparent outline-none placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n inject,\n ChangeDetectorRef,\n NgZone,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { combineLatest, Observable, of, switchMap, tap } from 'rxjs';\nimport { TagInputComponent } from '../tag-input/tag-input.component';\n\nexport const ERROR_NOT_ACCEPTABLE_FILE_TYPE = 'NOT_ACCEPTABLE_FILE_TYPE';\nexport const ERROR_OVER_SIZE = 'OVER_SIZE';\nexport const ERROR_OVER_COUNT = 'OVER_COUNT';\nexport const ERROR_UPLOAD = 'UPLOAD';\n\nexport interface FileEx extends File {\n isUploading: boolean;\n isUploaded: boolean;\n key: string;\n name: string;\n size: number;\n type: string;\n tag: string[];\n previewUrl?: string; // Add a property for the preview URL\n}\n\n@Component({\n selector: 'haloduck-file-uploader',\n imports: [CommonModule, TranslocoModule, TagInputComponent],\n templateUrl: './file-uploader.component.html',\n styleUrls: ['./file-uploader.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileUploaderComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class FileUploaderComponent implements ControlValueAccessor {\n @Input() disabled: boolean = false;\n @Input() urlPrefix!: string;\n @Input() keyPrefix!: string;\n @Input() uploadApi!: (file: File, keyPrefix: string) => Observable<string>;\n @Input() multiple: boolean = true;\n @Input() maxCount: number = 0;\n @Input() maxSize: number = 0;\n @Input() accept: string[] = [''];\n @Output() filesAdded = new EventEmitter<FileEx[]>();\n @Output() fileRemoved = new EventEmitter<FileEx>();\n @Output() error = new EventEmitter<{ error: string; file: FileEx }[]>();\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly zone = inject(NgZone);\n\n files: FileEx[] = [];\n isUploading: boolean = false;\n isDragOver: boolean = false;\n\n private onChange: (files: FileEx[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(files: FileEx[]): void {\n this.files = files || [];\n }\n\n registerOnChange(fn: (files: FileEx[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const selectedFiles = this.multiple ? Array.from(input.files) : [input.files[0]];\n this.addFiles(selectedFiles as FileEx[]);\n }\n this.onTouched();\n }\n\n removeFile(index: number): void {\n const removedFile = this.files[index];\n this.files.splice(index, 1);\n this.fileRemoved.emit(removedFile);\n this.onChange(this.files);\n }\n\n onFileTagChanged(index: number, tags: string[]): void {\n if (this.files[index]) {\n this.files[index].tag = tags;\n this.onChange(this.files);\n }\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n if (event.dataTransfer?.files) {\n const droppedFiles = this.multiple\n ? Array.from(event.dataTransfer.files)\n : [event.dataTransfer.files[0]];\n this.addFiles(droppedFiles as FileEx[]);\n }\n this.onTouched();\n }\n\n getFilePreview(file: FileEx): string {\n return file.previewUrl || ''; // Return the precomputed preview URL\n }\n\n addFiles(addedFiles: FileEx[]): void {\n const notAcceptedFiles: { error: string; file: FileEx }[] = [];\n\n let filteredFiles = addedFiles.filter((file) => {\n const acceptableFileType = this.isAcceptableFileType(file);\n const acceptableFileSize = this.maxSize > 0 ? file.size <= this.maxSize : true;\n\n if (!acceptableFileType) {\n notAcceptedFiles.push({ error: ERROR_NOT_ACCEPTABLE_FILE_TYPE, file });\n }\n if (!acceptableFileSize) {\n notAcceptedFiles.push({ error: ERROR_OVER_SIZE, file });\n }\n\n return acceptableFileType && acceptableFileSize;\n });\n\n if (this.maxCount > 0 && this.files.length + filteredFiles.length > this.maxCount) {\n for (let i = this.maxCount; i < this.files.length + filteredFiles.length; i++) {\n notAcceptedFiles.push({\n error: ERROR_OVER_COUNT,\n file: filteredFiles[i - this.files.length],\n });\n }\n\n filteredFiles = filteredFiles.splice(\n this.files.length + filteredFiles.length - this.maxCount,\n );\n }\n\n if (notAcceptedFiles.length > 0) {\n this.error.emit(notAcceptedFiles);\n }\n\n // Compute preview URLs for the new files and initialize tags\n filteredFiles.forEach((file) => {\n if (file.type.startsWith('image')) {\n file.previewUrl = URL.createObjectURL(file);\n }\n // Initialize tag array if not exists\n if (!file.tag) {\n file.tag = [];\n }\n });\n\n this.files = this.files.concat(filteredFiles);\n this.filesAdded.emit(filteredFiles);\n this.onChange(this.files);\n }\n\n isAcceptableFileType(file: File): boolean {\n // Check if the file type is acceptable\n return this.accept.some((type) => {\n if (type.startsWith('.')) {\n // Check if the file type matches any of the accepted types\n return file.name.endsWith(type);\n } else if (type.includes('/')) {\n if (type.includes('/*')) {\n // Check if the file type matches the wildcard MIME type\n return file.type.startsWith(type.split('/')[0]);\n } else {\n // Check if the file type matches the specific MIME type\n return file.type === type;\n }\n } else {\n return file.type === type;\n }\n });\n }\n\n startUpload(): Observable<FileEx[]> {\n // Placeholder for upload logic\n this.isUploading = true;\n const uploadTrigger$: Observable<string>[] = [];\n\n this.files.forEach((file) => {\n file.isUploading = true;\n file.isUploaded = false;\n\n // Create a file with tag information for upload\n const fileWithTag = Object.assign(file, { tag: file.tag || [] });\n\n uploadTrigger$.push(\n this.uploadApi(fileWithTag, this.keyPrefix).pipe(\n // Handle the upload API response\n tap((key) => {\n file.isUploading = false;\n file.isUploaded = true;\n file.key = key;\n }),\n ),\n );\n });\n\n // Wait for all uploads to complete\n return combineLatest(uploadTrigger$).pipe(\n switchMap((keys) => {\n this.files.forEach((file) => {\n if ('' === file.key) {\n this.isUploading = false;\n file.isUploaded = false;\n\n this.error.emit([{ error: ERROR_UPLOAD, file }]);\n }\n });\n\n this.onChange(this.files);\n this.onTouched();\n\n return of(this.files);\n }),\n );\n }\n}\n","<div\n class=\"p-4 border border-light-inactive dark:border-dark-inactive rounded-md\"\n [class.drag-over]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n @if (!isUploading) {\n <label\n for=\"file-upload\"\n class=\"flex flex-col items-center justify-center w-full border-2 border-dashed border-light-inactive dark:border-dark-inactive rounded-md cursor-pointer hover:border-light-secondary dark:border-dark-secondary p-4\"\n >\n <span class=\"text-light-inactive dark:text-dark-inactive\">{{\n 'haloduck.ui.file.Drag and drop files here, or click to select files' | transloco\n }}</span>\n <input\n id=\"file-upload\"\n type=\"file\"\n class=\"hidden\"\n [attr.accept]=\"accept ? accept.join(',') : null\"\n [attr.multiple]=\"multiple ? '' : null\"\n (cancel)=\"$event.stopPropagation()\"\n (change)=\"onFileSelected($event)\"\n />\n </label>\n }\n <!-- Display file list -->\n @if (files.length > 0) {\n <ul class=\"mt-4 space-y-2\">\n @for (file of files; track file.name; let i = $index) {\n <li\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center sm:justify-between p-2 border border-light-inactive dark:border-dark-inactive rounded-md gap-2\"\n >\n <!-- Check if the file is an image -->\n <div class=\"flex items-center space-x-4\">\n @if (file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n alt=\"{{ file.name }}\"\n class=\"w-12 h-12 object-cover rounded-md\"\n />\n }\n <span class=\"text-sm text-light-inactive dark:text-dark-inactive\">{{ file.name }}</span>\n </div>\n <div class=\"flex items-center space-x-4\">\n <div class=\"flex-1\">\n <haloduck-tag-input\n placeholder=\"{{ 'haloduck.ui.tag.Please input tags.' | transloco }}\"\n [(value)]=\"file.tag\"\n (valueChange)=\"onFileTagChanged(i, $event)\"\n ></haloduck-tag-input>\n </div>\n @if (isUploading) {\n @if (file.isUploaded) {\n <span class=\"text-sm text-light-secondary dark:text-dark-secondary\">{{\n 'haloduck.ui.file.Uploaded' | transloco\n }}</span>\n } @else {\n <span class=\"text-sm text-light-primary dark:text-dark-primary\">{{\n 'haloduck.ui.file.Uploading...' | transloco\n }}</span>\n }\n } @else {\n <button\n type=\"button\"\n class=\"text-light-danger dark:text-dark-danger hover:brightness-125\"\n (click)=\"removeFile(i)\"\n >\n {{ 'haloduck.ui.file.Remove' | transloco }}\n </button>\n }\n </div>\n </li>\n }\n </ul>\n }\n</div>\n","import { Component, Input, signal } from '@angular/core';\n\n@Component({\n selector: 'haloduck-flip',\n imports: [],\n templateUrl: './flip.component.html',\n styleUrl: './flip.component.css',\n})\nexport class FlipComponent {\n @Input() title: string = '';\n @Input() set isOpen(value: boolean) {\n this._isOpen.set(value);\n }\n _isOpen = signal(false);\n\n toggle() {\n this._isOpen.set(!this._isOpen());\n }\n}\n","<div\n class=\"relative w-full shadow ring-1 ring-light-inactive/50 dark:ring-dark-inactive/80 sm:rounded-lg bg-light-alternative dark:bg-dark-alternative p-2 flex flex-col gap-2\"\n [class.cursor-pointer]=\"!_isOpen()\"\n (click)=\"!_isOpen() && toggle()\"\n>\n <label\n class=\"text-sm text-light-on-alternative dark:text-dark-on-alternative\"\n [class.cursor-pointer]=\"!_isOpen()\"\n >{{ title }}</label\n >\n @if (_isOpen()) {\n <ng-content></ng-content>\n }\n <button\n variant=\"secondary\"\n class=\"absolute rounded-md border border-inactive px-1 py-0.5 top-1 right-1 hover:cursor-pointer bg-light-inactive dark:bg-dark-inactive text-light-on-inactive dark:text-dark-on-inactive\"\n (click)=\"toggle(); $event.stopPropagation()\"\n >\n @if (_isOpen()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 15l-6-6-6 6\" />\n </svg>\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 9l6 6 6-6\" />\n </svg>\n }\n </button>\n</div>\n","import { Component, inject, Input } from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\n\n@Component({\n selector: 'haloduck-image-viewer',\n imports: [],\n templateUrl: './image-viewer.component.html',\n styleUrl: './image-viewer.component.css',\n})\nexport class ImageViewerComponent {\n @Input() context: any;\n @Input() imageUrl: string = '';\n @Input() imageAlt: string = '';\n\n private readonly dialogService = inject(DialogService);\n\n onClose() {\n if (this.context?.overlayRef) {\n this.dialogService.close(this.context.overlayRef);\n }\n }\n}\n","<img\n class=\"max-w-full max-h-full object-cover cursor-pointer\"\n [src]=\"context?.imageUrl\"\n [alt]=\"context?.imageAlt\"\n (click)=\"onClose()\"\n/>\n","import { Component, EventEmitter, Input, OnInit, Output, forwardRef, inject } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { Observable, of, switchMap } from 'rxjs';\nimport { ImageViewerComponent } from '../image-viewer/image-viewer.component';\nimport { FileEx } from '../file-uploader/file-uploader.component';\nimport { CommonModule } from '@angular/common';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n// 전역 변수로 드래그 데이터를 임시 저장\nlet draggedBase64File: string | null = null;\nlet originDrag: ImageUploaderComponent | null = null;\n\n@Component({\n selector: 'haloduck-image-uploader',\n imports: [CommonModule, TranslocoModule],\n templateUrl: './image-uploader.component.html',\n styleUrls: ['./image-uploader.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ImageUploaderComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class ImageUploaderComponent implements ControlValueAccessor, OnInit {\n @Input() disabled: boolean = false;\n @Input() id!: string;\n @Input() alt!: string;\n @Input() urlPrefix!: string;\n @Input() keyPrefix!: string;\n @Input() uploadApi!: (file: File, keyPrefix: string) => Observable<string>;\n @Input() backgroundImage!: string;\n @Input() shouldPassToSibling: boolean = false;\n @Output() passToSibling: EventEmitter<FileEx[]> = new EventEmitter<FileEx[]>();\n @Output() fileAdded = new EventEmitter<FileEx>();\n @Output() fileRemoved = new EventEmitter<FileEx>();\n @Output() error = new EventEmitter<{ error: string; file: FileEx }[]>();\n imageUrl: string | null = null;\n file: FileEx | null = null;\n isDragOver: boolean = false;\n isUploading: boolean = false;\n\n private readonly dialogService = inject(DialogService);\n\n private onChange: (url: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(key: string | null): void {\n if (!key) {\n this.imageUrl = null;\n return;\n }\n\n this.imageUrl = `${this.urlPrefix}/${key}`;\n this.file = null;\n }\n\n registerOnChange(fn: (url: string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n startUpload(): Observable<FileEx> {\n // Placeholder for upload logic\n if (!this.file) {\n return new Observable<never>();\n }\n\n this.isUploading = true;\n this.file.isUploading = true;\n this.file.isUploaded = false;\n\n return this.uploadApi(this.file, this.keyPrefix).pipe(\n switchMap((key) => {\n if (this.file) {\n this.file.isUploading = false;\n this.file.isUploaded = true;\n this.file.key = key;\n }\n\n return of(this.file as FileEx);\n }),\n );\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n\n if (input.files && input.files[0]) {\n const listFile: FileEx[] = Array.from(input.files) as FileEx[];\n this.setFiles(listFile);\n }\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.isDragOver = false;\n\n if (event.dataTransfer?.files && event.dataTransfer.files[0]) {\n const listFile: FileEx[] = Array.from(event.dataTransfer.files) as FileEx[];\n this.setFiles(listFile);\n } else if (draggedBase64File) {\n if (this.file) {\n originDrag?.setFiles([this.file]); // 타켓에 파일이 있을 경우 원래 드래그한 컴포넌트에 파일 전달\n } else {\n originDrag?.removeImage();\n }\n\n fetch(draggedBase64File)\n .then((res) => res.blob())\n .then((blob) => {\n const file = new File([blob], 'dropped-file', { type: blob.type });\n this.setFiles([file] as FileEx[]);\n });\n\n draggedBase64File = null; // 전역 변수 초기화\n }\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDragStart(event: DragEvent): void {\n if (event.target instanceof HTMLImageElement) {\n const img = event.target as HTMLImageElement;\n\n if (img.id && this.file) {\n const reader = new FileReader();\n reader.onload = () => {\n const base64File = reader.result as string;\n draggedBase64File = base64File; // 전역 변수에 저장\n originDrag = this; // 드래그 시작한 컴포넌트 저장\n\n if (event.dataTransfer) {\n event.dataTransfer.setData('text/plain', 'dragged-file'); // 최소한의 데이터 설정\n }\n };\n reader.readAsDataURL(this.file);\n }\n }\n }\n\n onDragEnd(event: DragEvent): void {\n draggedBase64File = null;\n originDrag = null;\n }\n\n removeImage(): void {\n const removedFile = this.file;\n this.imageUrl = null;\n this.file = null;\n\n this.fileRemoved.emit(removedFile as FileEx);\n this.onChange(null); // Notify form control\n }\n\n setFiles(listFile: FileEx[]): void {\n listFile = listFile.filter((file) => {\n const isValid = file.type.startsWith('image/');\n if (!isValid) {\n console.error('Invalid file type:', file.type);\n }\n return isValid;\n });\n\n this.file = listFile[0];\n this.imageUrl = URL.createObjectURL(listFile[0]);\n\n if (listFile.length > 1 && this.shouldPassToSibling) {\n listFile.shift();\n this.passToSibling.emit(listFile);\n }\n\n this.fileAdded.emit(this.file);\n this.onChange(this.file.name);\n this.onTouched();\n }\n\n previewImage(imageUrl: string) {\n this.dialogService.open(ImageViewerComponent, {\n imageUrl,\n imageAlt: this.alt,\n });\n }\n\n ngOnInit(): void {}\n}\n","<div class=\"w-full h-full flex flex-col gap-1\">\n <label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n </label>\n <div\n class=\"h-full w-full p-2 border border-light-inactive dark:border-dark-inactive rounded-md\"\n [class.drag-over]=\"isDragOver\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <!-- Show image preview if available -->\n @if (imageUrl) {\n @if (!disabled) {\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"absolute -top-1 -right-1 bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger rounded-full px-1 text-xs\"\n (click)=\"removeImage()\"\n >\n x\n </button>\n </div>\n }\n <img\n [src]=\"imageUrl\"\n [id]=\"id + '-image'\"\n [alt]=\"alt || ''\"\n class=\"w-full h-full rounded-md aspect-square\"\n [ngClass]=\"{\n 'filter grayscale': disabled,\n }\"\n (click)=\"previewImage(imageUrl)\"\n />\n } @else {\n <!-- Show upload area -->\n <label\n for=\"{{ id + '-input' }}\"\n class=\"flex flex-col items-center justify-center w-full h-full border-2 border-dashed border-light-inactive dark:border-dark-inactive rounded-md\"\n [ngClass]=\"{\n 'cursor-pointer hover:border-light-primary dark:hover:border-dark-primary': !disabled,\n }\"\n >\n @if (backgroundImage) {\n <img\n [src]=\"backgroundImage\"\n [alt]=\"alt || ''\"\n class=\"w-full h-full rounded-md aspect-square\"\n />\n } @else {\n <span class=\"text-light-inactive dark:text-dark-inactive text-sm p-2\">{{\n 'haloduck.ui.file.Drag and drop an image here, or click to select' | transloco\n }}</span>\n }\n\n @if (!disabled) {\n <input\n [id]=\"id + '-input'\"\n type=\"file\"\n class=\"hidden\"\n accept=\"image/*\"\n [multiple]=\"passToSibling\"\n (cancel)=\"$event.stopPropagation()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </label>\n }\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { LangDefinition, TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-language-selector-option',\n imports: [CommonModule],\n providers: [TranslocoService],\n templateUrl: './language-selector-option.component.html',\n styleUrl: './language-selector-option.component.css',\n})\nexport class LanguageSelectorOptionComponent {\n @Output() languageSelected: EventEmitter<string> = new EventEmitter<string>();\n protected readonly translateService = inject(TranslocoService);\n\n selectLanguage(language: string | LangDefinition) {\n this.languageSelected.emit(language as string);\n }\n}\n","<div\n class=\"right-0 z-10 mt-2.5 origin-top-right rounded-md bg-light-background dark:bg-dark-background py-2 shadow-lg ring-1 ring-light-inactive dark:ring-dark-inactive\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-labelledby=\"user-menu-button\"\n tabindex=\"0\"\n>\n @for (language of translateService.getAvailableLangs(); track language) {\n <a\n href=\"javascript:void(0)\"\n class=\"px-3 py-2 flex items-center flex-nowrap gap-2\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"language-item-{{ language }}\"\n (click)=\"selectLanguage(language)\"\n >\n <img class=\"w-6 h-6\" [src]=\"'i18n/icons/' + language + '.png'\" />\n </a>\n }\n</div>\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n ComponentRef,\n ElementRef,\n inject,\n OnInit,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { LanguageSelectorOptionComponent } from './language-selector-option/language-selector-option.component';\nimport { distinctUntilChanged, Subject, takeUntil } from 'rxjs';\nimport { TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-language-selector',\n imports: [],\n templateUrl: './language-selector.component.html',\n styleUrl: './language-selector.component.css',\n})\nexport class LanguageSelectorComponent implements OnInit {\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n private readonly destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n language = signal<string>(this.translateService.getActiveLang());\n private overlayRef?: OverlayRef;\n\n showLanguageOptions() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(LanguageSelectorOptionComponent);\n const componentRef: ComponentRef<LanguageSelectorOptionComponent> =\n this.overlayRef.attach(calendarPortal);\n\n // Pass values directly to the CalendarComponent instance\n // componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n // componentRef.instance.singleDate = true;\n // componentRef.instance.selectedDate = this.selectedDate;\n\n // Subscribe to events emitted\n componentRef.instance.languageSelected\n .pipe(takeUntil(this.destroy$))\n .subscribe((language) => {\n this.translateService.setActiveLang(language);\n this.hideLanguageOptions();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.hideLanguageOptions();\n });\n }\n }\n\n hideLanguageOptions() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n ngOnInit(): void {\n this.translateService.langChanges$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((lang) => {\n this.language.set(lang);\n });\n }\n}\n","<button\n #origin\n type=\"button\"\n (click)=\"showLanguageOptions()\"\n class=\"-m-1.5 flex items-center p-1.5 hover:cursor-pointer\"\n aria-expanded=\"false\"\n aria-haspopup=\"true\"\n>\n <span class=\"max-lg:hidden flex lg:items-center\">\n <img class=\"w-6 h-6\" [src]=\"'i18n/icons/' + language() + '.png'\" />\n </span>\n</button>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n AfterViewInit,\n Input,\n isDevMode,\n EventEmitter,\n Output,\n inject,\n OnInit,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LngLat } from '@haloduck/core';\nimport { CoreService } from '@haloduck/core';\n\nexport declare const google: any;\n\nexport interface Location {\n plusCode: string;\n postalCode: string;\n countryCode: string;\n country: string;\n area1: string;\n area2: string;\n area3: string;\n formatted: string;\n lat: number;\n lng: number;\n}\n\n@Component({\n selector: 'haloduck-map-to-address',\n imports: [CommonModule, FormsModule],\n templateUrl: './map-to-address.component.html',\n styleUrl: './map-to-address.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: MapToAddressComponent,\n multi: true,\n },\n ],\n})\nexport class MapToAddressComponent implements OnInit, ControlValueAccessor {\n private readonly coreService = inject(CoreService);\n mapId = this.coreService.getMapId();\n defaultLngLat = this.coreService.getDefaultLngLat();\n @Input() disabled: boolean = false;\n @Input() language: string = 'en';\n @Input() currentLngLat?: LngLat;\n private _currentAddress?: string;\n private _isGoogleLoaded = false;\n private _loadError?: string;\n\n get isGoogleLoaded(): boolean {\n return this._isGoogleLoaded;\n }\n\n get loadError(): string | undefined {\n return this._loadError;\n }\n\n @Input()\n set currentAddress(value: string) {\n if (value) {\n this._currentAddress = value;\n // Google Maps API가 로드된 후에만 실행\n if (this._isGoogleLoaded) {\n this.setMapToAddress();\n }\n }\n }\n @Output() locationChanged = new EventEmitter<Location>();\n map: any;\n marker: any;\n location!: Location;\n\n private onChange: (value: Location) => void = () => {};\n private onTouched: () => void = () => {};\n\n async ngOnInit() {\n try {\n await this.initScript();\n this._isGoogleLoaded = true;\n this.initMap();\n\n // API 로드 완료 후 pending된 주소 설정 실행\n if (this._currentAddress) {\n this.setMapToAddress();\n }\n } catch (error) {\n this._loadError = 'Unable to load Google Maps API.';\n isDevMode() && console.error('Failed to load Google Maps API:', error);\n }\n }\n\n initScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof google !== 'undefined') {\n this._isGoogleLoaded = true;\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${this.coreService.getGoogleApiKey()}&libraries=places,marker&loading=sync&language=${this.language}`;\n script.async = false;\n script.defer = true;\n script.onload = () => {\n this._isGoogleLoaded = true;\n resolve();\n };\n script.onerror = (error) => reject(error);\n document.head.appendChild(script);\n isDevMode() && console.log('Google Maps script loaded', script);\n });\n }\n\n initMap() {\n if (this.currentLngLat) {\n isDevMode() && console.log('Using provided location:', this.currentLngLat);\n this.initializeMap(this.currentLngLat);\n } else {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const currentLocation = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n isDevMode() && console.log('Using current location:', currentLocation);\n this.initializeMap(currentLocation);\n },\n (error) => {\n if (error.code === error.PERMISSION_DENIED) {\n isDevMode() &&\n console.log(\n 'Location permission denied. Using default location.:',\n this.defaultLngLat,\n );\n } else if (error.code === error.POSITION_UNAVAILABLE || error.code === error.TIMEOUT) {\n isDevMode() &&\n console.log(\n 'Unable to determine location. Using default location.:',\n this.defaultLngLat,\n );\n }\n this.initializeMap(this.defaultLngLat);\n },\n );\n }\n }\n\n initializeMap(lngLat: LngLat) {\n this.map = new google.maps.Map(document.getElementById('map') as HTMLElement, {\n center: lngLat,\n zoom: 15,\n mapId: this.mapId,\n });\n\n this.marker = new google.maps.marker.AdvancedMarkerElement({\n position: lngLat,\n map: this.map,\n draggable: true,\n });\n\n // Listen for marker drag end to update address immediately\n this.marker.addListener('dragend', () => {\n const position = this.marker.position;\n if (position) {\n isDevMode() && console.log('Marker dragged to:', position.toJSON());\n this.getAddress(); // Fetch address after dragging\n }\n });\n\n this.map.addListener('click', (event: any) => this.onClick(event));\n\n if (!this.currentLngLat) {\n this.getAddress();\n }\n }\n\n onClick(event: any) {\n isDevMode() && console.log('Map clicked at:', event.latLng);\n if (event.latLng) {\n // Explicitly update marker position\n this.marker.position = event.latLng;\n this.marker.map = this.map; // Ensure marker is attached to the map\n isDevMode() && console.log('Marker position updated to:', event.latLng.toJSON());\n this.getAddress(); // Fetch address immediately after click\n this.onTouched(); // Mark as touched\n } else {\n isDevMode() && console.error('Failed to update marker position: event.latLng is undefined');\n }\n }\n\n setMapToAddress() {\n if (!this._isGoogleLoaded) {\n isDevMode() && console.warn('Google Maps API not loaded yet');\n return;\n }\n\n const geocoder = new google.maps.Geocoder();\n geocoder.geocode({ address: this._currentAddress }, (results: any, status: string) => {\n if (status === 'OK' && results[0]) {\n const location = results[0].geometry.location;\n isDevMode() && console.log('Geocoded location:', location.toJSON());\n this.initializeMap(location.toJSON());\n } else {\n isDevMode() && console.error('Geocoding failed:', status);\n }\n });\n }\n\n getAddress() {\n if (!this._isGoogleLoaded) {\n isDevMode() && console.warn('Google Maps API not loaded yet');\n return;\n }\n\n const geocoder = new google.maps.Geocoder();\n const position = this.marker.position;\n\n if (!position) {\n isDevMode() && console.error('Position update is unavailable');\n return;\n }\n\n geocoder.geocode({ location: position }, (results: any, status: string) => {\n isDevMode() && console.log('Geocoded results:', status, results);\n\n if (status === 'OK' && results[0]) {\n this.location = this.parseAddress(results);\n this.locationChanged.emit(this.location);\n this.onChange(this.location); // Notify the form control\n }\n });\n }\n\n parseAddress(results: any): Location {\n return {\n plusCode: this.getComponentLongName(results, 'plus_code'),\n postalCode: this.getComponentLongName(results, 'postal_code'),\n countryCode: this.getComponentShortName(results, 'country').toUpperCase(),\n country: this.getComponentLongName(results, 'country'),\n area1: this.getComponentLongName(results, 'administrative_area_level_1'),\n area2: this.getComponentLongName(results, 'sublocality_level_1'),\n area3: this.getComponentLongName(results, 'sublocality_level_2'),\n formatted: results[0]?.formatted_address,\n lat: results[0]?.geometry?.location?.lat(),\n lng: results[0]?.geometry?.location?.lng(),\n };\n }\n\n getComponentLongName(results: any[], type: string): string {\n for (let i = 0; i < results.length; i++) {\n const component = (results[i].address_components as any[]).find((c) =>\n c.types.includes(type),\n );\n if (component) {\n return component.long_name;\n }\n }\n return '';\n }\n\n getComponentShortName(results: any[], type: string): string {\n for (let i = 0; i < results.length; i++) {\n const component = (results[i].address_components as any[]).find((c) =>\n c.types.includes(type),\n );\n if (component) {\n return component.short_name;\n }\n }\n return '';\n }\n\n writeValue(value: Location): void {\n if (value) {\n this.location = value;\n this.currentLngLat = { lat: value.lat, lng: value.lng };\n // Google Maps API가 로드된 후에만 맵 초기화\n if (this._isGoogleLoaded) {\n this.initializeMap(this.currentLngLat);\n }\n }\n }\n\n registerOnChange(fn: (value: Location) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n}\n","<div class=\"w-full h-full relative\">\n <!-- 로딩 상태 -->\n @if (!isGoogleLoaded && !loadError) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-gray-100 z-10\">\n <div class=\"text-center\">\n <div\n class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-2\"\n ></div>\n <p class=\"text-gray-600 text-sm\">지도를 로딩 중입니다...</p>\n </div>\n </div>\n }\n\n <!-- 에러 상태 -->\n @if (loadError) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-red-50 z-10\">\n <div class=\"text-center p-4\">\n <div class=\"text-red-500 text-2xl mb-2\">⚠️</div>\n <p class=\"text-red-700 text-sm font-medium\">{{ loadError }}</p>\n <p class=\"text-red-600 text-xs mt-1\">\n Please check your internet connection and refresh the page.\n </p>\n </div>\n </div>\n }\n\n <div id=\"map\" class=\"w-full h-full\"></div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Router } from '@angular/router';\nimport { MenuItemEx } from '@haloduck/core';\n\n@Component({\n selector: 'haloduck-side-menu-item',\n imports: [CommonModule],\n templateUrl: './side-menu-item.component.html',\n styleUrl: './side-menu-item.component.css',\n})\nexport class SideMenuItemComponent implements OnInit {\n private readonly router = inject(Router);\n @Input() menuItem!: MenuItemEx;\n @Input() depth = 0;\n @Input() menuItemSelectHandler?: EventEmitter<MenuItemEx>;\n\n iconSvg!: SafeHtml;\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnInit(): void {\n if (this.menuItem.iconType === 'svg') {\n fetch(this.menuItem.icon || '')\n .then((response) => {\n return response.ok ? response : Promise.reject(response);\n })\n .then((response) => response.text())\n .then((svg) => (this.iconSvg = this.sanitizer.bypassSecurityTrustHtml(svg)));\n }\n }\n\n onMenuItemSelected(menuItem: MenuItemEx): void {\n if (this.menuItem.link) {\n this.navigateTo([this.menuItem.link]);\n }\n if (this.menuItemSelectHandler) {\n this.menuItemSelectHandler.emit(this.menuItem);\n }\n }\n\n navigateTo(link: string[]): void {\n this.router.navigate(link);\n }\n}\n","<a\n href=\"javascript:void(0)\"\n (click)=\"onMenuItemSelected(menuItem)\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-md cursor-pointer hover:text-light-on-primary dark:hover:text-dark-on-primary hover:bg-light-primary dark:hover:bg-dark-primary hover:cursor-pointer\"\n [ngClass]=\"{\n 'font-bold text-light-on-secondary dark:bg-dark-on-secondary bg-light-secondary dark:bg-dark-secondary':\n menuItem.isSelected,\n }\"\n>\n @if (menuItem.iconType === 'svg') {\n <div [innerHTML]=\"iconSvg\"></div>\n } @else {\n @if (menuItem.icon) {\n <img\n class=\"w-5 h-5\"\n [src]=\"menuItem.icon\"\n [alt]=\"menuItem.title\"\n [title]=\"menuItem.title\"\n [loading]=\"'lazy'\"\n />\n }\n }\n <span\n class=\"overflow-hidden text-ellipsis whitespace-nowrap\"\n title=\"{{ menuItem.title }}\"\n [ngStyle]=\"{ 'margin-left.px': depth ? depth * 16 : 0 }\"\n >\n {{ menuItem.title }}\n </span>\n</a>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MenuItemEx } from '@haloduck/core';\nimport { SideMenuItemComponent } from './side-menu-item/side-menu-item.component';\n\n@Component({\n selector: 'haloduck-side-menu',\n imports: [SideMenuItemComponent],\n templateUrl: './side-menu.component.html',\n styleUrl: './side-menu.component.css',\n})\nexport class SideMenuComponent {\n @Input() menuItems: Array<MenuItemEx> = [];\n @Input() depth: number = 0;\n\n @Output() menuItemSelected = new EventEmitter<MenuItemEx>();\n}\n","<div class=\"flex flex-col text-sm text-light-on-background dark:text-dark-on-background\">\n @for (menuItem of menuItems; track menuItem.link) {\n <haloduck-side-menu-item\n [menuItemSelectHandler]=\"menuItemSelected\"\n [menuItem]=\"menuItem\"\n [depth]=\"depth\"\n ></haloduck-side-menu-item>\n @if (menuItem.children && menuItem.children.length > 0) {\n <haloduck-side-menu\n [menuItems]=\"menuItem.children\"\n [depth]=\"depth + 1\"\n (menuItemSelected)=\"menuItemSelected.emit($event)\"\n ></haloduck-side-menu>\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n Input,\n inject,\n OnInit,\n isDevMode,\n} from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\n\nimport * as THREE from 'three';\nimport { STLLoader } from 'three-stdlib';\nimport { OrbitControls } from 'three-stdlib';\nimport { ButtonComponent } from '../button/button.component';\nimport { download } from '@haloduck/util';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-stl-viewer',\n imports: [CommonModule, ButtonComponent, TranslocoModule],\n templateUrl: './stl-viewer.component.html',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class StlViewerComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() fileUrl!: string;\n @Input() filename!: string;\n @Input() context: any;\n @ViewChild('viewerContainer') containerRef!: ElementRef;\n\n private readonly dialogService = inject(DialogService);\n\n isPopup = false;\n scene!: THREE.Scene;\n camera!: THREE.PerspectiveCamera;\n renderer!: THREE.WebGLRenderer;\n loader = new STLLoader();\n controls!: OrbitControls;\n loadingPercentage = 0;\n\n showStl() {\n if (this.isPopup) {\n return;\n }\n\n this.dialogService.open(\n StlViewerComponent,\n {\n fileUrl: this.fileUrl,\n filename: this.filename,\n },\n ['w-full', 'h-full'],\n );\n }\n\n download() {\n download(this.fileUrl);\n }\n\n closeDialog() {\n this.dialogService.close(this.context.overlayRef);\n }\n\n animate = () => {\n requestAnimationFrame(this.animate);\n this.controls.update();\n this.renderer.render(this.scene, this.camera);\n };\n\n ngAfterViewInit() {\n const container = this.containerRef.nativeElement;\n\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color(0xffffff);\n\n this.camera = new THREE.PerspectiveCamera(\n 50,\n container.clientWidth / container.clientHeight,\n 0.1,\n 1000,\n );\n this.camera.position.z = 100;\n\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.renderer.setSize(container.clientWidth, container.clientHeight);\n container.appendChild(this.renderer.domElement);\n\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.enableDamping = true;\n this.controls.dampingFactor = 0.05;\n\n // Adjust lighting\n const light = new THREE.DirectionalLight(0xffffff, 1.5); // Increased intensity\n light.position.set(0, 0, 1).normalize();\n const light2 = new THREE.DirectionalLight(0xffffff, 1.5); // Increased intensity\n light2.position.set(0, 0, -1).normalize();\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // Added ambient light\n this.scene.add(light, light2, ambientLight);\n\n this.loader.load(\n this.fileUrl || this.context?.fileUrl,\n (geometry) => {\n // Use MeshStandardMaterial with DoubleSide to render both sides\n const material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n metalness: 0.3,\n roughness: 0.5,\n side: THREE.DoubleSide, // Render both front and back faces\n });\n const mesh = new THREE.Mesh(geometry, material);\n\n geometry.computeBoundingBox();\n const boundingBox = geometry.boundingBox;\n const center = new THREE.Vector3();\n boundingBox?.getCenter(center);\n mesh.geometry.translate(-center.x, -center.y, -center.z);\n\n this.scene.add(mesh);\n\n const size = new THREE.Vector3();\n boundingBox?.getSize(size);\n const maxDim = Math.max(size.x, size.y, size.z);\n this.camera.position.z = maxDim * 2;\n },\n (xhr) => {\n this.loadingPercentage = (xhr.loaded / xhr.total) * 100;\n isDevMode() && console.log(this.loadingPercentage + '% loaded');\n },\n (error) => {\n isDevMode() && console.error('Error loading STL:', error);\n },\n );\n\n this.animate();\n }\n\n ngOnDestroy() {\n this.renderer.dispose();\n this.controls.dispose();\n }\n\n ngOnInit(): void {\n if (this.context) {\n this.isPopup = true;\n this.fileUrl = this.context.fileUrl;\n this.filename = this.context.filename;\n }\n }\n}\n","<div class=\"relative w-full h-full flex flex-col items-end\">\n <div class=\"w-full h-full flex items-start flex-col\">\n <div #viewerContainer class=\"w-full h-full rounded-md\"></div>\n @if (loadingPercentage < 100) {\n <div\n class=\"h-2 bg-light-primary-light dark:bg-dark-primary-light\"\n [ngStyle]=\"{ width: loadingPercentage + '%' }\"\n ></div>\n }\n </div>\n <div class=\"absolute bottom-2 right-0 flex justify-end gap-2\">\n @if (context) {\n <haloduck-button variant=\"primary\" (click)=\"download()\">{{\n 'haloduck.ui.button.Download' | transloco\n }}</haloduck-button>\n <haloduck-button variant=\"danger\" (click)=\"closeDialog()\">{{\n 'haloduck.ui.button.Close' | transloco\n }}</haloduck-button>\n } @else {\n <haloduck-button variant=\"primary\" (click)=\"download()\">{{\n 'haloduck.ui.button.Download' | transloco\n }}</haloduck-button>\n <haloduck-button variant=\"secondary\" (click)=\"showStl()\">{{\n 'haloduck.ui.button.View' | transloco\n }}</haloduck-button>\n }\n </div>\n</div>\n","import {\n Directive,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ElementRef,\n NgZone,\n inject,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\n\n@Directive({\n selector: '[haloduckAutoLoad]',\n standalone: true,\n})\nexport class AutoLoadDirective implements OnInit, OnDestroy, OnChanges {\n private readonly elementRef = inject(ElementRef);\n private readonly ngZone = inject(NgZone);\n private observer?: IntersectionObserver;\n private isLoading = false;\n // private hasTriggeredOnce = false;\n\n @Input() autoLoadEnabled: boolean = true;\n @Input() autoLoadThreshold: number = 0.1;\n @Input() autoLoadRootMargin: string = '0px';\n @Output() autoLoadTrigger = new EventEmitter<void>();\n\n ngOnInit(): void {\n this.setupObserver();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['autoLoadEnabled']) {\n this.setupObserver();\n }\n }\n\n ngOnDestroy(): void {\n this.disconnect();\n }\n\n private setupObserver(): void {\n this.disconnect();\n if (this.autoLoadEnabled && 'IntersectionObserver' in window) {\n this.initializeObserver();\n }\n }\n\n private initializeObserver(): void {\n this.ngZone.runOutsideAngular(() => {\n this.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !this.isLoading) {\n this.ngZone.run(() => {\n this.triggerLoad();\n });\n }\n });\n },\n {\n threshold: this.autoLoadThreshold,\n rootMargin: this.autoLoadRootMargin,\n },\n );\n\n this.observer.observe(this.elementRef.nativeElement);\n });\n }\n\n private triggerLoad(): void {\n if (this.isLoading || !this.autoLoadEnabled) {\n return;\n }\n\n // 첫 번째 로드는 건너뛰고, 이후부터는 보일 때마다 자동 로드\n // if (this.hasTriggeredOnce) {\n this.isLoading = true;\n this.autoLoadTrigger.emit();\n\n // 옵저버를 일시적으로 해제하여 연속 트리거 방지\n this.temporarilyDisableObserver();\n // } else {\n // this.hasTriggeredOnce = true;\n // }\n }\n\n private temporarilyDisableObserver(): void {\n if (this.observer) {\n this.observer.disconnect();\n\n // 1초 후 옵저버 재연결\n setTimeout(() => {\n if (this.autoLoadEnabled && this.observer) {\n this.isLoading = false;\n this.observer.observe(this.elementRef.nativeElement);\n }\n }, 1000);\n }\n }\n\n private disconnect(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n }\n\n // 외부에서 로딩 상태를 제어할 수 있는 메서드\n public setLoadingState(loading: boolean): void {\n this.isLoading = loading;\n }\n\n // 자동 로드를 재활성화하는 메서드\n public resetAutoLoad(): void {\n // this.hasTriggeredOnce = false;\n this.isLoading = false;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nexport interface TableSettings {\n showHeader: boolean;\n autoLoad: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TableSettingService {\n private dialogService = inject(DialogService);\n private currentOverlayRef?: OverlayRef;\n private currentTableNameSubject = new BehaviorSubject<string>('');\n private settingsSubjects = new Map<string, BehaviorSubject<TableSettings>>();\n\n private defaultSettings: TableSettings = {\n showHeader: true,\n autoLoad: false,\n };\n\n get currentTableName$(): Observable<string> {\n return this.currentTableNameSubject.asObservable();\n }\n\n show(tableName: string): void {\n this.currentTableNameSubject.next(tableName);\n\n // Lazy import to avoid circular dependency\n import('./table-setting.component').then(({ TableSettingComponent }) => {\n this.currentOverlayRef = this.dialogService.open(\n TableSettingComponent,\n {\n tableName,\n },\n ['w-full', 'max-w-xs'],\n );\n });\n }\n\n hide(): void {\n console.log('Hiding table settings', this.currentOverlayRef);\n if (this.currentOverlayRef) {\n this.dialogService.close(this.currentOverlayRef);\n this.currentOverlayRef = undefined;\n }\n this.currentTableNameSubject.next('');\n }\n\n getSettings(tableName: string): Observable<TableSettings> {\n if (!this.settingsSubjects.has(tableName)) {\n const savedSettings = this.loadSettingsFromStorage(tableName);\n this.settingsSubjects.set(tableName, new BehaviorSubject<TableSettings>(savedSettings));\n }\n return this.settingsSubjects.get(tableName)!.asObservable();\n }\n\n setCurrentTableName(tableName: string): void {\n this.currentTableNameSubject.next(tableName);\n }\n\n updateSettings(tableName: string, settings: TableSettings): void {\n if (!this.settingsSubjects.has(tableName)) {\n this.settingsSubjects.set(tableName, new BehaviorSubject<TableSettings>(settings));\n } else {\n this.settingsSubjects.get(tableName)!.next(settings);\n }\n this.saveSettingsToStorage(tableName, settings);\n }\n\n private loadSettingsFromStorage(tableName: string): TableSettings {\n try {\n const storageKey = `tableSettings_${tableName}`;\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n return { ...this.defaultSettings, ...JSON.parse(saved) };\n }\n } catch (error) {\n console.warn('Failed to load table settings from localStorage:', error);\n }\n return { ...this.defaultSettings };\n }\n\n private saveSettingsToStorage(tableName: string, settings: TableSettings): void {\n try {\n const storageKey = `tableSettings_${tableName}`;\n localStorage.setItem(storageKey, JSON.stringify(settings));\n } catch (error) {\n console.warn('Failed to save table settings to localStorage:', error);\n }\n }\n}\n","import { CommonModule, DatePipe, DecimalPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { map, Observable, of, take, shareReplay } from 'rxjs';\nimport { SearchParams, TableRowProperty, CoreService } from '@haloduck/core';\nimport { AutoLoadDirective } from '../../directive/auto-load.directive';\nimport { TableSettingService } from './table-setting.service';\n\nexport interface TableColumn {\n key: string | string[];\n label: string;\n width?: string;\n align?: 'text-left' | 'text-center' | 'text-right';\n sortable?: boolean;\n sort?: SearchParams.Sort;\n type?: 'number' | 'date' | 'datetime' | 'time' | 'custom';\n breakpoint?: string;\n hidden?: Observable<boolean>;\n customRenderFn?: (data: any) => Observable<string>;\n customRenderTemplate?: string; // Updated to string\n}\n\nexport interface TableRow extends TableRowProperty {\n [key: string]: any;\n}\n\n@Component({\n selector: 'haloduck-table',\n imports: [CommonModule, TranslocoModule, AutoLoadDirective],\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n providers: [provideTranslocoScope('haloduck')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent implements OnInit, AfterViewInit {\n private readonly coreService = inject(CoreService);\n private readonly tableSettingService = inject(TableSettingService);\n @ViewChild('loadMoreRow', { read: ElementRef }) loadMoreRowRef?: ElementRef;\n\n @Input() tableLayout: 'fixed' | 'auto' = 'auto';\n @Input() tableName: string = '';\n @Input() useLoadMore: boolean = true;\n\n private defaultAutoLoad: boolean = true;\n private defaultShowHeader: boolean = true;\n @Input() columns: TableColumn[] = [];\n @Input() rows: Observable<TableRow[]> = new Observable<TableRow[]>();\n @Input() isLoading: Observable<boolean> = new Observable<boolean>();\n @Input() isPaging: Observable<boolean> = new Observable<boolean>();\n @Input() sort: Observable<SearchParams.Sort[]> = new Observable<SearchParams.Sort[]>();\n @Input() expandedTemplate?: any; // TODO\n @Input() customTemplates: { [key: string]: any } = {}; // Add this line\n @Output() onSortChange = new EventEmitter<SearchParams.Sort>();\n @Input() lastEvaluatedKey: Observable<any> = new Observable<any>();\n @Output() onLoadMore = new EventEmitter<any>();\n @Output() onRowClick = new EventEmitter<TableRow>();\n @Output() onRowDblClick = new EventEmitter<TableRow>();\n\n settings$ = this.tableName\n ? this.tableSettingService.getSettings(this.tableName).pipe(shareReplay(1))\n : of({ showHeader: this.defaultShowHeader, autoLoad: this.defaultAutoLoad });\n\n showHeader$ = this.settings$.pipe(map((settings) => settings.showHeader));\n autoLoad$ = this.settings$.pipe(map((settings) => settings.autoLoad));\n\n getColumnValue(row: TableRow, column: TableColumn): Observable<string> {\n const value = this.getColumnValueRaw(row, column);\n\n if (column.customRenderFn) {\n return column.customRenderFn(value);\n }\n\n switch (column.type) {\n case 'date':\n return this.getDate(value);\n case 'datetime':\n return this.getDateTime(value);\n case 'time':\n return this.getTime(value);\n case 'number':\n return this.getNumber(value);\n default:\n return of(value);\n }\n }\n\n getColumnValueRaw(row: TableRow, column: TableColumn): any {\n if (Array.isArray(column.key)) {\n const value = this.getColumnValueRawWithArrayKey(row, column);\n return value;\n } else {\n return row[column.key];\n }\n }\n\n getColumnValueRawWithArrayKey(row: TableRow, column: TableColumn): any {\n let value: any = row;\n let invalidKey = false;\n\n for (const key of column.key as string[]) {\n if (Array.isArray(column.key) && column.key.length > 1) {\n const [first, ...remainingKeys] = column.key as string[];\n return this.getColumnValueRawWithArrayKey(value[first], {\n ...column,\n key: remainingKeys,\n });\n } else {\n if (invalidKey || value[key] === undefined) {\n invalidKey = true;\n break;\n }\n value = value[key];\n }\n }\n\n if (invalidKey) {\n value = '-';\n }\n return value;\n }\n\n getNumber(data: any): Observable<string> {\n const numberPipe = new DecimalPipe('en-US');\n try {\n return of(numberPipe.transform(data) || '');\n } catch (error) {\n return of('');\n }\n }\n\n getDate(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, 'shortDate') || '');\n } catch (error) {\n return of('');\n }\n return of(datePipe.transform(data, 'shortDate') || '');\n }\n\n getDateTime(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, this.coreService.getDateFormatLong()) || '');\n } catch (error) {\n return of('');\n }\n }\n\n getTime(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, 'Time') || '');\n } catch (error) {\n return of('');\n }\n }\n\n onUpdateSort(field: string | string[], direction: SearchParams.SortDirection): void {\n this.onSortChange.emit({ field, direction });\n }\n\n getSortDirection(field: string | string[]): Observable<string | undefined> {\n return this.sort.pipe(\n map((sort) => {\n const sortField = sort.find((s) => s.field === field);\n return sortField?.direction;\n }),\n );\n }\n\n onLoadMoreClicked(): void {\n this.lastEvaluatedKey.pipe(take(1)).subscribe((lastEvaluatedKey) => {\n this.onLoadMore.emit(lastEvaluatedKey);\n });\n }\n\n onAutoLoadTriggered(): void {\n this.autoLoad$.pipe(take(1)).subscribe((autoLoad) => {\n if (autoLoad) {\n this.lastEvaluatedKey.pipe(take(1)).subscribe((lastEvaluatedKey) => {\n this.onLoadMore.emit(lastEvaluatedKey);\n });\n }\n });\n }\n\n onRowClicked(row: TableRow) {\n this.onRowClick.emit(row);\n }\n\n onRowDblClicked(row: TableRow) {\n this.onRowDblClick.emit(row);\n }\n\n ngOnInit(): void {\n if (this.tableName) {\n this.settings$ = this.tableSettingService.getSettings(this.tableName).pipe(shareReplay(1));\n this.showHeader$ = this.settings$.pipe(map((settings) => settings.showHeader));\n this.autoLoad$ = this.settings$.pipe(map((settings) => settings.autoLoad));\n }\n }\n\n openSettings(): void {\n if (this.tableName) {\n this.tableSettingService.show(this.tableName);\n }\n }\n\n ngAfterViewInit(): void {}\n}\n","<div\n class=\"w-full h-full shadow border border-light-inactive dark:border-dark-inactive rounded-lg overflow-auto\"\n>\n <table\n class=\"w-full h-full\"\n [ngClass]=\"{\n 'table-fixed': tableLayout === 'fixed',\n 'table-auto': tableLayout === 'auto',\n }\"\n >\n <colgroup>\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <col class=\"{{ column.width || '' }}\" />\n }\n }\n </colgroup>\n @if (showHeader$ | async) {\n <thead class=\"bg-light-inactive/50 dark:bg-dark-inactive/50 rounded-tl-lg rounded-tr-lg\">\n <tr>\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <th\n scope=\"col\"\n class=\"{{\n column.align || ''\n }} py-3.5 pl-4 pr-3 text-sm font-semibold text-light-on-background dark:text-dark-on-background whitespace-nowrap\"\n >\n <span class=\"group inline-flex\">\n {{ column.label }}\n @if (column.sortable) {\n @switch (getSortDirection(column.sort?.field || column.key) | async) {\n @case ('desc') {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'asc')\"\n class=\"ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n @case ('asc') {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'desc')\"\n class=\"ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M14.78 11.78a.75.75 0 0 1-1.06 0L10 8.06l-3.72 3.72a.75.75 0 1 1-1.06-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n @default {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'asc')\"\n class=\"invisible ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive group-hover:visible group-focus:visible\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M14.78 11.78a.75.75 0 0 1-1.06 0L10 8.06l-3.72 3.72a.75.75 0 1 1-1.06-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n }\n }\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n }\n <tbody class=\"overflow-scroll\">\n @for (row of rows | async; track row['id']; let lastRow = $last) {\n <tr\n class=\"border-t border-light-inactive dark:border-dark-inactive {{ row.bgColor || '' }}\"\n (click)=\"onRowClicked(row)\"\n (dblclick)=\"onRowDblClicked(row)\"\n [ngClass]=\"{\n 'rounded-b-lg': lastRow && (lastEvaluatedKey | async) === null,\n 'even:bg-light-alternative dark:even:bg-dark-alternative odd:bg-light-background dark:odd:bg-dark-background':\n !row.bgColor,\n }\"\n [ngStyle]=\"{ 'background-color': row.bgColor || '' }\"\n >\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <td\n class=\"relative overflow-visible {{\n column.align || ''\n }} whitespace-nowrap px-3 text-sm text-light-on-background dark:text-dark-on-background\"\n [ngClass]=\"{\n 'first:rounded-bl-lg last:rounded-br-lg':\n lastRow && (lastEvaluatedKey | async) === null,\n 'text-wrap': row.isExpanded && column.type !== 'custom',\n 'overflow-x-hidden text-ellipsis': !row.isExpanded && column.type !== 'custom',\n 'py-2': column.type === 'custom',\n 'py-4': column.type !== 'custom',\n }\"\n >\n @if (column.type === 'custom') {\n @if (column.customRenderTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"customTemplates[column.customRenderTemplate]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column }\"\n ></ng-container>\n }\n } @else {\n {{ getColumnValue(row, column) | async }}\n }\n </td>\n }\n }\n </tr>\n\n @if (row.isExpanded && expandedTemplate) {\n <tr>\n <td [attr.colspan]=\"columns.length\"></td>\n </tr>\n <tr\n class=\"even:bg-light-alternative dark:even:bg-dark-alternative odd:bg-light-background dark:odd:bg-dark-background\"\n >\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 pb-4 text-sm text-center\"\n >\n <ng-container\n [ngTemplateOutlet]=\"expandedTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"\n ></ng-container>\n </td>\n </tr>\n }\n\n @if (lastRow && (lastEvaluatedKey | async) && !(isLoading | async) && useLoadMore) {\n <tr\n #loadMoreRow\n class=\"border-t border-light-inactive dark:border-dark-inactive bg-light-background dark:bg-dark-background\"\n haloduckAutoLoad\n [autoLoadEnabled]=\"(autoLoad$ | async) ?? true\"\n [autoLoadThreshold]=\"0.1\"\n (autoLoadTrigger)=\"onAutoLoadTriggered()\"\n >\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 py-4 text-sm text-light-on-background dark:text-dark-on-background text-center h-16 bg-light-background dark:bg-dark-background rounded-bl-lg rounded-br-lg\"\n >\n <div (click)=\"onLoadMoreClicked()\" class=\"cursor-pointer\">\n {{ 'haloduck.ui.table.Load More...' | transloco }}\n </div>\n </td>\n </tr>\n }\n } @empty {\n @if (!(isLoading | async)) {\n <tr>\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 py-4 text-sm text-light-on-background dark:text-dark-on-background text-center h-16 bg-light-background dark:bg-dark-background rounded-bl-lg rounded-br-lg\"\n >\n {{ 'haloduck.ui.table.No data available.' | transloco }}\n </td>\n </tr>\n }\n }\n\n @if (isLoading | async) {\n @for (i of [0, 1, 2, 3, 4]; track i; let lastRow = $last) {\n <tr\n class=\"bg-light-background dark:bg-dark-background border-t border-light-inactive/50 dark:border-dark-inactive/50\"\n >\n @for (column of columns; track column.key) {\n <td\n class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm\"\n [ngClass]=\"{ 'first:rounded-bl-lg last:rounded-br-lg': lastRow }\"\n >\n <div\n class=\"h-4 bg-light-inactive/50 dark:bg-dark-inactive/50 rounded-md animate-pulse\"\n ></div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n isDevMode,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'haloduck-toggle',\n imports: [CommonModule],\n templateUrl: './toggle.component.html',\n styleUrl: './toggle.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleComponent),\n multi: true,\n },\n ],\n})\nexport class ToggleComponent implements ControlValueAccessor, AfterViewInit {\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() value: boolean | null = false;\n @Input() disabled: boolean = false;\n @Input() nullable: boolean = false;\n @Output() toggled: EventEmitter<boolean | null> = new EventEmitter();\n @ViewChild('label') label!: ElementRef;\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: any): void {\n if (!this.nullable && (value === null || value === undefined)) {\n value = false;\n }\n\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onToggle(): void {\n if (this.nullable) {\n this.value = this.value ? false : this.value === null ? true : null;\n } else {\n this.value = !this.value;\n }\n\n this.onChange(this.value);\n this.onTouched();\n\n this.toggled.emit(this.value);\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (!this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n}\n","<div\n class=\"flex gap-2\"\n [ngClass]=\"{\n 'items-center justify-start': 'horizontal' === layout,\n 'flex-col items-start justify-center ': 'vertical' === layout,\n }\"\n>\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n <button\n class=\"w-12 p-1 rounded-l-full rounded-r-full outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-light-primary dark:foucs:outline-dark-primary bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/60 flex hover:cursor-pointer\"\n (click)=\"onToggle()\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'justify-end': true === value,\n 'justify-center': null === value,\n 'justify-start': false === value,\n }\"\n >\n <div\n class=\"shrink-0 h-[1.5rem] rounded-l-full rounded-r-full\"\n [ngClass]=\"{\n 'bg-light-primary dark:bg-dark-primary disabled:bg-light-primary/60 dark:disabled:bg-dark-primary/60':\n true === value,\n 'bg-light-inactive dark:bg-dark-inactive disabled:bg-light-inactive/60 dark:disabled:bg-dark-inactive/60':\n false === value,\n 'w-[1.5rem]': true === value || false === value,\n 'bg-light-primary-light dark:bg-dark-primary-light disabled:bg-light-primary-light/60 dark:disabled:bg-dark-primary-light/60 w-[2.4rem]':\n null === value,\n }\"\n ></div>\n </button>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { TableSettingService, TableSettings } from './table-setting.service';\nimport { ButtonComponent } from '../button/button.component';\nimport { ToggleComponent } from '../toggle/toggle.component';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'haloduck-table-setting',\n imports: [CommonModule, TranslocoModule, FormsModule, ButtonComponent, ToggleComponent],\n template: `\n <div class=\"flex justify-between items-center mb-4\">\n <h2 class=\"text-md font-semibold text-light-on-background dark:text-dark-on-background\">\n {{ 'haloduck.ui.table.settings' | transloco }}\n </h2>\n </div>\n\n @if (currentSettings$ | async; as settings) {\n <div class=\"flex flex-col gap-4 p-4\">\n <haloduck-toggle\n [(ngModel)]=\"settings.showHeader\"\n (ngModelChange)=\"onSettingChange(settings)\"\n >\n {{ 'haloduck.ui.table.Show headers' | transloco }}\n </haloduck-toggle>\n\n <haloduck-toggle\n [(ngModel)]=\"settings.autoLoad\"\n (ngModelChange)=\"onSettingChange(settings)\"\n >\n {{ 'haloduck.ui.table.Auto load' | transloco }}\n </haloduck-toggle>\n </div>\n }\n\n <div class=\"flex justify-end mt-6\">\n <haloduck-button variant=\"none\" size=\"sm\" (click)=\"close()\">\n {{ 'haloduck.ui.button.Close' | transloco }}\n </haloduck-button>\n </div>\n `,\n providers: [provideTranslocoScope('haloduck')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableSettingComponent implements OnInit {\n private readonly tableSettingService = inject(TableSettingService);\n\n @Input() context?: { tableName: string; overlayRef: OverlayRef };\n\n get currentSettings$() {\n const tableName = this.context?.tableName;\n return tableName\n ? this.tableSettingService.getSettings(tableName)\n : this.tableSettingService.getSettings('');\n }\n\n ngOnInit() {\n console.log('Table settings initialized', this.context);\n }\n\n close(): void {\n if (this.context?.overlayRef) {\n this.tableSettingService.hide();\n }\n }\n\n onSettingChange(settings: TableSettings): void {\n const tableName = this.context?.tableName;\n if (tableName) {\n this.tableSettingService.updateSettings(tableName, settings);\n }\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface TabItem {\n id?: string;\n label: string;\n component: Type<any>;\n inputs?: Record<string, any>;\n}\n\n@Component({\n selector: 'haloduck-tabs',\n imports: [CommonModule],\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.css',\n})\nexport class TabsComponent implements OnChanges, AfterViewInit {\n @Input() tabs: TabItem[] = [];\n @Input() selectedIndex: number = 0;\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() labelWidth: string = '';\n\n @Output() selectedIndexChange = new EventEmitter<number>();\n\n @ViewChild('label') label!: ElementRef;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tabs']) {\n this.ensureSelectedInRange();\n }\n if (changes['selectedIndex']) {\n this.ensureSelectedInRange();\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n get current(): TabItem | null {\n if (!this.tabs || this.tabs.length === 0) return null;\n const idx = Math.min(Math.max(this.selectedIndex, 0), this.tabs.length - 1);\n return this.tabs[idx];\n }\n\n select(index: number) {\n if (index < 0 || index >= this.tabs.length) return;\n this.selectedIndex = index;\n this.selectedIndexChange.emit(this.selectedIndex);\n }\n\n private ensureSelectedInRange() {\n if (!this.tabs || this.tabs.length === 0) {\n this.selectedIndex = 0;\n return;\n }\n if (this.selectedIndex < 0) this.selectedIndex = 0;\n if (this.selectedIndex > this.tabs.length - 1) this.selectedIndex = this.tabs.length - 1;\n }\n}\n","<div class=\"flex gap-2 items-start w-full\" [ngClass]=\"{ 'flex-col': layout === 'vertical' }\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control {{\n labelWidth\n }}\"\n [ngClass]=\"{ 'w-full': layout === 'vertical' }\"\n >\n <ng-content select=\"[slot=label]\"></ng-content>\n </label>\n\n <div class=\"flex-1 w-full\">\n <div\n class=\"flex items-center gap-1 border-b border-light-inactive dark:border-dark-inactive text-sm/6\"\n >\n @for (tab of tabs; track tab.label; let i = $index) {\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded-t-md\"\n [ngClass]=\"{\n 'text-light-on-control dark:text-dark-on-control': i !== selectedIndex,\n 'text-light-primary dark:text-dark-primary border-b-2 border-light-primary dark:border-dark-primary':\n i === selectedIndex,\n }\"\n (click)=\"select(i)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <div class=\"mt-3\">\n @if (current) {\n <ng-container\n *ngComponentOutlet=\"current!.component; inputs: current!.inputs || {}\"\n ></ng-container>\n }\n </div>\n </div>\n</div>\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-tag-viewer',\n imports: [CommonModule],\n templateUrl: './tag-viewer.component.html',\n styleUrl: './tag-viewer.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class TagViewerComponent implements AfterViewInit {\n @ViewChild('label') label!: ElementRef;\n\n tags: string[] = [];\n\n @Input() shouldWrap: boolean = true;\n\n // Accept input as `value` for consistency with tag-input\n @Input() set value(tags: string[] | null) {\n if (Array.isArray(tags)) {\n this.tags = tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no projected content\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n\n <div\n class=\"block w-full rounded-md px-2 py-1.5 text-base text-light-on-control dark:text-dark-on-control sm:text-sm/6\"\n >\n <div class=\"flex items-center gap-2\" [ngClass]=\"shouldWrap ? 'flex-wrap' : 'flex-nowrap'\">\n @for (tag of tags; track tag) {\n <span\n class=\"inline-flex items-center gap-1 rounded-md bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary px-2 py-0.5 text-xs\"\n >\n {{ tag }}\n </span>\n }\n </div>\n </div>\n</div>\n","import { Directive, ElementRef, Input, OnInit, Renderer2, HostBinding } from '@angular/core';\n\nexport interface GroupedConfig {\n layoutClasses?: string;\n bgClasses?: string;\n borderClasses?: string;\n labelText?: string;\n labelClasses?: string;\n labelOffset?: string;\n}\n\n@Directive({\n selector: '[haloduckGrouped]',\n standalone: true,\n})\nexport class GroupedDirective implements OnInit {\n @Input() haloduckGrouped: GroupedConfig | string = {};\n @Input() layoutClasses: string = 'p-4 mt-2';\n @Input() bgClasses: string = '';\n @Input() borderClasses: string = 'border border-light-inactive dark:border-dark-inactive rounded';\n @Input() labelText: string = '';\n @Input() labelClasses: string =\n 'absolute bg-light-inactive dark:bg-dark-inactive text-light-on-inactive dark:text-dark-on-inactive px-2 py-0.5 text-sm font-medium rounded';\n @Input() labelOffset: string = '-10px';\n\n @HostBinding('class') hostClasses = 'relative';\n\n private labelElement: HTMLElement | null = null;\n\n constructor(\n private elementRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.applyConfig();\n\n this.createLayout();\n this.createBorder();\n this.createLabel();\n }\n\n private applyConfig(): void {\n if (typeof this.haloduckGrouped === 'string') {\n this.labelText = this.haloduckGrouped;\n } else if (typeof this.haloduckGrouped === 'object') {\n const config = this.haloduckGrouped;\n this.layoutClasses = config.layoutClasses ?? this.layoutClasses;\n this.bgClasses = config.bgClasses ?? this.bgClasses;\n this.borderClasses = config.borderClasses ?? this.borderClasses;\n this.labelText = config.labelText ?? this.labelText;\n this.labelClasses = config.labelClasses ?? this.labelClasses;\n this.labelOffset = config.labelOffset ?? this.labelOffset;\n }\n }\n\n private createLayout(): void {\n const element = this.elementRef.nativeElement;\n this.addClasses(element, this.layoutClasses);\n }\n\n private createBorder(): void {\n const element = this.elementRef.nativeElement;\n\n // 기존 테두리 클래스 제거\n this.removeBorderClasses(element);\n\n // Tailwind 클래스 추가\n this.addClasses(element, this.borderClasses);\n }\n\n private createLabel(): void {\n if (!this.labelText) return;\n\n const element = this.elementRef.nativeElement;\n\n // 기존 라벨 제거\n if (this.labelElement) {\n this.renderer.removeChild(element, this.labelElement);\n }\n\n // 라벨 요소 생성\n this.labelElement = this.renderer.createElement('span');\n\n // Tailwind 클래스 적용\n if (this.labelElement) {\n this.addClasses(this.labelElement, this.labelClasses);\n }\n\n // 커스텀 스타일 (Tailwind로 매핑할 수 없는 속성들)\n this.renderer.setStyle(this.labelElement, 'top', this.labelOffset);\n this.renderer.setStyle(this.labelElement, 'left', '8px');\n this.renderer.setStyle(this.labelElement, 'white-space', 'nowrap');\n this.renderer.setStyle(this.labelElement, 'z-index', '10');\n this.renderer.setStyle(this.labelElement, 'pointer-events', 'none');\n\n // 라벨 텍스트 설정\n this.renderer.setProperty(this.labelElement, 'textContent', this.labelText);\n\n // 요소에 라벨 추가\n this.renderer.appendChild(element, this.labelElement);\n }\n\n private addClasses(element: HTMLElement, classString: string): void {\n if (!classString) return;\n\n // 공백으로 구분된 클래스들을 분리하여 각각 추가\n const classes = classString.split(' ').filter((className) => className.trim());\n classes.forEach((className) => {\n if (className.trim()) {\n this.renderer.addClass(element, className.trim());\n }\n });\n }\n\n private removeBorderClasses(element: HTMLElement): void {\n // 기본 테두리 클래스들 제거\n const defaultBorderClasses = [\n 'border',\n 'border-2',\n 'border-3',\n 'border-4',\n 'border-8',\n 'border-solid',\n 'border-dashed',\n 'border-dotted',\n 'border-double',\n 'border-none',\n 'rounded-none',\n 'rounded-sm',\n 'rounded',\n 'rounded-md',\n 'rounded-lg',\n 'rounded-xl',\n 'rounded-2xl',\n 'rounded-3xl',\n 'rounded-full',\n 'border-gray-200',\n 'border-gray-300',\n 'border-gray-400',\n 'border-gray-500',\n 'border-gray-600',\n 'border-gray-700',\n 'border-gray-800',\n 'border-gray-900',\n 'border-blue-500',\n 'border-blue-700',\n 'border-red-500',\n 'border-red-600',\n 'border-green-500',\n 'border-green-600',\n 'border-amber-500',\n 'border-amber-600',\n 'border-violet-500',\n 'border-violet-600',\n 'border-pink-500',\n 'border-pink-600',\n 'border-white',\n 'border-black',\n ];\n\n defaultBorderClasses.forEach((className) => {\n this.renderer.removeClass(element, className);\n });\n }\n\n // 라벨 텍스트 업데이트 메서드\n updateLabel(text: string): void {\n if (this.labelElement) {\n this.renderer.setProperty(this.labelElement, 'textContent', text);\n }\n }\n\n // 라벨 표시/숨김 메서드\n toggleLabel(show: boolean): void {\n if (this.labelElement) {\n if (show) {\n this.renderer.removeClass(this.labelElement, 'hidden');\n } else {\n this.renderer.addClass(this.labelElement, 'hidden');\n }\n }\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, Router, NavigationEnd } from '@angular/router';\nimport { CoreService } from '@haloduck/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\ninterface Breadcrumb {\n label: string;\n url: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BreadcrumbService {\n private readonly coreService = inject(CoreService);\n private breadcrumbs = new BehaviorSubject<Breadcrumb[]>([]);\n breadcrumbs$ = this.breadcrumbs.asObservable();\n private readonly titleService = inject(Title);\n\n constructor(private router: Router) {\n this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {\n const root = this.router.routerState.snapshot.root;\n const breadcrumbs = this.createBreadcrumbs(root);\n this.breadcrumbs.next(breadcrumbs);\n\n setTimeout(() => {\n const titlePrefix =\n this.coreService.getStage() === 'prod'\n ? ''\n : `[${this.coreService.getStage()}] ` + this.coreService.getAppName() + '::';\n\n const title =\n titlePrefix +\n breadcrumbs.reduce((acc, breadcrumb) => {\n return acc ? `${acc}>${breadcrumb.label}` : breadcrumb.label;\n }, '');\n\n this.titleService.setTitle(title || 'Default Title');\n });\n });\n }\n\n private createBreadcrumbs(\n route: ActivatedRouteSnapshot,\n url: string = '',\n breadcrumbs: Breadcrumb[] = [],\n ): Breadcrumb[] {\n const children: ActivatedRouteSnapshot[] = route.children;\n\n if (children.length === 0) {\n return breadcrumbs;\n }\n\n for (const child of children) {\n const routeURL: string = child.url.map((segment) => segment.path).join('/');\n if (routeURL !== '') {\n url += `/${routeURL}`;\n }\n\n if (child.data['breadcrumb']) {\n breadcrumbs.push({ label: child.data['breadcrumb'], url });\n }\n\n return this.createBreadcrumbs(child, url, breadcrumbs);\n }\n\n return breadcrumbs;\n }\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { BreadcrumbService } from './breadcrumb.service';\nimport { TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-breadcrumb',\n imports: [RouterLink, TranslocoModule],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.css',\n})\nexport class BreadcrumbComponent implements OnInit {\n private readonly breadcrumbService = inject(BreadcrumbService);\n listBreadcrumb: { label: string; url: string }[] = [];\n\n ngOnInit() {\n this.breadcrumbService.breadcrumbs$.subscribe((listBreadcrumb) => {\n this.listBreadcrumb = listBreadcrumb;\n });\n }\n}\n","<nav\n class=\"flex border-b border-light-inactive dark:border-dark-inactive bg-light-background dark:bg-dark-background\"\n aria-label=\"Breadcrumb\"\n>\n <ol role=\"list\" class=\"flex w-full max-w-(--breakpoint-xl) space-x-4 px-4 sm:px-6 lg:px-8\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a\n routerLink=\"/\"\n class=\"text-light-on-background dark:text-dark-on-background hover:scale-105\"\n >\n <svg\n class=\"size-5 shrink-0\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n <span class=\"sr-only\">Home</span>\n </a>\n </div>\n </li>\n @for (breadcrumb of listBreadcrumb; track breadcrumb.label; let last = $last) {\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <svg\n class=\"h-full w-6 shrink-0 text-light-inactive dark:text-dark-inactive\"\n viewBox=\"0 0 24 44\"\n preserveAspectRatio=\"none\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\" />\n </svg>\n @if (!last) {\n <a\n href=\"javascript:void(0)\"\n [routerLink]=\"breadcrumb.url\"\n class=\"ml-4 text-sm font-medium hover:font-bold text-light-on-background dark:text-dark-on-background\"\n >{{ breadcrumb.label | transloco }}</a\n >\n } @else {\n <span\n class=\"ml-4 text-sm font-medium text-light-on-background dark:text-dark-on-background\"\n >{{ breadcrumb.label | transloco }}</span\n >\n }\n </div>\n </li>\n }\n </ol>\n</nav>\n","import { Component, inject } from '@angular/core';\nimport { NotificationService } from './notification.service';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'haloduck-notification',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './notification.component.html',\n styleUrl: './notification.component.css',\n})\nexport class NotificationComponent {\n private readonly notificationService = inject(NotificationService);\n listNotification$ = this.notificationService.getListNotification();\n\n removeNotification(id: string) {\n this.notificationService.removeNotificationById(id);\n }\n}\n","@for (notification of listNotification$ | async; track notification.id) {\n <div\n class=\"relative rounded-lg m-4 px-8 py-4 bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary animate-fadeIn\"\n [ngClass]=\"{\n 'bg-light-primary-dark dark:bg-dark-primary-dark text-light-on-primary-dark dark:text-dark-on-primary-dark':\n notification.type === 'info',\n 'bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary':\n notification.type === 'success',\n 'bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger':\n notification.type === 'error',\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n notification.type === 'warning',\n }\"\n >\n {{ notification.message }}\n <div class=\"absolute top-0 right-0\">\n <button type=\"button\" (click)=\"removeNotification(notification.id)\">\n <span class=\"sr-only\">Close</span>\n <svg\n class=\"size-6 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'haloduck-picture-name',\n imports: [],\n templateUrl: './picture-name.component.html',\n styleUrl: './picture-name.component.css',\n})\nexport class PictureNameComponent {\n @Input() name?: string = '';\n @Input() pictureKey?: string;\n @Input() cdnUrl?: string = '';\n}\n","<div class=\"flex items-center justify-start gap-2\">\n @if (pictureKey) {\n <img src=\"{{ cdnUrl }}/{{ pictureKey }}\" alt=\"사진\" class=\"w-8 h-8 rounded-full\" />\n } @else {\n <div class=\"w-8 h-8 bg-light-inactive dark:bg-dark-inactive rounded-full\"></div>\n }\n {{ name }}\n @if (name) {\n \n <!-- TODO -->\n }\n</div>\n","import { provideTranslocoScope } from '@jsverse/transloco';\n\nexport const provideHaloduckTransloco = () =>\n provideTranslocoScope({\n scope: 'haloduck',\n alias: 'haloduck',\n });\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"haloduck-ui.mjs","sources":["../../../../projects/haloduck/ui/src/lib/layout/notification/notification.service.ts","../../../../projects/haloduck/ui/src/lib/control/button/button.component.ts","../../../../projects/haloduck/ui/src/lib/control/button/button.component.html","../../../../projects/haloduck/ui/src/lib/control/input/input.component.ts","../../../../projects/haloduck/ui/src/lib/control/input/input.component.html","../../../../projects/haloduck/ui/src/lib/component/authenticate/authenticate.component.ts","../../../../projects/haloduck/ui/src/lib/component/authenticate/authenticate.component.html","../../../../projects/haloduck/ui/src/lib/component/authenticate-callback/authenticate-callback.component.ts","../../../../projects/haloduck/ui/src/lib/component/authenticate-callback/authenticate-callback.component.html","../../../../projects/haloduck/ui/src/lib/control/select/select-dropdown/select-dropdown.component.ts","../../../../projects/haloduck/ui/src/lib/control/select/select-dropdown/select-dropdown.component.html","../../../../projects/haloduck/ui/src/lib/control/select/select.component.ts","../../../../projects/haloduck/ui/src/lib/control/select/select.component.html","../../../../projects/haloduck/ui/src/lib/control/calendar/calendar.component.ts","../../../../projects/haloduck/ui/src/lib/control/calendar/calendar.component.html","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog-container.component.ts","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog-container.component.html","../../../../projects/haloduck/ui/src/lib/layout/dialog-container/dialog.service.ts","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.component.ts","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.component.html","../../../../projects/haloduck/ui/src/lib/control/confirm-dialog/confirm-dialog.service.ts","../../../../projects/haloduck/ui/src/lib/control/copy-button/copy-button.component.ts","../../../../projects/haloduck/ui/src/lib/control/copy-button/copy-button.component.html","../../../../projects/haloduck/ui/src/lib/control/date-picker/date-picker.component.ts","../../../../projects/haloduck/ui/src/lib/control/date-picker/date-picker.component.html","../../../../projects/haloduck/ui/src/lib/control/date-range/date-range.component.ts","../../../../projects/haloduck/ui/src/lib/control/date-range/date-range.component.html","../../../../projects/haloduck/ui/src/lib/control/draw-canvas/draw-canvas.component.ts","../../../../projects/haloduck/ui/src/lib/control/draw-canvas/draw-canvas.component.html","../../../../projects/haloduck/ui/src/lib/control/tag-input/tag-input.component.ts","../../../../projects/haloduck/ui/src/lib/control/tag-input/tag-input.component.html","../../../../projects/haloduck/ui/src/lib/control/file-uploader/file-uploader.component.ts","../../../../projects/haloduck/ui/src/lib/control/file-uploader/file-uploader.component.html","../../../../projects/haloduck/ui/src/lib/control/flip/flip.component.ts","../../../../projects/haloduck/ui/src/lib/control/flip/flip.component.html","../../../../projects/haloduck/ui/src/lib/control/image-viewer/image-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/image-viewer/image-viewer.component.html","../../../../projects/haloduck/ui/src/lib/control/image-uploader/image-uploader.component.ts","../../../../projects/haloduck/ui/src/lib/control/image-uploader/image-uploader.component.html","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector-option/language-selector-option.component.ts","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector-option/language-selector-option.component.html","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector.component.ts","../../../../projects/haloduck/ui/src/lib/control/language-selector/language-selector.component.html","../../../../projects/haloduck/ui/src/lib/control/map-to-address/map-to-address.component.ts","../../../../projects/haloduck/ui/src/lib/control/map-to-address/map-to-address.component.html","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu-item/side-menu-item.component.ts","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu-item/side-menu-item.component.html","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu.component.ts","../../../../projects/haloduck/ui/src/lib/control/side-menu/side-menu.component.html","../../../../projects/haloduck/ui/src/lib/control/stl-viewer/stl-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/stl-viewer/stl-viewer.component.html","../../../../projects/haloduck/ui/src/lib/directive/auto-load.directive.ts","../../../../projects/haloduck/ui/src/lib/control/table/table-setting.service.ts","../../../../projects/haloduck/ui/src/lib/control/table/table.component.ts","../../../../projects/haloduck/ui/src/lib/control/table/table.component.html","../../../../projects/haloduck/ui/src/lib/control/toggle/toggle.component.ts","../../../../projects/haloduck/ui/src/lib/control/toggle/toggle.component.html","../../../../projects/haloduck/ui/src/lib/control/table/table-setting.component.ts","../../../../projects/haloduck/ui/src/lib/control/tabs/tabs.component.ts","../../../../projects/haloduck/ui/src/lib/control/tabs/tabs.component.html","../../../../projects/haloduck/ui/src/lib/control/tag-viewer/tag-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/tag-viewer/tag-viewer.component.html","../../../../projects/haloduck/ui/src/lib/control/grouped/grouped.directive.ts","../../../../projects/haloduck/ui/src/lib/control/wysiwyg-editor/wysiwyg-icons.ts","../../../../projects/haloduck/ui/src/lib/control/wysiwyg-editor/wysiwyg-editor.component.ts","../../../../projects/haloduck/ui/src/lib/control/wysiwyg-editor/wysiwyg-editor.component.html","../../../../projects/haloduck/ui/src/lib/control/wysiwyg-editor/wysiwyg-viewer.component.ts","../../../../projects/haloduck/ui/src/lib/control/wysiwyg-editor/wysiwyg-viewer.component.html","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.service.ts","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.component.ts","../../../../projects/haloduck/ui/src/lib/layout/breadcrumb/breadcrumb.component.html","../../../../projects/haloduck/ui/src/lib/layout/notification/notification.component.ts","../../../../projects/haloduck/ui/src/lib/layout/notification/notification.component.html","../../../../projects/haloduck/ui/src/lib/widget/picture-name/picture-name.component.ts","../../../../projects/haloduck/ui/src/lib/widget/picture-name/picture-name.component.html","../../../../projects/haloduck/ui/src/transloco/transloco.scope.ts","../../../../projects/haloduck/ui/src/haloduck-ui.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { ulid } from 'ulid';\n\n// Flutter 앱과의 통신을 위한 전역 인터페이스 선언\ndeclare global {\n interface Window {\n FlutterApp?: {\n postMessage: (message: string) => void;\n };\n }\n}\n\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\nexport interface Notification {\n id: string;\n type: NotificationType;\n message: string;\n timeout?: number;\n timeoutRef?: number;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NotificationService {\n private listNotification$ = new BehaviorSubject<Notification[]>([]);\n private listNotification: Notification[] = [];\n\n showNotification(title: string, body: string, timeout?: number, payload: any = null) {\n if (window.FlutterApp) {\n window.FlutterApp.postMessage(\n JSON.stringify({\n action: 'showNotification',\n title: title,\n body: body,\n payload: payload,\n timeout: timeout,\n }),\n );\n } else if ('Notification' in window && Notification.permission === 'granted') {\n // 웹브라우저에서 실행될 때는 기본 브라우저 알림 사용\n new Notification(title, { body: body });\n } else {\n // 기본 내부 알림 시스템 사용\n this._showNotification('info', body, timeout);\n }\n }\n\n _showNotification(type: NotificationType, message: string, timeout?: number): string {\n const id = ulid();\n const notification: Notification = { id, type, message, timeout };\n\n if (timeout && timeout > 0) {\n const timeoutRef = window.setTimeout(() => {\n this.removeNotificationById(id);\n }, timeout);\n notification.timeoutRef = timeoutRef;\n }\n\n this.listNotification.push(notification);\n this.listNotification$.next(this.listNotification);\n\n return id;\n }\n\n getListNotification(): Observable<Notification[]> {\n return this.listNotification$.asObservable();\n }\n\n removeNotificationById(id: string) {\n const notification = this.listNotification.find((n) => n.id === id);\n if (notification?.timeoutRef) {\n clearTimeout(notification.timeoutRef);\n }\n\n this.listNotification = this.listNotification.filter((n) => n.id !== id);\n this.listNotification$.next(this.listNotification);\n }\n\n constructor() {}\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'none';\n\n@Component({\n selector: 'haloduck-button',\n imports: [CommonModule],\n templateUrl: './button.component.html',\n styleUrl: './button.component.css',\n})\nexport class ButtonComponent {\n @Input() disabled: boolean | null = false;\n @Input() variant: ButtonVariant = 'primary';\n}\n","<button\n type=\"button\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'bg-light-primary text-light-on-primary dark:bg-dark-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'bg-light-primary-light text-light-on-primary-light dark:bg-dark-primary-light dark:text-dark-on-primary-light':\n variant === 'secondary' && !disabled,\n 'bg-light-danger text-light-on-danger dark:bg-dark-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n 'bg-light-background text-light-on-background dark:bg-dark-background dark:text-dark-on-background border border-light-on-background dark:border-dark-on-background':\n variant === 'none' && !disabled,\n 'bg-light-inactive text-light-on-inactive dark:bg-dark-inactive dark:text-dark-on-inactive active:animate-bounce hover:cursor-not-allowed':\n disabled,\n 'active:scale-95 transition-transform': !disabled,\n 'hover:cursor-pointer': !disabled,\n }\"\n class=\"px-4 py-1.5 rounded-lg text-sm/6 w-full text-nowrap\"\n>\n <ng-content></ng-content>\n</button>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n ViewChild,\n forwardRef,\n ChangeDetectorRef,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-input',\n templateUrl: './input.component.html',\n styleUrls: ['./input.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class InputComponent implements ControlValueAccessor, AfterViewInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @ViewChild('label') label!: ElementRef;\n @ViewChild('input') private inputElement!: ElementRef<HTMLElement>;\n\n @Input() placeholder: string = '';\n @Input() type: string = 'text';\n @Input() disabled: boolean = false;\n @Input() rows: number = 1;\n @Input() autofocus: boolean = false;\n @Input() value: string = '';\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: any): void {\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n focus() {\n this.inputElement?.nativeElement?.focus();\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n this.onChange(this.value);\n this.onTouched();\n\n if (this.rows > 1) {\n input.style.height = 'auto';\n input.style.height = input.scrollHeight + 'px';\n }\n }\n\n onKeydown($event: KeyboardEvent) {\n if (this.rows === 1 && $event.key === 'Enter') {\n $event.preventDefault();\n $event.stopPropagation();\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (!this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n\n if (this.autofocus) {\n // Ensure change detection is complete and view is stable\n this.cdr.detectChanges();\n setTimeout(() => {\n if (this.inputElement?.nativeElement instanceof HTMLElement) {\n this.inputElement.nativeElement.focus();\n }\n }, 100);\n }\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n @if (rows > 1) {\n <textarea\n #input\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [rows]=\"rows\"\n (keydown)=\"onKeydown($event)\"\n class=\"block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-3 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary sm:text-sm/6\"\n ></textarea>\n } @else {\n <input\n #input\n [type]=\"type\"\n [value]=\"value\"\n (input)=\"onInput($event)\"\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n (keydown)=\"onKeydown($event)\"\n class=\"block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-3 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary sm:text-sm/6\"\n />\n }\n</div>\n","// auth.component.ts\nimport { Component, inject, Input, InjectionToken, OnInit } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport {\n signIn,\n resetPassword,\n confirmResetPassword,\n confirmSignIn,\n signUp,\n confirmSignUp,\n resendSignUpCode,\n getCurrentUser,\n signOut,\n} from 'aws-amplify/auth';\nimport {\n FormBuilder,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\nimport { NotificationService } from '../../layout/notification/notification.service';\nimport { ButtonComponent } from '../../control/button/button.component';\nimport { InputComponent } from '../../control/input/input.component';\nimport { CommonModule } from '@angular/common';\nimport { provideTranslocoScope, TranslocoService, TranslocoModule } from '@jsverse/transloco';\n\nexport interface SocialLoginProvider {\n name: 'google' | 'apple' | 'kakao';\n enabled: boolean;\n clientId?: string;\n redirectUrl?: string;\n state?: { [key: string]: string };\n}\n\nexport interface MetaData {\n userType: string;\n groupId: string;\n}\n\nexport interface AuthenticateConfig {\n socialLoginProviders?: SocialLoginProvider[];\n metaData?: MetaData;\n useSignUp?: boolean;\n}\n\n// Unified injection token for authenticate configuration\nexport const AUTHENTICATE_CONFIG = new InjectionToken<AuthenticateConfig>('AUTHENTICATE_CONFIG');\n\n// Provider function for unified authenticate configuration\nexport function provideAuthenticateConfig(config: AuthenticateConfig) {\n return {\n provide: AUTHENTICATE_CONFIG,\n useValue: config,\n };\n}\n\n// Legacy provider functions for backward compatibility\nexport function provideSocialLoginProviders(providers: SocialLoginProvider[]) {\n return provideAuthenticateConfig({ socialLoginProviders: providers });\n}\n\nexport function provideAuthenticateMetadata(metadata: MetaData) {\n return provideAuthenticateConfig({ metaData: metadata });\n}\n\n// Custom validator for password confirmation\nfunction passwordMatchValidator(control: AbstractControl): ValidationErrors | null {\n const password = control.get('password');\n const confirmPassword = control.get('confirmPassword');\n\n if (!password || !confirmPassword) {\n return null;\n }\n\n return password.value === confirmPassword.value ? null : { passwordMismatch: true };\n}\n\n@Component({\n selector: 'haloduck-authenticate',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n InputComponent,\n ButtonComponent,\n CommonModule,\n TranslocoModule,\n ],\n templateUrl: './authenticate.component.html',\n styleUrl: './authenticate.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class AuthenticateComponent implements OnInit {\n private notificationService = inject(NotificationService);\n private injectedConfig = inject(AUTHENTICATE_CONFIG, { optional: true });\n private translateService = inject(TranslocoService);\n\n @Input() metaData?: any;\n @Input() socialLoginProviders?: SocialLoginProvider[];\n @Input() useSignUp?: boolean;\n\n // Computed properties that merge injected config with input properties\n get effectiveMetaData(): any {\n return { ...this.injectedConfig?.metaData, ...this.metaData };\n }\n\n get effectiveSocialProviders(): SocialLoginProvider[] {\n return this.socialLoginProviders || this.injectedConfig?.socialLoginProviders || [];\n }\n\n get effectiveUseSignUp(): boolean {\n return this.useSignUp ?? this.injectedConfig?.useSignUp ?? true;\n }\n\n @Input() showSocialLogin: boolean = true;\n @Input() showDivider: boolean = true;\n\n loginForm: FormGroup;\n signupForm: FormGroup;\n confirmSignupForm: FormGroup;\n resetForm: FormGroup;\n newPasswordForm: FormGroup;\n otpForm: FormGroup;\n\n stage: 'login' | 'signup' | 'confirmSignup' | 'reset' | 'newPassword' | 'otpVerify' = 'login';\n emailForReset: string = '';\n emailForConfirm: string = '';\n isCurrentlySignedIn: boolean = false;\n currentUserEmail: string = '';\n\n constructor(\n private fb: FormBuilder,\n private http: HttpClient,\n ) {\n this.loginForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n });\n\n this.signupForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n confirmPassword: ['', Validators.required],\n }, { validators: passwordMatchValidator });\n\n this.confirmSignupForm = fb.group({\n code: ['', Validators.required],\n });\n\n this.resetForm = fb.group({\n email: ['', [Validators.required, Validators.email]],\n });\n\n this.newPasswordForm = fb.group({\n newPassword: ['', Validators.required],\n });\n\n this.otpForm = fb.group({\n code: ['', Validators.required],\n newPassword: ['', Validators.required],\n });\n }\n\n ngOnInit() {\n this.checkCurrentUserStatus();\n }\n\n checkCurrentUserStatus() {\n getCurrentUser()\n .then((currentUser) => {\n this.isCurrentlySignedIn = true;\n this.currentUserEmail = currentUser.signInDetails?.loginId || currentUser.username || '';\n })\n .catch(() => {\n this.isCurrentlySignedIn = false;\n this.currentUserEmail = '';\n });\n }\n\n switchStage(stage: 'login' | 'signup' | 'confirmSignup' | 'reset' | 'newPassword' | 'otpVerify') {\n this.stage = stage;\n }\n\n login() {\n signIn({\n username: this.loginForm.value.email,\n password: this.loginForm.value.password,\n options: {\n authFlowType: 'USER_PASSWORD_AUTH',\n clientMetadata: { ...this.effectiveMetaData, provider: 'email' },\n },\n })\n .then((res: any) => {\n console.log('Login response:', res);\n console.log('Next step:', res.nextStep?.signInStep);\n\n if (res.nextStep?.signInStep === 'CONFIRM_SIGN_UP') {\n // 사용자가 미확인 상태 - 확인 코드 입력 화면으로 이동\n this.emailForConfirm = this.loginForm.value.email;\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Your account is not confirmed yet. Please check your email for the confirmation code.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('info', translation, 3000);\n });\n this.switchStage('confirmSignup');\n } else if (res.nextStep?.signInStep === 'CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED') {\n this.switchStage('newPassword');\n } else if (res.isSignedIn) {\n this.translateService\n .selectTranslate('ui.authenticate.Successfully signed in.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 3000);\n });\n } else {\n // 다른 nextStep이 있을 수 있으므로 로그로 확인\n console.log('Unhandled sign-in step:', res.nextStep);\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Please complete additional sign-in steps.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('info', translation, 3000);\n });\n }\n })\n .catch((err) => {\n console.log('Login error:', err);\n if (err.code === 'NotAuthorizedException' || err.name === 'NotAuthorizedException') {\n // Check if temporary password has expired\n if (err.message && err.message.includes('Temporary password has expired')) {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Your temporary password has expired. Please contact an administrator to receive a new temporary password.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n // Stay on login screen - user needs to wait for admin to reset password\n } else {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Invalid email or password. You can reset your password if needed.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n this.switchStage('reset');\n }\n } else {\n this.translateService\n .selectTranslate('ui.authenticate.Failed to sign in.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n }\n });\n }\n\n confirmNewPassword() {\n confirmSignIn({\n challengeResponse: this.newPasswordForm.value.newPassword,\n options: {\n clientMetadata: { ...this.effectiveMetaData, provider: 'email' },\n },\n })\n .then(() => {\n this.translateService\n .selectTranslate('ui.authenticate.Successfully signed in.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 3000);\n });\n })\n .catch((err) => {\n if (err.code === 'NotAuthorizedException') {\n this.translateService\n .selectTranslate('ui.authenticate.Failed to sign in for new password.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n } else if (err.code === 'InvalidPasswordException') {\n this.translateService\n .selectTranslate('ui.authenticate.Invalid password.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n } else {\n this.translateService\n .selectTranslate('ui.authenticate.Failed to confirm new password.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n }\n });\n }\n\n signup() {\n // this.http.post('/api/signup', this.signupForm.value).subscribe(console.log);\n signUp({\n username: this.signupForm.value.email,\n password: this.signupForm.value.password,\n options: {\n userAttributes: { email: this.signupForm.value.email },\n clientMetadata: { ...this.effectiveMetaData, provider: 'email' },\n },\n })\n .then((result) => {\n console.log('Signup result:', result);\n this.emailForConfirm = this.signupForm.value.email;\n if (result.nextStep.signUpStep === 'CONFIRM_SIGN_UP') {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Please check your email for confirmation code.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 5000);\n });\n this.switchStage('confirmSignup');\n } else {\n this.translateService\n .selectTranslate('ui.authenticate.Successfully signed up.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 3000);\n });\n this.switchStage('login');\n }\n })\n .catch((err) => {\n console.error('Signup error:', err);\n if (err.name === 'UsernameExistsException') {\n // 계정이 이미 존재하는 경우 - 로그인 유도\n this.translateService\n .selectTranslate(\n 'ui.authenticate.An account with this email already exists. Please sign in instead.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('info', translation, 3000);\n });\n this.switchStage('login');\n this.loginForm.patchValue({ email: this.signupForm.value.email });\n } else if (err.name === 'UserAlreadyAuthenticatedException') {\n // 사용자가 이미 로그인된 상태\n this.handleAlreadyAuthenticatedUser();\n } else {\n this.translateService\n .selectTranslate('ui.authenticate.Failed to sign up.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n }\n });\n }\n\n confirmSignup() {\n confirmSignUp({\n username: this.emailForConfirm,\n confirmationCode: this.confirmSignupForm.value.code,\n options: { clientMetadata: { ...this.effectiveMetaData, provider: 'email' } },\n })\n .then(() => {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Email confirmed successfully! You can now sign in.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 3000);\n });\n this.switchStage('login');\n })\n .catch((err) => {\n console.error('Confirm signup error:', err);\n if (err.name === 'CodeMismatchException') {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Invalid confirmation code. Please try again.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n } else if (err.name === 'ExpiredCodeException') {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Confirmation code has expired. Please request a new one.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n } else {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Failed to confirm email. Please try again.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n }\n });\n }\n\n resendConfirmationCode() {\n resendSignUpCode({\n username: this.emailForConfirm,\n options: { clientMetadata: { ...this.effectiveMetaData, provider: 'email' } },\n })\n .then(() => {\n this.translateService\n .selectTranslate(\n 'ui.authenticate.Confirmation code sent! Please check your email.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('success', translation, 3000);\n });\n })\n .catch((err) => {\n console.error('Resend code error:', err);\n this.translateService\n .selectTranslate('ui.authenticate.Failed to resend confirmation code.', {}, 'haloduck')\n .subscribe((translation) => {\n this.notificationService.showNotification('error', translation);\n });\n });\n }\n\n handleAlreadyAuthenticatedUser() {\n // 현재 로그인된 사용자 정보 확인\n getCurrentUser()\n .then((currentUser) => {\n const currentEmail = currentUser.signInDetails?.loginId || currentUser.username;\n const attemptedEmail = this.signupForm.value.email;\n\n if (currentEmail === attemptedEmail) {\n // 같은 계정으로 이미 로그인됨\n this.translateService\n .selectTranslate(\n 'ui.authenticate.You are already signed in with this account.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('info', translation, 3000);\n });\n } else {\n // 다른 계정으로 로그인되어 있음\n this.translateService\n .selectTranslate(\n 'ui.authenticate.You are currently signed in as {{currentEmail}}. Please sign out first to create a new account.',\n { currentEmail },\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('warning', translation);\n });\n }\n })\n .catch((err) => {\n console.error('Get current user error:', err);\n // 현재 사용자 정보를 가져올 수 없는 경우, 로그아웃 옵션 제공\n this.translateService\n .selectTranslate(\n 'ui.authenticate.You appear to be already signed in. Please sign out first to create a new account.',\n {},\n 'haloduck',\n )\n .subscribe((translation) => {\n this.notificationService.showNotification('warning', translation);\n });\n });\n }\n\n signOutCurrentUser() {\n signOut()\n .then(() => {\n this.isCurrentlySignedIn = false;\n this.currentUserEmail = '';\n this.notificationService.showNotification(\n 'success',\n 'Successfully signed out. You can now sign up.',\n 3000,\n );\n // 폼 초기화\n this.signupForm.reset();\n this.loginForm.reset();\n })\n .catch((err) => {\n console.error('Sign out error:', err);\n this.notificationService.showNotification('error', 'Failed to sign out. Please try again.');\n });\n }\n\n reset() {\n resetPassword({\n username: this.resetForm.value.email,\n options: { clientMetadata: { ...this.effectiveMetaData, provider: 'email' } },\n })\n .then(() => {\n this.switchStage('otpVerify');\n })\n .catch((err) => {\n this.notificationService.showNotification('error', 'Failed to request verification code.');\n });\n }\n\n verifyOtp() {\n confirmResetPassword({\n username: this.resetForm.value.email,\n confirmationCode: this.otpForm.value.code,\n newPassword: this.otpForm.value.newPassword,\n options: { clientMetadata: { ...this.effectiveMetaData, provider: 'email' } },\n })\n .then(() => {\n this.notificationService.showNotification('success', 'Successfully reset password.', 3000);\n this.switchStage('login');\n })\n .catch((err) => {\n this.notificationService.showNotification('error', 'Failed to reset password.');\n });\n }\n\n // New password form password validation\n get passwordValue(): string {\n return this.newPasswordForm.get('newPassword')?.value || '';\n }\n\n get isMinLength(): boolean {\n return this.passwordValue.length >= 8;\n }\n get hasUppercase(): boolean {\n return /[A-Z]/.test(this.passwordValue);\n }\n get hasLowercase(): boolean {\n return /[a-z]/.test(this.passwordValue);\n }\n get hasNumber(): boolean {\n return /[0-9]/.test(this.passwordValue);\n }\n get hasSpecialChar(): boolean {\n return /[^A-Za-z0-9]/.test(this.passwordValue);\n }\n get isPasswordValid(): boolean {\n return (\n this.isMinLength &&\n this.hasUppercase &&\n this.hasLowercase &&\n this.hasNumber &&\n this.hasSpecialChar\n );\n }\n\n get passwordRules() {\n return [\n { label: 'haloduck.ui.authenticate.password.minimum of 8 characters', valid: this.isMinLength },\n { label: 'haloduck.ui.authenticate.password.one uppercase letter', valid: this.hasUppercase },\n { label: 'haloduck.ui.authenticate.password.one lowercase letter', valid: this.hasLowercase },\n { label: 'haloduck.ui.authenticate.password.one numeric digit', valid: this.hasNumber },\n { label: 'haloduck.ui.authenticate.password.one special character', valid: this.hasSpecialChar },\n ];\n }\n\n // Signup form password validation\n get signupPasswordValue(): string {\n return this.signupForm.get('password')?.value || '';\n }\n\n get signupIsMinLength(): boolean {\n return this.signupPasswordValue.length >= 8;\n }\n get signupHasUppercase(): boolean {\n return /[A-Z]/.test(this.signupPasswordValue);\n }\n get signupHasLowercase(): boolean {\n return /[a-z]/.test(this.signupPasswordValue);\n }\n get signupHasNumber(): boolean {\n return /[0-9]/.test(this.signupPasswordValue);\n }\n get signupHasSpecialChar(): boolean {\n return /[^A-Za-z0-9]/.test(this.signupPasswordValue);\n }\n get isSignupPasswordValid(): boolean {\n return (\n this.signupIsMinLength &&\n this.signupHasUppercase &&\n this.signupHasLowercase &&\n this.signupHasNumber &&\n this.signupHasSpecialChar\n );\n }\n\n get signupPasswordRules() {\n return [\n { label: 'haloduck.ui.authenticate.password.minimum of 8 characters', valid: this.signupIsMinLength },\n { label: 'haloduck.ui.authenticate.password.one uppercase letter', valid: this.signupHasUppercase },\n { label: 'haloduck.ui.authenticate.password.one lowercase letter', valid: this.signupHasLowercase },\n { label: 'haloduck.ui.authenticate.password.one numeric digit', valid: this.signupHasNumber },\n { label: 'haloduck.ui.authenticate.password.one special character', valid: this.signupHasSpecialChar },\n ];\n }\n\n // Social Login Methods\n get enabledSocialProviders() {\n return this.effectiveSocialProviders.filter((provider) => provider.enabled);\n }\n\n isProviderEnabled(providerName: 'google' | 'apple' | 'kakao'): boolean {\n return this.effectiveSocialProviders.some(\n (provider) => provider.name === providerName && provider.enabled,\n );\n }\n\n loginWithGoogle() {\n try {\n // Google 로그인 로직 구현\n // 실제 구현시에는 Google OAuth2 SDK 또는 AWS Amplify의 Google 제공자를 사용\n console.log('Google login initiated');\n\n // 예시: window.location을 사용한 OAuth 리다이렉션\n const googleProvider = this.effectiveSocialProviders.find((p) => p.name === 'google');\n if (googleProvider?.clientId) {\n const redirectUrl = googleProvider.redirectUrl || window.location.origin;\n const googleAuthUrl = `https://accounts.google.com/oauth/authorize?client_id=${googleProvider.clientId}&redirect_uri=${redirectUrl}&scope=openid%20email%20profile&response_type=code`;\n window.location.href = googleAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Google login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Google login failed.');\n }\n }\n\n loginWithApple() {\n try {\n // Apple 로그인 로직 구현\n // 실제 구현시에는 Apple Sign In JS SDK를 사용\n console.log('Apple login initiated');\n\n const appleProvider = this.effectiveSocialProviders.find((p) => p.name === 'apple');\n if (appleProvider?.clientId) {\n const redirectUrl = appleProvider.redirectUrl || window.location.origin;\n const appleAuthUrl = `https://appleid.apple.com/auth/authorize?client_id=${appleProvider.clientId}&redirect_uri=${redirectUrl}&scope=name%20email&response_type=code&response_mode=form_post`;\n window.location.href = appleAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Apple login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Apple login failed.');\n }\n }\n\n loginWithKakao() {\n try {\n // KakaoTalk 로그인 로직 구현\n // 실제 구현시에는 Kakao JavaScript SDK를 사용\n console.log('Kakao login initiated');\n\n const kakaoProvider = this.effectiveSocialProviders.find((p) => p.name === 'kakao');\n if (kakaoProvider?.clientId) {\n const redirectUrl = kakaoProvider.redirectUrl || window.location.origin;\n const kakaoAuthUrl = `https://kauth.kakao.com/oauth/authorize?client_id=${kakaoProvider.clientId}&redirect_uri=${redirectUrl}&response_type=code&state=${encodeURIComponent(\n JSON.stringify({ ...kakaoProvider.state, provider: 'kakao' }),\n )}`;\n window.location.href = kakaoAuthUrl;\n } else {\n this.notificationService.showNotification('error', 'Kakao login configuration missing.');\n }\n } catch (error) {\n this.notificationService.showNotification('error', 'Kakao login failed.');\n }\n }\n\n getSocialLoginIcon(provider: string): string {\n const icons = {\n google:\n '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 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 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 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 apple:\n 'M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z',\n kakao:\n 'M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z',\n };\n return icons[provider as keyof typeof icons] || '';\n }\n\n getSocialLoginLabel(provider: string) {\n const labelKeys = {\n google: 'ui.authenticate.Continue with Google',\n apple: 'ui.authenticate.Continue with Apple',\n kakao: 'ui.authenticate.Continue with KakaoTalk',\n };\n const key =\n labelKeys[provider as keyof typeof labelKeys] || `ui.authenticate.Continue with ${provider}`;\n return this.translateService.selectTranslate(key, {}, 'haloduck');\n }\n}\n","<div class=\"flex flex-col items-center justify-center h-full\">\n <!-- auth.component.html -->\n <div\n class=\"w-full max-w-md mx-auto mt-20 p-8 shadow-lg rounded-2xl bg-light-background dark:bg-dark-background\"\n >\n <!-- 현재 로그인 상태 표시 -->\n @if (isCurrentlySignedIn) {\n <div\n class=\"mb-4 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg\"\n >\n <div class=\"flex items-center justify-between\">\n <div>\n <p class=\"text-sm text-blue-800 dark:text-blue-200\">\n {{ 'haloduck.ui.authenticate.Currently signed in as:' | transloco }}\n </p>\n <p class=\"font-medium text-blue-900 dark:text-blue-100\">\n {{ currentUserEmail }}\n </p>\n </div>\n <haloduck-button\n data-testid=\"authenticate-sign-out\"\n variant=\"secondary\"\n size=\"sm\"\n (click)=\"signOutCurrentUser()\"\n >\n {{ 'haloduck.ui.authenticate.Sign Out' | transloco }}\n </haloduck-button>\n </div>\n </div>\n }\n @switch (stage) {\n @case ('login') {\n <!-- 소셜 로그인 버튼들 -->\n @if (showSocialLogin && enabledSocialProviders.length > 0) {\n <div class=\"mb-6\">\n <div class=\"space-y-3\">\n <!-- Google 로그인 버튼 -->\n @if (isProviderEnabled('google')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-google\"\n (click)=\"loginWithGoogle()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-gray-300 rounded-lg shadow-sm bg-white hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Google SVG 아이콘 -->\n <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\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 fill=\"#4285F4\"\n />\n <path\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 fill=\"#34A853\"\n />\n <path\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 fill=\"#FBBC05\"\n />\n <path\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 fill=\"#EA4335\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('google') | async\n }}</span>\n </button>\n }\n\n <!-- Apple 로그인 버튼 -->\n @if (isProviderEnabled('apple')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-apple\"\n (click)=\"loginWithApple()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-black rounded-lg shadow-sm bg-black hover:bg-gray-900 dark:bg-black dark:hover:bg-gray-900 text-white transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Apple SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-white\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('apple') | async\n }}</span>\n </button>\n }\n\n <!-- Kakao 로그인 버튼 -->\n @if (isProviderEnabled('kakao')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-social-kakao\"\n (click)=\"loginWithKakao()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-yellow-400 rounded-lg shadow-sm bg-yellow-400 hover:bg-yellow-500 text-black transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Kakao SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-black\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('kakao') | async\n }}</span>\n </button>\n }\n </div>\n\n <!-- 구분선 -->\n @if (showDivider) {\n <div class=\"relative my-6\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300 dark:border-gray-600\"></div>\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span\n class=\"px-2 bg-light-background dark:bg-dark-background text-gray-500 dark:text-gray-400\"\n >{{ 'haloduck.ui.authenticate.or' | transloco }}</span\n >\n </div>\n </div>\n }\n </div>\n }\n\n <!-- 로그인 -->\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"login()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-login-email\"\n type=\"email\"\n formControlName=\"email\"\n [placeholder]=\"'haloduck.ui.authenticate.Email' | transloco\"\n />\n <haloduck-input\n data-testid=\"authenticate-login-password\"\n type=\"password\"\n formControlName=\"password\"\n [placeholder]=\"'haloduck.ui.authenticate.Password' | transloco\"\n />\n <haloduck-button\n data-testid=\"authenticate-login-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"login()\"\n >{{ 'haloduck.ui.authenticate.Sign In' | transloco }}</haloduck-button\n >\n </form>\n }\n @case ('signup') {\n @if (effectiveUseSignUp) {\n <!-- 소셜 로그인 버튼들 (회원가입) -->\n @if (showSocialLogin && enabledSocialProviders.length > 0) {\n <div class=\"mb-6\">\n <div class=\"space-y-3\">\n <!-- Google 로그인 버튼 -->\n @if (isProviderEnabled('google')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-google\"\n (click)=\"loginWithGoogle()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-gray-300 rounded-lg shadow-sm bg-white hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Google SVG 아이콘 -->\n <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\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 fill=\"#4285F4\"\n />\n <path\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 fill=\"#34A853\"\n />\n <path\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 fill=\"#FBBC05\"\n />\n <path\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 fill=\"#EA4335\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('google') | async\n }}</span>\n </button>\n }\n\n <!-- Apple 로그인 버튼 -->\n @if (isProviderEnabled('apple')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-apple\"\n (click)=\"loginWithApple()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-black rounded-lg shadow-sm bg-black hover:bg-gray-900 dark:bg-black dark:hover:bg-gray-900 text-white transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Apple SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-white\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('apple') | async\n }}</span>\n </button>\n }\n\n <!-- Kakao 로그인 버튼 -->\n @if (isProviderEnabled('kakao')) {\n <button\n type=\"button\"\n data-testid=\"authenticate-signup-social-kakao\"\n (click)=\"loginWithKakao()\"\n class=\"w-full flex items-center justify-center gap-3 px-4 py-3 border border-yellow-400 rounded-lg shadow-sm bg-yellow-400 hover:bg-yellow-500 text-black transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 hover:cursor-pointer\"\n >\n <!-- Kakao SVG 아이콘 -->\n <svg class=\"w-5 h-5 text-black\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M12 3C7.03 3 3 6.17 3 10.08c0 2.53 1.67 4.74 4.19 6.08L6.45 18.9c-.14.22-.02.52.24.52.08 0 .17-.03.23-.09L9.2 17.4c.87.17 1.8.26 2.8.26s1.93-.09 2.8-.26l2.28 1.93c.06.06.15.09.23.09.26 0 .38-.3.24-.52l-.74-2.74C19.33 14.82 21 12.61 21 10.08 21 6.17 16.97 3 12 3z\"\n />\n </svg>\n <span class=\"font-medium text-sm\">{{\n getSocialLoginLabel('kakao') | async\n }}</span>\n </button>\n }\n </div>\n\n <!-- 구분선 -->\n @if (showDivider) {\n <div class=\"relative my-6\">\n <div class=\"absolute inset-0 flex items-center\">\n <div class=\"w-full border-t border-gray-300 dark:border-gray-600\"></div>\n </div>\n <div class=\"relative flex justify-center text-sm\">\n <span\n class=\"px-2 bg-light-background dark:bg-dark-background text-gray-500 dark:text-gray-400\"\n >or</span\n >\n </div>\n </div>\n }\n </div>\n }\n\n <!-- 회원가입 -->\n <form [formGroup]=\"signupForm\" (ngSubmit)=\"signup()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-signup-email\"\n type=\"email\"\n formControlName=\"email\"\n [placeholder]=\"'haloduck.ui.authenticate.Email' | transloco\"\n />\n <haloduck-input\n data-testid=\"authenticate-signup-password\"\n type=\"password\"\n formControlName=\"password\"\n [placeholder]=\"'haloduck.ui.authenticate.Password' | transloco\"\n />\n <div class=\"text-sm flex flex-col\">\n @for (rule of signupPasswordRules; track rule.label) {\n <span\n [class.text-light-secondary]=\"rule.valid && signupPasswordValue !== ''\"\n [class.line-through]=\"rule.valid && signupPasswordValue !== ''\"\n [class.text-light-danger]=\"!rule.valid && signupPasswordValue !== ''\"\n [class.text-light-inactive]=\"signupPasswordValue === ''\"\n >\n {{ rule.valid ? '✔' : '✗' }} {{ rule.label | transloco }}\n </span>\n }\n </div>\n <haloduck-input\n data-testid=\"authenticate-signup-confirm-password\"\n type=\"password\"\n formControlName=\"confirmPassword\"\n [placeholder]=\"'haloduck.ui.authenticate.Confirm Password' | transloco\"\n />\n @if (signupForm.errors?.['passwordMismatch'] && signupForm.get('confirmPassword')?.touched) {\n <div class=\"text-sm text-light-danger dark:text-dark-danger\">\n {{ 'haloduck.ui.authenticate.Passwords do not match' | transloco }}\n </div>\n }\n <haloduck-button\n data-testid=\"authenticate-signup-submit\"\n (click)=\"signup()\"\n variant=\"primary\"\n [disabled]=\"signupForm.invalid\"\n >{{ 'haloduck.ui.authenticate.Sign Up' | transloco }}</haloduck-button\n >\n </form>\n }\n }\n @case ('confirmSignup') {\n @if (effectiveUseSignUp) {\n <!-- 이메일 확인 코드 입력 -->\n <div class=\"mb-4 text-center\">\n <h3 class=\"text-lg font-medium mb-2 text-gray-600 dark:text-gray-200\">\n {{ 'haloduck.ui.authenticate.Check your email' | transloco }}\n </h3>\n <p class=\"text-sm text-gray-600 dark:text-gray-400\">\n {{ 'haloduck.ui.authenticate.We sent a confirmation code to {{email}}' | transloco:{\n email: emailForConfirm } }}\n </p>\n </div>\n <form\n [formGroup]=\"confirmSignupForm\"\n (ngSubmit)=\"confirmSignup()\"\n class=\"flex flex-col gap-4\"\n >\n <haloduck-input\n data-testid=\"authenticate-confirm-signup-code\"\n type=\"text\"\n formControlName=\"code\"\n [placeholder]=\"'haloduck.ui.authenticate.Confirmation Code' | transloco\"\n />\n <haloduck-button\n data-testid=\"authenticate-confirm-signup-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"confirmSignup()\"\n >{{ 'haloduck.ui.authenticate.Confirm Email' | transloco }}</haloduck-button\n >\n <haloduck-button\n data-testid=\"authenticate-resend-code\"\n type=\"button\"\n variant=\"secondary\"\n (click)=\"resendConfirmationCode()\"\n >{{ 'haloduck.ui.authenticate.Resend Code' | transloco }}</haloduck-button\n >\n </form>\n }\n }\n @case ('reset') {\n <!-- 비밀번호 재설정 요청 -->\n <form [formGroup]=\"resetForm\" (ngSubmit)=\"reset()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-reset-email\"\n type=\"email\"\n formControlName=\"email\"\n [placeholder]=\"'haloduck.ui.authenticate.Email' | transloco\"\n />\n <haloduck-button\n data-testid=\"authenticate-reset-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"reset()\"\n >{{ 'haloduck.ui.authenticate.Send Verification Code' | transloco }}</haloduck-button\n >\n </form>\n }\n @case ('otpVerify') {\n <!-- OTP 인증 후 새 비밀번호 입력 -->\n <form [formGroup]=\"otpForm\" (ngSubmit)=\"verifyOtp()\" class=\"flex flex-col gap-4\">\n <haloduck-input\n data-testid=\"authenticate-otp-code\"\n type=\"text\"\n formControlName=\"code\"\n [placeholder]=\"'haloduck.ui.authenticate.Verification Code' | transloco\"\n />\n <haloduck-input\n data-testid=\"authenticate-otp-password\"\n type=\"password\"\n formControlName=\"newPassword\"\n [placeholder]=\"'haloduck.ui.authenticate.New password' | transloco\"\n />\n <haloduck-button\n data-testid=\"authenticate-otp-submit\"\n type=\"submit\"\n variant=\"primary\"\n (click)=\"verifyOtp()\"\n >{{ 'haloduck.ui.authenticate.Reset Password' | transloco }}</haloduck-button\n >\n </form>\n }\n @case ('newPassword') {\n <!-- 임시 비밀번호 → 새 비밀번호 변경 -->\n <form\n [formGroup]=\"newPasswordForm\"\n (ngSubmit)=\"confirmNewPassword()\"\n class=\"flex flex-col gap-4\"\n >\n <haloduck-input\n data-testid=\"authenticate-new-password-password\"\n type=\"password\"\n formControlName=\"newPassword\"\n [placeholder]=\"'haloduck.ui.authenticate.New password' | transloco\"\n >\n </haloduck-input>\n <div class=\"text-sm flex flex-col\">\n @for (rule of passwordRules; track rule.label) {\n <span\n [class.text-light-secondary]=\"rule.valid && passwordValue !== ''\"\n [class.line-through]=\"rule.valid && passwordValue !== ''\"\n [class.text-light-danger]=\"!rule.valid && passwordValue !== ''\"\n [class.text-light-inactive]=\"passwordValue === ''\"\n >\n {{ rule.valid ? '✔' : '✗' }} {{ rule.label | transloco }}\n </span>\n }\n </div>\n <haloduck-button\n data-testid=\"authenticate-new-password-submit\"\n type=\"submit\"\n (click)=\"confirmNewPassword()\"\n variant=\"primary\"\n [disabled]=\"!isPasswordValid\"\n >{{ 'haloduck.ui.authenticate.Change Password' | transloco }}</haloduck-button\n >\n </form>\n }\n }\n\n <!-- 단계 전환 탭 -->\n <div class=\"flex flex-col items-center mt-6 gap-4\">\n <div class=\"flex justify-center gap-4\">\n @if (stage !== 'login' && stage !== 'confirmSignup') {\n <haloduck-button\n data-testid=\"authenticate-to-signin\"\n variant=\"none\"\n (click)=\"switchStage('login')\"\n >{{ 'haloduck.ui.authenticate.to Sign In' | transloco }}</haloduck-button\n >\n }\n @if (effectiveUseSignUp && stage !== 'signup' && stage !== 'confirmSignup') {\n <haloduck-button\n data-testid=\"authenticate-to-signup\"\n variant=\"none\"\n (click)=\"switchStage('signup')\"\n >{{ 'haloduck.ui.authenticate.to Sign Up' | transloco }}</haloduck-button\n >\n }\n @if (effectiveUseSignUp && stage === 'confirmSignup') {\n <haloduck-button\n data-testid=\"authenticate-back-to-signup\"\n variant=\"none\"\n (click)=\"switchStage('signup')\"\n >{{ 'haloduck.ui.authenticate.Back to Sign Up' | transloco }}</haloduck-button\n >\n }\n\n @if (\n stage !== 'reset' &&\n stage !== 'otpVerify' &&\n stage !== 'newPassword' &&\n stage !== 'confirmSignup'\n ) {\n <haloduck-button\n data-testid=\"authenticate-to-reset-password\"\n variant=\"secondary\"\n (click)=\"switchStage('reset')\"\n >{{ 'haloduck.ui.authenticate.Reset Password' | transloco }}</haloduck-button\n >\n }\n </div>\n </div>\n </div>\n</div>\n","import { Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { signIn, fetchAuthSession } from 'aws-amplify/auth';\nimport { Hub } from 'aws-amplify/utils';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { NotificationService } from '../../layout/notification/notification.service';\n\nexport interface ProcessCognitoUserResponse {\n email: string;\n authResult: {\n AccessToken: string;\n ExpiresIn: number;\n IdToken: string;\n RefreshToken: string;\n TokenType: string;\n };\n}\n\n@Component({\n selector: 'haloduck-authenticate-callback',\n standalone: true,\n imports: [CommonModule, TranslocoModule],\n providers: [provideTranslocoScope('haloduck')],\n templateUrl: './authenticate-callback.component.html',\n styleUrls: ['./authenticate-callback.component.css'],\n})\nexport class AuthenticateCallbackComponent implements OnInit {\n private route = inject(ActivatedRoute);\n private router = inject(Router);\n private notificationService = inject(NotificationService);\n\n isProcessing = true;\n error: string | null = null;\n success = false;\n\n ngOnInit(): void {\n this.handleSocialCallback();\n }\n\n private async handleSocialCallback(): Promise<void> {\n try {\n // URL의 쿼리 파라미터에서 data 추출\n const queryParams = this.route.snapshot.queryParams;\n const encodedData = queryParams['data'];\n\n if (!encodedData) {\n throw new Error('ui.authenticate.Social login data not found.');\n }\n\n // Base64 디코딩\n const decodedData = this.decodeBase64(encodedData);\n const cognitoUserResponse: ProcessCognitoUserResponse = JSON.parse(decodedData);\n\n // Amplify 로그인 처리\n await this.processAmplifyLogin(cognitoUserResponse);\n\n this.success = true;\n this.isProcessing = false;\n\n this.notificationService.showNotification('success', '소셜 로그인이 완료되었습니다.', 3000);\n\n // 로그인 성공 후 리다이렉트\n setTimeout(() => {\n this.redirectAfterLogin();\n }, 500);\n } catch (error) {\n console.error('Social callback error:', error);\n this.error = error instanceof Error ? error.message : '로그인 처리 중 오류가 발생했습니다.';\n this.isProcessing = false;\n\n this.notificationService.showNotification('error', this.error);\n }\n }\n\n private decodeBase64(encodedString: string): string {\n try {\n // URL-safe base64 디코딩을 위해 문자 치환\n const base64String = encodedString.replace(/-/g, '+').replace(/_/g, '/');\n\n // 패딩 추가 (필요한 경우)\n const padding = base64String.length % 4;\n const paddedString = padding ? base64String + '='.repeat(4 - padding) : base64String;\n\n return atob(paddedString);\n } catch (error) {\n throw new Error('ui.authenticate.Invalid data format.');\n }\n }\n\n private async processAmplifyLogin(\n cognitoUserResponse: ProcessCognitoUserResponse,\n ): Promise<void> {\n try {\n console.log('Processing Amplify login with:', {\n email: cognitoUserResponse.email,\n hasAuthResult: !!cognitoUserResponse.authResult,\n });\n\n if (cognitoUserResponse.authResult) {\n const { AccessToken, IdToken, RefreshToken } = cognitoUserResponse.authResult;\n\n // Cognito 토큰을 로컬스토리지에 저장 (Amplify가 사용할 수 있는 형태로)\n const keyPrefix = `CognitoIdentityServiceProvider.${await this.getClientId()}`;\n const username = cognitoUserResponse.email;\n\n // Amplify가 인식할 수 있는 형태로 토큰들을 저장\n localStorage.setItem(`${keyPrefix}.${username}.accessToken`, AccessToken);\n localStorage.setItem(`${keyPrefix}.${username}.idToken`, IdToken);\n localStorage.setItem(`${keyPrefix}.${username}.refreshToken`, RefreshToken);\n localStorage.setItem(`${keyPrefix}.LastAuthUser`, username);\n localStorage.setItem(`${keyPrefix}.${username}.tokenScopesAccepted`, '1');\n\n // Amplify Hub를 통해 인증 상태 변경 알림\n Hub.dispatch('auth', {\n event: 'signedIn',\n data: {\n username: cognitoUserResponse.email,\n signInDetails: {\n loginId: cognitoUserResponse.email,\n authFlowType: 'CUSTOM_AUTH',\n },\n },\n });\n\n // 세션 새로고침을 통해 Amplify가 토큰을 인식하도록 함\n try {\n await fetchAuthSession({ forceRefresh: true });\n } catch (sessionError) {\n console.warn('Session refresh failed, but tokens are stored:', sessionError);\n }\n }\n } catch (error) {\n console.error('Amplify login processing error:', error);\n throw new Error('ui.authenticate.Authentication processing failed.');\n }\n }\n\n private async getClientId(): Promise<string> {\n // Amplify 설정에서 클라이언트 ID를 가져오는 로직\n // 실제 환경에서는 Amplify.configure에서 설정된 값을 사용\n try {\n const { Amplify } = await import('aws-amplify');\n const config = Amplify.getConfig();\n return config.Auth?.Cognito?.userPoolClientId || 'default-client-id-1';\n } catch {\n // fallback - 환경변수나 설정파일에서 가져올 수 있습니다\n return 'default-client-id-2';\n }\n }\n\n public redirectToLogin(): void {\n // 로그인 페이지로 리다이렉트 (라우트는 실제 애플리케이션에 맞게 조정)\n this.router.navigate(['/auth/login']);\n }\n\n private redirectAfterLogin(): void {\n // 로그인 성공 후 리다이렉트할 페이지\n // returnUrl이 있으면 그곳으로, 없으면 기본 페이지로\n const returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';\n this.router.navigate([returnUrl]);\n }\n}\n","<div\n class=\"w-full h-screen flex flex-col items-center justify-center min-h-screen bg-light-background dark:bg-dark-background\"\n>\n <div\n class=\"w-full max-w-md mx-auto p-8 shadow-lg rounded-2xl bg-light-background dark:bg-dark-background\"\n >\n <div class=\"text-center\">\n @if (isProcessing) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"animate-spin rounded-full h-16 w-16 border-4 border-gray-300 border-t-blue-600 dark:border-gray-600 dark:border-t-blue-400\"\n ></div>\n </div>\n <div class=\"space-y-2\">\n <h2 class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\">\n {{ 'haloduck.ui.authenticate.Processing authentication' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ 'haloduck.ui.authenticate.Processing social login...' | transloco }}\n </p>\n </div>\n </div>\n }\n\n @if (error) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"w-16 h-16 mx-auto mb-4 flex items-center justify-center rounded-full bg-red-100 dark:bg-red-900/20\"\n >\n <svg\n class=\"w-8 h-8 text-red-600 dark:text-red-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"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 clip-rule=\"evenodd\"\n ></path>\n </svg>\n </div>\n </div>\n <div class=\"space-y-4\">\n <h2 class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\">\n {{ 'haloduck.ui.authenticate.Authentication failed' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ error && error.startsWith('haloduck.ui.') ? (error | transloco) : error }}\n </p>\n <button\n (click)=\"redirectToLogin()\"\n class=\"w-full inline-flex items-center justify-center px-4 py-3 border border-transparent text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 dark:bg-blue-500 dark:hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 dark:focus:ring-blue-400 transition-colors duration-200\"\n >\n {{ 'haloduck.ui.authenticate.Back to login page' | transloco }}\n </button>\n </div>\n </div>\n }\n\n @if (success) {\n <div class=\"space-y-6\">\n <div class=\"flex justify-center\">\n <div\n class=\"w-16 h-16 mx-auto mb-4 flex items-center justify-center rounded-full bg-green-100 dark:bg-green-900/20\"\n >\n <svg\n class=\"w-8 h-8 text-green-600 dark:text-green-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n 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 ></path>\n </svg>\n </div>\n </div>\n <div class=\"space-y-4\">\n <h2 class=\"text-xl font-semibold text-light-on-background dark:text-dark-on-background\">\n {{ 'haloduck.ui.authenticate.Authentication successful' | transloco }}\n </h2>\n <p class=\"text-gray-600 dark:text-gray-300\">\n {{ 'haloduck.ui.authenticate.Social login completed.' | transloco }}\n </p>\n <div class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ 'haloduck.ui.authenticate.Redirecting automatically...' | transloco }}\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { FormsModule } from '@angular/forms';\n\nexport interface Option {\n id?: string;\n value: string;\n isSticky?: boolean;\n isExclusive?: boolean;\n shouldManualInput?: boolean;\n manualPrefix?: string;\n}\n\n@Component({\n selector: 'haloduck-select-dropdown',\n imports: [TranslocoModule, FormsModule],\n templateUrl: './select-dropdown.component.html',\n styleUrl: './select-dropdown.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class SelectDropdownComponent {\n protected _filteredOptions = signal([] as Option[]);\n protected _options: Option[] = [];\n protected _selectedOptionIds: string[] = [];\n protected manualInputValues: Record<string, string> = {};\n protected activeManualKey: string | null = null;\n protected isComposing: boolean = false;\n\n @Output() selectedChange = new EventEmitter<string[]>();\n @Output() closeDropdown = new EventEmitter<void>();\n @Input() useFilter: boolean = false;\n @Input() multiselect: boolean = true;\n @Input() atLeastOne: boolean = false;\n @Input() asButton: boolean = false;\n @Input() set options(value: Option[] | null) {\n this._options = value || [];\n this._filteredOptions.set(this._options);\n this.seedManualInputs();\n }\n get options(): Option[] | null {\n return this._filteredOptions();\n }\n @Input() set selectedOptionIds(value: string[] | null) {\n this._selectedOptionIds = value || [];\n this.seedManualInputs();\n }\n get selectedOptions(): string[] | null {\n return this._selectedOptionIds;\n }\n\n onFilterInput(event: Event) {\n const value = (event.target as HTMLInputElement).value.toLowerCase();\n this._filteredOptions.set(\n this._options.filter(\n (opt) => opt.value.toLowerCase().includes(value) || opt.isSticky === true,\n ),\n );\n }\n\n onToggleOption(option: Option) {\n if (this.asButton) {\n this.setSelected([option.id || option.value]);\n return;\n }\n\n // Handle manual input option\n if (option.shouldManualInput) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n const typed = (this.manualInputValues[key] || '').trim();\n const isSelected = this.isOptionSelected(option);\n\n if (isSelected) {\n // Deselect current manual value\n if (this.multiselect) {\n let next: string[];\n if (prefix) {\n next = this._selectedOptionIds.filter((id) => !id.startsWith(prefix));\n } else {\n next = this._selectedOptionIds.filter((id) => id !== typed);\n }\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n // Clear input text when deselected\n this.manualInputValues[key] = '';\n // Hide input\n this.activeManualKey = null;\n } else {\n // open manual input and handle selection based on mode\n this.activeManualKey = key;\n\n // In single select mode, clear existing selections first\n if (!this.multiselect) {\n const sentinel = option.id || option.value;\n this.setSelected([sentinel]);\n }\n\n // ensure there is an entry in manualInputValues\n if (this.manualInputValues[key] === undefined) {\n this.manualInputValues[key] = '';\n }\n // focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n return;\n }\n\n // Non-manual options\n if (this.multiselect) {\n const id = option.id || option.value;\n if (option.isExclusive) {\n if (this._selectedOptionIds.includes(id)) {\n this.setSelected([]);\n } else {\n this.setSelected([id]);\n }\n } else {\n // remove any exclusive selections\n let next = this._selectedOptionIds.filter((selectedId) => !this.isIdExclusive(selectedId));\n if (!next.includes(id)) {\n next = [id, ...next];\n } else {\n next = next.filter((x) => x !== id);\n }\n this.setSelected(next);\n }\n } else {\n const id = option.id || option.value;\n if (this.atLeastOne) {\n this.setSelected([id]);\n } else {\n if (this._selectedOptionIds.includes(id)) {\n this.setSelected([]);\n } else {\n this.setSelected([id]);\n }\n }\n }\n }\n\n onEditManualInput(option: Option): void {\n const key = this.getManualKey(option);\n this.activeManualKey = key;\n\n // focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n\n getManualInputDisplayValue(option: Option): string {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n\n // manualInputValues에 저장된 값 확인\n const storedValue = this.manualInputValues[key];\n if (storedValue && storedValue.trim() !== '') {\n return storedValue;\n }\n\n // selectedOptionIds에서 prefix가 붙은 값 찾기\n if (prefix) {\n const found = this._selectedOptionIds.find(\n (id) => typeof id === 'string' && id.startsWith(prefix) && id.length > prefix.length,\n );\n if (found) {\n return found.substring(prefix.length);\n }\n }\n\n return '';\n }\n\n isOptionSelected(option: Option): boolean {\n const id = option.id || option.value;\n if (option.shouldManualInput) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix;\n const sentinel = option.id || option.value;\n\n // Check if this manual input option is currently active\n const isActive = this.activeManualKey === key;\n\n // Check if sentinel is selected (means option is selected but no manual value)\n const hasSentinel = this._selectedOptionIds.includes(sentinel);\n\n if (prefix) {\n // selected if there exists a value with prefix OR sentinel is selected OR if it's currently active\n const hasValueWithPrefix = this._selectedOptionIds.some(\n (selectedId) =>\n typeof selectedId === 'string' &&\n selectedId.startsWith(prefix) &&\n selectedId.length > prefix.length,\n );\n return hasValueWithPrefix || hasSentinel || isActive;\n }\n // no prefix: consider selected if any selected id equals current typed value (non-empty) OR sentinel OR if it's active\n const typed = (this.manualInputValues[key] || '').trim();\n const hasTypedValue = typed !== '' && this._selectedOptionIds.includes(typed);\n return hasTypedValue || hasSentinel || isActive;\n }\n return this._selectedOptionIds.includes(id);\n }\n\n private isIdExclusive(id: string): boolean {\n for (const o of this._options) {\n if (!o.isExclusive) continue;\n const refId = o.id || o.value;\n if (refId === id) return true;\n if (o.shouldManualInput && o.manualPrefix && id?.startsWith(o.manualPrefix)) {\n return true;\n }\n }\n return false;\n }\n\n private getManualKey(option: Option): string {\n return option.id || option.value;\n }\n\n private seedManualInputs(): void {\n const manualOptions = this._options.filter((o) => o.shouldManualInput);\n for (const opt of manualOptions) {\n const prefix = opt.manualPrefix || '';\n const key = this.getManualKey(opt);\n const existingWithPrefix = this._selectedOptionIds.find((id) =>\n prefix ? id?.startsWith(prefix) : false,\n );\n const value = existingWithPrefix ? existingWithPrefix.substring(prefix.length) : '';\n this.manualInputValues[key] = value;\n }\n }\n\n onManualInputChange(option: Option, value: string) {\n // IME 조합 중이면 업데이트하지 않음\n if (this.isComposing) {\n return;\n }\n\n const key = this.getManualKey(option);\n this.manualInputValues[key] = value;\n\n // 타이핑 중에는 실시간으로 선택 상태 업데이트\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const trimmed = (value || '').trim();\n\n if (this.multiselect) {\n if (option.isExclusive) {\n if (trimmed === '') {\n // 빈 값일 때는 sentinel만 유지 (선택은 유지하되 값은 없음)\n this.setSelected([sentinel]);\n } else {\n this.setSelected([`${prefix}${trimmed}`]);\n }\n } else {\n let next = this._selectedOptionIds.filter((id) => !this.isIdExclusive(id));\n // sentinel과 prefix로 시작하는 값 모두 제거\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n\n if (trimmed !== '') {\n const toAdd = `${prefix}${trimmed}`;\n next = [toAdd, ...next];\n } else {\n // 빈 값일 때는 sentinel만 추가\n next = [sentinel, ...next];\n }\n this.setSelected(next);\n }\n } else {\n // single select\n if (trimmed === '') {\n // 빈 값일 때는 sentinel만 유지 (선택은 유지하되 값은 없음)\n this.setSelected([sentinel]);\n } else {\n this.setSelected([`${prefix}${trimmed}`]);\n }\n }\n }\n\n onCompositionStart(): void {\n this.isComposing = true;\n }\n\n onCompositionEnd(option: Option, event: Event): void {\n this.isComposing = false;\n const target = event.target as HTMLInputElement;\n this.onManualInputChange(option, target.value);\n }\n\n onManualInputKeydown(option: Option, event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n // IME 조합 중이면 아무것도 하지 않음\n if (this.isComposing) {\n return;\n }\n event.preventDefault();\n // 약간의 지연을 두어 compositionend 이벤트가 먼저 처리되도록 함\n setTimeout(() => {\n this.onManualInputConfirm(option);\n }, 10);\n }\n }\n\n onManualInputConfirm(option: Option) {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n\n // 입력값이 비어있으면 선택 해제\n if (raw === '') {\n this.activeManualKey = null;\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this._selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n } else {\n // 입력값이 있으면 정상 처리\n this.onManualInputChange(option, raw);\n // 입력창 닫기\n this.activeManualKey = null;\n }\n\n // Close dropdown in single select mode after confirming input\n if (!this.multiselect) {\n this.closeDropdown.emit();\n }\n }\n\n onManualInputBlur(option: Option) {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n\n // 입력값이 비어있으면 선택 해제\n if (raw === '') {\n this.activeManualKey = null;\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this._selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.setSelected(next);\n } else {\n this.setSelected([]);\n }\n }\n // 입력값이 있으면 아무것도 하지 않음 (이미 onManualInputChange에서 처리됨)\n }\n\n private emitSelectedChange(): void {\n const payload = [...this._selectedOptionIds];\n setTimeout(() => this.selectedChange.emit(payload));\n }\n\n private setSelected(next: string[]): void {\n const sanitized = next.filter((id) => id != null);\n this._selectedOptionIds = sanitized;\n this.emitSelectedChange();\n }\n}\n","<div\n id=\"dropdown\"\n class=\"max-w-full z-40 bg-light-background dark:bg-dark-background text-light-on-background dark:text-dark-on-background border border-light-inactive dark:border-dark-inactive rounded max-h-60 flex flex-col gap-2\"\n>\n @if (useFilter && _options.length >= 5) {\n <input\n #inputFilter\n id=\"inputFilter\"\n type=\"text\"\n [placeholder]=\"'haloduck.ui.select.Keyword...' | transloco\"\n (input)=\"onFilterInput($event)\"\n class=\"text-light-inactive dark:text-dark-inactive rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-3 py-1.5 text-sm/6 bg-light-control dark:bg-dark-control m-2\"\n />\n }\n <div class=\"overflow-y-auto\">\n @for (option of _filteredOptions(); track option.id ? option.id : option.value) {\n <div\n class=\"px-3 py-2 text-sm/6 hover:bg-light-secondary/60 dark:hover:bg-dark-secondary/60 flex items-center justify-start whitespace-nowrap\"\n [class.cursor-pointer]=\"!option.shouldManualInput\"\n (click)=\"!option.shouldManualInput && onToggleOption(option)\"\n >\n @if (!asButton) {\n @if (isOptionSelected(option)) {\n <svg\n class=\"w-4 h-4 text-light-primary dark:text-dark-primary inline-block mr-2 cursor-pointer\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n (click)=\"\n option.shouldManualInput && $event.stopPropagation();\n option.shouldManualInput && onToggleOption(option)\n \"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 00-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n } @else {\n <div class=\"w-4 h-4 inline-block mr-2\"></div>\n }\n }\n @if (option.shouldManualInput && activeManualKey === (option.id || option.value)) {\n <input\n type=\"text\"\n [(ngModel)]=\"manualInputValues[option.id || option.value]\"\n [attr.data-manual-key]=\"option.id || option.value\"\n (ngModelChange)=\"onManualInputChange(option, $event)\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd(option, $event)\"\n (click)=\"$event.stopPropagation()\"\n (blur)=\"onManualInputBlur(option)\"\n (keydown)=\"onManualInputKeydown(option, $event)\"\n class=\"text-light-on-control dark:text-dark-on-control rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-2 py-1 text-sm/6 bg-light-control dark:bg-dark-control w-full\"\n />\n } @else if (option.shouldManualInput) {\n <span\n class=\"cursor-pointer flex-1\"\n (click)=\"$event.stopPropagation(); onEditManualInput(option)\"\n >\n {{ getManualInputDisplayValue(option) || option.value }}\n </span>\n } @else {\n {{ option.value }}\n }\n </div>\n }\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n forwardRef,\n inject,\n Input,\n Output,\n signal,\n ViewChild,\n ChangeDetectorRef,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\nimport { Option } from './select-dropdown/select-dropdown.component';\nimport { CommonModule } from '@angular/common';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ViewContainerRef } from '@angular/core';\nimport { SelectDropdownComponent } from './select-dropdown/select-dropdown.component';\nimport { ComponentPortal } from '@angular/cdk/portal';\n\n@Component({\n selector: 'haloduck-select',\n imports: [CommonModule, FormsModule],\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class SelectComponent implements ControlValueAccessor, AfterViewInit, OnChanges {\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private overlayRef: OverlayRef | null = null;\n\n // Generate unique ID for radio button grouping\n private static instanceCounter = 0;\n readonly radioGroupName = `haloduck-select-radio-${++SelectComponent.instanceCounter}`;\n\n @Output() selectedChange = new EventEmitter<string[] | string>();\n @Input() disabled: boolean | null = false;\n @Input() loading: boolean = false;\n @Input() variant: 'primary' | 'secondary' | 'danger' | 'none' = 'none';\n @Input() asButton: boolean = false;\n @Input() useIcon: boolean = false;\n @Input() useFilter: boolean = false;\n @Input() multiselect: boolean = true;\n @Input() placeholder: string = '';\n @Input() atLeastOne: boolean = false;\n @Input() showAll: boolean = false;\n @Input() showAllItems: boolean = false;\n @Input() options: Option[] | null = null;\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() labelWidth: string = '';\n @Input() set value(value: string[] | string) {\n this.writeValue(value);\n this.onChange(this.getSelectedValue());\n }\n get value(): string | string[] | null {\n if (this.multiselect) {\n return this.selectedOptionIds;\n } else {\n if (this.selectedOptionIds.length === 0) {\n return null;\n }\n return this.selectedOptionIds[0];\n }\n }\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n @ViewChild('label') label!: ElementRef;\n\n isDropdownOpen = signal(false);\n\n selectedOptionIds: string[] = [];\n displayedSelectedOptions: Option[] = [];\n private selectedIdToDisplayOption: Record<string, Option> = {};\n\n // Manual input support for inline mode\n manualInputValues: Record<string, string> = {};\n activeManualKey: string | null = null;\n isComposing: boolean = false; // IME 조합 중 여부\n\n onClick(event: MouseEvent) {\n if (this.disabled || this.showAllItems) {\n return;\n }\n\n const originWidth = this.origin?.nativeElement?.offsetWidth || 0;\n const originRect = this.origin?.nativeElement?.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownMaxHeight = 240; // max-h-60 = 15rem = 240px\n const spaceBelow = viewportHeight - (originRect?.bottom || 0);\n const spaceAbove = originRect?.top || 0;\n\n // Determine if dropdown should open above or below\n const openAbove = spaceBelow < dropdownMaxHeight && spaceAbove > spaceBelow;\n\n const positions = openAbove\n ? [\n {\n originX: 'start' as const,\n originY: 'top' as const,\n overlayX: 'start' as const,\n overlayY: 'bottom' as const,\n },\n {\n originX: 'start' as const,\n originY: 'bottom' as const,\n overlayX: 'start' as const,\n overlayY: 'top' as const,\n },\n ]\n : [\n {\n originX: 'start' as const,\n originY: 'bottom' as const,\n overlayX: 'start' as const,\n overlayY: 'top' as const,\n },\n {\n originX: 'start' as const,\n originY: 'top' as const,\n overlayX: 'start' as const,\n overlayY: 'bottom' as const,\n },\n ];\n\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions(positions),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n minWidth: originWidth,\n });\n\n this.overlayRef.backdropClick().subscribe(() => {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n this.overlayRef = null;\n });\n }\n\n if (!this.overlayRef.hasAttached()) {\n const portal = new ComponentPortal(SelectDropdownComponent, this.viewContainerRef);\n const componentRef: ComponentRef<SelectDropdownComponent> = this.overlayRef.attach(portal);\n componentRef.instance.options = this.options;\n componentRef.instance.selectedOptionIds = this.selectedOptionIds;\n componentRef.instance.useFilter = this.useFilter;\n componentRef.instance.multiselect = this.multiselect;\n componentRef.instance.atLeastOne = this.atLeastOne;\n componentRef.instance.asButton = this.asButton;\n\n componentRef.instance.selectedChange.subscribe((selectedOptionIds) => {\n this.onTouched();\n\n const payload = Array.isArray(selectedOptionIds)\n ? [...selectedOptionIds]\n : selectedOptionIds;\n setTimeout(() => {\n this.selectedOptionIds = payload as string[];\n\n // Clear manual input values when selecting different options in dropdown mode\n if (!this.showAllItems) {\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const key = this.getManualKey(manualOpt);\n const prefix = manualOpt.manualPrefix || '';\n const sentinel = manualOpt.id || manualOpt.value;\n\n // Check if this manual option is still selected\n const isStillSelected = prefix\n ? this.selectedOptionIds.some(\n (id) => typeof id === 'string' && id.startsWith(prefix),\n )\n : this.selectedOptionIds.includes(sentinel);\n\n // If not selected, clear the manual input value\n if (!isStillSelected) {\n this.manualInputValues[key] = '';\n }\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n this.selectedChange.emit(payload);\n this.cdr.markForCheck();\n\n // Keep dropdown open if a manual-input option is selected (to allow typing)\n const shouldKeepOpenForManual = this.isManualSelection(this.selectedOptionIds);\n if (!this.multiselect && !shouldKeepOpenForManual) {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n this.overlayRef = null;\n }\n });\n });\n\n componentRef.instance.closeDropdown.subscribe(() => {\n this.isDropdownOpen.set(false);\n this.overlayRef?.detach();\n this.overlayRef = null;\n });\n\n this.isDropdownOpen.set(true);\n } else {\n this.isDropdownOpen.set(false);\n this.overlayRef.detach();\n this.overlayRef = null;\n }\n }\n\n onKeyDown(event: KeyboardEvent) {\n if (this.disabled) {\n return;\n }\n\n if (event.key === 'Enter') {\n }\n }\n\n onDeselectOption(event: Event, option: Option) {\n if (this.disabled) {\n return;\n }\n\n this.onTouched();\n\n event.stopPropagation();\n event.preventDefault();\n\n this.selectedOptionIds = this.selectedOptionIds.filter(\n (selected) => selected !== (option.id || option.value),\n );\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n this.selectedChange.emit(this.selectedOptionIds);\n\n this.isDropdownOpen.set(false);\n }\n\n onToggleOption(option: Option) {\n if (this.disabled) {\n return;\n }\n\n this.onTouched();\n\n // Handle manual input option\n if (option.shouldManualInput && this.showAllItems) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const typed = (this.manualInputValues[key] || '').trim();\n const isSelected = this.isOptionSelected(option);\n\n if (isSelected) {\n // Already selected - handle toggle based on mode\n if (this.multiselect) {\n // Checkbox: always deselect when clicked again\n let next: string[];\n if (prefix) {\n // Remove all IDs that start with prefix AND the sentinel\n next = this.selectedOptionIds.filter((id) => !id.startsWith(prefix) && id !== sentinel);\n } else {\n // Remove typed value AND the sentinel\n next = this.selectedOptionIds.filter((id) => id !== typed && id !== sentinel);\n }\n this.selectedOptionIds = next;\n // Clear input text when deselected\n this.manualInputValues[key] = '';\n // Hide input\n this.activeManualKey = null;\n } else {\n // Radio: deselect only if there's no typed content\n if (typed === '') {\n this.selectedOptionIds = [];\n this.manualInputValues[key] = '';\n this.activeManualKey = null;\n } else {\n // Has typed content - keep selected, do nothing\n return;\n }\n }\n } else {\n // Open manual input\n this.activeManualKey = key;\n\n // In single select mode, clear existing selections first\n if (!this.multiselect) {\n this.selectedOptionIds = [sentinel];\n } else {\n // In multiselect mode, add sentinel if not already present\n if (!this.selectedOptionIds.includes(sentinel)) {\n this.selectedOptionIds = [sentinel, ...this.selectedOptionIds];\n }\n }\n\n // Ensure there is an entry in manualInputValues\n if (this.manualInputValues[key] === undefined) {\n this.manualInputValues[key] = '';\n }\n\n // Focus input on next tick\n setTimeout(() => {\n const selector = `input[data-manual-key=\"${key}\"]`;\n const el = document.querySelector(selector) as HTMLInputElement | null;\n el?.focus();\n el?.select();\n });\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n return;\n }\n\n const id = option.id || option.value;\n\n if (this.multiselect) {\n if (option.isExclusive) {\n // Exclusive option: toggle between only this option or none\n if (this.selectedOptionIds.includes(id)) {\n this.selectedOptionIds = [];\n } else {\n this.selectedOptionIds = [id];\n\n // Clear all manual input values when selecting exclusive option\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const key = this.getManualKey(manualOpt);\n this.manualInputValues[key] = '';\n }\n this.activeManualKey = null;\n }\n } else {\n // Non-exclusive option: remove any exclusive selections first\n let next = this.selectedOptionIds.filter((selectedId) => !this.isIdExclusive(selectedId));\n\n if (next.includes(id)) {\n // Deselect\n next = next.filter((selected) => selected !== id);\n } else {\n // Select\n next = [id, ...next];\n }\n this.selectedOptionIds = next;\n }\n } else {\n // Single select mode\n\n // Clear manual input values when selecting different option\n const manualOptions = (this.options || []).filter((o) => o.shouldManualInput);\n for (const manualOpt of manualOptions) {\n const manualKey = this.getManualKey(manualOpt);\n const manualSentinel = manualOpt.id || manualOpt.value;\n const manualPrefix = manualOpt.manualPrefix || '';\n\n // Check if selecting a different option (not the manual input option itself)\n const isSelectingDifferent =\n id !== manualSentinel && !(manualPrefix && id.startsWith(manualPrefix));\n\n if (isSelectingDifferent) {\n this.manualInputValues[manualKey] = '';\n this.activeManualKey = null;\n }\n }\n\n if (this.atLeastOne) {\n this.selectedOptionIds = [id];\n } else {\n if (this.selectedOptionIds.includes(id)) {\n this.selectedOptionIds = [];\n } else {\n this.selectedOptionIds = [id];\n }\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n\n isOptionSelected(option: Option): boolean {\n const id = option.id || option.value;\n\n if (option.shouldManualInput && this.showAllItems) {\n const key = this.getManualKey(option);\n const prefix = option.manualPrefix;\n const sentinel = option.id || option.value;\n\n if (prefix) {\n const hasValueWithPrefix = this.selectedOptionIds.some(\n (selectedId) =>\n typeof selectedId === 'string' &&\n selectedId.startsWith(prefix) &&\n selectedId.length > prefix.length,\n );\n return hasValueWithPrefix;\n }\n\n const typed = (this.manualInputValues[key] || '').trim();\n // Only consider selected if there's actual typed value, not just sentinel\n if (typed !== '') {\n return this.selectedOptionIds.includes(typed);\n }\n // If no typed value, check if there's only sentinel (which means just activated but not typed yet)\n const hasSentinel = this.selectedOptionIds.includes(sentinel);\n const hasOnlySentinel =\n hasSentinel &&\n !this.selectedOptionIds.some(\n (id) => id !== sentinel && (prefix ? id.startsWith(prefix) : false),\n );\n return hasOnlySentinel;\n }\n\n return this.selectedOptionIds.includes(id);\n }\n\n private isIdExclusive(id: string): boolean {\n const options = this.options || [];\n for (const o of options) {\n if (!o.isExclusive) continue;\n const refId = o.id || o.value;\n if (refId === id) return true;\n }\n return false;\n }\n\n getSelectedValue(): string | string[] | null {\n if (!this.multiselect) {\n if (this.selectedOptionIds.length > 0) {\n return this.selectedOptionIds[0];\n } else {\n return null;\n }\n } else {\n return this.selectedOptionIds;\n }\n }\n\n onChange = (_value: any) => {};\n onTouched = () => {};\n\n writeValue(value: string[] | string): void {\n if (Array.isArray(value)) {\n this.selectedOptionIds = value.filter((id) => id !== null && id !== undefined && id !== '');\n } else {\n this.selectedOptionIds = value !== null && value !== undefined && value !== '' ? [value] : [];\n }\n this.recomputeSelectedOptions();\n }\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.select.Select...', {}, 'haloduck')\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['options']) {\n this.recomputeSelectedOptions();\n if (this.showAllItems) {\n this.seedManualInputs();\n }\n }\n }\n\n private recomputeSelectedOptions(): void {\n const options = this.options || [];\n const result: Option[] = [];\n const nextMap: Record<string, Option> = {};\n\n const selectedIds = [...this.selectedOptionIds];\n const consumed = new Set<string>();\n\n const resolveDisplayForId = (selectedId: string): Option => {\n // 1) exact match by id or value\n const exact = options.find((opt) => (opt.id || opt.value) === selectedId);\n if (exact) {\n return exact;\n }\n // 2) manual prefix match → create synthetic option for display\n const manual = options.find((opt) => {\n if (!opt.shouldManualInput) return false;\n if (opt.manualPrefix) {\n return selectedId.startsWith(opt.manualPrefix);\n }\n // when no prefix, match by sentinel id/value\n return (opt.id || opt.value) === selectedId;\n });\n if (manual) {\n const cached = this.selectedIdToDisplayOption[selectedId];\n return cached || { ...manual, id: selectedId, value: selectedId };\n }\n // 3) fallback when options array is missing the corresponding option definition\n const cached = this.selectedIdToDisplayOption[selectedId];\n return cached || { id: selectedId, value: selectedId };\n };\n\n if (this.multiselect) {\n // Order by options sequence first\n for (const opt of options) {\n if (opt.shouldManualInput) {\n const manualId = opt.manualPrefix\n ? selectedIds.find((id) => id.startsWith(opt.manualPrefix as string))\n : selectedIds.find((id) => id === (opt.id || opt.value));\n if (manualId) {\n const display = resolveDisplayForId(manualId);\n result.push(display);\n nextMap[manualId] = display;\n consumed.add(manualId);\n }\n } else {\n const id = opt.id || opt.value;\n if (selectedIds.includes(id)) {\n const display = resolveDisplayForId(id);\n result.push(display);\n nextMap[id] = display;\n consumed.add(id);\n }\n }\n }\n // Append any remaining selected ids in their existing order\n for (const selectedId of selectedIds) {\n if (consumed.has(selectedId)) continue;\n const display = resolveDisplayForId(selectedId);\n result.push(display);\n nextMap[selectedId] = display;\n }\n } else {\n // Single select: keep as-is (only one item), but still resolve display\n for (const selectedId of selectedIds) {\n const display = resolveDisplayForId(selectedId);\n result.push(display);\n nextMap[selectedId] = display;\n }\n }\n\n this.displayedSelectedOptions = result;\n this.selectedIdToDisplayOption = nextMap;\n }\n\n private isManualSelection(selectedIds: string[]): boolean {\n const options = this.options || [];\n for (const id of selectedIds) {\n const manual = options.find((opt) => opt.shouldManualInput);\n if (!manual) continue;\n if (manual.manualPrefix) {\n if (id.startsWith(manual.manualPrefix)) return true;\n // allow initial sentinel selection to keep open\n if ((manual.id || manual.value) === id) return true;\n } else {\n if ((manual.id || manual.value) === id) return true;\n }\n }\n return false;\n }\n\n getManualKey(option: Option): string {\n // Use option.id or option.value as the unique key\n // This ensures each manual input option has a unique key\n // even if they have the same manualPrefix\n return option.id || option.value;\n }\n\n seedManualInputs(): void {\n const options = this.options || [];\n const manualOptions = options.filter((o) => o.shouldManualInput);\n for (const opt of manualOptions) {\n const prefix = opt.manualPrefix || '';\n const key = this.getManualKey(opt);\n const existingWithPrefix = this.selectedOptionIds.find((id) =>\n prefix ? id?.startsWith(prefix) : false,\n );\n const value = existingWithPrefix ? existingWithPrefix.substring(prefix.length) : '';\n this.manualInputValues[key] = value;\n }\n }\n\n onManualInputChange(option: Option, value: string): void {\n // IME 조합 중이면 업데이트하지 않음\n if (this.isComposing) {\n return;\n }\n\n const key = this.getManualKey(option);\n this.manualInputValues[key] = value;\n\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n const trimmed = (value || '').trim();\n\n if (this.multiselect) {\n if (option.isExclusive) {\n if (trimmed === '') {\n this.selectedOptionIds = [sentinel];\n } else {\n this.selectedOptionIds = [`${prefix}${trimmed}`];\n }\n } else {\n let next = this.selectedOptionIds.filter((id) => !this.isIdExclusive(id));\n next = next.filter((id) => (prefix ? !id.startsWith(prefix) : id !== sentinel));\n if (trimmed !== '') {\n const toAdd = `${prefix}${trimmed}`;\n if (!next.includes(toAdd)) {\n next = [toAdd, ...next];\n }\n } else {\n if (!next.includes(sentinel)) {\n next = [sentinel, ...next];\n }\n }\n this.selectedOptionIds = next;\n }\n } else {\n if (trimmed === '') {\n this.selectedOptionIds = [sentinel];\n } else {\n this.selectedOptionIds = [`${prefix}${trimmed}`];\n }\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n\n onCompositionStart(): void {\n this.isComposing = true;\n }\n\n onCompositionEnd(option: Option, event: Event): void {\n this.isComposing = false;\n // 조합이 끝나면 최종 값으로 업데이트\n const target = event.target as HTMLInputElement;\n this.onManualInputChange(option, target.value);\n }\n\n onManualInputKeydown(option: Option, event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n // IME 조합 중이면 아무것도 하지 않음 (compositionend가 처리)\n if (this.isComposing) {\n return;\n }\n event.preventDefault();\n // 약간의 지연을 두어 compositionend 이벤트가 먼저 처리되도록 함\n setTimeout(() => {\n this.onManualInputBlur(option);\n }, 10);\n }\n }\n\n onManualInputBlur(option: Option): void {\n const key = this.getManualKey(option);\n const raw = (this.manualInputValues[key] || '').trim();\n if (raw === '') {\n this.activeManualKey = null;\n\n const prefix = option.manualPrefix || '';\n const sentinel = option.id || option.value;\n\n if (this.multiselect) {\n let next = [...this.selectedOptionIds];\n next = next.filter((id) => {\n if (id === sentinel) return false;\n if (prefix && id.startsWith(prefix)) return false;\n return true;\n });\n this.selectedOptionIds = next;\n } else {\n this.selectedOptionIds = [];\n }\n\n this.recomputeSelectedOptions();\n this.onChange(this.getSelectedValue());\n const selectedValue = this.getSelectedValue();\n if (selectedValue !== null) {\n this.selectedChange.emit(selectedValue);\n }\n this.cdr.markForCheck();\n }\n }\n}\n","<div\n class=\"flex gap-2 items-center w-full\"\n [ngClass]=\"{ 'flex-col items-start': layout === 'vertical' }\"\n>\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control {{\n labelWidth\n }}\"\n [ngClass]=\"{ 'w-full': layout === 'vertical' }\"\n >\n <!-- <ng-content select=\"[slot=label]\"></ng-content> -->\n <ng-content></ng-content>\n </label>\n\n @if (showAllItems) {\n <!-- Inline options display -->\n <div class=\"w-full flex-1\">\n @if (loading) {\n <div class=\"flex-1 flex items-center gap-2 w-full h-3\">\n <div class=\"animate-pulse bg-light-inactive dark:bg-dark-inactive rounded-md h-5 w-full\">\n \n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-2\">\n @for (option of options; track option.id || option.value) {\n <label\n class=\"flex items-center gap-2 text-sm/6 text-light-on-control dark:text-dark-on-control cursor-pointer\"\n [ngClass]=\"{\n 'opacity-60 cursor-not-allowed': disabled,\n }\"\n (click)=\"$event.preventDefault()\"\n >\n @if (multiselect) {\n <!-- Checkbox for multiselect -->\n <input\n type=\"checkbox\"\n [checked]=\"isOptionSelected(option)\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && onToggleOption(option)\"\n class=\"appearance-none w-5 h-5 rounded bg-light-control dark:bg-dark-control border-2 border-light-inactive dark:border-dark-inactive cursor-pointer disabled:cursor-not-allowed checked:bg-light-primary checked:dark:bg-dark-primary checked:border-light-primary checked:dark:border-dark-primary relative before:content-[''] before:absolute before:inset-0 before:bg-[url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEgNEw0LjUgNy41TDExIDEiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+')] before:bg-center before:bg-no-repeat before:opacity-0 checked:before:opacity-100\"\n />\n } @else {\n <!-- Radio button for single select -->\n <input\n type=\"radio\"\n [checked]=\"isOptionSelected(option)\"\n [disabled]=\"disabled\"\n (click)=\"!disabled && onToggleOption(option)\"\n [name]=\"radioGroupName\"\n class=\"appearance-none w-5 h-5 rounded-full bg-light-control dark:bg-dark-control border-2 border-light-inactive dark:border-dark-inactive cursor-pointer disabled:cursor-not-allowed checked:bg-light-primary checked:dark:bg-dark-primary checked:border-light-primary checked:dark:border-dark-primary relative before:content-[''] before:absolute before:inset-[4px] before:rounded-full before:bg-light-on-primary before:dark:bg-dark-on-primary before:opacity-0 checked:before:opacity-100\"\n />\n }\n @if (\n option.shouldManualInput &&\n (isOptionSelected(option) || activeManualKey === (option.id || option.value))\n ) {\n <input\n type=\"text\"\n [(ngModel)]=\"manualInputValues[option.id || option.value]\"\n [attr.data-manual-key]=\"option.id || option.value\"\n (ngModelChange)=\"onManualInputChange(option, $event)\"\n (compositionstart)=\"onCompositionStart()\"\n (compositionend)=\"onCompositionEnd(option, $event)\"\n (click)=\"$event.stopPropagation()\"\n (blur)=\"onManualInputBlur(option)\"\n (keydown)=\"onManualInputKeydown(option, $event)\"\n [disabled]=\"!!disabled\"\n class=\"flex-1 text-light-on-control dark:text-dark-on-control rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary px-2 py-1 text-sm/6 bg-light-control dark:bg-dark-control\"\n />\n } @else {\n <span (click)=\"!disabled && onToggleOption(option)\">{{ option.value }}</span>\n }\n </label>\n }\n </div>\n }\n </div>\n } @else {\n <!-- Original dropdown display -->\n <div\n #origin\n class=\"w-full flex-1 relative overflow-visible rounded-md outline outline-light-inactive dark:outline-dark-inactive text-sm/6\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary focus:dark:outline-dark-primary':\n !disabled,\n 'bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n variant === 'secondary' && !disabled,\n 'bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick($event)\"\n (keydown)=\"onKeyDown($event)\"\n >\n <div\n class=\"px-3 py-1.5 text-sm/6 cursor-pointer flex flex-nowrap items-center justify-between overflow-hidden\"\n >\n @if (loading) {\n <div class=\"flex-1 flex items-center gap-2 w-full h-3\">\n <div\n class=\"animate-pulse bg-light-inactive dark:bg-dark-inactive rounded-md h-5 w-full\"\n >\n \n </div>\n </div>\n } @else {\n <div class=\"flex-1\">\n @if (!asButton && displayedSelectedOptions && displayedSelectedOptions.length > 0) {\n @if (multiselect) {\n <div class=\"flex flex-wrap gap-x-2 gap-y-1 items-start\">\n @for (option of displayedSelectedOptions; track option; let i = $index) {\n @if (showAll || i === 0) {\n <span\n class=\"bg-light-secondary dark:bg-dark-secondary rounded-md flex items-center text-xs/6 text-light-on-secondary dark:text-dark-on-secondary\"\n [ngClass]=\"{ 'w-full h-full px-4': !multiselect, 'px-1': multiselect }\"\n >\n {{ option.value }}\n @if (showAll || i === 0) {\n <div\n (click)=\"onDeselectOption($event, option)\"\n class=\"ml-2 text-light-danger dark:text-dark-danger hover:cursor-pointer\"\n >\n <svg\n class=\"w-3 h-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M10 8.586l-2.293-2.293a1 1 0 00-1.414 1.414L8.586 10l-2.293 2.293a1 1 0 001.414 1.414L10 11.414l2.293 2.293a1 1 0 001.414-1.414L11.414 10l2.293-2.293a1 1 0 00-1.414-1.414L10 8.586z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n }\n </span>\n @if (!showAll && displayedSelectedOptions.length > 1) {\n <span\n class=\"text-light-on-control/80 dark:text-dark-on-control/80 text-xs/6\"\n >\n +{{ displayedSelectedOptions.length - 1 }}\n </span>\n }\n }\n }\n </div>\n } @else {\n <span\n class=\"text-light-on-control dark:text-dark-on-control overflow-hidden overflow-ellipsis\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary dark:text-dark-on-primary':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary dark:text-dark-on-secondary':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger dark:text-dark-on-danger':\n variant === 'danger' && !disabled,\n }\"\n >{{ displayedSelectedOptions[0].value }}</span\n >\n }\n } @else {\n <span\n class=\"text-light-inactive dark:text-dark-inactive overflow-hidden overflow-ellipsis\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary/80 dark:text-dark-on-primary/80':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary/80 dark:text-dark-on-secondary/80':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger/80 dark:text-dark-on-danger/80':\n variant === 'danger' && !disabled,\n }\"\n >\n @if (useIcon) {\n <ng-content select=\"buttonIcon\"></ng-content>\n } @else {\n {{ placeholder }}\n }\n </span>\n }\n </div>\n }\n <div\n class=\"text-light-on-control dark:text-dark-on-control\"\n [ngClass]=\"{\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n 'text-light-on-primary/80 dark:text-dark-on-primary/80':\n variant === 'primary' && !disabled,\n 'text-light-on-secondary/80 dark:text-dark-on-secondary/80':\n variant === 'secondary' && !disabled,\n 'text-light-on-danger/80 dark:text-dark-on-danger/80':\n variant === 'danger' && !disabled,\n }\"\n >\n @if (isDropdownOpen()) {\n <svg\n class=\"w-4 h-4 ml-2 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n 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\"\n clip-rule=\"evenodd\"\n />\n </svg>\n } @else {\n <svg\n class=\"w-4 h-4 ml-2 inline-block\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 011.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n }\n </div>\n </div>\n </div>\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { SelectComponent } from '../select/select.component';\nimport { Option } from '../select/select-dropdown/select-dropdown.component';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { zip } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nexport interface DateRange {\n from: string;\n to: string;\n}\n\nexport interface DateRangeDropdown {\n currentYear: number;\n currentMonth: number;\n from?: string;\n listCalendarDate: CalendarDate[];\n}\n\nexport interface CalendarDate {\n datetime: string;\n date: string;\n isToday: boolean;\n isTheDate: boolean;\n isCurrentMonth: boolean;\n}\n\n@Component({\n selector: 'haloduck-calendar',\n imports: [CommonModule, SelectComponent, FormsModule, TranslocoModule],\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class CalendarComponent implements OnInit {\n private readonly translateService = inject(TranslocoService);\n @ViewChild('monthSelect', { static: false })\n monthSelect!: SelectComponent;\n @Input() singleDate: boolean = false;\n @Input() firstDayOfWeek: number = 1; // monday\n @Input() selectedDate?: string;\n @Input() selectedDateRange?: DateRange;\n @Output() dateChange = new EventEmitter<CalendarDate>();\n @Output() dateRangeChange = new EventEmitter<DateRange>();\n currentYear: number = new Date().getFullYear();\n currentMonth: number = new Date().getMonth();\n listCalendarDate: CalendarDate[] = [];\n isFromSelected: boolean = false;\n\n yearList: Option[] = [];\n monthList: Option[] = [];\n\n onAdjustYear(amount: number) {\n this.currentYear += amount;\n this.calculateDateRangeDropdown();\n }\n\n onAdjustMonth(amount: number) {\n this.currentMonth += amount;\n\n if (this.currentMonth < 0) {\n this.currentYear--;\n this.currentMonth = 11;\n } else if (this.currentMonth > 11) {\n this.currentYear++;\n this.currentMonth = 0;\n }\n\n this.calculateDateRangeDropdown();\n }\n\n onSelectCalendarDate(date: CalendarDate) {\n if (this.singleDate) {\n this.dateChange.emit(date);\n } else {\n if (!this.isFromSelected) {\n this.selectedDateRange = {\n from: date.datetime,\n to: date.datetime,\n };\n this.isFromSelected = true;\n } else {\n if (this.selectedDateRange?.from) {\n const from =\n this.selectedDateRange.from < date.datetime\n ? this.selectedDateRange.from\n : date.datetime;\n const to =\n this.selectedDateRange.from < date.datetime\n ? date.datetime\n : this.selectedDateRange.from;\n\n this.dateRangeChange.emit({\n from,\n to,\n });\n\n this.isFromSelected = false;\n }\n }\n }\n }\n\n onCalenderOpen(value: string | DateRange) {\n // const currentDate = (this.singleDate) ? () : ( value && value.from && value.to ? value.from :dateToString(new Date()));\n let currentDate: string;\n if (this.singleDate) {\n const date = value as string;\n currentDate = date ? date : dateToString(new Date());\n } else {\n const dateRange = value as DateRange;\n currentDate =\n dateRange && dateRange.from && dateRange.to ? dateRange.from : dateToString(new Date());\n }\n\n this.currentYear = parseInt(currentDate.slice(0, 4), 10);\n this.currentMonth = parseInt(currentDate.slice(5, 7), 10) - 1;\n\n this.calculateDateRangeDropdown();\n }\n\n calculateDateRangeDropdown() {\n const weekdayOfFirstOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();\n const firstOfCalendar = new Date(\n this.currentYear,\n this.currentMonth,\n 1 - weekdayOfFirstOfMonth + this.firstDayOfWeek,\n );\n if (firstOfCalendar > new Date(this.currentYear, this.currentMonth, 1)) {\n firstOfCalendar.setDate(firstOfCalendar.getDate() - 7);\n }\n const lastOfCalendar = new Date(firstOfCalendar);\n lastOfCalendar.setDate(lastOfCalendar.getDate() + 41);\n if (lastOfCalendar.getDate() > 6) {\n lastOfCalendar.setDate(lastOfCalendar.getDate() - 7);\n }\n const dateDiff =\n Math.ceil((lastOfCalendar.getTime() - firstOfCalendar.getTime()) / (1000 * 60 * 60 * 24)) + 1;\n\n this.listCalendarDate = [];\n\n for (let i = 0; i < dateDiff; i++) {\n const datetime = dateToString(firstOfCalendar);\n const date = firstOfCalendar.getDate().toString();\n const isToday = firstOfCalendar.toDateString() === new Date().toDateString();\n const isCurrentMonth = firstOfCalendar.getMonth() === this.currentMonth;\n const isTheDate =\n (this.singleDate && this.selectedDate\n ? datetime === this.selectedDate\n : this.selectedDateRange &&\n this.selectedDateRange.from &&\n this.selectedDateRange.to &&\n datetime >= this.selectedDateRange.from &&\n datetime <= this.selectedDateRange.to) || false;\n\n this.listCalendarDate.push({\n datetime,\n date,\n isToday,\n isTheDate,\n isCurrentMonth,\n });\n\n firstOfCalendar.setDate(firstOfCalendar.getDate() + 1);\n }\n }\n\n onSelectYear(year: string | string[]) {\n year = year as string;\n this.currentYear = parseInt(year, 10);\n this.calculateDateRangeDropdown();\n }\n\n onSelectMonth(month: string | string[]) {\n month = month as string;\n this.currentMonth = parseInt(month, 10);\n this.calculateDateRangeDropdown();\n }\n\n ngOnInit(): void {\n if (this.singleDate) {\n this.onCalenderOpen(this.selectedDate ?? dateToString(new Date()));\n } else {\n this.onCalenderOpen(\n this.selectedDateRange ?? {\n from: dateToString(new Date()),\n to: dateToString(new Date()),\n },\n );\n }\n }\n\n constructor() {\n const currentYear = new Date().getFullYear();\n this.translateService\n .selectTranslate('ui.calendar._year_', { year: '_year_' }, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n this.yearList = [];\n for (let i = currentYear; i >= currentYear - 150; i--) {\n this.yearList.push({\n id: i.toString(),\n value: translation.replace('_year_', i.toString()),\n });\n }\n });\n\n zip(\n this.translateService.selectTranslate('ui.calendar.January', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.February', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.March', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.April', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.May', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.June', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.July', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.August', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.September', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.October', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.November', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.December', {}, 'haloduck'),\n )\n .pipe(takeUntilDestroyed())\n .subscribe((translations) => {\n this.monthList = [\n {\n id: '0',\n value: translations[0],\n },\n {\n id: '1',\n value: translations[1],\n },\n {\n id: '2',\n value: translations[2],\n },\n {\n id: '3',\n value: translations[3],\n },\n {\n id: '4',\n value: translations[4],\n },\n {\n id: '5',\n value: translations[5],\n },\n {\n id: '6',\n value: translations[6],\n },\n {\n id: '7',\n value: translations[7],\n },\n {\n id: '8',\n value: translations[8],\n },\n {\n id: '9',\n value: translations[9],\n },\n {\n id: '10',\n value: translations[10],\n },\n {\n id: '11',\n value: translations[11],\n },\n ];\n });\n }\n}\n\n// return yyyy-mm-dd\nexport function dateToString(date: Date): string {\n return (\n date.getFullYear() +\n '-' +\n (date.getMonth() + 1).toString().padStart(2, '0') +\n '-' +\n date.getDate().toString().padStart(2, '0')\n );\n}\n","<div\n id=\"dateRangeCalendar\"\n class=\"min-w-96 brightness-125 bg-light-background dark:bg-dark-background border border-light-inactive dark:border-dark-inactive rounded text-center p-4 flex flex-col gap-4\"\n tabindex=\"1\"\n>\n <div class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustYear(-1)\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n <div class=\"flex-auto text-sm font-semibold flex justify-center\">\n <div class=\"w-32\">\n <haloduck-select\n [multiselect]=\"false\"\n [atLeastOne]=\"true\"\n [options]=\"yearList\"\n [value]=\"currentYear + ''\"\n (selectedChange)=\"onSelectYear($event)\"\n >\n </haloduck-select>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustYear(1)\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <div class=\"flex items-center\">\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustMonth(-1)\"\n >\n <span class=\"sr-only\">이전 달</span>\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M11.78 5.22a.75.75 0 0 1 0 1.06L8.06 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n <div class=\"flex-auto text-sm font-semibold flex justify-center\">\n <div class=\"w-32\">\n <haloduck-select\n [multiselect]=\"false\"\n [atLeastOne]=\"true\"\n [options]=\"monthList\"\n [value]=\"currentMonth + ''\"\n (selectedChange)=\"onSelectMonth($event)\"\n >\n </haloduck-select>\n </div>\n </div>\n <button\n type=\"button\"\n class=\"-m-1.5 flex flex-none items-center justify-center p-1.5 text-light-on-background dark:text-dark-on-background hover:scale-105 hover:cursor-pointer active:scale-95\"\n (click)=\"onAdjustMonth(1)\"\n >\n <span class=\"sr-only\">다음 달</span>\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M8.22 5.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06-1.06L11.94 10 8.22 6.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </button>\n </div>\n\n <div>\n <div\n class=\"grid grid-cols-7 gap-[1px] text-xs/6 font-semibold text-light-on-background dark:text-dark-on-background\"\n >\n <div>{{ 'haloduck.ui.calendar.Mon' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Tue' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Wed' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Thu' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Fri' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Sat' | transloco }}</div>\n <div>{{ 'haloduck.ui.calendar.Sun' | transloco }}</div>\n </div>\n\n <div class=\"isolate mt-2 grid grid-cols-7 gap-[1px] rounded-lg text-sm shadow overflow-hidden\">\n @for (date of listCalendarDate; track date.datetime) {\n <button\n type=\"button\"\n (click)=\"onSelectCalendarDate(date)\"\n class=\"py-1.5 hover:cursor-pointer bg-light-alternative dark:bg-dark-alternative text-light-on-alternative dark:text-dark-on-alternative\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control text-light-on-control dark:text-dark-on-control':\n date.isCurrentMonth,\n }\"\n >\n <time\n [ngClass]=\"{\n 'font-semibold bg-light-primary-light dark:bg-dark-primary-light text-on-light-primary-light dark:text-dark-on-primary-light':\n date.isToday && date.datetime !== selectedDateRange?.from,\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n date.datetime === selectedDateRange?.from,\n 'bg-gray-500 font-semibold text-white': date.isTheDate,\n }\"\n class=\"mx-auto flex size-7 items-center justify-center rounded-full hover:font-bold\"\n >{{ date.date }}</time\n >\n </button>\n }\n </div>\n </div>\n</div>\n","import {\n AfterViewInit,\n Component,\n ComponentRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n Type,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\n\n@Component({\n selector: 'haloduck-dialog-container',\n templateUrl: './dialog-container.component.html',\n styleUrl: './dialog-container.component.css',\n})\nexport class DialogContainerComponent implements OnInit, AfterViewInit {\n @Input() childComponent!: Type<any>;\n @Input() data: any;\n @Output() close = new EventEmitter<void>();\n @ViewChild('dialogContainer', { read: ViewContainerRef })\n dialogContainer!: ViewContainerRef;\n\n ngAfterViewInit(): void {\n if (this.childComponent) {\n const componentRef: ComponentRef<any> = this.dialogContainer.createComponent(\n this.childComponent,\n );\n if (this.data) {\n Object.assign(componentRef.instance, { context: this.data });\n }\n\n if (this.data.classList) {\n this.data.classList.forEach((className: string) => {\n componentRef.location.nativeElement.classList.add(className);\n });\n }\n\n componentRef.location.nativeElement.classList.add('max-w-full');\n componentRef.location.nativeElement.classList.add('max-h-full');\n componentRef.location.nativeElement.classList.add('text-light-on-background');\n componentRef.location.nativeElement.classList.add('dark:text-dark-on-background');\n componentRef.location.nativeElement.classList.add('bg-light-background');\n componentRef.location.nativeElement.classList.add('dark:bg-dark-background');\n componentRef.location.nativeElement.classList.add('p-4');\n componentRef.location.nativeElement.classList.add('rounded-lg');\n componentRef.location.nativeElement.classList.add('overflow-auto');\n }\n }\n\n ngOnInit(): void {}\n\n closeDialog() {\n this.close.emit();\n }\n}\n","<div\n class=\"h-full w-full max-h-full max-w-full fixed inset-0 bg-black/50 flex items-center justify-center overflow-hidden\"\n>\n <!-- <div class=\"w-full h-full max-w-full max-h-full bg-white p-5 rounded-lg overflow-y-auto\"\n (click)=\"$event.stopPropagation()\"> -->\n <ng-container id=\"dialogContainer\" #dialogContainer></ng-container>\n <!-- </div> -->\n</div>\n","import { Injectable, Injector, TemplateRef, Type } from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { DialogContainerComponent } from './dialog-container.component';\n\n@Injectable({ providedIn: 'root' })\nexport class DialogService {\n private dialogStack: OverlayRef[] = []; // 다이얼로그 스택\n\n constructor(\n private overlay: Overlay,\n private injector: Injector,\n ) {}\n\n open<T>(component: Type<T> | TemplateRef<any>, data?: any, classList?: string[]): OverlayRef {\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n panelClass: 'custom-dialog-panel',\n scrollStrategy: this.overlay.scrollStrategies.block(),\n });\n\n const portal = new ComponentPortal(DialogContainerComponent);\n const containerRef = overlayRef.attach(portal);\n\n containerRef.instance.childComponent = component as Type<T>;\n containerRef.instance.data = { ...data, overlayRef, classList };\n containerRef.instance.close.subscribe(() => this.close(overlayRef));\n\n this.dialogStack.push(overlayRef);\n\n return overlayRef;\n }\n\n close(overlayRef?: OverlayRef): void {\n if (overlayRef) {\n overlayRef.dispose();\n this.dialogStack = this.dialogStack.filter((ref) => ref !== overlayRef);\n } else {\n // 마지막 다이얼로그 닫기\n const lastOverlay = this.dialogStack.pop();\n lastOverlay?.dispose();\n }\n }\n\n closeAll(): void {\n while (this.dialogStack.length) {\n this.dialogStack.pop()?.dispose();\n }\n }\n}\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { ButtonComponent, ButtonVariant } from '../button/button.component';\n\nexport interface Button {\n id: string;\n label: string;\n variant: ButtonVariant;\n}\n\n@Component({\n selector: 'haloduck-confirm-dialog',\n imports: [ButtonComponent],\n templateUrl: './confirm-dialog.component.html',\n styleUrl: './confirm-dialog.component.css',\n})\nexport class ConfirmDialogComponent implements OnInit {\n private readonly dialogService = inject(DialogService);\n @Input() context!: {\n title: string;\n message: string;\n buttons: Button[];\n clickedButton$: any;\n overlayRef: any;\n };\n\n onButtonClicked(id: string) {\n this.context.clickedButton$.next(id);\n this.context.clickedButton$.complete();\n\n this.dialogService.close(this.context.overlayRef);\n }\n\n ngOnInit(): void {}\n\n constructor() {}\n}\n","<div\n class=\"w-120 max-w-full flex flex-col gap-4 text-light-on-background dark:text-dark-on-background bg-light-background dark:bg-dark-background\"\n>\n <div class=\"font-bold\">{{ context.title }}</div>\n <p>{{ context.message }}</p>\n <div class=\"flex items-center justify-center gap-4\">\n @for (button of context.buttons; track button.id) {\n <haloduck-button [variant]=\"button.variant\" (click)=\"onButtonClicked(button.id)\">{{\n button.label\n }}</haloduck-button>\n }\n </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { Button, ConfirmDialogComponent } from './confirm-dialog.component';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { Observable, Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConfirmDialogService {\n private readonly dialogService = inject(DialogService);\n private clickedButton$!: Subject<string>;\n\n public confirm(title: string, message: string, buttons: Button[]): Observable<string> {\n this.clickedButton$ = new Subject<string>();\n\n const dialogRef = this.dialogService.open<ConfirmDialogComponent>(ConfirmDialogComponent, {\n title,\n message,\n buttons,\n clickedButton$: this.clickedButton$,\n });\n\n return this.clickedButton$.asObservable();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-copy-button',\n imports: [TranslocoModule],\n templateUrl: './copy-button.component.html',\n styleUrl: './copy-button.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class CopyButtonComponent {\n @Input() text: string = '';\n isAnimating = false;\n\n copyToClipboard($event: Event) {\n $event.preventDefault();\n $event.stopPropagation();\n\n this.isAnimating = true;\n setTimeout(() => {\n this.isAnimating = false;\n }, 500); // Animation duration\n\n if (navigator.clipboard && window.isSecureContext) {\n navigator.clipboard.writeText(this.text);\n // .then(() => {\n // console.log('Text copied to clipboard');\n // })\n // .catch((err) => {\n // console.error('Failed to copy text: ', err);\n // });\n } else {\n const textArea = document.createElement('textarea');\n textArea.value = this.text;\n textArea.style.position = 'fixed'; // Avoid scrolling to bottom\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n try {\n document.execCommand('copy');\n // console.log('Text copied to clipboard');\n } catch (err) {\n // console.error('Failed to copy text: ', err);\n }\n document.body.removeChild(textArea);\n }\n }\n}\n","<ng-container *transloco=\"let _ts; read: 'haloduck'\">\n <button\n type=\"button\"\n class=\"group inline-flex items-center px-2 py-1 bg-light-alternative dark:bg-dark-alternative hover:brightness-125 rounded text-xs text-light-on-alternative dark:text-dark-on-alternative hover:cursor-pointer active:scale-95 transition-transform\"\n (click)=\"copyToClipboard($event)\"\n title=\"Copy to clipboard\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [class]=\"\n 'h-4 w-4 mr-1 transition-all duration-500 ' +\n (isAnimating ? 'scale-150 opacity-0' : 'scale-100 opacity-100')\n \"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <rect\n x=\"9\"\n y=\"9\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n fill=\"none\"\n />\n <rect\n x=\"3\"\n y=\"3\"\n width=\"13\"\n height=\"13\"\n rx=\"2\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n fill=\"none\"\n />\n </svg>\n <span class=\"hidden group-hover:inline\">\n @if (isAnimating) {\n {{ _ts('ui.button.Copied') }}\n } @else {\n {{ _ts('ui.button.Copy') }}\n }\n </span>\n </button>\n</ng-container>\n","import {\n Component,\n ComponentRef,\n ElementRef,\n forwardRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { Subject, takeUntil } from 'rxjs';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\n\nimport { CalendarComponent, CalendarDate } from '../calendar/calendar.component';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'haloduck-date-picker',\n imports: [CommonModule, FormsModule],\n templateUrl: './date-picker.component.html',\n styleUrl: './date-picker.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DatePickerComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class DatePickerComponent implements ControlValueAccessor, OnInit, OnDestroy {\n destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n\n @Input() disabled: boolean = false;\n @Input() placeholder: string = '';\n @Input() firstDayOfWeek: number = 1;\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n selectedDate?: string;\n\n private overlayRef?: OverlayRef;\n\n onClick() {\n if (this.disabled) {\n return;\n }\n\n this.openCalendar();\n }\n\n onDateChange(date: CalendarDate) {\n this.selectedDate = date.datetime;\n this.onChange(this.selectedDate);\n this.onTouched();\n }\n\n openCalendar() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(CalendarComponent);\n const componentRef: ComponentRef<CalendarComponent> = this.overlayRef.attach(calendarPortal);\n\n // Pass values directly to the CalendarComponent instance\n componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n componentRef.instance.singleDate = true;\n componentRef.instance.selectedDate = this.selectedDate;\n\n // Subscribe to events emitted by the CalendarComponent\n componentRef.instance.dateChange.pipe(takeUntil(this.destroy$)).subscribe((date) => {\n this.onDateChange(date);\n this.closeCalendar();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.closeCalendar();\n });\n }\n }\n\n closeCalendar() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: string): void {\n this.selectedDate = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.calendar.Pick a date.', {}, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n }\n}\n","<label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n</label>\n<div\n #origin\n class=\"py-1.5 relative mt-2 gap-2 rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary':\n !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick()\"\n>\n <div class=\"flex items-center\">\n <div\n class=\"flex-1 text-light-on-control dark:text-dark-on-control sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-inactive dark:text-dark-inactive': !selectedDate && !disabled,\n 'text-light-on-control dark:text-dark-on-control': selectedDate && !disabled,\n }\"\n >\n {{ selectedDate || placeholder }}\n </div>\n </div>\n</div>\n","import {\n Component,\n forwardRef,\n Input,\n OnDestroy,\n ComponentRef,\n ViewChild,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Subject, zip, takeUntil } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { TranslocoModule, TranslocoService, provideTranslocoScope } from '@jsverse/transloco';\nimport { SelectComponent } from '../select/select.component';\nimport { Option } from '../select/select-dropdown/select-dropdown.component';\nimport { DateRange, dateToString, CalendarComponent } from '../calendar/calendar.component';\n\n@Component({\n selector: 'haloduck-date-range',\n imports: [SelectComponent, CommonModule, FormsModule, TranslocoModule],\n templateUrl: './date-range.component.html',\n styleUrl: './date-range.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateRangeComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class DateRangeComponent implements ControlValueAccessor, OnDestroy {\n destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n\n @Input() dateRangeOptions: Option[] = [];\n @Input() disabled: boolean = false;\n @Input() placeholder: string = '';\n @Input() firstDayOfWeek: number = 1;\n\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n selectedDateRangeOptionId?: string;\n dateRange?: DateRange = undefined;\n\n private overlayRef?: OverlayRef;\n\n getSelectedDateRangeString(): any {\n return (\n this.dateRange &&\n this.dateRange.from &&\n this.dateRange.to &&\n this.dateRange.from + ' ~ ' + this.dateRange.to\n );\n }\n\n onClick() {\n if (this.disabled) {\n return;\n }\n\n this.onTouched();\n\n this.openCalendar();\n }\n\n onDateRangeOptionChange(selectedOptionId: string) {\n this.selectedDateRangeOptionId = selectedOptionId;\n if (this.selectedDateRangeOptionId !== 'custom') {\n this.calculateDateRange();\n } else {\n this.openCalendar();\n }\n }\n\n onDateRangeChange(dateRange: DateRange) {\n this.dateRange = dateRange;\n this.selectedDateRangeOptionId = 'custom';\n this.onChange(this.dateRange);\n }\n\n calculateDateRange() {\n if (!this.selectedDateRangeOptionId) {\n } else if (this.selectedDateRangeOptionId !== 'custom') {\n const unit = this.selectedDateRangeOptionId.charAt(0);\n const amount = parseInt(this.selectedDateRangeOptionId.slice(1), 10);\n let from = new Date();\n let to = new Date();\n\n switch (unit) {\n case 'd':\n from = new Date(to);\n from.setDate(to.getDate() - amount);\n break;\n case 'm':\n from = new Date(to);\n from.setMonth(to.getMonth() - amount);\n break;\n case 'y':\n from = new Date(to);\n from.setFullYear(to.getFullYear() - amount);\n break;\n default:\n break;\n }\n\n this.dateRange = {\n from: dateToString(from),\n to: dateToString(to),\n };\n\n this.onChange(this.dateRange);\n }\n }\n\n getDateRangeOptionId(dateRange: DateRange): string {\n const selectedOption = this.dateRangeOptions.find((option) => {\n const unit = (option.id || option.value).charAt(0);\n const amount = parseInt((option.id || option.value).slice(1), 10);\n let from = new Date();\n let to = new Date();\n\n switch (unit) {\n case 'd':\n from = new Date(to);\n from.setDate(to.getDate() - amount);\n break;\n case 'm':\n from = new Date(to);\n from.setMonth(to.getMonth() - amount);\n break;\n case 'y':\n from = new Date(to);\n from.setFullYear(to.getFullYear() - amount);\n break;\n default:\n break;\n }\n\n return dateRange.from === dateToString(from) && dateRange.to === dateToString(to);\n });\n\n if (selectedOption) {\n return selectedOption.id || selectedOption.value;\n }\n\n return 'custom';\n }\n\n openCalendar() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(CalendarComponent);\n const componentRef: ComponentRef<CalendarComponent> = this.overlayRef.attach(calendarPortal);\n\n componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n componentRef.instance.selectedDateRange = this.dateRange;\n\n // Subscribe to events emitted by the CalendarComponent\n componentRef.instance.dateRangeChange.pipe(takeUntil(this.destroy$)).subscribe((date) => {\n this.onDateRangeChange(date);\n this.closeCalendar();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.closeCalendar();\n });\n }\n }\n\n closeCalendar() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: DateRange): void {\n this.dateRange = value;\n\n if (!value) {\n this.selectedDateRangeOptionId = undefined;\n } else {\n this.selectedDateRangeOptionId = this.getDateRangeOptionId(value);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n constructor() {\n this.translateService\n .selectTranslate('ui.calendar.Pick a period.', {}, 'haloduck')\n .pipe(takeUntilDestroyed())\n .subscribe((translation) => {\n if (!this.placeholder || this.placeholder === '') {\n this.placeholder = translation;\n }\n });\n\n zip(\n this.translateService.selectTranslate('ui.calendar.today', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.yesterday', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.2 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.3 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a week ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.15 Days ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a month ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.2 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.3 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.6 months ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.a year ago', {}, 'haloduck'),\n this.translateService.selectTranslate('ui.calendar.pick manually', {}, 'haloduck'),\n )\n .pipe(takeUntilDestroyed())\n .subscribe(\n ([\n today,\n yesterday,\n twoDaysAgo,\n threeDaysAgo,\n aWeekAgo,\n fifteenDaysAgo,\n aMonthAgo,\n twoMonthsAgo,\n threeMonthsAgo,\n sixMonthsAgo,\n aYearAgo,\n pickManually,\n ]) => {\n if (this.dateRangeOptions.length === 0) {\n this.dateRangeOptions = [\n {\n id: 'd0',\n value: today,\n },\n {\n id: 'd1',\n value: yesterday,\n },\n {\n id: 'd2',\n value: twoDaysAgo,\n },\n {\n id: 'd3',\n value: threeDaysAgo,\n },\n {\n id: 'd7',\n value: aWeekAgo,\n },\n {\n id: 'd15',\n value: fifteenDaysAgo,\n },\n {\n id: 'm1',\n value: aMonthAgo,\n },\n {\n id: 'm2',\n value: twoMonthsAgo,\n },\n {\n id: 'm3',\n value: threeMonthsAgo,\n },\n {\n id: 'm6',\n value: sixMonthsAgo,\n },\n {\n id: 'y1',\n value: aYearAgo,\n },\n {\n id: 'custom',\n value: pickManually,\n },\n ];\n }\n },\n );\n }\n}\n","<label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n</label>\n<div\n #origin\n class=\"relative mt-2 gap-2 rounded-md outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [ngClass]=\"{\n 'bg-light-control dark:bg-dark-control focus:outline-2 focus:outline-offset-2 focus:outline-light-primary dark:focus:outline-dark-primary':\n !disabled,\n 'bg-light-control/60 dark:bg-dark-control/60 text-light-on-control/60 dark:text-dark-on-control/60':\n disabled,\n }\"\n [tabindex]=\"disabled ? -1 : 0\"\n (click)=\"onClick()\"\n>\n <div class=\"flex items-center\">\n <haloduck-select\n [multiselect]=\"false\"\n [disabled]=\"disabled\"\n [options]=\"dateRangeOptions\"\n [atLeastOne]=\"true\"\n (click)=\"$event.stopPropagation()\"\n variant=\"primary\"\n placeholder=\"{{ 'haloduck.ui.calendar.Period' | transloco }}\"\n [(ngModel)]=\"selectedDateRangeOptionId\"\n (ngModelChange)=\"onDateRangeOptionChange($event)\"\n >\n </haloduck-select>\n @if (getSelectedDateRangeString()) {\n <div\n class=\"flex-1 sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-on-control dark:text-dark-on-control': !disabled,\n 'text-light-on-control/60 dark:text-light-on-control/60': disabled,\n }\"\n >\n {{ getSelectedDateRangeString() }}\n </div>\n } @else {\n <div\n class=\"flex-1 sm:text-sm/6 text-center\"\n [ngClass]=\"{\n 'text-light-inactive dark:text-dark-inactive': !disabled,\n 'text-light-on-control/60 dark:text-dark-on-control/60': disabled,\n }\"\n >\n {{ placeholder }}\n </div>\n }\n </div>\n</div>\n","import { Component, ElementRef, Input, ViewChild, AfterViewInit, forwardRef } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ButtonComponent } from '../button/button.component';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-draw-canvas',\n templateUrl: './draw-canvas.component.html',\n styleUrl: './draw-canvas.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DrawCanvasComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n imports: [ButtonComponent, TranslocoModule],\n})\nexport class DrawCanvasComponent implements AfterViewInit, ControlValueAccessor {\n @Input() imagePath!: string;\n @Input() lineColor: string = '#DD0000'; // Default color is black\n @ViewChild('canvas', { static: true })\n canvasRef!: ElementRef<HTMLCanvasElement>;\n\n private ctx!: CanvasRenderingContext2D;\n private isDrawing = false;\n private onChange: (file: File | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n const canvas = this.canvasRef.nativeElement;\n this.ctx = canvas.getContext('2d')!;\n this.ctx.strokeStyle = this.lineColor; // Set the initial line color\n this.loadImage();\n this.setupCanvas();\n }\n\n private loadImage(): void {\n const image = new Image();\n image.src = this.imagePath;\n image.onload = () => {\n this.ctx.drawImage(\n image,\n 0,\n 0,\n this.canvasRef.nativeElement.width,\n this.canvasRef.nativeElement.height,\n );\n };\n }\n\n private setupCanvas(): void {\n const canvas = this.canvasRef.nativeElement;\n\n // Mouse events\n canvas.addEventListener('mousedown', (event: MouseEvent) => this.startMouseDrawing(event));\n canvas.addEventListener('mousemove', (event: MouseEvent) => this.mouseDraw(event));\n canvas.addEventListener('mouseup', () => this.stopDrawing());\n canvas.addEventListener('mouseleave', () => this.stopDrawing());\n\n // Touch events\n canvas.addEventListener('touchstart', (event: TouchEvent) => this.startTouchDrawing(event));\n canvas.addEventListener('touchmove', (event: TouchEvent) => {\n event.preventDefault(); // Prevent scrolling\n this.touchDraw(event);\n });\n canvas.addEventListener('touchend', () => this.stopDrawing());\n canvas.addEventListener('touchcancel', () => this.stopDrawing());\n }\n\n private startMouseDrawing(event: MouseEvent): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.isDrawing = true;\n this.ctx.beginPath();\n this.ctx.moveTo(\n event.offsetX * (this.canvasRef.nativeElement.width / rect.width),\n event.offsetY * (this.canvasRef.nativeElement.height / rect.height),\n );\n }\n\n private mouseDraw(event: MouseEvent): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n if (!this.isDrawing) return;\n this.ctx.lineTo(\n event.offsetX * (this.canvasRef.nativeElement.width / rect.width),\n event.offsetY * (this.canvasRef.nativeElement.height / rect.height),\n );\n this.ctx.stroke();\n }\n\n private startTouchDrawing(event: TouchEvent): void {\n this.isDrawing = true;\n const touch = event.touches[0];\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.ctx.beginPath();\n this.ctx.moveTo(\n (touch.clientX - rect.left) * (this.canvasRef.nativeElement.width / rect.width),\n (touch.clientY - rect.top) * (this.canvasRef.nativeElement.height / rect.height),\n );\n }\n\n private touchDraw(event: TouchEvent): void {\n if (!this.isDrawing) return;\n const touch = event.touches[0];\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n this.ctx.lineTo(\n (touch.clientX - rect.left) * (this.canvasRef.nativeElement.width / rect.width),\n (touch.clientY - rect.top) * (this.canvasRef.nativeElement.height / rect.height),\n );\n this.ctx.stroke();\n }\n\n private stopDrawing(): void {\n this.isDrawing = false;\n this.ctx.closePath();\n this.onTouched();\n\n this.saveDrawing();\n }\n\n saveDrawing(): void {\n const canvas = this.canvasRef.nativeElement;\n const dataUrl = canvas.toDataURL('image/png');\n\n // Convert data URL to Blob\n const blob = this.dataURLToBlob(dataUrl);\n const file = new File([blob], 'teeth.png', { type: 'image/png' });\n\n // Emit the file value to the form control\n this.onChange(file);\n }\n\n private dataURLToBlob(dataUrl: string): Blob {\n const byteString = atob(dataUrl.split(',')[1]);\n const mimeString = dataUrl.split(',')[0].split(':')[1].split(';')[0];\n const buffer = new ArrayBuffer(byteString.length);\n const dataView = new Uint8Array(buffer);\n\n for (let i = 0; i < byteString.length; i++) {\n dataView[i] = byteString.charCodeAt(i);\n }\n\n return new Blob([buffer], { type: mimeString });\n }\n\n // ControlValueAccessor methods\n writeValue(file: File | null): void {\n // No-op: The component does not need to set the file value directly\n }\n\n registerOnChange(fn: (file: File | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n const canvas = this.canvasRef.nativeElement;\n canvas.style.pointerEvents = isDisabled ? 'none' : 'auto';\n }\n\n onReset() {\n this.loadImage();\n this.onTouched();\n }\n}\n","<div class=\"draw-canvas-container flex flex-col gap-2\">\n <canvas #canvas width=\"800\" height=\"400\" class=\"max-w-full draw-canvas select-none\"></canvas>\n <haloduck-button variant=\"danger\" (click)=\"onReset()\">{{\n 'haloduck.ui.draw.Clear' | transloco\n }}</haloduck-button>\n</div>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-tag-input',\n imports: [CommonModule],\n templateUrl: './tag-input.component.html',\n styleUrl: './tag-input.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TagInputComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class TagInputComponent implements ControlValueAccessor, AfterViewInit {\n @ViewChild('label') label!: ElementRef;\n @ViewChild('inputEl') inputEl!: ElementRef<HTMLInputElement>;\n\n @Input() placeholder: string = '';\n @Input() disabled: boolean = false;\n @Input() allowDuplicates: boolean = false;\n\n // Two-way binding support independent of CVA\n @Input() set value(tags: string[] | null) {\n if (Array.isArray(tags)) {\n this.tags = tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n @Output() valueChange = new EventEmitter<string[]>();\n\n tags: string[] = [];\n inputValue: string = '';\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(value: string[] | null): void {\n if (Array.isArray(value)) {\n this.tags = value.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngAfterViewInit(): void {\n // hide label if no projected content\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n focus(): void {\n this.inputEl?.nativeElement?.focus();\n }\n\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n this.inputValue = input.value;\n this.onTouched();\n }\n\n onBlur(): void {\n if (this.disabled) return;\n this.inputValue = '';\n this.onTouched();\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (this.disabled) return;\n\n // Commit on comma or Enter\n if (event.key === ',' || event.key === 'Enter') {\n event.preventDefault();\n this.commitCurrentInput();\n return;\n }\n\n // Backspace behavior\n if (event.key === 'Backspace') {\n if (this.inputValue.length > 0) {\n return; // default backspace in input\n }\n if (this.tags.length > 0) {\n event.preventDefault();\n this.removeTag(this.tags.length - 1);\n return;\n }\n }\n }\n\n removeTag(index: number): void {\n if (this.disabled) return;\n if (index < 0 || index >= this.tags.length) return;\n this.tags = this.tags.filter((_, i) => i !== index);\n this.emitChanges();\n }\n\n private commitCurrentInput(): void {\n const raw = this.inputValue.trim();\n if (!raw) {\n this.inputValue = '';\n return;\n }\n\n // If user pasted multiple comma-separated values, split and add all\n const parts = raw\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n for (const part of parts) {\n this.addTag(part);\n }\n\n this.inputValue = '';\n }\n\n private addTag(tag: string): void {\n if (!this.allowDuplicates) {\n const exists = this.tags.some((t) => t.toLowerCase() === tag.toLowerCase());\n if (exists) {\n return;\n }\n }\n this.tags = [...this.tags, tag];\n this.emitChanges();\n }\n\n private emitChanges(): void {\n const cleaned = this.tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n if (cleaned.length !== this.tags.length || cleaned.some((t, i) => t !== this.tags[i])) {\n this.tags = cleaned;\n }\n this.onChange(this.tags);\n this.valueChange.emit(this.tags);\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n\n <div\n class=\"tag-input-wrapper block w-full rounded-md bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/80 px-2 py-1.5 text-base text-light-on-control dark:text-dark-on-control disabled:cursor-not-allowed disabled:text-light-on-control/60 dark:disabled:text-dark-on-control/80 outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive placeholder:text-light-inactive dark:placeholder:text-dark-inactive sm:text-sm/6\"\n >\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (tag of tags; track tag; let i = $index) {\n <span\n class=\"inline-flex items-center gap-1 rounded-md bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary px-2 py-0.5 text-xs\"\n >\n {{ tag }}\n @if (!disabled) {\n <button\n type=\"button\"\n (click)=\"removeTag(i)\"\n class=\"text-light-on-secondary/80 hover:text-light-on-secondary dark:text-dark-on-secondary/80 dark:hover:text-dark-on-secondary hover:cursor-pointer\"\n >\n ×\n </button>\n }\n </span>\n }\n\n <input\n #inputEl\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n class=\"flex-1 min-w-[8rem] bg-transparent outline-none placeholder:text-light-inactive dark:placeholder:text-dark-inactive\"\n [value]=\"inputValue\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n </div>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n inject,\n ChangeDetectorRef,\n NgZone,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { combineLatest, Observable, of, switchMap, tap } from 'rxjs';\nimport { TagInputComponent } from '../tag-input/tag-input.component';\n\nexport const ERROR_NOT_ACCEPTABLE_FILE_TYPE = 'NOT_ACCEPTABLE_FILE_TYPE';\nexport const ERROR_OVER_SIZE = 'OVER_SIZE';\nexport const ERROR_OVER_COUNT = 'OVER_COUNT';\nexport const ERROR_UPLOAD = 'UPLOAD';\n\nexport interface FileEx extends File {\n isUploading: boolean;\n isUploaded: boolean;\n key: string;\n name: string;\n size: number;\n type: string;\n tag: string[];\n previewUrl?: string; // Add a property for the preview URL\n}\n\n@Component({\n selector: 'haloduck-file-uploader',\n imports: [CommonModule, TranslocoModule, TagInputComponent],\n templateUrl: './file-uploader.component.html',\n styleUrls: ['./file-uploader.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileUploaderComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class FileUploaderComponent implements ControlValueAccessor {\n @Input() disabled: boolean = false;\n @Input() urlPrefix!: string;\n @Input() keyPrefix!: string;\n @Input() uploadApi!: (file: File, keyPrefix: string) => Observable<string>;\n @Input() multiple: boolean = true;\n @Input() maxCount: number = 0;\n @Input() maxSize: number = 0;\n @Input() accept: string[] = [''];\n @Output() filesAdded = new EventEmitter<FileEx[]>();\n @Output() fileRemoved = new EventEmitter<FileEx>();\n @Output() error = new EventEmitter<{ error: string; file: FileEx }[]>();\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly zone = inject(NgZone);\n\n files: FileEx[] = [];\n isUploading: boolean = false;\n isDragOver: boolean = false;\n\n private onChange: (files: FileEx[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(files: FileEx[]): void {\n this.files = files || [];\n }\n\n registerOnChange(fn: (files: FileEx[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const selectedFiles = this.multiple ? Array.from(input.files) : [input.files[0]];\n this.addFiles(selectedFiles as FileEx[]);\n }\n this.onTouched();\n }\n\n removeFile(index: number): void {\n const removedFile = this.files[index];\n this.files.splice(index, 1);\n this.fileRemoved.emit(removedFile);\n this.onTouched();\n this.onChange(this.files);\n }\n\n onFileTagChanged(index: number, tags: string[]): void {\n if (this.files[index]) {\n this.files[index].tag = tags;\n this.onTouched();\n this.onChange(this.files);\n }\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n if (event.dataTransfer?.files) {\n const droppedFiles = this.multiple\n ? Array.from(event.dataTransfer.files)\n : [event.dataTransfer.files[0]];\n this.addFiles(droppedFiles as FileEx[]);\n }\n this.onTouched();\n }\n\n getFilePreview(file: FileEx): string {\n return file.previewUrl || ''; // Return the precomputed preview URL\n }\n\n addFiles(addedFiles: FileEx[]): void {\n const notAcceptedFiles: { error: string; file: FileEx }[] = [];\n\n let filteredFiles = addedFiles.filter((file) => {\n const acceptableFileType = this.isAcceptableFileType(file);\n const acceptableFileSize = this.maxSize > 0 ? file.size <= this.maxSize : true;\n\n if (!acceptableFileType) {\n notAcceptedFiles.push({ error: ERROR_NOT_ACCEPTABLE_FILE_TYPE, file });\n }\n if (!acceptableFileSize) {\n notAcceptedFiles.push({ error: ERROR_OVER_SIZE, file });\n }\n\n return acceptableFileType && acceptableFileSize;\n });\n\n if (this.maxCount > 0 && this.files.length + filteredFiles.length > this.maxCount) {\n for (let i = this.maxCount; i < this.files.length + filteredFiles.length; i++) {\n notAcceptedFiles.push({\n error: ERROR_OVER_COUNT,\n file: filteredFiles[i - this.files.length],\n });\n }\n\n filteredFiles = filteredFiles.splice(\n this.files.length + filteredFiles.length - this.maxCount,\n );\n }\n\n if (notAcceptedFiles.length > 0) {\n this.error.emit(notAcceptedFiles);\n }\n\n // Compute preview URLs for the new files and initialize tags\n filteredFiles.forEach((file) => {\n if (file.type.startsWith('image')) {\n file.previewUrl = URL.createObjectURL(file);\n }\n // Initialize tag array if not exists\n if (!file.tag) {\n file.tag = [];\n }\n });\n\n this.files = this.files.concat(filteredFiles);\n this.filesAdded.emit(filteredFiles);\n this.onChange(this.files);\n }\n\n isAcceptableFileType(file: File): boolean {\n // Check if the file type is acceptable\n return this.accept.some((type) => {\n if (type.startsWith('.')) {\n // Check if the file type matches any of the accepted types\n return file.name.endsWith(type);\n } else if (type.includes('/')) {\n if (type.includes('/*')) {\n // Check if the file type matches the wildcard MIME type\n return file.type.startsWith(type.split('/')[0]);\n } else {\n // Check if the file type matches the specific MIME type\n return file.type === type;\n }\n } else {\n return file.type === type;\n }\n });\n }\n\n startUpload(): Observable<FileEx[]> {\n // Placeholder for upload logic\n this.isUploading = true;\n const uploadTrigger$: Observable<string>[] = [];\n\n this.files.forEach((file) => {\n // if file is not File type, keep data and skip upload\n if (!(file instanceof File)) {\n (file as FileEx).isUploading = false;\n (file as FileEx).isUploaded = true;\n return;\n }\n\n file.isUploading = true;\n file.isUploaded = false;\n\n // Create a file with tag information for upload\n const fileWithTag = Object.assign(file, { tag: file.tag || [] });\n\n uploadTrigger$.push(\n this.uploadApi(fileWithTag, this.keyPrefix).pipe(\n // Handle the upload API response\n tap((key) => {\n file.isUploading = false;\n file.isUploaded = true;\n file.key = key;\n }),\n ),\n );\n });\n\n // if there are no files to upload\n if (uploadTrigger$.length === 0) {\n this.isUploading = false;\n this.onChange(this.files);\n this.onTouched();\n return of(this.files);\n }\n\n // Wait for all uploads to complete\n return combineLatest(uploadTrigger$).pipe(\n switchMap((keys) => {\n this.files.forEach((file) => {\n if ('' === file.key) {\n this.isUploading = false;\n file.isUploaded = false;\n\n this.error.emit([{ error: ERROR_UPLOAD, file }]);\n }\n });\n\n this.onChange(this.files);\n this.onTouched();\n\n return of(this.files);\n }),\n );\n }\n}\n","<div\n class=\"p-4 border border-light-inactive dark:border-dark-inactive rounded-md\"\n [class.drag-over]=\"isDragOver\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n>\n @if (!isUploading) {\n <label\n for=\"file-upload\"\n class=\"flex flex-col items-center justify-center w-full border-2 border-dashed border-light-inactive dark:border-dark-inactive rounded-md cursor-pointer hover:border-light-secondary dark:border-dark-secondary p-4\"\n >\n <span class=\"text-light-inactive dark:text-dark-inactive\">{{\n 'haloduck.ui.file.Drag and drop files here, or click to select files' | transloco\n }}</span>\n <input\n id=\"file-upload\"\n type=\"file\"\n class=\"hidden\"\n [attr.accept]=\"accept ? accept.join(',') : null\"\n [attr.multiple]=\"multiple ? '' : null\"\n (cancel)=\"$event.stopPropagation()\"\n (change)=\"onFileSelected($event)\"\n />\n </label>\n }\n <!-- Display file list -->\n @if (files.length > 0) {\n <ul class=\"mt-4 space-y-2\">\n @for (file of files; track file.name; let i = $index) {\n <li\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center sm:justify-between p-2 border border-light-inactive dark:border-dark-inactive rounded-md gap-2\"\n >\n <!-- Check if the file is an image -->\n <div class=\"flex items-center space-x-4\">\n @if (file.previewUrl) {\n <img\n [src]=\"file.previewUrl\"\n alt=\"{{ file.name }}\"\n class=\"w-12 h-12 object-cover rounded-md\"\n />\n }\n <span class=\"text-sm text-light-inactive dark:text-dark-inactive\">{{ file.name }}</span>\n </div>\n <div class=\"flex items-center space-x-4\">\n <div class=\"flex-1\">\n <haloduck-tag-input\n placeholder=\"{{ 'haloduck.ui.tag.Please input tags.' | transloco }}\"\n [(value)]=\"file.tag\"\n (valueChange)=\"onFileTagChanged(i, $event)\"\n ></haloduck-tag-input>\n </div>\n @if (isUploading) {\n @if (file.isUploaded) {\n <span class=\"text-sm text-light-secondary dark:text-dark-secondary\">{{\n 'haloduck.ui.file.Uploaded' | transloco\n }}</span>\n } @else {\n <span class=\"text-sm text-light-primary dark:text-dark-primary\">{{\n 'haloduck.ui.file.Uploading...' | transloco\n }}</span>\n }\n } @else {\n <button\n type=\"button\"\n class=\"text-light-danger dark:text-dark-danger hover:brightness-125\"\n (click)=\"removeFile(i)\"\n >\n {{ 'haloduck.ui.file.Remove' | transloco }}\n </button>\n }\n </div>\n </li>\n }\n </ul>\n }\n</div>\n","import { Component, Input, signal } from '@angular/core';\n\n@Component({\n selector: 'haloduck-flip',\n imports: [],\n templateUrl: './flip.component.html',\n styleUrl: './flip.component.css',\n})\nexport class FlipComponent {\n @Input() title: string = '';\n @Input() set isOpen(value: boolean) {\n this._isOpen.set(value);\n }\n _isOpen = signal(false);\n\n toggle() {\n this._isOpen.set(!this._isOpen());\n }\n}\n","<div\n class=\"relative w-full shadow ring-1 ring-light-inactive/50 dark:ring-dark-inactive/80 sm:rounded-lg bg-light-alternative dark:bg-dark-alternative p-2 flex flex-col gap-2\"\n [class.cursor-pointer]=\"!_isOpen()\"\n (click)=\"!_isOpen() && toggle()\"\n>\n <label\n class=\"text-sm text-light-on-alternative dark:text-dark-on-alternative\"\n [class.cursor-pointer]=\"!_isOpen()\"\n >{{ title }}</label\n >\n @if (_isOpen()) {\n <ng-content></ng-content>\n }\n <button\n variant=\"secondary\"\n class=\"absolute rounded-md border border-inactive px-1 py-0.5 top-1 right-1 hover:cursor-pointer bg-light-inactive dark:bg-dark-inactive text-light-on-inactive dark:text-dark-on-inactive\"\n (click)=\"toggle(); $event.stopPropagation()\"\n >\n @if (_isOpen()) {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 15l-6-6-6 6\" />\n </svg>\n } @else {\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 9l6 6 6-6\" />\n </svg>\n }\n </button>\n</div>\n","import { Component, inject, Input } from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\n\n@Component({\n selector: 'haloduck-image-viewer',\n imports: [],\n templateUrl: './image-viewer.component.html',\n styleUrl: './image-viewer.component.css',\n})\nexport class ImageViewerComponent {\n @Input() context: any;\n @Input() imageUrl: string = '';\n @Input() imageAlt: string = '';\n\n private readonly dialogService = inject(DialogService);\n\n onClose() {\n if (this.context?.overlayRef) {\n this.dialogService.close(this.context.overlayRef);\n }\n }\n}\n","<img\n class=\"max-w-full max-h-full object-cover cursor-pointer\"\n [src]=\"context?.imageUrl\"\n [alt]=\"context?.imageAlt\"\n (click)=\"onClose()\"\n/>\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewChild,\n forwardRef,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { EMPTY, Observable, of, switchMap } from 'rxjs';\nimport { ImageViewerComponent } from '../image-viewer/image-viewer.component';\nimport { FileEx } from '../file-uploader/file-uploader.component';\nimport { CommonModule } from '@angular/common';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n// 전역 변수로 드래그 데이터를 임시 저장\nlet draggedBase64File: string | null = null;\nlet originDrag: ImageUploaderComponent | null = null;\n\n@Component({\n selector: 'haloduck-image-uploader',\n imports: [CommonModule, TranslocoModule],\n templateUrl: './image-uploader.component.html',\n styleUrls: ['./image-uploader.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ImageUploaderComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class ImageUploaderComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n @ViewChild('label') label!: ElementRef;\n @Input() disabled: boolean = false;\n @Input() id!: string;\n @Input() alt!: string;\n @Input() urlPrefix!: string;\n @Input() keyPrefix!: string;\n @Input() uploadApi!: (file: File, keyPrefix: string) => Observable<string>;\n @Input() backgroundImage!: string;\n @Input() shouldPassToSibling: boolean = false;\n @Output() passToSibling: EventEmitter<FileEx[]> = new EventEmitter<FileEx[]>();\n @Output() fileAdded = new EventEmitter<FileEx>();\n @Output() fileRemoved = new EventEmitter<FileEx>();\n @Output() error = new EventEmitter<{ error: string; file: FileEx }[]>();\n imageUrl: string | null = null;\n file: FileEx | null = null;\n isDragOver: boolean = false;\n isUploading: boolean = false;\n\n private readonly dialogService = inject(DialogService);\n\n private onChange: (url: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n writeValue(key: string | null): void {\n if (!key) {\n this.imageUrl = null;\n return;\n }\n\n this.imageUrl = `${this.urlPrefix}/${key}`;\n this.file = null;\n }\n\n registerOnChange(fn: (url: string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n startUpload(): Observable<FileEx> {\n // Placeholder for upload logic\n if (!this.file) {\n return EMPTY;\n }\n\n this.isUploading = true;\n this.file.isUploading = true;\n this.file.isUploaded = false;\n\n return this.uploadApi(this.file, this.keyPrefix).pipe(\n switchMap((key) => {\n if (this.file) {\n this.file.isUploading = false;\n this.file.isUploaded = true;\n this.file.key = key;\n }\n\n return of(this.file as FileEx);\n }),\n );\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n\n if (input.files && input.files[0]) {\n const listFile: FileEx[] = Array.from(input.files) as FileEx[];\n this.setFiles(listFile);\n }\n this.onTouched();\n }\n\n onDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.isDragOver = false;\n this.onTouched();\n\n if (event.dataTransfer?.files && event.dataTransfer.files[0]) {\n const listFile: FileEx[] = Array.from(event.dataTransfer.files) as FileEx[];\n this.setFiles(listFile);\n } else if (draggedBase64File) {\n if (this.file) {\n originDrag?.setFiles([this.file]); // 타켓에 파일이 있을 경우 원래 드래그한 컴포넌트에 파일 전달\n } else {\n originDrag?.removeImage();\n }\n\n fetch(draggedBase64File)\n .then((res) => res.blob())\n .then((blob) => {\n const file = new File([blob], 'dropped-file', { type: blob.type });\n this.setFiles([file] as FileEx[]);\n });\n\n draggedBase64File = null; // 전역 변수 초기화\n }\n }\n\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = true;\n }\n\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n this.isDragOver = false;\n }\n\n onDragStart(event: DragEvent): void {\n if (event.target instanceof HTMLImageElement) {\n const img = event.target as HTMLImageElement;\n\n if (img.id && this.file) {\n const reader = new FileReader();\n reader.onload = () => {\n const base64File = reader.result as string;\n draggedBase64File = base64File; // 전역 변수에 저장\n originDrag = this; // 드래그 시작한 컴포넌트 저장\n\n if (event.dataTransfer) {\n event.dataTransfer.setData('text/plain', 'dragged-file'); // 최소한의 데이터 설정\n }\n };\n reader.readAsDataURL(this.file);\n }\n }\n }\n\n onDragEnd(event: DragEvent): void {\n draggedBase64File = null;\n originDrag = null;\n }\n\n removeImage(): void {\n const removedFile = this.file;\n this.imageUrl = null;\n this.file = null;\n\n this.fileRemoved.emit(removedFile as FileEx);\n this.onChange(null); // Notify form control\n }\n\n setFiles(listFile: FileEx[]): void {\n listFile = listFile.filter((file) => {\n const isValid = file.type.startsWith('image/');\n if (!isValid) {\n console.error('Invalid file type:', file.type);\n }\n return isValid;\n });\n\n this.file = listFile[0];\n this.imageUrl = URL.createObjectURL(listFile[0]);\n\n if (listFile.length > 1 && this.shouldPassToSibling) {\n listFile.shift();\n this.passToSibling.emit(listFile);\n }\n\n this.fileAdded.emit(this.file);\n this.onChange(this.file.name);\n }\n\n previewImage(imageUrl: string) {\n this.dialogService.open(ImageViewerComponent, {\n imageUrl,\n imageAlt: this.alt,\n });\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (!this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n\n ngOnInit(): void {}\n}\n","<div class=\"w-full h-full flex flex-col gap-1\">\n <label #label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n </label>\n <div\n class=\"flex-1 min-h-0 w-full p-2 border border-light-inactive dark:border-dark-inactive rounded-md\"\n [class.drag-over]=\"isDragOver\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <!-- Show image preview if available -->\n @if (imageUrl) {\n <div class=\"relative w-full h-full\">\n @if (!disabled) {\n <button\n type=\"button\"\n class=\"absolute -top-1 -right-1 bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger rounded-full px-1 text-xs z-10\"\n (click)=\"removeImage()\"\n >\n x\n </button>\n }\n <img\n [src]=\"imageUrl\"\n [id]=\"id + '-image'\"\n [alt]=\"alt || ''\"\n class=\"w-full max-h-full rounded-md object-contain\"\n [ngClass]=\"{\n 'filter grayscale': disabled,\n }\"\n (click)=\"previewImage(imageUrl)\"\n />\n </div>\n } @else {\n <!-- Show upload area -->\n <label\n for=\"{{ id + '-input' }}\"\n class=\"flex flex-col items-center justify-center w-full h-full border-2 border-dashed border-light-inactive dark:border-dark-inactive rounded-md\"\n [ngClass]=\"{\n 'cursor-pointer hover:border-light-primary dark:hover:border-dark-primary': !disabled,\n }\"\n >\n @if (backgroundImage) {\n <img\n [src]=\"backgroundImage\"\n [alt]=\"alt || ''\"\n class=\"w-full max-h-full rounded-md object-contain\"\n />\n } @else {\n <span class=\"text-light-inactive dark:text-dark-inactive text-sm p-2\">{{\n 'haloduck.ui.file.Drag and drop an image here, or click to select' | transloco\n }}</span>\n }\n\n @if (!disabled) {\n <input\n [id]=\"id + '-input'\"\n type=\"file\"\n class=\"hidden\"\n accept=\"image/*\"\n [multiple]=\"passToSibling\"\n (cancel)=\"$event.stopPropagation()\"\n (change)=\"onFileSelected($event)\"\n />\n }\n </label>\n }\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { LangDefinition, TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-language-selector-option',\n imports: [CommonModule],\n providers: [TranslocoService],\n templateUrl: './language-selector-option.component.html',\n styleUrl: './language-selector-option.component.css',\n})\nexport class LanguageSelectorOptionComponent {\n @Output() languageSelected: EventEmitter<string> = new EventEmitter<string>();\n protected readonly translateService = inject(TranslocoService);\n\n selectLanguage(language: string | LangDefinition) {\n this.languageSelected.emit(language as string);\n }\n}\n","<div\n class=\"right-0 z-10 mt-2.5 origin-top-right rounded-md bg-light-background dark:bg-dark-background py-2 shadow-lg ring-1 ring-light-inactive dark:ring-dark-inactive\"\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-labelledby=\"user-menu-button\"\n tabindex=\"0\"\n>\n @for (language of translateService.getAvailableLangs(); track language) {\n <a\n href=\"javascript:void(0)\"\n class=\"px-3 py-2 flex items-center flex-nowrap gap-2\"\n role=\"menuitem\"\n tabindex=\"-1\"\n id=\"language-item-{{ language }}\"\n (click)=\"selectLanguage(language)\"\n >\n <img class=\"w-6 h-6\" [src]=\"'i18n/icons/' + language + '.png'\" />\n </a>\n }\n</div>\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n ComponentRef,\n ElementRef,\n inject,\n OnInit,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { LanguageSelectorOptionComponent } from './language-selector-option/language-selector-option.component';\nimport { distinctUntilChanged, Subject, takeUntil } from 'rxjs';\nimport { TranslocoService } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-language-selector',\n imports: [],\n templateUrl: './language-selector.component.html',\n styleUrl: './language-selector.component.css',\n})\nexport class LanguageSelectorComponent implements OnInit {\n @ViewChild('origin', { static: false }) origin!: ElementRef;\n\n private readonly destroy$ = new Subject<void>();\n private readonly translateService = inject(TranslocoService);\n private readonly overlay = inject(Overlay);\n language = signal<string>(this.translateService.getActiveLang());\n private overlayRef?: OverlayRef;\n\n showLanguageOptions() {\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.origin.nativeElement)\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n });\n\n const calendarPortal = new ComponentPortal(LanguageSelectorOptionComponent);\n const componentRef: ComponentRef<LanguageSelectorOptionComponent> =\n this.overlayRef.attach(calendarPortal);\n\n // Pass values directly to the CalendarComponent instance\n // componentRef.instance.firstDayOfWeek = this.firstDayOfWeek;\n // componentRef.instance.singleDate = true;\n // componentRef.instance.selectedDate = this.selectedDate;\n\n // Subscribe to events emitted\n componentRef.instance.languageSelected\n .pipe(takeUntil(this.destroy$))\n .subscribe((language) => {\n this.translateService.setActiveLang(language);\n this.hideLanguageOptions();\n });\n\n // Handle clicks outside the overlay\n this.overlayRef\n .backdropClick()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.hideLanguageOptions();\n });\n }\n }\n\n hideLanguageOptions() {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef = undefined;\n }\n }\n\n ngOnInit(): void {\n this.translateService.langChanges$\n .pipe(distinctUntilChanged(), takeUntil(this.destroy$))\n .subscribe((lang) => {\n this.language.set(lang);\n });\n }\n}\n","<button\n #origin\n type=\"button\"\n (click)=\"showLanguageOptions()\"\n class=\"-m-1.5 flex items-center p-1.5 hover:cursor-pointer\"\n aria-expanded=\"false\"\n aria-haspopup=\"true\"\n>\n <span class=\"max-lg:hidden flex lg:items-center\">\n <img class=\"w-6 h-6\" [src]=\"'i18n/icons/' + language() + '.png'\" />\n </span>\n</button>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n AfterViewInit,\n Input,\n isDevMode,\n EventEmitter,\n Output,\n inject,\n OnInit,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { LngLat } from '@haloduck/core';\nimport { CoreService } from '@haloduck/core';\n\nexport declare const google: any;\n\nexport interface Location {\n plusCode: string;\n postalCode: string;\n countryCode: string;\n country: string;\n area1: string;\n area2: string;\n area3: string;\n formatted: string;\n lat: number;\n lng: number;\n}\n\n@Component({\n selector: 'haloduck-map-to-address',\n imports: [CommonModule, FormsModule],\n templateUrl: './map-to-address.component.html',\n styleUrl: './map-to-address.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: MapToAddressComponent,\n multi: true,\n },\n ],\n})\nexport class MapToAddressComponent implements OnInit, ControlValueAccessor {\n private readonly coreService = inject(CoreService);\n mapId = this.coreService.getMapId();\n defaultLngLat = this.coreService.getDefaultLngLat();\n @Input() disabled: boolean = false;\n @Input() language: string = 'en';\n @Input() currentLngLat?: LngLat;\n private _currentAddress?: string;\n private _isGoogleLoaded = false;\n private _loadError?: string;\n\n get isGoogleLoaded(): boolean {\n return this._isGoogleLoaded;\n }\n\n get loadError(): string | undefined {\n return this._loadError;\n }\n\n @Input()\n set currentAddress(value: string) {\n if (value) {\n this._currentAddress = value;\n // Google Maps API가 로드된 후에만 실행\n if (this._isGoogleLoaded) {\n this.setMapToAddress();\n }\n }\n }\n @Output() locationChanged = new EventEmitter<Location>();\n map: any;\n marker: any;\n location!: Location;\n\n private onChange: (value: Location) => void = () => {};\n private onTouched: () => void = () => {};\n\n async ngOnInit() {\n try {\n await this.initScript();\n this._isGoogleLoaded = true;\n this.initMap();\n\n // API 로드 완료 후 pending된 주소 설정 실행\n if (this._currentAddress) {\n this.setMapToAddress();\n }\n } catch (error) {\n this._loadError = 'Unable to load Google Maps API.';\n isDevMode() && console.error('Failed to load Google Maps API:', error);\n }\n }\n\n initScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof google !== 'undefined') {\n this._isGoogleLoaded = true;\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = `https://maps.googleapis.com/maps/api/js?key=${this.coreService.getGoogleApiKey()}&libraries=places,marker&loading=sync&language=${this.language}`;\n script.async = false;\n script.defer = true;\n script.onload = () => {\n this._isGoogleLoaded = true;\n resolve();\n };\n script.onerror = (error) => reject(error);\n document.head.appendChild(script);\n isDevMode() && console.log('Google Maps script loaded', script);\n });\n }\n\n initMap() {\n if (this.currentLngLat) {\n isDevMode() && console.log('Using provided location:', this.currentLngLat);\n this.initializeMap(this.currentLngLat);\n } else {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const currentLocation = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n isDevMode() && console.log('Using current location:', currentLocation);\n this.initializeMap(currentLocation);\n },\n (error) => {\n if (error.code === error.PERMISSION_DENIED) {\n isDevMode() &&\n console.log(\n 'Location permission denied. Using default location.:',\n this.defaultLngLat,\n );\n } else if (error.code === error.POSITION_UNAVAILABLE || error.code === error.TIMEOUT) {\n isDevMode() &&\n console.log(\n 'Unable to determine location. Using default location.:',\n this.defaultLngLat,\n );\n }\n this.initializeMap(this.defaultLngLat);\n },\n );\n }\n }\n\n initializeMap(lngLat: LngLat) {\n this.map = new google.maps.Map(document.getElementById('map') as HTMLElement, {\n center: lngLat,\n zoom: 15,\n mapId: this.mapId,\n });\n\n this.marker = new google.maps.marker.AdvancedMarkerElement({\n position: lngLat,\n map: this.map,\n draggable: true,\n });\n\n // Listen for marker drag end to update address immediately\n this.marker.addListener('dragend', () => {\n const position = this.marker.position;\n if (position) {\n isDevMode() && console.log('Marker dragged to:', position.toJSON());\n this.getAddress(); // Fetch address after dragging\n }\n });\n\n this.map.addListener('click', (event: any) => this.onClick(event));\n\n if (!this.currentLngLat) {\n this.getAddress();\n }\n }\n\n onClick(event: any) {\n isDevMode() && console.log('Map clicked at:', event.latLng);\n if (event.latLng) {\n // Explicitly update marker position\n this.marker.position = event.latLng;\n this.marker.map = this.map; // Ensure marker is attached to the map\n isDevMode() && console.log('Marker position updated to:', event.latLng.toJSON());\n this.getAddress(); // Fetch address immediately after click\n this.onTouched(); // Mark as touched\n } else {\n isDevMode() && console.error('Failed to update marker position: event.latLng is undefined');\n }\n }\n\n setMapToAddress() {\n if (!this._isGoogleLoaded) {\n isDevMode() && console.warn('Google Maps API not loaded yet');\n return;\n }\n\n const geocoder = new google.maps.Geocoder();\n geocoder.geocode({ address: this._currentAddress }, (results: any, status: string) => {\n if (status === 'OK' && results[0]) {\n const location = results[0].geometry.location;\n isDevMode() && console.log('Geocoded location:', location.toJSON());\n this.initializeMap(location.toJSON());\n } else {\n isDevMode() && console.error('Geocoding failed:', status);\n }\n });\n }\n\n getAddress() {\n if (!this._isGoogleLoaded) {\n isDevMode() && console.warn('Google Maps API not loaded yet');\n return;\n }\n\n const geocoder = new google.maps.Geocoder();\n const position = this.marker.position;\n\n if (!position) {\n isDevMode() && console.error('Position update is unavailable');\n return;\n }\n\n geocoder.geocode({ location: position }, (results: any, status: string) => {\n isDevMode() && console.log('Geocoded results:', status, results);\n\n if (status === 'OK' && results[0]) {\n this.location = this.parseAddress(results);\n this.onTouched();\n this.locationChanged.emit(this.location);\n this.onChange(this.location); // Notify the form control\n }\n });\n }\n\n parseAddress(results: any): Location {\n return {\n plusCode: this.getComponentLongName(results, 'plus_code'),\n postalCode: this.getComponentLongName(results, 'postal_code'),\n countryCode: this.getComponentShortName(results, 'country').toUpperCase(),\n country: this.getComponentLongName(results, 'country'),\n area1: this.getComponentLongName(results, 'administrative_area_level_1'),\n area2: this.getComponentLongName(results, 'sublocality_level_1'),\n area3: this.getComponentLongName(results, 'sublocality_level_2'),\n formatted: results[0]?.formatted_address,\n lat: results[0]?.geometry?.location?.lat(),\n lng: results[0]?.geometry?.location?.lng(),\n };\n }\n\n getComponentLongName(results: any[], type: string): string {\n for (let i = 0; i < results.length; i++) {\n const component = (results[i].address_components as any[]).find((c) =>\n c.types.includes(type),\n );\n if (component) {\n return component.long_name;\n }\n }\n return '';\n }\n\n getComponentShortName(results: any[], type: string): string {\n for (let i = 0; i < results.length; i++) {\n const component = (results[i].address_components as any[]).find((c) =>\n c.types.includes(type),\n );\n if (component) {\n return component.short_name;\n }\n }\n return '';\n }\n\n writeValue(value: Location): void {\n if (value) {\n this.location = value;\n this.currentLngLat = { lat: value.lat, lng: value.lng };\n // Google Maps API가 로드된 후에만 맵 초기화\n if (this._isGoogleLoaded) {\n this.initializeMap(this.currentLngLat);\n }\n }\n }\n\n registerOnChange(fn: (value: Location) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n}\n","<div class=\"w-full h-full relative\">\n <!-- 로딩 상태 -->\n @if (!isGoogleLoaded && !loadError) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-gray-100 z-10\">\n <div class=\"text-center\">\n <div\n class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-2\"\n ></div>\n <p class=\"text-gray-600 text-sm\">지도를 로딩 중입니다...</p>\n </div>\n </div>\n }\n\n <!-- 에러 상태 -->\n @if (loadError) {\n <div class=\"absolute inset-0 flex items-center justify-center bg-red-50 z-10\">\n <div class=\"text-center p-4\">\n <div class=\"text-red-500 text-2xl mb-2\">⚠️</div>\n <p class=\"text-red-700 text-sm font-medium\">{{ loadError }}</p>\n <p class=\"text-red-600 text-xs mt-1\">\n Please check your internet connection and refresh the page.\n </p>\n </div>\n </div>\n }\n\n <div id=\"map\" class=\"w-full h-full\"></div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { Router } from '@angular/router';\nimport { MenuItemEx } from '@haloduck/core';\n\n@Component({\n selector: 'haloduck-side-menu-item',\n imports: [CommonModule],\n templateUrl: './side-menu-item.component.html',\n styleUrl: './side-menu-item.component.css',\n})\nexport class SideMenuItemComponent implements OnInit {\n private readonly router = inject(Router);\n @Input() menuItem!: MenuItemEx;\n @Input() depth = 0;\n @Input() menuItemSelectHandler?: EventEmitter<MenuItemEx>;\n\n iconSvg!: SafeHtml;\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnInit(): void {\n if (this.menuItem.iconType === 'svg') {\n fetch(this.menuItem.icon || '')\n .then((response) => {\n return response.ok ? response : Promise.reject(response);\n })\n .then((response) => response.text())\n .then((svg) => (this.iconSvg = this.sanitizer.bypassSecurityTrustHtml(svg)));\n }\n }\n\n onMenuItemSelected(menuItem: MenuItemEx): void {\n if (this.menuItem.link) {\n this.navigateTo([this.menuItem.link]);\n }\n if (this.menuItemSelectHandler) {\n this.menuItemSelectHandler.emit(this.menuItem);\n }\n }\n\n navigateTo(link: string[]): void {\n this.router.navigate(link);\n }\n}\n","<a\n href=\"javascript:void(0)\"\n (click)=\"onMenuItemSelected(menuItem)\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-md cursor-pointer hover:text-light-on-primary dark:hover:text-dark-on-primary hover:bg-light-primary dark:hover:bg-dark-primary hover:cursor-pointer\"\n [ngClass]=\"{\n 'font-bold text-light-on-secondary dark:bg-dark-on-secondary bg-light-secondary dark:bg-dark-secondary':\n menuItem.isSelected,\n }\"\n>\n @if (menuItem.iconType === 'svg') {\n <div [innerHTML]=\"iconSvg\"></div>\n } @else {\n @if (menuItem.icon) {\n <img\n class=\"w-5 h-5\"\n [src]=\"menuItem.icon\"\n [alt]=\"menuItem.title\"\n [title]=\"menuItem.title\"\n [loading]=\"'lazy'\"\n />\n }\n }\n <span\n class=\"overflow-hidden text-ellipsis whitespace-nowrap\"\n title=\"{{ menuItem.title }}\"\n [ngStyle]=\"{ 'margin-left.px': depth ? depth * 16 : 0 }\"\n >\n {{ menuItem.title }}\n </span>\n</a>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MenuItemEx } from '@haloduck/core';\nimport { SideMenuItemComponent } from './side-menu-item/side-menu-item.component';\n\n@Component({\n selector: 'haloduck-side-menu',\n imports: [SideMenuItemComponent],\n templateUrl: './side-menu.component.html',\n styleUrl: './side-menu.component.css',\n})\nexport class SideMenuComponent {\n @Input() menuItems: Array<MenuItemEx> = [];\n @Input() depth: number = 0;\n\n @Output() menuItemSelected = new EventEmitter<MenuItemEx>();\n}\n","<div class=\"flex flex-col text-sm text-light-on-background dark:text-dark-on-background\">\n @for (menuItem of menuItems; track menuItem.link) {\n <haloduck-side-menu-item\n [menuItemSelectHandler]=\"menuItemSelected\"\n [menuItem]=\"menuItem\"\n [depth]=\"depth\"\n ></haloduck-side-menu-item>\n @if (menuItem.children && menuItem.children.length > 0) {\n <haloduck-side-menu\n [menuItems]=\"menuItem.children\"\n [depth]=\"depth + 1\"\n (menuItemSelected)=\"menuItemSelected.emit($event)\"\n ></haloduck-side-menu>\n }\n }\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n Input,\n inject,\n OnInit,\n isDevMode,\n} from '@angular/core';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\n\nimport * as THREE from 'three';\nimport { STLLoader } from 'three-stdlib';\nimport { OrbitControls } from 'three-stdlib';\nimport { ButtonComponent } from '../button/button.component';\nimport { download } from '@haloduck/util';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-stl-viewer',\n imports: [CommonModule, ButtonComponent, TranslocoModule],\n templateUrl: './stl-viewer.component.html',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class StlViewerComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() fileUrl!: string;\n @Input() filename!: string;\n @Input() context: any;\n @ViewChild('viewerContainer') containerRef!: ElementRef;\n\n private readonly dialogService = inject(DialogService);\n\n isPopup = false;\n scene!: THREE.Scene;\n camera!: THREE.PerspectiveCamera;\n renderer!: THREE.WebGLRenderer;\n loader = new STLLoader();\n controls!: OrbitControls;\n loadingPercentage = 0;\n\n showStl() {\n if (this.isPopup) {\n return;\n }\n\n this.dialogService.open(\n StlViewerComponent,\n {\n fileUrl: this.fileUrl,\n filename: this.filename,\n },\n ['w-full', 'h-full'],\n );\n }\n\n download() {\n download(this.fileUrl);\n }\n\n closeDialog() {\n this.dialogService.close(this.context.overlayRef);\n }\n\n animate = () => {\n requestAnimationFrame(this.animate);\n this.controls.update();\n this.renderer.render(this.scene, this.camera);\n };\n\n ngAfterViewInit() {\n const container = this.containerRef.nativeElement;\n\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color(0xffffff);\n\n this.camera = new THREE.PerspectiveCamera(\n 50,\n container.clientWidth / container.clientHeight,\n 0.1,\n 1000,\n );\n this.camera.position.z = 100;\n\n this.renderer = new THREE.WebGLRenderer({ antialias: true });\n this.renderer.setSize(container.clientWidth, container.clientHeight);\n container.appendChild(this.renderer.domElement);\n\n this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n this.controls.enableDamping = true;\n this.controls.dampingFactor = 0.05;\n\n // Adjust lighting\n const light = new THREE.DirectionalLight(0xffffff, 1.5); // Increased intensity\n light.position.set(0, 0, 1).normalize();\n const light2 = new THREE.DirectionalLight(0xffffff, 1.5); // Increased intensity\n light2.position.set(0, 0, -1).normalize();\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // Added ambient light\n this.scene.add(light, light2, ambientLight);\n\n this.loader.load(\n this.fileUrl || this.context?.fileUrl,\n (geometry) => {\n // Use MeshStandardMaterial with DoubleSide to render both sides\n const material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n metalness: 0.3,\n roughness: 0.5,\n side: THREE.DoubleSide, // Render both front and back faces\n });\n const mesh = new THREE.Mesh(geometry, material);\n\n geometry.computeBoundingBox();\n const boundingBox = geometry.boundingBox;\n const center = new THREE.Vector3();\n boundingBox?.getCenter(center);\n mesh.geometry.translate(-center.x, -center.y, -center.z);\n\n this.scene.add(mesh);\n\n const size = new THREE.Vector3();\n boundingBox?.getSize(size);\n const maxDim = Math.max(size.x, size.y, size.z);\n this.camera.position.z = maxDim * 2;\n },\n (xhr) => {\n this.loadingPercentage = (xhr.loaded / xhr.total) * 100;\n isDevMode() && console.log(this.loadingPercentage + '% loaded');\n },\n (error) => {\n isDevMode() && console.error('Error loading STL:', error);\n },\n );\n\n this.animate();\n }\n\n ngOnDestroy() {\n this.renderer.dispose();\n this.controls.dispose();\n }\n\n ngOnInit(): void {\n if (this.context) {\n this.isPopup = true;\n this.fileUrl = this.context.fileUrl;\n this.filename = this.context.filename;\n }\n }\n}\n","<div class=\"relative w-full h-full flex flex-col items-end\">\n <div class=\"w-full h-full flex items-start flex-col\">\n <div #viewerContainer class=\"w-full h-full rounded-md\"></div>\n @if (loadingPercentage < 100) {\n <div\n class=\"h-2 bg-light-primary-light dark:bg-dark-primary-light\"\n [ngStyle]=\"{ width: loadingPercentage + '%' }\"\n ></div>\n }\n </div>\n <div class=\"absolute bottom-2 right-0 flex justify-end gap-2\">\n @if (context) {\n <haloduck-button variant=\"primary\" (click)=\"download()\">{{\n 'haloduck.ui.button.Download' | transloco\n }}</haloduck-button>\n <haloduck-button variant=\"danger\" (click)=\"closeDialog()\">{{\n 'haloduck.ui.button.Close' | transloco\n }}</haloduck-button>\n } @else {\n <haloduck-button variant=\"primary\" (click)=\"download()\">{{\n 'haloduck.ui.button.Download' | transloco\n }}</haloduck-button>\n <haloduck-button variant=\"secondary\" (click)=\"showStl()\">{{\n 'haloduck.ui.button.View' | transloco\n }}</haloduck-button>\n }\n </div>\n</div>\n","import {\n Directive,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ElementRef,\n NgZone,\n inject,\n OnChanges,\n SimpleChanges,\n} from '@angular/core';\n\n@Directive({\n selector: '[haloduckAutoLoad]',\n standalone: true,\n})\nexport class AutoLoadDirective implements OnInit, OnDestroy, OnChanges {\n private readonly elementRef = inject(ElementRef);\n private readonly ngZone = inject(NgZone);\n private observer?: IntersectionObserver;\n private isLoading = false;\n // private hasTriggeredOnce = false;\n\n @Input() autoLoadEnabled: boolean = true;\n @Input() autoLoadThreshold: number = 0.1;\n @Input() autoLoadRootMargin: string = '0px';\n @Output() autoLoadTrigger = new EventEmitter<void>();\n\n ngOnInit(): void {\n this.setupObserver();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['autoLoadEnabled']) {\n this.setupObserver();\n }\n }\n\n ngOnDestroy(): void {\n this.disconnect();\n }\n\n private setupObserver(): void {\n this.disconnect();\n if (this.autoLoadEnabled && 'IntersectionObserver' in window) {\n this.initializeObserver();\n }\n }\n\n private initializeObserver(): void {\n this.ngZone.runOutsideAngular(() => {\n this.observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting && !this.isLoading) {\n this.ngZone.run(() => {\n this.triggerLoad();\n });\n }\n });\n },\n {\n threshold: this.autoLoadThreshold,\n rootMargin: this.autoLoadRootMargin,\n },\n );\n\n this.observer.observe(this.elementRef.nativeElement);\n });\n }\n\n private triggerLoad(): void {\n if (this.isLoading || !this.autoLoadEnabled) {\n return;\n }\n\n // 첫 번째 로드는 건너뛰고, 이후부터는 보일 때마다 자동 로드\n // if (this.hasTriggeredOnce) {\n this.isLoading = true;\n this.autoLoadTrigger.emit();\n\n // 옵저버를 일시적으로 해제하여 연속 트리거 방지\n this.temporarilyDisableObserver();\n // } else {\n // this.hasTriggeredOnce = true;\n // }\n }\n\n private temporarilyDisableObserver(): void {\n if (this.observer) {\n this.observer.disconnect();\n\n // 1초 후 옵저버 재연결\n setTimeout(() => {\n if (this.autoLoadEnabled && this.observer) {\n this.isLoading = false;\n this.observer.observe(this.elementRef.nativeElement);\n }\n }, 1000);\n }\n }\n\n private disconnect(): void {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n }\n\n // 외부에서 로딩 상태를 제어할 수 있는 메서드\n public setLoadingState(loading: boolean): void {\n this.isLoading = loading;\n }\n\n // 자동 로드를 재활성화하는 메서드\n public resetAutoLoad(): void {\n // this.hasTriggeredOnce = false;\n this.isLoading = false;\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DialogService } from '../../layout/dialog-container/dialog.service';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\nexport interface TableSettings {\n showHeader: boolean;\n autoLoad: boolean;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TableSettingService {\n private dialogService = inject(DialogService);\n private currentOverlayRef?: OverlayRef;\n private currentTableNameSubject = new BehaviorSubject<string>('');\n private settingsSubjects = new Map<string, BehaviorSubject<TableSettings>>();\n\n private defaultSettings: TableSettings = {\n showHeader: true,\n autoLoad: false,\n };\n\n get currentTableName$(): Observable<string> {\n return this.currentTableNameSubject.asObservable();\n }\n\n show(tableName: string): void {\n this.currentTableNameSubject.next(tableName);\n\n // Lazy import to avoid circular dependency\n import('./table-setting.component').then(({ TableSettingComponent }) => {\n this.currentOverlayRef = this.dialogService.open(\n TableSettingComponent,\n {\n tableName,\n },\n ['w-full', 'max-w-xs'],\n );\n });\n }\n\n hide(): void {\n console.log('Hiding table settings', this.currentOverlayRef);\n if (this.currentOverlayRef) {\n this.dialogService.close(this.currentOverlayRef);\n this.currentOverlayRef = undefined;\n }\n this.currentTableNameSubject.next('');\n }\n\n getSettings(tableName: string): Observable<TableSettings> {\n if (!this.settingsSubjects.has(tableName)) {\n const savedSettings = this.loadSettingsFromStorage(tableName);\n this.settingsSubjects.set(tableName, new BehaviorSubject<TableSettings>(savedSettings));\n }\n return this.settingsSubjects.get(tableName)!.asObservable();\n }\n\n setCurrentTableName(tableName: string): void {\n this.currentTableNameSubject.next(tableName);\n }\n\n updateSettings(tableName: string, settings: TableSettings): void {\n if (!this.settingsSubjects.has(tableName)) {\n this.settingsSubjects.set(tableName, new BehaviorSubject<TableSettings>(settings));\n } else {\n this.settingsSubjects.get(tableName)!.next(settings);\n }\n this.saveSettingsToStorage(tableName, settings);\n }\n\n private loadSettingsFromStorage(tableName: string): TableSettings {\n try {\n const storageKey = `tableSettings_${tableName}`;\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n return { ...this.defaultSettings, ...JSON.parse(saved) };\n }\n } catch (error) {\n console.warn('Failed to load table settings from localStorage:', error);\n }\n return { ...this.defaultSettings };\n }\n\n private saveSettingsToStorage(tableName: string, settings: TableSettings): void {\n try {\n const storageKey = `tableSettings_${tableName}`;\n localStorage.setItem(storageKey, JSON.stringify(settings));\n } catch (error) {\n console.warn('Failed to save table settings to localStorage:', error);\n }\n }\n}\n","import { CommonModule, DatePipe, DecimalPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n OnInit,\n Output,\n ViewChild,\n ElementRef,\n AfterViewInit,\n} from '@angular/core';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { map, Observable, of, take, shareReplay } from 'rxjs';\nimport { SearchParams, TableRowProperty, CoreService } from '@haloduck/core';\nimport { AutoLoadDirective } from '../../directive/auto-load.directive';\nimport { TableSettingService } from './table-setting.service';\n\nexport interface TableColumn {\n key: string | string[];\n label: string;\n width?: string;\n align?: 'text-left' | 'text-center' | 'text-right';\n sortable?: boolean;\n sort?: SearchParams.Sort;\n type?: 'number' | 'date' | 'datetime' | 'time' | 'custom';\n breakpoint?: string;\n hidden?: Observable<boolean>;\n customRenderFn?: (data: any) => Observable<string>;\n customRenderTemplate?: string; // Updated to string\n fix?: 'left' | 'right' | 'none';\n copyable?: boolean;\n}\n\nexport interface TableRow extends TableRowProperty {\n [key: string]: any;\n}\n\n@Component({\n selector: 'haloduck-table',\n imports: [CommonModule, TranslocoModule, AutoLoadDirective],\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n providers: [provideTranslocoScope('haloduck')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableComponent implements OnInit, AfterViewInit {\n private readonly coreService = inject(CoreService);\n private readonly tableSettingService = inject(TableSettingService);\n @ViewChild('loadMoreRow', { read: ElementRef }) loadMoreRowRef?: ElementRef;\n\n @Input() tableLayout: 'fixed' | 'auto' = 'auto';\n @Input() tableName: string = '';\n @Input() useLoadMore: boolean = true;\n\n private defaultAutoLoad: boolean = true;\n private defaultShowHeader: boolean = true;\n @Input() columns: TableColumn[] = [];\n @Input() rows: Observable<TableRow[]> = new Observable<TableRow[]>();\n @Input() isLoading: Observable<boolean> = new Observable<boolean>();\n @Input() isPaging: Observable<boolean> = new Observable<boolean>();\n @Input() sort: Observable<SearchParams.Sort[]> = new Observable<SearchParams.Sort[]>();\n @Input() expandedTemplate?: any; // TODO\n @Input() customTemplates: { [key: string]: any } = {}; // Add this line\n @Output() onSortChange = new EventEmitter<SearchParams.Sort>();\n @Input() lastEvaluatedKey: Observable<any> = new Observable<any>();\n @Output() onLoadMore = new EventEmitter<any>();\n @Output() onRowClick = new EventEmitter<TableRow>();\n @Output() onRowDblClick = new EventEmitter<TableRow>();\n\n settings$ = this.tableName\n ? this.tableSettingService.getSettings(this.tableName).pipe(shareReplay(1))\n : of({ showHeader: this.defaultShowHeader, autoLoad: this.defaultAutoLoad });\n\n showHeader$ = this.settings$.pipe(map((settings) => settings.showHeader));\n autoLoad$ = this.settings$.pipe(map((settings) => settings.autoLoad));\n\n getColumnValue(row: TableRow, column: TableColumn): Observable<string> {\n const value = this.getColumnValueRaw(row, column);\n\n if (column.customRenderFn) {\n return column.customRenderFn(value);\n }\n\n switch (column.type) {\n case 'date':\n return this.getDate(value);\n case 'datetime':\n return this.getDateTime(value);\n case 'time':\n return this.getTime(value);\n case 'number':\n return this.getNumber(value);\n default:\n return of(value);\n }\n }\n\n getColumnValueRaw(row: TableRow, column: TableColumn): any {\n if (Array.isArray(column.key)) {\n const value = this.getColumnValueRawWithArrayKey(row, column);\n return value;\n } else {\n return row[column.key];\n }\n }\n\n getColumnValueRawWithArrayKey(row: TableRow, column: TableColumn): any {\n let value: any = row;\n let invalidKey = false;\n\n for (const key of column.key as string[]) {\n if (Array.isArray(column.key) && column.key.length > 1) {\n const [first, ...remainingKeys] = column.key as string[];\n return this.getColumnValueRawWithArrayKey(value[first], {\n ...column,\n key: remainingKeys,\n });\n } else {\n if (invalidKey || value[key] === undefined) {\n invalidKey = true;\n break;\n }\n value = value[key];\n }\n }\n\n if (invalidKey) {\n value = '-';\n }\n return value;\n }\n\n getNumber(data: any): Observable<string> {\n const numberPipe = new DecimalPipe('en-US');\n try {\n return of(numberPipe.transform(data) || '');\n } catch (error) {\n return of('');\n }\n }\n\n getDate(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, 'shortDate') || '');\n } catch (error) {\n return of('');\n }\n return of(datePipe.transform(data, 'shortDate') || '');\n }\n\n getDateTime(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, this.coreService.getDateFormatLong()) || '');\n } catch (error) {\n return of('');\n }\n }\n\n getTime(data: any): Observable<string> {\n const datePipe = new DatePipe('en-US');\n try {\n return of(datePipe.transform(data, 'Time') || '');\n } catch (error) {\n return of('');\n }\n }\n\n onUpdateSort(field: string | string[], direction: SearchParams.SortDirection): void {\n this.onSortChange.emit({ field, direction });\n }\n\n getSortDirection(field: string | string[]): Observable<string | undefined> {\n return this.sort.pipe(\n map((sort) => {\n const sortField = sort.find((s) => s.field === field);\n return sortField?.direction;\n }),\n );\n }\n\n onLoadMoreClicked(): void {\n this.lastEvaluatedKey.pipe(take(1)).subscribe((lastEvaluatedKey) => {\n this.onLoadMore.emit(lastEvaluatedKey);\n });\n }\n\n onAutoLoadTriggered(): void {\n this.autoLoad$.pipe(take(1)).subscribe((autoLoad) => {\n if (autoLoad) {\n this.lastEvaluatedKey.pipe(take(1)).subscribe((lastEvaluatedKey) => {\n this.onLoadMore.emit(lastEvaluatedKey);\n });\n }\n });\n }\n\n onRowClicked(row: TableRow) {\n this.onRowClick.emit(row);\n }\n\n onRowDblClicked(row: TableRow) {\n this.onRowDblClick.emit(row);\n }\n\n getFixedPosition(column: TableColumn, side: 'left' | 'right'): string | null {\n if (column.fix !== side) return null;\n\n const visibleColumns = this.columns.filter((c) => !c.hidden);\n const fixedColumns =\n side === 'left'\n ? visibleColumns.filter((c) => c.fix === 'left')\n : visibleColumns.filter((c) => c.fix === 'right').reverse();\n\n const columnIndex = fixedColumns.indexOf(column);\n if (columnIndex <= 0) return '0px';\n\n let totalWidth = 0;\n for (let i = 0; i < columnIndex; i++) {\n const width = fixedColumns[i].width;\n if (width) {\n totalWidth += parseInt(width, 10) || 0;\n }\n }\n return `${totalWidth}px`;\n }\n\n getFixedZIndex(column: TableColumn): number {\n if (!column.fix || column.fix === 'none') return 0;\n\n const visibleColumns = this.columns.filter((c) => !c.hidden);\n const fixedColumns = visibleColumns.filter((c) => c.fix === column.fix);\n const index = fixedColumns.indexOf(column);\n\n return column.fix === 'left' ? fixedColumns.length - index : index + 1;\n }\n\n async copyToClipboard(event: Event, row: TableRow, column: TableColumn): Promise<void> {\n event.stopPropagation();\n const value = this.getColumnValueRaw(row, column);\n if (value !== null && value !== undefined && value !== '-') {\n try {\n await navigator.clipboard.writeText(String(value));\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }\n }\n\n ngOnInit(): void {\n if (this.tableName) {\n this.settings$ = this.tableSettingService.getSettings(this.tableName).pipe(shareReplay(1));\n this.showHeader$ = this.settings$.pipe(map((settings) => settings.showHeader));\n this.autoLoad$ = this.settings$.pipe(map((settings) => settings.autoLoad));\n }\n }\n\n openSettings(): void {\n if (this.tableName) {\n this.tableSettingService.show(this.tableName);\n }\n }\n\n ngAfterViewInit(): void {}\n}\n","<div\n class=\"w-full h-full shadow border border-light-inactive dark:border-dark-inactive rounded-lg overflow-auto\"\n>\n <table\n class=\"w-full h-full\"\n [ngClass]=\"{\n 'table-fixed': tableLayout === 'fixed',\n 'table-auto': tableLayout === 'auto',\n }\"\n >\n <colgroup>\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <col class=\"{{ column.width || '' }}\" />\n }\n }\n </colgroup>\n @if (showHeader$ | async) {\n <thead\n class=\"text-sm font-semibold text-light-on-inactive dark:text-dark-on-inactive whitespace-nowrap rounded-tl-lg rounded-tr-lg\"\n >\n <tr class=\"bg-light-inactive dark:bg-dark-inactive\">\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <th\n scope=\"col\"\n class=\"{{ column.align || '' }} py-3.5 pl-4 pr-3\"\n [ngClass]=\"{\n 'sticky-left': column.fix === 'left',\n 'sticky-right': column.fix === 'right',\n }\"\n [ngStyle]=\"{\n position: column.fix && column.fix !== 'none' ? 'sticky' : null,\n left: getFixedPosition(column, 'left'),\n right: getFixedPosition(column, 'right'),\n 'z-index': getFixedZIndex(column) + 10,\n }\"\n >\n <span class=\"group inline-flex\">\n {{ column.label }}\n @if (column.sortable) {\n @switch (getSortDirection(column.sort?.field || column.key) | async) {\n @case ('desc') {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'asc')\"\n class=\"ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n @case ('asc') {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'desc')\"\n class=\"ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M14.78 11.78a.75.75 0 0 1-1.06 0L10 8.06l-3.72 3.72a.75.75 0 1 1-1.06-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n @default {\n <span\n (click)=\"onUpdateSort(column.sort?.field || column.key, 'asc')\"\n class=\"invisible ml-2 flex-none rounded text-light-on-inactive dark:text-dark-on-inactive group-hover:visible group-focus:visible\"\n >\n <svg\n class=\"size-5\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M14.78 11.78a.75.75 0 0 1-1.06 0L10 8.06l-3.72 3.72a.75.75 0 1 1-1.06-1.06l4.25-4.25a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </span>\n }\n }\n }\n </span>\n </th>\n }\n }\n </tr>\n </thead>\n }\n <tbody class=\"overflow-scroll\">\n @for (row of rows | async; track row['id']; let lastRow = $last) {\n <tr\n class=\"border-t border-light-inactive dark:border-dark-inactive whitespace-nowrap text-sm text-light-on-background dark:text-dark-on-background {{\n row.bgColor || ''\n }}\"\n (click)=\"onRowClicked(row)\"\n (dblclick)=\"onRowDblClicked(row)\"\n [ngClass]=\"{\n 'rounded-b-lg': lastRow && (lastEvaluatedKey | async) === null,\n 'even:bg-light-alternative dark:even:bg-dark-alternative odd:bg-light-background dark:odd:bg-dark-background':\n !row.bgColor,\n }\"\n [ngStyle]=\"{ 'background-color': row.bgColor || '' }\"\n >\n @for (column of columns; track column.key) {\n @if (!column.hidden || !(column.hidden | async)) {\n <td\n class=\"relative overflow-visible {{ column.align || '' }} px-3 group\"\n [ngClass]=\"{\n 'first:rounded-bl-lg last:rounded-br-lg':\n lastRow && (lastEvaluatedKey | async) === null,\n 'text-wrap': row.isExpanded && column.type !== 'custom',\n 'overflow-x-hidden text-ellipsis': !row.isExpanded && column.type !== 'custom',\n 'py-2': column.type === 'custom',\n 'py-4': column.type !== 'custom',\n 'sticky-left': column.fix === 'left',\n 'sticky-right': column.fix === 'right',\n 'cursor-pointer': column.copyable,\n }\"\n [ngStyle]=\"{\n position: column.fix && column.fix !== 'none' ? 'sticky' : null,\n left: getFixedPosition(column, 'left'),\n right: getFixedPosition(column, 'right'),\n 'z-index': getFixedZIndex(column),\n }\"\n (click)=\"column.copyable ? copyToClipboard($event, row, column) : null\"\n >\n @if (column.type === 'custom') {\n @if (column.customRenderTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"customTemplates[column.customRenderTemplate]\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column }\"\n ></ng-container>\n }\n } @else {\n <span class=\"inline-flex items-center gap-1\">\n {{ getColumnValue(row, column) | async }}\n @if (column.copyable) {\n <svg\n class=\"size-4 text-light-on-inactive dark:text-dark-on-inactive opacity-0 group-hover:opacity-100 transition-opacity shrink-0\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M15.666 3.888A2.25 2.25 0 0 0 13.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 0 1-.75.75H9.75a.75.75 0 0 1-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 0 1-2.25 2.25H6.75A2.25 2.25 0 0 1 4.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 0 1 1.927-.184\"\n />\n </svg>\n }\n </span>\n }\n </td>\n }\n }\n </tr>\n\n @if (row.isExpanded && expandedTemplate) {\n <tr>\n <td [attr.colspan]=\"columns.length\"></td>\n </tr>\n <tr\n class=\"even:bg-light-alternative dark:even:bg-dark-alternative odd:bg-light-background dark:odd:bg-dark-background\"\n >\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 pb-4 text-sm text-center\"\n >\n <ng-container\n [ngTemplateOutlet]=\"expandedTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"\n ></ng-container>\n </td>\n </tr>\n }\n\n @if (lastRow && (lastEvaluatedKey | async) && !(isLoading | async) && useLoadMore) {\n <tr\n #loadMoreRow\n class=\"border-t border-light-inactive dark:border-dark-inactive bg-light-background dark:bg-dark-background\"\n haloduckAutoLoad\n [autoLoadEnabled]=\"(autoLoad$ | async) ?? true\"\n [autoLoadThreshold]=\"0.1\"\n (autoLoadTrigger)=\"onAutoLoadTriggered()\"\n >\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 py-4 text-sm text-light-on-background dark:text-dark-on-background text-center h-16 bg-light-background dark:bg-dark-background rounded-bl-lg rounded-br-lg\"\n >\n <div (click)=\"onLoadMoreClicked()\" class=\"cursor-pointer\">\n {{ 'haloduck.ui.table.Load More...' | transloco }}\n </div>\n </td>\n </tr>\n }\n } @empty {\n @if (!(isLoading | async)) {\n <tr>\n <td\n [attr.colspan]=\"columns.length\"\n class=\"whitespace-nowrap px-3 py-4 text-sm text-light-on-background dark:text-dark-on-background text-center h-16 bg-light-background dark:bg-dark-background rounded-bl-lg rounded-br-lg\"\n >\n {{ 'haloduck.ui.table.No data available.' | transloco }}\n </td>\n </tr>\n }\n }\n\n @if (isLoading | async) {\n @for (i of [0, 1, 2, 3, 4]; track i; let lastRow = $last) {\n <tr\n class=\"bg-light-background dark:bg-dark-background border-t border-light-inactive/50 dark:border-dark-inactive/50\"\n >\n @for (column of columns; track column.key) {\n <td\n class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm\"\n [ngClass]=\"{\n 'first:rounded-bl-lg last:rounded-br-lg': lastRow,\n 'sticky-left': column.fix === 'left',\n 'sticky-right': column.fix === 'right',\n }\"\n [ngStyle]=\"{\n position: column.fix && column.fix !== 'none' ? 'sticky' : null,\n left: getFixedPosition(column, 'left'),\n right: getFixedPosition(column, 'right'),\n 'z-index': getFixedZIndex(column),\n }\"\n >\n <div\n class=\"h-4 bg-light-inactive/50 dark:bg-dark-inactive/50 rounded-md animate-pulse\"\n ></div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n isDevMode,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'haloduck-toggle',\n imports: [CommonModule],\n templateUrl: './toggle.component.html',\n styleUrl: './toggle.component.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleComponent),\n multi: true,\n },\n ],\n})\nexport class ToggleComponent implements ControlValueAccessor, AfterViewInit {\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() value: boolean | null = false;\n @Input() disabled: boolean = false;\n @Input() nullable: boolean = false;\n @Output() toggled: EventEmitter<boolean | null> = new EventEmitter();\n @ViewChild('label') label!: ElementRef;\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n writeValue(value: any): void {\n if (!this.nullable && (value === null || value === undefined)) {\n value = false;\n }\n\n this.value = value;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onToggle(): void {\n if (this.nullable) {\n this.value = this.value ? false : this.value === null ? true : null;\n } else {\n this.value = !this.value;\n }\n\n this.onChange(this.value);\n this.onTouched();\n\n this.toggled.emit(this.value);\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (!this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n}\n","<div\n class=\"flex gap-2\"\n [ngClass]=\"{\n 'items-center justify-start': 'horizontal' === layout,\n 'flex-col items-start justify-center ': 'vertical' === layout,\n }\"\n>\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n <button\n class=\"w-12 p-1 rounded-l-full rounded-r-full outline -outline-offset-1 outline-light-inactive dark:outline-dark-inactive focus:outline-2 focus:outline-light-primary dark:foucs:outline-dark-primary bg-light-control dark:bg-dark-control disabled:bg-light-control/60 dark:disabled:bg-dark-control/60 flex hover:cursor-pointer\"\n (click)=\"onToggle()\"\n [disabled]=\"disabled\"\n [ngClass]=\"{\n 'justify-end': true === value,\n 'justify-center': null === value,\n 'justify-start': false === value,\n }\"\n >\n <div\n class=\"shrink-0 h-[1.5rem] rounded-l-full rounded-r-full\"\n [ngClass]=\"{\n 'bg-light-primary dark:bg-dark-primary disabled:bg-light-primary/60 dark:disabled:bg-dark-primary/60':\n true === value,\n 'bg-light-inactive dark:bg-dark-inactive disabled:bg-light-inactive/60 dark:disabled:bg-dark-inactive/60':\n false === value,\n 'w-[1.5rem]': true === value || false === value,\n 'bg-light-primary-light dark:bg-dark-primary-light disabled:bg-light-primary-light/60 dark:disabled:bg-dark-primary-light/60 w-[2.4rem]':\n null === value,\n }\"\n ></div>\n </button>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoModule } from '@jsverse/transloco';\nimport { TableSettingService, TableSettings } from './table-setting.service';\nimport { ButtonComponent } from '../button/button.component';\nimport { ToggleComponent } from '../toggle/toggle.component';\nimport { OverlayRef } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'haloduck-table-setting',\n imports: [CommonModule, TranslocoModule, FormsModule, ButtonComponent, ToggleComponent],\n template: `\n <div class=\"flex justify-between items-center mb-4\">\n <h2 class=\"text-md font-semibold text-light-on-background dark:text-dark-on-background\">\n {{ 'haloduck.ui.table.settings' | transloco }}\n </h2>\n </div>\n\n @if (currentSettings$ | async; as settings) {\n <div class=\"flex flex-col gap-4 p-4\">\n <haloduck-toggle\n [(ngModel)]=\"settings.showHeader\"\n (ngModelChange)=\"onSettingChange(settings)\"\n >\n {{ 'haloduck.ui.table.Show headers' | transloco }}\n </haloduck-toggle>\n\n <haloduck-toggle\n [(ngModel)]=\"settings.autoLoad\"\n (ngModelChange)=\"onSettingChange(settings)\"\n >\n {{ 'haloduck.ui.table.Auto load' | transloco }}\n </haloduck-toggle>\n </div>\n }\n\n <div class=\"flex justify-end mt-6\">\n <haloduck-button variant=\"none\" size=\"sm\" (click)=\"close()\">\n {{ 'haloduck.ui.button.Close' | transloco }}\n </haloduck-button>\n </div>\n `,\n providers: [provideTranslocoScope('haloduck')],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TableSettingComponent implements OnInit {\n private readonly tableSettingService = inject(TableSettingService);\n\n @Input() context?: { tableName: string; overlayRef: OverlayRef };\n\n get currentSettings$() {\n const tableName = this.context?.tableName;\n return tableName\n ? this.tableSettingService.getSettings(tableName)\n : this.tableSettingService.getSettings('');\n }\n\n ngOnInit() {\n console.log('Table settings initialized', this.context);\n }\n\n close(): void {\n if (this.context?.overlayRef) {\n this.tableSettingService.hide();\n }\n }\n\n onSettingChange(settings: TableSettings): void {\n const tableName = this.context?.tableName;\n if (tableName) {\n this.tableSettingService.updateSettings(tableName, settings);\n }\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport interface TabItem {\n id?: string;\n label: string;\n component: Type<any>;\n inputs?: Record<string, any>;\n}\n\n@Component({\n selector: 'haloduck-tabs',\n imports: [CommonModule],\n templateUrl: './tabs.component.html',\n styleUrl: './tabs.component.css',\n})\nexport class TabsComponent implements OnChanges, AfterViewInit {\n @Input() tabs: TabItem[] = [];\n @Input() selectedIndex: number = 0;\n @Input() layout: 'horizontal' | 'vertical' = 'vertical';\n @Input() labelWidth: string = '';\n\n @Output() selectedIndexChange = new EventEmitter<number>();\n\n @ViewChild('label') label!: ElementRef;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['tabs']) {\n this.ensureSelectedInRange();\n }\n if (changes['selectedIndex']) {\n this.ensureSelectedInRange();\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no content.\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n\n get current(): TabItem | null {\n if (!this.tabs || this.tabs.length === 0) return null;\n const idx = Math.min(Math.max(this.selectedIndex, 0), this.tabs.length - 1);\n return this.tabs[idx];\n }\n\n select(index: number) {\n if (index < 0 || index >= this.tabs.length) return;\n this.selectedIndex = index;\n this.selectedIndexChange.emit(this.selectedIndex);\n }\n\n private ensureSelectedInRange() {\n if (!this.tabs || this.tabs.length === 0) {\n this.selectedIndex = 0;\n return;\n }\n if (this.selectedIndex < 0) this.selectedIndex = 0;\n if (this.selectedIndex > this.tabs.length - 1) this.selectedIndex = this.tabs.length - 1;\n }\n}\n","<div class=\"flex gap-2 items-start w-full\" [ngClass]=\"{ 'flex-col': layout === 'vertical' }\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control {{\n labelWidth\n }}\"\n [ngClass]=\"{ 'w-full': layout === 'vertical' }\"\n >\n <ng-content select=\"[slot=label]\"></ng-content>\n </label>\n\n <div class=\"flex-1 w-full\">\n <div\n class=\"flex items-center gap-1 border-b border-light-inactive dark:border-dark-inactive text-sm/6\"\n >\n @for (tab of tabs; track tab.label; let i = $index) {\n <button\n type=\"button\"\n class=\"px-3 py-2 rounded-t-md\"\n [ngClass]=\"{\n 'text-light-on-control dark:text-dark-on-control': i !== selectedIndex,\n 'text-light-primary dark:text-dark-primary border-b-2 border-light-primary dark:border-dark-primary':\n i === selectedIndex,\n }\"\n (click)=\"select(i)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <div class=\"mt-3\">\n @if (current) {\n <ng-container\n *ngComponentOutlet=\"current!.component; inputs: current!.inputs || {}\"\n ></ng-container>\n }\n </div>\n </div>\n</div>\n","import { AfterViewInit, Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { provideTranslocoScope } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-tag-viewer',\n imports: [CommonModule],\n templateUrl: './tag-viewer.component.html',\n styleUrl: './tag-viewer.component.css',\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class TagViewerComponent implements AfterViewInit {\n @ViewChild('label') label!: ElementRef;\n\n tags: string[] = [];\n\n @Input() shouldWrap: boolean = true;\n\n // Accept input as `value` for consistency with tag-input\n @Input() set value(tags: string[] | null) {\n if (Array.isArray(tags)) {\n this.tags = tags.map((t) => (t ?? '').trim()).filter((t) => t.length > 0);\n } else {\n this.tags = [];\n }\n }\n\n ngAfterViewInit(): void {\n // hide label if no projected content\n if (this.label && this.label.nativeElement) {\n const hasContent = this.label.nativeElement.textContent?.trim();\n if (!hasContent) {\n this.label.nativeElement.style.display = 'none';\n }\n }\n }\n}\n","<div class=\"flex flex-col gap-2\">\n <label\n #label\n class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control text-left\"\n >\n <ng-content></ng-content>\n </label>\n\n <div\n class=\"block w-full rounded-md px-2 py-1.5 text-base text-light-on-control dark:text-dark-on-control sm:text-sm/6\"\n >\n <div class=\"flex items-center gap-2\" [ngClass]=\"shouldWrap ? 'flex-wrap' : 'flex-nowrap'\">\n @for (tag of tags; track tag) {\n <span\n class=\"inline-flex items-center gap-1 rounded-md bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary px-2 py-0.5 text-xs\"\n >\n {{ tag }}\n </span>\n }\n </div>\n </div>\n</div>\n","import { Directive, ElementRef, Input, OnInit, Renderer2, HostBinding } from '@angular/core';\n\nexport interface GroupedConfig {\n layoutClasses?: string;\n bgClasses?: string;\n borderClasses?: string;\n labelText?: string;\n labelClasses?: string;\n labelOffset?: string;\n}\n\n@Directive({\n selector: '[haloduckGrouped]',\n standalone: true,\n})\nexport class GroupedDirective implements OnInit {\n @Input() haloduckGrouped: GroupedConfig | string = {};\n @Input() layoutClasses: string = 'p-4 mt-2';\n @Input() bgClasses: string = '';\n @Input() borderClasses: string = 'border border-light-inactive dark:border-dark-inactive rounded';\n @Input() labelText: string = '';\n @Input() labelClasses: string =\n 'absolute bg-light-inactive dark:bg-dark-inactive text-light-on-inactive dark:text-dark-on-inactive px-2 py-0.5 text-sm font-medium rounded';\n @Input() labelOffset: string = '-10px';\n\n @HostBinding('class') hostClasses = 'relative';\n\n private labelElement: HTMLElement | null = null;\n\n constructor(\n private elementRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.applyConfig();\n\n this.createLayout();\n this.createBorder();\n this.createLabel();\n }\n\n private applyConfig(): void {\n if (typeof this.haloduckGrouped === 'string') {\n this.labelText = this.haloduckGrouped;\n } else if (typeof this.haloduckGrouped === 'object') {\n const config = this.haloduckGrouped;\n this.layoutClasses = config.layoutClasses ?? this.layoutClasses;\n this.bgClasses = config.bgClasses ?? this.bgClasses;\n this.borderClasses = config.borderClasses ?? this.borderClasses;\n this.labelText = config.labelText ?? this.labelText;\n this.labelClasses = config.labelClasses ?? this.labelClasses;\n this.labelOffset = config.labelOffset ?? this.labelOffset;\n }\n }\n\n private createLayout(): void {\n const element = this.elementRef.nativeElement;\n this.addClasses(element, this.layoutClasses);\n }\n\n private createBorder(): void {\n const element = this.elementRef.nativeElement;\n\n // 기존 테두리 클래스 제거\n this.removeBorderClasses(element);\n\n // Tailwind 클래스 추가\n this.addClasses(element, this.borderClasses);\n }\n\n private createLabel(): void {\n if (!this.labelText) return;\n\n const element = this.elementRef.nativeElement;\n\n // 기존 라벨 제거\n if (this.labelElement) {\n this.renderer.removeChild(element, this.labelElement);\n }\n\n // 라벨 요소 생성\n this.labelElement = this.renderer.createElement('span');\n\n // Tailwind 클래스 적용\n if (this.labelElement) {\n this.addClasses(this.labelElement, this.labelClasses);\n }\n\n // 커스텀 스타일 (Tailwind로 매핑할 수 없는 속성들)\n this.renderer.setStyle(this.labelElement, 'top', this.labelOffset);\n this.renderer.setStyle(this.labelElement, 'left', '8px');\n this.renderer.setStyle(this.labelElement, 'white-space', 'nowrap');\n this.renderer.setStyle(this.labelElement, 'z-index', '10');\n this.renderer.setStyle(this.labelElement, 'pointer-events', 'none');\n\n // 라벨 텍스트 설정\n this.renderer.setProperty(this.labelElement, 'textContent', this.labelText);\n\n // 요소에 라벨 추가\n this.renderer.appendChild(element, this.labelElement);\n }\n\n private addClasses(element: HTMLElement, classString: string): void {\n if (!classString) return;\n\n // 공백으로 구분된 클래스들을 분리하여 각각 추가\n const classes = classString.split(' ').filter((className) => className.trim());\n classes.forEach((className) => {\n if (className.trim()) {\n this.renderer.addClass(element, className.trim());\n }\n });\n }\n\n private removeBorderClasses(element: HTMLElement): void {\n // 기본 테두리 클래스들 제거\n const defaultBorderClasses = [\n 'border',\n 'border-2',\n 'border-3',\n 'border-4',\n 'border-8',\n 'border-solid',\n 'border-dashed',\n 'border-dotted',\n 'border-double',\n 'border-none',\n 'rounded-none',\n 'rounded-sm',\n 'rounded',\n 'rounded-md',\n 'rounded-lg',\n 'rounded-xl',\n 'rounded-2xl',\n 'rounded-3xl',\n 'rounded-full',\n 'border-gray-200',\n 'border-gray-300',\n 'border-gray-400',\n 'border-gray-500',\n 'border-gray-600',\n 'border-gray-700',\n 'border-gray-800',\n 'border-gray-900',\n 'border-blue-500',\n 'border-blue-700',\n 'border-red-500',\n 'border-red-600',\n 'border-green-500',\n 'border-green-600',\n 'border-amber-500',\n 'border-amber-600',\n 'border-violet-500',\n 'border-violet-600',\n 'border-pink-500',\n 'border-pink-600',\n 'border-white',\n 'border-black',\n ];\n\n defaultBorderClasses.forEach((className) => {\n this.renderer.removeClass(element, className);\n });\n }\n\n // 라벨 텍스트 업데이트 메서드\n updateLabel(text: string): void {\n if (this.labelElement) {\n this.renderer.setProperty(this.labelElement, 'textContent', text);\n }\n }\n\n // 라벨 표시/숨김 메서드\n toggleLabel(show: boolean): void {\n if (this.labelElement) {\n if (show) {\n this.renderer.removeClass(this.labelElement, 'hidden');\n } else {\n this.renderer.addClass(this.labelElement, 'hidden');\n }\n }\n }\n}\n","// Lucide Icons for WYSIWYG Editor\n// https://lucide.dev/icons\n\nexport const WYSIWYG_ICONS = {\n // Undo/Redo\n undo: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/></svg>`,\n redo: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\"/></svg>`,\n\n // Text Formatting\n bold: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8\"/></svg>`,\n italic: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"19\" x2=\"10\" y1=\"4\" y2=\"4\"/><line x1=\"14\" x2=\"5\" y1=\"20\" y2=\"20\"/><line x1=\"15\" x2=\"9\" y1=\"4\" y2=\"20\"/></svg>`,\n underline: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 4v6a6 6 0 0 0 12 0V4\"/><line x1=\"4\" x2=\"20\" y1=\"20\" y2=\"20\"/></svg>`,\n strikethrough: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M16 4H9a3 3 0 0 0-2.83 4\"/><path d=\"M14 12a4 4 0 0 1 0 8H6\"/><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/></svg>`,\n superscript: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m4 19 8-8\"/><path d=\"m12 19-8-8\"/><path d=\"M20 12h-4c0-1.5.44-2 1.5-2.5S20 8.33 20 7c0-1.11-.9-2-2-2h-2\"/></svg>`,\n subscript: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m4 5 8 8\"/><path d=\"m12 5-8 8\"/><path d=\"M20 19h-4c0-1.5.44-2 1.5-2.5S20 15.33 20 14c0-1.11-.9-2-2-2h-2\"/></svg>`,\n\n // Alignment\n alignLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\"/><line x1=\"15\" x2=\"3\" y1=\"12\" y2=\"12\"/><line x1=\"17\" x2=\"3\" y1=\"18\" y2=\"18\"/></svg>`,\n alignCenter: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\"/><line x1=\"17\" x2=\"7\" y1=\"12\" y2=\"12\"/><line x1=\"19\" x2=\"5\" y1=\"18\" y2=\"18\"/></svg>`,\n alignRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"21\" x2=\"3\" y1=\"6\" y2=\"6\"/><line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\"/><line x1=\"21\" x2=\"7\" y1=\"18\" y2=\"18\"/></svg>`,\n alignJustify: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"3\" x2=\"21\" y1=\"6\" y2=\"6\"/><line x1=\"3\" x2=\"21\" y1=\"12\" y2=\"12\"/><line x1=\"3\" x2=\"21\" y1=\"18\" y2=\"18\"/></svg>`,\n\n // Lists\n listBullet: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\"/><line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\"/><line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\"/><line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\"/><line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\"/><line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\"/></svg>`,\n listOrdered: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"10\" x2=\"21\" y1=\"6\" y2=\"6\"/><line x1=\"10\" x2=\"21\" y1=\"12\" y2=\"12\"/><line x1=\"10\" x2=\"21\" y1=\"18\" y2=\"18\"/><path d=\"M4 6h1v4\"/><path d=\"M4 10h2\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\"/></svg>`,\n\n // Indentation\n indentIncrease: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 8 7 12 3 16\"/><line x1=\"21\" x2=\"11\" y1=\"12\" y2=\"12\"/><line x1=\"21\" x2=\"11\" y1=\"6\" y2=\"6\"/><line x1=\"21\" x2=\"11\" y1=\"18\" y2=\"18\"/></svg>`,\n indentDecrease: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"7 8 3 12 7 16\"/><line x1=\"21\" x2=\"11\" y1=\"12\" y2=\"12\"/><line x1=\"21\" x2=\"11\" y1=\"6\" y2=\"6\"/><line x1=\"21\" x2=\"11\" y1=\"18\" y2=\"18\"/></svg>`,\n\n // Insert\n link: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>`,\n image: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n imagePlus: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7\"/><line x1=\"16\" x2=\"22\" y1=\"5\" y2=\"5\"/><line x1=\"19\" x2=\"19\" y1=\"2\" y2=\"8\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n minus: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/></svg>`,\n\n // Headings\n heading1: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"m17 12 3-2v8\"/></svg>`,\n heading2: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1\"/></svg>`,\n heading3: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12h8\"/><path d=\"M4 18V6\"/><path d=\"M12 18V6\"/><path d=\"M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2\"/><path d=\"M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2\"/></svg>`,\n paragraph: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 4v16\"/><path d=\"M17 4v16\"/><path d=\"M19 4H9.5a4.5 4.5 0 0 0 0 9H13\"/></svg>`,\n quote: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\"/><path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3z\"/></svg>`,\n\n // Actions\n eraser: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\"/><path d=\"M22 21H7\"/><path d=\"m5 11 9 9\"/></svg>`,\n trash: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/></svg>`,\n\n // Color\n textColor: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 20h16\"/><path d=\"m6 16 6-12 6 12\"/><path d=\"M8 12h8\"/></svg>`,\n highlighter: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 11-6 6v3h9l3-3\"/><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\"/></svg>`,\n\n // Block Element Alignment (for popup toolbar)\n typeInline: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\"/><line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\"/></svg>`,\n wrapLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"6\" height=\"6\" x=\"3\" y=\"3\" rx=\"1\"/><path d=\"M3 13h18\"/><path d=\"M3 17h18\"/><path d=\"M13 7h8\"/></svg>`,\n wrapRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"6\" height=\"6\" x=\"15\" y=\"3\" rx=\"1\"/><path d=\"M3 13h18\"/><path d=\"M3 17h18\"/><path d=\"M3 7h8\"/></svg>`,\n breakLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"8\" height=\"6\" x=\"3\" y=\"9\" rx=\"1\"/><path d=\"M3 5h18\"/><path d=\"M3 19h18\"/></svg>`,\n breakCenter: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"8\" height=\"6\" x=\"8\" y=\"9\" rx=\"1\"/><path d=\"M3 5h18\"/><path d=\"M3 19h18\"/></svg>`,\n breakRight: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"8\" height=\"6\" x=\"13\" y=\"9\" rx=\"1\"/><path d=\"M3 5h18\"/><path d=\"M3 19h18\"/></svg>`,\n\n // Misc\n chevronDown: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>`,\n\n // Layout\n layoutGrid: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/></svg>`,\n\n // Layout Element Actions\n trash2: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><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>`,\n cornerDownLeft: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 10 4 15 9 20\"/><path d=\"M20 4v7a4 4 0 0 1-4 4H4\"/></svg>`,\n move: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"5 9 2 12 5 15\"/><polyline points=\"9 5 12 2 15 5\"/><polyline points=\"15 19 12 22 9 19\"/><polyline points=\"19 9 22 12 19 15\"/><line x1=\"2\" x2=\"22\" y1=\"12\" y2=\"12\"/><line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"22\"/></svg>`,\n plus: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" x2=\"12\" y1=\"5\" y2=\"19\"/><line x1=\"5\" x2=\"19\" y1=\"12\" y2=\"12\"/></svg>`,\n} as const;\n\nexport type WysiwygIconName = keyof typeof WYSIWYG_ICONS;\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n ViewChild,\n forwardRef,\n OnDestroy,\n Output,\n EventEmitter,\n HostListener,\n ChangeDetectorRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { provideTranslocoScope } from '@jsverse/transloco';\nimport jsPDF from 'jspdf';\nimport html2canvas from 'html2canvas';\nimport { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, Observable, Subscription } from 'rxjs';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { WYSIWYG_ICONS, WysiwygIconName } from './wysiwyg-icons';\n\n// Block Element Types\ntype BlockElementType =\n | 'image'\n | 'video'\n | 'iframe'\n | 'table'\n | 'blockquote'\n | 'code-block'\n | 'og-card';\n\ntype AlignmentType =\n | 'inline'\n | 'wrap-left'\n | 'wrap-right'\n | 'break-left'\n | 'break-center'\n | 'break-right';\n\ninterface BlockElementConfig {\n type: BlockElementType;\n element: HTMLElement;\n wrapper: HTMLElement;\n resizable: boolean;\n draggable: boolean;\n aspectRatioLocked: boolean;\n}\n\ninterface ResizableElement {\n element: HTMLElement;\n wrapper: HTMLElement;\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n type: BlockElementType;\n aspectRatioLocked: boolean;\n}\n\n@Component({\n selector: 'haloduck-wysiwyg-editor',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './wysiwyg-editor.component.html',\n styleUrls: ['./wysiwyg-editor.component.css'],\n encapsulation: ViewEncapsulation.ShadowDom,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => WysiwygEditorComponent),\n multi: true,\n },\n provideTranslocoScope('haloduck'),\n ],\n})\nexport class WysiwygEditorComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {\n @Input() apiUrl: string = '';\n @ViewChild('editorContent', { static: false }) editorContent!: ElementRef<HTMLElement>;\n @ViewChild('label') label!: ElementRef;\n @ViewChild('imageInput') imageInput!: ElementRef<HTMLInputElement>;\n\n @Input() placeholder: string = '';\n @Input() disabled: boolean = false;\n @Input() height: string = '300px';\n @Input() readonly: boolean = false;\n\n // Image upload inputs\n @Input() uploadApi?: (file: File, keyPrefix: string) => Observable<string>;\n @Input() keyPrefix: string = 'wysiwyg';\n @Input() urlPrefix?: string;\n\n @Output() contentChange = new EventEmitter<string>();\n @Output() textChange = new EventEmitter<string>();\n\n // Image upload outputs\n @Output() uploadStart = new EventEmitter<File>();\n @Output() uploadComplete = new EventEmitter<{ file: File; key: string }>();\n @Output() uploadError = new EventEmitter<{ file: File; error: any }>();\n\n private value: string = '';\n private resizing: ResizableElement | null = null;\n private selectedElement: HTMLElement | null = null;\n private savedSelection: Range | null = null; // Save selection when editor loses focus\n\n showImageToolbar: boolean = false;\n selectedImage: HTMLImageElement | null = null;\n imageToolbarPosition = { x: 0, y: 0 };\n currentImageAlign:\n | 'inline'\n | 'wrap-left'\n | 'wrap-right'\n | 'break-left'\n | 'break-center'\n | 'break-right' = 'inline';\n\n // Block element toolbar (unified for all block elements)\n showBlockToolbar: boolean = false;\n selectedBlock: BlockElementConfig | null = null;\n blockToolbarPosition = { x: 0, y: 0 };\n currentBlockAlign: AlignmentType = 'inline';\n\n // Lucide icons for template access (sanitized for innerHTML binding)\n icons: Record<WysiwygIconName, SafeHtml> = {} as Record<WysiwygIconName, SafeHtml>;\n\n showTextColorPalette: boolean = false;\n showBackgroundColorPalette: boolean = false;\n showLayoutOutlines: boolean = false;\n\n // Property editor state\n showPropertyEditor: boolean = false;\n selectedLayoutElement: HTMLElement | null = null;\n propertyEditorPosition = { x: 0, y: 0 };\n // Element action buttons position (relative to editor content)\n elementActionButtonsPosition = { top: 0, right: 0, bottom: 0, left: 0 };\n // Visibility flags for action buttons\n showDeleteButton = true;\n showInsertLineButton = true;\n showMoveButton = true;\n activePropertyTab: 'layout' | 'color' | 'typography' = 'layout';\n currentStyles: {\n paddingTop: string;\n paddingRight: string;\n paddingBottom: string;\n paddingLeft: string;\n marginTop: string;\n marginRight: string;\n marginBottom: string;\n marginLeft: string;\n width: string;\n height: string;\n color: string;\n backgroundColor: string;\n borderTopWidth: string;\n borderRightWidth: string;\n borderBottomWidth: string;\n borderLeftWidth: string;\n borderStyle: string;\n borderColor: string;\n borderTopLeftRadius: string;\n borderTopRightRadius: string;\n borderBottomRightRadius: string;\n borderBottomLeftRadius: string;\n fontSize: string;\n fontWeight: string;\n textAlign: string;\n lineHeight: string;\n display: string;\n flexDirection: string;\n justifyContent: string;\n alignItems: string;\n gap: string;\n imageAlign: 'inline' | 'wrap-left' | 'wrap-right' | 'break-left' | 'break-center' | 'break-right' | null;\n } | null = null;\n\n // Mouse-based drag state\n private isDragging: boolean = false;\n private draggedWrapper: HTMLElement | null = null;\n private dragGhost: HTMLElement | null = null;\n private dragOriginalParent: HTMLElement | null = null;\n private dragOriginalNextSibling: Node | null = null;\n private lastDropIndicator: HTMLElement | null = null; // Save last valid drop position\n\n // Bound mouse handlers for cleanup\n private boundMouseMove: ((e: MouseEvent) => void) | null = null;\n private boundMouseUp: ((e: MouseEvent) => void) | null = null;\n\n // Bound scroll handler for layout element action buttons\n private boundScrollHandler: (() => void) | null = null;\n\n // Bound selection change handler for tracking cursor position (mobile fix)\n private boundSelectionChangeHandler: (() => void) | null = null;\n\n // Image upload state tracking\n private uploadingImages: Map<\n string,\n { file: File; placeholder: HTMLElement; subscription?: Subscription }\n > = new Map();\n isUploading: boolean = false;\n\n // Insert indicator for adding content between block elements\n insertIndicator: {\n show: boolean;\n top: number;\n insertBefore: HTMLElement | null;\n } = { show: false, top: 0, insertBefore: null };\n\n colors = [\n '#000000',\n '#e60000',\n '#ff9900',\n '#ffff00',\n '#008a00',\n '#0066cc',\n '#9933ff',\n '#ffffff',\n '#facccc',\n '#ffebcc',\n '#ffffcc',\n '#cce8cc',\n '#cce0f5',\n '#ebd6ff',\n '#bbbbbb',\n '#f06666',\n '#ffc266',\n '#ffff66',\n '#66b966',\n '#66a3e0',\n '#c285ff',\n '#888888',\n '#a10000',\n '#b26b00',\n '#b2b200',\n '#006100',\n '#0047b2',\n '#6b24b2',\n '#444444',\n '#5c0000',\n '#663d00',\n '#666600',\n '#003700',\n '#002966',\n '#3d1466',\n ];\n\n fontSizes = ['10px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px'];\n fontFamilies = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Trebuchet MS', 'Verdana'];\n\n onChange = (value: any) => {};\n onTouched = () => {};\n\n constructor(\n private cdr: ChangeDetectorRef,\n private http: HttpClient,\n private sanitizer: DomSanitizer,\n ) {\n // Sanitize all icons for safe innerHTML binding\n for (const [key, value] of Object.entries(WYSIWYG_ICONS)) {\n this.icons[key as WysiwygIconName] = this.sanitizer.bypassSecurityTrustHtml(value);\n }\n }\n ngAfterViewInit(): void {\n if (this.label && !this.label.nativeElement.innerText.trim()) {\n this.label.nativeElement.style.display = 'none';\n }\n\n if (this.value && this.editorContent) {\n this.editorContent.nativeElement.innerHTML = this.value;\n }\n\n this.setupPasteHandler();\n this.makeExistingImagesResizable();\n this.setupScrollHandler();\n this.setupSelectionChangeHandler();\n }\n\n ngOnDestroy(): void {\n this.cleanup();\n this.cancelPendingUploads();\n }\n\n private cleanup(): void {\n this.resizing = null;\n this.selectedElement = null;\n // Clean up any remaining mouse drag state\n this.cleanupMouseDrag();\n // Clean up scroll handler\n this.cleanupScrollHandler();\n // Clean up selection change handler\n this.cleanupSelectionChangeHandler();\n }\n\n /**\n * Set up scroll handler to update action button positions during scroll\n */\n private setupScrollHandler(): void {\n if (!this.editorContent) return;\n\n this.boundScrollHandler = () => {\n if (this.selectedLayoutElement && this.showPropertyEditor) {\n this.positionElementActionButtons(this.selectedLayoutElement);\n this.cdr.detectChanges();\n }\n };\n\n this.editorContent.nativeElement.addEventListener('scroll', this.boundScrollHandler);\n }\n\n /**\n * Clean up scroll handler\n */\n private cleanupScrollHandler(): void {\n if (this.boundScrollHandler && this.editorContent) {\n this.editorContent.nativeElement.removeEventListener('scroll', this.boundScrollHandler);\n this.boundScrollHandler = null;\n }\n }\n\n /**\n * Set up selection change handler to track cursor position\n * This fixes mobile issue where focus is lost before mousedown saves selection\n */\n private setupSelectionChangeHandler(): void {\n console.log('[WYSIWYG DEBUG] setupSelectionChangeHandler called');\n this.boundSelectionChangeHandler = () => {\n this.saveSelectionOnChange();\n };\n document.addEventListener('selectionchange', this.boundSelectionChangeHandler);\n }\n\n /**\n * Save selection when it changes within the editor\n * Uses ShadowDOM-aware selection retrieval\n */\n private saveSelectionOnChange(): void {\n // For Shadow DOM, try to get selection from the shadow root\n const shadowRoot = this.editorContent?.nativeElement.getRootNode();\n let selection: Selection | null = null;\n\n // Try shadow root's getSelection first (Chrome 124+), fallback to document\n if (shadowRoot && shadowRoot instanceof ShadowRoot) {\n selection = (shadowRoot as any).getSelection?.() || null;\n }\n\n // Fallback to window.getSelection for non-ShadowDOM or unsupported browsers\n if (!selection) {\n selection = window.getSelection();\n }\n\n const isInEditor =\n selection &&\n selection.rangeCount > 0 &&\n selection.anchorNode &&\n this.editorContent?.nativeElement.contains(selection.anchorNode);\n\n console.log('[WYSIWYG DEBUG] saveSelectionOnChange:', {\n hasSelection: !!selection,\n rangeCount: selection?.rangeCount,\n anchorNode: selection?.anchorNode?.nodeName,\n isInEditor,\n usedShadowRoot: shadowRoot instanceof ShadowRoot,\n });\n\n if (isInEditor && selection) {\n this.savedSelection = selection.getRangeAt(0).cloneRange();\n console.log('[WYSIWYG DEBUG] savedSelection updated:', {\n startContainer: this.savedSelection.startContainer.nodeName,\n startOffset: this.savedSelection.startOffset,\n });\n }\n }\n\n /**\n * Clean up selection change handler\n */\n private cleanupSelectionChangeHandler(): void {\n if (this.boundSelectionChangeHandler) {\n document.removeEventListener('selectionchange', this.boundSelectionChangeHandler);\n this.boundSelectionChangeHandler = null;\n }\n }\n\n private setupPasteHandler(): void {\n if (!this.editorContent) return;\n\n this.editorContent.nativeElement.addEventListener('paste', async (e: ClipboardEvent) => {\n e.preventDefault();\n\n const clipboardData = e.clipboardData;\n if (!clipboardData) return;\n\n // Handle image paste\n const items = clipboardData.items;\n for (let i = 0; i < items.length; i++) {\n if (items[i].type.indexOf('image') !== -1) {\n const blob = items[i].getAsFile();\n if (blob) {\n this.insertImageFromFile(blob);\n return;\n }\n }\n }\n\n // Handle HTML/text paste\n const html = clipboardData.getData('text/html');\n const text = clipboardData.getData('text/plain');\n const urlRegex = /^https?:\\/\\/[\\w\\-._~:/?#[\\]@!$&'()*+,;=%]+$/i;\n\n // URL 미리보기: plain text가 URL이면 Open Graph 카드 생성\n if (text && urlRegex.test(text.trim())) {\n const previewHtml = await this.createUrlPreviewCard(text.trim());\n this.insertHtml(previewHtml);\n return;\n }\n\n if (html) {\n let sanitizedHtml = this.sanitizeHtml(html);\n // font-family 스타일을 Pretendard로 변경\n const div = document.createElement('div');\n div.innerHTML = sanitizedHtml;\n const allElements = div.querySelectorAll('*');\n allElements.forEach((el) => {\n const htmlEl = el as HTMLElement;\n if (htmlEl.style && htmlEl.style.fontFamily) {\n htmlEl.style.fontFamily = \"'Noto Sans KR', 'Pretendard'\";\n }\n // 인라인 style 속성에 font-family가 있으면 변경\n if (htmlEl.hasAttribute('style')) {\n const style = htmlEl.getAttribute('style');\n if (style && /font-family\\s*:[^;]+;?/i.test(style)) {\n // font-family 부분만 Pretendard로 치환\n const newStyle = style.replace(\n /font-family\\s*:[^;]+;?/gi,\n \"font-family:'Noto Sans KR', 'Pretendard';\",\n );\n htmlEl.setAttribute('style', newStyle);\n }\n }\n });\n\n sanitizedHtml = div.innerHTML;\n this.insertHtml(sanitizedHtml);\n\n // Process external images if uploadApi is available\n if (this.uploadApi && this.urlPrefix) {\n // Process external images in editor content (replaces with uploaded images)\n this.processExternalImagesInHtml(this.editorContent.nativeElement);\n }\n } else if (text) {\n this.insertHtml(text.replace(/\\n/g, '<br>'));\n }\n });\n }\n\n // URL 미리보기 카드 생성 (Open Graph)\n private async createUrlPreviewCard(url: string): Promise<string> {\n try {\n const res = await fetch(`${this.apiUrl}/tool/_fetchOpenGraph?url=${encodeURIComponent(url)}`);\n const og = await res.json();\n\n if (!og || og.error !== '00') {\n throw new Error('Failed to fetch Open Graph data');\n }\n\n return `\n <a href=\"${og.data.url || url}\" target=\"_blank\" rel=\"noopener\" class=\"og-preview-card\" style=\"width:450px;display:flex;flex-direction:column;align-items:center;border:1px solid #eee;border-radius:8px;padding:8px;margin:8px 0;text-decoration:none;color:inherit;\" class=\"resizable-element\">\n ${og.data.image ? `<img src=\"${og.data.image}\" style=\"max-width:100%;object-fit:contain;border-radius:6px;\" class=\"resizable-element\">` : ''}\n <div style=\"width:100%;flex:1;display:flex;flex-direction:column;justify-content:center;\">\n <div style=\"font-weight:bold;font-size:15px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;\">${og.data.title || url}</div>\n <div style=\"font-size:13px;color:#666;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;\">${og.data.description || ''}</div>\n <div style=\"font-size:12px;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;\">${og.data.site_name || ''}</div>\n </div>\n </a>\n `;\n } catch (e) {\n // 실패 시 그냥 링크로 대체\n return `<a href=\"${url}\" target=\"_blank\" rel=\"noopener\">${url}</a>`;\n }\n }\n\n /**\n * Sanitize HTML content to prevent XSS and properly extract body content.\n * Uses regex pre-processing and DOMParser to handle complete HTML documents.\n */\n private sanitizeHtml(html: string): string {\n // Step 1: Pre-process with regex to remove DOCTYPE and HTML document structure\n // This handles edge cases where browsers include document-level elements in clipboard\n let cleanedHtml = html\n .replace(/<!DOCTYPE[^>]*>/gi, '')\n .replace(/<html[^>]*>/gi, '')\n .replace(/<\\/html>/gi, '')\n .replace(/<head[\\s\\S]*?<\\/head>/gi, '') // Remove entire head tag with contents\n .replace(/<body[^>]*>/gi, '')\n .replace(/<\\/body>/gi, '');\n\n // Step 2: Parse with DOMParser to extract body content\n const parser = new DOMParser();\n const doc = parser.parseFromString(cleanedHtml, 'text/html');\n const bodyContent = doc.body.innerHTML;\n\n // Step 3: Create clean container for further sanitization\n const div = document.createElement('div');\n div.innerHTML = bodyContent;\n\n // Step 4: Remove dangerous elements (iframe is allowed for video embeds)\n const dangerousTags = [\n 'script',\n 'style',\n 'link',\n 'meta',\n 'title',\n 'head',\n 'html',\n 'body',\n 'noscript',\n 'base',\n 'template',\n 'object',\n 'embed',\n ];\n dangerousTags.forEach((tag) => {\n div.querySelectorAll(tag).forEach((el) => el.remove());\n });\n\n // Step 5: Remove event handlers and dangerous attributes\n const allElements = div.querySelectorAll('*');\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n attributes.forEach((attr) => {\n // Remove event handlers (onclick, onload, onerror, etc.)\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n // Remove javascript: URLs\n if (attr.value && attr.value.toLowerCase().includes('javascript:')) {\n el.removeAttribute(attr.name);\n }\n // Remove data: URLs except for images\n if (\n attr.name === 'src' &&\n attr.value.toLowerCase().startsWith('data:') &&\n !attr.value.toLowerCase().startsWith('data:image/')\n ) {\n el.removeAttribute(attr.name);\n }\n });\n });\n\n return div.innerHTML;\n }\n\n private insertHtml(html: string): void {\n document.execCommand('insertHTML', false, html);\n this.onContentChange();\n }\n\n onInput(): void {\n // Save selection on every input - this is the most reliable time to capture cursor position\n this.saveSelectionImmediate();\n this.onContentChange();\n }\n\n /**\n * Save selection when user clicks/selects with mouse inside the editor.\n * Also ensures empty editor has a <p> tag for proper text input.\n */\n onEditorMouseUp(): void {\n // If editor is empty, add a <p> tag and place cursor inside\n this.ensureInitialParagraph();\n\n // Small delay to let browser finalize selection\n setTimeout(() => this.saveSelectionImmediate(), 0);\n }\n\n /**\n * Ensure empty editor has a <p> tag for proper text input structure\n */\n private ensureInitialParagraph(): void {\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent || this.readonly || this.disabled) return;\n\n // Check if editor is empty (no elements or only whitespace text)\n const hasBlockElements = Array.from(editorContent.children).length > 0;\n const hasOnlyWhitespace = !editorContent.textContent?.trim();\n\n if (!hasBlockElements && hasOnlyWhitespace) {\n // Create a <p> tag with a <br> for cursor placement\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n editorContent.innerHTML = '';\n editorContent.appendChild(p);\n\n // Place cursor inside the <p>\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.setStart(p, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }\n\n /**\n * Handle keydown events directly on the editor content.\n * This ensures proper handling within Shadow DOM.\n */\n onEditorKeyDown(event: KeyboardEvent): void {\n // Delete selected block element with Backspace or Delete key\n if (this.selectedBlock && (event.key === 'Backspace' || event.key === 'Delete')) {\n event.preventDefault();\n event.stopPropagation();\n this.deleteSelectedBlock();\n }\n }\n\n /**\n * Save selection when user navigates with keyboard (arrow keys, etc.)\n */\n onEditorKeyUp(event: KeyboardEvent): void {\n // Save selection for navigation keys\n const navigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End', 'PageUp', 'PageDown'];\n if (navigationKeys.includes(event.key)) {\n this.saveSelectionImmediate();\n }\n }\n\n /**\n * Immediately save the current selection with ShadowDOM support\n * Called during input when we KNOW the cursor is in the editor\n */\n private saveSelectionImmediate(): void {\n // For Shadow DOM, try to get selection from the shadow root\n const shadowRoot = this.editorContent?.nativeElement.getRootNode();\n let selection: Selection | null = null;\n let selectionSource = 'none';\n\n // Try shadow root's getSelection first (Chrome 124+)\n if (shadowRoot && shadowRoot instanceof ShadowRoot) {\n const shadowSelection = (shadowRoot as any).getSelection?.();\n if (shadowSelection && shadowSelection.rangeCount > 0) {\n selection = shadowSelection;\n selectionSource = 'shadowRoot';\n }\n }\n\n // Fallback to document.getSelection for non-ShadowDOM or unsupported browsers\n if (!selection || selection.rangeCount === 0) {\n const docSelection = document.getSelection();\n if (docSelection && docSelection.rangeCount > 0) {\n selection = docSelection;\n selectionSource = selectionSource === 'none' ? 'document' : selectionSource;\n }\n }\n\n console.log('[WYSIWYG DEBUG] saveSelectionImmediate:', {\n selectionSource,\n hasSelection: !!selection,\n rangeCount: selection?.rangeCount,\n anchorNode: selection?.anchorNode?.nodeName,\n anchorNodeText: selection?.anchorNode?.textContent?.substring(0, 20),\n });\n\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const isInEditor = this.editorContent?.nativeElement.contains(range.commonAncestorContainer);\n\n console.log('[WYSIWYG DEBUG] range check:', {\n commonAncestor: range.commonAncestorContainer.nodeName,\n isInEditor,\n });\n\n // Double check the range is in the editor\n if (isInEditor) {\n this.savedSelection = range.cloneRange();\n console.log('[WYSIWYG DEBUG] saveSelectionImmediate - SAVED:', {\n startContainer: this.savedSelection.startContainer.nodeName,\n startOffset: this.savedSelection.startOffset,\n });\n }\n }\n }\n\n onContentChange(): void {\n if (this.editorContent) {\n // Clean up empty resizable wrappers (orphaned after content deletion)\n this.cleanupEmptyWrappers();\n\n // Get raw body content (without full HTML document wrapper)\n // Use getRawContent() to prevent head content from being included in saved value\n const cleanHtml = this.getRawContent();\n const text = this.editorContent.nativeElement.innerText;\n\n this.value = cleanHtml;\n this.onChange(cleanHtml);\n this.onTouched();\n\n this.contentChange.emit(cleanHtml);\n this.textChange.emit(text);\n\n // Make any new images resizable\n setTimeout(() => this.makeExistingImagesResizable(), 0);\n }\n }\n\n /**\n * Remove empty resizable wrappers that no longer contain their content element.\n * This happens when users delete an image/video using keyboard or other means.\n */\n private cleanupEmptyWrappers(): void {\n if (!this.editorContent) return;\n\n const wrappers = this.editorContent.nativeElement.querySelectorAll('.resizable-wrapper');\n wrappers.forEach((wrapper: Element) => {\n // Check if wrapper contains an actual content element\n const hasContent = wrapper.querySelector('img, video, iframe, table, blockquote, pre, .og-preview-card');\n\n if (!hasContent) {\n // Wrapper is empty (content was deleted) - remove it\n wrapper.remove();\n }\n });\n }\n\n saveSelection(): void {\n // For Shadow DOM, try to get selection from the shadow root\n const shadowRoot = this.editorContent?.nativeElement.getRootNode();\n let selection: Selection | null = null;\n\n // Try shadow root's getSelection first (Chrome 124+), fallback to window\n if (shadowRoot && shadowRoot instanceof ShadowRoot) {\n selection = (shadowRoot as any).getSelection?.() || document.getSelection();\n } else {\n selection = window.getSelection();\n }\n\n if (\n selection &&\n selection.rangeCount > 0 &&\n selection.anchorNode &&\n this.editorContent.nativeElement.contains(selection.anchorNode)\n ) {\n this.savedSelection = selection.getRangeAt(0).cloneRange();\n }\n }\n\n /**\n * Handle mousedown on toolbar to preserve editor selection\n * This is called BEFORE focus changes, so we can save the selection\n */\n onToolbarMouseDown(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n\n // Save selection before focus changes\n this.saveSelection();\n\n // Prevent focus from leaving the editor (unless clicking on input elements)\n if (target.tagName !== 'INPUT' && target.tagName !== 'SELECT') {\n event.preventDefault();\n }\n }\n\n // Toolbar actions\n execCommand(command: string, value: string | null = null): void {\n document.execCommand(command, false, value || undefined);\n this.editorContent?.nativeElement.focus();\n this.onContentChange();\n }\n\n setFontSize(size: string): void {\n this.execCommand('fontSize', '7');\n const fontElements = this.editorContent.nativeElement.querySelectorAll('font[size=\"7\"]');\n fontElements.forEach((el) => {\n el.removeAttribute('size');\n (el as HTMLElement).style.fontSize = size;\n });\n this.onContentChange();\n }\n\n setFontFamily(font: string): void {\n this.execCommand('fontName', font);\n }\n\n toggleTextColorPalette(): void {\n this.showTextColorPalette = !this.showTextColorPalette;\n this.showBackgroundColorPalette = false; // Close other palette\n }\n\n toggleBackgroundColorPalette(): void {\n this.showBackgroundColorPalette = !this.showBackgroundColorPalette;\n this.showTextColorPalette = false; // Close other palette\n }\n\n toggleLayoutMode(): void {\n this.showLayoutOutlines = !this.showLayoutOutlines;\n if (this.editorContent) {\n this.editorContent.nativeElement.classList.toggle('layout-mode', this.showLayoutOutlines);\n }\n // Close property editor when disabling layout mode\n if (!this.showLayoutOutlines) {\n this.closePropertyEditor();\n }\n }\n\n /**\n * Handle element click in layout mode to show property editor\n */\n onLayoutElementClick(event: MouseEvent): void {\n if (!this.showLayoutOutlines) return;\n\n const target = event.target as HTMLElement;\n const editorContent = this.editorContent?.nativeElement;\n\n // Only handle clicks on elements inside the editor content\n if (!editorContent || !editorContent.contains(target)) return;\n\n // Don't show property editor for the editor content itself\n if (target === editorContent) return;\n\n event.stopPropagation();\n\n // Remove selected class from previous element\n if (this.selectedLayoutElement) {\n this.selectedLayoutElement.classList.remove('layout-selected');\n }\n\n // Add selected class to new element\n target.classList.add('layout-selected');\n\n this.selectedLayoutElement = target;\n this.extractElementStyles(target);\n this.positionPropertyEditor(event);\n this.showPropertyEditor = true;\n this.cdr.detectChanges();\n\n // Wait for layout to settle after sidebar appears, then position buttons\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n if (this.selectedLayoutElement) {\n this.positionElementActionButtons(this.selectedLayoutElement);\n this.cdr.detectChanges();\n }\n });\n });\n }\n\n /**\n * Position element action buttons relative to the selected element\n * Button centers should be at the element's corners:\n * - Move button: top-left\n * - Delete button: top-right\n * - Insert line button: bottom-right\n */\n private positionElementActionButtons(element: HTMLElement): void {\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent) return;\n\n // Get the container (the positioning context for absolute buttons)\n const container = editorContent.closest('.haloduck-wysiwyg-editor-container');\n if (!container) return;\n\n const containerRect = container.getBoundingClientRect();\n const editorContentRect = editorContent.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n\n // Button size (1.125rem = 18px), half = 9px to center on corner\n const buttonHalfSize = 9;\n const buttonSize = buttonHalfSize * 2;\n\n // Editor content boundaries (relative to container)\n const minTop = editorContentRect.top - containerRect.top;\n const maxBottom = editorContentRect.bottom - containerRect.top;\n\n // Calculate raw positions (where buttons would ideally be)\n const topButtonIdeal = elementRect.top - containerRect.top - buttonHalfSize;\n const bottomButtonIdeal = elementRect.bottom - containerRect.top - buttonHalfSize;\n const rightPos = containerRect.right - elementRect.right - buttonHalfSize;\n const leftPos = elementRect.left - containerRect.left - buttonHalfSize;\n\n // Determine visibility based on whether the element corner is within visible area\n // Move button (top-left): visible if element's top edge is within editor content\n this.showMoveButton = elementRect.top >= editorContentRect.top - buttonHalfSize &&\n elementRect.top <= editorContentRect.bottom;\n\n // Delete button (top-right): visible if element's top edge is within editor content\n this.showDeleteButton = elementRect.top >= editorContentRect.top - buttonHalfSize &&\n elementRect.top <= editorContentRect.bottom;\n\n // Insert line button (bottom-right): visible if element's bottom edge is within editor content\n this.showInsertLineButton = elementRect.bottom >= editorContentRect.top &&\n elementRect.bottom <= editorContentRect.bottom + buttonHalfSize;\n\n // Clamp positions within visible area\n const topButtonClamped = Math.max(minTop, Math.min(maxBottom - buttonSize, topButtonIdeal));\n const bottomButtonClamped = Math.max(minTop, Math.min(maxBottom - buttonSize, bottomButtonIdeal));\n\n this.elementActionButtonsPosition = {\n top: topButtonClamped,\n right: rightPos,\n bottom: bottomButtonClamped,\n left: leftPos,\n };\n }\n\n /**\n * Extract computed styles from the selected element\n */\n private extractElementStyles(element: HTMLElement): void {\n const computed = window.getComputedStyle(element);\n\n this.currentStyles = {\n paddingTop: computed.paddingTop,\n paddingRight: computed.paddingRight,\n paddingBottom: computed.paddingBottom,\n paddingLeft: computed.paddingLeft,\n marginTop: computed.marginTop,\n marginRight: computed.marginRight,\n marginBottom: computed.marginBottom,\n marginLeft: computed.marginLeft,\n width: element.style.width || 'auto',\n height: element.style.height || 'auto',\n color: element.style.color ? this.rgbToHex(element.style.color) : '',\n backgroundColor: element.style.backgroundColor ? this.rgbToHex(element.style.backgroundColor) : '',\n borderTopWidth: computed.borderTopWidth,\n borderRightWidth: computed.borderRightWidth,\n borderBottomWidth: computed.borderBottomWidth,\n borderLeftWidth: computed.borderLeftWidth,\n borderStyle: computed.borderStyle,\n borderColor: element.style.borderColor ? this.rgbToHex(element.style.borderColor) : '',\n borderTopLeftRadius: computed.borderTopLeftRadius,\n borderTopRightRadius: computed.borderTopRightRadius,\n borderBottomRightRadius: computed.borderBottomRightRadius,\n borderBottomLeftRadius: computed.borderBottomLeftRadius,\n fontSize: computed.fontSize,\n fontWeight: computed.fontWeight,\n textAlign: computed.textAlign,\n lineHeight: computed.lineHeight,\n display: computed.display,\n flexDirection: computed.flexDirection,\n justifyContent: computed.justifyContent,\n alignItems: computed.alignItems,\n gap: computed.gap,\n imageAlign: this.detectImageAlignment(element),\n };\n }\n\n /**\n * Detect image alignment from element styles\n */\n private detectImageAlignment(element: HTMLElement): 'inline' | 'wrap-left' | 'wrap-right' | 'break-left' | 'break-center' | 'break-right' | null {\n // Check if element is an image or a wrapper containing an image\n const isImage = element.tagName === 'IMG';\n const wrapper = element.closest('.resizable-wrapper') as HTMLElement;\n const isWrapper = element.classList.contains('resizable-wrapper');\n\n if (!isImage && !isWrapper && !wrapper) {\n return null;\n }\n\n // Use wrapper styles if available, otherwise use element styles\n const targetElement = isWrapper ? element : (wrapper || element);\n const computed = window.getComputedStyle(targetElement);\n\n const displayStyle = computed.display;\n const floatStyle = computed.float;\n const marginLeft = computed.marginLeft;\n const marginRight = computed.marginRight;\n\n if (displayStyle === 'inline-block' || displayStyle === 'inline') {\n return 'inline';\n } else if (floatStyle === 'left') {\n return 'wrap-left';\n } else if (floatStyle === 'right') {\n return 'wrap-right';\n } else if (marginLeft === 'auto' && marginRight === 'auto') {\n return 'break-center';\n } else if (marginLeft === 'auto' && (marginRight === '0' || marginRight === '0px' || marginRight === '')) {\n return 'break-right';\n } else if (floatStyle === 'none' && displayStyle === 'block') {\n return 'break-left';\n }\n\n return 'inline';\n }\n\n /**\n * Convert RGB color to hex format\n */\n private rgbToHex(rgb: string): string {\n if (rgb.startsWith('#')) return rgb;\n if (rgb === 'transparent' || rgb === 'rgba(0, 0, 0, 0)') return 'transparent';\n\n const match = rgb.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (!match) return rgb;\n\n const r = parseInt(match[1]).toString(16).padStart(2, '0');\n const g = parseInt(match[2]).toString(16).padStart(2, '0');\n const b = parseInt(match[3]).toString(16).padStart(2, '0');\n\n return `#${r}${g}${b}`;\n }\n\n /**\n * Position the property editor panel near the clicked element\n */\n private positionPropertyEditor(event: MouseEvent): void {\n const editorRect = this.editorContent?.nativeElement.getBoundingClientRect();\n if (!editorRect) return;\n\n // Position relative to editor container\n let x = event.clientX - editorRect.left + 10;\n let y = event.clientY - editorRect.top + 10;\n\n // Ensure panel stays within editor bounds\n const panelWidth = 280;\n const panelHeight = 400;\n\n if (x + panelWidth > editorRect.width) {\n x = event.clientX - editorRect.left - panelWidth - 10;\n }\n if (y + panelHeight > editorRect.height) {\n y = Math.max(10, editorRect.height - panelHeight - 10);\n }\n\n this.propertyEditorPosition = { x, y };\n }\n\n /**\n * Update a style property on the selected element\n */\n updateElementStyle(property: string, value: string): void {\n if (!this.selectedLayoutElement || !this.currentStyles) return;\n\n // If changing text color, preserve border color explicitly\n // (CSS border-color defaults to currentColor which inherits from color)\n if (property === 'color' && !this.selectedLayoutElement.style.borderColor) {\n const currentBorderColor = window.getComputedStyle(this.selectedLayoutElement).borderColor;\n this.selectedLayoutElement.style.borderColor = currentBorderColor;\n }\n\n // Map property names to CSS properties\n const cssProperty = this.toCssProperty(property);\n this.selectedLayoutElement.style.setProperty(cssProperty, value);\n\n // Update currentStyles\n (this.currentStyles as any)[property] = value;\n\n this.onContentChange();\n }\n\n /**\n * Convert camelCase property name to CSS property name\n */\n private toCssProperty(property: string): string {\n return property.replace(/([A-Z])/g, '-$1').toLowerCase();\n }\n\n /**\n * Close the property editor\n */\n closePropertyEditor(): void {\n // Remove selected class from element\n if (this.selectedLayoutElement) {\n this.selectedLayoutElement.classList.remove('layout-selected');\n }\n this.showPropertyEditor = false;\n this.selectedLayoutElement = null;\n this.currentStyles = null;\n }\n\n /**\n * Handle mouse move over editor content to show insert indicator between elements\n */\n onEditorMouseMove(event: MouseEvent): void {\n const editorContent = this.editorContent?.nativeElement;\n // Don't show insert indicator when disabled, readonly, or during drag operation\n if (!editorContent || this.readonly || this.disabled || this.isDragging) {\n if (this.insertIndicator.show) {\n this.insertIndicator.show = false;\n this.cdr.detectChanges();\n }\n return;\n }\n\n const editorRect = editorContent.getBoundingClientRect();\n const mouseX = event.clientX;\n const mouseY = event.clientY;\n\n // Check if mouse is within editor content area (with tolerance for edges)\n const tolerance = 10;\n if (\n mouseX < editorRect.left - tolerance ||\n mouseX > editorRect.right + tolerance ||\n mouseY < editorRect.top - tolerance ||\n mouseY > editorRect.bottom + tolerance\n ) {\n if (this.insertIndicator.show) {\n this.insertIndicator.show = false;\n this.cdr.detectChanges();\n }\n return;\n }\n\n // Get direct children of editor content (block-level elements)\n const children = Array.from(editorContent.children).filter(\n (child) => !child.classList.contains('drop-indicator'),\n ) as HTMLElement[];\n\n if (children.length === 0) {\n // Empty editor - cursor is already visible, no need for indicator\n if (this.insertIndicator.show) {\n this.insertIndicator.show = false;\n this.cdr.detectChanges();\n }\n return;\n }\n\n const threshold = 20; // Gap detection area in pixels\n\n // Build list of insertion points with their Y positions (viewport coordinates)\n const insertionPoints: Array<{\n y: number; // Viewport Y position for distance calculation\n top: number; // Position relative to editor for indicator placement\n insertBefore: HTMLElement | null;\n }> = [];\n\n // First insertion point: before first element\n const firstRect = children[0].getBoundingClientRect();\n insertionPoints.push({\n y: firstRect.top,\n top: firstRect.top - editorRect.top,\n insertBefore: children[0],\n });\n\n // Insertion points between elements\n for (let i = 0; i < children.length - 1; i++) {\n const currentRect = children[i].getBoundingClientRect();\n const nextRect = children[i + 1].getBoundingClientRect();\n const gapCenter = (currentRect.bottom + nextRect.top) / 2;\n insertionPoints.push({\n y: gapCenter,\n top: gapCenter - editorRect.top,\n insertBefore: children[i + 1],\n });\n }\n\n // Last insertion point: after last element\n const lastRect = children[children.length - 1].getBoundingClientRect();\n insertionPoints.push({\n y: lastRect.bottom,\n top: lastRect.bottom - editorRect.top,\n insertBefore: null,\n });\n\n // Find the closest insertion point to mouse Y\n let closestPoint = insertionPoints[0];\n let closestDistance = Math.abs(mouseY - closestPoint.y);\n\n for (const point of insertionPoints) {\n const distance = Math.abs(mouseY - point.y);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPoint = point;\n }\n }\n\n // Only show indicator if mouse is within threshold of the closest point\n if (closestDistance <= threshold) {\n this.insertIndicator = {\n show: true,\n top: closestPoint.top,\n insertBefore: closestPoint.insertBefore,\n };\n this.cdr.detectChanges();\n } else if (this.insertIndicator.show) {\n this.insertIndicator.show = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Hide insert indicator when mouse leaves editor\n */\n onEditorMouseLeave(): void {\n if (this.insertIndicator.show) {\n this.insertIndicator.show = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Insert a new paragraph block at the indicator position\n */\n insertBlockAtIndicator(): void {\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent || !this.insertIndicator.show) return;\n\n const newBlock = document.createElement('p');\n newBlock.innerHTML = '<br>';\n\n if (this.insertIndicator.insertBefore) {\n editorContent.insertBefore(newBlock, this.insertIndicator.insertBefore);\n } else {\n editorContent.appendChild(newBlock);\n }\n\n this.moveCursorToElement(newBlock);\n this.insertIndicator.show = false;\n this.onContentChange();\n this.cdr.detectChanges();\n }\n\n /**\n * Move cursor to the beginning of an element\n */\n private moveCursorToElement(element: HTMLElement): void {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.setStart(element, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n this.editorContent?.nativeElement.focus();\n }\n\n /**\n * Update image alignment from property sidebar\n */\n updateLayoutImageAlignment(\n alignment: 'inline' | 'wrap-left' | 'wrap-right' | 'break-left' | 'break-center' | 'break-right',\n ): void {\n if (!this.selectedLayoutElement || !this.currentStyles) return;\n\n // Find the image element (could be the element itself or inside a wrapper)\n const isImage = this.selectedLayoutElement.tagName === 'IMG';\n const isWrapper = this.selectedLayoutElement.classList.contains('resizable-wrapper');\n const wrapper = this.selectedLayoutElement.closest('.resizable-wrapper') as HTMLElement;\n\n let targetElement: HTMLElement;\n let imageElement: HTMLImageElement | null = null;\n\n if (isWrapper) {\n targetElement = this.selectedLayoutElement;\n imageElement = this.selectedLayoutElement.querySelector('img');\n } else if (isImage) {\n targetElement = wrapper || this.selectedLayoutElement;\n imageElement = this.selectedLayoutElement as HTMLImageElement;\n } else {\n return; // Not an image element\n }\n\n // Reset all styles\n targetElement.style.display = '';\n targetElement.style.float = 'none';\n targetElement.style.marginLeft = '';\n targetElement.style.marginRight = '';\n targetElement.style.marginBottom = '';\n targetElement.style.verticalAlign = '';\n targetElement.style.zIndex = '';\n targetElement.style.width = '';\n\n if (imageElement) {\n imageElement.style.display = '';\n imageElement.style.verticalAlign = '';\n }\n\n // Always keep position: relative for resize handles to work\n targetElement.style.position = 'relative';\n\n switch (alignment) {\n case 'inline':\n targetElement.style.display = 'inline-block';\n targetElement.style.verticalAlign = 'middle';\n if (imageElement) {\n imageElement.style.display = 'inline-block';\n imageElement.style.verticalAlign = 'middle';\n }\n break;\n\n case 'wrap-left':\n targetElement.style.display = 'block';\n targetElement.style.float = 'left';\n targetElement.style.marginRight = '15px';\n targetElement.style.marginBottom = '10px';\n targetElement.style.zIndex = '1';\n break;\n\n case 'wrap-right':\n targetElement.style.display = 'block';\n targetElement.style.float = 'right';\n targetElement.style.marginLeft = '15px';\n targetElement.style.marginBottom = '10px';\n targetElement.style.zIndex = '1';\n break;\n\n case 'break-left':\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginRight = 'auto';\n break;\n\n case 'break-center':\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginLeft = 'auto';\n targetElement.style.marginRight = 'auto';\n break;\n\n case 'break-right':\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginLeft = 'auto';\n targetElement.style.marginRight = '0';\n break;\n }\n\n this.currentStyles.imageAlign = alignment;\n this.onContentChange();\n\n // Update action buttons position after layout change\n requestAnimationFrame(() => {\n if (this.selectedLayoutElement) {\n this.positionElementActionButtons(this.selectedLayoutElement);\n this.cdr.detectChanges();\n }\n });\n }\n\n /**\n * Delete the selected layout element\n */\n deleteLayoutElement(): void {\n if (!this.selectedLayoutElement) return;\n\n // Direct DOM removal for layout elements (more predictable than execCommand)\n // execCommand('delete') can cause unexpected content merging with block elements\n this.selectedLayoutElement.remove();\n this.closePropertyEditor();\n this.onContentChange();\n }\n\n /**\n * Start dragging the selected layout element\n * Called when the move button is pressed\n */\n startLayoutElementDrag(event: MouseEvent): void {\n if (!this.selectedLayoutElement) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const element = this.selectedLayoutElement;\n\n // Calculate offset from mouse to element's top-left corner\n const elementRect = element.getBoundingClientRect();\n const offsetX = event.clientX - elementRect.left;\n const offsetY = event.clientY - elementRect.top;\n\n // Close property editor during drag\n this.closePropertyEditor();\n\n // Start the drag\n this.startLayoutDrag(element, event, offsetX, offsetY);\n }\n\n /**\n * Start mouse-based drag operation for layout element\n */\n private startLayoutDrag(\n element: HTMLElement,\n startEvent: MouseEvent,\n offsetX: number,\n offsetY: number\n ): void {\n // Save original position\n this.dragOriginalParent = element.parentElement;\n this.dragOriginalNextSibling = element.nextSibling;\n this.isDragging = true;\n this.lastDropIndicator = null;\n\n element.classList.add('dragging');\n\n // Create ghost element that follows cursor with actual element size\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n this.dragGhost = element.cloneNode(true) as HTMLElement;\n this.dragGhost.style.cssText = `\n position: fixed;\n pointer-events: none;\n opacity: 0.7;\n z-index: 10000;\n width: ${elementWidth}px;\n height: ${Math.min(elementHeight, 150)}px;\n overflow: hidden;\n border-radius: 4px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n `;\n document.body.appendChild(this.dragGhost);\n\n // Position ghost maintaining original offset from cursor\n this.dragGhost.style.left = `${startEvent.clientX - offsetX}px`;\n this.dragGhost.style.top = `${startEvent.clientY - offsetY}px`;\n\n // Store offset for mouse move handler\n const dragOffsetX = offsetX;\n const dragOffsetY = offsetY;\n const draggedElement = element;\n\n // Set up mouse move handler\n this.boundMouseMove = (e: MouseEvent) => {\n if (!this.isDragging || !this.dragGhost) return;\n\n // Move ghost - maintain original offset from cursor\n this.dragGhost.style.left = `${e.clientX - dragOffsetX}px`;\n this.dragGhost.style.top = `${e.clientY - dragOffsetY}px`;\n\n // Check if over editor and show drop indicator\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent) return;\n\n // Remove existing indicators\n const existingIndicator = editorContent.querySelector('.drop-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n this.lastDropIndicator = null;\n\n const editorRect = editorContent.getBoundingClientRect();\n const isOverEditor =\n e.clientX >= editorRect.left &&\n e.clientX <= editorRect.right &&\n e.clientY >= editorRect.top &&\n e.clientY <= editorRect.bottom;\n\n if (isOverEditor && draggedElement) {\n // Hide element temporarily to get accurate position\n const originalVisibility = draggedElement.style.visibility;\n draggedElement.style.visibility = 'hidden';\n\n // Get position\n const range = this.getRangeFromPoint(e.clientX, e.clientY);\n\n // Restore visibility\n draggedElement.style.visibility = originalVisibility;\n\n if (range && editorContent.contains(range.commonAncestorContainer)) {\n const indicator = document.createElement('span');\n indicator.className = 'drop-indicator';\n indicator.style.cssText = `\n display: inline-block;\n width: 2px;\n height: 20px;\n background: #3b82f6;\n margin: 0 2px;\n vertical-align: middle;\n `;\n range.insertNode(indicator);\n this.lastDropIndicator = indicator;\n }\n }\n };\n\n // Set up mouse up handler\n this.boundMouseUp = () => {\n if (!this.isDragging) return;\n\n // Clean up ghost\n if (this.dragGhost) {\n document.body.removeChild(this.dragGhost);\n this.dragGhost = null;\n }\n\n const editorContent = this.editorContent?.nativeElement;\n if (editorContent && draggedElement && this.lastDropIndicator) {\n // Use the saved drop indicator position\n const indicator = this.lastDropIndicator;\n const indicatorParent = indicator.parentNode;\n\n if (indicatorParent && editorContent.contains(indicatorParent)) {\n // Remove element from current position\n draggedElement.remove();\n\n // Insert element where the indicator is\n indicatorParent.insertBefore(draggedElement, indicator);\n\n // Remove the indicator\n indicator.remove();\n\n this.onContentChange();\n }\n } else if (editorContent) {\n // No valid drop position - just remove any indicators\n editorContent.querySelectorAll('.drop-indicator').forEach((el: Element) => el.remove());\n }\n\n // Clean up\n draggedElement.classList.remove('dragging');\n this.isDragging = false;\n this.dragOriginalParent = null;\n this.dragOriginalNextSibling = null;\n this.lastDropIndicator = null;\n\n // Remove listeners\n if (this.boundMouseMove) {\n document.removeEventListener('mousemove', this.boundMouseMove);\n this.boundMouseMove = null;\n }\n if (this.boundMouseUp) {\n document.removeEventListener('mouseup', this.boundMouseUp);\n this.boundMouseUp = null;\n }\n };\n\n // Add document-level listeners\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * Insert a new line (br or p) after the selected layout element\n */\n insertLineAfterLayoutElement(): void {\n if (!this.selectedLayoutElement) return;\n\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent) return;\n\n // Create a new paragraph element\n const newLine = document.createElement('p');\n newLine.innerHTML = '<br>';\n\n // Insert after the selected element\n const parent = this.selectedLayoutElement.parentNode;\n if (parent) {\n const nextSibling = this.selectedLayoutElement.nextSibling;\n if (nextSibling) {\n parent.insertBefore(newLine, nextSibling);\n } else {\n parent.appendChild(newLine);\n }\n\n // Move cursor to the new line\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.setStart(newLine, 0);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n // Focus editor\n editorContent.focus();\n }\n\n this.closePropertyEditor();\n this.onContentChange();\n }\n\n setTextColor(color: string): void {\n this.execCommand('foreColor', color);\n this.showTextColorPalette = false; // Close palette after selection\n }\n\n setBackgroundColor(color: string): void {\n this.execCommand('backColor', color);\n this.showBackgroundColorPalette = false; // Close palette after selection\n }\n\n insertLink(): void {\n this.editLink();\n }\n\n editLink(): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n // Find if we're inside an anchor tag\n const anchorElement = this.findParentAnchor(selection.anchorNode);\n\n if (anchorElement) {\n // Editing existing link\n const currentUrl = anchorElement.href;\n const newUrl = prompt('Edit URL:', currentUrl);\n if (newUrl !== null) {\n if (newUrl.trim() === '') {\n // Remove link\n this.execCommand('unlink');\n } else {\n anchorElement.href = newUrl;\n this.onContentChange();\n }\n }\n } else {\n // Creating new link\n const url = prompt('Enter URL:');\n if (url) {\n this.execCommand('createLink', url);\n }\n }\n }\n\n private findParentAnchor(node: Node | null): HTMLAnchorElement | null {\n while (node) {\n if (node.nodeName === 'A') {\n return node as HTMLAnchorElement;\n }\n node = node.parentNode;\n }\n return null;\n }\n\n insertImageUrl(): void {\n const url = prompt('Enter image URL:');\n if (url) {\n if (this.uploadApi && this.urlPrefix) {\n // Upload external URL to S3\n this.uploadImageFromUrl(url);\n } else {\n this.insertImage(url);\n }\n }\n }\n\n /**\n * Upload image from external URL to S3\n */\n private async uploadImageFromUrl(url: string): Promise<void> {\n // Save cursor position\n this.saveSelection();\n\n // Create placeholder with URL as filename\n const filename = url.split('/').pop()?.split('?')[0] || 'image';\n const placeholder = this.createUploadPlaceholder(new File([], filename));\n this.insertPlaceholderAtCursor(placeholder);\n\n try {\n // Fetch the image\n const response = await fetch(url, { mode: 'cors' });\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status}`);\n }\n const blob = await response.blob();\n\n // Determine filename with extension\n let finalFilename = filename;\n if (!finalFilename.includes('.')) {\n const contentType = response.headers.get('content-type');\n const ext = contentType?.split('/')[1] || 'jpg';\n finalFilename = `${finalFilename}.${ext}`;\n }\n\n // Create File object\n const file = new File([blob], finalFilename, { type: blob.type });\n\n // Upload using uploadApi\n const key = await new Promise<string>((resolve, reject) => {\n this.uploadApi!(file, this.keyPrefix).subscribe({\n next: (key) => resolve(key),\n error: (err) => reject(err),\n });\n });\n\n // Replace placeholder with uploaded image (with resize wrapper)\n const imageUrl = `${this.urlPrefix}/${key}`;\n this.replacePlaceholderWithImage(placeholder, imageUrl);\n\n this.uploadComplete.emit({ file, key });\n } catch (error) {\n console.error('Failed to upload image from URL:', url, error);\n // Show error on placeholder\n this.showPlaceholderError(\n placeholder,\n new File([], filename),\n error\n );\n }\n }\n\n insertImageFromInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files[0]) {\n this.insertImageFromFile(input.files[0]);\n }\n input.value = ''; // Reset input\n }\n\n private insertImageFromFile(file: File): void {\n // If uploadApi is provided, use server upload\n if (this.uploadApi && this.urlPrefix) {\n this.uploadImageToServer(file);\n } else {\n // Fallback to legacy Base64 approach\n this.insertImageAsBase64(file);\n }\n }\n\n // Legacy Base64 method (renamed from original insertImageFromFile)\n private insertImageAsBase64(file: File): void {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n this.insertImage(base64);\n };\n reader.readAsDataURL(file);\n }\n\n // Server upload method\n private uploadImageToServer(file: File): void {\n // 1. Save cursor position before any DOM manipulation\n this.saveSelection();\n\n // 2. Create and insert placeholder\n const placeholder = this.createUploadPlaceholder(file);\n const uploadId = placeholder.getAttribute('data-upload-id')!;\n\n // Insert placeholder at cursor position\n this.insertPlaceholderAtCursor(placeholder);\n\n // 3. Track upload state\n this.isUploading = true;\n this.uploadStart.emit(file);\n\n // 4. Start upload\n const subscription = this.uploadApi!(file, this.keyPrefix).subscribe({\n next: (key: string) => {\n // 5. Success: replace placeholder with actual image\n const imageUrl = `${this.urlPrefix}/${key}`;\n this.replacePlaceholderWithImage(placeholder, imageUrl);\n\n this.uploadComplete.emit({ file, key });\n this.uploadingImages.delete(uploadId);\n this.updateUploadingState();\n },\n error: (error: any) => {\n // 6. Error: show error state on placeholder\n this.showPlaceholderError(placeholder, file, error);\n\n this.uploadError.emit({ file, error });\n this.uploadingImages.delete(uploadId);\n this.updateUploadingState();\n },\n });\n\n // Store for potential cleanup\n this.uploadingImages.set(uploadId, { file, placeholder, subscription });\n }\n\n private generateUploadId(): string {\n return `upload-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private createUploadPlaceholder(file: File): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'resizable-wrapper upload-placeholder';\n wrapper.setAttribute('data-upload-id', this.generateUploadId());\n wrapper.style.cssText = `\n position: relative;\n display: inline-block;\n margin: 5px;\n min-width: 120px;\n min-height: 80px;\n background: linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%);\n border: 2px dashed #ccc;\n border-radius: 4px;\n overflow: hidden;\n `;\n\n // Loading indicator\n const loader = document.createElement('div');\n loader.className = 'upload-loader';\n loader.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n z-index: 2;\n `;\n loader.innerHTML = `\n <div class=\"upload-spinner\" style=\"\n width: 24px;\n height: 24px;\n border: 3px solid #e0e0e0;\n border-top-color: #3b82f6;\n border-radius: 50%;\n margin: 0 auto 8px;\n animation: wysiwyg-spin 1s linear infinite;\n \"></div>\n <div style=\"font-size: 12px; color: #666;\">Uploading...</div>\n <div style=\"font-size: 10px; color: #999; margin-top: 4px; max-width: 100px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">${file.name}</div>\n `;\n wrapper.appendChild(loader);\n\n // Preview thumbnail (for better UX)\n const preview = document.createElement('img');\n preview.className = 'upload-preview';\n preview.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0.3;\n border-radius: 4px;\n `;\n\n const reader = new FileReader();\n reader.onload = (e) => {\n preview.src = e.target?.result as string;\n // Adjust wrapper size based on preview\n preview.onload = () => {\n const aspectRatio = preview.naturalWidth / preview.naturalHeight;\n const maxWidth = 300;\n const width = Math.min(preview.naturalWidth, maxWidth);\n const height = width / aspectRatio;\n wrapper.style.width = `${width}px`;\n wrapper.style.height = `${height}px`;\n wrapper.style.minWidth = '';\n wrapper.style.minHeight = '';\n };\n };\n reader.readAsDataURL(file);\n wrapper.insertBefore(preview, loader);\n\n return wrapper;\n }\n\n private insertPlaceholderAtCursor(placeholder: HTMLElement): void {\n const selection = window.getSelection();\n let rangeToUse: Range | null = null;\n\n if (this.savedSelection) {\n rangeToUse = this.savedSelection;\n } else {\n const isSelectionInEditor =\n selection &&\n selection.rangeCount > 0 &&\n selection.anchorNode &&\n this.editorContent.nativeElement.contains(selection.anchorNode);\n\n if (isSelectionInEditor && selection) {\n rangeToUse = selection.getRangeAt(0).cloneRange();\n }\n }\n\n this.editorContent.nativeElement.focus();\n\n if (rangeToUse) {\n rangeToUse.deleteContents();\n rangeToUse.insertNode(placeholder);\n rangeToUse.setStartAfter(placeholder);\n rangeToUse.collapse(true);\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(rangeToUse);\n }\n this.savedSelection = null;\n } else {\n this.editorContent.nativeElement.appendChild(placeholder);\n }\n\n this.onContentChange();\n }\n\n private replacePlaceholderWithImage(\n placeholder: HTMLElement,\n src: string\n ): void {\n // Create the actual image element\n const img = document.createElement('img');\n img.src = src;\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n img.style.cursor = 'move';\n img.style.position = 'relative';\n img.style.display = 'inline-block';\n img.className = 'resizable-element resizable-setup';\n\n // Create wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'resizable-wrapper';\n wrapper.style.cssText = `\n position: relative;\n display: inline-block;\n margin: 5px;\n `;\n wrapper.appendChild(img);\n\n // Replace placeholder with actual image\n if (placeholder.parentNode) {\n placeholder.parentNode.replaceChild(wrapper, placeholder);\n }\n\n // Setup resize handles after image loads\n const handleImageLoad = () => {\n const editorWidth = this.editorContent.nativeElement.clientWidth;\n const maxWidth = editorWidth - 32;\n\n if (img.naturalWidth > maxWidth) {\n img.style.width = `${maxWidth}px`;\n img.style.height = 'auto';\n }\n\n this.addResizeHandlesToWrapper(wrapper, img);\n this.onContentChange();\n };\n\n if (img.complete && img.naturalWidth > 0) {\n handleImageLoad();\n } else {\n img.onload = handleImageLoad;\n img.onerror = () => {\n console.error('Failed to load uploaded image:', src);\n };\n }\n }\n\n private showPlaceholderError(\n placeholder: HTMLElement,\n file: File,\n error: any\n ): void {\n placeholder.classList.add('upload-error');\n placeholder.style.borderColor = '#ef4444';\n placeholder.style.background = '#fef2f2';\n\n const loader = placeholder.querySelector('.upload-loader');\n if (loader) {\n loader.innerHTML = `\n <div style=\"color: #ef4444; font-size: 24px;\">✕</div>\n <div style=\"font-size: 12px; color: #ef4444; margin-top: 8px;\">Upload failed</div>\n <div style=\"display: flex; gap: 4px; margin-top: 8px; justify-content: center;\">\n <button class=\"retry-btn\" style=\"\n padding: 4px 12px;\n font-size: 11px;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n \">Retry</button>\n <button class=\"remove-btn\" style=\"\n padding: 4px 12px;\n font-size: 11px;\n background: #ef4444;\n color: white;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n \">Remove</button>\n </div>\n `;\n\n // Add retry handler\n const retryBtn = loader.querySelector('.retry-btn');\n const removeBtn = loader.querySelector('.remove-btn');\n\n if (retryBtn) {\n retryBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n placeholder.remove();\n this.uploadImageToServer(file);\n });\n }\n\n if (removeBtn) {\n removeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n placeholder.remove();\n this.onContentChange();\n });\n }\n }\n }\n\n private updateUploadingState(): void {\n this.isUploading = this.uploadingImages.size > 0;\n }\n\n private cancelPendingUploads(): void {\n this.uploadingImages.forEach((data) => {\n if (data.subscription) {\n data.subscription.unsubscribe();\n }\n if (data.placeholder && data.placeholder.parentNode) {\n data.placeholder.remove();\n }\n });\n this.uploadingImages.clear();\n this.isUploading = false;\n }\n\n /**\n * Process external images in pasted HTML\n * Downloads external images, uploads to S3, and replaces src with CDN URL\n */\n private async processExternalImagesInHtml(\n container: HTMLElement\n ): Promise<void> {\n if (!this.uploadApi || !this.urlPrefix) return;\n\n const images = container.querySelectorAll('img');\n const uploadPromises: Promise<void>[] = [];\n\n images.forEach((img) => {\n const src = img.getAttribute('src');\n if (!src) return;\n\n // Skip if already using our CDN\n if (src.startsWith(this.urlPrefix!)) return;\n\n // Skip if it's a relative URL or blob URL\n if (\n src.startsWith('/') ||\n src.startsWith('blob:') ||\n src.startsWith('#')\n )\n return;\n\n // Process external URLs and data URLs (Base64)\n const isExternalUrl =\n src.startsWith('http://') || src.startsWith('https://');\n const isDataUrl = src.startsWith('data:');\n\n if (isExternalUrl || isDataUrl) {\n // Create placeholder for this image\n const placeholder = this.createInlineUploadPlaceholder();\n img.replaceWith(placeholder);\n\n const uploadPromise = this.fetchAndUploadImage(src, placeholder);\n uploadPromises.push(uploadPromise);\n }\n });\n\n // Wait for all uploads to complete\n await Promise.all(uploadPromises);\n }\n\n /**\n * Create an inline placeholder for images being uploaded within pasted HTML\n */\n private createInlineUploadPlaceholder(): HTMLElement {\n const placeholder = document.createElement('span');\n placeholder.className = 'inline-upload-placeholder';\n placeholder.style.cssText = `\n display: inline-block;\n min-width: 60px;\n min-height: 40px;\n padding: 8px 12px;\n background: linear-gradient(135deg, #f5f5f5 0%, #e8e8e8 100%);\n border: 1px dashed #ccc;\n border-radius: 4px;\n font-size: 11px;\n color: #666;\n text-align: center;\n vertical-align: middle;\n animation: wysiwyg-pulse 2s ease-in-out infinite;\n `;\n placeholder.innerHTML = `<span style=\"display:block;\">Uploading...</span>`;\n return placeholder;\n }\n\n /**\n * Fetch external image and upload to S3\n */\n private async fetchAndUploadImage(\n src: string,\n placeholder: HTMLElement\n ): Promise<void> {\n try {\n let blob: Blob;\n let filename: string;\n\n if (src.startsWith('data:')) {\n // Convert Base64 data URL to Blob\n const response = await fetch(src);\n blob = await response.blob();\n // Extract extension from MIME type\n const mimeMatch = src.match(/data:image\\/(\\w+)/);\n const ext = mimeMatch ? mimeMatch[1] : 'png';\n filename = `pasted-image-${Date.now()}.${ext}`;\n } else {\n // Fetch external URL\n const response = await fetch(src, { mode: 'cors' });\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status}`);\n }\n blob = await response.blob();\n // Extract filename from URL\n const urlParts = src.split('/');\n filename = urlParts[urlParts.length - 1].split('?')[0] || `image-${Date.now()}.jpg`;\n // Ensure it has an extension\n if (!filename.includes('.')) {\n const contentType = response.headers.get('content-type');\n const ext = contentType?.split('/')[1] || 'jpg';\n filename = `${filename}.${ext}`;\n }\n }\n\n // Create File object\n const file = new File([blob], filename, { type: blob.type });\n\n // Upload using uploadApi\n const key = await new Promise<string>((resolve, reject) => {\n this.uploadApi!(file, this.keyPrefix).subscribe({\n next: (key) => resolve(key),\n error: (err) => reject(err),\n });\n });\n\n // Replace placeholder with uploaded image\n const imageUrl = `${this.urlPrefix}/${key}`;\n const img = document.createElement('img');\n img.src = imageUrl;\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n\n if (placeholder.parentNode) {\n placeholder.parentNode.replaceChild(img, placeholder);\n }\n\n this.uploadComplete.emit({ file, key });\n } catch (error) {\n console.warn('Failed to upload external image:', src, error);\n // On failure, try to restore original image or show error\n if (src.startsWith('data:') || src.startsWith('http')) {\n // For data URLs or if we want to keep the original\n const img = document.createElement('img');\n img.src = src;\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n if (placeholder.parentNode) {\n placeholder.parentNode.replaceChild(img, placeholder);\n }\n } else {\n // Remove placeholder if we can't restore\n placeholder.remove();\n }\n }\n }\n\n private insertImage(src: string): void {\n console.log('[WYSIWYG DEBUG] insertImage called');\n console.log('[WYSIWYG DEBUG] savedSelection at start:', {\n hasSavedSelection: !!this.savedSelection,\n startContainer: this.savedSelection?.startContainer?.nodeName,\n startOffset: this.savedSelection?.startOffset,\n });\n\n const img = document.createElement('img');\n img.src = src;\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n img.style.cursor = 'move';\n img.style.position = 'relative';\n img.style.display = 'inline-block';\n img.className = 'resizable-element resizable-setup';\n\n // Create wrapper FIRST before inserting to DOM\n const wrapper = document.createElement('div');\n wrapper.className = 'resizable-wrapper';\n wrapper.style.cssText = `\n position: relative;\n display: inline-block;\n margin: 5px;\n `;\n\n // Put image inside wrapper BEFORE inserting to DOM\n wrapper.appendChild(img);\n\n // Insert the complete wrapper+image unit into the editor\n // Use saved selection (from blur event) or current selection\n const selection = window.getSelection();\n let rangeToUse: Range | null = null;\n\n // Priority 1: Use saved selection from blur event\n if (this.savedSelection) {\n rangeToUse = this.savedSelection;\n console.log('[WYSIWYG DEBUG] Using savedSelection');\n } else {\n // Priority 2: Use current selection if it's in the editor\n const isSelectionInEditor =\n selection &&\n selection.rangeCount > 0 &&\n selection.anchorNode &&\n this.editorContent.nativeElement.contains(selection.anchorNode);\n\n console.log('[WYSIWYG DEBUG] No savedSelection, checking current selection:', {\n isSelectionInEditor,\n });\n\n if (isSelectionInEditor && selection) {\n rangeToUse = selection.getRangeAt(0).cloneRange();\n console.log('[WYSIWYG DEBUG] Using current selection');\n }\n }\n\n console.log('[WYSIWYG DEBUG] rangeToUse:', {\n hasRange: !!rangeToUse,\n startContainer: rangeToUse?.startContainer?.nodeName,\n startOffset: rangeToUse?.startOffset,\n });\n\n // Focus the editor\n this.editorContent.nativeElement.focus();\n\n if (rangeToUse) {\n // Insert at the saved/current cursor position\n rangeToUse.deleteContents();\n rangeToUse.insertNode(wrapper);\n console.log('[WYSIWYG DEBUG] Inserted at cursor position');\n\n // Move cursor after the wrapper\n rangeToUse.setStartAfter(wrapper);\n rangeToUse.collapse(true);\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(rangeToUse);\n }\n\n // Clear saved selection after using it\n this.savedSelection = null;\n } else {\n // No valid selection - append to end\n console.log('[WYSIWYG DEBUG] No valid range, appending to end');\n this.editorContent.nativeElement.appendChild(wrapper);\n\n // Set cursor after the inserted image\n if (selection) {\n const range = document.createRange();\n range.setStartAfter(wrapper);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n\n // Ensure image doesn't exceed editor width when loaded\n const handleImageLoad = () => {\n const editorWidth = this.editorContent.nativeElement.clientWidth;\n const maxWidth = editorWidth - 32; // Subtract padding\n\n if (img.naturalWidth > maxWidth) {\n img.style.width = `${maxWidth}px`;\n img.style.height = 'auto';\n }\n\n // Add resize handles and dragging to the already-inserted wrapper\n this.addResizeHandlesToWrapper(wrapper, img);\n this.onContentChange();\n };\n\n // Handle both cached and non-cached images\n if (img.complete && img.naturalWidth > 0) {\n // Image is already loaded (cached)\n handleImageLoad();\n } else {\n // Image needs to load\n img.onload = handleImageLoad;\n img.onerror = (e) => {\n console.error('Failed to load image:', e);\n };\n }\n }\n\n /**\n * Handle external file drops (e.g., dropping image files from desktop)\n */\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Only handle external file drops - internal dragging uses mouse events\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n Array.from(files).forEach((file) => {\n if (file.type.startsWith('image/')) {\n this.insertImageFromFile(file);\n }\n });\n }\n }\n\n /**\n * Handle dragover for external file drops\n */\n onDragOver(event: DragEvent): void {\n // Allow drop for external files\n event.preventDefault();\n }\n\n private makeExistingImagesResizable(): void {\n if (!this.editorContent) return;\n\n const images = this.editorContent.nativeElement.querySelectorAll('img');\n images.forEach((img) => {\n if (!img.classList.contains('resizable-setup')) {\n this.makeResizable(img as HTMLElement);\n }\n });\n }\n\n private makeResizable(element: HTMLElement): void {\n if (element.classList.contains('resizable-setup')) return;\n\n // Check if element is inside the editor\n const isInEditor = this.editorContent?.nativeElement.contains(element);\n if (!isInEditor || !element.parentNode) {\n console.warn('Element is not in editor or has no parent');\n return;\n }\n\n element.classList.add('resizable-setup');\n element.style.position = 'relative';\n element.style.display = 'inline-block';\n\n // Wrap element in a container for better control\n const wrapper = document.createElement('div');\n wrapper.className = 'resizable-wrapper';\n wrapper.style.cssText = `\n position: relative;\n display: inline-block;\n margin: 5px;\n `;\n\n // Insert wrapper before element and move element into wrapper\n element.parentNode.insertBefore(wrapper, element);\n wrapper.appendChild(element);\n\n // Make image draggable\n this.makeImageDraggable(element, wrapper);\n\n // Add resize handles\n const handles = ['nw', 'ne', 'sw', 'se'];\n handles.forEach((position) => {\n const handle = document.createElement('div');\n handle.className = `resize-handle resize-${position}`;\n handle.style.cssText = `\n position: absolute;\n width: 8px;\n height: 8px;\n background: #3b82f6;\n border: 1px solid white;\n border-radius: 50%;\n display: none;\n z-index: 10;\n `;\n\n switch (position) {\n case 'nw':\n handle.style.top = '-4px';\n handle.style.left = '-4px';\n handle.style.cursor = 'nwse-resize';\n break;\n case 'ne':\n handle.style.top = '-4px';\n handle.style.right = '-4px';\n handle.style.cursor = 'nesw-resize';\n break;\n case 'sw':\n handle.style.bottom = '-4px';\n handle.style.left = '-4px';\n handle.style.cursor = 'nesw-resize';\n break;\n case 'se':\n handle.style.bottom = '-4px';\n handle.style.right = '-4px';\n handle.style.cursor = 'nwse-resize';\n break;\n }\n\n wrapper.appendChild(handle);\n\n handle.addEventListener('mousedown', (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const blockType = this.getBlockElementType(element);\n this.resizing = {\n element,\n wrapper,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: element.offsetWidth,\n startHeight: element.offsetHeight,\n type: blockType,\n aspectRatioLocked:\n blockType === 'image' || blockType === 'video' || blockType === 'iframe',\n };\n });\n });\n\n // Show/hide handles on hover\n wrapper.addEventListener('mouseenter', () => {\n if (!this.readonly && !this.disabled) {\n wrapper.querySelectorAll('.resize-handle').forEach((h) => {\n (h as HTMLElement).style.display = 'block';\n });\n wrapper.style.outlineColor = '#3b82f6';\n }\n });\n\n wrapper.addEventListener('mouseleave', () => {\n if (!this.resizing) {\n wrapper.querySelectorAll('.resize-handle').forEach((h) => {\n (h as HTMLElement).style.display = 'none';\n });\n wrapper.style.outlineColor = 'transparent';\n }\n });\n\n // Make element clickable - show popup toolbar on block element click\n element.addEventListener('click', (e: MouseEvent) => {\n // In layout mode, let the event bubble up to onLayoutElementClick\n if (this.showLayoutOutlines) {\n return; // Don't prevent default or stop propagation\n }\n e.preventDefault();\n e.stopPropagation();\n this.selectedElement = element;\n\n if (!this.readonly && !this.disabled) {\n this.showBlockPopupToolbar(element, wrapper);\n }\n });\n }\n\n /**\n * Add resize handles and dragging to an already-inserted wrapper.\n * This is called for newly inserted images where the wrapper is already in the DOM.\n */\n private addResizeHandlesToWrapper(wrapper: HTMLElement, element: HTMLElement): void {\n // Make element draggable\n this.makeBlockElementDraggable(element, wrapper);\n\n // Add resize handles\n const handles = ['nw', 'ne', 'sw', 'se'];\n handles.forEach((position) => {\n const handle = document.createElement('div');\n handle.className = `resize-handle resize-${position}`;\n handle.style.cssText = `\n position: absolute;\n width: 8px;\n height: 8px;\n background: #3b82f6;\n border: 1px solid white;\n border-radius: 50%;\n display: none;\n z-index: 10;\n `;\n\n switch (position) {\n case 'nw':\n handle.style.top = '-4px';\n handle.style.left = '-4px';\n handle.style.cursor = 'nwse-resize';\n break;\n case 'ne':\n handle.style.top = '-4px';\n handle.style.right = '-4px';\n handle.style.cursor = 'nesw-resize';\n break;\n case 'sw':\n handle.style.bottom = '-4px';\n handle.style.left = '-4px';\n handle.style.cursor = 'nesw-resize';\n break;\n case 'se':\n handle.style.bottom = '-4px';\n handle.style.right = '-4px';\n handle.style.cursor = 'nwse-resize';\n break;\n }\n\n wrapper.appendChild(handle);\n\n handle.addEventListener('mousedown', (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const blockType = this.getBlockElementType(element);\n this.resizing = {\n element,\n wrapper,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: element.offsetWidth,\n startHeight: element.offsetHeight,\n type: blockType,\n aspectRatioLocked:\n blockType === 'image' || blockType === 'video' || blockType === 'iframe',\n };\n });\n });\n\n // Show/hide handles on hover\n wrapper.addEventListener('mouseenter', () => {\n if (!this.readonly && !this.disabled) {\n wrapper.querySelectorAll('.resize-handle').forEach((h) => {\n (h as HTMLElement).style.display = 'block';\n });\n wrapper.style.outlineColor = '#3b82f6';\n }\n });\n\n wrapper.addEventListener('mouseleave', () => {\n if (!this.resizing) {\n wrapper.querySelectorAll('.resize-handle').forEach((h) => {\n (h as HTMLElement).style.display = 'none';\n });\n wrapper.style.outlineColor = 'transparent';\n }\n });\n\n // Make element clickable - show popup toolbar on block element click\n element.addEventListener('click', (e: MouseEvent) => {\n // In layout mode, let the event bubble up to onLayoutElementClick\n if (this.showLayoutOutlines) {\n return; // Don't prevent default or stop propagation\n }\n e.preventDefault();\n e.stopPropagation();\n this.selectedElement = element;\n\n if (!this.readonly && !this.disabled) {\n this.showBlockPopupToolbar(element, wrapper);\n }\n });\n }\n\n /**\n * Make an element draggable using mouse events (not HTML5 DnD API)\n * This gives us full control and works properly with Shadow DOM\n */\n private makeImageDraggable(image: HTMLElement, wrapper: HTMLElement): void {\n // Prevent default browser drag behavior\n wrapper.setAttribute('draggable', 'false');\n image.setAttribute('draggable', 'false');\n\n wrapper.addEventListener('mousedown', (e: MouseEvent) => {\n // Only handle left mouse button\n if (e.button !== 0) return;\n // Don't start drag if clicking on resize handles\n if ((e.target as HTMLElement).classList.contains('resize-handle')) return;\n if (this.resizing) return;\n\n e.preventDefault();\n this.prepareDrag(wrapper, image, e);\n });\n }\n\n /**\n * Prepare for potential drag - actual drag starts only after mouse moves\n */\n private prepareDrag(wrapper: HTMLElement, element: HTMLElement, startEvent: MouseEvent): void {\n const startX = startEvent.clientX;\n const startY = startEvent.clientY;\n const dragThreshold = 5; // Minimum pixels to move before starting drag\n let dragStarted = false;\n\n // Calculate offset from mouse to element's top-left corner\n const elementRect = element.getBoundingClientRect();\n const offsetX = startX - elementRect.left;\n const offsetY = startY - elementRect.top;\n\n const onMouseMove = (e: MouseEvent) => {\n const dx = Math.abs(e.clientX - startX);\n const dy = Math.abs(e.clientY - startY);\n\n // Start drag only after moving past threshold\n if (!dragStarted && (dx > dragThreshold || dy > dragThreshold)) {\n dragStarted = true;\n // Remove these temporary listeners\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n // Start actual drag with offset\n this.startMouseDrag(wrapper, element, e, offsetX, offsetY);\n }\n };\n\n const onMouseUp = () => {\n // Click without drag - clean up\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n }\n\n /**\n * Start mouse-based drag operation\n */\n private startMouseDrag(\n wrapper: HTMLElement,\n element: HTMLElement,\n startEvent: MouseEvent,\n offsetX: number,\n offsetY: number\n ): void {\n // Save original position\n this.dragOriginalParent = wrapper.parentElement;\n this.dragOriginalNextSibling = wrapper.nextSibling;\n this.draggedWrapper = wrapper;\n this.isDragging = true;\n this.lastDropIndicator = null;\n\n wrapper.classList.add('dragging');\n\n // Create ghost element that follows cursor with actual element size\n const elementWidth = element.offsetWidth;\n const elementHeight = element.offsetHeight;\n\n this.dragGhost = element.cloneNode(true) as HTMLElement;\n this.dragGhost.style.cssText = `\n position: fixed;\n pointer-events: none;\n opacity: 0.7;\n z-index: 10000;\n width: ${elementWidth}px;\n height: ${elementHeight}px;\n `;\n document.body.appendChild(this.dragGhost);\n\n // Position ghost maintaining original offset from cursor\n this.dragGhost.style.left = `${startEvent.clientX - offsetX}px`;\n this.dragGhost.style.top = `${startEvent.clientY - offsetY}px`;\n\n // Store offset for mouse move handler\n const dragOffsetX = offsetX;\n const dragOffsetY = offsetY;\n\n // Set up mouse move handler\n this.boundMouseMove = (e: MouseEvent) => {\n if (!this.isDragging || !this.dragGhost) return;\n\n // Move ghost - maintain original offset from cursor\n this.dragGhost.style.left = `${e.clientX - dragOffsetX}px`;\n this.dragGhost.style.top = `${e.clientY - dragOffsetY}px`;\n\n // Check if over editor and show drop indicator\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent) return;\n\n // Remove existing indicators (but save reference first if we need to track position)\n const existingIndicator = editorContent.querySelector('.drop-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n this.lastDropIndicator = null;\n\n const editorRect = editorContent.getBoundingClientRect();\n const isOverEditor =\n e.clientX >= editorRect.left &&\n e.clientX <= editorRect.right &&\n e.clientY >= editorRect.top &&\n e.clientY <= editorRect.bottom;\n\n if (isOverEditor && this.draggedWrapper) {\n // Hide wrapper temporarily to get accurate position\n const originalVisibility = this.draggedWrapper.style.visibility;\n this.draggedWrapper.style.visibility = 'hidden';\n\n // Get position\n const range = this.getRangeFromPoint(e.clientX, e.clientY);\n\n // Restore visibility\n this.draggedWrapper.style.visibility = originalVisibility;\n\n if (range && editorContent.contains(range.commonAncestorContainer)) {\n const indicator = document.createElement('span');\n indicator.className = 'drop-indicator';\n indicator.style.cssText = `\n display: inline-block;\n width: 2px;\n height: 20px;\n background: #3b82f6;\n margin: 0 2px;\n vertical-align: middle;\n `;\n range.insertNode(indicator);\n this.lastDropIndicator = indicator;\n }\n }\n };\n\n // Set up mouse up handler\n this.boundMouseUp = () => {\n if (!this.isDragging) return;\n\n // Clean up ghost\n if (this.dragGhost) {\n document.body.removeChild(this.dragGhost);\n this.dragGhost = null;\n }\n\n const editorContent = this.editorContent?.nativeElement;\n if (editorContent && this.draggedWrapper && this.lastDropIndicator) {\n // Use the saved drop indicator position\n const indicator = this.lastDropIndicator;\n const indicatorParent = indicator.parentNode;\n\n if (indicatorParent && editorContent.contains(indicatorParent)) {\n const wrapperToMove = this.draggedWrapper;\n\n // Remove wrapper from current position\n wrapperToMove.remove();\n\n // Insert wrapper where the indicator is\n indicatorParent.insertBefore(wrapperToMove, indicator);\n\n // Remove the indicator\n indicator.remove();\n\n this.onContentChange();\n }\n } else if (editorContent) {\n // No valid drop position - just remove any indicators\n editorContent.querySelectorAll('.drop-indicator').forEach((el: Element) => el.remove());\n }\n\n // Clean up\n if (this.draggedWrapper) {\n this.draggedWrapper.classList.remove('dragging');\n }\n this.isDragging = false;\n this.draggedWrapper = null;\n this.dragOriginalParent = null;\n this.dragOriginalNextSibling = null;\n this.lastDropIndicator = null;\n\n // Remove listeners\n if (this.boundMouseMove) {\n document.removeEventListener('mousemove', this.boundMouseMove);\n this.boundMouseMove = null;\n }\n if (this.boundMouseUp) {\n document.removeEventListener('mouseup', this.boundMouseUp);\n this.boundMouseUp = null;\n }\n };\n\n // Add document-level listeners\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n }\n\n /**\n * Clean up mouse drag listeners\n */\n private cleanupMouseDrag(): void {\n if (this.dragGhost && this.dragGhost.parentNode) {\n this.dragGhost.parentNode.removeChild(this.dragGhost);\n this.dragGhost = null;\n }\n if (this.boundMouseMove) {\n document.removeEventListener('mousemove', this.boundMouseMove);\n this.boundMouseMove = null;\n }\n if (this.boundMouseUp) {\n document.removeEventListener('mouseup', this.boundMouseUp);\n this.boundMouseUp = null;\n }\n this.isDragging = false;\n this.draggedWrapper = null;\n this.lastDropIndicator = null;\n }\n\n private getRangeFromPoint(x: number, y: number): Range | null {\n // For Shadow DOM, we need to use elementsFromPoint and find a suitable insertion point\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent) return null;\n\n // Get shadow root\n const rootNode = editorContent.getRootNode();\n if (!rootNode || !(rootNode instanceof ShadowRoot)) {\n // Fallback for non-shadow DOM\n if (document.caretRangeFromPoint) {\n return document.caretRangeFromPoint(x, y);\n }\n return null;\n }\n\n // Use elementFromPoint on shadow root\n const element = rootNode.elementFromPoint(x, y);\n\n if (!element || !editorContent.contains(element)) {\n return null;\n }\n\n // Create a range at the found element\n const range = document.createRange();\n\n // If element is a text node container, try to find insertion position\n if (element.childNodes.length > 0) {\n // Find the closest text node or element to insert before/after\n let bestNode: Node | null = null;\n let bestOffset = 0;\n\n // Check all child nodes to find the best insertion point\n for (let i = 0; i < element.childNodes.length; i++) {\n const child = element.childNodes[i];\n const rect = this.getNodeRect(child);\n\n if (rect) {\n if (y <= rect.bottom) {\n if (x <= rect.left + rect.width / 2) {\n // Insert before this node\n bestNode = element;\n bestOffset = i;\n break;\n } else if (i === element.childNodes.length - 1) {\n // Insert after last node\n bestNode = element;\n bestOffset = i + 1;\n break;\n }\n }\n }\n }\n\n if (bestNode) {\n range.setStart(bestNode, bestOffset);\n range.collapse(true);\n return range;\n }\n }\n\n // Default: insert at the beginning of the element\n range.setStart(element, 0);\n range.collapse(true);\n return range;\n }\n\n private getNodeRect(node: Node): DOMRect | null {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return (node as Element).getBoundingClientRect();\n } else if (node.nodeType === Node.TEXT_NODE) {\n const range = document.createRange();\n range.selectNodeContents(node);\n const rects = range.getClientRects();\n if (rects.length > 0) {\n return rects[0];\n }\n }\n return null;\n }\n\n /**\n * Determine the block element type from an HTML element\n */\n private getBlockElementType(element: HTMLElement): BlockElementType {\n const tagName = element.tagName.toLowerCase();\n switch (tagName) {\n case 'img':\n return 'image';\n case 'video':\n return 'video';\n case 'iframe':\n return 'iframe';\n case 'table':\n return 'table';\n case 'blockquote':\n return 'blockquote';\n case 'pre':\n return 'code-block';\n default:\n if (element.classList.contains('og-preview-card')) {\n return 'og-card';\n }\n return 'image'; // default fallback\n }\n }\n\n /**\n * Get alignment options based on block element type\n */\n private getAlignmentOptions(type: BlockElementType): AlignmentType[] {\n switch (type) {\n case 'image':\n case 'video':\n case 'iframe':\n case 'og-card':\n return ['inline', 'wrap-left', 'wrap-right', 'break-left', 'break-center', 'break-right'];\n case 'table':\n case 'blockquote':\n case 'code-block':\n return ['break-left', 'break-center', 'break-right'];\n default:\n return ['inline'];\n }\n }\n\n /**\n * Check if an element type supports resizing\n */\n private isResizable(type: BlockElementType): boolean {\n return ['image', 'video', 'iframe', 'table', 'og-card'].includes(type);\n }\n\n /**\n * Make a block element draggable using mouse events (same as makeImageDraggable)\n */\n private makeBlockElementDraggable(element: HTMLElement, wrapper: HTMLElement): void {\n // Prevent default browser drag behavior\n wrapper.setAttribute('draggable', 'false');\n element.setAttribute('draggable', 'false');\n\n wrapper.addEventListener('mousedown', (e: MouseEvent) => {\n // Only handle left mouse button\n if (e.button !== 0) return;\n // Don't start drag if clicking on resize handles\n if ((e.target as HTMLElement).classList.contains('resize-handle')) return;\n if (this.resizing) return;\n\n e.preventDefault();\n this.prepareDrag(wrapper, element, e);\n });\n }\n\n /**\n * Select a block element in the DOM so that keyboard actions (backspace/delete) will affect it\n */\n private selectBlockElement(wrapper: HTMLElement): void {\n // Ensure editor content has focus first\n this.editorContent?.nativeElement.focus();\n\n // For Shadow DOM, try to get selection from the shadow root\n const shadowRoot = this.editorContent?.nativeElement.getRootNode();\n let selection: Selection | null = null;\n\n if (shadowRoot && shadowRoot instanceof ShadowRoot) {\n selection = (shadowRoot as any).getSelection?.() || document.getSelection();\n } else {\n selection = window.getSelection();\n }\n\n if (!selection) {\n return;\n }\n\n // Create a range that selects the entire wrapper element\n const range = document.createRange();\n range.selectNode(wrapper);\n\n // Apply the selection\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n /**\n * Show popup toolbar for any block element\n */\n private showBlockPopupToolbar(element: HTMLElement, wrapper: HTMLElement): void {\n const blockType = this.getBlockElementType(element);\n\n // Store selected block info\n this.selectedBlock = {\n type: blockType,\n element,\n wrapper,\n resizable: this.isResizable(blockType),\n draggable: true,\n aspectRatioLocked: blockType === 'image' || blockType === 'video' || blockType === 'iframe',\n };\n\n // Select the wrapper element in DOM so backspace/delete will remove it\n this.selectBlockElement(wrapper);\n\n // Detect current alignment\n const computedStyle = window.getComputedStyle(wrapper);\n const displayStyle = computedStyle.display;\n const floatStyle = computedStyle.float;\n const marginLeft = computedStyle.marginLeft;\n const marginRight = computedStyle.marginRight;\n\n if (displayStyle === 'inline-block' || displayStyle === 'inline') {\n this.currentBlockAlign = 'inline';\n } else if (floatStyle === 'left') {\n this.currentBlockAlign = 'wrap-left';\n } else if (floatStyle === 'right') {\n this.currentBlockAlign = 'wrap-right';\n } else if (marginLeft === 'auto' && marginRight === 'auto') {\n this.currentBlockAlign = 'break-center';\n } else if (marginLeft === 'auto') {\n this.currentBlockAlign = 'break-right';\n } else {\n this.currentBlockAlign = 'break-left';\n }\n\n // Position toolbar above the element\n const elementRect = element.getBoundingClientRect();\n const containerElement = this.editorContent.nativeElement.closest(\n '.haloduck-wysiwyg-editor-container',\n ) as HTMLElement;\n const containerRect = containerElement.getBoundingClientRect();\n\n const toolbarWidth = 500;\n let x = elementRect.left - containerRect.left + elementRect.width / 2 - toolbarWidth / 2;\n let y = elementRect.top - containerRect.top - 55;\n\n const minX = 5;\n const maxX = containerRect.width - toolbarWidth - 5;\n x = Math.max(minX, Math.min(x, maxX));\n\n if (y < 5) {\n y = elementRect.bottom - containerRect.top + 5;\n }\n\n this.blockToolbarPosition = { x, y };\n this.showBlockToolbar = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Set alignment for the selected block element\n */\n setBlockAlignment(alignment: AlignmentType): void {\n if (!this.selectedBlock) return;\n\n const { wrapper, element } = this.selectedBlock;\n\n // Reset all styles\n wrapper.style.display = '';\n wrapper.style.float = 'none';\n wrapper.style.marginLeft = '';\n wrapper.style.marginRight = '';\n wrapper.style.marginBottom = '';\n wrapper.style.verticalAlign = '';\n wrapper.style.position = '';\n wrapper.style.zIndex = '';\n wrapper.style.width = '';\n element.style.display = '';\n element.style.verticalAlign = '';\n\n // Always keep position: relative for resize handles to work\n wrapper.style.position = 'relative';\n\n switch (alignment) {\n case 'inline':\n wrapper.style.display = 'inline-block';\n wrapper.style.verticalAlign = 'middle';\n element.style.display = 'inline-block';\n element.style.verticalAlign = 'middle';\n break;\n case 'wrap-left':\n wrapper.style.display = 'block';\n wrapper.style.float = 'left';\n wrapper.style.marginRight = '15px';\n wrapper.style.marginBottom = '10px';\n wrapper.style.zIndex = '1';\n break;\n case 'wrap-right':\n wrapper.style.display = 'block';\n wrapper.style.float = 'right';\n wrapper.style.marginLeft = '15px';\n wrapper.style.marginBottom = '10px';\n wrapper.style.zIndex = '1';\n break;\n case 'break-left':\n wrapper.style.display = 'block';\n wrapper.style.width = 'fit-content';\n wrapper.style.marginRight = 'auto';\n break;\n case 'break-center':\n wrapper.style.display = 'block';\n wrapper.style.width = 'fit-content';\n wrapper.style.marginLeft = 'auto';\n wrapper.style.marginRight = 'auto';\n break;\n case 'break-right':\n wrapper.style.display = 'block';\n wrapper.style.width = 'fit-content';\n wrapper.style.marginLeft = 'auto';\n wrapper.style.marginRight = '0';\n break;\n }\n\n this.currentBlockAlign = alignment;\n this.onContentChange();\n }\n\n /**\n * Delete the selected block element\n * Uses selection and execCommand to support undo/redo\n */\n deleteSelectedBlock(): void {\n if (!this.selectedBlock) return;\n\n const { wrapper } = this.selectedBlock;\n this.deleteElementWithUndo(wrapper);\n\n this.showBlockToolbar = false;\n this.selectedBlock = null;\n this.onContentChange();\n }\n\n /**\n * Delete an element while supporting undo/redo\n * by selecting it first and using execCommand\n */\n private deleteElementWithUndo(element: HTMLElement): void {\n const editorContent = this.editorContent?.nativeElement;\n if (!editorContent || !editorContent.contains(element)) {\n element.remove();\n return;\n }\n\n // Create a range that selects the entire element\n const range = document.createRange();\n range.selectNode(element);\n\n // Get the selection and set it to our range\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Use execCommand which integrates with undo/redo stack\n document.execCommand('delete', false);\n } else {\n // Fallback if selection API is not available\n element.remove();\n }\n }\n\n private showImagePopupToolbar(img: HTMLImageElement): void {\n // Don't show image popup toolbar in layout mode (use property sidebar instead)\n if (this.showLayoutOutlines) return;\n\n this.selectedImage = img;\n\n // Detect current alignment\n const wrapper = img.closest('.resizable-wrapper') as HTMLElement;\n const targetElement = wrapper || img;\n const computedStyle = window.getComputedStyle(targetElement);\n const displayStyle = computedStyle.display;\n const floatStyle = computedStyle.float;\n // Use inline styles for margin check since computedStyle converts 'auto' to pixel values\n const marginLeft = targetElement.style.marginLeft;\n const marginRight = targetElement.style.marginRight;\n\n // Determine current alignment\n if (displayStyle === 'inline-block' || displayStyle === 'inline') {\n this.currentImageAlign = 'inline';\n } else if (floatStyle === 'left') {\n this.currentImageAlign = 'wrap-left';\n } else if (floatStyle === 'right') {\n this.currentImageAlign = 'wrap-right';\n } else if (marginLeft === 'auto' && marginRight === 'auto') {\n this.currentImageAlign = 'break-center';\n } else if (marginLeft === 'auto' && (marginRight === '0' || marginRight === '0px' || marginRight === '')) {\n this.currentImageAlign = 'break-right';\n } else if (floatStyle === 'none' && displayStyle === 'block') {\n this.currentImageAlign = 'break-left';\n } else {\n this.currentImageAlign = 'inline';\n }\n\n // Position toolbar above the image\n const imgRect = img.getBoundingClientRect();\n const containerElement = this.editorContent.nativeElement.closest(\n '.haloduck-wysiwyg-editor-container',\n ) as HTMLElement;\n const containerRect = containerElement.getBoundingClientRect();\n\n // Calculate position relative to container (which includes toolbar area)\n // Toolbar width is 450px for 6 buttons, so we center it on the image\n const toolbarWidth = 450;\n let x = imgRect.left - containerRect.left + imgRect.width / 2 - toolbarWidth / 2;\n let y = imgRect.top - containerRect.top - 55; // 55px above the image\n\n // Keep toolbar within container bounds\n const minX = 5;\n const maxX = containerRect.width - toolbarWidth - 5;\n x = Math.max(minX, Math.min(x, maxX));\n\n // If toolbar would go above visible area, position it below the image instead\n if (y < 5) {\n y = imgRect.bottom - containerRect.top + 5;\n }\n\n this.imageToolbarPosition = { x, y };\n this.showImageToolbar = true;\n this.cdr.detectChanges();\n }\n\n setImageAlignment(\n alignment:\n | 'inline'\n | 'wrap-left'\n | 'wrap-right'\n | 'break-left'\n | 'break-center'\n | 'break-right',\n ): void {\n if (!this.selectedImage) return;\n\n const wrapper = this.selectedImage.closest('.resizable-wrapper') as HTMLElement;\n const targetElement = wrapper || this.selectedImage;\n\n // Reset all styles\n targetElement.style.display = '';\n targetElement.style.float = 'none';\n targetElement.style.marginLeft = '';\n targetElement.style.marginRight = '';\n targetElement.style.marginBottom = '';\n targetElement.style.verticalAlign = '';\n targetElement.style.zIndex = '';\n targetElement.style.width = '';\n this.selectedImage.style.display = '';\n this.selectedImage.style.verticalAlign = '';\n\n // Always keep position: relative for resize handles to work\n targetElement.style.position = 'relative';\n\n switch (alignment) {\n case 'inline':\n // Inline - 텍스트와 같은 줄\n targetElement.style.display = 'inline-block';\n targetElement.style.verticalAlign = 'middle';\n this.selectedImage.style.display = 'inline-block';\n this.selectedImage.style.verticalAlign = 'middle';\n break;\n\n case 'wrap-left':\n // Wrap Left - 이미지 왼쪽, 텍스트가 오른쪽 감쌈\n targetElement.style.display = 'block';\n targetElement.style.float = 'left';\n targetElement.style.marginRight = '15px';\n targetElement.style.marginBottom = '10px';\n targetElement.style.zIndex = '1';\n break;\n\n case 'wrap-right':\n // Wrap Right - 이미지 오른쪽, 텍스트가 왼쪽 감쌈\n targetElement.style.display = 'block';\n targetElement.style.float = 'right';\n targetElement.style.marginLeft = '15px';\n targetElement.style.marginBottom = '10px';\n targetElement.style.zIndex = '1';\n break;\n\n case 'break-left':\n // Break Left - 텍스트 분리, 이미지 왼쪽 정렬\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginRight = 'auto';\n break;\n\n case 'break-center':\n // Break Center - 텍스트 분리, 이미지 중앙 정렬\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginLeft = 'auto';\n targetElement.style.marginRight = 'auto';\n break;\n\n case 'break-right':\n // Break Right - 텍스트 분리, 이미지 오른쪽 정렬\n targetElement.style.display = 'block';\n targetElement.style.width = 'fit-content';\n targetElement.style.marginLeft = 'auto';\n targetElement.style.marginRight = '0';\n break;\n }\n\n this.currentImageAlign = alignment;\n this.onContentChange();\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (this.resizing) {\n event.preventDefault();\n\n const dx = event.clientX - this.resizing.startX;\n const dy = event.clientY - this.resizing.startY;\n\n const aspectRatio = this.resizing.startWidth / this.resizing.startHeight;\n let newWidth = this.resizing.startWidth + dx;\n let newHeight = newWidth / aspectRatio;\n\n // Get editor content width to limit image size\n const editorWidth = this.editorContent.nativeElement.clientWidth;\n const maxWidth = editorWidth - 32; // Subtract padding (1rem * 2 = 32px)\n\n newWidth = Math.max(50, Math.min(newWidth, maxWidth));\n newHeight = newWidth / aspectRatio;\n\n this.resizing.element.style.width = `${newWidth}px`;\n this.resizing.element.style.height = `${newHeight}px`;\n }\n }\n\n @HostListener('document:mouseup', ['$event'])\n onMouseUp(event: MouseEvent): void {\n if (this.resizing) {\n const wrapper = this.resizing.element.closest('.resizable-wrapper');\n if (wrapper) {\n wrapper.querySelectorAll('.resize-handle').forEach((h) => {\n (h as HTMLElement).style.display = 'none';\n });\n (wrapper as HTMLElement).style.outlineColor = 'transparent';\n }\n\n this.resizing = null;\n this.onContentChange();\n }\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n\n // Close block popup toolbar if clicking outside\n if (this.showBlockToolbar) {\n const isToolbarClick = target.closest('.block-popup-toolbar');\n const isBlockElementClick = target.closest('.resizable-wrapper');\n\n if (!isToolbarClick && !isBlockElementClick) {\n this.showBlockToolbar = false;\n this.selectedBlock = null;\n }\n }\n\n // Close image popup toolbar if clicking outside (legacy)\n if (this.showImageToolbar) {\n const isToolbarClick = target.closest('.image-popup-toolbar');\n const isImageClick = target.tagName === 'IMG' && target.classList.contains('resizable-setup');\n\n if (!isToolbarClick && !isImageClick) {\n this.showImageToolbar = false;\n this.selectedImage = null;\n }\n }\n\n if (this.selectedElement && !this.selectedElement.contains(event.target as Node)) {\n this.selectedElement = null;\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n // Delete selected block element with Backspace or Delete key\n if (this.selectedBlock && (event.key === 'Backspace' || event.key === 'Delete')) {\n // Prevent default only if we're deleting a selected block\n event.preventDefault();\n this.deleteSelectedBlock();\n }\n }\n\n // ControlValueAccessor implementation\n writeValue(value: any): void {\n this.value = value || '';\n if (this.editorContent) {\n this.editorContent.nativeElement.innerHTML = this.value;\n setTimeout(() => this.makeExistingImagesResizable(), 0);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n // Public methods\n getContent(): string {\n if (!this.editorContent) return '';\n\n // Clone the content to avoid modifying the original\n const clone = this.editorContent.nativeElement.cloneNode(true) as HTMLElement;\n\n // Remove resize handles and unwrap resizable wrappers\n const wrappers = clone.querySelectorAll('.resizable-wrapper');\n wrappers.forEach((wrapper) => {\n // Remove resize handles\n wrapper.querySelectorAll('.resize-handle').forEach((handle) => handle.remove());\n\n // Get the image inside\n const img = wrapper.querySelector('img');\n if (img && wrapper.parentNode) {\n const wrapperElement = wrapper as HTMLElement;\n\n // Remove resizable-setup class so it can be re-initialized when content is loaded again\n img.classList.remove('resizable-setup');\n\n // Copy alignment styles from wrapper to img\n // Copy display style\n if (wrapperElement.style.display) {\n img.style.display = wrapperElement.style.display;\n }\n\n // Copy float style\n if (wrapperElement.style.float && wrapperElement.style.float !== 'none') {\n img.style.float = wrapperElement.style.float;\n }\n\n // Copy margin styles\n if (wrapperElement.style.marginLeft) {\n img.style.marginLeft = wrapperElement.style.marginLeft;\n }\n if (wrapperElement.style.marginRight) {\n img.style.marginRight = wrapperElement.style.marginRight;\n }\n if (wrapperElement.style.marginTop) {\n img.style.marginTop = wrapperElement.style.marginTop;\n }\n if (wrapperElement.style.marginBottom) {\n img.style.marginBottom = wrapperElement.style.marginBottom;\n }\n\n // Copy vertical align\n if (wrapperElement.style.verticalAlign) {\n img.style.verticalAlign = wrapperElement.style.verticalAlign;\n }\n\n // Copy the width and height from the img to ensure they're preserved\n if (img.style.width) {\n img.setAttribute('width', img.style.width);\n }\n if (img.style.height) {\n img.setAttribute('height', img.style.height);\n }\n\n // Replace wrapper with just the img\n wrapper.parentNode.replaceChild(img, wrapper);\n }\n });\n\n // Clean up resizable-setup class from any remaining images (not in wrappers)\n clone.querySelectorAll('img.resizable-setup').forEach((img) => {\n img.classList.remove('resizable-setup');\n });\n\n // Apply inline styles to lists for consistent display outside the editor\n const uls = clone.querySelectorAll('ul');\n uls.forEach((ul: Element) => {\n const ulElement = ul as HTMLElement;\n ulElement.style.margin = '1em 0';\n ulElement.style.paddingLeft = '2em';\n ulElement.style.display = 'block';\n ulElement.style.listStyleType = 'disc';\n });\n\n const ols = clone.querySelectorAll('ol');\n ols.forEach((ol: Element) => {\n const olElement = ol as HTMLElement;\n olElement.style.margin = '1em 0';\n olElement.style.paddingLeft = '2em';\n olElement.style.display = 'block';\n olElement.style.listStyleType = 'decimal';\n });\n\n const lis = clone.querySelectorAll('li');\n lis.forEach((li: Element) => {\n const liElement = li as HTMLElement;\n liElement.style.margin = '0.5em 0';\n liElement.style.display = 'list-item';\n });\n\n // <meta charset=\"utf-8\">를 head에 포함한 전체 HTML 반환\n return `<!DOCTYPE html><html><head><meta charset=\"utf-8\">\n<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n<link href=\"https://fonts.googleapis.com/css2?family=Host+Grotesk:ital,wght@0,300..800;1,300..800&family=Noto+Sans+JP:wght@100..900&family=Noto+Sans+KR:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Noto+Serif+JP:wght@200..900&family=Noto+Serif+KR:wght@200..900&family=Noto+Serif:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n<link rel=\"stylesheet\" as=\"style\" crossorigin href=\"https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css\" />\n<style>\n body {\n font-family: 'Noto Sans KR', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 1rem;\n line-height: 1.6;\n color: #333;\n }\n h1 {\n font-size: 2em;\n margin: 0.67em 0;\n font-weight: bold;\n }\n h2 {\n font-size: 1.5em;\n margin: 0.75em 0;\n font-weight: bold;\n }\n h3 {\n font-size: 1.17em;\n margin: 0.83em 0;\n font-weight: bold;\n }\n h4 {\n font-size: 1em;\n margin: 1.12em 0;\n font-weight: bold;\n }\n h5 {\n font-size: 0.83em;\n margin: 1.5em 0;\n font-weight: bold;\n }\n h6 {\n font-size: 0.75em;\n margin: 1.67em 0;\n font-weight: bold;\n }\n p {\n margin: 1em 0;\n }\n ul, ol {\n margin: 1em 0;\n padding-left: 2em;\n }\n li {\n margin: 0.5em 0;\n }\n blockquote {\n margin: 1em 0;\n padding-left: 1em;\n border-left: 4px solid #d1d5db;\n color: #6b7280;\n }\n a {\n color: #3b82f6;\n text-decoration: underline;\n }\n a:hover {\n color: #2563eb;\n }\n img {\n max-width: 100%;\n height: auto;\n }\n strong, b {\n font-weight: bold;\n }\n em, i {\n font-style: italic;\n }\n u {\n text-decoration: underline;\n }\n s, strike, del {\n text-decoration: line-through;\n }\n sup {\n vertical-align: super;\n font-size: smaller;\n }\n sub {\n vertical-align: sub;\n font-size: smaller;\n }\n hr {\n border: none;\n border-top: 1px solid #d1d5db;\n margin: 1em 0;\n }\n pre {\n background: #f3f4f6;\n padding: 1em;\n border-radius: 0.375rem;\n overflow-x: auto;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n code {\n background: #f3f4f6;\n padding: 0.2em 0.4em;\n border-radius: 0.25rem;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.875em;\n }\n</style>\n</head><body>${clone.innerHTML}</body></html>`;\n }\n\n getText(): string {\n return this.editorContent ? this.editorContent.nativeElement.innerText : '';\n }\n\n /**\n * Set content in the editor.\n * Automatically extracts body content if a full HTML document is provided.\n */\n setContent(content: string): void {\n if (this.editorContent) {\n // Extract body content if full HTML document is provided\n const bodyContent = this.extractBodyContent(content);\n this.editorContent.nativeElement.innerHTML = bodyContent;\n setTimeout(() => this.makeExistingImagesResizable(), 0);\n this.onContentChange();\n }\n }\n\n /**\n * Extract body content from a string that might be a full HTML document.\n */\n private extractBodyContent(html: string): string {\n // Check if this looks like a full HTML document\n if (html.includes('<!DOCTYPE') || html.includes('<html') || html.includes('<head')) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n return doc.body.innerHTML;\n }\n return html;\n }\n\n /**\n * Get raw body content without the full HTML document wrapper.\n * Useful for internal operations or when you only need the content.\n */\n getRawContent(): string {\n if (!this.editorContent) return '';\n\n const clone = this.editorContent.nativeElement.cloneNode(true) as HTMLElement;\n\n // Remove resize handles and unwrap resizable wrappers\n const wrappers = clone.querySelectorAll('.resizable-wrapper');\n wrappers.forEach((wrapper) => {\n wrapper.querySelectorAll('.resize-handle').forEach((handle) => handle.remove());\n\n const innerElement = wrapper.querySelector('img, video, iframe, table, blockquote, pre');\n if (innerElement && wrapper.parentNode) {\n const wrapperElement = wrapper as HTMLElement;\n\n // Remove resizable-setup class so it can be re-initialized when content is loaded again\n innerElement.classList.remove('resizable-setup');\n\n // Copy styles to inner element\n if (wrapperElement.style.display) {\n (innerElement as HTMLElement).style.display = wrapperElement.style.display;\n }\n if (wrapperElement.style.float && wrapperElement.style.float !== 'none') {\n (innerElement as HTMLElement).style.float = wrapperElement.style.float;\n }\n if (wrapperElement.style.marginLeft) {\n (innerElement as HTMLElement).style.marginLeft = wrapperElement.style.marginLeft;\n }\n if (wrapperElement.style.marginRight) {\n (innerElement as HTMLElement).style.marginRight = wrapperElement.style.marginRight;\n }\n if (wrapperElement.style.verticalAlign) {\n (innerElement as HTMLElement).style.verticalAlign = wrapperElement.style.verticalAlign;\n }\n\n wrapper.parentNode.replaceChild(innerElement, wrapper);\n }\n });\n\n // Clean up resizable-setup class from any remaining images (not in wrappers)\n clone.querySelectorAll('img.resizable-setup').forEach((img) => {\n img.classList.remove('resizable-setup');\n });\n\n return clone.innerHTML;\n }\n\n clear(): void {\n if (this.editorContent) {\n this.editorContent.nativeElement.innerHTML = '';\n this.onContentChange();\n }\n }\n\n // 서버 API로 HTML을 보내 PDF를 다운로드하는 함수\n async exportToPDFViaApi(filename: string = 'exported.pdf'): Promise<void> {\n if (!this.editorContent) return;\n const html = this.getContent();\n if (!this.apiUrl) {\n alert('apiUrl이 설정되지 않았습니다.');\n return;\n }\n try {\n // 서버에서 {data: {key, url}} 형태로 응답\n const response: any = await firstValueFrom(\n this.http.post(this.apiUrl + '/tool/_exportPdf', { html }),\n );\n const fileUrl = response?.data?.url;\n if (!fileUrl) {\n alert('서버에서 파일 URL을 받지 못했습니다.');\n return;\n }\n // 파일 다운로드를 바로 시작 (새탭 X)\n const a = document.createElement('a');\n a.href = fileUrl;\n a.setAttribute('download', filename);\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n alert('PDF 다운로드 완료');\n } catch (error) {\n alert('PDF 변환 또는 다운로드 실패');\n console.error(error);\n }\n }\n\n async exportToPDF(filename: string = 'document.pdf'): Promise<void> {\n if (!this.editorContent) return;\n\n try {\n // Create a clean version for PDF export\n const exportContainer = document.createElement('div');\n exportContainer.style.cssText = `\n position: absolute;\n left: -9999px;\n top: 0;\n width: 800px;\n padding: 20px;\n background: white;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n `;\n\n // Get clean HTML without wrappers\n const cleanHtml = this.getContent();\n exportContainer.innerHTML = cleanHtml;\n\n // Debug: Log image information\n const images = exportContainer.querySelectorAll('img');\n images.forEach((img: HTMLImageElement, index) => {\n // Ensure all images are visible and have proper styles\n img.style.display = 'block';\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n img.style.margin = '10px 0';\n\n // Remove any width/height attributes that might interfere\n if (!img.src.startsWith('data:')) {\n console.warn('⚠️ Non-base64 image detected:', img.src.substring(0, 100));\n }\n });\n\n document.body.appendChild(exportContainer);\n\n // Wait for images to load\n await this.waitForImagesToLoad(exportContainer);\n\n const canvas = await html2canvas(exportContainer, {\n scale: 2,\n useCORS: true,\n allowTaint: true,\n logging: true,\n backgroundColor: '#ffffff',\n imageTimeout: 0,\n removeContainer: false,\n });\n\n // Remove temporary container\n document.body.removeChild(exportContainer);\n\n const imgData = canvas.toDataURL('image/png');\n\n const pdf = new jsPDF({\n orientation: 'portrait',\n unit: 'mm',\n format: 'a4',\n });\n\n const imgWidth = 210;\n const pageHeight = 297;\n const imgHeight = (canvas.height * imgWidth) / canvas.width;\n let heightLeft = imgHeight;\n let position = 0;\n\n pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n heightLeft -= pageHeight;\n\n while (heightLeft > 0) {\n position = heightLeft - imgHeight;\n pdf.addPage();\n pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n heightLeft -= pageHeight;\n }\n\n pdf.save(filename);\n } catch (error) {\n console.error('❌ Error exporting to PDF:', error);\n throw error;\n }\n }\n\n private async waitForImagesToLoad(container: HTMLElement): Promise<void> {\n const images = Array.from(container.querySelectorAll('img'));\n if (images.length === 0) {\n return Promise.resolve();\n }\n\n const promises = images.map((img: HTMLImageElement) => {\n if (img.complete) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => {\n console.warn('Image failed to load:', img.src);\n resolve(); // Continue even if image fails\n };\n // Timeout after 10 seconds\n setTimeout(() => resolve(), 10000);\n });\n });\n\n await Promise.all(promises);\n }\n\n focus(): void {\n if (this.editorContent) {\n this.editorContent.nativeElement.focus();\n }\n }\n}\n","<div class=\"haloduck-wysiwyg-editor-wrapper\">\n <label #label class=\"block text-sm/6 font-medium text-light-on-control dark:text-dark-on-control\">\n <ng-content></ng-content>\n </label>\n\n <div class=\"haloduck-wysiwyg-editor-container\" [class.disabled]=\"disabled\">\n <!-- Toolbar -->\n @if (!readonly) {\n <div class=\"toolbar\" (mousedown)=\"onToolbarMouseDown($event)\">\n <!-- Layout mode toggle -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n [class.active]=\"showLayoutOutlines\"\n (click)=\"toggleLayoutMode()\"\n title=\"Show Layout\"\n >\n <span [innerHTML]=\"icons.layoutGrid\"></span>\n </button>\n </div>\n\n <!-- Undo/Redo -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('undo')\"\n title=\"Undo (Ctrl+Z)\"\n >\n <span [innerHTML]=\"icons.undo\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('redo')\"\n title=\"Redo (Ctrl+Y)\"\n >\n <span [innerHTML]=\"icons.redo\"></span>\n </button>\n </div>\n\n <!-- Text formatting -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('bold')\"\n title=\"Bold (Ctrl+B)\"\n >\n <span [innerHTML]=\"icons.bold\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('italic')\"\n title=\"Italic (Ctrl+I)\"\n >\n <span [innerHTML]=\"icons.italic\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('underline')\"\n title=\"Underline (Ctrl+U)\"\n >\n <span [innerHTML]=\"icons.underline\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('strikeThrough')\"\n title=\"Strikethrough\"\n >\n <span [innerHTML]=\"icons.strikethrough\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('superscript')\"\n title=\"Superscript\"\n >\n <span [innerHTML]=\"icons.superscript\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('subscript')\"\n title=\"Subscript\"\n >\n <span [innerHTML]=\"icons.subscript\"></span>\n </button>\n </div>\n\n <!-- Font family -->\n <div class=\"toolbar-group\">\n <select\n class=\"toolbar-select\"\n (change)=\"setFontFamily($any($event.target).value)\"\n title=\"Font Family\"\n >\n <option value=\"\">Font</option>\n @for (font of fontFamilies; track font) {\n <option [value]=\"font\">{{ font }}</option>\n }\n </select>\n </div>\n\n <!-- Font size -->\n <div class=\"toolbar-group\">\n <select\n class=\"toolbar-select\"\n (change)=\"setFontSize($any($event.target).value)\"\n title=\"Font Size\"\n >\n <option value=\"\">Size</option>\n @for (size of fontSizes; track size) {\n <option [value]=\"size\">{{ size }}</option>\n }\n </select>\n </div>\n\n <!-- Text color -->\n <div class=\"toolbar-group color-picker-group\">\n <div class=\"color-picker-wrapper\">\n <button\n type=\"button\"\n class=\"toolbar-btn color-btn\"\n (click)=\"toggleTextColorPalette()\"\n title=\"Text Color\"\n >\n <span [innerHTML]=\"icons.textColor\"></span>\n </button>\n @if (showTextColorPalette) {\n <div class=\"color-palette\">\n @for (color of colors; track color) {\n <button\n type=\"button\"\n class=\"color-option\"\n [style.background-color]=\"color\"\n (click)=\"setTextColor(color)\"\n [title]=\"color\"\n ></button>\n }\n </div>\n }\n </div>\n\n <div class=\"color-picker-wrapper\">\n <button\n type=\"button\"\n class=\"toolbar-btn color-btn\"\n (click)=\"toggleBackgroundColorPalette()\"\n title=\"Background Color\"\n >\n <span [innerHTML]=\"icons.highlighter\"></span>\n </button>\n @if (showBackgroundColorPalette) {\n <div class=\"color-palette\">\n @for (color of colors; track color) {\n <button\n type=\"button\"\n class=\"color-option\"\n [style.background-color]=\"color\"\n (click)=\"setBackgroundColor(color)\"\n [title]=\"color\"\n ></button>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Alignment -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('justifyLeft')\"\n title=\"Align Left\"\n >\n <span [innerHTML]=\"icons.alignLeft\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('justifyCenter')\"\n title=\"Align Center\"\n >\n <span [innerHTML]=\"icons.alignCenter\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('justifyRight')\"\n title=\"Align Right\"\n >\n <span [innerHTML]=\"icons.alignRight\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('justifyFull')\"\n title=\"Justify\"\n >\n <span [innerHTML]=\"icons.alignJustify\"></span>\n </button>\n </div>\n\n <!-- Lists -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('insertUnorderedList')\"\n title=\"Bullet List\"\n >\n <span [innerHTML]=\"icons.listBullet\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('insertOrderedList')\"\n title=\"Numbered List\"\n >\n <span [innerHTML]=\"icons.listOrdered\"></span>\n </button>\n </div>\n\n <!-- Indentation -->\n <div class=\"toolbar-group\">\n <button type=\"button\" class=\"toolbar-btn\" (click)=\"execCommand('indent')\" title=\"Indent\">\n <span [innerHTML]=\"icons.indentIncrease\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('outdent')\"\n title=\"Outdent\"\n >\n <span [innerHTML]=\"icons.indentDecrease\"></span>\n </button>\n </div>\n\n <!-- Insert -->\n <div class=\"toolbar-group\">\n <button type=\"button\" class=\"toolbar-btn\" (click)=\"insertLink()\" title=\"Insert Link\">\n <span [innerHTML]=\"icons.link\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n title=\"Insert Image\"\n (click)=\"imageInput.click()\"\n >\n <span [innerHTML]=\"icons.image\"></span>\n <input\n #imageInput\n type=\"file\"\n accept=\"image/*\"\n style=\"display: none\"\n (change)=\"insertImageFromInput($event)\"\n />\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"insertImageUrl()\"\n title=\"Insert Image URL\"\n >\n <span [innerHTML]=\"icons.imagePlus\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('insertHorizontalRule')\"\n title=\"Horizontal Rule\"\n >\n <span [innerHTML]=\"icons.minus\"></span>\n </button>\n </div>\n\n <!-- Format -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('formatBlock', 'h1')\"\n title=\"Heading 1\"\n >\n <span [innerHTML]=\"icons.heading1\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('formatBlock', 'h2')\"\n title=\"Heading 2\"\n >\n <span [innerHTML]=\"icons.heading2\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('formatBlock', 'h3')\"\n title=\"Heading 3\"\n >\n <span [innerHTML]=\"icons.heading3\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('formatBlock', 'p')\"\n title=\"Paragraph\"\n >\n <span [innerHTML]=\"icons.paragraph\"></span>\n </button>\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('formatBlock', 'blockquote')\"\n title=\"Blockquote\"\n >\n <span [innerHTML]=\"icons.quote\"></span>\n </button>\n </div>\n\n <!-- Clear formatting -->\n <div class=\"toolbar-group\">\n <button\n type=\"button\"\n class=\"toolbar-btn\"\n (click)=\"execCommand('removeFormat')\"\n title=\"Clear Formatting\"\n >\n <span [innerHTML]=\"icons.eraser\"></span>\n </button>\n </div>\n </div>\n }\n\n <!-- Editor area with optional sidebar -->\n <div class=\"editor-main-area\">\n <!-- Editor content wrapper -->\n <div\n class=\"editor-content-wrapper\"\n (mousemove)=\"onEditorMouseMove($event)\"\n (mouseleave)=\"onEditorMouseLeave()\"\n >\n <!-- Editor content area -->\n <div\n #editorContent\n class=\"editor-content\"\n [attr.contenteditable]=\"!disabled && !readonly\"\n [style.height]=\"height\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (blur)=\"saveSelection()\"\n (mouseup)=\"onEditorMouseUp()\"\n (keydown)=\"onEditorKeyDown($event)\"\n (keyup)=\"onEditorKeyUp($event)\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (click)=\"onLayoutElementClick($event)\"\n ></div>\n\n <!-- Insert Indicator (horizontal line with plus button) -->\n @if (insertIndicator.show) {\n <div\n class=\"insert-indicator\"\n [style.top.px]=\"insertIndicator.top\"\n (click)=\"insertBlockAtIndicator()\"\n >\n <div class=\"insert-line\"></div>\n <div class=\"insert-button\">\n <span [innerHTML]=\"icons.plus\"></span>\n </div>\n </div>\n }\n\n <!-- Layout Legend -->\n @if (showLayoutOutlines) {\n <div class=\"layout-legend\">\n <span class=\"legend-item\"><span class=\"legend-color legend-p\"></span>p</span>\n <span class=\"legend-item\"><span class=\"legend-color legend-div\"></span>div</span>\n <span class=\"legend-item\"><span class=\"legend-color legend-span\"></span>span</span>\n <span class=\"legend-item\"\n ><span class=\"legend-color legend-heading\"></span>heading</span\n >\n <span class=\"legend-item\"><span class=\"legend-color legend-list\"></span>list</span>\n <span class=\"legend-item\"><span class=\"legend-color legend-table\"></span>table</span>\n <span class=\"legend-item\"><span class=\"legend-color legend-quote\"></span>quote</span>\n <span class=\"legend-item\"><span class=\"legend-color legend-code\"></span>code</span>\n </div>\n }\n </div>\n\n <!-- Property Editor Sidebar (Right) -->\n @if (showPropertyEditor && selectedLayoutElement && currentStyles) {\n <div class=\"property-sidebar\" (click)=\"$event.stopPropagation()\">\n <!-- Header with close button -->\n <div class=\"property-sidebar-header\">\n <span class=\"property-sidebar-title\">{{\n selectedLayoutElement.tagName.toLowerCase()\n }}</span>\n <button type=\"button\" class=\"property-sidebar-close\" (click)=\"closePropertyEditor()\">\n ×\n </button>\n </div>\n\n <!-- Tab navigation -->\n <div class=\"property-tabs\">\n <button\n type=\"button\"\n class=\"property-tab-btn\"\n [class.active]=\"activePropertyTab === 'layout'\"\n (click)=\"activePropertyTab = 'layout'\"\n >\n 레이아웃\n </button>\n <button\n type=\"button\"\n class=\"property-tab-btn\"\n [class.active]=\"activePropertyTab === 'color'\"\n (click)=\"activePropertyTab = 'color'\"\n >\n 색상\n </button>\n <button\n type=\"button\"\n class=\"property-tab-btn\"\n [class.active]=\"activePropertyTab === 'typography'\"\n (click)=\"activePropertyTab = 'typography'\"\n >\n 글꼴\n </button>\n </div>\n\n <!-- Tab content -->\n <div class=\"property-tab-content\">\n @switch (activePropertyTab) {\n @case ('layout') {\n <!-- Display -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Display</div>\n <div class=\"property-input\">\n <label>Type</label>\n <select\n [value]=\"currentStyles.display\"\n (change)=\"updateElementStyle('display', $any($event.target).value)\"\n >\n <option value=\"block\">block</option>\n <option value=\"inline\">inline</option>\n <option value=\"inline-block\">inline-block</option>\n <option value=\"flex\">flex</option>\n <option value=\"grid\">grid</option>\n <option value=\"none\">none</option>\n </select>\n </div>\n @if (\n currentStyles.display === 'flex' || currentStyles.display === 'inline-flex'\n ) {\n <div class=\"property-input\">\n <label>Direction</label>\n <select\n [value]=\"currentStyles.flexDirection\"\n (change)=\"updateElementStyle('flexDirection', $any($event.target).value)\"\n >\n <option value=\"row\">row</option>\n <option value=\"row-reverse\">row-reverse</option>\n <option value=\"column\">column</option>\n <option value=\"column-reverse\">column-reverse</option>\n </select>\n </div>\n <div class=\"property-input\">\n <label>Justify</label>\n <select\n [value]=\"currentStyles.justifyContent\"\n (change)=\"updateElementStyle('justifyContent', $any($event.target).value)\"\n >\n <option value=\"flex-start\">flex-start</option>\n <option value=\"flex-end\">flex-end</option>\n <option value=\"center\">center</option>\n <option value=\"space-between\">space-between</option>\n <option value=\"space-around\">space-around</option>\n <option value=\"space-evenly\">space-evenly</option>\n </select>\n </div>\n <div class=\"property-input\">\n <label>Align</label>\n <select\n [value]=\"currentStyles.alignItems\"\n (change)=\"updateElementStyle('alignItems', $any($event.target).value)\"\n >\n <option value=\"stretch\">stretch</option>\n <option value=\"flex-start\">flex-start</option>\n <option value=\"flex-end\">flex-end</option>\n <option value=\"center\">center</option>\n <option value=\"baseline\">baseline</option>\n </select>\n </div>\n }\n <div class=\"property-input\">\n <label>Gap</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.gap\"\n (change)=\"updateElementStyle('gap', $any($event.target).value)\"\n />\n </div>\n </div>\n <!-- Image Alignment (only for images) -->\n @if (currentStyles.imageAlign !== null) {\n <div class=\"property-group\">\n <div class=\"property-group-title\">정렬</div>\n <div class=\"align-btn-grid\">\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'inline'\"\n (click)=\"updateLayoutImageAlignment('inline')\"\n title=\"Inline\"\n >\n <span [innerHTML]=\"icons.typeInline\"></span>\n </button>\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'wrap-left'\"\n (click)=\"updateLayoutImageAlignment('wrap-left')\"\n title=\"Wrap Left\"\n >\n <span [innerHTML]=\"icons.wrapLeft\"></span>\n </button>\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'wrap-right'\"\n (click)=\"updateLayoutImageAlignment('wrap-right')\"\n title=\"Wrap Right\"\n >\n <span [innerHTML]=\"icons.wrapRight\"></span>\n </button>\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'break-left'\"\n (click)=\"updateLayoutImageAlignment('break-left')\"\n title=\"Break Left\"\n >\n <span [innerHTML]=\"icons.breakLeft\"></span>\n </button>\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'break-center'\"\n (click)=\"updateLayoutImageAlignment('break-center')\"\n title=\"Break Center\"\n >\n <span [innerHTML]=\"icons.breakCenter\"></span>\n </button>\n <button\n type=\"button\"\n class=\"align-btn\"\n [class.active]=\"currentStyles.imageAlign === 'break-right'\"\n (click)=\"updateLayoutImageAlignment('break-right')\"\n title=\"Break Right\"\n >\n <span [innerHTML]=\"icons.breakRight\"></span>\n </button>\n </div>\n </div>\n }\n <!-- Size -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Size</div>\n <div class=\"property-row-2\">\n <div class=\"property-input\">\n <label>W</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.width\"\n (change)=\"updateElementStyle('width', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>H</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.height\"\n (change)=\"updateElementStyle('height', $any($event.target).value)\"\n />\n </div>\n </div>\n </div>\n <!-- Padding -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Padding</div>\n <div class=\"property-row-4\">\n <div class=\"property-input\">\n <label>T</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.paddingTop\"\n (change)=\"updateElementStyle('paddingTop', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>R</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.paddingRight\"\n (change)=\"updateElementStyle('paddingRight', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>B</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.paddingBottom\"\n (change)=\"updateElementStyle('paddingBottom', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>L</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.paddingLeft\"\n (change)=\"updateElementStyle('paddingLeft', $any($event.target).value)\"\n />\n </div>\n </div>\n </div>\n <!-- Margin -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Margin</div>\n <div class=\"property-row-4\">\n <div class=\"property-input\">\n <label>T</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.marginTop\"\n (change)=\"updateElementStyle('marginTop', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>R</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.marginRight\"\n (change)=\"updateElementStyle('marginRight', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>B</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.marginBottom\"\n (change)=\"updateElementStyle('marginBottom', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>L</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.marginLeft\"\n (change)=\"updateElementStyle('marginLeft', $any($event.target).value)\"\n />\n </div>\n </div>\n </div>\n <!-- Border -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Border Width</div>\n <div class=\"property-row-4\">\n <div class=\"property-input\">\n <label>T</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderTopWidth\"\n (change)=\"updateElementStyle('borderTopWidth', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>R</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderRightWidth\"\n (change)=\"updateElementStyle('borderRightWidth', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>B</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderBottomWidth\"\n (change)=\"\n updateElementStyle('borderBottomWidth', $any($event.target).value)\n \"\n />\n </div>\n <div class=\"property-input\">\n <label>L</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderLeftWidth\"\n (change)=\"updateElementStyle('borderLeftWidth', $any($event.target).value)\"\n />\n </div>\n </div>\n <div class=\"property-input\">\n <label>Style</label>\n <select\n [value]=\"currentStyles.borderStyle\"\n (change)=\"updateElementStyle('borderStyle', $any($event.target).value)\"\n >\n <option value=\"none\">none</option>\n <option value=\"solid\">solid</option>\n <option value=\"dashed\">dashed</option>\n <option value=\"dotted\">dotted</option>\n </select>\n </div>\n </div>\n <!-- Border Radius -->\n <div class=\"property-group\">\n <div class=\"property-group-title\">Border Radius</div>\n <div class=\"property-row-4\">\n <div class=\"property-input\">\n <label>TL</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderTopLeftRadius\"\n (change)=\"\n updateElementStyle('borderTopLeftRadius', $any($event.target).value)\n \"\n />\n </div>\n <div class=\"property-input\">\n <label>TR</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderTopRightRadius\"\n (change)=\"\n updateElementStyle('borderTopRightRadius', $any($event.target).value)\n \"\n />\n </div>\n <div class=\"property-input\">\n <label>BR</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderBottomRightRadius\"\n (change)=\"\n updateElementStyle('borderBottomRightRadius', $any($event.target).value)\n \"\n />\n </div>\n <div class=\"property-input\">\n <label>BL</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.borderBottomLeftRadius\"\n (change)=\"\n updateElementStyle('borderBottomLeftRadius', $any($event.target).value)\n \"\n />\n </div>\n </div>\n </div>\n }\n @case ('color') {\n <div class=\"property-input color-input\">\n <label>Color</label>\n <input\n type=\"color\"\n [value]=\"currentStyles.color || '#000000'\"\n (change)=\"updateElementStyle('color', $any($event.target).value)\"\n />\n <input\n type=\"text\"\n [value]=\"currentStyles.color\"\n placeholder=\"미설정\"\n (change)=\"updateElementStyle('color', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input color-input\">\n <label>Background</label>\n <input\n type=\"color\"\n [value]=\"currentStyles.backgroundColor || '#ffffff'\"\n (change)=\"updateElementStyle('backgroundColor', $any($event.target).value)\"\n />\n <input\n type=\"text\"\n [value]=\"currentStyles.backgroundColor\"\n placeholder=\"미설정\"\n (change)=\"updateElementStyle('backgroundColor', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input color-input\">\n <label>Border</label>\n <input\n type=\"color\"\n [value]=\"currentStyles.borderColor || '#000000'\"\n (change)=\"updateElementStyle('borderColor', $any($event.target).value)\"\n />\n <input\n type=\"text\"\n [value]=\"currentStyles.borderColor\"\n placeholder=\"미설정\"\n (change)=\"updateElementStyle('borderColor', $any($event.target).value)\"\n />\n </div>\n }\n @case ('typography') {\n <div class=\"property-input\">\n <label>Font Size</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.fontSize\"\n (change)=\"updateElementStyle('fontSize', $any($event.target).value)\"\n />\n </div>\n <div class=\"property-input\">\n <label>Font Weight</label>\n <select\n [value]=\"currentStyles.fontWeight\"\n (change)=\"updateElementStyle('fontWeight', $any($event.target).value)\"\n >\n <option value=\"100\">100</option>\n <option value=\"200\">200</option>\n <option value=\"300\">300</option>\n <option value=\"400\">400 (normal)</option>\n <option value=\"500\">500</option>\n <option value=\"600\">600</option>\n <option value=\"700\">700 (bold)</option>\n <option value=\"800\">800</option>\n <option value=\"900\">900</option>\n </select>\n </div>\n <div class=\"property-input\">\n <label>Text Align</label>\n <select\n [value]=\"currentStyles.textAlign\"\n (change)=\"updateElementStyle('textAlign', $any($event.target).value)\"\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n <option value=\"justify\">justify</option>\n </select>\n </div>\n <div class=\"property-input\">\n <label>Line Height</label>\n <input\n type=\"text\"\n [value]=\"currentStyles.lineHeight\"\n (change)=\"updateElementStyle('lineHeight', $any($event.target).value)\"\n />\n </div>\n }\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Layout Element Action Buttons (floating on selected element) -->\n @if (showPropertyEditor && selectedLayoutElement) {\n <!-- Move button (top-left) -->\n @if (showMoveButton) {\n <button\n type=\"button\"\n class=\"layout-element-action-btn layout-element-move\"\n [style.top.px]=\"elementActionButtonsPosition.top\"\n [style.left.px]=\"elementActionButtonsPosition.left\"\n (mousedown)=\"startLayoutElementDrag($event)\"\n title=\"드래그하여 이동\"\n >\n <span [innerHTML]=\"icons.move\"></span>\n </button>\n }\n\n <!-- Delete button (top-right) -->\n @if (showDeleteButton) {\n <button\n type=\"button\"\n class=\"layout-element-action-btn layout-element-delete\"\n [style.top.px]=\"elementActionButtonsPosition.top\"\n [style.right.px]=\"elementActionButtonsPosition.right\"\n (click)=\"deleteLayoutElement()\"\n title=\"요소 삭제\"\n >\n <span [innerHTML]=\"icons.trash2\"></span>\n </button>\n }\n\n <!-- Insert line button (bottom-right) -->\n @if (showInsertLineButton) {\n <button\n type=\"button\"\n class=\"layout-element-action-btn layout-element-insert-line\"\n [style.top.px]=\"elementActionButtonsPosition.bottom\"\n [style.right.px]=\"elementActionButtonsPosition.right\"\n (click)=\"insertLineAfterLayoutElement()\"\n title=\"아래에 새 줄 추가\"\n >\n <span [innerHTML]=\"icons.cornerDownLeft\"></span>\n </button>\n }\n }\n\n <!-- Block Element Popup Toolbar (unified for all block elements) -->\n @if (showBlockToolbar && selectedBlock) {\n <div\n class=\"block-popup-toolbar\"\n [style.left.px]=\"blockToolbarPosition.x\"\n [style.top.px]=\"blockToolbarPosition.y\"\n >\n <!-- Alignment Buttons -->\n <div class=\"toolbar-section\">\n @if (\n selectedBlock.type === 'image' ||\n selectedBlock.type === 'video' ||\n selectedBlock.type === 'iframe' ||\n selectedBlock.type === 'og-card'\n ) {\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'inline'\"\n (click)=\"setBlockAlignment('inline')\"\n title=\"Inline\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.typeInline\"></span>\n <span class=\"btn-label\">Inline</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'wrap-left'\"\n (click)=\"setBlockAlignment('wrap-left')\"\n title=\"Wrap Left\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.wrapLeft\"></span>\n <span class=\"btn-label\">Wrap L</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'wrap-right'\"\n (click)=\"setBlockAlignment('wrap-right')\"\n title=\"Wrap Right\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.wrapRight\"></span>\n <span class=\"btn-label\">Wrap R</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'break-left'\"\n (click)=\"setBlockAlignment('break-left')\"\n title=\"Break Left\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakLeft\"></span>\n <span class=\"btn-label\">Left</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'break-center'\"\n (click)=\"setBlockAlignment('break-center')\"\n title=\"Break Center\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakCenter\"></span>\n <span class=\"btn-label\">Center</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentBlockAlign === 'break-right'\"\n (click)=\"setBlockAlignment('break-right')\"\n title=\"Break Right\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakRight\"></span>\n <span class=\"btn-label\">Right</span>\n </button>\n </div>\n\n <!-- Divider -->\n <div class=\"toolbar-divider\"></div>\n\n <!-- Delete Button -->\n <div class=\"toolbar-section\">\n <button\n type=\"button\"\n class=\"popup-toolbar-btn delete-btn\"\n (click)=\"deleteSelectedBlock()\"\n title=\"Delete\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.trash\"></span>\n <span class=\"btn-label\">Delete</span>\n </button>\n </div>\n </div>\n }\n\n <!-- Legacy Image Popup Toolbar (kept for backward compatibility, hidden in layout mode) -->\n @if (showImageToolbar && selectedImage && !showBlockToolbar && !showLayoutOutlines) {\n <div\n class=\"image-popup-toolbar\"\n [style.left.px]=\"imageToolbarPosition.x\"\n [style.top.px]=\"imageToolbarPosition.y\"\n >\n <div class=\"toolbar-section\">\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'inline'\"\n (click)=\"setImageAlignment('inline')\"\n title=\"Inline\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.typeInline\"></span>\n <span class=\"btn-label\">Inline</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'wrap-left'\"\n (click)=\"setImageAlignment('wrap-left')\"\n title=\"Wrap Left\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.wrapLeft\"></span>\n <span class=\"btn-label\">Wrap L</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'wrap-right'\"\n (click)=\"setImageAlignment('wrap-right')\"\n title=\"Wrap Right\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.wrapRight\"></span>\n <span class=\"btn-label\">Wrap R</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'break-left'\"\n (click)=\"setImageAlignment('break-left')\"\n title=\"Break Left\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakLeft\"></span>\n <span class=\"btn-label\">Left</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'break-center'\"\n (click)=\"setImageAlignment('break-center')\"\n title=\"Break Center\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakCenter\"></span>\n <span class=\"btn-label\">Center</span>\n </button>\n <button\n type=\"button\"\n class=\"popup-toolbar-btn\"\n [class.active]=\"currentImageAlign === 'break-right'\"\n (click)=\"setImageAlignment('break-right')\"\n title=\"Break Right\"\n >\n <span class=\"btn-icon\" [innerHTML]=\"icons.breakRight\"></span>\n <span class=\"btn-label\">Right</span>\n </button>\n </div>\n </div>\n }\n </div>\n</div>\n","import { Component, Input, OnChanges, SimpleChanges, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { provideTranslocoScope } from '@jsverse/transloco';\nimport jsPDF from 'jspdf';\nimport html2canvas from 'html2canvas';\n\n@Component({\n selector: 'haloduck-wysiwyg-viewer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './wysiwyg-viewer.component.html',\n styleUrls: ['./wysiwyg-viewer.component.css'],\n providers: [provideTranslocoScope('haloduck')],\n})\nexport class WysiwygViewerComponent implements OnChanges {\n private readonly sanitizer = inject(DomSanitizer);\n\n @Input() content: string = '';\n @Input() showButtons: boolean = false;\n\n sanitizedContent: SafeHtml = '';\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['content']) {\n this.updateContent();\n }\n }\n\n private updateContent(): void {\n if (!this.content) {\n this.sanitizedContent = '';\n return;\n }\n\n // Extract body content if full HTML document is provided\n let contentToRender = this.content;\n\n // Check if content is a full HTML document\n const trimmedContent = this.content.trim();\n if (trimmedContent.startsWith('<!DOCTYPE html>') || trimmedContent.startsWith('<html>')) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(this.content, 'text/html');\n const body = doc.querySelector('body');\n if (body) {\n contentToRender = body.innerHTML;\n }\n }\n\n // Basic sanitization: remove script tags and event handlers\n const div = document.createElement('div');\n div.innerHTML = contentToRender;\n\n // Remove script tags\n const scripts = div.querySelectorAll('script');\n scripts.forEach((script) => script.remove());\n\n // Remove event handler attributes\n const allElements = div.querySelectorAll('*');\n allElements.forEach((el) => {\n const attributes = Array.from(el.attributes);\n attributes.forEach((attr) => {\n if (attr.name.startsWith('on')) {\n el.removeAttribute(attr.name);\n }\n });\n });\n\n // Apply inline styles to match the editor's display\n // This ensures content displays the same way in the viewer as in the editor\n const headings = div.querySelectorAll('h1, h2, h3, h4, h5, h6');\n headings.forEach((heading) => {\n const h = heading as HTMLElement;\n h.style.fontWeight = 'bold';\n h.style.display = 'block';\n\n switch (heading.tagName.toLowerCase()) {\n case 'h1':\n h.style.fontSize = '2em';\n h.style.margin = '0.67em 0';\n break;\n case 'h2':\n h.style.fontSize = '1.5em';\n h.style.margin = '0.75em 0';\n break;\n case 'h3':\n h.style.fontSize = '1.17em';\n h.style.margin = '0.83em 0';\n break;\n case 'h4':\n h.style.fontSize = '1em';\n h.style.margin = '1.12em 0';\n break;\n case 'h5':\n h.style.fontSize = '0.83em';\n h.style.margin = '1.5em 0';\n break;\n case 'h6':\n h.style.fontSize = '0.75em';\n h.style.margin = '1.67em 0';\n break;\n }\n });\n\n const paragraphs = div.querySelectorAll('p');\n paragraphs.forEach((p) => {\n const pElement = p as HTMLElement;\n pElement.style.margin = '1em 0';\n pElement.style.display = 'block';\n });\n\n const uls = div.querySelectorAll('ul');\n uls.forEach((ul) => {\n const ulElement = ul as HTMLElement;\n ulElement.style.margin = '1em 0';\n ulElement.style.paddingLeft = '2em';\n ulElement.style.display = 'block';\n });\n\n const ols = div.querySelectorAll('ol');\n ols.forEach((ol) => {\n const olElement = ol as HTMLElement;\n olElement.style.margin = '1em 0';\n olElement.style.paddingLeft = '2em';\n olElement.style.display = 'block';\n });\n\n const lis = div.querySelectorAll('li');\n lis.forEach((li) => {\n const liElement = li as HTMLElement;\n liElement.style.margin = '0.5em 0';\n liElement.style.display = 'list-item';\n });\n\n const blockquotes = div.querySelectorAll('blockquote');\n blockquotes.forEach((bq) => {\n const bqElement = bq as HTMLElement;\n bqElement.style.margin = '1em 0';\n bqElement.style.paddingLeft = '1em';\n bqElement.style.borderLeft = '4px solid #d1d5db';\n bqElement.style.color = '#6b7280';\n bqElement.style.display = 'block';\n });\n\n const pres = div.querySelectorAll('pre');\n pres.forEach((pre) => {\n const preElement = pre as HTMLElement;\n preElement.style.background = '#f3f4f6';\n preElement.style.padding = '1em';\n preElement.style.borderRadius = '0.375rem';\n preElement.style.overflowX = 'auto';\n preElement.style.fontFamily = \"'Courier New', Courier, monospace\";\n preElement.style.fontSize = '0.875rem';\n preElement.style.lineHeight = '1.5';\n preElement.style.display = 'block';\n preElement.style.whiteSpace = 'pre';\n });\n\n const codes = div.querySelectorAll('code');\n codes.forEach((code) => {\n const codeElement = code as HTMLElement;\n // Only apply if not inside a pre tag\n if (!codeElement.closest('pre')) {\n codeElement.style.background = '#f3f4f6';\n codeElement.style.padding = '0.2em 0.4em';\n codeElement.style.borderRadius = '0.25rem';\n codeElement.style.fontFamily = \"'Courier New', Courier, monospace\";\n codeElement.style.fontSize = '0.875em';\n }\n });\n\n // Trust the sanitized HTML to preserve styles\n this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(div.innerHTML);\n }\n\n async exportToPDF(filename: string = 'document.pdf'): Promise<void> {\n const element = document.querySelector('.wysiwyg-viewer-content') as HTMLElement;\n if (!element) return;\n\n try {\n // Create a clean version for PDF export\n const exportContainer = document.createElement('div');\n exportContainer.style.cssText = `\n position: absolute;\n left: -9999px;\n top: 0;\n width: 800px;\n padding: 20px;\n background: white;\n font-family: 'Noto Sans KR', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #333;\n `;\n\n exportContainer.innerHTML = this.content;\n\n // Ensure all images are visible and have proper styles\n const images = exportContainer.querySelectorAll('img');\n images.forEach((img: HTMLImageElement) => {\n img.style.display = 'block';\n img.style.maxWidth = '100%';\n img.style.height = 'auto';\n img.style.margin = '10px 0';\n });\n\n document.body.appendChild(exportContainer);\n\n // Wait for images to load\n await this.waitForImagesToLoad(exportContainer);\n\n const canvas = await html2canvas(exportContainer, {\n scale: 2,\n useCORS: true,\n allowTaint: true,\n logging: true,\n backgroundColor: '#ffffff',\n imageTimeout: 0,\n removeContainer: false,\n });\n\n // Remove temporary container\n document.body.removeChild(exportContainer);\n\n const imgData = canvas.toDataURL('image/png');\n const pdf = new jsPDF({\n orientation: 'portrait',\n unit: 'mm',\n format: 'a4',\n });\n\n const imgWidth = 210; // A4 width in mm\n const pageHeight = 297; // A4 height in mm\n const imgHeight = (canvas.height * imgWidth) / canvas.width;\n let heightLeft = imgHeight;\n let position = 0;\n\n pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n heightLeft -= pageHeight;\n\n while (heightLeft > 0) {\n position = heightLeft - imgHeight;\n pdf.addPage();\n pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n heightLeft -= pageHeight;\n }\n\n pdf.save(filename);\n } catch (error) {\n console.error('Error exporting to PDF:', error);\n throw error;\n }\n }\n\n private waitForImagesToLoad(container: HTMLElement): Promise<void> {\n const images = Array.from(container.querySelectorAll('img'));\n if (images.length === 0) {\n return Promise.resolve();\n }\n\n const promises = images.map((img: HTMLImageElement) => {\n if (img.complete) {\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => {\n console.warn('Image failed to load:', img.src);\n resolve(); // Continue even if image fails\n };\n // Timeout after 10 seconds\n setTimeout(() => resolve(), 10000);\n });\n });\n\n return Promise.all(promises).then(() => {});\n }\n\n print(): void {\n const printWindow = window.open('', '_blank');\n if (!printWindow) return;\n\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <title>Print</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Host+Grotesk:ital,wght@0,300..800;1,300..800&family=Noto+Sans+JP:wght@100..900&family=Noto+Sans+KR:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Noto+Serif+JP:wght@200..900&family=Noto+Serif+KR:wght@200..900&family=Noto+Serif:ital,wght@0,100..900;1,100..900&display=swap\" rel=\"stylesheet\">\n <link rel=\"stylesheet\" as=\"style\" crossorigin href=\"https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css\" />\n <style>\n body {\n font-family: 'Noto Sans KR', Pretendard, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n font-size: 1rem;\n line-height: 1.6;\n color: #333;\n padding: 20px;\n }\n img {\n max-width: 100%;\n height: auto;\n }\n h1 {\n font-size: 2em;\n margin: 0.67em 0;\n font-weight: bold;\n }\n h2 {\n font-size: 1.5em;\n margin: 0.75em 0;\n font-weight: bold;\n }\n h3 {\n font-size: 1.17em;\n margin: 0.83em 0;\n font-weight: bold;\n }\n h4 {\n font-size: 1em;\n margin: 1.12em 0;\n font-weight: bold;\n }\n h5 {\n font-size: 0.83em;\n margin: 1.5em 0;\n font-weight: bold;\n }\n h6 {\n font-size: 0.75em;\n margin: 1.67em 0;\n font-weight: bold;\n }\n p {\n margin: 1em 0;\n }\n ul, ol {\n margin: 1em 0;\n padding-left: 2em;\n }\n li {\n margin: 0.5em 0;\n }\n blockquote {\n margin: 1em 0;\n padding-left: 1em;\n border-left: 4px solid #d1d5db;\n color: #6b7280;\n }\n a {\n color: #3b82f6;\n text-decoration: underline;\n }\n a:hover {\n color: #2563eb;\n }\n strong, b {\n font-weight: bold;\n }\n em, i {\n font-style: italic;\n }\n u {\n text-decoration: underline;\n }\n s, strike, del {\n text-decoration: line-through;\n }\n sup {\n vertical-align: super;\n font-size: smaller;\n }\n sub {\n vertical-align: sub;\n font-size: smaller;\n }\n hr {\n border: none;\n border-top: 1px solid #d1d5db;\n margin: 1em 0;\n }\n pre {\n background: #f3f4f6;\n padding: 1em;\n border-radius: 0.375rem;\n overflow-x: auto;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n code {\n background: #f3f4f6;\n padding: 0.2em 0.4em;\n border-radius: 0.25rem;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.875em;\n }\n </style>\n </head>\n <body>\n ${this.content}\n </body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => {\n printWindow.print();\n printWindow.close();\n }, 250);\n }\n}\n","<div class=\"haloduck-wysiwyg-viewer\">\n <div class=\"wysiwyg-viewer-content\" [innerHTML]=\"sanitizedContent\"></div>\n\n @if (showButtons) {\n <div class=\"viewer-actions\">\n <button type=\"button\" class=\"export-btn\" (click)=\"exportToPDF()\" title=\"Export to PDF\">\n PDF Export\n </button>\n <button type=\"button\" class=\"export-btn\" (click)=\"print()\" title=\"Print\">Print</button>\n </div>\n }\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { ActivatedRouteSnapshot, Router, NavigationEnd } from '@angular/router';\nimport { CoreService } from '@haloduck/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\ninterface Breadcrumb {\n label: string;\n url: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BreadcrumbService {\n private readonly coreService = inject(CoreService);\n private breadcrumbs = new BehaviorSubject<Breadcrumb[]>([]);\n breadcrumbs$ = this.breadcrumbs.asObservable();\n private readonly titleService = inject(Title);\n\n constructor(private router: Router) {\n this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {\n const root = this.router.routerState.snapshot.root;\n const breadcrumbs = this.createBreadcrumbs(root);\n this.breadcrumbs.next(breadcrumbs);\n\n setTimeout(() => {\n const titlePrefix =\n this.coreService.getStage() === 'prod'\n ? ''\n : `[${this.coreService.getStage()}] ` + this.coreService.getAppName() + '::';\n\n const title =\n titlePrefix +\n breadcrumbs.reduce((acc, breadcrumb) => {\n return acc ? `${acc}>${breadcrumb.label}` : breadcrumb.label;\n }, '');\n\n this.titleService.setTitle(title || 'Default Title');\n });\n });\n }\n\n private createBreadcrumbs(\n route: ActivatedRouteSnapshot,\n url: string = '',\n breadcrumbs: Breadcrumb[] = [],\n ): Breadcrumb[] {\n const children: ActivatedRouteSnapshot[] = route.children;\n\n if (children.length === 0) {\n return breadcrumbs;\n }\n\n for (const child of children) {\n const routeURL: string = child.url.map((segment) => segment.path).join('/');\n if (routeURL !== '') {\n url += `/${routeURL}`;\n }\n\n if (child.data['breadcrumb']) {\n breadcrumbs.push({ label: child.data['breadcrumb'], url });\n }\n\n return this.createBreadcrumbs(child, url, breadcrumbs);\n }\n\n return breadcrumbs;\n }\n}\n","import { Component, inject, OnInit } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { BreadcrumbService } from './breadcrumb.service';\nimport { TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'haloduck-breadcrumb',\n imports: [RouterLink, TranslocoModule],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.css',\n})\nexport class BreadcrumbComponent implements OnInit {\n private readonly breadcrumbService = inject(BreadcrumbService);\n listBreadcrumb: { label: string; url: string }[] = [];\n\n ngOnInit() {\n this.breadcrumbService.breadcrumbs$.subscribe((listBreadcrumb) => {\n this.listBreadcrumb = listBreadcrumb;\n });\n }\n}\n","<nav\n class=\"flex border-b border-light-inactive dark:border-dark-inactive bg-light-background dark:bg-dark-background\"\n aria-label=\"Breadcrumb\"\n>\n <ol role=\"list\" class=\"flex w-full max-w-(--breakpoint-xl) space-x-4 px-4 sm:px-6 lg:px-8\">\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <a\n routerLink=\"/\"\n class=\"text-light-on-background dark:text-dark-on-background hover:scale-105\"\n >\n <svg\n class=\"size-5 shrink-0\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path\n fill-rule=\"evenodd\"\n d=\"M9.293 2.293a1 1 0 0 1 1.414 0l7 7A1 1 0 0 1 17 11h-1v6a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-3a1 1 0 0 0-1-1H9a1 1 0 0 0-1 1v3a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-6H3a1 1 0 0 1-.707-1.707l7-7Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n <span class=\"sr-only\">Home</span>\n </a>\n </div>\n </li>\n @for (breadcrumb of listBreadcrumb; track breadcrumb.label; let last = $last) {\n <li class=\"flex\">\n <div class=\"flex items-center\">\n <svg\n class=\"h-full w-6 shrink-0 text-light-inactive dark:text-dark-inactive\"\n viewBox=\"0 0 24 44\"\n preserveAspectRatio=\"none\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M.293 0l22 22-22 22h1.414l22-22-22-22H.293z\" />\n </svg>\n @if (!last) {\n <a\n href=\"javascript:void(0)\"\n [routerLink]=\"breadcrumb.url\"\n class=\"ml-4 text-sm font-medium hover:font-bold text-light-on-background dark:text-dark-on-background\"\n >{{ breadcrumb.label | transloco }}</a\n >\n } @else {\n <span\n class=\"ml-4 text-sm font-medium text-light-on-background dark:text-dark-on-background\"\n >{{ breadcrumb.label | transloco }}</span\n >\n }\n </div>\n </li>\n }\n </ol>\n</nav>\n","import { Component, inject } from '@angular/core';\nimport { NotificationService } from './notification.service';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'haloduck-notification',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './notification.component.html',\n styleUrl: './notification.component.css',\n})\nexport class NotificationComponent {\n private readonly notificationService = inject(NotificationService);\n listNotification$ = this.notificationService.getListNotification();\n\n removeNotification(id: string) {\n this.notificationService.removeNotificationById(id);\n }\n}\n","@for (notification of listNotification$ | async; track notification.id) {\n <div\n class=\"relative rounded-lg m-4 px-8 py-4 bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary animate-fadeIn\"\n [ngClass]=\"{\n 'bg-light-primary-dark dark:bg-dark-primary-dark text-light-on-primary-dark dark:text-dark-on-primary-dark':\n notification.type === 'info',\n 'bg-light-primary dark:bg-dark-primary text-light-on-primary dark:text-dark-on-primary':\n notification.type === 'success',\n 'bg-light-danger dark:bg-dark-danger text-light-on-danger dark:text-dark-on-danger':\n notification.type === 'error',\n 'bg-light-secondary dark:bg-dark-secondary text-light-on-secondary dark:text-dark-on-secondary':\n notification.type === 'warning',\n }\"\n >\n {{ notification.message }}\n <div class=\"absolute top-0 right-0\">\n <button type=\"button\" (click)=\"removeNotification(notification.id)\">\n <span class=\"sr-only\">Close</span>\n <svg\n class=\"size-6 text-white\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n data-slot=\"icon\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n </div>\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'haloduck-picture-name',\n imports: [],\n templateUrl: './picture-name.component.html',\n styleUrl: './picture-name.component.css',\n})\nexport class PictureNameComponent {\n @Input() name?: string = '';\n @Input() pictureKey?: string;\n @Input() cdnUrl?: string = '';\n}\n","<div class=\"flex items-center justify-start gap-2\">\n @if (pictureKey) {\n <img src=\"{{ cdnUrl }}/{{ pictureKey }}\" alt=\"사진\" class=\"w-8 h-8 rounded-full\" />\n } @else {\n <div class=\"w-8 h-8 bg-light-inactive dark:bg-dark-inactive rounded-full\"></div>\n }\n {{ name }}\n @if (name) {\n \n <!-- TODO -->\n }\n</div>\n","import { provideTranslocoScope } from '@jsverse/transloco';\n\nexport const provideHaloduckTransloco = () =>\n provideTranslocoScope({\n scope: 'haloduck',\n alias: 'haloduck',\n });\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i4","i2"],"mappings":"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"}
|