{"version":3,"file":"valtech-components.mjs","sources":["../../../src/lib/version.ts","../../../src/lib/services/auth/interceptor.ts","../../../src/lib/services/auth/config.ts","../../../src/lib/services/errors/interpret-error.ts","../../../src/lib/services/firebase/analytics-error-handler.ts","../../../src/lib/services/firebase/analytics-router-tracker.ts","../../../src/lib/services/firebase/config.ts","../../../src/lib/services/firebase/analytics.service.ts","../../../src/lib/services/errors/error-logging.interceptor.ts","../../../src/lib/services/errors/provide-error-handling.ts","../../../src/lib/services/i18n/types.ts","../../../src/lib/shared/utils/datetime.ts","../../../src/lib/services/i18n/i18n.service.ts","../../../src/lib/services/toast.service.ts","../../../src/lib/services/errors/valtech-error.service.ts","../../../src/lib/services/errors/index.ts","../../../src/lib/services/auth/types.ts","../../../src/lib/services/auth/auth-state.service.ts","../../../src/lib/services/auth/token.service.ts","../../../src/lib/services/auth/storage.service.ts","../../../src/lib/services/auth/sync.service.ts","../../../src/lib/services/firebase/types.ts","../../../src/lib/services/firebase/shared-config.ts","../../../src/lib/services/firebase/firebase.service.ts","../../../src/lib/services/firebase/utils/path-builder.ts","../../../src/lib/services/firebase/firestore.service.ts","../../../src/lib/services/firebase/firestore-collection.ts","../../../src/lib/services/firebase/utils/query-builder.ts","../../../src/lib/services/firebase/storage.service.ts","../../../src/lib/services/firebase/messaging.service.ts","../../../src/lib/services/firebase/notifications.service.ts","../../../src/lib/services/firebase/analytics-types.ts","../../../src/lib/services/firebase/index.ts","../../../src/lib/services/auth/oauth.service.ts","../../../src/lib/services/i18n/input-i18n.helper.ts","../../../src/lib/services/i18n/translate.pipe.ts","../../../src/lib/services/i18n/default-content.ts","../../../src/lib/services/i18n/config.ts","../../../src/lib/services/i18n/index.ts","../../../src/lib/services/confirmation-dialog/types.ts","../../../src/lib/services/confirmation-dialog/confirmation-dialog.service.ts","../../../src/lib/services/auth/auth.service.ts","../../../src/lib/directives/has-permission.directive.ts","../../../src/lib/services/presets/preset.service.ts","../../../src/lib/services/presets/config.ts","../../../src/lib/services/presets/index.ts","../../../src/lib/components/atoms/avatar/avatar.component.ts","../../../src/lib/services/icons.service.ts","../../../src/lib/components/atoms/box/box.component.ts","../../../src/lib/components/atoms/glow/glow.component.ts","../../../src/lib/components/atoms/container/container.component.ts","../../../src/lib/components/types.ts","../../../src/lib/services/download.service.ts","../../../src/lib/services/navigation/types.ts","../../../src/lib/services/in-app-browser.service.ts","../../../src/lib/services/navigation/navigation.service.ts","../../../src/lib/components/atoms/button/button.component.ts","../../../src/lib/components/atoms/button/factory.ts","../../../src/lib/components/atoms/display/display.component.ts","../../../src/lib/components/atoms/divider/divider.component.ts","../../../src/lib/components/atoms/href/href.component.ts","../../../src/lib/components/atoms/icon/icon.component.ts","../../../src/lib/components/atoms/image/image.component.ts","../../../src/lib/components/atoms/progress-bar/progress-bar.component.ts","../../../src/lib/services/link-processor.service.ts","../../../src/lib/shared/pipes/process-links.pipe.ts","../../../src/lib/components/atoms/text/text.component.ts","../../../src/lib/components/atoms/title/title.component.ts","../../../src/lib/components/atoms/title/types.ts","../../../src/lib/components/atoms/skeleton/types.ts","../../../src/lib/components/atoms/skeleton/skeleton.component.ts","../../../src/lib/components/atoms/progress-ring/progress-ring.component.ts","../../../src/lib/components/atoms/fab/fab.component.ts","../../../src/lib/services/qr-generator/types.ts","../../../src/lib/services/qr-generator/qr-generator.service.ts","../../../src/lib/components/atoms/qr-code/qr-code.component.ts","../../../src/lib/components/atoms/countdown/types.ts","../../../src/lib/components/atoms/countdown/countdown.component.ts","../../../src/lib/components/atoms/price-tag/types.ts","../../../src/lib/components/atoms/price-tag/price-tag.component.ts","../../../src/lib/components/atoms/horizontal-scroll/horizontal-scroll.component.ts","../../../src/lib/components/atoms/rights-footer/rights-footer.component.ts","../../../src/lib/components/atoms/pattern/motifs.ts","../../../src/lib/components/atoms/pattern/pattern.component.ts","../../../src/lib/components/atoms/page-waves/page-waves.component.ts","../../../src/lib/components/atoms/glass/glass.component.ts","../../../src/lib/components/atoms/user-avatar/user-avatar.component.ts","../../../src/lib/components/molecules/alert-box/alert-box.component.ts","../../../src/lib/components/molecules/button-group/button-group.component.ts","../../../src/lib/components/molecules/card/types.ts","../../../src/lib/components/molecules/card/card.component.ts","../../../src/lib/components/molecules/check-input/check-input.component.ts","../../../src/lib/components/molecules/checkbox-radio-input/checkbox-radio-input.component.ts","../../../src/lib/components/molecules/comment-input/comment-input.component.ts","../../../src/lib/components/molecules/content-loader/content-loader.component.ts","../../../src/lib/components/molecules/date-input/date-input.component.ts","../../../src/lib/components/molecules/email-input/email-input.component.ts","../../../src/lib/shared/utils/styles.ts","../../../src/lib/components/molecules/expandable-text/expandable-text.component.ts","../../../src/lib/components/molecules/file-input/file-input.component.ts","../../../src/lib/components/molecules/hint/hint.component.ts","../../../src/lib/components/molecules/hour-input/hour-input.component.ts","../../../src/lib/components/molecules/popover-selector/popover-selector.component.ts","../../../src/lib/components/molecules/language-selector/language-selector.component.ts","../../../src/lib/shared/constants/storage.ts","../../../src/lib/services/local-storage.service.ts","../../../src/lib/services/theme.service.ts","../../../src/lib/components/molecules/title-block/title-block.component.ts","../../../src/lib/components/molecules/layered-card/layered-card.component.ts","../../../src/lib/components/molecules/link/link.component.ts","../../../src/lib/components/molecules/links-cake/links-cake.component.ts","../../../src/lib/components/molecules/notes-box/notes-box.component.ts","../../../src/lib/components/molecules/page-links/page-links.component.ts","../../../src/lib/shared/utils/form-defaults.ts","../../../src/lib/components/molecules/number-input/number-input.component.ts","../../../src/lib/components/molecules/number-from-to/number-from-to.component.ts","../../../src/lib/components/molecules/password-input/password-input.component.ts","../../../src/lib/components/molecules/pin-input/pin-input.component.ts","../../../src/lib/components/molecules/progress-status/progress-status.component.ts","../../../src/lib/components/molecules/prompter/prompter.component.ts","../../../src/lib/components/molecules/radio-input/radio-input.component.ts","../../../src/lib/components/molecules/range-input/range-input.component.ts","../../../src/lib/components/molecules/searchbar/searchbar.component.ts","../../../src/lib/components/molecules/select-input/select-input.component.ts","../../../src/lib/shared/utils/text.ts","../../../src/lib/components/molecules/select-search/select-search.component.ts","../../../src/lib/components/molecules/segment-control/segment-control.component.ts","../../../src/lib/components/molecules/text-input/text-input.component.ts","../../../src/lib/components/molecules/toggle-input/toggle-input.component.ts","../../../src/lib/components/molecules/code-display/code-display.component.ts","../../../src/lib/components/molecules/action-header/action-header.component.ts","../../../src/lib/components/molecules/pill/pill.component.ts","../../../src/lib/components/molecules/command-display/command-display.component.ts","../../../src/lib/components/molecules/info/info.component.ts","../../../src/lib/components/molecules/plain-code-box/plain-code-box.component.ts","../../../src/lib/components/molecules/accordion/accordion.component.ts","../../../src/lib/components/molecules/tabs/tabs.component.ts","../../../src/lib/components/molecules/breadcrumb/breadcrumb.component.ts","../../../src/lib/components/molecules/pagination/pagination.component.ts","../../../src/lib/components/molecules/stepper/stepper.component.ts","../../../src/lib/components/molecules/chip-group/chip-group.component.ts","../../../src/lib/components/molecules/rating/rating.component.ts","../../../src/lib/components/molecules/timeline/timeline.component.ts","../../../src/lib/components/molecules/stats-card/stats-card.component.ts","../../../src/lib/components/molecules/comment/comment.component.ts","../../../src/lib/components/molecules/multi-select-search/multi-select-search.component.ts","../../../src/lib/components/molecules/quote-box/quote-box.component.ts","../../../src/lib/components/molecules/textarea-input/textarea-input.component.ts","../../../src/lib/components/molecules/phone-input/types.ts","../../../src/lib/components/molecules/phone-input/phone-input.component.ts","../../../src/lib/components/molecules/currency-input/types.ts","../../../src/lib/components/molecules/currency-input/currency-input.component.ts","../../../src/lib/components/molecules/date-range-input/date-range-input.component.ts","../../../src/lib/components/molecules/number-stepper/number-stepper.component.ts","../../../src/lib/components/molecules/share-buttons/types.ts","../../../src/lib/components/molecules/share-buttons/share-buttons.component.ts","../../../src/lib/components/molecules/glow-card/glow-card.component.ts","../../../src/lib/components/molecules/glow-card/types.ts","../../../src/lib/components/molecules/swipe-carousel/swipe-carousel.component.ts","../../../src/lib/components/molecules/testimonial-card/testimonial-card.component.ts","../../../src/lib/components/molecules/features-list/types.ts","../../../src/lib/components/molecules/features-list/features-list.component.ts","../../../src/lib/components/molecules/footer-links/footer-links.component.ts","../../../src/lib/components/molecules/links-accordion/links-accordion.component.ts","../../../src/lib/components/molecules/refresher/types.ts","../../../src/lib/components/molecules/refresher/refresher.component.ts","../../../src/lib/services/app-config/types.ts","../../../src/lib/services/app-config/config.ts","../../../src/lib/services/app-config/app-config.service.ts","../../../src/lib/services/app-version/types.ts","../../../src/lib/services/app-version/config.ts","../../../src/lib/services/app-version/app-version.service.ts","../../../src/lib/components/molecules/update-banner/types.ts","../../../src/lib/components/molecules/update-banner/update-banner.component.ts","../../../src/lib/components/molecules/action-card/types.ts","../../../src/lib/components/molecules/action-card/action-card.component.ts","../../../src/lib/components/molecules/media-object/types.ts","../../../src/lib/components/molecules/media-object/media-object.component.ts","../../../src/lib/components/molecules/stats-bar/types.ts","../../../src/lib/components/molecules/stats-bar/stats-bar.component.ts","../../../src/lib/components/molecules/article-card/types.ts","../../../src/lib/components/molecules/article-card/article-card.component.ts","../../../src/lib/components/molecules/cta-card/types.ts","../../../src/lib/components/molecules/cta-card/cta-card.component.ts","../../../src/lib/components/molecules/invitation-card/types.ts","../../../src/lib/components/molecules/invitation-card/invitation-card.component.ts","../../../src/lib/components/molecules/member-card/types.ts","../../../src/lib/components/molecules/member-card/member-card.component.ts","../../../src/lib/components/molecules/username-input/username-input.component.ts","../../../src/lib/components/molecules/linked-providers/types.ts","../../../src/lib/components/molecules/linked-providers/linked-providers.component.ts","../../../src/lib/components/molecules/empty-state/empty-state.component.ts","../../../src/lib/components/molecules/empty-state/factory.ts","../../../src/lib/components/molecules/image-crop/image-crop.component.ts","../../../src/lib/components/molecules/modal-shell/modal-shell.component.ts","../../../src/lib/services/feedback/config.ts","../../../src/lib/services/feedback/feedback.service.ts","../../../src/lib/services/feedback/types.ts","../../../src/lib/services/feedback/index.ts","../../../src/lib/components/organisms/attachment-uploader/attachment-uploader.component.ts","../../../src/lib/components/organisms/attachment-uploader/attachment-uploader.component.html","../../../src/lib/components/organisms/article/types.ts","../../../src/lib/components/organisms/article/article.component.ts","../../../src/lib/components/organisms/banner/banner.component.ts","../../../src/lib/shared/utils/validators.ts","../../../src/lib/shared/utils/dom.ts","../../../src/lib/components/organisms/form/form.component.ts","../../../src/lib/services/auth/guards.ts","../../../src/lib/services/auth/device.service.ts","../../../src/lib/services/auth/session.service.ts","../../../src/lib/services/auth/oauth-callback.component.ts","../../../src/lib/services/auth/handoff.service.ts","../../../src/lib/services/auth/org-switch.service.ts","../../../src/lib/services/auth/notification-action.service.ts","../../../src/lib/services/auth/index.ts","../../../src/lib/components/organisms/change-password-modal/change-password-modal.component.ts","../../../src/lib/components/organisms/change-password-modal/change-password-modal.component.html","../../../src/lib/components/organisms/change-email-modal/change-email-modal.component.ts","../../../src/lib/components/organisms/change-email-modal/change-email-modal.component.html","../../../src/lib/components/organisms/share-profile-modal/types.ts","../../../src/lib/components/organisms/share-profile-modal/share-profile-modal.component.ts","../../../src/lib/components/organisms/fun-modal/types.ts","../../../src/lib/components/organisms/fun-modal/fun-modal.component.ts","../../../src/lib/components/organisms/cookie-banner/cookie-banner.component.ts","../../../src/lib/components/organisms/debug-console/types.ts","../../../src/lib/components/organisms/debug-console/config.ts","../../../src/lib/components/organisms/debug-console/debug-console.component.ts","../../../src/lib/components/organisms/toolbar/toolbar.component.ts","../../../src/lib/components/organisms/footer/footer.component.ts","../../../src/lib/components/organisms/form/factory.ts","../../../src/lib/components/organisms/header/header.component.ts","../../../src/lib/components/organisms/search-header/types.ts","../../../src/lib/components/organisms/search-header/search-header.component.ts","../../../src/lib/components/organisms/mfa-modal/mfa-modal.component.ts","../../../src/lib/components/organisms/mfa-modal/mfa-modal.component.html","../../../src/lib/components/organisms/item-list/item-list.component.ts","../../../src/lib/components/organisms/no-content/no-content.component.ts","../../../src/lib/components/organisms/wizard/types.ts","../../../src/lib/components/organisms/wizard/wizard-footer/wizard-footer.component.ts","../../../src/lib/components/organisms/wizard/wizard.component.ts","../../../src/lib/components/organisms/comment-section/comment-section.component.ts","../../../src/lib/components/organisms/data-table/types.ts","../../../src/lib/components/organisms/data-table/data-table.component.ts","../../../src/lib/components/organisms/cards-carousel/cards-carousel.component.ts","../../../src/lib/components/organisms/testimonial-carousel/testimonial-carousel.component.ts","../../../src/lib/components/organisms/landing-split/landing-split.component.ts","../../../src/lib/components/organisms/landing-steps/landing-steps.component.ts","../../../src/lib/components/organisms/fun-header/fun-header.component.ts","../../../src/lib/components/organisms/animated-terminal/animated-terminal.component.ts","../../../src/lib/components/organisms/company-footer/company-footer.component.ts","../../../src/lib/components/organisms/menu/menu.component.ts","../../../src/lib/components/organisms/tabbed-content/tabbed-content.component.ts","../../../src/lib/components/organisms/infinite-list/types.ts","../../../src/lib/services/skeleton/types.ts","../../../src/lib/services/skeleton/skeleton.service.ts","../../../src/lib/components/organisms/infinite-list/infinite-list.component.ts","../../../src/lib/components/organisms/login/types.ts","../../../src/lib/components/organisms/login/login.component.ts","../../../src/lib/components/organisms/login/login.component.html","../../../src/lib/components/organisms/rotating-text/rotating-text.component.ts","../../../src/lib/components/organisms/terminal-404/terminal-404.component.ts","../../../src/lib/components/organisms/bottom-nav/types.ts","../../../src/lib/components/organisms/bottom-nav/bottom-nav.component.ts","../../../src/lib/services/image/types.ts","../../../src/lib/services/image/image.service.ts","../../../src/lib/components/organisms/avatar-upload/types.ts","../../../src/lib/components/organisms/avatar-upload/avatar-upload.component.ts","../../../src/lib/components/organisms/skeleton-layout/types.ts","../../../src/lib/components/organisms/skeleton-layout/skeleton-layout.component.ts","../../../src/lib/services/page-refresh/page-refresh.service.ts","../../../src/lib/components/organisms/profile-view/profile-view.i18n.ts","../../../src/lib/components/organisms/profile-view/profile-view.component.ts","../../../src/lib/components/organisms/profile-view/profile.routes.ts","../../../src/lib/services/font-size/font-size.service.ts","../../../src/lib/services/preferences/preferences.service.ts","../../../src/lib/components/organisms/preferences-view/preferences-view.i18n.ts","../../../src/lib/components/organisms/preferences-view/preferences-view.component.ts","../../../src/lib/components/organisms/preferences-view/preferences.routes.ts","../../../src/lib/components/organisms/settings-hub/settings-sections.ts","../../../src/lib/components/organisms/settings-hub/settings-hub.i18n.ts","../../../src/lib/components/organisms/settings-hub/settings-hub.component.ts","../../../src/lib/components/organisms/settings-hub/settings.routes.ts","../../../src/lib/components/organisms/login-attempt-modal/login-attempt-modal.component.ts","../../../src/lib/components/organisms/session-list-modal/session-list-modal.component.ts","../../../src/lib/config/site-links.config.ts","../../../src/lib/services/legal-link/legal-link.service.ts","../../../src/lib/services/modal/types.ts","../../../src/lib/services/modal/simple-modal-content.component.ts","../../../src/lib/services/modal/modal.service.ts","../../../src/lib/components/organisms/security-view/security-view.i18n.ts","../../../src/lib/components/organisms/security-view/security-view.component.ts","../../../src/lib/components/organisms/security-view/security.routes.ts","../../../src/lib/services/org/org.service.ts","../../../src/lib/components/organisms/create-org-modal/create-org-modal.i18n.ts","../../../src/lib/components/organisms/create-org-modal/create-org-modal.component.ts","../../../src/lib/components/organisms/delete-account-modal/delete-account-modal.i18n.ts","../../../src/lib/components/organisms/delete-account-modal/delete-account-modal.component.ts","../../../src/lib/components/organisms/org-info-sheet/org-info-sheet.i18n.ts","../../../src/lib/components/organisms/org-info-sheet/org-info-sheet.component.ts","../../../src/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.ts","../../../src/lib/components/organisms/switch-org-modal/switch-org-modal.component.ts","../../../src/lib/components/organisms/account-view/account-view.i18n.ts","../../../src/lib/components/organisms/account-view/account-view.component.ts","../../../src/lib/components/organisms/account-view/account.routes.ts","../../../src/lib/services/markdown-article/markdown-article-parser.ts","../../../src/lib/components/organisms/faq/faq.component.ts","../../../src/lib/components/organisms/faq/types.ts","../../../src/lib/components/templates/simple/simple.component.ts","../../../src/lib/components/templates/page-template/page-template.component.ts","../../../src/lib/components/templates/page-content/page-content.component.ts","../../../src/lib/services/network-status/network-status.service.ts","../../../src/lib/components/molecules/network-banner/network-banner.component.ts","../../../src/lib/components/templates/page-wrapper/page-wrapper.component.ts","../../../src/lib/components/templates/maintenance-page/maintenance-page.component.ts","../../../src/lib/components/templates/auth-background/auth-background.component.ts","../../../src/lib/services/locale.service.ts","../../../src/lib/services/types.ts","../../../src/lib/services/meta/meta.service.ts","../../../src/lib/services/markdown-article/markdown-article-parser.service.ts","../../../src/lib/services/markdown-article/legal-content.service.ts","../../../src/lib/services/markdown-article/beautify-legal-article.ts","../../../src/lib/services/preferences/preferences.types.ts","../../../src/lib/services/refreshable-stream/refreshable-stream.ts","../../../src/lib/services/refreshable-stream/index.ts","../../../src/lib/services/app-config/version.ts","../../../src/lib/services/app-config/index.ts","../../../src/lib/services/app-version/index.ts","../../../src/lib/services/skeleton/directives/loading.directive.ts","../../../src/lib/services/skeleton/templates/list-skeleton.component.ts","../../../src/lib/services/skeleton/templates/grid-skeleton.component.ts","../../../src/lib/services/skeleton/templates/form-skeleton.component.ts","../../../src/lib/services/skeleton/templates/profile-skeleton.component.ts","../../../src/lib/services/skeleton/templates/table-skeleton.component.ts","../../../src/lib/services/skeleton/templates/detail-skeleton.component.ts","../../../src/lib/services/skeleton/config.ts","../../../src/lib/services/skeleton/index.ts","../../../src/lib/services/pagination/types.ts","../../../src/lib/services/pagination/pagination.service.ts","../../../src/lib/services/pagination/index.ts","../../../src/lib/services/ads/ads-loader.service.ts","../../../src/lib/services/ads/ads.service.ts","../../../src/lib/services/ads/config.ts","../../../src/lib/services/ads/types.ts","../../../src/lib/services/ads/index.ts","../../../src/lib/components/molecules/ad-slot/ad-slot.component.ts","../../../src/lib/services/content/transformer.ts","../../../src/lib/services/content/content-types/blog.ts","../../../src/lib/services/content/content-types/documentation.ts","../../../src/lib/services/content/content-types/news.ts","../../../src/lib/services/content/index.ts","../../../src/lib/services/content-platform/config.ts","../../../src/lib/services/content-platform/content.service.ts","../../../src/lib/services/content-platform/index.ts","../../../src/lib/services/donation/config.ts","../../../src/lib/services/donation/donation.service.ts","../../../src/lib/services/donation/index.ts","../../../src/lib/components/molecules/feedback-form/feedback-form.component.ts","../../../src/lib/components/molecules/content-reaction/content-reaction.component.ts","../../../src/lib/components/molecules/content-reaction/content-reaction.component.html","../../../src/lib/services/splash-screen/types.ts","../../../src/lib/services/splash-screen/splash-screen.service.ts","../../../src/lib/services/splash-screen/config.ts","../../../src/lib/services/splash-screen/index.ts","../../../src/lib/components/templates/docs-layout/docs-layout.component.ts","../../../src/lib/components/organisms/docs-sidebar/docs-sidebar.component.ts","../../../src/lib/components/organisms/docs-toc/docs-toc.component.ts","../../../src/lib/services/docs/docs-navigation.service.ts","../../../src/lib/components/molecules/docs-nav-links/docs-nav-links.component.ts","../../../src/lib/components/molecules/docs-api-table/types.ts","../../../src/lib/components/molecules/docs-api-table/docs-api-table.component.ts","../../../src/lib/components/molecules/docs-code-example/docs-code-example.component.ts","../../../src/lib/components/molecules/docs-search/docs-search.component.ts","../../../src/lib/components/molecules/docs-breadcrumb/docs-breadcrumb.component.ts","../../../src/lib/components/molecules/docs-callout/docs-callout.component.ts","../../../src/lib/components/molecules/docs-section/docs-section.component.ts","../../../src/lib/components/templates/docs-page/docs-page.component.ts","../../../src/lib/components/templates/docs-shell/docs-shell.component.ts","../../../src/lib/config/company-footer.config.ts","../../../src/lib/config/index.ts","../../../src/lib/services/requests/types.ts","../../../src/lib/services/requests/request.service.ts","../../../src/lib/services/requests/request-form-builder.service.ts","../../../src/lib/services/requests/request-firestore.service.ts","../../../src/lib/components/organisms/article-strip/types.ts","../../../src/lib/components/organisms/article-strip/article-strip.component.ts","../../../src/lib/components/molecules/info-card/types.ts","../../../src/lib/components/molecules/info-card/info-card.component.ts","../../../src/lib/components/molecules/metric-card/types.ts","../../../src/lib/components/molecules/metric-card/metric-card.component.ts","../../../src/lib/components/molecules/content-card/types.ts","../../../src/lib/components/molecules/content-card/content-card.component.ts","../../../src/lib/components/organisms/auth-cta/types.ts","../../../src/lib/components/organisms/auth-cta/auth-cta.component.ts","../../../src/public-api.ts","../../../src/valtech-components.ts"],"sourcesContent":["/**\n * Current version of valtech-components.\n * This is automatically updated during the publish process.\n */\nexport const VERSION = '2.0.987';\n","import { inject } from '@angular/core';\nimport {\n  HttpInterceptorFn,\n  HttpRequest,\n  HttpHandlerFn,\n  HttpEvent,\n  HttpErrorResponse,\n} from '@angular/common/http';\nimport { Observable, throwError, BehaviorSubject } from 'rxjs';\nimport { catchError, filter, take, switchMap, finalize } from 'rxjs/operators';\nimport { AuthService } from './auth.service';\nimport { VALTECH_AUTH_CONFIG } from './config';\n\n// Control de estado de refresco (singleton a nivel de módulo)\nlet isRefreshing = false;\nconst refreshTokenSubject = new BehaviorSubject<string | null>(null);\n\n/**\n * Interceptor HTTP que:\n * 1. Agrega header Authorization con Bearer token a requests API\n * 2. Maneja errores 401 refrescando el token automáticamente\n * 3. Encola requests durante el refresco para evitar múltiples refresh\n *\n * @example\n * ```typescript\n * // Incluido automáticamente por provideValtechAuth()\n * // Para uso manual:\n * import { provideHttpClient, withInterceptors } from '@angular/common/http';\n * import { authInterceptor } from 'valtech-components';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideHttpClient(withInterceptors([authInterceptor])),\n *   ],\n * });\n * ```\n */\nexport const authInterceptor: HttpInterceptorFn = (\n  request: HttpRequest<unknown>,\n  next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n  const authService = inject(AuthService);\n  const config = inject(VALTECH_AUTH_CONFIG);\n\n  // Omitir requests que no son a nuestra API\n  if (!isApiRequest(request, config.apiUrl)) {\n    return next(request);\n  }\n\n  // Omitir endpoints públicos que no necesitan token\n  if (isPublicEndpoint(request, config.authPrefix!)) {\n    return next(request);\n  }\n\n  const accessToken = authService.accessToken();\n\n  // Agregar header de autorización si hay token\n  if (accessToken) {\n    request = addAuthHeader(request, accessToken);\n  }\n\n  return next(request).pipe(\n    catchError((error: HttpErrorResponse) => {\n      if (error.status === 401 && !isNoRefreshEndpoint(request, config.authPrefix!)) {\n        return handle401Error(request, next, authService);\n      }\n\n      if (error.status === 403) {\n        console.error(\n          '[ValtechAuth] Permiso denegado:',\n          error.error?.message || 'Acceso prohibido'\n        );\n      }\n\n      return throwError(() => error);\n    })\n  );\n};\n\n/**\n * Agrega header de autorización a la request.\n */\nfunction addAuthHeader(request: HttpRequest<unknown>, token: string): HttpRequest<unknown> {\n  return request.clone({\n    setHeaders: {\n      Authorization: `Bearer ${token}`,\n    },\n  });\n}\n\n/**\n * Verifica si la request es a nuestra API.\n */\nfunction isApiRequest(request: HttpRequest<unknown>, apiUrl: string): boolean {\n  return request.url.startsWith(apiUrl) || request.url.includes('/v2/auth');\n}\n\n/**\n * Verifica si la request es a un endpoint público que NO requiere token.\n */\nfunction isPublicEndpoint(request: HttpRequest<unknown>, authPrefix: string): boolean {\n  const publicEndpoints = [\n    '/signin',\n    '/signup',\n    '/refresh',\n    '/logout',\n    '/mfa/verify', // Solo durante login\n  ];\n  return publicEndpoints.some(endpoint => request.url.includes(`${authPrefix}${endpoint}`));\n}\n\n/**\n * Verifica si la request es a un endpoint que NO debe reintentar refresh en 401.\n */\nfunction isNoRefreshEndpoint(request: HttpRequest<unknown>, authPrefix: string): boolean {\n  // Endpoints que no deben intentar refresh en 401:\n  // - Públicos: signin, signup, refresh, logout\n  // - MFA: verify (durante login), confirm (401 = código incorrecto), disable (401 = contraseña incorrecta)\n  // - change-password: 401 = contraseña actual incorrecta, NO token expirado.\n  //   Sin esta exclusión, el retry tras refresh vuelve a dar 401 y el\n  //   catchError de handle401Error dispara logout.\n  const noRefreshEndpoints = [\n    '/signin',\n    '/signup',\n    '/refresh',\n    '/logout',\n    '/mfa/verify',\n    '/mfa/confirm',\n    '/mfa/disable',\n    '/change-password',\n  ];\n  return noRefreshEndpoints.some(endpoint => request.url.includes(`${authPrefix}${endpoint}`));\n}\n\n/**\n * Maneja errores 401 refrescando el token.\n */\nfunction handle401Error(\n  request: HttpRequest<unknown>,\n  next: HttpHandlerFn,\n  authService: AuthService\n): Observable<HttpEvent<unknown>> {\n  if (!isRefreshing) {\n    isRefreshing = true;\n    refreshTokenSubject.next(null);\n\n    return authService.refreshAccessToken().pipe(\n      switchMap(response => {\n        refreshTokenSubject.next(response.accessToken);\n        return next(addAuthHeader(request, response.accessToken));\n      }),\n      catchError(error => {\n        authService.logout();\n        return throwError(() => error);\n      }),\n      finalize(() => {\n        isRefreshing = false;\n      })\n    );\n  }\n\n  // Esperar a que termine el refresco en curso\n  return refreshTokenSubject.pipe(\n    filter((token): token is string => token !== null),\n    take(1),\n    switchMap(token => next(addAuthHeader(request, token)))\n  );\n}\n","import {\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n  APP_INITIALIZER,\n  inject,\n} from '@angular/core';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { ValtechAuthConfig } from './types';\nimport { authInterceptor } from './interceptor';\nimport { AuthService } from './auth.service';\n\n/**\n * Token de inyección para la configuración de Auth.\n */\nexport const VALTECH_AUTH_CONFIG = new InjectionToken<ValtechAuthConfig>('ValtechAuthConfig');\n\n/**\n * Configuración por defecto.\n */\nexport const DEFAULT_AUTH_CONFIG: Partial<ValtechAuthConfig> = {\n  authPrefix: '/v2/auth',\n  storagePrefix: 'valtech_auth_',\n  refreshBeforeExpiry: 60,\n  enableTabSync: true,\n  loginRoute: '/login',\n  homeRoute: '/',\n  unauthorizedRoute: '/unauthorized',\n  enableFirebaseIntegration: false,\n  enableDeviceRegistration: false,\n};\n\n/**\n * Factory para inicializar el AuthService.\n */\nfunction initializeAuth(authService: AuthService): () => Promise<void> {\n  return () => authService.initialize();\n}\n\n/**\n * Provee el servicio de autenticación a la aplicación Angular.\n *\n * @param config - Configuración de autenticación\n * @returns EnvironmentProviders para usar en bootstrapApplication\n *\n * @example\n * ```typescript\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechAuth } from 'valtech-components';\n * import { environment } from './environments/environment';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAuth({\n *       apiUrl: environment.apiUrl,\n *       enableFirebaseIntegration: true,\n *     }),\n *   ],\n * });\n * ```\n */\nexport function provideValtechAuth(config: ValtechAuthConfig): EnvironmentProviders {\n  const mergedConfig: ValtechAuthConfig = {\n    ...DEFAULT_AUTH_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([\n    { provide: VALTECH_AUTH_CONFIG, useValue: mergedConfig },\n    provideHttpClient(withInterceptors([authInterceptor])),\n    // Inicializar AuthService al arrancar la app\n    {\n      provide: APP_INITIALIZER,\n      useFactory: initializeAuth,\n      deps: [AuthService],\n      multi: true,\n    },\n  ]);\n}\n\n/**\n * Provee solo el interceptor (para apps que ya tienen AuthService configurado manualmente).\n */\nexport function provideValtechAuthInterceptor(): EnvironmentProviders {\n  return makeEnvironmentProviders([provideHttpClient(withInterceptors([authInterceptor]))]);\n}\n","/**\n * Error interpretation helper for the Valtech factory.\n *\n * Todos los frontends del factory consumen la misma API (backend Go) y la misma\n * librería. La lógica de interpretar errores debe vivir una sola vez, acá.\n *\n * El backend Go (`apperrors`) SIEMPRE devuelve errores como JSON:\n *   { \"code\": string, \"message\": string, \"operationId\": string }\n * donde `message` ya viene en español y es user-friendly.\n *\n * En Angular un error HTTP llega como `HttpErrorResponse` (body en `.error`).\n * Un fallo de red es un `HttpErrorResponse` con `status === 0`.\n *\n * Además `AuthService.handleAuthError` aplana el `HttpErrorResponse` a un\n * `AuthError { code, message }` (code/message al nivel superior). Por eso este\n * helper acepta AMBAS formas — el crudo y el aplanado.\n */\n\n/**\n * Resultado normalizado de cualquier error. Garantiza una forma estable y\n * predecible para que las webapps no tengan que hacer narrowing manual.\n */\nexport interface InterpretedError {\n  /** Código del backend, o el sentinel `'NETWORK'` / `'UNKNOWN'`. */\n  code: string;\n  /** Mensaje del backend (español, user-friendly) o un genérico en español. */\n  message: string;\n  /** `operationId` del backend, si vino. Útil para soporte / tracing. */\n  operationId?: string;\n  /** HTTP status, si aplica (`0` para fallos de red). */\n  status?: number;\n  /** `true` si fue un fallo de red (status 0 / sin respuesta). */\n  isNetwork: boolean;\n}\n\n/** Mensaje genérico para fallos de red (sin conexión / backend inalcanzable). */\nconst NETWORK_MESSAGE = 'Sin conexión. Verifica tu conexión a internet e inténtalo de nuevo.';\n\n/** Mensaje genérico para errores no identificables. */\nconst UNKNOWN_MESSAGE = 'Ocurrió un error inesperado. Inténtalo de nuevo.';\n\n/** Sentinel para fallos de red. */\nconst NETWORK_CODE = 'NETWORK';\n\n/** Sentinel para errores no identificables. */\nconst UNKNOWN_CODE = 'UNKNOWN';\n\n/** Type guard laxo: ¿el valor parece un `HttpErrorResponse`? */\nfunction isHttpErrorResponse(err: unknown): err is {\n  status?: number;\n  error?: unknown;\n  message?: string;\n  name?: string;\n} {\n  return (\n    typeof err === 'object' &&\n    err !== null &&\n    // No importamos HttpErrorResponse para mantener la fn libre de Angular;\n    // detectamos por shape: tiene `status` numérico y `name` reconocible o `error`.\n    ('status' in err || (err as { name?: string }).name === 'HttpErrorResponse')\n  );\n}\n\n/** Devuelve un string si el valor lo es y no está vacío; si no, `undefined`. */\nfunction asNonEmptyString(value: unknown): string | undefined {\n  return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/**\n * Normaliza CUALQUIER error a un `InterpretedError`.\n *\n * Función pura — sin dependencias de Angular DI, testeable y usable desde\n * cualquier lado (componentes, servicios, interceptores, scripts).\n *\n * Nunca lanza: siempre devuelve un `InterpretedError` válido.\n *\n * Casos cubiertos:\n * - `HttpErrorResponse` con `status === 0` (o sin respuesta) → fallo de red.\n * - `HttpErrorResponse` con body `{ code, message, operationId }` del backend.\n * - `AuthError` aplanado `{ code, message }` (code/message top-level).\n * - `Error` plano de JS → `code: 'UNKNOWN'`, `message: err.message`.\n * - Cualquier otra cosa (string, null, undefined, objeto raro) → genérico.\n *\n * @example\n * ```ts\n * try {\n *   await firstValueFrom(this.http.get(url));\n * } catch (err) {\n *   const e = interpretError(err);\n *   if (e.isNetwork) {\n *     this.toast.show({ message: e.message, color: 'dark' });\n *   } else {\n *     this.errorCode.set(e.code);\n *   }\n * }\n * ```\n */\nexport function interpretError(err: unknown): InterpretedError {\n  // 1. HttpErrorResponse — el caso más común al hablar con el backend.\n  if (isHttpErrorResponse(err)) {\n    const status = typeof err.status === 'number' ? err.status : undefined;\n\n    // 1a. Fallo de red: status 0 o sin body de respuesta del servidor.\n    if (status === 0) {\n      return {\n        code: NETWORK_CODE,\n        message: NETWORK_MESSAGE,\n        status: 0,\n        isNetwork: true,\n      };\n    }\n\n    // 1b. Body del backend `{ code, message, operationId }`.\n    const body = err.error;\n    if (typeof body === 'object' && body !== null) {\n      const b = body as {\n        code?: unknown;\n        message?: unknown;\n        operationId?: unknown;\n      };\n      return {\n        code: asNonEmptyString(b.code) ?? UNKNOWN_CODE,\n        message: asNonEmptyString(b.message) ?? UNKNOWN_MESSAGE,\n        operationId: asNonEmptyString(b.operationId),\n        status,\n        isNetwork: false,\n      };\n    }\n\n    // 1c. HttpErrorResponse sin body estructurado (ej. body string / null).\n    return {\n      code: UNKNOWN_CODE,\n      message: asNonEmptyString(err.message) ?? UNKNOWN_MESSAGE,\n      status,\n      isNetwork: false,\n    };\n  }\n\n  // 2. AuthError aplanado u objeto con `code`/`message` top-level.\n  if (typeof err === 'object' && err !== null) {\n    const o = err as {\n      code?: unknown;\n      message?: unknown;\n      operationId?: unknown;\n    };\n    const code = asNonEmptyString(o.code);\n    const message = asNonEmptyString(o.message);\n\n    if (code || message) {\n      return {\n        code: code ?? UNKNOWN_CODE,\n        message: message ?? UNKNOWN_MESSAGE,\n        operationId: asNonEmptyString(o.operationId),\n        isNetwork: false,\n      };\n    }\n\n    // 2b. Error plano de JS (instancia de Error sin code) — `message` ya\n    //     cubierto arriba; este branch atrapa Error con message vacío.\n    if (err instanceof Error) {\n      return {\n        code: UNKNOWN_CODE,\n        message: asNonEmptyString(err.message) ?? UNKNOWN_MESSAGE,\n        isNetwork: false,\n      };\n    }\n  }\n\n  // 3. Cualquier otra cosa: string, null, undefined, objeto raro.\n  return {\n    code: UNKNOWN_CODE,\n    message: UNKNOWN_MESSAGE,\n    isNetwork: false,\n  };\n}\n","/**\n * Analytics Error Handler\n *\n * ErrorHandler personalizado que envía errores no capturados a Firebase Analytics.\n * Se activa si enableErrorTracking=true en analyticsConfig.\n */\n\nimport { ErrorHandler, Injectable, inject } from '@angular/core';\nimport { AnalyticsService } from './analytics.service';\n\n/**\n * ErrorHandler que trackea errores en Firebase Analytics.\n *\n * Captura errores no manejados de la aplicación y los envía a GA4\n * como eventos 'error_occurred'. También delega al ErrorHandler\n * default para mantener el comportamiento de console.error.\n *\n * @example\n * ```typescript\n * // Se activa automáticamente si enableErrorTracking=true\n * provideValtechFirebase({\n *   firebase: environment.firebase,\n *   enableAnalytics: true,\n *   analyticsConfig: {\n *     enableErrorTracking: true,\n *   },\n * });\n * ```\n */\n@Injectable()\nexport class AnalyticsErrorHandler implements ErrorHandler {\n  private readonly analytics = inject(AnalyticsService);\n  private readonly defaultHandler = new ErrorHandler();\n\n  /**\n   * Maneja un error no capturado.\n   * Envía el error a Analytics y luego al handler default.\n   */\n  handleError(error: unknown): void {\n    // Enviar a Analytics\n    try {\n      this.trackError(error);\n    } catch (trackingError) {\n      // No fallar si el tracking falla\n      console.warn('[AnalyticsErrorHandler] Error tracking failed:', trackingError);\n    }\n\n    // Delegar al handler default (console.error)\n    this.defaultHandler.handleError(error);\n  }\n\n  /**\n   * Trackea el error en Analytics\n   */\n  private trackError(error: unknown): void {\n    // Extraer información del error\n    const errorInfo = this.extractErrorInfo(error);\n\n    this.analytics.logError(\n      errorInfo.error,\n      {\n        source: 'uncaught',\n        url: this.getCurrentUrl(),\n        ...errorInfo.context,\n      }\n    );\n  }\n\n  /**\n   * Extrae información útil del error\n   */\n  private extractErrorInfo(error: unknown): {\n    error: Error;\n    context: Record<string, string>;\n  } {\n    const context: Record<string, string> = {};\n\n    // Error estándar\n    if (error instanceof Error) {\n      // Detectar errores de chunk loading (lazy loading)\n      if (error.message.includes('Loading chunk')) {\n        context['error_category'] = 'chunk_loading';\n      }\n\n      // Detectar errores de red\n      if (error.message.includes('NetworkError') || error.message.includes('Failed to fetch')) {\n        context['error_category'] = 'network';\n      }\n\n      return { error, context };\n    }\n\n    // ErrorEvent (ej: errores de script)\n    if (typeof ErrorEvent !== 'undefined' && error instanceof ErrorEvent) {\n      return {\n        error: new Error(error.message || 'Script error'),\n        context: {\n          filename: error.filename || 'unknown',\n          lineno: String(error.lineno || 0),\n          colno: String(error.colno || 0),\n        },\n      };\n    }\n\n    // PromiseRejection\n    if (this.isPromiseRejection(error)) {\n      const reason = (error as PromiseRejectionEvent).reason;\n      if (reason instanceof Error) {\n        return {\n          error: reason,\n          context: { error_category: 'unhandled_promise' },\n        };\n      }\n      return {\n        error: new Error(String(reason) || 'Unhandled promise rejection'),\n        context: { error_category: 'unhandled_promise' },\n      };\n    }\n\n    // Objeto con message\n    if (error && typeof error === 'object' && 'message' in error) {\n      return {\n        error: new Error(String((error as { message: unknown }).message)),\n        context,\n      };\n    }\n\n    // Fallback: convertir a string\n    return {\n      error: new Error(String(error) || 'Unknown error'),\n      context,\n    };\n  }\n\n  /**\n   * Verifica si es un PromiseRejectionEvent\n   */\n  private isPromiseRejection(error: unknown): boolean {\n    return (\n      typeof PromiseRejectionEvent !== 'undefined' &&\n      error instanceof PromiseRejectionEvent\n    );\n  }\n\n  /**\n   * Obtiene la URL actual de forma segura\n   */\n  private getCurrentUrl(): string {\n    try {\n      return window?.location?.href || 'unknown';\n    } catch {\n      return 'unknown';\n    }\n  }\n}\n","/**\n * Analytics Router Tracker\n *\n * Servicio que trackea automáticamente page views cuando el usuario navega.\n * Se activa automáticamente si enablePageViewTracking=true en analyticsConfig.\n */\n\nimport { DestroyRef, Inject, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs/operators';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport { ValtechFirebaseConfig } from './types';\nimport { AnalyticsService } from './analytics.service';\n\n/**\n * Tracker automático de page views via Router.\n *\n * Este servicio escucha eventos de navegación del Router y registra\n * page views automáticamente en Firebase Analytics.\n *\n * Se excluyen rutas configuradas en `analyticsConfig.excludeRoutes`.\n *\n * @example\n * ```typescript\n * // Se activa automáticamente si enablePageViewTracking=true\n * provideValtechFirebase({\n *   firebase: environment.firebase,\n *   enableAnalytics: true,\n *   analyticsConfig: {\n *     enablePageViewTracking: true,\n *     excludeRoutes: ['/admin/*', '/debug/*'],\n *   },\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AnalyticsRouterTracker {\n  private readonly analytics = inject(AnalyticsService);\n  private readonly router = inject(Router);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private readonly excludePatterns: RegExp[];\n  private readonly enabled: boolean;\n\n  constructor(\n    @Inject(VALTECH_FIREBASE_CONFIG) private config: ValtechFirebaseConfig\n  ) {\n    const analyticsConfig = config.analyticsConfig ?? {};\n    this.enabled = analyticsConfig.enablePageViewTracking !== false;\n    this.excludePatterns = this.compileExcludePatterns(analyticsConfig.excludeRoutes ?? []);\n\n    if (this.enabled && config.enableAnalytics) {\n      this.startTracking();\n    }\n  }\n\n  /**\n   * Inicia el tracking de navegación\n   */\n  private startTracking(): void {\n    this.router.events\n      .pipe(\n        filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n        filter((event) => !this.isExcluded(event.urlAfterRedirects)),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe((event) => {\n        this.analytics.logPageView(event.urlAfterRedirects);\n      });\n  }\n\n  /**\n   * Compila patrones de exclusión a RegExp\n   */\n  private compileExcludePatterns(patterns: string[]): RegExp[] {\n    return patterns.map((pattern) => {\n      // Convertir glob pattern a regex\n      // Ej: '/admin/*' -> /^\\/admin\\/.*$/\n      const regexPattern = pattern\n        .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escapar caracteres especiales\n        .replace(/\\*/g, '.*'); // Convertir * a .*\n\n      return new RegExp(`^${regexPattern}$`);\n    });\n  }\n\n  /**\n   * Verifica si una URL debe ser excluida del tracking\n   */\n  private isExcluded(url: string): boolean {\n    // Remover query params para la comparación\n    const path = url.split('?')[0];\n\n    return this.excludePatterns.some((pattern) => pattern.test(path));\n  }\n\n  /**\n   * Registra un page view manualmente.\n   * Útil para casos donde necesitas trackear manualmente.\n   */\n  trackPageView(path: string, title?: string): void {\n    if (this.isExcluded(path)) {\n      return;\n    }\n    this.analytics.logPageView(path, title);\n  }\n}\n","/**\n * Firebase Configuration\n *\n * Configuración e inicialización de Firebase para aplicaciones Angular.\n * Usa provideValtechFirebase() en el bootstrap de tu aplicación.\n */\n\nimport { EnvironmentProviders, ErrorHandler, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { getAnalytics, provideAnalytics, ScreenTrackingService } from '@angular/fire/analytics';\nimport { initializeApp, provideFirebaseApp } from '@angular/fire/app';\nimport { connectAuthEmulator, getAuth, provideAuth } from '@angular/fire/auth';\nimport {\n  connectFirestoreEmulator,\n  enableIndexedDbPersistence,\n  getFirestore,\n  provideFirestore,\n} from '@angular/fire/firestore';\nimport { getMessaging, provideMessaging } from '@angular/fire/messaging';\nimport { connectStorageEmulator, getStorage, provideStorage } from '@angular/fire/storage';\n\nimport { ValtechFirebaseConfig } from './types';\nimport { AnalyticsErrorHandler } from './analytics-error-handler';\nimport { AnalyticsRouterTracker } from './analytics-router-tracker';\n\n/**\n * Token de inyección para la configuración de Firebase.\n * Usado internamente por los servicios de Firebase.\n */\nexport const VALTECH_FIREBASE_CONFIG = new InjectionToken<ValtechFirebaseConfig>(\n  'ValtechFirebaseConfig'\n);\n\n/**\n * Provee Firebase a la aplicación Angular.\n *\n * @param config - Configuración de Firebase\n * @returns EnvironmentProviders para usar en bootstrapApplication\n *\n * @example\n * ```typescript\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechFirebase } from 'valtech-components';\n * import { environment } from './environments/environment';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechFirebase({\n *       firebase: environment.firebase,\n *       persistence: true,\n *       emulator: environment.useEmulators ? {\n *         firestore: { host: 'localhost', port: 8080 },\n *         auth: { host: 'localhost', port: 9099 },\n *         storage: { host: 'localhost', port: 9199 },\n *       } : undefined,\n *     }),\n *   ],\n * });\n * ```\n */\nexport function provideValtechFirebase(config: ValtechFirebaseConfig): EnvironmentProviders {\n  // SSR-safe: durante el prerender / Node, no existe window. getAnalytics(),\n  // enableIndexedDbPersistence() y FCM tocan APIs del browser que no existen\n  // en el server → cortocircuito de los providers/efectos browser-only acá.\n  const isBrowser = typeof window !== 'undefined';\n\n  // Construir array de providers base\n  const providers: any[] = [\n    // Guardar configuración para uso en servicios\n    { provide: VALTECH_FIREBASE_CONFIG, useValue: config },\n\n    // Inicializar Firebase App\n    provideFirebaseApp(() => initializeApp(config.firebase)),\n\n    // Firestore con soporte para emuladores y persistencia\n    provideFirestore(() => {\n      const firestore = getFirestore();\n\n      // Conectar a emulador si está configurado\n      if (config.emulator?.firestore) {\n        connectFirestoreEmulator(\n          firestore,\n          config.emulator.firestore.host,\n          config.emulator.firestore.port\n        );\n      }\n\n      // Habilitar persistencia offline si está configurada (browser-only:\n      // enableIndexedDbPersistence requiere IndexedDB, no existe en Node).\n      if (config.persistence && isBrowser) {\n        enableIndexedDbPersistence(firestore).catch((err) => {\n          if (err.code === 'failed-precondition') {\n            console.warn(\n              '[ValtechFirebase] Persistencia no disponible: múltiples pestañas abiertas'\n            );\n          } else if (err.code === 'unimplemented') {\n            console.warn('[ValtechFirebase] Persistencia no soportada en este navegador');\n          }\n        });\n      }\n\n      return firestore;\n    }),\n\n    // Auth con soporte para emulador\n    provideAuth(() => {\n      const auth = getAuth();\n\n      // Conectar a emulador si está configurado\n      if (config.emulator?.auth) {\n        connectAuthEmulator(\n          auth,\n          `http://${config.emulator.auth.host}:${config.emulator.auth.port}`,\n          { disableWarnings: true }\n        );\n      }\n\n      return auth;\n    }),\n\n    // Storage con soporte para emulador\n    provideStorage(() => {\n      const storage = getStorage();\n\n      // Conectar a emulador si está configurado\n      if (config.emulator?.storage) {\n        connectStorageEmulator(\n          storage,\n          config.emulator.storage.host,\n          config.emulator.storage.port\n        );\n      }\n\n      return storage;\n    }),\n  ];\n\n  // Messaging (FCM) - solo si está explícitamente habilitado y estamos en browser.\n  // Requiere Service Worker + Notifications API → skip total en SSR/Node.\n  if (config.enableMessaging && isBrowser) {\n    // Pre-registrar SW custom antes de que Firebase lo intente\n    if ('serviceWorker' in navigator) {\n      navigator.serviceWorker.register('/firebase-messaging-sw.js').catch(console.error);\n    }\n    providers.push(provideMessaging(() => getMessaging()));\n  }\n\n  // Analytics (GA4) - solo si está explícitamente habilitado y estamos en browser.\n  // getAnalytics() / ScreenTrackingService tocan window/document → skip en SSR.\n  if (config.enableAnalytics && config.firebase.measurementId && isBrowser) {\n    providers.push(provideAnalytics(() => getAnalytics()));\n\n    // Router tracker para page views automáticos (por defecto habilitado)\n    if (config.analyticsConfig?.enablePageViewTracking !== false) {\n      providers.push(AnalyticsRouterTracker);\n    }\n\n    // Error handler para tracking automático de errores\n    if (config.analyticsConfig?.enableErrorTracking) {\n      providers.push({\n        provide: ErrorHandler,\n        useClass: AnalyticsErrorHandler,\n      });\n    }\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n\n/**\n * Verifica si los emuladores están configurados.\n *\n * @param config - Configuración de Firebase\n * @returns true si hay al menos un emulador configurado\n */\nexport function hasEmulators(config: ValtechFirebaseConfig): boolean {\n  return !!(config.emulator?.firestore || config.emulator?.auth || config.emulator?.storage);\n}\n","/**\n * Analytics Service (Firebase GA4)\n *\n * Servicio para tracking de eventos, page views y errores con Firebase Analytics.\n * Integra con el sistema de auth para user properties y respeta consent mode GDPR.\n */\n\nimport { Inject, Injectable, Injector, PLATFORM_ID, signal, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Analytics, logEvent, setUserId, setUserProperties } from '@angular/fire/analytics';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport { ValtechFirebaseConfig } from './types';\nimport {\n  AnalyticsConfig,\n  AnalyticsDebugEvent,\n  AnalyticsEventName,\n  AnalyticsEventParams,\n  AnalyticsItem,\n  ConsentSettings,\n  ConsentState,\n  DebugEventType,\n  TimingMetric,\n  UserProperties,\n} from './analytics-types';\n\n/** Key por defecto para persistir consent en localStorage */\nconst DEFAULT_CONSENT_STORAGE_KEY = 'analytics_consent';\n\n/** Máximo de eventos en historial de debug */\nconst MAX_DEBUG_HISTORY = 100;\n\n/**\n * Servicio de Firebase Analytics (GA4).\n *\n * Proporciona tracking de eventos, page views, errores y métricas de performance.\n * Soporta GDPR Consent Mode y modo debug para desarrollo.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class ProductComponent {\n *   private analytics = inject(AnalyticsService);\n *\n *   onPurchase(product: Product) {\n *     this.analytics.logEvent('purchase', {\n *       transaction_id: order.id,\n *       value: order.total,\n *       currency: 'EUR'\n *     });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AnalyticsService {\n  // ===========================================================================\n  // ESTADO (Signals)\n  // ===========================================================================\n\n  private readonly _consentState = signal<ConsentState>({\n    settings: {},\n    updatedAt: null,\n    hasDecided: false,\n  });\n\n  private readonly _isDebugMode = signal<boolean>(false);\n  private readonly _debugHistory = signal<AnalyticsDebugEvent[]>([]);\n\n  /** Estado de consentimiento actual (readonly) */\n  readonly consentState = this._consentState.asReadonly();\n\n  /** Indica si está en modo debug */\n  readonly isDebugMode = this._isDebugMode.asReadonly();\n\n  /** Indica si analytics está habilitado y funcionando */\n  readonly isEnabled = computed(() => {\n    return this.isAnalyticsSupported() && this._consentState().settings.analytics === true;\n  });\n\n  // ===========================================================================\n  // CONFIGURACIÓN\n  // ===========================================================================\n\n  private readonly analyticsConfig: AnalyticsConfig;\n  private readonly consentStorageKey: string;\n  private readonly eventPrefix: string;\n  private readonly samplingRate: number;\n\n  constructor(\n    private injector: Injector,\n    @Inject(VALTECH_FIREBASE_CONFIG) private config: ValtechFirebaseConfig,\n    @Inject(PLATFORM_ID) private platformId: Object\n  ) {\n    this.analyticsConfig = config.analyticsConfig ?? {};\n    this.consentStorageKey =\n      this.analyticsConfig.consentStorageKey ?? DEFAULT_CONSENT_STORAGE_KEY;\n    this.eventPrefix = this.analyticsConfig.eventPrefix ?? '';\n    this.samplingRate = this.analyticsConfig.samplingRate ?? 1.0;\n\n    this.initializeAnalytics();\n  }\n\n  // ===========================================================================\n  // INICIALIZACIÓN\n  // ===========================================================================\n\n  /**\n   * Inicializa el servicio de analytics\n   */\n  private initializeAnalytics(): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    // Cargar consent desde localStorage\n    this.loadConsentFromStorage();\n\n    // Configurar debug mode\n    const debugMode = this.analyticsConfig.debugMode ?? false;\n    this._isDebugMode.set(debugMode);\n\n    // Aplicar consent inicial a gtag\n    this.applyConsentToGtag(this._consentState().settings);\n\n    // Setear user properties por defecto\n    if (this.analyticsConfig.defaultUserProperties) {\n      this.setUserProperties(this.analyticsConfig.defaultUserProperties);\n    }\n\n    if (debugMode) {\n      console.log('[Analytics] Inicializado en modo debug - eventos se loguean en consola Y se envían a Firebase');\n    }\n  }\n\n  /**\n   * Obtiene la instancia de Analytics de forma perezosa.\n   * Esto evita el error de APP_INITIALIZER de AngularFire.\n   */\n  private getAnalyticsInstance(): Analytics | null {\n    if (!this.config.enableAnalytics) {\n      return null;\n    }\n\n    try {\n      return this.injector.get(Analytics, null);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Verifica si Analytics está soportado\n   */\n  private isAnalyticsSupported(): boolean {\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n\n    if (!this.config.enableAnalytics) {\n      return false;\n    }\n\n    if (!this.config.firebase.measurementId) {\n      console.warn('[Analytics] measurementId no configurado en firebase config');\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Verifica si debe enviar el evento (sampling)\n   */\n  private shouldSample(): boolean {\n    if (this.samplingRate >= 1.0) {\n      return true;\n    }\n    return Math.random() < this.samplingRate;\n  }\n\n  // ===========================================================================\n  // PAGE VIEWS\n  // ===========================================================================\n\n  /**\n   * Registra un page view.\n   * Normalmente se usa automáticamente via AnalyticsRouterTracker.\n   *\n   * @param pagePath - Ruta de la página (ej: '/products/123')\n   * @param pageTitle - Título de la página (opcional)\n   */\n  logPageView(pagePath: string, pageTitle?: string): void {\n    // SSR: document/window no existen como globals — optional chaining no protege\n    // contra ReferenceError. Cortocircuito explícito por platform.\n    const isBrowser = isPlatformBrowser(this.platformId);\n    this.logEvent('page_view', {\n      page_path: pagePath,\n      page_title: pageTitle ?? (isBrowser ? document.title : undefined),\n      page_location: isBrowser ? window.location.href : undefined,\n    });\n  }\n\n  /**\n   * Registra un screen view (para apps tipo SPA).\n   *\n   * @param screenName - Nombre del screen\n   * @param screenClass - Clase del screen (opcional)\n   */\n  logScreenView(screenName: string, screenClass?: string): void {\n    this.logEvent('screen_view', {\n      screen_name: screenName,\n      screen_class: screenClass,\n    });\n  }\n\n  // ===========================================================================\n  // EVENTOS\n  // ===========================================================================\n\n  /**\n   * Registra un evento tipado GA4.\n   *\n   * @param eventName - Nombre del evento (tipado)\n   * @param params - Parámetros del evento (tipados según el nombre)\n   *\n   * @example\n   * ```typescript\n   * // Evento tipado con autocompletado\n   * analytics.logEvent('add_to_cart', {\n   *   item_id: '123',\n   *   item_name: 'Producto',\n   *   value: 99.99,\n   *   currency: 'EUR'\n   * });\n   * ```\n   */\n  logEvent<T extends AnalyticsEventName>(\n    eventName: T,\n    params?: AnalyticsEventParams[T]\n  ): void {\n    this.trackEvent(eventName, params as Record<string, unknown>);\n  }\n\n  /**\n   * Registra un evento custom con parámetros libres.\n   * Usar cuando el evento no está en el catálogo tipado.\n   *\n   * @param eventName - Nombre del evento custom\n   * @param params - Parámetros libres\n   */\n  logCustomEvent(eventName: string, params?: Record<string, unknown>): void {\n    const prefixedName = this.eventPrefix + eventName;\n    this.trackEvent(prefixedName, params);\n  }\n\n  /**\n   * Lógica común para enviar eventos\n   */\n  private trackEvent(eventName: string, params?: Record<string, unknown>): void {\n    // Verificar consent\n    if (!this._consentState().settings.analytics) {\n      this.addToDebugHistory('event', eventName, params, false);\n      return;\n    }\n\n    // Aplicar sampling\n    if (!this.shouldSample()) {\n      return;\n    }\n\n    // Debug mode: loguear en consola (pero seguir enviando a Firebase)\n    if (this._isDebugMode()) {\n      console.log(`[Analytics] Event: ${eventName}`, params);\n    }\n\n    // Enviar a Firebase\n    const analytics = this.getAnalyticsInstance();\n    if (analytics) {\n      try {\n        logEvent(analytics, eventName as string, params);\n        this.addToDebugHistory('event', eventName, params, true);\n      } catch (error) {\n        console.error('[Analytics] Error enviando evento:', error);\n        this.addToDebugHistory('event', eventName, params, false);\n      }\n    } else {\n      this.addToDebugHistory('event', eventName, params, false);\n    }\n  }\n\n  // ===========================================================================\n  // ECOMMERCE\n  // ===========================================================================\n\n  /**\n   * Registra vista de item\n   */\n  logViewItem(item: AnalyticsItem): void {\n    this.logEvent('view_item', {\n      item_id: item.item_id,\n      item_name: item.item_name,\n      value: item.price,\n      currency: item.currency,\n    });\n  }\n\n  /**\n   * Registra agregar al carrito\n   */\n  logAddToCart(item: AnalyticsItem, quantity = 1): void {\n    this.logEvent('add_to_cart', {\n      item_id: item.item_id,\n      item_name: item.item_name,\n      value: (item.price ?? 0) * quantity,\n      currency: item.currency,\n      quantity,\n    });\n  }\n\n  /**\n   * Registra inicio de checkout\n   */\n  logBeginCheckout(items: AnalyticsItem[], value: number, currency = 'EUR'): void {\n    this.logEvent('begin_checkout', {\n      value,\n      currency,\n      items,\n    });\n  }\n\n  /**\n   * Registra compra completada\n   */\n  logPurchase(\n    transactionId: string,\n    items: AnalyticsItem[],\n    value: number,\n    currency = 'EUR'\n  ): void {\n    this.logEvent('purchase', {\n      transaction_id: transactionId,\n      value,\n      currency,\n      items,\n    });\n  }\n\n  // ===========================================================================\n  // USER PROPERTIES\n  // ===========================================================================\n\n  /**\n   * Setea el userId para asociar eventos con el usuario.\n   * Llamado automáticamente si enableAuthIntegration=true.\n   *\n   * @param userId - ID del usuario o null para limpiar\n   */\n  setUserId(userId: string | null): void {\n    if (!this.isAnalyticsSupported()) {\n      return;\n    }\n\n    // Debug mode: loguear en consola (pero seguir enviando a Firebase)\n    if (this._isDebugMode()) {\n      console.log(`[Analytics] Set userId: ${userId}`);\n    }\n\n    const analytics = this.getAnalyticsInstance();\n    if (analytics) {\n      try {\n        setUserId(analytics, userId);\n        this.addToDebugHistory('user_property', 'user_id', { userId }, true);\n      } catch (error) {\n        console.error('[Analytics] Error seteando userId:', error);\n        this.addToDebugHistory('user_property', 'user_id', { userId }, false);\n      }\n    } else {\n      this.addToDebugHistory('user_property', 'user_id', { userId }, false);\n    }\n  }\n\n  /**\n   * Setea propiedades del usuario para segmentación.\n   *\n   * @param properties - Propiedades key-value\n   *\n   * @example\n   * ```typescript\n   * analytics.setUserProperties({\n   *   subscription_tier: 'premium',\n   *   preferred_language: 'es'\n   * });\n   * ```\n   */\n  setUserProperties(properties: UserProperties | Record<string, string | number | boolean>): void {\n    if (!this.isAnalyticsSupported()) {\n      return;\n    }\n\n    // Debug mode: loguear en consola (pero seguir enviando a Firebase)\n    if (this._isDebugMode()) {\n      console.log('[Analytics] Set user properties:', properties);\n    }\n\n    const analytics = this.getAnalyticsInstance();\n    if (analytics) {\n      try {\n        // Convertir a Record<string, string> para Firebase\n        const stringProps: Record<string, string> = {};\n        for (const [key, value] of Object.entries(properties)) {\n          if (value !== undefined) {\n            stringProps[key] = String(value);\n          }\n        }\n        setUserProperties(analytics, stringProps);\n        this.addToDebugHistory('user_property', 'properties', properties, true);\n      } catch (error) {\n        console.error('[Analytics] Error seteando user properties:', error);\n        this.addToDebugHistory('user_property', 'properties', properties, false);\n      }\n    } else {\n      this.addToDebugHistory('user_property', 'properties', properties, false);\n    }\n  }\n\n  /**\n   * Setea la organización activa (multi-tenant).\n   * Llamado automáticamente si enableAuthIntegration=true.\n   *\n   * @param orgId - ID de la organización o null\n   */\n  setActiveOrganization(orgId: string | null): void {\n    if (orgId) {\n      this.setUserProperties({ active_organization: orgId });\n    }\n  }\n\n  // ===========================================================================\n  // ERROR TRACKING\n  // ===========================================================================\n\n  /**\n   * Registra un error para tracking.\n   * Integra automáticamente con Angular ErrorHandler si enableErrorTracking=true.\n   *\n   * @param error - Error o mensaje de error\n   * @param context - Contexto adicional\n   *\n   * @example\n   * ```typescript\n   * try {\n   *   await riskyOperation();\n   * } catch (error) {\n   *   analytics.logError(error, { context: 'checkout_flow' });\n   * }\n   * ```\n   */\n  logError(error: Error | string, context?: Record<string, string>): void {\n    const errorMessage = error instanceof Error ? error.message : error;\n    const errorStack = error instanceof Error ? error.stack : undefined;\n    const errorType = error instanceof Error ? error.name : 'Error';\n\n    this.logEvent('error_occurred', {\n      error_type: errorType,\n      error_message: errorMessage.substring(0, 100), // Limitar longitud\n      error_stack: errorStack?.substring(0, 500),\n      context: context ? JSON.stringify(context) : undefined,\n    });\n  }\n\n  /**\n   * Registra un error fatal (crash-level).\n   */\n  logFatalError(error: Error, context?: Record<string, string>): void {\n    this.logError(error, { ...context, severity: 'fatal' });\n  }\n\n  // ===========================================================================\n  // CONSENT MODE (GDPR)\n  // ===========================================================================\n\n  /**\n   * Actualiza el estado de consentimiento del usuario.\n   * Afecta qué datos se recolectan y envían.\n   *\n   * @param consent - Settings de consentimiento\n   *\n   * @example\n   * ```typescript\n   * // Usuario acepta todo\n   * analytics.updateConsent({ analytics: true, advertising: true });\n   *\n   * // Usuario rechaza publicidad\n   * analytics.updateConsent({ analytics: true, advertising: false });\n   * ```\n   */\n  updateConsent(consent: ConsentSettings): void {\n    const newState: ConsentState = {\n      settings: { ...this._consentState().settings, ...consent },\n      updatedAt: new Date(),\n      hasDecided: true,\n    };\n\n    this._consentState.set(newState);\n    this.saveConsentToStorage(newState);\n    this.applyConsentToGtag(newState.settings);\n\n    this.addToDebugHistory('consent', 'update', consent as unknown as Record<string, unknown>, false);\n  }\n\n  /**\n   * Deniega todo consentimiento.\n   */\n  denyAllConsent(): void {\n    this.updateConsent({\n      analytics: false,\n      advertising: false,\n      functionality: false,\n      security: true, // Siempre permitido\n    });\n  }\n\n  /**\n   * Acepta todo consentimiento.\n   */\n  grantAllConsent(): void {\n    this.updateConsent({\n      analytics: true,\n      advertising: true,\n      functionality: true,\n      security: true,\n    });\n  }\n\n  /**\n   * Obtiene el estado actual de consentimiento.\n   */\n  getConsentState(): ConsentState {\n    return this._consentState();\n  }\n\n  /**\n   * Aplica consent settings a gtag (GA4 Consent Mode v2)\n   */\n  private applyConsentToGtag(settings: ConsentSettings): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    const gtag = (window as any).gtag;\n    if (typeof gtag !== 'function') {\n      return;\n    }\n\n    try {\n      gtag('consent', 'update', {\n        analytics_storage: settings.analytics ? 'granted' : 'denied',\n        ad_storage: settings.advertising ? 'granted' : 'denied',\n        ad_user_data: settings.advertising ? 'granted' : 'denied',\n        ad_personalization: settings.advertising ? 'granted' : 'denied',\n        functionality_storage: settings.functionality ? 'granted' : 'denied',\n        security_storage: settings.security !== false ? 'granted' : 'denied',\n      });\n    } catch (error) {\n      console.warn('[Analytics] Error aplicando consent a gtag:', error);\n    }\n  }\n\n  /**\n   * Carga consent desde localStorage\n   */\n  private loadConsentFromStorage(): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    try {\n      const stored = localStorage.getItem(this.consentStorageKey);\n      if (stored) {\n        const parsed = JSON.parse(stored) as ConsentState;\n        this._consentState.set({\n          ...parsed,\n          updatedAt: parsed.updatedAt ? new Date(parsed.updatedAt) : null,\n        });\n      } else if (this.analyticsConfig.defaultConsentGranted) {\n        // Auto-grant all consent para desarrollo/testing\n        this._consentState.set({\n          settings: {\n            analytics: true,\n            advertising: true,\n            functionality: true,\n            security: true,\n          },\n          updatedAt: new Date(),\n          hasDecided: true,\n        });\n      } else if (this.analyticsConfig.defaultConsent) {\n        // Aplicar consent por defecto si no hay guardado\n        this._consentState.set({\n          settings: this.analyticsConfig.defaultConsent,\n          updatedAt: null,\n          hasDecided: false,\n        });\n      }\n    } catch (error) {\n      console.warn('[Analytics] Error cargando consent:', error);\n    }\n  }\n\n  /**\n   * Guarda consent en localStorage\n   */\n  private saveConsentToStorage(state: ConsentState): void {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    try {\n      localStorage.setItem(this.consentStorageKey, JSON.stringify(state));\n    } catch (error) {\n      console.warn('[Analytics] Error guardando consent:', error);\n    }\n  }\n\n  // ===========================================================================\n  // TIMING / PERFORMANCE\n  // ===========================================================================\n\n  /**\n   * Registra una métrica de timing/performance.\n   *\n   * @param name - Nombre de la métrica\n   * @param valueMs - Valor en milisegundos\n   * @param params - Parámetros adicionales\n   *\n   * @example\n   * ```typescript\n   * const start = performance.now();\n   * await loadData();\n   * analytics.logTiming('data_load', performance.now() - start, {\n   *   category: 'api',\n   *   endpoint: '/products'\n   * });\n   * ```\n   */\n  logTiming(name: string, valueMs: number, params?: Record<string, string>): void {\n    this.logEvent('performance_metric', {\n      metric_name: name,\n      value: Math.round(valueMs),\n      unit: 'ms',\n      ...params,\n    });\n  }\n\n  // ===========================================================================\n  // DEBUG\n  // ===========================================================================\n\n  /**\n   * Habilita/deshabilita modo debug.\n   * En debug: logea eventos a consola además de enviarlos a Firebase.\n   */\n  setDebugMode(enabled: boolean): void {\n    this._isDebugMode.set(enabled);\n    console.log(`[Analytics] Debug mode: ${enabled ? 'ON' : 'OFF'}`);\n  }\n\n  /**\n   * Obtiene historial de eventos (solo en debug mode).\n   * Útil para testing y desarrollo.\n   */\n  getDebugHistory(): AnalyticsDebugEvent[] {\n    return this._debugHistory();\n  }\n\n  /**\n   * Limpia historial de debug.\n   */\n  clearDebugHistory(): void {\n    this._debugHistory.set([]);\n  }\n\n  /**\n   * Agrega evento al historial de debug\n   */\n  private addToDebugHistory(\n    type: DebugEventType,\n    name: string,\n    params?: Record<string, unknown>,\n    sent = false\n  ): void {\n    if (!this._isDebugMode()) {\n      return;\n    }\n\n    const event: AnalyticsDebugEvent = {\n      timestamp: new Date(),\n      type,\n      name,\n      params,\n      sent,\n    };\n\n    this._debugHistory.update((history) => {\n      const newHistory = [event, ...history];\n      return newHistory.slice(0, MAX_DEBUG_HISTORY);\n    });\n  }\n}\n","import { inject } from '@angular/core';\nimport {\n  HttpErrorResponse,\n  HttpEvent,\n  HttpHandlerFn,\n  HttpInterceptorFn,\n  HttpRequest,\n} from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { AnalyticsService } from '../firebase/analytics.service';\nimport { interpretError } from './interpret-error';\n\n/**\n * Interceptor HTTP de observabilidad (Capa 1 del estándar de manejo de errores).\n *\n * Para CADA respuesta HTTP con error:\n * 1. Normaliza el error con `interpretError`.\n * 2. Loguea un evento estructurado a consola con el prefijo `[HTTP]`.\n * 3. Reporta el error a Firebase Analytics (`source: 'http'`), si hay analytics.\n *\n * **NO traga el error** — lo re-lanza tal cual. Las páginas y servicios siguen\n * recibiendo el error en su `catch` / `catchError` y deciden la UX (eso es\n * Capa 3: `ValtechErrorService`).\n *\n * `AnalyticsService` se inyecta `@Optional()` — apps sin Firebase Analytics\n * igual obtienen el log estructurado a consola.\n *\n * Decisión sobre 401: **se saltea** del tracking de Analytics. Un 401 es el\n * disparador normal del flujo de refresh de token del `authInterceptor`; el\n * token se renueva y la request se reintenta de forma transparente. Trackear\n * cada 401 inundaría Analytics de ruido (cada sesión genera varios al expirar\n * el access token). El 401 SÍ se loguea a consola (nivel `info`, no `error`)\n * para no perder la traza en debugging local, pero no se reporta como error.\n *\n * Se registra vía {@link provideValtechErrorHandling}.\n */\nexport const errorLoggingInterceptor: HttpInterceptorFn = (\n  request: HttpRequest<unknown>,\n  next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n  // `AnalyticsService` puede no estar provisto (apps sin Firebase). El inject\n  // funcional con `optional: true` devuelve `null` en ese caso.\n  const analytics = inject(AnalyticsService, { optional: true });\n\n  return next(request).pipe(\n    catchError((error: unknown) => {\n      const interpreted = interpretError(error);\n      const status = interpreted.status ?? (error as HttpErrorResponse)?.status;\n\n      // 401 → ruido del refresh de auth. Log informativo, sin Analytics.\n      if (status === 401) {\n        console.info(\n          `[HTTP] 401 ${request.method} ${request.url}` +\n            (interpreted.operationId ? ` (op=${interpreted.operationId})` : '')\n        );\n        return throwError(() => error);\n      }\n\n      // Log estructurado a consola — siempre, haya o no Analytics.\n      console.error('[HTTP] request failed', {\n        method: request.method,\n        url: request.url,\n        status: status ?? 'n/a',\n        code: interpreted.code,\n        operationId: interpreted.operationId ?? 'n/a',\n        isNetwork: interpreted.isNetwork,\n        message: interpreted.message,\n      });\n\n      // Reporte a Analytics (best-effort) — solo si hay servicio.\n      if (analytics) {\n        try {\n          analytics.logError(interpreted.message, {\n            source: 'http',\n            code: interpreted.code,\n            url: request.url,\n            method: request.method,\n            status: String(status ?? 0),\n            ...(interpreted.operationId ? { operationId: interpreted.operationId } : {}),\n            ...(interpreted.isNetwork ? { error_category: 'network' } : {}),\n          });\n        } catch (trackingError) {\n          // El tracking nunca debe romper el flujo HTTP.\n          console.warn('[HTTP] analytics tracking failed:', trackingError);\n        }\n      }\n\n      // Re-lanzar: NO tragamos el error. La Capa 3 / las páginas lo manejan.\n      return throwError(() => error);\n    })\n  );\n};\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { errorLoggingInterceptor } from './error-logging.interceptor';\n\n/**\n * Provee el manejo de errores estándar del factory Valtech.\n *\n * Registra el {@link errorLoggingInterceptor} (Capa 1 — observabilidad): toda\n * respuesta HTTP con error se normaliza, se loguea de forma estructurada a\n * consola y se reporta a Firebase Analytics. El interceptor **re-lanza** el\n * error, así que las páginas siguen haciendo su `catch`.\n *\n * Se registra vía `withInterceptors`, igual que el `authInterceptor`. Angular\n * fusiona los interceptores de múltiples llamadas a `provideHttpClient` dentro\n * del mismo injector, así que esto compone con `provideValtechAuth()` sin\n * pisarlo. El orden relativo lo determina Angular por orden de provisión;\n * para una traza limpia, declarar `provideValtechErrorHandling()` **después**\n * de `provideValtechAuth(...)` en `main.ts`.\n *\n * La Capa 3 ({@link ValtechErrorService}) es `providedIn: 'root'` — no\n * requiere registro. La Capa 2 (`AnalyticsErrorHandler`, errores no\n * capturados) la activa `provideValtechFirebase` con `enableErrorTracking`.\n *\n * @example\n * ```typescript\n * // main.ts\n * import { provideValtechAuth, provideValtechErrorHandling } from 'valtech-components';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAuth({ apiUrl: environment.apiUrl }),\n *     provideValtechErrorHandling(),\n *   ],\n * });\n * ```\n */\nexport function provideValtechErrorHandling(): EnvironmentProviders {\n  return makeEnvironmentProviders([provideHttpClient(withInterceptors([errorLoggingInterceptor]))]);\n}\n","/**\n * Idiomas soportados por el sistema i18n\n */\nexport type I18nLang = 'es' | 'en' | 'fr' | 'de';\n\n/**\n * Contenido de traducciones para un namespace\n *\n * @example\n * const loginContent: LanguagesContent = {\n *   es: { title: 'Iniciar sesión', submit: 'Entrar' },\n *   en: { title: 'Sign in', submit: 'Sign in' }\n * };\n */\nexport type LanguagesContent = {\n  [lang in I18nLang]?: Record<string, string>;\n};\n\n/**\n * Almacén de contenido por namespace\n *\n * @example\n * {\n *   '_global': { es: {...}, en: {...} },\n *   'Login': { es: {...}, en: {...} },\n *   'Profile': { es: {...}, en: {...} }\n * }\n */\nexport type ContentStore = Record<string, LanguagesContent>;\n\n/**\n * Configuración para provideValtechI18n()\n */\nexport interface I18nConfig {\n  /**\n   * Idioma por defecto si no hay preferencia guardada\n   * @default 'es'\n   */\n  defaultLanguage?: I18nLang;\n\n  /**\n   * Lista de idiomas habilitados en la app\n   * @default ['es', 'en']\n   */\n  supportedLanguages?: I18nLang[];\n\n  /**\n   * Detectar idioma del navegador al iniciar\n   * @default true\n   */\n  detectBrowserLanguage?: boolean;\n\n  /**\n   * Contenido inicial de traducciones por namespace.\n   * Si includeDefaultContent es true, este contenido se mergea\n   * con VALTECH_DEFAULT_CONTENT (las keys del usuario ganan).\n   */\n  content?: ContentStore;\n\n  /**\n   * Si es true, incluye traducciones por defecto de valtech-components.\n   * Las traducciones del usuario sobrescriben las por defecto.\n   *\n   * @default true\n   *\n   * @example Usar defaults (comportamiento por defecto)\n   * ```typescript\n   * provideValtechI18n() // Funciona sin configuración\n   * ```\n   *\n   * @example Sobrescribir keys específicas\n   * ```typescript\n   * provideValtechI18n({\n   *   content: {\n   *     _global: {\n   *       es: { success: '¡Lo hicimos!' },\n   *       en: { success: 'We did it!' },\n   *     },\n   *   },\n   * })\n   * ```\n   *\n   * @example Desactivar defaults completamente\n   * ```typescript\n   * provideValtechI18n({\n   *   includeDefaultContent: false,\n   *   content: MY_CUSTOM_CONTENT,\n   * })\n   * ```\n   */\n  includeDefaultContent?: boolean;\n}\n\n/**\n * Valores por defecto de configuración\n */\nexport const DEFAULT_I18N_CONFIG: Required<I18nConfig> = {\n  defaultLanguage: 'es',\n  supportedLanguages: ['es', 'en'],\n  detectBrowserLanguage: true,\n  content: {},\n  includeDefaultContent: true,\n};\n\n/**\n * Clave para persistir idioma en localStorage\n */\nexport const LANG_STORAGE_KEY = 'app_lang';\n","/**\n * Time-of-day greeting key.\n * Maps to bundled i18n keys in `_global` namespace: goodMorning / goodAfternoon / goodEvening.\n */\nexport type TimeOfDayKey = 'goodMorning' | 'goodAfternoon' | 'goodEvening';\n\n/**\n * Returns the i18n key for a time-of-day greeting based on the given date's hour.\n *\n * - 00:00 - 11:59 → 'goodMorning'\n * - 12:00 - 17:59 → 'goodAfternoon'\n * - 18:00 - 23:59 → 'goodEvening'\n *\n * Pure function (testable). Defaults to current local time.\n *\n * @example\n * import { getTimeOfDayKey } from 'valtech-components';\n *\n * const key = getTimeOfDayKey();          // 'goodMorning' | 'goodAfternoon' | 'goodEvening'\n * const text = i18n.t(key);               // 'Buenos días' | 'Buenas tardes' | 'Buenas noches'\n */\nexport function getTimeOfDayKey(date: Date = new Date()): TimeOfDayKey {\n  const hour = date.getHours();\n  if (hour < 12) return 'goodMorning';\n  if (hour < 18) return 'goodAfternoon';\n  return 'goodEvening';\n}\n","import { Inject, Injectable, PLATFORM_ID, signal, computed } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n  I18nLang,\n  LanguagesContent,\n  ContentStore,\n  LANG_STORAGE_KEY,\n  DEFAULT_I18N_CONFIG,\n} from './types';\nimport { getTimeOfDayKey } from '../../shared/utils/datetime';\n\n/**\n * Servicio de internacionalización basado en Angular Signals.\n *\n * Características:\n * - Sin RxJS: usa Signals para evitar memory leaks y congelamiento\n * - Namespace-based: organiza traducciones por contexto\n * - Fallback multi-nivel: namespace → _global → placeholder\n * - Interpolación: soporta {variable} en textos\n *\n * @example\n * // En un componente\n * i18n = inject(I18nService);\n *\n * // Obtener texto\n * const title = this.i18n.t('title', 'Login');\n *\n * // Con interpolación\n * const welcome = this.i18n.t('welcome', 'Login', { name: 'Juan' });\n *\n * // Cambiar idioma\n * this.i18n.setLanguage('en');\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n  // Estado interno con Signals\n  private readonly _lang = signal<I18nLang>(DEFAULT_I18N_CONFIG.defaultLanguage);\n  private readonly _content = signal<ContentStore>({});\n  private readonly _supportedLanguages = signal<I18nLang[]>(DEFAULT_I18N_CONFIG.supportedLanguages);\n\n  // Públicos readonly\n  readonly lang = this._lang.asReadonly();\n  readonly supportedLanguages = this._supportedLanguages.asReadonly();\n\n  // Computed para verificaciones rápidas\n  readonly isSpanish = computed(() => this._lang() === 'es');\n  readonly isEnglish = computed(() => this._lang() === 'en');\n\n  private readonly isBrowser: boolean;\n\n  /**\n   * Keys faltantes ya advertidas (`ns.key.lang`). Garantiza que el warning se\n   * emita UNA sola vez por key, nunca por cada change-detection.\n   *\n   * Crítico: `getText` se evalúa en bindings de template (una vez por CD). Si\n   * advirtiéramos en cada llamada, un `console.warn` por CD + el `val-debug-console`\n   * (que espeja `console.*` a un signal) crea un loop infinito de CD que congela\n   * el navegador en dev. Deduplicar corta ese loop en su origen.\n   */\n  private readonly _warnedMissing = new Set<string>();\n\n  constructor(@Inject(PLATFORM_ID) platformId: Object) {\n    this.isBrowser = isPlatformBrowser(platformId);\n    this.loadStoredLanguage();\n  }\n\n  /**\n   * Obtiene texto traducido (alias corto de getText)\n   *\n   * @param key Clave del texto\n   * @param namespace Namespace (default: '_global')\n   * @param data Variables para interpolación\n   * @returns Texto traducido o placeholder [namespace.key]\n   *\n   * @example\n   * i18n.t('submit');                    // busca en _global\n   * i18n.t('title', 'Login');            // busca en Login\n   * i18n.t('welcome', 'Login', {name});  // con interpolación\n   */\n  t(key: string, namespace?: string, data?: Record<string, string>): string {\n    return this.getText(key, namespace, data);\n  }\n\n  /**\n   * Returns a time-of-day greeting in the current language.\n   *\n   * Uses bundled keys `goodMorning` / `goodAfternoon` / `goodEvening` from `_global`.\n   * Reactive to `lang()` when called inside a `computed()`.\n   *\n   * @param name Optional name to append: \"Buenos días, Juan\"\n   * @param date Optional date to evaluate (defaults to now)\n   *\n   * @example\n   * greeting = computed(() => {\n   *   this.i18n.lang();\n   *   return this.i18n.greeting(this.auth.user()?.name);\n   * });\n   */\n  greeting(name?: string, date: Date = new Date()): string {\n    this._lang(); // track for reactivity inside computed()\n    const text = this.t(getTimeOfDayKey(date));\n    return name ? `${text}, ${name}` : text;\n  }\n\n  /**\n   * Obtiene texto traducido\n   *\n   * Fallback order:\n   * 1. content[namespace][lang][key]\n   * 2. content['_global'][lang][key]\n   * 3. \"\" (string vacío) — nunca un placeholder visible ni un valor que\n   *    rompa el render. El consumer puede aplicar su propio fallback con `||`.\n   */\n  getText(key: string, namespace?: string, data?: Record<string, string>): string {\n    const content = this._content();\n    const lang = this._lang();\n    const ns = namespace || '_global';\n\n    // Buscar en namespace específico\n    let text = content[ns]?.[lang]?.[key];\n\n    // Fallback a _global\n    if (!text && ns !== '_global') {\n      text = content['_global']?.[lang]?.[key];\n    }\n\n    // Fallback seguro: string vacío. Se advierte UNA vez por key (ver\n    // `_warnedMissing`) para que un binding evaluado por CD no genere un\n    // console.warn por cada change-detection (que dispararía un loop con el\n    // debug-console). No devolvemos `[ns.key]` — un placeholder visible\n    // ensucia la UI y, al ser truthy, anula los `|| fallback` del consumer.\n    if (!text) {\n      const warnKey = `${ns}.${key}.${lang}`;\n      if (!this._warnedMissing.has(warnKey)) {\n        this._warnedMissing.add(warnKey);\n        console.warn(`[i18n] Missing translation: ${ns}.${key} (${lang})`);\n      }\n      return '';\n    }\n\n    // Aplicar interpolación si hay data\n    if (data) {\n      return this.interpolate(text, data);\n    }\n\n    return text;\n  }\n\n  /**\n   * Cambia el idioma de la aplicación\n   *\n   * @param lang Nuevo idioma\n   * @param forceReload Si true, recarga la página (fallback si reactividad falla)\n   */\n  setLanguage(lang: I18nLang, forceReload = false): void {\n    if (!this._supportedLanguages().includes(lang)) {\n      console.warn(`[i18n] Language '${lang}' not in supported languages`);\n      return;\n    }\n\n    if (lang === this._lang()) {\n      return;\n    }\n\n    // Persistir en localStorage (browser-only)\n    if (this.isBrowser) {\n      localStorage.setItem(LANG_STORAGE_KEY, lang);\n    }\n\n    // Actualizar signal\n    this._lang.set(lang);\n\n    // Fallback: recargar si se solicita\n    if (forceReload && this.isBrowser) {\n      window.location.reload();\n    }\n  }\n\n  /**\n   * Registra contenido de traducciones para un namespace\n   *\n   * @param namespace Nombre del namespace\n   * @param content Contenido de traducciones\n   *\n   * @example\n   * i18n.registerContent('Login', {\n   *   es: { title: 'Iniciar sesión' },\n   *   en: { title: 'Sign in' }\n   * });\n   */\n  registerContent(namespace: string, content: LanguagesContent): void {\n    this._content.update(store => ({\n      ...store,\n      [namespace]: content,\n    }));\n  }\n\n  /**\n   * Registra múltiples namespaces de una vez\n   *\n   * @param contentStore Objeto con namespaces como keys\n   */\n  registerContentBulk(contentStore: ContentStore): void {\n    this._content.update(store => ({\n      ...store,\n      ...contentStore,\n    }));\n  }\n\n  /**\n   * Configura los idiomas soportados\n   */\n  setI18nLanguages(languages: I18nLang[]): void {\n    this._supportedLanguages.set(languages);\n  }\n\n  /**\n   * Obtiene todos los namespaces registrados\n   */\n  getNamespaces(): string[] {\n    return Object.keys(this._content());\n  }\n\n  /**\n   * Verifica si un namespace tiene traducciones\n   */\n  hasNamespace(namespace: string): boolean {\n    return namespace in this._content();\n  }\n\n  /**\n   * Carga idioma guardado en localStorage o detecta del navegador\n   */\n  private loadStoredLanguage(): void {\n    // SSR: sin localStorage/navigator. Mantenemos el default; el browser\n    // hydratará el lang real cuando el cliente arranque.\n    if (!this.isBrowser) {\n      return;\n    }\n\n    const stored = localStorage.getItem(LANG_STORAGE_KEY);\n\n    if (stored && this.isValidLanguage(stored)) {\n      this._lang.set(stored as I18nLang);\n      return;\n    }\n\n    // Detectar idioma del navegador\n    const browserLang = navigator.language.split('-')[0] as I18nLang;\n    if (this.isValidLanguage(browserLang)) {\n      this._lang.set(browserLang);\n      localStorage.setItem(LANG_STORAGE_KEY, browserLang);\n    }\n  }\n\n  /**\n   * Valida si un idioma está soportado\n   */\n  private isValidLanguage(lang: string): boolean {\n    return this._supportedLanguages().includes(lang as I18nLang);\n  }\n\n  /**\n   * Reemplaza {variable} en texto con valores de data\n   *\n   * @example\n   * interpolate('Hola {name}', { name: 'Juan' }) // 'Hola Juan'\n   */\n  private interpolate(text: string, data: Record<string, string>): string {\n    return Object.entries(data).reduce((result, [key, value]) => {\n      const regex = new RegExp(`\\\\{${key}\\\\}`, 'g');\n      return result.replace(regex, value);\n    }, text);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ToastController, ToastOptions } from '@ionic/angular';\n\n/**\n * Service for displaying toast notifications using Ionic's ToastController.\n * Provides methods to show and present toasts with custom options.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ToastService {\n  constructor(private toastController: ToastController) {}\n\n  /**\n   * Presents a toast notification with the given options.\n   *\n   * Estándar Valtech: todos los toasts son `color: 'dark'` y `position: 'top'`.\n   * Estos son los defaults cuando el caller no los especifica — no hace falta\n   * pasarlos en cada llamada. El diferenciador semántico (éxito/error) va en\n   * el mensaje, no en el color.\n   *\n   * @param request Toast options (message, duration, position, color, etc.)\n   */\n  async presentToast(request: ToastOptions) {\n    const toast = await this.toastController.create({\n      message: request.message,\n      duration: request.duration,\n      position: request.position ?? 'top',\n      color: request.color ?? 'dark',\n    });\n\n    await toast.present();\n  }\n\n  /**\n   * Shows a toast notification and logs the result.\n   * @param request Toast options (message, duration, position, color, etc.)\n   */\n  show(request: ToastOptions) {\n    this.presentToast(request)\n      .then(() => {\n        console.info('Toast created');\n      })\n      .catch(error => {\n        console.error(JSON.stringify(error));\n      });\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { AnalyticsService } from '../firebase/analytics.service';\nimport { I18nService } from '../i18n/i18n.service';\nimport { ToastService } from '../toast.service';\nimport { InterpretedError, interpretError } from './interpret-error';\n\n/**\n * Key i18n fija de la librería para fallos de red. Las apps pueden definirla en\n * su contenido i18n (namespace `_global`) para personalizar el texto; si no\n * existe, se usa {@link NETWORK_FALLBACK_MESSAGE}.\n */\nexport const VALTECH_NETWORK_ERROR_KEY = 'valtech.error.network';\n\n/** Texto en español por defecto cuando {@link VALTECH_NETWORK_ERROR_KEY} no está definida. */\nconst NETWORK_FALLBACK_MESSAGE = 'Sin conexión. Revisá tu internet.';\n\n/** Texto genérico en español cuando no hay match ni `fallbackKey`. */\nconst GENERIC_FALLBACK_MESSAGE = 'Ocurrió un error. Intentá de nuevo.';\n\n/**\n * Opciones de {@link ValtechErrorService.handle}.\n */\nexport interface ValtechErrorHandleOptions {\n  /**\n   * Identificador del punto de fallo, ej. `'profile.save'`. Se incluye en el\n   * log de consola y en el reporte a Analytics para facilitar el tracing.\n   */\n  context?: string;\n\n  /**\n   * Mapa `código de backend → key i18n`. Lo provee la app, que conoce sus\n   * propias traducciones. Ej. `{ EMAIL_TAKEN: 'errors.emailTaken' }`.\n   */\n  i18nMap?: Record<string, string>;\n\n  /**\n   * Key i18n a usar cuando no hay match en `i18nMap` (y el error no es de red).\n   * Si se omite, se usa un mensaje genérico en español.\n   */\n  fallbackKey?: string;\n\n  /**\n   * Namespace i18n para resolver `i18nMap` / `fallbackKey` / la key de red.\n   * Default: `_global`.\n   */\n  i18nNamespace?: string;\n\n  /** Si mostrar un toast con el mensaje resuelto. Default: `true`. */\n  toast?: boolean;\n}\n\n/**\n * Servicio de UX de errores capturados (Capa 3 del estándar de manejo de errores).\n *\n * Mientras la Capa 1 ({@link errorLoggingInterceptor}) observa TODAS las\n * respuestas HTTP con error, y la Capa 2 (`AnalyticsErrorHandler`) captura los\n * errores NO manejados, la Capa 3 es el punto único que una página usa en su\n * `catch` para convertir un error en feedback al usuario.\n *\n * Responsabilidades de {@link handle}:\n * 1. Normaliza el error (`interpretError`).\n * 2. Loguea a consola + reporta a Analytics (`source: 'handled'`, con `context`).\n * 3. Resuelve un mensaje localizado (ver orden de resolución en {@link handle}).\n * 4. Muestra un toast (`color: 'dark'`, estándar Valtech) salvo `toast: false`.\n * 5. Devuelve el {@link InterpretedError} para que la página decida lógica extra.\n *\n * **Nunca lanza.** `AnalyticsService` se inyecta `@Optional()`.\n *\n * @example\n * ```ts\n * private errors = inject(ValtechErrorService);\n *\n * async save() {\n *   try {\n *     await firstValueFrom(this.api.updateProfile(this.form.value));\n *     this.toast.show({ message: 'Perfil actualizado', color: 'dark' });\n *   } catch (err) {\n *     this.errors.handle(err, {\n *       context: 'profile.save',\n *       i18nMap: { EMAIL_TAKEN: 'errors.emailTaken' },\n *       fallbackKey: 'errors.profileSaveFailed',\n *     });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ValtechErrorService {\n  private readonly i18n = inject(I18nService);\n  private readonly toast = inject(ToastService);\n  // Apps sin Firebase Analytics: el servicio sigue funcionando (log + toast).\n  private readonly analytics = inject(AnalyticsService, { optional: true });\n\n  /**\n   * Maneja un error capturado: normaliza, observa y produce feedback de usuario.\n   *\n   * Orden de resolución del mensaje del toast:\n   * 1. `i18nMap[code]` definido → `i18n.t(esa key)`.\n   * 2. Sin match y `isNetwork` → key de red ({@link VALTECH_NETWORK_ERROR_KEY}),\n   *    con fallback al texto español si la app no la tradujo.\n   * 3. `fallbackKey` definido → `i18n.t(fallbackKey)`.\n   * 4. Genérico en español.\n   *\n   * @param err Cualquier error capturado.\n   * @param opts Opciones de contexto, mapeo i18n y toast.\n   * @returns El {@link InterpretedError} normalizado. Nunca lanza.\n   */\n  handle(err: unknown, opts: ValtechErrorHandleOptions = {}): InterpretedError {\n    const interpreted = interpretError(err);\n    const { context, i18nMap, fallbackKey, i18nNamespace, toast } = opts;\n\n    // 1. Observabilidad — log estructurado a consola.\n    console.error('[ValtechError] handled', {\n      context: context ?? 'n/a',\n      code: interpreted.code,\n      status: interpreted.status ?? 'n/a',\n      operationId: interpreted.operationId ?? 'n/a',\n      isNetwork: interpreted.isNetwork,\n      message: interpreted.message,\n    });\n\n    // 2. Reporte a Analytics (best-effort, opcional).\n    if (this.analytics) {\n      try {\n        this.analytics.logError(interpreted.message, {\n          source: 'handled',\n          code: interpreted.code,\n          ...(context ? { context } : {}),\n          ...(interpreted.status !== undefined ? { status: String(interpreted.status) } : {}),\n          ...(interpreted.operationId ? { operationId: interpreted.operationId } : {}),\n          ...(interpreted.isNetwork ? { error_category: 'network' } : {}),\n        });\n      } catch (trackingError) {\n        console.warn('[ValtechError] analytics tracking failed:', trackingError);\n      }\n    }\n\n    // 3. Resolver mensaje localizado para el usuario.\n    const message = this.resolveMessage(interpreted, {\n      i18nMap,\n      fallbackKey,\n      i18nNamespace,\n    });\n\n    // 4. Toast (estándar Valtech: color 'dark', position 'top').\n    if (toast !== false) {\n      this.toast.show({\n        message,\n        color: 'dark',\n        position: 'top',\n        duration: 3000,\n      });\n    }\n\n    // 5. Devolver el error normalizado para lógica extra del caller.\n    return interpreted;\n  }\n\n  /**\n   * Resuelve el mensaje a mostrar siguiendo el orden documentado en {@link handle}.\n   */\n  private resolveMessage(\n    interpreted: InterpretedError,\n    opts: Pick<ValtechErrorHandleOptions, 'i18nMap' | 'fallbackKey' | 'i18nNamespace'>\n  ): string {\n    const ns = opts.i18nNamespace;\n\n    // 1. Match exacto por código de backend.\n    const mappedKey = opts.i18nMap?.[interpreted.code];\n    if (mappedKey) {\n      return this.translate(mappedKey, ns) ?? interpreted.message;\n    }\n\n    // 2. Fallo de red → key de red de la lib, con fallback español.\n    if (interpreted.isNetwork) {\n      return this.translate(VALTECH_NETWORK_ERROR_KEY, ns) ?? NETWORK_FALLBACK_MESSAGE;\n    }\n\n    // 3. fallbackKey provisto por la app.\n    if (opts.fallbackKey) {\n      return this.translate(opts.fallbackKey, ns) ?? interpreted.message;\n    }\n\n    // 4. Genérico — preferir el mensaje del backend (ya viene en español) si lo hay.\n    return interpreted.message || GENERIC_FALLBACK_MESSAGE;\n  }\n\n  /**\n   * Traduce una key i18n. Devuelve `null` si la key no está definida — el\n   * `I18nService` devuelve un placeholder `[namespace.key]` para keys faltantes;\n   * lo detectamos para poder caer a un fallback en lugar de mostrar el placeholder.\n   */\n  private translate(key: string, namespace?: string): string | null {\n    const text = this.i18n.t(key, namespace);\n    const ns = namespace ?? '_global';\n    return text === `[${ns}.${key}]` ? null : text;\n  }\n}\n","/**\n * Estándar de manejo de errores del factory Valtech.\n *\n * - `interpretError` (Capa 0) — normaliza cualquier error a `InterpretedError`.\n *   Función pura, sin Angular DI.\n * - `provideValtechErrorHandling` (Capa 1) — registra el interceptor HTTP de\n *   observabilidad: log estructurado + reporte a Analytics, re-lanza el error.\n * - `ValtechErrorService` (Capa 3) — punto único para el `catch` de una página:\n *   normaliza, observa, resuelve un mensaje i18n y muestra un toast.\n */\nexport { interpretError } from './interpret-error';\nexport type { InterpretedError } from './interpret-error';\n\nexport { errorLoggingInterceptor } from './error-logging.interceptor';\nexport { provideValtechErrorHandling } from './provide-error-handling';\n\nexport { ValtechErrorService, VALTECH_NETWORK_ERROR_KEY } from './valtech-error.service';\nexport type { ValtechErrorHandleOptions } from './valtech-error.service';\n","/**\n * Tipos e interfaces para el servicio de autenticación de Valtech.\n * Alineados con el backend AuthV2.\n */\n\n// =============================================================================\n// CONFIGURACIÓN\n// =============================================================================\n\n/**\n * Configuración para el servicio de autenticación.\n */\nexport interface ValtechAuthConfig {\n  /** URL base de la API (ej: 'https://api.myvaltech.com') */\n  apiUrl: string;\n  /** Prefijo para endpoints de auth (default: '/v2/auth') */\n  authPrefix?: string;\n  /** Prefijo para las claves de localStorage (default: 'valtech_auth_') */\n  storagePrefix?: string;\n  /** Tiempo antes de expiración para refrescar token en segundos (default: 60) */\n  refreshBeforeExpiry?: number;\n  /** Habilitar sincronización entre pestañas (default: true) */\n  enableTabSync?: boolean;\n  /** Ruta de redirección cuando no autenticado (default: '/login') */\n  loginRoute?: string;\n  /** Ruta de redirección cuando ya autenticado (default: '/') */\n  homeRoute?: string;\n  /** Ruta para acceso denegado (default: '/unauthorized') */\n  unauthorizedRoute?: string;\n  /** Habilitar integración con FirebaseService (default: false) */\n  enableFirebaseIntegration?: boolean;\n  /** Habilitar registro automático de device tokens para push notifications (default: false) */\n  enableDeviceRegistration?: boolean;\n  /**\n   * AppID de esta app dentro del factory (ej: 'showcase', 'sigify', 'myvaltech').\n   * Usado por NotificationActionService para decidir si una notificación\n   * apunta a la app actual o requiere handoff cross-app.\n   */\n  appId?: string;\n  /**\n   * Mapa appId → baseUrl absoluta para handoff cross-app.\n   * Ej: { sigify: 'https://sigify.com', myvaltech: 'https://app.myvaltech.com' }\n   * NotificationActionService usa este map al disparar handoff a otra app.\n   */\n  appUrls?: Record<string, string>;\n  /**\n   * Habilitar sincronización reactiva de permisos via Firestore onSnapshot (default: false).\n   * Requiere enableFirebaseIntegration: true. Cuando un admin asigna o revoca un rol,\n   * el frontend actualiza roles/permisos sin recargar la página (~1-3s latencia).\n   * Requiere que el backend tenga SyncRBACToFirestore activo.\n   */\n  enableFirestoreRBAC?: boolean;\n}\n\n// =============================================================================\n// ESTADO DE AUTENTICACIÓN\n// =============================================================================\n\n/**\n * Estado completo de autenticación.\n */\nexport interface AuthState {\n  /** Usuario está autenticado */\n  isAuthenticated: boolean;\n  /** Estado de carga inicial */\n  isLoading: boolean;\n  /** Token de acceso actual */\n  accessToken: string | null;\n  /** Token de refresco actual */\n  refreshToken: string | null;\n  /** ID del usuario */\n  userId: string | null;\n  /** Email del usuario */\n  email: string | null;\n  /** Nombre completo del usuario (poblado tras `getProfile()`) */\n  name?: string | null;\n  /** Username/handle (poblado tras `getProfile()`) */\n  handle?: string | null;\n  /** URL del avatar (poblado tras `getProfile()`) */\n  avatarUrl?: string | null;\n  /** Teléfono (poblado tras `getProfile()`) */\n  phone?: string | null;\n  /** ID de la organización activa */\n  activeOrg?: string | null;\n  /** Roles del usuario */\n  roles: string[];\n  /** Permisos del usuario (formato 'resource:action') */\n  permissions: string[];\n  /** Usuario es super admin */\n  isSuperAdmin: boolean;\n  /** Usuario tiene suscripción premium activa (no ve ads) */\n  isPremium: boolean;\n  /** Timestamp de expiración del accessToken (ms) */\n  expiresAt: number | null;\n  /** Error de autenticación (si existe) */\n  error: AuthError | null;\n}\n\n/**\n * Información del usuario autenticado.\n */\nexport interface AuthUser {\n  userId: string;\n  email: string;\n  name?: string;\n  phone?: string;\n  /** Username/handle del usuario (ej: @victorv) */\n  handle?: string;\n  /** ID de la organización activa */\n  activeOrg?: string;\n  /** URL del avatar del usuario */\n  avatarUrl?: string;\n  roles: string[];\n  permissions: string[];\n  isSuperAdmin: boolean;\n  mfaEnabled?: boolean;\n  mfaMethod?: MFAMethod;\n}\n\n/**\n * Error de autenticación.\n */\nexport interface AuthError {\n  code: string;\n  message: string;\n}\n\n/**\n * Estado inicial de autenticación.\n */\nexport const INITIAL_AUTH_STATE: AuthState = {\n  isAuthenticated: false,\n  isLoading: true,\n  accessToken: null,\n  refreshToken: null,\n  userId: null,\n  email: null,\n  activeOrg: null,\n  roles: [],\n  permissions: [],\n  isSuperAdmin: false,\n  isPremium: false,\n  expiresAt: null,\n  error: null,\n};\n\n// =============================================================================\n// MFA\n// =============================================================================\n\n/** Métodos de MFA soportados */\nexport type MFAMethod = 'EMAIL' | 'SMS' | 'TOTP';\n\n/**\n * Estado de MFA pendiente.\n */\nexport interface MFAPendingState {\n  required: boolean;\n  mfaToken: string | null;\n  method: MFAMethod | null;\n}\n\n/**\n * Estado inicial de MFA.\n */\nexport const INITIAL_MFA_STATE: MFAPendingState = {\n  required: false,\n  mfaToken: null,\n  method: null,\n};\n\n/**\n * Resultado de setup de MFA.\n */\nexport interface MFASetupResult {\n  codeSent: boolean;\n  message: string;\n}\n\n/**\n * Estado de MFA del usuario.\n */\nexport interface MFAStatus {\n  enabled: boolean;\n  method: MFAMethod | null;\n}\n\n// =============================================================================\n// TOTP MFA (Google Authenticator)\n// =============================================================================\n\n/**\n * Response de setup de TOTP.\n */\nexport interface TOTPSetupResponse {\n  operationId: string;\n  /** Secreto TOTP en base32 (para entrada manual) */\n  secret: string;\n  /** URL para generar QR code (otpauth://...) */\n  qrCodeUrl: string;\n  /** Códigos de respaldo de un solo uso */\n  backupCodes: string[];\n  message: string;\n}\n\n/**\n * Request para verificar setup de TOTP.\n */\nexport interface TOTPVerifySetupRequest {\n  /** Código TOTP de 6 dígitos */\n  code: string;\n}\n\n/**\n * Response de verificación de setup TOTP.\n */\nexport interface TOTPVerifySetupResponse {\n  operationId: string;\n  enabled: boolean;\n  message: string;\n}\n\n/**\n * Request para deshabilitar TOTP.\n */\nexport interface TOTPDisableRequest {\n  password: string;\n}\n\n/**\n * Response de deshabilitar TOTP.\n */\nexport interface TOTPDisableResponse {\n  operationId: string;\n  disabled: boolean;\n  message: string;\n}\n\n/**\n * Response de regenerar códigos de respaldo.\n */\nexport interface RegenerateBackupCodesResponse {\n  operationId: string;\n  backupCodes: string[];\n  message: string;\n}\n\n/**\n * Response de cantidad de códigos de respaldo.\n */\nexport interface BackupCodesCountResponse {\n  operationId: string;\n  count: number;\n}\n\n// =============================================================================\n// REQUESTS/RESPONSES (alineados con backend AuthV2)\n// =============================================================================\n\n/**\n * Request para signup (registro).\n */\nexport interface SignupRequest {\n  email: string;\n  password: string;\n  name: string;\n  phone?: string;\n}\n\n/**\n * Response de signup (registro).\n */\nexport interface SignupResponse {\n  operationId: string;\n  userId: string;\n  message: string;\n}\n\n/**\n * Request para verificar email.\n */\nexport interface VerifyEmailRequest {\n  email: string;\n  code: string;\n}\n\n/**\n * Response de verificación de email.\n * Si es exitoso, incluye tokens para auto-login.\n */\nexport interface VerifyEmailResponse {\n  operationId: string;\n  verified: boolean;\n  accessToken?: string;\n  refreshToken?: string;\n  firebaseToken?: string;\n  expiresIn?: number;\n  tokenType?: string;\n}\n\n/**\n * Request para reenviar código de verificación.\n */\nexport interface ResendCodeRequest {\n  email: string;\n  type: 'EMAIL_VERIFY' | 'PASSWORD_RESET';\n}\n\n/**\n * Response de reenvío de código.\n */\nexport interface ResendCodeResponse {\n  operationId: string;\n  sent: boolean;\n}\n\n/**\n * Request para signin.\n */\nexport interface SigninRequest {\n  email: string;\n  password: string;\n  /** Plataforma del dispositivo (para detección de nuevo dispositivo) */\n  platform?: DevicePlatform;\n  /** Navegador (solo web) */\n  browser?: string;\n  /** Sistema operativo */\n  os?: string;\n  /** Nombre amigable del dispositivo */\n  deviceName?: string;\n}\n\n/**\n * Response de signin.\n */\nexport interface SigninResponse {\n  operationId: string;\n  accessToken?: string;\n  refreshToken?: string;\n  firebaseToken?: string;\n  expiresIn?: number;\n  tokenType?: string;\n  mfaRequired?: boolean;\n  mfaToken?: string;\n  mfaMethod?: MFAMethod;\n  roles?: string[];\n  permissions?: string[];\n  /** Indica si el login fue desde un dispositivo nuevo/no reconocido */\n  isNewDevice?: boolean;\n  /** ID del dispositivo usado para el login */\n  deviceId?: string;\n  /** Idioma preferido del usuario (para sincronizar con i18n) */\n  language?: string;\n}\n\n/**\n * Request para verificar MFA.\n */\nexport interface MFAVerifyRequest {\n  mfaToken: string;\n  code: string;\n}\n\n/**\n * Response de verificar MFA.\n */\nexport interface MFAVerifyResponse {\n  operationId: string;\n  accessToken: string;\n  refreshToken: string;\n  firebaseToken?: string;\n  expiresIn: number;\n  tokenType: string;\n  roles?: string[];\n  permissions?: string[];\n  /** Idioma preferido del usuario (para sincronizar con i18n) */\n  language?: string;\n}\n\n/**\n * Request para refrescar token.\n */\nexport interface RefreshRequest {\n  refreshToken: string;\n}\n\n/**\n * Response de refrescar token.\n * Implementa token rotation: cada refresh genera un nuevo refresh token.\n */\nexport interface RefreshResponse {\n  operationId: string;\n  accessToken: string;\n  refreshToken: string; // Token rotation: nuevo refresh token\n  expiresIn: number;\n  firebaseToken?: string;\n  roles?: string[];\n  permissions?: string[];\n}\n\n/**\n * Request para logout.\n */\nexport interface LogoutRequest {\n  refreshToken: string;\n}\n\n/**\n * Response de logout.\n */\nexport interface LogoutResponse {\n  operationId: string;\n  success: boolean;\n}\n\n/**\n * Response de obtener permisos.\n */\nexport interface GetPermissionsResponse {\n  operationId: string;\n  roles: string[];\n  permissions: string[];\n  isSuperAdmin: boolean;\n}\n\n/**\n * Request para setup de MFA.\n */\nexport interface MFASetupRequest {\n  method: MFAMethod;\n  phone?: string;\n}\n\n/**\n * Response de setup de MFA.\n */\nexport interface MFASetupResponse {\n  operationId: string;\n  codeSent: boolean;\n  message: string;\n}\n\n/**\n * Request para confirmar MFA.\n */\nexport interface MFAConfirmRequest {\n  code: string;\n}\n\n/**\n * Response de confirmar MFA.\n */\nexport interface MFAConfirmResponse {\n  operationId: string;\n  mfaEnabled: boolean;\n  method: MFAMethod;\n}\n\n/**\n * Request para deshabilitar MFA.\n */\n/**\n * Acepta `password` (cuenta con contraseña) o `mfaCode` (cuenta OAuth-only\n * con TOTP que prueba posesión del segundo factor). Uno requerido.\n */\nexport interface MFADisableRequest {\n  password?: string;\n  mfaCode?: string;\n}\n\n/**\n * Response de deshabilitar MFA.\n */\nexport interface MFADisableResponse {\n  operationId: string;\n  mfaDisabled: boolean;\n}\n\n/**\n * Request para iniciar recuperación de contraseña.\n */\nexport interface ForgotPasswordRequest {\n  email: string;\n}\n\n/**\n * Response de forgot password (siempre igual por seguridad).\n */\nexport interface ForgotPasswordResponse {\n  operationId: string;\n  message: string;\n}\n\n/**\n * Request para resetear contraseña con código.\n */\nexport interface ResetPasswordRequest {\n  email: string;\n  code: string;\n  newPassword: string;\n}\n\n/**\n * Response de reset password.\n */\nexport interface ResetPasswordResponse {\n  operationId: string;\n  success: boolean;\n}\n\n/**\n * Request para cambiar contraseña (usuario autenticado).\n */\nexport interface ChangePasswordRequest {\n  currentPassword: string;\n  newPassword: string;\n}\n\n/**\n * Response de cambio de contraseña.\n */\nexport interface ChangePasswordResponse {\n  operationId: string;\n  success: boolean;\n}\n\n/**\n * Request para eliminar cuenta.\n * Usuarios con contraseña: enviar `password`.\n * Usuarios OAuth sin contraseña: enviar `code` (obtenido via sendDeleteAccountCode).\n */\nexport interface DeleteAccountRequest {\n  password?: string;\n  code?: string;\n}\n\n/**\n * Response de enviar código de confirmación de eliminación de cuenta.\n */\nexport interface SendDeleteAccountCodeResponse {\n  operationId: string;\n}\n\n/**\n * Response de eliminar cuenta.\n */\nexport interface DeleteAccountResponse {\n  operationId: string;\n  deleted: boolean;\n  message: string;\n}\n\n/**\n * Response de obtener perfil del usuario.\n */\nexport interface GetProfileResponse {\n  operationId: string;\n  userId: string;\n  email: string;\n  name: string;\n  phone?: string;\n  /** Username/handle del usuario */\n  handle?: string;\n  /** URL del avatar del usuario */\n  avatarUrl?: string;\n  emailVerified: boolean;\n  phoneVerified: boolean;\n  mfaEnabled: boolean;\n  mfaMethod?: MFAMethod;\n  /** True si la cuenta tiene contraseña seteada (false para OAuth-only sin password). */\n  hasPassword?: boolean;\n  createdAt: string;\n  updatedAt: string;\n}\n\n/**\n * Request para actualizar perfil.\n */\nexport interface UpdateProfileRequest {\n  name?: string;\n  phone?: string;\n}\n\n/**\n * Response de actualizar perfil.\n */\nexport interface UpdateProfileResponse {\n  operationId: string;\n  updated: boolean;\n}\n\n// =============================================================================\n// UPDATE AVATAR\n// =============================================================================\n\n/**\n * Request para actualizar avatar del usuario.\n */\nexport interface UpdateAvatarRequest {\n  /** URL del avatar en Firebase Storage */\n  avatarUrl: string;\n  /** URL del thumbnail (opcional) */\n  avatarThumbnail?: string;\n}\n\n/**\n * Response de actualizar avatar.\n */\nexport interface UpdateAvatarResponse {\n  operationId: string;\n  avatarUrl: string;\n  avatarThumbnail?: string;\n  updatedAt: string;\n}\n\n// =============================================================================\n// EVENTOS DE SINCRONIZACIÓN\n// =============================================================================\n\n// =============================================================================\n// SWITCH ORGANIZATION\n// =============================================================================\n\n/**\n * Request para cambiar de organización activa.\n */\nexport interface SwitchOrgRequest {\n  organizationId: string;\n}\n\n/**\n * Response de cambio de organización.\n */\nexport interface SwitchOrgResponse {\n  operationId: string;\n  firebaseToken: string;\n  activeOrg: string;\n  /** Nuevo JWT con activeOrg actualizado. El FE lo almacena para que el\n   *  bootstrap post-refresh use la org correcta en vez del JWT cacheado. */\n  accessToken?: string;\n  expiresIn?: number;\n}\n\n// =============================================================================\n// EVENTOS DE SINCRONIZACIÓN\n// =============================================================================\n\n/** Tipos de eventos de sincronización entre pestañas */\nexport type AuthSyncEventType =\n  | 'LOGIN'\n  | 'LOGOUT'\n  | 'TOKEN_REFRESH'\n  | 'PERMISSIONS_UPDATE'\n  | 'ORG_SWITCH';\n\n/**\n * Evento de sincronización entre pestañas.\n */\nexport interface AuthSyncEvent {\n  type: AuthSyncEventType;\n  timestamp: number;\n  payload?: {\n    accessToken?: string;\n    refreshToken?: string; // Token rotation support\n    expiresAt?: number;\n    activeOrg?: string;\n  };\n}\n\n// =============================================================================\n// JWT CLAIMS\n// =============================================================================\n\n/**\n * Claims del JWT de acceso.\n */\nexport interface JWTClaims {\n  /** User ID */\n  uid: string;\n  /** Email */\n  email: string;\n  /** Session ID */\n  sid?: string;\n  /** Usuario tiene suscripción premium activa */\n  premium?: boolean;\n  /** Active organization ID (JWT claim \"org\") */\n  org?: string;\n  /** Issued at */\n  iat: number;\n  /** Expiration */\n  exp: number;\n}\n\n// =============================================================================\n// STORAGE\n// =============================================================================\n\n/**\n * Datos persistidos en storage.\n */\nexport interface StoredAuthState {\n  accessToken: string;\n  refreshToken: string;\n  roles: string[];\n  permissions: string[];\n  isSuperAdmin: boolean;\n  isPremium?: boolean;\n  expiresAt?: number;\n}\n\n// =============================================================================\n// DEVICE REGISTRATION (Push Notifications)\n// =============================================================================\n\n/**\n * Plataformas soportadas para push notifications.\n */\nexport type DevicePlatform = 'web' | 'ios' | 'android';\n\n/**\n * Request para registrar un dispositivo.\n */\nexport interface RegisterDeviceRequest {\n  /** FCM token del dispositivo */\n  token: string;\n  /** Plataforma del dispositivo */\n  platform: DevicePlatform;\n  /** Navegador (solo web) */\n  browser?: string;\n  /** Sistema operativo */\n  os?: string;\n  /** Versión de la aplicación */\n  appVersion?: string;\n  /** Nombre amigable del dispositivo */\n  name?: string;\n  /** Metadata adicional */\n  metadata?: Record<string, string>;\n}\n\n/**\n * Response de registro de dispositivo.\n */\nexport interface RegisterDeviceResponse {\n  operationId: string;\n  device: {\n    deviceId: string;\n    token: string;\n    platform: DevicePlatform;\n    browser?: string;\n    os?: string;\n    lastActive: string;\n    createdAt: string;\n  };\n  /** true si es un nuevo dispositivo, false si se actualizó uno existente */\n  isNew: boolean;\n}\n\n/**\n * Resultado de habilitar notificaciones.\n */\nexport interface EnableNotificationsResult {\n  /** Si se otorgaron los permisos */\n  granted: boolean;\n  /** FCM token (solo si granted=true) */\n  token?: string;\n  /** Si el dispositivo fue registrado en el backend */\n  registered?: boolean;\n}\n\n/**\n * Estado de permisos de notificación.\n */\nexport type NotificationPermissionState = 'granted' | 'denied' | 'default' | 'unsupported';\n\n/**\n * Resultado del registro manual de dispositivo.\n */\nexport interface RegisterDeviceResult {\n  /** Si el dispositivo fue registrado exitosamente */\n  registered: boolean;\n  /** ID del dispositivo (solo si registered=true) */\n  deviceId?: string;\n  /** FCM token usado para el registro */\n  token?: string;\n  /** Mensaje de error (solo si registered=false) */\n  error?: string;\n}\n\n// =============================================================================\n// DEVICE MANAGEMENT (Detección de dispositivos nuevos)\n// =============================================================================\n\n/**\n * Estados posibles de un dispositivo.\n */\nexport type DeviceStatus = 'active' | 'pending_approval' | 'blocked';\n\n/**\n * Información completa de un dispositivo registrado.\n */\nexport interface DeviceInfo {\n  /** ID único del dispositivo */\n  deviceId: string;\n  /** Plataforma del dispositivo */\n  platform: DevicePlatform;\n  /** Navegador (solo web) */\n  browser?: string;\n  /** Sistema operativo */\n  os?: string;\n  /** Nombre amigable del dispositivo */\n  name?: string;\n  /** Estado actual del dispositivo */\n  status: DeviceStatus;\n  /** Dirección IP del último acceso */\n  ipAddress?: string;\n  /** Ubicación geográfica aproximada */\n  location?: string;\n  /** Última actividad */\n  lastActive: string;\n  /** Fecha de creación/registro */\n  createdAt: string;\n  /** Fecha de aprobación (si aplica) */\n  approvedAt?: string;\n  /** Fecha de bloqueo (si aplica) */\n  blockedAt?: string;\n}\n\n/**\n * Response de listar dispositivos del usuario.\n */\nexport interface ListDevicesResponse {\n  operationId: string;\n  devices: DeviceInfo[];\n}\n\n/**\n * Response de acción sobre dispositivo (block/approve/delete).\n */\nexport interface DeviceActionResult {\n  operationId: string;\n  success: boolean;\n  message: string;\n}\n\n// =============================================================================\n// SESSION MANAGEMENT (Gestión de sesiones activas)\n// =============================================================================\n\n/**\n * Información de una sesión activa.\n */\nexport interface SessionInfo {\n  /** ID único de la sesión */\n  sessionId: string;\n  /** ID del dispositivo asociado (si existe) */\n  deviceId?: string;\n  /** Información del dispositivo (User-Agent) */\n  deviceInfo?: string;\n  /** Dirección IP de la sesión */\n  ip?: string;\n  /** Ubicación geográfica aproximada */\n  location?: string;\n  /** Fecha de creación de la sesión */\n  createdAt: string;\n  /** Fecha de expiración de la sesión */\n  expiresAt: string;\n  /** Indica si es la sesión actual del usuario */\n  isCurrent: boolean;\n}\n\n/**\n * Response de listar sesiones activas.\n */\nexport interface ListSessionsResponse {\n  operationId: string;\n  sessions: SessionInfo[];\n}\n\n/**\n * Response de revocar sesión(es).\n */\nexport interface RevokeSessionsResponse {\n  operationId: string;\n  success: boolean;\n  /** Número de sesiones revocadas */\n  sessionsRevoked: number;\n}\n\n// =============================================================================\n// DEVICE ACTION (Acciones desde email de alerta)\n// =============================================================================\n\n/**\n * Request para ejecutar acción de dispositivo desde email.\n * El token viene en la URL del email de alerta.\n */\nexport interface DeviceActionRequest {\n  /** Token JWT de acción (24h, un solo uso) */\n  token: string;\n}\n\n/**\n * Response de ejecutar acción de dispositivo.\n */\nexport interface DeviceActionResponse {\n  operationId: string;\n  /** Si la acción fue ejecutada exitosamente */\n  success: boolean;\n  /** Acción ejecutada (refuse, approve, block) */\n  action: string;\n  /** ID del dispositivo afectado */\n  deviceId: string;\n  /** Número de sesiones revocadas (si action=refuse/block) */\n  sessionsRevoked?: number;\n  /** Mensaje descriptivo */\n  message: string;\n}\n\n/**\n * Response de validar token de acción (sin ejecutar).\n * Usado para mostrar confirmación al usuario antes de ejecutar.\n */\nexport interface ValidateActionResponse {\n  operationId: string;\n  /** Si el token es válido */\n  valid: boolean;\n  /** Tipo de acción (device:refuse, device:approve, etc.) */\n  actionType?: string;\n  /** Tipo de recurso objetivo (device, document, etc.) */\n  targetType?: string;\n  /** ID del recurso objetivo */\n  targetId?: string;\n  /** Mensaje de error (si valid=false) */\n  message?: string;\n}\n\n// =============================================================================\n// OAUTH (Login social)\n// =============================================================================\n\n/**\n * Proveedores OAuth soportados.\n */\nexport type OAuthProvider = 'google' | 'apple' | 'microsoft';\n\n/**\n * Resultado exitoso de flujo OAuth.\n */\nexport interface OAuthResult {\n  /** Token de acceso JWT */\n  accessToken: string;\n  /** Token de refresco */\n  refreshToken: string;\n  /** Token de Firebase (si está habilitado) */\n  firebaseToken?: string;\n  /** Tiempo de expiración en segundos */\n  expiresIn: number;\n  /** Roles del usuario */\n  roles?: string[];\n  /** Permisos del usuario */\n  permissions?: string[];\n  /** Indica si es un usuario nuevo (recién creado) */\n  isNewUser?: boolean;\n  /** Indica si la cuenta fue vinculada a usuario existente */\n  linked?: boolean;\n  /**\n   * `true` si el backend exige verificación MFA tras el OAuth. En ese caso\n   * NO vienen `accessToken`/`refreshToken` — el flujo continúa con `mfaToken`.\n   */\n  mfaRequired?: boolean;\n  /** Token temporal para el challenge MFA (presente si `mfaRequired`). */\n  mfaToken?: string;\n  /** Método MFA configurado por el usuario (presente si `mfaRequired`). */\n  mfaMethod?: MFAMethod;\n}\n\n/**\n * Error de OAuth.\n */\nexport interface OAuthError {\n  /** Código de error */\n  code: string;\n  /** Mensaje descriptivo */\n  message: string;\n}\n\n/**\n * Datos enviados desde popup callback via postMessage.\n */\nexport interface OAuthCallbackData {\n  /** Tipo de mensaje */\n  type: 'oauth-callback';\n  /** Tokens (si éxito) */\n  tokens?: OAuthResult;\n  /** Error (si falló) */\n  error?: OAuthError;\n}\n\n/**\n * Proveedor OAuth vinculado al usuario.\n */\nexport interface LinkedProvider {\n  /** Nombre del proveedor */\n  provider: OAuthProvider;\n  /** Email asociado al proveedor */\n  email: string;\n  /** Nombre del usuario en el proveedor */\n  name?: string;\n  /** URL de imagen de perfil */\n  picture?: string;\n  /** Fecha de vinculación */\n  linkedAt: string;\n  /** Última vez que se usó para login */\n  lastUsedAt?: string;\n}\n\n/**\n * Response de verificar si tiene contraseña.\n */\nexport interface HasPasswordResponse {\n  operationId: string;\n  hasPassword: boolean;\n}\n\n// =============================================================================\n// HANDLE (Username)\n// =============================================================================\n\n/**\n * Request para actualizar handle (@username).\n */\nexport interface UpdateHandleRequest {\n  handle: string;\n}\n\n/**\n * Response de actualizar handle.\n */\nexport interface UpdateHandleResponse {\n  operationId: string;\n  handle: string;\n  updated: boolean;\n}\n\n/**\n * Request para verificar disponibilidad de handle.\n */\nexport interface CheckHandleRequest {\n  handle: string;\n}\n\n/**\n * Response de verificar disponibilidad de handle.\n */\nexport interface CheckHandleResponse {\n  operationId: string;\n  handle: string;\n  available: boolean;\n}\n\n// =============================================================================\n// LINKED PROVIDERS (OAuth)\n// =============================================================================\n\n/**\n * Response de obtener proveedores OAuth vinculados.\n */\nexport interface GetLinkedProvidersResponse {\n  operationId: string;\n  providers: LinkedProvider[];\n}\n\n/**\n * Request para desvincular un proveedor OAuth.\n */\nexport interface UnlinkProviderRequest {\n  provider: OAuthProvider;\n}\n\n/**\n * Response de desvincular proveedor.\n */\nexport interface UnlinkProviderResponse {\n  operationId: string;\n  unlinked: boolean;\n}\n\n// =============================================\n// EMAIL CHANGE — 3-step flow\n// =============================================\n\nexport interface InitiateEmailChangeRequest {\n  currentPassword: string;\n  newEmail: string;\n}\n\nexport interface InitiateEmailChangeResponse {\n  operationId: string;\n  pendingEmail: string;\n  requestLocation: string;\n}\n\nexport interface ConfirmEmailChangeStep1Request {\n  code: string;\n}\n\nexport interface ConfirmEmailChangeStep1Response {\n  operationId: string;\n  verified: boolean;\n}\n\nexport interface ConfirmEmailChangeStep2Request {\n  code: string;\n}\n\nexport interface ConfirmEmailChangeStep2Response {\n  operationId: string;\n  success: boolean;\n  newEmail: string;\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport {\n  AuthState,\n  AuthUser,\n  AuthError,\n  MFAPendingState,\n  INITIAL_AUTH_STATE,\n  INITIAL_MFA_STATE,\n  StoredAuthState,\n} from './types';\n\n/**\n * Servicio para manejo de estado de autenticación con Angular Signals.\n * Proporciona estado reactivo inmutable.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStateService {\n  // Estado interno (mutable solo dentro del servicio)\n  private _state = signal<AuthState>(INITIAL_AUTH_STATE);\n  private _mfaPending = signal<MFAPendingState>(INITIAL_MFA_STATE);\n\n  // =============================================\n  // Signals públicos (readonly)\n  // =============================================\n\n  /** Estado completo de autenticación */\n  readonly state = this._state.asReadonly();\n\n  /** Estado de MFA pendiente */\n  readonly mfaPending = this._mfaPending.asReadonly();\n\n  /** Usuario está autenticado */\n  readonly isAuthenticated = computed(() => this._state().isAuthenticated);\n\n  /** Estado de carga */\n  readonly isLoading = computed(() => this._state().isLoading);\n\n  /** Token de acceso */\n  readonly accessToken = computed(() => this._state().accessToken);\n\n  /** Roles del usuario */\n  readonly roles = computed(() => this._state().roles);\n\n  /** Permisos del usuario */\n  readonly permissions = computed(() => this._state().permissions);\n\n  /** Usuario es super admin */\n  readonly isSuperAdmin = computed(() => this._state().isSuperAdmin);\n\n  /** Usuario tiene suscripción premium activa (no ve ads) */\n  readonly isPremium = computed(() => this._state().isPremium);\n\n  /** Error actual */\n  readonly error = computed(() => this._state().error);\n\n  /** Información del usuario */\n  readonly user = computed<AuthUser | null>(() => {\n    const state = this._state();\n    if (!state.isAuthenticated || !state.userId) {\n      return null;\n    }\n    return {\n      userId: state.userId,\n      email: state.email || '',\n      name: state.name ?? undefined,\n      handle: state.handle ?? undefined,\n      avatarUrl: state.avatarUrl ?? undefined,\n      phone: state.phone ?? undefined,\n      activeOrg: state.activeOrg ?? undefined,\n      roles: state.roles,\n      permissions: state.permissions,\n      isSuperAdmin: state.isSuperAdmin,\n    };\n  });\n\n  // =============================================\n  // Métodos de actualización\n  // =============================================\n\n  /**\n   * Establece el estado de carga.\n   */\n  setLoading(isLoading: boolean): void {\n    this._state.update(s => ({ ...s, isLoading }));\n  }\n\n  /**\n   * Establece el estado de autenticación exitosa.\n   */\n  setAuthenticated(data: {\n    accessToken: string;\n    refreshToken: string;\n    userId?: string;\n    email?: string;\n    roles: string[];\n    permissions: string[];\n    isSuperAdmin: boolean;\n    isPremium?: boolean;\n    expiresAt: number;\n  }): void {\n    this._state.set({\n      isAuthenticated: true,\n      isLoading: false,\n      accessToken: data.accessToken,\n      refreshToken: data.refreshToken,\n      userId: data.userId || null,\n      email: data.email || null,\n      roles: data.roles,\n      permissions: data.permissions,\n      isSuperAdmin: data.isSuperAdmin,\n      isPremium: data.isPremium || false,\n      expiresAt: data.expiresAt,\n      error: null,\n    });\n  }\n\n  /**\n   * Actualiza solo el access token (después de refresh).\n   */\n  updateAccessToken(accessToken: string, expiresIn: number): void {\n    const expiresAt = Date.now() + expiresIn * 1000;\n    this._state.update(s => ({\n      ...s,\n      accessToken,\n      expiresAt,\n    }));\n  }\n\n  /**\n   * Actualiza el refresh token (token rotation).\n   */\n  updateRefreshToken(refreshToken: string): void {\n    this._state.update(s => ({\n      ...s,\n      refreshToken,\n    }));\n  }\n\n  /**\n   * Actualiza los permisos.\n   */\n  updatePermissions(roles: string[], permissions: string[], isSuperAdmin: boolean): void {\n    this._state.update(s => ({\n      ...s,\n      roles,\n      permissions,\n      isSuperAdmin,\n    }));\n  }\n\n  /**\n   * Establece un error de autenticación.\n   */\n  setError(error: AuthError): void {\n    this._state.update(s => ({\n      ...s,\n      error,\n      isLoading: false,\n    }));\n  }\n\n  /**\n   * Limpia el error.\n   */\n  clearError(): void {\n    this._state.update(s => ({\n      ...s,\n      error: null,\n    }));\n  }\n\n  /**\n   * Establece estado de MFA pendiente.\n   */\n  setMFAPending(mfaState: MFAPendingState): void {\n    this._mfaPending.set(mfaState);\n  }\n\n  /**\n   * Limpia el estado de MFA pendiente.\n   */\n  clearMFAPending(): void {\n    this._mfaPending.set(INITIAL_MFA_STATE);\n  }\n\n  /**\n   * Resetea todo el estado a valores iniciales.\n   */\n  reset(): void {\n    this._state.set(INITIAL_AUTH_STATE);\n    this._mfaPending.set(INITIAL_MFA_STATE);\n  }\n\n  /**\n   * Restaura estado desde datos almacenados.\n   */\n  restoreFromStorage(stored: Partial<StoredAuthState>): void {\n    if (stored.accessToken) {\n      this._state.set({\n        isAuthenticated: true,\n        isLoading: false,\n        accessToken: stored.accessToken,\n        refreshToken: stored.refreshToken || null,\n        userId: null, // Se extraerá del token\n        email: null, // Se extraerá del token\n        roles: stored.roles || [],\n        permissions: stored.permissions || [],\n        isSuperAdmin: stored.isSuperAdmin || false,\n        isPremium: stored.isPremium || false,\n        expiresAt: stored.expiresAt || null,\n        error: null,\n      });\n    }\n  }\n\n  /**\n   * Actualiza el userId y email (después de parsear el token).\n   */\n  updateUserInfo(userId: string, email: string): void {\n    this._state.update(s => ({\n      ...s,\n      userId,\n      email,\n    }));\n  }\n\n  /**\n   * Actualiza la organización activa del usuario.\n   * Invocado tras parsear el JWT (claim \"org\") o tras switchOrg exitoso.\n   */\n  updateActiveOrg(activeOrg: string | null): void {\n    this._state.update(s => ({\n      ...s,\n      activeOrg,\n    }));\n  }\n\n  /**\n   * Hidrata el state con campos del profile (nombre, handle, avatar, phone).\n   * Invocado tras `getProfile()` o `updateProfile()` para que consumers de\n   * `auth.user()` vean los campos enriched automáticamente.\n   *\n   * Cualquier campo `undefined` se ignora (no sobrescribe con null). Campos\n   * `null` explícitos se persisten (signal de \"limpiado\").\n   */\n  updateProfileFields(fields: {\n    name?: string | null;\n    handle?: string | null;\n    avatarUrl?: string | null;\n    phone?: string | null;\n  }): void {\n    this._state.update(s => ({\n      ...s,\n      ...(fields.name !== undefined && { name: fields.name }),\n      ...(fields.handle !== undefined && { handle: fields.handle }),\n      ...(fields.avatarUrl !== undefined && { avatarUrl: fields.avatarUrl }),\n      ...(fields.phone !== undefined && { phone: fields.phone }),\n    }));\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { JWTClaims } from './types';\n\n/**\n * Servicio para manejo de tokens JWT.\n * Parseo y validación de tokens sin dependencias externas.\n */\n@Injectable({ providedIn: 'root' })\nexport class TokenService {\n  /**\n   * Parsea un token JWT y extrae los claims.\n   * @param token - Token JWT\n   * @returns Claims del token o null si es inválido\n   */\n  parseToken(token: string): JWTClaims | null {\n    try {\n      const parts = token.split('.');\n      if (parts.length !== 3) {\n        return null;\n      }\n\n      const payload = parts[1];\n      const decoded = this.base64UrlDecode(payload);\n      return JSON.parse(decoded);\n    } catch {\n      console.warn('[ValtechAuth] Error al parsear token JWT');\n      return null;\n    }\n  }\n\n  /**\n   * Verifica si un token es válido (no expirado).\n   * @param token - Token JWT\n   * @returns true si el token es válido\n   */\n  isTokenValid(token: string): boolean {\n    const claims = this.parseToken(token);\n    if (!claims) {\n      return false;\n    }\n\n    // exp está en segundos, Date.now() en milisegundos\n    const expirationMs = claims.exp * 1000;\n    return Date.now() < expirationMs;\n  }\n\n  /**\n   * Obtiene el tiempo restante del token en segundos.\n   * @param token - Token JWT\n   * @returns Segundos restantes o 0 si expirado\n   */\n  getTimeToExpiry(token: string): number {\n    const claims = this.parseToken(token);\n    if (!claims) {\n      return 0;\n    }\n\n    const expirationMs = claims.exp * 1000;\n    const remaining = expirationMs - Date.now();\n    return remaining > 0 ? Math.floor(remaining / 1000) : 0;\n  }\n\n  /**\n   * Obtiene el timestamp de expiración del token.\n   * @param token - Token JWT\n   * @returns Timestamp en milisegundos o null\n   */\n  getExpirationTime(token: string): number | null {\n    const claims = this.parseToken(token);\n    if (!claims) {\n      return null;\n    }\n\n    return claims.exp * 1000;\n  }\n\n  /**\n   * Extrae el user ID del token.\n   * @param token - Token JWT\n   * @returns User ID o null\n   */\n  getUserId(token: string): string | null {\n    const claims = this.parseToken(token);\n    return claims?.uid || null;\n  }\n\n  /**\n   * Extrae el email del token.\n   * @param token - Token JWT\n   * @returns Email o null\n   */\n  getEmail(token: string): string | null {\n    const claims = this.parseToken(token);\n    return claims?.email || null;\n  }\n\n  /**\n   * Extrae el estado premium del token.\n   * @param token - Token JWT\n   * @returns true si el usuario es premium\n   */\n  isPremium(token: string): boolean {\n    const claims = this.parseToken(token);\n    return claims?.premium === true;\n  }\n\n  /**\n   * Decodifica base64url a string.\n   * Base64url usa - y _ en lugar de + y /\n   */\n  private base64UrlDecode(str: string): string {\n    // Reemplazar caracteres base64url por base64 estándar\n    let base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n\n    // Agregar padding si es necesario\n    const padding = base64.length % 4;\n    if (padding) {\n      base64 += '='.repeat(4 - padding);\n    }\n\n    // Decodificar\n    const decoded = atob(base64);\n\n    // Manejar caracteres UTF-8\n    return decodeURIComponent(\n      decoded\n        .split('')\n        .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n        .join('')\n    );\n  }\n}\n","import { Inject, Injectable, Optional, PLATFORM_ID, isDevMode } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport { StoredAuthState, GetPermissionsResponse, ValtechAuthConfig } from './types';\n\n/**\n * Claves de storage para autenticación.\n */\ninterface StorageKeys {\n  ACCESS_TOKEN: string;\n  REFRESH_TOKEN: string;\n  ROLES: string;\n  PERMISSIONS: string;\n  IS_SUPER_ADMIN: string;\n  EXPIRES_AT: string;\n}\n\n/**\n * Servicio para persistencia de estado de autenticación en localStorage.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthStorageService {\n  private keys: StorageKeys;\n  private readonly isBrowser: boolean;\n\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    @Inject(PLATFORM_ID) platformId: Object\n  ) {\n    this.isBrowser = isPlatformBrowser(platformId);\n    if (!this.config && isDevMode()) {\n      console.warn(\n        '[valtech-components] AuthStorageService: provideValtechAuth() no está en main.ts.'\n      );\n    }\n    const prefix = this.config?.storagePrefix || 'valtech_auth_';\n    this.keys = {\n      ACCESS_TOKEN: `${prefix}access_token`,\n      REFRESH_TOKEN: `${prefix}refresh_token`,\n      ROLES: `${prefix}roles`,\n      PERMISSIONS: `${prefix}permissions`,\n      IS_SUPER_ADMIN: `${prefix}is_super_admin`,\n      EXPIRES_AT: `${prefix}expires_at`,\n    };\n  }\n\n  /**\n   * Guarda el estado completo de autenticación.\n   */\n  saveState(state: StoredAuthState): void {\n    if (!this.isBrowser) return;\n    try {\n      localStorage.setItem(this.keys.ACCESS_TOKEN, state.accessToken);\n      localStorage.setItem(this.keys.REFRESH_TOKEN, state.refreshToken);\n      localStorage.setItem(this.keys.ROLES, JSON.stringify(state.roles));\n      localStorage.setItem(this.keys.PERMISSIONS, JSON.stringify(state.permissions));\n      localStorage.setItem(this.keys.IS_SUPER_ADMIN, String(state.isSuperAdmin));\n      if (state.expiresAt) {\n        localStorage.setItem(this.keys.EXPIRES_AT, String(state.expiresAt));\n      }\n    } catch (e) {\n      console.warn('[ValtechAuth] Error guardando estado en storage:', e);\n    }\n  }\n\n  /**\n   * Carga el estado de autenticación desde storage.\n   */\n  loadState(): Partial<StoredAuthState> {\n    if (!this.isBrowser) return {};\n    try {\n      const accessToken = localStorage.getItem(this.keys.ACCESS_TOKEN);\n      const refreshToken = localStorage.getItem(this.keys.REFRESH_TOKEN);\n      const rolesJson = localStorage.getItem(this.keys.ROLES);\n      const permissionsJson = localStorage.getItem(this.keys.PERMISSIONS);\n      const isSuperAdmin = localStorage.getItem(this.keys.IS_SUPER_ADMIN) === 'true';\n      const expiresAtStr = localStorage.getItem(this.keys.EXPIRES_AT);\n\n      return {\n        accessToken: accessToken || undefined,\n        refreshToken: refreshToken || undefined,\n        roles: rolesJson ? JSON.parse(rolesJson) : [],\n        permissions: permissionsJson ? JSON.parse(permissionsJson) : [],\n        isSuperAdmin,\n        expiresAt: expiresAtStr ? Number(expiresAtStr) : undefined,\n      };\n    } catch (e) {\n      console.warn('[ValtechAuth] Error cargando estado desde storage:', e);\n      return {};\n    }\n  }\n\n  /**\n   * Guarda solo el access token.\n   */\n  saveAccessToken(token: string, expiresAt?: number): void {\n    if (!this.isBrowser) return;\n    try {\n      localStorage.setItem(this.keys.ACCESS_TOKEN, token);\n      if (expiresAt) {\n        localStorage.setItem(this.keys.EXPIRES_AT, String(expiresAt));\n      }\n    } catch (e) {\n      console.warn('[ValtechAuth] Error guardando access token:', e);\n    }\n  }\n\n  /**\n   * Guarda el refresh token (token rotation).\n   */\n  saveRefreshToken(token: string): void {\n    if (!this.isBrowser) return;\n    try {\n      localStorage.setItem(this.keys.REFRESH_TOKEN, token);\n    } catch (e) {\n      console.warn('[ValtechAuth] Error guardando refresh token:', e);\n    }\n  }\n\n  /**\n   * Guarda los permisos actualizados.\n   */\n  savePermissions(response: GetPermissionsResponse): void {\n    if (!this.isBrowser) return;\n    try {\n      localStorage.setItem(this.keys.ROLES, JSON.stringify(response.roles));\n      localStorage.setItem(this.keys.PERMISSIONS, JSON.stringify(response.permissions));\n      localStorage.setItem(this.keys.IS_SUPER_ADMIN, String(response.isSuperAdmin));\n    } catch (e) {\n      console.warn('[ValtechAuth] Error guardando permisos:', e);\n    }\n  }\n\n  /**\n   * Carga los permisos desde storage.\n   */\n  loadPermissions(): {\n    roles: string[];\n    permissions: string[];\n    isSuperAdmin: boolean;\n  } {\n    if (!this.isBrowser) {\n      return { roles: [], permissions: [], isSuperAdmin: false };\n    }\n    try {\n      const rolesJson = localStorage.getItem(this.keys.ROLES);\n      const permissionsJson = localStorage.getItem(this.keys.PERMISSIONS);\n      const isSuperAdmin = localStorage.getItem(this.keys.IS_SUPER_ADMIN) === 'true';\n\n      return {\n        roles: rolesJson ? JSON.parse(rolesJson) : [],\n        permissions: permissionsJson ? JSON.parse(permissionsJson) : [],\n        isSuperAdmin,\n      };\n    } catch {\n      return { roles: [], permissions: [], isSuperAdmin: false };\n    }\n  }\n\n  /**\n   * Obtiene el refresh token.\n   */\n  getRefreshToken(): string | null {\n    if (!this.isBrowser) return null;\n    return localStorage.getItem(this.keys.REFRESH_TOKEN);\n  }\n\n  /**\n   * Limpia todo el estado de autenticación.\n   */\n  clear(): void {\n    if (!this.isBrowser) return;\n    try {\n      Object.values(this.keys).forEach(key => localStorage.removeItem(key));\n    } catch (e) {\n      console.warn('[ValtechAuth] Error limpiando storage:', e);\n    }\n  }\n\n  /**\n   * Verifica si hay estado guardado.\n   */\n  hasStoredState(): boolean {\n    if (!this.isBrowser) return false;\n    return !!localStorage.getItem(this.keys.ACCESS_TOKEN);\n  }\n}\n","import { Inject, Injectable, OnDestroy, Optional, PLATFORM_ID, isDevMode } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Subject, Observable } from 'rxjs';\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport { AuthSyncEvent, AuthSyncEventType, ValtechAuthConfig } from './types';\n\n/**\n * Servicio para sincronización de estado de autenticación entre pestañas.\n * Usa BroadcastChannel API con fallback a storage events.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthSyncService implements OnDestroy {\n  private channel: BroadcastChannel | null = null;\n  private channelName: string;\n  private eventSubject = new Subject<AuthSyncEvent>();\n  private storageListener: ((event: StorageEvent) => void) | null = null;\n\n  /** Observable de eventos de sincronización */\n  readonly onEvent$: Observable<AuthSyncEvent> = this.eventSubject.asObservable();\n\n  private readonly isBrowser: boolean;\n\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    @Inject(PLATFORM_ID) platformId: Object\n  ) {\n    this.isBrowser = isPlatformBrowser(platformId);\n    if (!this.config && isDevMode()) {\n      console.warn('[valtech-components] AuthSyncService: provideValtechAuth() no está en main.ts.');\n    }\n    const prefix = this.config?.storagePrefix || 'valtech_auth_';\n    this.channelName = `${prefix}sync_channel`;\n  }\n\n  /**\n   * Inicia la sincronización entre pestañas.\n   * SSR-noop — sync de pestañas solo aplica en browser.\n   */\n  start(): void {\n    if (!this.config?.enableTabSync || !this.isBrowser) {\n      return;\n    }\n\n    // Intentar usar BroadcastChannel API (mejor rendimiento)\n    if (typeof BroadcastChannel !== 'undefined') {\n      this.initBroadcastChannel();\n    } else {\n      // Fallback a storage events\n      this.initStorageEvents();\n    }\n  }\n\n  /**\n   * Detiene la sincronización.\n   */\n  stop(): void {\n    if (this.channel) {\n      this.channel.close();\n      this.channel = null;\n    }\n\n    if (this.storageListener && this.isBrowser) {\n      window.removeEventListener('storage', this.storageListener);\n      this.storageListener = null;\n    }\n  }\n\n  /**\n   * Envía un evento a otras pestañas.\n   */\n  broadcast(event: Omit<AuthSyncEvent, 'timestamp'>): void {\n    if (!this.config?.enableTabSync || !this.isBrowser) {\n      return;\n    }\n\n    const fullEvent: AuthSyncEvent = {\n      ...event,\n      timestamp: Date.now(),\n    };\n\n    if (this.channel) {\n      this.channel.postMessage(fullEvent);\n    } else {\n      // Fallback: usar localStorage para notificar\n      this.broadcastViaStorage(fullEvent);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.stop();\n    this.eventSubject.complete();\n  }\n\n  /**\n   * Inicializa BroadcastChannel API.\n   */\n  private initBroadcastChannel(): void {\n    try {\n      this.channel = new BroadcastChannel(this.channelName);\n\n      this.channel.onmessage = (event: MessageEvent<AuthSyncEvent>) => {\n        this.handleEvent(event.data);\n      };\n\n      this.channel.onmessageerror = () => {\n        console.warn('[ValtechAuth] Error en BroadcastChannel, usando fallback');\n        this.channel?.close();\n        this.channel = null;\n        this.initStorageEvents();\n      };\n    } catch {\n      // BroadcastChannel no disponible, usar fallback\n      this.initStorageEvents();\n    }\n  }\n\n  /**\n   * Inicializa fallback con storage events.\n   */\n  private initStorageEvents(): void {\n    const storageKey = `${this.config?.storagePrefix}sync_event`;\n\n    this.storageListener = (event: StorageEvent) => {\n      if (event.key === storageKey && event.newValue) {\n        try {\n          const syncEvent: AuthSyncEvent = JSON.parse(event.newValue);\n          this.handleEvent(syncEvent);\n        } catch {\n          // Ignorar eventos mal formados\n        }\n      }\n    };\n\n    window.addEventListener('storage', this.storageListener);\n  }\n\n  /**\n   * Envía evento via localStorage (fallback).\n   */\n  private broadcastViaStorage(event: AuthSyncEvent): void {\n    const storageKey = `${this.config?.storagePrefix}sync_event`;\n\n    try {\n      // Escribir y luego limpiar para permitir múltiples eventos del mismo tipo\n      localStorage.setItem(storageKey, JSON.stringify(event));\n      // Usar setTimeout para permitir que otras pestañas lean el valor\n      setTimeout(() => {\n        localStorage.removeItem(storageKey);\n      }, 100);\n    } catch {\n      console.warn('[ValtechAuth] Error enviando evento via storage');\n    }\n  }\n\n  /**\n   * Maneja un evento recibido.\n   */\n  private handleEvent(event: AuthSyncEvent): void {\n    // Verificar que el evento no sea muy antiguo (más de 5 segundos)\n    const age = Date.now() - event.timestamp;\n    if (age > 5000) {\n      return;\n    }\n\n    this.eventSubject.next(event);\n  }\n}\n","/**\n * Firebase Types\n *\n * Tipos e interfaces para la integración de Firebase en valtech-components.\n * Todos los modelos de Firestore deben extender FirestoreDocument.\n */\n\nimport type { AnalyticsConfig } from './analytics-types';\n\n// ============================================================================\n// CONFIGURACIÓN\n// ============================================================================\n\n/**\n * Configuración de Firebase (valores de firebaseConfig)\n */\nexport interface FirebaseConfig {\n  apiKey: string;\n  authDomain: string;\n  projectId: string;\n  storageBucket: string;\n  messagingSenderId: string;\n  appId: string;\n  measurementId?: string;\n  /** Habilitar Firebase Cloud Messaging (default: false) */\n  enableMessaging?: boolean;\n  /** VAPID key para Firebase Cloud Messaging */\n  messagingVapidKey?: string;\n}\n\n/**\n * Configuración de emuladores para desarrollo local\n */\nexport interface EmulatorConfig {\n  firestore?: {\n    host: string;\n    port: number;\n  };\n  auth?: {\n    host: string;\n    port: number;\n  };\n  storage?: {\n    host: string;\n    port: number;\n  };\n}\n\n/**\n * Configuración por defecto de emuladores.\n * Puertos estándar usados en todos los proyectos frontend.\n *\n * @see https://firebase.google.com/docs/emulator-suite\n */\nexport const DEFAULT_EMULATOR_CONFIG: EmulatorConfig = {\n  firestore: { host: 'localhost', port: 9080 },\n  storage: { host: 'localhost', port: 9199 },\n  auth: { host: 'localhost', port: 9099 },\n};\n\n/**\n * Identificador de aplicación para namespacing automático en Firestore y Storage.\n * Permite aislar datos de diferentes apps dentro del mismo proyecto Firebase.\n *\n * Cada app consumidora define sus propios valores de AppId en su configuración local.\n */\nexport type AppId = string;\n\n/**\n * Configuración completa de Valtech Firebase\n */\nexport interface ValtechFirebaseConfig {\n  /** Configuración de Firebase */\n  firebase: FirebaseConfig;\n  /** Configuración de emuladores (opcional, para desarrollo) */\n  emulator?: EmulatorConfig;\n  /** Habilitar persistencia offline de Firestore (default: false) */\n  persistence?: boolean;\n  /** Habilitar Firebase Cloud Messaging (default: false) - requiere Service Worker */\n  enableMessaging?: boolean;\n  /** VAPID key para Firebase Cloud Messaging */\n  messagingVapidKey?: string;\n  /**\n   * ID de la aplicación para namespacing automático.\n   * Si se proporciona:\n   * - Firestore: prefija colecciones con `apps/{appId}/`\n   * - Storage: prefija paths con `{appId}/`\n   * Si no se proporciona, los paths quedan sin modificar (backward compatible).\n   */\n  appId?: AppId;\n  /**\n   * Persiste mensajes FCM en localStorage para debugging.\n   * Solo para desarrollo, permite ver mensajes en DevTools.\n   * Default: false\n   */\n  debugMessagePersistence?: boolean;\n\n  /**\n   * Habilitar Firebase Analytics / GA4 (default: false).\n   * Requiere measurementId en firebase config.\n   */\n  enableAnalytics?: boolean;\n\n  /**\n   * Configuración detallada de Analytics.\n   * Solo aplica si enableAnalytics es true.\n   */\n  analyticsConfig?: AnalyticsConfig;\n}\n\n// ============================================================================\n// FIRESTORE - DOCUMENTOS\n// ============================================================================\n\n/**\n * Interface base para todos los documentos de Firestore.\n * Todos los modelos deben extender esta interface.\n *\n * @example\n * interface User extends FirestoreDocument {\n *   name: string;\n *   email: string;\n * }\n */\nexport interface FirestoreDocument {\n  /** ID del documento (asignado por Firestore) */\n  id?: string;\n  /** Fecha de creación (manejada automáticamente) */\n  createdAt?: Date;\n  /** Fecha de última actualización (manejada automáticamente) */\n  updatedAt?: Date;\n}\n\n// ============================================================================\n// FIRESTORE - QUERIES\n// ============================================================================\n\n/**\n * Operadores disponibles para cláusulas where\n */\nexport type WhereOperator =\n  | '=='\n  | '!='\n  | '<'\n  | '<='\n  | '>'\n  | '>='\n  | 'array-contains'\n  | 'array-contains-any'\n  | 'in'\n  | 'not-in';\n\n/**\n * Cláusula where para filtrar documentos\n */\nexport interface WhereClause {\n  /** Campo a filtrar */\n  field: string;\n  /** Operador de comparación */\n  operator: WhereOperator;\n  /** Valor a comparar */\n  value: unknown;\n}\n\n/**\n * Dirección de ordenamiento\n */\nexport type OrderDirection = 'asc' | 'desc';\n\n/**\n * Cláusula orderBy para ordenar resultados\n */\nexport interface OrderByClause {\n  /** Campo por el cual ordenar */\n  field: string;\n  /** Dirección del ordenamiento */\n  direction: OrderDirection;\n}\n\n/**\n * Opciones para queries de Firestore\n */\nexport interface QueryOptions {\n  /** Filtros where (AND entre todos) */\n  where?: WhereClause[];\n  /** Ordenamiento de resultados */\n  orderBy?: OrderByClause[];\n  /** Límite de documentos a retornar */\n  limit?: number;\n  /** Cursor para paginación: empezar después de este documento */\n  startAfter?: unknown;\n  /** Cursor para paginación: empezar en este documento */\n  startAt?: unknown;\n  /** Cursor para paginación: terminar antes de este documento */\n  endBefore?: unknown;\n  /** Cursor para paginación: terminar en este documento */\n  endAt?: unknown;\n}\n\n/**\n * Opciones adicionales para subscripciones real-time\n */\nexport interface SubscriptionOptions extends QueryOptions {\n  /** Incluir cambios de metadata (ej: pendingWrites) */\n  includeMetadataChanges?: boolean;\n}\n\n/**\n * Resultado de una query paginada\n */\nexport interface PaginatedResult<T> {\n  /** Documentos de la página actual */\n  data: T[];\n  /** Indica si hay más páginas disponibles */\n  hasMore: boolean;\n  /** Cursor para la siguiente página (pasar a startAfter) */\n  lastDoc: unknown;\n  /** Total de documentos (opcional, requiere query adicional) */\n  total?: number;\n}\n\n// ============================================================================\n// STORAGE\n// ============================================================================\n\n/**\n * Estado de una operación de upload\n */\nexport type UploadState = 'running' | 'paused' | 'success' | 'canceled' | 'error';\n\n/**\n * Progreso de upload de archivo\n */\nexport interface UploadProgress {\n  /** Bytes transferidos hasta ahora */\n  bytesTransferred: number;\n  /** Total de bytes a transferir */\n  totalBytes: number;\n  /** Porcentaje completado (0-100) */\n  percentage: number;\n  /** Estado actual del upload */\n  state: UploadState;\n}\n\n/**\n * Resultado de un upload completado\n */\nexport interface UploadResult {\n  /** URL de descarga del archivo */\n  downloadUrl: string;\n  /** Ruta completa en Storage */\n  fullPath: string;\n  /** Nombre del archivo */\n  name: string;\n  /** Tamaño en bytes */\n  size: number;\n  /** Tipo MIME del archivo */\n  contentType: string;\n  /** Metadata personalizada */\n  metadata: Record<string, string>;\n}\n\n/**\n * Metadata para archivos en Storage\n */\nexport interface StorageMetadata {\n  /** Tipo MIME del archivo */\n  contentType?: string;\n  /** Metadata personalizada (key-value) */\n  customMetadata?: Record<string, string>;\n  /** Control de caché HTTP */\n  cacheControl?: string;\n  /**\n   * Skip the appId prefix for shared paths.\n   * Use this for cross-app paths like user avatars: `users/{userId}/avatar.jpg`\n   * @default false\n   */\n  skipPrefix?: boolean;\n}\n\n/**\n * Resultado de listar archivos en Storage\n */\nexport interface StorageListResult {\n  /** Rutas de los archivos encontrados */\n  items: string[];\n  /** Token para la siguiente página (si hay más) */\n  nextPageToken?: string;\n}\n\n// ============================================================================\n// RBAC - PERMISOS Y ORGANIZACIONES\n// ============================================================================\n\n/**\n * Información de membership en una organización.\n * Representa el rol y permisos que tiene un usuario en una org específica.\n */\nexport interface MembershipInfo {\n  /** ID del rol (ej: 'admin', 'editor', 'viewer') */\n  roleId: string;\n  /** Nombre del rol para display */\n  roleName: string;\n  /** Lista de permisos en formato 'resource:action' */\n  permissions: string[];\n}\n\n/**\n * Estructura completa de claims con RBAC.\n * Estos claims están disponibles en request.auth.token en Firestore Rules.\n */\nexport interface RBACClaims {\n  /** Email del usuario */\n  email: string;\n  /** Nombre completo del usuario */\n  name: string;\n  /** Si el email está verificado */\n  verified: boolean;\n  /**\n   * Mapa de organizaciones donde el usuario tiene roles.\n   * Key = orgId, Value = información del rol y permisos en esa org.\n   */\n  memberships: Record<string, MembershipInfo>;\n  /** ID de la organización actualmente seleccionada */\n  activeOrg: string;\n}\n\n/**\n * Información de una organización para display\n */\nexport interface OrganizationInfo {\n  /** ID único de la organización */\n  id: string;\n  /** Rol del usuario en esta organización */\n  roleId: string;\n  /** Nombre del rol para display */\n  roleName: string;\n  /** Permisos del usuario en esta organización */\n  permissions: string[];\n}\n\n// ============================================================================\n// AUTH / SESSION\n// ============================================================================\n\n/**\n * Información del usuario de Firebase (simplificada)\n */\nexport interface FirebaseUser {\n  /** UID único del usuario */\n  uid: string;\n  /** Email del usuario */\n  email: string | null;\n  /** Nombre para mostrar */\n  displayName: string | null;\n  /** URL de foto de perfil */\n  photoURL: string | null;\n  /** Email verificado */\n  emailVerified: boolean;\n  /** Usuario anónimo */\n  isAnonymous: boolean;\n  /** Proveedor de autenticación */\n  providerId: string;\n}\n\n/**\n * Estado de la sesión de Firebase\n */\nexport interface SessionState {\n  /** Usuario actual (null si no autenticado) */\n  user: FirebaseUser | null;\n  /** Indica si el usuario está autenticado */\n  isAuthenticated: boolean;\n  /** Indica si se está cargando el estado de auth */\n  isLoading: boolean;\n  /** Error de autenticación (si lo hay) */\n  error: Error | null;\n}\n\n// ============================================================================\n// MESSAGING (FCM)\n// ============================================================================\n\n/**\n * Estado del permiso de notificaciones\n */\nexport type NotificationPermission = 'granted' | 'denied' | 'default';\n\n/**\n * Payload de una notificación push\n */\nexport interface NotificationPayload {\n  /** Título de la notificación */\n  title?: string;\n  /** Cuerpo del mensaje */\n  body?: string;\n  /** URL de imagen */\n  image?: string;\n  /** Datos personalizados */\n  data?: Record<string, string>;\n  /** ID del mensaje de FCM */\n  messageId?: string;\n}\n\n/**\n * Acción de navegación desde una notificación\n */\nexport interface NotificationAction {\n  /** Ruta interna de la app (ej: '/orders/123') */\n  route?: string;\n  /** URL externa (ej: 'https://example.com') */\n  url?: string;\n  /** Parámetros de query string */\n  queryParams?: Record<string, string>;\n  /** Tipo de acción personalizada */\n  actionType?: string;\n  /** Datos adicionales para la acción */\n  actionData?: Record<string, unknown>;\n}\n\n/**\n * Resultado de `MessagingService.enable()`.\n *\n * Tipo discriminado descriptivo (NO se hace throw): la página consumidora lo\n * inspecciona para decidir qué toast/UX mostrar.\n *\n * `status`:\n * - `enabled`     — permiso otorgado + token FCM obtenido (`token` presente).\n * - `denied`      — el usuario denegó el permiso del navegador.\n * - `unsupported` — el navegador no soporta FCM (incl. iOS sin standalone).\n * - `error`       — el flujo falló por otra causa (ver `reason`).\n * - `timeout`     — el flujo se colgó >15s. Si `reloaded` es true, la página\n *                   está por recargarse (auto-reload, 1ª vez en la sesión); si\n *                   es false, ya se consumió el auto-reload y la página debe\n *                   mostrar un error sin recargar.\n */\nexport interface EnablePushResult {\n  /** Resultado del flujo de activación de push. */\n  status: 'enabled' | 'denied' | 'unsupported' | 'error' | 'timeout';\n  /** Token FCM — presente solo cuando `status === 'enabled'`. */\n  token?: string;\n  /** Detalle legible de la causa — presente en `error` / `timeout`. */\n  reason?: string;\n  /**\n   * Solo para `status === 'timeout'`: true si se disparó el auto-reload\n   * (la página está por recargarse). False si el auto-reload ya se consumió\n   * esta sesión y la app debe mostrar un error en lugar de recargar.\n   */\n  reloaded?: boolean;\n}\n\n/**\n * Evento de click en una notificación\n */\nexport interface NotificationClickEvent {\n  /** Payload original de la notificación */\n  notification: NotificationPayload;\n  /** Acción de navegación extraída */\n  action: NotificationAction;\n  /** Timestamp del click */\n  timestamp: Date;\n}\n\n// ============================================================================\n// ERRORES\n// ============================================================================\n\n/**\n * Códigos de error de Firebase\n */\nexport type FirebaseErrorCode =\n  | 'permission-denied'\n  | 'not-found'\n  | 'already-exists'\n  | 'resource-exhausted'\n  | 'cancelled'\n  | 'unknown'\n  | 'invalid-argument'\n  | 'deadline-exceeded'\n  | 'unauthenticated';\n\n/**\n * Error de Firebase tipado\n */\nexport interface FirebaseError {\n  /** Código del error */\n  code: FirebaseErrorCode;\n  /** Mensaje de error (en español) */\n  message: string;\n  /** Error original de Firebase */\n  originalError?: unknown;\n}\n","/**\n * Firebase Shared Configuration\n *\n * Utilidades genéricas para configuración de Firebase.\n * Las constantes específicas del proyecto (APP_IDS, FIREBASE_PROJECTS, EMULATOR_CONFIG)\n * deben definirse en cada app consumidora.\n */\n\nimport { AppId, EmulatorConfig, FirebaseConfig, ValtechFirebaseConfig } from './types';\nimport type { AnalyticsConfig } from './analytics-types';\n\n// Re-export types for convenience\nexport type { AppId } from './types';\n\n// ============================================================================\n// STORAGE PATH BUILDERS\n// ============================================================================\n\n/**\n * Genera paths de Storage alineados con storage.rules.\n *\n * Convenciones (ver frontend/firebase/storage.rules):\n * - Avatar global del user (cross-app): /users/{uid}/avatar.jpg\n * - Files privados del user (cross-app): /users/{uid}/files/{path}\n * - Avatar per-app del user: /apps/{appId}/users/{uid}/avatar.jpg\n * - Files per-app del user: /apps/{appId}/users/{uid}/files/{path}\n * - Public per-app: /apps/{appId}/public/{path}\n * - Shared per-app (auth-only): /apps/{appId}/shared/{path}\n * - Public global: /public/{path}\n *\n * @example\n * storagePaths.forApp('showcase', 'public', 'banner.jpg')\n * // => 'apps/showcase/public/banner.jpg'\n *\n * storagePaths.userAvatar('user123')\n * // => 'users/user123/avatar.jpg'\n *\n * storagePaths.appUserFile('showcase', 'user123', 'doc.pdf')\n * // => 'apps/showcase/users/user123/files/doc.pdf'\n */\nexport const storagePaths = {\n  /** Path per-app: apps/{appId}/{...paths} */\n  forApp: (appId: AppId, ...paths: string[]): string => ['apps', appId, ...paths].join('/'),\n\n  /** Avatar global del user (cross-app) */\n  userAvatar: (userId: string): string => `users/${userId}/avatar.jpg`,\n\n  /** Thumbnail global del user (cross-app) */\n  userThumb: (userId: string): string => `users/${userId}/thumb.jpg`,\n\n  /** File privado global del user (cross-app) */\n  userFile: (userId: string, ...paths: string[]): string =>\n    ['users', userId, 'files', ...paths].join('/'),\n\n  /** Avatar per-app del user */\n  appUserAvatar: (appId: AppId, userId: string): string =>\n    `apps/${appId}/users/${userId}/avatar.jpg`,\n\n  /** File per-app del user */\n  appUserFile: (appId: AppId, userId: string, ...paths: string[]): string =>\n    ['apps', appId, 'users', userId, 'files', ...paths].join('/'),\n\n  /** Public global (acceso sin auth, write admin-only) */\n  public: (...paths: string[]): string => `public/${paths.join('/')}`,\n};\n\n// ============================================================================\n// FIRESTORE COLLECTION BUILDERS\n// ============================================================================\n\n/**\n * Genera paths de colecciones alineados con firestore.rules.\n *\n * Convenciones (ver frontend/firebase/firestore.rules):\n * - Cross-app shared:\n *   /users/{uid} (privado), /profiles/{uid} (público global),\n *   /users/{uid}/notifications (INBOX GLOBAL cross-app cross-org)\n * - Per-app:\n *   /apps/{appId}/{collection}, /apps/{appId}/profiles/{uid}\n * - Per-app per-user (notifications NO viven aquí):\n *   /apps/{appId}/users/{uid}/{collection}\n * - Per-app per-org:\n *   /apps/{appId}/orgs/{orgId}/{collection}\n *\n * @example\n * collections.forApp('showcase', 'items')\n * // => 'apps/showcase/items'\n *\n * collections.appUser('showcase', 'user123', 'drafts')\n * // => 'apps/showcase/users/user123/drafts'\n *\n * collections.appOrg('showcase', 'org_abc', 'posts')\n * // => 'apps/showcase/orgs/org_abc/posts'\n *\n * collections.userNotifications('user123')\n * // => 'users/user123/notifications'\n */\nexport const collections = {\n  /** Per-app cross-user: apps/{appId}/{collection} */\n  forApp: (appId: AppId, collectionName: string): string => `apps/${appId}/${collectionName}`,\n\n  /** Per-app per-user: apps/{appId}/users/{uid}/{collection} */\n  appUser: (appId: AppId, userId: string, collectionName: string): string =>\n    `apps/${appId}/users/${userId}/${collectionName}`,\n\n  /** Per-app per-org: apps/{appId}/orgs/{orgId}/{collection} */\n  appOrg: (appId: AppId, orgId: string, collectionName: string): string =>\n    `apps/${appId}/orgs/${orgId}/${collectionName}`,\n\n  /** Per-app perfil público del user: apps/{appId}/profiles/{uid} */\n  appProfile: (appId: AppId, userId: string): string => `apps/${appId}/profiles/${userId}`,\n\n  /** Inbox global del user (cross-app cross-org) */\n  userNotifications: (userId: string): string => `users/${userId}/notifications`,\n\n  /** Cross-app shared (sin namespace, nivel raíz) */\n  shared: {\n    /** Doc privado del user — /users/{uid} */\n    users: 'users',\n    /** Perfiles públicos globales — /profiles/{uid} */\n    profiles: 'profiles',\n  },\n};\n\n// ============================================================================\n// HELPER: Create Firebase Config from Environment\n// ============================================================================\n\n/**\n * Opciones para crear la configuración de Firebase\n */\nexport interface CreateFirebaseConfigOptions {\n  /**\n   * Configuración de emuladores (para desarrollo local).\n   * Pasa tu propia configuración con hosts y puertos.\n   */\n  emulator?: EmulatorConfig;\n  /** Habilitar persistencia offline de Firestore */\n  persistence?: boolean;\n  /**\n   * ID de la aplicación para namespacing automático.\n   * Cuando se configura, FirestoreService y StorageService prefijan automáticamente los paths.\n   */\n  appId?: string;\n  /**\n   * Habilitar Firebase Analytics / GA4.\n   * Requiere measurementId en firebase config.\n   */\n  enableAnalytics?: boolean;\n  /**\n   * Configuración detallada de Analytics.\n   * Solo aplica si enableAnalytics es true.\n   */\n  analyticsConfig?: AnalyticsConfig;\n}\n\n/**\n * Crea la configuración completa de Firebase desde variables de entorno.\n * Usa esto en el environment.ts de cada app.\n *\n * @example\n * // environment.ts\n * import { createFirebaseConfig } from 'valtech-components';\n * import { APP_IDS, EMULATOR_CONFIG, USE_EMULATORS } from '../config/app-config';\n * import firebaseConfig from '../config/firebase.config.json';\n *\n * export const environment = {\n *   valtechFirebase: createFirebaseConfig(\n *     {\n *       ...firebaseConfig,\n *       enableMessaging: true,\n *       messagingVapidKey: 'BHLx...',\n *     },\n *     {\n *       emulator: USE_EMULATORS ? EMULATOR_CONFIG : undefined,\n *       persistence: true,\n *       appId: APP_IDS.MY_APP,\n *     }\n *   ),\n * };\n */\nexport function createFirebaseConfig(\n  config: FirebaseConfig,\n  options: CreateFirebaseConfigOptions = {}\n): ValtechFirebaseConfig {\n  const { emulator, persistence = true, appId, enableAnalytics, analyticsConfig } = options;\n\n  // Extraer campos de messaging del config (nuevos campos opcionales)\n  const { enableMessaging = false, messagingVapidKey, ...firebaseCore } = config;\n\n  return {\n    firebase: firebaseCore as FirebaseConfig,\n    persistence,\n    enableMessaging,\n    messagingVapidKey,\n    emulator,\n    appId,\n    enableAnalytics,\n    analyticsConfig,\n  };\n}\n\n// ============================================================================\n// UTILITY: Check if running in emulator mode\n// ============================================================================\n\n/**\n * Verifica si la configuración tiene emuladores habilitados\n */\nexport function isEmulatorMode(config: ValtechFirebaseConfig): boolean {\n  return config.emulator !== undefined;\n}\n","/**\n * Firebase Service\n *\n * Servicio principal para la autenticación con Firebase usando Custom Tokens.\n * Permite que usuarios autenticados con tu backend (Cognito, etc.) accedan\n * a servicios de Firebase (Firestore, Storage, FCM) de manera segura.\n */\n\nimport { Inject, Injectable, Signal, signal } from '@angular/core';\nimport {\n  Auth,\n  authState,\n  signInWithCustomToken,\n  signOut,\n  User,\n  UserCredential,\n} from '@angular/fire/auth';\nimport {\n  BehaviorSubject,\n  distinctUntilChanged,\n  filter,\n  firstValueFrom,\n  map,\n  Observable,\n  take,\n} from 'rxjs';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport {\n  FirebaseUser,\n  MembershipInfo,\n  OrganizationInfo,\n  SessionState,\n  ValtechFirebaseConfig,\n} from './types';\n\n/**\n * Servicio de autenticación de Firebase.\n *\n * Este servicio NO maneja el login de usuarios directamente.\n * En su lugar, trabaja con Custom Tokens generados por tu backend.\n *\n * @example\n * ```typescript\n * // Después de autenticarte con tu backend (ej: Cognito)\n * @Component({...})\n * export class LoginComponent {\n *   private authService = inject(AuthService);     // Tu servicio de auth\n *   private firebase = inject(FirebaseService);    // Este servicio\n *\n *   async login(email: string, password: string) {\n *     // 1. Autenticar con tu backend\n *     const response = await this.authService.login(email, password);\n *\n *     // 2. El backend devuelve un Firebase Custom Token\n *     if (response.firebaseToken) {\n *       await this.firebase.signInWithCustomToken(response.firebaseToken);\n *     }\n *\n *     // Ahora el usuario puede acceder a Firestore, Storage, etc.\n *   }\n *\n *   async logout() {\n *     await this.authService.logout();\n *     await this.firebase.signOut();\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FirebaseService {\n  /** Estado interno de la sesión */\n  private sessionState = new BehaviorSubject<SessionState>({\n    user: null,\n    isAuthenticated: false,\n    isLoading: true,\n    error: null,\n  });\n\n  /** Estado actual de la sesión como Observable */\n  readonly state$: Observable<SessionState> = this.sessionState.asObservable();\n\n  /** Usuario actual de Firebase como Observable */\n  readonly user$: Observable<FirebaseUser | null>;\n\n  /** Indica si el usuario está autenticado en Firebase */\n  readonly isAuthenticated$: Observable<boolean>;\n\n  /**\n   * Signal interna que respalda `firebaseAuthReady`.\n   * `true` cuando hay un `firebase.User` activo y por tanto las reglas de\n   * Firestore evaluarán `request.auth != null` correctamente.\n   */\n  private readonly _firebaseAuthReady = signal(false);\n\n  /**\n   * Indica si la sesión de **Firebase Auth** está establecida y lista para\n   * leer Firestore.\n   *\n   * IMPORTANTE: esto es distinto del JWT del backend. La sesión de Firebase\n   * Auth es una sesión separada que se establece vía `signInWithCustomToken`\n   * (ver `AuthService.signInWithFirebase`). En cold start de PWA, el JWT del\n   * backend puede estar listo varios cientos de ms antes de que Firebase Auth\n   * confirme su `User` — adjuntar un listener de Firestore en esa ventana\n   * produce `permission-denied`.\n   *\n   * Usar este signal (o `whenFirebaseAuthReady()`) como gate antes de\n   * suscribirse a cualquier query/listener de Firestore.\n   *\n   * @example\n   * ```typescript\n   * if (this.firebase.firebaseAuthReady()) {\n   *   // seguro leer Firestore\n   * }\n   * ```\n   */\n  readonly firebaseAuthReady: Signal<boolean> = this._firebaseAuthReady.asReadonly();\n\n  /**\n   * Emite `true` una sola vez en cuanto la sesión de Firebase Auth está lista,\n   * y completa. Si ya está lista, emite inmediatamente.\n   *\n   * Pensado como gate compartido para abrir streams Firestore — espera la\n   * ventana de hidratación de Firebase Auth sin necesidad de retries.\n   */\n  readonly firebaseAuthReady$: Observable<boolean>;\n\n  constructor(\n    private auth: Auth,\n    @Inject(VALTECH_FIREBASE_CONFIG) private config: ValtechFirebaseConfig\n  ) {\n    // Inicializar observables que dependen de auth\n    this.user$ = authState(this.auth).pipe(\n      map(user => (user ? this.mapUser(user) : null)),\n      distinctUntilChanged((a, b) => a?.uid === b?.uid)\n    );\n\n    this.isAuthenticated$ = this.user$.pipe(\n      map(user => !!user),\n      distinctUntilChanged()\n    );\n\n    // Gate compartido: emite true en cuanto haya un firebase.User y completa.\n    this.firebaseAuthReady$ = authState(this.auth).pipe(\n      filter((user): user is User => !!user),\n      map(() => true),\n      take(1)\n    );\n\n    // Escuchar cambios en el estado de autenticación\n    authState(this.auth).subscribe({\n      next: user => {\n        // Mantener `firebaseAuthReady` sincronizado con la sesión real:\n        // true al haber User, false en signout. Permite que los gates\n        // re-evalúen tras un logout/login dentro de la misma sesión de página.\n        this._firebaseAuthReady.set(!!user);\n        console.log(\n          `[FBAuth] authState emit user=${user?.uid ?? 'null'} firebaseAuthReady=${!!user}`\n        );\n        this.sessionState.next({\n          user: user ? this.mapUser(user) : null,\n          isAuthenticated: !!user,\n          isLoading: false,\n          error: null,\n        });\n      },\n      error: error => {\n        this._firebaseAuthReady.set(false);\n        console.error(\n          `[FBAuth] authState ERROR: ${error instanceof Error ? error.message : String(error)}`\n        );\n        this.sessionState.next({\n          user: null,\n          isAuthenticated: false,\n          isLoading: false,\n          error,\n        });\n      },\n    });\n  }\n\n  /**\n   * Resuelve en cuanto la sesión de Firebase Auth está lista para leer\n   * Firestore. Si ya está lista, resuelve inmediatamente.\n   *\n   * Útil para gatear la primera suscripción a un listener de Firestore y así\n   * cerrar la ventana de `permission-denied` en cold start.\n   */\n  whenFirebaseAuthReady(): Promise<boolean> {\n    if (this._firebaseAuthReady()) {\n      console.log('[FBAuth] whenFirebaseAuthReady resolved immediately (already ready)');\n      return Promise.resolve(true);\n    }\n    console.log('[FBAuth] whenFirebaseAuthReady waiting for Firebase Auth session...');\n    return firstValueFrom(this.firebaseAuthReady$).then(v => {\n      console.log('[FBAuth] whenFirebaseAuthReady resolved after wait');\n      return v;\n    });\n  }\n\n  // ===========================================================================\n  // AUTENTICACIÓN\n  // ===========================================================================\n\n  /**\n   * Autentica al usuario con un Custom Token generado por el backend.\n   *\n   * @param token - Firebase Custom Token generado por tu backend\n   * @returns UserCredential con la información del usuario\n   * @throws Error si el token es inválido o expiró\n   *\n   * @example\n   * ```typescript\n   * // Después de login exitoso con tu backend\n   * const { firebaseToken } = await backendAuth.login(email, password);\n   * await firebaseService.signInWithCustomToken(firebaseToken);\n   * ```\n   */\n  async signInWithCustomToken(token: string): Promise<UserCredential> {\n    console.log(`[FBAuth] signInWithCustomToken called tokenLen=${token?.length ?? 0}`);\n    try {\n      const credential = await signInWithCustomToken(this.auth, token);\n\n      // Forzar refresh del token para asegurar que los claims estén actualizados\n      // Esto es necesario porque getIdTokenResult() cachea el resultado\n      if (credential.user) {\n        await credential.user.getIdToken(true);\n      }\n\n      console.log(`[FBAuth] signInWithCustomToken OK uid=${credential.user?.uid ?? 'null'}`);\n      return credential;\n    } catch (error) {\n      const message = this.getErrorMessage(error);\n      console.error(`[FBAuth] signInWithCustomToken FAILED: ${message}`);\n      throw new Error(message);\n    }\n  }\n\n  /**\n   * Cierra la sesión de Firebase.\n   * Llamar junto con el logout de tu sistema de autenticación principal.\n   *\n   * @example\n   * ```typescript\n   * async logout() {\n   *   await this.backendAuth.logout();    // Tu auth\n   *   await this.firebase.signOut();       // Firebase\n   * }\n   * ```\n   */\n  async signOut(): Promise<void> {\n    try {\n      await signOut(this.auth);\n    } catch (error) {\n      const message = this.getErrorMessage(error);\n      throw new Error(message);\n    }\n  }\n\n  // ===========================================================================\n  // GETTERS SÍNCRONOS\n  // ===========================================================================\n\n  /**\n   * Obtiene el usuario actual de Firebase (síncrono).\n   * Retorna null si no hay usuario autenticado.\n   */\n  get currentUser(): FirebaseUser | null {\n    const user = this.auth.currentUser;\n    return user ? this.mapUser(user) : null;\n  }\n\n  /**\n   * Obtiene el UID del usuario actual.\n   * Retorna null si no hay usuario autenticado.\n   */\n  get uid(): string | null {\n    return this.auth.currentUser?.uid ?? null;\n  }\n\n  /**\n   * Indica si hay un usuario autenticado actualmente.\n   */\n  get isAuthenticated(): boolean {\n    return !!this.auth.currentUser;\n  }\n\n  // ===========================================================================\n  // TOKENS\n  // ===========================================================================\n\n  /**\n   * Obtiene el ID Token de Firebase para el usuario actual.\n   * Útil para validar el usuario en tu backend.\n   *\n   * @param forceRefresh - Si true, fuerza la renovación del token\n   * @returns ID Token o null si no hay usuario\n   */\n  async getIdToken(forceRefresh = false): Promise<string | null> {\n    const user = this.auth.currentUser;\n    if (!user) return null;\n\n    try {\n      return await user.getIdToken(forceRefresh);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Obtiene los claims personalizados del token del usuario.\n   * Los claims son establecidos por tu backend al crear el Custom Token.\n   *\n   * @param forceRefresh - Si true, fuerza la renovación del token para obtener claims actualizados\n   * @returns Objeto con los claims o vacío si no hay usuario\n   */\n  async getClaims(forceRefresh = false): Promise<Record<string, unknown>> {\n    const user = this.auth.currentUser;\n    if (!user) return {};\n\n    try {\n      const result = await user.getIdTokenResult(forceRefresh);\n      return result.claims;\n    } catch {\n      return {};\n    }\n  }\n\n  /**\n   * Verifica si el usuario tiene un rol específico.\n   * El rol debe estar definido en los claims del Custom Token.\n   *\n   * @param role - Nombre del rol a verificar\n   * @returns true si el usuario tiene el rol\n   */\n  async hasRole(role: string): Promise<boolean> {\n    const claims = await this.getClaims();\n    return (\n      claims['role'] === role || (Array.isArray(claims['roles']) && claims['roles'].includes(role))\n    );\n  }\n\n  // ===========================================================================\n  // RBAC - PERMISOS Y ORGANIZACIONES\n  // ===========================================================================\n\n  /**\n   * Obtiene las memberships (organizaciones) del usuario.\n   * Cada membership contiene el rol y permisos en esa organización.\n   *\n   * @param forceRefresh - Si true, fuerza la renovación del token\n   * @returns Mapa de orgId → MembershipInfo\n   *\n   * @example\n   * ```typescript\n   * const memberships = await firebaseService.getMemberships();\n   * // { 'org_abc': { roleId: 'admin', roleName: 'admin', permissions: ['users:*', ...] } }\n   * ```\n   */\n  async getMemberships(forceRefresh = false): Promise<Record<string, MembershipInfo>> {\n    const claims = await this.getClaims(forceRefresh);\n    return (claims['memberships'] as Record<string, MembershipInfo>) || {};\n  }\n\n  /**\n   * Obtiene la organización activa del usuario.\n   * La organización activa se establece al hacer login o al cambiar de org.\n   *\n   * @param forceRefresh - Si true, fuerza la renovación del token\n   * @returns ID de la organización activa o null si no hay ninguna\n   */\n  async getActiveOrg(forceRefresh = false): Promise<string | null> {\n    const claims = await this.getClaims(forceRefresh);\n    return (claims['activeOrg'] as string) || null;\n  }\n\n  /**\n   * Obtiene información de todas las organizaciones del usuario.\n   *\n   * @param forceRefresh - Si true, fuerza la renovación del token\n   * @returns Array con información de cada organización\n   */\n  async getOrganizations(forceRefresh = false): Promise<OrganizationInfo[]> {\n    const memberships = await this.getMemberships(forceRefresh);\n    return Object.entries(memberships).map(([id, info]) => ({\n      id,\n      roleId: info.roleId,\n      roleName: info.roleName,\n      permissions: info.permissions,\n    }));\n  }\n\n  /**\n   * Obtiene los IDs de todas las organizaciones del usuario.\n   *\n   * @returns Array de IDs de organizaciones\n   */\n  async getOrganizationIds(): Promise<string[]> {\n    const memberships = await this.getMemberships();\n    return Object.keys(memberships);\n  }\n\n  /**\n   * Verifica si el usuario pertenece a una organización.\n   *\n   * @param orgId - ID de la organización\n   * @returns true si el usuario es miembro\n   */\n  async isMemberOf(orgId: string): Promise<boolean> {\n    const memberships = await this.getMemberships();\n    return orgId in memberships;\n  }\n\n  /**\n   * Obtiene el rol del usuario en una organización.\n   *\n   * @param orgId - ID de la organización\n   * @returns ID del rol o null si no es miembro\n   */\n  async getRoleInOrg(orgId: string): Promise<string | null> {\n    const memberships = await this.getMemberships();\n    return memberships[orgId]?.roleId || null;\n  }\n\n  /**\n   * Obtiene los permisos del usuario en una organización.\n   *\n   * @param orgId - ID de la organización\n   * @returns Array de permisos en formato 'resource:action'\n   */\n  async getPermissionsInOrg(orgId: string): Promise<string[]> {\n    const memberships = await this.getMemberships();\n    return memberships[orgId]?.permissions || [];\n  }\n\n  /**\n   * Verifica si el usuario tiene un permiso específico en una organización.\n   * Soporta wildcards: 'resource:*' y '*:*' (super admin).\n   *\n   * @param orgId - ID de la organización\n   * @param resource - Recurso a verificar (ej: 'users', 'documents')\n   * @param action - Acción a verificar (ej: 'read', 'write', 'create', 'delete')\n   * @returns true si tiene el permiso\n   *\n   * @example\n   * ```typescript\n   * // Verificar permiso específico\n   * const canReadUsers = await firebaseService.hasPermission('org_abc', 'users', 'read');\n   *\n   * // Verificar en la organización activa\n   * const orgId = await firebaseService.getActiveOrg();\n   * const canEdit = await firebaseService.hasPermission(orgId!, 'documents', 'write');\n   * ```\n   */\n  async hasPermission(orgId: string, resource: string, action: string): Promise<boolean> {\n    const permissions = await this.getPermissionsInOrg(orgId);\n    const permission = `${resource}:${action}`;\n\n    return (\n      permissions.includes(permission) ||\n      permissions.includes(`${resource}:*`) ||\n      permissions.includes('*:*')\n    );\n  }\n\n  /**\n   * Verifica si el usuario puede leer un recurso en una organización.\n   * Atajo para hasPermission(orgId, resource, 'read').\n   */\n  async canRead(orgId: string, resource: string): Promise<boolean> {\n    return this.hasPermission(orgId, resource, 'read');\n  }\n\n  /**\n   * Verifica si el usuario puede escribir un recurso en una organización.\n   * Atajo para hasPermission(orgId, resource, 'write').\n   */\n  async canWrite(orgId: string, resource: string): Promise<boolean> {\n    return this.hasPermission(orgId, resource, 'write');\n  }\n\n  /**\n   * Verifica si el usuario puede crear un recurso en una organización.\n   * Atajo para hasPermission(orgId, resource, 'create').\n   */\n  async canCreate(orgId: string, resource: string): Promise<boolean> {\n    return this.hasPermission(orgId, resource, 'create');\n  }\n\n  /**\n   * Verifica si el usuario puede eliminar un recurso en una organización.\n   * Atajo para hasPermission(orgId, resource, 'delete').\n   */\n  async canDelete(orgId: string, resource: string): Promise<boolean> {\n    return this.hasPermission(orgId, resource, 'delete');\n  }\n\n  /**\n   * Verifica si el usuario puede administrar un recurso en una organización.\n   * Equivale a tener 'resource:*' o '*:*'.\n   */\n  async canManage(orgId: string, resource: string): Promise<boolean> {\n    const permissions = await this.getPermissionsInOrg(orgId);\n    return permissions.includes(`${resource}:*`) || permissions.includes('*:*');\n  }\n\n  /**\n   * Verifica si el usuario es super admin en una organización.\n   * Super admin tiene el permiso '*:*'.\n   */\n  async isSuperAdmin(orgId: string): Promise<boolean> {\n    const permissions = await this.getPermissionsInOrg(orgId);\n    return permissions.includes('*:*');\n  }\n\n  /**\n   * Verifica si el usuario es admin en una organización.\n   */\n  async isAdminInOrg(orgId: string): Promise<boolean> {\n    const role = await this.getRoleInOrg(orgId);\n    return role === 'admin' || role === 'super_admin';\n  }\n\n  // ===========================================================================\n  // UTILIDADES\n  // ===========================================================================\n\n  /**\n   * Espera a que el estado de autenticación esté determinado.\n   * Útil en guards o al inicializar la app.\n   *\n   * @returns Usuario actual o null\n   */\n  waitForAuth(): Promise<FirebaseUser | null> {\n    return new Promise(resolve => {\n      const subscription = this.state$.subscribe(state => {\n        if (!state.isLoading) {\n          subscription.unsubscribe();\n          resolve(state.user);\n        }\n      });\n    });\n  }\n\n  /**\n   * Obtiene la configuración actual de Firebase.\n   */\n  getConfig(): ValtechFirebaseConfig {\n    return this.config;\n  }\n\n  /**\n   * Indica si los emuladores están habilitados.\n   */\n  isUsingEmulators(): boolean {\n    return !!(\n      this.config.emulator?.firestore ||\n      this.config.emulator?.auth ||\n      this.config.emulator?.storage\n    );\n  }\n\n  // ===========================================================================\n  // MÉTODOS PRIVADOS\n  // ===========================================================================\n\n  /**\n   * Mapea un User de Firebase a nuestra interface FirebaseUser\n   */\n  private mapUser(user: User): FirebaseUser {\n    return {\n      uid: user.uid,\n      email: user.email,\n      displayName: user.displayName,\n      photoURL: user.photoURL,\n      emailVerified: user.emailVerified,\n      isAnonymous: user.isAnonymous,\n      providerId: user.providerId,\n    };\n  }\n\n  /**\n   * Convierte errores de Firebase a mensajes en español\n   */\n  private getErrorMessage(error: unknown): string {\n    if (error instanceof Error) {\n      const code = (error as { code?: string }).code;\n\n      switch (code) {\n        case 'auth/invalid-custom-token':\n          return 'Token de autenticación inválido';\n        case 'auth/custom-token-mismatch':\n          return 'El token no corresponde a este proyecto';\n        case 'auth/network-request-failed':\n          return 'Error de conexión. Verifica tu conexión a internet';\n        case 'auth/too-many-requests':\n          return 'Demasiados intentos. Intenta de nuevo más tarde';\n        case 'auth/user-disabled':\n          return 'Esta cuenta ha sido deshabilitada';\n        case 'auth/user-not-found':\n          return 'Usuario no encontrado';\n        default:\n          return error.message || 'Error de autenticación desconocido';\n      }\n    }\n\n    return 'Error de autenticación desconocido';\n  }\n}\n","/**\n * Path Builder\n *\n * Utilidades para construir rutas de Firestore con templates.\n * Soporta rutas multi-nivel y anidadas.\n */\n\n/**\n * Construye una ruta de Firestore reemplazando placeholders.\n *\n * @param template - Template con placeholders en formato {param}\n * @param params - Objeto con los valores a reemplazar\n * @returns Ruta construida\n * @throws Error si faltan parámetros requeridos\n *\n * @example\n * ```typescript\n * // Ruta simple\n * buildPath('users/{userId}', { userId: 'abc123' });\n * // => 'users/abc123'\n *\n * // Ruta anidada\n * buildPath('users/{userId}/documents/{docId}', {\n *   userId: 'abc123',\n *   docId: 'doc456'\n * });\n * // => 'users/abc123/documents/doc456'\n *\n * // Múltiples niveles\n * buildPath('orgs/{orgId}/teams/{teamId}/members/{memberId}', {\n *   orgId: 'org1',\n *   teamId: 'team2',\n *   memberId: 'member3'\n * });\n * // => 'orgs/org1/teams/team2/members/member3'\n * ```\n */\nexport function buildPath(template: string, params: Record<string, string>): string {\n  let result = template;\n\n  // Encontrar todos los placeholders\n  const placeholders = template.match(/\\{([^}]+)\\}/g);\n\n  if (!placeholders) {\n    return template;\n  }\n\n  for (const placeholder of placeholders) {\n    const key = placeholder.slice(1, -1); // Remover { y }\n    const value = params[key];\n\n    if (value === undefined || value === null) {\n      throw new Error(`Parámetro requerido '${key}' no proporcionado para la ruta: ${template}`);\n    }\n\n    if (typeof value !== 'string' || value.trim() === '') {\n      throw new Error(`El parámetro '${key}' debe ser un string no vacío`);\n    }\n\n    // Validar que no contenga caracteres inválidos para Firestore\n    if (value.includes('/')) {\n      throw new Error(`El parámetro '${key}' no puede contener '/'`);\n    }\n\n    result = result.replace(placeholder, value);\n  }\n\n  return result;\n}\n\n/**\n * Extrae los nombres de los parámetros de un template de ruta.\n *\n * @param template - Template de ruta\n * @returns Array con los nombres de los parámetros\n *\n * @example\n * ```typescript\n * extractParams('users/{userId}/documents/{docId}');\n * // => ['userId', 'docId']\n * ```\n */\nexport function extractPathParams(template: string): string[] {\n  const matches = template.match(/\\{([^}]+)\\}/g);\n  if (!matches) return [];\n  return matches.map((m) => m.slice(1, -1));\n}\n\n/**\n * Valida que una ruta de Firestore sea válida.\n *\n * @param path - Ruta a validar\n * @returns true si la ruta es válida\n *\n * @example\n * ```typescript\n * isValidPath('users/abc123');           // true\n * isValidPath('users/abc123/documents'); // true\n * isValidPath('users//documents');       // false (segmento vacío)\n * isValidPath('');                       // false (vacío)\n * ```\n */\nexport function isValidPath(path: string): boolean {\n  if (!path || path.trim() === '') return false;\n\n  const segments = path.split('/');\n\n  // No puede tener segmentos vacíos\n  if (segments.some((s) => s.trim() === '')) return false;\n\n  // No puede empezar o terminar con /\n  if (path.startsWith('/') || path.endsWith('/')) return false;\n\n  return true;\n}\n\n/**\n * Obtiene la ruta de la colección padre de un documento.\n *\n * @param documentPath - Ruta completa del documento\n * @returns Ruta de la colección padre\n *\n * @example\n * ```typescript\n * getCollectionPath('users/abc123');\n * // => 'users'\n *\n * getCollectionPath('users/abc123/documents/doc456');\n * // => 'users/abc123/documents'\n * ```\n */\nexport function getCollectionPath(documentPath: string): string {\n  const segments = documentPath.split('/');\n  if (segments.length < 2) {\n    throw new Error(`Ruta de documento inválida: ${documentPath}`);\n  }\n  return segments.slice(0, -1).join('/');\n}\n\n/**\n * Obtiene el ID del documento de una ruta.\n *\n * @param documentPath - Ruta completa del documento\n * @returns ID del documento\n *\n * @example\n * ```typescript\n * getDocumentId('users/abc123');\n * // => 'abc123'\n *\n * getDocumentId('users/abc123/documents/doc456');\n * // => 'doc456'\n * ```\n */\nexport function getDocumentId(documentPath: string): string {\n  const segments = documentPath.split('/');\n  if (segments.length < 2 || segments.length % 2 !== 0) {\n    throw new Error(`Ruta de documento inválida: ${documentPath}`);\n  }\n  return segments[segments.length - 1];\n}\n\n/**\n * Verifica si una ruta apunta a un documento (número par de segmentos).\n *\n * @param path - Ruta a verificar\n * @returns true si es una ruta de documento\n *\n * @example\n * ```typescript\n * isDocumentPath('users/abc123');           // true\n * isDocumentPath('users');                  // false (colección)\n * isDocumentPath('users/abc123/documents'); // false (colección)\n * ```\n */\nexport function isDocumentPath(path: string): boolean {\n  const segments = path.split('/').filter((s) => s.trim() !== '');\n  return segments.length > 0 && segments.length % 2 === 0;\n}\n\n/**\n * Verifica si una ruta apunta a una colección (número impar de segmentos).\n *\n * @param path - Ruta a verificar\n * @returns true si es una ruta de colección\n */\nexport function isCollectionPath(path: string): boolean {\n  const segments = path.split('/').filter((s) => s.trim() !== '');\n  return segments.length > 0 && segments.length % 2 !== 0;\n}\n\n/**\n * Combina una ruta base con segmentos adicionales.\n *\n * @param basePath - Ruta base\n * @param segments - Segmentos adicionales\n * @returns Ruta combinada\n *\n * @example\n * ```typescript\n * joinPath('users', 'abc123', 'documents');\n * // => 'users/abc123/documents'\n * ```\n */\nexport function joinPath(...segments: string[]): string {\n  return segments\n    .filter((s) => s && s.trim() !== '')\n    .map((s) => s.replace(/^\\/+|\\/+$/g, '')) // Remover / al inicio y final\n    .join('/');\n}\n","/**\n * Firestore Service\n *\n * Servicio genérico para operaciones CRUD en Firestore.\n * Soporta lecturas one-time, subscripciones real-time, paginación y queries complejas.\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport {\n  addDoc,\n  collection,\n  collectionData,\n  deleteDoc,\n  doc,\n  docData,\n  DocumentData,\n  DocumentReference,\n  DocumentSnapshot,\n  Firestore,\n  getCountFromServer,\n  getDoc,\n  getDocs,\n  limit,\n  orderBy,\n  query,\n  QueryConstraint,\n  serverTimestamp,\n  setDoc,\n  startAfter,\n  startAt,\n  endBefore,\n  endAt,\n  Timestamp,\n  updateDoc,\n  where,\n  writeBatch,\n  increment,\n  arrayUnion,\n  arrayRemove,\n  FieldValue,\n} from '@angular/fire/firestore';\nimport { map, Observable } from 'rxjs';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport { FirestoreDocument, PaginatedResult, QueryOptions } from './types';\nimport { buildPath } from './utils/path-builder';\n\n/**\n * Internal sentinel used to mark a collection path as global cross-app —\n * i.e. it should NOT be prefixed with `apps/{appId}/`.\n *\n * Apps consume this via `CollectionOptions.skipAppPrefix`; the sentinel\n * stays in `TypedCollection` and is stripped here before Firestore sees it.\n *\n * Format keeps it impossible to collide with a real Firestore path (`:` is\n * not allowed in collection segments).\n *\n * @internal\n */\nexport const ABS_PATH_SENTINEL = '__abs__:';\n\n/**\n * Servicio para operaciones CRUD en Firestore.\n *\n * @example\n * ```typescript\n * interface User extends FirestoreDocument {\n *   name: string;\n *   email: string;\n *   role: 'admin' | 'user';\n * }\n *\n * @Component({...})\n * export class UsersComponent {\n *   private firestore = inject(FirestoreService);\n *\n *   // Lectura one-time\n *   async loadUser(id: string) {\n *     const user = await this.firestore.getDoc<User>('users', id);\n *   }\n *\n *   // Subscripción real-time\n *   users$ = this.firestore.collectionChanges<User>('users', {\n *     where: [{ field: 'role', operator: '==', value: 'admin' }],\n *     orderBy: [{ field: 'name', direction: 'asc' }]\n *   });\n *\n *   // Crear documento\n *   async createUser(data: Omit<User, 'id'>) {\n *     const user = await this.firestore.addDoc<User>('users', data);\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FirestoreService {\n  private config = inject(VALTECH_FIREBASE_CONFIG, { optional: true });\n\n  constructor(private firestore: Firestore) {}\n\n  /**\n   * Prefija el path de colección con el appId si está configurado.\n   * Si no hay appId, retorna el path sin modificar (backward compatible).\n   *\n   * Si el path empieza con `ABS_PATH_SENTINEL` (`__abs__:`), se asume que el\n   * caller quiere un path global cross-app (ej. `users/{uid}/notifications` —\n   * el inbox global de notificaciones). El sentinel se strippea y el resto\n   * del path se pasa verbatim, sin prefijo `apps/{appId}/`.\n   *\n   * @internal\n   */\n  private prefixCollectionPath(collectionPath: string): string {\n    if (collectionPath.startsWith(ABS_PATH_SENTINEL)) {\n      return collectionPath.slice(ABS_PATH_SENTINEL.length);\n    }\n    if (!this.config?.appId) return collectionPath;\n    return `apps/${this.config.appId}/${collectionPath}`;\n  }\n\n  // ===========================================================================\n  // LECTURAS ONE-TIME (Promise)\n  // ===========================================================================\n\n  /**\n   * Obtiene un documento por ID (lectura única).\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   * @returns Documento o null si no existe\n   *\n   * @example\n   * ```typescript\n   * const user = await firestoreService.getDoc<User>('users', 'abc123');\n   * if (user) {\n   *   console.log(user.name);\n   * }\n   * ```\n   */\n  async getDoc<T extends FirestoreDocument>(\n    collectionPath: string,\n    docId: string\n  ): Promise<T | null> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n    const snapshot = await getDoc(docRef);\n\n    if (!snapshot.exists()) {\n      return null;\n    }\n\n    return this.mapDocument<T>(snapshot);\n  }\n\n  /**\n   * Obtiene múltiples documentos con opciones de query.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param options - Opciones de query (where, orderBy, limit)\n   * @returns Array de documentos\n   *\n   * @example\n   * ```typescript\n   * // Todos los usuarios activos ordenados por nombre\n   * const users = await firestoreService.getDocs<User>('users', {\n   *   where: [{ field: 'active', operator: '==', value: true }],\n   *   orderBy: [{ field: 'name', direction: 'asc' }],\n   *   limit: 50\n   * });\n   * ```\n   */\n  async getDocs<T extends FirestoreDocument>(\n    collectionPath: string,\n    options?: QueryOptions\n  ): Promise<T[]> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    const constraints = this.buildQueryConstraints(options);\n    const q = query(collectionRef, ...constraints);\n    const snapshot = await getDocs(q);\n\n    return snapshot.docs.map(doc => this.mapDocument<T>(doc));\n  }\n\n  /**\n   * Cuenta documentos usando aggregation query del servidor.\n   * No descarga los documentos — mucho más eficiente para conteos y badges.\n   */\n  async countDocs(collectionPath: string, options?: QueryOptions): Promise<number> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    const constraints = this.buildQueryConstraints(options);\n    const q = query(collectionRef, ...constraints);\n    const snapshot = await getCountFromServer(q);\n    return snapshot.data().count;\n  }\n\n  /**\n   * Obtiene documentos con paginación basada en cursores.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param options - Opciones de query (debe incluir limit)\n   * @returns Resultado paginado con cursor para la siguiente página\n   *\n   * @example\n   * ```typescript\n   * // Primera página\n   * const page1 = await firestoreService.getPaginated<User>('users', {\n   *   orderBy: [{ field: 'createdAt', direction: 'desc' }],\n   *   limit: 10\n   * });\n   *\n   * // Siguiente página\n   * if (page1.hasMore) {\n   *   const page2 = await firestoreService.getPaginated<User>('users', {\n   *     orderBy: [{ field: 'createdAt', direction: 'desc' }],\n   *     limit: 10,\n   *     startAfter: page1.lastDoc\n   *   });\n   * }\n   * ```\n   */\n  async getPaginated<T extends FirestoreDocument>(\n    collectionPath: string,\n    options: QueryOptions & { limit: number }\n  ): Promise<PaginatedResult<T>> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    const constraints = this.buildQueryConstraints(options);\n\n    // Pedir uno más para saber si hay más páginas\n    const q = query(collectionRef, ...constraints, limit(options.limit + 1));\n    const snapshot = await getDocs(q);\n\n    const docs = snapshot.docs;\n    const hasMore = docs.length > options.limit;\n\n    // Si hay más, remover el documento extra\n    const resultDocs = hasMore ? docs.slice(0, -1) : docs;\n    const lastDoc = resultDocs.length > 0 ? resultDocs[resultDocs.length - 1] : null;\n\n    return {\n      data: resultDocs.map(doc => this.mapDocument<T>(doc)),\n      hasMore,\n      lastDoc,\n    };\n  }\n\n  /**\n   * Verifica si un documento existe.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   * @returns true si el documento existe\n   */\n  async exists(collectionPath: string, docId: string): Promise<boolean> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n    const snapshot = await getDoc(docRef);\n    return snapshot.exists();\n  }\n\n  // ===========================================================================\n  // SUBSCRIPCIONES REAL-TIME (Observable)\n  // ===========================================================================\n\n  /**\n   * Suscribe a cambios de un documento (real-time).\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   * @returns Observable que emite cuando el documento cambia\n   *\n   * @example\n   * ```typescript\n   * // En el componente\n   * user$ = this.firestoreService.docChanges<User>('users', this.userId);\n   *\n   * // En el template\n   * @if (user$ | async; as user) {\n   *   <p>{{ user.name }}</p>\n   * }\n   * ```\n   */\n  docChanges<T extends FirestoreDocument>(\n    collectionPath: string,\n    docId: string\n  ): Observable<T | null> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n    return docData(docRef, { idField: 'id' }).pipe(\n      map(data => {\n        if (!data) return null;\n        return this.convertTimestamps(data as DocumentData) as T;\n      })\n    );\n  }\n\n  /**\n   * Suscribe a cambios de una colección (real-time).\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param options - Opciones de query\n   * @returns Observable que emite cuando la colección cambia\n   *\n   * @example\n   * ```typescript\n   * // Usuarios activos en tiempo real\n   * activeUsers$ = this.firestoreService.collectionChanges<User>('users', {\n   *   where: [{ field: 'status', operator: '==', value: 'online' }]\n   * });\n   * ```\n   */\n  collectionChanges<T extends FirestoreDocument>(\n    collectionPath: string,\n    options?: QueryOptions\n  ): Observable<T[]> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    const constraints = this.buildQueryConstraints(options);\n    const q = query(collectionRef, ...constraints);\n\n    return collectionData(q, { idField: 'id' }).pipe(\n      map(docs => docs.map(doc => this.convertTimestamps(doc) as T))\n    );\n  }\n\n  // ===========================================================================\n  // ESCRITURA\n  // ===========================================================================\n\n  /**\n   * Agrega un documento con ID auto-generado.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param data - Datos del documento (sin id, createdAt, updatedAt)\n   * @returns Documento creado con su ID\n   *\n   * @example\n   * ```typescript\n   * const newUser = await firestoreService.addDoc<User>('users', {\n   *   name: 'John Doe',\n   *   email: 'john@example.com',\n   *   role: 'user'\n   * });\n   * console.log('Created user with ID:', newUser.id);\n   * ```\n   */\n  async addDoc<T extends FirestoreDocument>(\n    collectionPath: string,\n    data: Omit<T, 'id' | 'createdAt' | 'updatedAt'>\n  ): Promise<T> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    const timestamp = serverTimestamp();\n\n    const docData = {\n      ...data,\n      createdAt: timestamp,\n      updatedAt: timestamp,\n    };\n\n    const docRef = await addDoc(collectionRef, docData);\n\n    // Retornar optimísticamente sin segundo round-trip.\n    // serverTimestamp() resuelve en el servidor; usamos Date.now() localmente\n    // para evitar un getDoc() extra. El valor real llega en la próxima lectura.\n    const now = new Date();\n    return { id: docRef.id, ...data, createdAt: now, updatedAt: now } as T;\n  }\n\n  /**\n   * Crea o sobrescribe un documento con ID específico.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   * @param data - Datos del documento\n   * @param options - Opciones (merge: true para merge en lugar de sobrescribir)\n   *\n   * @example\n   * ```typescript\n   * // Sobrescribir completamente\n   * await firestoreService.setDoc<User>('users', 'user123', userData);\n   *\n   * // Merge con datos existentes\n   * await firestoreService.setDoc<User>('users', 'user123', { name: 'New Name' }, { merge: true });\n   * ```\n   */\n  async setDoc<T extends FirestoreDocument>(\n    collectionPath: string,\n    docId: string,\n    data: Omit<T, 'id'>,\n    options?: { merge?: boolean }\n  ): Promise<void> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n    const timestamp = serverTimestamp();\n\n    const docData = {\n      ...data,\n      updatedAt: timestamp,\n      ...(options?.merge ? {} : { createdAt: timestamp }),\n    };\n\n    await setDoc(docRef, docData, { merge: options?.merge ?? false });\n  }\n\n  /**\n   * Actualiza campos específicos de un documento.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   * @param data - Campos a actualizar\n   *\n   * @example\n   * ```typescript\n   * await firestoreService.updateDoc<User>('users', 'user123', {\n   *   name: 'Updated Name',\n   *   lastLogin: new Date()\n   * });\n   * ```\n   */\n  async updateDoc<T extends FirestoreDocument>(\n    collectionPath: string,\n    docId: string,\n    data: Partial<Omit<T, 'id' | 'createdAt'>>\n  ): Promise<void> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n\n    await updateDoc(docRef, {\n      ...data,\n      updatedAt: serverTimestamp(),\n    });\n  }\n\n  /**\n   * Elimina un documento.\n   *\n   * @param collectionPath - Ruta de la colección\n   * @param docId - ID del documento\n   *\n   * @example\n   * ```typescript\n   * await firestoreService.deleteDoc('users', 'user123');\n   * ```\n   */\n  async deleteDoc(collectionPath: string, docId: string): Promise<void> {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const docRef = doc(this.firestore, prefixedPath, docId);\n    await deleteDoc(docRef);\n  }\n\n  // ===========================================================================\n  // OPERACIONES EN LOTE\n  // ===========================================================================\n\n  /**\n   * Ejecuta múltiples operaciones de escritura de forma atómica.\n   *\n   * @param operations - Función que recibe el batch y agrega operaciones\n   *\n   * @example\n   * ```typescript\n   * await firestoreService.batch((batch) => {\n   *   batch.set('users/user1', { name: 'User 1' });\n   *   batch.update('users/user2', { status: 'inactive' });\n   *   batch.delete('users/user3');\n   * });\n   * ```\n   */\n  async batch(\n    operations: (batch: {\n      set: <T>(path: string, data: T) => void;\n      update: <T>(path: string, data: Partial<T>) => void;\n      delete: (path: string) => void;\n    }) => void\n  ): Promise<void> {\n    const batch = writeBatch(this.firestore);\n\n    const batchApi = {\n      set: <T>(path: string, data: T) => {\n        const [collectionPath, docId] = this.splitPath(path);\n        const prefixedPath = this.prefixCollectionPath(collectionPath);\n        const docRef = doc(this.firestore, prefixedPath, docId);\n        batch.set(docRef, {\n          ...data,\n          createdAt: serverTimestamp(),\n          updatedAt: serverTimestamp(),\n        } as DocumentData);\n      },\n      update: <T>(path: string, data: Partial<T>) => {\n        const [collectionPath, docId] = this.splitPath(path);\n        const prefixedPath = this.prefixCollectionPath(collectionPath);\n        const docRef = doc(this.firestore, prefixedPath, docId);\n        batch.update(docRef, {\n          ...data,\n          updatedAt: serverTimestamp(),\n        } as DocumentData);\n      },\n      delete: (path: string) => {\n        const [collectionPath, docId] = this.splitPath(path);\n        const prefixedPath = this.prefixCollectionPath(collectionPath);\n        const docRef = doc(this.firestore, prefixedPath, docId);\n        batch.delete(docRef);\n      },\n    };\n\n    operations(batchApi);\n    await batch.commit();\n  }\n\n  // ===========================================================================\n  // UTILIDADES\n  // ===========================================================================\n\n  /**\n   * Construye una ruta a partir de un template.\n   *\n   * @param template - Template con placeholders {param}\n   * @param params - Valores para los placeholders\n   * @returns Ruta construida\n   *\n   * @example\n   * ```typescript\n   * const path = firestoreService.buildPath('users/{userId}/documents/{docId}', {\n   *   userId: 'user123',\n   *   docId: 'doc456'\n   * });\n   * // => 'users/user123/documents/doc456'\n   * ```\n   */\n  buildPath(template: string, params: Record<string, string>): string {\n    return buildPath(template, params);\n  }\n\n  /**\n   * Genera un ID único para un documento (sin crearlo).\n   *\n   * @param collectionPath - Ruta de la colección\n   * @returns ID único generado por Firestore\n   */\n  generateId(collectionPath: string): string {\n    const prefixedPath = this.prefixCollectionPath(collectionPath);\n    const collectionRef = collection(this.firestore, prefixedPath);\n    return doc(collectionRef).id;\n  }\n\n  /**\n   * Retorna un valor de timestamp del servidor.\n   * Usar en campos de fecha para que Firestore asigne el timestamp.\n   */\n  serverTimestamp(): FieldValue {\n    return serverTimestamp();\n  }\n\n  /**\n   * Retorna un valor para agregar elementos a un array.\n   *\n   * @example\n   * ```typescript\n   * await firestoreService.updateDoc('users', 'user123', {\n   *   tags: firestoreService.arrayUnion('new-tag')\n   * });\n   * ```\n   */\n  arrayUnion(...elements: unknown[]): FieldValue {\n    return arrayUnion(...elements);\n  }\n\n  /**\n   * Retorna un valor para remover elementos de un array.\n   */\n  arrayRemove(...elements: unknown[]): FieldValue {\n    return arrayRemove(...elements);\n  }\n\n  /**\n   * Retorna un valor para incrementar un campo numérico.\n   *\n   * @example\n   * ```typescript\n   * await firestoreService.updateDoc('users', 'user123', {\n   *   loginCount: firestoreService.increment(1)\n   * });\n   * ```\n   */\n  increment(n: number): FieldValue {\n    return increment(n);\n  }\n\n  // ===========================================================================\n  // MÉTODOS PRIVADOS\n  // ===========================================================================\n\n  /**\n   * Construye los QueryConstraints a partir de QueryOptions\n   */\n  private buildQueryConstraints(options?: QueryOptions): QueryConstraint[] {\n    const constraints: QueryConstraint[] = [];\n\n    if (!options) return constraints;\n\n    // Where clauses\n    if (options.where) {\n      for (const clause of options.where) {\n        constraints.push(where(clause.field, clause.operator, clause.value));\n      }\n    }\n\n    // OrderBy clauses\n    if (options.orderBy) {\n      for (const clause of options.orderBy) {\n        constraints.push(orderBy(clause.field, clause.direction));\n      }\n    }\n\n    // Cursors para paginación\n    if (options.startAfter) {\n      constraints.push(startAfter(options.startAfter));\n    }\n    if (options.startAt) {\n      constraints.push(startAt(options.startAt));\n    }\n    if (options.endBefore) {\n      constraints.push(endBefore(options.endBefore));\n    }\n    if (options.endAt) {\n      constraints.push(endAt(options.endAt));\n    }\n\n    // Limit (se agrega al final)\n    if (options.limit) {\n      constraints.push(limit(options.limit));\n    }\n\n    return constraints;\n  }\n\n  /**\n   * Mapea un DocumentSnapshot a nuestro tipo\n   */\n  private mapDocument<T extends FirestoreDocument>(snapshot: DocumentSnapshot<DocumentData>): T {\n    const data = snapshot.data();\n    if (!data) {\n      throw new Error('Documento no tiene datos');\n    }\n\n    return {\n      id: snapshot.id,\n      ...this.convertTimestamps(data),\n    } as T;\n  }\n\n  /**\n   * Convierte Timestamps de Firestore a Date de JavaScript\n   */\n  private convertTimestamps(data: DocumentData): DocumentData {\n    const result: DocumentData = {};\n\n    for (const [key, value] of Object.entries(data)) {\n      if (value instanceof Timestamp) {\n        result[key] = value.toDate();\n      } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n        result[key] = this.convertTimestamps(value);\n      } else {\n        result[key] = value;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Divide una ruta de documento en colección e ID\n   */\n  private splitPath(path: string): [string, string] {\n    const segments = path.split('/');\n    if (segments.length < 2 || segments.length % 2 !== 0) {\n      throw new Error(`Ruta de documento inválida: ${path}`);\n    }\n    const docId = segments.pop()!;\n    const collectionPath = segments.join('/');\n    return [collectionPath, docId];\n  }\n}\n","/**\n * Firestore Collection Factory\n *\n * Patrón factory para crear instancias de colección tipadas.\n * Reemplaza la clase abstracta para evitar problemas con inject() en clases no-injectable.\n */\n\nimport { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ABS_PATH_SENTINEL, FirestoreService } from './firestore.service';\nimport { FirestoreDocument, PaginatedResult, QueryOptions } from './types';\n\n/**\n * Opciones de configuración para una colección.\n */\nexport interface CollectionOptions {\n  /**\n   * Si true, usa soft delete (marca deletedAt en lugar de eliminar).\n   * Default: false\n   */\n  softDelete?: boolean;\n\n  /**\n   * Si true, maneja automáticamente createdAt/updatedAt.\n   * Default: true\n   */\n  timestamps?: boolean;\n\n  /**\n   * Si true, el path se trata como global y NO se prefija con `apps/{appId}/`.\n   *\n   * Usar para colecciones cross-app a nivel user/global, p.ej.\n   * `users/{uid}/notifications` (inbox global), `profiles/{uid}` o `public/...`.\n   *\n   * Las reglas de Firestore deben permitir el path absoluto correspondiente.\n   *\n   * Default: false (path prefijado a `apps/{appId}/...`).\n   */\n  skipAppPrefix?: boolean;\n}\n\n/**\n * Referencia a una sub-colección tipada.\n */\nexport interface SubCollectionRef<T extends FirestoreDocument> {\n  getById(id: string): Promise<T | null>;\n  getAll(options?: QueryOptions): Promise<T[]>;\n  watch(id: string): Observable<T | null>;\n  watchAll(options?: QueryOptions): Observable<T[]>;\n  create(data: Omit<T, 'id' | 'createdAt' | 'updatedAt'>): Promise<T>;\n  update(id: string, data: Partial<T>): Promise<void>;\n  delete(id: string): Promise<void>;\n}\n\n/**\n * Factory para crear instancias de colección tipadas.\n *\n * @example\n * ```typescript\n * @Injectable({ providedIn: 'root' })\n * export class UsersService {\n *   private users = inject(FirestoreCollectionFactory).create<User>('users');\n *\n *   getAll = () => this.users.getAll();\n *   getById = (id: string) => this.users.getById(id);\n *   create = (data: Omit<User, 'id'>) => this.users.create(data);\n *\n *   // Métodos personalizados\n *   async getActiveUsers(): Promise<User[]> {\n *     return this.users.query({\n *       where: [{ field: 'active', operator: '==', value: true }]\n *     });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FirestoreCollectionFactory {\n  constructor(private firestore: FirestoreService) {}\n\n  /**\n   * Crea una instancia de colección tipada.\n   *\n   * @param collectionPath - Ruta de la colección en Firestore\n   * @param options - Opciones de configuración\n   * @returns Instancia de TypedCollection\n   */\n  create<T extends FirestoreDocument>(\n    collectionPath: string,\n    options?: CollectionOptions\n  ): TypedCollection<T> {\n    return new TypedCollection<T>(this.firestore, collectionPath, options);\n  }\n}\n\n/**\n * Colección tipada con métodos CRUD.\n *\n * NO usa inject() - recibe FirestoreService por constructor.\n * Esto evita el error NG0203.\n */\nexport class TypedCollection<T extends FirestoreDocument> {\n  private readonly options: CollectionOptions;\n  private readonly collectionPath: string;\n\n  constructor(\n    private firestore: FirestoreService,\n    collectionPath: string,\n    options: CollectionOptions = {}\n  ) {\n    this.options = {\n      softDelete: false,\n      timestamps: true,\n      skipAppPrefix: false,\n      ...options,\n    };\n    // Marcar el path con el sentinel cuando skipAppPrefix=true. FirestoreService\n    // detecta el sentinel y devuelve el path sin prefijo `apps/{appId}/`.\n    // Subcolecciones (subPath = `${this.collectionPath}/...`) heredan el sentinel\n    // automáticamente por concatenación.\n    this.collectionPath = this.options.skipAppPrefix\n      ? `${ABS_PATH_SENTINEL}${collectionPath}`\n      : collectionPath;\n  }\n\n  // ===========================================================================\n  // LECTURAS ONE-TIME\n  // ===========================================================================\n\n  /**\n   * Obtiene un documento por ID.\n   */\n  async getById(id: string): Promise<T | null> {\n    return this.firestore.getDoc<T>(this.collectionPath, id);\n  }\n\n  /**\n   * Obtiene todos los documentos de la colección.\n   */\n  async getAll(options?: QueryOptions): Promise<T[]> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.getDocs<T>(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Ejecuta una query personalizada.\n   */\n  async query(options: QueryOptions): Promise<T[]> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.getDocs<T>(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Obtiene documentos con paginación.\n   */\n  async paginate(options: QueryOptions & { limit: number }): Promise<PaginatedResult<T>> {\n    const queryOptions = this.applyDefaultFilters(options) as QueryOptions & { limit: number };\n    return this.firestore.getPaginated<T>(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Obtiene el primer documento que coincida con la query.\n   */\n  async getFirst(options?: QueryOptions): Promise<T | null> {\n    const queryOptions = this.applyDefaultFilters({\n      ...options,\n      limit: 1,\n    });\n    const results = await this.firestore.getDocs<T>(this.collectionPath, queryOptions);\n    return results[0] ?? null;\n  }\n\n  /**\n   * Cuenta los documentos que coinciden con la query (server-side aggregation).\n   * No descarga documentos — usa getCountFromServer() de Firestore.\n   */\n  async count(options?: QueryOptions): Promise<number> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.countDocs(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Obtiene todos los documentos (one-time fetch sin listener).\n   * A diferencia de watchAll(), no mantiene subscripciones activas.\n   */\n  async getAllOnce(options?: QueryOptions): Promise<T[]> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.getDocs<T>(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Verifica si un documento existe.\n   */\n  async exists(id: string): Promise<boolean> {\n    return this.firestore.exists(this.collectionPath, id);\n  }\n\n  // ===========================================================================\n  // SUBSCRIPCIONES REAL-TIME\n  // ===========================================================================\n\n  /**\n   * Suscribe a cambios de un documento.\n   */\n  watch(id: string): Observable<T | null> {\n    return this.firestore.docChanges<T>(this.collectionPath, id);\n  }\n\n  /**\n   * Suscribe a cambios de la colección.\n   */\n  watchAll(options?: QueryOptions): Observable<T[]> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.collectionChanges<T>(this.collectionPath, queryOptions);\n  }\n\n  /**\n   * Suscribe a una query personalizada.\n   */\n  watchQuery(options: QueryOptions): Observable<T[]> {\n    const queryOptions = this.applyDefaultFilters(options);\n    return this.firestore.collectionChanges<T>(this.collectionPath, queryOptions);\n  }\n\n  // ===========================================================================\n  // ESCRITURA\n  // ===========================================================================\n\n  /**\n   * Crea un nuevo documento con ID auto-generado.\n   */\n  async create(data: Omit<T, 'id' | 'createdAt' | 'updatedAt'>): Promise<T> {\n    return this.firestore.addDoc<T>(this.collectionPath, data);\n  }\n\n  /**\n   * Crea un documento con ID específico.\n   */\n  async createWithId(id: string, data: Omit<T, 'id'>): Promise<void> {\n    return this.firestore.setDoc<T>(this.collectionPath, id, data);\n  }\n\n  /**\n   * Actualiza campos de un documento.\n   */\n  async update(id: string, data: Partial<Omit<T, 'id' | 'createdAt'>>): Promise<void> {\n    return this.firestore.updateDoc<T>(this.collectionPath, id, data);\n  }\n\n  /**\n   * Elimina un documento.\n   * Si softDelete está habilitado, marca como eliminado en lugar de borrar.\n   */\n  async delete(id: string): Promise<void> {\n    if (this.options.softDelete) {\n      return this.firestore.updateDoc<T>(this.collectionPath, id, {\n        deletedAt: new Date(),\n      } as unknown as Partial<T>);\n    }\n    return this.firestore.deleteDoc(this.collectionPath, id);\n  }\n\n  /**\n   * Actualiza múltiples documentos en una sola operación atómica.\n   */\n  async batchUpdate(ids: string[], data: Partial<Omit<T, 'id' | 'createdAt'>>): Promise<void> {\n    if (ids.length === 0) return;\n\n    const BATCH_LIMIT = 500; // Firestore batch limit\n    for (let i = 0; i < ids.length; i += BATCH_LIMIT) {\n      const chunk = ids.slice(i, i + BATCH_LIMIT);\n      await this.firestore.batch(batch => {\n        for (const id of chunk) {\n          batch.update(`${this.collectionPath}/${id}`, data as Record<string, unknown>);\n        }\n      });\n    }\n  }\n\n  /**\n   * Elimina múltiples documentos en una sola operación atómica.\n   */\n  async batchDelete(ids: string[]): Promise<void> {\n    if (ids.length === 0) return;\n\n    const BATCH_LIMIT = 500;\n    for (let i = 0; i < ids.length; i += BATCH_LIMIT) {\n      const chunk = ids.slice(i, i + BATCH_LIMIT);\n      await this.firestore.batch(batch => {\n        for (const id of chunk) {\n          batch.delete(`${this.collectionPath}/${id}`);\n        }\n      });\n    }\n  }\n\n  /**\n   * Restaura un documento soft-deleted.\n   */\n  async restore(id: string): Promise<void> {\n    if (!this.options.softDelete) {\n      throw new Error('Soft delete no está habilitado para esta colección');\n    }\n    return this.firestore.updateDoc<T>(this.collectionPath, id, {\n      deletedAt: null,\n    } as unknown as Partial<T>);\n  }\n\n  // ===========================================================================\n  // SUB-COLECCIONES\n  // ===========================================================================\n\n  /**\n   * Obtiene una referencia a una sub-colección.\n   *\n   * @example\n   * ```typescript\n   * // En UsersService\n   * getUserDocuments(userId: string) {\n   *   return this.users.subcollection<Document>(userId, 'documents');\n   * }\n   *\n   * // Uso\n   * const docs = await users.getUserDocuments('user123').getAll();\n   * ```\n   */\n  subcollection<S extends FirestoreDocument>(\n    parentId: string,\n    subcollectionName: string\n  ): SubCollectionRef<S> {\n    const subPath = `${this.collectionPath}/${parentId}/${subcollectionName}`;\n\n    return {\n      getById: (id: string) => this.firestore.getDoc<S>(subPath, id),\n      getAll: (options?: QueryOptions) => this.firestore.getDocs<S>(subPath, options),\n      watch: (id: string) => this.firestore.docChanges<S>(subPath, id),\n      watchAll: (options?: QueryOptions) => this.firestore.collectionChanges<S>(subPath, options),\n      create: (data: Omit<S, 'id' | 'createdAt' | 'updatedAt'>) =>\n        this.firestore.addDoc<S>(subPath, data),\n      update: (id: string, data: Partial<S>) => this.firestore.updateDoc<S>(subPath, id, data),\n      delete: (id: string) => this.firestore.deleteDoc(subPath, id),\n    };\n  }\n\n  // ===========================================================================\n  // MÉTODOS PRIVADOS\n  // ===========================================================================\n\n  /**\n   * Aplica filtros por defecto a las queries.\n   */\n  private applyDefaultFilters(options?: QueryOptions): QueryOptions {\n    if (!this.options.softDelete) {\n      return options ?? {};\n    }\n\n    // Excluir documentos soft-deleted por defecto\n    const whereClause = { field: 'deletedAt', operator: '==' as const, value: null };\n\n    return {\n      ...options,\n      where: [...(options?.where ?? []), whereClause],\n    };\n  }\n\n  // ===========================================================================\n  // UTILIDADES\n  // ===========================================================================\n\n  /**\n   * Genera un nuevo ID sin crear el documento.\n   */\n  generateId(): string {\n    return this.firestore.generateId(this.collectionPath);\n  }\n\n  /**\n   * Obtiene la ruta de la colección.\n   */\n  getPath(): string {\n    return this.collectionPath;\n  }\n}\n\n/**\n * @deprecated Use FirestoreCollectionFactory.create() instead.\n * Type alias for backwards compatibility.\n */\nexport type FirestoreCollection<T extends FirestoreDocument> = TypedCollection<T>;\n","/**\n * Query Builder\n *\n * Builder fluido para construir queries de Firestore de manera legible.\n * Alternativa más expresiva a pasar objetos QueryOptions directamente.\n */\n\nimport { OrderByClause, OrderDirection, QueryOptions, WhereClause, WhereOperator } from '../types';\n\n/**\n * Builder fluido para queries de Firestore.\n *\n * @example\n * ```typescript\n * // Construir query con builder\n * const options = new QueryBuilder()\n *   .where('status', '==', 'active')\n *   .where('age', '>=', 18)\n *   .orderBy('createdAt', 'desc')\n *   .limit(10)\n *   .build();\n *\n * // Usar con FirestoreService\n * const users = await firestoreService.getDocs<User>('users', options);\n *\n * // O con método estático\n * const options2 = QueryBuilder.create()\n *   .where('category', '==', 'electronics')\n *   .orderBy('price', 'asc')\n *   .build();\n * ```\n */\nexport class QueryBuilder {\n  private whereConditions: WhereClause[] = [];\n  private orderByConditions: OrderByClause[] = [];\n  private limitValue?: number;\n  private startAfterValue?: unknown;\n  private startAtValue?: unknown;\n  private endBeforeValue?: unknown;\n  private endAtValue?: unknown;\n\n  /**\n   * Crea una nueva instancia del builder (método estático alternativo).\n   */\n  static create(): QueryBuilder {\n    return new QueryBuilder();\n  }\n\n  /**\n   * Agrega una condición where.\n   *\n   * @param field - Campo a filtrar\n   * @param operator - Operador de comparación\n   * @param value - Valor a comparar\n   *\n   * @example\n   * ```typescript\n   * builder.where('status', '==', 'active')\n   * builder.where('price', '>=', 100)\n   * builder.where('tags', 'array-contains', 'featured')\n   * builder.where('category', 'in', ['electronics', 'books'])\n   * ```\n   */\n  where(field: string, operator: WhereOperator, value: unknown): QueryBuilder {\n    this.whereConditions.push({ field, operator, value });\n    return this;\n  }\n\n  /**\n   * Shortcut para where con operador '=='.\n   *\n   * @example\n   * ```typescript\n   * builder.whereEquals('status', 'active')\n   * // equivalente a: builder.where('status', '==', 'active')\n   * ```\n   */\n  whereEquals(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '==', value);\n  }\n\n  /**\n   * Shortcut para where con operador '!='.\n   */\n  whereNotEquals(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '!=', value);\n  }\n\n  /**\n   * Shortcut para where con operador '>'.\n   */\n  whereGreaterThan(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '>', value);\n  }\n\n  /**\n   * Shortcut para where con operador '>='.\n   */\n  whereGreaterOrEqual(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '>=', value);\n  }\n\n  /**\n   * Shortcut para where con operador '<'.\n   */\n  whereLessThan(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '<', value);\n  }\n\n  /**\n   * Shortcut para where con operador '<='.\n   */\n  whereLessOrEqual(field: string, value: unknown): QueryBuilder {\n    return this.where(field, '<=', value);\n  }\n\n  /**\n   * Shortcut para where con operador 'array-contains'.\n   *\n   * @example\n   * ```typescript\n   * builder.whereArrayContains('tags', 'featured')\n   * ```\n   */\n  whereArrayContains(field: string, value: unknown): QueryBuilder {\n    return this.where(field, 'array-contains', value);\n  }\n\n  /**\n   * Shortcut para where con operador 'array-contains-any'.\n   *\n   * @example\n   * ```typescript\n   * builder.whereArrayContainsAny('tags', ['featured', 'new'])\n   * ```\n   */\n  whereArrayContainsAny(field: string, values: unknown[]): QueryBuilder {\n    return this.where(field, 'array-contains-any', values);\n  }\n\n  /**\n   * Shortcut para where con operador 'in'.\n   *\n   * @example\n   * ```typescript\n   * builder.whereIn('status', ['active', 'pending'])\n   * ```\n   */\n  whereIn(field: string, values: unknown[]): QueryBuilder {\n    return this.where(field, 'in', values);\n  }\n\n  /**\n   * Shortcut para where con operador 'not-in'.\n   */\n  whereNotIn(field: string, values: unknown[]): QueryBuilder {\n    return this.where(field, 'not-in', values);\n  }\n\n  /**\n   * Agrega ordenamiento por un campo.\n   *\n   * @param field - Campo por el cual ordenar\n   * @param direction - Dirección: 'asc' o 'desc' (default: 'asc')\n   *\n   * @example\n   * ```typescript\n   * builder.orderBy('createdAt', 'desc')\n   * builder.orderBy('name') // asc por defecto\n   * ```\n   */\n  orderBy(field: string, direction: OrderDirection = 'asc'): QueryBuilder {\n    this.orderByConditions.push({ field, direction });\n    return this;\n  }\n\n  /**\n   * Shortcut para orderBy descendente.\n   */\n  orderByDesc(field: string): QueryBuilder {\n    return this.orderBy(field, 'desc');\n  }\n\n  /**\n   * Shortcut para orderBy ascendente.\n   */\n  orderByAsc(field: string): QueryBuilder {\n    return this.orderBy(field, 'asc');\n  }\n\n  /**\n   * Limita el número de resultados.\n   *\n   * @param count - Número máximo de documentos\n   *\n   * @example\n   * ```typescript\n   * builder.limit(10)\n   * ```\n   */\n  limit(count: number): QueryBuilder {\n    if (count <= 0) {\n      throw new Error('El límite debe ser mayor a 0');\n    }\n    this.limitValue = count;\n    return this;\n  }\n\n  /**\n   * Cursor para paginación: empezar después de un documento.\n   *\n   * @param cursor - Documento o snapshot desde donde continuar\n   *\n   * @example\n   * ```typescript\n   * // Primera página\n   * const page1 = await service.getPaginated('users', builder.limit(10).build());\n   *\n   * // Siguiente página\n   * const page2 = await service.getPaginated('users',\n   *   builder.startAfter(page1.lastDoc).limit(10).build()\n   * );\n   * ```\n   */\n  startAfter(cursor: unknown): QueryBuilder {\n    this.startAfterValue = cursor;\n    return this;\n  }\n\n  /**\n   * Cursor para paginación: empezar en un documento.\n   */\n  startAt(cursor: unknown): QueryBuilder {\n    this.startAtValue = cursor;\n    return this;\n  }\n\n  /**\n   * Cursor para paginación: terminar antes de un documento.\n   */\n  endBefore(cursor: unknown): QueryBuilder {\n    this.endBeforeValue = cursor;\n    return this;\n  }\n\n  /**\n   * Cursor para paginación: terminar en un documento.\n   */\n  endAt(cursor: unknown): QueryBuilder {\n    this.endAtValue = cursor;\n    return this;\n  }\n\n  /**\n   * Construye el objeto QueryOptions.\n   *\n   * @returns QueryOptions para usar con FirestoreService\n   */\n  build(): QueryOptions {\n    const options: QueryOptions = {};\n\n    if (this.whereConditions.length > 0) {\n      options.where = [...this.whereConditions];\n    }\n\n    if (this.orderByConditions.length > 0) {\n      options.orderBy = [...this.orderByConditions];\n    }\n\n    if (this.limitValue !== undefined) {\n      options.limit = this.limitValue;\n    }\n\n    if (this.startAfterValue !== undefined) {\n      options.startAfter = this.startAfterValue;\n    }\n\n    if (this.startAtValue !== undefined) {\n      options.startAt = this.startAtValue;\n    }\n\n    if (this.endBeforeValue !== undefined) {\n      options.endBefore = this.endBeforeValue;\n    }\n\n    if (this.endAtValue !== undefined) {\n      options.endAt = this.endAtValue;\n    }\n\n    return options;\n  }\n\n  /**\n   * Resetea el builder para reutilización.\n   */\n  reset(): QueryBuilder {\n    this.whereConditions = [];\n    this.orderByConditions = [];\n    this.limitValue = undefined;\n    this.startAfterValue = undefined;\n    this.startAtValue = undefined;\n    this.endBeforeValue = undefined;\n    this.endAtValue = undefined;\n    return this;\n  }\n\n  /**\n   * Clona el builder actual.\n   */\n  clone(): QueryBuilder {\n    const cloned = new QueryBuilder();\n    cloned.whereConditions = [...this.whereConditions];\n    cloned.orderByConditions = [...this.orderByConditions];\n    cloned.limitValue = this.limitValue;\n    cloned.startAfterValue = this.startAfterValue;\n    cloned.startAtValue = this.startAtValue;\n    cloned.endBeforeValue = this.endBeforeValue;\n    cloned.endAtValue = this.endAtValue;\n    return cloned;\n  }\n}\n\n/**\n * Función helper para crear un QueryBuilder.\n *\n * @example\n * ```typescript\n * import { query } from 'valtech-components';\n *\n * const options = query()\n *   .where('status', '==', 'active')\n *   .orderBy('createdAt', 'desc')\n *   .limit(10)\n *   .build();\n * ```\n */\nexport function query(): QueryBuilder {\n  return new QueryBuilder();\n}\n","/**\n * Storage Service\n *\n * Servicio para operaciones de Firebase Storage.\n * Soporta upload con tracking de progreso, download y gestión de archivos.\n */\n\nimport { inject, Injectable } from '@angular/core';\nimport {\n  deleteObject,\n  getDownloadURL,\n  getMetadata,\n  listAll,\n  ref,\n  Storage,\n  uploadBytesResumable,\n  UploadMetadata,\n  UploadTaskSnapshot,\n} from '@angular/fire/storage';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport {\n  StorageListResult,\n  StorageMetadata,\n  UploadProgress,\n  UploadResult,\n  UploadState,\n} from './types';\n\n/**\n * Servicio para Firebase Storage.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class FileUploadComponent {\n *   private storage = inject(StorageService);\n *\n *   uploadProgress = signal<number>(0);\n *   downloadUrl = signal<string | null>(null);\n *\n *   async onFileSelected(event: Event) {\n *     const file = (event.target as HTMLInputElement).files?.[0];\n *     if (!file) return;\n *\n *     // Upload con progreso\n *     this.storage.upload(`uploads/${file.name}`, file).subscribe({\n *       next: (progress) => this.uploadProgress.set(progress.percentage),\n *       complete: async () => {\n *         const url = await this.storage.getDownloadUrl(`uploads/${file.name}`);\n *         this.downloadUrl.set(url);\n *       }\n *     });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class StorageService {\n  private config = inject(VALTECH_FIREBASE_CONFIG, { optional: true });\n\n  constructor(private storage: Storage) {}\n\n  /**\n   * Prefija el path de storage con el appId si está configurado.\n   * Si no hay appId o skipPrefix es true, retorna el path sin modificar.\n   *\n   * @param path - Ruta original\n   * @param skipPrefix - Si es true, no aplica el prefix (útil para paths compartidos como avatares)\n   * @internal\n   */\n  private prefixStoragePath(path: string, skipPrefix = false): string {\n    if (skipPrefix || !this.config?.appId) return path;\n    return `${this.config.appId}/${path}`;\n  }\n\n  // ===========================================================================\n  // UPLOAD\n  // ===========================================================================\n\n  /**\n   * Sube un archivo con tracking de progreso.\n   *\n   * @param path - Ruta en Storage donde guardar el archivo\n   * @param file - Archivo a subir (File o Blob)\n   * @param metadata - Metadata opcional (contentType, customMetadata)\n   * @returns Observable que emite el progreso y completa cuando termina\n   *\n   * @example\n   * ```typescript\n   * // Upload básico\n   * storage.upload('images/photo.jpg', file).subscribe({\n   *   next: (progress) => console.log(`${progress.percentage}%`),\n   *   complete: () => console.log('Upload completado')\n   * });\n   *\n   * // Con metadata\n   * storage.upload('docs/report.pdf', file, {\n   *   contentType: 'application/pdf',\n   *   customMetadata: { uploadedBy: 'user123' }\n   * }).subscribe(...);\n   * ```\n   */\n  upload(path: string, file: File | Blob, metadata?: StorageMetadata): Observable<UploadProgress> {\n    const prefixedPath = this.prefixStoragePath(path, metadata?.skipPrefix);\n    const storageRef = ref(this.storage, prefixedPath);\n    const uploadMetadata: UploadMetadata = {\n      contentType: metadata?.contentType || (file instanceof File ? file.type : undefined),\n      customMetadata: metadata?.customMetadata,\n      // Default agresivo: getDownloadURL devuelve URLs con token único por\n      // versión del objeto → re-subir el archivo cambia el URL (cache-bust\n      // natural). El consumidor puede override pasando cacheControl explícito.\n      cacheControl: metadata?.cacheControl ?? 'public, max-age=31536000',\n    };\n\n    const task = uploadBytesResumable(storageRef, file, uploadMetadata);\n    const progress$ = new BehaviorSubject<UploadProgress>({\n      bytesTransferred: 0,\n      totalBytes: file.size,\n      percentage: 0,\n      state: 'running',\n    });\n\n    task.on(\n      'state_changed',\n      (snapshot: UploadTaskSnapshot) => {\n        progress$.next({\n          bytesTransferred: snapshot.bytesTransferred,\n          totalBytes: snapshot.totalBytes,\n          percentage: Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100),\n          state: this.mapTaskState(snapshot.state),\n        });\n      },\n      error => {\n        progress$.next({\n          bytesTransferred: 0,\n          totalBytes: file.size,\n          percentage: 0,\n          state: 'error',\n        });\n        progress$.error(this.getErrorMessage(error));\n      },\n      () => {\n        progress$.next({\n          bytesTransferred: file.size,\n          totalBytes: file.size,\n          percentage: 100,\n          state: 'success',\n        });\n        progress$.complete();\n      }\n    );\n\n    return progress$.asObservable();\n  }\n\n  /**\n   * Sube un archivo y retorna la URL de descarga al completar.\n   *\n   * @param path - Ruta en Storage\n   * @param file - Archivo a subir\n   * @param metadata - Metadata opcional\n   * @returns Resultado del upload con URL de descarga\n   *\n   * @example\n   * ```typescript\n   * const result = await storage.uploadAndGetUrl('avatars/user123.jpg', file);\n   * console.log('URL:', result.downloadUrl);\n   * ```\n   */\n  async uploadAndGetUrl(\n    path: string,\n    file: File | Blob,\n    metadata?: StorageMetadata\n  ): Promise<UploadResult> {\n    const prefixedPath = this.prefixStoragePath(path, metadata?.skipPrefix);\n    console.log('[Storage] uploadAndGetUrl start:', { path: prefixedPath, size: file.size });\n    return new Promise((resolve, reject) => {\n      this.upload(path, file, metadata).subscribe({\n        complete: async () => {\n          try {\n            const storageRef = ref(this.storage, prefixedPath);\n            const downloadUrl = await getDownloadURL(storageRef);\n            const storedMetadata = await getMetadata(storageRef);\n            console.log('[Storage] upload OK:', {\n              path: prefixedPath,\n              url: downloadUrl.slice(0, 60) + '…',\n            });\n            resolve({\n              downloadUrl,\n              fullPath: storedMetadata.fullPath,\n              name: storedMetadata.name,\n              size: storedMetadata.size,\n              contentType: storedMetadata.contentType || 'application/octet-stream',\n              metadata: storedMetadata.customMetadata || {},\n            });\n          } catch (error) {\n            console.error('[Storage] getDownloadURL/metadata failed:', {\n              path: prefixedPath,\n              error,\n            });\n            reject(this.getErrorMessage(error));\n          }\n        },\n        error: error => {\n          console.error('[Storage] upload failed:', { path: prefixedPath, error });\n          reject(error);\n        },\n      });\n    });\n  }\n\n  /**\n   * Sube un archivo desde una Data URL (base64).\n   *\n   * @param path - Ruta en Storage\n   * @param dataUrl - Data URL (ej: 'data:image/png;base64,...')\n   * @param metadata - Metadata opcional\n   * @returns Resultado del upload\n   *\n   * @example\n   * ```typescript\n   * // Desde canvas\n   * const dataUrl = canvas.toDataURL('image/png');\n   * const result = await storage.uploadFromDataUrl('images/drawing.png', dataUrl);\n   * ```\n   */\n  async uploadFromDataUrl(\n    path: string,\n    dataUrl: string,\n    metadata?: StorageMetadata\n  ): Promise<UploadResult> {\n    // Extraer content type y datos base64\n    const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);\n    if (!matches) {\n      throw new Error('Data URL inválida');\n    }\n\n    const contentType = matches[1];\n    const base64Data = matches[2];\n\n    // Convertir base64 a Blob\n    const byteCharacters = atob(base64Data);\n    const byteNumbers = new Array(byteCharacters.length);\n    for (let i = 0; i < byteCharacters.length; i++) {\n      byteNumbers[i] = byteCharacters.charCodeAt(i);\n    }\n    const byteArray = new Uint8Array(byteNumbers);\n    const blob = new Blob([byteArray], { type: contentType });\n\n    return this.uploadAndGetUrl(path, blob, {\n      contentType,\n      ...metadata,\n    });\n  }\n\n  // ===========================================================================\n  // DOWNLOAD\n  // ===========================================================================\n\n  /**\n   * Obtiene la URL de descarga de un archivo.\n   *\n   * @param path - Ruta del archivo en Storage\n   * @returns URL de descarga\n   *\n   * @example\n   * ```typescript\n   * const url = await storage.getDownloadUrl('images/photo.jpg');\n   * // Usar en <img [src]=\"url\">\n   * ```\n   */\n  async getDownloadUrl(path: string): Promise<string> {\n    try {\n      const prefixedPath = this.prefixStoragePath(path);\n      const storageRef = ref(this.storage, prefixedPath);\n      return await getDownloadURL(storageRef);\n    } catch (error) {\n      throw new Error(this.getErrorMessage(error));\n    }\n  }\n\n  /**\n   * Obtiene la metadata de un archivo.\n   *\n   * @param path - Ruta del archivo\n   * @returns Metadata del archivo\n   */\n  async getMetadata(path: string): Promise<StorageMetadata & { size: number; name: string }> {\n    try {\n      const prefixedPath = this.prefixStoragePath(path);\n      const storageRef = ref(this.storage, prefixedPath);\n      const metadata = await getMetadata(storageRef);\n      return {\n        contentType: metadata.contentType,\n        customMetadata: metadata.customMetadata,\n        cacheControl: metadata.cacheControl,\n        size: metadata.size,\n        name: metadata.name,\n      };\n    } catch (error) {\n      throw new Error(this.getErrorMessage(error));\n    }\n  }\n\n  // ===========================================================================\n  // DELETE\n  // ===========================================================================\n\n  /**\n   * Elimina un archivo.\n   *\n   * @param path - Ruta del archivo a eliminar\n   *\n   * @example\n   * ```typescript\n   * await storage.delete('images/old-photo.jpg');\n   * ```\n   */\n  async delete(path: string): Promise<void> {\n    try {\n      const prefixedPath = this.prefixStoragePath(path);\n      const storageRef = ref(this.storage, prefixedPath);\n      await deleteObject(storageRef);\n    } catch (error) {\n      throw new Error(this.getErrorMessage(error));\n    }\n  }\n\n  /**\n   * Elimina múltiples archivos.\n   *\n   * @param paths - Array de rutas a eliminar\n   *\n   * @example\n   * ```typescript\n   * await storage.deleteMultiple([\n   *   'images/photo1.jpg',\n   *   'images/photo2.jpg'\n   * ]);\n   * ```\n   */\n  async deleteMultiple(paths: string[]): Promise<void> {\n    await Promise.all(paths.map(path => this.delete(path)));\n  }\n\n  // ===========================================================================\n  // LIST\n  // ===========================================================================\n\n  /**\n   * Lista archivos en un directorio.\n   *\n   * @param path - Ruta del directorio\n   * @returns Lista de rutas de archivos\n   *\n   * @example\n   * ```typescript\n   * const result = await storage.list('images/');\n   * console.log(result.items); // ['images/photo1.jpg', 'images/photo2.jpg']\n   * ```\n   */\n  async list(path: string): Promise<StorageListResult> {\n    try {\n      const prefixedPath = this.prefixStoragePath(path);\n      const storageRef = ref(this.storage, prefixedPath);\n      const result = await listAll(storageRef);\n\n      return {\n        items: result.items.map(item => item.fullPath),\n        nextPageToken: undefined, // listAll no soporta paginación\n      };\n    } catch (error) {\n      throw new Error(this.getErrorMessage(error));\n    }\n  }\n\n  // ===========================================================================\n  // UTILIDADES\n  // ===========================================================================\n\n  /**\n   * Genera un nombre de archivo único con timestamp.\n   *\n   * @param originalName - Nombre original del archivo\n   * @param prefix - Prefijo opcional\n   * @returns Nombre único\n   *\n   * @example\n   * ```typescript\n   * const uniqueName = storage.generateFileName('photo.jpg', 'user123');\n   * // => 'user123_1703091234567_photo.jpg'\n   * ```\n   */\n  generateFileName(originalName: string, prefix?: string): string {\n    const timestamp = Date.now();\n    const sanitizedName = originalName.replace(/[^a-zA-Z0-9.-]/g, '_');\n\n    if (prefix) {\n      return `${prefix}_${timestamp}_${sanitizedName}`;\n    }\n    return `${timestamp}_${sanitizedName}`;\n  }\n\n  /**\n   * Genera una ruta única para un archivo.\n   *\n   * @param directory - Directorio base\n   * @param originalName - Nombre original\n   * @param prefix - Prefijo opcional\n   * @returns Ruta completa única\n   *\n   * @example\n   * ```typescript\n   * const path = storage.generatePath('uploads', 'photo.jpg', 'user123');\n   * // => 'uploads/user123_1703091234567_photo.jpg'\n   * ```\n   */\n  generatePath(directory: string, originalName: string, prefix?: string): string {\n    const fileName = this.generateFileName(originalName, prefix);\n    const cleanDir = directory.replace(/\\/+$/, ''); // Remover / final\n    return `${cleanDir}/${fileName}`;\n  }\n\n  /**\n   * Obtiene la extensión de un archivo.\n   *\n   * @param filename - Nombre del archivo\n   * @returns Extensión (sin el punto)\n   */\n  getExtension(filename: string): string {\n    const parts = filename.split('.');\n    return parts.length > 1 ? parts.pop()!.toLowerCase() : '';\n  }\n\n  /**\n   * Verifica si un archivo es una imagen basándose en su extensión.\n   */\n  isImage(filename: string): boolean {\n    const ext = this.getExtension(filename);\n    return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext);\n  }\n\n  /**\n   * Verifica si un archivo es un documento.\n   */\n  isDocument(filename: string): boolean {\n    const ext = this.getExtension(filename);\n    return ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'].includes(ext);\n  }\n\n  // ===========================================================================\n  // USER AVATAR HELPERS\n  // ===========================================================================\n\n  /**\n   * Construye la URL de avatar de un usuario.\n   *\n   * Los avatares se almacenan en paths predecibles: `users/{userId}/avatar.jpg`\n   * Esto permite que cualquier app pueda mostrar avatares sin pedir la URL al backend,\n   * solo necesita el userId.\n   *\n   * @param userId - ID del usuario (ULID)\n   * @param type - 'avatar' para imagen completa, 'thumb' para thumbnail\n   * @returns URL directa de Firebase Storage\n   *\n   * @example\n   * ```typescript\n   * // Mostrar avatar de cualquier usuario\n   * const avatarUrl = storage.getUserAvatarUrl('01ABCD...');\n   * const thumbUrl = storage.getUserAvatarUrl('01ABCD...', 'thumb');\n   *\n   * // Con cache-busting\n   * const freshUrl = storage.getUserAvatarUrl(userId) + `&t=${Date.now()}`;\n   * ```\n   */\n  getUserAvatarUrl(userId: string, type: 'avatar' | 'thumb' = 'avatar'): string {\n    const bucket = this.config?.firebase?.storageBucket || 'myvaltech-dev.firebasestorage.app';\n    const path = `users/${userId}/${type}.jpg`;\n    return `https://firebasestorage.googleapis.com/v0/b/${bucket}/o/${encodeURIComponent(path)}?alt=media`;\n  }\n\n  // ===========================================================================\n  // MÉTODOS PRIVADOS\n  // ===========================================================================\n\n  /**\n   * Mapea el estado de la tarea de upload\n   */\n  private mapTaskState(state: string): UploadState {\n    switch (state) {\n      case 'running':\n        return 'running';\n      case 'paused':\n        return 'paused';\n      case 'success':\n        return 'success';\n      case 'canceled':\n        return 'canceled';\n      case 'error':\n        return 'error';\n      default:\n        return 'running';\n    }\n  }\n\n  /**\n   * Convierte errores de Storage a mensajes en español\n   */\n  private getErrorMessage(error: unknown): string {\n    if (error instanceof Error) {\n      const code = (error as { code?: string }).code;\n\n      switch (code) {\n        case 'storage/object-not-found':\n          return 'El archivo no existe';\n        case 'storage/unauthorized':\n          return 'No tienes permiso para acceder a este archivo';\n        case 'storage/canceled':\n          return 'La operación fue cancelada';\n        case 'storage/quota-exceeded':\n          return 'Se ha excedido la cuota de almacenamiento';\n        case 'storage/invalid-checksum':\n          return 'El archivo está corrupto';\n        case 'storage/retry-limit-exceeded':\n          return 'Error de conexión. Intenta de nuevo';\n        case 'storage/invalid-url':\n          return 'URL de archivo inválida';\n        case 'storage/invalid-argument':\n          return 'Argumento inválido';\n        default:\n          return error.message || 'Error de almacenamiento desconocido';\n      }\n    }\n\n    return 'Error de almacenamiento desconocido';\n  }\n}\n","/**\n * Messaging Service (FCM)\n *\n * Servicio para Firebase Cloud Messaging (Push Notifications).\n * Permite solicitar permisos, obtener tokens, escuchar mensajes y manejar\n * navegación (deep linking) cuando el usuario toca una notificación.\n */\n\nimport { Inject, Injectable, Injector, NgZone, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Messaging, getToken, deleteToken, onMessage } from '@angular/fire/messaging';\nimport { isSupported as fcmIsSupported, getMessaging as fcmGetMessaging } from 'firebase/messaging';\nimport { getApp, getApps, initializeApp } from 'firebase/app';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\n\nimport { VALTECH_FIREBASE_CONFIG } from './config';\nimport {\n  EnablePushResult,\n  NotificationAction,\n  NotificationClickEvent,\n  NotificationPayload,\n  NotificationPermission,\n  ValtechFirebaseConfig,\n} from './types';\n\n/**\n * Callback opcional de registro de device para `MessagingService.enable()`.\n *\n * El registro del device vive en `AuthService` (necesita el JWT + el endpoint\n * del backend). `MessagingService` NO puede depender de `AuthService` sin\n * crear un ciclo (AuthService → MessagingService). Por eso el caller le pasa\n * el paso de registro como callback. Recibe el token FCM y devuelve si el\n * device quedó registrado.\n */\nexport type RegisterDeviceFn = (token: string) => Promise<boolean>;\n\n/**\n * Opciones de `MessagingService.enable()`.\n */\nexport interface EnablePushOptions {\n  /**\n   * Paso opcional de registro de device en el backend. Si se omite, `enable()`\n   * resuelve con `status: 'enabled'` apenas obtiene el token (sin registrar).\n   */\n  registerDevice?: RegisterDeviceFn;\n}\n\n/**\n * Estado interno del servicio de messaging\n */\ninterface MessagingState {\n  token: string | null;\n  permission: NotificationPermission;\n  isSupported: boolean;\n}\n\n/**\n * Servicio para Firebase Cloud Messaging (FCM).\n *\n * Permite recibir notificaciones push en la aplicación web.\n * Requiere VAPID key configurada en ValtechFirebaseConfig.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class NotificationComponent {\n *   private messaging = inject(MessagingService);\n *\n *   token = signal<string | null>(null);\n *\n *   async enableNotifications() {\n *     // Solicitar permiso y obtener token\n *     const token = await this.messaging.requestPermission();\n *\n *     if (token) {\n *       this.token.set(token);\n *       // Enviar token a tu backend para almacenarlo\n *       await this.backend.registerDeviceToken(token);\n *     }\n *   }\n *\n *   // Escuchar mensajes en foreground\n *   messages$ = this.messaging.onMessage();\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MessagingService {\n  private messageSubject = new Subject<NotificationPayload>();\n  private notificationClickSubject = new Subject<NotificationClickEvent>();\n  private stateSubject = new BehaviorSubject<MessagingState>({\n    token: null,\n    permission: 'default',\n    isSupported: false,\n  });\n\n  private unsubscribeOnMessage?: () => void;\n\n  /** Flag para persistir mensajes FCM en localStorage (debugging) */\n  private readonly debugPersistence: boolean;\n  /** Key para localStorage de mensajes FCM (debugging) */\n  private readonly DEBUG_STORAGE_KEY = 'fcm_debug_messages';\n  /**\n   * Key de localStorage donde se persiste el token FCM.\n   *\n   * El token vive en un `BehaviorSubject` en memoria y se pierde en cada\n   * recarga / suspensión de la PWA (iOS reinicia PWAs con frecuencia). Persistir\n   * el token permite hidratar el estado en cold start y que la UI no parpadee.\n   * Es un *optimistic hint* — la verdad la confirma el siguiente `getToken()`.\n   */\n  private readonly TOKEN_STORAGE_KEY = 'valtech_fcm_token';\n\n  /**\n   * Timeout (ms) para `navigator.serviceWorker.ready` dentro de `getToken()`.\n   *\n   * En un cold load el SW puede no estar activado aún y `serviceWorker.ready`\n   * no resolver nunca. Pasado este tiempo, `getToken()` rechaza limpio en lugar\n   * de colgarse indefinidamente.\n   */\n  private readonly SW_READY_TIMEOUT_MS = 10_000;\n\n  /**\n   * Timeout (ms) del watchdog de `enable()` antes de auto-recargar la página.\n   *\n   * El flujo de activación a veces se cuelga ANTES de `getToken()` — caso\n   * típico: `Notification.requestPermission()` no muestra el popup del SO en un\n   * cold load. El timeout de `getToken()` (SW_READY_TIMEOUT_MS) no cubre eso;\n   * por eso `enable()` envuelve el flujo completo en este watchdog.\n   *\n   * Un flujo exitoso real llega a token+device en ~4s; 15s es holgado y no\n   * atrapa un éxito lento.\n   */\n  private readonly ENABLE_WATCHDOG_MS = 15_000;\n\n  /**\n   * Key de sessionStorage — garantiza un solo auto-reload por sesión. Si el\n   * flujo se cuelga una 2ª vez tras el reload, NO se recarga de nuevo (anti-loop).\n   */\n  private readonly AUTORELOAD_FLAG = 'notif-enable-autoreload';\n\n  constructor(\n    private injector: Injector,\n    @Inject(VALTECH_FIREBASE_CONFIG) private config: ValtechFirebaseConfig,\n    @Inject(PLATFORM_ID) private platformId: Object,\n    private ngZone: NgZone\n  ) {\n    this.debugPersistence = this.config?.debugMessagePersistence ?? false;\n    this.initializeMessaging();\n  }\n\n  /**\n   * Obtiene la instancia de Messaging via Firebase SDK directo (NO AngularFire DI).\n   *\n   * **Por qué no usamos `injector.get(Messaging)`:**\n   * AngularFire `provideMessaging` registra un APP_INITIALIZER que internamente\n   * resuelve `await isSupported()`. Si `injector.get(Messaging)` se llama antes\n   * que ese APP_INITIALIZER termine (ej. otros APP_INITIALIZER del cliente\n   * construyen AuthService → MessagingService → toca Messaging temprano),\n   * AngularFire lanza el error \"APP_INITIALIZER ... has not resolved\". Angular\n   * DI **cachea errores de factory** — una vez que falló, todos los\n   * `injector.get` siguientes retornan el mismo error cacheado. Retry loops\n   * no funcionan.\n   *\n   * **Workaround:** bypass AngularFire entirely y usar Firebase SDK directo\n   * (`firebase/messaging.getMessaging(getApp())`). AngularFire es un wrapper\n   * sobre el mismo SDK — la instancia que obtenemos es funcionalmente idéntica.\n   * `getApp()` retorna la default Firebase app inicializada por\n   * `provideFirebaseApp(() => initializeApp(config.firebase))`. Si por alguna\n   * razón no está inicializada aún, hacemos initializeApp idempotente.\n   */\n  private fcmSupportPromise?: Promise<boolean>;\n\n  private async getMessagingInstance(): Promise<Messaging | null> {\n    if (!isPlatformBrowser(this.platformId)) return null;\n\n    if (!this.fcmSupportPromise) {\n      this.fcmSupportPromise = fcmIsSupported().catch(err => {\n        console.warn('[Messaging] fcmIsSupported threw:', err);\n        return false;\n      });\n    }\n    const supported = await this.fcmSupportPromise;\n    if (!supported) {\n      console.warn('[Messaging] FCM not supported in this browser');\n      return null;\n    }\n\n    try {\n      const app = getApps().length > 0 ? getApp() : initializeApp(this.config.firebase);\n      // Cast a Messaging (token de AngularFire) — el tipo subyacente del SDK\n      // es el mismo. Las funciones getToken/deleteToken/onMessage de\n      // @angular/fire/messaging son re-exports del SDK y aceptan esta instance.\n      return fcmGetMessaging(app) as Messaging;\n    } catch (err) {\n      console.error('[Messaging] firebase getMessaging() threw:', err);\n      return null;\n    }\n  }\n\n  // ===========================================================================\n  // INICIALIZACIÓN\n  // ===========================================================================\n\n  /**\n   * Inicializa el servicio de messaging\n   */\n  private async initializeMessaging(): Promise<void> {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    // Hidratar el token desde localStorage ANTES del check de soporte: el token\n    // cacheado es un hint optimista para la UI tras recargas / suspensiones de\n    // la PWA. La validez real se confirma en el próximo getToken().\n    this.hydrateTokenFromStorage();\n\n    const supported = await this.checkSupport();\n    const permission = this.getPermissionState();\n\n    this.stateSubject.next({\n      ...this.stateSubject.value,\n      isSupported: supported,\n      permission,\n    });\n\n    // Si ya tiene permiso, configurar listeners\n    if (supported && permission === 'granted') {\n      this.setupMessageListener();\n    }\n\n    // Escuchar mensajes del Service Worker (clicks en notificaciones background)\n    this.setupServiceWorkerListener();\n  }\n\n  /**\n   * Configura listener para mensajes del Service Worker.\n   * Recibe eventos cuando el usuario hace click en una notificación background.\n   */\n  private setupServiceWorkerListener(): void {\n    if (!isPlatformBrowser(this.platformId) || !('serviceWorker' in navigator)) {\n      return;\n    }\n\n    navigator.serviceWorker.addEventListener('message', event => {\n      // Solo procesar mensajes de notificación click bien formados.\n      // En apps con múltiples SW (PWA ngsw-worker + firebase-messaging-sw),\n      // o variantes del payload, `notification` puede no existir aunque\n      // `data.type` coincida → guard defensivo evita TypeError.\n      if (event.data?.type !== 'NOTIFICATION_CLICK') return;\n      const notification = event.data.notification as NotificationPayload | undefined;\n      if (!notification) return;\n\n      this.ngZone.run(() => {\n        const action = this.extractActionFromData(notification.data);\n        this.notificationClickSubject.next({\n          notification,\n          action,\n          timestamp: new Date(),\n        });\n      });\n    });\n  }\n\n  /**\n   * Verifica si FCM está soportado en el navegador actual\n   */\n  private async checkSupport(): Promise<boolean> {\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n\n    // Verificar APIs necesarias\n    if (!('Notification' in window)) {\n      return false;\n    }\n\n    if (!('serviceWorker' in navigator)) {\n      return false;\n    }\n\n    // Verificar que messaging esté disponible (async — espera APP_INITIALIZER)\n    if (!(await this.getMessagingInstance())) {\n      return false;\n    }\n\n    return true;\n  }\n\n  // ===========================================================================\n  // PERMISOS Y TOKEN\n  // ===========================================================================\n\n  /**\n   * Solicita permiso de notificaciones y obtiene el token FCM.\n   *\n   * @returns Token FCM si se otorgó permiso, null si se denegó\n   *\n   * @example\n   * ```typescript\n   * const token = await messaging.requestPermission();\n   * if (token) {\n   *   console.log('Token FCM:', token);\n   *   // Enviar a backend\n   * } else {\n   *   console.log('Permiso denegado o no soportado');\n   * }\n   * ```\n   */\n  async requestPermission(): Promise<string | null> {\n    if (!(await this.isSupported())) {\n      console.warn('FCM no está soportado en este navegador');\n      return null;\n    }\n\n    try {\n      // Solicitar permiso de notificaciones\n      const permission = await Notification.requestPermission();\n\n      this.stateSubject.next({\n        ...this.stateSubject.value,\n        permission: permission as NotificationPermission,\n      });\n\n      if (permission !== 'granted') {\n        console.warn('Permiso de notificaciones denegado');\n        return null;\n      }\n\n      // Obtener token FCM\n      const token = await this.getToken();\n\n      if (token) {\n        // Configurar listener de mensajes\n        this.setupMessageListener();\n      }\n\n      return token;\n    } catch (error) {\n      console.error('Error solicitando permiso de notificaciones:', error);\n      return null;\n    }\n  }\n\n  /**\n   * Flujo completo de activación de push, robusto, cross-app.\n   *\n   * Orquesta: pedir permiso → SW ready → obtener token FCM → (opcional)\n   * registrar el device en backend. Es el punto de orquestación único que cada\n   * app del factory consume — la lógica de robustez vive aquí, no en cada página.\n   *\n   * **Watchdog de auto-reload.** El flujo a veces se cuelga ANTES de `getToken()`\n   * (ej. `Notification.requestPermission()` que no muestra el popup en un cold\n   * load) — el timeout interno de `getToken()` no cubre ese caso. Por eso\n   * `enable()` envuelve el flujo entero en un watchdog: si no alcanza un estado\n   * terminal en `ENABLE_WATCHDOG_MS` (15s):\n   *  - 1ª vez en la sesión → marca un flag en `sessionStorage` y hace\n   *    `window.location.reload()` (un fresh load suele tener el SW activo).\n   *    Resuelve con `{ status: 'timeout', reloaded: true }`.\n   *  - ya se auto-recargó antes → NO recarga (anti-loop): limpia el flag y\n   *    resuelve con `{ status: 'timeout', reloaded: false }` para que la app\n   *    muestre un error.\n   *\n   * NO hace throw — siempre resuelve con un `EnablePushResult` descriptivo que\n   * la página consumidora inspecciona para decidir qué toast mostrar.\n   *\n   * @param options.registerDevice Callback opcional que registra el device en\n   *   el backend (vive en `AuthService` — se pasa como callback para evitar el\n   *   ciclo de DI AuthService ↔ MessagingService).\n   *\n   * @example\n   * ```typescript\n   * const result = await messaging.enable({\n   *   registerDevice: (token) => auth.registerDevice(token).then(r => r.registered),\n   * });\n   * if (result.status === 'enabled') {\n   *   // result.token disponible — push activo\n   * } else if (result.status === 'timeout' && !result.reloaded) {\n   *   // mostrar error: el flujo se colgó y ya se consumió el auto-reload\n   * }\n   * ```\n   */\n  async enable(options: EnablePushOptions = {}): Promise<EnablePushResult> {\n    console.log('[Messaging] enable() start');\n\n    let watchdog: ReturnType<typeof setTimeout> | undefined;\n\n    // El watchdog corre en paralelo al flujo real. Lo que gane el race define\n    // el resultado. El flujo real, si gana, limpia el watchdog en el `finally`.\n    const watchdogPromise = new Promise<EnablePushResult>(resolve => {\n      if (typeof window === 'undefined') return; // SSR — sin watchdog.\n      watchdog = setTimeout(() => {\n        watchdog = undefined;\n        console.warn(`[Messaging] enable() colgado >${this.ENABLE_WATCHDOG_MS}ms — watchdog`);\n\n        if (this.hasAutoReloaded()) {\n          // Anti-loop: ya recargamos una vez esta sesión y volvió a colgar.\n          console.warn('[Messaging] auto-reload ya consumido — no se recarga de nuevo');\n          this.clearAutoReloadFlag();\n          resolve({\n            status: 'timeout',\n            reloaded: false,\n            reason: `Flujo de activación colgado >${this.ENABLE_WATCHDOG_MS / 1000}s`,\n          });\n          return;\n        }\n\n        // 1ª vez: marcar y recargar. Un fresh load suele tener el SW activo.\n        console.warn('[Messaging] auto-recargando la página (1/1 por sesión)');\n        this.markAutoReloaded();\n        resolve({\n          status: 'timeout',\n          reloaded: true,\n          reason: 'Auto-recargando para reintentar la activación',\n        });\n        window.location.reload();\n      }, this.ENABLE_WATCHDOG_MS);\n    });\n\n    const flow = this.runEnableFlow(options).finally(() => {\n      if (watchdog !== undefined) {\n        clearTimeout(watchdog);\n        watchdog = undefined;\n      }\n    });\n\n    return Promise.race([flow, watchdogPromise]);\n  }\n\n  /**\n   * Flujo real de activación, sin el watchdog (lo envuelve `enable()`).\n   * Resuelve siempre con un `EnablePushResult` — no hace throw.\n   */\n  private async runEnableFlow(options: EnablePushOptions): Promise<EnablePushResult> {\n    if (!(await this.isSupported())) {\n      console.warn('[Messaging] enable: FCM no soportado');\n      return { status: 'unsupported', reason: 'FCM no soportado en este navegador' };\n    }\n\n    try {\n      // permission → SW ready → getToken (requestPermission encadena las 3).\n      const token = await this.requestPermission();\n\n      if (!token) {\n        // requestPermission devuelve null tanto por permiso denegado como por\n        // fallo al obtener el token. Distinguimos por el estado del permiso.\n        const permission = this.getPermissionState();\n        if (permission === 'denied' || permission === 'default') {\n          return { status: 'denied', reason: 'Permiso de notificaciones denegado' };\n        }\n        return { status: 'error', reason: 'No se pudo obtener el token FCM' };\n      }\n\n      // Registro de device en backend (opcional — el caller pasa el callback).\n      if (options.registerDevice) {\n        const registered = await options.registerDevice(token);\n        if (!registered) {\n          return { status: 'error', token, reason: 'No se pudo registrar el dispositivo' };\n        }\n      }\n\n      // Éxito: estado terminal. Limpiar el flag anti-loop para futuros intentos.\n      this.clearAutoReloadFlag();\n      console.log('[Messaging] enable() success');\n      return { status: 'enabled', token };\n    } catch (error) {\n      const reason = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n      console.error('[Messaging] enable() error:', reason, error);\n      return { status: 'error', reason };\n    }\n  }\n\n  /** True si ya se auto-recargó una vez en esta sesión. */\n  private hasAutoReloaded(): boolean {\n    if (!isPlatformBrowser(this.platformId)) return false;\n    try {\n      return sessionStorage.getItem(this.AUTORELOAD_FLAG) === '1';\n    } catch {\n      // sessionStorage puede no estar disponible (modo privado estricto, SSR).\n      return false;\n    }\n  }\n\n  /** Marca que se consumió el auto-reload de esta sesión. */\n  private markAutoReloaded(): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n    try {\n      sessionStorage.setItem(this.AUTORELOAD_FLAG, '1');\n    } catch {\n      /* sessionStorage no disponible — best-effort. */\n    }\n  }\n\n  /** Limpia el flag anti-loop — tras un éxito o un fallo definitivo. */\n  private clearAutoReloadFlag(): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n    try {\n      sessionStorage.removeItem(this.AUTORELOAD_FLAG);\n    } catch {\n      /* sessionStorage no disponible — nada que limpiar. */\n    }\n  }\n\n  /**\n   * Obtiene el token FCM actual (sin solicitar permiso).\n   *\n   * @returns Token FCM si está disponible, null si no\n   *\n   * @example\n   * ```typescript\n   * const token = await messaging.getToken();\n   * ```\n   */\n  async getToken(): Promise<string | null> {\n    console.log('[Messaging] getToken() start');\n    const messaging = await this.getMessagingInstance();\n    if (!messaging) {\n      console.warn('[Messaging] getToken aborted: no Messaging instance');\n      return null;\n    }\n\n    const vapidKey = this.config.messagingVapidKey;\n    if (!vapidKey) {\n      console.warn(\n        '[Messaging] VAPID key no configurada (config.messagingVapidKey). FCM no funcionará.'\n      );\n      return null;\n    }\n\n    try {\n      // Reutilizar el SW ya registrado (en config.ts durante el bootstrap) en\n      // lugar de re-registrarlo en cada llamada — re-registrar dispara\n      // revalidaciones del SW en iOS PWA. Solo registramos si no existe aún.\n      const registration = await this.resolveServiceWorkerRegistration();\n      console.log('[Messaging] SW resolved, waiting ready...');\n      // Esperar a que el SW esté activo, con timeout: `navigator.serviceWorker.ready`\n      // puede no resolver NUNCA en un cold load (SW aún no activado) → sin el\n      // timeout `getToken()` se cuelga indefinidamente. Con el race, si el SW no\n      // queda listo en SW_READY_TIMEOUT_MS, esta promesa rechaza limpio.\n      await this.waitForServiceWorkerReady();\n      console.log('[Messaging] SW ready, calling Firebase getToken()...');\n\n      const token = await getToken(messaging, {\n        vapidKey,\n        serviceWorkerRegistration: registration,\n      });\n\n      console.log(\n        '[Messaging] Firebase getToken returned:',\n        token ? `${token.slice(0, 16)}…` : 'null/empty'\n      );\n\n      this.stateSubject.next({\n        ...this.stateSubject.value,\n        token,\n      });\n\n      // Persistir el token para hidratar el estado en futuros cold starts.\n      this.persistToken(token);\n\n      return token;\n    } catch (error) {\n      // No tragamos la causa: logueamos el detalle para diagnóstico. La firma\n      // sigue siendo Promise<string | null> para no romper callers.\n      const reason = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n      console.error('[Messaging] getToken error:', reason, error);\n      return null;\n    }\n  }\n\n  /**\n   * Resuelve el `ServiceWorkerRegistration` del SW de FCM.\n   *\n   * El SW `/firebase-messaging-sw.js` ya se registra una vez en el bootstrap de\n   * la app (`config.ts`). Reutilizamos ese registro en lugar de re-registrarlo\n   * en cada `getToken()` — re-registrar repetidamente dispara revalidaciones del\n   * SW en iOS PWA. Solo registramos como fallback si todavía no existe.\n   */\n  private async resolveServiceWorkerRegistration(): Promise<ServiceWorkerRegistration> {\n    const existing = await navigator.serviceWorker.getRegistration('/firebase-messaging-sw.js');\n    if (existing) {\n      return existing;\n    }\n    console.warn('[Messaging] SW not registered yet, registering as fallback');\n    return navigator.serviceWorker.register('/firebase-messaging-sw.js');\n  }\n\n  /**\n   * Espera a que el Service Worker quede activo (`navigator.serviceWorker.ready`)\n   * pero con un timeout duro.\n   *\n   * `navigator.serviceWorker.ready` resuelve cuando hay un SW *activo*. En un\n   * cold load (primera visita, SW recién registrado, iOS PWA recién abierta) el\n   * SW puede quedar en estado `installing`/`waiting` y `ready` no resolver nunca\n   * → `getToken()` se cuelga. El `Promise.race` contra un `setTimeout` garantiza\n   * que esta espera termina: o gana `ready` (caso normal) o gana el timeout y\n   * lanzamos un error claro para que `getToken()` rechace en vez de colgarse.\n   *\n   * El timer se limpia en ambas ramas para no dejar timers colgando.\n   */\n  private waitForServiceWorkerReady(): Promise<void> {\n    let timer: ReturnType<typeof setTimeout> | undefined;\n\n    const ready = navigator.serviceWorker.ready.then(() => {\n      if (timer !== undefined) clearTimeout(timer);\n    });\n\n    const timeout = new Promise<never>((_, reject) => {\n      timer = setTimeout(() => {\n        reject(\n          new Error(\n            `[Messaging] service worker no quedó listo en ${this.SW_READY_TIMEOUT_MS / 1000}s`\n          )\n        );\n      }, this.SW_READY_TIMEOUT_MS);\n    });\n\n    return Promise.race([ready, timeout]).finally(() => {\n      if (timer !== undefined) clearTimeout(timer);\n    });\n  }\n\n  /**\n   * Persiste el token FCM en localStorage (o lo limpia si es null/empty).\n   */\n  private persistToken(token: string | null | undefined): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n    try {\n      if (token) {\n        localStorage.setItem(this.TOKEN_STORAGE_KEY, token);\n      } else {\n        localStorage.removeItem(this.TOKEN_STORAGE_KEY);\n      }\n    } catch (e) {\n      console.warn('[Messaging] token persistence failed:', e);\n    }\n  }\n\n  /**\n   * Hidrata el estado del token desde localStorage en el arranque del servicio.\n   */\n  private hydrateTokenFromStorage(): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n    try {\n      const cached = localStorage.getItem(this.TOKEN_STORAGE_KEY);\n      if (cached) {\n        this.setTokenFromStorage(cached);\n      }\n    } catch (e) {\n      console.warn('[Messaging] token hydration failed:', e);\n    }\n  }\n\n  /**\n   * Elimina el token FCM actual (unsubscribe de notificaciones).\n   *\n   * @example\n   * ```typescript\n   * await messaging.deleteToken();\n   * console.log('Token eliminado, no recibirá más notificaciones');\n   * ```\n   */\n  async deleteToken(): Promise<void> {\n    const messaging = await this.getMessagingInstance();\n    if (!messaging) {\n      return;\n    }\n\n    try {\n      await deleteToken(messaging);\n\n      this.stateSubject.next({\n        ...this.stateSubject.value,\n        token: null,\n      });\n\n      // Limpiar el token persistido — ya no estamos suscritos.\n      this.persistToken(null);\n\n      // Limpiar listener de mensajes\n      if (this.unsubscribeOnMessage) {\n        this.unsubscribeOnMessage();\n        this.unsubscribeOnMessage = undefined;\n      }\n    } catch (error) {\n      console.error('Error eliminando token FCM:', error);\n      throw new Error('No se pudo eliminar el token de notificaciones');\n    }\n  }\n\n  // ===========================================================================\n  // MENSAJES\n  // ===========================================================================\n\n  /**\n   * Observable de mensajes recibidos en foreground.\n   *\n   * IMPORTANTE: Los mensajes en background son manejados por el Service Worker.\n   *\n   * @returns Observable que emite cuando llega un mensaje en foreground\n   *\n   * @example\n   * ```typescript\n   * messaging.onMessage().subscribe(payload => {\n   *   console.log('Mensaje recibido:', payload);\n   *   // Mostrar notificación custom o actualizar UI\n   * });\n   * ```\n   */\n  onMessage(): Observable<NotificationPayload> {\n    return this.messageSubject.asObservable();\n  }\n\n  /**\n   * Configura el listener de mensajes en foreground\n   */\n  private async setupMessageListener(): Promise<void> {\n    const messaging = await this.getMessagingInstance();\n    if (!messaging || this.unsubscribeOnMessage) {\n      return;\n    }\n\n    this.unsubscribeOnMessage = onMessage(messaging, payload => {\n      const notification: NotificationPayload = {\n        title: payload.notification?.title,\n        body: payload.notification?.body,\n        image: payload.notification?.image,\n        data: payload.data as Record<string, string>,\n        messageId: payload.messageId,\n      };\n\n      this.messageSubject.next(notification);\n\n      // Persistir en localStorage para debugging si está habilitado\n      if (this.debugPersistence) {\n        this.persistMessageForDebug(notification);\n      }\n    });\n  }\n\n  /**\n   * Persiste un mensaje FCM en localStorage para debugging.\n   * Solo se usa cuando debugMessagePersistence está habilitado.\n   * Mantiene los últimos 50 mensajes.\n   */\n  private persistMessageForDebug(message: NotificationPayload): void {\n    try {\n      const stored = localStorage.getItem(this.DEBUG_STORAGE_KEY);\n      const messages = stored ? JSON.parse(stored) : [];\n      messages.unshift({ ...message, receivedAt: new Date().toISOString() });\n      // Mantener solo últimos 50\n      localStorage.setItem(this.DEBUG_STORAGE_KEY, JSON.stringify(messages.slice(0, 50)));\n    } catch (e) {\n      console.warn('[Messaging] Debug persistence failed:', e);\n    }\n  }\n\n  // ===========================================================================\n  // ESTADO Y UTILIDADES\n  // ===========================================================================\n\n  /**\n   * Obtiene el estado actual del permiso de notificaciones.\n   *\n   * @returns 'granted' | 'denied' | 'default'\n   *\n   * @example\n   * ```typescript\n   * const permission = messaging.getPermissionState();\n   * if (permission === 'granted') {\n   *   // Ya tiene permiso\n   * } else if (permission === 'default') {\n   *   // Puede solicitar permiso\n   * } else {\n   *   // Denegado, debe habilitar manualmente\n   * }\n   * ```\n   */\n  getPermissionState(): NotificationPermission {\n    if (!isPlatformBrowser(this.platformId)) {\n      return 'default';\n    }\n\n    if (!('Notification' in window)) {\n      return 'denied';\n    }\n\n    return Notification.permission as NotificationPermission;\n  }\n\n  /**\n   * Verifica si FCM está soportado en el navegador actual.\n   * Usa lógica inteligente para evitar falsos negativos por timing del Injector.\n   *\n   * @returns true si FCM está soportado\n   *\n   * @example\n   * ```typescript\n   * if (await messaging.isSupported()) {\n   *   // Puede usar notificaciones push\n   * } else {\n   *   // Navegador no soporta o no tiene Service Worker\n   * }\n   * ```\n   */\n  async isSupported(): Promise<boolean> {\n    // Si ya tenemos token en estado, claramente FCM funciona\n    if (this.stateSubject.value.token) {\n      return true;\n    }\n\n    // Si ya calculamos soporte exitosamente, usarlo\n    if (this.stateSubject.value.isSupported) {\n      return true;\n    }\n\n    // Verificaciones básicas — APIs del browser\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n    if (!('Notification' in window) || !('serviceWorker' in navigator)) {\n      return false;\n    }\n\n    // iOS — solo soporta push web cuando la PWA está instalada en home screen\n    // (iOS 16.4+). Edge/Chrome/Firefox en iOS comparten esta limitación porque\n    // están obligados a usar WebKit. Retornamos false aquí para que la UI muestre\n    // el flujo \"instala la app\" en lugar de un CTA que va a fallar.\n    if (this.isIOSWithoutStandalone()) {\n      return false;\n    }\n\n    // NOTA: deliberadamente NO chequeamos `getMessagingInstance()` aquí porque\n    // el factory `provideMessaging(() => getMessaging())` es lazy en Angular\n    // Fire y puede no estar resuelto cuando esta función se llama temprano\n    // en el ciclo de vida. Eso causaba falsos negativos. Si FCM realmente no\n    // está disponible (proyecto sin Messaging habilitado, VAPID inválido), el\n    // flow downstream (`getToken`/`requestPermission`) fallará con error real,\n    // que es mejor UX que un \"no soportado\" prematuro.\n    return true;\n  }\n\n  /**\n   * iOS sin estar instalado como PWA standalone — push web no disponible.\n   * Aplica a Safari y a Edge/Chrome/Firefox en iOS (todos WebKit por mandato Apple).\n   */\n  private isIOSWithoutStandalone(): boolean {\n    if (!isPlatformBrowser(this.platformId)) return false;\n    const ua = (navigator as Navigator).userAgent || '';\n    const isIOS = /iPad|iPhone|iPod/.test(ua);\n    if (!isIOS) return false;\n    const isStandalone =\n      window.matchMedia?.('(display-mode: standalone)').matches ||\n      (navigator as unknown as { standalone?: boolean }).standalone === true;\n    return !isStandalone;\n  }\n\n  /**\n   * Obtiene el token actual sin hacer request.\n   *\n   * @returns Token almacenado o null\n   */\n  get currentToken(): string | null {\n    return this.stateSubject.value.token;\n  }\n\n  /**\n   * Observable del estado completo del servicio de messaging.\n   */\n  get state$(): Observable<MessagingState> {\n    return this.stateSubject.asObservable();\n  }\n\n  /**\n   * Verifica si el usuario ya otorgó permiso de notificaciones.\n   */\n  get hasPermission(): boolean {\n    return this.stateSubject.value.permission === 'granted';\n  }\n\n  /**\n   * Hidrata el estado del token desde un valor externo (ej: localStorage).\n   * Útil cuando el token ya existe pero el MessagingService no lo tiene en memoria.\n   *\n   * @param token Token FCM a setear\n   *\n   * @example\n   * ```typescript\n   * const storedToken = localStorage.getItem('fcm_token');\n   * if (storedToken) {\n   *   messaging.setTokenFromStorage(storedToken);\n   * }\n   * ```\n   */\n  setTokenFromStorage(token: string): void {\n    if (!token) return;\n\n    this.stateSubject.next({\n      ...this.stateSubject.value,\n      token,\n      isSupported: true, // Si hay token, claramente FCM funciona\n    });\n  }\n\n  // ===========================================================================\n  // DEEP LINKING / NAVEGACIÓN\n  // ===========================================================================\n\n  /**\n   * Observable de clicks en notificaciones.\n   *\n   * Emite cuando el usuario hace click en una notificación (foreground o background).\n   * Usa este observable para navegar a la página correspondiente.\n   *\n   * @returns Observable que emite NotificationClickEvent\n   *\n   * @example\n   * ```typescript\n   * @Component({...})\n   * export class AppComponent {\n   *   private messaging = inject(MessagingService);\n   *   private router = inject(Router);\n   *\n   *   constructor() {\n   *     this.messaging.onNotificationClick().subscribe(event => {\n   *       if (event.action.route) {\n   *         this.router.navigate([event.action.route], {\n   *           queryParams: event.action.queryParams\n   *         });\n   *       }\n   *     });\n   *   }\n   * }\n   * ```\n   */\n  onNotificationClick(): Observable<NotificationClickEvent> {\n    return this.notificationClickSubject.asObservable();\n  }\n\n  /**\n   * Extrae la acción de navegación de los datos de una notificación.\n   *\n   * Busca campos específicos en el payload de datos:\n   * - `route`: Ruta interna de la app (ej: '/orders/123')\n   * - `url`: URL externa (ej: 'https://example.com')\n   * - `action_type`: Tipo de acción personalizada\n   * - Campos con prefijo `action_`: Datos adicionales\n   *\n   * @param data - Datos del payload de la notificación\n   * @returns Acción de navegación extraída\n   *\n   * @example\n   * ```typescript\n   * // Payload desde el backend:\n   * // { route: '/orders/123', action_type: 'view_order', action_orderId: '123' }\n   *\n   * const action = messaging.extractActionFromData(notification.data);\n   * // { route: '/orders/123', actionType: 'view_order', actionData: { orderId: '123' } }\n   * ```\n   */\n  extractActionFromData(data?: Record<string, string>): NotificationAction {\n    if (!data) {\n      return {};\n    }\n\n    const action: NotificationAction = {};\n\n    // Ruta interna\n    if (data['route']) {\n      action.route = data['route'];\n    }\n\n    // URL externa\n    if (data['url']) {\n      action.url = data['url'];\n    }\n\n    // Tipo de acción\n    if (data['action_type']) {\n      action.actionType = data['action_type'];\n    }\n\n    // Query params (puede venir como JSON string)\n    if (data['query_params']) {\n      try {\n        action.queryParams = JSON.parse(data['query_params']);\n      } catch {\n        // Si no es JSON válido, intentar parsear como key=value\n        action.queryParams = this.parseQueryString(data['query_params']);\n      }\n    }\n\n    // Datos adicionales con prefijo action_\n    const actionData: Record<string, unknown> = {};\n    for (const [key, value] of Object.entries(data)) {\n      if (key.startsWith('action_') && key !== 'action_type') {\n        const cleanKey = key.replace('action_', '');\n        // Intentar parsear JSON si es posible\n        try {\n          actionData[cleanKey] = JSON.parse(value);\n        } catch {\n          actionData[cleanKey] = value;\n        }\n      }\n    }\n\n    if (Object.keys(actionData).length > 0) {\n      action.actionData = actionData;\n    }\n\n    return action;\n  }\n\n  /**\n   * Emite manualmente un evento de click en notificación.\n   *\n   * Útil para manejar clicks en notificaciones foreground donde\n   * la app decide mostrar un banner custom.\n   *\n   * @param notification - Payload de la notificación\n   *\n   * @example\n   * ```typescript\n   * messaging.onMessage().subscribe(notification => {\n   *   // Mostrar banner custom\n   *   this.showBanner(notification, () => {\n   *     // Usuario hizo click en el banner\n   *     messaging.handleNotificationClick(notification);\n   *   });\n   * });\n   * ```\n   */\n  handleNotificationClick(notification: NotificationPayload): void {\n    const action = this.extractActionFromData(notification.data);\n\n    this.notificationClickSubject.next({\n      notification,\n      action,\n      timestamp: new Date(),\n    });\n  }\n\n  /**\n   * Verifica si una notificación tiene acción de navegación.\n   *\n   * @param data - Datos del payload\n   * @returns true si tiene route o url\n   */\n  hasNavigationAction(data?: Record<string, string>): boolean {\n    if (!data) return false;\n    return !!(data['route'] || data['url']);\n  }\n\n  /**\n   * Parsea un query string en un objeto.\n   */\n  private parseQueryString(queryString: string): Record<string, string> {\n    const params: Record<string, string> = {};\n\n    if (!queryString) return params;\n\n    // Remover ? inicial si existe\n    const cleanQuery = queryString.startsWith('?') ? queryString.slice(1) : queryString;\n\n    for (const pair of cleanQuery.split('&')) {\n      const [key, value] = pair.split('=');\n      if (key) {\n        params[decodeURIComponent(key)] = decodeURIComponent(value || '');\n      }\n    }\n\n    return params;\n  }\n}\n","/**\n * Notifications Service\n *\n * Servicio para leer notificaciones desde Firestore.\n * El backend escribe las notificaciones, el frontend solo las lee y actualiza estado.\n *\n * Se auto-inicializa cuando AuthService tiene un usuario autenticado.\n * También puede inicializarse manualmente con `initialize(userId)`.\n */\n\nimport { effect, Injectable, Injector, Optional, runInInjectionContext } from '@angular/core';\nimport { BehaviorSubject, EMPTY, from, Observable, of } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\n\nimport { AuthService } from '../auth/auth.service';\nimport { FirebaseService } from './firebase.service';\nimport { FirestoreCollectionFactory, TypedCollection } from './firestore-collection';\nimport { FirestoreDocument } from './types';\n\n/** Límite por defecto de notificaciones a cargar */\nconst DEFAULT_LIMIT = 50;\n\n/**\n * Documento de notificación en Firestore.\n * Estructura escrita por el backend.\n */\nexport interface NotificationDocument extends FirestoreDocument {\n  /** Título de la notificación */\n  title?: string;\n  /** Cuerpo del mensaje */\n  body?: string;\n  /** Datos personalizados (ej: route, actionType). Legacy — preferir actionRoute + payload */\n  data?: Record<string, string>;\n  /** Tipo de notificación */\n  type?: 'fcm' | 'system' | 'reminder' | string;\n  /** Si la notificación fue leída */\n  isRead: boolean;\n  /** AppID origen (ej: 'showcase', 'sigify'). Permite cross-app routing */\n  appId?: string;\n  /** OrgID asociado (si la notif es org-scoped). Habilita switch-org al abrir */\n  orgId?: string;\n  /** Route destino al click (ej: '/app/docs/123') */\n  actionRoute?: string;\n  /** Payload estructurado para acciones (reemplazo tipado de `data`) */\n  payload?: Record<string, unknown>;\n}\n\n/**\n * Servicio para leer notificaciones desde Firestore.\n *\n * Se auto-inicializa cuando AuthService tiene un usuario autenticado.\n * No requiere llamar a `initialize()` manualmente si AuthService está configurado.\n *\n * @example\n * ```typescript\n * // Con AuthService configurado: auto-inicialización\n * // Solo inyectar y usar directamente\n * private notifications = inject(NotificationsService);\n *\n * notifications$ = this.notifications.getAll();\n * unreadCount$ = this.notifications.getUnreadCount();\n *\n * // Sin AuthService: inicialización manual\n * this.notifications.initialize(userId);\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationsService {\n  private collection: TypedCollection<NotificationDocument> | null = null;\n  private currentUserId: string | null = null;\n  private collectionReady$ = new BehaviorSubject<TypedCollection<NotificationDocument> | null>(\n    null\n  );\n\n  // Inyección opcional - AuthService puede no estar configurado\n  private authService: AuthService | null = null;\n\n  // Inyección opcional - FirebaseService gatea los listeners hasta que la\n  // sesión de Firebase Auth esté lista (cierra la ventana de permission-denied\n  // en cold start de PWA).\n  private firebaseService: FirebaseService | null = null;\n\n  constructor(\n    private injector: Injector,\n    @Optional() private collectionFactory: FirestoreCollectionFactory\n  ) {\n    this.firebaseService = this.injector.get(FirebaseService, null);\n    // Intentar obtener AuthService de forma lazy (puede no estar configurado)\n    this.setupAutoInitialization();\n  }\n\n  /**\n   * Gate de Firebase Auth: emite la colección lista SOLO cuando la sesión de\n   * Firebase Auth está confirmada. Sin FirebaseService disponible, no gatea\n   * (degrada al comportamiento previo). Espera a que `firebaseAuthReady$`\n   * emita antes de propagar la colección — así el listener Firestore nunca se\n   * adjunta antes de que `request.auth` esté disponible.\n   */\n  private collectionWhenAuthReady$(): Observable<TypedCollection<NotificationDocument> | null> {\n    const fb = this.firebaseService;\n    if (!fb) {\n      return this.collectionReady$.asObservable();\n    }\n    return this.collectionReady$.pipe(\n      switchMap(collection => {\n        if (!collection) {\n          console.log('[Notifs] collectionWhenAuthReady$ — collection is null (not initialized)');\n          return of(null);\n        }\n        console.log('[Notifs] collectionWhenAuthReady$ — collection ready, awaiting Firebase Auth');\n        return from(fb.whenFirebaseAuthReady()).pipe(map(() => collection));\n      })\n    );\n  }\n\n  /**\n   * Configura auto-inicialización observando el estado de AuthService.\n   * Se ejecuta en el contexto del injector para poder usar effect().\n   */\n  private setupAutoInitialization(): void {\n    // Obtener AuthService de forma lazy\n    try {\n      this.authService = this.injector.get(AuthService, null);\n    } catch {\n      // AuthService no está configurado, no hay auto-inicialización\n      return;\n    }\n\n    if (!this.authService) {\n      return;\n    }\n\n    // Usar runInInjectionContext para poder crear el effect\n    runInInjectionContext(this.injector, () => {\n      effect(() => {\n        const user = this.authService!.user();\n\n        if (user?.userId && this.currentUserId !== user.userId) {\n          // Usuario autenticado: inicializar con su ID\n          this.initialize(user.userId);\n        } else if (!user && this.currentUserId) {\n          // Logout: limpiar estado\n          this.reset();\n        }\n      });\n    });\n  }\n\n  /**\n   * Inicializa el servicio para un usuario específico.\n   *\n   * NOTA: Se llama automáticamente si AuthService está configurado.\n   * Solo usar manualmente si AuthService no está disponible o se necesita\n   * un userId diferente al del usuario autenticado.\n   */\n  initialize(userId: string): void {\n    console.log(`[Notifs] initialize uid=${userId}`);\n    if (!this.collectionFactory) {\n      console.warn(\n        '[Notifications] FirestoreCollectionFactory not available. Ensure provideValtechFirebase() is configured.'\n      );\n      return;\n    }\n\n    this.currentUserId = userId;\n\n    // Path global cross-app: /users/{uid}/notifications (sin prefijo apps/{appId}/).\n    // skipAppPrefix bypassa FirestoreService.prefixCollectionPath para fan-out compartido.\n    const basePath = `users/${userId}/notifications`;\n\n    this.collection = this.collectionFactory.create<NotificationDocument>(basePath, {\n      timestamps: true,\n      skipAppPrefix: true,\n    });\n    this.collectionReady$.next(this.collection);\n\n    console.log('[Notifications] Initialized with path:', basePath);\n  }\n\n  /**\n   * Verifica si el servicio está inicializado.\n   */\n  get isReady(): boolean {\n    return this.collection !== null;\n  }\n\n  /**\n   * Obtiene el ID del usuario actual.\n   */\n  get userId(): string | null {\n    return this.currentUserId;\n  }\n\n  // ===========================================================================\n  // LECTURA\n  // ===========================================================================\n\n  /**\n   * Obtiene notificaciones ordenadas por fecha descendente (real-time).\n   * Se actualiza automáticamente cuando cambian los datos.\n   *\n   * El listener Firestore NO se adjunta hasta que la sesión de Firebase Auth\n   * esté confirmada (`FirebaseService.firebaseAuthReady`). Esto cierra la\n   * ventana de `permission-denied` en cold start de PWA, donde el JWT del\n   * backend puede estar listo antes que la sesión de Firebase Auth.\n   *\n   * @param limit - Máximo de notificaciones a cargar (default: 50)\n   */\n  getAll(limit = DEFAULT_LIMIT): Observable<NotificationDocument[]> {\n    return this.collectionWhenAuthReady$().pipe(\n      switchMap(collection => {\n        if (!collection) {\n          console.warn('[Notifs] getAll — collection null → returning EMPTY (no emission)');\n          return EMPTY;\n        }\n        console.log('[Notifs] getAll — attaching Firestore watchAll listener');\n        return collection.watchAll({\n          orderBy: [{ field: 'createdAt', direction: 'desc' }],\n          limit,\n        });\n      })\n    );\n  }\n\n  /**\n   * Obtiene notificaciones (one-time fetch sin listener).\n   * Útil para cargas iniciales sin necesidad de updates en tiempo real.\n   *\n   * @param limit - Máximo de notificaciones a cargar (default: 50)\n   */\n  async getAllOnce(limit = DEFAULT_LIMIT): Promise<NotificationDocument[]> {\n    if (!this.collection) return [];\n\n    return this.collection.getAllOnce({\n      orderBy: [{ field: 'createdAt', direction: 'desc' }],\n      limit,\n    });\n  }\n\n  /**\n   * Obtiene solo notificaciones no leídas (real-time, filtrado server-side).\n   *\n   * @param limit - Máximo de notificaciones (default: 50)\n   */\n  getUnread(limit = DEFAULT_LIMIT): Observable<NotificationDocument[]> {\n    if (!this.collection) return of([]);\n\n    return this.collection.watchAll({\n      where: [{ field: 'isRead', operator: '==', value: false }],\n      orderBy: [{ field: 'createdAt', direction: 'desc' }],\n      limit,\n    });\n  }\n\n  /**\n   * Cuenta notificaciones no leídas usando server-side aggregation query.\n   * No descarga documentos — eficiente para badges en UI.\n   *\n   * Gateado por `firebaseAuthReady` — la aggregation query no se ejecuta hasta\n   * que la sesión de Firebase Auth esté lista.\n   */\n  getUnreadCount(): Observable<number> {\n    return this.collectionWhenAuthReady$().pipe(\n      switchMap(collection => {\n        if (!collection) return of(0);\n        return from(\n          collection.count({\n            where: [{ field: 'isRead', operator: '==', value: false }],\n          })\n        );\n      })\n    );\n  }\n\n  /**\n   * Obtiene una notificación por ID.\n   */\n  async getById(notificationId: string): Promise<NotificationDocument | null> {\n    if (!this.collection) return null;\n    return this.collection.getById(notificationId);\n  }\n\n  // ===========================================================================\n  // ACCIONES\n  // ===========================================================================\n\n  /**\n   * Marca una notificación como leída.\n   */\n  async markAsRead(notificationId: string): Promise<void> {\n    if (!this.collection) return;\n    await this.collection.update(notificationId, { isRead: true });\n  }\n\n  /**\n   * Marca todas las notificaciones no leídas como leídas (batch write).\n   */\n  async markAllAsRead(): Promise<void> {\n    if (!this.collection) return;\n\n    const unread = await this.collection.query({\n      where: [{ field: 'isRead', operator: '==', value: false }],\n    });\n\n    const ids = unread.map(n => n.id!).filter(Boolean);\n    await this.collection.batchUpdate(ids, { isRead: true });\n  }\n\n  /**\n   * Elimina una notificación.\n   */\n  async delete(notificationId: string): Promise<void> {\n    if (!this.collection) return;\n    await this.collection.delete(notificationId);\n  }\n\n  /**\n   * Elimina todas las notificaciones del usuario (batch delete).\n   */\n  async deleteAll(): Promise<void> {\n    if (!this.collection) return;\n\n    const all = await this.collection.getAll();\n    const ids = all.map(n => n.id!).filter(Boolean);\n    await this.collection.batchDelete(ids);\n  }\n\n  /**\n   * Limpia el estado del servicio.\n   * Útil para logout.\n   */\n  reset(): void {\n    this.collection = null;\n    this.currentUserId = null;\n    this.collectionReady$.next(null);\n  }\n}\n","/**\n * Analytics Types\n *\n * Tipos e interfaces para el servicio de Firebase Analytics (GA4).\n */\n\n// ============================================================================\n// CONFIGURACIÓN\n// ============================================================================\n\n/**\n * Configuración de Analytics para ValtechFirebaseConfig\n */\nexport interface AnalyticsConfig {\n  /** Habilitar tracking automático de page views via Router (default: true) */\n  enablePageViewTracking?: boolean;\n\n  /** Habilitar tracking automático de errores via ErrorHandler (default: false) */\n  enableErrorTracking?: boolean;\n\n  /** Habilitar integración con auth para userId y userProperties (default: true) */\n  enableAuthIntegration?: boolean;\n\n  /** Modo debug: logea a consola además de enviar a Firebase (default: false) */\n  debugMode?: boolean;\n\n  /** Auto-grant consent para desarrollo/testing (default: false) */\n  defaultConsentGranted?: boolean;\n\n  /** Rutas a excluir del page view tracking (regex patterns) */\n  excludeRoutes?: string[];\n\n  /** Consent mode inicial (GDPR) */\n  defaultConsent?: ConsentSettings;\n\n  /** Clave de localStorage para persistir consent (default: 'analytics_consent') */\n  consentStorageKey?: string;\n\n  /** Propiedades de usuario por defecto */\n  defaultUserProperties?: Record<string, string>;\n\n  /** Prefijo para eventos custom (ej: 'myapp_') */\n  eventPrefix?: string;\n\n  /** Sampling rate (0.0 - 1.0) para reducir volumen (default: 1.0) */\n  samplingRate?: number;\n}\n\n// ============================================================================\n// CONSENT (GDPR)\n// ============================================================================\n\n/**\n * Settings de consentimiento GDPR\n */\nexport interface ConsentSettings {\n  /** Permite recolección de analytics */\n  analytics?: boolean;\n  /** Permite personalización de ads */\n  advertising?: boolean;\n  /** Permite funcionalidad */\n  functionality?: boolean;\n  /** Permite seguridad */\n  security?: boolean;\n}\n\n/**\n * Estado completo de consentimiento\n */\nexport interface ConsentState {\n  /** Settings actuales */\n  settings: ConsentSettings;\n  /** Timestamp de la última actualización */\n  updatedAt: Date | null;\n  /** Si el usuario ha tomado una decisión explícita */\n  hasDecided: boolean;\n}\n\n// ============================================================================\n// EVENTOS\n// ============================================================================\n\n/**\n * Nombres de eventos GA4 recomendados + customs\n */\nexport type AnalyticsEventName =\n  // GA4 Recommended Events - Ecommerce\n  | 'add_payment_info'\n  | 'add_shipping_info'\n  | 'add_to_cart'\n  | 'add_to_wishlist'\n  | 'begin_checkout'\n  | 'purchase'\n  | 'refund'\n  | 'remove_from_cart'\n  | 'view_cart'\n  | 'view_item'\n  | 'view_item_list'\n  // GA4 Recommended Events - Engagement\n  | 'generate_lead'\n  | 'login'\n  | 'page_view'\n  | 'screen_view'\n  | 'search'\n  | 'select_content'\n  | 'select_item'\n  | 'select_promotion'\n  | 'share'\n  | 'sign_up'\n  | 'view_promotion'\n  // Custom Events (app-specific)\n  | 'feature_used'\n  | 'preference_changed'\n  | 'onboarding_step'\n  | 'error_occurred'\n  | 'performance_metric'\n  // Allow custom events\n  | string;\n\n/**\n * Parámetros tipados por evento\n */\nexport interface AnalyticsEventParams {\n  // Ecommerce\n  add_to_cart: {\n    item_id: string;\n    item_name?: string;\n    value?: number;\n    currency?: string;\n    quantity?: number;\n  };\n  purchase: {\n    transaction_id: string;\n    value: number;\n    currency?: string;\n    items?: AnalyticsItem[];\n    tax?: number;\n    shipping?: number;\n  };\n  begin_checkout: {\n    value?: number;\n    currency?: string;\n    items?: AnalyticsItem[];\n  };\n  view_item: {\n    item_id: string;\n    item_name?: string;\n    value?: number;\n    currency?: string;\n  };\n  remove_from_cart: {\n    item_id: string;\n    item_name?: string;\n    value?: number;\n  };\n\n  // Engagement\n  login: { method?: string };\n  sign_up: { method?: string };\n  search: { search_term: string };\n  share: { content_type?: string; item_id?: string; method?: string };\n  select_content: { content_type: string; item_id?: string };\n  page_view: { page_path?: string; page_title?: string; page_location?: string };\n  screen_view: { screen_name: string; screen_class?: string };\n\n  // Custom\n  feature_used: { feature_name: string; feature_category?: string };\n  preference_changed: { preference_name: string; old_value?: string; new_value?: string };\n  onboarding_step: { step_number: number; step_name?: string };\n  error_occurred: {\n    error_type: string;\n    error_message?: string;\n    error_stack?: string;\n    context?: string;\n  };\n  performance_metric: { metric_name: string; value: number; unit?: string };\n\n  // Allow custom params\n  [key: string]: Record<string, unknown> | undefined;\n}\n\n/**\n * Item para eventos de ecommerce\n */\nexport interface AnalyticsItem {\n  /** ID único del item */\n  item_id: string;\n  /** Nombre del item */\n  item_name: string;\n  /** Categoría principal */\n  item_category?: string;\n  /** Subcategorías */\n  item_category2?: string;\n  item_category3?: string;\n  /** Marca */\n  item_brand?: string;\n  /** Variante (ej: color, talla) */\n  item_variant?: string;\n  /** Precio unitario */\n  price?: number;\n  /** Cantidad */\n  quantity?: number;\n  /** Moneda ISO 4217 */\n  currency?: string;\n  /** Posición en lista */\n  index?: number;\n  /** Cupón aplicado */\n  coupon?: string;\n}\n\n// ============================================================================\n// DEBUG\n// ============================================================================\n\n/**\n * Tipo de evento de debug\n */\nexport type DebugEventType =\n  | 'event'\n  | 'page_view'\n  | 'screen_view'\n  | 'user_property'\n  | 'error'\n  | 'consent'\n  | 'timing';\n\n/**\n * Evento de debug (solo en debug mode)\n */\nexport interface AnalyticsDebugEvent {\n  /** Timestamp del evento */\n  timestamp: Date;\n  /** Tipo de evento */\n  type: DebugEventType;\n  /** Nombre del evento */\n  name: string;\n  /** Parámetros del evento */\n  params?: Record<string, unknown>;\n  /** Si fue enviado a Firebase (false en debug mode) */\n  sent: boolean;\n}\n\n// ============================================================================\n// TIMING / PERFORMANCE\n// ============================================================================\n\n/**\n * Métrica de timing/performance\n */\nexport interface TimingMetric {\n  /** Nombre de la métrica */\n  name: string;\n  /** Valor en milisegundos */\n  valueMs: number;\n  /** Categoría (ej: 'api', 'render', 'load') */\n  category?: string;\n  /** Parámetros adicionales */\n  params?: Record<string, string>;\n}\n\n// ============================================================================\n// USER\n// ============================================================================\n\n/**\n * Propiedades de usuario para segmentación\n */\nexport interface UserProperties {\n  /** Idioma preferido */\n  preferred_language?: string;\n  /** Nivel de suscripción */\n  subscription_tier?: string;\n  /** Organización activa (multi-tenant) */\n  active_organization?: string;\n  /** Propiedades custom */\n  [key: string]: string | number | boolean | undefined;\n}\n","/**\n * Firebase Services\n *\n * Servicios reutilizables para integración con Firebase.\n *\n * @example\n * ```typescript\n * // En main.ts\n * import { provideValtechFirebase } from 'valtech-components';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechFirebase({\n *       firebase: environment.firebase,\n *       persistence: true,\n *     }),\n *   ],\n * });\n *\n * // En componentes\n * import { FirebaseService, FirestoreService } from 'valtech-components';\n *\n * @Component({...})\n * export class MyComponent {\n *   private firebase = inject(FirebaseService);\n *   private firestore = inject(FirestoreService);\n * }\n * ```\n */\n\n// Tipos\nexport * from './types';\n\n// Configuración\nexport { VALTECH_FIREBASE_CONFIG, hasEmulators, provideValtechFirebase } from './config';\n\n// Configuración compartida (helpers genéricos)\nexport {\n  collections,\n  createFirebaseConfig,\n  isEmulatorMode,\n  storagePaths,\n  type AppId,\n  type CreateFirebaseConfigOptions,\n} from './shared-config';\n\n// Servicios\nexport { FirebaseService } from './firebase.service';\n\n// Firestore\nexport { FirestoreService } from './firestore.service';\n\n// Firestore Collections (Factory Pattern)\nexport {\n  CollectionOptions,\n  FirestoreCollection,\n  FirestoreCollectionFactory,\n  SubCollectionRef,\n  TypedCollection,\n} from './firestore-collection';\n\n// Utilidades\nexport { QueryBuilder, query } from './utils/query-builder';\nexport {\n  buildPath,\n  extractPathParams,\n  getCollectionPath,\n  getDocumentId,\n  isCollectionPath,\n  isDocumentPath,\n  isValidPath,\n  joinPath,\n} from './utils/path-builder';\n\n// Storage\nexport { StorageService } from './storage.service';\n\n// Messaging (FCM)\nexport {\n  MessagingService,\n  type EnablePushOptions,\n  type RegisterDeviceFn,\n} from './messaging.service';\n\n// Notifications (Firestore)\nexport { NotificationDocument, NotificationsService } from './notifications.service';\n\n// Analytics (GA4)\nexport { AnalyticsService } from './analytics.service';\nexport { AnalyticsRouterTracker } from './analytics-router-tracker';\nexport { AnalyticsErrorHandler } from './analytics-error-handler';\nexport * from './analytics-types';\n","import { Injectable, Inject, NgZone, Optional } from '@angular/core';\nimport { Observable, Subject, throwError } from 'rxjs';\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport {\n  ValtechAuthConfig,\n  OAuthProvider,\n  OAuthResult,\n  OAuthError,\n  OAuthCallbackData,\n  LinkedProvider,\n  HasPasswordResponse,\n} from './types';\nimport { HttpClient } from '@angular/common/http';\nimport { catchError } from 'rxjs/operators';\n\n/**\n * Servicio de OAuth para login social.\n *\n * Implementa flujo OAuth server-side con popup:\n * 1. Frontend abre popup hacia backend\n * 2. Backend redirige a provider (Google, Apple, Microsoft)\n * 3. Usuario autoriza\n * 4. Backend intercambia code, genera JWT, redirige con tokens\n * 5. Popup envía tokens a ventana padre via postMessage\n *\n * @example\n * ```typescript\n * import { OAuthService, AuthService } from 'valtech-components';\n *\n * @Component({...})\n * export class LoginComponent {\n *   private oauth = inject(OAuthService);\n *   private auth = inject(AuthService);\n *\n *   async loginWithGoogle() {\n *     this.oauth.startFlow('google').subscribe({\n *       next: (result) => {\n *         // Tokens recibidos, guardar en auth state\n *         this.auth.handleOAuthSuccess(result);\n *         this.router.navigate(['/']);\n *       },\n *       error: (error) => {\n *         console.error('OAuth failed:', error);\n *       }\n *     });\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class OAuthService {\n  private popup: Window | null = null;\n  private messageHandler: ((event: MessageEvent) => void) | null = null;\n  private checkClosedInterval: ReturnType<typeof setInterval> | null = null;\n\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private http: HttpClient,\n    private ngZone: NgZone\n  ) {}\n\n  /**\n   * Inicia flujo OAuth en popup.\n   * Retorna Observable que emite cuando el usuario completa el flujo.\n   *\n   * @param provider - Proveedor OAuth ('google', 'apple', 'microsoft')\n   * @returns Observable que emite OAuthResult o error\n   */\n  startFlow(provider: OAuthProvider): Observable<OAuthResult> {\n    return new Observable(observer => {\n      // Construir URL de inicio\n      const redirectUri = `${window.location.origin}/auth/oauth/callback`;\n      const startUrl = `${this.config?.apiUrl}/v2/auth/oauth/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;\n\n      // Abrir popup centrado\n      const width = 500;\n      const height = 600;\n      const left = window.screenX + (window.outerWidth - width) / 2;\n      const top = window.screenY + (window.outerHeight - height) / 2;\n      const features = `width=${width},height=${height},left=${left},top=${top},popup=yes`;\n\n      this.popup = window.open(startUrl, 'oauth', features);\n\n      if (!this.popup) {\n        observer.error({\n          code: 'POPUP_BLOCKED',\n          message:\n            'El navegador bloqueó la ventana emergente. Por favor, permite popups para este sitio.',\n        } as OAuthError);\n        return () => {};\n      }\n\n      // Escuchar mensajes del popup\n      this.messageHandler = (event: MessageEvent) => {\n        // Validar origen\n        if (event.origin !== window.location.origin) {\n          return;\n        }\n\n        // Validar tipo de mensaje\n        const data = event.data as OAuthCallbackData;\n        if (data?.type !== 'oauth-callback') {\n          return;\n        }\n\n        // Limpiar\n        this.cleanup();\n\n        // Emitir resultado dentro de NgZone para trigger change detection\n        this.ngZone.run(() => {\n          if (data.error) {\n            observer.error(data.error);\n          } else if (data.tokens) {\n            observer.next(data.tokens);\n            observer.complete();\n          } else {\n            observer.error({\n              code: 'INVALID_RESPONSE',\n              message: 'Respuesta inválida del servidor de autenticación',\n            } as OAuthError);\n          }\n        });\n      };\n\n      window.addEventListener('message', this.messageHandler);\n\n      // Polling de localStorage (COOP workaround - no podemos detectar popup.closed)\n      // También verifica si el popup se cerró manualmente\n      this.checkClosedInterval = setInterval(() => {\n        // Primero verificar localStorage (funciona aunque COOP bloquee todo)\n        const storedData = this.checkLocalStorageFallback();\n        if (storedData) {\n          this.cleanup();\n          this.ngZone.run(() => {\n            if (storedData.error) {\n              observer.error(storedData.error);\n            } else if (storedData.tokens) {\n              console.log('[OAuthService] Retrieved tokens from localStorage fallback', {\n                keys: Object.keys(storedData.tokens),\n                hasFirebaseToken: !!storedData.tokens.firebaseToken,\n                firebaseTokenLength: storedData.tokens.firebaseToken?.length ?? 0,\n              });\n              observer.next(storedData.tokens);\n              observer.complete();\n            } else {\n              observer.error({\n                code: 'INVALID_RESPONSE',\n                message: 'Respuesta inválida del servidor de autenticación',\n              } as OAuthError);\n            }\n          });\n          return;\n        }\n\n        // Intentar verificar si popup se cerró (puede fallar por COOP)\n        try {\n          if (this.popup?.closed) {\n            this.cleanup();\n            this.ngZone.run(() => {\n              observer.error({\n                code: 'POPUP_CLOSED',\n                message: 'Se cerró la ventana de autenticación',\n              } as OAuthError);\n            });\n          }\n        } catch {\n          // COOP bloquea acceso a popup.closed - ignorar y seguir con polling\n        }\n      }, 300);\n\n      // Cleanup cuando el observable se destruye\n      return () => this.cleanup();\n    });\n  }\n\n  /**\n   * Inicia flujo de linking para vincular un proveedor adicional.\n   * Requiere que el usuario esté autenticado.\n   *\n   * @param provider - Proveedor OAuth a vincular\n   * @returns Observable que emite cuando se completa el linking\n   */\n  startLinkFlow(provider: OAuthProvider): Observable<OAuthResult> {\n    return new Observable(observer => {\n      const redirectUri = `${window.location.origin}/auth/oauth/callback`;\n      const startUrl = `${this.config?.apiUrl}/v2/auth/oauth/link/${provider}/start?redirect_uri=${encodeURIComponent(redirectUri)}`;\n\n      const width = 500;\n      const height = 600;\n      const left = window.screenX + (window.outerWidth - width) / 2;\n      const top = window.screenY + (window.outerHeight - height) / 2;\n      const features = `width=${width},height=${height},left=${left},top=${top},popup=yes`;\n\n      this.popup = window.open(startUrl, 'oauth-link', features);\n\n      if (!this.popup) {\n        observer.error({\n          code: 'POPUP_BLOCKED',\n          message: 'El navegador bloqueó la ventana emergente',\n        } as OAuthError);\n        return () => {}; // cleanup function\n      }\n\n      this.messageHandler = (event: MessageEvent) => {\n        if (event.origin !== window.location.origin) return;\n\n        const data = event.data as OAuthCallbackData;\n        if (data?.type !== 'oauth-callback') return;\n\n        this.cleanup();\n\n        this.ngZone.run(() => {\n          if (data.error) {\n            observer.error(data.error);\n          } else {\n            observer.next(data.tokens || ({} as OAuthResult));\n            observer.complete();\n          }\n        });\n      };\n\n      window.addEventListener('message', this.messageHandler);\n\n      this.checkClosedInterval = setInterval(() => {\n        if (this.popup?.closed) {\n          this.cleanup();\n          this.ngZone.run(() => {\n            observer.error({\n              code: 'POPUP_CLOSED',\n              message: 'Se cerró la ventana de autenticación',\n            } as OAuthError);\n          });\n        }\n      }, 500);\n\n      return () => this.cleanup();\n    });\n  }\n\n  /**\n   * Obtiene los proveedores OAuth vinculados al usuario.\n   */\n  getLinkedProviders(): Observable<LinkedProvider[]> {\n    return this.http\n      .get<{ providers: LinkedProvider[] }>(`${this.config?.apiUrl}/v2/auth/oauth/providers`)\n      .pipe(\n        catchError(error =>\n          throwError(\n            () =>\n              ({\n                code: error.error?.code || 'FETCH_ERROR',\n                message: error.error?.message || 'Error al obtener proveedores vinculados',\n              }) as OAuthError\n          )\n        )\n      ) as unknown as Observable<LinkedProvider[]>;\n  }\n\n  /**\n   * Desvincula un proveedor OAuth.\n   */\n  unlinkProvider(provider: OAuthProvider): Observable<{ success: boolean }> {\n    return this.http\n      .post<{ success: boolean }>(`${this.config?.apiUrl}/v2/auth/oauth/unlink`, { provider })\n      .pipe(\n        catchError(error =>\n          throwError(\n            () =>\n              ({\n                code: error.error?.code || 'UNLINK_ERROR',\n                message: error.error?.message || 'Error al desvincular proveedor',\n              }) as OAuthError\n          )\n        )\n      );\n  }\n\n  /**\n   * Establece contraseña para usuarios que solo tienen OAuth.\n   */\n  setPassword(password: string): Observable<{ success: boolean }> {\n    return this.http\n      .post<{ success: boolean }>(`${this.config?.apiUrl}/v2/auth/oauth/set-password`, { password })\n      .pipe(\n        catchError(error =>\n          throwError(\n            () =>\n              ({\n                code: error.error?.code || 'SET_PASSWORD_ERROR',\n                message: error.error?.message || 'Error al establecer contraseña',\n              }) as OAuthError\n          )\n        )\n      );\n  }\n\n  /**\n   * Verifica si el usuario tiene contraseña establecida.\n   */\n  hasPassword(): Observable<HasPasswordResponse> {\n    return this.http\n      .get<HasPasswordResponse>(`${this.config?.apiUrl}/v2/auth/oauth/has-password`)\n      .pipe(\n        catchError(error =>\n          throwError(\n            () =>\n              ({\n                code: error.error?.code || 'CHECK_PASSWORD_ERROR',\n                message: error.error?.message || 'Error al verificar contraseña',\n              }) as OAuthError\n          )\n        )\n      );\n  }\n\n  /**\n   * Revisa localStorage por datos de callback OAuth (fallback para COOP).\n   * Solo acepta datos recientes (últimos 30 segundos).\n   */\n  private checkLocalStorageFallback(): OAuthCallbackData | null {\n    try {\n      const timestamp = localStorage.getItem('oauth_callback_timestamp');\n      const dataStr = localStorage.getItem('oauth_callback_data');\n\n      if (!timestamp || !dataStr) {\n        return null;\n      }\n\n      // Solo aceptar datos de los últimos 30 segundos\n      const age = Date.now() - parseInt(timestamp, 10);\n      if (age > 30000) {\n        console.log('[OAuthService] localStorage data too old, ignoring');\n        this.clearLocalStorageFallback();\n        return null;\n      }\n\n      const data = JSON.parse(dataStr) as OAuthCallbackData;\n      this.clearLocalStorageFallback();\n      return data;\n    } catch (e) {\n      console.warn('[OAuthService] Error reading localStorage fallback:', e);\n      return null;\n    }\n  }\n\n  /**\n   * Limpia datos de fallback de localStorage.\n   */\n  private clearLocalStorageFallback(): void {\n    try {\n      localStorage.removeItem('oauth_callback_data');\n      localStorage.removeItem('oauth_callback_timestamp');\n    } catch {\n      // Ignorar errores de limpieza\n    }\n  }\n\n  /**\n   * Limpia recursos del popup.\n   */\n  private cleanup(): void {\n    if (this.messageHandler) {\n      window.removeEventListener('message', this.messageHandler);\n      this.messageHandler = null;\n    }\n\n    if (this.checkClosedInterval) {\n      clearInterval(this.checkClosedInterval);\n      this.checkClosedInterval = null;\n    }\n\n    if (this.popup && !this.popup.closed) {\n      this.popup.close();\n    }\n    this.popup = null;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { I18nService } from './i18n.service';\nimport {\n  InputMetadata,\n  FormMetadata,\n  FormSection,\n  ButtonMetadata,\n  ComponentState,\n} from '../../components/types';\n\n/**\n * Helper para resolver traducciones i18n en InputMetadata y FormMetadata.\n *\n * @example\n * ```typescript\n * helper = inject(InputI18nHelper);\n *\n * // Resolver un input\n * emailInput = this.helper.resolveInput({\n *   ...baseEmailInput,\n *   labelKey: 'email',\n *   placeholderKey: 'emailPlaceholder',\n *   errorKeys: { required: 'emailRequired', email: 'emailInvalid' },\n *   i18nNamespace: '_auth',\n * });\n *\n * // Resolver un form completo\n * loginForm = this.helper.resolveForm(loginFormConfig);\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class InputI18nHelper {\n  private i18n = inject(I18nService);\n\n  /**\n   * Resuelve traducciones para un InputMetadata.\n   * Si hay keys de i18n, las resuelve; sino, usa los valores directos.\n   */\n  resolveInput(input: InputMetadataWithI18n): InputMetadata {\n    const namespace = input.i18nNamespace || '_global';\n\n    return {\n      ...input,\n      label: input.labelKey\n        ? this.i18n.t(input.labelKey, namespace)\n        : input.label || '',\n      placeholder: input.placeholderKey\n        ? this.i18n.t(input.placeholderKey, namespace)\n        : input.placeholder || '',\n      hint: input.hintKey ? this.i18n.t(input.hintKey, namespace) : input.hint || '',\n      errors: input.errorKeys\n        ? this.resolveErrors(input.errorKeys, namespace)\n        : input.errors || {},\n    } as InputMetadata;\n  }\n\n  /**\n   * Resuelve traducciones para un FormMetadata completo.\n   * Lee i18n.lang() para crear dependencia reactiva con computed().\n   */\n  resolveForm(form: FormMetadataWithI18n): FormMetadata {\n    // Leer el signal del idioma para crear dependencia reactiva\n    // Esto permite que computed() detecte cambios de idioma\n    this.i18n.lang();\n    const namespace = form.i18nNamespace || '_global';\n\n    return {\n      ...form,\n      name: form.nameKey ? this.i18n.t(form.nameKey, namespace) : form.name || '',\n      sections: form.sections.map((section) => ({\n        ...section,\n        name: section.nameKey\n          ? this.i18n.t(section.nameKey, namespace)\n          : section.name || '',\n        fields: section.fields.map((field) =>\n          this.resolveInput({ ...field, i18nNamespace: namespace })\n        ),\n      })) as FormSection[],\n      actions: this.resolveButton(form.actions, namespace),\n    };\n  }\n\n  /**\n   * Resuelve traducciones para un ButtonMetadata.\n   */\n  resolveButton(\n    button: ButtonMetadataWithI18n,\n    namespace?: string\n  ): ButtonMetadata {\n    const ns = namespace || button.i18nNamespace || '_global';\n\n    return {\n      ...button,\n      text: button.textKey ? this.i18n.t(button.textKey, ns) : button.text,\n    } as ButtonMetadata;\n  }\n\n  /**\n   * Resuelve un mapa de error keys a mensajes traducidos.\n   */\n  private resolveErrors(\n    errorKeys: Record<string, string>,\n    namespace: string\n  ): Record<string, string> {\n    const resolved: Record<string, string> = {};\n    for (const [validatorKey, i18nKey] of Object.entries(errorKeys)) {\n      resolved[validatorKey] = this.i18n.t(i18nKey, namespace);\n    }\n    return resolved;\n  }\n}\n\n// Tipos extendidos con soporte i18n\nexport interface InputMetadataWithI18n extends Partial<InputMetadata> {\n  i18nNamespace?: string;\n  labelKey?: string;\n  placeholderKey?: string;\n  hintKey?: string;\n  errorKeys?: Record<string, string>;\n}\n\nexport interface FormSectionWithI18n {\n  name?: string;\n  nameKey?: string;\n  order: number;\n  fields: InputMetadataWithI18n[];\n}\n\nexport interface FormMetadataWithI18n {\n  name?: string;\n  nameKey?: string;\n  i18nNamespace?: string;\n  sections: FormSectionWithI18n[];\n  actions: ButtonMetadataWithI18n;\n  state: ComponentState;\n}\n\nexport interface ButtonMetadataWithI18n extends Partial<ButtonMetadata> {\n  i18nNamespace?: string;\n  textKey?: string;\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from './i18n.service';\n\n/**\n * Pipe de traducción para templates.\n *\n * NOTA: Es impure para detectar cambios de idioma.\n * El costo es mínimo porque I18nService usa Signals internamente.\n *\n * @example\n * <!-- Busca en _global -->\n * {{ 'submit' | t }}\n *\n * <!-- Busca en namespace específico -->\n * {{ 'title' | t:'Login' }}\n *\n * <!-- Con interpolación -->\n * {{ 'welcome' | t:'Login':{ name: userName } }}\n *\n * <!-- En atributos -->\n * <val-button [label]=\"'submit' | t\"></val-button>\n * <val-input [label]=\"'email' | t:'Login'\"></val-input>\n */\n@Pipe({\n  name: 't',\n  standalone: true,\n  pure: false, // Impure para detectar cambios de idioma\n})\nexport class TranslatePipe implements PipeTransform {\n  private readonly i18n = inject(I18nService);\n\n  /**\n   * Transforma una key de traducción a su valor\n   *\n   * @param key Clave del texto\n   * @param namespace Namespace opcional (default: '_global')\n   * @param data Variables para interpolación opcional\n   * @returns Texto traducido\n   */\n  transform(key: string, namespace?: string, data?: Record<string, string>): string {\n    return this.i18n.t(key, namespace, data);\n  }\n}\n","import { ContentStore } from './types';\n\n/**\n * Traducciones por defecto de valtech-components.\n *\n * Estas traducciones se cargan automáticamente cuando se usa provideValtechI18n()\n * sin necesidad de configuración adicional.\n *\n * Las apps pueden sobrescribir cualquier key pasando su propio content:\n *\n * @example Sobrescribir traducciones específicas\n * ```typescript\n * provideValtechI18n({\n *   content: {\n *     _global: {\n *       es: { success: '¡Lo hicimos!' },  // Sobrescribe solo esta key\n *       en: { success: 'We did it!' },\n *     },\n *   },\n * })\n * ```\n *\n * @example Desactivar traducciones por defecto\n * ```typescript\n * provideValtechI18n({\n *   includeDefaultContent: false,\n *   content: MY_CUSTOM_CONTENT,\n * })\n * ```\n */\nexport const VALTECH_DEFAULT_CONTENT: ContentStore = {\n  _global: {\n    es: {\n      // Acciones comunes\n      submit: 'Enviar',\n      cancel: 'Cancelar',\n      save: 'Guardar',\n      delete: 'Eliminar',\n      edit: 'Editar',\n      close: 'Cerrar',\n      back: 'Volver',\n      next: 'Siguiente',\n      previous: 'Anterior',\n      loading: 'Cargando...',\n      search: 'Buscar',\n      learnMore: 'Saber más',\n\n      // Estados\n      success: 'Éxito',\n      error: 'Error',\n      warning: 'Advertencia',\n      info: 'Información',\n\n      // Confirmaciones\n      confirmDelete: '¿Estás seguro de que deseas eliminar?',\n      confirmCancel: '¿Estás seguro de que deseas cancelar?',\n\n      // Mensajes comunes\n      noResults: 'No se encontraron resultados',\n      required: 'Este campo es requerido',\n\n      // Navegación\n      home: 'Inicio',\n      settings: 'Configuración',\n      profile: 'Perfil',\n      logout: 'Cerrar sesión',\n\n      // Greetings (saludo según hora)\n      goodMorning: 'Buenos días',\n      goodAfternoon: 'Buenas tardes',\n      goodEvening: 'Buenas noches',\n\n      // Auth — confirmación cierre de sesión\n      logoutConfirmTitle: 'Cerrar sesión',\n      logoutConfirmMessage: '¿Seguro que deseas cerrar sesión?',\n\n      // Idiomas\n      languageName_es: 'Español',\n      languageName_en: 'English',\n\n      // Componentes - Modales/Selects\n      ok: 'Aceptar',\n      selectOption: 'Seleccionar opción',\n      selectPlaceholder: 'Seleccionar...',\n      itemsSelected: 'elementos seleccionados',\n      selectAll: 'Seleccionar todos',\n      clear: 'Limpiar',\n      apply: 'Aplicar',\n\n      // Componentes - Fechas\n      startDate: 'Fecha inicio',\n      endDate: 'Fecha fin',\n      day: 'día',\n      days: 'días',\n\n      // Componentes - Formularios\n      uploadFile: 'Subir archivo',\n      noFileSelected: 'No has seleccionado archivo',\n      title: 'Título',\n      description: 'Descripción',\n      feedbackType: 'Tipo de feedback',\n      feedbackSuccess: 'Feedback enviado exitosamente',\n      feedbackError: 'Error al enviar el feedback',\n\n      // Componentes - AttachmentUploader\n      attachAdd: 'Adjuntar archivo',\n      attachCamera: 'Usar cámara',\n      attachMaxCount: 'Límite de {count} archivos alcanzado',\n      attachUploadFailed: 'Error al subir el archivo',\n      titlePlaceholder: 'Describe brevemente...',\n      titleValidation: 'El título debe tener entre 5 y 200 caracteres',\n      descriptionPlaceholder: 'Proporciona más detalles...',\n      descriptionValidation: 'La descripción debe tener entre 10 y 5000 caracteres',\n\n      // Componentes - Búsqueda/Grid\n      searchNumber: 'Buscar número...',\n      selected: 'seleccionado/s',\n      max: 'máx:',\n\n      // Componentes - Listas\n      loadMoreComments: 'Cargar más comentarios',\n      noData: 'No hay datos',\n      noRecordsFound: 'No se encontraron registros para mostrar.',\n\n      // Componentes - Acciones\n      copiedToClipboard: '¡Copiado al portapapeles!',\n      language: 'Idioma',\n      selectLanguage: 'Seleccionar idioma...',\n      download: 'Descargar',\n      copy: 'Copiar',\n      share: 'Compartir',\n\n      // Componentes - Data Table / Paginación\n      actions: 'Acciones',\n      showing: 'Mostrando',\n      of: 'de',\n      perPage: 'por página',\n      firstPage: 'Primera página',\n      previousPage: 'Página anterior',\n      nextPage: 'Página siguiente',\n      lastPage: 'Última página',\n\n      // Componentes - Participant Card\n      winner: 'Ganador',\n      ticket: 'boleto',\n      tickets: 'boletos',\n      more: 'más',\n      notes: 'Notas:',\n\n      // Footer\n      allRightsReserved: 'Todos los derechos reservados.',\n\n      // Clipboard\n      linkCopied: '¡Enlace copiado!',\n\n      // Selection\n      select: 'Seleccionar',\n      selectOptions: 'Seleccionar opciones',\n\n      // Comments\n      pinned: 'Fijado',\n      edited: '(editado)',\n      showComment: 'Mostrar comentario',\n      hideReplies: 'Ocultar respuestas',\n      loadMoreReplies: 'Cargar más respuestas',\n      viewReplies: 'Ver respuestas',\n      comments: 'Comentarios',\n      noCommentsYet: 'Sin comentarios aún',\n      publish: 'Publicar',\n      sortBy: 'Ordenar por',\n      writeComment: 'Escribe un comentario...',\n      beFirstToComment: '¡Sé el primero en compartir tu opinión!',\n\n      // Timestamps\n      justNow: 'Ahora mismo',\n      minutesAgo: 'hace {minutes}m',\n      hoursAgo: 'hace {hours}h',\n      daysAgo: 'hace {days}d',\n\n      // Lists\n      loadMore: 'Cargar más',\n      noMoreItems: 'No hay más items',\n      loadingItems: 'Cargando items...',\n      allItemsLoaded: 'Todos los items han sido cargados',\n      errorOccurred: 'Ocurrió un error',\n      retry: 'Reintentar',\n\n      // Navigation\n      seeMore: 'Ver más',\n\n      // Forms - Range\n      from: 'Inicial',\n      to: 'Final',\n\n      // Stepper\n      decrease: 'Disminuir',\n      increase: 'Aumentar',\n\n      // Misc\n      random: 'Aleatorio',\n      pullToRefresh: 'Arrastra para actualizar',\n      timeExpired: 'Tiempo agotado',\n      qrCode: 'Código QR',\n\n      // Payment status\n      paymentPending: 'Pendiente',\n      paymentProcessing: 'Procesando',\n      paymentPaid: 'Pagado',\n      paymentRefunded: 'Reembolsado',\n      paymentFailed: 'Fallido',\n    },\n    en: {\n      // Common actions\n      submit: 'Submit',\n      cancel: 'Cancel',\n      save: 'Save',\n      delete: 'Delete',\n      edit: 'Edit',\n      close: 'Close',\n      back: 'Back',\n      next: 'Next',\n      previous: 'Previous',\n      loading: 'Loading...',\n      search: 'Search',\n      learnMore: 'Learn more',\n\n      // States\n      success: 'Success',\n      error: 'Error',\n      warning: 'Warning',\n      info: 'Information',\n\n      // Confirmations\n      confirmDelete: 'Are you sure you want to delete?',\n      confirmCancel: 'Are you sure you want to cancel?',\n\n      // Common messages\n      noResults: 'No results found',\n      required: 'This field is required',\n\n      // Navigation\n      home: 'Home',\n      settings: 'Settings',\n      profile: 'Profile',\n      logout: 'Log out',\n\n      // Greetings (time-of-day salutation)\n      goodMorning: 'Good morning',\n      goodAfternoon: 'Good afternoon',\n      goodEvening: 'Good evening',\n\n      // Auth — sign out confirmation\n      logoutConfirmTitle: 'Sign out',\n      logoutConfirmMessage: 'Are you sure you want to sign out?',\n\n      // Languages\n      languageName_es: 'Español',\n      languageName_en: 'English',\n\n      // Components - Modals/Selects\n      ok: 'OK',\n      selectOption: 'Select option',\n      selectPlaceholder: 'Select...',\n      itemsSelected: 'items selected',\n      selectAll: 'Select all',\n      clear: 'Clear',\n      apply: 'Apply',\n\n      // Components - Dates\n      startDate: 'Start date',\n      endDate: 'End date',\n      day: 'day',\n      days: 'days',\n\n      // Components - Forms\n      uploadFile: 'Upload file',\n      noFileSelected: 'No file selected',\n      title: 'Title',\n      description: 'Description',\n      feedbackType: 'Feedback type',\n      feedbackSuccess: 'Feedback sent successfully',\n      feedbackError: 'Error sending feedback',\n\n      // Components - AttachmentUploader\n      attachAdd: 'Attach file',\n      attachCamera: 'Use camera',\n      attachMaxCount: 'Limit of {count} files reached',\n      attachUploadFailed: 'Error uploading file',\n      titlePlaceholder: 'Describe briefly...',\n      titleValidation: 'Title must be between 5 and 200 characters',\n      descriptionPlaceholder: 'Provide more details...',\n      descriptionValidation: 'Description must be between 10 and 5000 characters',\n\n      // Components - Search/Grid\n      searchNumber: 'Search number...',\n      selected: 'selected',\n      max: 'max:',\n\n      // Components - Lists\n      loadMoreComments: 'Load more comments',\n      noData: 'No data',\n      noRecordsFound: 'No records found to display.',\n\n      // Components - Actions\n      copiedToClipboard: 'Copied to clipboard!',\n      language: 'Language',\n      selectLanguage: 'Select language...',\n      download: 'Download',\n      copy: 'Copy',\n      share: 'Share',\n\n      // Components - Data Table / Pagination\n      actions: 'Actions',\n      showing: 'Showing',\n      of: 'of',\n      perPage: 'per page',\n      firstPage: 'First page',\n      previousPage: 'Previous page',\n      nextPage: 'Next page',\n      lastPage: 'Last page',\n\n      // Components - Participant Card\n      winner: 'Winner',\n      ticket: 'ticket',\n      tickets: 'tickets',\n      more: 'more',\n      notes: 'Notes:',\n\n      // Footer\n      allRightsReserved: 'All rights reserved.',\n\n      // Clipboard\n      linkCopied: 'Link copied!',\n\n      // Selection\n      select: 'Select',\n      selectOptions: 'Select options',\n\n      // Comments\n      pinned: 'Pinned',\n      edited: '(edited)',\n      showComment: 'Show comment',\n      hideReplies: 'Hide replies',\n      loadMoreReplies: 'Load more replies',\n      viewReplies: 'View replies',\n      comments: 'Comments',\n      noCommentsYet: 'No comments yet',\n      publish: 'Publish',\n      sortBy: 'Sort by',\n      writeComment: 'Write a comment...',\n      beFirstToComment: 'Be the first to share your thoughts!',\n\n      // Timestamps\n      justNow: 'Just now',\n      minutesAgo: '{minutes}m ago',\n      hoursAgo: '{hours}h ago',\n      daysAgo: '{days}d ago',\n\n      // Lists\n      loadMore: 'Load more',\n      noMoreItems: 'No more items',\n      loadingItems: 'Loading items...',\n      allItemsLoaded: 'All items loaded',\n      errorOccurred: 'An error occurred',\n      retry: 'Retry',\n\n      // Navigation\n      seeMore: 'See more',\n\n      // Forms - Range\n      from: 'From',\n      to: 'To',\n\n      // Stepper\n      decrease: 'Decrease',\n      increase: 'Increase',\n\n      // Misc\n      random: 'Random',\n      pullToRefresh: 'Pull to refresh',\n      timeExpired: 'Time expired',\n      qrCode: 'QR Code',\n\n      // Payment status\n      paymentPending: 'Pending',\n      paymentProcessing: 'Processing',\n      paymentPaid: 'Paid',\n      paymentRefunded: 'Refunded',\n      paymentFailed: 'Failed',\n    },\n  },\n\n  _auth: {\n    es: {\n      // Login\n      loginTitle: 'Iniciar sesión',\n      email: 'Correo electrónico',\n      emailPlaceholder: 'tu@email.com',\n      emailRequired: 'El correo es requerido',\n      emailInvalid: 'Ingresa un correo válido',\n      password: 'Contraseña',\n      passwordPlaceholder: '••••••••',\n      passwordRequired: 'La contraseña es requerida',\n      loginSubmit: 'Iniciar sesión',\n\n      // OAuth\n      orContinueWith: 'o continúa con',\n      continueWithGoogle: 'Continuar con Google',\n      continueWithApple: 'Continuar con Apple',\n      continueWithMicrosoft: 'Continuar con Microsoft',\n      connecting: 'Conectando...',\n\n      // Register\n      registerTitle: 'Crear cuenta',\n      fullName: 'Nombre completo',\n      namePlaceholder: 'Tu nombre',\n      nameRequired: 'El nombre es requerido',\n      nameMinLength: 'Mínimo 2 caracteres',\n      passwordMinLength: 'Mínimo 8 caracteres',\n      passwordStrength:\n        'Mínimo 8 caracteres, una mayúscula, una minúscula, un número y un carácter especial',\n      registerSubmit: 'Registrarse',\n      noAccount: '¿No tienes cuenta?',\n      register: 'Registrarse',\n      hasAccount: '¿Ya tienes cuenta?',\n      signIn: 'Iniciar sesión',\n\n      // Verify email\n      verifyTitle: 'Verificar correo',\n      verifyDescription: 'Ingresa el código de verificación enviado a tu correo.',\n      verifySubmit: 'Verificar',\n      codeRequired: 'El código es requerido',\n      codeMinLength: 'Ingresa los 6 dígitos',\n      noCodeReceived: '¿No has recibido tu código?',\n      resend: 'Reenviar',\n      resendIn: 'Reenviar en {seconds}s',\n      codeSent: 'Código reenviado. Revisa tu email.',\n      emailVerified: '¡Email verificado! Bienvenido.',\n\n      // MFA\n      mfaTitle: 'Verificación MFA',\n      mfaTOTP: 'Ingresa el código de tu app de autenticación',\n      mfaEmail: 'Ingresa el código enviado a tu correo',\n      mfaSMS: 'Ingresa el código enviado a tu teléfono',\n\n      // Forgot/Reset password\n      forgotTitle: 'Recuperar contraseña',\n      forgotDescription: 'Ingresa tu correo electrónico y te enviaremos un código.',\n      forgotSubmit: 'Enviar código',\n      forgotLink: '¿Olvidaste tu contraseña?',\n      recoverPassword: 'Recuperar contraseña',\n      resetTitle: 'Restablecer contraseña',\n      resetDescription: 'Hemos enviado un código de verificación a tu correo.',\n      newPassword: 'Nueva contraseña',\n      newPasswordHint: 'Mínimo 8 caracteres, con mayúscula, minúscula, número y carácter especial',\n      resetSubmit: 'Cambiar contraseña',\n      passwordUpdated: '¡Contraseña actualizada! Ya puedes iniciar sesión.',\n\n      // Change password (sesión activa)\n      changePasswordTitle: 'Cambiar contraseña',\n      changePasswordDescription: 'Ingresa tu contraseña actual y la nueva.',\n      currentPassword: 'Contraseña actual',\n      currentPasswordRequired: 'La contraseña actual es requerida',\n      changePasswordSubmit: 'Cambiar contraseña',\n      passwordChangedSuccess: '¡Contraseña actualizada!',\n      errorCurrentPasswordWrong: 'La contraseña actual es incorrecta',\n      errorSamePassword: 'La nueva contraseña debe ser diferente a la actual',\n      errorPasswordTooWeak:\n        'La contraseña debe incluir al menos 8 caracteres, una mayúscula, una minúscula, un número y un carácter especial',\n\n      // Change email (3 pasos)\n      changeEmailTitle: 'Cambiar email',\n      changeEmailStep1Description: 'Ingresa tu contraseña actual y el nuevo email.',\n      changeEmailNewEmail: 'Nuevo email',\n      changeEmailNewEmailInvalid: 'Ingresa un email válido',\n      changeEmailInitiate: 'Continuar',\n      changeEmailStep2Title: 'Verifica tu identidad',\n      changeEmailStep2Description: 'Ingresa el código de 6 dígitos que enviamos a tu email actual.',\n      changeEmailCodeCurrent: 'Código de verificación',\n      changeEmailConfirm1: 'Confirmar',\n      changeEmailStep3Title: 'Confirma el nuevo email',\n      changeEmailStep3Description: 'Ingresa el código de 6 dígitos que enviamos a {email}.',\n      changeEmailCodeNew: 'Código del nuevo email',\n      changeEmailConfirm2: 'Cambiar email',\n      changeEmailSuccess: '¡Email actualizado!',\n      changeEmailNoPasswordTitle: 'Contraseña requerida',\n      changeEmailNoPasswordHint:\n        'Para cambiar el email debes tener una contraseña. Primero configúrala desde \"Cambiar contraseña\".',\n      errorEmailSameAsCurrent: 'El nuevo email es igual al actual',\n      errorEmailAlreadyInUse: 'Este email ya está en uso',\n      errorEmailChangePendingExpired: 'El flujo expiró. Comienza de nuevo.',\n\n      // Set password (cuenta OAuth-only)\n      setPasswordTitle: 'Crear contraseña',\n      setPasswordDescription:\n        'Tu cuenta usa inicio de sesión social. Crea una contraseña para entrar también con tu correo.',\n      setPasswordSubmit: 'Crear contraseña',\n      setPasswordConfirmTitle: '¿Crear contraseña?',\n      setPasswordConfirmMessage:\n        'Podrás iniciar sesión con tu correo y contraseña, además de tu cuenta social. No perderás el acceso social.',\n      setPasswordConfirmOk: 'Crear contraseña',\n      setPasswordConfirmCancel: 'Cancelar',\n      passwordSetSuccess: '¡Contraseña creada!',\n      errorPasswordAlreadySet: 'Esta cuenta ya tiene una contraseña.',\n\n      // MFA — autenticación en dos pasos\n      mfaManageTitle: 'Autenticación en dos pasos',\n      mfaEnabledLabel: 'MFA habilitado',\n      mfaDisabledLabel: 'MFA deshabilitado',\n      mfaDisabledHint: 'Habilita MFA para mayor seguridad en tu cuenta.',\n      mfaEnableButton: 'Habilitar MFA',\n      mfaDisableButton: 'Deshabilitar MFA',\n      mfaEnableTitle: 'Habilitar MFA',\n      mfaMethodPrompt: 'Elige el método de verificación:',\n      mfaMethodTotp: 'App de autenticación',\n      mfaMethodTotpHint: 'Usa Google Authenticator u otra app (recomendado).',\n      mfaMethodEmail: 'Correo electrónico',\n      mfaMethodEmailHint: 'Recibe códigos en tu correo.',\n      mfaMethodSms: 'SMS',\n      mfaMethodSmsHint: 'Recibe códigos por mensaje de texto.',\n      mfaPhoneLabel: 'Teléfono',\n      mfaPhoneInvalid: 'Ingresa un número válido en formato E.164 (ej: +56912345678).',\n      mfaPhoneRegistered: 'Teléfono registrado',\n      mfaContinue: 'Continuar',\n      mfaCancel: 'Cancelar',\n      mfaTotpSetupTitle: 'Configurar app de autenticación',\n      mfaTotpStep1: 'Paso 1 — Escanea el código QR con tu app de autenticación.',\n      mfaTotpManualEntry: '¿No puedes escanear? Ingresa este código manualmente:',\n      mfaTotpStep2: 'Paso 2 — Ingresa el código de 6 dígitos de tu app:',\n      mfaTotpVerify: 'Verificar y activar',\n      mfaConfirmTitle: 'Confirmar MFA',\n      mfaConfirmPromptEmail: 'Ingresa el código de 6 dígitos enviado a tu correo.',\n      mfaConfirmPromptSms: 'Ingresa el código de 6 dígitos enviado a tu teléfono.',\n      mfaConfirmButton: 'Confirmar',\n      mfaNoCode: '¿No recibiste el código?',\n      mfaResend: 'Reenviar',\n      mfaResendIn: 'Reenviar en',\n      mfaBackupCodesTitle: 'Códigos de respaldo',\n      mfaBackupCodesAvailable: 'Códigos disponibles',\n      mfaBackupCodesLow: 'Te quedan pocos códigos. Considera regenerarlos.',\n      mfaBackupCodesSaveWarning: 'Importante: guarda estos códigos de respaldo.',\n      mfaBackupCodesExplain:\n        'Si pierdes acceso a tu app, estos códigos te permiten entrar. Cada uno se usa una sola vez.',\n      mfaCopyCodes: 'Copiar códigos',\n      mfaRegenerateCodes: 'Regenerar códigos de respaldo',\n      mfaDisableTitle: 'Deshabilitar MFA',\n      mfaDisablePrompt: 'Ingresa tu contraseña para deshabilitar MFA.',\n      mfaPasswordLabel: 'Contraseña',\n      mfaCodeInvalid: 'Ingresa un código válido de 6 dígitos.',\n      mfaPasswordRequired: 'Ingresa tu contraseña.',\n      mfaEnabledOk: '¡MFA habilitado correctamente!',\n      mfaDisabledOk: 'MFA deshabilitado correctamente.',\n      mfaCodesCopied: 'Códigos copiados al portapapeles.',\n      mfaSecretCopied: 'Secreto copiado al portapapeles.',\n      mfaDisableTotpPrompt: 'Ingresá el código de tu app de autenticación para deshabilitar MFA.',\n      mfaDisableCodePrompt:\n        'Ingresá el código que enviamos a tu correo/teléfono para deshabilitar MFA.',\n      mfaDisableSendCode: 'Enviar código',\n      mfaDisableCodeSent: 'Código enviado. Revisá tu correo o teléfono.',\n      mfaDisableResendCode: 'Reenviar código',\n      mfaDisableNeedsPassword:\n        'Esta cuenta no tiene contraseña. Primero seteá una desde \"Olvidé mi contraseña\" y luego volvé a deshabilitar MFA.',\n      mfaErrorInvalidCode: 'Código incorrecto.',\n      mfaErrorExpiredCode: 'El código ha expirado. Solicita uno nuevo.',\n      mfaErrorCodeUsed: 'Este código ya fue utilizado.',\n      mfaErrorAlreadyActive: 'MFA ya está habilitado.',\n      mfaErrorNotEnabled: 'MFA no está habilitado.',\n      mfaErrorPhoneRequired: 'Número de teléfono requerido.',\n      mfaErrorPhoneExists: 'Este teléfono ya está en uso.',\n\n      // Legal\n      legalPrefix: 'Utilizamos los servicios de',\n      legalSuffix: 'para ofrecerte una experiencia segura. Al iniciar sesión, aceptas nuestros',\n      termsAndConditions: 'Términos y Condiciones',\n      and: 'y',\n      privacyPolicy: 'Política de Privacidad',\n\n      // Acciones genéricas\n      close: 'Cerrar',\n\n      // Toasts\n      welcome: '¡Bienvenido!',\n      completeAllFields: 'Completa todos los campos.',\n      enterEmail: 'Ingresa tu correo electrónico.',\n\n      // Errors (mapeados de códigos backend)\n      errorInvalidCredentials: 'Correo o contraseña incorrectos',\n      errorEmailNotVerified: 'Debes verificar tu correo electrónico',\n      errorAccountSuspended: 'Tu cuenta ha sido suspendida',\n      errorEmailExists: 'Este correo ya está registrado',\n      errorWeakPassword: 'La contraseña es muy débil',\n      errorInvalidCode: 'Código incorrecto',\n      errorExpiredCode: 'El código ha expirado. Solicita uno nuevo.',\n      errorTooManyAttempts: 'Demasiados intentos, intenta más tarde',\n      errorMFAInvalidCode: 'Código de verificación incorrecto',\n      errorPopupBlocked: 'Por favor, permite ventanas emergentes',\n      errorOAuthFailed: 'Error de autenticación',\n      errorGeneric: 'Ha ocurrido un error. Intenta de nuevo.',\n    },\n    en: {\n      // Login\n      loginTitle: 'Sign in',\n      email: 'Email',\n      emailPlaceholder: 'you@email.com',\n      emailRequired: 'Email is required',\n      emailInvalid: 'Enter a valid email',\n      password: 'Password',\n      passwordPlaceholder: '••••••••',\n      passwordRequired: 'Password is required',\n      loginSubmit: 'Sign in',\n\n      // OAuth\n      orContinueWith: 'or continue with',\n      continueWithGoogle: 'Continue with Google',\n      continueWithApple: 'Continue with Apple',\n      continueWithMicrosoft: 'Continue with Microsoft',\n      connecting: 'Connecting...',\n\n      // Register\n      registerTitle: 'Create account',\n      fullName: 'Full name',\n      namePlaceholder: 'Your name',\n      nameRequired: 'Name is required',\n      nameMinLength: 'Minimum 2 characters',\n      passwordMinLength: 'Minimum 8 characters',\n      passwordStrength:\n        'Min. 8 characters, one uppercase, one lowercase, one number and one special character',\n      registerSubmit: 'Sign up',\n      noAccount: \"Don't have an account?\",\n      register: 'Sign up',\n      hasAccount: 'Already have an account?',\n      signIn: 'Sign in',\n\n      // Verify email\n      verifyTitle: 'Verify email',\n      verifyDescription: 'Enter the verification code sent to your email.',\n      verifySubmit: 'Verify',\n      codeRequired: 'Code is required',\n      codeMinLength: 'Enter all 6 digits',\n      noCodeReceived: \"Didn't receive your code?\",\n      resend: 'Resend',\n      resendIn: 'Resend in {seconds}s',\n      codeSent: 'Code resent. Check your email.',\n      emailVerified: 'Email verified! Welcome.',\n\n      // MFA\n      mfaTitle: 'MFA Verification',\n      mfaTOTP: 'Enter the code from your authenticator app',\n      mfaEmail: 'Enter the code sent to your email',\n      mfaSMS: 'Enter the code sent to your phone',\n\n      // Forgot/Reset password\n      forgotTitle: 'Recover password',\n      forgotDescription: 'Enter your email and we will send you a code.',\n      forgotSubmit: 'Send code',\n      forgotLink: 'Forgot your password?',\n      recoverPassword: 'Recover password',\n      resetTitle: 'Reset password',\n      resetDescription: 'We have sent a verification code to your email.',\n      newPassword: 'New password',\n      newPasswordHint: 'Min. 8 characters, with uppercase, lowercase, number and special character',\n      resetSubmit: 'Change password',\n      passwordUpdated: 'Password updated! You can now sign in.',\n\n      // Change password (active session)\n      changePasswordTitle: 'Change password',\n      changePasswordDescription: 'Enter your current password and the new one.',\n      currentPassword: 'Current password',\n      currentPasswordRequired: 'Current password is required',\n      changePasswordSubmit: 'Change password',\n      passwordChangedSuccess: 'Password updated!',\n      errorCurrentPasswordWrong: 'Current password is incorrect',\n      errorSamePassword: 'New password must be different from the current one',\n      errorPasswordTooWeak:\n        'Password must include at least 8 characters, one uppercase, one lowercase, one number and one special character',\n\n      // Change email (3 steps)\n      changeEmailTitle: 'Change email',\n      changeEmailStep1Description: 'Enter your current password and the new email.',\n      changeEmailNewEmail: 'New email',\n      changeEmailNewEmailInvalid: 'Enter a valid email',\n      changeEmailInitiate: 'Continue',\n      changeEmailStep2Title: 'Verify your identity',\n      changeEmailStep2Description: 'Enter the 6-digit code we sent to your current email.',\n      changeEmailCodeCurrent: 'Verification code',\n      changeEmailConfirm1: 'Confirm',\n      changeEmailStep3Title: 'Confirm new email',\n      changeEmailStep3Description: 'Enter the 6-digit code we sent to {email}.',\n      changeEmailCodeNew: 'New email code',\n      changeEmailConfirm2: 'Change email',\n      changeEmailSuccess: 'Email updated!',\n      changeEmailNoPasswordTitle: 'Password required',\n      changeEmailNoPasswordHint:\n        'You need a password to change your email. Set one first via \"Change password\".',\n      errorEmailSameAsCurrent: 'The new email is the same as the current one',\n      errorEmailAlreadyInUse: 'This email is already in use',\n      errorEmailChangePendingExpired: 'The flow expired. Start again.',\n\n      // Set password (OAuth-only account)\n      setPasswordTitle: 'Create password',\n      setPasswordDescription:\n        'Your account uses social sign-in. Create a password to also sign in with your email.',\n      setPasswordSubmit: 'Create password',\n      setPasswordConfirmTitle: 'Create password?',\n      setPasswordConfirmMessage:\n        'You will be able to sign in with your email and password, in addition to your social account. You will not lose social access.',\n      setPasswordConfirmOk: 'Create password',\n      setPasswordConfirmCancel: 'Cancel',\n      passwordSetSuccess: 'Password created!',\n      errorPasswordAlreadySet: 'This account already has a password.',\n\n      // MFA — two-factor authentication\n      mfaManageTitle: 'Two-factor authentication',\n      mfaEnabledLabel: 'MFA enabled',\n      mfaDisabledLabel: 'MFA disabled',\n      mfaDisabledHint: 'Enable MFA for extra account security.',\n      mfaEnableButton: 'Enable MFA',\n      mfaDisableButton: 'Disable MFA',\n      mfaEnableTitle: 'Enable MFA',\n      mfaMethodPrompt: 'Choose your verification method:',\n      mfaMethodTotp: 'Authenticator app',\n      mfaMethodTotpHint: 'Use Google Authenticator or another app (recommended).',\n      mfaMethodEmail: 'Email',\n      mfaMethodEmailHint: 'Receive codes in your email.',\n      mfaMethodSms: 'SMS',\n      mfaMethodSmsHint: 'Receive codes by text message.',\n      mfaPhoneLabel: 'Phone',\n      mfaPhoneInvalid: 'Enter a valid number in E.164 format (e.g. +56912345678).',\n      mfaPhoneRegistered: 'Registered phone',\n      mfaContinue: 'Continue',\n      mfaCancel: 'Cancel',\n      mfaTotpSetupTitle: 'Set up authenticator app',\n      mfaTotpStep1: 'Step 1 — Scan the QR code with your authenticator app.',\n      mfaTotpManualEntry: \"Can't scan? Enter this code manually:\",\n      mfaTotpStep2: 'Step 2 — Enter the 6-digit code from your app:',\n      mfaTotpVerify: 'Verify and activate',\n      mfaConfirmTitle: 'Confirm MFA',\n      mfaConfirmPromptEmail: 'Enter the 6-digit code sent to your email.',\n      mfaConfirmPromptSms: 'Enter the 6-digit code sent to your phone.',\n      mfaConfirmButton: 'Confirm',\n      mfaNoCode: \"Didn't receive the code?\",\n      mfaResend: 'Resend',\n      mfaResendIn: 'Resend in',\n      mfaBackupCodesTitle: 'Backup codes',\n      mfaBackupCodesAvailable: 'Available codes',\n      mfaBackupCodesLow: 'You have few codes left. Consider regenerating them.',\n      mfaBackupCodesSaveWarning: 'Important: save these backup codes.',\n      mfaBackupCodesExplain:\n        'If you lose access to your app, these codes let you sign in. Each can be used once.',\n      mfaCopyCodes: 'Copy codes',\n      mfaRegenerateCodes: 'Regenerate backup codes',\n      mfaDisableTitle: 'Disable MFA',\n      mfaDisablePrompt: 'Enter your password to disable MFA.',\n      mfaPasswordLabel: 'Password',\n      mfaCodeInvalid: 'Enter a valid 6-digit code.',\n      mfaPasswordRequired: 'Enter your password.',\n      mfaEnabledOk: 'MFA enabled successfully!',\n      mfaDisabledOk: 'MFA disabled successfully.',\n      mfaCodesCopied: 'Codes copied to clipboard.',\n      mfaSecretCopied: 'Secret copied to clipboard.',\n      mfaDisableTotpPrompt: 'Enter the code from your authenticator app to disable MFA.',\n      mfaDisableCodePrompt: 'Enter the code we sent to your email/phone to disable MFA.',\n      mfaDisableSendCode: 'Send code',\n      mfaDisableCodeSent: 'Code sent. Check your email or phone.',\n      mfaDisableResendCode: 'Resend code',\n      mfaDisableNeedsPassword:\n        'This account has no password. Set one via \"Forgot password\" first, then come back to disable MFA.',\n      mfaErrorInvalidCode: 'Incorrect code.',\n      mfaErrorExpiredCode: 'The code has expired. Request a new one.',\n      mfaErrorCodeUsed: 'This code was already used.',\n      mfaErrorAlreadyActive: 'MFA is already enabled.',\n      mfaErrorNotEnabled: 'MFA is not enabled.',\n      mfaErrorPhoneRequired: 'Phone number required.',\n      mfaErrorPhoneExists: 'This phone is already in use.',\n\n      // Legal\n      legalPrefix: 'We use the services of',\n      legalSuffix: 'to offer you a secure experience. By signing in, you accept our',\n      termsAndConditions: 'Terms and Conditions',\n      and: 'and',\n      privacyPolicy: 'Privacy Policy',\n\n      // Acciones genéricas\n      close: 'Close',\n\n      // Toasts\n      welcome: 'Welcome!',\n      completeAllFields: 'Complete all fields.',\n      enterEmail: 'Enter your email.',\n\n      // Errors\n      errorInvalidCredentials: 'Incorrect email or password',\n      errorEmailNotVerified: 'You must verify your email',\n      errorAccountSuspended: 'Your account has been suspended',\n      errorEmailExists: 'This email is already registered',\n      errorWeakPassword: 'Password is too weak',\n      errorInvalidCode: 'Incorrect code',\n      errorExpiredCode: 'Code has expired. Request a new one.',\n      errorTooManyAttempts: 'Too many attempts, try again later',\n      errorMFAInvalidCode: 'Incorrect verification code',\n      errorPopupBlocked: 'Please allow pop-ups',\n      errorOAuthFailed: 'Authentication error',\n      errorGeneric: 'An error occurred. Please try again.',\n    },\n  },\n\n  AppConfig: {\n    es: {\n      // Update banner\n      updateAvailable: 'Nueva versión disponible',\n      updateNow: 'Actualizar ahora',\n      clickToUpdate: 'Haz clic aquí para actualizar a la última versión',\n\n      // Maintenance page\n      maintenanceMode: 'Sistema en mantenimiento',\n      maintenanceMessage: 'Estamos realizando mejoras. Vuelve pronto.',\n    },\n    en: {\n      // Update banner\n      updateAvailable: 'New version available',\n      updateNow: 'Update now',\n      clickToUpdate: 'Click here to update to the latest version',\n\n      // Maintenance page\n      maintenanceMode: 'System under maintenance',\n      maintenanceMessage: 'We are making improvements. Come back soon.',\n    },\n  },\n\n  Feedback: {\n    es: {\n      pageUsefulQuestion: '¿Te resultó útil esta página?',\n      commentPlaceholder: 'Cuéntanos cómo podemos mejorar...',\n      thankYouMessage: '¡Gracias por tu feedback!',\n    },\n    en: {\n      pageUsefulQuestion: 'Was this page helpful?',\n      commentPlaceholder: 'Tell us how we can improve...',\n      thankYouMessage: 'Thanks for your feedback!',\n    },\n  },\n\n  ContentReaction: {\n    es: {\n      question: '¿Te resultó útil este contenido?',\n      commentPlaceholder: 'Cuéntanos más (opcional)...',\n      submit: 'Enviar',\n      update: 'Actualizar',\n      thankYou: '¡Gracias por tu opinión!',\n      submitted: 'Tu opinión ha sido registrada',\n      errorSubmitting: 'Error al enviar. Intenta de nuevo.',\n    },\n    en: {\n      question: 'Was this content helpful?',\n      commentPlaceholder: 'Tell us more (optional)...',\n      submit: 'Submit',\n      update: 'Update',\n      thankYou: 'Thanks for your feedback!',\n      submitted: 'Your feedback has been recorded',\n      errorSubmitting: 'Error submitting. Please try again.',\n    },\n  },\n\n  AvatarUpload: {\n    es: {\n      // Actions\n      changePhoto: 'Cambiar foto',\n      viewPhoto: 'Ver foto',\n      cropImage: 'Recortar imagen',\n      confirm: 'Confirmar',\n\n      // Status\n      uploading: 'Subiendo foto...',\n      uploadSuccess: 'Foto actualizada',\n\n      // Errors\n      uploadError: 'Error al subir la imagen',\n      uploadTimeout: 'La subida tardó demasiado. Verifica tu conexión.',\n      networkError: 'Error de red. Verifica tu conexión a internet.',\n      invalidFormat: 'Formato no válido. Usa JPG, PNG o WebP.',\n      fileTooLarge: 'La imagen es muy grande. Máximo 10MB.',\n      loadFailed: 'No se pudo cargar la imagen',\n    },\n    en: {\n      // Actions\n      changePhoto: 'Change photo',\n      viewPhoto: 'View photo',\n      cropImage: 'Crop image',\n      confirm: 'Confirm',\n\n      // Status\n      uploading: 'Uploading photo...',\n      uploadSuccess: 'Photo updated',\n\n      // Errors\n      uploadError: 'Error uploading image',\n      uploadTimeout: 'Upload took too long. Check your connection.',\n      networkError: 'Network error. Check your internet connection.',\n      invalidFormat: 'Invalid format. Use JPG, PNG or WebP.',\n      fileTooLarge: 'Image is too large. Maximum 10MB.',\n      loadFailed: 'Could not load image',\n    },\n  },\n\n  NetworkBanner: {\n    es: {\n      offlineTitle: 'Sin conexión a internet.',\n      offlineBody: 'Algunos servicios podrían no responder. Intenta más tarde.',\n      reconnectedTitle: 'Conexión restablecida.',\n      close: 'Cerrar',\n      closeCountdown: 'Cerrar ({s}s)',\n    },\n    en: {\n      offlineTitle: 'No internet connection.',\n      offlineBody: 'Some services may not respond. Please try again later.',\n      reconnectedTitle: 'Connection restored.',\n      close: 'Close',\n      closeCountdown: 'Close ({s}s)',\n    },\n  },\n  InvitationCard: {\n    es: {\n      accept: 'Aceptar',\n      decline: 'Rechazar',\n    },\n    en: {\n      accept: 'Accept',\n      decline: 'Decline',\n    },\n  },\n};\n","import {\n  EnvironmentProviders,\n  makeEnvironmentProviders,\n  APP_INITIALIZER,\n  PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { I18nConfig, DEFAULT_I18N_CONFIG, ContentStore, LanguagesContent, I18nLang } from './types';\nimport { I18nService } from './i18n.service';\nimport { VALTECH_DEFAULT_CONTENT } from './default-content';\n\n/**\n * Configura el sistema de internacionalización de Valtech Components.\n *\n * @param config Configuración de i18n\n * @returns Providers para agregar en app.config.ts\n *\n * @example\n * // app.config.ts\n * import { provideValtechI18n } from 'valtech-components';\n * import { GLOBAL_CONTENT } from './i18n/_global';\n * import { LOGIN_CONTENT } from './i18n/login.i18n';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideValtechI18n({\n *       defaultLanguage: 'es',\n *       supportedLanguages: ['es', 'en'],\n *       detectBrowserLanguage: true,\n *       content: {\n *         '_global': GLOBAL_CONTENT,\n *         'Login': LOGIN_CONTENT,\n *       }\n *     }),\n *   ]\n * };\n */\nexport function provideValtechI18n(config: I18nConfig = {}): EnvironmentProviders {\n  const mergedConfig = { ...DEFAULT_I18N_CONFIG, ...config };\n\n  return makeEnvironmentProviders([\n    {\n      provide: APP_INITIALIZER,\n      useFactory: (i18n: I18nService, platformId: Object) => {\n        const isBrowser = isPlatformBrowser(platformId);\n        return () => {\n          // Configurar idiomas soportados\n          i18n.setI18nLanguages(mergedConfig.supportedLanguages);\n\n          // Determinar contenido a registrar\n          let contentToRegister: ContentStore = {};\n\n          if (mergedConfig.includeDefaultContent !== false) {\n            // Merge: defaults + user config (user gana)\n            contentToRegister = deepMergeContent(\n              VALTECH_DEFAULT_CONTENT,\n              mergedConfig.content || {}\n            );\n          } else if (mergedConfig.content) {\n            // Solo contenido del usuario\n            contentToRegister = mergedConfig.content;\n          }\n\n          // Registrar contenido\n          if (Object.keys(contentToRegister).length > 0) {\n            i18n.registerContentBulk(contentToRegister);\n          }\n\n          // Aplicar idioma según configuración\n          if (!mergedConfig.detectBrowserLanguage) {\n            // Sin detección de navegador: forzar idioma por defecto\n            i18n.setLanguage(mergedConfig.defaultLanguage);\n          } else if (!isBrowser) {\n            // SSR: sin localStorage/navigator → forzar default. El cliente\n            // re-evaluará en hydrate vía I18nService.loadStoredLanguage().\n            i18n.setLanguage(mergedConfig.defaultLanguage);\n          } else {\n            // Con detección: re-evaluar ahora que supportedLanguages está configurado\n            const stored = localStorage.getItem('app_lang');\n            if (!stored || !mergedConfig.supportedLanguages.includes(stored as I18nLang)) {\n              const browserLang = navigator.language.split('-')[0] as I18nLang;\n              if (mergedConfig.supportedLanguages.includes(browserLang)) {\n                i18n.setLanguage(browserLang);\n              } else {\n                i18n.setLanguage(mergedConfig.defaultLanguage);\n              }\n            }\n          }\n        };\n      },\n      deps: [I18nService, PLATFORM_ID],\n      multi: true,\n    },\n  ]);\n}\n\n/**\n * Deep merge de ContentStore.\n * El contenido de `override` sobrescribe keys específicas de `base`.\n *\n * @param base - Contenido base (defaults de valtech-components)\n * @param override - Contenido del usuario que sobrescribe\n * @returns ContentStore mergeado\n *\n * @example\n * const base = { _global: { es: { ok: 'Aceptar' } } };\n * const override = { _global: { es: { ok: 'Dale' } } };\n * // Resultado: { _global: { es: { ok: 'Dale' } } }\n */\nfunction deepMergeContent(base: ContentStore, override: ContentStore): ContentStore {\n  const result: ContentStore = {};\n\n  // Copiar todos los namespaces del base\n  for (const namespace of Object.keys(base)) {\n    result[namespace] = deepMergeLanguagesContent(base[namespace], {});\n  }\n\n  // Mergear namespaces del override\n  for (const namespace of Object.keys(override)) {\n    if (result[namespace]) {\n      // Namespace existe en base, hacer deep merge\n      result[namespace] = deepMergeLanguagesContent(result[namespace], override[namespace]);\n    } else {\n      // Namespace nuevo, copiar completo\n      result[namespace] = deepMergeLanguagesContent({}, override[namespace]);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Deep merge de LanguagesContent (un namespace).\n */\nfunction deepMergeLanguagesContent(\n  base: LanguagesContent,\n  override: LanguagesContent\n): LanguagesContent {\n  const result: LanguagesContent = {};\n  const allLangs = new Set([\n    ...Object.keys(base),\n    ...Object.keys(override),\n  ]) as Set<I18nLang>;\n\n  for (const lang of allLangs) {\n    result[lang] = {\n      ...(base[lang] || {}),\n      ...(override[lang] || {}),\n    };\n  }\n\n  return result;\n}\n","// Types\nexport {\n  I18nLang,\n  LanguagesContent,\n  ContentStore,\n  I18nConfig,\n  LANG_STORAGE_KEY,\n} from './types';\n\n// Service\nexport { I18nService } from './i18n.service';\n\n// Helper\nexport {\n  InputI18nHelper,\n  InputMetadataWithI18n,\n  FormMetadataWithI18n,\n  FormSectionWithI18n,\n  ButtonMetadataWithI18n,\n} from './input-i18n.helper';\n\n// Pipe\nexport { TranslatePipe } from './translate.pipe';\n\n// Config\nexport { provideValtechI18n } from './config';\n\n// Default content\nexport { VALTECH_DEFAULT_CONTENT } from './default-content';\n","import { Color } from '@ionic/core';\n\n/**\n * Button configuration for confirmation dialog.\n */\nexport interface ConfirmationButton {\n  /** Button text */\n  text: string;\n  /** Button role */\n  role?: 'cancel' | 'destructive' | 'confirm';\n  /** Button color (Ionic color) */\n  color?: Color;\n  /** CSS class for the button */\n  cssClass?: string;\n  /** Handler function called when button is clicked */\n  handler?: () => void | Promise<void> | boolean | Promise<boolean>;\n}\n\n/**\n * Metadata for the confirmation dialog.\n */\nexport interface ConfirmationDialogMetadata {\n  /** Dialog title */\n  title: string;\n  /** Dialog message/content */\n  message: string;\n  /** Confirm button configuration */\n  confirmButton?: ConfirmationButton;\n  /** Cancel button configuration */\n  cancelButton?: ConfirmationButton;\n  /** Additional buttons (between cancel and confirm) */\n  extraButtons?: ConfirmationButton[];\n  /** Allow dismissing by clicking backdrop */\n  backdropDismiss?: boolean;\n  /** CSS class(es) for the alert */\n  cssClass?: string | string[];\n  /** Alert mode */\n  mode?: 'ios' | 'md';\n  /** Unique token identifier */\n  token?: string;\n  /** Translucent backdrop */\n  translucent?: boolean;\n  /** Animated transitions */\n  animated?: boolean;\n  /** Header subtitle */\n  subHeader?: string;\n}\n\n/**\n * Result from confirmation dialog.\n */\nexport interface ConfirmationResult {\n  /** Whether the dialog was confirmed */\n  confirmed: boolean;\n  /** The role of the button clicked */\n  role?: string;\n  /** Any data returned */\n  data?: any;\n}\n\n/**\n * Default confirmation dialog options.\n */\nexport const DEFAULT_CONFIRM_BUTTON: ConfirmationButton = {\n  text: 'Confirm',\n  role: 'confirm',\n  color: 'primary',\n};\n\nexport const DEFAULT_CANCEL_BUTTON: ConfirmationButton = {\n  text: 'Cancel',\n  role: 'cancel',\n  color: 'medium',\n};\n","import { Injectable, inject } from '@angular/core';\nimport { AlertController } from '@ionic/angular/standalone';\nimport {\n  ConfirmationDialogMetadata,\n  ConfirmationResult,\n  ConfirmationButton,\n  DEFAULT_CONFIRM_BUTTON,\n  DEFAULT_CANCEL_BUTTON,\n} from './types';\n\n/**\n * Service for displaying confirmation dialogs.\n *\n * @example Basic usage\n * const result = await confirmationService.confirm({\n *   title: 'Delete Item',\n *   message: 'Are you sure you want to delete this item?',\n * });\n *\n * if (result.confirmed) {\n *   // User confirmed\n * }\n *\n * @example Custom buttons\n * const result = await confirmationService.confirm({\n *   title: 'Save Changes',\n *   message: 'Do you want to save your changes before leaving?',\n *   confirmButton: { text: 'Save', color: 'success' },\n *   cancelButton: { text: 'Discard', color: 'danger' },\n *   extraButtons: [{ text: 'Cancel', role: 'cancel' }]\n * });\n *\n * @example Destructive action\n * const result = await confirmationService.confirmDestructive({\n *   title: 'Delete Account',\n *   message: 'This action cannot be undone. Are you sure?',\n * });\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConfirmationDialogService {\n  private alertController = inject(AlertController);\n\n  /**\n   * Shows a confirmation dialog and returns the result.\n   * @param options - Configuration for the dialog\n   * @returns Promise resolving to the confirmation result\n   */\n  async confirm(options: ConfirmationDialogMetadata): Promise<ConfirmationResult> {\n    const buttons = this.buildButtons(options);\n\n    // Default: usa val-alert (estilo iOS dark unificado de la lib)\n    const userClasses = options.cssClass\n      ? Array.isArray(options.cssClass)\n        ? options.cssClass\n        : [options.cssClass]\n      : [];\n    const cssClass = ['val-alert', ...userClasses];\n\n    const alert = await this.alertController.create({\n      header: options.title,\n      subHeader: options.subHeader,\n      message: options.message,\n      buttons,\n      backdropDismiss: options.backdropDismiss ?? false,\n      cssClass,\n      mode: options.mode ?? 'ios',\n      translucent: options.translucent ?? true,\n      animated: options.animated ?? true,\n    });\n\n    await alert.present();\n    const { role, data } = await alert.onDidDismiss();\n\n    // 'destructive' es semánticamente una confirmación (acción peligrosa\n    // tomada por el user). 'cancel' o backdrop dismiss → no confirmado.\n    return {\n      confirmed: role === 'confirm' || role === 'destructive',\n      role,\n      data,\n    };\n  }\n\n  /**\n   * Shows a simple confirmation dialog with default buttons.\n   * @param title - Dialog title\n   * @param message - Dialog message\n   * @returns Promise resolving to true if confirmed, false otherwise\n   */\n  async confirmSimple(title: string, message: string): Promise<boolean> {\n    const result = await this.confirm({ title, message });\n    return result.confirmed;\n  }\n\n  /**\n   * Shows a destructive action confirmation with red confirm button.\n   * @param options - Configuration for the dialog\n   * @returns Promise resolving to the confirmation result\n   */\n  async confirmDestructive(\n    options: Omit<ConfirmationDialogMetadata, 'confirmButton'> & {\n      confirmButton?: Partial<ConfirmationButton>;\n    }\n  ): Promise<ConfirmationResult> {\n    // Visualmente idéntico a confirm() — sin colores, solo cambia el role\n    // semánticamente a 'destructive' para a11y/screen readers.\n    return this.confirm({\n      ...options,\n      confirmButton: {\n        text: options.confirmButton?.text || 'Delete',\n        role: 'destructive',\n        ...options.confirmButton,\n      },\n    });\n  }\n\n  /**\n   * Shows an info alert with just an OK button.\n   * @param title - Alert title\n   * @param message - Alert message\n   */\n  async alert(title: string, message: string): Promise<void> {\n    const alert = await this.alertController.create({\n      header: title,\n      message,\n      buttons: [{ text: 'OK', role: 'confirm' }],\n    });\n\n    await alert.present();\n    await alert.onDidDismiss();\n  }\n\n  /**\n   * Shows a three-option dialog (Save, Discard, Cancel).\n   * Common for unsaved changes scenarios.\n   * @param title - Dialog title\n   * @param message - Dialog message\n   * @returns Promise resolving to 'save' | 'discard' | 'cancel'\n   */\n  async confirmSaveDiscard(title: string, message: string): Promise<'save' | 'discard' | 'cancel'> {\n    const alert = await this.alertController.create({\n      header: title,\n      message,\n      backdropDismiss: false,\n      buttons: [\n        {\n          text: 'Cancel',\n          role: 'cancel',\n        },\n        {\n          text: 'Discard',\n          role: 'destructive',\n          cssClass: 'text-danger',\n        },\n        {\n          text: 'Save',\n          role: 'confirm',\n        },\n      ],\n    });\n\n    await alert.present();\n    const { role } = await alert.onDidDismiss();\n\n    if (role === 'confirm') return 'save';\n    if (role === 'destructive') return 'discard';\n    return 'cancel';\n  }\n\n  private buildButtons(options: ConfirmationDialogMetadata): any[] {\n    const buttons: any[] = [];\n\n    // Cancel button — sin color ionic por default (el CSS de val-alert se encarga)\n    const cancelBtn = options.cancelButton || DEFAULT_CANCEL_BUTTON;\n    buttons.push({\n      text: cancelBtn.text,\n      role: cancelBtn.role || 'cancel',\n      cssClass: cancelBtn.cssClass,\n      handler: cancelBtn.handler,\n    });\n\n    // Extra buttons (if any)\n    if (options.extraButtons) {\n      options.extraButtons.forEach(btn => {\n        buttons.push({\n          text: btn.text,\n          role: btn.role,\n          cssClass: btn.cssClass,\n          handler: btn.handler,\n        });\n      });\n    }\n\n    // Confirm button\n    const confirmBtn = options.confirmButton || DEFAULT_CONFIRM_BUTTON;\n    buttons.push({\n      text: confirmBtn.text,\n      role: confirmBtn.role || 'confirm',\n      cssClass: confirmBtn.cssClass,\n      handler: confirmBtn.handler,\n    });\n\n    return buttons;\n  }\n}\n","import { Injectable, Inject, isDevMode, OnDestroy, Optional } from '@angular/core';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { Observable, throwError, of, from, firstValueFrom, Subscription } from 'rxjs';\nimport { tap, catchError, switchMap, map, filter, take } from 'rxjs/operators';\n\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport { AuthStateService } from './auth-state.service';\nimport { TokenService } from './token.service';\nimport { AuthStorageService } from './storage.service';\nimport { AuthSyncService } from './sync.service';\nimport {\n  SigninRequest,\n  SigninResponse,\n  SignupRequest,\n  SignupResponse,\n  VerifyEmailRequest,\n  VerifyEmailResponse,\n  ResendCodeRequest,\n  ResendCodeResponse,\n  MFAVerifyResponse,\n  RefreshResponse,\n  GetPermissionsResponse,\n  GetProfileResponse,\n  UpdateProfileRequest,\n  UpdateProfileResponse,\n  MFASetupResponse,\n  MFAConfirmResponse,\n  MFADisableRequest,\n  MFADisableResponse,\n  ForgotPasswordRequest,\n  ForgotPasswordResponse,\n  ResetPasswordRequest,\n  ResetPasswordResponse,\n  ChangePasswordRequest,\n  ChangePasswordResponse,\n  DeleteAccountRequest,\n  DeleteAccountResponse,\n  SendDeleteAccountCodeResponse,\n  SwitchOrgResponse,\n  MFAMethod,\n  AuthError,\n  AuthSyncEvent,\n  ValtechAuthConfig,\n  RegisterDeviceResponse,\n  EnableNotificationsResult,\n  NotificationPermissionState,\n  RegisterDeviceResult,\n  // TOTP MFA types\n  TOTPSetupResponse,\n  TOTPVerifySetupResponse,\n  TOTPDisableResponse,\n  RegenerateBackupCodesResponse,\n  BackupCodesCountResponse,\n  // OAuth types\n  OAuthProvider,\n  OAuthResult,\n  LinkedProvider,\n  HasPasswordResponse,\n  // Handle types\n  UpdateHandleResponse,\n  CheckHandleResponse,\n  // Avatar types\n  UpdateAvatarRequest,\n  UpdateAvatarResponse,\n  // Email change\n  InitiateEmailChangeRequest,\n  InitiateEmailChangeResponse,\n  ConfirmEmailChangeStep1Request,\n  ConfirmEmailChangeStep1Response,\n  ConfirmEmailChangeStep2Request,\n  ConfirmEmailChangeStep2Response,\n} from './types';\nimport { OAuthService } from './oauth.service';\nimport { FirebaseService, MessagingService } from '../firebase';\nimport { I18nService, I18nLang } from '../i18n';\nimport { Firestore, doc, onSnapshot } from '@angular/fire/firestore';\nimport { ConfirmationDialogService } from '../confirmation-dialog/confirmation-dialog.service';\nimport { interpretError } from '../errors';\n\n/**\n * Servicio principal de autenticación.\n *\n * @example\n * ```typescript\n * import { AuthService } from 'valtech-components';\n *\n * @Component({...})\n * export class LoginComponent {\n *   private auth = inject(AuthService);\n *\n *   async login() {\n *     await firstValueFrom(this.auth.signin({ email, password }));\n *     if (this.auth.mfaPending().required) {\n *       // Mostrar UI de MFA\n *     } else {\n *       this.router.navigate(['/']);\n *     }\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService implements OnDestroy {\n  // Timer para refresh proactivo\n  private refreshTimerId: ReturnType<typeof setTimeout> | null = null;\n  private syncSubscription: Subscription | null = null;\n  private firestoreRBACUnsubscribe: (() => void) | null = null;\n\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private http: HttpClient,\n    private router: Router,\n    private stateService: AuthStateService,\n    private tokenService: TokenService,\n    private storageService: AuthStorageService,\n    private syncService: AuthSyncService,\n    private firebaseService: FirebaseService,\n    private oauthService: OAuthService,\n    @Optional() private messagingService: MessagingService | null,\n    @Optional() private i18nService: I18nService | null,\n    private confirmationService: ConfirmationDialogService,\n    @Optional() private firestoreInstance: Firestore | null\n  ) {\n    if (!this.config && isDevMode()) {\n      console.warn(\n        '[valtech-components] AuthService: provideValtechAuth() no está en main.ts. ' +\n          'Login, registro y sesión no funcionarán.'\n      );\n    }\n  }\n\n  // =============================================\n  // ESTADO PÚBLICO (Signals readonly)\n  // =============================================\n\n  /** Estado completo de autenticación */\n  readonly state = this.stateService.state;\n\n  /** Usuario está autenticado */\n  readonly isAuthenticated = this.stateService.isAuthenticated;\n\n  /** Estado de carga */\n  readonly isLoading = this.stateService.isLoading;\n\n  /** Información del usuario */\n  readonly user = this.stateService.user;\n\n  /** Token de acceso */\n  readonly accessToken = this.stateService.accessToken;\n\n  /** Roles del usuario */\n  readonly roles = this.stateService.roles;\n\n  /** Permisos del usuario */\n  readonly permissions = this.stateService.permissions;\n\n  /** Usuario es super admin */\n  readonly isSuperAdmin = this.stateService.isSuperAdmin;\n\n  /** Estado de MFA pendiente */\n  readonly mfaPending = this.stateService.mfaPending;\n\n  /** Error actual */\n  readonly error = this.stateService.error;\n\n  // =============================================\n  // INICIALIZACIÓN\n  // =============================================\n\n  /**\n   * Inicializa el servicio de autenticación.\n   * Llamado automáticamente por provideValtechAuth.\n   */\n  async initialize(): Promise<void> {\n    // 1. Cargar estado desde storage\n    const storedState = this.storageService.loadState();\n\n    if (storedState.accessToken) {\n      // 2. Verificar si token es válido\n      if (this.tokenService.isTokenValid(storedState.accessToken)) {\n        this.stateService.restoreFromStorage(storedState);\n\n        // Extraer info del token\n        const claims = this.tokenService.parseToken(storedState.accessToken);\n        if (claims) {\n          this.stateService.updateUserInfo(claims.uid, claims.email);\n          if (claims.org) {\n            this.stateService.updateActiveOrg(claims.org);\n          }\n        }\n\n        // 3. Iniciar timer de refresco proactivo\n        this.startRefreshTimer();\n\n        // 4. Re-establecer la sesión de Firebase en bootstrap.\n        // El access token sigue válido, así que NO pasamos por la rama de\n        // refresh — pero la persistencia IndexedDB propia de Firebase Auth no\n        // sobrevive el contenedor de storage de una PWA standalone en iOS.\n        // Sin esto, `firebaseAuthReady` se queda en `false` para siempre y\n        // cualquier listener Firestore (ej. el inbox de notificaciones) cuelga.\n        // Fire-and-forget: NO debe demorar el resolve de initialize().\n        void this.ensureFirebaseSessionOnBootstrap();\n\n        // 5. Listener RBAC Firestore — re-establecer tras reload de página.\n        // handleSuccessfulAuth lo configura en el login inicial, pero no sobrevive\n        // recargas: initialize() restaura el state desde storage pero no el listener.\n        // setupFirestoreRBACSync espera internamente a que Firebase Auth esté lista.\n        if (claims?.uid) {\n          this.setupFirestoreRBACSync(claims.uid);\n        }\n      } else if (storedState.refreshToken) {\n        // 4. Token expirado pero hay refresh token.\n        //\n        // NO bloqueamos el bootstrap esperando la red: un /refresh en una\n        // Lambda fría son 2-5s de pantalla en blanco (Angular no renderiza\n        // nada hasta que el APP_INITIALIZER resuelve).\n        //\n        // Restauración optimista: el access token expiró pero sus claims\n        // (uid/email/roles) siguen decodificables — `parseToken` NO valida\n        // `exp`. Restauramos la sesión desde esos claims para que la app\n        // renderice el shell autenticado de inmediato, y disparamos el\n        // /refresh en segundo plano (fire-and-forget).\n        //\n        // Seguridad de la ventana sub-segundo antes de que el refresh llegue:\n        // cualquier API call sale con el token expirado → 401 → el\n        // authInterceptor refresca + reintenta automáticamente. Si el refresh\n        // de fondo falla → signOut + clearState.\n        console.log('[ValtechAuth] bootstrap — access token expired, refreshing in background');\n        this.stateService.restoreFromStorage(storedState);\n\n        const expiredClaims = this.tokenService.parseToken(storedState.accessToken);\n        if (expiredClaims) {\n          this.stateService.updateUserInfo(expiredClaims.uid, expiredClaims.email);\n          if (expiredClaims.org) {\n            this.stateService.updateActiveOrg(expiredClaims.org);\n          }\n          if (expiredClaims.uid) {\n            this.setupFirestoreRBACSync(expiredClaims.uid);\n          }\n        }\n\n        // Refresh en segundo plano — NO se hace await: initialize() resuelve ya.\n        firstValueFrom(this.refreshAccessToken()).catch(() => {\n          console.warn('[ValtechAuth] bootstrap — background refresh failed, signing out');\n          this.signOutFirebase();\n          this.clearState();\n        });\n      } else {\n        this.signOutFirebase();\n        this.clearState();\n      }\n    }\n\n    // 5. Iniciar sincronización entre pestañas\n    if (this.config?.enableTabSync) {\n      this.syncService.start();\n      this.syncSubscription = this.syncService.onEvent$.subscribe(event =>\n        this.handleSyncEvent(event)\n      );\n    }\n\n    this.stateService.setLoading(false);\n  }\n\n  ngOnDestroy(): void {\n    this.stopRefreshTimer();\n    this.syncSubscription?.unsubscribe();\n    this.teardownFirestoreRBACSync();\n  }\n\n  // =============================================\n  // AUTENTICACIÓN\n  // =============================================\n\n  /**\n   * Inicia sesión con email y contraseña.\n   * Detecta automáticamente la plataforma para identificar dispositivos nuevos.\n   */\n  signin(request: SigninRequest): Observable<SigninResponse> {\n    this.stateService.clearError();\n    this.stateService.clearMFAPending();\n\n    // Agregar info de plataforma para device detection\n    const platformInfo = this.detectPlatformInfo();\n    const enrichedRequest: SigninRequest = {\n      ...request,\n      platform: request.platform ?? platformInfo.platform,\n      browser: request.browser ?? platformInfo.browser,\n      os: request.os ?? platformInfo.os,\n    };\n\n    return this.http.post<SigninResponse>(`${this.baseUrl}/signin`, enrichedRequest).pipe(\n      tap(response => {\n        if (response.mfaRequired) {\n          // MFA requerido - guardar estado temporal\n          this.stateService.setMFAPending({\n            required: true,\n            mfaToken: response.mfaToken!,\n            method: response.mfaMethod!,\n          });\n        } else if (response.accessToken) {\n          // Login exitoso sin MFA\n          this.handleSuccessfulAuth(response);\n\n          // Notificar si es un dispositivo nuevo\n          if (response.isNewDevice) {\n            console.log('[ValtechAuth] New device detected:', response.deviceId);\n          }\n        }\n      }),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  // =============================================\n  // OAUTH (Login social)\n  // =============================================\n\n  /**\n   * Inicia sesión con OAuth (Google, Apple, Microsoft).\n   * Abre un popup para el flujo de autenticación.\n   *\n   * @param provider - Proveedor OAuth ('google', 'apple', 'microsoft')\n   * @returns Observable que emite SigninResponse cuando se completa\n   *\n   * @example\n   * ```typescript\n   * this.auth.signinWithOAuth('google').subscribe({\n   *   next: () => this.router.navigate(['/']),\n   *   error: (err) => console.error('OAuth failed:', err)\n   * });\n   * ```\n   */\n  signinWithOAuth(provider: OAuthProvider): Observable<SigninResponse> {\n    this.stateService.clearError();\n    this.stateService.clearMFAPending();\n\n    return this.oauthService.startFlow(provider).pipe(\n      tap(result => {\n        // MFA requerido tras OAuth — guardar estado temporal, NO autenticar.\n        // El login component reacciona a `mfaPending()` y abre el modal verify.\n        if (result.mfaRequired) {\n          this.stateService.setMFAPending({\n            required: true,\n            mfaToken: result.mfaToken!,\n            method: result.mfaMethod!,\n          });\n          return;\n        }\n\n        // Convertir OAuthResult a SigninResponse compatible\n        const response: SigninResponse = {\n          operationId: 'oauth',\n          accessToken: result.accessToken,\n          refreshToken: result.refreshToken,\n          firebaseToken: result.firebaseToken,\n          expiresIn: result.expiresIn,\n          roles: result.roles,\n          permissions: result.permissions,\n        };\n        this.handleSuccessfulAuth(response);\n      }),\n      map(result =>\n        result.mfaRequired\n          ? ({\n              operationId: 'oauth',\n              mfaRequired: true,\n              mfaToken: result.mfaToken,\n              mfaMethod: result.mfaMethod,\n            } as SigninResponse)\n          : ({\n              operationId: 'oauth',\n              accessToken: result.accessToken,\n              refreshToken: result.refreshToken,\n              firebaseToken: result.firebaseToken,\n              expiresIn: result.expiresIn,\n              roles: result.roles,\n              permissions: result.permissions,\n            } as SigninResponse)\n      ),\n      catchError(error => {\n        const authError: AuthError = {\n          code: error.code || 'OAUTH_ERROR',\n          message: error.message || 'Error de autenticación OAuth',\n        };\n        this.stateService.setError(authError);\n        return throwError(() => authError);\n      })\n    );\n  }\n\n  /**\n   * Vincula un proveedor OAuth adicional a la cuenta actual.\n   * Requiere que el usuario esté autenticado.\n   *\n   * @param provider - Proveedor OAuth a vincular\n   */\n  linkOAuthProvider(provider: OAuthProvider): Observable<{ success: boolean }> {\n    return this.oauthService.startLinkFlow(provider).pipe(\n      map(() => ({ success: true })),\n      catchError(error => {\n        const authError: AuthError = {\n          code: error.code || 'LINK_ERROR',\n          message: error.message || 'Error al vincular proveedor',\n        };\n        this.stateService.setError(authError);\n        return throwError(() => authError);\n      })\n    );\n  }\n\n  /**\n   * Obtiene los proveedores OAuth vinculados al usuario.\n   */\n  getLinkedProviders(): Observable<LinkedProvider[]> {\n    return this.oauthService.getLinkedProviders();\n  }\n\n  /**\n   * Desvincula un proveedor OAuth de la cuenta.\n   *\n   * @param provider - Proveedor a desvincular\n   */\n  unlinkOAuthProvider(provider: OAuthProvider): Observable<{ success: boolean }> {\n    return this.oauthService.unlinkProvider(provider);\n  }\n\n  /**\n   * Establece contraseña para usuarios que solo tienen OAuth.\n   * Permite que usuarios OAuth-only puedan también usar email/password.\n   *\n   * @param password - Nueva contraseña\n   */\n  setPasswordForOAuthUser(password: string): Observable<{ success: boolean }> {\n    return this.oauthService.setPassword(password);\n  }\n\n  /**\n   * Verifica si el usuario tiene contraseña establecida.\n   * Útil para mostrar/ocultar opciones de cambio de contraseña.\n   */\n  checkHasPassword(): Observable<HasPasswordResponse> {\n    return this.oauthService.hasPassword();\n  }\n\n  /**\n   * Registra un nuevo usuario.\n   * El usuario queda en estado PENDING hasta verificar su email.\n   */\n  signup(request: SignupRequest): Observable<SignupResponse> {\n    this.stateService.clearError();\n\n    return this.http\n      .post<SignupResponse>(`${this.baseUrl}/signup`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Verifica email con código de 6 dígitos.\n   * Si es exitoso, hace auto-login y retorna tokens.\n   */\n  verifyEmail(request: VerifyEmailRequest): Observable<VerifyEmailResponse> {\n    this.stateService.clearError();\n\n    return this.http.post<VerifyEmailResponse>(`${this.baseUrl}/verify-email`, request).pipe(\n      tap(response => {\n        if (response.verified && response.accessToken) {\n          // Auto-login: guardar tokens y actualizar estado\n          this.handleSuccessfulAuth(response as unknown as SigninResponse);\n        }\n      }),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  /**\n   * Reenvía código de verificación al email.\n   */\n  resendCode(request: ResendCodeRequest): Observable<ResendCodeResponse> {\n    return this.http\n      .post<ResendCodeResponse>(`${this.baseUrl}/resend-code`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Verifica código MFA.\n   */\n  verifyMFA(code: string): Observable<MFAVerifyResponse> {\n    const mfaState = this.mfaPending();\n    if (!mfaState.mfaToken) {\n      return throwError(() => ({\n        code: 'MFA_NOT_PENDING',\n        message: 'No hay verificación MFA pendiente',\n      }));\n    }\n\n    return this.http\n      .post<MFAVerifyResponse>(`${this.baseUrl}/mfa/verify`, {\n        mfaToken: mfaState.mfaToken,\n        code,\n      })\n      .pipe(\n        tap(response => {\n          this.stateService.clearMFAPending();\n          this.handleSuccessfulAuth(response);\n        }),\n        catchError(error => this.handleAuthError(error))\n      );\n  }\n\n  /**\n   * Refresca el token de acceso.\n   * Implementa token rotation: cada refresh genera un nuevo refresh token\n   * que el cliente debe guardar para el próximo refresh.\n   */\n  refreshAccessToken(): Observable<RefreshResponse> {\n    const refreshToken = this.state().refreshToken;\n    if (!refreshToken) {\n      return throwError(() => ({\n        code: 'NO_REFRESH_TOKEN',\n        message: 'No hay token de refresco',\n      }));\n    }\n\n    return this.http.post<RefreshResponse>(`${this.baseUrl}/refresh`, { refreshToken }).pipe(\n      tap(response => {\n        const expiresAt = Date.now() + response.expiresIn * 1000;\n\n        // Token rotation: guardar nuevo access token Y refresh token\n        this.stateService.updateAccessToken(response.accessToken, response.expiresIn);\n        this.stateService.updateRefreshToken(response.refreshToken); // NUEVO: guardar refresh rotado\n        this.storageService.saveAccessToken(response.accessToken, expiresAt);\n        this.storageService.saveRefreshToken(response.refreshToken); // NUEVO: persistir refresh rotado\n\n        if (this.config?.enableFirebaseIntegration && response.firebaseToken) {\n          this.signInWithFirebase(response.firebaseToken);\n        }\n\n        this.startRefreshTimer();\n        this.syncService.broadcast({\n          type: 'TOKEN_REFRESH',\n          payload: {\n            accessToken: response.accessToken,\n            refreshToken: response.refreshToken, // NUEVO: sincronizar entre tabs\n            expiresAt,\n          },\n        });\n      }),\n      catchError(error => {\n        this.logout();\n        return throwError(() => error);\n      })\n    );\n  }\n\n  /**\n   * Maneja autenticación exitosa desde fuentes externas (OAuth, etc).\n   * Guarda tokens, actualiza estado, inicia Firebase si corresponde.\n   *\n   * @param authResult - Resultado de autenticación con tokens\n   *\n   * @example\n   * ```typescript\n   * // Desde un flujo OAuth externo\n   * externalOAuth.signIn().subscribe({\n   *   next: (result) => {\n   *     this.authService.setExternalAuth(result);\n   *   }\n   * });\n   * ```\n   */\n  setExternalAuth(authResult: {\n    accessToken: string;\n    refreshToken: string;\n    firebaseToken?: string;\n    expiresIn: number;\n    roles?: string[];\n    permissions?: string[];\n  }): void {\n    this.handleSuccessfulAuth({\n      ...authResult,\n      operationId: 'external-auth',\n      tokenType: 'Bearer',\n    } as SigninResponse);\n  }\n\n  /**\n   * Cierra sesión tras pedir confirmación al usuario.\n   *\n   * Muestra un diálogo nativo (estilo destructivo). Si el usuario confirma,\n   * ejecuta `logout()`. Si cancela, no pasa nada.\n   *\n   * Texto por defecto desde `_global` i18n: `logoutConfirmTitle`,\n   * `logoutConfirmMessage`, `logout`, `cancel`. Override via `opts`.\n   *\n   * @returns true si el usuario confirmó (logout ejecutado), false si canceló.\n   *\n   * @example\n   * onLogoutClick() { this.auth.logoutWithConfirmation(); }\n   */\n  async logoutWithConfirmation(opts?: {\n    title?: string;\n    message?: string;\n    confirmText?: string;\n    cancelText?: string;\n  }): Promise<boolean> {\n    const t = (key: string, fallback: string) => this.i18nService?.t(key) || fallback;\n    const result = await this.confirmationService.confirmDestructive({\n      title: opts?.title ?? t('logoutConfirmTitle', 'Cerrar sesión'),\n      message: opts?.message ?? t('logoutConfirmMessage', '¿Seguro que deseas cerrar sesión?'),\n      confirmButton: { text: opts?.confirmText ?? t('logout', 'Cerrar sesión') },\n      cancelButton: { text: opts?.cancelText ?? t('cancel', 'Cancelar') },\n    });\n\n    if (result.confirmed) {\n      await this.logout();\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Cierra sesión.\n   */\n  async logout(): Promise<void> {\n    const refreshToken = this.state().refreshToken;\n\n    // Eliminar dispositivo del backend antes de cerrar sesión\n    await this.unregisterDevice();\n\n    // Notificar al backend (fire and forget)\n    if (refreshToken) {\n      this.http\n        .post(`${this.baseUrl}/logout`, { refreshToken })\n        .pipe(catchError(() => of(null)))\n        .subscribe();\n    }\n\n    // Cerrar sesión de Firebase si está integrado\n    this.signOutFirebase();\n\n    this.clearState();\n    this.syncService.broadcast({ type: 'LOGOUT' });\n    this.router.navigate([this.config?.loginRoute]);\n  }\n\n  // =============================================\n  // MFA SETUP (usuario autenticado)\n  // =============================================\n\n  /**\n   * Configura MFA para el usuario.\n   */\n  setupMFA(method: MFAMethod, phone?: string): Observable<MFASetupResponse> {\n    return this.http\n      .post<MFASetupResponse>(`${this.baseUrl}/mfa/setup`, { method, phone })\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Confirma la configuración de MFA.\n   */\n  confirmMFA(code: string): Observable<MFAConfirmResponse> {\n    return this.http\n      .post<MFAConfirmResponse>(`${this.baseUrl}/mfa/confirm`, { code })\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Deshabilita MFA. Acepta `password` o `mfaCode` (uno requerido).\n   * `mfaCode` es para usuarios OAuth-only con TOTP que no tienen contraseña.\n   */\n  disableMFA(input: MFADisableRequest): Observable<MFADisableResponse> {\n    return this.http\n      .post<MFADisableResponse>(`${this.baseUrl}/mfa/disable`, input)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  sendMFADisableCode(): Observable<{ operationId: string }> {\n    return this.http\n      .post<{ operationId: string }>(`${this.baseUrl}/mfa/disable-code`, {})\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  // =============================================\n  // TOTP MFA (Google Authenticator)\n  // =============================================\n\n  /**\n   * Inicia configuración de TOTP MFA.\n   * Retorna el secreto, URL para QR code y códigos de respaldo.\n   */\n  setupTOTP(): Observable<TOTPSetupResponse> {\n    return this.http\n      .post<TOTPSetupResponse>(`${this.baseUrl}/mfa/totp/setup`, {})\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Verifica el código TOTP y activa MFA.\n   * Debe llamarse después de setupTOTP con el código del authenticator.\n   */\n  verifyTOTPSetup(code: string): Observable<TOTPVerifySetupResponse> {\n    return this.http\n      .post<TOTPVerifySetupResponse>(`${this.baseUrl}/mfa/totp/verify`, { code })\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Regenera los códigos de respaldo TOTP.\n   * Los códigos anteriores son invalidados.\n   */\n  regenerateBackupCodes(): Observable<RegenerateBackupCodesResponse> {\n    return this.http\n      .post<RegenerateBackupCodesResponse>(`${this.baseUrl}/mfa/totp/backup-codes`, {})\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Obtiene la cantidad de códigos de respaldo restantes.\n   */\n  getBackupCodesCount(): Observable<BackupCodesCountResponse> {\n    return this.http\n      .get<BackupCodesCountResponse>(`${this.baseUrl}/mfa/totp/backup-codes/count`)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Desactiva TOTP MFA (requiere contraseña).\n   */\n  disableTOTP(password: string): Observable<TOTPDisableResponse> {\n    return this.http\n      .post<TOTPDisableResponse>(`${this.baseUrl}/mfa/totp/disable`, { password })\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  // =============================================\n  // ORGANIZACIONES\n  // =============================================\n\n  /**\n   * Cambia la organización activa del usuario.\n   * Genera un nuevo Firebase token con el activeOrg actualizado.\n   *\n   * @param organizationId - ID de la organización a la que cambiar\n   * @returns Observable con el nuevo Firebase token y activeOrg\n   *\n   * @example\n   * ```typescript\n   * await firstValueFrom(this.auth.switchOrg('org_xyz789'));\n   * // Firebase ya está re-autenticado con la nueva org\n   * const activeOrg = await this.firebase.getActiveOrg();\n   * ```\n   */\n  switchOrg(organizationId: string): Observable<SwitchOrgResponse> {\n    return this.http.post<SwitchOrgResponse>(`${this.baseUrl}/switch-org`, { organizationId }).pipe(\n      switchMap(response => {\n        // Re-autenticar en Firebase con el nuevo token\n        // Usar switchMap + from para esperar a que Firebase complete\n        const firebaseAuth$ = response.firebaseToken\n          ? from(this.signInWithFirebase(response.firebaseToken))\n          : of(undefined);\n\n        return firebaseAuth$.pipe(\n          tap(() => {\n            // Actualizar activeOrg en el state local\n            this.stateService.updateActiveOrg(response.activeOrg);\n            // Persistir el nuevo access token (incluye activeOrg actualizado).\n            // Sin esto, el bootstrap post-refresh usa el JWT cacheado con la org anterior.\n            if (response.accessToken) {\n              const expiresAt = Date.now() + (response.expiresIn ?? 900) * 1000;\n              this.stateService.updateAccessToken(response.accessToken, response.expiresIn ?? 900);\n              this.storageService.saveAccessToken(response.accessToken, expiresAt);\n            }\n            // Notificar cambio a otras pestañas\n            this.syncService.broadcast({\n              type: 'ORG_SWITCH',\n              payload: { activeOrg: response.activeOrg },\n            });\n          }),\n          // Retornar response original después de que Firebase complete\n          map(() => response)\n        );\n      }),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  // =============================================\n  // PERFIL DE USUARIO\n  // =============================================\n\n  /**\n   * Obtiene el perfil del usuario autenticado.\n   * Incluye información de MFA y teléfono. Hidrata el state automáticamente\n   * con `name/handle/avatarUrl/phone` para que `auth.user()` los retorne.\n   */\n  getProfile(): Observable<GetProfileResponse> {\n    return this.http.get<GetProfileResponse>(`${this.baseUrl}/profile`).pipe(\n      tap(profile =>\n        this.stateService.updateProfileFields({\n          name: profile.name,\n          handle: profile.handle ?? null,\n          avatarUrl: profile.avatarUrl ?? null,\n          phone: profile.phone ?? null,\n        })\n      ),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  /**\n   * Actualiza el perfil del usuario. Sincroniza state con los nuevos values\n   * (name/phone) — el backend response no los echo'a pero el caller ya tiene\n   * los valores que mandó.\n   */\n  updateProfile(request: UpdateProfileRequest): Observable<UpdateProfileResponse> {\n    return this.http.put<UpdateProfileResponse>(`${this.baseUrl}/profile`, request).pipe(\n      tap(() => this.stateService.updateProfileFields(request)),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  /**\n   * Actualiza el avatar del usuario en el backend. Sincroniza state con el\n   * `avatarUrl` retornado para que el header / dashboard se refresquen sin\n   * necesidad de un getProfile adicional.\n   */\n  updateAvatar(request: UpdateAvatarRequest): Observable<UpdateAvatarResponse> {\n    return this.http.put<UpdateAvatarResponse>(`${this.baseUrl}/profile/avatar`, request).pipe(\n      tap(res => this.stateService.updateProfileFields({ avatarUrl: res.avatarUrl })),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  // =============================================\n  // RECUPERACIÓN DE CONTRASEÑA\n  // =============================================\n\n  /**\n   * Inicia el proceso de recuperación de contraseña.\n   * Envía un código al email del usuario.\n   */\n  forgotPassword(request: ForgotPasswordRequest): Observable<ForgotPasswordResponse> {\n    return this.http\n      .post<ForgotPasswordResponse>(`${this.baseUrl}/forgot-password`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Resetea la contraseña usando el código enviado por email.\n   */\n  resetPassword(request: ResetPasswordRequest): Observable<ResetPasswordResponse> {\n    return this.http\n      .post<ResetPasswordResponse>(`${this.baseUrl}/reset-password`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Cambia la contraseña del usuario autenticado.\n   * Requiere la contraseña actual para verificación.\n   */\n  changePassword(currentPassword: string, newPassword: string): Observable<ChangePasswordResponse> {\n    const request: ChangePasswordRequest = { currentPassword, newPassword };\n    return this.http\n      .post<ChangePasswordResponse>(`${this.baseUrl}/change-password`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  // =============================================\n  // CAMBIO DE EMAIL — flujo de 3 pasos\n  // =============================================\n\n  initiateEmailChange(\n    currentPassword: string,\n    newEmail: string\n  ): Observable<InitiateEmailChangeResponse> {\n    const request: InitiateEmailChangeRequest = { currentPassword, newEmail };\n    return this.http\n      .post<InitiateEmailChangeResponse>(`${this.baseUrl}/email/initiate`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  confirmEmailChangeStep1(code: string): Observable<ConfirmEmailChangeStep1Response> {\n    const request: ConfirmEmailChangeStep1Request = { code };\n    return this.http\n      .post<ConfirmEmailChangeStep1Response>(`${this.baseUrl}/email/confirm/1`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  confirmEmailChangeStep2(code: string): Observable<ConfirmEmailChangeStep2Response> {\n    const request: ConfirmEmailChangeStep2Request = { code };\n    return this.http\n      .post<ConfirmEmailChangeStep2Response>(`${this.baseUrl}/email/confirm/2`, request)\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  // =============================================\n  // ELIMINACIÓN DE CUENTA\n  // =============================================\n\n  /**\n   * Elimina la cuenta del usuario (soft delete).\n   * Requiere confirmación de contraseña por seguridad.\n   * Después de eliminar, cierra sesión automáticamente.\n   *\n   * @param password - Contraseña actual para confirmar\n   * @returns Observable con resultado de la eliminación\n   *\n   * @example\n   * ```typescript\n   * async confirmDeleteAccount(password: string) {\n   *   try {\n   *     const result = await firstValueFrom(this.auth.deleteAccount(password));\n   *     console.log(result.message); // \"Tu cuenta ha sido eliminada...\"\n   *     // Usuario es redirigido automáticamente al login\n   *   } catch (error) {\n   *     // Manejar error (contraseña incorrecta, etc)\n   *   }\n   * }\n   * ```\n   */\n  /**\n   * Envía un código OTP al email del usuario para confirmar la eliminación.\n   * Solo aplica a usuarios OAuth sin contraseña (`hasPassword() === false`).\n   */\n  sendDeleteAccountCode(): Observable<SendDeleteAccountCodeResponse> {\n    return this.http\n      .post<SendDeleteAccountCodeResponse>(`${this.baseUrl}/account/delete-code`, {})\n      .pipe(catchError(error => this.handleAuthError(error)));\n  }\n\n  /**\n   * Elimina la cuenta del usuario (soft delete).\n   * - Usuarios con contraseña: pasar `{ password }`.\n   * - Usuarios OAuth sin contraseña: pasar `{ code }` (obtenido via sendDeleteAccountCode).\n   * Después de eliminar, cierra sesión y redirige al login automáticamente.\n   */\n  deleteAccount(credentials: {\n    password?: string;\n    code?: string;\n  }): Observable<DeleteAccountResponse> {\n    return this.http\n      .delete<DeleteAccountResponse>(`${this.baseUrl}/account`, { body: credentials })\n      .pipe(\n        tap(response => {\n          if (response.deleted) {\n            // Limpiar estado y cerrar sesión sin notificar al backend\n            // (la sesión ya fue revocada por el backend)\n            this.signOutFirebase();\n            this.clearState();\n            this.syncService.broadcast({ type: 'LOGOUT' });\n            this.router.navigate([this.config?.loginRoute]);\n          }\n        }),\n        catchError(error => this.handleAuthError(error))\n      );\n  }\n\n  // =============================================\n  // PERMISOS\n  // =============================================\n\n  /**\n   * Obtiene los permisos actualizados del backend.\n   */\n  fetchPermissions(): Observable<GetPermissionsResponse> {\n    return this.http.get<GetPermissionsResponse>(`${this.baseUrl}/permissions`).pipe(\n      tap(response => {\n        this.stateService.updatePermissions(\n          response.roles,\n          response.permissions,\n          response.isSuperAdmin\n        );\n        this.storageService.savePermissions(response);\n        this.syncService.broadcast({ type: 'PERMISSIONS_UPDATE' });\n      }),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  /**\n   * Verifica si el usuario tiene un permiso específico.\n   * Formato: \"resource:action\" (ej: \"templates:edit\")\n   */\n  hasPermission(permission: string): boolean {\n    if (this.isSuperAdmin()) return true;\n\n    const [resource, action] = permission.split(':');\n    return this.permissions().some(p => {\n      const [pResource, pAction] = p.split(':');\n      return (\n        (pResource === '*' || pResource === resource) && (pAction === '*' || pAction === action)\n      );\n    });\n  }\n\n  /**\n   * Verifica si el usuario tiene alguno de los permisos dados.\n   */\n  hasAnyPermission(permissions: string[]): boolean {\n    return permissions.some(p => this.hasPermission(p));\n  }\n\n  /**\n   * Verifica si el usuario tiene todos los permisos dados.\n   */\n  hasAllPermissions(permissions: string[]): boolean {\n    return permissions.every(p => this.hasPermission(p));\n  }\n\n  /**\n   * Verifica si el usuario tiene un rol específico.\n   */\n  hasRole(role: string): boolean {\n    return this.roles().some(r => r.toLowerCase() === role.toLowerCase());\n  }\n\n  // =============================================\n  // HANDLE (USERNAME)\n  // =============================================\n\n  /**\n   * Actualiza el handle (@username) del usuario.\n   * @param handle - Nuevo handle (sin @, ej: \"victorv\")\n   */\n  updateHandle(handle: string): Observable<UpdateHandleResponse> {\n    return this.http.put<UpdateHandleResponse>(`${this.baseUrl}/profile/handle`, { handle }).pipe(\n      tap(() => this.stateService.updateProfileFields({ handle })),\n      catchError(error => this.handleAuthError(error))\n    );\n  }\n\n  /**\n   * Verifica si un handle está disponible.\n   * @param handle - Handle a verificar (sin @)\n   */\n  checkHandleAvailability(handle: string): Observable<CheckHandleResponse> {\n    // Server response: { operationId, user?, found }. found=true → handle taken.\n    // Lib semantic: available = !found.\n    return this.http\n      .get<{\n        operationId: string;\n        found: boolean;\n      }>(`${this.usersBaseUrl}/handle/${encodeURIComponent(handle)}`)\n      .pipe(\n        map(raw => ({\n          operationId: raw.operationId,\n          handle,\n          available: !raw.found,\n        })),\n        catchError(error => this.handleAuthError(error))\n      );\n  }\n\n  // =============================================\n  // PRIVATE METHODS\n  // =============================================\n\n  private get baseUrl(): string {\n    return `${this.config?.apiUrl}${this.config?.authPrefix}`;\n  }\n\n  /** Base for /v2/users endpoints (separate from /v2/auth). */\n  private get usersBaseUrl(): string {\n    return `${this.config?.apiUrl}/v2/users`;\n  }\n\n  private handleSuccessfulAuth(response: SigninResponse | MFAVerifyResponse): void {\n    const expiresAt = Date.now() + response.expiresIn! * 1000;\n    const tokenData = this.tokenService.parseToken(response.accessToken!);\n    const isPremium = tokenData?.premium === true;\n\n    this.stateService.setAuthenticated({\n      accessToken: response.accessToken!,\n      refreshToken: response.refreshToken!,\n      userId: tokenData?.uid,\n      email: tokenData?.email,\n      roles: response.roles || [],\n      permissions: response.permissions || [],\n      isSuperAdmin: response.permissions?.includes('*:*') || false,\n      isPremium,\n      expiresAt,\n    });\n\n    if (tokenData?.org) {\n      this.stateService.updateActiveOrg(tokenData.org);\n    }\n\n    this.storageService.saveState({\n      accessToken: response.accessToken!,\n      refreshToken: response.refreshToken!,\n      roles: response.roles || [],\n      permissions: response.permissions || [],\n      isSuperAdmin: response.permissions?.includes('*:*') || false,\n      isPremium,\n      expiresAt,\n    });\n\n    this.startRefreshTimer();\n    this.syncService.broadcast({ type: 'LOGIN' });\n\n    // Integración con Firebase\n    console.log('[ValtechAuth] handleSuccessfulAuth - Firebase check:', {\n      enableFirebaseIntegration: this.config?.enableFirebaseIntegration,\n      hasFirebaseTokenKey: 'firebaseToken' in response,\n      firebaseTokenValue: !!(response as any).firebaseToken,\n      firebaseTokenLength: (response as any).firebaseToken?.length || 0,\n    });\n\n    if (\n      this.config?.enableFirebaseIntegration &&\n      'firebaseToken' in response &&\n      response.firebaseToken\n    ) {\n      console.log(\n        '[ValtechAuth] Calling signInWithFirebase with token length:',\n        response.firebaseToken.length\n      );\n      this.signInWithFirebase(response.firebaseToken);\n    } else if (this.config?.enableFirebaseIntegration) {\n      // El login NO trajo firebaseToken (ej. flujo OAuth que lo perdió). En vez\n      // de quedar sin sesión de Firebase, recurrimos al fallback self-healing:\n      // /refresh sí devuelve un firebaseToken confiable.\n      console.log('[FBAuth] login response sin firebaseToken → recurriendo a fallback /refresh');\n      void this.reestablishFirebaseViaRefresh('login-missing-firebase-token');\n    } else {\n      console.log('[ValtechAuth] Firebase signin skipped - integración Firebase desactivada');\n    }\n\n    // Registro automático de dispositivo para push notifications\n    if (this.config?.enableDeviceRegistration) {\n      this.registerDeviceIfNeeded(); // fire-and-forget\n    }\n\n    // Sincronizar idioma del usuario con i18n\n    if (this.i18nService && 'language' in response && response.language) {\n      const userLang = response.language as I18nLang;\n      const currentLang = this.i18nService.lang();\n      if (userLang !== currentLang) {\n        this.i18nService.setLanguage(userLang);\n        console.log(`[ValtechAuth] Language synced to: ${userLang}`);\n      }\n    }\n\n    // Listener Firestore RBAC — opt-in via enableFirestoreRBAC: true\n    const userId = this.stateService.state().userId;\n    if (userId) {\n      this.setupFirestoreRBACSync(userId);\n    }\n  }\n\n  private clearState(): void {\n    this.stopRefreshTimer();\n    this.teardownFirestoreRBACSync();\n    this.stateService.reset();\n    this.storageService.clear();\n  }\n\n  private setupFirestoreRBACSync(userId: string): void {\n    if (!this.config?.enableFirestoreRBAC || !this.firestoreInstance) return;\n    this.teardownFirestoreRBACSync();\n\n    if (!this.firebaseService || this.firebaseService.firebaseAuthReady()) {\n      // Firebase not used or already authenticated — attach listener now.\n      this._attachFirestoreRBACListener(userId);\n    } else {\n      // Firebase Auth not ready yet. Firestore permission-denied errors terminate\n      // onSnapshot permanently (no automatic retry when auth state changes).\n      // Wait until the user is authenticated, then attach.\n      this.firebaseService.firebaseAuthReady$\n        .pipe(\n          filter(ready => ready),\n          take(1)\n        )\n        .subscribe(() => this._attachFirestoreRBACListener(userId));\n    }\n  }\n\n  private _attachFirestoreRBACListener(userId: string): void {\n    const docRef = doc(this.firestoreInstance!, 'users', userId);\n    this.firestoreRBACUnsubscribe = onSnapshot(docRef, snap => {\n      const data = snap.data();\n      if (!data) return;\n\n      // Sync de perfil — el mirror Firestore `/users/{uid}` es el espejo canónico\n      // que el backend escribe (`SyncProfileToFirestore`). Refrescar acá mantiene\n      // `auth.user()` VIVO (avatar del header, greeting, etc.) sin depender de un\n      // `getProfile()` manual: editar el perfil en una vista se refleja en todas\n      // (home incluido) en cuanto el backend actualiza el mirror.\n      this.stateService.updateProfileFields({\n        name: data['name'] ?? undefined,\n        handle: data['handle'] ?? undefined,\n        avatarUrl: data['avatarUrl'] ?? undefined,\n        phone: data['phone'] ?? undefined,\n      });\n\n      const rbac = data['rbac'];\n      if (!rbac) return;\n      const activeOrg = this.stateService.state().activeOrg;\n      if (rbac['activeOrg'] && rbac['activeOrg'] !== activeOrg) return;\n      const roles: string[] = rbac['roles'] ?? [];\n      const permissions: string[] = rbac['permissions'] ?? [];\n      this.stateService.updatePermissions(roles, permissions, permissions.includes('*:*'));\n    });\n  }\n\n  private teardownFirestoreRBACSync(): void {\n    if (this.firestoreRBACUnsubscribe) {\n      this.firestoreRBACUnsubscribe();\n      this.firestoreRBACUnsubscribe = null;\n    }\n  }\n\n  private startRefreshTimer(): void {\n    this.stopRefreshTimer();\n\n    const state = this.stateService.state();\n    if (!state.expiresAt) return;\n\n    const refreshBeforeMs = (this.config?.refreshBeforeExpiry || 60) * 1000;\n    const refreshAt = state.expiresAt - refreshBeforeMs;\n    const delay = refreshAt - Date.now();\n\n    if (delay > 0) {\n      this.refreshTimerId = setTimeout(() => {\n        this.refreshAccessToken().subscribe({\n          error: () => this.logout(),\n        });\n      }, delay);\n    } else if (state.refreshToken) {\n      // Token ya debería refrescarse, intentar ahora\n      this.refreshAccessToken().subscribe({\n        error: () => this.logout(),\n      });\n    }\n  }\n\n  private stopRefreshTimer(): void {\n    if (this.refreshTimerId) {\n      clearTimeout(this.refreshTimerId);\n      this.refreshTimerId = null;\n    }\n  }\n\n  private handleSyncEvent(event: AuthSyncEvent): void {\n    switch (event.type) {\n      case 'LOGIN':\n      case 'TOKEN_REFRESH': {\n        // Recargar estado desde storage\n        const state = this.storageService.loadState();\n        if (state.accessToken) {\n          this.stateService.restoreFromStorage(state);\n          const claims = this.tokenService.parseToken(state.accessToken);\n          if (claims) {\n            this.stateService.updateUserInfo(claims.uid, claims.email);\n            if (claims.org) {\n              this.stateService.updateActiveOrg(claims.org);\n            }\n          }\n          this.startRefreshTimer();\n        }\n        break;\n      }\n      case 'LOGOUT':\n        this.stateService.reset();\n        this.stopRefreshTimer();\n        this.router.navigate([this.config?.loginRoute]);\n        break;\n      case 'PERMISSIONS_UPDATE': {\n        const perms = this.storageService.loadPermissions();\n        this.stateService.updatePermissions(perms.roles, perms.permissions, perms.isSuperAdmin);\n        break;\n      }\n      case 'ORG_SWITCH':\n        // Otra pestaña cambió de organización - recargar página para obtener nuevo estado\n        window.location.reload();\n        break;\n    }\n  }\n\n  private handleAuthError(error: HttpErrorResponse): Observable<never> {\n    // `interpretError` (helper compartido de la lib) normaliza el\n    // HttpErrorResponse — incluyendo fallos de red (status 0). Aplanamos a\n    // AuthError para mantener la API pública de AuthService estable.\n    const interpreted = interpretError(error);\n    const authError: AuthError = {\n      code: interpreted.code,\n      message: interpreted.message,\n    };\n    this.stateService.setError(authError);\n    return throwError(() => authError);\n  }\n\n  // =============================================\n  // FIREBASE INTEGRATION\n  // =============================================\n\n  private async signInWithFirebase(firebaseToken: string): Promise<void> {\n    console.log(\n      `[FBAuth] auth flow → signInWithFirebase attempt tokenLen=${firebaseToken?.length ?? 0} ` +\n        `firebaseServicePresent=${!!this.firebaseService}`\n    );\n    try {\n      if (this.firebaseService) {\n        await this.firebaseService.signInWithCustomToken(firebaseToken);\n        console.log('[ValtechAuth] Firebase signin successful');\n      } else {\n        console.warn(\n          '[ValtechAuth] FirebaseService not provided. Add provideValtechFirebase() to your providers.'\n        );\n      }\n    } catch (error) {\n      // No bloquear el login principal si Firebase falla\n      console.error('[ValtechAuth] Firebase signin failed:', error);\n    }\n  }\n\n  private async signOutFirebase(): Promise<void> {\n    if (!this.config?.enableFirebaseIntegration) return;\n\n    try {\n      if (this.firebaseService) {\n        await this.firebaseService.signOut();\n        console.log('[ValtechAuth] Firebase signout successful');\n      }\n    } catch (error) {\n      // Ignorar errores de Firebase signout\n      console.warn('[ValtechAuth] Firebase signout failed:', error);\n    }\n  }\n\n  /**\n   * Re-establece la sesión de Firebase Auth en el bootstrap de la app cuando\n   * el access token de la app sigue válido (la rama de initialize() que NO\n   * pasa por refresh).\n   *\n   * Firebase Auth mantiene su PROPIA sesión con persistencia IndexedDB\n   * independiente del storage de tokens de la app. En un navegador normal esa\n   * persistencia se auto-restaura sola; en una PWA standalone en iOS el\n   * contenedor de storage no sobrevive, y `firebaseAuthReady` se queda en\n   * `false` indefinidamente → los listeners Firestore cuelgan (~40s timeout).\n   *\n   * Estrategia: dar una ventana corta a la auto-restauración de Firebase y, si\n   * no ocurre, forzar un `refreshAccessToken()` — que ya hace `signInWithFirebase`\n   * con el `firebaseToken` que devuelve `/refresh`.\n   *\n   * Fire-and-forget: se invoca con `void` para no demorar `initialize()`.\n   */\n  private async ensureFirebaseSessionOnBootstrap(): Promise<void> {\n    if (!this.config?.enableFirebaseIntegration || !this.firebaseService) return;\n\n    // Dar a la persistencia IndexedDB propia de Firebase Auth una oportunidad\n    // de auto-restaurarse (navegador normal). En una PWA standalone de iOS\n    // normalmente NO lo hará.\n    await new Promise(r => setTimeout(r, 2500));\n\n    if (this.firebaseService.firebaseAuthReady()) {\n      console.log('[FBAuth] bootstrap — Firebase session restored on its own');\n      return;\n    }\n\n    console.log(\n      '[FBAuth] bootstrap — session valid but Firebase NOT ready → recurriendo a fallback'\n    );\n    await this.reestablishFirebaseViaRefresh('bootstrap-session-restore');\n  }\n\n  /**\n   * Fallback self-healing de Firebase Auth. Pide un firebaseToken fresco vía\n   * `/refresh` (que sí lo devuelve de forma confiable) y, en éxito,\n   * `refreshAccessToken()` ya ejecuta `signInWithFirebase()`.\n   *\n   * Se invoca cuando un path de auth dejó la sesión de Firebase sin establecer:\n   *  - login OAuth/password que volvió sin `firebaseToken`,\n   *  - cold launch de PWA iOS sin persistencia de Firebase.\n   *\n   * `reason` aparece en los logs `[FBAuth] fallback` para poder atestiguar\n   * desde el debug-console qué disparó el fallback.\n   */\n  private async reestablishFirebaseViaRefresh(reason: string): Promise<void> {\n    if (!this.config?.enableFirebaseIntegration || !this.firebaseService) return;\n\n    console.log(`[FBAuth] fallback — re-estableciendo Firebase vía /refresh (motivo: ${reason})`);\n    try {\n      await firstValueFrom(this.refreshAccessToken());\n      console.log(`[FBAuth] fallback — /refresh OK, Firebase re-establecido (motivo: ${reason})`);\n    } catch (e) {\n      console.warn(`[FBAuth] fallback — /refresh falló (motivo: ${reason}):`, e);\n    }\n  }\n\n  // =============================================\n  // DEVICE REGISTRATION (Push Notifications)\n  // =============================================\n\n  /**\n   * Solicita permisos de notificación y registra el dispositivo.\n   * Usar cuando el usuario acepta recibir notificaciones.\n   *\n   * @example\n   * ```typescript\n   * async onEnableNotifications() {\n   *   const result = await this.auth.enableNotifications();\n   *   if (result.granted) {\n   *     console.log('Notificaciones habilitadas');\n   *   }\n   * }\n   * ```\n   */\n  async enableNotifications(): Promise<EnableNotificationsResult> {\n    if (!this.messagingService) {\n      console.warn('[ValtechAuth] MessagingService not available');\n      return { granted: false };\n    }\n\n    if (!(await this.messagingService.isSupported())) {\n      console.warn('[ValtechAuth] Push notifications not supported');\n      return { granted: false };\n    }\n\n    const token = await this.messagingService.requestPermission();\n    if (!token) {\n      return { granted: false };\n    }\n\n    // Registrar dispositivo en backend\n    const registered = await this.registerDeviceIfNeeded();\n\n    return { granted: true, token, registered };\n  }\n\n  /**\n   * Desactiva las notificaciones para este dispositivo.\n   * Elimina el token del backend y de FCM.\n   * Usar desde un toggle de preferencias cuando el usuario desactiva notificaciones.\n   *\n   * NOTA: Esto NO revoca el permiso del navegador (el usuario debe hacerlo manualmente\n   * desde la configuración del navegador). Solo elimina el registro del dispositivo.\n   *\n   * @example\n   * ```typescript\n   * async onToggleNotifications(enabled: boolean) {\n   *   if (enabled) {\n   *     await this.auth.enableNotifications();\n   *   } else {\n   *     await this.auth.disableNotifications();\n   *   }\n   * }\n   * ```\n   */\n  async disableNotifications(): Promise<{ disabled: boolean }> {\n    if (!this.messagingService) {\n      return { disabled: false };\n    }\n\n    try {\n      const token = this.messagingService.currentToken;\n      if (token) {\n        // Eliminar del backend\n        await firstValueFrom(\n          this.http\n            .request('DELETE', `${this.config?.apiUrl}/v2/users/me/devices/by-token`, {\n              body: { token },\n            })\n            .pipe(catchError(() => of(null)))\n        );\n\n        // Eliminar token de FCM\n        await this.messagingService.deleteToken();\n        console.log('[ValtechAuth] Notifications disabled');\n        return { disabled: true };\n      }\n\n      return { disabled: false };\n    } catch (error) {\n      console.warn('[ValtechAuth] Failed to disable notifications:', error);\n      return { disabled: false };\n    }\n  }\n\n  /**\n   * Retorna el estado actual de permisos de notificación.\n   *\n   * @returns 'granted' | 'denied' | 'default' | 'unsupported'\n   */\n  getNotificationPermissionState(): NotificationPermissionState {\n    if (!this.messagingService) {\n      return 'unsupported';\n    }\n    return this.messagingService.getPermissionState() as NotificationPermissionState;\n  }\n\n  /**\n   * Registra manualmente el dispositivo en el backend.\n   * Útil para sincronizar dispositivos que tienen token FCM pero no están registrados.\n   *\n   * @param providedToken Token FCM opcional. Si se proporciona, se usa directamente\n   *                      sin depender del MessagingService (evita timing issues).\n   * @returns Resultado del registro con deviceId si fue exitoso\n   *\n   * @example\n   * ```typescript\n   * // Sincronizar con token existente (recomendado)\n   * const result = await this.auth.registerDevice(myToken);\n   *\n   * // Sin token, intentará obtenerlo del MessagingService\n   * const result = await this.auth.registerDevice();\n   * ```\n   */\n  async registerDevice(providedToken?: string): Promise<RegisterDeviceResult> {\n    if (!this.isAuthenticated()) {\n      return { registered: false, error: 'Usuario no autenticado' };\n    }\n\n    try {\n      // Verificar permisos si tenemos MessagingService\n      if (this.messagingService) {\n        const permission = this.messagingService.getPermissionState();\n        if (permission !== 'granted') {\n          return { registered: false, error: 'Permiso de notificaciones no otorgado' };\n        }\n      }\n\n      // Usar token proporcionado primero (evita timing issues con Injector)\n      let token = providedToken || this.messagingService?.currentToken;\n\n      // Si no hay token, intentar obtenerlo del MessagingService\n      if (!token && this.messagingService) {\n        if (!(await this.messagingService.isSupported())) {\n          return { registered: false, error: 'FCM no soportado en este navegador' };\n        }\n        token = await this.messagingService.getToken();\n      }\n\n      if (!token) {\n        return { registered: false, error: 'No se pudo obtener token FCM' };\n      }\n\n      // Registrar en backend\n      const { platform, browser, os } = this.detectPlatformInfo();\n      const response = await firstValueFrom(\n        this.http.post<RegisterDeviceResponse>(`${this.config?.apiUrl}/v2/users/me/devices`, {\n          token,\n          platform,\n          browser,\n          os,\n        })\n      );\n\n      console.log('[ValtechAuth] Device registered manually:', response.device.deviceId);\n      return { registered: true, deviceId: response.device.deviceId, token };\n    } catch (error: any) {\n      console.warn('[ValtechAuth] Manual device registration failed:', error);\n      return {\n        registered: false,\n        error: error?.error?.message || error?.message || 'Error al registrar dispositivo',\n      };\n    }\n  }\n\n  /**\n   * Registra el dispositivo en el backend si tiene permisos de notificación.\n   * Se llama automáticamente después de un login exitoso si enableDeviceRegistration=true.\n   */\n  private async registerDeviceIfNeeded(): Promise<boolean> {\n    // Solo si está habilitado y messaging está disponible\n    if (!this.config?.enableDeviceRegistration || !this.messagingService) {\n      return false;\n    }\n\n    try {\n      // Verificar si FCM está soportado\n      if (!(await this.messagingService.isSupported())) {\n        return false;\n      }\n\n      // Verificar si ya tiene permisos\n      const permission = this.messagingService.getPermissionState();\n      if (permission !== 'granted') {\n        return false; // No solicitar automáticamente, solo registrar si ya tiene permiso\n      }\n\n      // Obtener token existente (no solicitar nuevo)\n      const token = await this.messagingService.getToken();\n      if (!token) {\n        return false;\n      }\n\n      // Registrar en backend\n      const { platform, browser, os } = this.detectPlatformInfo();\n      await firstValueFrom(\n        this.http.post<RegisterDeviceResponse>(`${this.config?.apiUrl}/v2/users/me/devices`, {\n          token,\n          platform,\n          browser,\n          os,\n        })\n      );\n\n      console.log('[ValtechAuth] Device registered successfully');\n      return true;\n    } catch (error) {\n      // No bloquear auth si falla device registration\n      console.warn('[ValtechAuth] Device registration failed:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Elimina el dispositivo del backend y borra el token FCM.\n   */\n  private async unregisterDevice(): Promise<void> {\n    if (!this.config?.enableDeviceRegistration || !this.messagingService) {\n      return;\n    }\n\n    try {\n      const token = this.messagingService.currentToken;\n      if (token) {\n        // Delete from backend (fire and forget)\n        this.http\n          .request('DELETE', `${this.config?.apiUrl}/v2/users/me/devices/by-token`, {\n            body: { token },\n          })\n          .pipe(catchError(() => of(null)))\n          .subscribe();\n\n        // Delete from FCM\n        await this.messagingService.deleteToken();\n        console.log('[ValtechAuth] Device unregistered');\n      }\n    } catch {\n      // Ignorar errores en cleanup\n    }\n  }\n\n  /**\n   * Detecta información de la plataforma del dispositivo.\n   */\n  private detectPlatformInfo(): { platform: 'web'; browser: string; os: string } {\n    const ua = navigator.userAgent;\n\n    // Detectar navegador\n    let browser = 'Unknown';\n    if (ua.includes('Firefox')) {\n      browser = 'Firefox';\n    } else if (ua.includes('Edg')) {\n      browser = 'Edge';\n    } else if (ua.includes('Chrome')) {\n      browser = 'Chrome';\n    } else if (ua.includes('Safari')) {\n      browser = 'Safari';\n    }\n\n    // Detectar OS\n    let os = 'Unknown';\n    if (ua.includes('Windows')) {\n      os = 'Windows';\n    } else if (ua.includes('Mac OS')) {\n      os = 'macOS';\n    } else if (ua.includes('Linux')) {\n      os = 'Linux';\n    } else if (ua.includes('Android')) {\n      os = 'Android';\n    } else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) {\n      os = 'iOS';\n    }\n\n    return { platform: 'web', browser, os };\n  }\n}\n","import { Directive, effect, inject, input, TemplateRef, ViewContainerRef } from '@angular/core';\nimport { AuthService } from '../services/auth/auth.service';\n\n/**\n * Structural directive that renders its host element only when the\n * authenticated user has the required permission in the active org.\n *\n * Usage:\n *   <ion-button *valHasPermission=\"'rbac:manage'\">Gestionar roles</ion-button>\n *\n * Permissions use resource:action format (e.g. 'users:read', 'documents:*', '*:*').\n * Wildcard rules from the backend are respected by AuthService.hasPermission().\n */\n@Directive({\n  selector: '[valHasPermission]',\n  standalone: true,\n})\nexport class HasPermissionDirective {\n  private auth = inject(AuthService);\n  private tpl = inject(TemplateRef<unknown>);\n  private vc = inject(ViewContainerRef);\n\n  readonly valHasPermission = input.required<string>();\n\n  private hasView = false;\n\n  constructor() {\n    effect(() => {\n      const perm = this.valHasPermission();\n      const allowed = this.auth.hasPermission(perm);\n      if (allowed && !this.hasView) {\n        this.vc.createEmbeddedView(this.tpl);\n        this.hasView = true;\n      } else if (!allowed && this.hasView) {\n        this.vc.clear();\n        this.hasView = false;\n      }\n    });\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { PresetConfig, ComponentPresets } from './types';\n\n/**\n * Servicio para gestionar presets de componentes.\n *\n * Los presets permiten definir configuraciones reutilizables\n * de componentes (tamaño, color, variante, etc.) que se pueden\n * aplicar con un nombre semántico.\n *\n * @example\n * // En un componente\n * presets = inject(PresetService);\n *\n * // Obtener preset\n * const buttonProps = this.presets.get<ButtonMetadata>('button', 'primary-action');\n * // { size: 'large', color: 'primary', fill: 'solid' }\n */\n@Injectable({ providedIn: 'root' })\nexport class PresetService {\n  private readonly _presets = signal<PresetConfig>({});\n\n  /**\n   * Obtiene un preset específico para un componente\n   *\n   * @param component Tipo de componente (ej: 'button', 'card', 'input')\n   * @param presetName Nombre del preset (ej: 'primary-action', 'compact')\n   * @returns Propiedades del preset o objeto vacío si no existe\n   *\n   * @example\n   * // Obtener preset de botón\n   * const props = presets.get<ButtonMetadata>('button', 'primary-action');\n   *\n   * // Usar en componente\n   * <val-button [props]=\"props\"></val-button>\n   */\n  get<T extends Record<string, unknown>>(component: string, presetName: string): Partial<T> {\n    const componentPresets = this._presets()[component];\n    if (!componentPresets) {\n      console.warn(`[presets] No presets registered for component: ${component}`);\n      return {} as Partial<T>;\n    }\n\n    const preset = componentPresets[presetName];\n    if (!preset) {\n      console.warn(`[presets] Preset '${presetName}' not found for component: ${component}`);\n      return {} as Partial<T>;\n    }\n\n    return preset as Partial<T>;\n  }\n\n  /**\n   * Verifica si existe un preset\n   */\n  has(component: string, presetName: string): boolean {\n    return !!this._presets()[component]?.[presetName];\n  }\n\n  /**\n   * Registra presets de la aplicación\n   *\n   * @param presets Configuración de presets\n   *\n   * @example\n   * presets.registerPresets({\n   *   button: {\n   *     'primary-action': { size: 'large', color: 'primary' },\n   *   },\n   *   card: {\n   *     'feature': { variant: 'elevated' },\n   *   }\n   * });\n   */\n  registerPresets(presets: PresetConfig): void {\n    this._presets.set(presets);\n  }\n\n  /**\n   * Agrega presets para un componente específico (merge con existentes)\n   */\n  registerComponentPresets(component: string, presets: ComponentPresets): void {\n    this._presets.update((current) => ({\n      ...current,\n      [component]: {\n        ...current[component],\n        ...presets,\n      },\n    }));\n  }\n\n  /**\n   * Obtiene todos los nombres de presets para un componente\n   */\n  getPresetNames(component: string): string[] {\n    return Object.keys(this._presets()[component] || {});\n  }\n\n  /**\n   * Obtiene todos los componentes con presets registrados\n   */\n  getRegisteredComponents(): string[] {\n    return Object.keys(this._presets());\n  }\n}\n","import {\n  EnvironmentProviders,\n  makeEnvironmentProviders,\n  APP_INITIALIZER,\n} from '@angular/core';\nimport { PresetConfig } from './types';\nimport { PresetService } from './preset.service';\n\n/**\n * Configura el sistema de presets de Valtech Components.\n *\n * @param presets Configuración de presets por componente\n * @returns Providers para agregar en app.config.ts\n *\n * @example\n * // app.config.ts\n * import { provideValtechPresets } from 'valtech-components';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideValtechPresets({\n *       button: {\n *         'primary-action': { size: 'large', color: 'primary', fill: 'solid' },\n *         'secondary': { size: 'medium', color: 'secondary', fill: 'outline' },\n *         'danger': { size: 'medium', color: 'danger', fill: 'solid' },\n *       },\n *       card: {\n *         'feature': { variant: 'elevated', padding: 'large' },\n *         'compact': { variant: 'flat', padding: 'small' },\n *       },\n *       input: {\n *         'form-field': { size: 'medium', fill: 'outline', labelPosition: 'floating' },\n *       }\n *     }),\n *   ]\n * };\n */\nexport function provideValtechPresets(presets: PresetConfig): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: APP_INITIALIZER,\n      useFactory: (presetService: PresetService) => {\n        return () => {\n          presetService.registerPresets(presets);\n        };\n      },\n      deps: [PresetService],\n      multi: true,\n    },\n  ]);\n}\n","// Types\nexport { PresetConfig, ComponentPresets, PresetsOptions } from './types';\n\n// Service\nexport { PresetService } from './preset.service';\n\n// Config\nexport { provideValtechPresets } from './config';\n","import { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { IonAvatar } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { AvatarMetadata } from './types';\n\n@Component({\n  selector: 'val-avatar',\n  standalone: true,\n  imports: [IonAvatar],\n  template: `\n    <ion-avatar\n      aria-hidden=\"true\"\n      [class]=\"resolvedProps.size\"\n      [class.box]=\"resolvedProps.box\"\n      [class.grayscale]=\"resolvedProps.grayscale\"\n      (click)=\"onClickHandler()\"\n    >\n      <img alt=\"profile image\" [src]=\"resolvedProps.image || resolvedProps.default\" />\n    </ion-avatar>\n  `,\n  styleUrls: ['./avatar.component.scss'],\n})\n/**\n * val-avatar\n *\n * Displays a user or profile image, optionally with a box style and different sizes.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-avatar preset=\"profile\" [props]=\"{ image: 'url' }\" (onClick)=\"handler()\"></val-avatar>\n *\n * @example Static (backwards compatible):\n * <val-avatar [props]=\"{ image: 'url', size: 'medium', box: true }\" (onClick)=\"handler()\"></val-avatar>\n *\n * @input preset: string - Name of preset to apply\n * @input props: AvatarMetadata - Configuration for the avatar (image, size, box, default image)\n * @output onClick - Emits when the avatar is clicked\n */\nexport class AvatarComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable avatar configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-avatar preset=\"profile\" [props]=\"{ image: 'url' }\"></val-avatar>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Avatar configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<AvatarMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: AvatarMetadata = {} as AvatarMetadata;\n\n  /**\n   * Event emitted when the avatar is clicked.\n   */\n  @Output()\n  onClick = new EventEmitter();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('avatar', this.preset) as Partial<AvatarMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as AvatarMetadata;\n  }\n\n  onClickHandler() {\n    this.onClick.emit();\n  }\n}\n","/* eslint-disable no-underscore-dangle */\n\n/**\n * Service for registering and managing custom Ionicons icons in the application.\n * Automatically registers a set of commonly used icons on initialization.\n */\n\nimport { Injectable } from '@angular/core';\nimport { addIcons } from 'ionicons';\nimport {\n  addCircleOutline,\n  addOutline,\n  alertCircleOutline,\n  alertOutline,\n  arrowBackOutline,\n  bulbOutline,\n  diamondOutline,\n  lockOpenOutline,\n  arrowDownOutline,\n  arrowForwardOutline,\n  businessOutline,\n  calendarOutline,\n  chatbubblesOutline,\n  checkmarkCircleOutline,\n  checkmarkOutline,\n  chevronDownOutline,\n  chevronForwardOutline,\n  clipboardOutline,\n  closeOutline,\n  cloudDownloadOutline,\n  copyOutline,\n  createOutline,\n  desktopOutline,\n  documentTextOutline,\n  ellipsisHorizontalOutline,\n  eyeOffOutline,\n  eyeOutline,\n  filterOutline,\n  heart,\n  heartOutline,\n  home,\n  homeOutline,\n  informationCircleOutline,\n  keyOutline,\n  laptopOutline,\n  locationOutline,\n  lockClosedOutline,\n  logOutOutline,\n  cloudOutline,\n  gitBranchOutline,\n  layersOutline,\n  logoFacebook,\n  logoGoogle,\n  logoInstagram,\n  logoLinkedin,\n  logoNpm,\n  logoTiktok,\n  logoTwitter,\n  logoYoutube,\n  serverOutline,\n  notifications,\n  notificationsOutline,\n  openOutline,\n  playOutline,\n  personOutline,\n  phonePortraitOutline,\n  refreshOutline,\n  removeOutline,\n  scanOutline,\n  settings,\n  settingsOutline,\n  shareOutline,\n  shieldCheckmarkOutline,\n  trashOutline,\n  optionsOutline,\n  warningOutline,\n  peopleOutline,\n} from 'ionicons/icons';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class IconService {\n  /**\n   * Registers a set of Ionicons icons for use throughout the app.\n   */\n  constructor() {\n    addIcons({\n      addOutline,\n      addCircleOutline,\n      alertOutline,\n      alertCircleOutline,\n      arrowBackOutline,\n      arrowForwardOutline,\n      arrowDownOutline,\n      settings,\n      settingsOutline,\n      checkmarkCircleOutline,\n      ellipsisHorizontalOutline,\n      notifications,\n      notificationsOutline,\n      openOutline,\n      closeOutline,\n      chatbubblesOutline,\n      shareOutline,\n      heart,\n      heartOutline,\n      home,\n      homeOutline,\n      eyeOffOutline,\n      eyeOutline,\n      scanOutline,\n      chevronDownOutline,\n      chevronForwardOutline,\n      checkmarkOutline,\n      clipboardOutline,\n      copyOutline,\n      filterOutline,\n      locationOutline,\n      calendarOutline,\n      businessOutline,\n      logoTwitter,\n      logoInstagram,\n      logoLinkedin,\n      logoYoutube,\n      logoTiktok,\n      logoFacebook,\n      logoGoogle,\n      createOutline,\n      trashOutline,\n      playOutline,\n      peopleOutline,\n      phonePortraitOutline,\n      refreshOutline,\n      documentTextOutline,\n      lockClosedOutline,\n      informationCircleOutline,\n      logoNpm,\n      removeOutline,\n      optionsOutline,\n      personOutline,\n      shieldCheckmarkOutline,\n      keyOutline,\n      desktopOutline,\n      logOutOutline,\n      cloudDownloadOutline,\n      cloudOutline,\n      gitBranchOutline,\n      layersOutline,\n      serverOutline,\n      warningOutline,\n      bulbOutline,\n      lockOpenOutline,\n      diamondOutline,\n    });\n  }\n}\n","import { CommonModule, NgStyle } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { IonCard, IonIcon } from '@ionic/angular/standalone';\nimport { IconService } from '../../../services/icons.service';\nimport { BoxMetadata } from './types';\n\n@Component({\n  selector: 'val-box',\n  standalone: true,\n  imports: [CommonModule, IonCard, IonIcon, NgStyle],\n  template: `\n    <ion-card\n      class=\"box\"\n      [color]=\"props.color\"\n      [class.rounded]=\"props.rounded\"\n      [class.bordered]=\"props.bordered\"\n      [class.transparent]=\"!props.color\"\n      [class.left-border]=\"props.leftBorder\"\n      [ngStyle]=\"{\n        padding: props.padding ? props.padding : '0px',\n      }\"\n    >\n      @if (props.icon) {\n        <ion-icon class=\"icon\" [name]=\"props.icon\" (click)=\"clickHandler()\"></ion-icon>\n      }\n      <div\n        [ngStyle]=\"{\n          'margin-right': props.icon ? '24px' : '0px',\n        }\"\n      >\n        <ng-content select=\"[body]\"></ng-content>\n      </div>\n    </ion-card>\n  `,\n  styleUrls: ['./box.component.scss'],\n})\n/**\n * val-box\n *\n * A stylized card container for grouping content, with optional icon, color, border, and click event.\n *\n * @example\n * <val-box [props]=\"{ color: 'primary', rounded: true, icon: 'star' }\" (onClick)=\"handler()\">\n *   <div body>Content here</div>\n * </val-box>\n *\n * @input props: BoxMetadata - Configuration for the box (color, icon, border, etc.)\n * @output onClick - Emits when the box or its icon is clicked\n */\nexport class BoxComponent implements OnInit {\n  /**\n   * Box configuration object.\n   * @type {BoxMetadata}\n   * @property color - The color of the box (Ionic color string).\n   * @property icon - The name of the icon to display (optional).\n   * @property bordered - Whether the box has a border (optional).\n   * @property leftBorder - Whether the box has a left border (optional).\n   * @property rounded - Whether the box has rounded corners (optional).\n   * @property padding - Custom padding for the box (optional).\n   */\n  @Input()\n  props: BoxMetadata;\n\n  /**\n   * Event emitted when the box or its icon is clicked.\n   */\n  @Output()\n  onClick = new EventEmitter();\n\n  constructor(icon: IconService) {}\n\n  ngOnInit() {}\n\n  clickHandler() {\n    this.onClick.emit();\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { GlowIntensity, GlowMetadata, GlowPosition, GlowShape, GlowSize } from './types';\n\nconst POSITION_MAP: Record<GlowPosition, string> = {\n  'top-left': '0% 0%',\n  top: '50% 0%',\n  'top-right': '100% 0%',\n  left: '0% 50%',\n  center: '50% 50%',\n  right: '100% 50%',\n  'bottom-left': '0% 100%',\n  bottom: '50% 100%',\n  'bottom-right': '100% 100%',\n};\n\nconst SIZE_MAP: Record<GlowSize, string> = {\n  small: '300px',\n  medium: '500px',\n  large: '800px',\n  xlarge: '1200px',\n};\n\nconst INTENSITY_MAP: Record<GlowIntensity, number> = {\n  subtle: 0.08,\n  medium: 0.18,\n  strong: 0.35,\n};\n\nconst LINEAR_ANGLE_MAP: Record<GlowPosition, string> = {\n  'top-left': '135deg',\n  top: '180deg',\n  'top-right': '225deg',\n  left: '90deg',\n  center: '180deg',\n  right: '270deg',\n  'bottom-left': '45deg',\n  bottom: '0deg',\n  'bottom-right': '315deg',\n};\n\n/**\n * `val-glow` — wrapper that paints a colored radial or linear gradient behind its\n * projected content. Uses Ionic color tokens, so it respects light/dark theme.\n *\n * @example\n * <val-glow [props]=\"{ color: 'primary', position: 'top', size: 'large' }\">\n *   <h1>Hero title</h1>\n *   <p>Body copy...</p>\n * </val-glow>\n *\n * @example Two-tone radial\n * <val-glow [props]=\"{ color: 'primary', secondaryColor: 'tertiary', position: 'center' }\">\n *   ...\n * </val-glow>\n *\n * @example Linear sweep from top\n * <val-glow [props]=\"{ color: 'success', shape: 'linear', position: 'top', intensity: 'strong' }\">\n *   ...\n * </val-glow>\n */\n@Component({\n  selector: 'val-glow',\n  standalone: true,\n  template: `<ng-content />`,\n  styleUrls: ['./glow.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  host: {\n    class: 'val-glow',\n    '[class.val-glow--radial]': \"shape() === 'radial'\",\n    '[class.val-glow--linear]': \"shape() === 'linear'\",\n    '[class.val-glow--animated]': 'animated()',\n    '[class.val-glow--dual]': 'hasSecondary()',\n    '[style.--val-glow-color-rgb]': 'colorRgbVar()',\n    '[style.--val-glow-color-secondary-rgb]': 'secondaryColorRgbVar()',\n    '[style.--val-glow-position]': 'positionCss()',\n    '[style.--val-glow-size]': 'sizeCss()',\n    '[style.--val-glow-intensity]': 'intensityValue()',\n    '[style.--val-glow-angle]': 'angleCss()',\n    '[style.--val-glow-blend-mode]': 'blendMode()',\n  },\n})\nexport class GlowComponent {\n  props = input.required<GlowMetadata>();\n\n  protected color = computed(() => this.props().color ?? 'primary');\n  protected secondaryColor = computed(() => this.props().secondaryColor);\n  protected hasSecondary = computed(() => Boolean(this.secondaryColor()));\n  protected position = computed<GlowPosition>(() => this.props().position ?? 'center');\n  protected size = computed<GlowSize>(() => this.props().size ?? 'large');\n  protected intensity = computed<GlowIntensity>(() => this.props().intensity ?? 'medium');\n  protected shape = computed<GlowShape>(() => this.props().shape ?? 'radial');\n  protected animated = computed(() => this.props().animated ?? false);\n  protected blendMode = computed(() => this.props().blendMode ?? 'normal');\n\n  protected colorRgbVar = computed(() => `var(--ion-color-${this.color()}-rgb)`);\n  protected secondaryColorRgbVar = computed(() =>\n    this.secondaryColor() ? `var(--ion-color-${this.secondaryColor()}-rgb)` : null\n  );\n  protected positionCss = computed(() => POSITION_MAP[this.position()]);\n  protected sizeCss = computed(() => SIZE_MAP[this.size()]);\n  protected intensityValue = computed(() => INTENSITY_MAP[this.intensity()].toString());\n  protected angleCss = computed(() => LINEAR_ANGLE_MAP[this.position()]);\n}\n","import { Component, computed, HostBinding, input } from '@angular/core';\nimport { ContainerAlign, ContainerMetadata, ContainerPadding, ContainerSize } from './types';\n\n/**\n * val-container\n *\n * Layout primitive that caps content max-width using design tokens\n * and centers it horizontally. Use to keep UX consistent on large\n * screens without per-page CSS.\n *\n * @example\n * <val-container size=\"xl\">\n *   <!-- page content -->\n * </val-container>\n *\n * @example\n * <val-container [props]=\"{ size: 'md', padding: 'compact' }\">\n *   <!-- narrower form -->\n * </val-container>\n */\n@Component({\n  selector: 'val-container',\n  standalone: true,\n  template: `<ng-content></ng-content>`,\n  styleUrl: './container.component.scss',\n})\nexport class ContainerComponent {\n  readonly props = input<ContainerMetadata>({});\n\n  readonly size = computed<ContainerSize>(() => this.props()?.size ?? 'xl');\n  readonly padding = computed<ContainerPadding>(() => this.props()?.padding ?? 'comfortable');\n  readonly align = computed<ContainerAlign>(() => this.props()?.align ?? 'center');\n\n  @HostBinding('attr.data-size') get sizeAttr() {\n    return this.size();\n  }\n\n  @HostBinding('attr.data-padding') get paddingAttr() {\n    return this.padding();\n  }\n\n  @HostBinding('attr.data-align') get alignAttr() {\n    return this.align();\n  }\n}\n","import { FormControl, ValidatorFn } from '@angular/forms';\nimport { Color } from '@ionic/core';\nimport { ImageMetadata } from './atoms/image/types';\n\n/**\n * Possible states for an interactive component.\n */\nexport type ComponentState = 'ENABLED' | 'DISABLED' | 'WORKING' | 'ERROR';\nconst ENABLED: ComponentState = 'ENABLED';\nconst DISABLED: ComponentState = 'DISABLED';\nconst WORKING: ComponentState = 'WORKING';\nconst ERROR: ComponentState = 'ERROR';\n\n/**\n * Object containing all possible component states.\n */\nexport const ComponentStates = { ENABLED, DISABLED, WORKING, ERROR };\n\n/**\n * Types of actions that a button or link can perform.\n */\nexport enum ActionType {\n  BROWSER_NEW_TAB, // Open in a new browser tab\n  BROWSER_DOWNLOAD, // Download via browser\n  NATIVE_DOWNLOAD, // Download using native capabilities\n  APP_NAVIGATION, // Internal app navigation\n  BROWSER_NAVIGATION, // Navigation in the browser\n}\n\n/**\n * Represents an executable action for a button or link.\n */\nexport type Action = {\n  /** Action description */\n  description: string;\n  /** Action type */\n  type: ActionType;\n  /** Action source or destination */\n  source: string;\n};\n\n/**\n * Supported input types for forms.\n */\nexport enum InputType {\n  TEXT,\n  TEXTAREA,\n  EMAIL,\n  PASSWORD,\n  COMMENT,\n  NUMBER,\n  NUMBER_FROM_TO,\n  PIN_CODE,\n  DATE,\n  DATE_RANGE,\n  HOUR,\n  CHECK,\n  RADIO,\n  SELECT,\n  SEARCH_SELECT,\n  MULTI_SELECT,\n  MULTI_SELECT_SIMPLE,\n  FILE,\n  TOGGLE,\n  RANGE,\n  PHONE,\n  CURRENCY,\n  CHECKBOX_RADIO,\n  HANDLE,\n  ATTACHMENT,\n}\n\n/**\n * Option for select, radio, etc. inputs.\n */\nexport type InputOption = {\n  /** Unique option identifier */\n  id: string;\n  /** Display name */\n  name: string;\n  /** Whether the option is selected by default */\n  selected?: boolean;\n  /** Display order */\n  order: number;\n};\n\n/**\n * Metadata for a form field.\n */\nexport type InputMetadata = {\n  /** Associated form control (optional, created internally by val-form) */\n  control?: FormControl;\n  /** From control (only for NUMBER_FROM_TO type) */\n  fromControl?: FormControl;\n  /** To control (only for NUMBER_FROM_TO type) */\n  toControl?: FormControl;\n  /** Unique token for the input */\n  token: string;\n  /** Display label */\n  label: string;\n  /** Field name */\n  name: string;\n  /** Help text (shown below input, for validation hints) */\n  hint: string;\n  /** Description text (shown below label, explains the field purpose) */\n  description?: string;\n  /** Input placeholder */\n  placeholder: string;\n  /** Input type */\n  type: InputType;\n  /** Display order */\n  order: number;\n  /** Associated validators */\n  validators: ValidatorFn[];\n  /** Options (for select, radio, etc.) */\n  options?: InputOption[];\n  /** Allowed range (for number, date, etc.) */\n  range?: {\n    min: number;\n    max: number;\n  };\n  /** Custom error messages */\n  errors: {\n    [key: string]: string;\n  };\n  /** Initial value for the field */\n  value?: string;\n  /** Default value configuration - string for custom defaults, true for auto defaults */\n  withDefault?: string | boolean;\n  /** Field state */\n  state: ComponentState;\n  /** Label for \"from\" field (only for NUMBER_FROM_TO type) */\n  fromLabel?: string;\n  /** Label for \"to\" field (only for NUMBER_FROM_TO type) */\n  toLabel?: string;\n  /** Placeholder for \"from\" field (only for NUMBER_FROM_TO type) */\n  fromPlaceholder?: string;\n  /** Placeholder for \"to\" field (only for NUMBER_FROM_TO type) */\n  toPlaceholder?: string;\n\n  // i18n support properties\n  /** Key for content lookup */\n  contentKey?: string;\n  /** Component class name for content lookup */\n  contentClass?: string;\n  /** Fallback text if content key is not found */\n  contentFallback?: string;\n\n  // select-input specific i18n properties\n  /** Custom header text for select modal */\n  modalHeader?: string;\n  /** Custom cancel button text for select modal */\n  cancelText?: string;\n  /** Custom OK button text for select modal */\n  okText?: string;\n  /** Interface del ion-select (default: 'popover'). 'modal' para listas largas. */\n  selectInterface?: 'popover' | 'modal' | 'action-sheet' | 'alert';\n\n  // check-input specific properties\n  /** Position of label for checkbox ('start' | 'end') */\n  labelPlacement?: 'start' | 'end';\n\n  // PIN_CODE specific properties\n  /** Number of digits in PIN (default: 5, only for PIN_CODE type) */\n  length?: number;\n  /** Size of the input boxes: 'small' | 'medium' | 'large' (default: 'medium', only for PIN_CODE type) */\n  size?: 'small' | 'medium' | 'large';\n  /** Allow only numbers (default: true, only for PIN_CODE type) */\n  allowNumbersOnly?: boolean;\n  /** Mask input - show dots instead of characters (only for PIN_CODE type) */\n  mask?: boolean;\n  /** Auto focus first input (only for PIN_CODE type) */\n  autoFocus?: boolean;\n  /** Custom input styles (only for PIN_CODE type) */\n  inputStyles?: Record<string, string>;\n\n  /** Upload function (only for ATTACHMENT type). Receives a File, must resolve to the uploaded URL. */\n  uploadFn?: (file: File) => Promise<string>;\n};\n\n/**\n * A section in a form, grouping multiple fields.\n */\nexport type FormSection = {\n  /** Section name */\n  name: string;\n  /** Display order */\n  order: number;\n  /** Fields included in the section */\n  fields: InputMetadata[];\n};\n\n/**\n * Data sent when submitting a form.\n */\nexport type FormSubmit = {\n  /** Form field values as key-value pairs */\n  fields: Record<string, any>;\n  /** Optional token for the operation */\n  token?: string;\n};\n\n/**\n * Metadata for a complete form.\n */\nexport type FormMetadata = {\n  /** Form name */\n  name: string;\n  /** Form sections */\n  sections: FormSection[];\n  /**\n   * Configuración del botón de submit. Opcional: en modo `controlled` el form\n   * no renderiza submit propio (lo maneja el host) y `actions` se ignora.\n   */\n  actions?: ButtonMetadata;\n  /** Global form state */\n  state: ComponentState;\n  /**\n   * Espacio vertical entre campos, en px. Si se omite, usa el default\n   * responsivo de la lib (8px mobile / 12px desktop). Útil para formularios\n   * densos o más aireados sin tocar CSS del consumer.\n   */\n  fieldSpacing?: number;\n  /**\n   * Modo embebido: el form NO renderiza su button-group/footer de submit.\n   * Solo campos + validación. Para wizards/hosts que controlan la navegación\n   * y leen el estado del form vía `@ViewChild(FormComponent)` (signals públicos\n   * `value`/`valid` + método `validate()`/`markAllTouched()`).\n   * Cuando es `true`, ignora `stickyFooter`.\n   */\n  controlled?: boolean;\n  /**\n   * Fija el button-group de submit al fondo (`position: sticky; bottom: 0`)\n   * para modales largos con scroll. Solo aplica si NO es `controlled`.\n   * Por defecto (sin flags) el submit es inline al final del form.\n   */\n  stickyFooter?: boolean;\n};\n\n/**\n * Possible action types for a toolbar.\n */\nexport enum ToolbarActionType {\n  AVATAR = 'AVATAR',\n  ICON = 'ICON',\n  IMAGE = 'IMAGE',\n  BUTTON = 'BUTTON',\n}\n\n/**\n * Toolbar action definition.\n */\nexport type ToolbarAction = {\n  /** Action type */\n  type: 'AVATAR' | 'ICON' | 'IMAGE' | 'BUTTON';\n  /** Optional token identifier */\n  token?: string;\n  /** Toolbar position */\n  position: 'left' | 'right' | 'center';\n  /** Optional description */\n  description?: string;\n  /** Associated image (if any) */\n  image?: ImageMetadata;\n  /**\n   * User shape para el modo `AVATAR` — habilita fallback inteligente:\n   * foto → iniciales (de `name`/`email`) → icono persona. Si se omite, el\n   * toolbar solo muestra la imagen pasada en `description`.\n   */\n  user?: { name?: string; email?: string; avatarUrl?: string; handle?: string } | null;\n  /** Controls avatar size when type is AVATAR. Defaults to 'small'. */\n  avatarSize?: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n};\n\n/**\n * Metadata for an icon.\n */\nexport interface IconMetada {\n  /** Icon name */\n  name: string;\n  /** Icon slot position */\n  slot: 'start' | 'end';\n}\n\n/**\n * Button configuration object.\n * Supports both static and reactive content.\n * @type {ButtonMetadata}\n * @property text - Static button label (takes precedence over textConfig).\n * @property textConfig - Reactive content configuration for button text.\n * @property color - The button color (Ionic color string).\n * @property icon - Icon to display (optional).\n * @property state - Button state (enabled, disabled, working, etc.).\n * @property expand, fill, size, shape, href, target, download, handler, etc. - See ButtonMetadata for all options.\n */\nexport interface ButtonMetadata {\n  /** Associated action type */\n  actionType?: ActionType;\n  /** Button expansion */\n  expand?: 'full' | 'block';\n  /** Associated link */\n  link?: string;\n  /** Associated href link */\n  href?: string;\n  /** Angular router link (SPA navigation, no reload) */\n  routerLink?: string | any[];\n  /** Link target */\n  target?: '_blank' | '_self' | '_parent' | '_top';\n  /** Download file name */\n  download?: string;\n  /** Button color */\n  color: Color;\n  /** Button state */\n  state: ComponentState;\n  /** Static display text (takes precedence over reactive content) */\n  text?: string;\n  /** Reactive content configuration for button text */\n  contentKey?: string;\n  /** Component class name for content lookup (required with contentKey) */\n  contentClass?: string;\n  /** Fallback text if contentKey is not found */\n  contentFallback?: string;\n  /** Values to interpolate into the content string */\n  contentInterpolation?: Record<string, string | number>;\n  /** Associated icon */\n  icon?: IconMetada;\n  /** Button shape */\n  shape?: 'round';\n  /** Button size */\n  size?: 'small' | 'default' | 'large';\n  /** Button fill */\n  fill?: 'clear' | 'outline' | 'solid' | 'default';\n  /** Button type */\n  type: 'button' | 'submit' | 'reset';\n  /** Optional token identifier */\n  token?: string;\n  /** Optional reference */\n  ref?: any;\n  /** Action handler */\n  handler?: (value: any) => any | Promise<any>;\n}\n\n/**\n * Configuration for reactive content in val-button component.\n * Use this interface when you only need to specify content-related properties.\n * This follows the same pattern as TextContentConfig for consistency.\n */\nexport interface ButtonContentConfig {\n  contentKey: string;\n  contentClass: string;\n  contentFallback?: string;\n  contentInterpolation?: Record<string, string | number>;\n}\n","/**\n * Service for downloading files and opening links in new tabs.\n * Provides utility methods for browser-based file downloads and extracting file names from URLs.\n */\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class DownloadService {\n  /**\n   * Extracts the file name from a given URL.\n   * @param url The file URL\n   * @returns The file name\n   */\n  getFileNameFromUrl(url: string): string {\n    try {\n      const pathSegments = url.split('/');\n      const lastSegment = pathSegments[pathSegments.length - 1];\n      const fileName = decodeURIComponent(lastSegment);\n      return fileName;\n    } catch (error) {\n      console.error('Error al obtener nombre de archivo: ', JSON.stringify(error));\n      return 'filename';\n    }\n  }\n\n  /**\n   * Opens a given URL in a new browser tab and triggers download if possible.\n   * @param url The file URL\n   */\n  openNewTab(url: string): void {\n    if (url) {\n      const fileName = this.getFileNameFromUrl(url);\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = fileName;\n      link.target = '_blank';\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n    } else {\n      console.error('La URL no está definida');\n    }\n  }\n\n  /**\n   * Downloads a file from the browser using fetch and triggers a download dialog.\n   * @param url The file URL\n   */\n  downloadLinkFromBrowser(url: string): void {\n    console.log('trying to download file from url');\n    if (url) {\n      fetch(url)\n        .then(response => response.blob())\n        .then(blob => {\n          const url = window.URL.createObjectURL(blob);\n          const link = document.createElement('a');\n          link.href = url;\n\n          const fileName = this.getFileNameFromUrl(url);\n          link.download = `${+new Date()}-${fileName}`;\n          link.target = '_self';\n          link.click();\n\n          window.URL.revokeObjectURL(url);\n        })\n        .catch(error => {\n          console.error('Error al descargar el archivo:', JSON.stringify(error));\n        });\n    } else {\n      console.error('La URL no está definida');\n    }\n  }\n}\n","import { ToolbarAction } from '../../components/types';\n\n/**\n * Tipos de header soportados por NavigationService\n */\nexport type HeaderType = 'home' | 'back' | 'custom' | 'none';\n\n/**\n * Configuracion de header para paginas con boton volver\n */\nexport interface BackHeaderConfig {\n  type: 'back';\n  /** Clave i18n para el titulo (formato: 'namespace.key') */\n  titleKey: string;\n  /** Texto del boton volver (opcional, usa icono por defecto) */\n  backText?: string;\n  /** Mostrar menu hamburguesa (opcional, false por defecto) */\n  withMenu?: boolean;\n}\n\n/**\n * Configuracion de header para pagina principal (home)\n */\nexport interface HomeHeaderConfig {\n  type: 'home';\n  /** Mostrar menu hamburguesa */\n  withMenu?: boolean;\n  /** Acciones adicionales en el header */\n  actions?: ToolbarAction[];\n  /** Logo personalizado (CSS variable o URL) */\n  logoSrc?: string;\n}\n\n/**\n * Configuracion de header personalizado\n */\nexport interface CustomHeaderConfig {\n  type: 'custom';\n  /** Titulo del header */\n  title?: string;\n  /** Clave i18n para el titulo */\n  titleKey?: string;\n  /** Mostrar boton volver */\n  withBack?: boolean;\n  /** Texto del boton volver */\n  backText?: string;\n  /** Mostrar acciones */\n  withActions?: boolean;\n  /** Mostrar menu */\n  withMenu?: boolean;\n  /** Acciones del header */\n  actions?: ToolbarAction[];\n}\n\n/**\n * Sin header\n */\nexport interface NoHeaderConfig {\n  type: 'none';\n}\n\n/**\n * Union de todos los tipos de configuracion de header\n */\nexport type HeaderConfig =\n  | BackHeaderConfig\n  | HomeHeaderConfig\n  | CustomHeaderConfig\n  | NoHeaderConfig;\n\n/**\n * Configuracion por defecto para header tipo 'home'\n */\nexport const DEFAULT_HOME_HEADER: HomeHeaderConfig = {\n  type: 'home',\n  withMenu: false,\n  actions: [],\n};\n\n/**\n * Configuracion por defecto para header tipo 'back'\n */\nexport const DEFAULT_BACK_HEADER: BackHeaderConfig = {\n  type: 'back',\n  titleKey: '',\n};\n","/* eslint-disable no-underscore-dangle */\n\n/**\n * Service for opening URLs using Capacitor's InAppBrowser plugin.\n * Provides a method to open links in a popover-style browser within the app.\n */\nimport { Injectable } from '@angular/core';\nimport { Browser, OpenOptions } from '@capacitor/browser';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class InAppBrowserService {\n  /**\n   * Default options for the in-app browser.\n   */\n  options: OpenOptions = {\n    presentationStyle: 'popover',\n    url: '',\n  };\n  constructor() {}\n\n  /**\n   * Opens a URL using Capacitor's InAppBrowser with the configured options.\n   * @param url The URL to open\n   */\n  async openWithInAppBrowser(url: string) {\n    await Browser.open({ ...this.options, url });\n  }\n}\n","import { Location } from '@angular/common';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { NavigationExtras, Router } from '@angular/router';\nimport { InAppBrowserService } from '../in-app-browser.service';\nimport { I18nService } from '../i18n/i18n.service';\nimport {\n  HeaderConfig,\n  BackHeaderConfig,\n  HomeHeaderConfig,\n  CustomHeaderConfig,\n  DEFAULT_HOME_HEADER,\n} from './types';\nimport { ToolbarAction } from '../../components/types';\n\n/**\n * NavigationService\n *\n * Servicio centralizado para navegacion y configuracion de headers.\n * Permite a las paginas declarar su tipo de header de forma simple.\n *\n * @example\n * // En una pagina con header de tipo \"back\"\n * export class ProfilePage {\n *   private nav = inject(NavigationService);\n *\n *   constructor() {\n *     this.nav.setBackHeader('pageTitle', 'Settings.Profile');\n *   }\n * }\n *\n * @example\n * // En el layout principal (tabs.page.ts)\n * export class TabsPage {\n *   private nav = inject(NavigationService);\n *\n *   headerConfig = this.nav.headerConfig;\n *   headerTitle = this.nav.headerTitle;\n * }\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class NavigationService {\n  private i18n = inject(I18nService);\n\n  // ============================================\n  // Header State (Signals)\n  // ============================================\n\n  private readonly _headerConfig = signal<HeaderConfig>(DEFAULT_HOME_HEADER);\n\n  /**\n   * Configuracion actual del header (readonly signal)\n   */\n  readonly headerConfig = this._headerConfig.asReadonly();\n\n  /**\n   * Titulo del header traducido y reactivo al cambio de idioma.\n   * Solo aplica para headers tipo 'back' o 'custom' con titleKey.\n   */\n  readonly headerTitle = computed(() => {\n    const config = this._headerConfig();\n    this.i18n.lang(); // Dependencia reactiva al idioma\n\n    if (config.type === 'back' && config.titleKey) {\n      return this.translateKey(config.titleKey);\n    }\n\n    if (config.type === 'custom') {\n      if (config.titleKey) {\n        return this.translateKey(config.titleKey);\n      }\n      return config.title || '';\n    }\n\n    return '';\n  });\n\n  /**\n   * Indica si el header actual tiene boton volver\n   */\n  readonly hasBackButton = computed(() => {\n    const config = this._headerConfig();\n    return config.type === 'back' || (config.type === 'custom' && config.withBack);\n  });\n\n  // ============================================\n  // Legacy Properties (Navigation)\n  // ============================================\n\n  /**\n   * Arbitrary data to be transferred during navigation.\n   * @deprecated Use navigateWithData instead\n   */\n  data: any;\n\n  constructor(\n    public router: Router,\n    public location: Location,\n    public inAppBrowser: InAppBrowserService\n  ) {}\n\n  // ============================================\n  // Header Configuration Methods\n  // ============================================\n\n  /**\n   * Configura un header tipo \"back\" con titulo traducido.\n   *\n   * @param key Clave i18n (ej: 'pageTitle')\n   * @param namespace Namespace i18n (ej: 'Settings.Profile')\n   * @param options Opciones adicionales (backText, withMenu)\n   *\n   * @example\n   * // Sin menu\n   * this.nav.setBackHeader('pageTitle', 'Settings.Profile');\n   *\n   * @example\n   * // Con menu hamburguesa\n   * this.nav.setBackHeader('pageTitle', 'Settings.Profile', { withMenu: true });\n   */\n  setBackHeader(\n    key: string,\n    namespace: string,\n    options?: { backText?: string; withMenu?: boolean }\n  ): void {\n    const config: BackHeaderConfig = {\n      type: 'back',\n      titleKey: `${namespace}.${key}`,\n      backText: options?.backText,\n      withMenu: options?.withMenu,\n    };\n    this._headerConfig.set(config);\n  }\n\n  /**\n   * Configura un header tipo \"home\" con logo y acciones.\n   *\n   * @param options Opciones del header home\n   *\n   * @example\n   * this.nav.setHomeHeader({\n   *   withMenu: true,\n   *   actions: [\n   *     { type: 'ICON', token: 'notifications', position: 'right', description: 'notifications-outline' }\n   *   ]\n   * });\n   */\n  setHomeHeader(options: Partial<Omit<HomeHeaderConfig, 'type'>> = {}): void {\n    const config: HomeHeaderConfig = {\n      type: 'home',\n      withMenu: options.withMenu ?? false,\n      actions: options.actions ?? [],\n      logoSrc: options.logoSrc,\n    };\n    this._headerConfig.set(config);\n  }\n\n  /**\n   * Configura un header personalizado.\n   *\n   * @param options Opciones del header\n   */\n  setCustomHeader(options: Omit<CustomHeaderConfig, 'type'>): void {\n    const config: CustomHeaderConfig = {\n      type: 'custom',\n      ...options,\n    };\n    this._headerConfig.set(config);\n  }\n\n  /**\n   * Oculta el header completamente.\n   */\n  hideHeader(): void {\n    this._headerConfig.set({ type: 'none' });\n  }\n\n  /**\n   * Resetea el header al estado por defecto (home).\n   */\n  resetHeader(): void {\n    this._headerConfig.set(DEFAULT_HOME_HEADER);\n  }\n\n  // ============================================\n  // Navigation Methods\n  // ============================================\n\n  /**\n   * Opens a URL using the in-app browser service.\n   * @param url The URL to open\n   */\n  navigateInApp(url: string): void {\n    this.inAppBrowser.openWithInAppBrowser(url);\n  }\n\n  /**\n   * Navigates to a route and transfers data using Angular Router state.\n   * @param route The route to navigate to\n   * @param dataTransfer The data to transfer\n   */\n  navigateWithData(route: string, dataTransfer: any): void {\n    const navigationExtras: NavigationExtras = {\n      state: {\n        data: dataTransfer,\n      },\n    };\n\n    this.router.navigate([route], navigationExtras);\n  }\n\n  /**\n   * Navigates to a URL using Angular Router.\n   * @param url The URL to navigate to\n   */\n  navigateByUrl(url: string): void {\n    this.router\n      .navigateByUrl(url)\n      .then(() => {})\n      .catch(() => {});\n  }\n\n  /**\n   * Opens a URL in a new browser tab.\n   * @param url The URL to open\n   */\n  openInNewTab(url: string): void {\n    window.open(url, '_blank', 'noopener,noreferrer');\n  }\n\n  /**\n   * Navigates back to the previous page in the browser history.\n   */\n  back(): void {\n    this.location.back();\n  }\n\n  // ============================================\n  // Private Helpers\n  // ============================================\n\n  /**\n   * Traduce una clave i18n en formato 'namespace.key'\n   */\n  private translateKey(fullKey: string): string {\n    const lastDot = fullKey.lastIndexOf('.');\n    if (lastDot === -1) {\n      return this.i18n.t(fullKey);\n    }\n    const namespace = fullKey.substring(0, lastDot);\n    const key = fullKey.substring(lastDot + 1);\n    return this.i18n.t(key, namespace);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonButton, IonIcon, IonSpinner, IonText } from '@ionic/angular/standalone';\nimport { DownloadService } from '../../../services/download.service';\nimport { IconService } from '../../../services/icons.service';\nimport { NavigationService } from '../../../services/navigation';\nimport { PresetService } from '../../../services/presets';\nimport { ActionType, ButtonMetadata, ComponentStates } from '../../types';\n\n@Component({\n  selector: 'val-button',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonButton, IonIcon, IonSpinner, IonText],\n  template: `\n    <ion-button\n      [attr.data-testid]=\"resolvedProps.token\"\n      [type]=\"resolvedProps.type\"\n      [color]=\"resolvedProps.color\"\n      [expand]=\"resolvedProps.expand\"\n      [fill]=\"resolvedProps.fill\"\n      [size]=\"resolvedProps.size\"\n      [href]=\"resolvedProps.href\"\n      [routerLink]=\"resolvedProps.routerLink ?? null\"\n      [target]=\"resolvedProps.target\"\n      [shape]=\"resolvedProps.shape\"\n      (click)=\"clickHandler()\"\n      [disabled]=\"resolvedProps.state === states.DISABLED\"\n      [ngClass]=\"resolvedProps.size ? [resolvedProps.size] : []\"\n    >\n      <ion-icon *ngIf=\"resolvedProps.icon\" [slot]=\"resolvedProps.icon.slot\" [name]=\"resolvedProps.icon.name\"></ion-icon>\n      <ion-spinner *ngIf=\"resolvedProps.state === states.WORKING\" name=\"circular\"></ion-spinner>\n      <ion-text *ngIf=\"resolvedProps.state !== states.WORKING\">{{ displayText }}</ion-text>\n    </ion-button>\n  `,\n  styleUrls: ['./button.component.scss'],\n})\n/**\n * val-button\n *\n * A customizable button supporting icons, loading state, navigation, and presets.\n *\n * @example With preset (recommended with i18n):\n * <val-button preset=\"primary-action\" [props]=\"{ text: 'Submit' | t }\"></val-button>\n *\n * @example Static text:\n * <val-button [props]=\"{\n *   text: 'Save',\n *   color: 'primary',\n *   type: 'button',\n *   state: 'ENABLED',\n *   icon: { name: 'save', slot: 'start' }\n * }\" (onClick)=\"handler()\"></val-button>\n *\n * @input preset: string - Name of preset to apply (e.g., 'primary-action', 'danger')\n * @input props: ButtonMetadata - Configuration for the button (overrides preset values)\n * @output onClick - Emits when the button is clicked\n */\nexport class ButtonComponent implements OnInit, OnChanges {\n  states = ComponentStates;\n\n  private presets = inject(PresetService);\n\n  /**\n   * The text to display on the button.\n   */\n  displayText: string = '';\n\n  /**\n   * Preset name to apply. Presets define reusable button configurations\n   * (size, color, fill, etc.) that can be registered at app level.\n   *\n   * @example\n   * <val-button preset=\"primary-action\" [props]=\"{ text: 'Save' }\"></val-button>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Button configuration. Values here override preset values.\n   * When using presets, only partial props are needed (preset provides defaults).\n   */\n  @Input() props: Partial<ButtonMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   * Preset values are overridden by explicit props.\n   */\n  resolvedProps: ButtonMetadata = {} as ButtonMetadata;\n\n  /**\n   * Event emitted when the button is clicked.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  constructor(\n    private download: DownloadService,\n    _icon: IconService,\n    private navigation: NavigationService\n  ) {}\n\n  ngOnInit() {\n    this.resolveProps();\n    this.setupDisplayText();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      this.setupDisplayText();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('button', this.preset) as Partial<ButtonMetadata>) : {};\n\n    // Merge: preset defaults < explicit props\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as ButtonMetadata;\n  }\n\n  /**\n   * Set up the text content based on the resolved props configuration.\n   */\n  private setupDisplayText(): void {\n    if (this.resolvedProps.text) {\n      if (this.resolvedProps.contentInterpolation) {\n        this.displayText = this.interpolateContent(this.resolvedProps.text, this.resolvedProps.contentInterpolation);\n      } else {\n        this.displayText = this.resolvedProps.text;\n      }\n    } else if (this.resolvedProps.contentFallback) {\n      // Backwards compatibility: use fallback if text is not provided\n      this.displayText = this.resolvedProps.contentFallback;\n    } else {\n      this.displayText = '';\n    }\n  }\n\n  /**\n   * Interpolate placeholders in content with provided values.\n   * Supports {{placeholder}} format.\n   */\n  private interpolateContent(content: string, values: Record<string, any>): string {\n    return content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n      return values[key] !== undefined ? String(values[key]) : match;\n    });\n  }\n\n  clickHandler() {\n    if (this.resolvedProps.state === this.states.DISABLED) {\n      return;\n    }\n\n    if (this.resolvedProps.actionType === ActionType.APP_NAVIGATION) {\n      this.navigation.navigateByUrl(this.resolvedProps.link);\n    }\n\n    if (this.resolvedProps.download) {\n      this.download.downloadLinkFromBrowser(this.resolvedProps.download);\n    }\n\n    if (this.resolvedProps.handler) {\n      this.resolvedProps.handler(this.resolvedProps.ref);\n    }\n\n    this.onClick.emit(this.resolvedProps.token);\n  }\n}\n","import { ButtonMetadata, IconMetada } from '../../types';\n\nexport const Icon = (name: string, slot: 'start' | 'end'): IconMetada => {\n  return {\n    name,\n    slot,\n  };\n};\n\n/* name convention: COLOR FILL SIZE [optionals: SHAPE EXPAND ICON HREF/DOWNLOAD] TYPE */\n\nexport const BaseDefault = (text: string, type: 'button' | 'submit' | 'reset'): ButtonMetadata => {\n  return {\n    color: 'primary',\n    state: 'ENABLED',\n    text,\n    size: 'default',\n    type,\n  };\n};\n\nexport const ClearDefault = (text: string, type: 'button' | 'submit' | 'reset'): ButtonMetadata => {\n  return { ...BaseDefault(text, type), fill: 'clear' };\n};\n\nexport const ClearDefaultRound = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...ClearDefault(text, type), shape: 'round' };\n};\n\nexport const SolidDefault = (text: string, type: 'button' | 'submit' | 'reset'): ButtonMetadata => {\n  return { ...BaseDefault(text, type), fill: 'solid' };\n};\n\nexport const SolidDefaultRound = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...SolidDefault(text, type), shape: 'round' };\n};\n\nexport const OutlineDefault = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...BaseDefault(text, type), fill: 'outline' };\n};\n\nexport const OutlineDefaultRound = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...OutlineDefault(text, type), shape: 'round' };\n};\n\nexport const ClearDefaultFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...ClearDefault(text, type), expand: 'full' };\n};\n\nexport const ClearDefaultRoundFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...ClearDefaultRound(text, type), expand: 'full' };\n};\n\nexport const ClearDefaultBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...ClearDefault(text, type), expand: 'block' };\n};\n\nexport const ClearDefaultRoundBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...ClearDefaultRound(text, type), expand: 'block' };\n};\n\nexport const SolidDefaultFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...SolidDefault(text, type), expand: 'full' };\n};\n\nexport const SolidDefaultRoundFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...SolidDefaultRound(text, type), expand: 'full' };\n};\n\nexport const SolidDefaultBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...SolidDefault(text, type), expand: 'block' };\n};\n\nexport const SolidDefaultRoundBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...SolidDefaultRound(text, type), expand: 'block' };\n};\n\nexport const OutlineDefaultFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...OutlineDefault(text, type), expand: 'full' };\n};\n\nexport const OutlineDefaultRoundFull = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...OutlineDefaultRound(text, type), expand: 'full' };\n};\n\nexport const OutlineDefaultBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...OutlineDefault(text, type), expand: 'block' };\n};\n\nexport const OutlineDefaultRoundBlock = (\n  text: string,\n  type: 'button' | 'submit' | 'reset'\n): ButtonMetadata => {\n  return { ...OutlineDefaultRound(text, type), expand: 'block' };\n};\n\nexport const SolidDefaultButton = (text: string): ButtonMetadata => {\n  return SolidDefault(text, 'button');\n};\n\nexport const SolidSmallButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefault(text, 'button'), size: 'small' };\n};\n\nexport const SolidLargeButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefault(text, 'button'), size: 'large' };\n};\n\nexport const SolidDefaultRoundButton = (text: string): ButtonMetadata => {\n  return SolidDefaultRound(text, 'button');\n};\n\nexport const SolidSmallRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefaultRound(text, 'button'), size: 'small' };\n};\n\nexport const SolidLargeRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefaultRound(text, 'button'), size: 'large' };\n};\n\nexport const SolidFullButton = (text: string): ButtonMetadata => {\n  return SolidDefaultFull(text, 'button');\n};\n\nexport const SolidBlockButton = (text: string): ButtonMetadata => {\n  return SolidDefaultBlock(text, 'button');\n};\n\n/** PRIMARY */\n\nexport const PrimarySolidDefaultRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefaultRoundButton(text), color: 'primary' };\n};\n\nexport const PrimarySolidDefaultRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...PrimarySolidDefaultRoundButton(text), icon };\n};\n\nexport const PrimarySolidDefaultRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidDefaultRoundButton(text), href, target };\n};\n\nexport const PrimarySolidDefaultRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidDefaultRoundIconButton(text, icon), href, target };\n};\n\nexport const PrimarySolidSmallRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidSmallRoundButton(text), color: 'primary' };\n};\n\nexport const PrimarySolidSmallRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...PrimarySolidSmallRoundButton(text), icon };\n};\n\nexport const PrimarySolidSmallRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidSmallRoundButton(text), href, target };\n};\n\nexport const PrimarySolidSmallRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidSmallRoundIconButton(text, icon), href, target };\n};\n\nexport const PrimarySolidLargeRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidLargeRoundButton(text), color: 'primary' };\n};\n\nexport const PrimarySolidLargeRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...PrimarySolidLargeRoundButton(text), icon };\n};\n\nexport const PrimarySolidLargeRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidLargeRoundButton(text), href, target };\n};\n\nexport const PrimarySolidLargeRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidLargeRoundIconButton(text, icon), href, target };\n};\n\nexport const PrimarySolidBlockButton = (text: string): ButtonMetadata => {\n  return { ...SolidBlockButton(text), color: 'primary' };\n};\n\nexport const PrimarySolidBlockIconButton = (text: string, icon: IconMetada): ButtonMetadata => {\n  return { ...PrimarySolidBlockButton(text), icon };\n};\n\nexport const PrimarySolidBlockHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidBlockButton(text), href, target };\n};\n\nexport const PrimarySolidBlockIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidBlockIconButton(text, icon), href, target };\n};\n\nexport const PrimarySolidFullButton = (text: string): ButtonMetadata => {\n  return { ...SolidFullButton(text), color: 'primary' };\n};\n\nexport const PrimarySolidFullIconButton = (text: string, icon: IconMetada): ButtonMetadata => {\n  return { ...PrimarySolidFullButton(text), icon };\n};\n\nexport const PrimarySolidFullHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidFullButton(text), href, target };\n};\n\nexport const PrimarySolidFullIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...PrimarySolidFullIconButton(text, icon), href, target };\n};\n\n/** SECONDARY */\n\nexport const SecondarySolidDefaultRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidDefaultRoundButton(text), color: 'secondary' };\n};\n\nexport const SecondarySolidDefaultRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...SecondarySolidDefaultRoundButton(text), icon };\n};\n\nexport const SecondarySolidDefaultRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidDefaultRoundButton(text), href, target };\n};\n\nexport const SecondarySolidDefaultRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidDefaultRoundIconButton(text, icon), href, target };\n};\n\nexport const SecondarySolidSmallRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidSmallRoundButton(text), color: 'secondary' };\n};\n\nexport const SecondarySolidSmallRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...SecondarySolidSmallRoundButton(text), icon };\n};\n\nexport const SecondarySolidSmallRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidSmallRoundButton(text), href, target };\n};\n\nexport const SecondarySolidSmallRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidSmallRoundIconButton(text, icon), href, target };\n};\n\nexport const SecondarySolidLargeRoundButton = (text: string): ButtonMetadata => {\n  return { ...SolidLargeRoundButton(text), color: 'secondary' };\n};\n\nexport const SecondarySolidLargeRoundIconButton = (\n  text: string,\n  icon: IconMetada\n): ButtonMetadata => {\n  return { ...SecondarySolidLargeRoundButton(text), icon };\n};\n\nexport const SecondarySolidLargeRoundHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidLargeRoundButton(text), href, target };\n};\n\nexport const SecondarySolidLargeRoundIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidLargeRoundIconButton(text, icon), href, target };\n};\n\nexport const SecondarySolidFullButton = (text: string): ButtonMetadata => {\n  return { ...SolidFullButton(text), color: 'secondary' };\n};\n\nexport const SecondarySolidFullIconButton = (text: string, icon: IconMetada): ButtonMetadata => {\n  return { ...SecondarySolidFullButton(text), icon };\n};\n\nexport const SecondarySolidFullHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidFullButton(text), href, target };\n};\n\nexport const SecondarySolidFullIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidFullIconButton(text, icon), href, target };\n};\n\nexport const SecondarySolidBlockButton = (text: string): ButtonMetadata => {\n  return { ...SolidBlockButton(text), color: 'secondary' };\n};\n\nexport const SecondarySolidBlockIconButton = (text: string, icon: IconMetada): ButtonMetadata => {\n  return { ...SecondarySolidBlockButton(text), icon };\n};\n\nexport const SecondarySolidBlockHrefButton = (\n  text: string,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidBlockButton(text), href, target };\n};\n\nexport const SecondarySolidBlockIconHrefButton = (\n  text: string,\n  icon: IconMetada,\n  href: string,\n  target: '_blank' | '_self' | '_parent' | '_top'\n): ButtonMetadata => {\n  return { ...SecondarySolidBlockIconButton(text, icon), href, target };\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { DisplayMetadata } from './types';\n\n@Component({\n  selector: 'val-display',\n  standalone: true,\n  imports: [CommonModule, IonText],\n  template: `\n    <ion-text [color]=\"props.color\">\n      <p [class]=\"props.size\">\n        {{ getDisplayContent() }}\n      </p>\n    </ion-text>\n  `,\n  styleUrls: ['./display.component.scss'],\n})\n/**\n * val-display\n *\n * Displays prominent text or titles with custom color and size.\n *\n * @example\n * <val-display [props]=\"{ content: 'Title', color: 'dark', size: 'large' }\"></val-display>\n *\n * @input props: DisplayMetadata - Configuration for the display (content, color, size)\n */\nexport class DisplayComponent {\n  /**\n   * Display configuration object.\n   * @type {DisplayMetadata}\n   * @property content - Static text to display.\n   * @property color - The text color (Ionic color string).\n   * @property size - The text size ('small' | 'medium' | 'large' | 'xlarge').\n   */\n  @Input()\n  props: DisplayMetadata;\n\n  /**\n   * Returns the content to display.\n   * Uses static content, or contentConfig fallback for backwards compatibility.\n   */\n  getDisplayContent(): string {\n    if (this.props.content !== undefined) {\n      return this.props.content;\n    }\n    // Backwards compatibility: use fallback from contentConfig if present\n    if (this.props.contentConfig?.fallback) {\n      return this.props.contentConfig.fallback;\n    }\n    return '';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { DividerMetadata } from './types';\n\n/**\n * val-divider\n *\n * A horizontal divider for separating content sections.\n *\n * @example\n * <val-divider [props]=\"{ size: 'medium', color: 'light', fill: 'solid' }\"></val-divider>\n *\n * @input props: DividerMetadata - Configuration for the divider (size, color, fill)\n */\n@Component({\n  selector: 'val-divider',\n  standalone: true,\n  imports: [CommonModule],\n  template: ` <div [ngClass]=\"['divider', props.size, props.color, props.fill]\"></div> `,\n  styleUrls: ['./divider.component.scss'],\n})\nexport class DividerComponent implements OnInit {\n  /**\n   * Divider configuration object.\n   * @type {DividerMetadata}\n   * @property size - The divider size ('small' | 'medium' | 'large').\n   * @property color - The divider color.\n   * @property fill - The divider fill style ('solid' | 'gradient').\n   */\n  @Input()\n  props: DividerMetadata;\n  constructor() {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { DownloadService } from '../../../services/download.service';\nimport { HrefMetadata } from './types';\n\n@Component({\n  selector: 'val-href',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <a\n      [ngClass]=\"[props.color]\"\n      [class.hoverable]=\"props.hoverable\"\n      [href]=\"props.url\"\n      [attr.target]=\"props.target\"\n      (click)=\"onClickHandler($event)\"\n      >{{ props.text }}</a\n    >\n  `,\n  styleUrls: ['./href.component.scss'],\n})\n/**\n * val-href\n *\n * A styled anchor/link element, supporting download and click events.\n *\n * @example\n * <val-href [props]=\"{ url: 'https://...', text: 'Open', color: 'primary', download: true }\" (onClick)=\"handler()\"></val-href>\n *\n * @input props: HrefMetadata - Configuration for the link (url, text, color, download, etc.)\n * @output onClick - Emits when the link is clicked\n */\nexport class HrefComponent implements OnInit {\n  /**\n   * Link configuration object.\n   * @type {HrefMetadata}\n   * @property url - The URL to open.\n   * @property text - The link text.\n   * @property color - The link color (Ionic color string).\n   * @property download - Whether to trigger a download (optional).\n   * @property hoverable - Whether the link is hoverable (optional).\n   * @property token - Optional token for event identification.\n   */\n  @Input() props: HrefMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  constructor(private downloadService: DownloadService) {}\n\n  ngOnInit() {}\n\n  getFileName() {\n    return this.downloadService.getFileNameFromUrl(this.props.url);\n  }\n\n  onClickHandler(event: MouseEvent) {\n    if (this.props.download && this.props.url) {\n      event.preventDefault();\n      this.downloadService.downloadLinkFromBrowser(this.props.url);\n    }\n    this.onClick.emit(this.props.token);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { IconService } from '../../../services/icons.service';\nimport { IconMetadata } from './types';\n\n@Component({\n  selector: 'val-icon',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: ` <ion-icon aria-hidden=\"true\" [ngClass]=\"[props.size]\" [name]=\"props.name\" [color]=\"props.color\" /> `,\n  styleUrls: ['./icon.component.scss'],\n})\n/**\n * val-icon\n *\n * Displays an icon from the Ionicons set, with configurable size and color.\n *\n * @example\n * <val-icon [props]=\"{ name: 'star', size: 'large', color: 'warning' }\"></val-icon>\n *\n * @input props: IconMetadata - Configuration for the icon (name, color, size)\n */\nexport class IconComponent implements OnInit {\n  /**\n   * Icon configuration object.\n   * @type {IconMetadata}\n   * @property name - The icon name (Ionicons).\n   * @property color - The icon color (Ionic color string).\n   * @property size - The icon size ('small' | 'medium' | 'large' | 'xlarge').\n   */\n  @Input()\n  props: IconMetadata;\n\n  constructor(service: IconService) {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, HostListener, Input, OnInit } from '@angular/core';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonModal,\n  IonTitle,\n  IonToolbar,\n} from '@ionic/angular/standalone';\nimport { ImageMetadata } from './types';\n\n@Component({\n  selector: 'val-image',\n  standalone: true,\n  imports: [CommonModule, IonModal, IonHeader, IonToolbar, IonTitle, IonContent, IonButton, IonIcon, IonButtons],\n  template: `\n    <figure\n      class=\"val-image-container\"\n      [class]=\"props.containerClass\"\n      [ngClass]=\"{\n        'val-image-container--left': props.alignment === 'left',\n        'val-image-container--center': props.alignment === 'center' || !props.alignment,\n        'val-image-container--right': props.alignment === 'right',\n      }\"\n      [ngStyle]=\"{\n        display: props.flex ? 'flex' : 'inline-block',\n      }\"\n    >\n      <div class=\"val-image-wrapper\">\n        @if (props.src.includes('--')) {\n          <img\n            class=\"val-image\"\n            [ngClass]=\"[\n              props.mode,\n              !props.width ? props.size : '',\n              props.previewMode ? 'val-image--preview-enabled' : '',\n            ]\"\n            [ngStyle]=\"{\n              content: 'var(' + props.src + ')',\n            }\"\n            [class.bordered]=\"props.bordered\"\n            [class.shaded]=\"props.shaded\"\n            [class.dark]=\"props.dark\"\n            [class.limited]=\"props.limited\"\n            [class.center]=\"props.alignment === 'center'\"\n            [alt]=\"props.alt\"\n            [style.width.rem]=\"props.width\"\n            [style.max-width.rem]=\"props.width\"\n            [style.height.px]=\"props.height\"\n            (click)=\"props.previewMode ? openPreview() : null\"\n          />\n        } @else {\n          <img\n            class=\"val-image\"\n            [ngClass]=\"[\n              props.mode,\n              !props.width ? props.size : '',\n              props.previewMode ? 'val-image--preview-enabled' : '',\n            ]\"\n            [class.bordered]=\"props.bordered\"\n            [class.shaded]=\"props.shaded\"\n            [class.dark]=\"props.dark\"\n            [class.limited]=\"props.limited\"\n            [class.center]=\"props.alignment === 'center'\"\n            [src]=\"props.src\"\n            [alt]=\"props.alt\"\n            [style.width.rem]=\"props.width\"\n            [style.max-width.rem]=\"props.width\"\n            [style.height.px]=\"props.height\"\n            (click)=\"props.previewMode ? openPreview() : null\"\n          />\n        }\n      </div>\n\n      @if (props.caption) {\n        <figcaption\n          class=\"val-image-caption\"\n          [ngClass]=\"{\n            'val-image-caption--small': props.captionSize === 'small',\n            'val-image-caption--medium': props.captionSize === 'medium' || !props.captionSize,\n            'val-image-caption--large': props.captionSize === 'large',\n          }\"\n        >\n          {{ props.caption }}\n        </figcaption>\n      }\n    </figure>\n\n    <!-- Modal de previsualización con ion-modal -->\n    <ion-modal [isOpen]=\"isPreviewOpen\" (didDismiss)=\"closePreview()\">\n      <ng-template>\n        <ion-header>\n          <ion-toolbar>\n            <!-- <ion-title>{{ props.alt || 'Previsualización de imagen' }}</ion-title> -->\n            <ion-buttons slot=\"end\">\n              <ion-button (click)=\"closePreview()\" fill=\"clear\">\n                <ion-icon name=\"close-outline\"></ion-icon>\n              </ion-button>\n            </ion-buttons>\n          </ion-toolbar>\n        </ion-header>\n\n        <ion-content>\n          <!-- Controles de zoom -->\n          <div class=\"val-image-preview-controls\">\n            <ion-button\n              (click)=\"zoomOut(); $event.stopPropagation()\"\n              [disabled]=\"zoomLevel <= minZoom\"\n              fill=\"clear\"\n              size=\"small\"\n            >\n              <ion-icon name=\"remove-outline\"></ion-icon>\n            </ion-button>\n\n            <span class=\"val-image-preview-zoom-level\">{{ Math.round(zoomLevel * 100) }}%</span>\n\n            <ion-button\n              (click)=\"zoomIn(); $event.stopPropagation()\"\n              [disabled]=\"zoomLevel >= maxZoom\"\n              fill=\"clear\"\n              size=\"small\"\n            >\n              <ion-icon name=\"add-outline\"></ion-icon>\n            </ion-button>\n          </div>\n\n          <!-- Imagen ampliada -->\n          <div\n            class=\"val-image-preview-viewport\"\n            (touchstart)=\"onTouchStart($event)\"\n            (touchmove)=\"onTouchMove($event)\"\n            (touchend)=\"onTouchEnd($event)\"\n            (wheel)=\"onWheel($event)\"\n            (mousedown)=\"onMouseDown($event)\"\n            (mousemove)=\"onMouseMove($event)\"\n            (mouseup)=\"onMouseUp($event)\"\n            (mouseleave)=\"onMouseUp($event)\"\n          >\n            <img\n              #previewImage\n              class=\"val-image-preview-img\"\n              [src]=\"props.src.includes('--') ? null : props.src\"\n              [ngStyle]=\"{\n                content: props.src.includes('--') ? 'var(' + props.src + ')' : null,\n                transform: 'scale(' + zoomLevel + ') translate(' + panX + 'px, ' + panY + 'px)',\n                cursor: isDragging ? 'grabbing' : zoomLevel > 1 ? 'grab' : 'default',\n              }\"\n              [alt]=\"props.alt\"\n              draggable=\"false\"\n            />\n          </div>\n        </ion-content>\n      </ng-template>\n    </ion-modal>\n  `,\n  styleUrls: ['./image.component.scss'],\n})\n/**\n * val-image\n *\n * Displays an image with various display options (bordered, shaded, dark, etc).\n * Now includes a container wrapper for better flexbox support and alignment options.\n *\n * NEW: Optional preview mode with full-screen zoom capabilities:\n * - Click to open full-screen preview (when previewMode is enabled)\n * - Pinch-to-zoom on mobile devices\n * - Mouse wheel zoom on desktop\n * - Pan/drag to navigate zoomed images\n * - Zoom controls with buttons\n * - Keyboard shortcuts (Esc to close, +/- to zoom, 0 to reset)\n * - Touch-friendly interface with gesture support\n *\n * @example Basic usage:\n * <val-image [props]=\"{\n *   src: 'url',\n *   alt: 'desc',\n *   width: 100,\n *   height: 100,\n *   bordered: true,\n *   alignment: 'center',\n *   caption: 'Image description'\n * }\"></val-image>\n *\n * @example With preview mode:\n * <val-image [props]=\"{\n *   src: 'url',\n *   alt: 'desc',\n *   previewMode: true,\n *   bordered: true,\n *   alignment: 'center'\n * }\"></val-image>\n *\n * @input props: ImageMetadata - Configuration for the image (src, alt, size, mode, alignment, caption, previewMode, etc.)\n */\nexport class ImageComponent implements OnInit {\n  @Input()\n  props!: ImageMetadata;\n\n  available: boolean = true;\n\n  // Preview mode properties\n  isPreviewOpen: boolean = false;\n  zoomLevel: number = 1;\n  minZoom: number = 0.5;\n  maxZoom: number = 5;\n  panX: number = 0;\n  panY: number = 0;\n\n  // Touch and mouse interaction properties\n  isDragging: boolean = false;\n  lastPanX: number = 0;\n  lastPanY: number = 0;\n  startX: number = 0;\n  startY: number = 0;\n\n  // Touch gesture properties\n  initialDistance: number = 0;\n  initialZoom: number = 1;\n  touches: Touch[] = [];\n\n  // Math for template\n  Math = Math;\n\n  constructor() {}\n\n  ngOnInit() {\n    // Set default values\n    if (!this.props.alignment) {\n      this.props.alignment = 'center';\n    }\n    if (!this.props.captionSize) {\n      this.props.captionSize = 'medium';\n    }\n    if (!this.props.mode) {\n      this.props.mode = 'box';\n    }\n  }\n\n  changeToVisible() {\n    setInterval(() => {\n      this.available = true;\n    }, 100);\n  }\n\n  // Preview mode methods\n  openPreview() {\n    if (!this.props.previewMode) return;\n    this.isPreviewOpen = true;\n    this.resetZoom();\n  }\n\n  closePreview() {\n    this.isPreviewOpen = false;\n  }\n\n  // Zoom methods\n  zoomIn() {\n    if (this.zoomLevel < this.maxZoom) {\n      this.zoomLevel = Math.min(this.zoomLevel * 1.2, this.maxZoom);\n    }\n  }\n\n  zoomOut() {\n    if (this.zoomLevel > this.minZoom) {\n      this.zoomLevel = Math.max(this.zoomLevel / 1.2, this.minZoom);\n      // Reset pan if zoomed out to 1x or less\n      if (this.zoomLevel <= 1) {\n        this.panX = 0;\n        this.panY = 0;\n      }\n    }\n  }\n\n  resetZoom() {\n    this.zoomLevel = 1;\n    this.panX = 0;\n    this.panY = 0;\n  }\n\n  // Mouse events\n  onMouseDown(event: MouseEvent) {\n    if (this.zoomLevel <= 1) return;\n\n    this.isDragging = true;\n    this.startX = event.clientX - this.panX;\n    this.startY = event.clientY - this.panY;\n    event.preventDefault();\n  }\n\n  onMouseMove(event: MouseEvent) {\n    if (!this.isDragging || this.zoomLevel <= 1) return;\n\n    this.panX = event.clientX - this.startX;\n    this.panY = event.clientY - this.startY;\n    event.preventDefault();\n  }\n\n  onMouseUp(event: MouseEvent) {\n    this.isDragging = false;\n  }\n\n  // Touch events for mobile\n  onTouchStart(event: TouchEvent) {\n    event.preventDefault();\n    this.touches = Array.from(event.touches);\n\n    if (this.touches.length === 1) {\n      // Single touch - start dragging\n      if (this.zoomLevel > 1) {\n        this.isDragging = true;\n        this.startX = this.touches[0].clientX - this.panX;\n        this.startY = this.touches[0].clientY - this.panY;\n      }\n    } else if (this.touches.length === 2) {\n      // Two touches - start pinch zoom\n      this.isDragging = false;\n      this.initialDistance = this.getDistance(this.touches[0], this.touches[1]);\n      this.initialZoom = this.zoomLevel;\n    }\n  }\n\n  onTouchMove(event: TouchEvent) {\n    event.preventDefault();\n    this.touches = Array.from(event.touches);\n\n    if (this.touches.length === 1 && this.isDragging && this.zoomLevel > 1) {\n      // Single touch - drag\n      this.panX = this.touches[0].clientX - this.startX;\n      this.panY = this.touches[0].clientY - this.startY;\n    } else if (this.touches.length === 2) {\n      // Two touches - pinch zoom\n      const currentDistance = this.getDistance(this.touches[0], this.touches[1]);\n      const scale = currentDistance / this.initialDistance;\n      this.zoomLevel = Math.min(Math.max(this.initialZoom * scale, this.minZoom), this.maxZoom);\n\n      // Reset pan if zoomed out to 1x or less\n      if (this.zoomLevel <= 1) {\n        this.panX = 0;\n        this.panY = 0;\n      }\n    }\n  }\n\n  onTouchEnd(event: TouchEvent) {\n    this.isDragging = false;\n    this.touches = Array.from(event.touches);\n  }\n\n  // Mouse wheel zoom\n  onWheel(event: WheelEvent) {\n    event.preventDefault();\n\n    const delta = event.deltaY > 0 ? -1 : 1;\n    const zoomFactor = 1 + delta * 0.1;\n\n    this.zoomLevel = Math.min(Math.max(this.zoomLevel * zoomFactor, this.minZoom), this.maxZoom);\n\n    // Reset pan if zoomed out to 1x or less\n    if (this.zoomLevel <= 1) {\n      this.panX = 0;\n      this.panY = 0;\n    }\n  }\n\n  // Helper methods\n  private getDistance(touch1: Touch, touch2: Touch): number {\n    const dx = touch1.clientX - touch2.clientX;\n    const dy = touch1.clientY - touch2.clientY;\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n\n  // Keyboard shortcuts\n  @HostListener('document:keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent) {\n    if (!this.isPreviewOpen) return;\n\n    switch (event.key) {\n      case 'Escape':\n        this.closePreview();\n        break;\n      case '+':\n      case '=':\n        event.preventDefault();\n        this.zoomIn();\n        break;\n      case '-':\n        event.preventDefault();\n        this.zoomOut();\n        break;\n      case '0':\n        event.preventDefault();\n        this.resetZoom();\n        break;\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { IonProgressBar } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { ProgressBarMetadata } from './types';\n\n@Component({\n  selector: 'val-progress-bar',\n  standalone: true,\n  imports: [CommonModule, IonProgressBar],\n  template: `\n    <ion-progress-bar\n      [ngClass]=\"[resolvedProps.size]\"\n      [class.rounded]=\"resolvedProps.rounded\"\n      [value]=\"resolvedProps.progress\"\n      [color]=\"resolvedProps.color\"\n      [buffer]=\"resolvedProps.buffer\"\n      [type]=\"resolvedProps.type\"\n    ></ion-progress-bar>\n  `,\n  styleUrls: ['./progress-bar.component.scss'],\n})\n/**\n * val-progress-bar\n *\n * A progress bar for indicating completion or loading state.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-progress-bar preset=\"default\" [props]=\"{ progress: 0.5 }\"></val-progress-bar>\n *\n * @example Static:\n * <val-progress-bar [props]=\"{ progress: 0.5, color: 'success', size: 'small' }\"></val-progress-bar>\n *\n * @input preset: string - Name of preset to apply\n * @input props: ProgressBarMetadata - Configuration for the progress bar (progress, color, size, etc.)\n */\nexport class ProgressBarComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable progress bar configurations\n   * that can be registered at app level via provideValtechPresets().\n   */\n  @Input() preset?: string;\n\n  /**\n   * Progress bar configuration object. Values here override preset values.\n   * @type {ProgressBarMetadata}\n   * @property progress - The progress value (0 to 1).\n   * @property size - The progress bar size ('small' | 'medium' | 'large' | 'xlarge').\n   * @property color - The progress bar color (Ionic color string).\n   * @property buffer - The buffer value for the bar.\n   * @property type - The type of progress bar ('determinate' | 'indeterminate').\n   * @property rounded - Whether the bar has rounded corners.\n   */\n  @Input() props: Partial<ProgressBarMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: ProgressBarMetadata = {} as ProgressBarMetadata;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('progressBar', this.preset) as Partial<ProgressBarMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as ProgressBarMetadata;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\nexport interface LinkProcessorConfig {\n  /** Whether to open external links in new tab (default: true) */\n  openExternalInNewTab?: boolean;\n  /** Whether to open internal links in new tab (default: false) */\n  openInternalInNewTab?: boolean;\n  /** Custom CSS classes for links */\n  linkClass?: string;\n  /** Custom CSS classes for external links */\n  externalLinkClass?: string;\n  /** Custom CSS classes for internal links */\n  internalLinkClass?: string;\n  /** Whether to process Markdown-style links [text](url) (default: true) */\n  processMarkdownLinks?: boolean;\n}\n\n/**\n * LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.\n *\n * This service automatically detects external URLs (http/https), internal routes (starting with /),\n * and Markdown-style links [text](url) and converts them into HTML anchor elements with appropriate attributes.\n *\n * @example Basic usage:\n * ```typescript\n * constructor(private linkProcessor: LinkProcessorService) {}\n *\n * processText() {\n *   const text = 'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)';\n *   const processed = this.linkProcessor.processLinks(text);\n *   // Returns SafeHtml with clickable links\n * }\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class LinkProcessorService {\n  // Regex para detectar URLs completas (http/https) - captura toda la URL y luego limpiamos puntuación\n  private readonly urlRegex = /(https?:\\/\\/[^\\s]+)/g;\n\n  // Regex para detectar rutas internas - captura toda la ruta y luego limpiamos puntuación\n  private readonly internalRouteRegex = /(\\s|^)(\\/[^\\s]*)/g;\n\n  // Regex para detectar enlaces estilo Markdown [texto](url)\n  private readonly markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n\n  constructor(private sanitizer: DomSanitizer) {}\n\n  /**\n   * Limpia la puntuación del final de una URL.\n   * Mantiene caracteres válidos de URL pero remueve signos de puntuación comunes al final.\n   * Preserva parámetros de consulta, fragmentos y caracteres válidos en URLs.\n   */\n  private cleanUrlPunctuation(url: string): string {\n    // Caracteres que consideramos puntuación al final de oración, pero NO parte de URLs\n    // No incluimos & o = que son parte de query params, ni # que es parte de fragmentos\n    const trailingPunctuation = /[.,;!?)]+$/;\n\n    // Casos especiales: si la URL termina con paréntesis pero no tiene paréntesis de apertura\n    // probablemente el paréntesis no es parte de la URL\n    const hasOpeningParen = url.includes('(');\n    const endsWithClosingParen = url.endsWith(')');\n\n    if (endsWithClosingParen && !hasOpeningParen) {\n      // Remover el paréntesis de cierre si no hay uno de apertura\n      url = url.replace(/\\)$/, '');\n    }\n\n    return url.replace(trailingPunctuation, '');\n  }\n\n  /**\n   * Procesa texto para convertir enlaces en elementos <a> clickeables.\n   * Detecta automáticamente URLs externas, rutas internas y enlaces estilo Markdown.\n   *\n   * @param text - Texto a procesar\n   * @param config - Configuración del procesamiento\n   * @returns SafeHtml con enlaces procesados o string original\n   *\n   * @example\n   * ```typescript\n   * const result = this.linkProcessor.processLinks(\n   *   'Visit https://example.com, go to /profile, or [check docs](https://docs.example.com)',\n   *   {\n   *     openExternalInNewTab: true,\n   *     openInternalInNewTab: false,\n   *     processMarkdownLinks: true,\n   *     linkClass: 'custom-link'\n   *   }\n   * );\n   * ```\n   */\n  processLinks(text: string, config: LinkProcessorConfig = {}): SafeHtml | string {\n    if (!text) return '';\n\n    const {\n      openExternalInNewTab = true,\n      openInternalInNewTab = false,\n      linkClass = 'processed-link',\n      externalLinkClass = 'external-link',\n      internalLinkClass = 'internal-link',\n      processMarkdownLinks = true,\n    } = config;\n\n    let hasLinks = false;\n    let processedText = text;\n\n    // 1. Procesar enlaces estilo Markdown [texto](url) primero\n    if (processMarkdownLinks) {\n      // Usar exec en bucle (compatible con ES2018)\n      const markdownMatches: RegExpExecArray[] = [];\n      this.markdownLinkRegex.lastIndex = 0;\n      let mdMatch: RegExpExecArray | null;\n      while ((mdMatch = this.markdownLinkRegex.exec(processedText)) !== null) {\n        markdownMatches.push(mdMatch);\n      }\n\n      // Procesar de atrás hacia adelante para mantener las posiciones\n      for (let i = markdownMatches.length - 1; i >= 0; i--) {\n        const match = markdownMatches[i];\n        const [fullMatch, linkText, url] = match;\n        const startIndex = match.index!;\n        const endIndex = startIndex + fullMatch.length;\n\n        hasLinks = true;\n        const isExternal = /^https?:\\/\\//.test(url);\n        const target = (isExternal ? openExternalInNewTab : openInternalInNewTab)\n          ? isExternal\n            ? ' target=\"_blank\" rel=\"noopener noreferrer\"'\n            : ' target=\"_blank\"'\n          : '';\n        const typeClass = isExternal ? externalLinkClass : internalLinkClass;\n        const classes = `${linkClass} ${typeClass}`.trim();\n        const linkHtml = `<a href=\"${url}\"${target} class=\"${classes}\">${linkText}</a>`;\n\n        processedText =\n          processedText.substring(0, startIndex) + linkHtml + processedText.substring(endIndex);\n      }\n    }\n\n    // 2. Procesar URLs externas directas\n    // Usar exec en bucle (compatible con ES2018)\n    const urlMatches: RegExpExecArray[] = [];\n    this.urlRegex.lastIndex = 0;\n    let urlMatch: RegExpExecArray | null;\n    while ((urlMatch = this.urlRegex.exec(processedText)) !== null) {\n      urlMatches.push(urlMatch);\n    }\n\n    // Procesar de atrás hacia adelante para mantener las posiciones\n    for (let i = urlMatches.length - 1; i >= 0; i--) {\n      const match = urlMatches[i];\n      const [fullMatch, url] = match;\n      const startIndex = match.index!;\n      const endIndex = startIndex + fullMatch.length;\n\n      // Verificar que no esté ya dentro de un enlace HTML existente\n      const textBefore = processedText.substring(0, startIndex);\n      const lastOpenTag = textBefore.lastIndexOf('<a ');\n      const lastCloseTag = textBefore.lastIndexOf('</a>');\n\n      // Si hay un tag <a abierto sin cerrar, no procesamos\n      if (lastOpenTag > lastCloseTag) {\n        continue;\n      }\n\n      // Limpiar puntuación del final de la URL\n      const cleanUrl = this.cleanUrlPunctuation(url);\n      const punctuationRemoved = url !== cleanUrl;\n      const punctuation = punctuationRemoved ? url.substring(cleanUrl.length) : '';\n\n      hasLinks = true;\n      const target = openExternalInNewTab ? ' target=\"_blank\" rel=\"noopener noreferrer\"' : '';\n      const classes = `${linkClass} ${externalLinkClass}`.trim();\n      const linkHtml = `<a href=\"${cleanUrl}\"${target} class=\"${classes}\">${cleanUrl}</a>`;\n\n      // Reemplazar el URL original con el enlace + puntuación si existía\n      const replacement = punctuationRemoved ? linkHtml + punctuation : linkHtml;\n      processedText =\n        processedText.substring(0, startIndex) + replacement + processedText.substring(endIndex);\n    }\n\n    // 3. Procesar rutas internas\n    // Usar exec en bucle (compatible con ES2018)\n    const internalMatches: RegExpExecArray[] = [];\n    this.internalRouteRegex.lastIndex = 0;\n    let internalMatch: RegExpExecArray | null;\n    while ((internalMatch = this.internalRouteRegex.exec(processedText)) !== null) {\n      internalMatches.push(internalMatch);\n    }\n\n    // Procesar de atrás hacia adelante para mantener las posiciones\n    for (let i = internalMatches.length - 1; i >= 0; i--) {\n      const match = internalMatches[i];\n      const [fullMatch, prefix, route] = match;\n      const startIndex = match.index!;\n      const endIndex = startIndex + fullMatch.length;\n\n      // Verificar que no esté ya dentro de un enlace HTML existente\n      const textBefore = processedText.substring(0, startIndex);\n      const lastOpenTag = textBefore.lastIndexOf('<a ');\n      const lastCloseTag = textBefore.lastIndexOf('</a>');\n\n      // Si hay un tag <a abierto sin cerrar, no procesamos\n      if (lastOpenTag > lastCloseTag) {\n        continue;\n      }\n\n      hasLinks = true;\n      const target = openInternalInNewTab ? ' target=\"_blank\"' : '';\n      const classes = `${linkClass} ${internalLinkClass}`.trim();\n      const linkHtml = `<a href=\"${route}\"${target} class=\"${classes}\">${route}</a>`;\n\n      const replacement = `${prefix}${linkHtml}`;\n      processedText =\n        processedText.substring(0, startIndex) + replacement + processedText.substring(endIndex);\n    }\n\n    // Si hay enlaces, sanitizar el HTML\n    if (hasLinks) {\n      return this.sanitizer.bypassSecurityTrustHtml(processedText);\n    }\n\n    return text;\n  }\n\n  /**\n   * Detecta si un texto contiene enlaces (URLs, rutas internas o enlaces Markdown).\n   *\n   * @param text - Texto a analizar\n   * @returns true si contiene enlaces\n   *\n   * @example\n   * ```typescript\n   * const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com or [docs](https://docs.com)');\n   * // Returns: true\n   * ```\n   */\n  hasLinks(text: string): boolean {\n    if (!text) return false;\n\n    // Reset regex indices\n    this.urlRegex.lastIndex = 0;\n    this.internalRouteRegex.lastIndex = 0;\n    this.markdownLinkRegex.lastIndex = 0;\n\n    return (\n      this.urlRegex.test(text) ||\n      this.internalRouteRegex.test(text) ||\n      this.markdownLinkRegex.test(text)\n    );\n  }\n\n  /**\n   * Extrae todos los enlaces de un texto.\n   *\n   * @param text - Texto a analizar\n   * @returns Array de enlaces encontrados con su tipo y texto (si es Markdown)\n   *\n   * @example\n   * ```typescript\n   * const links = this.linkProcessor.extractLinks('Visit https://example.com, /profile, or [docs](https://docs.com)');\n   * // Returns: [\n   * //   { url: 'https://example.com', type: 'external', text: 'https://example.com' },\n   * //   { url: '/profile', type: 'internal', text: '/profile' },\n   * //   { url: 'https://docs.com', type: 'external', text: 'docs' }\n   * // ]\n   * ```\n   */\n  extractLinks(text: string): Array<{ url: string; type: 'external' | 'internal'; text: string }> {\n    if (!text) return [];\n\n    const links: Array<{ url: string; type: 'external' | 'internal'; text: string }> = [];\n\n    // Reset regex indices\n    this.urlRegex.lastIndex = 0;\n    this.internalRouteRegex.lastIndex = 0;\n    this.markdownLinkRegex.lastIndex = 0;\n\n    // Extraer enlaces Markdown primero\n    let match;\n    while ((match = this.markdownLinkRegex.exec(text)) !== null) {\n      const url = match[2];\n      const linkText = match[1];\n      const type = /^https?:\\/\\//.test(url) ? 'external' : 'internal';\n      links.push({ url, type, text: linkText });\n    }\n\n    // Extraer URLs externas directas\n    while ((match = this.urlRegex.exec(text)) !== null) {\n      const url = match[1];\n      // Verificar que no esté ya capturado como Markdown link\n      if (!links.some(link => link.url === url)) {\n        links.push({ url, type: 'external', text: url });\n      }\n    }\n\n    // Extraer rutas internas directas\n    while ((match = this.internalRouteRegex.exec(text)) !== null) {\n      const url = match[2];\n      // Verificar que no esté ya capturado como Markdown link\n      if (!links.some(link => link.url === url)) {\n        links.push({ url, type: 'internal', text: url });\n      }\n    }\n\n    return links;\n  }\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { LinkProcessorConfig, LinkProcessorService } from '../../services/link-processor.service';\n\n/**\n * ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.\n *\n * Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas\n * (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.\n *\n * @example Uso básico:\n * ```html\n * <div [innerHTML]=\"'Visit https://example.com or go to /profile' | processLinks\"></div>\n * ```\n *\n * @example Con configuración personalizada:\n * ```html\n * <div [innerHTML]=\"text | processLinks:linkConfig\"></div>\n * ```\n *\n * @example En TypeScript:\n * ```typescript\n * export class MyComponent {\n *   linkConfig: LinkProcessorConfig = {\n *     openExternalInNewTab: true,\n *     openInternalInNewTab: false,\n *     linkClass: 'my-link',\n *     externalLinkClass: 'external',\n *     internalLinkClass: 'internal'\n *   };\n * }\n * ```\n */\n@Pipe({\n  name: 'processLinks',\n  standalone: true,\n})\nexport class ProcessLinksPipe implements PipeTransform {\n  private linkProcessor = inject(LinkProcessorService);\n\n  /**\n   * Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.\n   *\n   * @param value - El texto a procesar\n   * @param config - Configuración opcional para el procesamiento de enlaces\n   * @returns SafeHtml con enlaces procesados o string original si no hay enlaces\n   *\n   * @example\n   * ```html\n   * <!-- Uso básico -->\n   * <p [innerHTML]=\"'Check out https://angular.io' | processLinks\"></p>\n   *\n   * <!-- Con configuración -->\n   * <p [innerHTML]=\"message | processLinks:{ openExternalInNewTab: false }\"></p>\n   * ```\n   */\n  transform(value: string, config?: LinkProcessorConfig): SafeHtml | string {\n    if (!value) {\n      return '';\n    }\n\n    return this.linkProcessor.processLinks(value, config);\n  }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { ProcessLinksPipe } from '../../../shared/pipes/process-links.pipe';\nimport { TextMetadata } from './types';\n\n@Component({\n  selector: 'val-text',\n  standalone: true,\n  imports: [IonText, ProcessLinksPipe],\n  template: `\n    <ion-text [color]=\"propsColor()\">\n      @if (propsProcessLinks()) {\n        <p\n          [class]=\"propsSize()\"\n          [class.bold]=\"propsBold()\"\n          [innerHTML]=\"displayContent() | processLinks: propsLinkConfig()\"\n        ></p>\n      } @else if (propsAllowPartialBold() && hasPartialBold()) {\n        <p [class]=\"propsSize()\" [class.bold]=\"propsBold()\" [innerHTML]=\"processPartialBold()\"></p>\n      } @else {\n        <p [class]=\"propsSize()\" [class.bold]=\"propsBold()\">{{ displayContent() }}</p>\n      }\n    </ion-text>\n  `,\n  styleUrls: ['./text.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * val-text\n *\n * Text component that supports static content with optional interpolation.\n *\n * @example Static content:\n * ```html\n * <val-text [props]=\"{\n *   content: 'Static text',\n *   color: 'primary',\n *   size: 'medium',\n *   bold: false\n * }\"></val-text>\n * ```\n *\n * @example With automatic link processing:\n * ```html\n * <val-text [props]=\"{\n *   content: 'Visit https://example.com for more info',\n *   processLinks: true,\n *   color: 'primary',\n *   size: 'medium'\n * }\"></val-text>\n * ```\n *\n * @example With partial bold support:\n * ```html\n * <val-text [props]=\"{\n *   content: 'Hola <b>Victor</b>, cómo estás?',\n *   allowPartialBold: true,\n *   color: 'dark',\n *   size: 'medium'\n * }\"></val-text>\n * ```\n *\n * @input props: TextMetadata - Configuration for the text (content, color, size, bold, etc.)\n */\nexport class TextComponent {\n  /**\n   * Text configuration object.\n   * Signal-based input for full reactivity with computed().\n   */\n  readonly props = input<TextMetadata>();\n\n  /**\n   * Computed content that SE ACTUALIZA when props() changes.\n   */\n  displayContent = computed(() => {\n    const p = this.props();\n    if (!p) return '';\n\n    if (p.content) {\n      if (p.contentInterpolation) {\n        return this.interpolateContent(p.content, p.contentInterpolation);\n      }\n      return p.content;\n    }\n    return p.contentFallback || '';\n  });\n\n  // Computed helpers for template bindings\n  propsColor = computed(() => this.props()?.color);\n  propsSize = computed(() => this.props()?.size);\n  propsBold = computed(() => this.props()?.bold);\n  propsProcessLinks = computed(() => this.props()?.processLinks);\n  propsAllowPartialBold = computed(() => this.props()?.allowPartialBold);\n  propsLinkConfig = computed(() => this.props()?.linkConfig);\n\n  /**\n   * Check if content has partial bold tags.\n   */\n  hasPartialBold = computed(() => {\n    const content = this.displayContent();\n    return content?.includes('<b>') || content?.includes('<strong>');\n  });\n\n  /**\n   * Process partial bold tags in the content.\n   */\n  processPartialBold = computed(() => {\n    const content = this.displayContent();\n    if (!content) return '';\n\n    let processed = content.replace(/<b>(.*?)<\\/b>/gi, '<span class=\"partial-bold\">$1</span>');\n    return processed.replace(/<strong>(.*?)<\\/strong>/gi, '<span class=\"partial-bold\">$1</span>');\n  });\n\n  /**\n   * Interpolate placeholders in content with provided values.\n   */\n  private interpolateContent(content: string, values: Record<string, any>): string {\n    return content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n      return values[key] !== undefined ? String(values[key]) : match;\n    });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { TitleMetadata } from './types';\n\n@Component({\n  selector: 'val-title',\n  standalone: true,\n  imports: [CommonModule, IonText],\n  template: `\n    <ion-text [color]=\"props.color\">\n      @if (!props.bold) {\n        <p [ngClass]=\"[props.size]\" [class.thin]=\"props.thin\">\n          {{ getDisplayContent() }}\n        </p>\n      } @else {\n        <b>\n          <p [class]=\"props.size\">\n            {{ getDisplayContent() }}\n          </p>\n        </b>\n      }\n    </ion-text>\n  `,\n  styleUrls: ['./title.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\n/**\n * val-title\n *\n * A styled title or heading, with options for size, color, and boldness.\n *\n * @example\n * <val-title [props]=\"{ content: 'My Title', size: 'large', color: 'primary', bold: true }\"></val-title>\n *\n * @input props: TitleMetadata - Configuration for the title (content, color, size, bold, thin)\n */\nexport class TitleComponent {\n  /**\n   * Title configuration object.\n   * @type {TitleMetadata}\n   * @property content - Static title text.\n   * @property color - The title color (Ionic color string).\n   * @property size - The title size ('small' | 'medium' | 'large' | 'xlarge').\n   * @property bold - Whether the title is bold.\n   * @property thin - Whether the title is thin (optional).\n   */\n  @Input()\n  props: TitleMetadata;\n\n  /**\n   * Returns the content to display.\n   * Uses static content, or contentFallback for backwards compatibility.\n   */\n  getDisplayContent(): string {\n    if (this.props.content) {\n      return this.props.content;\n    }\n    // Backwards compatibility: use contentFallback if present\n    if (this.props.contentFallback) {\n      return this.props.contentFallback;\n    }\n    return '';\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Props for val-title component.\n *\n * @property content - Title text to display.\n * @property color - The title color (Ionic color string).\n * @property size - The title size ('small' | 'medium' | 'large' | 'xlarge').\n * @property bold - Whether the title is bold.\n * @property thin - Whether the title is thin (optional).\n * @property contentFallback - Fallback text (deprecated, use content instead).\n */\nexport interface TitleMetadata {\n  content?: string;\n  size: 'small' | 'medium' | 'large' | 'xlarge';\n  color: Color;\n  bold: boolean;\n  thin?: boolean;\n  /** @deprecated Use content instead */\n  contentFallback?: string;\n}\n\n/**\n * Factory function to create title props.\n *\n * @param styleConfig - Title styling configuration\n * @param content - The title text\n * @returns Complete TitleMetadata object\n *\n * @example\n * ```typescript\n * const props = createTitleProps(\n *   { size: 'large', color: 'primary', bold: true },\n *   'My Title'\n * );\n * ```\n */\nexport function createTitleProps(\n  styleConfig: Pick<TitleMetadata, 'size' | 'color' | 'bold' | 'thin'>,\n  content: string\n): TitleMetadata {\n  return {\n    ...styleConfig,\n    content,\n  };\n}\n","/**\n * Skeleton type presets.\n */\nexport type SkeletonType = 'text' | 'avatar' | 'thumbnail' | 'card' | 'list-item' | 'paragraph' | 'custom';\n\n/**\n * Metadata for the skeleton component.\n */\nexport interface SkeletonMetadata {\n  /** Skeleton type preset */\n  type?: SkeletonType;\n  /** Number of lines (for text/paragraph type) */\n  lines?: number;\n  /** Enable animation */\n  animated?: boolean;\n  /** Custom width */\n  width?: string;\n  /** Custom height */\n  height?: string;\n  /** Border radius */\n  borderRadius?: string;\n  /** Show as circle (for avatar) */\n  circle?: boolean;\n  /** Unique token identifier */\n  token?: string;\n}\n\n/**\n * Preset configurations for skeleton types.\n */\nexport const SKELETON_PRESETS: Record<SkeletonType, Partial<SkeletonMetadata>> = {\n  text: { width: '100%', height: '16px', borderRadius: '4px' },\n  avatar: { width: '48px', height: '48px', circle: true },\n  thumbnail: { width: '80px', height: '80px', borderRadius: '8px' },\n  card: { width: '100%', height: '120px', borderRadius: '8px' },\n  'list-item': { width: '100%', height: '56px', borderRadius: '4px' },\n  paragraph: { width: '100%', height: '16px', borderRadius: '4px', lines: 3 },\n  custom: {},\n};\n","import { Component, Input } from '@angular/core';\nimport { IonSkeletonText } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonMetadata, SKELETON_PRESETS } from './types';\n\n@Component({\n  selector: 'val-skeleton',\n  standalone: true,\n  imports: [CommonModule, IonSkeletonText],\n  template: `\n    @switch (props.type) {\n      @case ('paragraph') {\n        <div class=\"skeleton-paragraph\">\n          @for (line of getLines(); track $index; let isLast = $last) {\n            <ion-skeleton-text\n              [animated]=\"props.animated !== false\"\n              [style.width]=\"isLast ? '60%' : '100%'\"\n              [style.height]=\"getHeight()\"\n              [style.border-radius]=\"getBorderRadius()\"\n            ></ion-skeleton-text>\n          }\n        </div>\n      }\n      @case ('list-item') {\n        <div class=\"skeleton-list-item\">\n          <ion-skeleton-text\n            [animated]=\"props.animated !== false\"\n            class=\"skeleton-avatar\"\n          ></ion-skeleton-text>\n          <div class=\"skeleton-content\">\n            <ion-skeleton-text\n              [animated]=\"props.animated !== false\"\n              style=\"width: 70%; height: 14px;\"\n            ></ion-skeleton-text>\n            <ion-skeleton-text\n              [animated]=\"props.animated !== false\"\n              style=\"width: 50%; height: 12px;\"\n            ></ion-skeleton-text>\n          </div>\n        </div>\n      }\n      @case ('card') {\n        <div class=\"skeleton-card\">\n          <ion-skeleton-text\n            [animated]=\"props.animated !== false\"\n            class=\"skeleton-card-image\"\n          ></ion-skeleton-text>\n          <div class=\"skeleton-card-content\">\n            <ion-skeleton-text\n              [animated]=\"props.animated !== false\"\n              style=\"width: 80%; height: 16px;\"\n            ></ion-skeleton-text>\n            <ion-skeleton-text\n              [animated]=\"props.animated !== false\"\n              style=\"width: 60%; height: 12px;\"\n            ></ion-skeleton-text>\n          </div>\n        </div>\n      }\n      @default {\n        <ion-skeleton-text\n          [animated]=\"props.animated !== false\"\n          [style.width]=\"getWidth()\"\n          [style.height]=\"getHeight()\"\n          [style.border-radius]=\"getBorderRadius()\"\n          [class.circle]=\"isCircle()\"\n        ></ion-skeleton-text>\n      }\n    }\n  `,\n  styleUrls: ['./skeleton.component.scss'],\n})\n/**\n * val-skeleton\n *\n * A skeleton loader component for content placeholders.\n * Supports various presets for common UI patterns.\n *\n * @example Text skeleton\n * <val-skeleton [props]=\"{ type: 'text' }\"></val-skeleton>\n *\n * @example Avatar skeleton\n * <val-skeleton [props]=\"{ type: 'avatar' }\"></val-skeleton>\n *\n * @example Paragraph skeleton\n * <val-skeleton [props]=\"{ type: 'paragraph', lines: 4 }\"></val-skeleton>\n *\n * @example Custom skeleton\n * <val-skeleton [props]=\"{\n *   type: 'custom',\n *   width: '200px',\n *   height: '100px',\n *   borderRadius: '12px'\n * }\"></val-skeleton>\n *\n * @input props: SkeletonMetadata - Configuration for the skeleton\n */\nexport class SkeletonComponent {\n  @Input() props: SkeletonMetadata = { type: 'text' };\n\n  getWidth(): string {\n    if (this.props.width) return this.props.width;\n    const preset = SKELETON_PRESETS[this.props.type || 'text'];\n    return preset.width || '100%';\n  }\n\n  getHeight(): string {\n    if (this.props.height) return this.props.height;\n    const preset = SKELETON_PRESETS[this.props.type || 'text'];\n    return preset.height || '16px';\n  }\n\n  getBorderRadius(): string {\n    if (this.props.borderRadius) return this.props.borderRadius;\n    if (this.isCircle()) return '50%';\n    const preset = SKELETON_PRESETS[this.props.type || 'text'];\n    return preset.borderRadius || '4px';\n  }\n\n  isCircle(): boolean {\n    if (this.props.circle !== undefined) return this.props.circle;\n    return this.props.type === 'avatar';\n  }\n\n  getLines(): number[] {\n    const lines = this.props.lines || SKELETON_PRESETS[this.props.type || 'text'].lines || 1;\n    return Array(lines).fill(0);\n  }\n}\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ProgressRingMetadata } from './types';\n\n@Component({\n  selector: 'val-progress-ring',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"progress-ring-container\"\n      [style.width.px]=\"size\"\n      [style.height.px]=\"size\"\n    >\n      <svg [attr.width]=\"size\" [attr.height]=\"size\" class=\"progress-ring\">\n        <!-- Background track -->\n        <circle\n          class=\"progress-ring-track\"\n          [attr.cx]=\"center\"\n          [attr.cy]=\"center\"\n          [attr.r]=\"radius\"\n          [attr.stroke-width]=\"strokeWidth\"\n          [style.stroke]=\"getTrackColor()\"\n          fill=\"none\"\n        />\n        <!-- Progress arc -->\n        <circle\n          class=\"progress-ring-progress\"\n          [class.animated]=\"props.animated !== false\"\n          [attr.cx]=\"center\"\n          [attr.cy]=\"center\"\n          [attr.r]=\"radius\"\n          [attr.stroke-width]=\"strokeWidth\"\n          [style.stroke]=\"getProgressColor()\"\n          [attr.stroke-dasharray]=\"circumference\"\n          [attr.stroke-dashoffset]=\"dashOffset\"\n          fill=\"none\"\n          stroke-linecap=\"round\"\n        />\n      </svg>\n      @if (props.showValue || props.label) {\n        <div class=\"progress-ring-label\" [style.font-size.px]=\"labelFontSize\">\n          {{ props.label || (props.value | number:'1.0-0') + '%' }}\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./progress-ring.component.scss'],\n})\n/**\n * val-progress-ring\n *\n * A circular progress indicator.\n * Ideal for showing completion status, scores, or loading progress.\n *\n * @example Basic usage\n * <val-progress-ring [props]=\"{\n *   value: 75,\n *   showValue: true\n * }\"></val-progress-ring>\n *\n * @example Custom styling\n * <val-progress-ring [props]=\"{\n *   value: 42,\n *   size: 120,\n *   strokeWidth: 10,\n *   color: 'success',\n *   label: '42 pts'\n * }\"></val-progress-ring>\n *\n * @input props: ProgressRingMetadata - Configuration for the progress ring\n */\nexport class ProgressRingComponent implements OnChanges {\n  @Input() props: ProgressRingMetadata;\n\n  size: number = 80;\n  strokeWidth: number = 8;\n  radius: number = 0;\n  center: number = 0;\n  circumference: number = 0;\n  dashOffset: number = 0;\n  labelFontSize: number = 16;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.calculateDimensions();\n      this.calculateProgress();\n    }\n  }\n\n  getProgressColor(): string {\n    const color = this.props.color || 'primary';\n    return `var(--ion-color-${color})`;\n  }\n\n  getTrackColor(): string {\n    const color = this.props.trackColor || 'light';\n    return `var(--ion-color-${color}-shade, var(--ion-color-${color}))`;\n  }\n\n  private calculateDimensions(): void {\n    this.size = this.props.size || 80;\n    this.strokeWidth = this.props.strokeWidth || 8;\n    this.center = this.size / 2;\n    this.radius = (this.size - this.strokeWidth) / 2;\n    this.circumference = 2 * Math.PI * this.radius;\n    this.labelFontSize = Math.max(12, this.size / 5);\n  }\n\n  private calculateProgress(): void {\n    const progress = Math.min(100, Math.max(0, this.props.value));\n    this.dashOffset = this.circumference - (progress / 100) * this.circumference;\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonFab, IonFabButton, IonFabList, IonIcon, IonLabel } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { FabMetadata, FabActionMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { add, close, share, create, trash, heart, star, camera, mic, send } from 'ionicons/icons';\n\naddIcons({ add, close, share, create, trash, heart, star, camera, mic, send });\n\n@Component({\n  selector: 'val-fab',\n  standalone: true,\n  imports: [CommonModule, IonFab, IonFabButton, IonFabList, IonIcon, IonLabel],\n  template: `\n    <ion-fab\n      [vertical]=\"getVertical()\"\n      [horizontal]=\"getHorizontal()\"\n      [activated]=\"isActivated\"\n    >\n      <ion-fab-button\n        [color]=\"resolvedProps.color || 'primary'\"\n        [size]=\"resolvedProps.size\"\n        [disabled]=\"resolvedProps.disabled\"\n        [translucent]=\"resolvedProps.translucent\"\n        (click)=\"onMainClick()\"\n      >\n        <ion-icon [name]=\"getMainIcon()\"></ion-icon>\n      </ion-fab-button>\n\n      @if (resolvedProps.actions && resolvedProps.actions.length > 0) {\n        <ion-fab-list [side]=\"resolvedProps.side || 'top'\">\n          @for (action of resolvedProps.actions; track action.token || $index) {\n            <ion-fab-button\n              [color]=\"action.color || 'light'\"\n              [disabled]=\"action.disabled\"\n              (click)=\"onActionClick(action)\"\n            >\n              <ion-icon [name]=\"action.icon\"></ion-icon>\n            </ion-fab-button>\n          }\n        </ion-fab-list>\n      }\n    </ion-fab>\n  `,\n  styleUrls: ['./fab.component.scss'],\n})\n/**\n * val-fab\n *\n * A Floating Action Button component with optional speed dial actions.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-fab preset=\"default\" [props]=\"{ icon: 'add' }\" (fabClick)=\"onCreate()\"></val-fab>\n *\n * @example Simple FAB\n * <val-fab [props]=\"{\n *   icon: 'add',\n *   color: 'primary',\n *   position: 'bottom-end'\n * }\" (fabClick)=\"onCreate()\"></val-fab>\n *\n * @example Speed dial FAB\n * <val-fab [props]=\"{\n *   icon: 'add',\n *   iconActivated: 'close',\n *   position: 'bottom-end',\n *   actions: [\n *     { icon: 'camera', label: 'Photo', token: 'photo' },\n *     { icon: 'mic', label: 'Audio', token: 'audio' },\n *     { icon: 'create', label: 'Note', token: 'note' }\n *   ],\n *   side: 'top'\n * }\" (actionClick)=\"onAction($event)\"></val-fab>\n *\n * @input preset: string - Name of preset to apply\n * @input props: FabMetadata - Configuration for the FAB\n * @output fabClick: void - Emits when main FAB is clicked (without actions)\n * @output actionClick: FabActionMetadata - Emits when an action is clicked\n */\nexport class FabComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable FAB configurations\n   * that can be registered at app level via provideValtechPresets().\n   */\n  @Input() preset?: string;\n\n  /**\n   * FAB configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<FabMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: FabMetadata = {} as FabMetadata;\n\n  @Output() fabClick = new EventEmitter<void>();\n  @Output() actionClick = new EventEmitter<FabActionMetadata>();\n\n  isActivated = false;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('fab', this.preset) as Partial<FabMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as FabMetadata;\n  }\n\n  getVertical(): 'top' | 'bottom' | 'center' {\n    const pos = this.resolvedProps.position || 'bottom-end';\n    if (pos.startsWith('top')) return 'top';\n    if (pos.startsWith('center')) return 'center';\n    return 'bottom';\n  }\n\n  getHorizontal(): 'start' | 'end' | 'center' {\n    const pos = this.resolvedProps.position || 'bottom-end';\n    if (pos.endsWith('start')) return 'start';\n    if (pos.endsWith('center')) return 'center';\n    return 'end';\n  }\n\n  getMainIcon(): string {\n    if (this.isActivated && this.resolvedProps.iconActivated) {\n      return this.resolvedProps.iconActivated;\n    }\n    return this.resolvedProps.icon;\n  }\n\n  onMainClick(): void {\n    if (this.resolvedProps.actions && this.resolvedProps.actions.length > 0) {\n      this.isActivated = !this.isActivated;\n    } else {\n      this.fabClick.emit();\n    }\n  }\n\n  onActionClick(action: FabActionMetadata): void {\n    this.actionClick.emit(action);\n    if (this.resolvedProps.closeOnAction !== false) {\n      this.isActivated = false;\n    }\n  }\n}\n","/**\n * Style options for QR code dots (data modules).\n */\nexport type QrDotsStyle = 'square' | 'dots' | 'rounded' | 'extra-rounded' | 'classy' | 'classy-rounded';\n\n/**\n * Style options for QR code corner squares.\n */\nexport type QrCornersSquareStyle = 'square' | 'dot' | 'extra-rounded';\n\n/**\n * Style options for QR code corner dots.\n */\nexport type QrCornersDotStyle = 'square' | 'dot';\n\n/**\n * Output format for the generated QR code.\n */\nexport type QrOutputFormat = 'svg' | 'png' | 'jpeg' | 'webp';\n\n/**\n * Error correction level for QR codes.\n * Higher levels allow more damage tolerance but reduce data capacity.\n */\nexport type QrErrorCorrectionLevel = 'L' | 'M' | 'Q' | 'H';\n\n/**\n * Logo/image configuration for the QR code center.\n */\nexport interface QrLogoConfig {\n  /** Image source URL or base64 */\n  src: string;\n  /** Logo width (default: 25% of QR size) */\n  width?: number;\n  /** Logo height (default: same as width) */\n  height?: number;\n  /** Margin around the logo */\n  margin?: number;\n  /** Border radius for rounded corners */\n  borderRadius?: number;\n  /** Whether to hide dots behind the logo */\n  hideBackgroundDots?: boolean;\n}\n\n/**\n * Gradient configuration for QR elements.\n */\nexport interface QrGradient {\n  /** Gradient type */\n  type: 'linear' | 'radial';\n  /** Rotation angle in degrees (for linear) */\n  rotation?: number;\n  /** Color stops */\n  colorStops: Array<{\n    offset: number;\n    color: string;\n  }>;\n}\n\n/**\n * Color configuration - can be solid color or gradient.\n */\nexport type QrColorConfig = string | QrGradient;\n\n/**\n * Complete configuration for QR code generation.\n */\nexport interface QrConfig {\n  /** The data to encode (URL, text, etc.) */\n  data: string;\n\n  // === Size ===\n  /** QR code width in pixels (default: 300) */\n  width?: number;\n  /** QR code height in pixels (default: same as width) */\n  height?: number;\n  /** Quiet zone margin in modules (default: 0) */\n  margin?: number;\n\n  // === Colors ===\n  /** Color/gradient for data dots */\n  dotsColor?: QrColorConfig;\n  /** Background color (default: white) */\n  backgroundColor?: QrColorConfig;\n  /** Color for corner squares */\n  cornersSquareColor?: QrColorConfig;\n  /** Color for corner dots */\n  cornersDotColor?: QrColorConfig;\n\n  // === Styles ===\n  /** Style of data dots (default: 'square') */\n  dotsStyle?: QrDotsStyle;\n  /** Style of corner squares (default: 'square') */\n  cornersSquareStyle?: QrCornersSquareStyle;\n  /** Style of corner dots (default: 'square') */\n  cornersDotStyle?: QrCornersDotStyle;\n\n  // === Logo ===\n  /** Logo/image configuration */\n  logo?: QrLogoConfig;\n\n  // === Technical ===\n  /** Error correction level (default: 'M') */\n  errorCorrectionLevel?: QrErrorCorrectionLevel;\n\n  // === Output ===\n  /** Output format (default: 'png') */\n  format?: QrOutputFormat;\n  /** Quality for jpeg/webp (0-1, default: 1) */\n  quality?: number;\n}\n\n/**\n * Result from QR code generation.\n */\nexport interface QrResult {\n  /** Original configuration used */\n  config: QrConfig;\n  /** Generated data as base64 data URL */\n  dataUrl: string;\n  /** Generated data as Blob */\n  blob: Blob;\n  /** SVG string (only when format is 'svg') */\n  svg?: string;\n  /** MIME type of the generated image */\n  mimeType: string;\n  /** File extension */\n  extension: string;\n  /** Timestamp of generation */\n  generatedAt: Date;\n}\n\n/**\n * Options for downloading the QR code.\n */\nexport interface QrDownloadOptions {\n  /** Custom filename (without extension) */\n  filename?: string;\n  /** Override format for download */\n  format?: QrOutputFormat;\n}\n\n/**\n * Options for sharing the QR code.\n */\nexport interface QrShareOptions {\n  /** Share title */\n  title?: string;\n  /** Share text/description */\n  text?: string;\n  /** Custom filename for the shared file */\n  filename?: string;\n}\n\n/**\n * Preset configurations for common use cases.\n */\nexport interface QrPreset {\n  name: string;\n  config: Partial<QrConfig>;\n}\n\n/**\n * Default presets for quick styling.\n */\nexport const QR_PRESETS: Record<string, Partial<QrConfig>> = {\n  default: {\n    width: 300,\n    dotsStyle: 'square',\n    dotsColor: '#000000',\n    backgroundColor: '#ffffff',\n    errorCorrectionLevel: 'M',\n  },\n  rounded: {\n    width: 300,\n    dotsStyle: 'rounded',\n    cornersSquareStyle: 'extra-rounded',\n    cornersDotStyle: 'dot',\n    dotsColor: '#000000',\n    backgroundColor: '#ffffff',\n  },\n  dots: {\n    width: 300,\n    dotsStyle: 'dots',\n    cornersSquareStyle: 'dot',\n    cornersDotStyle: 'dot',\n    dotsColor: '#000000',\n    backgroundColor: '#ffffff',\n  },\n  classy: {\n    width: 300,\n    dotsStyle: 'classy',\n    cornersSquareStyle: 'extra-rounded',\n    cornersDotStyle: 'dot',\n    dotsColor: '#000000',\n    backgroundColor: '#ffffff',\n  },\n  modern: {\n    width: 300,\n    dotsStyle: 'extra-rounded',\n    cornersSquareStyle: 'extra-rounded',\n    cornersDotStyle: 'dot',\n    dotsColor: '#1a1a1a',\n    backgroundColor: '#ffffff',\n    margin: 2,\n  },\n};\n","import { Injectable } from '@angular/core';\nimport QRCodeStyling from 'qr-code-styling';\nimport {\n  QrConfig,\n  QrResult,\n  QrDownloadOptions,\n  QrShareOptions,\n  QrColorConfig,\n  QrGradient,\n  QR_PRESETS,\n} from './types';\n\n/**\n * QrGeneratorService\n *\n * A comprehensive service for generating, customizing, and manipulating QR codes.\n * Uses qr-code-styling library for high-quality, customizable QR code generation.\n *\n * @example Basic usage\n * ```typescript\n * const qr = await this.qrService.generate({ data: 'https://example.com' });\n * console.log(qr.dataUrl); // base64 image\n * ```\n *\n * @example With customization\n * ```typescript\n * const qr = await this.qrService.generate({\n *   data: 'https://example.com',\n *   width: 400,\n *   dotsStyle: 'rounded',\n *   dotsColor: '#3880ff',\n *   logo: { src: 'logo.png', width: 60 }\n * });\n * ```\n *\n * @example Using presets\n * ```typescript\n * const qr = await this.qrService.generateFromPreset('modern', 'https://example.com');\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class QrGeneratorService {\n  /**\n   * Generate a QR code with the given configuration.\n   *\n   * @param config - QR code configuration\n   * @returns Promise<QrResult> - Generated QR code result\n   *\n   * @example\n   * ```typescript\n   * const qr = await this.qrService.generate({\n   *   data: 'https://myapp.com/product/123',\n   *   width: 300,\n   *   dotsStyle: 'rounded',\n   *   dotsColor: '#000000',\n   *   backgroundColor: '#ffffff'\n   * });\n   * ```\n   */\n  async generate(config: QrConfig): Promise<QrResult> {\n\n    // Merge with defaults\n    const finalConfig: QrConfig = {\n      width: 300,\n      height: config.height || config.width || 300,\n      margin: 0,\n      dotsStyle: 'square',\n      dotsColor: '#000000',\n      backgroundColor: '#ffffff',\n      errorCorrectionLevel: 'M',\n      format: 'png',\n      quality: 1,\n      ...config,\n    };\n\n    // Build qr-code-styling options\n    const qrOptions: any = {\n      width: finalConfig.width,\n      height: finalConfig.height,\n      data: finalConfig.data,\n      margin: finalConfig.margin,\n      qrOptions: {\n        errorCorrectionLevel: finalConfig.errorCorrectionLevel,\n      },\n      dotsOptions: {\n        type: finalConfig.dotsStyle,\n        ...this.buildColorOptions(finalConfig.dotsColor),\n      },\n      backgroundOptions: {\n        ...this.buildColorOptions(finalConfig.backgroundColor),\n      },\n      cornersSquareOptions: finalConfig.cornersSquareColor || finalConfig.cornersSquareStyle\n        ? {\n            type: finalConfig.cornersSquareStyle,\n            ...this.buildColorOptions(finalConfig.cornersSquareColor || finalConfig.dotsColor),\n          }\n        : undefined,\n      cornersDotOptions: finalConfig.cornersDotColor || finalConfig.cornersDotStyle\n        ? {\n            type: finalConfig.cornersDotStyle,\n            ...this.buildColorOptions(finalConfig.cornersDotColor || finalConfig.dotsColor),\n          }\n        : undefined,\n    };\n\n    // Add logo if provided\n    if (finalConfig.logo) {\n      qrOptions.image = finalConfig.logo.src;\n      qrOptions.imageOptions = {\n        hideBackgroundDots: finalConfig.logo.hideBackgroundDots ?? true,\n        imageSize: 0.4,\n        margin: finalConfig.logo.margin ?? 5,\n        crossOrigin: 'anonymous',\n      };\n    }\n\n    // Create QR code instance\n    const qrCode = new QRCodeStyling(qrOptions);\n\n    // Generate blob\n    const format = finalConfig.format || 'png';\n    const mimeType = this.getMimeType(format);\n    const extension = format === 'jpeg' ? 'jpg' : format;\n\n    let blob: Blob;\n    let svg: string | undefined;\n    let dataUrl: string;\n\n    if (format === 'svg') {\n      // Get SVG data\n      const svgData = await qrCode.getRawData('svg');\n      if (!svgData) {\n        throw new Error('Failed to generate SVG');\n      }\n      blob = svgData as Blob;\n      svg = await blob.text();\n      dataUrl = `data:${mimeType};base64,${btoa(svg)}`;\n    } else {\n      // Get image blob\n      const imageBlob = await qrCode.getRawData(format as 'png' | 'jpeg' | 'webp');\n      if (!imageBlob) {\n        throw new Error('Failed to generate image');\n      }\n      blob = imageBlob as Blob;\n      dataUrl = await this.blobToDataUrl(blob);\n    }\n\n    return {\n      config: finalConfig,\n      dataUrl,\n      blob,\n      svg,\n      mimeType,\n      extension,\n      generatedAt: new Date(),\n    };\n  }\n\n  /**\n   * Generate a QR code using a preset configuration.\n   *\n   * @param preset - Preset name ('default', 'rounded', 'dots', 'classy', 'modern')\n   * @param data - Data to encode\n   * @param overrides - Optional configuration overrides\n   * @returns Promise<QrResult>\n   */\n  async generateFromPreset(\n    preset: keyof typeof QR_PRESETS | string,\n    data: string,\n    overrides?: Partial<QrConfig>\n  ): Promise<QrResult> {\n    const presetConfig = QR_PRESETS[preset] || QR_PRESETS['default'];\n    return this.generate({\n      ...presetConfig,\n      ...overrides,\n      data,\n    });\n  }\n\n  /**\n   * Download the QR code as a file.\n   *\n   * @param qr - QR result to download\n   * @param options - Download options\n   */\n  async download(qr: QrResult, options?: QrDownloadOptions): Promise<void> {\n    const filename = options?.filename || `qr-code-${Date.now()}`;\n    const format = options?.format || qr.config.format || 'png';\n    const extension = format === 'jpeg' ? 'jpg' : format;\n\n    let blob = qr.blob;\n\n    // Convert if different format requested\n    if (options?.format && options.format !== qr.config.format) {\n      const newQr = await this.generate({\n        ...qr.config,\n        format: options.format,\n      });\n      blob = newQr.blob;\n    }\n\n    // Create download link\n    const url = URL.createObjectURL(blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = `${filename}.${extension}`;\n    document.body.appendChild(link);\n    link.click();\n    document.body.removeChild(link);\n    URL.revokeObjectURL(url);\n  }\n\n  /**\n   * Copy the QR code to clipboard as an image.\n   *\n   * @param qr - QR result to copy\n   * @returns Promise<boolean> - Whether copy was successful\n   */\n  async copyToClipboard(qr: QrResult): Promise<boolean> {\n    try {\n      // Clipboard API requires PNG format\n      let pngBlob = qr.blob;\n\n      if (qr.mimeType !== 'image/png') {\n        const pngQr = await this.generate({\n          ...qr.config,\n          format: 'png',\n        });\n        pngBlob = pngQr.blob;\n      }\n\n      await navigator.clipboard.write([\n        new ClipboardItem({\n          'image/png': pngBlob,\n        }),\n      ]);\n\n      return true;\n    } catch (error) {\n      console.error('Failed to copy QR to clipboard:', error);\n      return false;\n    }\n  }\n\n  /**\n   * Share the QR code using Web Share API.\n   *\n   * @param qr - QR result to share\n   * @param options - Share options\n   * @returns Promise<boolean> - Whether share was successful\n   */\n  async share(qr: QrResult, options?: QrShareOptions): Promise<boolean> {\n    if (!navigator.share || !navigator.canShare) {\n      console.warn('Web Share API not available');\n      return false;\n    }\n\n    try {\n      const filename = options?.filename || `qr-code-${Date.now()}.${qr.extension}`;\n      const file = new File([qr.blob], filename, { type: qr.mimeType });\n\n      const shareData: ShareData = {\n        title: options?.title || 'QR Code',\n        text: options?.text,\n        files: [file],\n      };\n\n      if (navigator.canShare(shareData)) {\n        await navigator.share(shareData);\n        return true;\n      }\n\n      // Fallback without file\n      await navigator.share({\n        title: options?.title || 'QR Code',\n        text: options?.text,\n      });\n\n      return true;\n    } catch (error) {\n      if ((error as Error).name !== 'AbortError') {\n        console.error('Failed to share QR:', error);\n      }\n      return false;\n    }\n  }\n\n  /**\n   * Get the QR code as a base64 string (without data URL prefix).\n   *\n   * @param qr - QR result\n   * @returns Base64 string\n   */\n  toBase64(qr: QrResult): string {\n    const prefix = `data:${qr.mimeType};base64,`;\n    if (qr.dataUrl.startsWith(prefix)) {\n      return qr.dataUrl.substring(prefix.length);\n    }\n    return qr.dataUrl;\n  }\n\n  /**\n   * Get the QR code as a data URL.\n   *\n   * @param qr - QR result\n   * @returns Data URL string\n   */\n  toDataUrl(qr: QrResult): string {\n    return qr.dataUrl;\n  }\n\n  /**\n   * Get the QR code as a Blob.\n   *\n   * @param qr - QR result\n   * @returns Blob\n   */\n  toBlob(qr: QrResult): Blob {\n    return qr.blob;\n  }\n\n  /**\n   * Check if Web Share API is available.\n   */\n  canShare(): boolean {\n    return !!(navigator.share && navigator.canShare);\n  }\n\n  /**\n   * Check if Clipboard API is available for images.\n   */\n  canCopyToClipboard(): boolean {\n    return !!(navigator.clipboard && navigator.clipboard.write);\n  }\n\n  // === Private Helpers ===\n\n  private buildColorOptions(color?: QrColorConfig): any {\n    if (!color) {\n      return {};\n    }\n\n    if (typeof color === 'string') {\n      return { color };\n    }\n\n    // Gradient\n    const gradient = color as QrGradient;\n    return {\n      gradient: {\n        type: gradient.type,\n        rotation: gradient.rotation || 0,\n        colorStops: gradient.colorStops,\n      },\n    };\n  }\n\n  private getMimeType(format: string): string {\n    const mimeTypes: Record<string, string> = {\n      png: 'image/png',\n      jpeg: 'image/jpeg',\n      webp: 'image/webp',\n      svg: 'image/svg+xml',\n    };\n    return mimeTypes[format] || 'image/png';\n  }\n\n  private blobToDataUrl(blob: Blob): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onloadend = () => resolve(reader.result as string);\n      reader.onerror = reject;\n      reader.readAsDataURL(blob);\n    });\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { downloadOutline, copyOutline, shareOutline } from 'ionicons/icons';\n\nimport { QrCodeMetadata, QrCodeActionEvent } from './types';\nimport { QrGeneratorService } from '../../../services/qr-generator/qr-generator.service';\nimport { I18nService } from '../../../services/i18n';\n\naddIcons({ downloadOutline, copyOutline, shareOutline });\n\n@Component({\n  selector: 'val-qr-code',\n  standalone: true,\n  imports: [CommonModule, IonButton, IonIcon, IonSpinner],\n  template: `\n    <div\n      class=\"qr-code-container\"\n      [class]=\"getContainerClasses()\"\n      [style.--border-radius]=\"getBorderRadius()\"\n      [style.--padding]=\"getPadding()\"\n      [style.--container-bg]=\"getContainerBackground()\"\n      [style.--border-color]=\"props.borderColor || 'var(--ion-color-light-shade)'\"\n      [style.--shadow]=\"getShadow()\"\n      [style.--glow-color]=\"props.glowColor || '#8b5cf6'\"\n      [style.--qr-border-radius]=\"getQrBorderRadius()\"\n    >\n      @if (props.loading) {\n        <div class=\"loading-overlay\">\n          <ion-spinner name=\"circular\"></ion-spinner>\n        </div>\n      }\n\n      @if (props.label && props.label.position === 'top') {\n        <div\n          class=\"qr-label qr-label--top\"\n          [style.--label-color]=\"props.label.color || 'inherit'\"\n          [style.--label-size]=\"getLabelFontSize()\"\n        >\n          @if (props.label.icon && props.label.iconPosition !== 'end') {\n            <ion-icon [name]=\"props.label.icon\"></ion-icon>\n          }\n          <span [class]=\"'font-weight--' + (props.label.fontWeight || 'medium')\">{{ props.label.text }}</span>\n          @if (props.label.icon && props.label.iconPosition === 'end') {\n            <ion-icon [name]=\"props.label.icon\"></ion-icon>\n          }\n        </div>\n      }\n\n      <div class=\"qr-image-wrapper\" [style.--size]=\"getDisplaySize()\">\n        <img\n          [src]=\"props.qr.dataUrl\"\n          [alt]=\"props.alt || 'QR Code'\"\n          class=\"qr-image\"\n          (load)=\"onImageLoad()\"\n          (error)=\"onImageError($event)\"\n        />\n      </div>\n\n      @if (props.label && props.label.position !== 'top') {\n        <div\n          class=\"qr-label qr-label--bottom\"\n          [style.--label-color]=\"props.label.color || 'inherit'\"\n          [style.--label-size]=\"getLabelFontSize()\"\n        >\n          @if (props.label.icon && props.label.iconPosition !== 'end') {\n            <ion-icon [name]=\"props.label.icon\"></ion-icon>\n          }\n          <span [class]=\"'font-weight--' + (props.label.fontWeight || 'medium')\">{{ props.label.text }}</span>\n          @if (props.label.icon && props.label.iconPosition === 'end') {\n            <ion-icon [name]=\"props.label.icon\"></ion-icon>\n          }\n        </div>\n      }\n\n      @if (hasActions()) {\n        <div class=\"qr-actions\">\n          @if (props.showDownload) {\n            <ion-button fill=\"clear\" size=\"small\" (click)=\"onDownload()\" [title]=\"getDownloadLabel()\">\n              <ion-icon name=\"download-outline\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          }\n\n          @if (props.showCopy && canCopy) {\n            <ion-button fill=\"clear\" size=\"small\" (click)=\"onCopy()\" [title]=\"getCopyLabel()\">\n              <ion-icon name=\"copy-outline\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          }\n\n          @if (props.showShare && canShare) {\n            <ion-button fill=\"clear\" size=\"small\" (click)=\"onShare()\" [title]=\"getShareLabel()\">\n              <ion-icon name=\"share-outline\" slot=\"icon-only\"></ion-icon>\n            </ion-button>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./qr-code.component.scss'],\n})\n/**\n * val-qr-code\n *\n * A component to display QR codes generated by QrGeneratorService.\n * Provides optional action buttons for download, copy, and share.\n *\n * @example Basic usage\n * ```typescript\n * qr = await this.qrService.generate({ data: 'https://example.com' });\n * ```\n * ```html\n * <val-qr-code [props]=\"{ qr: qr }\"></val-qr-code>\n * ```\n *\n * @example With actions\n * ```html\n * <val-qr-code\n *   [props]=\"{\n *     qr: qr,\n *     showDownload: true,\n *     showCopy: true,\n *     showShare: true,\n *     displaySize: 200,\n *     showBorder: true,\n *     borderRadius: 12\n *   }\"\n *   (actionComplete)=\"onAction($event)\"\n * ></val-qr-code>\n * ```\n *\n * @input props: QrCodeMetadata - Configuration for the QR display\n * @output actionComplete - Emits when an action (download/copy/share) completes\n * @output imageLoad - Emits when the QR image loads\n * @output imageError - Emits when the QR image fails to load\n */\nexport class QrCodeComponent implements OnInit {\n  @Input() props: QrCodeMetadata;\n\n  @Output() actionComplete = new EventEmitter<QrCodeActionEvent>();\n  @Output() imageLoad = new EventEmitter<void>();\n  @Output() imageError = new EventEmitter<Error>();\n\n  canShare = false;\n  canCopy = false;\n\n  private qrService = inject(QrGeneratorService);\n  private i18n = inject(I18nService);\n\n  ngOnInit(): void {\n    this.canShare = this.qrService.canShare();\n    this.canCopy = this.qrService.canCopyToClipboard();\n  }\n\n  getDisplaySize(): string {\n    if (this.props.displaySize) {\n      return `${this.props.displaySize}px`;\n    }\n    return `${this.props.qr.config.width || 300}px`;\n  }\n\n  getBorderRadius(): string {\n    return this.props.borderRadius ? `${this.props.borderRadius}px` : '0';\n  }\n\n  getPadding(): string {\n    return this.props.padding ? `${this.props.padding}px` : '0';\n  }\n\n  getQrBorderRadius(): string {\n    return this.props.qrBorderRadius ? `${this.props.qrBorderRadius}px` : '0';\n  }\n\n  getContainerClasses(): string {\n    const classes: string[] = [];\n\n    if (this.props.cssClass) classes.push(this.props.cssClass);\n    if (this.props.showBorder) classes.push('with-border');\n    if (this.props.loading) classes.push('loading');\n    if (this.props.theme) classes.push(`theme--${this.props.theme}`);\n    if (this.props.pulseOnHover) classes.push('pulse-on-hover');\n    if (this.props.scaleOnHover) classes.push('scale-on-hover');\n    if (this.props.gradient) classes.push('has-gradient');\n\n    return classes.join(' ');\n  }\n\n  getContainerBackground(): string {\n    if (this.props.gradient) {\n      const { from, to, via, direction = 'to-bottom' } = this.props.gradient;\n      const cssDirection = direction.replace(/-/g, ' ');\n      if (via) {\n        return `linear-gradient(${cssDirection}, ${from}, ${via}, ${to})`;\n      }\n      return `linear-gradient(${cssDirection}, ${from}, ${to})`;\n    }\n    return this.props.containerBackground || 'transparent';\n  }\n\n  getShadow(): string {\n    const shadowMap: Record<string, string> = {\n      none: 'none',\n      sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n      md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n      lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n      xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n    };\n\n    if (!this.props.shadow) return 'none';\n    return shadowMap[this.props.shadow] || this.props.shadow;\n  }\n\n  getLabelFontSize(): string {\n    return this.props.label?.fontSize ? `${this.props.label.fontSize}px` : '14px';\n  }\n\n  hasActions(): boolean {\n    return !!(this.props.showDownload || this.props.showCopy || this.props.showShare);\n  }\n\n  getDownloadLabel(): string {\n    return this.props.downloadLabel || this.i18n.t('download');\n  }\n\n  getCopyLabel(): string {\n    return this.props.copyLabel || this.i18n.t('copy');\n  }\n\n  getShareLabel(): string {\n    return this.props.shareLabel || this.i18n.t('share');\n  }\n\n  async onDownload(): Promise<void> {\n    try {\n      const options = this.props.downloadFilename ? { filename: this.props.downloadFilename } : undefined;\n      await this.qrService.download(this.props.qr, options);\n      this.actionComplete.emit({\n        action: 'download',\n        success: true,\n        qr: this.props.qr,\n      });\n    } catch (error) {\n      this.actionComplete.emit({\n        action: 'download',\n        success: false,\n        qr: this.props.qr,\n        error: error as Error,\n      });\n    }\n  }\n\n  async onCopy(): Promise<void> {\n    try {\n      const success = await this.qrService.copyToClipboard(this.props.qr);\n      this.actionComplete.emit({\n        action: 'copy',\n        success,\n        qr: this.props.qr,\n      });\n    } catch (error) {\n      this.actionComplete.emit({\n        action: 'copy',\n        success: false,\n        qr: this.props.qr,\n        error: error as Error,\n      });\n    }\n  }\n\n  async onShare(): Promise<void> {\n    try {\n      const options: { title?: string; text?: string; filename?: string } = {};\n      if (this.props.shareTitle) options.title = this.props.shareTitle;\n      if (this.props.shareText) options.text = this.props.shareText;\n      if (this.props.shareFilename) options.filename = this.props.shareFilename;\n\n      const success = await this.qrService.share(this.props.qr, Object.keys(options).length > 0 ? options : undefined);\n      this.actionComplete.emit({\n        action: 'share',\n        success,\n        qr: this.props.qr,\n      });\n    } catch (error) {\n      this.actionComplete.emit({\n        action: 'share',\n        success: false,\n        qr: this.props.qr,\n        error: error as Error,\n      });\n    }\n  }\n\n  onImageLoad(): void {\n    this.imageLoad.emit();\n  }\n\n  onImageError(_event: Event): void {\n    const error = new Error('Failed to load QR code image');\n    this.imageError.emit(error);\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Time unit for countdown display.\n */\nexport interface CountdownUnit {\n  /** Value of the unit */\n  value: number;\n  /** Label for the unit */\n  label: string;\n  /** Whether to show this unit */\n  show: boolean;\n}\n\n/**\n * Countdown time breakdown.\n */\nexport interface CountdownTime {\n  days: number;\n  hours: number;\n  minutes: number;\n  seconds: number;\n  totalSeconds: number;\n  isExpired: boolean;\n}\n\n/**\n * Labels for countdown units.\n */\nexport interface CountdownLabels {\n  days?: string;\n  hours?: string;\n  minutes?: string;\n  seconds?: string;\n  /** Singular forms (optional) */\n  day?: string;\n  hour?: string;\n  minute?: string;\n  second?: string;\n}\n\n/**\n * Default labels in Spanish.\n */\nexport const DEFAULT_COUNTDOWN_LABELS: CountdownLabels = {\n  days: 'días',\n  hours: 'horas',\n  minutes: 'minutos',\n  seconds: 'segundos',\n  day: 'día',\n  hour: 'hora',\n  minute: 'minuto',\n  second: 'segundo',\n};\n\n/**\n * Default labels in English.\n */\nexport const DEFAULT_COUNTDOWN_LABELS_EN: CountdownLabels = {\n  days: 'days',\n  hours: 'hours',\n  minutes: 'minutes',\n  seconds: 'seconds',\n  day: 'day',\n  hour: 'hour',\n  minute: 'minute',\n  second: 'second',\n};\n\n/**\n * Metadata for the countdown component.\n */\nexport interface CountdownMetadata {\n  /** Target date/time to count down to */\n  targetDate: Date | string | number;\n\n  // === Display options ===\n  /** Display format */\n  format?: 'full' | 'compact' | 'minimal' | 'digital';\n  /** Show days */\n  showDays?: boolean;\n  /** Show hours */\n  showHours?: boolean;\n  /** Show minutes */\n  showMinutes?: boolean;\n  /** Show seconds */\n  showSeconds?: boolean;\n  /** Show labels below numbers */\n  showLabels?: boolean;\n  /** Show separators between units */\n  showSeparators?: boolean;\n  /** Separator character (default: ':') */\n  separator?: string;\n  /** Pad numbers with zeros */\n  padNumbers?: boolean;\n\n  // === Labels ===\n  /** Custom labels for time units */\n  labels?: CountdownLabels;\n  /** Message to show when expired */\n  expiredMessage?: string;\n  /** Show expired message or hide component */\n  showExpiredMessage?: boolean;\n\n  // === Styling ===\n  /** Component color */\n  color?: Color;\n  /** Size variant */\n  size?: 'small' | 'medium' | 'large';\n  /** Custom CSS class */\n  cssClass?: string;\n\n  // === Behavior ===\n  /** Auto-start countdown */\n  autoStart?: boolean;\n  /** Update interval in ms (default: 1000) */\n  updateInterval?: number;\n\n  // === Reactive content ===\n  /** Content key for expired message */\n  expiredMessageContentKey?: string;\n  /** Content class for reactive content */\n  contentClass?: string;\n}\n\n/**\n * Event emitted when countdown completes.\n */\nexport interface CountdownCompleteEvent {\n  /** Target date that was reached */\n  targetDate: Date;\n  /** Timestamp when completed */\n  completedAt: Date;\n}\n\n/**\n * Event emitted on each countdown tick.\n */\nexport interface CountdownTickEvent {\n  /** Current time breakdown */\n  time: CountdownTime;\n  /** Percentage of time elapsed (if start time known) */\n  percentageElapsed?: number;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { I18nService } from '../../../services/i18n';\nimport {\n  CountdownMetadata,\n  CountdownTime,\n  CountdownCompleteEvent,\n  CountdownTickEvent,\n  DEFAULT_COUNTDOWN_LABELS,\n} from './types';\n\n@Component({\n  selector: 'val-countdown',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"countdown-container\"\n      [class]=\"props.cssClass\"\n      [class.expired]=\"isExpired\"\n      [class.format-full]=\"props.format === 'full' || !props.format\"\n      [class.format-compact]=\"props.format === 'compact'\"\n      [class.format-minimal]=\"props.format === 'minimal'\"\n      [class.format-digital]=\"props.format === 'digital'\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-medium]=\"props.size === 'medium' || !props.size\"\n      [class.size-large]=\"props.size === 'large'\"\n      [style.--countdown-color]=\"getColor()\"\n    >\n      @if (isExpired && props.showExpiredMessage !== false) {\n        <div class=\"expired-message\">\n          {{ getExpiredMessage() }}\n        </div>\n      } @else if (!isExpired) {\n        <div class=\"countdown-units\">\n          @if (shouldShowDays()) {\n            <div class=\"countdown-unit\">\n              <span class=\"countdown-value\">{{ formatNumber(time.days) }}</span>\n              @if (props.showLabels !== false) {\n                <span class=\"countdown-label\">{{ getLabel('days', time.days) }}</span>\n              }\n            </div>\n            @if (props.showSeparators !== false && shouldShowHours()) {\n              <span class=\"countdown-separator\">{{ props.separator || ':' }}</span>\n            }\n          }\n\n          @if (shouldShowHours()) {\n            <div class=\"countdown-unit\">\n              <span class=\"countdown-value\">{{ formatNumber(time.hours) }}</span>\n              @if (props.showLabels !== false) {\n                <span class=\"countdown-label\">{{ getLabel('hours', time.hours) }}</span>\n              }\n            </div>\n            @if (props.showSeparators !== false && shouldShowMinutes()) {\n              <span class=\"countdown-separator\">{{ props.separator || ':' }}</span>\n            }\n          }\n\n          @if (shouldShowMinutes()) {\n            <div class=\"countdown-unit\">\n              <span class=\"countdown-value\">{{ formatNumber(time.minutes) }}</span>\n              @if (props.showLabels !== false) {\n                <span class=\"countdown-label\">{{ getLabel('minutes', time.minutes) }}</span>\n              }\n            </div>\n            @if (props.showSeparators !== false && shouldShowSeconds()) {\n              <span class=\"countdown-separator\">{{ props.separator || ':' }}</span>\n            }\n          }\n\n          @if (shouldShowSeconds()) {\n            <div class=\"countdown-unit\">\n              <span class=\"countdown-value\">{{ formatNumber(time.seconds) }}</span>\n              @if (props.showLabels !== false) {\n                <span class=\"countdown-label\">{{ getLabel('seconds', time.seconds) }}</span>\n              }\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./countdown.component.scss'],\n})\n/**\n * val-countdown\n *\n * A countdown timer component that counts down to a target date.\n *\n * @example Basic usage\n * ```html\n * <val-countdown\n *   [props]=\"{\n *     targetDate: '2024-12-31T23:59:59',\n *     format: 'full'\n *   }\"\n *   (complete)=\"onCountdownComplete()\"\n * ></val-countdown>\n * ```\n *\n * @example Compact format\n * ```html\n * <val-countdown\n *   [props]=\"{\n *     targetDate: raffleEndDate,\n *     format: 'compact',\n *     showDays: true,\n *     showSeconds: false,\n *     color: 'danger',\n *     expiredMessage: '¡Sorteo finalizado!'\n *   }\"\n * ></val-countdown>\n * ```\n *\n * @example Digital clock style\n * ```html\n * <val-countdown\n *   [props]=\"{\n *     targetDate: deadline,\n *     format: 'digital',\n *     showLabels: false,\n *     size: 'large'\n *   }\"\n * ></val-countdown>\n * ```\n */\nexport class CountdownComponent implements OnInit, OnDestroy {\n  @Input() props: CountdownMetadata;\n\n  @Output() complete = new EventEmitter<CountdownCompleteEvent>();\n  @Output() tick = new EventEmitter<CountdownTickEvent>();\n\n  private i18n = inject(I18nService);\n\n  time: CountdownTime = {\n    days: 0,\n    hours: 0,\n    minutes: 0,\n    seconds: 0,\n    totalSeconds: 0,\n    isExpired: false,\n  };\n\n  isExpired = false;\n\n  private intervalId: any = null;\n\n  ngOnInit(): void {\n    if (this.props.autoStart !== false) {\n      this.start();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.stop();\n  }\n\n  /**\n   * Start the countdown timer.\n   */\n  start(): void {\n    this.updateTime();\n    const interval = this.props.updateInterval || 1000;\n    this.intervalId = setInterval(() => this.updateTime(), interval);\n  }\n\n  /**\n   * Stop the countdown timer.\n   */\n  stop(): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n  }\n\n  /**\n   * Reset and restart the countdown.\n   */\n  restart(): void {\n    this.stop();\n    this.isExpired = false;\n    this.start();\n  }\n\n  private updateTime(): void {\n    const target = this.getTargetDate();\n    const now = new Date();\n    const diff = target.getTime() - now.getTime();\n\n    if (diff <= 0) {\n      this.time = {\n        days: 0,\n        hours: 0,\n        minutes: 0,\n        seconds: 0,\n        totalSeconds: 0,\n        isExpired: true,\n      };\n      this.isExpired = true;\n      this.stop();\n      this.complete.emit({\n        targetDate: target,\n        completedAt: now,\n      });\n      return;\n    }\n\n    const totalSeconds = Math.floor(diff / 1000);\n    const days = Math.floor(totalSeconds / 86400);\n    const hours = Math.floor((totalSeconds % 86400) / 3600);\n    const minutes = Math.floor((totalSeconds % 3600) / 60);\n    const seconds = totalSeconds % 60;\n\n    this.time = {\n      days,\n      hours,\n      minutes,\n      seconds,\n      totalSeconds,\n      isExpired: false,\n    };\n\n    this.tick.emit({ time: this.time });\n  }\n\n  private getTargetDate(): Date {\n    const target = this.props.targetDate;\n    if (target instanceof Date) {\n      return target;\n    }\n    if (typeof target === 'number') {\n      return new Date(target);\n    }\n    return new Date(target);\n  }\n\n  shouldShowDays(): boolean {\n    if (this.props.showDays === false) return false;\n    if (this.props.showDays === true) return true;\n    // Auto: show if more than 0 days or format is full\n    return this.time.days > 0 || this.props.format === 'full';\n  }\n\n  shouldShowHours(): boolean {\n    if (this.props.showHours === false) return false;\n    return true;\n  }\n\n  shouldShowMinutes(): boolean {\n    if (this.props.showMinutes === false) return false;\n    return true;\n  }\n\n  shouldShowSeconds(): boolean {\n    if (this.props.showSeconds === false) return false;\n    if (this.props.format === 'minimal') return false;\n    return true;\n  }\n\n  formatNumber(value: number): string {\n    if (this.props.padNumbers === false) {\n      return String(value);\n    }\n    return String(value).padStart(2, '0');\n  }\n\n  getLabel(unit: 'days' | 'hours' | 'minutes' | 'seconds', value: number): string {\n    const labels = this.props.labels || DEFAULT_COUNTDOWN_LABELS;\n    const isSingular = value === 1;\n\n    // Get singular or plural form\n    const singularKey = unit.slice(0, -1) as 'day' | 'hour' | 'minute' | 'second';\n\n    if (isSingular && labels[singularKey]) {\n      return labels[singularKey]!;\n    }\n\n    return labels[unit] || unit;\n  }\n\n  getExpiredMessage(): string {\n    return this.props.expiredMessage || this.i18n.t('timeExpired');\n  }\n\n  getColor(): string {\n    if (this.props.color) {\n      return `var(--ion-color-${this.props.color})`;\n    }\n    return 'var(--ion-color-primary)';\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Metadata for the price tag component.\n */\nexport interface PriceTagMetadata {\n  /** Price amount */\n  amount: number;\n  /** Currency code (ISO 4217) */\n  currency?: string;\n  /** Currency symbol (overrides auto-detection) */\n  currencySymbol?: string;\n  /** Original price (for showing discounts) */\n  originalAmount?: number;\n  /** Discount percentage to show */\n  discountPercentage?: number;\n\n  // === Display options ===\n  /** Size variant */\n  size?: 'small' | 'medium' | 'large' | 'xlarge';\n  /** Display variant */\n  variant?: 'default' | 'highlight' | 'sale' | 'free' | 'badge';\n  /** Show currency code after amount */\n  showCurrencyCode?: boolean;\n  /** Decimal places */\n  decimals?: number;\n  /** Period/frequency label (e.g., \"/mes\", \"por boleto\") */\n  period?: string;\n  /** Prefix text (e.g., \"Desde\") */\n  prefix?: string;\n  /** Suffix text (e.g., \"MXN\") */\n  suffix?: string;\n\n  // === Styling ===\n  /** Component color */\n  color?: Color;\n  /** Custom CSS class */\n  cssClass?: string;\n  /** Text alignment */\n  align?: 'left' | 'center' | 'right';\n  /** Show currency symbol */\n  showSymbol?: boolean;\n\n  // === Reactive content ===\n  /** Content key for prefix */\n  prefixContentKey?: string;\n  /** Content key for period */\n  periodContentKey?: string;\n  /** Content class for reactive content */\n  contentClass?: string;\n}\n\n/**\n * Currency configuration.\n */\nexport interface CurrencyInfo {\n  code: string;\n  symbol: string;\n  symbolPosition: 'prefix' | 'suffix';\n  decimals: number;\n  thousandsSeparator: string;\n  decimalSeparator: string;\n}\n\n/**\n * Common currency configurations.\n */\nexport const CURRENCY_INFO: Record<string, CurrencyInfo> = {\n  USD: { code: 'USD', symbol: '$', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: ',', decimalSeparator: '.' },\n  MXN: { code: 'MXN', symbol: '$', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: ',', decimalSeparator: '.' },\n  EUR: { code: 'EUR', symbol: '€', symbolPosition: 'suffix', decimals: 2, thousandsSeparator: '.', decimalSeparator: ',' },\n  GBP: { code: 'GBP', symbol: '£', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: ',', decimalSeparator: '.' },\n  COP: { code: 'COP', symbol: '$', symbolPosition: 'prefix', decimals: 0, thousandsSeparator: '.', decimalSeparator: ',' },\n  ARS: { code: 'ARS', symbol: '$', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: '.', decimalSeparator: ',' },\n  CLP: { code: 'CLP', symbol: '$', symbolPosition: 'prefix', decimals: 0, thousandsSeparator: '.', decimalSeparator: ',' },\n  PEN: { code: 'PEN', symbol: 'S/', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: ',', decimalSeparator: '.' },\n  BRL: { code: 'BRL', symbol: 'R$', symbolPosition: 'prefix', decimals: 2, thousandsSeparator: '.', decimalSeparator: ',' },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { PriceTagMetadata, CurrencyInfo, CURRENCY_INFO } from './types';\n\n@Component({\n  selector: 'val-price-tag',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"price-tag\"\n      [class]=\"props.cssClass\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-medium]=\"props.size === 'medium' || !props.size\"\n      [class.size-large]=\"props.size === 'large'\"\n      [class.size-xlarge]=\"props.size === 'xlarge'\"\n      [class.variant-default]=\"props.variant === 'default' || !props.variant\"\n      [class.variant-highlight]=\"props.variant === 'highlight'\"\n      [class.variant-sale]=\"props.variant === 'sale'\"\n      [class.variant-free]=\"props.variant === 'free'\"\n      [class.variant-badge]=\"props.variant === 'badge'\"\n      [class.has-discount]=\"hasDiscount\"\n      [class.align-left]=\"props.align === 'left'\"\n      [class.align-center]=\"props.align === 'center' || !props.align\"\n      [class.align-right]=\"props.align === 'right'\"\n      [style.--price-color]=\"getColor()\"\n    >\n      @if (props.prefix) {\n        <span class=\"price-prefix\">{{ getPrefix() }}</span>\n      }\n\n      @if (hasDiscount && props.originalAmount) {\n        <span class=\"original-price\">\n          {{ formatPrice(props.originalAmount) }}\n        </span>\n      }\n\n      <span class=\"current-price\">\n        @if (props.variant === 'free' || props.amount === 0) {\n          <span class=\"free-text\">Gratis</span>\n        } @else {\n          @if (currencyInfo.symbolPosition === 'prefix' && props.showSymbol !== false) {\n            <span class=\"currency-symbol\">{{ getSymbol() }}</span>\n          }\n          <span class=\"amount\">{{ formatAmount() }}</span>\n          @if (currencyInfo.symbolPosition === 'suffix' && props.showSymbol !== false) {\n            <span class=\"currency-symbol suffix\">{{ getSymbol() }}</span>\n          }\n        }\n      </span>\n\n      @if (props.showCurrencyCode && props.currency) {\n        <span class=\"currency-code\">{{ props.currency }}</span>\n      }\n\n      @if (props.suffix) {\n        <span class=\"price-suffix\">{{ props.suffix }}</span>\n      }\n\n      @if (props.period) {\n        <span class=\"price-period\">{{ getPeriod() }}</span>\n      }\n\n      @if (props.discountPercentage && props.discountPercentage > 0) {\n        <span class=\"discount-badge\">\n          -{{ props.discountPercentage }}%\n        </span>\n      }\n    </div>\n  `,\n  styleUrls: ['./price-tag.component.scss'],\n})\n/**\n * val-price-tag\n *\n * A component for displaying prices with currency formatting and discount support.\n *\n * @example Basic usage\n * ```html\n * <val-price-tag [props]=\"{ amount: 99.99, currency: 'MXN' }\"></val-price-tag>\n * ```\n *\n * @example With discount\n * ```html\n * <val-price-tag\n *   [props]=\"{\n *     amount: 79.99,\n *     originalAmount: 99.99,\n *     currency: 'MXN',\n *     variant: 'sale',\n *     discountPercentage: 20\n *   }\"\n * ></val-price-tag>\n * ```\n *\n * @example With period\n * ```html\n * <val-price-tag\n *   [props]=\"{\n *     amount: 10,\n *     currency: 'MXN',\n *     period: 'por boleto',\n *     size: 'large'\n *   }\"\n * ></val-price-tag>\n * ```\n *\n * @example Highlight variant\n * ```html\n * <val-price-tag\n *   [props]=\"{\n *     amount: 500,\n *     currency: 'MXN',\n *     prefix: 'Desde',\n *     variant: 'highlight',\n *     size: 'xlarge'\n *   }\"\n * ></val-price-tag>\n * ```\n */\nexport class PriceTagComponent {\n  @Input() props: PriceTagMetadata;\n\n  get currencyInfo(): CurrencyInfo {\n    const currency = this.props.currency || 'MXN';\n    return CURRENCY_INFO[currency] || CURRENCY_INFO['USD'];\n  }\n\n  get hasDiscount(): boolean {\n    return !!(\n      this.props.originalAmount &&\n      this.props.originalAmount > this.props.amount\n    );\n  }\n\n  getSymbol(): string {\n    return this.props.currencySymbol || this.currencyInfo.symbol;\n  }\n\n  formatAmount(): string {\n    const decimals = this.props.decimals ?? this.currencyInfo.decimals;\n    const info = this.currencyInfo;\n\n    // Format number\n    const parts = this.props.amount.toFixed(decimals).split('.');\n    const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, info.thousandsSeparator);\n\n    if (decimals > 0 && parts[1]) {\n      return `${integerPart}${info.decimalSeparator}${parts[1]}`;\n    }\n\n    return integerPart;\n  }\n\n  formatPrice(amount: number): string {\n    const decimals = this.props.decimals ?? this.currencyInfo.decimals;\n    const info = this.currencyInfo;\n    const symbol = this.getSymbol();\n\n    // Format number\n    const parts = amount.toFixed(decimals).split('.');\n    const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, info.thousandsSeparator);\n    const formattedNumber = decimals > 0 && parts[1]\n      ? `${integerPart}${info.decimalSeparator}${parts[1]}`\n      : integerPart;\n\n    // Add symbol\n    if (info.symbolPosition === 'prefix') {\n      return `${symbol}${formattedNumber}`;\n    }\n    return `${formattedNumber}${symbol}`;\n  }\n\n  getPrefix(): string {\n    return this.props.prefix || '';\n  }\n\n  getPeriod(): string {\n    return this.props.period || '';\n  }\n\n  getColor(): string {\n    if (this.props.color) {\n      return `var(--ion-color-${this.props.color})`;\n    }\n    return 'var(--ion-color-dark)';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, TemplateRef } from '@angular/core';\nimport { HorizontalScrollMetadata } from './types';\n\n/**\n * val-horizontal-scroll\n *\n * A generic horizontal scroll container that renders items using a provided template.\n * Useful for carousels, galleries, or any horizontally scrollable content.\n *\n * @example\n * <val-horizontal-scroll\n *   [items]=\"cards\"\n *   [itemTemplate]=\"cardTemplate\"\n *   [props]=\"{ gap: '16px', snapAlign: 'start' }\"\n * ></val-horizontal-scroll>\n *\n * <ng-template #cardTemplate let-item let-index=\"index\">\n *   <div class=\"card\">{{ item.title }}</div>\n * </ng-template>\n *\n * @input items - Array of items to render\n * @input itemTemplate - Template reference for rendering each item\n * @input props - Optional configuration (gap, padding, showScrollbar, snapAlign)\n */\n@Component({\n  selector: 'val-horizontal-scroll',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"horizontal-scroll-container\"\n      [class.hide-scrollbar]=\"!props?.showScrollbar\"\n      [class.snap-start]=\"props?.snapAlign === 'start'\"\n      [class.snap-center]=\"props?.snapAlign === 'center'\"\n      [style.padding]=\"props?.padding || '0px'\"\n    >\n      <div class=\"items-wrapper\" [style.gap]=\"props?.gap || '0px'\">\n        @for (item of items; track $index) {\n          <div class=\"scroll-item\">\n            <ng-container\n              *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: $index }\"\n            ></ng-container>\n          </div>\n        }\n      </div>\n    </div>\n  `,\n  styleUrls: ['./horizontal-scroll.component.scss'],\n})\nexport class HorizontalScrollComponent<T = any> {\n  /**\n   * Array of items to render in the horizontal scroll.\n   */\n  @Input() items: T[] = [];\n\n  /**\n   * Template reference for rendering each item.\n   * The template receives the item as implicit context and index as 'index'.\n   */\n  @Input() itemTemplate!: TemplateRef<any>;\n\n  /**\n   * Optional configuration for the horizontal scroll container.\n   */\n  @Input() props?: HorizontalScrollMetadata;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { TextComponent } from '../text/text.component';\nimport { RightsFooterMetadata } from './types';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * val-rights-footer\n *\n * A simple component that displays copyright text with dynamic year.\n * Useful for footers where you need to show \"© 2024 Company. All rights reserved.\"\n *\n * @example\n * <val-rights-footer></val-rights-footer>\n *\n * @example\n * <val-rights-footer\n *   [props]=\"{\n *     companyName: 'My Company',\n *     rightsText: 'All rights reserved.',\n *     color: 'medium',\n *     align: 'left'\n *   }\"\n * ></val-rights-footer>\n *\n * @input props - Optional configuration (companyName, rightsText, color, align)\n */\n@Component({\n  selector: 'val-rights-footer',\n  standalone: true,\n  imports: [CommonModule, TextComponent],\n  template: `\n    <div\n      class=\"rights-footer\"\n      [class.rights-footer--left]=\"propsAlign() === 'left'\"\n      [class.rights-footer--center]=\"propsAlign() === 'center' || !propsAlign()\"\n      [class.rights-footer--right]=\"propsAlign() === 'right'\"\n      [class.rights-footer--with-margin]=\"propsWithMargin()\"\n    >\n      <val-text\n        [props]=\"{\n          content: copyrightText(),\n          color: propsColor(),\n          bold: false,\n          size: 'small'\n        }\"\n      />\n    </div>\n  `,\n  styleUrls: ['./rights-footer.component.scss'],\n})\nexport class RightsFooterComponent {\n  private i18n = inject(I18nService);\n\n  /**\n   * Optional configuration for the rights footer.\n   * Signal-based input for full reactivity with computed().\n   */\n  readonly props = input<RightsFooterMetadata>();\n\n  /**\n   * Current year for copyright.\n   */\n  currentYear = new Date().getFullYear();\n\n  /**\n   * Computed copyright text - reactive to both language AND props changes.\n   */\n  copyrightText = computed(() => {\n    this.i18n.lang(); // Track language changes\n    const p = this.props(); // Track props changes (now it's a signal!)\n\n    // If fullText is provided, use it with {year} replacement\n    if (p?.fullText) {\n      return p.fullText.replace('{year}', String(this.currentYear));\n    }\n\n    // Legacy format: © {year} {company}. {rights}\n    const company = p?.companyName || 'Valtech';\n    const rights = p?.rightsText || this.i18n.t('allRightsReserved');\n    return `© ${this.currentYear} ${company}. ${rights}`;\n  });\n\n  /**\n   * Computed helper for align prop in template.\n   */\n  propsAlign = computed(() => this.props()?.align);\n\n  /**\n   * Computed helper for color prop in template.\n   */\n  propsColor = computed(() => this.props()?.color || 'dark');\n\n  /**\n   * Computed helper for withMargin prop in template.\n   */\n  propsWithMargin = computed(() => this.props()?.withMargin ?? false);\n}\n","/**\n * Valtech Pattern System — motifs + palettes.\n *\n * Pure data + helpers, sin dependencias Angular. Reusable desde Node/scripts\n * (e.g., generate static thumbnails) o desde el componente `val-pattern`.\n *\n * Original spec: `assets/Valtech Pattern System.html` (single-page demo).\n * Cada motif es función `(fill: string) => string` que devuelve SVG inner\n * markup. Tile es 100x100 unidades; el motif se renderiza dentro de un `<g\n * transform=\"translate(col*100 row*100)\">` con un `<rect width=100 height=100\n * fill=bg/>` de fondo.\n */\n\nexport type PatternMotifKey =\n  | 'chev-r'\n  | 'chev-l'\n  | 'chev-d'\n  | 'chev-u'\n  | 'tri-tl'\n  | 'tri-tr'\n  | 'tri-bl'\n  | 'tri-br'\n  | 'solid'\n  | 'diamond'\n  | 'small-r'\n  | 'small-l'\n  | 'arrow-r'\n  | 'arrow-l'\n  | 'house-d'\n  | 'half-l'\n  | 'half-t'\n  // ── Nuevos motifs ──────────────────────────────────────────\n  | 'circle'\n  | 'circle-sm'\n  | 'dot'\n  | 'cross'\n  | 'x-mark'\n  | 'slash-r'\n  | 'slash-l'\n  | 'corner-tl'\n  | 'corner-tr'\n  | 'corner-bl'\n  | 'corner-br'\n  // ── Logo symbols + números ─────────────────────────────────\n  | 'underscore'\n  | 'num-0'\n  | 'num-1'\n  | 'num-2'\n  | 'num-3'\n  | 'num-4'\n  | 'num-5'\n  | 'num-6'\n  | 'num-7'\n  | 'num-8'\n  | 'num-9';\n\nconst CHEV_STROKE = 18;\nconst CHEV_SMALL_STROKE = 12;\nconst chevStyle = (f: string, w: number = CHEV_STROKE) =>\n  `stroke=\"${f}\" stroke-width=\"${w}\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"`;\n\nexport const PATTERN_MOTIFS: Record<PatternMotifKey, (fg: string) => string> = {\n  // ── Chevrons ────────────────────────────────────────────────\n  'chev-r': f => `<path d=\"M22 18 L72 50 L22 82\" ${chevStyle(f)}/>`,\n  'chev-l': f => `<path d=\"M78 18 L28 50 L78 82\" ${chevStyle(f)}/>`,\n  'chev-d': f => `<path d=\"M18 22 L50 72 L82 22\" ${chevStyle(f)}/>`,\n  'chev-u': f => `<path d=\"M18 78 L50 28 L82 78\" ${chevStyle(f)}/>`,\n  'small-r': f => `<path d=\"M38 32 L62 50 L38 68\" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,\n  'small-l': f => `<path d=\"M62 32 L38 50 L62 68\" ${chevStyle(f, CHEV_SMALL_STROKE)}/>`,\n  'arrow-r': f => `<path d=\"M10 42 L60 42 L60 28 L92 50 L60 72 L60 58 L10 58 Z\" fill=\"${f}\"/>`,\n  'arrow-l': f => `<path d=\"M90 42 L40 42 L40 28 L8 50 L40 72 L40 58 L90 58 Z\" fill=\"${f}\"/>`,\n  // ── Strokes ─────────────────────────────────────────────────\n  cross: f => `<path d=\"M50 12 L50 88 M12 50 L88 50\" ${chevStyle(f, 16)}/>`,\n  'x-mark': f => `<path d=\"M18 18 L82 82 M82 18 L18 82\" ${chevStyle(f, 16)}/>`,\n  'slash-r': f =>\n    `<line x1=\"18\" y1=\"82\" x2=\"82\" y2=\"18\" stroke=\"${f}\" stroke-width=\"16\" stroke-linecap=\"round\"/>`,\n  'slash-l': f =>\n    `<line x1=\"18\" y1=\"18\" x2=\"82\" y2=\"82\" stroke=\"${f}\" stroke-width=\"16\" stroke-linecap=\"round\"/>`,\n  // ── Filled shapes ───────────────────────────────────────────\n  circle: f => `<circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"${f}\"/>`,\n  'circle-sm': f => `<circle cx=\"50\" cy=\"50\" r=\"24\" fill=\"${f}\"/>`,\n  dot: f => `<circle cx=\"50\" cy=\"50\" r=\"12\" fill=\"${f}\"/>`,\n  diamond: f => `<polygon points=\"50,12 88,50 50,88 12,50\" fill=\"${f}\"/>`,\n  solid: () => ``,\n  // ── Triangles & halves ──────────────────────────────────────\n  'tri-tl': f => `<polygon points=\"0,0 100,0 0,100\" fill=\"${f}\"/>`,\n  'tri-tr': f => `<polygon points=\"0,0 100,0 100,100\" fill=\"${f}\"/>`,\n  'tri-bl': f => `<polygon points=\"0,0 100,100 0,100\" fill=\"${f}\"/>`,\n  'tri-br': f => `<polygon points=\"100,0 100,100 0,100\" fill=\"${f}\"/>`,\n  'half-l': f => `<rect x=\"0\" y=\"0\" width=\"50\" height=\"100\" fill=\"${f}\"/>`,\n  'half-t': f => `<rect x=\"0\" y=\"0\" width=\"100\" height=\"50\" fill=\"${f}\"/>`,\n  'house-d': f =>\n    `<polygon points=\"50,20 88,50 12,50\" fill=\"${f}\"/><rect x=\"28\" y=\"50\" width=\"44\" height=\"32\" fill=\"${f}\"/>`,\n  // ── Corner arcs ─────────────────────────────────────────────\n  'corner-tl': f => `<path d=\"M 0 0 L 100 0 A 100 100 0 0 1 0 100 Z\" fill=\"${f}\"/>`,\n  'corner-tr': f => `<path d=\"M 100 0 L 0 0 A 100 100 0 0 0 100 100 Z\" fill=\"${f}\"/>`,\n  'corner-bl': f => `<path d=\"M 0 100 L 100 100 A 100 100 0 0 0 0 0 Z\" fill=\"${f}\"/>`,\n  'corner-br': f => `<path d=\"M 100 100 L 0 100 A 100 100 0 0 1 100 0 Z\" fill=\"${f}\"/>`,\n  // ── Logo symbol ──────────────────────────────────────────────\n  underscore: f => `<rect x=\"14\" y=\"72\" width=\"72\" height=\"14\" rx=\"5\" fill=\"${f}\"/>`,\n  // ── Números — monospace bold, baseline centrada en tile 100x100 ──\n  'num-0': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">0</text>`,\n  'num-1': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">1</text>`,\n  'num-2': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">2</text>`,\n  'num-3': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">3</text>`,\n  'num-4': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">4</text>`,\n  'num-5': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">5</text>`,\n  'num-6': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">6</text>`,\n  'num-7': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">7</text>`,\n  'num-8': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">8</text>`,\n  'num-9': f =>\n    `<text x=\"50\" y=\"76\" font-size=\"68\" font-weight=\"800\" font-family=\"ui-monospace,'Courier New',monospace\" text-anchor=\"middle\" fill=\"${f}\">9</text>`,\n};\n\nexport const MOTIF_KEYS: PatternMotifKey[] = Object.keys(PATTERN_MOTIFS) as PatternMotifKey[];\n\n// ── Familias ─────────────────────────────────────────────────────────────────\n\n/** Chevron family — orientaciones + variantes pequeñas. */\nexport const CHEV_KEYS: PatternMotifKey[] = [\n  'chev-r',\n  'chev-l',\n  'chev-d',\n  'chev-u',\n  'small-r',\n  'small-l',\n  'arrow-r',\n  'arrow-l',\n];\n\n/** Stroke family — líneas, cruces y el guión bajo del logo `>_`. */\nexport const STROKE_KEYS: PatternMotifKey[] = [\n  'cross',\n  'x-mark',\n  'slash-r',\n  'slash-l',\n  'underscore',\n];\n\n/** Numeric family — dígitos 0-9 en monospace bold. */\nexport const NUM_KEYS: PatternMotifKey[] = [\n  'num-0',\n  'num-1',\n  'num-2',\n  'num-3',\n  'num-4',\n  'num-5',\n  'num-6',\n  'num-7',\n  'num-8',\n  'num-9',\n];\n\n/** Circle / dot family — formas curvas centradas. */\nexport const CIRCLE_KEYS: PatternMotifKey[] = ['circle', 'circle-sm', 'dot'];\n\n/** Diamond solo — forma geométrica angular centrada. */\nexport const SHAPE_KEYS: PatternMotifKey[] = ['diamond'];\n\n/** Triangle / half-fill family. */\nexport const TRI_KEYS: PatternMotifKey[] = [\n  'tri-tl',\n  'tri-tr',\n  'tri-bl',\n  'tri-br',\n  'half-l',\n  'half-t',\n  'house-d',\n];\n\n/** Corner arc family — mezcla suave con triangles. */\nexport const CORNER_KEYS: PatternMotifKey[] = ['corner-tl', 'corner-tr', 'corner-bl', 'corner-br'];\n\n/** No-foreground tiles — solo rect de fondo. */\nexport const SOLID_KEYS: PatternMotifKey[] = ['solid'];\n\n// ── Paletas ──────────────────────────────────────────────────────────────────\n\n/** Built-in palettes — 8 colores dark → light. */\nexport type PatternPaletteKey =\n  | 'purple'\n  | 'ink'\n  | 'lavender'\n  | 'midnight'\n  | 'ember'\n  | 'forest'\n  | 'rose'\n  | 'gold'\n  | 'mono'\n  // ── Paletas Valtech brand ──────────────────────────────────\n  | 'teal'\n  | 'ocean'\n  | 'violet'\n  | 'dusk'\n  | 'slate';\n\nexport const PATTERN_PALETTES: Record<PatternPaletteKey, string[]> = {\n  purple: ['#0e0420', '#2a1158', '#4a1d96', '#7026df', '#9156e8', '#b48eea', '#d9c3f5', '#ebdcfd'],\n  ink: ['#000000', '#0a0f1c', '#1a2235', '#2d3a55', '#4a5878', '#7d8aa5', '#b8c1d4', '#e4e8f0'],\n  lavender: [\n    '#1a0e3a',\n    '#2e1755',\n    '#5a3aa0',\n    '#7e5dc6',\n    '#a18bd9',\n    '#c4a8f0',\n    '#dccef5',\n    '#f0e6fc',\n  ],\n  midnight: [\n    '#020814',\n    '#071428',\n    '#0d2248',\n    '#1a3a6e',\n    '#2656a8',\n    '#4d82d4',\n    '#8ab4eb',\n    '#c5d9f5',\n  ],\n  ember: ['#120200', '#2e0800', '#6b1a00', '#b83200', '#e85a10', '#f59042', '#f9c48a', '#fde8cc'],\n  forest: ['#010a04', '#052010', '#0a4020', '#0f6635', '#18a058', '#3ece80', '#86e8b4', '#c4f5dc'],\n  rose: ['#12010a', '#2e0420', '#6b0a48', '#b01870', '#e040a0', '#f080c8', '#f8bce4', '#fde0f3'],\n  gold: ['#100800', '#2a1a00', '#5c3800', '#9e6000', '#d4920a', '#f0bc40', '#f8da8c', '#fdf0cc'],\n  mono: ['#080808', '#1a1a1a', '#303030', '#484848', '#707070', '#9e9e9e', '#cecece', '#f0f0f0'],\n  // ── Paletas brand Valtech ──────────────────────────────────────────────────\n  // deep teal → bright cyan\n  teal: ['#011a16', '#022e28', '#045042', '#077a64', '#0aa88c', '#2ecfb0', '#7aead8', '#c0f7ef'],\n  // navy profundo → azul cielo\n  ocean: ['#010c18', '#021a30', '#043060', '#0a5090', '#1478c0', '#3a9fdd', '#85ccee', '#c8e9f8'],\n  // violeta ultrabrillante (más vívido que purple, más eléctrico)\n  violet: ['#0d0025', '#1e0050', '#400090', '#6600cc', '#8c2af2', '#b06af8', '#d4a8fc', '#ecd8fe'],\n  // crepúsculo purple-blue (dusk — mezcla atmosférica)\n  dusk: ['#08051e', '#130a40', '#221880', '#3828b4', '#5548d8', '#8080e8', '#b4b4f4', '#ddddfb'],\n  // gris-azul corporativo frío (slate — tech neutral)\n  slate: ['#060c14', '#0e1e30', '#1c3550', '#2c5070', '#4278a0', '#6aa0c8', '#a4c6e4', '#d4e8f6'],\n};\n\n// ── Presets de estilo ─────────────────────────────────────────────────────────\n\n/**\n * Preset de composición del patrón. Controla qué familias predominan.\n *\n * - `branded`   → Chevrons dominantes (identidad Valtech `>_`). Default.\n * - `geometric` → Triángulos, esquinas y círculos. Más arquitectónico.\n * - `minimal`   → Espacios sólidos con trazos sutiles. Limpio, corporativo.\n * - `dense`     → Mezcla rica de todas las familias. Máxima textura.\n * - `code`      → Números, underscore y chevrons. Look de terminal.\n */\nexport type PatternStyleKey = 'branded' | 'geometric' | 'minimal' | 'dense' | 'code';\n\nexport interface PatternDensityConfig {\n  /** Probabilidad de chevron family. */\n  chev: number;\n  /** Probabilidad de stroke family (cross, x, slash, underscore). */\n  stroke: number;\n  /** Probabilidad de círculos. */\n  circle: number;\n  /** Probabilidad de diamond. */\n  shape: number;\n  /** Probabilidad de solid (espacio vacío). */\n  solid: number;\n  /** Probabilidad de numeric family (0-9). Default: 0. */\n  num?: number;\n  /** Resto → triangles + corners. */\n}\n\nexport const PATTERN_STYLE_CONFIGS: Record<PatternStyleKey, PatternDensityConfig> = {\n  branded: { chev: 0.58, stroke: 0.1, circle: 0.04, shape: 0.06, solid: 0.18, num: 0.0 },\n  geometric: { chev: 0.15, stroke: 0.05, circle: 0.18, shape: 0.14, solid: 0.1, num: 0.0 },\n  minimal: { chev: 0.25, stroke: 0.1, circle: 0.12, shape: 0.04, solid: 0.38, num: 0.0 },\n  dense: { chev: 0.4, stroke: 0.14, circle: 0.12, shape: 0.1, solid: 0.08, num: 0.02 },\n  code: { chev: 0.35, stroke: 0.18, circle: 0.02, shape: 0.02, solid: 0.12, num: 0.2 },\n};\n\n// ── RNG ──────────────────────────────────────────────────────────────────────\n\n/**\n * Mulberry32 seeded RNG — devuelve función `()=>[0,1)`.\n * Deterministic: mismo seed → misma secuencia.\n */\nexport function mulberry32(seed: number): () => number {\n  return function () {\n    seed = (seed + 0x6d2b79f5) >>> 0;\n    let t = seed;\n    t = Math.imul(t ^ (t >>> 15), t | 1);\n    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n  };\n}\n\n// ── Generación ───────────────────────────────────────────────────────────────\n\nexport interface PatternGenConfig {\n  cols: number;\n  rows: number;\n  seed: number;\n  palette: string[];\n  chevronDensity?: number;\n  style?: PatternStyleKey;\n  /** Si true, cada tile recibe una rotación aleatoria [0/90/180/270°]. */\n  tileRotation?: boolean;\n}\n\nexport interface PatternTile {\n  motif: PatternMotifKey;\n  bg: string;\n  fg: string;\n  rot?: 0 | 90 | 180 | 270;\n}\n\nfunction pickFrom<T>(arr: T[], rng: () => number): T {\n  return arr[Math.floor(rng() * arr.length)]!;\n}\n\n/**\n * Genera UN tile respetando densidades de familia + contraste de palette.\n * Acepta un config opcional de densidades (de PatternStyleKey o chevronDensity legacy).\n */\nexport function generateRandomTile(\n  palette: string[],\n  chevronDensity = 0.55,\n  rng: () => number = Math.random,\n  densityConfig?: PatternDensityConfig\n): PatternTile {\n  const cfg = densityConfig ?? {\n    chev: chevronDensity,\n    stroke: 0.08,\n    circle: 0.05,\n    shape: 0.07,\n    solid: 0.2,\n  };\n\n  const roll = rng();\n  let key: PatternMotifKey;\n\n  const t1 = cfg.chev;\n  const t2 = t1 + cfg.stroke;\n  const t3 = t2 + cfg.circle;\n  const t4 = t3 + cfg.shape;\n  const t5 = t4 + cfg.solid;\n  const t6 = t5 + (cfg.num ?? 0);\n\n  if (roll < t1) key = pickFrom(CHEV_KEYS, rng);\n  else if (roll < t2) key = pickFrom(STROKE_KEYS, rng);\n  else if (roll < t3) key = pickFrom(CIRCLE_KEYS, rng);\n  else if (roll < t4) key = pickFrom(SHAPE_KEYS, rng);\n  else if (roll < t5) key = pickFrom(SOLID_KEYS, rng);\n  else if (roll < t6) key = pickFrom(NUM_KEYS, rng);\n  else key = pickFrom([...TRI_KEYS, ...CORNER_KEYS], rng);\n\n  const bgIdx = Math.floor(rng() * palette.length);\n  let fgIdx = Math.floor(rng() * palette.length);\n  let tries = 0;\n  while (Math.abs(fgIdx - bgIdx) < 3 && tries < 6) {\n    fgIdx = Math.floor(rng() * palette.length);\n    tries++;\n  }\n  return { motif: key, bg: palette[bgIdx]!, fg: palette[fgIdx]! };\n}\n\nconst ROTATIONS: Array<0 | 90 | 180 | 270> = [0, 90, 180, 270];\n\n/** Genera matriz completa de tiles. */\nexport function generatePatternTiles(cfg: PatternGenConfig): PatternTile[] {\n  const { cols, rows, seed, palette } = cfg;\n  const chevronDensity = cfg.chevronDensity ?? 0.55;\n  const densityConfig = cfg.style ? PATTERN_STYLE_CONFIGS[cfg.style] : undefined;\n  const r = mulberry32(seed);\n  const tiles: PatternTile[] = [];\n  for (let i = 0; i < cols * rows; i++) {\n    const tile = generateRandomTile(palette, chevronDensity, r, densityConfig);\n    if (cfg.tileRotation) {\n      tile.rot = ROTATIONS[Math.floor(r() * 4)];\n    }\n    tiles.push(tile);\n  }\n  return tiles;\n}\n\n/**\n * Renderiza el inner SVG (sin el `<svg>` root) para una matriz de tiles.\n */\nexport function renderPatternSvgInner(\n  tiles: PatternTile[],\n  cols: number,\n  baseColor: string\n): string {\n  const W = cols * 100;\n  const rows = Math.ceil(tiles.length / cols);\n  const H = rows * 100;\n  let inner = `<rect width=\"${W}\" height=\"${H}\" fill=\"${baseColor}\"/>`;\n  for (let i = 0; i < tiles.length; i++) {\n    const c = i % cols;\n    const r = Math.floor(i / cols);\n    const t = tiles[i]!;\n    const shape = PATTERN_MOTIFS[t.motif](t.fg);\n    const shapeEl = t.rot ? `<g transform=\"rotate(${t.rot} 50 50)\">${shape}</g>` : shape;\n    inner += `<g transform=\"translate(${c * 100} ${r * 100})\"><rect width=\"100\" height=\"100\" fill=\"${t.bg}\"/>${shapeEl}</g>`;\n  }\n  return inner;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, Input, NgZone, OnDestroy, signal } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport {\n  generatePatternTiles,\n  generateRandomTile,\n  PATTERN_PALETTES,\n  PATTERN_STYLE_CONFIGS,\n  PatternDensityConfig,\n  PatternPaletteKey,\n  PatternStyleKey,\n  PatternTile,\n  renderPatternSvgInner,\n} from './motifs';\nimport { PatternMetadata } from './types';\n\n/**\n * `val-pattern`\n *\n * Componente de fondo geométrico inspirado en el sistema Valtech. Renderiza un\n * grid de tiles 100×100 con motifs (chevrons, triangles, diamonds, arrows) en\n * un SVG inline. Determinista vía `seed` o animado vía `reshuffle`.\n *\n * Cero dependencias externas — todo SVG.\n *\n * @example Como fondo de card (CSS absolute):\n * ```scss\n * .card { position: relative; overflow: hidden; }\n * .card val-pattern { position: absolute; inset: 0; z-index: 0; opacity: 0.4; }\n * .card .content { position: relative; z-index: 1; }\n * ```\n *\n * ```html\n * <div class=\"card\">\n *   <val-pattern [props]=\"{ palette: 'purple', cols: 6, rows: 3, seed: 42 }\" />\n *   <div class=\"content\">Tu contenido aquí</div>\n * </div>\n * ```\n *\n * @example Como background animado (hero/login):\n * ```html\n * <val-pattern [props]=\"{ palette: 'lavender', cols: 16, rows: 8, animated: true }\" />\n * ```\n */\n@Component({\n  selector: 'val-pattern',\n  standalone: true,\n  imports: [CommonModule],\n  template: ` <div class=\"val-pattern\" [innerHTML]=\"svgHtml()\"></div> `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n        height: 100%;\n        line-height: 0;\n        position: relative;\n      }\n\n      .val-pattern {\n        position: absolute;\n        inset: 0;\n        display: block;\n        transition: opacity 0.6s ease-in-out;\n      }\n\n      /* Specificity 0,2,0 — beats UA defaults para SVG. Width/height fuerzan\n       * fill del container. preserveAspectRatio=\"slice\" en el viewBox hace el\n       * crop/cover. Sin esto, el SVG cae a su intrinsic aspect ratio del\n       * viewBox y deja franjas cuando el container no matchea (ej. mobile\n       * con cols/rows wide-aspect). */\n      .val-pattern svg {\n        display: block;\n        width: 100%;\n        height: 100%;\n      }\n    `,\n  ],\n})\nexport class PatternComponent implements OnDestroy {\n  private sanitizer = inject(DomSanitizer);\n  private ngZone = inject(NgZone);\n\n  private readonly cols = signal(12);\n  private readonly rows = signal(4);\n  private readonly seed = signal(this.randomSeed());\n  private readonly paletteRef = signal<string[]>(PATTERN_PALETTES.purple);\n  private readonly chevronDensity = signal(0.55);\n  private readonly patternStyle = signal<PatternStyleKey | undefined>(undefined);\n  private readonly preserveAspect = signal<'slice' | 'meet'>('slice');\n  private readonly animated = signal(false);\n  private readonly reshuffleInterval = signal(8000);\n  private readonly tilesPerTick = signal(0);\n  private readonly tileRotation = signal(false);\n\n  private timer?: ReturnType<typeof setInterval>;\n\n  @Input() set props(value: PatternMetadata | undefined) {\n    if (!value) return;\n    if (value.cols !== undefined) this.cols.set(Math.max(1, value.cols));\n    if (value.rows !== undefined) this.rows.set(Math.max(1, value.rows));\n    if (value.seed !== undefined) this.seed.set(value.seed);\n    if (value.style !== undefined) this.patternStyle.set(value.style);\n    if (value.chevronDensity !== undefined && value.style === undefined) {\n      this.chevronDensity.set(Math.min(1, Math.max(0, value.chevronDensity)));\n    }\n    if (value.preserveAspect !== undefined) this.preserveAspect.set(value.preserveAspect);\n    if (value.palette !== undefined) {\n      this.paletteRef.set(this.resolvePalette(value.palette));\n    }\n    if (value.reshuffleInterval !== undefined && value.reshuffleInterval > 0) {\n      this.reshuffleInterval.set(value.reshuffleInterval);\n    }\n    if (value.tilesPerTick !== undefined && value.tilesPerTick >= 0) {\n      this.tilesPerTick.set(Math.floor(value.tilesPerTick));\n    }\n    if (value.animated !== undefined) this.animated.set(!!value.animated);\n    if (value.tileRotation !== undefined) this.tileRotation.set(!!value.tileRotation);\n  }\n\n  /**\n   * Tiles signal — mutable. Se regenera completa cuando cambia seed/cols/rows/\n   * palette/density. En modo animated, tiles individuales se sobrescriben sin\n   * tocar el resto (efecto staggered).\n   */\n  private readonly tiles = signal<PatternTile[]>([]);\n\n  /** SVG completo como string sanitized para `[innerHTML]`. */\n  readonly svgHtml = computed<SafeHtml>(() => {\n    const cols = this.cols();\n    const rows = this.rows();\n    const palette = this.paletteRef();\n    const inner = renderPatternSvgInner(this.tiles(), cols, palette[0]!);\n    const aspect = this.preserveAspect() === 'meet' ? 'xMidYMid meet' : 'xMidYMid slice';\n    // width/height=\"100%\" como ATRIBUTOS (no solo CSS) — algunos browsers\n    // (Safari/iOS) ignoran CSS height en SVG sin atributos y caen al intrinsic\n    // aspect del viewBox, dejando franjas vacías cuando el container no\n    // matchea el ratio.\n    const svg = `<svg width=\"100%\" height=\"100%\" viewBox=\"0 0 ${cols * 100} ${rows * 100}\" preserveAspectRatio=\"${aspect}\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" style=\"display:block;\">${inner}</svg>`;\n    return this.sanitizer.bypassSecurityTrustHtml(svg);\n  });\n\n  constructor() {\n    // Regenera grid completa cuando cambian props estructurales (cols/rows/\n    // palette/density/seed). El seed solo cambia explícitamente via props o\n    // mount inicial — NO se muta en modo animated.\n    // `allowSignalWrites: true` requerido en Angular 18: escribimos a `tiles`\n    // signal dentro del effect (consumido por svgHtml computed).\n    effect(\n      () => {\n        const cols = this.cols();\n        const rows = this.rows();\n        const seed = this.seed();\n        const palette = this.paletteRef();\n        const density = this.chevronDensity();\n        const style = this.patternStyle();\n        const tileRotation = this.tileRotation();\n        this.tiles.set(\n          generatePatternTiles({ cols, rows, seed, palette, chevronDensity: density, style, tileRotation })\n        );\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Modo animated: cada `reshuffleInterval` ms regenera el grid completo\n    // con un seed nuevo. Visualmente: el patrón cambia de vez en cuando.\n    // Si `tilesPerTick > 0` y < total tiles, hace staggered (reemplaza solo\n    // N tiles en vez de toda la grid). Default tilesPerTick=0 → reseed total.\n    // El setInterval corre FUERA de Zone.js para no disparar un CD completo\n    // de toda la app en cada tick — solo val-pattern se actualiza vía señales.\n    effect(onCleanup => {\n      const isAnimated = this.animated();\n      const interval = this.reshuffleInterval();\n      const perTick = this.tilesPerTick();\n      if (this.timer) clearInterval(this.timer);\n      this.timer = undefined;\n      if (!isAnimated) return;\n      this.ngZone.runOutsideAngular(() => {\n        this.timer = setInterval(() => {\n          if (perTick > 0) {\n            this.mutateRandomTiles(perTick);\n          } else {\n            this.seed.set(this.randomSeed());\n          }\n        }, interval);\n      });\n      onCleanup(() => {\n        if (this.timer) {\n          clearInterval(this.timer);\n          this.timer = undefined;\n        }\n      });\n    });\n  }\n\n  /**\n   * Reemplaza `count` tiles random del grid actual con tiles nuevos generados.\n   * Usado para staggered reshuffle (opt-in via `tilesPerTick > 0`).\n   */\n  private mutateRandomTiles(count: number): void {\n    const current = this.tiles();\n    if (current.length === 0) return;\n    const next = [...current];\n    const palette = this.paletteRef();\n    const density = this.chevronDensity();\n    const style = this.patternStyle();\n    const densityConfig: PatternDensityConfig | undefined = style ? PATTERN_STYLE_CONFIGS[style] : undefined;\n    const rotate = this.tileRotation();\n    const ROTS: Array<0 | 90 | 180 | 270> = [0, 90, 180, 270];\n    for (let n = 0; n < count; n++) {\n      const idx = Math.floor(Math.random() * next.length);\n      const tile = generateRandomTile(palette, density, Math.random, densityConfig);\n      if (rotate) tile.rot = ROTS[Math.floor(Math.random() * 4)];\n      next[idx] = tile;\n    }\n    this.tiles.set(next);\n  }\n\n  ngOnDestroy(): void {\n    if (this.timer) clearInterval(this.timer);\n  }\n\n  private resolvePalette(p: PatternPaletteKey | string[]): string[] {\n    if (Array.isArray(p)) {\n      // Acepta arrays de cualquier longitud ≥2; tile contrast logic usa índices.\n      return p.length >= 2 ? p : PATTERN_PALETTES.purple;\n    }\n    return PATTERN_PALETTES[p] ?? PATTERN_PALETTES.purple;\n  }\n\n  private randomSeed(): number {\n    return Math.floor(Math.random() * 1_000_000);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { inject } from '@angular/core';\nimport { PageWavesMetadata } from './types';\n\nconst W = 1440;\nconst H = 320;\n\nconst DEFAULT_COLORS = ['#5218d8', '#0aa88c', '#9b5de5'];\n\n/**\n * Generates a closed SVG wave path for a single layer.\n *\n * @param layerIndex  - 0 = back (tallest), n-1 = front (shortest)\n * @param totalLayers - total number of layers\n * @param amplitude   - crest/trough height in SVG units\n * @param segments    - number of wave crests across the width\n */\nfunction buildWavePath(layerIndex: number, totalLayers: number, amplitude: number, segments: number): string {\n  // Back layer: 90% of H. Front layer: 60% of H. Linear interpolation.\n  const t = totalLayers === 1 ? 0 : layerIndex / (totalLayers - 1);\n  const baseY = Math.round(H * (0.9 - t * 0.3));\n  const segW = W / segments;\n\n  // Extend one segment beyond each edge so flat endpoints fall outside the viewBox.\n  // SVG clips to viewBox by default — left/right visible edges show the wave mid-curve.\n  const bleedX = Math.round(segW);\n  let d = `M ${-bleedX} 0 H ${W + bleedX} V ${baseY}`;\n\n  // Build wave going right → left. One extra iteration on each side.\n  for (let i = segments; i >= -1; i--) {\n    const x0 = Math.round(i * segW);\n    const midX = Math.round((i + 0.5) * segW);\n    const dir = (i + layerIndex) % 2 === 0 ? 1 : -1;\n    const cpY = baseY + dir * amplitude;\n    d += ` Q ${midX} ${cpY} ${x0} ${baseY}`;\n  }\n\n  d += ' Z';\n  return d;\n}\n\n/** Opacities per layer index (front layers get slightly transparent for depth). */\nfunction layerOpacity(index: number, total: number): number {\n  if (total <= 1) return 1;\n  // Back layer: 1.0, progressively lighter toward front\n  return 1 - (index / total) * 0.28;\n}\n\n@Component({\n  selector: 'val-page-waves',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"waves-host\" [style.height]=\"propsHeight()\">\n      <div class=\"waves-inner\" [innerHTML]=\"svgHtml()\"></div>\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n      }\n      .waves-host {\n        width: 100%;\n        overflow: hidden;\n        line-height: 0;\n      }\n      .waves-inner {\n        width: 100%;\n        height: 100%;\n      }\n      .waves-inner svg {\n        display: block;\n        width: 100%;\n        height: 100%;\n      }\n    `,\n  ],\n})\nexport class PageWavesComponent {\n  private sanitizer = inject(DomSanitizer);\n\n  readonly props = input<PageWavesMetadata>({});\n\n  readonly propsHeight = computed(() => this.props().height ?? 'clamp(200px, 20vw + 100px, 320px)');\n\n  readonly svgHtml = computed<SafeHtml>(() => {\n    const colors = this.props().colors ?? DEFAULT_COLORS;\n    const amplitude = this.props().amplitude ?? 28;\n    const baseSegments = this.props().wavelength ?? 5;\n    const n = colors.length;\n\n    const paths = colors\n      .map((color, i) => {\n        // Vary segments per layer for organic look: +0, +2, -1, +1...\n        const segVariants = [0, 2, -1, 1, 3, -2];\n        const segments = Math.max(2, baseSegments + (segVariants[i % segVariants.length] ?? 0));\n        const d = buildWavePath(i, n, amplitude, segments);\n        const opacity = layerOpacity(i, n);\n        return `<path d=\"${d}\" fill=\"${color}\" opacity=\"${opacity}\"/>`;\n      })\n      .join('');\n\n    const bg = `<rect width=\"${W}\" height=\"${H}\" fill=\"${colors[0]}\"/>`;\n    const svg = `<svg viewBox=\"0 0 ${W} ${H}\" preserveAspectRatio=\"xMidYMid slice\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">${bg}${paths}</svg>`;\n    return this.sanitizer.bypassSecurityTrustHtml(svg);\n  });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, Input, signal } from '@angular/core';\nimport { GlassMetadata } from './types';\n\n/**\n * `val-glass`\n *\n * Capa **glassmorphism** reusable. Frosted glass overlay con backdrop blur,\n * tint semi-translúcido, border sutil y shadow. Acepta cualquier contenido via\n * `<ng-content>` — desde un texto a un card entero.\n *\n * Ideal sobre backgrounds decorativos (val-pattern, gradients, imágenes) para\n * mejorar legibilidad del contenido sin tapar la decoración.\n *\n * @example Pill sobre patrón:\n * ```html\n * <val-glass><h1>Buenos días</h1></val-glass>\n * ```\n *\n * @example Card glass (block) con auto tint:\n * ```html\n * <val-glass [props]=\"{ tint: 'auto', display: 'block', radius: '20px', padding: '24px' }\">\n *   <p>Contenido del card</p>\n * </val-glass>\n * ```\n */\n@Component({\n  selector: 'val-glass',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"val-glass\"\n      [class]=\"resolvedProps().cssClass || ''\"\n      [style.background]=\"bgStyle()\"\n      [style.backdrop-filter]=\"filterStyle()\"\n      [style.-webkit-backdrop-filter]=\"filterStyle()\"\n      [style.border-radius]=\"resolvedProps().radius || '14px'\"\n      [style.padding]=\"resolvedProps().padding || '10px 18px'\"\n      [style.border]=\"borderStyle()\"\n      [style.box-shadow]=\"shadowStyle()\"\n      [style.display]=\"resolvedProps().display || 'inline-block'\"\n    >\n      <ng-content />\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: contents;\n      }\n\n      .val-glass {\n        max-width: 100%;\n        box-sizing: border-box;\n        transition:\n          background 0.2s ease,\n          border-color 0.2s ease;\n      }\n\n      /* Fallback para browsers sin backdrop-filter — bumper alpha del tint\n       * para mantener legibilidad. Detectado vía @supports. */\n      @supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n        .val-glass {\n          background: rgba(14, 4, 32, 0.85) !important;\n        }\n      }\n    `,\n  ],\n})\nexport class GlassComponent {\n  private readonly props_ = signal<GlassMetadata>(\n    {},\n    {\n      equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),\n    }\n  );\n\n  @Input() set props(value: GlassMetadata | undefined) {\n    this.props_.set(value ?? {});\n  }\n\n  /** Snapshot reactivo de los props con defaults aplicados. */\n  readonly resolvedProps = computed<GlassMetadata>(() => this.props_());\n\n  /**\n   * Resuelve el background según `tint` + `tintAlpha`.\n   * - `'dark'` → rgba purple-dark\n   * - `'light'` → rgba blanco\n   * - `'auto'` → CSS var con fallback (resolved vía media/class del tema)\n   * - custom string → usado tal cual\n   */\n  readonly bgStyle = computed(() => {\n    const p = this.resolvedProps();\n    const tint = p.tint ?? 'dark';\n    const alpha = p.tintAlpha ?? 0.55;\n\n    if (tint === 'dark') return `rgba(14, 4, 32, ${alpha})`;\n    if (tint === 'light') return `rgba(255, 255, 255, ${alpha})`;\n    if (tint === 'auto') {\n      // CSS var — definida en :host vía host bindings de tema. Fallback dark.\n      return `var(--val-glass-auto-bg, rgba(14, 4, 32, ${alpha}))`;\n    }\n    return tint; // custom rgba/hsl/hex\n  });\n\n  readonly filterStyle = computed(() => {\n    const p = this.resolvedProps();\n    const blur = p.blur ?? 10;\n    const sat = p.saturate ?? 140;\n    return `blur(${blur}px) saturate(${sat}%)`;\n  });\n\n  readonly borderStyle = computed(() => {\n    const showBorder = this.resolvedProps().border ?? true;\n    if (!showBorder) return 'none';\n    const tint = this.resolvedProps().tint ?? 'dark';\n    // light tint → border más oscuro para visibilidad; dark tint → blanco.\n    if (tint === 'light') return '1px solid rgba(0, 0, 0, 0.08)';\n    return '1px solid rgba(255, 255, 255, 0.08)';\n  });\n\n  readonly shadowStyle = computed(() => {\n    const elevation = this.resolvedProps().elevation ?? 'md';\n    switch (elevation) {\n      case 'none':\n        return 'none';\n      case 'sm':\n        return '0 2px 8px rgba(0, 0, 0, 0.15)';\n      case 'lg':\n        return '0 12px 40px rgba(0, 0, 0, 0.35)';\n      case 'md':\n      default:\n        return '0 4px 24px rgba(0, 0, 0, 0.25)';\n    }\n  });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, Input, Output, signal } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { personOutline } from 'ionicons/icons';\nimport { UserAvatarMetadata } from './types';\n\naddIcons({ personOutline });\n\n/**\n * `val-user-avatar`\n *\n * Avatar **smart** con cadena de fallback automática:\n *\n *   foto (`avatarUrl`) → iniciales (de `name`/`email`) → icono persona.\n *\n * Si la imagen falla en cargar (404, CORS, etc.), automáticamente cae a las\n * iniciales sin que el caller tenga que hacer nada. Color de fondo derivado\n * deterministicamente del user para que el mismo user tenga siempre el mismo\n * color (a menos que `background` se sobrescriba).\n *\n * @example\n * ```html\n * <val-user-avatar [props]=\"{ user: auth.user() }\" (onClick)=\"goProfile()\" />\n * ```\n */\n@Component({\n  selector: 'val-user-avatar',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <button\n      type=\"button\"\n      class=\"val-user-avatar\"\n      [class.bordered]=\"resolvedProps().bordered\"\n      [class.grayscale]=\"resolvedProps().grayscale\"\n      [class.has-click]=\"hasClick\"\n      [class]=\"shapeClass() + ' ' + sizeClass() + ' ' + (resolvedProps().cssClass || '')\"\n      [style.background]=\"bgColor()\"\n      [style.color]=\"resolvedProps().foreground || '#fff'\"\n      [attr.aria-label]=\"ariaLabel()\"\n      (click)=\"onClick.emit()\"\n    >\n      <!-- Placeholder layer (siempre presente) — iniciales o icono. La imagen\n           se monta encima y hace fade-in al cargar; si falla queda invisible\n           y el placeholder permanece visible sin parpadeo. -->\n      @if (initials()) {\n        <span class=\"val-user-avatar__initials\">{{ initials() }}</span>\n      } @else {\n        <ion-icon name=\"person-outline\" class=\"val-user-avatar__icon\" aria-hidden=\"true\" />\n      }\n\n      @if (imageUrl()) {\n        <img\n          class=\"val-user-avatar__img\"\n          [class.loaded]=\"imageLoaded()\"\n          [src]=\"imageUrl()\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\"\n          (error)=\"onImageError()\"\n          (load)=\"onImageLoad()\"\n        />\n      }\n    </button>\n  `,\n  styles: [\n    `\n      :host {\n        display: inline-flex;\n      }\n\n      .val-user-avatar {\n        position: relative;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        overflow: hidden;\n        padding: 0;\n        margin: 0;\n        border: none;\n        background: var(--ion-color-medium, #92949c);\n        color: #fff;\n        font-weight: 600;\n        font-family: inherit;\n        line-height: 1;\n        user-select: none;\n        cursor: default;\n        transition:\n          transform 0.15s ease,\n          box-shadow 0.15s ease;\n      }\n\n      .val-user-avatar.has-click {\n        cursor: pointer;\n      }\n\n      .val-user-avatar.has-click:hover {\n        transform: scale(1.04);\n      }\n\n      .val-user-avatar.has-click:active {\n        transform: scale(0.96);\n      }\n\n      /* Shape */\n      .val-user-avatar.circle {\n        border-radius: 50%;\n      }\n\n      .val-user-avatar.square {\n        border-radius: 8px;\n      }\n\n      /* Sizes */\n      .val-user-avatar.xsmall {\n        width: 28px;\n        height: 28px;\n        font-size: 0.625rem;\n      }\n      .val-user-avatar.small {\n        width: 32px;\n        height: 32px;\n        font-size: 0.75rem;\n      }\n      .val-user-avatar.medium {\n        width: 48px;\n        height: 48px;\n        font-size: 1rem;\n      }\n      .val-user-avatar.large {\n        width: 72px;\n        height: 72px;\n        font-size: 1.5rem;\n      }\n      .val-user-avatar.xlarge {\n        width: 96px;\n        height: 96px;\n        font-size: 2rem;\n      }\n\n      .val-user-avatar.bordered {\n        box-shadow: 0 0 0 2px var(--ion-background-color, #fff);\n      }\n\n      .val-user-avatar.grayscale {\n        filter: grayscale(100%);\n      }\n\n      /* Image layer — capa absoluta sobre el placeholder. Inicia invisible\n       * y fade-in cuando el navegador dispara el evento load. Si falla, la\n       * clase .loaded nunca se aplica → queda transparent y el placeholder de\n       * abajo permanece visible (sin flash blanco). */\n      .val-user-avatar__img {\n        position: absolute;\n        inset: 0;\n        width: 100%;\n        height: 100%;\n        object-fit: cover;\n        display: block;\n        opacity: 0;\n        transition: opacity 0.35s ease-in-out;\n        pointer-events: none;\n      }\n\n      .val-user-avatar__img.loaded {\n        opacity: 1;\n      }\n\n      .val-user-avatar__initials {\n        text-transform: uppercase;\n        letter-spacing: 0.02em;\n        position: relative;\n        z-index: 0;\n      }\n\n      .val-user-avatar__icon {\n        font-size: 60%;\n        position: relative;\n        z-index: 0;\n      }\n    `,\n  ],\n})\nexport class UserAvatarComponent {\n  private readonly props_ = signal<UserAvatarMetadata>({});\n  private readonly imageFailed = signal(false);\n  /** Indica si el `<img>` actual disparó su evento `load`. Conduce el fade-in. */\n  protected readonly imageLoaded = signal(false);\n\n  @Input() set props(value: UserAvatarMetadata | undefined) {\n    const prev = this.props_();\n    const next = value ?? {};\n    this.props_.set(next);\n    // Reset estado de carga si cambia la URL — re-disparar fade-in.\n    const prevUrl = prev?.user?.avatarUrl || prev?.avatarUrl || '';\n    const nextUrl = next.user?.avatarUrl || next.avatarUrl || '';\n    if (prevUrl !== nextUrl) {\n      this.imageFailed.set(false);\n      this.imageLoaded.set(false);\n    }\n  }\n\n  @Output() onClick = new EventEmitter<void>();\n\n  /** Subscribers — usado para condicionar cursor/aria. */\n  get hasClick(): boolean {\n    return this.onClick.observed;\n  }\n\n  readonly resolvedProps = computed<UserAvatarMetadata>(() => this.props_());\n\n  /** Resuelve los campos del user (user prop > campos sueltos). */\n  private readonly resolvedUser = computed(() => {\n    const p = this.resolvedProps();\n    return {\n      name: p.user?.name?.trim() || p.name?.trim() || '',\n      email: p.user?.email?.trim() || p.email?.trim() || '',\n      avatarUrl: p.user?.avatarUrl?.trim() || p.avatarUrl?.trim() || '',\n    };\n  });\n\n  /**\n   * URL de imagen. Empty si la última carga falló — eso evita re-intentar\n   * con la misma URL cuando el browser ya marcó error. El placeholder\n   * (iniciales/icono) sigue visible debajo.\n   */\n  readonly imageUrl = computed(() => {\n    if (this.imageFailed()) return '';\n    return this.resolvedUser().avatarUrl;\n  });\n\n  /** Iniciales — 1-2 chars derivados de name (preferred) o email prefix. */\n  readonly initials = computed(() => {\n    const { name, email } = this.resolvedUser();\n    if (name) {\n      const parts = name.split(/\\s+/).filter(Boolean);\n      if (parts.length >= 2) return parts[0]![0]! + parts[1]![0]!;\n      if (parts.length === 1 && parts[0]!.length >= 2) {\n        return parts[0]!.slice(0, 2);\n      }\n      return parts[0]?.[0] ?? '';\n    }\n    if (email) {\n      const prefix = email.split('@')[0] ?? '';\n      // Tomar 1-2 chars del prefix\n      if (prefix.length >= 2) return prefix.slice(0, 2);\n      return prefix[0] ?? '';\n    }\n    return '';\n  });\n\n  readonly sizeClass = computed(() => this.resolvedProps().size || 'small');\n  readonly shapeClass = computed(() => this.resolvedProps().shape || 'circle');\n\n  /** Background — explicito o derivado deterministicamente del user. */\n  readonly bgColor = computed(() => {\n    const p = this.resolvedProps();\n    if (p.background) return p.background;\n    const { name, email } = this.resolvedUser();\n    const seed = name || email || 'val';\n    return this.colorFromSeed(seed);\n  });\n\n  readonly ariaLabel = computed(() => {\n    const { name, email } = this.resolvedUser();\n    return name || email || 'User avatar';\n  });\n\n  onImageError(): void {\n    this.imageFailed.set(true);\n    this.imageLoaded.set(false);\n  }\n\n  onImageLoad(): void {\n    this.imageFailed.set(false);\n    this.imageLoaded.set(true);\n  }\n\n  /**\n   * Hash determinista string → HSL color del rango Valtech (purples/blues).\n   * Mismo seed → mismo color (consistencia entre sessions).\n   */\n  private colorFromSeed(seed: string): string {\n    let hash = 0;\n    for (let i = 0; i < seed.length; i++) {\n      hash = (hash * 31 + seed.charCodeAt(i)) >>> 0;\n    }\n    // Restringir a rango violet/blue (240-290°) para coherencia con palette\n    const hue = 240 + (hash % 50);\n    const sat = 55 + ((hash >>> 8) % 20); // 55-75%\n    const light = 38 + ((hash >>> 16) % 12); // 38-50% — siempre legible con fg blanco\n    return `hsl(${hue}, ${sat}%, ${light}%)`;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { PresetService } from '../../../services/presets';\nimport { BoxComponent } from '../../atoms/box/box.component';\nimport { IconComponent } from '../../atoms/icon/icon.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { AlertBoxMetadata, ReactiveAlertBoxMetadata } from './types';\n\n@Component({\n  selector: 'val-alert-box',\n  standalone: true,\n  imports: [CommonModule, BoxComponent, IconComponent, TextComponent],\n  template: `\n    <val-box [props]=\"resolvedProps.box\">\n      <div class=\"content-container\" body>\n        <val-icon [props]=\"resolvedProps.icon\"></val-icon>\n        <!-- Support both legacy and reactive patterns -->\n        @if (isLegacyProps) {\n          <val-text class=\"text\" [props]=\"getLegacyTextProps()\" />\n        } @else {\n          <val-text class=\"text\" [props]=\"computedTextProps\" />\n        }\n      </div>\n    </val-box>\n  `,\n  styleUrls: ['./alert-box.component.scss'],\n})\n/**\n * val-alert-box\n *\n * Displays an alert box with an icon and text, using a styled box container.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-alert-box preset=\"warning\" [props]=\"{ text: 'Advertencia!' }\"></val-alert-box>\n *\n * @example Static (backwards compatible):\n * <val-alert-box [props]=\"{ box: {...}, icon: {...}, text: { content: 'Alerta' } }\"></val-alert-box>\n *\n * @input preset: string - Name of preset to apply (e.g., 'info', 'success', 'warning', 'error')\n * @input props: AlertBoxMetadata | ReactiveAlertBoxMetadata - Configuration for the alert box (overrides preset values)\n */\nexport class AlertBoxComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable alert configurations\n   * (color, icon, box style) that can be registered at app level.\n   *\n   * @example\n   * <val-alert-box preset=\"warning\" [props]=\"{ text: 'Warning message' }\"></val-alert-box>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Alert box configuration object. Values here override preset values.\n   * Supports both legacy AlertBoxMetadata and ReactiveAlertBoxMetadata patterns.\n   */\n  @Input() props: Partial<AlertBoxMetadata | ReactiveAlertBoxMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: AlertBoxMetadata | ReactiveAlertBoxMetadata = {} as AlertBoxMetadata;\n\n  /** Computed text properties for reactive pattern */\n  computedTextProps: any;\n\n  /** Whether this is using the legacy props pattern */\n  get isLegacyProps(): boolean {\n    return 'text' in this.resolvedProps && typeof (this.resolvedProps as any).text === 'object';\n  }\n\n  /** Get text props for legacy pattern */\n  getLegacyTextProps(): any {\n    return (this.resolvedProps as AlertBoxMetadata).text;\n  }\n\n  ngOnInit() {\n    this.resolveProps();\n    if (!this.isLegacyProps) {\n      this.initializeTextProps();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      if (!this.isLegacyProps) {\n        this.initializeTextProps();\n      }\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('alertBox', this.preset) as Partial<AlertBoxMetadata | ReactiveAlertBoxMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as AlertBoxMetadata | ReactiveAlertBoxMetadata;\n  }\n\n  private initializeTextProps() {\n    const reactiveProps = this.resolvedProps as ReactiveAlertBoxMetadata;\n\n    // Base text properties with styling\n    this.computedTextProps = {\n      size: reactiveProps.textStyle?.size || 'medium',\n      color: reactiveProps.textStyle?.color,\n      bold: reactiveProps.textStyle?.bold || false,\n    };\n\n    // Add content - use static text only\n    if (reactiveProps.text !== undefined) {\n      this.computedTextProps.content = reactiveProps.text;\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { ButtonGroupMetadata } from './types';\n\n@Component({\n  selector: 'val-button-group',\n  standalone: true,\n  imports: [CommonModule, ButtonComponent],\n  template: `\n    <div [ngClass]=\"['group-container', Position]\" [class.column]=\"props.columned\" style=\"width: 100%;\">\n      <val-button\n        *ngFor=\"let b of props.buttons\"\n        [props]=\"b\"\n        (onClick)=\"clickHandler(b?.token)\"\n        [ngStyle]=\"{ width: props.buttons.length === 1 ? '100%' : 'auto' }\"\n      ></val-button>\n    </div>\n  `,\n  styleUrls: ['./button-group.component.scss'],\n})\n/**\n * val-button-group\n *\n * Displays a group of buttons with configurable layout and position.\n *\n * @example\n * <val-button-group [props]=\"{ buttons: [...], position: 'center', columned: false }\" (onClick)=\"handler($event)\"></val-button-group>\n *\n * @input props: ButtonGroupMetadata - Configuration for the button group (buttons, position, columned)\n * @output onClick - Emits the token of the clicked button\n */\nexport class ButtonGroupComponent implements OnInit {\n  /**\n   * Button group configuration object.\n   * @type {ButtonGroupMetadata}\n   * @property buttons - Array of button configurations.\n   * @property position - Position of the button group ('center' | 'left' | 'right' | 'spaced').\n   * @property columned - Whether the buttons are displayed in a column.\n   */\n  @Input()\n  props: ButtonGroupMetadata;\n\n  /**\n   * Event emitted with the token of the clicked button.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  constructor() {}\n\n  ngOnInit() {}\n\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n\n  get Position(): string {\n    if (this.props.buttons.length === 1 && this.props.position === 'spaced') {\n      return 'right';\n    }\n\n    return this.props.position;\n  }\n}\n","import { ButtonMetadata, ToolbarAction } from '../../types';\n\nexport enum CardType {\n  native = 'native',\n  checker = 'checker',\n  tappable = 'tappable',\n  complex = 'complex',\n}\n\nexport interface CardClickEvent {\n  section: CardSection;\n  token?: string;\n}\n\nexport enum CardSection {\n  headerLeft,\n  headerRight,\n  content,\n  footer,\n  footerExtra,\n}\n\nexport interface CardMetadata {\n  token?: string;\n  type: CardType;\n  title?: string;\n  overtitle?: string;\n  content?: string;\n  image?: string;\n  footerActions: ButtonMetadata[];\n  footerComplexActions: ToolbarAction[];\n  leftActions: ToolbarAction[];\n  rightActions: ToolbarAction[];\n  selected: boolean;\n  headerText?: string;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport {\n  IonButton,\n  IonButtons,\n  IonCard,\n  IonCardContent,\n  IonCardHeader,\n  IonCardSubtitle,\n  IonCardTitle,\n  IonCheckbox,\n  IonIcon,\n} from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { AvatarComponent } from '../../atoms/avatar/avatar.component';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { ToolbarActionType } from '../../types';\nimport { CardClickEvent, CardMetadata, CardSection, CardType } from './types';\n\n@Component({\n  selector: 'val-card',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ButtonComponent,\n    AvatarComponent,\n    ImageComponent,\n    TextComponent,\n    IonCard,\n    IonCardContent,\n    IonCardHeader,\n    IonCardTitle,\n    IonCardSubtitle,\n    IonCheckbox,\n    IonButtons,\n    IonButton,\n    IonIcon,\n  ],\n  template: `\n    <ion-card *ngIf=\"resolvedProps.type === types.native\">\n      @if (resolvedProps.image) {\n        <img [alt]=\"resolvedProps.title || 'Card image'\" [src]=\"resolvedProps.image\" />\n      }\n      <ion-card-header *ngIf=\"resolvedProps.title || resolvedProps.overtitle\">\n        <ion-card-title *ngIf=\"resolvedProps.title\">{{ resolvedProps.title }}</ion-card-title>\n        <ion-card-subtitle *ngIf=\"resolvedProps.overtitle\">{{ resolvedProps.overtitle }}</ion-card-subtitle>\n      </ion-card-header>\n\n      <ion-card-content *ngIf=\"resolvedProps.content\">{{ resolvedProps.content }}</ion-card-content>\n\n      @if (resolvedProps.footerActions && resolvedProps.footerActions.length > 0) {\n        <div class=\"card-actions\">\n          <val-button\n            *ngFor=\"let b of resolvedProps.footerActions\"\n            [props]=\"b\"\n            (onClick)=\"clickHandler(sections.footer, b.token)\"\n          ></val-button>\n        </div>\n      }\n    </ion-card>\n\n    <ion-card\n      *ngIf=\"resolvedProps.type === types.tappable\"\n      (click)=\"clickHandler(sections.content, resolvedProps.token)\"\n      class=\"tapable\"\n    >\n      @if (resolvedProps.image) {\n        <img [alt]=\"resolvedProps.title || 'Card image'\" [src]=\"resolvedProps.image\" />\n      }\n      <ion-card-header *ngIf=\"resolvedProps.title || resolvedProps.overtitle\">\n        <ion-card-title *ngIf=\"resolvedProps.title\">{{ resolvedProps.title }}</ion-card-title>\n        <ion-card-subtitle *ngIf=\"resolvedProps.overtitle\">{{ resolvedProps.overtitle }}</ion-card-subtitle>\n      </ion-card-header>\n\n      <ion-card-content *ngIf=\"resolvedProps.content\">{{ resolvedProps.content }}</ion-card-content>\n    </ion-card>\n\n    <ion-card\n      *ngIf=\"resolvedProps.type === types.checker\"\n      (click)=\"clickHandler(sections.content, resolvedProps.token)\"\n      class=\"tapable\"\n    >\n      <ion-card-header *ngIf=\"resolvedProps.title || resolvedProps.overtitle\" class=\"checker\">\n        <div>\n          <ion-card-subtitle *ngIf=\"resolvedProps.overtitle\">{{ resolvedProps.overtitle }}</ion-card-subtitle>\n          <ion-card-title *ngIf=\"resolvedProps.title\">{{ resolvedProps.title }}</ion-card-title>\n        </div>\n        <div>\n          <ion-checkbox [checked]=\"resolvedProps.selected\"></ion-checkbox>\n        </div>\n      </ion-card-header>\n\n      <ion-card-content *ngIf=\"resolvedProps.content\">{{ resolvedProps.content }}</ion-card-content>\n    </ion-card>\n\n    <ion-card *ngIf=\"resolvedProps.type === types.complex\" class=\"complex\">\n      <ion-card-header class=\"complex-header\">\n        <ion-buttons style=\"display: flex; align-items: center\" *ngIf=\"resolvedProps.leftActions?.length > 0\">\n          <ng-container *ngFor=\"let action of resolvedProps.leftActions\">\n            <ion-button\n              *ngIf=\"action.type === actionTypes.ICON\"\n              (click)=\"clickHandler(sections.headerLeft, action.token)\"\n            >\n              <ion-icon slot=\"icon-only\" [name]=\"action.description\" color=\"dark\"></ion-icon>\n            </ion-button>\n            <val-avatar\n              style=\"margin-right: 4px; cursor: pointer\"\n              *ngIf=\"action.type === actionTypes.AVATAR\"\n              [props]=\"{ size: 'small', image: action.description, default: '' }\"\n              (onClick)=\"clickHandler(sections.headerLeft, action.token)\"\n            ></val-avatar>\n            <val-image\n              *ngIf=\"action.type === actionTypes.IMAGE\"\n              [props]=\"action.image\"\n              (click)=\"clickHandler(sections.headerLeft, action.token)\"\n            ></val-image>\n            <ion-button\n              *ngIf=\"action.type === actionTypes.BUTTON\"\n              (click)=\"clickHandler(sections.headerLeft, action.token)\"\n            >\n              {{ action.description }}\n            </ion-button>\n            <div *ngIf=\"resolvedProps.headerText\">\n              <val-text [props]=\"{ content: resolvedProps.headerText, color: 'dark', bold: true, size: 'medium' }\" />\n            </div>\n          </ng-container>\n        </ion-buttons>\n        <ion-buttons style=\"display: flex; align-items: center\" *ngIf=\"resolvedProps.rightActions?.length > 0\">\n          <ng-container *ngFor=\"let action of resolvedProps.rightActions\">\n            <ion-button\n              *ngIf=\"action.type === actionTypes.ICON\"\n              (click)=\"clickHandler(sections.headerRight, action.token)\"\n            >\n              <ion-icon slot=\"icon-only\" [name]=\"action.description\" color=\"dark\"></ion-icon>\n            </ion-button>\n            <val-avatar\n              style=\"margin-right: 4px; cursor: pointer\"\n              *ngIf=\"action.type === actionTypes.AVATAR\"\n              [props]=\"{ size: 'small', image: action.description, default: '' }\"\n              (onClick)=\"clickHandler(sections.headerRight, action.token)\"\n            ></val-avatar>\n            <val-image\n              *ngIf=\"action.type === actionTypes.IMAGE\"\n              [props]=\"action.image\"\n              (click)=\"clickHandler(sections.headerRight, action.token)\"\n            ></val-image>\n            <ion-button\n              *ngIf=\"action.type === actionTypes.BUTTON\"\n              (click)=\"clickHandler(sections.headerRight, action.token)\"\n            >\n              {{ action.description }}\n            </ion-button>\n          </ng-container>\n        </ion-buttons>\n      </ion-card-header>\n\n      <div class=\"tapable\" (click)=\"clickHandler(sections.content, resolvedProps.token)\">\n        <ion-card-header *ngIf=\"resolvedProps.title || resolvedProps.overtitle\" class=\"complex-header\">\n          <div>\n            <ion-card-subtitle *ngIf=\"resolvedProps.overtitle\">{{ resolvedProps.overtitle }}</ion-card-subtitle>\n            <ion-card-title *ngIf=\"resolvedProps.title\">{{ resolvedProps.title }}</ion-card-title>\n          </div>\n        </ion-card-header>\n\n        @if (resolvedProps.image) {\n          <img [alt]=\"resolvedProps.title || 'Card image'\" [src]=\"resolvedProps.image\" />\n        }\n        <ion-card-content *ngIf=\"resolvedProps.content\" class=\"complex-content\">{{ resolvedProps.content }}</ion-card-content>\n      </div>\n      @if (resolvedProps.footerActions && resolvedProps.footerActions.length > 0) {\n        <div class=\"card-actions\">\n          <val-button\n            *ngFor=\"let b of resolvedProps.footerActions\"\n            [props]=\"b\"\n            (onClick)=\"clickHandler(sections.footer, b.token)\"\n          ></val-button>\n        </div>\n      }\n      <ion-buttons\n        style=\"display: flex; align-items: center; justify-content: flex-end; margin: 8px\"\n        *ngIf=\"resolvedProps.footerComplexActions?.length > 0\"\n      >\n        <ng-container *ngFor=\"let action of resolvedProps.footerComplexActions\">\n          <ion-button\n            *ngIf=\"action.type === actionTypes.ICON\"\n            (click)=\"clickHandler(sections.footerExtra, action.token)\"\n          >\n            <ion-icon slot=\"icon-only\" [name]=\"action.description\" color=\"dark\"></ion-icon>\n          </ion-button>\n          <val-avatar\n            style=\"margin-right: 4px; cursor: pointer\"\n            *ngIf=\"action.type === actionTypes.AVATAR\"\n            [props]=\"{ size: 'small', image: action.description, default: '' }\"\n            (onClick)=\"clickHandler(sections.footerExtra, action.token)\"\n          ></val-avatar>\n          <val-image\n            *ngIf=\"action.type === actionTypes.IMAGE\"\n            [props]=\"action.image\"\n            (click)=\"clickHandler(sections.footerExtra, action.token)\"\n          ></val-image>\n          <ion-button\n            *ngIf=\"action.type === actionTypes.BUTTON\"\n            (click)=\"clickHandler(sections.footerExtra, action.token)\"\n            color=\"dark\"\n          >\n            {{ action.description }}\n          </ion-button>\n        </ng-container>\n      </ion-buttons>\n    </ion-card>\n  `,\n  styleUrls: ['./card.component.scss'],\n})\n/**\n * val-card\n *\n * A flexible card component supporting images, titles, content, actions, and custom sections.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-card preset=\"feature\" [props]=\"{ title: 'Card', image: 'url', content: '...' }\" (onClick)=\"handler($event)\"></val-card>\n *\n * @example Static (backwards compatible):\n * <val-card [props]=\"{ type: 'native', title: 'Card', image: 'url', content: '...' }\" (onClick)=\"handler($event)\"></val-card>\n *\n * @input preset: string - Name of preset to apply (e.g., 'feature', 'compact')\n * @input props: CardMetadata - Configuration for the card (overrides preset values)\n * @output onClick - Emits a CardClickEvent when the card or an action is clicked\n */\nexport class CardComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable card configurations\n   * (type, variant, padding, etc.) that can be registered at app level.\n   *\n   * @example\n   * <val-card preset=\"feature\" [props]=\"{ title: 'My Card' }\"></val-card>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Card configuration object. Values here override preset values.\n   * @type {CardMetadata}\n   * @property type - The card type (see CardType).\n   * @property title - The card title.\n   * @property image - The card image URL.\n   * @property content - The card content.\n   * @property actions - Array of action buttons (optional).\n   * @property sections - Custom card sections (optional).\n   * @property overtitle - Subtitle or overtitle (optional).\n   */\n  @Input() props: Partial<CardMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: CardMetadata = {} as CardMetadata;\n\n  /**\n   * Event emitted when the card or an action is clicked.\n   */\n  @Output()\n  onClick = new EventEmitter<CardClickEvent>();\n\n  types = CardType;\n  actionTypes = ToolbarActionType;\n  sections = CardSection;\n\n  constructor() {}\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('card', this.preset) as Partial<CardMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as CardMetadata;\n  }\n\n  clickHandler(section: CardSection, token?: string) {\n    this.onClick.emit({ section, token });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonCheckbox } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-check-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonCheckbox],\n  template: `\n    <ion-checkbox [formControl]=\"resolvedProps.control\" [labelPlacement]=\"resolvedProps.labelPlacement || 'end'\">\n      {{ getDisplayLabel() }}\n    </ion-checkbox>\n  `,\n  styleUrls: ['./check-input.component.scss'],\n})\n/**\n * val-check-input\n *\n * A checkbox input for boolean values, integrated with Angular forms.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-check-input preset=\"form-field\" [props]=\"{ control: myControl, label: 'I agree' }\"></val-check-input>\n *\n * @example Static (backwards compatible):\n * <val-check-input [props]=\"{ control: myControl, label: 'I agree' }\"></val-check-input>\n *\n * @input preset: string - Name of preset to apply\n * @input props: InputMetadata - Configuration for the checkbox (form control, label, etc.)\n */\nexport class CheckInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable checkbox configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-check-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-check-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the checkbox.\n   * @property label - Static label text.\n   * @property labelPlacement - Position of label ('start' | 'end'). Default: 'end'.\n   */\n  @Input() props: Partial<InputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: InputMetadata = {} as InputMetadata;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('checkInput', this.preset) as Partial<InputMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as InputMetadata;\n  }\n\n  getDisplayLabel(): string {\n    return this.resolvedProps.label || this.resolvedProps.contentFallback || '';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonCheckbox } from '@ionic/angular/standalone';\nimport { InputMetadata, InputOption, ComponentStates } from '../../types';\n\n@Component({\n  selector: 'val-checkbox-radio-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonCheckbox],\n  template: `\n    <div class=\"checkbox-radio-group\">\n      @for (option of props.options; track option.id) {\n        <ion-checkbox\n          [checked]=\"isSelected(option)\"\n          [disabled]=\"props.state === states.DISABLED\"\n          [labelPlacement]=\"'end'\"\n          (ionChange)=\"onOptionSelect(option, $event)\"\n        >\n          {{ option.name }}\n        </ion-checkbox>\n      }\n    </div>\n  `,\n  styleUrls: ['./checkbox-radio-input.component.scss'],\n})\n/**\n * val-checkbox-radio-input\n *\n * A group of checkboxes with radio behavior (single selection).\n * Visually displays as checkboxes but only allows one option to be selected at a time.\n *\n * @example\n * <val-checkbox-radio-input [props]=\"{\n *   control: myControl,\n *   options: [\n *     { id: 'yes', name: 'Sí', order: 0 },\n *     { id: 'no', name: 'No', order: 1 }\n *   ]\n * }\"></val-checkbox-radio-input>\n *\n * @input props: InputMetadata - Configuration including control and options\n */\nexport class CheckboxRadioInputComponent implements OnInit {\n  @Input() props: InputMetadata;\n  states = ComponentStates;\n\n  ngOnInit() {}\n\n  isSelected(option: InputOption): boolean {\n    return this.props.control?.value === option.id;\n  }\n\n  onOptionSelect(option: InputOption, event: any): void {\n    if (event.detail.checked) {\n      // Seleccionar esta opción\n      this.props.control?.setValue(option.id);\n    } else {\n      // Si se deselecciona la opción actual, limpiar\n      if (this.props.control?.value === option.id) {\n        this.props.control?.setValue(null);\n      }\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonCheckbox, IonTextarea } from '@ionic/angular/standalone';\nimport { CommentInputMetadata } from './types';\n\n@Component({\n  selector: 'val-comment-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonCheckbox, IonTextarea],\n  template: `\n    <ion-textarea\n      [formControl]=\"props.control\"\n      [counter]=\"props.showCounter !== false\"\n      [maxlength]=\"props.maxLength\"\n    ></ion-textarea>\n  `,\n  styleUrls: ['./comment-input.component.scss'],\n})\n/**\n * val-comment-input\n *\n * A textarea input for multi-line comments, integrated with Angular forms.\n *\n * @example\n * <val-comment-input [props]=\"{ control: myControl, maxLength: 200 }\"></val-comment-input>\n *\n * @input props: CommentInputMetadata - Configuration for the textarea (form control, maxLength, etc.)\n */\nexport class CommentInputComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {CommentInputMetadata}\n   * @property control - The Angular FormControl for the textarea.\n   * @property maxLength - Maximum character length.\n   */\n  @Input() props: CommentInputMetadata;\n\n  constructor() {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { IonSpinner, IonText } from '@ionic/angular/standalone';\nimport { ContentLoaderMetadata } from './types';\n\n@Component({\n  selector: 'val-content-loader',\n  standalone: true,\n  imports: [CommonModule, IonSpinner, IonText],\n  template: `\n    <div [ngClass]=\"['spinner-wrapper', props.size]\">\n      <ion-spinner [ngClass]=\"[props.size]\" [name]=\"props.name\" [color]=\"props.color\"></ion-spinner>\n      <ion-text [color]=\"props.color\">\n        <p>{{ props.text }}</p>\n      </ion-text>\n    </div>\n  `,\n  styleUrls: ['./content-loader.component.scss'],\n})\n/**\n * val-content-loader\n *\n * A loading spinner with optional text, for indicating loading states.\n *\n * @example\n * <val-content-loader [props]=\"{ size: 'large', color: 'primary', text: 'Loading...' }\"></val-content-loader>\n *\n * @input props: ContentLoaderMetadata - Configuration for the loader (size, color, text, etc.)\n */\nexport class ContentLoaderComponent implements OnInit {\n  /**\n   * Loader configuration object.\n   * @type {ContentLoaderMetadata}\n   * @property size - The spinner size.\n   * @property color - The spinner color.\n   * @property text - The loading text (optional).\n   * @property name - The spinner name (optional).\n   */\n  @Input()\n  props: ContentLoaderMetadata;\n\n  constructor() {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonButton, IonDatetime, IonModal } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { PresetService } from '../../../services/presets';\nimport { DateInputMetadata } from './types';\n\nconst DATE_INPUT_I18N = {\n  es: { selectDate: 'Seleccionar fecha', selectTime: 'Seleccionar hora' },\n  en: { selectDate: 'Select date', selectTime: 'Select time' },\n};\n\n@Component({\n  selector: 'val-date-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonButton, IonDatetime, IonModal],\n  template: `\n    <div class=\"button-container\">\n      <!-- Trigger propio (reemplaza ion-datetime-button, que renderiza en blanco\n           cuando el control no tiene valor). Muestra el valor formateado o el\n           placeholder, y abre el modal vía [trigger]. -->\n      <ion-button\n        [id]=\"triggerId\"\n        class=\"action date-trigger\"\n        fill=\"outline\"\n        color=\"medium\"\n        [class.is-placeholder]=\"!displayValue\"\n      >\n        {{ displayValue || placeholderText }}\n      </ion-button>\n    </div>\n    <ion-modal [trigger]=\"triggerId\" [keepContentsMounted]=\"true\">\n      <ng-template>\n        <ion-datetime\n          [formControl]=\"resolvedProps.control\"\n          [id]=\"resolvedProps.token\"\n          [presentation]=\"presentation\"\n          locale=\"es-ES\"\n          [firstDayOfWeek]=\"1\"\n          [showDefaultButtons]=\"true\"\n          [doneText]=\"doneText\"\n          [cancelText]=\"cancelText\"\n          formatOptions=\"{\n            date: { dateStyle: 'medium' },\n            time: { timeStyle: 'short' }\n          }\"\n        >\n          <span slot=\"title\">{{ resolvedProps.hint }}</span>\n        </ion-datetime>\n      </ng-template>\n    </ion-modal>\n  `,\n  styleUrls: ['./date-input.component.scss'],\n})\n/**\n * val-date-input\n *\n * A date picker input integrated with Angular forms, using Ionic's datetime component.\n *\n * Cuando el control no tiene valor, muestra un botón con el texto `placeholder`\n * (o un default i18n \"Seleccionar fecha\") en vez de renderizar en blanco —\n * `ion-datetime-button` no soporta placeholder, por eso usamos un trigger propio.\n *\n * @example\n * <val-date-input [props]=\"{ control: myControl, hint: 'Select a date' }\"></val-date-input>\n *\n * @input props: DateInputMetadata - Configuration for the date input (form control, hint, etc.)\n */\nexport class DateInputComponent implements OnInit, OnChanges {\n  private i18n = inject(I18nService);\n  private presets = inject(PresetService);\n\n  constructor() {\n    // Auto-registro de defaults i18n (anti key-faltante → anti storm de CD).\n    if (!this.i18n.hasNamespace('DateInput')) {\n      this.i18n.registerContent('DateInput', DATE_INPUT_I18N);\n    }\n  }\n\n  /**\n   * Preset name to apply. Presets define reusable date input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-date-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-date-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {DateInputMetadata}\n   * @property control - The Angular FormControl for the date input.\n   * @property hint - The hint text for the input.\n   */\n  @Input() props: Partial<DateInputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: DateInputMetadata = {} as DateInputMetadata;\n\n  /** Done button text - from props or i18n default */\n  get doneText(): string {\n    return this.resolvedProps?.doneText || this.i18n.t('ok');\n  }\n\n  /** Cancel button text - from props or i18n default */\n  get cancelText(): string {\n    return this.resolvedProps?.cancelText || this.i18n.t('cancel');\n  }\n\n  /** Presentación del datetime (default: date). */\n  get presentation(): string {\n    return this.resolvedProps?.presentation || 'date';\n  }\n\n  /** Texto del trigger cuando NO hay valor (placeholder explícito o default i18n). */\n  get placeholderText(): string {\n    if (this.resolvedProps?.placeholder) return this.resolvedProps.placeholder;\n    this.i18n.lang(); // reactividad ante cambio de idioma\n    return this.presentation === 'time'\n      ? this.i18n.t('selectTime', 'DateInput')\n      : this.i18n.t('selectDate', 'DateInput');\n  }\n\n  /** Id del trigger/datetime — estable; se garantiza no vacío en resolveProps. */\n  get triggerId(): string {\n    return this.resolvedProps?.token || '';\n  }\n\n  /** Valor formateado del control para mostrar en el trigger ('' si vacío). */\n  get displayValue(): string {\n    const raw = this.resolvedProps?.control?.value;\n    if (!raw) return '';\n    const d = new Date(raw);\n    if (isNaN(d.getTime())) return String(raw);\n    this.i18n.lang(); // reactividad\n    const locale = 'es-ES';\n    try {\n      switch (this.presentation) {\n        case 'time':\n          return new Intl.DateTimeFormat(locale, { timeStyle: 'short' }).format(d);\n        case 'month':\n        case 'month-year':\n          return new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }).format(d);\n        case 'year':\n          return new Intl.DateTimeFormat(locale, { year: 'numeric' }).format(d);\n        case 'date-time':\n          return new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeStyle: 'short' }).format(d);\n        default:\n          return new Intl.DateTimeFormat(locale, { dateStyle: 'medium' }).format(d);\n      }\n    } catch {\n      return String(raw);\n    }\n  }\n\n  ngOnInit() {\n    this.resolveProps();\n    this.applyDefaultValue();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      this.applyDefaultValue();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('dateInput', this.preset) as Partial<DateInputMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as DateInputMetadata;\n\n    // Garantizar un token (id) no vacío: lo necesitan [trigger] del modal y el\n    // [id] del ion-datetime para vincularse. Si el consumer no lo pasó, generamos uno.\n    if (!this.resolvedProps.token) {\n      this.resolvedProps.token = `val-date-${Math.random().toString(36).slice(2, 10)}`;\n    }\n  }\n\n  private applyDefaultValue(): void {\n    if (!this.resolvedProps.control) return;\n\n    // Only apply if withDefault or value is set\n    if (!this.resolvedProps.withDefault && !this.resolvedProps.value) return;\n\n    let defaultValue: string | null = null;\n\n    // Explicit value takes precedence\n    if (this.resolvedProps.value) {\n      defaultValue = new Date(this.resolvedProps.value).toISOString();\n    } else if (typeof this.resolvedProps.withDefault === 'string') {\n      defaultValue = new Date(this.resolvedProps.withDefault).toISOString();\n    } else if (this.resolvedProps.withDefault === true) {\n      defaultValue = new Date().toISOString();\n    }\n\n    if (defaultValue) {\n      this.resolvedProps.control.setValue(defaultValue);\n      this.resolvedProps.control.markAsPristine();\n      this.resolvedProps.control.updateValueAndValidity();\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonInput } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-email-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonInput],\n  template: ` <ion-input [formControl]=\"resolvedProps.control\" type=\"email\" [placeholder]=\"resolvedProps.placeholder\"></ion-input> `,\n  styleUrls: ['./email-input.component.scss'],\n})\n/**\n * val-email-input\n *\n * An email input field integrated with Angular forms.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-email-input preset=\"form-field\" [props]=\"{ control: myControl, placeholder: 'Email' }\"></val-email-input>\n *\n * @example Static (backwards compatible):\n * <val-email-input [props]=\"{ control: myControl, placeholder: 'Enter your email' }\"></val-email-input>\n *\n * @input preset: string - Name of preset to apply (e.g., 'form-field')\n * @input props: InputMetadata - Configuration for the input (overrides preset values)\n */\nexport class EmailInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-email-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-email-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the input.\n   * @property placeholder - The placeholder text.\n   */\n  @Input() props: Partial<InputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: InputMetadata = {} as InputMetadata;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('emailInput', this.preset) as Partial<InputMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as InputMetadata;\n  }\n}\n","/**\n * Resolves a color string to a valid CSS value for use in styles.\n * Supports Ionic color names, CSS variables, and custom colors.\n *\n * @param color The color name, CSS variable, or custom color string\n * @returns A valid CSS color value\n *\n * @example\n * resolveColor('primary'); // returns 'var(--ion-color-primary)'\n * resolveColor('--my-custom-color'); // returns 'var(--my-custom-color)'\n * resolveColor('#ff0000'); // returns '#ff0000'\n */\nexport function resolveColor(color: string): string {\n  // Si el color empieza con \"--\", se asume que es una variable CSS válida\n  if (color.startsWith('--')) {\n    return `var(${color})`;\n  }\n\n  // Lista de colores predefinidos de Ionic\n  const ionicColors = [\n    'primary',\n    'secondary',\n    'tertiary',\n    'success',\n    'warning',\n    'danger',\n    'light',\n    'medium',\n    'dark',\n  ];\n\n  // Verificar si el color es un color de Ionic\n  if (ionicColors.includes(color)) {\n    return `var(--ion-color-${color})`;\n  }\n\n  // Si no es una variable CSS ni un color de Ionic, devolver el color tal cual\n  return color;\n}\n","import { Component, inject, Input } from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { resolveColor } from '../../../shared/utils/styles';\nimport { ExpandableTextInput } from './types';\n\n@Component({\n  selector: 'val-expandable-text',\n  standalone: true,\n  imports: [IonText],\n  template: `\n    <div class=\"description-container\" [class.expanded]=\"expanded\" [class.has-gradient]=\"!expanded && isTruncated\">\n      <div class=\"content-wrapper\">\n        <ion-text>\n          <p class=\"description\">\n            <span class=\"content\">{{ expanded ? props.content : truncatedText }}</span>\n          </p>\n        </ion-text>\n      </div>\n      @if (!expanded && isTruncated) {\n        <span class=\"see-more\" [style.color]=\"this.color()\" (click)=\"toggleExpand()\">\n          {{ getExpandText() }}\n        </span>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .description-container {\n        position: relative;\n        overflow: hidden;\n        transition: max-height 0.3s ease-in-out;\n      }\n\n      .description-container:not(.expanded) {\n        max-height: 10rem; /* Altura para texto truncado */\n      }\n\n      .description-container.expanded {\n        max-height: none; /* Sin límite de altura al expandir */\n      }\n\n      .content-wrapper {\n        overflow: hidden;\n      }\n\n      /* Mask gradient - funciona en cualquier color de fondo */\n      .description-container:not(.expanded).has-gradient .content-wrapper {\n        -webkit-mask-image: linear-gradient(to bottom, black 50%, transparent 100%);\n        mask-image: linear-gradient(to bottom, black 50%, transparent 100%);\n      }\n\n      .description {\n        margin: 0;\n      }\n\n      .see-more {\n        display: block;\n        font-weight: bold;\n        cursor: pointer;\n        margin-top: 0.25rem;\n      }\n    `,\n  ],\n})\n/**\n * val-expandable-text\n *\n * A text component that can be expanded/collapsed to show more or less content.\n *\n * @example\n * <val-expandable-text [props]=\"{ content: '...', limit: 180, color: 'primary', expandText: 'más' }\"></val-expandable-text>\n *\n * @input props: ExpandableTextInput - Configuration for the expandable text (content, limit, color, expandText)\n */\nexport class ExpandableTextComponent {\n  /**\n   * Expandable text configuration object.\n   * @type {ExpandableTextInput}\n   * @property content - The text content to display.\n   * @property limit - The character limit before truncation.\n   * @property color - The color for the \"see more\" link.\n   * @property expandText - The text for the expand link (optional).\n   */\n  @Input() props: ExpandableTextInput;\n  expanded = false;\n  defaultColor = 'primary';\n\n  private i18n = inject(I18nService);\n\n  get truncatedText(): string {\n    const maxLength = this.props.limit || 100;\n    return this.props.content?.length > maxLength ? this.props.content.slice(0, maxLength) + '...' : this.props.content;\n  }\n\n  get isTruncated(): boolean {\n    return this.props.content?.length > (this.props.limit || 100);\n  }\n\n  getExpandText(): string {\n    return this.props.expandText || this.i18n.t('seeMore');\n  }\n\n  toggleExpand() {\n    this.expanded = !this.expanded;\n  }\n\n  color() {\n    return resolveColor(this.props.color || this.defaultColor);\n  }\n}\n","import { Component, inject, Input, OnInit, ViewChild } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { PrimarySolidDefaultRoundButton } from '../../atoms/button/factory';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { ButtonMetadata } from '../../types';\nimport { FileInputMetadata } from './types';\n\n@Component({\n  selector: 'val-file-input',\n  standalone: true,\n  imports: [IonIcon, TextComponent, ButtonComponent],\n  template: `\n    <div class=\"file-container\">\n      <input style=\"display: none\" type=\"file\" (change)=\"onFileSelected($event)\" #fileInput [accept]=\"props.accept\" />\n      <div class=\"name-container\">\n        <ion-icon [name]=\"selectedFile ? 'checkmark-circle-outline' : 'alert-circle-outline'\"></ion-icon>\n        <val-text\n          style=\"margin-left: 4px;\"\n          [props]=\"{\n            content: getFileDisplayText(),\n            color: 'dark',\n            bold: false,\n            size: 'medium',\n          }\"\n        ></val-text>\n      </div>\n      <val-button [props]=\"contrastButton\" (onClick)=\"fileInput.click()\"></val-button>\n    </div>\n  `,\n  styleUrls: ['./file-input.component.scss'],\n})\n/**\n * val-file-input\n *\n * A file input component for uploading files, integrated with Angular forms.\n *\n * @example\n * <val-file-input [props]=\"{ control: myControl, accept: 'image/*' }\"></val-file-input>\n *\n * @input props: FileInputMetadata - Configuration for the file input (form control, accept types, etc.)\n */\nexport class FileInputComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {FileInputMetadata}\n   * @property control - The Angular FormControl for the file input.\n   * @property accept - Accepted file types (e.g., 'image/*', '.pdf').\n   */\n  @Input() props: FileInputMetadata;\n\n  @ViewChild('fileInput') fileInput;\n\n  private i18n = inject(I18nService);\n\n  contrastButton: ButtonMetadata;\n  selectedFile: File;\n\n  constructor() {}\n\n  ngOnInit() {\n    // Initialize button with i18n text\n    this.contrastButton = {\n      ...PrimarySolidDefaultRoundButton(this.props?.buttonText || this.i18n.t('uploadFile')),\n      color: 'light',\n    };\n  }\n\n  /** Get display text for file status */\n  getFileDisplayText(): string {\n    if (this.selectedFile) {\n      return this.selectedFile.name;\n    }\n    return this.props?.noFileText || this.i18n.t('noFileSelected');\n  }\n\n  onFileSelected(event): void {\n    this.selectedFile = event.target.files[0];\n    this.props.control.setValue(this.selectedFile);\n  }\n\n  reset(): void {\n    this.selectedFile = null;\n    this.fileInput.nativeElement.value = '';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnInit } from '@angular/core';\nimport { I18nService } from '../../../services/i18n';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-hint',\n  standalone: true,\n  imports: [CommonModule, TextComponent],\n  template: `\n    <div class=\"hint-container\" *ngIf=\"shouldShowErrors\">\n      <val-text\n        *ngFor=\"let e of Errors\"\n        [props]=\"{\n          content: e,\n          color: 'danger',\n          bold: false,\n          size: 'small',\n        }\"\n      ></val-text>\n    </div>\n  `,\n  styleUrls: ['./hint.component.scss'],\n})\n/**\n * val-hint\n *\n * Displays validation error messages for a form input, using Angular forms.\n *\n * @example\n * <val-hint [props]=\"{ control: myControl, errors: { required: 'Required field' } }\"></val-hint>\n *\n * @input props: InputMetadata - Configuration for the input (form control, errors, etc.)\n */\nexport class HintComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the input.\n   * @property errors - The error messages mapping.\n   */\n  @Input() props: InputMetadata;\n\n  private i18n = inject(I18nService);\n\n  constructor() {}\n\n  ngOnInit() {}\n\n  get shouldShowErrors(): boolean {\n    if (this.props.control) {\n      // Normal field with single control\n      return this.props.control.invalid && (this.props.control.touched || this.props.control.dirty);\n    } else if (this.props.fromControl && this.props.toControl) {\n      // NUMBER_FROM_TO field with separate controls\n      const fromInvalid =\n        this.props.fromControl.invalid && (this.props.fromControl.touched || this.props.fromControl.dirty);\n      const toInvalid = this.props.toControl.invalid && (this.props.toControl.touched || this.props.toControl.dirty);\n      return fromInvalid || toInvalid;\n    }\n    return false;\n  }\n\n  get Errors(): string[] {\n    const keys = Object.keys(this.props.errors || {});\n    const errors = [];\n\n    keys.map((e: string) => {\n      if (this.props.control && this.props.control.hasError(e)) {\n        // Normal field\n        errors.push(this.props.errors[e]);\n      } else if (this.props.fromControl && this.props.toControl) {\n        // NUMBER_FROM_TO field - check both controls\n        const fromLabel = this.props.fromLabel || this.i18n.t('from');\n        const toLabel = this.props.toLabel || this.i18n.t('to');\n\n        if (this.props.fromControl.hasError(e)) {\n          errors.push(`${fromLabel}: ${this.props.errors[e]}`);\n        }\n        if (this.props.toControl.hasError(e)) {\n          errors.push(`${toLabel}: ${this.props.errors[e]}`);\n        }\n      }\n    });\n\n    return errors;\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonDatetime } from '@ionic/angular/standalone';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-hour-input',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonDatetime],\n  template: ` <ion-datetime [formControl]=\"props.control\" presentation=\"time\"></ion-datetime>`,\n  styleUrls: ['./hour-input.component.scss'],\n})\n/**\n * val-hour-input\n *\n * A time picker input integrated with Angular forms, using Ionic's datetime component.\n *\n * @example\n * <val-hour-input [props]=\"{ control: myControl }\"></val-hour-input>\n *\n * @input props: InputMetadata - Configuration for the time input (form control, etc.)\n */\nexport class HourInputComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the time input.\n   */\n  @Input() props: InputMetadata;\n\n  constructor() {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { IonButton, IonIcon, IonLabel, IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronDown } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { PopoverSelectorMetadata } from './types';\n\n@Component({\n  selector: 'val-popover-selector',\n  standalone: true,\n  imports: [CommonModule, IonButton, IonIcon, IonSelect, IonSelectOption, IonLabel],\n  template: `\n    <div class=\"popover-selector-container\">\n      <ion-label *ngIf=\"props.label\" class=\"selector-label\">{{ props.label }}</ion-label>\n      <ion-select\n        [value]=\"props.selectedValue\"\n        [placeholder]=\"getPlaceholderText()\"\n        [interface]=\"props.interface || 'popover'\"\n        [multiple]=\"props.multiple || false\"\n        [disabled]=\"props.disabled || false\"\n        [cancelText]=\"getCancelText()\"\n        [okText]=\"getOkText()\"\n        (ionChange)=\"onSelectionChange($event)\"\n        class=\"popover-selector-select\"\n      >\n        <ion-button\n          slot=\"trigger\"\n          [fill]=\"props.fill || 'clear'\"\n          [size]=\"props.size || 'default'\"\n          [shape]=\"'round'\"\n          [color]=\"props.color || 'medium'\"\n          [disabled]=\"props.disabled || false\"\n          class=\"selector-trigger\"\n        >\n          <ion-icon *ngIf=\"props.icon\" [name]=\"props.icon\" slot=\"start\"> </ion-icon>\n\n          <span class=\"trigger-text\">{{ getDisplayText() }}</span>\n\n          <ion-icon name=\"chevron-down-outline\" slot=\"end\" class=\"chevron-icon\"> </ion-icon>\n        </ion-button>\n\n        <ion-select-option *ngFor=\"let option of props.options\" [value]=\"option.value\" [disabled]=\"option.disabled\">\n          <div class=\"option-content\">\n            <ion-icon *ngIf=\"option.icon\" [name]=\"option.icon\" class=\"option-icon\"> </ion-icon>\n            <span>{{ option.label }}</span>\n          </div>\n        </ion-select-option>\n      </ion-select>\n    </div>\n  `,\n  styleUrls: ['./popover-selector.component.scss'],\n})\n/**\n * val-popover-selector\n *\n * A generic reusable popover selector component that can be used for any type of selection.\n * Provides a button trigger that opens a popover with selectable options.\n *\n * @example\n * // Basic usage\n * <val-popover-selector\n *   [props]=\"selectorProps\"\n *   (selectionChange)=\"onSelectionChange($event)\">\n * </val-popover-selector>\n *\n * @example\n * // With icon and custom styling\n * const selectorProps: PopoverSelectorMetadata = {\n *   options: [\n *     { value: 'option1', label: 'Option 1', icon: 'star' },\n *     { value: 'option2', label: 'Option 2', icon: 'heart' }\n *   ],\n *   selectedValue: 'option1',\n *   label: 'Choose option',\n *   icon: 'settings',\n *   color: 'primary',\n *   size: 'large',\n *   fill: 'solid'\n * };\n *\n * @input props: PopoverSelectorMetadata - Configuration for the selector\n * @output selectionChange: EventEmitter<string | string[]> - Emitted when selection changes\n */\nexport class PopoverSelectorComponent {\n  /**\n   * Popover selector configuration object.\n   * @type {PopoverSelectorMetadata}\n   */\n  @Input()\n  props: PopoverSelectorMetadata;\n\n  /**\n   * Event emitted when the selection changes.\n   * Emits the selected value(s).\n   */\n  @Output()\n  selectionChange = new EventEmitter<string | string[]>();\n\n  private i18n = inject(I18nService);\n\n  constructor() {\n    // Register required icons\n    addIcons({ chevronDown });\n  }\n\n  /**\n   * Get placeholder text.\n   */\n  getPlaceholderText(): string {\n    return this.props.placeholder || this.i18n.t('selectPlaceholder');\n  }\n\n  /**\n   * Get cancel text.\n   */\n  getCancelText(): string {\n    return this.props.cancelText || this.i18n.t('cancel');\n  }\n\n  /**\n   * Get ok text.\n   */\n  getOkText(): string {\n    return this.props.okText || this.i18n.t('ok');\n  }\n\n  /**\n   * Handle selection change from the ion-select.\n   * @param event - The ion-select change event\n   */\n  onSelectionChange(event: any) {\n    const selectedValue = event.detail.value;\n    this.selectionChange.emit(selectedValue);\n  }\n\n  /**\n   * Get the display text for the trigger button.\n   * Shows the selected option's label or placeholder.\n   * @returns The display text\n   */\n  getDisplayText(): string {\n    if (!this.props.selectedValue) {\n      return this.getPlaceholderText();\n    }\n\n    if (Array.isArray(this.props.selectedValue)) {\n      // Multiple selection\n      if (this.props.selectedValue.length === 0) {\n        return this.getPlaceholderText();\n      }\n      if (this.props.selectedValue.length === 1) {\n        const option = this.props.options.find(opt => opt.value === this.props.selectedValue[0]);\n        return option?.label || this.props.selectedValue[0];\n      }\n      return `${this.props.selectedValue.length} ${this.i18n.t('selected')}`;\n    }\n\n    // Single selection\n    const selectedOption = this.props.options.find(opt => opt.value === this.props.selectedValue);\n    return selectedOption?.label || this.props.selectedValue;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\nimport { IonButton, IonIcon, IonPopover, IonList, IonItem, IonLabel } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { language, globeOutline, checkmark } from 'ionicons/icons';\nimport { I18nService, I18nLang } from '../../../services/i18n';\nimport { PopoverSelectorComponent } from '../popover-selector/popover-selector.component';\nimport { PopoverOption, PopoverSelectorMetadata } from '../popover-selector/types';\nimport { LanguageSelectorMetadata } from './types';\n\n@Component({\n  selector: 'val-language-selector',\n  standalone: true,\n  imports: [CommonModule, PopoverSelectorComponent, IonButton, IonIcon, IonPopover, IonList, IonItem, IonLabel],\n  template: `\n    <!-- Default mode: use popover-selector -->\n    @if (props.mode !== 'icon') {\n      <val-popover-selector [props]=\"popoverProps\" (selectionChange)=\"onLanguageChange($event)\"> </val-popover-selector>\n    }\n\n    <!-- Icon mode: compact globe button with popover -->\n    @if (props.mode === 'icon') {\n      <ion-button\n        [id]=\"popoverId\"\n        [color]=\"props.color || 'medium'\"\n        [fill]=\"props.fill || 'clear'\"\n        [size]=\"props.size || 'default'\"\n        [disabled]=\"props.disabled\"\n        class=\"icon-mode-button\"\n      >\n        <ion-icon slot=\"icon-only\" [name]=\"props.icon || 'globe-outline'\"></ion-icon>\n      </ion-button>\n\n      <ion-popover [trigger]=\"popoverId\" [dismissOnSelect]=\"true\">\n        <ng-template>\n          <ion-list>\n            @for (lang of availableLanguages; track lang) {\n              <ion-item\n                [button]=\"true\"\n                [detail]=\"false\"\n                (click)=\"onLanguageChange(lang)\"\n                [class.selected]=\"lang === currentLanguage\"\n              >\n                <ion-label>{{ getLanguageDisplayName(lang) }}</ion-label>\n                @if (lang === currentLanguage) {\n                  <ion-icon slot=\"end\" name=\"checkmark\" color=\"primary\"></ion-icon>\n                }\n              </ion-item>\n            }\n          </ion-list>\n        </ng-template>\n      </ion-popover>\n    }\n  `,\n  styleUrls: ['./language-selector.component.scss'],\n})\n/**\n * val-language-selector\n *\n * A language selector component that uses I18nService.\n * By default, language changes are reactive (no page reload).\n * Set forceReload: true in props to reload on change.\n *\n * @example Default mode (dropdown, no label):\n * <val-language-selector [props]=\"{ showFlags: true }\">\n * </val-language-selector>\n *\n * @example With label (if needed):\n * <val-language-selector [props]=\"{ showLabel: true }\">\n * </val-language-selector>\n *\n * @example Icon mode (compact for headers/toolbars):\n * <val-language-selector [props]=\"{ mode: 'icon', color: 'primary' }\">\n * </val-language-selector>\n *\n * @input props: LanguageSelectorMetadata - Configuration for the language selector\n * @output languageChange: EventEmitter<string> - Emitted when language changes\n */\nexport class LanguageSelectorComponent implements OnInit {\n  /**\n   * Language selector configuration object.\n   */\n  @Input()\n  props: LanguageSelectorMetadata = {};\n\n  /**\n   * Event emitted when the language selection changes.\n   * Emits the selected language code.\n   */\n  @Output()\n  languageChange = new EventEmitter<string>();\n\n  /** Popover selector configuration (for default mode) */\n  popoverProps: PopoverSelectorMetadata;\n\n  /** Unique ID for the icon mode popover trigger */\n  popoverId = `lang-selector-${Math.random().toString(36).substring(2, 9)}`;\n\n  /** Available languages (exposed for icon mode template) */\n  availableLanguages: string[] = [];\n\n  /** Current language (exposed for icon mode template) */\n  currentLanguage: string = '';\n\n  private i18n = inject(I18nService);\n\n  /** Default language display names */\n  readonly defaultLanguageNames: Record<string, string> = {\n    es: 'Español',\n    en: 'English',\n    fr: 'Français',\n    de: 'Deutsch',\n  };\n\n  /** Default flag icons for languages */\n  readonly defaultLanguageFlags: Record<string, string> = {\n    es: '🇪🇸',\n    en: '🇺🇸',\n    fr: '🇫🇷',\n    de: '🇩🇪',\n  };\n\n  constructor() {\n    addIcons({ language, globeOutline, checkmark });\n  }\n\n  ngOnInit() {\n    this.currentLanguage = this.i18n.lang();\n    this.availableLanguages = this.props.availableLanguages || this.i18n.supportedLanguages();\n    this.initializePopoverProps();\n  }\n\n  private initializePopoverProps() {\n    const currentLanguage = this.i18n.lang();\n    const availableLanguages = this.props.availableLanguages || this.i18n.supportedLanguages();\n\n    // Convert language codes to popover options\n    const options: PopoverOption[] = availableLanguages.map(lang => ({\n      value: lang,\n      label: this.getLanguageDisplayName(lang),\n    }));\n\n    // Create popover configuration\n    this.popoverProps = {\n      options,\n      selectedValue: currentLanguage,\n      label: this.props.showLabel === true ? this.props.label || this.i18n.t('language') : undefined,\n      icon: 'language',\n      placeholder: this.i18n.t('selectLanguage'),\n      color: this.props.color || 'medium',\n      size: this.props.size || 'default',\n      fill: this.props.fill || 'outline',\n      shape: this.props.shape,\n      expand: this.props.expand,\n      disabled: this.props.disabled || false,\n      interface: 'popover',\n      showCheckmark: true,\n      multiple: false,\n      cancelText: this.i18n.t('cancel'),\n      okText: this.i18n.t('ok'),\n    };\n  }\n\n  /** Get display name for a language code (public for template access) */\n  getLanguageDisplayName(languageCode: string): string {\n    // Use custom names if provided\n    if (this.props.customLanguageNames?.[languageCode]) {\n      const customName = this.props.customLanguageNames[languageCode];\n      const flag = this.props.showFlags ? this.defaultLanguageFlags[languageCode] : '';\n      return flag ? `${flag} ${customName}` : customName;\n    }\n\n    // Use default names\n    const defaultName = this.defaultLanguageNames[languageCode] || languageCode.toUpperCase();\n    const flag = this.props.showFlags ? this.defaultLanguageFlags[languageCode] : '';\n    return flag ? `${flag} ${defaultName}` : defaultName;\n  }\n\n  /**\n   * Handle language selection change.\n   * @param selectedLanguage - The selected language code(s)\n   */\n  onLanguageChange(selectedLanguage: string | string[]) {\n    if (typeof selectedLanguage === 'string') {\n      const newLang = selectedLanguage as I18nLang;\n\n      // Update current language for icon mode\n      this.currentLanguage = newLang;\n\n      // Emit the change event\n      this.languageChange.emit(selectedLanguage);\n\n      // Set the new language (reactive by default, reload if forceReload is true)\n      this.i18n.setLanguage(newLang, this.props.forceReload);\n\n      // Update popover selected value for reactive UI (default mode)\n      if (this.popoverProps) {\n        this.popoverProps = { ...this.popoverProps, selectedValue: newLang };\n      }\n    }\n  }\n}\n","export const LANG = 'LANG';\nexport const THEME = 'THEME';\nexport const FONT_SIZE = 'FONT_SIZE';\n","/**\n * Utility service for interacting with browser localStorage in a type-safe way.\n * Provides static methods for setting, getting, removing, and clearing items.\n *\n * SSR-safe: en Node (prerender) `localStorage` no existe — los métodos son no-ops\n * en server. `get` retorna `null` casteado a `T`, igual que cuando la key no\n * existe en browser.\n */\nexport class LocalStorageService {\n  private static get available(): boolean {\n    return typeof localStorage !== 'undefined';\n  }\n\n  /**\n   * Stores a value in localStorage under the given reference key.\n   */\n  static set<T>(reference: string, value: T): void {\n    if (!this.available) return;\n    localStorage.setItem(reference, JSON.stringify(value));\n  }\n\n  /**\n   * Retrieves a value from localStorage by key.\n   */\n  static get<T>(reference: string): T {\n    if (!this.available) return null as T;\n    const value = localStorage.getItem(reference);\n    return JSON.parse(value) as T;\n  }\n\n  /**\n   * Removes an item from localStorage by key.\n   */\n  static remove(reference: string): void {\n    if (!this.available) return;\n    localStorage.removeItem(reference);\n  }\n\n  /**\n   * Clears all items from localStorage.\n   */\n  static clear() {\n    if (!this.available) return;\n    localStorage.clear();\n  }\n}\n","/**\n * Service for managing application themes (light, dark, auto).\n * Handles user preferences, system theme detection, and theme toggling.\n * Uses localStorage to persist the selected theme.\n */\n\nimport { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { BehaviorSubject } from 'rxjs';\nimport { THEME } from '../shared/constants/storage';\nimport { LocalStorageService } from './local-storage.service';\n\nexport enum ThemeOption {\n  LIGHT = 'light',\n  DARK = 'dark',\n  AUTO = 'auto',\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class ThemeService {\n  /**\n   * Indicates if the light theme is active.\n   */\n  lightToggle = false;\n  /**\n   * Indicates if the dark theme is active.\n   */\n  darkToggle = false;\n  /**\n   * Indicates if the auto theme is active.\n   */\n  autoToggle = false;\n  /**\n   * The current selected theme option.\n   */\n  currentOption = ThemeOption.AUTO;\n  /**\n   * Enum with all available theme options.\n   */\n  themeOptions = ThemeOption;\n  /**\n   * Whether the system prefers dark mode.\n   */\n  prefersDark = false;\n  /**\n   * The default theme option.\n   */\n  default = ThemeOption.AUTO;\n  /**\n   * Observable for the current theme.\n   */\n  theme: BehaviorSubject<ThemeOption>;\n\n  private readonly isBrowser: boolean;\n\n  constructor(@Inject(PLATFORM_ID) platformId: Object) {\n    this.isBrowser = isPlatformBrowser(platformId);\n\n    const current = this.isBrowser ? LocalStorageService.get<ThemeOption>(THEME) : null;\n    this.theme = new BehaviorSubject<ThemeOption>(current || this.default);\n    this.currentOption = this.Theme;\n\n    // SSR: sin window/document. Estado queda en defaults; el hydrate posterior\n    // en browser corre toggleUserPreference y cablea el media query.\n    if (!this.isBrowser) {\n      return;\n    }\n\n    this.toggleUserPreference(this.currentOption);\n\n    const prefersDarkQuery = window.matchMedia('(prefers-color-scheme: dark)');\n    this.prefersDark = prefersDarkQuery.matches;\n    this.handleAutoConfiguration();\n\n    prefersDarkQuery.addEventListener('change', mediaQuery => {\n      this.prefersDark = mediaQuery.matches;\n      this.handleAutoConfiguration();\n    });\n  }\n\n  private handleAutoConfiguration() {\n    if (this.prefersDark && this.currentOption === ThemeOption.AUTO) {\n      console.log('💡 ThemeConfig prefersDark::: ', this.prefersDark);\n      this.toggleUserPreference(ThemeOption.AUTO);\n    }\n    if (!this.prefersDark && this.currentOption === ThemeOption.AUTO) {\n      console.log('💡 ThemeConfig prefersDark::: ', this.prefersDark);\n      this.toggleUserPreference(ThemeOption.AUTO);\n    }\n  }\n\n  private handleDarkPreference() {\n    this.toggleTheme(ThemeOption.DARK, true);\n    this.toggleTheme(ThemeOption.LIGHT, false);\n  }\n\n  private handleLightPreference() {\n    this.toggleTheme(ThemeOption.LIGHT, true);\n    this.toggleTheme(ThemeOption.DARK, false);\n  }\n\n  /**\n   * Returns true if the system prefers dark mode.\n   */\n  get IsDark(): boolean {\n    return this.prefersDark;\n  }\n\n  /**\n   * Gets the current theme option.\n   */\n  get Theme(): ThemeOption {\n    return this.theme.value;\n  }\n\n  /**\n   * Sets the current theme option and persists it.\n   */\n  set Theme(theme: ThemeOption) {\n    this.theme.next(theme);\n    if (this.isBrowser) {\n      LocalStorageService.set<ThemeOption>(THEME, theme);\n    }\n  }\n\n  /**\n   * Toggles a theme class on the document body.\n   * @param name The theme name\n   * @param shouldAdd Whether to add or remove the class\n   *\n   * Ionic 8 (`dark.class.css` palette) usa `.ion-palette-dark` en `<html>` para\n   * conmutar el tema dark; en versiones previas leía `body.dark`. Mantenemos\n   * el toggle sobre `body.{name}` por compat con código legacy, y además\n   * espejamos `ion-palette-dark` en `<html>` cuando `name === 'dark'` — esto\n   * es lo que las apps en Ionic 8 necesitan para que el palette aplique.\n   */\n  toggleTheme(name: string, shouldAdd: boolean) {\n    if (!this.isBrowser) {\n      return;\n    }\n    document.body.classList.toggle(name, shouldAdd);\n    if (name === 'dark') {\n      document.documentElement.classList.toggle('ion-palette-dark', shouldAdd);\n    }\n  }\n\n  /**\n   * Sets the user theme preference and updates toggles and theme classes.\n   * @param option The selected theme option\n   */\n  toggleUserPreference(option: ThemeOption) {\n    this.currentOption = option;\n    this.Theme = option;\n    this.lightToggle = option === ThemeOption.LIGHT;\n    this.darkToggle = option === ThemeOption.DARK;\n    this.autoToggle = option === ThemeOption.AUTO;\n\n    switch (option) {\n      case ThemeOption.LIGHT:\n        this.handleLightPreference();\n        break;\n      case ThemeOption.DARK:\n        this.handleDarkPreference();\n        break;\n      case ThemeOption.AUTO:\n        if (this.prefersDark) {\n          this.handleDarkPreference();\n        } else {\n          this.handleLightPreference();\n        }\n        break;\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { TitleBlockMetada } from './types';\n\n@Component({\n  selector: 'val-title-block',\n  standalone: true,\n  imports: [CommonModule, TitleComponent, DisplayComponent],\n  template: `\n    <div [ngClass]=\"['titles-container', props.position]\">\n      <val-title\n        *ngIf=\"props.aboveTitle\"\n        [props]=\"{\n          content: props.aboveTitle.content | uppercase,\n          color: props.aboveTitle.color,\n          bold: false,\n          size: props.aboveTitle.size,\n        }\"\n      ></val-title>\n      <val-display\n        *ngIf=\"props.title\"\n        [props]=\"{\n          content: props.title.content,\n          color: props.title.color,\n          size: props.title.size,\n        }\"\n      ></val-display>\n      <val-title\n        style=\"margin-top: 16px;\"\n        *ngIf=\"props.bellowTitle\"\n        [props]=\"{\n          content: props.bellowTitle.content,\n          color: props.bellowTitle.color,\n          bold: false,\n          size: props.bellowTitle.size,\n          thin: props.bellowTitle.thin,\n        }\"\n      ></val-title>\n    </div>\n  `,\n  styleUrls: ['./title-block.component.scss'],\n})\n/**\n * val-title-block\n *\n * Displays a block of titles (above, main, below) with configurable styles and positions.\n *\n * @example\n * <val-title-block [props]=\"{ title: {...}, aboveTitle: {...}, bellowTitle: {...}, position: 'center' }\"></val-title-block>\n *\n * @input props: TitleBlockMetada - Configuration for the title block (title, aboveTitle, bellowTitle, position)\n */\nexport class TitleBlockComponent implements OnInit {\n  @Input()\n  props: TitleBlockMetada;\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { ThemeService } from '../../../services/theme.service';\nimport { resolveColor } from '../../../shared/utils/styles';\nimport { ButtonGroupComponent } from '../button-group/button-group.component';\nimport { TitleBlockComponent } from '../title-block/title-block.component';\nimport { LayeredCardMetadata } from './types';\n\n@Component({\n  selector: 'layered-card',\n  standalone: true,\n  imports: [CommonModule, ButtonGroupComponent, TitleBlockComponent],\n  template: `\n    <div\n      class=\"fun-card\"\n      [class.big-space]=\"props.bigSpace\"\n      [class.hoverable]=\"props.hoverable\"\n      [class.layered]=\"props.mode === 'layered'\"\n      [class.poster]=\"props.mode === 'poster'\"\n      [ngStyle]=\"{\n        background: theme.IsDark ? 'var(--ion-background-color)' : color(props.background),\n        minHeight: props.withMin ? '340px' : 'auto',\n      }\"\n    >\n      @if (props.mode === 'poster') {\n        <img\n          class=\"poster-image\"\n          [class.dark]=\"props.dark\"\n          [class.with-opacity]=\"props.withOpacity\"\n          alt=\"image\"\n          [src]=\"props.image\"\n        />\n      }\n      @if (props.mode === 'layered') {\n        <img\n          class=\"layer-image\"\n          [class.dark]=\"props.dark\"\n          [class.with-opacity]=\"props.withOpacity\"\n          alt=\"image\"\n          [src]=\"props.image\"\n        />\n      }\n\n      <section>\n        <val-title-block [props]=\"props.content\" />\n        @if (props.actions) {\n          <val-button-group style=\"display:block; margin-top: 16px;\" [props]=\"props.actions\" />\n        }\n      </section>\n    </div>\n  `,\n  styleUrl: './layered-card.component.scss',\n})\nexport class LayeredCardComponent {\n  theme = inject(ThemeService);\n\n  @Input()\n  props: LayeredCardMetadata;\n\n  color(background) {\n    if (!background) {\n      return '';\n    }\n    return resolveColor(background);\n  }\n}\n","import { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\nimport { IonButton, IonIcon, IonText } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronForwardOutline } from 'ionicons/icons';\nimport { NavigationService } from '../../../services/navigation';\nimport { LinkMetadata } from './types';\n\n@Component({\n  selector: 'val-link',\n  standalone: true,\n  imports: [IonButton, IonIcon, IonText],\n  template: `\n    <div>\n      <ion-button type=\"button\" [color]=\"props.color\" fill=\"clear\" [size]=\"props.size\" (click)=\"onClickHandler()\">\n        <ion-icon slot=\"end\" name=\"chevron-forward-outline\"></ion-icon>\n        <ion-text>{{ props.text }}</ion-text>\n      </ion-button>\n    </div>\n  `,\n  styleUrls: ['./link.component.scss'],\n})\n/**\n * val-link\n *\n * A stylized link button with navigation support for internal, in-app, or new tab links.\n *\n * @example\n * <val-link [props]=\"{ text: 'Go', color: 'primary', link: '/home', type: 'internal' }\" (onClick)=\"handler($event)\"></val-link>\n *\n * @input props: LinkMetadata - Configuration for the link (text, color, link, type, etc.)\n * @output onClick - Emits the token of the clicked link\n */\nexport class LinkComponent implements OnInit {\n  /**\n   * Link configuration object.\n   * @type {LinkMetadata}\n   * @property text - The link text.\n   * @property color - The button color (Ionic color string).\n   * @property link - The URL or route to navigate to.\n   * @property type - The navigation type ('internal', 'browse', 'tab').\n   * @property token - Optional token for event identification.\n   * @property size - The button size (optional).\n   */\n  @Input()\n  props: LinkMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  service = inject(NavigationService);\n\n  constructor() {\n    addIcons({ chevronForwardOutline });\n  }\n\n  ngOnInit() {}\n\n  onClickHandler() {\n    this.onClick.emit(this.props.token);\n\n    switch (this.props.type) {\n      case 'internal':\n        this.service.navigateByUrl(this.props.link);\n        break;\n      case 'browse':\n        this.service.navigateInApp(this.props.link);\n        break;\n      case 'tab':\n        this.service.openInNewTab(this.props.link);\n        break;\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { HrefComponent } from '../../atoms/href/href.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { LinkCakeMetadata } from './types';\n\n@Component({\n  selector: 'val-links-cake',\n  standalone: true,\n  imports: [CommonModule, TitleComponent, HrefComponent],\n  template: `\n    <div>\n      @if (props.title) {\n        <div class=\"title\">\n          <val-title [props]=\"{ content: props.title, color: 'dark', bold: false, size: props.size }\"></val-title>\n        </div>\n      }\n      <div class=\"link\" *ngFor=\"let l of props.links\">\n        <val-href [props]=\"l\"></val-href>\n      </div>\n    </div>\n  `,\n  styleUrls: ['./links-cake.component.scss'],\n})\n/**\n * val-links-cake\n *\n * Displays a list of links with an optional title, styled as a \"cake\" of links.\n *\n * @example\n * <val-links-cake [props]=\"{ title: 'Links', links: [...], size: 'medium' }\"></val-links-cake>\n *\n * @input props: LinkCakeMetadata - Configuration for the links cake (title, links, size)\n */\nexport class LinksCakeComponent implements OnInit {\n  /**\n   * Links cake configuration object.\n   * @type {LinkCakeMetadata}\n   * @property title - The title for the links section (optional).\n   * @property links - Array of link configurations.\n   * @property size - The size of the title and links.\n   */\n  @Input()\n  props: LinkCakeMetadata;\n\n  constructor() {}\n\n  ngOnInit() {}\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { NotesBoxMetadata } from './types';\n\n/**\n * `val-notes-box` — callout / admonition para resaltar información dentro de un\n * flujo de texto.\n *\n * Diseño tipo GitHub/Docusaurus: fondo tintado suave, accent en el borde\n * izquierdo, prefijo en mayúsculas pequeñas. Funciona en light & dark.\n *\n * El color es un Ionic Color (primary, success, warning, danger, tertiary, …).\n * No usa `ion-card` ni `ion-color=\"X\"` como background — sino una mezcla\n * `rgba(--ion-color-X-rgb, 0.08)` para no asfixiar el contenido.\n *\n * Renderiza inline HTML (`<strong>`, links via `processLinks`) cuando los\n * flags están activos.\n *\n * @example\n * <val-notes-box [props]=\"{\n *   text: 'Recordá guardar tus cambios antes de salir.',\n *   prefix: 'Tip',\n *   color: 'tertiary',\n *   textColor: 'dark',\n *   size: 'medium',\n *   rounded: true,\n *   allowPartialBold: true,\n * }\"></val-notes-box>\n */\n@Component({\n  selector: 'val-notes-box',\n  standalone: true,\n  imports: [CommonModule, TextComponent],\n  template: `\n    <div\n      class=\"val-notes-box\"\n      [class.is-compact]=\"props.compact\"\n      [class.is-rounded]=\"props.rounded\"\n      [class.align-center]=\"props.align === 'center'\"\n      [class.align-right]=\"props.align === 'right'\"\n      [attr.data-color]=\"props.color || 'primary'\"\n      role=\"note\"\n    >\n      @if (props.prefix) {\n        <div class=\"val-notes-box__header\">{{ props.prefix }}</div>\n      }\n      <div class=\"val-notes-box__body\" [class]=\"'size-' + (props.size || 'medium')\">\n        <val-text\n          [props]=\"{\n            content: props.text,\n            color: props.textColor,\n            bold: false,\n            size: props.size,\n            allowPartialBold: props.allowPartialBold,\n            processLinks: props.processLinks,\n          }\"\n        ></val-text>\n      </div>\n    </div>\n  `,\n  styleUrls: ['./notes-box.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotesBoxComponent {\n  /** Notes box configuration object. */\n  @Input() props!: NotesBoxMetadata;\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input, computed, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronForwardOutline, openOutline } from 'ionicons/icons';\nimport { PageLink, PageLinksMetadata } from './types';\n\n/**\n * `val-page-links` — stacked list of navigational links with optional dividers.\n * Used for legal/policies, footer link columns, \"about\" sections, etc.\n *\n * Each item can navigate via Angular `routerLink` (SPA) or external `href`.\n * Detects absolute URLs (`http(s)://`) to apply `target=\"_blank\"` by default.\n *\n * @example\n * <val-page-links [props]=\"{\n *   links: [\n *     { label: 'Terms', routerLink: '/legal/terms' },\n *     { label: 'Privacy', routerLink: '/legal/privacy' },\n *     { label: 'Visit main site', href: 'https://myvaltech.com', icon: 'open-outline' },\n *   ],\n * }\"></val-page-links>\n */\n@Component({\n  selector: 'val-page-links',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonIcon],\n  template: `\n    <nav\n      class=\"val-page-links\"\n      [class.no-dividers]=\"props.showDividers === false\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-large]=\"props.size === 'large'\"\n    >\n      @for (link of links(); track link.label; let last = $last) {\n        @if (link.routerLink) {\n          <a\n            class=\"val-page-links__item\"\n            [routerLink]=\"link.routerLink\"\n            [class.is-last]=\"last\"\n            [attr.aria-label]=\"link.ariaLabel || link.label\"\n          >\n            <span class=\"val-page-links__label\">{{ link.label }}</span>\n            @if (link.icon) {\n              <ion-icon class=\"val-page-links__icon\" [name]=\"link.icon\" aria-hidden=\"true\"></ion-icon>\n            } @else {\n              <ion-icon\n                class=\"val-page-links__icon val-page-links__icon--default\"\n                name=\"chevron-forward-outline\"\n                aria-hidden=\"true\"\n              ></ion-icon>\n            }\n          </a>\n        } @else if (link.href) {\n          <a\n            class=\"val-page-links__item\"\n            [href]=\"link.href\"\n            [class.is-last]=\"last\"\n            [attr.target]=\"isExternal(link) ? '_blank' : null\"\n            [attr.rel]=\"isExternal(link) ? 'noopener noreferrer' : null\"\n            [attr.aria-label]=\"link.ariaLabel || link.label\"\n          >\n            <span class=\"val-page-links__label\">{{ link.label }}</span>\n            @if (link.icon) {\n              <ion-icon class=\"val-page-links__icon\" [name]=\"link.icon\" aria-hidden=\"true\"></ion-icon>\n            } @else {\n              <ion-icon\n                class=\"val-page-links__icon val-page-links__icon--default\"\n                [name]=\"isExternal(link) ? 'open-outline' : 'chevron-forward-outline'\"\n                aria-hidden=\"true\"\n              ></ion-icon>\n            }\n          </a>\n        }\n      }\n    </nav>\n  `,\n  styleUrls: ['./page-links.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageLinksComponent {\n  /** Page links configuration object. */\n  @Input({ required: true }) set props(value: PageLinksMetadata) {\n    this._props.set(value);\n  }\n  get props(): PageLinksMetadata {\n    return this._props();\n  }\n\n  private _props = signal<PageLinksMetadata>(\n    { links: [] },\n    {\n      equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),\n    }\n  );\n\n  protected links = computed(() => this._props().links ?? []);\n\n  constructor() {\n    addIcons({ chevronForwardOutline, openOutline });\n  }\n\n  protected isExternal(link: PageLink): boolean {\n    if (link.external !== undefined) return link.external;\n    return !!link.href && /^https?:\\/\\//i.test(link.href);\n  }\n}\n","/**\n * Utilities for handling default values in form inputs based on InputMetadata configuration.\n */\n\nimport { InputMetadata, InputType } from '../../components/types';\n\n/**\n * Resolves the initial value for a form input based on its configuration.\n *\n * @param input - The input metadata configuration\n * @returns The resolved initial value\n *\n * @example\n * // Custom default value\n * const customValue = resolveInputDefaultValue({ withDefault: '2025-06-24', type: InputType.DATE });\n *\n * // Auto default value\n * const autoValue = resolveInputDefaultValue({ withDefault: true, type: InputType.NUMBER });\n *\n * // Explicit value (takes precedence)\n * const explicitValue = resolveInputDefaultValue({ value: 'explicit', withDefault: true, type: InputType.TEXT });\n */\nexport function resolveInputDefaultValue(input: InputMetadata): any {\n  // Explicit value takes precedence\n  if (input.value !== undefined && input.value !== null && input.value !== '') {\n    return parseValueByType(input.value, input.type);\n  }\n\n  // No default configuration\n  if (!input.withDefault) {\n    return null;\n  }\n\n  // Custom default value\n  if (typeof input.withDefault === 'string') {\n    return parseValueByType(input.withDefault, input.type);\n  }\n\n  // Auto default value (withDefault === true)\n  return getAutoDefaultValue(input.type);\n}\n\n/**\n * Parses a string value to the appropriate type based on the input type.\n *\n * @param value - The string value to parse\n * @param type - The input type\n * @returns The parsed value\n */\nfunction parseValueByType(value: string, type: InputType): any {\n  switch (type) {\n    case InputType.DATE:\n      return new Date(value).toISOString();\n    case InputType.NUMBER:\n      return parseFloat(value) || 0;\n    case InputType.CHECK:\n      return value === 'true' || value === '1';\n    case InputType.TEXT:\n    case InputType.EMAIL:\n    case InputType.PASSWORD:\n    case InputType.COMMENT:\n    case InputType.PIN_CODE:\n    case InputType.HOUR:\n    case InputType.RADIO:\n    case InputType.SELECT:\n    case InputType.SEARCH_SELECT:\n    case InputType.FILE:\n    default:\n      return value;\n  }\n}\n\n/**\n * Gets the automatic default value for a given input type.\n *\n * @param type - The input type\n * @returns The auto default value\n */\nfunction getAutoDefaultValue(type: InputType): any {\n  switch (type) {\n    case InputType.DATE:\n      return new Date().toISOString();\n    case InputType.NUMBER:\n      return 0;\n    case InputType.CHECK:\n      return false;\n    case InputType.TEXT:\n    case InputType.EMAIL:\n    case InputType.PASSWORD:\n    case InputType.COMMENT:\n    case InputType.PIN_CODE:\n    case InputType.HOUR:\n    case InputType.RADIO:\n    case InputType.SELECT:\n    case InputType.SEARCH_SELECT:\n    case InputType.FILE:\n    default:\n      return '';\n  }\n}\n\n/**\n * Applies the resolved default value to a FormControl.\n *\n * @param input - The input metadata configuration\n * @example\n * const input = { control: myFormControl, type: InputType.DATE, withDefault: true };\n * applyDefaultValueToControl(input);\n */\nexport function applyDefaultValueToControl(input: InputMetadata): void {\n  if (!input.control) return;\n\n  const defaultValue = resolveInputDefaultValue(input);\n  if (defaultValue !== null) {\n    input.control.setValue(defaultValue);\n    input.control.markAsPristine();\n    input.control.updateValueAndValidity();\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonInput } from '@ionic/angular/standalone';\nimport { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-number-input',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonInput],\n  template: ` <ion-input [formControl]=\"props.control\" type=\"number\" [placeholder]=\"props.placeholder\"></ion-input> `,\n  styleUrls: ['./number-input.component.scss'],\n})\n/**\n * val-number-input\n *\n * A number input field integrated with Angular forms.\n *\n * @example\n * <val-number-input [props]=\"{ control: myControl, placeholder: 'Enter a number' }\"></val-number-input>\n *\n * @input props: InputMetadata - Configuration for the input (form control, placeholder, etc.)\n */\nexport class NumberInputComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the input.\n   * @property placeholder - The placeholder text.\n   */\n  @Input() props: InputMetadata;\n\n  constructor() {}\n\n  ngOnInit() {\n    // Apply default values on initialization\n    if (this.props?.withDefault || this.props?.value) {\n      applyDefaultValueToControl(this.props);\n    }\n  }\n}\n","import { Component, inject, Input, OnInit } from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { IonInput, IonLabel } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { NumberFromToMetadata } from './types';\n\n@Component({\n  selector: 'val-number-from-to',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonInput, IonLabel],\n  template: `\n    <div class=\"number-from-to-container\">\n      <ion-label position=\"stacked\">{{ getFromLabel() }}</ion-label>\n      <ion-input\n        [formControl]=\"fromControl\"\n        type=\"number\"\n        [placeholder]=\"props.fromPlaceholder || props.placeholder\"\n        [min]=\"props.min\"\n        [max]=\"props.max\"\n        [step]=\"props.step\"\n      >\n      </ion-input>\n\n      <ion-label position=\"stacked\">{{ getToLabel() }}</ion-label>\n      <ion-input\n        [formControl]=\"toControl\"\n        type=\"number\"\n        [placeholder]=\"props.toPlaceholder || props.placeholder\"\n        [min]=\"props.min\"\n        [max]=\"props.max\"\n        [step]=\"props.step\"\n      >\n      </ion-input>\n    </div>\n  `,\n  styleUrls: ['./number-from-to.component.scss'],\n})\n/**\n * val-number-from-to\n *\n * A dual number input for specifying a range (from/to values), integrated with Angular forms.\n *\n * @example\n * <val-number-from-to [props]=\"{ fromControl: fromCtrl, toControl: toCtrl, min: 0, max: 100 }\"></val-number-from-to>\n *\n * @input props: NumberFromToMetadata - Configuration for the number range input.\n */\nexport class NumberFromToComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {NumberFromToMetadata}\n   * @property fromControl - The Angular FormControl for the \"from\" value.\n   * @property toControl - The Angular FormControl for the \"to\" value.\n   */\n  @Input() props: NumberFromToMetadata;\n\n  private i18n = inject(I18nService);\n\n  /** Get from label with i18n fallback */\n  getFromLabel(): string {\n    return this.props.fromLabel || this.i18n.t('from');\n  }\n\n  /** Get to label with i18n fallback */\n  getToLabel(): string {\n    return this.props.toLabel || this.i18n.t('to');\n  }\n\n  constructor() {}\n\n  ngOnInit() {\n    // Apply default values if configured\n    if (this.props?.withDefault || this.props?.value) {\n      this.applyDefaultValues();\n    }\n  }\n\n  private applyDefaultValues() {\n    const defaultValue = this.resolveDefaultValue();\n    if (defaultValue !== null) {\n      if (typeof defaultValue === 'object' && defaultValue.from !== undefined) {\n        this.fromControl?.setValue(defaultValue.from);\n        this.toControl?.setValue(defaultValue.to);\n      } else {\n        // Si es un valor simple, aplicarlo a ambos controles\n        this.fromControl?.setValue(defaultValue);\n        this.toControl?.setValue(defaultValue);\n      }\n      this.fromControl?.markAsPristine();\n      this.toControl?.markAsPristine();\n      this.fromControl?.updateValueAndValidity();\n      this.toControl?.updateValueAndValidity();\n    }\n  }\n\n  private resolveDefaultValue(): any {\n    // Explicit value takes precedence\n    if (this.props.value !== undefined && this.props.value !== null && this.props.value !== '') {\n      return this.parseValue(this.props.value);\n    }\n\n    // No default configuration\n    if (!this.props.withDefault) {\n      return null;\n    }\n\n    // Custom default value\n    if (typeof this.props.withDefault === 'string') {\n      return this.parseValue(this.props.withDefault);\n    }\n\n    // Auto default value (withDefault === true)\n    return { from: 0, to: 0 };\n  }\n\n  private parseValue(value: string): any {\n    try {\n      // Try to parse as JSON first (for object values)\n      return JSON.parse(value);\n    } catch {\n      // If not JSON, treat as number\n      const numValue = parseFloat(value) || 0;\n      return { from: numValue, to: numValue };\n    }\n  }\n\n  get fromControl(): FormControl {\n    return this.props.fromControl;\n  }\n\n  get toControl(): FormControl {\n    return this.props.toControl;\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonButton, IonIcon, IonInput } from '@ionic/angular/standalone';\nimport { IconService } from '../../../services/icons.service';\nimport { PresetService } from '../../../services/presets';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-password-input',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonInput, IonButton, IonIcon],\n  template: `\n    <div class=\"input-container\">\n      <ion-input\n        class=\"sign-in__input-password\"\n        [formControl]=\"resolvedProps.control\"\n        [type]=\"hidePassword ? 'password' : 'text'\"\n        [placeholder]=\"resolvedProps.placeholder\"\n      ></ion-input>\n      <ion-button color=\"dark\" fill=\"clear\" (click)=\"hidePassword = !hidePassword\" size=\"small\">\n        <ion-icon slot=\"icon-only\" [name]=\"hidePassword ? 'eye-off-outline' : 'eye-outline'\"></ion-icon>\n      </ion-button>\n    </div>\n  `,\n  styleUrls: ['./password-input.component.scss'],\n})\n/**\n * val-password-input\n *\n * A password input field with show/hide toggle, integrated with Angular forms.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-password-input preset=\"form-field\" [props]=\"{ control: myControl, placeholder: 'Password' }\"></val-password-input>\n *\n * @example Static (backwards compatible):\n * <val-password-input [props]=\"{ control: myControl, placeholder: 'Enter password' }\"></val-password-input>\n *\n * @input preset: string - Name of preset to apply (e.g., 'form-field', 'login')\n * @input props: InputMetadata - Configuration for the input (overrides preset values)\n */\nexport class PasswordInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-password-input preset=\"login\" [props]=\"{ control: ctrl }\"></val-password-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the input.\n   * @property placeholder - The placeholder text.\n   */\n  @Input() props: Partial<InputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: InputMetadata = {} as InputMetadata;\n\n  hidePassword = true;\n\n  constructor(icon: IconService) {}\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('passwordInput', this.preset) as Partial<InputMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as InputMetadata;\n  }\n}\n","import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core';\nimport { NgOtpInputComponent, NgOtpInputConfig, NgOtpInputModule } from 'ng-otp-input';\nimport { PinInputMetadata, PinInputSize } from './types';\n\n/** Size configurations for PIN input boxes */\nconst SIZE_CONFIG: Record<PinInputSize, { width: string; height: string; fontSize: string }> = {\n  small: { width: '40px', height: '44px', fontSize: '24px' },\n  medium: { width: '50px', height: '54px', fontSize: '28px' },\n  large: { width: '58px', height: '60px', fontSize: '32px' },\n};\n\n@Component({\n  selector: 'val-pin-input',\n  standalone: true,\n  imports: [NgOtpInputModule],\n  template: `\n    <div class=\"otp\">\n      <ng-otp-input [formCtrl]=\"props.control\" [config]=\"otpInputConfig\"></ng-otp-input>\n    </div>\n  `,\n  styleUrls: ['./pin-input.component.scss'],\n})\n/**\n * val-pin-input\n *\n * A PIN code input using ng-otp-input, integrated with Angular forms.\n *\n * @example\n * <val-pin-input [props]=\"{ control: myControl }\"></val-pin-input>\n *\n * @input props: PinInputMetadata - Configuration for the PIN input (form control, length, etc.)\n */\nexport class PinInputComponent implements OnInit, AfterViewInit {\n  @ViewChild(NgOtpInputComponent, { static: false }) pinCode: NgOtpInputComponent | undefined;\n\n  /**\n   * Input configuration object.\n   * @type {PinInputMetadata}\n   * @property control - The Angular FormControl for the PIN input.\n   * @property length - Number of digits in PIN (default: 5).\n   */\n  @Input() props: PinInputMetadata;\n\n  codeLength = 5;\n  otpInputConfig: NgOtpInputConfig = {\n    inputStyles: {\n      'font-size': SIZE_CONFIG.medium.fontSize,\n      width: SIZE_CONFIG.medium.width,\n      height: SIZE_CONFIG.medium.height,\n    },\n    inputClass: 'otp-input-box',\n    length: this.codeLength,\n    allowNumbersOnly: true,\n  };\n\n  constructor() {}\n\n  ngOnInit() {\n    // Usar props.length si se proporciona, sino mantener default 5\n    const length = this.props.length ?? 5;\n    // Usar props.size si se proporciona, sino mantener default 'medium'\n    const size = this.props.size ?? 'medium';\n    const sizeStyles = SIZE_CONFIG[size];\n\n    this.otpInputConfig = {\n      ...this.otpInputConfig,\n      length,\n      allowNumbersOnly: this.props.allowNumbersOnly ?? true,\n      inputStyles: {\n        'font-size': sizeStyles.fontSize,\n        width: sizeStyles.width,\n        height: sizeStyles.height,\n        ...this.props.inputStyles, // Allow custom overrides\n      },\n    };\n  }\n\n  ngAfterViewInit() {\n    const initial = this.props?.control?.value;\n    if (initial && this.pinCode) {\n      // ng-otp-input crea sus inputs internos de forma asíncrona —\n      // setValue sincrónico aquí llega antes de que estén listos.\n      setTimeout(() => this.pinCode?.setValue(initial), 0);\n    }\n  }\n\n  reset() {\n    if (this.pinCode) {\n      this.pinCode.setValue('');\n    }\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ProgressBarComponent } from '../../atoms/progress-bar/progress-bar.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleBlockComponent } from '../title-block/title-block.component';\nimport { ProgressStatusMetadata } from './types';\n\n//TODO: support automatic or manual interval for messages. Include the interval number as a parameter.\n@Component({\n  selector: 'val-progress-status',\n  standalone: true,\n  imports: [TitleBlockComponent, ProgressBarComponent, TextComponent],\n  template: `\n    <div class=\"status-container\">\n      <div class=\"title-container\">\n        <val-title-block\n          [props]=\"{\n            position: 'center',\n            aboveTitle: props.titles.aboveTitle,\n            title: props.titles.title,\n            bellowTitle: props.titles.bellowTitle,\n          }\"\n        ></val-title-block>\n      </div>\n      <div class=\"progress-bar-container\">\n        <val-progress-bar\n          [props]=\"{\n            progress: props.progress,\n            size: 'xlarge',\n            color: props.color,\n            rounded: true,\n            type: 'determinate',\n            buffer: 1,\n          }\"\n        ></val-progress-bar>\n      </div>\n      <div class=\"subtitle-container\">\n        <div class=\"subtitle\" [class.blink]=\"blinking\">\n          <val-text [props]=\"{ content: Content, color: 'medium', bold: false, size: props.size }\"></val-text>\n        </div>\n      </div>\n    </div>\n  `,\n  styleUrls: ['./progress-status.component.scss'],\n})\n/**\n * val-progress-status\n *\n * Displays a progress bar with status messages and titles, useful for multi-step or loading processes.\n *\n * @example\n * <val-progress-status [props]=\"{ progress: 0.5, color: 'primary', size: 'medium', titles: {...}, messages: [...] }\"></val-progress-status>\n *\n * @input props: ProgressStatusMetadata - Configuration for the progress status (progress, color, size, titles, messages)\n */\nexport class ProgressStatusComponent implements OnInit {\n  /**\n   * Progress status configuration object.\n   * @type {ProgressStatusMetadata}\n   * @property progress - The progress value (0 to 1).\n   * @property color - The color of the progress bar.\n   * @property size - The size of the text and bar.\n   * @property titles - Title block configuration.\n   * @property messages - Array of status messages.\n   */\n  @Input()\n  props: ProgressStatusMetadata;\n\n  currentIndex = 0;\n  blinking = false;\n\n  constructor() {}\n\n  ngOnInit() {\n    setInterval(() => {\n      this.blinking = !this.blinking;\n    }, 1000);\n\n    setInterval(() => {\n      this.getNextMessage();\n    }, 9000);\n  }\n\n  get Content(): string {\n    return this.props.messages[this.currentIndex];\n  }\n\n  getNextMessage(): void {\n    this.currentIndex = (this.currentIndex + 1) % this.props.messages.length;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { IonText } from '@ionic/angular/standalone';\nimport { BoxComponent } from '../../atoms/box/box.component';\nimport { HrefComponent } from '../../atoms/href/href.component';\nimport { ButtonGroupComponent } from '../button-group/button-group.component';\nimport { PrompterMetadata } from './types';\n\n@Component({\n  selector: 'val-prompter',\n  standalone: true,\n  imports: [CommonModule, IonText, BoxComponent, ButtonGroupComponent, HrefComponent],\n  template: `\n    <val-box\n      class=\"teleprompter-container\"\n      [props]=\"{ icon: '', bordered: props.bordered, color: props.color, leftBorder: false, padding: props.padding }\"\n      (onClick)=\"clickHandler()\"\n    >\n      <div class=\"container\" [class.teleprompter-content]=\"props.teleprompter\" body>\n        <div>\n          <ion-text>\n            <p [class]=\"props.size\" class=\"bold\">{{ props.content }}</p>\n          </ion-text>\n        </div>\n        @if (props.buttons || props.hrefs) {\n          <div class=\"actions-container\">\n            <val-button-group\n              class=\"buttons-container\"\n              [props]=\"{ buttons: props.buttons, position: 'right', columned: false }\"\n              (onClick)=\"clickHandler($event)\"\n            ></val-button-group>\n            <val-href\n              class=\"link\"\n              *ngFor=\"let l of props.hrefs\"\n              [props]=\"l\"\n              (onClick)=\"clickHandler($event)\"\n            ></val-href>\n          </div>\n        }\n      </div>\n    </val-box>\n  `,\n  styleUrls: ['./prompter.component.scss'],\n})\nexport class PrompterComponent {\n  @Input()\n  props: PrompterMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n}\n","import { NgFor } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonRadio, IonRadioGroup } from '@ionic/angular/standalone';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-radio-input',\n  standalone: true,\n  imports: [NgFor, ReactiveFormsModule, IonRadioGroup, IonRadio],\n  template: `\n    <ion-radio-group [allowEmptySelection]=\"true\" [formControl]=\"props.control\">\n      <ng-container *ngFor=\"let o of props.options\">\n        <ion-radio [value]=\"o.id\">{{ o.name }}</ion-radio>\n        <br />\n      </ng-container>\n    </ion-radio-group>\n  `,\n  styleUrls: ['./radio-input.component.scss'],\n})\n/**\n * val-radio-input\n *\n * A radio group input for selecting one option, integrated with Angular forms.\n * For i18n support, provide translated option names in the options array.\n *\n * @example Static options:\n * <val-radio-input [props]=\"{ control: myControl, options: [{ id: '1', name: 'Option 1' }] }\"></val-radio-input>\n *\n * @example With i18n (translate options before passing):\n * ```typescript\n * // In component\n * options = [\n *   { id: '1', name: this.langService.getText('MyComponent', 'option1'), order: 1 },\n *   { id: '2', name: this.langService.getText('MyComponent', 'option2'), order: 2 }\n * ];\n * ```\n *\n * @input props: InputMetadata - Configuration for the radio input (form control, options, etc.)\n */\nexport class RadioInputComponent implements OnInit {\n  /**\n   * Input configuration object.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the radio input.\n   * @property options - The available options for the radio group. For i18n, translate names before passing.\n   */\n  @Input() props: InputMetadata;\n\n  ngOnInit() {}\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonRange, IonLabel } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { RangeInputMetadata, RangeValue } from './types';\nimport { ComponentStates } from '../../types';\n\n@Component({\n  selector: 'val-range-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonRange, IonLabel],\n  template: `\n    @if (displayLabel) {\n      <ion-label>{{ displayLabel }}</ion-label>\n    }\n    <ion-range\n      [formControl]=\"props.control\"\n      [min]=\"props.min ?? 0\"\n      [max]=\"props.max ?? 100\"\n      [step]=\"props.step ?? 1\"\n      [pin]=\"props.pin ?? false\"\n      [pinFormatter]=\"props.pinFormatter || defaultPinFormatter\"\n      [ticks]=\"props.ticks ?? false\"\n      [snaps]=\"props.snaps ?? false\"\n      [color]=\"props.color || 'primary'\"\n      [disabled]=\"props.state === states.DISABLED || props.disabled\"\n      [debounce]=\"props.debounce ?? 0\"\n      [dualKnobs]=\"props.dualKnobs ?? false\"\n      (ionChange)=\"onRangeChange($event)\"\n    >\n      @if (props.startLabel) {\n        <ion-label slot=\"start\">{{ props.startLabel }}</ion-label>\n      }\n      @if (props.endLabel) {\n        <ion-label slot=\"end\">{{ props.endLabel }}</ion-label>\n      }\n    </ion-range>\n  `,\n  styleUrls: ['./range-input.component.scss'],\n})\n/**\n * val-range-input\n *\n * A range/slider input for numeric values, integrated with Angular forms.\n * Supports single value or dual knobs for range selection.\n *\n * @example Single value\n * <val-range-input [props]=\"{\n *   control: volumeControl,\n *   min: 0,\n *   max: 100,\n *   step: 5,\n *   pin: true,\n *   label: 'Volume'\n * }\"></val-range-input>\n *\n * @example Dual knobs for price range\n * <val-range-input [props]=\"{\n *   control: priceControl,\n *   min: 0,\n *   max: 1000,\n *   dualKnobs: true,\n *   pin: true,\n *   pinFormatter: (v) => '$' + v,\n *   startLabel: '$0',\n *   endLabel: '$1000'\n * }\"></val-range-input>\n *\n * @input props: RangeInputMetadata - Configuration for the range input\n * @output rangeChange: RangeValue - Emits when the range value changes\n */\nexport class RangeInputComponent {\n  /**\n   * Input configuration object.\n   * @type {RangeInputMetadata}\n   */\n  @Input() props: RangeInputMetadata;\n\n  /**\n   * Emits the new value when the range changes.\n   */\n  @Output() rangeChange = new EventEmitter<number | RangeValue>();\n\n  states = ComponentStates;\n\n  defaultPinFormatter = (value: number): string => `${value}`;\n\n  get displayLabel(): string {\n    return this.props.label || this.props.contentFallback || '';\n  }\n\n  onRangeChange(event: CustomEvent): void {\n    const value = event.detail.value;\n    this.rangeChange.emit(value);\n\n    // Update lower/upper controls if using dual knobs\n    if (this.props.dualKnobs && typeof value === 'object') {\n      if (this.props.lowerControl) {\n        this.props.lowerControl.setValue(value.lower);\n      }\n      if (this.props.upperControl) {\n        this.props.upperControl.setValue(value.upper);\n      }\n    }\n  }\n}\n","import { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { IonSearchbar } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { PresetService } from '../../../services/presets';\nimport { SearchbarMetadata } from './types';\n\n@Component({\n  selector: 'val-searchbar',\n  standalone: true,\n  imports: [IonSearchbar],\n  template: `\n    <ion-searchbar\n      [mode]=\"resolvedProps.mode || 'ios'\"\n      [debounce]=\"resolvedProps.debounce || 500\"\n      [placeholder]=\"getPlaceholder()\"\n      [disabled]=\"resolvedProps.disabled\"\n      [showCancelButton]=\"resolvedProps.showCancelButton || 'focus'\"\n      [cancelButtonText]=\"getCancelText()\"\n      (ionInput)=\"onSearch($event)\"\n      (ionBlur)=\"onBlur()\"\n      (ionFocus)=\"onFocus()\"\n    >\n    </ion-searchbar>\n  `,\n  styleUrls: ['./searchbar.component.scss'],\n})\n/**\n * val-searchbar\n *\n * A search bar component with debounce and event emitters for filtering, focus, and blur.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-searchbar preset=\"default\" (filterEvent)=\"onFilter($event)\"></val-searchbar>\n *\n * @example With props:\n * <val-searchbar [props]=\"{ placeholder: 'Search...', debounce: 300 }\"></val-searchbar>\n *\n * @input preset: string - Name of preset to apply\n * @input props: SearchbarMetadata - Configuration for the searchbar\n * @output filterEvent - Emits the search term on input.\n * @output focusEvent - Emits when the searchbar gains focus.\n * @output blurEvent - Emits when the searchbar loses focus.\n */\nexport class SearchbarComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n  private i18n = inject(I18nService);\n\n  /**\n   * Preset name to apply.\n   */\n  @Input() preset?: string;\n\n  /**\n   * Configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<SearchbarMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: SearchbarMetadata = {};\n\n  /**\n   * Emits the search term on input.\n   */\n  @Output() filterEvent = new EventEmitter<string>();\n\n  /**\n   * Emits when the searchbar gains focus.\n   */\n  @Output() focusEvent = new EventEmitter<void>();\n\n  /**\n   * Emits when the searchbar loses focus.\n   */\n  @Output() blurEvent = new EventEmitter<void>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('searchbar', this.preset) as Partial<SearchbarMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    };\n  }\n\n  /** Get placeholder text */\n  getPlaceholder(): string {\n    return this.resolvedProps.placeholder || this.i18n.t('search');\n  }\n\n  /** Get cancel button text */\n  getCancelText(): string {\n    return this.resolvedProps.cancelText || this.i18n.t('cancel');\n  }\n\n  onSearch($event: any) {\n    const searchTerm = $event.detail.value;\n    this.filterEvent.emit(searchTerm);\n  }\n\n  onFocus() {\n    this.focusEvent.emit();\n  }\n\n  onBlur() {\n    this.blurEvent.emit();\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';\nimport { IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { PresetService } from '../../../services/presets';\nimport { InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-select-input',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonSelect, IonSelectOption],\n  template: `\n    <ion-select\n      [formControl]=\"resolvedProps.control\"\n      [label]=\"resolvedProps.label\"\n      [interfaceOptions]=\"customPopoverOptions\"\n      [interface]=\"resolvedProps.selectInterface || 'popover'\"\n      [placeholder]=\"resolvedProps.placeholder\"\n      [cancelText]=\"cancelText\"\n      [okText]=\"okText\"\n    >\n      @for (o of resolvedProps.options; track o.id) {\n        <ion-select-option [value]=\"o.id\">{{ o.name }}</ion-select-option>\n      }\n    </ion-select>\n  `,\n  styleUrls: ['./select-input.component.scss'],\n})\n/**\n * val-select-input\n *\n * A select/dropdown input integrated with Angular forms, using Ionic's select component.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-select-input preset=\"form-field\" [props]=\"{\n *   control: myControl,\n *   label: 'Seleccionar',\n *   options: [{ id: '1', name: 'Opción 1' }]\n * }\"></val-select-input>\n *\n * @example Static (backwards compatible):\n * <val-select-input [props]=\"{\n *   control: myControl,\n *   label: 'Seleccionar',\n *   options: [{ id: '1', name: 'Opción 1' }],\n *   cancelText: 'Cancelar',\n *   okText: 'Aceptar'\n * }\"></val-select-input>\n *\n * @input preset: string - Name of preset to apply (e.g., 'form-field')\n * @input props: InputMetadata - Configuration for the select input (overrides preset values)\n */\nexport class SearchSelectorComponent implements OnInit, OnChanges {\n  private i18n = inject(I18nService);\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-select-input preset=\"form-field\" [props]=\"{ control: ctrl, options: opts }\"></val-select-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the select input.\n   * @property label - The label for the select.\n   * @property options - The available options for the select.\n   * @property placeholder - The placeholder text.\n   * @property modalHeader - Custom header text for the modal (optional, uses label if not provided).\n   * @property cancelText - Custom cancel button text (default: 'Cancelar').\n   * @property okText - Custom OK button text (default: 'Aceptar').\n   */\n  @Input() props: Partial<InputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: InputMetadata = {} as InputMetadata;\n\n  customModalOptions: { header: string; breakpoints: number[]; initialBreakpoint: number };\n  customPopoverOptions: { cssClass: string };\n  cancelText: string;\n  okText: string;\n\n  ngOnInit() {\n    this.resolveProps();\n    this.setupComponent();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      this.setupComponent();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('selectInput', this.preset) as Partial<InputMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as InputMetadata;\n  }\n\n  private setupComponent(): void {\n    if (this.resolvedProps?.withDefault || this.resolvedProps?.value) {\n      applyDefaultValueToControl(this.resolvedProps);\n    }\n\n    // Set modal header from props or use label as fallback, then i18n default\n    const headerText = this.resolvedProps.modalHeader || this.resolvedProps.label || this.i18n.t('selectOption');\n\n    this.customModalOptions = {\n      header: headerText,\n      breakpoints: [0, 0.6],\n      initialBreakpoint: 0.6,\n    };\n    this.customPopoverOptions = { cssClass: 'val-select-popover' };\n\n    // Set button texts from props or use i18n defaults.\n    // Fallback chain: namespace-less i18n → 'Common' namespace → hardcoded.\n    // El namespace-less busca en _global; si no existe (caso typical app),\n    // probamos en 'Common' que la mayoría de apps tienen poblado.\n    this.cancelText = this.resolvedProps.cancelText || this.resolveI18n('cancel', 'Cancelar');\n    this.okText = this.resolvedProps.okText || this.resolveI18n('ok', 'OK');\n  }\n\n  /**\n   * Busca un key en `_global` primero, luego en `Common`, finalmente cae al\n   * default hardcoded. Útil para textos cross-cutting (cancel/ok/close/etc.)\n   * sin obligar a cada app a duplicarlos en cada namespace.\n   */\n  private resolveI18n(key: string, fallback: string): string {\n    const tryGlobal = this.i18n.t(key);\n    if (tryGlobal && !tryGlobal.startsWith('[')) return tryGlobal;\n    const tryCommon = this.i18n.t(key, 'Common');\n    if (tryCommon && !tryCommon.startsWith('[')) return tryCommon;\n    return fallback;\n  }\n}\n","/**\n * Removes diacritical marks (accents) from a string using Unicode normalization.\n * Useful for text search and comparison.\n *\n * @param text The input string\n * @returns The normalized string without diacritical marks\n *\n * @example\n * replaceSpecialChars('canción') // returns 'cancion'\n */\nexport const replaceSpecialChars = (text: string) =>\n  text.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { IonicModule, IonModal } from '@ionic/angular';\nimport { Subscription } from 'rxjs';\nimport { I18nService } from '../../../services/i18n';\nimport { IconService } from '../../../services/icons.service';\nimport { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';\nimport { replaceSpecialChars } from '../../../shared/utils/text';\nimport { InputMetadata, InputOption } from '../../types';\nimport { SearchbarComponent } from '../searchbar/searchbar.component';\n\n@Component({\n  selector: 'val-select-search',\n  standalone: true,\n  imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule],\n  template: `\n    <ion-input\n      type=\"text\"\n      [value]=\"displayValue\"\n      [placeholder]=\"getPlaceholder()\"\n      readonly\n      (mousedown)=\"preventDefaultBehavior($event)\"\n    />\n\n    <ion-input style=\"position: absolute;\" [formControl]=\"props.control\" type=\"hidden\"></ion-input>\n\n    <ion-modal\n      #modal\n      trigger=\"open-modal\"\n      [initialBreakpoint]=\"1\"\n      [breakpoints]=\"[0, 0.5, 0.75, 1]\"\n      (didDismiss)=\"resetState()\"\n    >\n      <ng-template>\n        <ion-header>\n          <ion-toolbar>\n            <ion-title>{{ getLabel() }}</ion-title>\n            <ion-buttons slot=\"end\">\n              <ion-button (click)=\"cancelModal()\">{{ getCloseText() }}</ion-button>\n            </ion-buttons>\n          </ion-toolbar>\n          <ion-toolbar>\n            <val-searchbar (filterEvent)=\"onFilter($event)\" (focusEvent)=\"onFocus()\" (blurEvent)=\"onBlur()\" />\n          </ion-toolbar>\n        </ion-header>\n        <ion-content>\n          <ion-list>\n            <ion-item *ngFor=\"let item of filteredItems\" button (click)=\"selectItem(item)\" detail=\"false\">\n              <ion-label>{{ item[labelProperty] }}</ion-label>\n              <ion-icon *ngIf=\"isItemSelected(item)\" name=\"checkmark-outline\" slot=\"end\" color=\"primary\"></ion-icon>\n            </ion-item>\n            <ion-item *ngIf=\"filteredItems.length === 0\" lines=\"none\">\n              <ion-label color=\"dark\">{{ getNoResultsText() }}</ion-label>\n            </ion-item>\n          </ion-list>\n        </ion-content>\n      </ng-template>\n    </ion-modal>\n  `,\n  styles: [\n    `\n      ion-header {\n        padding: 8px 8px 0px 8px;\n      }\n    `,\n  ],\n})\n/**\n * val-select-search\n *\n * A searchable select/dropdown input with modal and filtering, integrated with Angular forms.\n *\n * @example\n * <val-select-search [props]=\"{ control: myControl, label: 'Choose', options: [{ id: '1', name: 'Option 1' }] }\"></val-select-search>\n *\n * @input props: InputMetadata - Configuration for the select input (form control, label, options, etc.)\n */\nexport class SelectSearchComponent implements OnChanges, OnDestroy {\n  @ViewChild('modal') modal!: IonModal;\n\n  @Input() label: string = '';\n  @Input() labelProperty: string = 'name';\n  @Input() valueProperty: string = 'id';\n  @Input() multiple: boolean = false;\n  @Input() placeholder: string = '';\n  /**\n   * Input configuration object.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the select input.\n   * @property label - The label for the select.\n   * @property options - The available options for the select.\n   * @property placeholder - The placeholder text.\n   */\n  @Input() props: InputMetadata & { mode?: 'legacy' | 'strict' };\n\n  icon = inject(IconService);\n  private changeDetector = inject(ChangeDetectorRef);\n  private i18n = inject(I18nService);\n\n  /** Get resolved label with i18n fallback */\n  getLabel(): string {\n    return this.label || this.i18n.t('select');\n  }\n\n  /** Get resolved placeholder with i18n fallback */\n  getPlaceholder(): string {\n    return this.props?.placeholder || this.placeholder || this.i18n.t('selectOption');\n  }\n\n  /** Get close button text */\n  getCloseText(): string {\n    return this.i18n.t('close');\n  }\n\n  /** Get no results text */\n  getNoResultsText(): string {\n    return this.i18n.t('noResults');\n  }\n\n  /** Get items selected text */\n  getItemsSelectedText(count: number): string {\n    return `${count} ${this.i18n.t('itemsSelected')}`;\n  }\n\n  searchTerm: string = '';\n  filteredItems: InputOption[] = [];\n  selectedItems: InputOption[] = [];\n  displayValue: string = '';\n\n  private previousOptions: any[] = [];\n  private isProcessingChanges = false;\n  private valueChangesSubscription?: Subscription;\n\n  ngOnInit() {\n    this.applyDefaultValue();\n    this.initializeItems();\n    this.syncControlValueWithSelectedItems();\n    this.updateDisplayValue();\n    this.subscribeToValueChanges();\n  }\n\n  ngOnDestroy() {\n    // Limpiar suscripciones para evitar memory leaks\n    if (this.valueChangesSubscription) {\n      this.valueChangesSubscription.unsubscribe();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Evitar bucles infinitos\n    if (this.isProcessingChanges) {\n      return;\n    }\n\n    // Cuando cambia props o props.options\n    if (changes['props']) {\n      try {\n        this.isProcessingChanges = true;\n\n        // Desuscribirse del antiguo control si existe\n        if (this.valueChangesSubscription) {\n          this.valueChangesSubscription.unsubscribe();\n        }\n\n        if (this.props?.options) {\n          // Verificar si las opciones han cambiado realmente\n          const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);\n\n          if (optionsChanged) {\n            this.previousOptions = [...this.props.options];\n            this.initializeItems();\n          }\n        }\n\n        // Sincronizar con el nuevo control si existe\n        this.syncControlValueWithSelectedItems();\n        this.updateDisplayValue();\n\n        // Suscribirse al nuevo control\n        this.subscribeToValueChanges();\n      } finally {\n        this.isProcessingChanges = false;\n      }\n    }\n  }\n\n  ionViewWillEnter(): void {\n    if (this.isProcessingChanges) {\n      return;\n    }\n\n    try {\n      this.isProcessingChanges = true;\n      this.initializeItems();\n      this.syncControlValueWithSelectedItems();\n      this.updateDisplayValue();\n      this.subscribeToValueChanges();\n    } finally {\n      this.isProcessingChanges = false;\n    }\n  }\n\n  // Suscribirse a cambios en el FormControl\n  private subscribeToValueChanges() {\n    if (!this.props?.control) return;\n\n    this.valueChangesSubscription = this.props.control.valueChanges.subscribe(value => {\n      if (this.isProcessingChanges) return;\n\n      try {\n        this.isProcessingChanges = true;\n        this.syncControlValueWithSelectedItems();\n        this.updateDisplayValue();\n      } finally {\n        this.isProcessingChanges = false;\n      }\n    });\n  }\n\n  // Compara si dos arrays de opciones son iguales\n  private areOptionsEqual(prevOptions: any[], newOptions: any[]): boolean {\n    // PERF: Use reference equality first for fast path\n    if (prevOptions === newOptions) return true;\n    if (!prevOptions || !newOptions) return prevOptions === newOptions;\n    if (prevOptions.length !== newOptions.length) return false;\n    // Only compare valueProperty for equality\n    for (let i = 0; i < prevOptions.length; i++) {\n      if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  private initializeItems(): void {\n    // PERF: Avoid unnecessary array copies\n    this.filteredItems = this.props?.options || [];\n  }\n\n  private syncControlValueWithSelectedItems(): void {\n    if (!this.props?.control) {\n      this.selectedItems = [];\n      return;\n    }\n    const controlValue = this.props.control.value;\n    if (this.props.mode === 'legacy') {\n      // Permisivo: muestra el valor aunque no esté en las opciones\n      if (controlValue !== null && controlValue !== undefined) {\n        this.displayValue = controlValue.toString();\n        this.selectedItems = [];\n        return;\n      }\n    } else {\n      // Estricto: solo muestra si coincide con una opción\n      if (controlValue === null || controlValue === undefined) {\n        this.selectedItems = [];\n        return;\n      }\n      if (this.props.options && this.props.options.length > 0) {\n        const map = new Map(this.props.options.map(opt => [opt[this.valueProperty], opt]));\n        const selectedOption = map.get(controlValue);\n        this.selectedItems = selectedOption ? [selectedOption] : [];\n      } else {\n        this.selectedItems = [];\n      }\n    }\n  }\n\n  private applyDefaultValue(): void {\n    applyDefaultValueToControl(this.props);\n  }\n\n  onFilter(event) {\n    // If no search term, show all options\n    if (!event || event.trim() === '') {\n      this.filteredItems = this.props?.options ? [...this.props.options] : [];\n      this.changeDetector.detectChanges();\n      return;\n    }\n\n    // If no options, nothing to filter\n    if (!this.props?.options || this.props.options.length === 0) {\n      this.filteredItems = [];\n      this.changeDetector.detectChanges();\n      return;\n    }\n\n    // PERF: Avoid repeated replaceSpecialChars and toLowerCase for each option\n    const search = replaceSpecialChars(event.toLowerCase());\n    this.filteredItems = this.props.options.filter(element => {\n      // Only use labelProperty and valueProperty for filtering (faster)\n      const label = element[this.labelProperty]\n        ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())\n        : '';\n      const value = element[this.valueProperty]\n        ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())\n        : '';\n      return label.includes(search) || value.includes(search);\n    });\n    this.changeDetector.detectChanges();\n  }\n\n  onFocus() {\n    console.log('onFocus');\n  }\n\n  onBlur() {\n    console.log('onBlur');\n  }\n\n  openModal() {\n    if (this.modal) {\n      this.modal.present();\n    }\n  }\n\n  preventDefaultBehavior(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.openModal();\n  }\n\n  /**\n   * Reset state only - called by didDismiss event\n   * Separated from closeModal to avoid double dismissal and scroll issues\n   */\n  resetState(): void {\n    this.searchTerm = '';\n    this.filteredItems = this.props?.options ? [...this.props.options] : [];\n  }\n\n  /**\n   * Close modal only - does not reset state (didDismiss will handle that)\n   */\n  closeModal(): void {\n    if (this.modal) {\n      this.modal.dismiss();\n    }\n  }\n\n  /**\n   * @deprecated Use closeModal() instead. Kept for backwards compatibility.\n   */\n  cancelModal(): void {\n    this.closeModal();\n  }\n\n  selectItem(item: any) {\n    if (this.multiple) {\n      const index = this.selectedItems.findIndex(\n        selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]\n      );\n\n      if (index === -1) {\n        this.selectedItems.push(item);\n      } else {\n        this.selectedItems.splice(index, 1);\n      }\n    } else {\n      this.selectedItems = [item];\n      this.closeModal();\n    }\n\n    this.updateDisplayValue();\n    this.applyChanges();\n  }\n\n  isItemSelected(item: any): boolean {\n    return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);\n  }\n\n  updateDisplayValue() {\n    if (this.props?.mode === 'legacy' && this.selectedItems.length === 0 && this.props?.control?.value) {\n      this.displayValue = this.props.control.value.toString();\n      return;\n    }\n    if (this.selectedItems.length === 0) {\n      this.displayValue = '';\n      return;\n    }\n    if (this.multiple) {\n      if (this.selectedItems.length === 1) {\n        this.displayValue = this.selectedItems[0][this.labelProperty];\n      } else {\n        this.displayValue = this.getItemsSelectedText(this.selectedItems.length);\n      }\n    } else {\n      this.displayValue = this.selectedItems[0][this.labelProperty];\n    }\n  }\n\n  applyChanges() {\n    if (!this.props?.control) {\n      return;\n    }\n\n    try {\n      this.isProcessingChanges = true;\n\n      if (this.selectedItems.length > 0) {\n        this.props.control.setValue(this.selectedItems[0][this.valueProperty]);\n      } else {\n        this.props.control.setValue(null);\n      }\n\n      this.props.control.markAsDirty();\n      this.props.control.updateValueAndValidity();\n    } finally {\n      this.isProcessingChanges = false;\n    }\n  }\n\n  // Método público para reiniciar el componente\n  reset() {\n    this.selectedItems = [];\n    this.displayValue = '';\n    if (this.props?.control) {\n      this.props.control.setValue(null);\n    }\n    this.changeDetector.detectChanges();\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonSegment, IonSegmentButton, IonLabel, IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { SegmentControlMetadata, SegmentOption } from './types';\nimport { ComponentStates } from '../../types';\nimport { addIcons } from 'ionicons';\nimport { list, grid, apps, menu, settings, home, search, person, heart, star } from 'ionicons/icons';\n\n// Register common icons\naddIcons({ list, grid, apps, menu, settings, home, search, person, heart, star });\n\n@Component({\n  selector: 'val-segment-control',\n  standalone: true,\n  imports: [CommonModule, IonSegment, IonSegmentButton, IonLabel, IonIcon],\n  template: `\n    <ion-segment\n      [value]=\"resolvedProps.value\"\n      [color]=\"resolvedProps.color || 'primary'\"\n      [disabled]=\"resolvedProps.state === states.DISABLED || resolvedProps.disabled\"\n      [scrollable]=\"resolvedProps.scrollable ?? false\"\n      [swipeGesture]=\"resolvedProps.swipeGesture ?? false\"\n      [mode]=\"resolvedProps.mode\"\n      (ionChange)=\"onSegmentChange($event)\"\n    >\n      @for (option of resolvedProps.options; track option.value) {\n        <ion-segment-button [value]=\"option.value\" [disabled]=\"option.disabled\" [layout]=\"option.layout || 'icon-top'\">\n          @if (option.icon) {\n            <ion-icon [name]=\"option.icon\"></ion-icon>\n          }\n          @if (getOptionLabel(option)) {\n            <ion-label>{{ getOptionLabel(option) }}</ion-label>\n          }\n        </ion-segment-button>\n      }\n    </ion-segment>\n  `,\n  styleUrls: ['./segment-control.component.scss'],\n})\n/**\n * val-segment-control\n *\n * A segmented control for switching between views or options.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-segment-control preset=\"view-toggle\" [props]=\"{ options: [...] }\"></val-segment-control>\n *\n * @example Basic usage\n * <val-segment-control [props]=\"{\n *   options: [\n *     { value: 'list', label: 'List', icon: 'list' },\n *     { value: 'grid', label: 'Grid', icon: 'grid' }\n *   ],\n *   value: 'list'\n * }\" (segmentChange)=\"onViewChange($event)\"></val-segment-control>\n *\n * @input preset: string - Name of preset to apply\n * @input props: SegmentControlMetadata - Configuration for the segment control\n * @output segmentChange: string - Emits the selected value when changed\n */\nexport class SegmentControlComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable segment configurations.\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<SegmentControlMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: SegmentControlMetadata = {} as SegmentControlMetadata;\n\n  /**\n   * Emits the selected value when the segment changes.\n   */\n  @Output() segmentChange = new EventEmitter<string>();\n\n  states = ComponentStates;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('segmentControl', this.preset) as Partial<SegmentControlMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as SegmentControlMetadata;\n  }\n\n  onSegmentChange(event: CustomEvent): void {\n    const value = event.detail.value;\n    this.segmentChange.emit(value);\n  }\n\n  getOptionLabel(option: SegmentOption): string {\n    return option.label || option.contentFallback || '';\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonInput } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';\nimport { ComponentStates, InputMetadata } from '../../types';\n\n@Component({\n  selector: 'val-text-input',\n  standalone: true,\n  imports: [ReactiveFormsModule, IonInput],\n  template: ` <ion-input [formControl]=\"resolvedProps.control\" type=\"text\" [placeholder]=\"resolvedProps.placeholder\" /> `,\n  styleUrls: ['./text-input.component.scss'],\n})\n/**\n * val-text-input\n *\n * A text input field integrated with Angular forms.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-text-input preset=\"form-field\" [props]=\"{ control: myControl, placeholder: 'Enter text' }\"></val-text-input>\n *\n * @example Static (backwards compatible):\n * <val-text-input [props]=\"{ control: myControl, placeholder: 'Enter text' }\"></val-text-input>\n *\n * @input preset: string - Name of preset to apply (e.g., 'form-field', 'search')\n * @input props: InputMetadata - Configuration for the input (overrides preset values)\n */\nexport class TextInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable input configurations\n   * (size, fill, labelPosition, etc.) that can be registered at app level.\n   *\n   * @example\n   * <val-text-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-text-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {InputMetadata}\n   * @property control - The Angular FormControl for the input.\n   * @property placeholder - The placeholder text.\n   * @property label, name, hint, type, validators, etc. - See InputMetadata for all options.\n   */\n  @Input() props: Partial<InputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   * Preset values are overridden by explicit props.\n   */\n  resolvedProps: InputMetadata = {} as InputMetadata;\n\n  states = ComponentStates;\n\n  ngOnInit() {\n    this.resolveProps();\n    // Apply default values on initialization\n    if (this.resolvedProps?.withDefault || this.resolvedProps?.value) {\n      applyDefaultValueToControl(this.resolvedProps);\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('textInput', this.preset) as Partial<InputMetadata>) : {};\n\n    // Merge: preset defaults < explicit props\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as InputMetadata;\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonToggle } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { ToggleInputMetadata } from './types';\nimport { ComponentStates } from '../../types';\n\n@Component({\n  selector: 'val-toggle-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonToggle],\n  template: `\n    <ion-toggle\n      [formControl]=\"resolvedProps.control\"\n      [color]=\"resolvedProps.color || 'primary'\"\n      [disabled]=\"resolvedProps.state === states.DISABLED || resolvedProps.disabled\"\n      [labelPlacement]=\"resolvedProps.labelPosition || 'end'\"\n      [justify]=\"resolvedProps.justify || 'start'\"\n    >\n      {{ getDisplayLabel() }}\n    </ion-toggle>\n  `,\n  styleUrls: ['./toggle-input.component.scss'],\n})\n/**\n * val-toggle-input\n *\n * A toggle/switch input for boolean values, integrated with Angular forms.\n *\n * @example\n * <val-toggle-input [props]=\"{\n *   control: myBooleanControl,\n *   label: 'Activar notificaciones',\n *   color: 'primary',\n *   labelPosition: 'end'\n * }\"></val-toggle-input>\n *\n * @input props: ToggleInputMetadata - Configuration for the toggle input\n */\nexport class ToggleInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable toggle input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-toggle-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-toggle-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Input configuration object. Values here override preset values.\n   * @type {ToggleInputMetadata}\n   */\n  @Input() props: Partial<ToggleInputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: ToggleInputMetadata = {} as ToggleInputMetadata;\n\n  states = ComponentStates;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('toggleInput', this.preset) as Partial<ToggleInputMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as ToggleInputMetadata;\n  }\n\n  getDisplayLabel(): string {\n    return this.resolvedProps.label || this.resolvedProps.contentFallback || '';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { Clipboard } from '@capacitor/clipboard';\nimport { ToastController } from '@ionic/angular';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport * as Prism from 'prismjs';\nimport { I18nService } from '../../../services/i18n';\n\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-markup';\nimport 'prismjs/components/prism-typescript';\nimport { CodeDisplayMetadata } from './types';\n\n@Component({\n  selector: 'val-code-display',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonButton],\n  template: `\n    <div class=\"code-viewer-container\">\n      <div class=\"tab-bar\">\n        <div\n          class=\"tab\"\n          *ngFor=\"let tab of props.tabs; let i = index\"\n          [class.active]=\"i === selectedTab\"\n          (click)=\"selectTab(i)\"\n        >\n          <span class=\"tab-label\">{{ tab.label }}</span>\n        </div>\n      </div>\n      <div class=\"code-content\">\n        <div class=\"copy-button-wrapper\">\n          <ion-button fill=\"clear\" class=\"copy-button\" (click)=\"copyToClipboard()\">\n            <ion-icon name=\"copy-outline\"></ion-icon>\n          </ion-button>\n        </div>\n        <pre><code [class]=\"'language-' + (props.tabs[selectedTab]?.language || props.language)\" #codeElement></code></pre>\n      </div>\n    </div>\n  `,\n\n  styleUrl: './code-display.component.scss',\n})\nexport class CodeDisplayComponent implements AfterViewInit, OnChanges {\n  @ViewChild('codeElement') codeElement!: ElementRef<HTMLElement>;\n\n  @Input() props: CodeDisplayMetadata;\n\n  private toast = inject(ToastController);\n  private i18n = inject(I18nService);\n  selectedTab: number = 0;\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['code'] || changes['language'] || changes['tabs']) {\n      this.cdr.detectChanges();\n      setTimeout(() => this.highlightCode());\n    }\n  }\n\n  ngAfterViewInit() {\n    setTimeout(() => this.highlightCode());\n  }\n\n  selectTab(i: number) {\n    this.selectedTab = i;\n    this.cdr.detectChanges();\n    setTimeout(() => this.highlightCode());\n  }\n\n  private highlightCode() {\n    if (this.codeElement) {\n      const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;\n      this.codeElement.nativeElement.textContent = code || '';\n      Prism.highlightElement(this.codeElement.nativeElement);\n    }\n  }\n\n  async copyToClipboard() {\n    try {\n      const code = this.props.tabs.length > 0 ? this.props.tabs[this.selectedTab]?.code : this.props.code;\n      await Clipboard.write({ string: code || '' });\n      this.presentToast(this.i18n.t('copiedToClipboard'));\n    } catch (error) {\n      console.error('Error al copiar al portapapeles:', error);\n    }\n  }\n\n  async presentToast(message: string) {\n    const toast = await this.toast.create({\n      message: message,\n      duration: 2000,\n      position: 'bottom',\n      color: 'dark',\n    });\n    toast.present();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input } from '@angular/core';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ActionHeaderMetadata } from './types';\n\n/**\n * `val-action-header` — heading with a right-aligned action button.\n *\n * By default renders the heading via `val-display` (hero size). Set\n * `headingKind: 'title'` to render via `val-title` (section size) so it\n * matches `val-title` section labels elsewhere on the same screen.\n *\n * @example Section heading (matches `val-title size='medium'` on the page):\n * <val-action-header [props]=\"{\n *   headingKind: 'title',\n *   title: { size: 'medium', color: 'dark', bold: true, content: 'Active sessions' },\n *   action: { text: 'Sign out all', color: 'dark', fill: 'outline', size: 'small', ... },\n * }\"></val-action-header>\n *\n * @example Page hero (default):\n * <val-action-header [props]=\"{\n *   title: { size: 'large', color: 'dark', content: 'Settings' },\n *   action: { ... },\n * }\"></val-action-header>\n */\n@Component({\n  selector: 'val-action-header',\n  standalone: true,\n  imports: [CommonModule, DisplayComponent, TitleComponent, ButtonComponent],\n  template: `\n    <section class=\"header-content-container\">\n      @if (props.headingKind === 'title') {\n        <val-title [props]=\"$any(props.title)\" />\n      } @else {\n        <val-display [props]=\"$any(props.title)\" />\n      }\n      <val-button [props]=\"props.action\" />\n    </section>\n  `,\n  styles: `\n    .header-content-container {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 12px;\n    }\n  `,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ActionHeaderComponent {\n  @Input() props!: ActionHeaderMetadata;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { IonIcon, IonRippleEffect } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { PillActionEvent, PillClickEvent, PillMetadata } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n@Component({\n  selector: 'val-pill',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonRippleEffect],\n  template: `\n    @if (isNotificationPill) {\n      <!-- Notification mode -->\n      <div class=\"notif-pill\" [attr.aria-live]=\"'polite'\">\n        @if (resolvedProps.notification?.icon) {\n          <div class=\"notif-pill__icon-wrap\" [style.color]=\"getIconColor()\">\n            <ion-icon [name]=\"resolvedProps.notification!.icon!\" />\n          </div>\n        }\n\n        <div class=\"notif-pill__content\">\n          @if (resolvedProps.notification?.time) {\n            <span class=\"notif-pill__time\">{{ resolvedProps.notification!.time }}</span>\n          }\n          <span class=\"notif-pill__title\">{{ resolvedProps.notification!.title }}</span>\n          @if (resolvedProps.notification?.body) {\n            <span class=\"notif-pill__body\">{{ resolvedProps.notification!.body }}</span>\n          }\n        </div>\n\n        @if (resolvedProps.notification?.actions?.length) {\n          <div class=\"notif-pill__actions\">\n            @for (action of resolvedProps.notification!.actions!; track action.token) {\n              <button\n                class=\"notif-pill__action-btn\"\n                [attr.aria-label]=\"action.ariaLabel || action.token\"\n                (click)=\"onActionClick(action.token, $event)\"\n              >\n                <ion-icon [name]=\"action.icon\" />\n              </button>\n            }\n          </div>\n        }\n      </div>\n    } @else if (isTextPill) {\n      <!-- Badge mode -->\n      <span\n        class=\"val-pill\"\n        [class.val-pill--clickable]=\"resolvedProps.clickable\"\n        [class.val-pill--solid]=\"resolvedProps.solid\"\n        [class.val-pill--small]=\"pillSize === 'small'\"\n        [class.val-pill--medium]=\"pillSize === 'medium'\"\n        [class.val-pill--large]=\"pillSize === 'large'\"\n        [class.val-pill--w-normal]=\"pillWeight === 'normal'\"\n        [class.val-pill--w-medium]=\"pillWeight === 'medium'\"\n        [class.val-pill--w-bold]=\"pillWeight === 'bold'\"\n        [style.--val-pill-color]=\"'var(--ion-color-' + pillColor + ')'\"\n        [style.--val-pill-color-rgb]=\"'var(--ion-color-' + pillColor + '-rgb)'\"\n        [style.--val-pill-color-contrast]=\"'var(--ion-color-' + pillColor + '-contrast)'\"\n        [attr.role]=\"resolvedProps.clickable ? 'button' : null\"\n        [attr.tabindex]=\"resolvedProps.clickable ? 0 : null\"\n        [attr.aria-label]=\"resolvedProps.clickable ? resolvedProps.ariaLabel || resolvedProps.label : null\"\n        (click)=\"onPillClick()\"\n        (keydown.enter)=\"onPillClick()\"\n        (keydown.space)=\"onPillClick($event)\"\n      >\n        @if (resolvedProps.icon) {\n          <ion-icon class=\"val-pill__icon\" [name]=\"resolvedProps.icon\" />\n        }\n        <span class=\"val-pill__label\">{{ resolvedProps.label }}</span>\n      </span>\n    }\n  `,\n  styleUrls: ['./pill.component.scss'],\n})\nexport class PillComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /** Optional preset name registered via provideValtechPresets(). */\n  @Input() preset?: string;\n\n  /** Pill configuration. Overrides preset values when both are set. */\n  @Input() props: Partial<PillMetadata> = {};\n\n  /** Emits when a clickable badge pill is activated. */\n  @Output() pillClick = new EventEmitter<PillClickEvent>();\n\n  /** Emits when a notification-pill action button is pressed. */\n  @Output() pillAction = new EventEmitter<PillActionEvent>();\n\n  resolvedProps: PillMetadata = {} as PillMetadata;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) this.resolveProps();\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('pill', this.preset) as Partial<PillMetadata>) : {};\n    this.resolvedProps = { ...presetProps, ...this.props } as PillMetadata;\n  }\n\n  get isNotificationPill(): boolean {\n    return !!this.resolvedProps.notification && !this.resolvedProps.label;\n  }\n\n  get isTextPill(): boolean {\n    return !!this.resolvedProps.label;\n  }\n\n  get pillColor(): string {\n    return this.resolvedProps.color || 'medium';\n  }\n  get pillWeight(): string {\n    return this.resolvedProps.weight || 'medium';\n  }\n  get pillSize(): string {\n    return this.resolvedProps.size || 'small';\n  }\n\n  getIconColor(): string {\n    const c = this.resolvedProps.notification?.iconColor || 'warning';\n    return IONIC_COLORS.includes(c) ? `var(--ion-color-${c})` : c;\n  }\n\n  onPillClick(event?: Event): void {\n    if (!this.resolvedProps.clickable) return;\n    event?.preventDefault();\n    this.pillClick.emit({ token: this.resolvedProps.token, label: this.resolvedProps.label });\n  }\n\n  onActionClick(actionToken: string, event: MouseEvent): void {\n    event.stopPropagation();\n    this.pillAction.emit({ actionToken, pillToken: this.resolvedProps.token });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { Clipboard } from '@capacitor/clipboard';\nimport { ToastController } from '@ionic/angular';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { CommandDisplayMetadata } from './types';\n\n@Component({\n  selector: 'val-command-display',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <div class=\"command-container\">\n      <div class=\"command-text\">$ {{ props.text }}</div>\n      <ion-icon name=\"copy-outline\" class=\"copy-icon\" (click)=\"copyCommand()\"></ion-icon>\n    </div>\n  `,\n  styleUrls: ['./command-display.component.scss'],\n})\nexport class CommandDisplayComponent {\n  private toast = inject(ToastController);\n  private i18n = inject(I18nService);\n\n  @Input() props: CommandDisplayMetadata;\n\n  async copyCommand() {\n    if (this.props.text) {\n      await Clipboard.write({\n        string: this.props.text,\n      });\n      this.presentToast(this.i18n.t('copiedToClipboard'));\n    }\n  }\n\n  async presentToast(message: string) {\n    const toast = await this.toast.create({\n      message: message,\n      duration: 2000,\n      position: 'bottom',\n      color: 'dark',\n    });\n    toast.present();\n  }\n}\n","// src/app/layout/layout.component.ts (solo la parte de styles)\nimport { CommonModule } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { LinkComponent } from '../link/link.component';\nimport { TitleBlockComponent } from '../title-block/title-block.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { ButtonGroupComponent } from '../button-group/button-group.component';\nimport { IconService } from '../../../services/icons.service';\nimport { InfoMetadata } from './types';\n\n@Component({\n  selector: 'val-info',\n  standalone: true,\n  imports: [CommonModule, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent],\n  template: `\n    @if (props.image) {\n      <val-image style=\"display: contents;\" [props]=\"props.image\" />\n    }\n    <val-title-block style=\"display: block;margin-top: 16px;\" [props]=\"props.title\" />\n\n    @if (props.link) {\n      <val-link [props]=\"props.link\" />\n    }\n\n    @if (props.actions) {\n      <val-button-group [props]=\"props.actions\" />\n    }\n  `,\n  styles: ``,\n})\nexport class InfoComponent {\n  icon = inject(IconService);\n\n  @Input() props: InfoMetadata;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { Clipboard } from '@capacitor/clipboard';\nimport { ToastController } from '@ionic/angular';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\n\nimport * as Prism from 'prismjs';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-markup';\nimport 'prismjs/components/prism-typescript';\nimport { PlainCodeBoxMetadata } from './types';\n\n@Component({\n  selector: 'val-plain-code-box',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonButton],\n  template: `\n    <div class=\"code-box-container\">\n      <ion-button *ngIf=\"props.showCopyButton !== false\" fill=\"clear\" class=\"copy-button\" (click)=\"copyCode()\">\n        <ion-icon name=\"copy-outline\"></ion-icon>\n      </ion-button>\n      <pre><code [class]=\"'language-' + (props.language || 'bash')\" #codeBlock><ng-container *ngFor=\"let line of props.lines; let i = index\"><span [class]=\"line.type ? 'line-' + line.type : 'line-normal'\">{{ line.text }}</span><br *ngIf=\"i < props.lines.length - 1\">\n</ng-container></code></pre>\n    </div>\n  `,\n  styleUrls: ['./plain-code-box.component.scss'],\n})\nexport class PlainCodeBoxComponent implements AfterViewInit, OnChanges {\n  private toast = inject(ToastController);\n  private cdr = inject(ChangeDetectorRef);\n  private i18n = inject(I18nService);\n\n  @Input() props: PlainCodeBoxMetadata = { lines: [] };\n\n  @ViewChild('codeBlock') codeBlock!: ElementRef<HTMLElement>;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props'] && !changes['props'].firstChange) {\n      this.cdr.detectChanges();\n      setTimeout(() => this.highlightCode());\n    }\n  }\n\n  ngAfterViewInit() {\n    setTimeout(() => this.highlightCode());\n  }\n\n  private highlightCode() {\n    if (this.codeBlock && this.props.lines && this.props.lines.length > 0) {\n      Prism.highlightElement(this.codeBlock.nativeElement);\n    }\n  }\n\n  async copyCode() {\n    const fullCode = this.props.lines.map(line => line.text).join('\\n');\n    if (fullCode) {\n      await Clipboard.write({\n        string: fullCode,\n      });\n      this.presentToast(this.i18n.t('copiedToClipboard'));\n    }\n  }\n\n  async presentToast(message: string) {\n    const toast = await this.toast.create({\n      message: message,\n      duration: 2000,\n      position: 'bottom',\n      color: 'dark',\n    });\n    toast.present();\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonAccordion, IonAccordionGroup, IonItem, IonLabel, IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { AccordionMetadata, AccordionItemMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { chevronDown, helpCircle, informationCircle, documentText } from 'ionicons/icons';\n\naddIcons({ chevronDown, helpCircle, informationCircle, documentText });\n\n@Component({\n  selector: 'val-accordion',\n  standalone: true,\n  imports: [CommonModule, IonAccordion, IonAccordionGroup, IonItem, IonLabel, IonIcon],\n  template: `\n    <ion-accordion-group\n      [multiple]=\"resolvedProps.multiple ?? false\"\n      [value]=\"resolvedProps.value\"\n      [readonly]=\"resolvedProps.readonly ?? false\"\n      [mode]=\"resolvedProps.mode\"\n      (ionChange)=\"onAccordionChange($event)\"\n    >\n      @for (item of resolvedProps.items; track item.value) {\n        <ion-accordion [value]=\"item.value\" [disabled]=\"item.disabled\">\n          <ion-item slot=\"header\" [color]=\"resolvedProps.color || 'light'\">\n            @if (item.icon) {\n              <ion-icon [name]=\"item.icon\" slot=\"start\"></ion-icon>\n            }\n            <ion-label>{{ getItemHeader(item) }}</ion-label>\n          </ion-item>\n          <div class=\"ion-padding accordion-content\" slot=\"content\">\n            {{ getItemContent(item) }}\n          </div>\n        </ion-accordion>\n      }\n    </ion-accordion-group>\n  `,\n  styleUrls: ['./accordion.component.scss'],\n})\n/**\n * val-accordion\n *\n * An accordion component for collapsible content sections.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-accordion preset=\"faq\" [props]=\"{ items: [...] }\"></val-accordion>\n *\n * @example Static:\n * <val-accordion [props]=\"{\n *   items: [\n *     { value: 'faq1', header: '¿Qué es esto?', content: 'Es un acordeón.' },\n *     { value: 'faq2', header: '¿Cómo funciona?', content: 'Haz clic para expandir.' }\n *   ]\n * }\"></val-accordion>\n *\n * @input preset: string - Name of preset to apply\n * @input props: AccordionMetadata - Configuration for the accordion\n * @output accordionChange: string | string[] - Emits expanded value(s)\n */\nexport class AccordionComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<AccordionMetadata> = {};\n\n  resolvedProps: AccordionMetadata = {} as AccordionMetadata;\n\n  @Output() accordionChange = new EventEmitter<string | string[] | null>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('accordion', this.preset) as Partial<AccordionMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as AccordionMetadata;\n  }\n\n  onAccordionChange(event: CustomEvent): void {\n    this.accordionChange.emit(event.detail.value);\n  }\n\n  getItemHeader(item: AccordionItemMetadata): string {\n    return item.header || item.headerFallback || '';\n  }\n\n  getItemContent(item: AccordionItemMetadata): string {\n    return item.content || item.contentFallback || '';\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonTabBar, IonTabButton, IonIcon, IonLabel, IonBadge } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { TabsMetadata, TabMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { home, settings, person, search, heart, star, notifications, mail, calendar, folder } from 'ionicons/icons';\n\naddIcons({ home, settings, person, search, heart, star, notifications, mail, calendar, folder });\n\n@Component({\n  selector: 'val-tabs',\n  standalone: true,\n  imports: [CommonModule, IonTabBar, IonTabButton, IonIcon, IonLabel, IonBadge],\n  template: `\n    <ion-tab-bar\n      [color]=\"resolvedProps.color\"\n      [mode]=\"resolvedProps.mode\"\n      [translucent]=\"resolvedProps.translucent ?? false\"\n      [selectedTab]=\"resolvedProps.selectedTab || resolvedProps.tabs?.[0]?.value\"\n    >\n      @for (tab of resolvedProps.tabs; track tab.value) {\n        <ion-tab-button\n          [tab]=\"tab.value\"\n          [disabled]=\"tab.disabled\"\n          [layout]=\"resolvedProps.layout || 'icon-top'\"\n          (click)=\"onTabClick(tab)\"\n        >\n          @if (tab.icon && resolvedProps.layout !== 'icon-hide') {\n            <ion-icon [name]=\"tab.icon\"></ion-icon>\n          }\n          @if (getTabLabel(tab) && resolvedProps.layout !== 'label-hide') {\n            <ion-label>{{ getTabLabel(tab) }}</ion-label>\n          }\n          @if (tab.badge) {\n            <ion-badge [color]=\"tab.badgeColor || 'danger'\">{{ tab.badge }}</ion-badge>\n          }\n        </ion-tab-button>\n      }\n    </ion-tab-bar>\n  `,\n  styleUrls: ['./tabs.component.scss'],\n})\n/**\n * val-tabs\n *\n * A tab bar component for navigation between views.\n * Supports presets for reusable configurations.\n *\n * @example With preset (recommended):\n * <val-tabs preset=\"main-nav\" [props]=\"{ tabs: [...], selectedTab: 'home' }\" (tabChange)=\"onTabChange($event)\"></val-tabs>\n *\n * @example Static (backwards compatible):\n * <val-tabs [props]=\"{\n *   tabs: [\n *     { value: 'home', label: 'Inicio', icon: 'home' },\n *     { value: 'search', label: 'Buscar', icon: 'search' },\n *     { value: 'profile', label: 'Perfil', icon: 'person' }\n *   ],\n *   selectedTab: 'home'\n * }\" (tabChange)=\"onTabChange($event)\"></val-tabs>\n *\n * @input preset: string - Name of preset to apply\n * @input props: TabsMetadata - Configuration for the tabs\n * @output tabChange: TabMetadata - Emits when a tab is selected\n */\nexport class TabsComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable tabs configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-tabs preset=\"main-nav\" [props]=\"{ tabs: [...] }\"></val-tabs>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Tabs configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<TabsMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: TabsMetadata = {} as TabsMetadata;\n\n  @Output() tabChange = new EventEmitter<TabMetadata>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('tabs', this.preset) as Partial<TabsMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as TabsMetadata;\n  }\n\n  onTabClick(tab: TabMetadata): void {\n    if (!tab.disabled) {\n      this.tabChange.emit(tab);\n    }\n  }\n\n  getTabLabel(tab: TabMetadata): string {\n    return tab.label || tab.contentFallback || '';\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonBreadcrumb, IonBreadcrumbs, IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { BreadcrumbMetadata, BreadcrumbItemMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { chevronForward, home, ellipsisHorizontal } from 'ionicons/icons';\n\naddIcons({ chevronForward, home, ellipsisHorizontal });\n\n@Component({\n  selector: 'val-breadcrumb',\n  standalone: true,\n  imports: [CommonModule, IonBreadcrumb, IonBreadcrumbs, IonIcon],\n  template: `\n    <ion-breadcrumbs\n      [maxItems]=\"resolvedProps.maxItems\"\n      [mode]=\"resolvedProps.mode\"\n      (ionCollapsedClick)=\"onCollapsedClick($event)\"\n    >\n      @for (item of resolvedProps.items; track $index; let isLast = $last) {\n        <ion-breadcrumb\n          [href]=\"item.href\"\n          [active]=\"item.active || isLast\"\n          [disabled]=\"item.disabled\"\n          [separator]=\"!isLast\"\n          (click)=\"onBreadcrumbClick($event, item, $index)\"\n        >\n          @if (item.icon) {\n            <ion-icon [name]=\"item.icon\" slot=\"start\"></ion-icon>\n          }\n          {{ getItemLabel(item) }}\n          @if (!isLast && resolvedProps.separatorIcon) {\n            <ion-icon [name]=\"resolvedProps.separatorIcon\" slot=\"separator\"></ion-icon>\n          }\n        </ion-breadcrumb>\n      }\n    </ion-breadcrumbs>\n  `,\n  styleUrls: ['./breadcrumb.component.scss'],\n})\n/**\n * val-breadcrumb\n *\n * A breadcrumb navigation component for hierarchical navigation.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-breadcrumb preset=\"default\" [props]=\"{ items: [...] }\"></val-breadcrumb>\n *\n * @example Static:\n * <val-breadcrumb [props]=\"{\n *   items: [\n *     { label: 'Inicio', href: '/', icon: 'home' },\n *     { label: 'Productos', href: '/products' },\n *     { label: 'Electrónica', active: true }\n *   ]\n * }\"></val-breadcrumb>\n *\n * @input preset: string - Name of preset to apply\n * @input props: BreadcrumbMetadata - Configuration for the breadcrumb\n * @output breadcrumbClick: { item: BreadcrumbItemMetadata, index: number }\n */\nexport class BreadcrumbComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<BreadcrumbMetadata> = {};\n\n  resolvedProps: BreadcrumbMetadata = {} as BreadcrumbMetadata;\n\n  @Output() breadcrumbClick = new EventEmitter<{ item: BreadcrumbItemMetadata; index: number }>();\n  @Output() collapsedClick = new EventEmitter<CustomEvent>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('breadcrumb', this.preset) as Partial<BreadcrumbMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as BreadcrumbMetadata;\n  }\n\n  onBreadcrumbClick(event: Event, item: BreadcrumbItemMetadata, index: number): void {\n    if (!item.disabled && !item.active) {\n      this.breadcrumbClick.emit({ item, index });\n    }\n  }\n\n  onCollapsedClick(event: CustomEvent): void {\n    this.collapsedClick.emit(event);\n  }\n\n  getItemLabel(item: BreadcrumbItemMetadata): string {\n    return item.label || item.contentFallback || '';\n  }\n}\n","import { Component, Input, OnChanges, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PaginationMetadata, PageChangeEvent } from './types';\nimport { addIcons } from 'ionicons';\nimport { chevronBack, chevronForward, playBack, playForward } from 'ionicons/icons';\n\naddIcons({ chevronBack, chevronForward, playBack, playForward });\n\n@Component({\n  selector: 'val-pagination',\n  standalone: true,\n  imports: [CommonModule, IonButton, IonIcon],\n  template: `\n    <div class=\"pagination-container\" [class.disabled]=\"props.disabled\">\n      @if (props.showFirstLast !== false) {\n        <ion-button\n          fill=\"clear\"\n          [size]=\"props.size || 'default'\"\n          [color]=\"props.color || 'primary'\"\n          [disabled]=\"props.disabled || props.currentPage <= 1\"\n          (click)=\"goToPage(1)\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"play-back\"></ion-icon>\n        </ion-button>\n      }\n\n      @if (props.showPrevNext !== false) {\n        <ion-button\n          fill=\"clear\"\n          [size]=\"props.size || 'default'\"\n          [color]=\"props.color || 'primary'\"\n          [disabled]=\"props.disabled || props.currentPage <= 1\"\n          (click)=\"goToPage(props.currentPage - 1)\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"chevron-back\"></ion-icon>\n        </ion-button>\n      }\n\n      @for (page of visiblePages; track page) {\n        @if (page === -1) {\n          <span class=\"ellipsis\">...</span>\n        } @else {\n          <ion-button\n            [fill]=\"page === props.currentPage ? 'solid' : 'clear'\"\n            [size]=\"props.size || 'default'\"\n            [color]=\"props.color || 'primary'\"\n            [disabled]=\"props.disabled\"\n            (click)=\"goToPage(page)\"\n          >\n            {{ page }}\n          </ion-button>\n        }\n      }\n\n      @if (props.showPrevNext !== false) {\n        <ion-button\n          fill=\"clear\"\n          [size]=\"props.size || 'default'\"\n          [color]=\"props.color || 'primary'\"\n          [disabled]=\"props.disabled || props.currentPage >= totalPages\"\n          (click)=\"goToPage(props.currentPage + 1)\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"chevron-forward\"></ion-icon>\n        </ion-button>\n      }\n\n      @if (props.showFirstLast !== false) {\n        <ion-button\n          fill=\"clear\"\n          [size]=\"props.size || 'default'\"\n          [color]=\"props.color || 'primary'\"\n          [disabled]=\"props.disabled || props.currentPage >= totalPages\"\n          (click)=\"goToPage(totalPages)\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"play-forward\"></ion-icon>\n        </ion-button>\n      }\n\n      @if (props.showPageInfo) {\n        <span class=\"page-info\">Page {{ props.currentPage }} of {{ totalPages }}</span>\n      }\n    </div>\n  `,\n  styleUrls: ['./pagination.component.scss'],\n})\n/**\n * val-pagination\n *\n * A pagination component for navigating through paged content.\n *\n * @example Basic usage\n * <val-pagination [props]=\"{\n *   currentPage: 1,\n *   totalPages: 10,\n *   showPageInfo: true\n * }\" (pageChange)=\"onPageChange($event)\"></val-pagination>\n *\n * @example With total items\n * <val-pagination [props]=\"{\n *   currentPage: 1,\n *   totalItems: 100,\n *   pageSize: 10,\n *   maxVisiblePages: 5\n * }\"></val-pagination>\n *\n * @input props: PaginationMetadata - Configuration for pagination\n * @output pageChange: PageChangeEvent - Emits when page changes\n */\nexport class PaginationComponent implements OnChanges {\n  @Input() props: PaginationMetadata;\n\n  @Output() pageChange = new EventEmitter<PageChangeEvent>();\n\n  visiblePages: number[] = [];\n  totalPages: number = 1;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.calculateTotalPages();\n      this.calculateVisiblePages();\n    }\n  }\n\n  goToPage(page: number): void {\n    if (page < 1 || page > this.totalPages || page === this.props.currentPage) {\n      return;\n    }\n\n    const event: PageChangeEvent = {\n      page,\n      previousPage: this.props.currentPage,\n      pageSize: this.props.pageSize || 10,\n    };\n\n    this.pageChange.emit(event);\n  }\n\n  private calculateTotalPages(): void {\n    if (this.props.totalPages) {\n      this.totalPages = this.props.totalPages;\n    } else if (this.props.totalItems && this.props.pageSize) {\n      this.totalPages = Math.ceil(this.props.totalItems / this.props.pageSize);\n    } else {\n      this.totalPages = 1;\n    }\n  }\n\n  private calculateVisiblePages(): void {\n    const maxVisible = this.props.maxVisiblePages || 5;\n    const current = this.props.currentPage;\n    const total = this.totalPages;\n\n    if (total <= maxVisible) {\n      this.visiblePages = Array.from({ length: total }, (_, i) => i + 1);\n      return;\n    }\n\n    const pages: number[] = [];\n    const half = Math.floor(maxVisible / 2);\n\n    let start = Math.max(1, current - half);\n    let end = Math.min(total, start + maxVisible - 1);\n\n    if (end - start < maxVisible - 1) {\n      start = Math.max(1, end - maxVisible + 1);\n    }\n\n    // Always show first page\n    if (start > 1) {\n      pages.push(1);\n      if (start > 2) {\n        pages.push(-1); // Ellipsis\n      }\n    }\n\n    // Middle pages\n    for (let i = start; i <= end; i++) {\n      if (!pages.includes(i)) {\n        pages.push(i);\n      }\n    }\n\n    // Always show last page\n    if (end < total) {\n      if (end < total - 1) {\n        pages.push(-1); // Ellipsis\n      }\n      pages.push(total);\n    }\n\n    this.visiblePages = pages;\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { StepperMetadata, StepMetadata, StepChangeEvent, StepStatus } from './types';\nimport { addIcons } from 'ionicons';\nimport { checkmark, close, ellipse } from 'ionicons/icons';\n\naddIcons({ checkmark, close, ellipse });\n\n@Component({\n  selector: 'val-stepper',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <div\n      class=\"stepper-container\"\n      [class.horizontal]=\"resolvedProps.orientation !== 'vertical'\"\n      [class.vertical]=\"resolvedProps.orientation === 'vertical'\"\n    >\n      @for (step of resolvedProps.steps; track step.value; let i = $index; let isLast = $last) {\n        <div\n          class=\"step\"\n          [class.current]=\"getStepStatus(step, i) === 'current'\"\n          [class.completed]=\"getStepStatus(step, i) === 'completed'\"\n          [class.error]=\"getStepStatus(step, i) === 'error'\"\n          [class.disabled]=\"step.disabled\"\n          [class.clickable]=\"isStepClickable(step, i)\"\n          (click)=\"onStepClick(step, i)\"\n        >\n          <div class=\"step-indicator\">\n            <div class=\"step-circle\" [style.--step-color]=\"getStepColor(step, i)\">\n              @if (getStepStatus(step, i) === 'completed') {\n                <ion-icon name=\"checkmark\"></ion-icon>\n              } @else if (getStepStatus(step, i) === 'error') {\n                <ion-icon name=\"close\"></ion-icon>\n              } @else if (step.icon) {\n                <ion-icon [name]=\"step.icon\"></ion-icon>\n              } @else if (resolvedProps.showNumbers !== false) {\n                <span class=\"step-number\">{{ i + 1 }}</span>\n              } @else {\n                <ion-icon name=\"ellipse\"></ion-icon>\n              }\n            </div>\n            @if (!isLast && resolvedProps.connectorStyle !== 'none') {\n              <div\n                class=\"step-connector\"\n                [class.dashed]=\"resolvedProps.connectorStyle === 'dashed'\"\n                [class.completed]=\"getStepStatus(step, i) === 'completed'\"\n              ></div>\n            }\n          </div>\n          <div class=\"step-content\">\n            <div class=\"step-label\">\n              {{ getStepLabel(step) }}\n              @if (step.optional) {\n                <span class=\"optional-text\">(Optional)</span>\n              }\n            </div>\n            @if (step.description) {\n              <div class=\"step-description\">{{ step.description }}</div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./stepper.component.scss'],\n})\n/**\n * val-stepper\n *\n * A stepper component for multi-step processes.\n * Supports horizontal and vertical orientations.\n *\n * @example Basic usage\n * <val-stepper [props]=\"{\n *   steps: [\n *     { value: 'info', label: 'Personal Info' },\n *     { value: 'address', label: 'Address' },\n *     { value: 'payment', label: 'Payment' },\n *     { value: 'confirm', label: 'Confirm' }\n *   ],\n *   currentIndex: 1\n * }\" (stepChange)=\"onStepChange($event)\"></val-stepper>\n *\n * @example Vertical with descriptions\n * <val-stepper [props]=\"{\n *   steps: [\n *     { value: 'step1', label: 'Step 1', description: 'Description here' },\n *     { value: 'step2', label: 'Step 2', optional: true }\n *   ],\n *   orientation: 'vertical',\n *   currentIndex: 0\n * }\"></val-stepper>\n *\n * @input props: StepperMetadata - Configuration for the stepper\n * @output stepChange: StepChangeEvent - Emits when step changes\n */\nexport class StepperComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable stepper configurations\n   * that can be registered at app level via provideValtechPresets().\n   */\n  @Input() preset?: string;\n\n  /**\n   * Stepper configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<StepperMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: StepperMetadata = {} as StepperMetadata;\n\n  @Output() stepChange = new EventEmitter<StepChangeEvent>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('stepper', this.preset) as Partial<StepperMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as StepperMetadata;\n  }\n\n  getCurrentIndex(): number {\n    if (this.resolvedProps.currentIndex !== undefined) {\n      return this.resolvedProps.currentIndex;\n    }\n    if (this.resolvedProps.currentStep) {\n      return this.resolvedProps.steps?.findIndex((s) => s.value === this.resolvedProps.currentStep) ?? 0;\n    }\n    return 0;\n  }\n\n  getStepStatus(step: StepMetadata, index: number): StepStatus {\n    if (step.status) return step.status;\n\n    const currentIndex = this.getCurrentIndex();\n    if (index < currentIndex) return 'completed';\n    if (index === currentIndex) return 'current';\n    return 'pending';\n  }\n\n  getStepColor(step: StepMetadata, index: number): string {\n    const status = this.getStepStatus(step, index);\n    const color = this.resolvedProps.color || 'primary';\n\n    switch (status) {\n      case 'completed':\n        return `var(--ion-color-${color})`;\n      case 'current':\n        return `var(--ion-color-${color})`;\n      case 'error':\n        return 'var(--ion-color-danger)';\n      default:\n        return 'var(--ion-color-medium)';\n    }\n  }\n\n  isStepClickable(step: StepMetadata, index: number): boolean {\n    if (step.disabled) return false;\n    if (!this.resolvedProps.linear) return true;\n\n    const currentIndex = this.getCurrentIndex();\n    return index <= currentIndex || (step.editable && index < currentIndex);\n  }\n\n  onStepClick(step: StepMetadata, index: number): void {\n    if (!this.isStepClickable(step, index)) return;\n\n    const currentIndex = this.getCurrentIndex();\n    if (index === currentIndex) return;\n\n    this.stepChange.emit({\n      step,\n      index,\n      previousIndex: currentIndex,\n    });\n  }\n\n  getStepLabel(step: StepMetadata): string {\n    return step.label || step.contentFallback || '';\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonChip, IonIcon, IonLabel } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { ChipGroupMetadata, ChipMetadata, ChipSelectionEvent, ChipRemoveEvent } from './types';\nimport { addIcons } from 'ionicons';\nimport { close, checkmark } from 'ionicons/icons';\n\naddIcons({ close, checkmark });\n\n@Component({\n  selector: 'val-chip-group',\n  standalone: true,\n  imports: [CommonModule, IonChip, IonIcon, IonLabel],\n  template: `\n    <div class=\"chip-group\" [class.wrap]=\"resolvedProps.wrap !== false\">\n      @for (chip of resolvedProps.chips; track chip.value) {\n        <ion-chip\n          [color]=\"getChipColor(chip)\"\n          [outline]=\"resolvedProps.outline && !chip.selected\"\n          [disabled]=\"chip.disabled\"\n          (click)=\"onChipClick(chip)\"\n        >\n          @if (chip.icon) {\n            <ion-icon [name]=\"chip.icon\"></ion-icon>\n          }\n          @if (chip.selected && resolvedProps.selectable) {\n            <ion-icon name=\"checkmark\" class=\"selected-icon\"></ion-icon>\n          }\n          <ion-label>{{ getChipLabel(chip) }}</ion-label>\n          @if (resolvedProps.removable && !chip.disabled) {\n            <ion-icon name=\"close\" class=\"remove-icon\" (click)=\"onRemoveChip($event, chip)\"></ion-icon>\n          }\n        </ion-chip>\n      }\n    </div>\n  `,\n  styleUrls: ['./chip-group.component.scss'],\n})\n/**\n * val-chip-group\n *\n * A group of chips for tags, filters, or selections.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-chip-group preset=\"tags\" [props]=\"{ chips: [...] }\"></val-chip-group>\n *\n * @example Basic selectable\n * <val-chip-group [props]=\"{\n *   chips: [\n *     { value: 'angular', label: 'Angular' },\n *     { value: 'react', label: 'React' },\n *     { value: 'vue', label: 'Vue' }\n *   ],\n *   selectable: true,\n *   multiple: true\n * }\" (selectionChange)=\"onSelectionChange($event)\"></val-chip-group>\n *\n * @input preset: string - Name of preset to apply\n * @input props: ChipGroupMetadata - Configuration for the chip group\n * @output selectionChange: ChipSelectionEvent - Emits when selection changes\n * @output chipRemove: ChipRemoveEvent - Emits when a chip is removed\n */\nexport class ChipGroupComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<ChipGroupMetadata> = {};\n\n  resolvedProps: ChipGroupMetadata = {} as ChipGroupMetadata;\n\n  @Output() selectionChange = new EventEmitter<ChipSelectionEvent>();\n  @Output() chipRemove = new EventEmitter<ChipRemoveEvent>();\n  @Output() chipClick = new EventEmitter<ChipMetadata>();\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('chipGroup', this.preset) as Partial<ChipGroupMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as ChipGroupMetadata;\n  }\n\n  getChipColor(chip: ChipMetadata): string {\n    if (chip.selected && this.resolvedProps.selectedColor) {\n      return this.resolvedProps.selectedColor;\n    }\n    return chip.color || this.resolvedProps.color || 'primary';\n  }\n\n  getChipLabel(chip: ChipMetadata): string {\n    return chip.label || chip.contentFallback || '';\n  }\n\n  onChipClick(chip: ChipMetadata): void {\n    if (chip.disabled) return;\n\n    this.chipClick.emit(chip);\n\n    if (!this.resolvedProps.selectable) return;\n\n    if (this.resolvedProps.multiple) {\n      chip.selected = !chip.selected;\n    } else {\n      // Single selection: deselect all others\n      this.resolvedProps.chips.forEach((c) => {\n        c.selected = c.value === chip.value ? !c.selected : false;\n      });\n    }\n\n    this.emitSelectionChange();\n  }\n\n  onRemoveChip(event: Event, chip: ChipMetadata): void {\n    event.stopPropagation();\n\n    const index = this.resolvedProps.chips.indexOf(chip);\n    if (index > -1) {\n      this.resolvedProps.chips.splice(index, 1);\n      this.chipRemove.emit({\n        chip,\n        remaining: [...this.resolvedProps.chips],\n      });\n    }\n  }\n\n  private emitSelectionChange(): void {\n    const selected = this.resolvedProps.chips.filter((c) => c.selected);\n    const values = selected.map((c) => c.value);\n\n    this.selectionChange.emit({\n      selected: this.resolvedProps.multiple ? selected : selected[0],\n      values: this.resolvedProps.multiple ? values : values[0],\n    });\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { RatingMetadata, RatingChangeEvent } from './types';\nimport { addIcons } from 'ionicons';\nimport { star, starOutline, starHalf, heart, heartOutline, heartHalf } from 'ionicons/icons';\n\naddIcons({ star, starOutline, starHalf, heart, heartOutline, heartHalf });\n\n@Component({\n  selector: 'val-rating',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <div\n      class=\"rating-container\"\n      [class.readonly]=\"resolvedProps.readonly\"\n      [class.disabled]=\"resolvedProps.disabled\"\n      [class]=\"'size-' + (resolvedProps.size || 'medium')\"\n    >\n      @for (i of getStars(); track i) {\n        <ion-icon\n          [name]=\"getStarIcon(i)\"\n          [color]=\"getStarColor(i)\"\n          [class.clickable]=\"!resolvedProps.readonly && !resolvedProps.disabled\"\n          (click)=\"onStarClick(i)\"\n          (mouseenter)=\"onStarHover(i)\"\n          (mouseleave)=\"onStarLeave()\"\n        ></ion-icon>\n      }\n      @if (resolvedProps.showValue) {\n        <span class=\"rating-value\">{{ displayValue }}</span>\n      }\n    </div>\n  `,\n  styleUrls: ['./rating.component.scss'],\n})\n/**\n * val-rating\n *\n * A star rating component for feedback and reviews.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-rating preset=\"stars\" [props]=\"{ value: 3.5 }\"></val-rating>\n *\n * @example Basic usage\n * <val-rating [props]=\"{\n *   value: 3.5,\n *   max: 5,\n *   allowHalf: true\n * }\" (ratingChange)=\"onRatingChange($event)\"></val-rating>\n *\n * @input preset: string - Name of preset to apply\n * @input props: RatingMetadata - Configuration for the rating\n * @output ratingChange: RatingChangeEvent - Emits when rating changes\n */\nexport class RatingComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<RatingMetadata> = {};\n\n  resolvedProps: RatingMetadata = {} as RatingMetadata;\n\n  @Output() ratingChange = new EventEmitter<RatingChangeEvent>();\n\n  hoverValue: number | null = null;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('rating', this.preset) as Partial<RatingMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as RatingMetadata;\n  }\n\n  get displayValue(): number {\n    return this.hoverValue !== null ? this.hoverValue : this.resolvedProps.value;\n  }\n\n  getStars(): number[] {\n    const max = this.resolvedProps.max || 5;\n    return Array.from({ length: max }, (_, i) => i + 1);\n  }\n\n  getStarIcon(position: number): string {\n    const value = this.hoverValue !== null ? this.hoverValue : this.resolvedProps.value;\n    const baseIcon = this.resolvedProps.icon || 'star';\n    const emptyIcon = this.resolvedProps.iconEmpty || `${baseIcon}-outline`;\n    const halfIcon = this.resolvedProps.iconHalf || `${baseIcon}-half`;\n\n    if (position <= value) {\n      return baseIcon;\n    } else if (this.resolvedProps.allowHalf && position - 0.5 <= value) {\n      return halfIcon;\n    }\n    return emptyIcon;\n  }\n\n  getStarColor(position: number): string {\n    const value = this.hoverValue !== null ? this.hoverValue : this.resolvedProps.value;\n    const isFilled = position <= value || (this.resolvedProps.allowHalf && position - 0.5 <= value);\n    return isFilled ? (this.resolvedProps.color || 'warning') : (this.resolvedProps.emptyColor || 'medium');\n  }\n\n  onStarClick(position: number): void {\n    if (this.resolvedProps.readonly || this.resolvedProps.disabled) return;\n\n    let newValue = position;\n\n    // Toggle half value if clicking same star and allowHalf is true\n    if (this.resolvedProps.allowHalf && position === Math.ceil(this.resolvedProps.value)) {\n      if (this.resolvedProps.value === position) {\n        newValue = position - 0.5;\n      } else if (this.resolvedProps.value === position - 0.5) {\n        newValue = 0;\n      }\n    } else if (position === this.resolvedProps.value) {\n      // Click same star again to clear\n      newValue = 0;\n    }\n\n    if (newValue !== this.resolvedProps.value) {\n      this.ratingChange.emit({\n        value: newValue,\n        previousValue: this.resolvedProps.value,\n      });\n    }\n  }\n\n  onStarHover(position: number): void {\n    if (this.resolvedProps.readonly || this.resolvedProps.disabled) return;\n    this.hoverValue = position;\n  }\n\n  onStarLeave(): void {\n    this.hoverValue = null;\n  }\n}\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { TimelineMetadata, TimelineItemMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { ellipse, checkmarkCircle, timeOutline, calendar, flag } from 'ionicons/icons';\n\naddIcons({ ellipse, checkmarkCircle, timeOutline, calendar, flag });\n\n@Component({\n  selector: 'val-timeline',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <div\n      class=\"timeline\"\n      [class.vertical]=\"props.orientation !== 'horizontal'\"\n      [class.horizontal]=\"props.orientation === 'horizontal'\"\n      [class.alternate]=\"props.alternate\"\n    >\n      @for (item of props.items; track item.token; let i = $index; let isLast = $last) {\n        <div\n          class=\"timeline-item\"\n          [class.active]=\"item.active\"\n          [class.left]=\"props.alternate && i % 2 === 0\"\n          [class.right]=\"props.alternate && i % 2 !== 0\"\n          (click)=\"onItemClick(item, i)\"\n        >\n          <div class=\"timeline-marker\" [style.--marker-color]=\"getItemColor(item)\">\n            @if (item.icon) {\n              <ion-icon [name]=\"item.icon\"></ion-icon>\n            } @else {\n              <div class=\"marker-dot\"></div>\n            }\n          </div>\n\n          @if (!isLast && props.showConnectors !== false) {\n            <div\n              class=\"timeline-connector\"\n              [class.dashed]=\"props.connectorStyle === 'dashed'\"\n            ></div>\n          }\n\n          <div class=\"timeline-content\">\n            @if (item.date) {\n              <div class=\"timeline-date\">{{ item.date }}</div>\n            }\n            <div class=\"timeline-title\">{{ item.title }}</div>\n            @if (item.content) {\n              <div class=\"timeline-description\">{{ item.content }}</div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./timeline.component.scss'],\n})\n/**\n * val-timeline\n *\n * A timeline component for displaying chronological events.\n * Supports vertical and horizontal orientations.\n *\n * @example Basic timeline\n * <val-timeline [props]=\"{\n *   items: [\n *     { title: 'Order placed', date: 'Jan 1', icon: 'cart' },\n *     { title: 'Processing', date: 'Jan 2', active: true },\n *     { title: 'Shipped', date: 'Jan 3' },\n *     { title: 'Delivered', date: 'Jan 5' }\n *   ]\n * }\"></val-timeline>\n *\n * @example Alternate timeline\n * <val-timeline [props]=\"{\n *   items: [...],\n *   alternate: true,\n *   connectorStyle: 'dashed'\n * }\"></val-timeline>\n *\n * @input props: TimelineMetadata - Configuration for the timeline\n * @output itemClick: { item: TimelineItemMetadata, index: number }\n */\nexport class TimelineComponent {\n  @Input() props: TimelineMetadata;\n\n  @Output() itemClick = new EventEmitter<{ item: TimelineItemMetadata; index: number }>();\n\n  getItemColor(item: TimelineItemMetadata): string {\n    const color = item.color || this.props.color || 'primary';\n    return `var(--ion-color-${color})`;\n  }\n\n  onItemClick(item: TimelineItemMetadata, index: number): void {\n    this.itemClick.emit({ item, index });\n  }\n}\n","import { Component, inject, Input, OnChanges, OnInit, Output, EventEmitter, SimpleChanges } from '@angular/core';\nimport { IonCard, IonCardContent, IonIcon, IonSkeletonText } from '@ionic/angular/standalone';\nimport { CommonModule } from '@angular/common';\nimport { PresetService } from '../../../services/presets';\nimport { StatsCardMetadata } from './types';\nimport { addIcons } from 'ionicons';\nimport { trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, heart, star } from 'ionicons/icons';\n\naddIcons({ trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, heart, star });\n\n@Component({\n  selector: 'val-stats-card',\n  standalone: true,\n  imports: [CommonModule, IonCard, IonCardContent, IonIcon, IonSkeletonText],\n  template: `\n    <ion-card\n      class=\"stats-card\"\n      [class]=\"getBackgroundClass()\"\n      [style.--card-color]=\"getCardColor()\"\n      [style.min-height.px]=\"resolvedProps.minHeight\"\n      (click)=\"onClick.emit()\"\n    >\n      <ion-card-content>\n        <div class=\"stats-header\">\n          <span class=\"stats-title\">{{ resolvedProps.title }}</span>\n          @if (resolvedProps.icon) {\n            <ion-icon [name]=\"resolvedProps.icon\" class=\"stats-icon\"></ion-icon>\n          }\n        </div>\n\n        <div class=\"stats-value\">\n          @if (resolvedProps.loading) {\n            <ion-skeleton-text [animated]=\"true\" style=\"width: 60%; height: 32px;\"></ion-skeleton-text>\n          } @else {\n            @if (resolvedProps.prefix) {\n              <span class=\"prefix\">{{ resolvedProps.prefix }}</span>\n            }\n            <span class=\"value\">{{ resolvedProps.value }}</span>\n            @if (resolvedProps.suffix) {\n              <span class=\"suffix\">{{ resolvedProps.suffix }}</span>\n            }\n          }\n        </div>\n\n        @if (resolvedProps.trend && !resolvedProps.loading) {\n          <div class=\"stats-trend\" [class]=\"getTrendClass()\">\n            <ion-icon [name]=\"getTrendIcon()\"></ion-icon>\n            <span class=\"trend-value\">{{ Math.abs(resolvedProps.trend.value) }}%</span>\n            @if (resolvedProps.trend.label) {\n              <span class=\"trend-label\">{{ resolvedProps.trend.label }}</span>\n            }\n          </div>\n        }\n\n        @if (resolvedProps.footer && !resolvedProps.loading) {\n          <div class=\"stats-footer\">{{ resolvedProps.footer }}</div>\n        }\n\n        @if (resolvedProps.description && !resolvedProps.loading) {\n          <div class=\"stats-description\">{{ resolvedProps.description }}</div>\n        }\n\n        @if (resolvedProps.logo && !resolvedProps.loading) {\n          <div class=\"stats-logo\">\n            <img\n              [src]=\"resolvedProps.logo.src\"\n              [alt]=\"resolvedProps.logo.alt\"\n              [style.max-height.px]=\"resolvedProps.logo.maxHeight || 32\"\n              [style.max-width.px]=\"resolvedProps.logo.maxWidth || 120\"\n            />\n          </div>\n        }\n      </ion-card-content>\n    </ion-card>\n  `,\n  styleUrls: ['./stats-card.component.scss'],\n})\n/**\n * val-stats-card\n *\n * A card component for displaying statistics and KPIs.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-stats-card preset=\"kpi\" [props]=\"{ title: 'Users', value: 1000 }\"></val-stats-card>\n *\n * @example Basic usage\n * <val-stats-card [props]=\"{\n *   title: 'Total Users',\n *   value: 12500,\n *   icon: 'people',\n *   color: 'primary'\n * }\"></val-stats-card>\n *\n * @input preset: string - Name of preset to apply\n * @input props: StatsCardMetadata - Configuration for the stats card\n * @output onClick: void - Emits when card is clicked\n */\nexport class StatsCardComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<StatsCardMetadata> = {};\n\n  resolvedProps: StatsCardMetadata = {} as StatsCardMetadata;\n\n  @Output() onClick = new EventEmitter<void>();\n\n  Math = Math;\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('statsCard', this.preset) as Partial<StatsCardMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as StatsCardMetadata;\n  }\n\n  getCardColor(): string {\n    const color = this.resolvedProps.color || 'primary';\n    return `var(--ion-color-${color})`;\n  }\n\n  getBackgroundClass(): string {\n    const bg = this.resolvedProps.background || 'light';\n    return `background-${bg}`;\n  }\n\n  getTrendClass(): string {\n    const direction = this.resolvedProps.trend?.direction || 'neutral';\n    const invert = this.resolvedProps.trend?.invertColors;\n\n    if (direction === 'neutral') return 'trend-neutral';\n    if (direction === 'up') return invert ? 'trend-down' : 'trend-up';\n    return invert ? 'trend-up' : 'trend-down';\n  }\n\n  getTrendIcon(): string {\n    const direction = this.resolvedProps.trend?.direction || 'neutral';\n    if (direction === 'up') return 'trending-up';\n    if (direction === 'down') return 'trending-down';\n    return 'remove';\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonIcon, IonButton, IonPopover, IonList, IonItem, IonLabel } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { AvatarComponent } from '../../atoms/avatar/avatar.component';\nimport { addIcons } from 'ionicons';\nimport {\n  ellipsisHorizontal,\n  checkmarkCircle,\n  chatbubbleOutline,\n  heartOutline,\n  heart,\n  thumbsUpOutline,\n  thumbsUp,\n  happyOutline,\n  happy,\n  sadOutline,\n  sad,\n  chevronDown,\n  chevronUp,\n  pin,\n  pencil,\n  trash,\n  flag,\n  share,\n} from 'ionicons/icons';\nimport {\n  CommentMetadata,\n  CommentAuthor,\n  CommentReaction,\n  CommentAction,\n  CommentMenuItem,\n  CommentAuthorClickEvent,\n  CommentReactionClickEvent,\n  CommentActionClickEvent,\n  CommentMenuItemClickEvent,\n  CommentLoadMoreEvent,\n} from './types';\n\naddIcons({\n  ellipsisHorizontal,\n  checkmarkCircle,\n  chatbubbleOutline,\n  heartOutline,\n  heart,\n  thumbsUpOutline,\n  thumbsUp,\n  happyOutline,\n  happy,\n  sadOutline,\n  sad,\n  chevronDown,\n  chevronUp,\n  pin,\n  pencil,\n  trash,\n  flag,\n  share,\n});\n\n@Component({\n  selector: 'val-comment',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonIcon,\n    IonButton,\n    IonPopover,\n    IonList,\n    IonItem,\n    IonLabel,\n    AvatarComponent,\n  ],\n  template: `\n    <div\n      class=\"comment\"\n      [class.highlighted]=\"props.highlighted\"\n      [class.pinned]=\"props.pinned\"\n      [class.collapsed]=\"props.collapsed\"\n      [style.--depth]=\"props.depth || 0\"\n    >\n      @if (props.pinned) {\n        <div class=\"pinned-indicator\">\n          <ion-icon name=\"pin\"></ion-icon>\n          <span>{{ i18n.t('pinned') }}</span>\n        </div>\n      }\n\n      <div class=\"comment-main\">\n        <div class=\"comment-avatar\" (click)=\"onAuthorClick()\">\n          @if (props.author.avatar) {\n            <val-avatar [props]=\"props.author.avatar\"></val-avatar>\n          } @else {\n            <div class=\"avatar-placeholder\">\n              {{ getInitials(props.author.name) }}\n            </div>\n          }\n        </div>\n\n        <div class=\"comment-body\">\n          <div class=\"comment-header\">\n            <div class=\"author-info\" (click)=\"onAuthorClick()\">\n              <span class=\"author-name\">{{ props.author.name }}</span>\n              @if (props.author.verified) {\n                <ion-icon name=\"checkmark-circle\" class=\"verified-badge\"></ion-icon>\n              }\n              @if (props.author.username) {\n                <span class=\"author-username\">&#64;{{ props.author.username }}</span>\n              }\n            </div>\n\n            <div class=\"comment-meta\">\n              <span class=\"timestamp\">{{ formatTimestamp(props.timestamp) }}</span>\n              @if (props.edited) {\n                <span class=\"edited-label\">{{ i18n.t('edited') }}</span>\n              }\n            </div>\n\n            @if (props.menuItems && props.menuItems.length > 0) {\n              <ion-button\n                fill=\"clear\"\n                size=\"small\"\n                class=\"more-button\"\n                [id]=\"'menu-trigger-' + props.token\"\n              >\n                <ion-icon name=\"ellipsis-horizontal\" slot=\"icon-only\"></ion-icon>\n              </ion-button>\n\n              <ion-popover\n                [trigger]=\"'menu-trigger-' + props.token\"\n                [dismissOnSelect]=\"true\"\n              >\n                <ng-template>\n                  <ion-list>\n                    @for (item of props.menuItems; track item.token) {\n                      @if (item.dividerBefore) {\n                        <div class=\"menu-divider\"></div>\n                      }\n                      <ion-item\n                        [button]=\"true\"\n                        [detail]=\"false\"\n                        [disabled]=\"item.disabled\"\n                        (click)=\"onMenuItemClick(item)\"\n                      >\n                        @if (item.icon) {\n                          <ion-icon\n                            [name]=\"item.icon\"\n                            slot=\"start\"\n                            [color]=\"item.color\"\n                          ></ion-icon>\n                        }\n                        <ion-label [color]=\"item.color\">\n                          {{ getMenuItemLabel(item) }}\n                        </ion-label>\n                      </ion-item>\n                    }\n                  </ion-list>\n                </ng-template>\n              </ion-popover>\n            }\n          </div>\n\n          @if (!props.collapsed) {\n            <div\n              class=\"comment-content\"\n              [innerHTML]=\"processContent(displayContent)\"\n            ></div>\n\n            @if (props.reactions && props.reactions.length > 0) {\n              <div class=\"comment-reactions\">\n                @for (reaction of props.reactions; track reaction.token) {\n                  <button\n                    class=\"reaction-button\"\n                    [class.active]=\"reaction.active\"\n                    [style.--reaction-color]=\"getReactionColor(reaction)\"\n                    (click)=\"onReactionClick(reaction)\"\n                  >\n                    <ion-icon [name]=\"reaction.icon\"></ion-icon>\n                    @if (reaction.count > 0) {\n                      <span class=\"reaction-count\">{{ formatCount(reaction.count) }}</span>\n                    }\n                  </button>\n                }\n              </div>\n            }\n\n            @if (props.actions && props.actions.length > 0) {\n              <div class=\"comment-actions\">\n                @for (action of props.actions; track action.token) {\n                  <ion-button\n                    fill=\"clear\"\n                    size=\"small\"\n                    [color]=\"action.color || 'medium'\"\n                    [disabled]=\"action.disabled\"\n                    (click)=\"onActionClick(action)\"\n                  >\n                    @if (action.icon) {\n                      <ion-icon [name]=\"action.icon\" slot=\"start\"></ion-icon>\n                    }\n                    {{ getActionLabel(action) }}\n                  </ion-button>\n                }\n              </div>\n            }\n          } @else {\n            <button class=\"expand-button\" (click)=\"onToggleCollapse()\">\n              <ion-icon name=\"chevron-down\"></ion-icon>\n              <span>{{ i18n.t('showComment') }}</span>\n            </button>\n          }\n        </div>\n      </div>\n\n      @if (!props.collapsed && hasChildren()) {\n        <div class=\"comment-children\">\n          @if (props.collapsed) {\n            <button class=\"collapse-button\" (click)=\"onToggleCollapse()\">\n              <ion-icon name=\"chevron-up\"></ion-icon>\n              <span>{{ i18n.t('hideReplies') }}</span>\n            </button>\n          }\n\n          @if (canShowChildren()) {\n            @for (child of props.children; track child.token) {\n              <val-comment\n                [props]=\"getChildProps(child)\"\n                (authorClick)=\"authorClick.emit($event)\"\n                (reactionClick)=\"reactionClick.emit($event)\"\n                (actionClick)=\"actionClick.emit($event)\"\n                (menuItemClick)=\"menuItemClick.emit($event)\"\n                (loadMoreClick)=\"loadMoreClick.emit($event)\"\n                (collapseToggle)=\"collapseToggle.emit($event)\"\n              ></val-comment>\n            }\n\n            @if (hasMoreReplies()) {\n              <button class=\"load-more-button\" (click)=\"onLoadMoreClick()\">\n                <ion-icon name=\"chatbubble-outline\"></ion-icon>\n                <span>{{ getLoadMoreRepliesText() }}</span>\n              </button>\n            }\n          } @else {\n            <button class=\"view-replies-button\" (click)=\"onLoadMoreClick()\">\n              <ion-icon name=\"chatbubble-outline\"></ion-icon>\n              <span>{{ getViewRepliesText() }}</span>\n            </button>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./comment.component.scss'],\n})\n/**\n * val-comment\n *\n * A versatile comment component for forums, reviews, and social media.\n * Supports author info, reactions, actions, nested replies, and more.\n *\n * @example Basic comment\n * <val-comment [props]=\"{\n *   token: '1',\n *   author: { name: 'John Doe', username: 'johnd' },\n *   content: 'This is a great post!',\n *   timestamp: '2 hours ago'\n * }\"></val-comment>\n *\n * @example With reactions and actions\n * <val-comment [props]=\"{\n *   token: '1',\n *   author: { name: 'Jane', avatar: avatarProps, verified: true },\n *   content: 'Amazing content! Check out https://example.com',\n *   timestamp: new Date(),\n *   reactions: [\n *     { token: 'like', icon: 'heart-outline', count: 42, active: false }\n *   ],\n *   actions: [\n *     { token: 'reply', label: 'Reply', icon: 'chatbubble-outline' }\n *   ],\n *   menuItems: [\n *     { token: 'edit', label: 'Edit', icon: 'pencil' },\n *     { token: 'delete', label: 'Delete', icon: 'trash', color: 'danger' }\n *   ]\n * }\"></val-comment>\n *\n * @input props: CommentMetadata - Configuration for the comment\n * @output authorClick - Emits when author name/avatar is clicked\n * @output reactionClick - Emits when a reaction is clicked\n * @output actionClick - Emits when an action button is clicked\n * @output menuItemClick - Emits when a menu item is clicked\n * @output loadMoreClick - Emits when load more replies is clicked\n * @output collapseToggle - Emits when comment is collapsed/expanded\n */\nexport class CommentComponent implements OnInit {\n  protected i18n = inject(I18nService);\n\n  @Input() props: CommentMetadata;\n\n  @Output() authorClick = new EventEmitter<CommentAuthorClickEvent>();\n  @Output() reactionClick = new EventEmitter<CommentReactionClickEvent>();\n  @Output() actionClick = new EventEmitter<CommentActionClickEvent>();\n  @Output() menuItemClick = new EventEmitter<CommentMenuItemClickEvent>();\n  @Output() loadMoreClick = new EventEmitter<CommentLoadMoreEvent>();\n  @Output() collapseToggle = new EventEmitter<{ token: string; collapsed: boolean }>();\n\n  displayContent: string = '';\n\n  ngOnInit(): void {\n    this.displayContent = this.props.content || this.props.contentFallback || '';\n  }\n\n  getInitials(name: string): string {\n    return name\n      .split(' ')\n      .map((n) => n[0])\n      .join('')\n      .substring(0, 2)\n      .toUpperCase();\n  }\n\n  formatTimestamp(timestamp: string | Date): string {\n    if (typeof timestamp === 'string') {\n      return timestamp;\n    }\n\n    const now = new Date();\n    const diff = now.getTime() - timestamp.getTime();\n    const seconds = Math.floor(diff / 1000);\n    const minutes = Math.floor(seconds / 60);\n    const hours = Math.floor(minutes / 60);\n    const days = Math.floor(hours / 24);\n\n    if (seconds < 60) return this.i18n.t('justNow');\n    if (minutes < 60) return this.i18n.t('minutesAgo', '_global', { minutes: minutes.toString() });\n    if (hours < 24) return this.i18n.t('hoursAgo', '_global', { hours: hours.toString() });\n    if (days < 7) return this.i18n.t('daysAgo', '_global', { days: days.toString() });\n\n    return timestamp.toLocaleDateString();\n  }\n\n  getLoadMoreRepliesText(): string {\n    const count = this.getRemainingCount();\n    return this.i18n.t('loadMoreReplies') + ` (${count})`;\n  }\n\n  getViewRepliesText(): string {\n    const count = this.props.replyCount || this.props.children?.length || 0;\n    return this.i18n.t('viewReplies') + ` (${count})`;\n  }\n\n  formatCount(count: number): string {\n    if (count >= 1000000) {\n      return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n    }\n    if (count >= 1000) {\n      return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n    }\n    return count.toString();\n  }\n\n  processContent(content: string): string {\n    if (this.props.autoLinkify === false) {\n      return this.escapeHtml(content);\n    }\n\n    // Escape HTML first\n    let processed = this.escapeHtml(content);\n\n    // URL regex\n    const urlRegex = /(https?:\\/\\/[^\\s<]+[^\\s<.,;:!?)\\]'\"])/gi;\n    processed = processed.replace(\n      urlRegex,\n      '<a href=\"$1\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"comment-link\">$1</a>'\n    );\n\n    // @mentions\n    const mentionRegex = /@(\\w+)/g;\n    processed = processed.replace(\n      mentionRegex,\n      '<span class=\"comment-mention\">@$1</span>'\n    );\n\n    // #hashtags\n    const hashtagRegex = /#(\\w+)/g;\n    processed = processed.replace(\n      hashtagRegex,\n      '<span class=\"comment-hashtag\">#$1</span>'\n    );\n\n    // Preserve line breaks\n    processed = processed.replace(/\\n/g, '<br>');\n\n    return processed;\n  }\n\n  private escapeHtml(text: string): string {\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  getReactionColor(reaction: CommentReaction): string {\n    if (reaction.active && reaction.activeColor) {\n      return `var(--ion-color-${reaction.activeColor})`;\n    }\n    if (reaction.active) {\n      return 'var(--ion-color-primary)';\n    }\n    if (reaction.color) {\n      return `var(--ion-color-${reaction.color})`;\n    }\n    return 'var(--ion-color-medium)';\n  }\n\n  getActionLabel(action: CommentAction): string {\n    return action.label || action.contentFallback || '';\n  }\n\n  getMenuItemLabel(item: CommentMenuItem): string {\n    return item.label || item.contentFallback || '';\n  }\n\n  hasChildren(): boolean {\n    return !!(this.props.children && this.props.children.length > 0) ||\n           !!(this.props.replyCount && this.props.replyCount > 0);\n  }\n\n  canShowChildren(): boolean {\n    const maxDepth = this.props.maxDepth ?? 3;\n    const currentDepth = this.props.depth ?? 0;\n    return currentDepth < maxDepth && !!(this.props.children && this.props.children.length > 0);\n  }\n\n  getChildProps(child: CommentMetadata): CommentMetadata {\n    return {\n      ...child,\n      depth: (this.props.depth ?? 0) + 1,\n      maxDepth: this.props.maxDepth ?? 3,\n    };\n  }\n\n  hasMoreReplies(): boolean {\n    if (!this.props.replyCount) return false;\n    const loadedCount = this.props.children?.length ?? 0;\n    return this.props.replyCount > loadedCount;\n  }\n\n  getRemainingCount(): number {\n    const total = this.props.replyCount ?? 0;\n    const loaded = this.props.children?.length ?? 0;\n    return total - loaded;\n  }\n\n  onAuthorClick(): void {\n    this.authorClick.emit({\n      author: this.props.author,\n      commentToken: this.props.token,\n    });\n  }\n\n  onReactionClick(reaction: CommentReaction): void {\n    this.reactionClick.emit({\n      reaction,\n      commentToken: this.props.token,\n      isActive: !reaction.active,\n    });\n  }\n\n  onActionClick(action: CommentAction): void {\n    this.actionClick.emit({\n      action,\n      commentToken: this.props.token,\n    });\n  }\n\n  onMenuItemClick(item: CommentMenuItem): void {\n    this.menuItemClick.emit({\n      menuItem: item,\n      commentToken: this.props.token,\n    });\n  }\n\n  onLoadMoreClick(): void {\n    this.loadMoreClick.emit({\n      commentToken: this.props.token,\n      currentCount: this.props.children?.length ?? 0,\n    });\n  }\n\n  onToggleCollapse(): void {\n    this.collapseToggle.emit({\n      token: this.props.token,\n      collapsed: !this.props.collapsed,\n    });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  inject,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ViewChild,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { IonicModule, IonModal } from '@ionic/angular';\nimport { Subscription } from 'rxjs';\nimport { I18nService } from '../../../services/i18n';\nimport { IconService } from '../../../services/icons.service';\nimport { applyDefaultValueToControl } from '../../../shared/utils/form-defaults';\nimport { replaceSpecialChars } from '../../../shared/utils/text';\nimport { InputMetadata, InputOption } from '../../types';\nimport { SearchbarComponent } from '../searchbar/searchbar.component';\n\n@Component({\n  selector: 'val-multi-select-search',\n  standalone: true,\n  imports: [CommonModule, IonicModule, FormsModule, SearchbarComponent, ReactiveFormsModule],\n  template: `\n    <ion-input\n      type=\"text\"\n      [value]=\"displayValue\"\n      [placeholder]=\"getPlaceholder()\"\n      readonly\n      (mousedown)=\"preventDefaultBehavior($event)\"\n    />\n\n    <ion-input style=\"position: absolute;\" [formControl]=\"props.control\" type=\"hidden\"></ion-input>\n\n    <ion-modal\n      #modal\n      trigger=\"open-modal\"\n      [initialBreakpoint]=\"1\"\n      [breakpoints]=\"[0, 0.5, 0.75, 1]\"\n      (didDismiss)=\"resetState()\"\n    >\n      <ng-template>\n        <ion-header>\n          <ion-toolbar>\n            <ion-title>{{ getLabel() }}</ion-title>\n            <ion-buttons slot=\"end\">\n              <ion-button (click)=\"cancelModal()\">{{ getCloseText() }}</ion-button>\n            </ion-buttons>\n          </ion-toolbar>\n          <ion-toolbar>\n            <val-searchbar (filterEvent)=\"onFilter($event)\" (focusEvent)=\"onFocus()\" (blurEvent)=\"onBlur()\" />\n          </ion-toolbar>\n        </ion-header>\n        <ion-content>\n          <!-- Action buttons for multi-select -->\n          <div class=\"actions-container\" style=\"padding: 16px; border-bottom: 1px solid var(--ion-color-light-shade);\">\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              (click)=\"selectAll()\"\n              [disabled]=\"filteredItems.length === 0\"\n            >\n              {{ getSelectAllText() }}\n            </ion-button>\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              color=\"medium\"\n              (click)=\"clearAll()\"\n              [disabled]=\"selectedItems.length === 0\"\n            >\n              {{ getClearText() }}\n            </ion-button>\n          </div>\n\n          <ion-list>\n            <ion-item *ngFor=\"let item of filteredItems\" button (click)=\"selectItem(item)\" detail=\"false\">\n              <ion-checkbox\n                slot=\"start\"\n                [checked]=\"isItemSelected(item)\"\n              ></ion-checkbox>\n              <ion-label>{{ item[labelProperty] }}</ion-label>\n            </ion-item>\n            <ion-item *ngIf=\"filteredItems.length === 0\" lines=\"none\">\n              <ion-label color=\"dark\">{{ getNoResultsText() }}</ion-label>\n            </ion-item>\n          </ion-list>\n        </ion-content>\n        <ion-footer>\n          <ion-toolbar>\n            <ion-button expand=\"full\" (click)=\"applyAndClose()\">\n              {{ getApplyText() }}\n            </ion-button>\n          </ion-toolbar>\n        </ion-footer>\n      </ng-template>\n    </ion-modal>\n  `,\n  styles: [\n    `\n      ion-header {\n        padding: 8px 8px 0px 8px;\n      }\n      .actions-container {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n      }\n    `,\n  ],\n})\nexport class MultiSelectSearchComponent implements OnChanges, OnDestroy {\n  @ViewChild('modal') modal!: IonModal;\n\n  @Input() label: string = '';\n  @Input() labelProperty: string = 'name';\n  @Input() valueProperty: string = 'id';\n  @Input() placeholder: string = '';\n\n  @Input() props: InputMetadata;\n\n  icon = inject(IconService);\n  private changeDetector = inject(ChangeDetectorRef);\n  private i18n = inject(I18nService);\n\n  /** Get resolved label with i18n fallback */\n  getLabel(): string {\n    return this.label || this.i18n.t('selectOptions');\n  }\n\n  /** Get resolved placeholder with i18n fallback */\n  getPlaceholder(): string {\n    return this.props?.placeholder || this.placeholder || this.i18n.t('selectOptions');\n  }\n\n  /** Get close button text */\n  getCloseText(): string {\n    return this.i18n.t('close');\n  }\n\n  /** Get no results text */\n  getNoResultsText(): string {\n    return this.i18n.t('noResults');\n  }\n\n  /** Get select all text */\n  getSelectAllText(): string {\n    return this.i18n.t('selectAll');\n  }\n\n  /** Get clear text */\n  getClearText(): string {\n    return this.i18n.t('clear');\n  }\n\n  /** Get apply text */\n  getApplyText(): string {\n    return this.i18n.t('apply');\n  }\n\n  /** Get items selected text */\n  getItemsSelectedText(count: number): string {\n    return `${count} ${this.i18n.t('itemsSelected')}`;\n  }\n\n  searchTerm: string = '';\n  filteredItems: InputOption[] = [];\n  selectedItems: InputOption[] = [];\n  displayValue: string = '';\n\n  private previousOptions: any[] = [];\n  private isProcessingChanges = false;\n  private valueChangesSubscription?: Subscription;\n\n  ngOnInit() {\n    this.applyDefaultValue();\n    this.initializeItems();\n    this.syncControlValueWithSelectedItems();\n    this.updateDisplayValue();\n    this.subscribeToValueChanges();\n  }\n\n  ngOnDestroy() {\n    // Limpiar suscripciones para evitar memory leaks\n    if (this.valueChangesSubscription) {\n      this.valueChangesSubscription.unsubscribe();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Evitar bucles infinitos\n    if (this.isProcessingChanges) {\n      return;\n    }\n\n    // Cuando cambia props o props.options\n    if (changes['props']) {\n      try {\n        this.isProcessingChanges = true;\n\n        // Desuscribirse del antiguo control si existe\n        if (this.valueChangesSubscription) {\n          this.valueChangesSubscription.unsubscribe();\n        }\n\n        if (this.props?.options) {\n          // Verificar si las opciones han cambiado realmente\n          const optionsChanged = !this.areOptionsEqual(this.previousOptions, this.props.options);\n\n          if (optionsChanged) {\n            this.previousOptions = [...this.props.options];\n            this.initializeItems();\n          }\n        }\n\n        // Sincronizar con el nuevo control si existe\n        this.syncControlValueWithSelectedItems();\n        this.updateDisplayValue();\n\n        // Suscribirse al nuevo control\n        this.subscribeToValueChanges();\n      } finally {\n        this.isProcessingChanges = false;\n      }\n    }\n  }\n\n  ionViewWillEnter(): void {\n    if (this.isProcessingChanges) {\n      return;\n    }\n\n    try {\n      this.isProcessingChanges = true;\n      this.initializeItems();\n      this.syncControlValueWithSelectedItems();\n      this.updateDisplayValue();\n      this.subscribeToValueChanges();\n    } finally {\n      this.isProcessingChanges = false;\n    }\n  }\n\n  // Suscribirse a cambios en el FormControl\n  private subscribeToValueChanges() {\n    if (!this.props?.control) return;\n\n    this.valueChangesSubscription = this.props.control.valueChanges.subscribe(value => {\n      if (this.isProcessingChanges) return;\n\n      try {\n        this.isProcessingChanges = true;\n        this.syncControlValueWithSelectedItems();\n        this.updateDisplayValue();\n      } finally {\n        this.isProcessingChanges = false;\n      }\n    });\n  }\n\n  // Compara si dos arrays de opciones son iguales\n  private areOptionsEqual(prevOptions: any[], newOptions: any[]): boolean {\n    if (prevOptions === newOptions) return true;\n    if (!prevOptions || !newOptions) return prevOptions === newOptions;\n    if (prevOptions.length !== newOptions.length) return false;\n    for (let i = 0; i < prevOptions.length; i++) {\n      if (prevOptions[i][this.valueProperty] !== newOptions[i][this.valueProperty]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  private initializeItems(): void {\n    this.filteredItems = this.props?.options || [];\n  }\n\n  private syncControlValueWithSelectedItems(): void {\n    if (!this.props?.control) {\n      this.selectedItems = [];\n      return;\n    }\n    const controlValue = this.props.control.value;\n    if (controlValue === null || controlValue === undefined || controlValue === '') {\n      this.selectedItems = [];\n      return;\n    }\n\n    // Parse comma-separated values for multi-select\n    const values = typeof controlValue === 'string' \n      ? controlValue.split(',').map(v => v.trim()).filter(v => v !== '')\n      : Array.isArray(controlValue) ? controlValue : [controlValue];\n\n    if (this.props.options && this.props.options.length > 0) {\n      const map = new Map(this.props.options.map(opt => [String(opt[this.valueProperty]), opt]));\n      this.selectedItems = values.map(val => map.get(String(val))).filter(Boolean);\n    } else {\n      this.selectedItems = [];\n    }\n  }\n\n  private applyDefaultValue(): void {\n    applyDefaultValueToControl(this.props);\n  }\n\n  onFilter(event) {\n    // If no search term, show all options\n    if (!event || event.trim() === '') {\n      this.filteredItems = this.props?.options ? [...this.props.options] : [];\n      this.changeDetector.detectChanges();\n      return;\n    }\n\n    // If no options, nothing to filter\n    if (!this.props?.options || this.props.options.length === 0) {\n      this.filteredItems = [];\n      this.changeDetector.detectChanges();\n      return;\n    }\n\n    const search = replaceSpecialChars(event.toLowerCase());\n    this.filteredItems = this.props.options.filter(element => {\n      const label = element[this.labelProperty]\n        ? replaceSpecialChars(String(element[this.labelProperty]).toLowerCase())\n        : '';\n      const value = element[this.valueProperty]\n        ? replaceSpecialChars(String(element[this.valueProperty]).toLowerCase())\n        : '';\n      return label.includes(search) || value.includes(search);\n    });\n    this.changeDetector.detectChanges();\n  }\n\n  onFocus() {\n    console.log('onFocus');\n  }\n\n  onBlur() {\n    console.log('onBlur');\n  }\n\n  openModal() {\n    if (this.modal) {\n      this.modal.present();\n    }\n  }\n\n  preventDefaultBehavior(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n    this.openModal();\n  }\n\n  /**\n   * Reset state only - called by didDismiss event\n   * Separated from closeModal to avoid double dismissal and scroll issues\n   */\n  resetState(): void {\n    this.searchTerm = '';\n    this.filteredItems = this.props?.options ? [...this.props.options] : [];\n  }\n\n  /**\n   * Close modal only - does not reset state (didDismiss will handle that)\n   */\n  closeModal(): void {\n    if (this.modal) {\n      this.modal.dismiss();\n    }\n  }\n\n  /**\n   * @deprecated Use closeModal() instead. Kept for backwards compatibility.\n   */\n  cancelModal(): void {\n    this.closeModal();\n  }\n\n  selectItem(item: any) {\n    // Multi-select logic: toggle selection\n    const index = this.selectedItems.findIndex(\n      selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]\n    );\n\n    if (index === -1) {\n      // Add to selection\n      this.selectedItems.push(item);\n    } else {\n      // Remove from selection\n      this.selectedItems.splice(index, 1);\n    }\n\n    this.updateDisplayValue();\n    this.applyChanges();\n  }\n\n  selectAll(): void {\n    // Add all filtered items that aren't already selected\n    this.filteredItems.forEach(item => {\n      const isAlreadySelected = this.selectedItems.some(\n        selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]\n      );\n      if (!isAlreadySelected) {\n        this.selectedItems.push(item);\n      }\n    });\n\n    this.updateDisplayValue();\n    this.applyChanges();\n  }\n\n  clearAll(): void {\n    this.selectedItems = [];\n    this.updateDisplayValue();\n    this.applyChanges();\n  }\n\n  isItemSelected(item: any): boolean {\n    return this.selectedItems.some(selectedItem => selectedItem[this.valueProperty] === item[this.valueProperty]);\n  }\n\n  updateDisplayValue() {\n    if (this.selectedItems.length === 0) {\n      this.displayValue = '';\n      return;\n    }\n\n    if (this.selectedItems.length === 1) {\n      this.displayValue = this.selectedItems[0][this.labelProperty];\n    } else {\n      this.displayValue = this.getItemsSelectedText(this.selectedItems.length);\n    }\n  }\n\n  applyChanges() {\n    if (!this.props?.control) {\n      return;\n    }\n\n    try {\n      this.isProcessingChanges = true;\n\n      // Convert selected items to comma-separated string of values\n      const selectedValues = this.selectedItems.map(item => String(item[this.valueProperty]));\n      const value = selectedValues.join(',');\n\n      this.props.control.setValue(value);\n      this.props.control.markAsDirty();\n      this.props.control.updateValueAndValidity();\n    } finally {\n      this.isProcessingChanges = false;\n    }\n  }\n\n  applyAndClose() {\n    this.applyChanges();\n    this.closeModal();\n  }\n\n  // Método público para reiniciar el componente\n  reset() {\n    this.selectedItems = [];\n    this.displayValue = '';\n    if (this.props?.control) {\n      this.props.control.setValue('');\n    }\n    this.changeDetector.detectChanges();\n  }\n}","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\nexport interface QuoteBoxMetadata {\n  /** Contenido de la cita */\n  content: string;\n  /** Autor de la cita */\n  author?: string;\n  /** Fuente de la cita (libro, artículo, etc.) */\n  source?: string;\n  /** Tamaño del texto */\n  size?: 'small' | 'medium' | 'large' | 'xlarge';\n  /** Color de la cita */\n  color?: 'primary' | 'secondary' | 'tertiary' | 'success' | 'warning' | 'danger' | 'dark' | 'light' | 'medium';\n  /** Color del autor y fuente */\n  authorColor?: 'primary' | 'secondary' | 'tertiary' | 'success' | 'warning' | 'danger' | 'dark' | 'light' | 'medium';\n  /** Alineación del contenido */\n  alignment?: 'left' | 'center' | 'right';\n  /** Mostrar comillas decorativas */\n  showQuoteMark?: boolean;\n  /** Texto en negrita */\n  bold?: boolean;\n}\n\n@Component({\n  selector: 'quote-box',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"quote-box\"\n      [ngClass]=\"{\n        'quote-box--primary': props.color === 'primary',\n        'quote-box--secondary': props.color === 'secondary',\n        'quote-box--tertiary': props.color === 'tertiary',\n        'quote-box--success': props.color === 'success',\n        'quote-box--warning': props.color === 'warning',\n        'quote-box--danger': props.color === 'danger',\n        'quote-box--dark': props.color === 'dark',\n        'quote-box--light': props.color === 'light',\n        'quote-box--medium': props.color === 'medium',\n        'quote-box--left': props.alignment === 'left',\n        'quote-box--center': props.alignment === 'center' || !props.alignment,\n        'quote-box--right': props.alignment === 'right',\n      }\"\n    >\n      <!-- Comillas decorativas -->\n      <div\n        *ngIf=\"props.showQuoteMark !== false\"\n        class=\"quote-box__quote-mark\"\n        [ngClass]=\"{\n          'quote-box__quote-mark--small': props.size === 'small',\n          'quote-box__quote-mark--medium': props.size === 'medium' || !props.size,\n          'quote-box__quote-mark--large': props.size === 'large',\n          'quote-box__quote-mark--xlarge': props.size === 'xlarge',\n        }\"\n      >\n        \"\n      </div>\n\n      <!-- Contenido de la cita -->\n      <div\n        class=\"quote-box__content\"\n        [ngClass]=\"{\n          'quote-box__content--small': props.size === 'small',\n          'quote-box__content--medium': props.size === 'medium' || !props.size,\n          'quote-box__content--large': props.size === 'large',\n          'quote-box__content--xlarge': props.size === 'xlarge',\n          'quote-box__content--bold': props.bold,\n        }\"\n      >\n        {{ props.content }}\n      </div>\n\n      <!-- Autor y fuente -->\n      <div\n        *ngIf=\"props.author\"\n        class=\"quote-box__attribution\"\n        [ngClass]=\"{\n          'quote-box__attribution--small': props.size === 'small',\n          'quote-box__attribution--medium': props.size === 'medium' || !props.size,\n          'quote-box__attribution--large': props.size === 'large',\n          'quote-box__attribution--xlarge': props.size === 'xlarge',\n          'quote-box__attribution--bold': props.bold,\n          'quote-box__attribution--primary': props.authorColor === 'primary',\n          'quote-box__attribution--secondary': props.authorColor === 'secondary',\n          'quote-box__attribution--tertiary': props.authorColor === 'tertiary',\n          'quote-box__attribution--success': props.authorColor === 'success',\n          'quote-box__attribution--warning': props.authorColor === 'warning',\n          'quote-box__attribution--danger': props.authorColor === 'danger',\n          'quote-box__attribution--dark': props.authorColor === 'dark',\n          'quote-box__attribution--light': props.authorColor === 'light',\n          'quote-box__attribution--color-medium': props.authorColor === 'medium',\n        }\"\n      >\n        {{ props.author }}<span *ngIf=\"props.source\">, {{ props.source }}</span>\n      </div>\n    </div>\n  `,\n  styleUrls: ['./quote-box.component.scss'],\n})\nexport class QuoteBoxComponent {\n  @Input() props!: QuoteBoxMetadata;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonTextarea, IonNote } from '@ionic/angular/standalone';\nimport { PresetService } from '../../../services/presets';\nimport { ComponentStates } from '../../types';\nimport { TextareaInputMetadata } from './types';\n\n@Component({\n  selector: 'val-textarea-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonTextarea, IonNote],\n  template: `\n    <div class=\"textarea-container\" [class]=\"resolvedProps.cssClass\" [class.has-error]=\"hasError\">\n      <ion-textarea\n        [formControl]=\"resolvedProps.control\"\n        [placeholder]=\"getPlaceholder()\"\n        [label]=\"getLabel()\"\n        [labelPlacement]=\"resolvedProps.labelPlacement || 'stacked'\"\n        [fill]=\"resolvedProps.fill || 'outline'\"\n        [color]=\"hasError ? 'danger' : resolvedProps.color\"\n        [rows]=\"resolvedProps.rows || 4\"\n        [autoGrow]=\"resolvedProps.autoGrow ?? false\"\n        [maxlength]=\"resolvedProps.maxLength\"\n        [minlength]=\"resolvedProps.minLength\"\n        [disabled]=\"resolvedProps.state === states.DISABLED\"\n        [readonly]=\"resolvedProps.state === states.WORKING\"\n        [spellcheck]=\"resolvedProps.spellcheck ?? true\"\n        [autocapitalize]=\"resolvedProps.autocapitalize || 'sentences'\"\n        [inputmode]=\"resolvedProps.inputMode || 'text'\"\n        [wrap]=\"resolvedProps.wrap || 'soft'\"\n        [counter]=\"resolvedProps.showCounter && !!resolvedProps.maxLength\"\n        [counterFormatter]=\"counterFormatter\"\n        [class.no-resize]=\"resolvedProps.disableResize\"\n      ></ion-textarea>\n\n      @if (resolvedProps.showCounter && resolvedProps.maxLength && resolvedProps.counterFormat === 'remaining') {\n        <div class=\"char-counter remaining\">\n          {{ getRemainingChars() }} {{ getRemainingLabel() }}\n        </div>\n      }\n\n      @if (resolvedProps.hint && !hasError) {\n        <ion-note class=\"hint\">{{ getHint() }}</ion-note>\n      }\n\n      @if (hasError && resolvedProps.showErrors) {\n        <ion-note class=\"error-message\" color=\"danger\">\n          {{ getErrorMessage() }}\n        </ion-note>\n      }\n    </div>\n  `,\n  styleUrls: ['./textarea-input.component.scss'],\n})\n/**\n * val-textarea-input\n *\n * A textarea input field with character counter, auto-grow, and validation support.\n *\n * @example Basic usage\n * ```html\n * <val-textarea-input\n *   [props]=\"{\n *     control: messageControl,\n *     placeholder: 'Enter your message',\n *     rows: 4\n *   }\"\n * ></val-textarea-input>\n * ```\n *\n * @example With counter and validation\n * ```html\n * <val-textarea-input\n *   [props]=\"{\n *     control: bioControl,\n *     label: 'Bio',\n *     placeholder: 'Tell us about yourself',\n *     maxLength: 500,\n *     showCounter: true,\n *     counterFormat: 'remaining',\n *     autoGrow: true,\n *     showErrors: true,\n *     errors: { maxlength: 'Bio is too long' }\n *   }\"\n * ></val-textarea-input>\n * ```\n */\nexport class TextareaInputComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable textarea configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-textarea-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-textarea-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Textarea configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<TextareaInputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: TextareaInputMetadata = {} as TextareaInputMetadata;\n\n  states = ComponentStates;\n\n  ngOnInit(): void {\n    this.resolveProps();\n    this.applyDefaultValue();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      this.applyDefaultValue();\n    }\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('textareaInput', this.preset) as Partial<TextareaInputMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as TextareaInputMetadata;\n  }\n\n  private applyDefaultValue(): void {\n    if (this.resolvedProps?.withDefault || this.resolvedProps?.value) {\n      const defaultValue =\n        typeof this.resolvedProps.withDefault === 'string' ? this.resolvedProps.withDefault : this.resolvedProps.value || '';\n      if (this.resolvedProps.control && !this.resolvedProps.control.value) {\n        this.resolvedProps.control.setValue(defaultValue);\n      }\n    }\n  }\n\n  getLabel(): string {\n    return this.resolvedProps.label || '';\n  }\n\n  getPlaceholder(): string {\n    return this.resolvedProps.placeholder || '';\n  }\n\n  getHint(): string {\n    return this.resolvedProps.hint || '';\n  }\n\n  get hasError(): boolean {\n    return !!(this.resolvedProps.control?.touched && this.resolvedProps.control?.invalid);\n  }\n\n  getErrorMessage(): string {\n    if (!this.resolvedProps.control?.errors || !this.resolvedProps.errors) {\n      return '';\n    }\n\n    const errorKeys = Object.keys(this.resolvedProps.control.errors);\n    for (const key of errorKeys) {\n      if (this.resolvedProps.errors[key]) {\n        return this.resolvedProps.errors[key];\n      }\n    }\n\n    return '';\n  }\n\n  getRemainingChars(): number {\n    const currentLength = this.resolvedProps.control?.value?.length || 0;\n    return (this.resolvedProps.maxLength || 0) - currentLength;\n  }\n\n  getRemainingLabel(): string {\n    const remaining = this.getRemainingChars();\n    return remaining === 1 ? 'character remaining' : 'characters remaining';\n  }\n\n  // Counter formatter for Ionic's built-in counter\n  counterFormatter = (inputLength: number, maxLength: number): string => {\n    return `${inputLength}/${maxLength}`;\n  };\n}\n","import { FormControl } from '@angular/forms';\nimport { Color } from '@ionic/core';\nimport { ComponentState } from '../../types';\n\n/**\n * Country code option for phone input.\n */\nexport interface CountryCode {\n  /** ISO country code (e.g., 'US', 'MX', 'ES') */\n  code: string;\n  /** Country name */\n  name: string;\n  /** Dial code (e.g., '+1', '+52', '+34') */\n  dialCode: string;\n  /** Flag emoji (optional) */\n  flag?: string;\n  /** Phone number format pattern (optional) */\n  format?: string;\n}\n\n/**\n * Common country codes for quick access.\n */\nexport const COMMON_COUNTRY_CODES: CountryCode[] = [\n  { code: 'US', name: 'United States', dialCode: '+1', flag: '🇺🇸', format: '(XXX) XXX-XXXX' },\n  { code: 'MX', name: 'México', dialCode: '+52', flag: '🇲🇽', format: 'XX XXXX XXXX' },\n  { code: 'ES', name: 'España', dialCode: '+34', flag: '🇪🇸', format: 'XXX XXX XXX' },\n  { code: 'AR', name: 'Argentina', dialCode: '+54', flag: '🇦🇷', format: 'XX XXXX XXXX' },\n  { code: 'CO', name: 'Colombia', dialCode: '+57', flag: '🇨🇴', format: 'XXX XXX XXXX' },\n  { code: 'CL', name: 'Chile', dialCode: '+56', flag: '🇨🇱', format: 'X XXXX XXXX' },\n  { code: 'PE', name: 'Perú', dialCode: '+51', flag: '🇵🇪', format: 'XXX XXX XXX' },\n  { code: 'BR', name: 'Brasil', dialCode: '+55', flag: '🇧🇷', format: 'XX XXXXX XXXX' },\n  { code: 'GB', name: 'United Kingdom', dialCode: '+44', flag: '🇬🇧', format: 'XXXX XXXXXX' },\n  { code: 'DE', name: 'Germany', dialCode: '+49', flag: '🇩🇪', format: 'XXX XXXXXXX' },\n  { code: 'FR', name: 'France', dialCode: '+33', flag: '🇫🇷', format: 'X XX XX XX XX' },\n  { code: 'IT', name: 'Italy', dialCode: '+39', flag: '🇮🇹', format: 'XXX XXX XXXX' },\n  { code: 'CA', name: 'Canada', dialCode: '+1', flag: '🇨🇦', format: '(XXX) XXX-XXXX' },\n];\n\n/**\n * Metadata for the phone input component.\n */\nexport interface PhoneInputMetadata {\n  /** Form control for the complete phone number (with country code) */\n  control: FormControl<string>;\n  /** Separate control for just the number (without country code) */\n  numberControl?: FormControl<string>;\n  /** Separate control for country code selection */\n  countryControl?: FormControl<string>;\n  /** Unique token for the input */\n  token?: string;\n  /** Display label */\n  label?: string;\n  /** Field name */\n  name?: string;\n  /** Help text */\n  hint?: string;\n  /** Input placeholder for phone number */\n  placeholder?: string;\n  /** Field state */\n  state?: ComponentState;\n\n  // === Country code options ===\n  /** Available country codes */\n  countryCodes?: CountryCode[];\n  /** Default country code (ISO code, e.g., 'MX') */\n  defaultCountry?: string;\n  /** Show country selector */\n  showCountrySelector?: boolean;\n  /** Show country flag */\n  showFlag?: boolean;\n  /** Allow searching countries */\n  searchableCountries?: boolean;\n  /** Preferred countries to show at top */\n  preferredCountries?: string[];\n\n  // === Validation ===\n  /** Validate phone format */\n  validateFormat?: boolean;\n  /** Custom validation pattern */\n  pattern?: string;\n  /** Minimum digits */\n  minDigits?: number;\n  /** Maximum digits */\n  maxDigits?: number;\n\n  // === Styling ===\n  /** Component color */\n  color?: Color;\n  /** Fill style */\n  fill?: 'outline' | 'solid';\n  /** Label placement */\n  labelPlacement?: 'fixed' | 'floating' | 'stacked' | 'start' | 'end';\n  /** Custom CSS class */\n  cssClass?: string;\n\n  // === Reactive content ===\n  /** Content key for reactive label */\n  labelContentKey?: string;\n  /** Content key for reactive placeholder */\n  placeholderContentKey?: string;\n  /** Content key for reactive hint */\n  hintContentKey?: string;\n  /** Component class name for content lookup */\n  contentClass?: string;\n\n  // === Validation display ===\n  /** Custom error messages */\n  errors?: Record<string, string>;\n  /** Show validation errors */\n  showErrors?: boolean;\n}\n\n/**\n * Event emitted when phone input changes.\n */\nexport interface PhoneInputChangeEvent {\n  /** Complete phone number with country code */\n  fullNumber: string;\n  /** Phone number without country code */\n  number: string;\n  /** Selected country */\n  country: CountryCode | null;\n  /** Whether the number is valid */\n  isValid: boolean;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  DoCheck,\n  inject,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n} from '@angular/core';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { IonSelect, IonSelectOption, IonNote, IonIcon } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { addIcons } from 'ionicons';\nimport { callOutline, chevronDownOutline } from 'ionicons/icons';\nimport { PresetService } from '../../../services/presets';\nimport { ComponentStates } from '../../types';\nimport { PhoneInputMetadata, PhoneInputChangeEvent, CountryCode, COMMON_COUNTRY_CODES } from './types';\n\naddIcons({ callOutline, chevronDownOutline });\n\n@Component({\n  selector: 'val-phone-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonSelect, IonSelectOption, IonNote, IonIcon],\n  template: `\n    <div class=\"phone-input-container\" [class]=\"resolvedProps.cssClass\" [class.has-error]=\"hasError\">\n      @if (resolvedProps.label) {\n        <label class=\"phone-label\">{{ getLabel() }}</label>\n      }\n\n      <div class=\"phone-input-wrapper\" [class.disabled]=\"resolvedProps.state === states.DISABLED\">\n        @if (resolvedProps.showCountrySelector !== false) {\n          <div class=\"country-selector\">\n            <ion-select\n              [formControl]=\"internalCountryControl\"\n              interface=\"popover\"\n              [interfaceOptions]=\"{ cssClass: 'country-select-popover' }\"\n              [disabled]=\"resolvedProps.state === states.DISABLED\"\n              (ionChange)=\"onCountryChange($event)\"\n            >\n              @for (country of getCountryList(); track country.code) {\n                <ion-select-option [value]=\"country.code\">\n                  @if (resolvedProps.showFlag !== false) {\n                    <span class=\"flag\">{{ country.flag }}</span>\n                  }\n                  {{ country.dialCode }}\n                </ion-select-option>\n              }\n            </ion-select>\n          </div>\n        } @else {\n          <div class=\"dial-code-display\">\n            {{ getSelectedCountry()?.dialCode || '+1' }}\n          </div>\n        }\n\n        <div class=\"number-input\">\n          <ion-icon name=\"call-outline\" aria-hidden=\"true\" class=\"phone-icon\"></ion-icon>\n          <input\n            type=\"tel\"\n            inputmode=\"tel\"\n            [formControl]=\"internalNumberControl\"\n            [placeholder]=\"getPlaceholder()\"\n            [attr.disabled]=\"resolvedProps.state === states.DISABLED ? true : null\"\n            [attr.readonly]=\"resolvedProps.state === states.WORKING ? true : null\"\n            [maxLength]=\"resolvedProps.maxDigits || 15\"\n            (input)=\"onNumberInputNative($event)\"\n            (blur)=\"onBlur()\"\n            class=\"phone-native-input\"\n          />\n        </div>\n      </div>\n\n      @if (resolvedProps.hint && !hasError) {\n        <ion-note class=\"hint\">{{ getHint() }}</ion-note>\n      }\n\n      @if (hasError && resolvedProps.showErrors) {\n        <ion-note class=\"error-message\" color=\"danger\">\n          {{ getErrorMessage() }}\n        </ion-note>\n      }\n    </div>\n  `,\n  styleUrls: ['./phone-input.component.scss'],\n})\n/**\n * val-phone-input\n *\n * A phone number input with country code selector.\n *\n * @example Basic usage\n * ```html\n * <val-phone-input\n *   [props]=\"{\n *     control: phoneControl,\n *     placeholder: 'Phone number',\n *     defaultCountry: 'MX'\n *   }\"\n * ></val-phone-input>\n * ```\n *\n * @example With custom countries\n * ```html\n * <val-phone-input\n *   [props]=\"{\n *     control: phoneControl,\n *     label: 'Phone',\n *     countryCodes: myCountryCodes,\n *     preferredCountries: ['MX', 'US', 'ES'],\n *     showErrors: true\n *   }\"\n *   (phoneChange)=\"onPhoneChange($event)\"\n * ></val-phone-input>\n * ```\n */\nexport class PhoneInputComponent implements OnInit, OnChanges, OnDestroy, DoCheck {\n  private presets = inject(PresetService);\n\n  /**\n   * Preset name to apply. Presets define reusable phone input configurations\n   * that can be registered at app level via provideValtechPresets().\n   *\n   * @example\n   * <val-phone-input preset=\"form-field\" [props]=\"{ control: ctrl }\"></val-phone-input>\n   */\n  @Input() preset?: string;\n\n  /**\n   * Phone input configuration object. Values here override preset values.\n   */\n  @Input() props: Partial<PhoneInputMetadata> = {};\n\n  /**\n   * Resolved props after merging preset + explicit props.\n   */\n  resolvedProps: PhoneInputMetadata = {} as PhoneInputMetadata;\n\n  @Output() phoneChange = new EventEmitter<PhoneInputChangeEvent>();\n\n  states = ComponentStates;\n\n  internalCountryControl = new FormControl<string>('');\n  internalNumberControl = new FormControl<string>('');\n\n  private valueSubscription: Subscription | null = null;\n  private isInternalUpdate = false;\n  /** Último valor del control externo ya reflejado en el input. */\n  private lastSyncedValue: string | null = null;\n\n  ngOnInit(): void {\n    this.resolveProps();\n    this.setupComponent();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n      this.setupComponent();\n    }\n  }\n\n  /**\n   * Refleja cambios del control externo que NO emiten `valueChanges` — p. ej.\n   * `patchValue(..., { emitEvent: false })` en una carga programática de datos.\n   * Sin esto el input quedaría vacío tras un `patchValue` silencioso.\n   */\n  ngDoCheck(): void {\n    const value = this.resolvedProps.control?.value ?? null;\n    if (value !== this.lastSyncedValue && !this.isInternalUpdate) {\n      this.lastSyncedValue = value;\n      if (value) {\n        this.parsePhoneNumber(value);\n      }\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.valueSubscription?.unsubscribe();\n  }\n\n  /**\n   * Merge preset configuration with explicit props.\n   * Explicit props take precedence over preset values.\n   */\n  private resolveProps(): void {\n    const presetProps = this.preset ? (this.presets.get('phoneInput', this.preset) as Partial<PhoneInputMetadata>) : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as PhoneInputMetadata;\n  }\n\n  private setupComponent(): void {\n    // Set default country — fallback Chile (mercado primario del factory Valtech).\n    // Cualquier consumer puede sobrescribir via `props.defaultCountry`.\n    const defaultCountry = this.resolvedProps.defaultCountry || 'CL';\n    this.internalCountryControl.setValue(defaultCountry);\n\n    // Sync with external controls if provided\n    if (this.resolvedProps.countryControl) {\n      this.internalCountryControl = this.resolvedProps.countryControl;\n    }\n    if (this.resolvedProps.numberControl) {\n      this.internalNumberControl = this.resolvedProps.numberControl;\n    }\n\n    // Parse initial value from main control\n    this.lastSyncedValue = this.resolvedProps.control?.value ?? null;\n    if (this.resolvedProps.control?.value) {\n      this.parsePhoneNumber(this.resolvedProps.control.value);\n    }\n\n    // Subscribe to main control changes\n    this.valueSubscription?.unsubscribe();\n    this.valueSubscription =\n      this.resolvedProps.control?.valueChanges.subscribe(value => {\n        if (value && !this.isInternalUpdate) {\n          this.parsePhoneNumber(value);\n        }\n      }) || null;\n  }\n\n  private parsePhoneNumber(value: string): void {\n    if (!value) return;\n\n    // Try to extract country code\n    const countries = this.getCountryList();\n    for (const country of countries) {\n      if (value.startsWith(country.dialCode)) {\n        this.internalCountryControl.setValue(country.code);\n        this.internalNumberControl.setValue(value.substring(country.dialCode.length).trim());\n        return;\n      }\n    }\n\n    // If no country code found, just set the number\n    this.internalNumberControl.setValue(value);\n  }\n\n  getLabel(): string {\n    return this.resolvedProps.label || '';\n  }\n\n  getPlaceholder(): string {\n    // Use format from selected country if available\n    const country = this.getSelectedCountry();\n    if (country?.format && !this.resolvedProps.placeholder) {\n      return country.format;\n    }\n    return this.resolvedProps.placeholder || '';\n  }\n\n  getHint(): string {\n    return this.resolvedProps.hint || '';\n  }\n\n  getCountryList(): CountryCode[] {\n    const countries = this.resolvedProps.countryCodes || COMMON_COUNTRY_CODES;\n\n    // Sort by preferred countries first\n    if (this.resolvedProps.preferredCountries?.length) {\n      const preferred = this.resolvedProps.preferredCountries;\n      return [\n        ...countries.filter(c => preferred.includes(c.code)),\n        ...countries.filter(c => !preferred.includes(c.code)),\n      ];\n    }\n\n    return countries;\n  }\n\n  getSelectedCountry(): CountryCode | null {\n    const code = this.internalCountryControl.value;\n    return this.getCountryList().find(c => c.code === code) || null;\n  }\n\n  get hasError(): boolean {\n    return !!(this.resolvedProps.control?.touched && this.resolvedProps.control?.invalid);\n  }\n\n  getErrorMessage(): string {\n    if (!this.resolvedProps.control?.errors || !this.resolvedProps.errors) {\n      return '';\n    }\n\n    const errorKeys = Object.keys(this.resolvedProps.control.errors);\n    for (const key of errorKeys) {\n      if (this.resolvedProps.errors[key]) {\n        return this.resolvedProps.errors[key];\n      }\n    }\n\n    return '';\n  }\n\n  onCountryChange(event: CustomEvent): void {\n    this.updateMainControl();\n  }\n\n  onNumberInput(event: CustomEvent): void {\n    // Filter non-numeric characters except spaces and dashes\n    let value = (event.detail.value || '').replace(/[^\\d\\s\\-]/g, '');\n\n    // Apply max digits limit\n    if (this.resolvedProps.maxDigits) {\n      const digitsOnly = value.replace(/\\D/g, '');\n      if (digitsOnly.length > this.resolvedProps.maxDigits) {\n        value = digitsOnly.substring(0, this.resolvedProps.maxDigits);\n      }\n    }\n\n    this.internalNumberControl.setValue(value);\n    this.updateMainControl();\n  }\n\n  onNumberInputNative(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    // Filter non-numeric characters except spaces and dashes\n    let value = (input.value || '').replace(/[^\\d\\s\\-]/g, '');\n\n    // Apply max digits limit\n    if (this.resolvedProps.maxDigits) {\n      const digitsOnly = value.replace(/\\D/g, '');\n      if (digitsOnly.length > this.resolvedProps.maxDigits) {\n        value = digitsOnly.substring(0, this.resolvedProps.maxDigits);\n      }\n    }\n\n    this.internalNumberControl.setValue(value);\n    this.updateMainControl();\n  }\n\n  onBlur(): void {\n    this.resolvedProps.control?.markAsTouched();\n  }\n\n  private updateMainControl(): void {\n    const country = this.getSelectedCountry();\n    const number = this.internalNumberControl.value || '';\n    const fullNumber = country ? `${country.dialCode}${number}` : number;\n\n    this.isInternalUpdate = true;\n    this.resolvedProps.control?.setValue(fullNumber);\n    this.isInternalUpdate = false;\n    // Evita que ngDoCheck re-parsee un cambio originado aquí mismo.\n    this.lastSyncedValue = fullNumber;\n\n    // Emit change event\n    const digitsOnly = number.replace(/\\D/g, '');\n    const isValid = this.validateNumber(digitsOnly);\n\n    this.phoneChange.emit({\n      fullNumber,\n      number,\n      country,\n      isValid,\n    });\n  }\n\n  private validateNumber(digitsOnly: string): boolean {\n    if (this.resolvedProps.minDigits && digitsOnly.length < this.resolvedProps.minDigits) {\n      return false;\n    }\n    if (this.resolvedProps.maxDigits && digitsOnly.length > this.resolvedProps.maxDigits) {\n      return false;\n    }\n    if (this.resolvedProps.pattern) {\n      const regex = new RegExp(this.resolvedProps.pattern);\n      return regex.test(digitsOnly);\n    }\n    // Default: at least 7 digits\n    return digitsOnly.length >= 7;\n  }\n}\n","import { FormControl } from '@angular/forms';\nimport { Color } from '@ionic/core';\nimport { ComponentState } from '../../types';\n\n/**\n * Currency configuration.\n */\nexport interface CurrencyConfig {\n  /** Currency code (ISO 4217, e.g., 'USD', 'MXN', 'EUR') */\n  code: string;\n  /** Currency symbol (e.g., '$', '€', '£') */\n  symbol: string;\n  /** Currency name */\n  name: string;\n  /** Symbol position */\n  symbolPosition?: 'prefix' | 'suffix';\n  /** Decimal separator */\n  decimalSeparator?: string;\n  /** Thousands separator */\n  thousandsSeparator?: string;\n  /** Number of decimal places */\n  decimalPlaces?: number;\n}\n\n/**\n * Common currency configurations.\n */\nexport const COMMON_CURRENCIES: CurrencyConfig[] = [\n  { code: 'USD', symbol: '$', name: 'US Dollar', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n  { code: 'MXN', symbol: '$', name: 'Mexican Peso', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n  { code: 'EUR', symbol: '€', name: 'Euro', symbolPosition: 'suffix', decimalSeparator: ',', thousandsSeparator: '.', decimalPlaces: 2 },\n  { code: 'GBP', symbol: '£', name: 'British Pound', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n  { code: 'CAD', symbol: 'CA$', name: 'Canadian Dollar', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n  { code: 'ARS', symbol: '$', name: 'Argentine Peso', symbolPosition: 'prefix', decimalSeparator: ',', thousandsSeparator: '.', decimalPlaces: 2 },\n  { code: 'CLP', symbol: '$', name: 'Chilean Peso', symbolPosition: 'prefix', decimalSeparator: ',', thousandsSeparator: '.', decimalPlaces: 0 },\n  { code: 'COP', symbol: '$', name: 'Colombian Peso', symbolPosition: 'prefix', decimalSeparator: ',', thousandsSeparator: '.', decimalPlaces: 2 },\n  { code: 'PEN', symbol: 'S/', name: 'Peruvian Sol', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n  { code: 'BRL', symbol: 'R$', name: 'Brazilian Real', symbolPosition: 'prefix', decimalSeparator: ',', thousandsSeparator: '.', decimalPlaces: 2 },\n  { code: 'JPY', symbol: '¥', name: 'Japanese Yen', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 0 },\n  { code: 'CNY', symbol: '¥', name: 'Chinese Yuan', symbolPosition: 'prefix', decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2 },\n];\n\n/**\n * Metadata for the currency input component.\n */\nexport interface CurrencyInputMetadata {\n  /** Form control for the numeric value (stores raw number) */\n  control: FormControl<number | null>;\n  /** Unique token for the input */\n  token?: string;\n  /** Display label */\n  label?: string;\n  /** Field name */\n  name?: string;\n  /** Help text */\n  hint?: string;\n  /** Input placeholder */\n  placeholder?: string;\n  /** Field state */\n  state?: ComponentState;\n\n  // === Currency options ===\n  /** Currency configuration */\n  currency?: CurrencyConfig;\n  /** Currency code (shortcut if not providing full config) */\n  currencyCode?: string;\n  /** Available currencies for selector */\n  currencies?: CurrencyConfig[];\n  /** Show currency selector */\n  showCurrencySelector?: boolean;\n  /** Allow negative values */\n  allowNegative?: boolean;\n\n  // === Formatting ===\n  /** Number of decimal places (overrides currency default) */\n  decimalPlaces?: number;\n  /** Show thousands separator */\n  showThousandsSeparator?: boolean;\n  /** Show currency symbol */\n  showSymbol?: boolean;\n\n  // === Validation ===\n  /** Minimum value */\n  min?: number;\n  /** Maximum value */\n  max?: number;\n\n  // === Styling ===\n  /** Component color */\n  color?: Color;\n  /** Fill style */\n  fill?: 'outline' | 'solid';\n  /** Label placement */\n  labelPlacement?: 'fixed' | 'floating' | 'stacked' | 'start' | 'end';\n  /** Custom CSS class */\n  cssClass?: string;\n\n  // === Reactive content ===\n  /** Content key for reactive label */\n  labelContentKey?: string;\n  /** Content key for reactive placeholder */\n  placeholderContentKey?: string;\n  /** Content key for reactive hint */\n  hintContentKey?: string;\n  /** Component class name for content lookup */\n  contentClass?: string;\n\n  // === Validation display ===\n  /** Custom error messages */\n  errors?: Record<string, string>;\n  /** Show validation errors */\n  showErrors?: boolean;\n}\n\n/**\n * Event emitted when currency input changes.\n */\nexport interface CurrencyInputChangeEvent {\n  /** Raw numeric value */\n  value: number | null;\n  /** Formatted display value */\n  formattedValue: string;\n  /** Selected currency */\n  currency: CurrencyConfig;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { IonInput, IonSelect, IonSelectOption, IonNote } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { ComponentStates } from '../../types';\nimport { CurrencyInputMetadata, CurrencyInputChangeEvent, CurrencyConfig, COMMON_CURRENCIES } from './types';\n\n@Component({\n  selector: 'val-currency-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonInput, IonSelect, IonSelectOption, IonNote],\n  template: `\n    <div class=\"currency-input-container\" [class]=\"props.cssClass\" [class.has-error]=\"hasError\">\n      @if (props.label) {\n        <label class=\"currency-label\">{{ getLabel() }}</label>\n      }\n\n      <div class=\"currency-input-wrapper\" [class.disabled]=\"props.state === states.DISABLED\">\n        @if (props.showCurrencySelector) {\n          <div class=\"currency-selector\">\n            <ion-select\n              [formControl]=\"currencyControl\"\n              interface=\"popover\"\n              [disabled]=\"props.state === states.DISABLED\"\n              (ionChange)=\"onCurrencyChange($event)\"\n            >\n              @for (curr of getCurrencyList(); track curr.code) {\n                <ion-select-option [value]=\"curr.code\">\n                  {{ curr.code }} ({{ curr.symbol }})\n                </ion-select-option>\n              }\n            </ion-select>\n          </div>\n        } @else if (props.showSymbol !== false) {\n          <div\n            class=\"currency-symbol\"\n            [class.prefix]=\"getSymbolPosition() === 'prefix'\"\n            [class.suffix]=\"getSymbolPosition() === 'suffix'\"\n          >\n            @if (getSymbolPosition() === 'prefix') {\n              {{ getCurrencySymbol() }}\n            }\n          </div>\n        }\n\n        <div class=\"amount-input\">\n          <ion-input\n            [formControl]=\"displayControl\"\n            type=\"text\"\n            inputmode=\"decimal\"\n            [placeholder]=\"getPlaceholder()\"\n            [disabled]=\"props.state === states.DISABLED\"\n            [readonly]=\"props.state === states.WORKING\"\n            (ionInput)=\"onInput($event)\"\n            (ionBlur)=\"onBlur()\"\n            (ionFocus)=\"onFocus()\"\n          ></ion-input>\n        </div>\n\n        @if (props.showSymbol !== false && getSymbolPosition() === 'suffix' && !props.showCurrencySelector) {\n          <div class=\"currency-symbol suffix\">\n            {{ getCurrencySymbol() }}\n          </div>\n        }\n      </div>\n\n      @if (props.hint && !hasError) {\n        <ion-note class=\"hint\">{{ getHint() }}</ion-note>\n      }\n\n      @if (hasError && props.showErrors) {\n        <ion-note class=\"error-message\" color=\"danger\">\n          {{ getErrorMessage() }}\n        </ion-note>\n      }\n    </div>\n  `,\n  styleUrls: ['./currency-input.component.scss'],\n})\n/**\n * val-currency-input\n *\n * A currency/money input with formatting, symbol display, and optional currency selector.\n *\n * @example Basic usage\n * ```html\n * <val-currency-input\n *   [props]=\"{\n *     control: priceControl,\n *     currencyCode: 'USD',\n *     placeholder: '0.00'\n *   }\"\n * ></val-currency-input>\n * ```\n *\n * @example With currency selector\n * ```html\n * <val-currency-input\n *   [props]=\"{\n *     control: amountControl,\n *     label: 'Amount',\n *     showCurrencySelector: true,\n *     currencies: myCurrencies,\n *     min: 0,\n *     max: 10000,\n *     showErrors: true\n *   }\"\n *   (currencyChange)=\"onCurrencyChange($event)\"\n * ></val-currency-input>\n * ```\n */\nexport class CurrencyInputComponent implements OnInit, OnDestroy {\n  @Input() props: CurrencyInputMetadata;\n\n  @Output() currencyChange = new EventEmitter<CurrencyInputChangeEvent>();\n\n  states = ComponentStates;\n\n  displayControl = new FormControl<string>('');\n  currencyControl = new FormControl<string>('');\n\n  private valueSubscription: Subscription | null = null;\n  private isFocused = false;\n\n  ngOnInit(): void {\n    // Set default currency\n    const defaultCurrency = this.props.currencyCode || this.props.currency?.code || 'USD';\n    this.currencyControl.setValue(defaultCurrency);\n\n    // Format initial value\n    if (this.props.control?.value !== null && this.props.control?.value !== undefined) {\n      this.displayControl.setValue(this.formatValue(this.props.control.value));\n    }\n\n    // Subscribe to main control changes\n    this.valueSubscription = this.props.control?.valueChanges.subscribe(value => {\n      if (!this.isFocused && value !== null && value !== undefined) {\n        this.displayControl.setValue(this.formatValue(value));\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.valueSubscription?.unsubscribe();\n  }\n\n  getLabel(): string {\n    return this.props.label || '';\n  }\n\n  getPlaceholder(): string {\n    return this.props.placeholder || this.getDefaultPlaceholder();\n  }\n\n  getHint(): string {\n    return this.props.hint || '';\n  }\n\n  private getDefaultPlaceholder(): string {\n    const decimals = this.getDecimalPlaces();\n    return decimals > 0 ? `0.${'0'.repeat(decimals)}` : '0';\n  }\n\n  getCurrencyList(): CurrencyConfig[] {\n    return this.props.currencies || COMMON_CURRENCIES;\n  }\n\n  getSelectedCurrency(): CurrencyConfig {\n    const code = this.currencyControl.value || 'USD';\n    return (\n      this.props.currency ||\n      this.getCurrencyList().find(c => c.code === code) ||\n      COMMON_CURRENCIES[0]\n    );\n  }\n\n  getCurrencySymbol(): string {\n    return this.getSelectedCurrency().symbol;\n  }\n\n  getSymbolPosition(): 'prefix' | 'suffix' {\n    return this.getSelectedCurrency().symbolPosition || 'prefix';\n  }\n\n  getDecimalPlaces(): number {\n    return this.props.decimalPlaces ?? this.getSelectedCurrency().decimalPlaces ?? 2;\n  }\n\n  get hasError(): boolean {\n    return !!(this.props.control?.touched && this.props.control?.invalid);\n  }\n\n  getErrorMessage(): string {\n    if (!this.props.control?.errors || !this.props.errors) {\n      return '';\n    }\n\n    const errorKeys = Object.keys(this.props.control.errors);\n    for (const key of errorKeys) {\n      if (this.props.errors[key]) {\n        return this.props.errors[key];\n      }\n    }\n\n    return '';\n  }\n\n  onInput(event: CustomEvent): void {\n    const inputValue = event.detail.value || '';\n\n    // Parse the numeric value\n    const numericValue = this.parseValue(inputValue);\n\n    // Update the main control with raw number\n    this.props.control?.setValue(numericValue);\n\n    // Emit change\n    this.emitChange(numericValue);\n  }\n\n  onFocus(): void {\n    this.isFocused = true;\n\n    // Show raw number for editing\n    const value = this.props.control?.value;\n    if (value !== null && value !== undefined) {\n      this.displayControl.setValue(String(value));\n    }\n  }\n\n  onBlur(): void {\n    this.isFocused = false;\n    this.props.control?.markAsTouched();\n\n    // Format the display value\n    const value = this.props.control?.value;\n    if (value !== null && value !== undefined) {\n      this.displayControl.setValue(this.formatValue(value));\n    }\n  }\n\n  onCurrencyChange(event: CustomEvent): void {\n    // Reformat with new currency settings\n    const value = this.props.control?.value;\n    if (value !== null && value !== undefined) {\n      this.displayControl.setValue(this.formatValue(value));\n    }\n\n    this.emitChange(value);\n  }\n\n  private parseValue(input: string): number | null {\n    if (!input || input.trim() === '') {\n      return null;\n    }\n\n    const currency = this.getSelectedCurrency();\n\n    // Remove currency symbol\n    let cleaned = input.replace(currency.symbol, '');\n\n    // Remove thousands separator\n    const thousandsSep = this.props.showThousandsSeparator !== false ? (currency.thousandsSeparator || ',') : '';\n    if (thousandsSep) {\n      cleaned = cleaned.split(thousandsSep).join('');\n    }\n\n    // Normalize decimal separator\n    const decimalSep = currency.decimalSeparator || '.';\n    cleaned = cleaned.replace(decimalSep, '.');\n\n    // Remove any remaining non-numeric characters (except minus and decimal)\n    cleaned = cleaned.replace(/[^\\d.\\-]/g, '');\n\n    // Handle negative\n    if (!this.props.allowNegative) {\n      cleaned = cleaned.replace('-', '');\n    }\n\n    const value = parseFloat(cleaned);\n\n    if (isNaN(value)) {\n      return null;\n    }\n\n    // Apply min/max constraints\n    if (this.props.min !== undefined && value < this.props.min) {\n      return this.props.min;\n    }\n    if (this.props.max !== undefined && value > this.props.max) {\n      return this.props.max;\n    }\n\n    return value;\n  }\n\n  private formatValue(value: number): string {\n    const currency = this.getSelectedCurrency();\n    const decimals = this.getDecimalPlaces();\n\n    // Format the number\n    let formatted = value.toFixed(decimals);\n\n    // Replace decimal separator\n    const decimalSep = currency.decimalSeparator || '.';\n    formatted = formatted.replace('.', decimalSep);\n\n    // Add thousands separator\n    if (this.props.showThousandsSeparator !== false) {\n      const thousandsSep = currency.thousandsSeparator || ',';\n      const parts = formatted.split(decimalSep);\n      parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSep);\n      formatted = parts.join(decimalSep);\n    }\n\n    return formatted;\n  }\n\n  private emitChange(value: number | null): void {\n    this.currencyChange.emit({\n      value,\n      formattedValue: value !== null ? this.formatValue(value) : '',\n      currency: this.getSelectedCurrency(),\n    });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport {\n  IonDatetime,\n  IonDatetimeButton,\n  IonModal,\n  IonNote,\n  IonIcon,\n} from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { addIcons } from 'ionicons';\nimport { arrowForwardOutline, calendarOutline } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { ComponentStates } from '../../types';\nimport { DateRangeInputMetadata, DateRangeChangeEvent, DateRangeValue } from './types';\n\naddIcons({ arrowForwardOutline, calendarOutline });\n\n@Component({\n  selector: 'val-date-range-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonDatetime, IonDatetimeButton, IonModal, IonNote, IonIcon],\n  template: `\n    <div\n      class=\"date-range-container\"\n      [class]=\"props.cssClass\"\n      [class.has-error]=\"hasError\"\n      [class.horizontal]=\"props.layout !== 'vertical'\"\n      [class.vertical]=\"props.layout === 'vertical'\"\n      [class.disabled]=\"props.state === states.DISABLED\"\n    >\n      @if (props.label) {\n        <label class=\"range-label\">{{ getLabel() }}</label>\n      }\n\n      <div class=\"date-inputs-wrapper\">\n        <!-- Start Date -->\n        <div class=\"date-input start-date\">\n          @if (props.startLabel || props.startLabelContentKey) {\n            <span class=\"date-label\">{{ getStartLabel() }}</span>\n          }\n          <div class=\"button-container\">\n            <ion-datetime-button [datetime]=\"startDatetimeId\"></ion-datetime-button>\n          </div>\n          <ion-modal [keepContentsMounted]=\"true\">\n            <ng-template>\n              <ion-datetime\n                [id]=\"startDatetimeId\"\n                [formControl]=\"internalStartControl\"\n                [presentation]=\"props.presentation || 'date'\"\n                [locale]=\"props.locale || 'es-ES'\"\n                [firstDayOfWeek]=\"props.firstDayOfWeek ?? 1\"\n                [min]=\"getMinDate()\"\n                [max]=\"getMaxStartDate()\"\n                [showDefaultButtons]=\"true\"\n                [doneText]=\"getDoneText()\"\n                [cancelText]=\"getCancelText()\"\n                (ionChange)=\"onStartDateChange($event)\"\n              >\n                <span slot=\"title\">{{ getStartLabel() || getStartDateFallback() }}</span>\n              </ion-datetime>\n            </ng-template>\n          </ion-modal>\n        </div>\n\n        <!-- Separator -->\n        <div class=\"date-separator\">\n          <ion-icon name=\"arrow-forward-outline\"></ion-icon>\n        </div>\n\n        <!-- End Date -->\n        <div class=\"date-input end-date\">\n          @if (props.endLabel || props.endLabelContentKey) {\n            <span class=\"date-label\">{{ getEndLabel() }}</span>\n          }\n          <div class=\"button-container\">\n            <ion-datetime-button [datetime]=\"endDatetimeId\"></ion-datetime-button>\n          </div>\n          <ion-modal [keepContentsMounted]=\"true\">\n            <ng-template>\n              <ion-datetime\n                [id]=\"endDatetimeId\"\n                [formControl]=\"internalEndControl\"\n                [presentation]=\"props.presentation || 'date'\"\n                [locale]=\"props.locale || 'es-ES'\"\n                [firstDayOfWeek]=\"props.firstDayOfWeek ?? 1\"\n                [min]=\"getMinEndDate()\"\n                [max]=\"getMaxDate()\"\n                [showDefaultButtons]=\"true\"\n                [doneText]=\"getDoneText()\"\n                [cancelText]=\"getCancelText()\"\n                (ionChange)=\"onEndDateChange($event)\"\n              >\n                <span slot=\"title\">{{ getEndLabel() || getEndDateFallback() }}</span>\n              </ion-datetime>\n            </ng-template>\n          </ion-modal>\n        </div>\n      </div>\n\n      @if (showDayCount && dayCount !== null) {\n        <div class=\"day-count\">\n          {{ dayCount }} {{ getDayLabel() }}\n        </div>\n      }\n\n      @if (props.hint && !hasError) {\n        <ion-note class=\"hint\">{{ getHint() }}</ion-note>\n      }\n\n      @if (hasError && props.showErrors) {\n        <ion-note class=\"error-message\" color=\"danger\">\n          {{ getErrorMessage() }}\n        </ion-note>\n      }\n    </div>\n  `,\n  styleUrls: ['./date-range-input.component.scss'],\n})\n/**\n * val-date-range-input\n *\n * A date range picker with start and end date selection.\n *\n * @example Basic usage\n * ```html\n * <val-date-range-input\n *   [props]=\"{\n *     control: dateRangeControl,\n *     startLabel: 'Check-in',\n *     endLabel: 'Check-out'\n *   }\"\n * ></val-date-range-input>\n * ```\n *\n * @example With validation\n * ```html\n * <val-date-range-input\n *   [props]=\"{\n *     control: rangeControl,\n *     label: 'Trip dates',\n *     requireBoth: true,\n *     minRangeDays: 2,\n *     maxRangeDays: 30,\n *     disablePastDates: true,\n *     showErrors: true\n *   }\"\n *   (rangeChange)=\"onRangeChange($event)\"\n * ></val-date-range-input>\n * ```\n */\nexport class DateRangeInputComponent implements OnInit, OnDestroy {\n  @Input() props: DateRangeInputMetadata;\n\n  @Output() rangeChange = new EventEmitter<DateRangeChangeEvent>();\n\n  states = ComponentStates;\n\n  internalStartControl = new FormControl<string | null>(null);\n  internalEndControl = new FormControl<string | null>(null);\n\n  startDatetimeId = `start-datetime-${Math.random().toString(36).substr(2, 9)}`;\n  endDatetimeId = `end-datetime-${Math.random().toString(36).substr(2, 9)}`;\n\n  showDayCount = true;\n\n  private i18n = inject(I18nService);\n  private valueSubscription: Subscription | null = null;\n\n  /** Get done button text from props or i18n */\n  getDoneText(): string {\n    return this.props.doneText || this.i18n.t('ok');\n  }\n\n  /** Get cancel button text from props or i18n */\n  getCancelText(): string {\n    return this.props.cancelText || this.i18n.t('cancel');\n  }\n\n  /** Get start date fallback label */\n  getStartDateFallback(): string {\n    return this.i18n.t('startDate', '_global') || 'Start date';\n  }\n\n  /** Get end date fallback label */\n  getEndDateFallback(): string {\n    return this.i18n.t('endDate', '_global') || 'End date';\n  }\n\n  /** Get day/days label based on count */\n  getDayLabel(): string {\n    if (this.dayCount === 1) {\n      return this.i18n.t('day', '_global') || 'day';\n    }\n    return this.i18n.t('days', '_global') || 'days';\n  }\n\n  ngOnInit(): void {\n    // Use provided controls or internal ones\n    if (this.props.startControl) {\n      this.internalStartControl = this.props.startControl;\n    }\n    if (this.props.endControl) {\n      this.internalEndControl = this.props.endControl;\n    }\n\n    // Initialize from main control\n    if (this.props.control?.value) {\n      const value = this.props.control.value;\n      if (value.start) {\n        this.internalStartControl.setValue(value.start);\n      }\n      if (value.end) {\n        this.internalEndControl.setValue(value.end);\n      }\n    }\n\n    // Subscribe to main control changes\n    this.valueSubscription = this.props.control?.valueChanges.subscribe(value => {\n      if (value) {\n        if (value.start !== this.internalStartControl.value) {\n          this.internalStartControl.setValue(value.start);\n        }\n        if (value.end !== this.internalEndControl.value) {\n          this.internalEndControl.setValue(value.end);\n        }\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.valueSubscription?.unsubscribe();\n  }\n\n  getLabel(): string {\n    return this.props.label || '';\n  }\n\n  getStartLabel(): string {\n    return this.props.startLabel || '';\n  }\n\n  getEndLabel(): string {\n    return this.props.endLabel || '';\n  }\n\n  getHint(): string {\n    return this.props.hint || '';\n  }\n\n  getMinDate(): string | undefined {\n    if (this.props.disablePastDates) {\n      return new Date().toISOString();\n    }\n    return this.props.min;\n  }\n\n  getMaxDate(): string | undefined {\n    if (this.props.disableFutureDates) {\n      return new Date().toISOString();\n    }\n    return this.props.max;\n  }\n\n  getMaxStartDate(): string | undefined {\n    // Start date cannot be after end date\n    const endDate = this.internalEndControl.value;\n    if (endDate) {\n      return endDate;\n    }\n    return this.getMaxDate();\n  }\n\n  getMinEndDate(): string | undefined {\n    // End date cannot be before start date\n    const startDate = this.internalStartControl.value;\n    if (startDate) {\n      return startDate;\n    }\n    return this.getMinDate();\n  }\n\n  get hasError(): boolean {\n    return !!(this.props.control?.touched && this.props.control?.invalid);\n  }\n\n  getErrorMessage(): string {\n    if (!this.props.control?.errors || !this.props.errors) {\n      return '';\n    }\n\n    const errorKeys = Object.keys(this.props.control.errors);\n    for (const key of errorKeys) {\n      if (this.props.errors[key]) {\n        return this.props.errors[key];\n      }\n    }\n\n    return '';\n  }\n\n  get dayCount(): number | null {\n    const start = this.internalStartControl.value;\n    const end = this.internalEndControl.value;\n\n    if (!start || !end) {\n      return null;\n    }\n\n    const startDate = new Date(start);\n    const endDate = new Date(end);\n    const diffTime = endDate.getTime() - startDate.getTime();\n    const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n    return Math.max(0, diffDays);\n  }\n\n  onStartDateChange(event: CustomEvent): void {\n    this.updateMainControl();\n  }\n\n  onEndDateChange(event: CustomEvent): void {\n    this.updateMainControl();\n  }\n\n  private updateMainControl(): void {\n    const value: DateRangeValue = {\n      start: this.internalStartControl.value,\n      end: this.internalEndControl.value,\n    };\n\n    this.props.control?.setValue(value);\n    this.props.control?.markAsTouched();\n\n    // Validate and emit\n    const isValid = this.validateRange(value);\n    this.rangeChange.emit({\n      value,\n      isValid,\n      dayCount: this.dayCount,\n    });\n  }\n\n  private validateRange(value: DateRangeValue): boolean {\n    // Check required\n    if (this.props.requireBoth && (!value.start || !value.end)) {\n      return false;\n    }\n\n    // Check day count constraints\n    const days = this.dayCount;\n    if (days !== null) {\n      if (this.props.minRangeDays !== undefined && days < this.props.minRangeDays) {\n        return false;\n      }\n      if (this.props.maxRangeDays !== undefined && days > this.props.maxRangeDays) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonButton, IonIcon, IonInput } from '@ionic/angular/standalone';\nimport { Subscription } from 'rxjs';\nimport { addIcons } from 'ionicons';\nimport { addOutline, removeOutline } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { ComponentStates } from '../../types';\nimport { NumberStepperMetadata, NumberStepperChangeEvent } from './types';\n\naddIcons({ addOutline, removeOutline });\n\n@Component({\n  selector: 'val-number-stepper',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonButton, IonIcon, IonInput],\n  template: `\n    <div\n      class=\"number-stepper-container\"\n      [class]=\"props.cssClass\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-medium]=\"props.size === 'medium' || !props.size\"\n      [class.size-large]=\"props.size === 'large'\"\n      [class.layout-vertical]=\"props.layout === 'vertical'\"\n      [class.disabled]=\"props.state === states.DISABLED\"\n      [style.--stepper-color]=\"getColor()\"\n    >\n      @if (props.label) {\n        <label class=\"stepper-label\">{{ getLabel() }}</label>\n      }\n\n      <!-- Preset buttons -->\n      @if (props.showPresets && props.presets?.length) {\n        <div class=\"preset-buttons\">\n          @for (preset of props.presets; track preset.value) {\n            <button\n              type=\"button\"\n              class=\"preset-button\"\n              [class.active]=\"currentValue === preset.value\"\n              [class.popular]=\"preset.popular\"\n              (click)=\"setValue(preset.value)\"\n              [disabled]=\"props.state === states.DISABLED\"\n            >\n              {{ preset.label || preset.value }}\n            </button>\n          }\n        </div>\n      }\n\n      <!-- Stepper controls -->\n      <div class=\"stepper-controls\">\n        <ion-button\n          class=\"stepper-button decrement\"\n          [color]=\"props.color || 'primary'\"\n          fill=\"outline\"\n          [shape]=\"props.buttonShape || 'round'\"\n          [disabled]=\"isAtMin || props.state === states.DISABLED\"\n          (click)=\"decrement()\"\n          [attr.aria-label]=\"getDecrementLabel()\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"remove-outline\"></ion-icon>\n        </ion-button>\n\n        <div class=\"value-display\">\n          @if (props.showInput !== false && props.editableInput) {\n            <ion-input\n              type=\"number\"\n              [formControl]=\"props.control\"\n              [min]=\"props.min\"\n              [max]=\"props.max\"\n              [step]=\"props.step || 1\"\n              [disabled]=\"props.state === states.DISABLED\"\n              class=\"value-input\"\n              (ionBlur)=\"onInputBlur()\"\n            ></ion-input>\n          } @else {\n            <span class=\"value-text\">{{ currentValue }}</span>\n          }\n\n          @if (props.unitLabel) {\n            <span class=\"unit-label\">{{ getUnitLabel() }}</span>\n          }\n        </div>\n\n        <ion-button\n          class=\"stepper-button increment\"\n          [color]=\"props.color || 'primary'\"\n          fill=\"outline\"\n          [shape]=\"props.buttonShape || 'round'\"\n          [disabled]=\"isAtMax || props.state === states.DISABLED\"\n          (click)=\"increment()\"\n          [attr.aria-label]=\"getIncrementLabel()\"\n        >\n          <ion-icon slot=\"icon-only\" name=\"add-outline\"></ion-icon>\n        </ion-button>\n      </div>\n\n      <!-- Price display -->\n      @if (props.showTotal && props.unitPrice) {\n        <div class=\"price-display\">\n          <span class=\"price-calculation\">\n            {{ currentValue }} × {{ formatPrice(props.unitPrice) }}\n          </span>\n          <span class=\"price-equals\">=</span>\n          <span class=\"price-total\">{{ formatPrice(totalPrice) }}</span>\n        </div>\n      }\n\n      @if (props.hint) {\n        <span class=\"stepper-hint\">{{ props.hint }}</span>\n      }\n    </div>\n  `,\n  styleUrls: ['./number-stepper.component.scss'],\n})\n/**\n * val-number-stepper\n *\n * A number input with increment/decrement buttons, ideal for quantity selection.\n *\n * @example Basic usage\n * ```html\n * <val-number-stepper\n *   [props]=\"{\n *     control: quantityControl,\n *     min: 1,\n *     max: 100\n *   }\"\n * ></val-number-stepper>\n * ```\n *\n * @example With pricing\n * ```html\n * <val-number-stepper\n *   [props]=\"{\n *     control: ticketControl,\n *     min: 1,\n *     max: 50,\n *     unitPrice: 10,\n *     currency: 'MXN',\n *     currencySymbol: '$',\n *     showTotal: true,\n *     unitLabel: 'boletos',\n *     unitLabelSingular: 'boleto'\n *   }\"\n *   (valueChange)=\"onQuantityChange($event)\"\n * ></val-number-stepper>\n * ```\n *\n * @example With presets\n * ```html\n * <val-number-stepper\n *   [props]=\"{\n *     control: ticketControl,\n *     min: 1,\n *     max: 100,\n *     showPresets: true,\n *     presets: [\n *       { value: 1 },\n *       { value: 5, popular: true },\n *       { value: 10 },\n *       { value: 25 }\n *     ]\n *   }\"\n * ></val-number-stepper>\n * ```\n */\nexport class NumberStepperComponent implements OnInit, OnDestroy {\n  @Input() props: NumberStepperMetadata;\n\n  @Output() valueChange = new EventEmitter<NumberStepperChangeEvent>();\n\n  states = ComponentStates;\n\n  private i18n = inject(I18nService);\n  private valueSubscription: Subscription | null = null;\n\n  /** Get decrement button aria-label with i18n fallback */\n  getDecrementLabel(): string {\n    return this.props.decrementLabel || this.i18n.t('decrease');\n  }\n\n  /** Get increment button aria-label with i18n fallback */\n  getIncrementLabel(): string {\n    return this.props.incrementLabel || this.i18n.t('increase');\n  }\n\n  ngOnInit(): void {\n    // Ensure initial value is within bounds\n    this.clampValue();\n\n    // Subscribe to value changes\n    this.valueSubscription = this.props.control.valueChanges.subscribe(() => {\n      this.clampValue();\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.valueSubscription?.unsubscribe();\n  }\n\n  get currentValue(): number {\n    return this.props.control.value ?? this.props.min ?? 0;\n  }\n\n  get isAtMin(): boolean {\n    if (this.props.min === undefined) return false;\n    return this.currentValue <= this.props.min;\n  }\n\n  get isAtMax(): boolean {\n    if (this.props.max === undefined) return false;\n    return this.currentValue >= this.props.max;\n  }\n\n  get totalPrice(): number {\n    return this.currentValue * (this.props.unitPrice || 0);\n  }\n\n  increment(): void {\n    const step = this.props.step || 1;\n    const newValue = this.currentValue + step;\n    this.setValue(newValue);\n  }\n\n  decrement(): void {\n    const step = this.props.step || 1;\n    const newValue = this.currentValue - step;\n    this.setValue(newValue);\n  }\n\n  setValue(value: number): void {\n    const previousValue = this.currentValue;\n    const clampedValue = this.clamp(value);\n\n    if (clampedValue !== previousValue) {\n      this.props.control.setValue(clampedValue);\n      this.emitChange(clampedValue, previousValue);\n    }\n  }\n\n  onInputBlur(): void {\n    this.clampValue();\n  }\n\n  private clampValue(): void {\n    const currentVal = this.props.control.value;\n    const clampedVal = this.clamp(currentVal);\n    if (currentVal !== clampedVal) {\n      this.props.control.setValue(clampedVal);\n    }\n  }\n\n  private clamp(value: number): number {\n    let result = value;\n    if (this.props.min !== undefined && result < this.props.min) {\n      result = this.props.min;\n    }\n    if (this.props.max !== undefined && result > this.props.max) {\n      result = this.props.max;\n    }\n    return result;\n  }\n\n  private emitChange(value: number, previousValue: number): void {\n    this.valueChange.emit({\n      value,\n      previousValue,\n      totalPrice: this.props.unitPrice ? value * this.props.unitPrice : undefined,\n      atMin: this.isAtMin,\n      atMax: this.isAtMax,\n    });\n  }\n\n  getLabel(): string {\n    return this.props.label || '';\n  }\n\n  getUnitLabel(): string {\n    if (this.currentValue === 1 && this.props.unitLabelSingular) {\n      return this.props.unitLabelSingular;\n    }\n    return this.props.unitLabel || '';\n  }\n\n  formatPrice(amount: number): string {\n    const symbol = this.props.currencySymbol || '$';\n    const formatted = amount.toLocaleString('es-MX', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    });\n    return `${symbol}${formatted}`;\n  }\n\n  getColor(): string {\n    if (this.props.color) {\n      return `var(--ion-color-${this.props.color})`;\n    }\n    return 'var(--ion-color-primary)';\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Social platform identifiers for sharing.\n */\nexport type SharePlatform =\n  | 'whatsapp'\n  | 'facebook'\n  | 'twitter'\n  | 'telegram'\n  | 'linkedin'\n  | 'email'\n  | 'copy'\n  | 'native';\n\n/**\n * Configuration for a share button.\n */\nexport interface ShareButtonConfig {\n  /** Platform identifier */\n  platform: SharePlatform;\n  /** Custom label (overrides default) */\n  label?: string;\n  /** Custom icon (overrides default) */\n  icon?: string;\n  /** Custom color (overrides default) */\n  color?: Color | string;\n  /** Whether this button is disabled */\n  disabled?: boolean;\n  /** Additional custom data for the platform */\n  customData?: Record<string, string>;\n}\n\n/**\n * Data to be shared.\n */\nexport interface ShareData {\n  /** Title of the content */\n  title?: string;\n  /** Description or message */\n  text?: string;\n  /** URL to share */\n  url?: string;\n  /** Hashtags (for Twitter) */\n  hashtags?: string[];\n  /** Email subject (for email sharing) */\n  emailSubject?: string;\n  /** Email body (for email sharing) */\n  emailBody?: string;\n  /** Phone number for WhatsApp (optional, for direct messaging) */\n  whatsappPhone?: string;\n}\n\n/**\n * Metadata for the share buttons component.\n */\nexport interface ShareButtonsMetadata {\n  /** Data to share */\n  shareData: ShareData;\n  /** Platforms to show (defaults to all) */\n  platforms?: SharePlatform[];\n  /** Custom button configurations */\n  buttons?: ShareButtonConfig[];\n\n  // === Display options ===\n  /** Layout direction */\n  layout?: 'horizontal' | 'vertical';\n  /** Size variant */\n  size?: 'small' | 'medium' | 'large';\n  /** Button style */\n  variant?: 'solid' | 'outline' | 'icon-only';\n  /** Show labels */\n  showLabels?: boolean;\n  /** Gap between buttons */\n  gap?: number;\n\n  // === Styling ===\n  /** Custom CSS class */\n  cssClass?: string;\n  /** Use platform colors */\n  usePlatformColors?: boolean;\n  /** Default color (when not using platform colors) */\n  color?: Color;\n\n  // === Behavior ===\n  /** Show copy success toast */\n  showCopyToast?: boolean;\n  /** Copy success message */\n  copySuccessMessage?: string;\n  /** Use native share when available */\n  preferNativeShare?: boolean;\n\n  // === Reactive content ===\n  /** Content class for reactive content */\n  contentClass?: string;\n  /** Content key for copy success message */\n  copySuccessMessageContentKey?: string;\n}\n\n/**\n * Event emitted when a share action is performed.\n */\nexport interface ShareEvent {\n  /** Platform that was used */\n  platform: SharePlatform;\n  /** Whether the share was successful */\n  success: boolean;\n  /** Error message if failed */\n  error?: string;\n  /** The share data that was used */\n  shareData: ShareData;\n}\n\n/**\n * Default platform configurations.\n */\nexport interface PlatformConfig {\n  name: string;\n  icon: string;\n  color: string;\n  getUrl: (data: ShareData) => string;\n}\n\n/**\n * Default platform configurations.\n */\nexport const PLATFORM_CONFIGS: Record<SharePlatform, PlatformConfig> = {\n  whatsapp: {\n    name: 'WhatsApp',\n    icon: 'logo-whatsapp',\n    color: '#25D366',\n    getUrl: (data: ShareData) => {\n      const text = encodeURIComponent(`${data.text || ''} ${data.url || ''}`.trim());\n      if (data.whatsappPhone) {\n        return `https://wa.me/${data.whatsappPhone}?text=${text}`;\n      }\n      return `https://wa.me/?text=${text}`;\n    },\n  },\n  facebook: {\n    name: 'Facebook',\n    icon: 'logo-facebook',\n    color: '#1877F2',\n    getUrl: (data: ShareData) => {\n      const url = encodeURIComponent(data.url || '');\n      return `https://www.facebook.com/sharer/sharer.php?u=${url}`;\n    },\n  },\n  twitter: {\n    name: 'Twitter',\n    icon: 'logo-twitter',\n    color: '#1DA1F2',\n    getUrl: (data: ShareData) => {\n      const text = encodeURIComponent(data.text || '');\n      const url = encodeURIComponent(data.url || '');\n      const hashtags = data.hashtags?.join(',') || '';\n      return `https://twitter.com/intent/tweet?text=${text}&url=${url}&hashtags=${hashtags}`;\n    },\n  },\n  telegram: {\n    name: 'Telegram',\n    icon: 'paper-plane-outline',\n    color: '#0088CC',\n    getUrl: (data: ShareData) => {\n      const text = encodeURIComponent(data.text || '');\n      const url = encodeURIComponent(data.url || '');\n      return `https://t.me/share/url?url=${url}&text=${text}`;\n    },\n  },\n  linkedin: {\n    name: 'LinkedIn',\n    icon: 'logo-linkedin',\n    color: '#0A66C2',\n    getUrl: (data: ShareData) => {\n      const url = encodeURIComponent(data.url || '');\n      return `https://www.linkedin.com/sharing/share-offsite/?url=${url}`;\n    },\n  },\n  email: {\n    name: 'Email',\n    icon: 'mail-outline',\n    color: '#EA4335',\n    getUrl: (data: ShareData) => {\n      const subject = encodeURIComponent(data.emailSubject || data.title || '');\n      const body = encodeURIComponent(data.emailBody || `${data.text || ''}\\n\\n${data.url || ''}`.trim());\n      return `mailto:?subject=${subject}&body=${body}`;\n    },\n  },\n  copy: {\n    name: 'Copiar enlace',\n    icon: 'copy-outline',\n    color: '#6B7280',\n    getUrl: () => '',\n  },\n  native: {\n    name: 'Compartir',\n    icon: 'share-outline',\n    color: '#6B7280',\n    getUrl: () => '',\n  },\n};\n\n/**\n * Default platforms to show.\n */\nexport const DEFAULT_PLATFORMS: SharePlatform[] = [\n  'whatsapp',\n  'facebook',\n  'twitter',\n  'copy',\n];\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, inject } from '@angular/core';\nimport { IonButton, IonIcon, ToastController } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { addIcons } from 'ionicons';\nimport {\n  logoWhatsapp,\n  logoFacebook,\n  logoTwitter,\n  logoLinkedin,\n  paperPlaneOutline,\n  mailOutline,\n  copyOutline,\n  shareOutline,\n} from 'ionicons/icons';\nimport {\n  ShareButtonsMetadata,\n  ShareEvent,\n  SharePlatform,\n  ShareButtonConfig,\n  PLATFORM_CONFIGS,\n  DEFAULT_PLATFORMS,\n} from './types';\n\naddIcons({\n  logoWhatsapp,\n  logoFacebook,\n  logoTwitter,\n  logoLinkedin,\n  paperPlaneOutline,\n  mailOutline,\n  copyOutline,\n  shareOutline,\n});\n\n@Component({\n  selector: 'val-share-buttons',\n  standalone: true,\n  imports: [CommonModule, IonButton, IonIcon],\n  template: `\n    <div\n      class=\"share-buttons-container\"\n      [class]=\"props.cssClass\"\n      [class.layout-horizontal]=\"props.layout !== 'vertical'\"\n      [class.layout-vertical]=\"props.layout === 'vertical'\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-medium]=\"props.size === 'medium' || !props.size\"\n      [class.size-large]=\"props.size === 'large'\"\n      [class.variant-solid]=\"props.variant === 'solid' || !props.variant\"\n      [class.variant-outline]=\"props.variant === 'outline'\"\n      [class.variant-icon-only]=\"props.variant === 'icon-only'\"\n      [style.--share-gap]=\"(props.gap || 8) + 'px'\"\n    >\n      @for (button of getButtons(); track button.platform) {\n        <ion-button\n          class=\"share-button\"\n          [class]=\"'platform-' + button.platform\"\n          [fill]=\"getButtonFill()\"\n          [disabled]=\"button.disabled\"\n          [style.--background]=\"props.variant === 'outline' ? 'transparent' : getButtonColor(button)\"\n          [style.--background-hover]=\"props.variant === 'outline' ? 'transparent' : getButtonColor(button)\"\n          [style.--border-color]=\"getButtonColor(button)\"\n          [style.--color]=\"props.variant === 'outline' ? getButtonColor(button) : null\"\n          (click)=\"share(button.platform)\"\n          [attr.aria-label]=\"getButtonLabel(button)\"\n        >\n          <ion-icon\n            [slot]=\"props.showLabels === false || props.variant === 'icon-only' ? 'icon-only' : 'start'\"\n            [name]=\"getButtonIcon(button)\"\n          ></ion-icon>\n          @if (props.showLabels !== false && props.variant !== 'icon-only') {\n            {{ getButtonLabel(button) }}\n          }\n        </ion-button>\n      }\n    </div>\n  `,\n  styleUrls: ['./share-buttons.component.scss'],\n})\n/**\n * val-share-buttons\n *\n * A component for sharing content to various social media platforms.\n *\n * @example Basic usage\n * ```html\n * <val-share-buttons\n *   [props]=\"{\n *     shareData: {\n *       title: 'Check this out!',\n *       text: 'Amazing content here',\n *       url: 'https://example.com'\n *     }\n *   }\"\n * ></val-share-buttons>\n * ```\n *\n * @example With specific platforms\n * ```html\n * <val-share-buttons\n *   [props]=\"{\n *     shareData: {\n *       title: 'Join my raffle!',\n *       text: 'Win amazing prizes',\n *       url: 'https://raffle.example.com/123'\n *     },\n *     platforms: ['whatsapp', 'facebook', 'twitter', 'copy'],\n *     variant: 'icon-only',\n *     usePlatformColors: true\n *   }\"\n *   (shareComplete)=\"onShare($event)\"\n * ></val-share-buttons>\n * ```\n *\n * @example Vertical layout\n * ```html\n * <val-share-buttons\n *   [props]=\"{\n *     shareData: shareData,\n *     layout: 'vertical',\n *     showLabels: true,\n *     size: 'large'\n *   }\"\n * ></val-share-buttons>\n * ```\n */\nexport class ShareButtonsComponent {\n  @Input() props: ShareButtonsMetadata;\n\n  @Output() shareComplete = new EventEmitter<ShareEvent>();\n\n  private toastController = inject(ToastController);\n  private i18n = inject(I18nService);\n\n  getButtons(): ShareButtonConfig[] {\n    if (this.props.buttons?.length) {\n      return this.props.buttons;\n    }\n\n    const platforms = this.props.platforms || DEFAULT_PLATFORMS;\n\n    // Filter out native share if not supported\n    const filteredPlatforms = platforms.filter(p => {\n      if (p === 'native' && !this.isNativeShareSupported()) {\n        return false;\n      }\n      return true;\n    });\n\n    return filteredPlatforms.map(platform => ({ platform }));\n  }\n\n  getButtonFill(): 'solid' | 'outline' | 'clear' {\n    if (this.props.variant === 'outline') return 'outline';\n    if (this.props.variant === 'icon-only') return 'clear';\n    return 'solid';\n  }\n\n  getButtonIcon(button: ShareButtonConfig): string {\n    if (button.icon) return button.icon;\n    return PLATFORM_CONFIGS[button.platform]?.icon || 'share-outline';\n  }\n\n  getButtonLabel(button: ShareButtonConfig): string {\n    if (button.label) return button.label;\n    return PLATFORM_CONFIGS[button.platform]?.name || button.platform;\n  }\n\n  getButtonColor(button: ShareButtonConfig): string {\n    if (button.color) {\n      if (typeof button.color === 'string' && button.color.startsWith('#')) {\n        return button.color;\n      }\n      return `var(--ion-color-${button.color})`;\n    }\n\n    if (this.props.usePlatformColors !== false) {\n      return PLATFORM_CONFIGS[button.platform]?.color || 'var(--ion-color-primary)';\n    }\n\n    if (this.props.color) {\n      return `var(--ion-color-${this.props.color})`;\n    }\n\n    return 'var(--ion-color-primary)';\n  }\n\n  async share(platform: SharePlatform): Promise<void> {\n    const shareData = this.props.shareData;\n\n    try {\n      switch (platform) {\n        case 'native':\n          await this.nativeShare();\n          break;\n        case 'copy':\n          await this.copyToClipboard();\n          break;\n        default:\n          this.openShareUrl(platform);\n          break;\n      }\n\n      this.shareComplete.emit({\n        platform,\n        success: true,\n        shareData,\n      });\n    } catch (error) {\n      this.shareComplete.emit({\n        platform,\n        success: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n        shareData,\n      });\n    }\n  }\n\n  private openShareUrl(platform: SharePlatform): void {\n    const config = PLATFORM_CONFIGS[platform];\n    if (!config) return;\n\n    const url = config.getUrl(this.props.shareData);\n    if (url) {\n      window.open(url, '_blank', 'noopener,noreferrer');\n    }\n  }\n\n  private async nativeShare(): Promise<void> {\n    if (!this.isNativeShareSupported()) {\n      throw new Error('Native share not supported');\n    }\n\n    const data: ShareData = {\n      title: this.props.shareData.title,\n      text: this.props.shareData.text,\n      url: this.props.shareData.url,\n    };\n\n    await navigator.share(data as globalThis.ShareData);\n  }\n\n  private async copyToClipboard(): Promise<void> {\n    const textToCopy =\n      this.props.shareData.url || `${this.props.shareData.text || ''} ${this.props.shareData.url || ''}`.trim();\n\n    await navigator.clipboard.writeText(textToCopy);\n\n    if (this.props.showCopyToast !== false) {\n      const message = this.getCopySuccessMessage();\n      const toast = await this.toastController.create({\n        message,\n        duration: 2000,\n        position: 'bottom',\n        color: 'success',\n        icon: 'checkmark-circle-outline',\n      });\n      await toast.present();\n    }\n  }\n\n  private getCopySuccessMessage(): string {\n    return this.props.copySuccessMessage || this.i18n.t('linkCopied');\n  }\n\n  private isNativeShareSupported(): boolean {\n    return typeof navigator !== 'undefined' && !!navigator.share;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { arrowForwardOutline } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation';\nimport { PresetService } from '../../../services/presets';\nimport { ThemeService } from '../../../services/theme.service';\nimport { GlowCardClickEvent, GlowCardMetadata } from './types';\n\n/**\n * val-glow-card\n *\n * A card component featuring an image with zoom-on-hover, animated CTA link,\n * and dynamic glow effect that adapts to light/dark mode.\n * Supports presets for reusable configurations.\n *\n * @example With preset:\n * <val-glow-card preset=\"feature\" [props]=\"{ title: 'Title', cta: {...} }\"></val-glow-card>\n *\n * @example Static:\n * <val-glow-card\n *   [props]=\"{\n *     imageSrc: 'https://example.com/image.jpg',\n *     imageAlt: 'Example image',\n *     title: 'Card Title',\n *     description: 'Card description text',\n *     cta: { text: 'Learn More', url: '/details', type: 'internal' }\n *   }\"\n *   (onClick)=\"handleClick($event)\"\n * ></val-glow-card>\n *\n * @input preset: string - Name of preset to apply\n * @input props: GlowCardMetadata - Configuration for the card\n * @output onClick - Emits GlowCardClickEvent when card, image, or CTA is clicked\n */\n@Component({\n  selector: 'val-glow-card',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <article\n      class=\"glow-card\"\n      [class.glow-enabled]=\"resolvedProps.glow?.enabled !== false\"\n      [class.glow-subtle]=\"resolvedProps.glow?.intensity === 'subtle'\"\n      [class.glow-medium]=\"!resolvedProps.glow?.intensity || resolvedProps.glow?.intensity === 'medium'\"\n      [class.glow-intense]=\"resolvedProps.glow?.intensity === 'intense'\"\n      [class.dark-mode]=\"isDark\"\n      [class.bordered]=\"resolvedProps.bordered\"\n      [class.no-image]=\"!resolvedProps.imageSrc\"\n      [style.--glow-color]=\"getGlowColor()\"\n      [style.--glow-color-rgb]=\"getGlowColorRgb()\"\n      [style.--aspect-ratio]=\"getAspectRatioValue()\"\n      [style.--border-color]=\"getBorderColor()\"\n      [style.background]=\"getBackgroundStyle()\"\n      (click)=\"onCardClick($event)\"\n    >\n      <!-- Image Container with overflow hidden for zoom effect -->\n      @if (resolvedProps.imageSrc) {\n        <div class=\"glow-card__image-container\">\n          <img\n            class=\"glow-card__image\"\n            [src]=\"resolvedProps.imageSrc\"\n            [alt]=\"resolvedProps.imageAlt\"\n            (click)=\"onImageClick($event)\"\n          />\n        </div>\n      }\n\n      <!-- Content Section -->\n      <div class=\"glow-card__content\">\n        <!-- Label (pill style) -->\n        @if (resolvedProps.label) {\n          <span class=\"glow-card__label\">{{ resolvedProps.label }}</span>\n        }\n\n        <!-- Title -->\n        <h3 class=\"glow-card__title\">\n          {{ getTitle() }}\n        </h3>\n\n        <!-- Description -->\n        <p class=\"glow-card__description\">\n          {{ getDescription() }}\n        </p>\n\n        <!-- CTA Link with expanding animation -->\n        <a\n          class=\"glow-card__cta\"\n          [href]=\"resolvedProps.cta?.url\"\n          (click)=\"onCtaClick($event)\"\n        >\n          <span class=\"glow-card__cta-text\">{{ getCtaText() }}</span>\n          <ion-icon\n            class=\"glow-card__cta-icon\"\n            [name]=\"resolvedProps.cta?.icon || 'arrow-forward-outline'\"\n          ></ion-icon>\n        </a>\n      </div>\n    </article>\n  `,\n  styleUrls: ['./glow-card.component.scss'],\n})\nexport class GlowCardComponent implements OnInit, OnChanges {\n  private presets = inject(PresetService);\n\n  @Input() preset?: string;\n  @Input() props: Partial<GlowCardMetadata> = {};\n\n  resolvedProps: GlowCardMetadata = {} as GlowCardMetadata;\n\n  @Output() onClick = new EventEmitter<GlowCardClickEvent>();\n\n  private i18n = inject(I18nService);\n  private navigationService = inject(NavigationService);\n  private themeService = inject(ThemeService);\n\n  ngOnInit() {\n    this.resolveProps();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['preset'] || changes['props']) {\n      this.resolveProps();\n    }\n  }\n\n  private resolveProps(): void {\n    const presetProps = this.preset\n      ? (this.presets.get('glowCard', this.preset) as Partial<GlowCardMetadata>)\n      : {};\n\n    this.resolvedProps = {\n      ...presetProps,\n      ...this.props,\n    } as GlowCardMetadata;\n  }\n\n  private readonly ionicColors = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n  // RGB values with SPACE separator for CSS rgb(var() / alpha) syntax\n  private readonly colorRgbMap: Record<string, string> = {\n    primary: '112 38 223',\n    secondary: '226 204 255',\n    tertiary: '82 96 255',\n    success: '45 211 111',\n    warning: '255 196 9',\n    danger: '235 68 90',\n  };\n\n  constructor() {\n    addIcons({ arrowForwardOutline });\n  }\n\n  get isDark(): boolean {\n    return this.themeService.IsDark;\n  }\n\n  getTitle(): string {\n    return this.resolvedProps.title || this.resolvedProps.titleFallback || '';\n  }\n\n  getDescription(): string {\n    return this.resolvedProps.description || this.resolvedProps.descriptionFallback || '';\n  }\n\n  getCtaText(): string {\n    return this.resolvedProps.cta?.text || this.resolvedProps.cta?.contentFallback || this.i18n.t('seeMore');\n  }\n\n  getGlowColor(): string {\n    const color = this.resolvedProps.glow?.color;\n    if (!color) {\n      return 'var(--ion-color-primary)';\n    }\n\n    if (this.ionicColors.includes(color as string)) {\n      return `var(--ion-color-${color})`;\n    }\n\n    return color as string;\n  }\n\n  getGlowColorRgb(): string {\n    const color = this.resolvedProps.glow?.color;\n    if (!color) {\n      return '112 38 223'; // Default primary color (space-separated for CSS)\n    }\n\n    if (this.ionicColors.includes(color as string)) {\n      const rgb = this.colorRgbMap[color as string];\n      return rgb ? rgb : '112 38 223';\n    }\n\n    // For custom hex colors, try to convert\n    if (typeof color === 'string' && color.startsWith('#')) {\n      return this.hexToRgb(color);\n    }\n\n    return '112 38 223';\n  }\n\n  private hexToRgb(hex: string): string {\n    const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n    if (result) {\n      // Space-separated for CSS rgb(var() / alpha) syntax\n      return `${parseInt(result[1], 16)} ${parseInt(result[2], 16)} ${parseInt(result[3], 16)}`;\n    }\n    return '112 38 223';\n  }\n\n  getAspectRatioValue(): string {\n    const ratioMap: Record<string, string> = {\n      '16:9': '16 / 9',\n      '4:3': '4 / 3',\n      '1:1': '1 / 1',\n      '3:2': '3 / 2',\n      '21:9': '21 / 9',\n    };\n    return ratioMap[this.resolvedProps.aspectRatio || '16:9'];\n  }\n\n  getBorderColor(): string {\n    const color = this.resolvedProps.borderColor;\n    if (!color) {\n      return 'var(--ion-color-medium)';\n    }\n\n    if (this.ionicColors.includes(color as string)) {\n      return `var(--ion-color-${color})`;\n    }\n\n    return color as string;\n  }\n\n  getBackgroundStyle(): string | null {\n    const bg = this.resolvedProps.backgroundColor;\n    if (!bg) return null;\n\n    // Si es un color Ionic, usar la variable CSS\n    if (this.ionicColors.includes(bg as string)) {\n      return `var(--ion-color-${bg})`;\n    }\n\n    // Si es un string CSS (color hex, gradiente, etc), usar directamente\n    return bg as string;\n  }\n\n  onCardClick(event: MouseEvent) {\n    if ((event.target as HTMLElement).closest('.glow-card__cta, .glow-card__image')) {\n      return;\n    }\n    this.onClick.emit({ target: 'card', token: this.resolvedProps.token });\n  }\n\n  onImageClick(event: MouseEvent) {\n    event.stopPropagation();\n    this.onClick.emit({ target: 'image', token: this.resolvedProps.token });\n  }\n\n  onCtaClick(event: MouseEvent) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.onClick.emit({\n      target: 'cta',\n      token: this.resolvedProps.token,\n      url: this.resolvedProps.cta?.url,\n    });\n\n    switch (this.resolvedProps.cta?.type) {\n      case 'internal':\n        this.navigationService.navigateByUrl(this.resolvedProps.cta.url);\n        break;\n      case 'browse':\n        this.navigationService.navigateInApp(this.resolvedProps.cta.url);\n        break;\n      case 'tab':\n        this.navigationService.openInNewTab(this.resolvedProps.cta.url);\n        break;\n    }\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Aspect ratio options for the glow-card image\n */\nexport type GlowCardAspectRatio = '16:9' | '4:3' | '1:1' | '3:2' | '21:9';\n\n/**\n * CTA (Call-to-Action) configuration for glow-card\n */\nexport interface GlowCardCTA {\n  /** CTA text (static) */\n  text?: string;\n  /** Content key for i18n support */\n  contentKey?: string;\n  /** Component class name for content lookup */\n  contentClass?: string;\n  /** Fallback text if contentKey not found */\n  contentFallback?: string;\n  /** URL to navigate to */\n  url: string;\n  /** Navigation type */\n  type: 'internal' | 'tab' | 'browse';\n  /** Icon name (defaults to 'arrow-forward-outline') */\n  icon?: string;\n}\n\n/**\n * Glow effect configuration\n */\nexport interface GlowConfig {\n  /** Whether glow is enabled (default: true) */\n  enabled?: boolean;\n  /** Custom glow color - uses CSS color or Ionic color name */\n  color?: Color | string;\n  /** Glow intensity (default: 'medium') */\n  intensity?: 'subtle' | 'medium' | 'intense';\n}\n\n/**\n * Event emitted when glow-card is clicked\n */\nexport interface GlowCardClickEvent {\n  /** Click target */\n  target: 'card' | 'cta' | 'image';\n  /** Optional token for identification */\n  token?: string;\n  /** CTA URL if CTA was clicked */\n  url?: string;\n}\n\n/**\n * Props for val-glow-card component.\n *\n * A card component with image, title, description, and animated CTA.\n * Features hover states with image zoom, expanding CTA link, and glow effect.\n */\nexport interface GlowCardMetadata {\n  /** Unique token for event identification */\n  token?: string;\n\n  /** Image source URL (optional for no-image variant) */\n  imageSrc?: string;\n  /** Image alt text (required if imageSrc is provided) */\n  imageAlt?: string;\n\n  /** Label text displayed above the title (pill style) */\n  label?: string;\n  /** Image aspect ratio (default: '16:9') */\n  aspectRatio?: GlowCardAspectRatio;\n\n  /** Static title text */\n  title?: string;\n  /** Title content key for i18n */\n  titleKey?: string;\n  /** Title content class for i18n lookup */\n  titleClass?: string;\n  /** Title fallback text */\n  titleFallback?: string;\n\n  /** Static description text */\n  description?: string;\n  /** Description content key for i18n */\n  descriptionKey?: string;\n  /** Description content class for i18n lookup */\n  descriptionClass?: string;\n  /** Description fallback text */\n  descriptionFallback?: string;\n\n  /** CTA configuration */\n  cta: GlowCardCTA;\n\n  /** Glow effect configuration */\n  glow?: GlowConfig;\n\n  /** Card background color (optional) */\n  backgroundColor?: Color | string;\n\n  /** Show border around the card (default: false) */\n  bordered?: boolean;\n\n  /** Border color - uses CSS color or Ionic color name (default: 'medium') */\n  borderColor?: Color | string;\n}\n\n/**\n * Factory function to create GlowCardMetadata with defaults\n */\nexport function createGlowCardProps(\n  overrides: Partial<GlowCardMetadata> & Pick<GlowCardMetadata, 'cta'>\n): GlowCardMetadata {\n  return {\n    aspectRatio: '16:9',\n    glow: { enabled: true, intensity: 'medium' },\n    ...overrides,\n  };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  TemplateRef,\n  ViewChild,\n} from '@angular/core';\nimport Swiper from 'swiper';\nimport { Autoplay, EffectCoverflow, EffectCube, EffectFade, EffectFlip, Navigation, Pagination } from 'swiper/modules';\nimport { SwipeCarouselMetadata } from './types';\n\n/**\n * val-swipe-carousel\n *\n * A powerful carousel component built on Swiper with multiple transition effects,\n * navigation, pagination, and responsive breakpoints.\n *\n * @example\n * <val-swipe-carousel\n *   [items]=\"slides\"\n *   [itemTemplate]=\"slideTemplate\"\n *   [props]=\"{ effect: 'coverflow', pagination: true }\"\n * ></val-swipe-carousel>\n *\n * <ng-template #slideTemplate let-item>\n *   <div class=\"slide-content\">{{ item.title }}</div>\n * </ng-template>\n *\n * @input items - Array of items to render as slides\n * @input itemTemplate - Template reference for rendering each slide\n * @input props - Configuration options (effect, pagination, navigation, etc.)\n */\n@Component({\n  selector: 'val-swipe-carousel',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"carousel-wrapper\"\n      [class.scale-effect]=\"props?.scaleEffect !== false\"\n      [class.no-padding]=\"!props?.navigation\"\n      [style.padding]=\"props?.wrapperPadding\"\n    >\n      <div class=\"swiper-container\" #swiperContainer>\n        <div class=\"swiper-wrapper\">\n          @for (item of items; track $index) {\n            <div class=\"swiper-slide\">\n              <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: $index }\"></ng-container>\n            </div>\n          }\n        </div>\n\n        <div *ngIf=\"props?.pagination !== false\" class=\"swiper-pagination\"></div>\n      </div>\n\n      <div *ngIf=\"props?.navigation !== false\" class=\"swiper-button-prev\"></div>\n      <div *ngIf=\"props?.navigation !== false\" class=\"swiper-button-next\"></div>\n    </div>\n  `,\n  styleUrls: ['./swipe-carousel.component.scss'],\n})\nexport class SwipeCarouselComponent<T = any> implements AfterViewInit, OnChanges, OnDestroy {\n  /**\n   * Array of items to render as slides.\n   */\n  @Input() items: T[] = [];\n\n  /**\n   * Template reference for rendering each slide.\n   * The template receives the item as implicit context and index as 'index'.\n   */\n  @Input() itemTemplate!: TemplateRef<any>;\n\n  /**\n   * Configuration options for the carousel.\n   */\n  @Input() props?: SwipeCarouselMetadata;\n\n  @ViewChild('swiperContainer') swiperContainer!: ElementRef;\n\n  private swiper?: Swiper;\n\n  private defaultOptions: SwipeCarouselMetadata = {\n    slidesPerView: 1,\n    spaceBetween: 10,\n    loop: true,\n    centeredSlides: true,\n    effect: 'slide',\n    pagination: true,\n    navigation: true,\n    scaleEffect: true,\n    breakpoints: {\n      768: {\n        slidesPerView: 1.5,\n        spaceBetween: 40,\n      },\n      1024: {\n        slidesPerView: 1.7,\n        spaceBetween: 50,\n      },\n    },\n  };\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['items'] || changes['props']) {\n      this.destroySwiper();\n      if (this.items && this.items.length > 0 && this.swiperContainer) {\n        setTimeout(() => this.initSwiper(), 0);\n      }\n    }\n  }\n\n  ngAfterViewInit(): void {\n    if (this.items && this.items.length > 0) {\n      this.initSwiper();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroySwiper();\n  }\n\n  private initSwiper(): void {\n    const options = { ...this.defaultOptions, ...this.props };\n\n    const swiperConfig: any = {\n      modules: [Navigation, Pagination, EffectFade, EffectCube, EffectCoverflow, EffectFlip, Autoplay],\n      slidesPerView: options.slidesPerView,\n      spaceBetween: options.spaceBetween,\n      loop: options.loop,\n      centeredSlides: options.centeredSlides,\n      effect: options.effect,\n      autoplay: options.autoplay,\n      breakpoints: options.breakpoints,\n      pagination:\n        options.pagination !== false\n          ? {\n              el: '.swiper-pagination',\n              clickable: true,\n            }\n          : false,\n      navigation:\n        options.navigation !== false\n          ? {\n              nextEl: '.swiper-button-next',\n              prevEl: '.swiper-button-prev',\n            }\n          : false,\n    };\n\n    // Effect-specific configurations\n    if (options.effect === 'coverflow') {\n      swiperConfig.coverflowEffect = {\n        rotate: 50,\n        stretch: 0,\n        depth: 100,\n        modifier: 1,\n        slideShadows: false,\n      };\n    }\n\n    if (options.effect === 'cube') {\n      swiperConfig.cubeEffect = {\n        shadow: true,\n        slideShadows: true,\n        shadowOffset: 20,\n        shadowScale: 0.94,\n      };\n    }\n\n    this.swiper = new Swiper(this.swiperContainer.nativeElement, swiperConfig);\n  }\n\n  private destroySwiper(): void {\n    if (this.swiper) {\n      this.swiper.destroy(true, true);\n      this.swiper = undefined;\n    }\n  }\n\n  // Public API for external control\n\n  /**\n   * Navigate to previous slide.\n   */\n  slidePrev(): void {\n    this.swiper?.slidePrev();\n  }\n\n  /**\n   * Navigate to next slide.\n   */\n  slideNext(): void {\n    this.swiper?.slideNext();\n  }\n\n  /**\n   * Navigate to specific slide by index.\n   */\n  slideTo(index: number): void {\n    this.swiper?.slideTo(index);\n  }\n\n  /**\n   * Get the Swiper instance for advanced control.\n   */\n  getSwiperInstance(): Swiper | undefined {\n    return this.swiper;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { IonCard, IonCardContent } from '@ionic/angular/standalone';\nimport { ThemeService } from '../../../services/theme.service';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { ButtonGroupComponent } from '../button-group/button-group.component';\nimport { LinkComponent } from '../link/link.component';\nimport { TitleBlockComponent } from '../title-block/title-block.component';\nimport { TestimonialCardMetadata } from './types';\n\n/**\n * val-testimonial-card\n *\n * A card component for testimonials with image, title, link, and action buttons.\n * Supports dynamic background gradients and dark mode overlay.\n *\n * @example\n * <val-testimonial-card\n *   [props]=\"{\n *     title: { title: 'John Doe', subtitle: 'CEO, Company' },\n *     link: { text: 'Read full story', url: '#' },\n *     image: { src: 'avatar.jpg', alt: 'John Doe' },\n *     color: 'primary'\n *   }\"\n * ></val-testimonial-card>\n *\n * @input props - Card configuration (title, link, image, color, background, actions)\n */\n@Component({\n  selector: 'val-testimonial-card',\n  standalone: true,\n  imports: [CommonModule, IonCard, IonCardContent, LinkComponent, TitleBlockComponent, ImageComponent, ButtonGroupComponent],\n  template: `\n    <ion-card class=\"testimonial-card\" [ngStyle]=\"cardStyle()\">\n      <ion-card-content\n        class=\"testimonial-card__content\"\n        [style.min-height]=\"props.minHeight || '450px'\"\n        [style.max-height]=\"props.minHeight || '450px'\"\n        [style.min-width]=\"props.minWidth || '300px'\"\n      >\n        <section>\n          @if (props.image) {\n            <section class=\"image-container\">\n              <val-image style=\"display: contents;\" [props]=\"props.image\" />\n            </section>\n          }\n          <val-title-block [props]=\"props.title\" />\n        </section>\n\n        @if (props.link) {\n          <val-link [props]=\"props.link\" />\n        }\n\n        @if (props.actions) {\n          <val-button-group [props]=\"props.actions\" />\n        }\n      </ion-card-content>\n    </ion-card>\n  `,\n  styleUrls: ['./testimonial-card.component.scss'],\n})\nexport class TestimonialCardComponent {\n  private theme = inject(ThemeService);\n\n  /**\n   * Card configuration.\n   */\n  @Input() props!: TestimonialCardMetadata;\n\n  /**\n   * Gets the effective color/background.\n   * Supports: Ionic color names (primary, secondary), CSS variables (--my-color),\n   * direct colors (#fff, rgb()), or url() for images.\n   */\n  private getColor(): string {\n    const color = this.props.background || this.props.color || 'secondary';\n\n    // If it's a CSS variable, url, gradient, or direct color value, return as-is\n    if (\n      color.startsWith('--') ||\n      color.startsWith('var(') ||\n      color.startsWith('url(') ||\n      color.startsWith('#') ||\n      color.startsWith('rgb') ||\n      color.startsWith('hsl') ||\n      color.includes('gradient')\n    ) {\n      return color.startsWith('--') ? `var(${color})` : color;\n    }\n\n    // Assume it's an Ionic color name\n    return `var(--ion-color-${color})`;\n  }\n\n  /**\n   * Generates dynamic card styles with overlay based on theme.\n   */\n  cardStyle(): { [key: string]: string } {\n    const isDark = this.theme.IsDark;\n    const overlay = isDark\n      ? 'linear-gradient(0deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.45) 100%)'\n      : 'linear-gradient(0deg, rgba(255,255,255,0.55) 0%, rgba(255,255,255,0.55) 100%)';\n    const color = this.getColor();\n\n    // If color is an image URL\n    if (typeof color === 'string' && color.startsWith('url(')) {\n      return {\n        backgroundImage: `${overlay}, ${color}`,\n        backgroundSize: 'cover',\n        backgroundPosition: 'center',\n      };\n    }\n\n    // Gradient overlay over any background\n    return {\n      backgroundImage: `${overlay}, linear-gradient(200deg, var(--ion-color-light) 2%, ${color} 95%)`,\n      backgroundSize: 'cover',\n      backgroundPosition: 'center',\n    };\n  }\n}\n","/**\n * Feature item configuration\n */\nexport interface FeatureItem {\n  /** Ionicon name or 'custom' for SVG path. Opcional si se usa `image`. */\n  icon?: string;\n  /** SVG path data (only used when icon is 'custom') */\n  svgPath?: string;\n  /** Image URL — si se provee, reemplaza al icono (ej. logos de apps). */\n  image?: string;\n  /** Title i18n key or direct text */\n  titleKey: string;\n  /** Description i18n key or direct text */\n  descriptionKey: string;\n  /** Optional token — emitido por (itemClick) al tocar el item. */\n  token?: string;\n}\n\n/**\n * Footer link / CTA mostrado al pie de la lista (ej. \"Find out more\").\n */\nexport interface FeaturesListFooterLink {\n  /** Texto del link (ya resuelto por el consumer). */\n  label: string;\n  /** Ruta Angular interna. */\n  routerLink?: string | any[];\n  /** URL externa (abre en nueva pestaña). */\n  href?: string;\n  /** Token emitido por (footerClick). */\n  token?: string;\n}\n\n/**\n * Features list component configuration\n */\nexport interface FeaturesListMetadata {\n  /** Array of features to display */\n  features: FeatureItem[];\n  /** i18n namespace for translations (if using keys) */\n  i18nNamespace?: string;\n  /** Icon color (Ionic color or CSS color) */\n  iconColor?: string;\n  /** Icon size in pixels */\n  iconSize?: number;\n  /** Layout mode: 'vertical' stacks features, 'horizontal' displays them in a row */\n  mode?: 'vertical' | 'horizontal';\n  /** Gap between features */\n  gap?: 'small' | 'medium' | 'large';\n  /** Alignment of features */\n  alignment?: 'start' | 'center';\n  /** Forma de la imagen del item (cuando `feature.image`). Default 'square'. */\n  imageShape?: 'square' | 'circle';\n\n  // === \"Ver más\" (colapso) ===\n  /**\n   * Máximo de items visibles antes de colapsar. Si `features.length` supera\n   * este número, se muestran los primeros `maxVisible` + un botón \"ver más\".\n   * `0` (default) = sin colapso, muestra todos.\n   */\n  maxVisible?: number;\n  /** Label del botón expandir. Default: i18n `FeaturesList.showMore`. */\n  showMoreLabel?: string;\n  /** Label del botón contraer. Default: i18n `FeaturesList.showLess`. */\n  showLessLabel?: string;\n\n  /** Link/CTA al pie de la lista (ej. \"Find out more\"). */\n  footerLink?: FeaturesListFooterLink;\n}\n\n/**\n * Default values for FeaturesListMetadata\n */\nexport const FEATURES_LIST_DEFAULTS: Required<\n  Pick<\n    FeaturesListMetadata,\n    'iconColor' | 'iconSize' | 'mode' | 'gap' | 'alignment' | 'imageShape' | 'maxVisible'\n  >\n> = {\n  iconColor: 'primary',\n  iconSize: 32,\n  mode: 'vertical',\n  gap: 'medium',\n  alignment: 'start',\n  imageShape: 'square',\n  maxVisible: 0,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation';\nimport { FeatureItem, FeaturesListFooterLink, FeaturesListMetadata, FEATURES_LIST_DEFAULTS } from './types';\n\n/**\n * Defaults i18n (es/en) — auto-registrados si el consumer no proveyó el\n * namespace `FeaturesList`. Cubre los labels de \"ver más\"/\"ver menos\".\n */\nconst FEATURES_LIST_I18N = {\n  es: { showMore: 'Ver más', showLess: 'Ver menos' },\n  en: { showMore: 'Show more', showLess: 'Show less' },\n};\n\n/**\n * val-features-list\n *\n * Lista de features con icono **o imagen**, título y descripción. Soporta i18n,\n * colapso opcional (\"ver más\" cuando supera `maxVisible`) y un link al pie\n * (ej. \"Find out more\"). Útil para listas de settings, apps, beneficios.\n *\n * @example\n * ```html\n * <val-features-list\n *   [props]=\"{\n *     features: [\n *       { icon: 'flash-outline', titleKey: 'Rápido', descriptionKey: 'Carga al instante' },\n *       { image: '/logos/app.png', titleKey: 'Mi App', descriptionKey: 'Gestión de equipos', token: 'app' }\n *     ],\n *     maxVisible: 3,\n *     footerLink: { label: 'Ver todo', routerLink: '/apps' }\n *   }\"\n *   (itemClick)=\"open($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-features-list',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonIcon],\n  template: `\n    <div\n      class=\"features-list\"\n      [class.features-list--vertical]=\"config().mode === 'vertical'\"\n      [class.features-list--horizontal]=\"config().mode === 'horizontal'\"\n      [class.features-list--gap-small]=\"config().gap === 'small'\"\n      [class.features-list--gap-medium]=\"config().gap === 'medium'\"\n      [class.features-list--gap-large]=\"config().gap === 'large'\"\n      [class.features-list--center]=\"config().alignment === 'center'\"\n    >\n      @for (feature of visibleFeatures(); track feature.titleKey) {\n        <div class=\"feature\" [class.feature--clickable]=\"feature.token != null\" (click)=\"onItem(feature)\">\n          <div\n            class=\"feature__icon\"\n            [style.color]=\"iconColorStyle()\"\n            [style.width.px]=\"config().iconSize\"\n            [style.height.px]=\"config().iconSize\"\n          >\n            @if (feature.image) {\n              <img\n                class=\"feature__image\"\n                [class.feature__image--circle]=\"config().imageShape === 'circle'\"\n                [src]=\"feature.image\"\n                [alt]=\"getTitle(feature)\"\n              />\n            } @else if (feature.icon === 'custom' && feature.svgPath) {\n              <svg\n                [attr.width]=\"config().iconSize\"\n                [attr.height]=\"config().iconSize\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                stroke-width=\"1.5\"\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n              >\n                <path [attr.d]=\"feature.svgPath\" />\n              </svg>\n            } @else if (feature.icon) {\n              <ion-icon [name]=\"feature.icon\" [style.font-size.px]=\"config().iconSize\"></ion-icon>\n            }\n          </div>\n          <div class=\"feature__content\">\n            <strong class=\"feature__title\">{{ getTitle(feature) }}</strong>\n            <p class=\"feature__description\">{{ getDescription(feature) }}</p>\n          </div>\n        </div>\n      }\n\n      @if (canCollapse()) {\n        <button type=\"button\" class=\"features-list__more\" (click)=\"toggle()\">\n          {{ expanded() ? showLessText() : showMoreText() }}\n        </button>\n      }\n\n      @if (config().footerLink; as link) {\n        <a class=\"features-list__footer\" [routerLink]=\"link.routerLink ?? null\" (click)=\"onFooter($event, link)\">\n          {{ link.label }}\n        </a>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      .features-list {\n        display: flex;\n      }\n\n      .features-list--vertical {\n        flex-direction: column;\n      }\n\n      .features-list--horizontal {\n        flex-direction: row;\n        flex-wrap: wrap;\n      }\n\n      .features-list--horizontal .feature {\n        flex: 1;\n        min-width: 200px;\n      }\n\n      .features-list--gap-small {\n        gap: 1rem;\n      }\n\n      .features-list--gap-medium {\n        gap: 1.5rem;\n      }\n\n      .features-list--gap-large {\n        gap: 2rem;\n      }\n\n      .features-list--center {\n        align-items: center;\n        text-align: center;\n      }\n\n      .features-list--center .feature {\n        flex-direction: column;\n        align-items: center;\n      }\n\n      .features-list--center .feature__content {\n        text-align: center;\n      }\n\n      .feature {\n        display: flex;\n        align-items: flex-start;\n        gap: 1rem;\n      }\n\n      .feature--clickable {\n        cursor: pointer;\n        border-radius: 10px;\n        transition: background-color 0.15s ease;\n      }\n\n      .feature--clickable:hover {\n        background: var(--ion-color-light, rgba(0, 0, 0, 0.03));\n      }\n\n      .feature__icon {\n        flex-shrink: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n      }\n\n      .feature__image {\n        width: 100%;\n        height: 100%;\n        object-fit: contain;\n        border-radius: 8px;\n      }\n\n      .feature__image--circle {\n        object-fit: cover;\n        border-radius: 50%;\n      }\n\n      .feature__content {\n        flex: 1;\n      }\n\n      .feature__title {\n        display: block;\n        font-size: 1.1rem;\n        font-weight: 600;\n        color: var(--ion-text-color);\n        margin-bottom: 0.25rem;\n      }\n\n      .feature__description {\n        margin: 0;\n        font-size: 0.95rem;\n        color: var(--ion-color-medium);\n        line-height: 1.5;\n      }\n\n      .features-list__more {\n        align-self: flex-start;\n        margin-top: 0.25rem;\n        padding: 0;\n        background: none;\n        border: none;\n        font: inherit;\n        font-weight: 600;\n        color: var(--ion-color-primary);\n        cursor: pointer;\n      }\n\n      .features-list--center .features-list__more,\n      .features-list--center .features-list__footer {\n        align-self: center;\n      }\n\n      .features-list__footer {\n        align-self: flex-start;\n        margin-top: 0.25rem;\n        font-weight: 600;\n        color: var(--ion-color-primary);\n        text-decoration: none;\n        cursor: pointer;\n      }\n\n      .features-list__footer:hover {\n        text-decoration: underline;\n      }\n\n      /* Dark mode support — class-based ONLY (Ionic body.dark / html.ion-palette-dark) */\n      :host-context(.dark) .feature__title,\n      :host-context(.ion-palette-dark) .feature__title,\n      :host-context(html.ion-palette-dark) .feature__title,\n      :host-context(body.dark) .feature__title,\n      :host-context([data-theme='dark']) .feature__title {\n        color: var(--ion-text-color, #fff);\n      }\n\n      :host-context(.dark) .feature__description,\n      :host-context(.ion-palette-dark) .feature__description,\n      :host-context(html.ion-palette-dark) .feature__description,\n      :host-context(body.dark) .feature__description,\n      :host-context([data-theme='dark']) .feature__description {\n        color: var(--ion-color-medium, #a0a0a0);\n      }\n\n      :host-context(.dark) .feature--clickable:hover,\n      :host-context(.ion-palette-dark) .feature--clickable:hover,\n      :host-context(html.ion-palette-dark) .feature--clickable:hover,\n      :host-context(body.dark) .feature--clickable:hover,\n      :host-context([data-theme='dark']) .feature--clickable:hover {\n        background: rgba(255, 255, 255, 0.04);\n      }\n    `,\n  ],\n})\nexport class FeaturesListComponent {\n  private i18n = inject(I18nService);\n  private navigation = inject(NavigationService);\n\n  /** Component configuration */\n  readonly props = input.required<FeaturesListMetadata>();\n\n  /** Emitido al tocar un item (con su `token`). */\n  readonly itemClick = output<string | undefined>();\n  /** Emitido al tocar el footer link (con su `token`). */\n  readonly footerClick = output<string | undefined>();\n\n  private readonly _expanded = signal(false);\n  readonly expanded = this._expanded.asReadonly();\n\n  constructor() {\n    if (!this.i18n.hasNamespace('FeaturesList')) {\n      this.i18n.registerContent('FeaturesList', FEATURES_LIST_I18N);\n    }\n  }\n\n  /** Merged configuration with defaults */\n  config = computed(() => ({\n    ...FEATURES_LIST_DEFAULTS,\n    ...this.props(),\n  }));\n\n  /** Items visibles según el estado de colapso. */\n  visibleFeatures = computed<FeatureItem[]>(() => {\n    const cfg = this.config();\n    const all = cfg.features ?? [];\n    if (cfg.maxVisible > 0 && !this._expanded() && all.length > cfg.maxVisible) {\n      return all.slice(0, cfg.maxVisible);\n    }\n    return all;\n  });\n\n  /** Si hay items de sobra para colapsar/expandir. */\n  canCollapse = computed(() => {\n    const cfg = this.config();\n    return cfg.maxVisible > 0 && (cfg.features?.length ?? 0) > cfg.maxVisible;\n  });\n\n  showMoreText = computed(() => {\n    this.i18n.lang();\n    return this.config().showMoreLabel || this.i18n.t('showMore', 'FeaturesList');\n  });\n\n  showLessText = computed(() => {\n    this.i18n.lang();\n    return this.config().showLessLabel || this.i18n.t('showLess', 'FeaturesList');\n  });\n\n  /** Resolved icon color (handles Ionic colors and CSS colors) */\n  iconColorStyle = computed(() => {\n    const color = this.config().iconColor;\n    if (color && !color.startsWith('#') && !color.startsWith('rgb')) {\n      return `var(--ion-color-${color})`;\n    }\n    return color;\n  });\n\n  toggle(): void {\n    this._expanded.set(!this._expanded());\n  }\n\n  onItem(feature: FeatureItem): void {\n    if (feature.token != null) {\n      this.itemClick.emit(feature.token);\n    }\n  }\n\n  onFooter(event: MouseEvent, link: FeaturesListFooterLink): void {\n    this.footerClick.emit(link.token);\n    if (link.href) {\n      event.preventDefault();\n      this.navigation.openInNewTab(link.href);\n    }\n  }\n\n  /** Get translated title or return direct text */\n  getTitle(feature: FeatureItem): string {\n    const namespace = this.props().i18nNamespace;\n    if (namespace) {\n      this.i18n.lang();\n      return this.i18n.t(feature.titleKey, namespace);\n    }\n    return feature.titleKey;\n  }\n\n  /** Get translated description or return direct text */\n  getDescription(feature: FeatureItem): string {\n    const namespace = this.props().i18nNamespace;\n    if (namespace) {\n      this.i18n.lang();\n      return this.i18n.t(feature.descriptionKey, namespace);\n    }\n    return feature.descriptionKey;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { IonButton, IonCol, IonIcon, IonRow } from '@ionic/angular/standalone';\nimport { NavigationService } from '../../../services/navigation';\nimport { DividerComponent } from '../../atoms/divider/divider.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { LanguageSelectorComponent } from '../language-selector/language-selector.component';\nimport { LanguageSelectorMetadata } from '../language-selector/types';\nimport { LinksCakeComponent } from '../links-cake/links-cake.component';\nimport { FooterLinksMetadata } from './types';\n\n/**\n * val-footer-links\n *\n * A responsive footer component with two columns of links, social media icons,\n * logo, and optional language selector.\n *\n * @example\n * <val-footer-links\n *   [props]=\"{\n *     leftLinks: { title: 'Company', links: [...] },\n *     rightLinks: { title: 'Resources', links: [...] },\n *     logo: 'logo.svg',\n *     logoRoute: '/',\n *     socialLinks: [\n *       { icon: 'logo-facebook', url: 'https://facebook.com', name: 'Facebook' }\n *     ]\n *   }\"\n * ></val-footer-links>\n *\n * @input props - Footer configuration\n * @output logoClick - Emits when logo is clicked\n */\n@Component({\n  selector: 'val-footer-links',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonCol,\n    IonRow,\n    IonButton,\n    IonIcon,\n    DividerComponent,\n    ImageComponent,\n    LinksCakeComponent,\n    LanguageSelectorComponent,\n  ],\n  template: `\n    <div class=\"footer-links\">\n      <ion-row>\n        <ion-col size=\"12\">\n          <val-divider\n            *ngIf=\"props.divider !== false\"\n            [props]=\"props.divider || { size: 'small', color: 'medium', fill: 'solid' }\"\n          />\n        </ion-col>\n        <ion-col size-xs=\"12\" size-md=\"6\">\n          <val-links-cake [props]=\"props.leftLinks\" />\n        </ion-col>\n        <ion-col size-xs=\"12\" size-md=\"6\">\n          <val-links-cake [props]=\"props.rightLinks\" />\n        </ion-col>\n      </ion-row>\n\n      <ion-row *ngIf=\"props.languageSelector !== false\" style=\"margin-top: 1rem;\">\n        <ion-col size=\"12\">\n          <val-language-selector [props]=\"languageSelectorConfig\" />\n        </ion-col>\n      </ion-row>\n\n      <ion-row style=\"margin-top: 1rem;\">\n        <ion-col size=\"12\" *ngIf=\"props.logoCssVariable || props.logo || props.socialLinks?.length\">\n          <!-- Mobile layout: centered -->\n          <div class=\"mobile-layout\">\n            <!-- CSS Variable logo (recommended for dark mode) -->\n            <span\n              *ngIf=\"props.logoCssVariable\"\n              class=\"logo-clickable footer-logo footer-logo--css-var\"\n              role=\"img\"\n              [attr.aria-label]=\"props.logoAlt || 'Logo'\"\n              [style.--logo-var]=\"'var(' + props.logoCssVariable + ')'\"\n              [style.width]=\"props.logoWidth || '10rem'\"\n              [style.height]=\"props.logoHeight || '3rem'\"\n              (click)=\"onLogoClick()\"\n            ></span>\n            <!-- Light mode logo (fallback) -->\n            <val-image\n              *ngIf=\"!props.logoCssVariable && props.logo\"\n              class=\"logo-clickable footer-logo footer-logo--light\"\n              [props]=\"{\n                width: 14,\n                mode: 'box',\n                shaded: false,\n                bordered: false,\n                size: 'small',\n                src: props.logo,\n                alt: props.logoAlt || 'Logo',\n                limited: false,\n                dark: true,\n              }\"\n              (click)=\"onLogoClick()\"\n            />\n            <!-- Dark mode logo (fallback) -->\n            <val-image\n              *ngIf=\"!props.logoCssVariable && props.logo && props.logoDark\"\n              class=\"logo-clickable footer-logo footer-logo--dark\"\n              [props]=\"{\n                width: 14,\n                mode: 'box',\n                shaded: false,\n                bordered: false,\n                size: 'small',\n                src: props.logoDark,\n                alt: props.logoAlt || 'Logo',\n                limited: false,\n                dark: true,\n              }\"\n              (click)=\"onLogoClick()\"\n            />\n            <div class=\"social-links-container\" *ngIf=\"props.socialLinks?.length\" style=\"margin-top: 1rem\">\n              <ion-button\n                *ngFor=\"let social of props.socialLinks\"\n                fill=\"clear\"\n                size=\"small\"\n                [href]=\"social.url\"\n                target=\"_blank\"\n                rel=\"noopener\"\n                class=\"social-button\"\n                [attr.aria-label]=\"social.name\"\n              >\n                <ion-icon [name]=\"social.icon\" slot=\"icon-only\" [color]=\"props.socialIconColor || 'dark'\"></ion-icon>\n              </ion-button>\n            </div>\n          </div>\n\n          <!-- Desktop layout: space-between -->\n          <div class=\"desktop-layout\">\n            <!-- CSS Variable logo (recommended for dark mode) -->\n            <span\n              *ngIf=\"props.logoCssVariable\"\n              class=\"logo-clickable footer-logo footer-logo--css-var\"\n              role=\"img\"\n              [attr.aria-label]=\"props.logoAlt || 'Logo'\"\n              [style.--logo-var]=\"'var(' + props.logoCssVariable + ')'\"\n              [style.width]=\"props.logoWidth || '12rem'\"\n              [style.height]=\"props.logoHeight || '3rem'\"\n              (click)=\"onLogoClick()\"\n            ></span>\n            <!-- Light mode logo (fallback) -->\n            <val-image\n              *ngIf=\"!props.logoCssVariable && props.logo\"\n              class=\"logo-clickable footer-logo footer-logo--light\"\n              [props]=\"{\n                width: 16,\n                mode: 'box',\n                shaded: false,\n                bordered: false,\n                size: 'small',\n                src: props.logo,\n                alt: props.logoAlt || 'Logo',\n                limited: false,\n                dark: true,\n              }\"\n              (click)=\"onLogoClick()\"\n            />\n            <!-- Dark mode logo (fallback) -->\n            <val-image\n              *ngIf=\"!props.logoCssVariable && props.logo && props.logoDark\"\n              class=\"logo-clickable footer-logo footer-logo--dark\"\n              [props]=\"{\n                width: 16,\n                mode: 'box',\n                shaded: false,\n                bordered: false,\n                size: 'small',\n                src: props.logoDark,\n                alt: props.logoAlt || 'Logo',\n                limited: false,\n                dark: true,\n              }\"\n              (click)=\"onLogoClick()\"\n            />\n            <div class=\"social-links-container\" *ngIf=\"props.socialLinks?.length\">\n              <ion-button\n                *ngFor=\"let social of props.socialLinks\"\n                fill=\"clear\"\n                size=\"small\"\n                [href]=\"social.url\"\n                target=\"_blank\"\n                rel=\"noopener\"\n                class=\"social-button\"\n                [attr.aria-label]=\"social.name\"\n              >\n                <ion-icon [name]=\"social.icon\" slot=\"icon-only\" [color]=\"props.socialIconColor || 'dark'\"></ion-icon>\n              </ion-button>\n            </div>\n          </div>\n        </ion-col>\n      </ion-row>\n    </div>\n  `,\n  styleUrls: ['./footer-links.component.scss'],\n})\nexport class FooterLinksComponent {\n  private nav = inject(NavigationService);\n\n  /**\n   * Footer configuration.\n   */\n  @Input() props!: FooterLinksMetadata;\n\n  /**\n   * Emits when the logo is clicked.\n   */\n  @Output() logoClick = new EventEmitter<void>();\n\n  /**\n   * Default language selector configuration.\n   */\n  get languageSelectorConfig(): LanguageSelectorMetadata {\n    if (this.props.languageSelector && typeof this.props.languageSelector === 'object') {\n      return this.props.languageSelector;\n    }\n    return {\n      showLabel: false,\n      labelConfig: {\n        className: '_global',\n        key: 'language',\n        fallback: 'Idioma',\n      },\n      showFlags: true,\n      color: 'primary',\n      size: 'default',\n      fill: 'outline',\n    };\n  }\n\n  /**\n   * Handles logo click - navigates if route provided, otherwise emits event.\n   */\n  onLogoClick(): void {\n    if (this.props.logoRoute) {\n      this.nav.navigateByUrl(this.props.logoRoute);\n    }\n    this.logoClick.emit();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IonAccordion, IonAccordionGroup, IonItem, IonLabel, IonList, MenuController } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { LinksAccordionLink, LinksAccordionMetadata, LinksAccordionSection } from './types';\n\n/**\n * val-links-accordion\n *\n * A hierarchical navigation component using Ionic accordions.\n * Supports sections with optional sub-links and automatic menu closing.\n *\n * @example\n * <val-links-accordion\n *   [props]=\"{\n *     sections: [\n *       { title: 'Home', route: ['/'] },\n *       { title: 'Products', links: [\n *         { text: 'Catalog', route: ['/products'] },\n *         { text: 'New Arrivals', route: ['/products', 'new'] }\n *       ]}\n *     ]\n *   }\"\n *   (navigate)=\"onNavigate($event)\"\n * ></val-links-accordion>\n *\n * @input props - Accordion configuration\n * @output navigate - Emits route when a link is clicked\n */\n@Component({\n  selector: 'val-links-accordion',\n  standalone: true,\n  imports: [CommonModule, IonAccordionGroup, IonAccordion, IonItem, IonLabel, IonList],\n  template: `\n    <div class=\"links-accordion\">\n      <ion-accordion-group #accordionGroup>\n        <ng-container *ngFor=\"let section of props.sections; let i = index\">\n          <!-- Direct-link section: route + no children -->\n          <ion-item\n            *ngIf=\"section.route && !section.links?.length\"\n            class=\"direct-link\"\n            color=\"light\"\n            [ngStyle]=\"{ background: props.backgroundColor || 'var(--ion-background-color)' }\"\n            (click)=\"onLinkClick(section.route!, $event)\"\n            button\n            lines=\"none\"\n          >\n            <ion-label class=\"accordion-label\">{{ getSectionTitle(section) }}</ion-label>\n          </ion-item>\n\n          <!-- Accordion section: has children -->\n          <ion-accordion\n            *ngIf=\"section.links?.length\"\n            [value]=\"getSectionValue(section, i)\"\n            toggleIcon=\"chevron-down-outline\"\n          >\n            <ion-item\n              slot=\"header\"\n              color=\"light\"\n              [ngStyle]=\"{ background: props.backgroundColor || 'var(--ion-background-color)' }\"\n              lines=\"none\"\n            >\n              <ion-label class=\"accordion-label\">{{ getSectionTitle(section) }}</ion-label>\n            </ion-item>\n            <div slot=\"content\" [ngStyle]=\"{ background: props.backgroundColor || 'var(--ion-background-color)' }\">\n              <ion-list lines=\"none\">\n                <ion-item\n                  *ngFor=\"let link of section.links\"\n                  [ngStyle]=\"{ background: props.backgroundColor || 'var(--ion-background-color)' }\"\n                  (click)=\"onLinkClick(link.route, $event)\"\n                  button\n                >\n                  <ion-label class=\"accordion-item-label\">{{ getLinkText(link) }}</ion-label>\n                </ion-item>\n              </ion-list>\n            </div>\n          </ion-accordion>\n        </ng-container>\n      </ion-accordion-group>\n    </div>\n  `,\n  styleUrls: ['./links-accordion.component.scss'],\n})\nexport class LinksAccordionComponent {\n  private i18n = inject(I18nService);\n\n  /**\n   * Accordion configuration.\n   */\n  @Input() props: LinksAccordionMetadata = {\n    sections: [],\n    backgroundColor: 'var(--ion-background-color)',\n    closeMenuOnClick: true,\n    closeAccordionOnClick: true,\n  };\n\n  /**\n   * Emits the route when a link is clicked.\n   */\n  @Output() navigate = new EventEmitter<string[]>();\n\n  @ViewChild('accordionGroup') accordionGroup!: IonAccordionGroup;\n\n  constructor(\n    private router: Router,\n    private menuCtrl: MenuController\n  ) {}\n\n  /**\n   * Gets a unique value for the accordion section.\n   */\n  getSectionValue(section: LinksAccordionSection, index: number): string {\n    return section.titleKey || section.title || `section-${index}`;\n  }\n\n  /**\n   * Gets the section title, supporting i18n via titleKey.\n   */\n  getSectionTitle(section: LinksAccordionSection): string {\n    if (section.titleKey && this.props.i18nNamespace) {\n      return this.i18n.t(section.titleKey, this.props.i18nNamespace);\n    }\n    return section.title || '';\n  }\n\n  /**\n   * Gets the link text, supporting i18n via textKey.\n   */\n  getLinkText(link: LinksAccordionLink): string {\n    if (link.textKey && this.props.i18nNamespace) {\n      return this.i18n.t(link.textKey, this.props.i18nNamespace);\n    }\n    return link.text || '';\n  }\n\n  /**\n   * Handles link click - closes accordion/menu and navigates.\n   */\n  async onLinkClick(route: string[], event?: Event): Promise<void> {\n    if (event) {\n      event.stopPropagation();\n    }\n\n    // Close accordion before navigating\n    if (this.props.closeAccordionOnClick !== false && this.accordionGroup) {\n      this.accordionGroup.value = undefined;\n    }\n\n    // Close menu if enabled\n    if (this.props.closeMenuOnClick !== false) {\n      await this.menuCtrl.close();\n    }\n\n    // Emit event\n    this.navigate.emit(route);\n\n    // Navigate\n    this.router.navigate(route);\n  }\n}\n","import { TemplateRef } from '@angular/core';\nimport { Color } from '@ionic/core';\n\n/**\n * Estado del componente refresher.\n */\nexport type RefresherState = 'idle' | 'pulling' | 'refreshing' | 'completing';\n\n/**\n * Tipos de spinner disponibles.\n */\nexport type RefresherSpinnerType = 'circular' | 'crescent' | 'dots' | 'lines-sharp';\n\n/**\n * Evento emitido cuando se activa el refresh.\n */\nexport interface RefreshEvent {\n  /** Llamar cuando la operacion de refresh completa */\n  complete: () => void;\n  /** Llamar para cancelar el refresh */\n  cancel: () => void;\n  /** Timestamp cuando inicio el refresh */\n  timestamp: Date;\n}\n\n/**\n * Evento de progreso durante el gesto de pull.\n */\nexport interface RefreshPullEvent {\n  /** Valor de progreso entre 0 y 1 */\n  progress: number;\n  /** Si se ha alcanzado el umbral de pull */\n  thresholdReached: boolean;\n}\n\n/**\n * Configuracion de indicador personalizado.\n */\nexport interface RefresherIndicatorConfig {\n  /** Template personalizado para estado pulling */\n  pullingTemplate?: TemplateRef<{ progress: number }>;\n  /** Template personalizado para estado refreshing */\n  refreshingTemplate?: TemplateRef<void>;\n  /** Template personalizado para estado completing */\n  completingTemplate?: TemplateRef<void>;\n}\n\n/**\n * Metadata para el componente val-refresher.\n */\nexport interface RefresherMetadata {\n  /** Si el refresher esta deshabilitado */\n  disabled?: boolean;\n  /** Umbral de pull en pixels (default: 70) */\n  pullThreshold?: number;\n  /** Distancia maxima de pull en pixels (default: 200) */\n  pullMax?: number;\n  /** Factor de resistencia del pull (0-1, default: 0.5) */\n  pullFactor?: number;\n  /** Duracion de snap back en ms (default: 280) */\n  snapbackDuration?: number;\n  /** Duracion de cierre en ms (default: 280) */\n  closeDuration?: number;\n  /** Color del spinner */\n  color?: Color;\n  /** Tipo de spinner */\n  spinnerType?: RefresherSpinnerType;\n  /** Texto mostrado mientras se arrastra */\n  pullingText?: string;\n  /** Texto mostrado mientras se actualiza */\n  refreshingText?: string;\n  /** Configuracion de indicador personalizado */\n  indicatorConfig?: RefresherIndicatorConfig;\n  /** Habilitar feedback haptico en movil (default: true) */\n  hapticFeedback?: boolean;\n  /** Modo web - habilita pull-to-refresh en navegadores desktop */\n  webMode?: boolean;\n  /** Identificador unico */\n  token?: string;\n\n  // Soporte i18n\n  /** Key de traduccion para texto pulling */\n  pullingTextKey?: string;\n  /** Key de traduccion para texto refreshing */\n  refreshingTextKey?: string;\n  /** Clase CSS adicional */\n  contentClass?: string;\n}\n\n/**\n * Valores por defecto para el refresher.\n */\nexport const DEFAULT_REFRESHER_METADATA: Partial<RefresherMetadata> = {\n  disabled: false,\n  pullThreshold: 70,\n  pullMax: 200,\n  pullFactor: 0.5,\n  snapbackDuration: 280,\n  closeDuration: 280,\n  spinnerType: 'circular',\n  hapticFeedback: true,\n  webMode: false,\n};\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  signal,\n  ViewChild,\n  TemplateRef,\n  ContentChild,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonRefresher, IonRefresherContent, IonSpinner, IonText } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronDownCircleOutline } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { RefresherMetadata, RefresherState, RefreshEvent, RefreshPullEvent, DEFAULT_REFRESHER_METADATA } from './types';\n\n// Icono del indicador de pull (ion-refresher-content pullingIcon).\naddIcons({ chevronDownCircleOutline });\n\n/**\n * Componente de pull-to-refresh para movil y web.\n *\n * @example\n * <!-- Uso basico -->\n * <val-refresher\n *   [props]=\"{\n *     color: 'primary',\n *     pullingText: 'Arrastra para actualizar',\n *     refreshingText: 'Cargando...'\n *   }\"\n *   (refresh)=\"onRefresh($event)\"\n * >\n *   <ion-content>\n *     <!-- Contenido scrolleable -->\n *   </ion-content>\n * </val-refresher>\n *\n * @example\n * <!-- Con indicador personalizado -->\n * <val-refresher [props]=\"{ color: 'primary' }\" (refresh)=\"onRefresh($event)\">\n *   <ng-template #pullingIndicator let-progress=\"progress\">\n *     <div class=\"custom-indicator\">\n *       <ion-icon name=\"arrow-down\" [style.transform]=\"'rotate(' + progress * 180 + 'deg)'\"></ion-icon>\n *     </div>\n *   </ng-template>\n *   <ion-content>...</ion-content>\n * </val-refresher>\n */\n@Component({\n  selector: 'val-refresher',\n  standalone: true,\n  imports: [CommonModule, IonRefresher, IonRefresherContent, IonSpinner, IonText],\n  template: `\n    <ion-refresher\n      #refresher\n      slot=\"fixed\"\n      [disabled]=\"mergedProps.disabled\"\n      [pullMin]=\"mergedProps.pullThreshold\"\n      [pullMax]=\"mergedProps.pullMax\"\n      [pullFactor]=\"mergedProps.pullFactor\"\n      [snapbackDuration]=\"mergedProps.snapbackDuration\"\n      [closeDuration]=\"mergedProps.closeDuration\"\n      (ionRefresh)=\"onIonRefresh($event)\"\n      (ionPull)=\"onIonPull($event)\"\n      (ionStart)=\"onIonStart()\"\n    >\n      @if (hasCustomIndicator) {\n        <!-- Custom indicator templates -->\n        <div class=\"refresher-custom-content\">\n          @switch (state()) {\n            @case ('pulling') {\n              @if (pullingIndicator) {\n                <ng-container\n                  *ngTemplateOutlet=\"pullingIndicator; context: { progress: pullProgress() }\"\n                ></ng-container>\n              }\n            }\n            @case ('refreshing') {\n              @if (refreshingIndicator) {\n                <ng-container *ngTemplateOutlet=\"refreshingIndicator\"></ng-container>\n              } @else {\n                <ion-spinner [name]=\"mergedProps.spinnerType\" [color]=\"mergedProps.color\"></ion-spinner>\n                @if (mergedProps.refreshingText) {\n                  <ion-text [color]=\"mergedProps.color\">{{ mergedProps.refreshingText }}</ion-text>\n                }\n              }\n            }\n            @case ('completing') {\n              @if (completingIndicator) {\n                <ng-container *ngTemplateOutlet=\"completingIndicator\"></ng-container>\n              }\n            }\n          }\n        </div>\n      } @else {\n        <!-- Default Ionic refresher content -->\n        <ion-refresher-content\n          pullingIcon=\"chevron-down-circle-outline\"\n          [pullingText]=\"mergedProps.pullingText\"\n          [refreshingSpinner]=\"mergedProps.spinnerType\"\n          [refreshingText]=\"mergedProps.refreshingText\"\n        ></ion-refresher-content>\n      }\n    </ion-refresher>\n\n    <ng-content></ng-content>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        position: relative;\n      }\n\n      .refresher-custom-content {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        gap: 8px;\n        padding: 16px;\n      }\n    `,\n  ],\n})\nexport class RefresherComponent {\n  @ViewChild('refresher') ionRefresher!: IonRefresher;\n\n  /** Templates personalizados via content projection */\n  @ContentChild('pullingIndicator') pullingIndicator?: TemplateRef<{ progress: number }>;\n  @ContentChild('refreshingIndicator') refreshingIndicator?: TemplateRef<void>;\n  @ContentChild('completingIndicator') completingIndicator?: TemplateRef<void>;\n\n  /** Configuracion del refresher */\n  @Input() props: RefresherMetadata = {};\n\n  /** Evento emitido cuando se activa el refresh */\n  @Output() refresh = new EventEmitter<RefreshEvent>();\n\n  /** Evento de progreso durante el pull */\n  @Output() pullProgressChange = new EventEmitter<RefreshPullEvent>();\n\n  /** Evento de cambio de estado */\n  @Output() stateChange = new EventEmitter<RefresherState>();\n\n  private i18n = inject(I18nService);\n\n  /** Estado actual del refresher */\n  readonly state = signal<RefresherState>('idle');\n\n  /** Progreso actual del pull (0-1) */\n  readonly pullProgress = signal<number>(0);\n\n  /** Get pulling text with i18n fallback */\n  getPullingText(): string {\n    return this.props.pullingText || this.i18n.t('pullToRefresh');\n  }\n\n  /** Get refreshing text with i18n fallback */\n  getRefreshingText(): string {\n    return this.props.refreshingText || this.i18n.t('loading');\n  }\n\n  /** Props combinados con defaults */\n  get mergedProps(): RefresherMetadata {\n    return {\n      ...DEFAULT_REFRESHER_METADATA,\n      ...this.props,\n      pullingText: this.getPullingText(),\n      refreshingText: this.getRefreshingText(),\n    };\n  }\n\n  /** Si hay indicadores personalizados */\n  get hasCustomIndicator(): boolean {\n    return !!(\n      this.pullingIndicator ||\n      this.refreshingIndicator ||\n      this.completingIndicator ||\n      this.props.indicatorConfig\n    );\n  }\n\n  /**\n   * Activa programaticamente el refresh.\n   */\n  triggerRefresh(): void {\n    this.state.set('refreshing');\n    this.emitRefreshEvent();\n  }\n\n  /**\n   * Completa la operacion de refresh actual.\n   */\n  complete(): void {\n    this.state.set('completing');\n    this.stateChange.emit('completing');\n    this.ionRefresher?.complete();\n\n    // Resetear a idle despues de la animacion\n    setTimeout(() => {\n      this.state.set('idle');\n      this.stateChange.emit('idle');\n    }, this.mergedProps.closeDuration ?? 280);\n  }\n\n  /**\n   * Cancela la operacion de refresh actual.\n   */\n  cancel(): void {\n    this.ionRefresher?.cancel();\n    this.state.set('idle');\n    this.stateChange.emit('idle');\n  }\n\n  /** Handler para evento ionRefresh */\n  onIonRefresh(event: CustomEvent): void {\n    this.state.set('refreshing');\n    this.stateChange.emit('refreshing');\n    this.emitRefreshEvent();\n  }\n\n  /** Handler para evento ionPull */\n  onIonPull(event: CustomEvent): void {\n    const detail = event?.detail;\n    if (!detail || typeof detail.progress !== 'number') return;\n\n    const progress = Math.min(detail.progress, 1);\n    this.pullProgress.set(progress);\n\n    this.pullProgressChange.emit({\n      progress,\n      thresholdReached: progress >= 1,\n    });\n  }\n\n  /** Handler para evento ionStart */\n  onIonStart(): void {\n    this.state.set('pulling');\n    this.stateChange.emit('pulling');\n  }\n\n  private emitRefreshEvent(): void {\n    const event: RefreshEvent = {\n      complete: () => this.complete(),\n      cancel: () => this.cancel(),\n      timestamp: new Date(),\n    };\n    this.refresh.emit(event);\n  }\n}\n","/**\n * AppConfig Types\n *\n * Tipos para el servicio de configuración remota de la aplicación.\n */\n\nimport { FirestoreDocument } from '../firebase/types';\n\n/**\n * Configuración de la aplicación almacenada en Firestore.\n *\n * @property version - Versión más reciente de la app\n * @property minVersion - Versión mínima soportada (opcional)\n * @property maintenance - Modo mantenimiento global\n * @property features - Feature flags (key-value boolean)\n * @property variables - Variables dinámicas de configuración\n * @property announcements - Anuncios opcionales para mostrar\n */\nexport interface AppConfig extends FirestoreDocument {\n  version: string;\n  minVersion?: string;\n  maintenance?: boolean;\n  features: Record<string, boolean>;\n  variables: Record<string, unknown>;\n  announcements?: Announcement[];\n}\n\n/**\n * Anuncio para mostrar en la aplicación.\n *\n * @property id - Identificador único del anuncio\n * @property type - Tipo de anuncio (info, warning, promo)\n * @property message - Mensaje en múltiples idiomas\n * @property active - Si el anuncio está activo\n * @property link - URL opcional para redirección\n */\nexport interface Announcement {\n  id: string;\n  type: 'info' | 'warning' | 'promo';\n  message: Record<string, string>;\n  active: boolean;\n  link?: string;\n}\n\n/**\n * Configuración para el proveedor de AppConfigService.\n *\n * @property currentVersion - Versión actual de la aplicación\n * @property showUpdateBanner - Mostrar banner de actualización automáticamente\n */\nexport interface AppConfigServiceConfig {\n  currentVersion: string;\n  showUpdateBanner?: boolean;\n}\n\n/**\n * Configuración por defecto del servicio.\n */\nexport const DEFAULT_APP_CONFIG_SERVICE_CONFIG: AppConfigServiceConfig = {\n  currentVersion: '0.0.0',\n  showUpdateBanner: true,\n};\n","import {\n  APP_INITIALIZER,\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n} from '@angular/core';\nimport {\n  AppConfigServiceConfig,\n  DEFAULT_APP_CONFIG_SERVICE_CONFIG,\n} from './types';\nimport { AppConfigService } from './app-config.service';\n\n/**\n * Token de inyección para la configuración de AppConfig.\n */\nexport const VALTECH_APP_CONFIG = new InjectionToken<AppConfigServiceConfig>(\n  'ValtechAppConfig'\n);\n\n/**\n * Provee el servicio de configuración remota a la aplicación Angular.\n *\n * @param config - Configuración del servicio\n * @returns EnvironmentProviders para usar en bootstrapApplication\n *\n * @example\n * ```typescript\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechAppConfig } from 'valtech-components';\n * import { version } from '../package.json';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechFirebase(environment.valtechFirebase),\n *     provideValtechAppConfig({\n *       currentVersion: version,\n *       showUpdateBanner: true,\n *     }),\n *   ],\n * });\n * ```\n */\nexport function provideValtechAppConfig(\n  config: AppConfigServiceConfig\n): EnvironmentProviders {\n  const mergedConfig: AppConfigServiceConfig = {\n    ...DEFAULT_APP_CONFIG_SERVICE_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([\n    { provide: VALTECH_APP_CONFIG, useValue: mergedConfig },\n    {\n      provide: APP_INITIALIZER,\n      useFactory: (appConfigService: AppConfigService) => () =>\n        appConfigService.initialize(),\n      deps: [AppConfigService],\n      multi: true,\n    },\n  ]);\n}\n","/**\n * AppConfigService\n *\n * Servicio para gestionar configuración remota de la aplicación desde Firestore.\n * Soporta feature flags, variables dinámicas, y detección de actualizaciones.\n */\n\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { FirestoreService } from '../firebase/firestore.service';\nimport { VALTECH_APP_CONFIG } from './config';\nimport { AppConfig, AppConfigServiceConfig } from './types';\n\n/**\n * Servicio de configuración remota de la aplicación.\n *\n * Lee la configuración desde Firestore (apps/{appId}/config/app) y provee:\n * - Feature flags reactivos\n * - Variables dinámicas de configuración\n * - Detección de nuevas versiones\n * - Modo mantenimiento\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n *   private appConfig = inject(AppConfigService);\n *\n *   // Verificar feature flag\n *   showNewFeature = computed(() =>\n *     this.appConfig.isFeatureEnabled('newDashboard')\n *   );\n *\n *   // Obtener variable\n *   maxSize = this.appConfig.getVariable('maxUploadSize', 5242880);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AppConfigService {\n  private firestore = inject(FirestoreService);\n  private serviceConfig = inject(VALTECH_APP_CONFIG, { optional: true });\n\n  private subscription: Subscription | null = null;\n\n  // =========================================================================\n  // SIGNALS REACTIVOS\n  // =========================================================================\n\n  /**\n   * Configuración actual de la aplicación.\n   * null si no se ha cargado o no está configurado.\n   */\n  readonly appConfig = signal<AppConfig | null>(null);\n\n  /**\n   * Indica si la configuración está cargando.\n   */\n  readonly loading = signal(true);\n\n  /**\n   * Error de carga, si existe.\n   */\n  readonly error = signal<string | null>(null);\n\n  /**\n   * Indica si hay una nueva versión disponible.\n   */\n  readonly hasUpdate = computed(() => {\n    const config = this.appConfig();\n    const currentVersion = this.serviceConfig?.currentVersion;\n\n    if (!config || !currentVersion) return false;\n\n    return this.isNewerVersion(config.version, currentVersion);\n  });\n\n  /**\n   * Indica si la aplicación está en modo mantenimiento.\n   */\n  readonly isMaintenanceMode = computed(\n    () => this.appConfig()?.maintenance ?? false\n  );\n\n  /**\n   * Versión remota de la aplicación.\n   */\n  readonly remoteVersion = computed(() => this.appConfig()?.version ?? null);\n\n  /**\n   * Versión actual de la aplicación (local).\n   */\n  readonly currentVersion = computed(\n    () => this.serviceConfig?.currentVersion ?? '0.0.0'\n  );\n\n  // =========================================================================\n  // MÉTODOS PÚBLICOS\n  // =========================================================================\n\n  /**\n   * Inicializa el servicio y comienza a escuchar cambios en la configuración.\n   * Se llama automáticamente via APP_INITIALIZER si se usa provideValtechAppConfig().\n   */\n  initialize(): Promise<void> {\n    if (!this.serviceConfig) {\n      console.warn(\n        '[AppConfigService] No configuration provided. Use provideValtechAppConfig() in main.ts'\n      );\n      this.loading.set(false);\n      return Promise.resolve();\n    }\n\n    return new Promise((resolve) => {\n      this.subscription = this.firestore\n        .docChanges<AppConfig>('config', 'app')\n        .subscribe({\n          next: (config) => {\n            this.appConfig.set(config);\n            this.loading.set(false);\n            this.error.set(null);\n            resolve();\n          },\n          error: (err) => {\n            console.error('[AppConfigService] Error loading config:', err);\n            this.error.set(err.message || 'Error al cargar configuración');\n            this.loading.set(false);\n            resolve(); // Resolve anyway to not block app startup\n          },\n        });\n    });\n  }\n\n  /**\n   * Verifica si un feature flag está habilitado.\n   *\n   * @param feature - Nombre del feature flag\n   * @param defaultValue - Valor por defecto si no existe (default: false)\n   * @returns true si el feature está habilitado\n   *\n   * @example\n   * ```typescript\n   * if (appConfig.isFeatureEnabled('darkMode')) {\n   *   // Mostrar toggle de dark mode\n   * }\n   * ```\n   */\n  isFeatureEnabled(feature: string, defaultValue = false): boolean {\n    const config = this.appConfig();\n    if (!config?.features) return defaultValue;\n    return config.features[feature] ?? defaultValue;\n  }\n\n  /**\n   * Obtiene una variable de configuración.\n   *\n   * @param key - Clave de la variable\n   * @param defaultValue - Valor por defecto si no existe\n   * @returns Valor de la variable o el valor por defecto\n   *\n   * @example\n   * ```typescript\n   * const maxSize = appConfig.getVariable('maxUploadSize', 5242880);\n   * const supportEmail = appConfig.getVariable('supportEmail', 'support@example.com');\n   * ```\n   */\n  getVariable<T>(key: string, defaultValue: T): T {\n    const config = this.appConfig();\n    if (!config?.variables) return defaultValue;\n    return (config.variables[key] as T) ?? defaultValue;\n  }\n\n  /**\n   * Recarga la configuración manualmente (one-time read).\n   * Útil si necesitas forzar una actualización.\n   */\n  async refresh(): Promise<void> {\n    this.loading.set(true);\n\n    try {\n      const config = await this.firestore.getDoc<AppConfig>('config', 'app');\n      this.appConfig.set(config);\n      this.error.set(null);\n    } catch (err) {\n      const error = err as Error;\n      console.error('[AppConfigService] Error refreshing config:', error);\n      this.error.set(error.message || 'Error al refrescar configuración');\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  /**\n   * Desuscribe del listener de Firestore.\n   * Se llama automáticamente cuando el servicio se destruye.\n   */\n  destroy(): void {\n    this.subscription?.unsubscribe();\n    this.subscription = null;\n  }\n\n  // =========================================================================\n  // MÉTODOS PRIVADOS\n  // =========================================================================\n\n  /**\n   * Compara dos versiones semver y retorna true si remote > current.\n   *\n   * @param remote - Versión remota (ej: \"1.2.3\")\n   * @param current - Versión actual (ej: \"1.2.0\")\n   * @returns true si remote es mayor que current\n   */\n  private isNewerVersion(remote: string, current: string): boolean {\n    const remoteParts = remote.split('.').map(Number);\n    const currentParts = current.split('.').map(Number);\n\n    for (let i = 0; i < Math.max(remoteParts.length, currentParts.length); i++) {\n      const remotePart = remoteParts[i] || 0;\n      const currentPart = currentParts[i] || 0;\n\n      if (remotePart > currentPart) return true;\n      if (remotePart < currentPart) return false;\n    }\n\n    return false;\n  }\n}\n","/**\n * AppVersion Types\n *\n * Tipos para el servicio de verificación de versión de la aplicación.\n */\n\n/**\n * Estado de la versión de la aplicación respecto a la versión publicada.\n *\n * - `up-to-date`   — la app está al día, no hay nada que hacer.\n * - `update-available` — hay una versión nueva (bundle del SW listo o config\n *   remoto más nuevo). El usuario puede actualizar pero NO está obligado.\n * - `update-required` — la versión local quedó por debajo de `minVersion`\n *   del config remoto (hard gate). El usuario DEBE actualizar para continuar.\n */\nexport type AppVersionStatus = 'up-to-date' | 'update-available' | 'update-required';\n\n/**\n * Configuración para el proveedor de AppVersionService.\n *\n * @property currentVersion - Versión del build actual de la app (semver string).\n *   Normalmente proviene del `version` de `package.json`.\n * @property checkIntervalMs - Intervalo (ms) entre llamadas a\n *   `SwUpdate.checkForUpdate()`. Default: 30 minutos.\n */\nexport interface AppVersionServiceConfig {\n  currentVersion: string;\n  checkIntervalMs?: number;\n}\n\n/**\n * Intervalo por defecto de chequeo de actualizaciones: 30 minutos.\n */\nexport const DEFAULT_CHECK_INTERVAL_MS = 30 * 60 * 1000;\n\n/**\n * Configuración por defecto del servicio.\n */\nexport const DEFAULT_APP_VERSION_SERVICE_CONFIG: Required<AppVersionServiceConfig> = {\n  currentVersion: '0.0.0',\n  checkIntervalMs: DEFAULT_CHECK_INTERVAL_MS,\n};\n","/**\n * AppVersion Provider\n *\n * Provider e injection token para el servicio de verificación de versión.\n */\n\nimport { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nimport { AppVersionServiceConfig, DEFAULT_APP_VERSION_SERVICE_CONFIG } from './types';\n\n/**\n * Token de inyección para la configuración de AppVersionService.\n */\nexport const VALTECH_APP_VERSION = new InjectionToken<Required<AppVersionServiceConfig>>(\n  'ValtechAppVersion'\n);\n\n/**\n * Provee el servicio de verificación de versión a la aplicación Angular.\n *\n * Detecta cuándo hay una versión nueva de la app combinando dos señales:\n * - `SwUpdate` (PWA service worker) — bundle nuevo descargado y listo.\n * - `AppConfigService` (config remoto en Firestore) — `version` / `minVersion`.\n *\n * @param config - Configuración del servicio. `currentVersion` es obligatorio.\n * @returns EnvironmentProviders para usar en bootstrapApplication.\n *\n * @example\n * ```typescript\n * // main.ts\n * import { provideValtechAppVersion } from 'valtech-components';\n * import pkg from '../package.json';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAppVersion({ currentVersion: pkg.version }),\n *   ],\n * });\n * ```\n */\nexport function provideValtechAppVersion(config: AppVersionServiceConfig): EnvironmentProviders {\n  const mergedConfig: Required<AppVersionServiceConfig> = {\n    ...DEFAULT_APP_VERSION_SERVICE_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([{ provide: VALTECH_APP_VERSION, useValue: mergedConfig }]);\n}\n","/**\n * AppVersionService\n *\n * Verificación de versión de la app para PWA / web.\n *\n * Unifica dos señales para detectar actualizaciones:\n *\n * 1. `SwUpdate` (`@angular/service-worker`) — el evento `VERSION_READY` indica\n *    que un bundle nuevo fue descargado y está listo para activarse. Solo está\n *    disponible cuando el service worker está registrado (build de producción).\n *    Además se chequea proactivamente cada `checkIntervalMs` y cada vez que la\n *    app vuelve a foreground (`visibilitychange`).\n *\n * 2. `AppConfigService` (config remoto en Firestore) — expone `version`\n *    (última versión publicada) y `minVersion` (versión mínima soportada).\n *    Se usa para la política de actualización obligatoria (hard gate).\n *\n * Ambas dependencias se inyectan como opcionales: el servicio degrada con\n * gracia si el SW no está habilitado (dev mode) o si `AppConfigService` no\n * está wireado en la app.\n */\n\nimport { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SwUpdate } from '@angular/service-worker';\nimport { filter, interval } from 'rxjs';\n\nimport { AppConfigService } from '../app-config/app-config.service';\nimport { VALTECH_APP_VERSION } from './config';\nimport { AppVersionStatus, DEFAULT_APP_VERSION_SERVICE_CONFIG } from './types';\n\n/**\n * Compara dos versiones semver. Retorna true si `a` es estrictamente menor\n * que `b`. Tolerante a longitudes distintas y a partes no numéricas.\n */\nfunction isVersionLower(a: string, b: string): boolean {\n  const pa = a.split('.').map(n => Number(n) || 0);\n  const pb = b.split('.').map(n => Number(n) || 0);\n  const len = Math.max(pa.length, pb.length);\n\n  for (let i = 0; i < len; i++) {\n    const x = pa[i] || 0;\n    const y = pb[i] || 0;\n    if (x < y) return true;\n    if (x > y) return false;\n  }\n\n  return false;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AppVersionService {\n  /** SwUpdate solo existe si el SW está registrado (prod build). */\n  private readonly swUpdate = inject(SwUpdate, { optional: true });\n  /** AppConfigService es opcional: la app puede no wirearlo. */\n  private readonly appConfig = inject(AppConfigService, { optional: true });\n  private readonly serviceConfig = inject(VALTECH_APP_VERSION, {\n    optional: true,\n  });\n  private readonly document = inject(DOCUMENT);\n  private readonly destroyRef = inject(DestroyRef);\n\n  /** True cuando el SW reportó un bundle nuevo listo (`VERSION_READY`). */\n  private readonly swUpdateReady = signal(false);\n\n  /**\n   * True cuando el usuario descartó el banner de actualización opcional.\n   * El banner obligatorio (`update-required`) ignora este flag.\n   */\n  private readonly _dismissed = signal(false);\n  readonly dismissed: Signal<boolean> = this._dismissed.asReadonly();\n\n  // ===========================================================================\n  // SIGNALS PÚBLICOS\n  // ===========================================================================\n\n  /**\n   * Versión local del build actual de la app.\n   * Proviene del provider `provideValtechAppVersion({ currentVersion })`.\n   */\n  readonly currentVersion: Signal<string> = computed(\n    () => this.serviceConfig?.currentVersion ?? '0.0.0'\n  );\n\n  /**\n   * Última versión publicada según el config remoto.\n   * `null` si `AppConfigService` no está disponible o aún no cargó.\n   */\n  readonly latestVersion: Signal<string | null> = computed(\n    () => this.appConfig?.remoteVersion() ?? null\n  );\n\n  /**\n   * Estado de la versión:\n   * - `update-required` — la versión local quedó por debajo de `minVersion`\n   *   del config remoto. Hard gate. Solo si `AppConfigService` tiene datos.\n   * - `update-available` — el SW descargó un bundle nuevo (`VERSION_READY`)\n   *   o `AppConfigService.hasUpdate` es true.\n   * - `up-to-date` — en cualquier otro caso.\n   */\n  readonly status: Signal<AppVersionStatus> = computed(() => {\n    // 1. Hard gate — minVersion del config remoto.\n    if (this.appConfig) {\n      const minVersion = this.appConfig.appConfig()?.minVersion;\n      if (minVersion && isVersionLower(this.currentVersion(), minVersion)) {\n        return 'update-required';\n      }\n    }\n\n    // 2. Update opcional — SW bundle listo o config remoto más nuevo.\n    if (this.swUpdateReady() || this.appConfig?.hasUpdate()) {\n      return 'update-available';\n    }\n\n    return 'up-to-date';\n  });\n\n  constructor() {\n    this.wireServiceWorker();\n  }\n\n  // ===========================================================================\n  // MÉTODOS PÚBLICOS\n  // ===========================================================================\n\n  /**\n   * Aplica la actualización pendiente.\n   *\n   * Si el SW está habilitado, activa la versión descargada y recarga; si no,\n   * solo recarga la página (la web obtiene el bundle nuevo del servidor).\n   */\n  async applyUpdate(): Promise<void> {\n    try {\n      if (this.swUpdate?.isEnabled) {\n        await this.swUpdate.activateUpdate();\n      }\n    } catch (err) {\n      console.warn('[AppVersionService] activateUpdate failed:', err);\n    } finally {\n      this.document.defaultView?.location.reload();\n    }\n  }\n\n  /**\n   * Descarta el banner de actualización opcional.\n   * No tiene efecto sobre el estado `update-required` (hard gate).\n   */\n  dismiss(): void {\n    this._dismissed.set(true);\n  }\n\n  /**\n   * Fuerza un chequeo de actualización del service worker.\n   * No-op si el SW no está habilitado.\n   */\n  async checkNow(): Promise<void> {\n    if (!this.swUpdate?.isEnabled) return;\n    try {\n      await this.swUpdate.checkForUpdate();\n    } catch (err) {\n      console.warn('[AppVersionService] checkForUpdate failed:', err);\n    }\n  }\n\n  // ===========================================================================\n  // PRIVADO\n  // ===========================================================================\n\n  /**\n   * Suscribe `versionUpdates`, programa chequeos periódicos y reacciona al\n   * volver la app a foreground. Solo actúa si el SW está habilitado.\n   */\n  private wireServiceWorker(): void {\n    if (!this.swUpdate?.isEnabled) return;\n\n    // Bundle nuevo descargado y listo.\n    this.swUpdate.versionUpdates\n      .pipe(\n        filter(evt => evt.type === 'VERSION_READY'),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(() => this.swUpdateReady.set(true));\n\n    // SW en estado irrecuperable — la caché del service worker se corrompió o\n    // fue parcialmente evictada (común en PWAs standalone de iOS tras deploys\n    // repetidos). La app no puede cargar sus assets → pantalla en blanco.\n    // Recuperación recomendada por Angular: recargar para traer todo fresco\n    // desde la red.\n    this.swUpdate.unrecoverable.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {\n      console.error('[AppVersionService] SW unrecoverable — reloading:', event.reason);\n      this.document.defaultView?.location.reload();\n    });\n\n    // Chequeo periódico.\n    const intervalMs =\n      this.serviceConfig?.checkIntervalMs ?? DEFAULT_APP_VERSION_SERVICE_CONFIG.checkIntervalMs;\n\n    interval(intervalMs)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => void this.checkNow());\n\n    // Chequeo al volver la app a foreground.\n    const onVisible = (): void => {\n      if (this.document.visibilityState === 'visible') {\n        void this.checkNow();\n      }\n    };\n    this.document.addEventListener('visibilitychange', onVisible);\n    this.destroyRef.onDestroy(() => {\n      this.document.removeEventListener('visibilitychange', onVisible);\n    });\n\n    // Chequeo inicial.\n    void this.checkNow();\n  }\n}\n","/**\n * UpdateBanner Types\n *\n * Contenido i18n del banner de actualización de la app.\n */\n\n/**\n * Namespace i18n usado por `val-update-banner`.\n * Las apps consumidoras pueden sobreescribir estas keys registrando\n * contenido bajo este namespace en `I18nService`.\n */\nexport const UPDATE_BANNER_I18N_NAMESPACE = 'UpdateBanner';\n\n/**\n * Textos por defecto del banner (fallback si la app no registra el namespace).\n * Soporta es / en / pt.\n */\nexport const UPDATE_BANNER_DEFAULT_CONTENT = {\n  es: {\n    availableTitle: '✨ Hay una versión nueva disponible',\n    availableMessage: 'Actualiza para obtener las últimas mejoras.',\n    requiredTitle: 'Debes actualizar para continuar',\n    requiredMessage: 'Esta versión ya no es compatible. Actualiza para seguir.',\n    updateAction: 'Actualizar',\n    dismissAction: 'Cerrar',\n  },\n  en: {\n    availableTitle: '✨ A new version is available',\n    availableMessage: 'Update to get the latest improvements.',\n    requiredTitle: 'You must update to continue',\n    requiredMessage: 'This version is no longer supported. Please update.',\n    updateAction: 'Update',\n    dismissAction: 'Close',\n  },\n  pt: {\n    availableTitle: '✨ Há uma nova versão disponível',\n    availableMessage: 'Atualize para obter as últimas melhorias.',\n    requiredTitle: 'Você precisa atualizar para continuar',\n    requiredMessage: 'Esta versão não é mais compatível. Atualize para seguir.',\n    updateAction: 'Atualizar',\n    dismissAction: 'Fechar',\n  },\n} as const;\n","/**\n * UpdateBannerComponent\n *\n * Banner que avisa al usuario cuando hay una versión nueva de la app.\n * Consume `AppVersionService` (no toca `SwUpdate` ni `AppConfigService`\n * directamente) y soporta dos modos:\n *\n * - `update-available` — banner descartable: mensaje + botón \"Actualizar\"\n *   + botón cerrar.\n * - `update-required` — overlay bloqueante no-descartable (hard gate):\n *   mensaje + botón \"Actualizar\". Sin botón cerrar.\n *\n * Cuando el estado es `up-to-date` (o el usuario descartó el banner opcional)\n * no renderiza nada.\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\n\nimport { I18nService } from '../../../services/i18n';\nimport { AppVersionService } from '../../../services/app-version/app-version.service';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { IconComponent } from '../../atoms/icon/icon.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE } from './types';\n\n/**\n * val-update-banner\n *\n * Avisa al usuario de una versión nueva. Colócalo una sola vez, alto en el\n * árbol de la app (p.ej. en `app.component` por encima del router outlet)\n * para que sea visible en cualquier ruta.\n *\n * @example\n * ```html\n * <val-update-banner />\n * ```\n */\n@Component({\n  selector: 'val-update-banner',\n  standalone: true,\n  imports: [CommonModule, TextComponent, ButtonComponent, IconComponent],\n  template: `\n    @if (visible()) {\n      <div\n        class=\"val-update-banner\"\n        [class.val-update-banner--required]=\"required()\"\n        role=\"alert\"\n        [attr.aria-live]=\"required() ? 'assertive' : 'polite'\"\n      >\n        @if (required()) {\n          <div class=\"val-update-banner__backdrop\"></div>\n        }\n\n        <div class=\"val-update-banner__panel\">\n          <div class=\"val-update-banner__icon\">\n            <val-icon\n              [props]=\"{\n                name: required() ? 'warning-outline' : 'cloud-download-outline',\n                size: 'large',\n                color: required() ? 'warning' : 'primary',\n              }\"\n            />\n          </div>\n\n          <div class=\"val-update-banner__body\">\n            <val-text\n              [props]=\"{\n                content: t().title,\n                size: 'medium',\n                bold: true,\n                color: 'dark',\n              }\"\n            />\n            <val-text\n              [props]=\"{\n                content: t().message,\n                size: 'small',\n                bold: false,\n                color: 'medium',\n              }\"\n            />\n          </div>\n\n          <div class=\"val-update-banner__actions\">\n            <val-button\n              [props]=\"{\n                text: t().updateAction,\n                color: 'primary',\n                fill: 'solid',\n                size: 'small',\n                state: 'ENABLED',\n                type: 'button',\n              }\"\n              (onClick)=\"onUpdate()\"\n            />\n            @if (!required()) {\n              <val-button\n                [props]=\"{\n                  text: t().dismissAction,\n                  color: 'dark',\n                  fill: 'clear',\n                  size: 'small',\n                  state: 'ENABLED',\n                  type: 'button',\n                }\"\n                (onClick)=\"onDismiss()\"\n              />\n            }\n          </div>\n        </div>\n      </div>\n    }\n  `,\n  styleUrls: ['./update-banner.component.scss'],\n})\nexport class UpdateBannerComponent {\n  private readonly version = inject(AppVersionService);\n  private readonly i18n = inject(I18nService);\n\n  /**\n   * True cuando el banner está en modo obligatorio (hard gate, no descartable).\n   */\n  readonly required = computed(() => this.version.status() === 'update-required');\n\n  /**\n   * True cuando el banner debe renderizarse:\n   * - siempre que el estado sea `update-required`, o\n   * - si es `update-available` y el usuario no lo descartó.\n   */\n  readonly visible = computed(() => {\n    const status = this.version.status();\n    if (status === 'update-required') return true;\n    if (status === 'update-available') return !this.version.dismissed();\n    return false;\n  });\n\n  /**\n   * Textos resolvidos del banner. Reactivo a idioma y al estado required.\n   * Usa el namespace `UpdateBanner` de `I18nService` con fallback embebido.\n   */\n  readonly t = computed(() => {\n    this.i18n.lang(); // track para reactividad\n    const isRequired = this.required();\n    return {\n      title: this.tr(isRequired ? 'requiredTitle' : 'availableTitle'),\n      message: this.tr(isRequired ? 'requiredMessage' : 'availableMessage'),\n      updateAction: this.tr('updateAction'),\n      dismissAction: this.tr('dismissAction'),\n    };\n  });\n\n  /** Aplica la actualización (activa el SW si existe + recarga). */\n  onUpdate(): void {\n    void this.version.applyUpdate();\n  }\n\n  /** Descarta el banner opcional. No-op en modo obligatorio. */\n  onDismiss(): void {\n    this.version.dismiss();\n  }\n\n  /**\n   * Resuelve una key i18n del namespace `UpdateBanner` con fallback al\n   * contenido por defecto embebido (es / en / pt).\n   */\n  private tr(key: keyof typeof UPDATE_BANNER_DEFAULT_CONTENT.es): string {\n    const value = this.i18n.t(key, UPDATE_BANNER_I18N_NAMESPACE);\n    if (value && !value.startsWith('[')) return value;\n\n    const lang = this.i18n.lang();\n    const pack =\n      UPDATE_BANNER_DEFAULT_CONTENT[lang as keyof typeof UPDATE_BANNER_DEFAULT_CONTENT] ??\n      UPDATE_BANNER_DEFAULT_CONTENT.es;\n    return pack[key];\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Size options for action-card\n */\nexport type ActionCardSize = 'small' | 'medium' | 'large';\n\n/**\n * Badge configuration for action-card\n */\nexport interface ActionCardBadge {\n  /** Badge text */\n  text: string;\n  /** Badge color (Ionic color name or CSS color) */\n  color?: Color | string;\n  /** Badge background color */\n  backgroundColor?: Color | string;\n}\n\n/**\n * Icon configuration - supports multiple icon sources\n */\nexport interface ActionCardIcon {\n  /** Ionicon name (e.g., 'settings-outline', 'home') */\n  ionicon?: string;\n  /** SVG path data for custom icons */\n  svgPath?: string;\n  /** Image URL for custom images */\n  imageUrl?: string;\n  /** Icon color (Ionic color name or CSS color) */\n  color?: Color | string;\n  /** Icon background color */\n  backgroundColor?: Color | string;\n}\n\n/**\n * Click event emitted by action-card\n */\nexport interface ActionCardClickEvent {\n  /** Token identifier for the card */\n  token?: string;\n  /** Whether navigation was triggered (if routerLink was set) */\n  navigated?: boolean;\n}\n\n/**\n * Metadata for val-action-card component\n */\nexport interface ActionCardMetadata {\n  /** Unique token for identification */\n  token?: string;\n\n  /** Icon configuration object */\n  icon?: ActionCardIcon;\n\n  /** Card title (static text) */\n  title: string;\n  /** i18n key for title */\n  titleKey?: string;\n  /** Card description (static text) */\n  description?: string;\n  /** i18n key for description */\n  descriptionKey?: string;\n  /** i18n namespace for translations */\n  i18nNamespace?: string;\n\n  /** Card size variant */\n  size?: ActionCardSize;\n  /** Show border */\n  bordered?: boolean;\n  /** Border color */\n  borderColor?: Color | string;\n  /** Card background color */\n  backgroundColor?: Color | string;\n  /** Show shadow */\n  shadowed?: boolean;\n\n  /** Disabled state */\n  disabled?: boolean;\n  /** Router link for navigation */\n  routerLink?: string | any[];\n  /** External URL (opens in new tab/browser) */\n  href?: string;\n\n  /** Badge configuration */\n  badge?: ActionCardBadge;\n  /** Show chevron icon on the right */\n  showChevron?: boolean;\n}\n\n/**\n * Default values for ActionCardMetadata\n */\nexport const ACTION_CARD_DEFAULTS: Required<\n  Pick<ActionCardMetadata, 'size' | 'bordered' | 'shadowed' | 'disabled' | 'showChevron'>\n> = {\n  size: 'medium',\n  bordered: false,\n  shadowed: true,\n  disabled: false,\n  showChevron: false,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonIcon, IonRippleEffect } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronForwardOutline } from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation';\nimport { ActionCardMetadata, ActionCardClickEvent, ACTION_CARD_DEFAULTS } from './types';\n\naddIcons({ chevronForwardOutline });\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-action-card\n *\n * A clickable card component with icon, title, description, and optional badge.\n * Supports multiple icon formats: Ionicons, SVG paths, and image URLs.\n *\n * @example Basic usage with Ionicon\n * ```html\n * <val-action-card\n *   [props]=\"{\n *     icon: { ionicon: 'settings-outline' },\n *     title: 'Settings',\n *     description: 'Manage your preferences'\n *   }\"\n *   (onClick)=\"onCardClick($event)\"\n * />\n * ```\n *\n * @example With routerLink navigation\n * ```html\n * <val-action-card\n *   [props]=\"{\n *     icon: { ionicon: 'person-outline', color: 'primary' },\n *     title: 'Profile',\n *     description: 'View and edit your profile',\n *     routerLink: '/settings/profile',\n *     showChevron: true\n *   }\"\n * />\n * ```\n *\n * @example With custom SVG icon\n * ```html\n * <val-action-card\n *   [props]=\"{\n *     icon: { svgPath: 'M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5' },\n *     title: 'Custom Feature',\n *     description: 'A feature with custom SVG icon',\n *     badge: { text: 'NEW', color: 'light', backgroundColor: 'primary' }\n *   }\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-action-card',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonIcon, IonRippleEffect],\n  template: `\n    <article\n      class=\"action-card\"\n      [class.action-card--small]=\"config().size === 'small'\"\n      [class.action-card--medium]=\"config().size === 'medium'\"\n      [class.action-card--large]=\"config().size === 'large'\"\n      [class.action-card--bordered]=\"config().bordered\"\n      [class.action-card--shadowed]=\"config().shadowed\"\n      [class.action-card--disabled]=\"config().disabled\"\n      [class.action-card--clickable]=\"!config().disabled\"\n      [style.--card-bg]=\"getBackgroundColor()\"\n      [style.--card-border-color]=\"getBorderColor()\"\n      [routerLink]=\"config().disabled ? null : config().routerLink\"\n      (click)=\"handleClick($event)\"\n      [attr.tabindex]=\"config().disabled ? -1 : 0\"\n      [attr.role]=\"'button'\"\n      [attr.aria-disabled]=\"config().disabled\"\n    >\n      <ion-ripple-effect></ion-ripple-effect>\n\n      <!-- Badge (top-right corner) -->\n      @if (config().badge) {\n        <span\n          class=\"action-card__badge\"\n          [style.color]=\"getBadgeColor()\"\n          [style.background-color]=\"getBadgeBackgroundColor()\"\n        >\n          {{ config().badge!.text }}\n        </span>\n      }\n\n      <!-- Icon Container -->\n      <div class=\"action-card__icon\" [style.color]=\"getIconColor()\" [style.background-color]=\"getIconBackgroundColor()\">\n        @if (config().icon?.ionicon) {\n          <ion-icon [name]=\"config().icon!.ionicon!\"></ion-icon>\n        } @else if (config().icon?.svgPath) {\n          <svg\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.5\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n          >\n            <path [attr.d]=\"config().icon!.svgPath\" />\n          </svg>\n        } @else if (config().icon?.imageUrl) {\n          <img [src]=\"config().icon!.imageUrl\" [alt]=\"getTitle()\" class=\"action-card__icon-image\" />\n        }\n      </div>\n\n      <!-- Content -->\n      <div class=\"action-card__content\">\n        <h3 class=\"action-card__title\">{{ getTitle() }}</h3>\n        @if (getDescription()) {\n          <p class=\"action-card__description\">{{ getDescription() }}</p>\n        }\n      </div>\n\n      <!-- Chevron (optional) -->\n      @if (config().showChevron && !config().disabled) {\n        <ion-icon name=\"chevron-forward-outline\" class=\"action-card__chevron\"></ion-icon>\n      }\n    </article>\n  `,\n  styleUrls: ['./action-card.component.scss'],\n})\nexport class ActionCardComponent {\n  private i18n = inject(I18nService);\n  private navigation = inject(NavigationService);\n\n  /** Component configuration */\n  readonly props = input<Partial<ActionCardMetadata>>({});\n\n  /** Event emitted when card is clicked */\n  @Output() onClick = new EventEmitter<ActionCardClickEvent>();\n\n  /** Merged configuration with defaults */\n  config = computed(() => ({\n    ...ACTION_CARD_DEFAULTS,\n    ...this.props(),\n  }));\n\n  /** Get title with i18n support */\n  getTitle(): string {\n    const cfg = this.config();\n    if (cfg.i18nNamespace && cfg.titleKey) {\n      this.i18n.lang(); // Track language changes for reactivity\n      return this.i18n.t(cfg.titleKey, cfg.i18nNamespace);\n    }\n    return cfg.title || '';\n  }\n\n  /** Get description with i18n support */\n  getDescription(): string {\n    const cfg = this.config();\n    if (cfg.i18nNamespace && cfg.descriptionKey) {\n      this.i18n.lang(); // Track language changes for reactivity\n      return this.i18n.t(cfg.descriptionKey, cfg.i18nNamespace);\n    }\n    return cfg.description || '';\n  }\n\n  /** Resolve color to CSS value */\n  private resolveColor(color?: string): string | null {\n    if (!color) return null;\n    if (IONIC_COLORS.includes(color)) {\n      return `var(--ion-color-${color})`;\n    }\n    return color;\n  }\n\n  getBackgroundColor(): string | null {\n    return this.resolveColor(this.config().backgroundColor as string);\n  }\n\n  getBorderColor(): string | null {\n    return this.resolveColor(this.config().borderColor as string) || 'var(--ion-color-light-shade)';\n  }\n\n  getIconColor(): string | null {\n    return this.resolveColor(this.config().icon?.color as string) || 'var(--ion-color-primary)';\n  }\n\n  getIconBackgroundColor(): string | null {\n    const bg = this.config().icon?.backgroundColor;\n    if (!bg) return 'rgba(var(--ion-color-primary-rgb), 0.1)';\n    return this.resolveColor(bg as string);\n  }\n\n  getBadgeColor(): string | null {\n    return this.resolveColor(this.config().badge?.color as string) || 'white';\n  }\n\n  getBadgeBackgroundColor(): string | null {\n    return this.resolveColor(this.config().badge?.backgroundColor as string) || 'var(--ion-color-primary)';\n  }\n\n  /** Handle card click */\n  handleClick(event: MouseEvent): void {\n    const cfg = this.config();\n\n    if (cfg.disabled) {\n      event.preventDefault();\n      event.stopPropagation();\n      return;\n    }\n\n    // Emit click event\n    this.onClick.emit({\n      token: cfg.token,\n      navigated: !!cfg.routerLink || !!cfg.href,\n    });\n\n    // Handle external URL\n    if (cfg.href) {\n      this.navigation.openInNewTab(cfg.href);\n    }\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Optional inline link / CTA shown under the body of a media object.\n */\nexport interface MediaObjectLink {\n  /** Link text (already resolved by the consumer, e.g. via I18nService.t()) */\n  label: string;\n  /** Internal Angular route */\n  routerLink?: string | any[];\n  /** External URL (opens in a new tab) */\n  href?: string;\n}\n\n/**\n * Metadata for val-media-object.\n *\n * Media object = image (or icon) on one side, title + long body text on the\n * other. Presentational: all visible strings are passed already resolved by\n * the consumer (build them with I18nService.t() in the page).\n */\nexport interface MediaObjectMetadata {\n  /** Unique token identifier */\n  token?: string;\n\n  /** Image URL displayed on the side (takes precedence over icon) */\n  image?: string;\n  /** Alt text for the image */\n  imageAlt?: string;\n  /** Ionicon name shown when no image is provided */\n  icon?: string;\n  /** Icon / image accent color */\n  color?: Color | string;\n\n  /** Small label above the title */\n  overtitle?: string;\n  /** Main title */\n  title: string;\n  /** Body text (supports long, multi-line content) */\n  body?: string;\n  /** Optional link / CTA under the body */\n  link?: MediaObjectLink;\n\n  /** Media width (CSS value). Default: '96px' */\n  mediaWidth?: string;\n  /** Place the media on the right instead of the left */\n  reversed?: boolean;\n  /** Vertical alignment of the media against the content */\n  align?: 'start' | 'center';\n  /** Round the image / icon container corners. Default: true */\n  rounded?: boolean;\n  /** Render image as a circle (avatar style) */\n  circle?: boolean;\n}\n\n/**\n * Default values for MediaObjectMetadata.\n */\nexport const MEDIA_OBJECT_DEFAULTS: Required<\n  Pick<MediaObjectMetadata, 'mediaWidth' | 'reversed' | 'align' | 'rounded' | 'circle'>\n> = {\n  mediaWidth: '96px',\n  reversed: false,\n  align: 'start',\n  rounded: true,\n  circle: false,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { NavigationService } from '../../../services/navigation';\nimport { MediaObjectMetadata, MEDIA_OBJECT_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-media-object\n *\n * Image (or icon) on one side, title + long body text on the other. Useful for\n * feature rows, informational blocks, \"what is X\" sections, etc.\n *\n * Presentational: pass already-resolved strings (build them with\n * `I18nService.t()` in the consumer page).\n *\n * @example\n * ```html\n * <val-media-object\n *   [props]=\"{\n *     image: '/assets/feature.png',\n *     overtitle: 'Privacy',\n *     title: 'Your data stays yours',\n *     body: 'A long explanation that can span several lines without truncation.',\n *     link: { label: 'Learn more', routerLink: '/privacy' }\n *   }\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-media-object',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonIcon],\n  template: `\n    <div\n      class=\"media-object\"\n      [class.media-object--reversed]=\"config().reversed\"\n      [class.media-object--center]=\"config().align === 'center'\"\n    >\n      <!-- Media (image or icon) -->\n      <div\n        class=\"media-object__media\"\n        [class.media-object__media--rounded]=\"config().rounded && !config().circle\"\n        [class.media-object__media--circle]=\"config().circle\"\n        [style.width]=\"config().mediaWidth\"\n        [style.--media-color]=\"getColor()\"\n      >\n        @if (config().image) {\n          <img [src]=\"config().image\" [alt]=\"config().imageAlt || config().title\" />\n        } @else if (config().icon) {\n          <ion-icon [name]=\"config().icon!\"></ion-icon>\n        }\n      </div>\n\n      <!-- Content -->\n      <div class=\"media-object__content\">\n        @if (config().overtitle) {\n          <span class=\"media-object__overtitle\">{{ config().overtitle }}</span>\n        }\n        <h3 class=\"media-object__title\">{{ config().title }}</h3>\n        @if (config().body) {\n          <p class=\"media-object__body\">{{ config().body }}</p>\n        }\n        @if (config().link; as link) {\n          <a class=\"media-object__link\" [routerLink]=\"link.routerLink ?? null\" (click)=\"handleLinkClick($event)\">\n            {{ link.label }}\n          </a>\n        }\n      </div>\n    </div>\n  `,\n  styleUrls: ['./media-object.component.scss'],\n})\nexport class MediaObjectComponent {\n  private navigation = inject(NavigationService);\n\n  /** Component configuration */\n  readonly props = input<Partial<MediaObjectMetadata>>({});\n\n  /** Emitted when the inline link is clicked */\n  @Output() onLinkClick = new EventEmitter<string | undefined>();\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...MEDIA_OBJECT_DEFAULTS,\n        ...this.props(),\n      }) as MediaObjectMetadata & typeof MEDIA_OBJECT_DEFAULTS\n  );\n\n  getColor(): string {\n    const color = this.config().color as string | undefined;\n    if (!color) return 'var(--ion-color-primary)';\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n\n  handleLinkClick(event: MouseEvent): void {\n    const link = this.config().link;\n    this.onLinkClick.emit(this.config().token);\n    if (link?.href) {\n      event.preventDefault();\n      this.navigation.openInNewTab(link.href);\n    }\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * A single stat shown inside a stats bar.\n */\nexport interface StatItem {\n  /** Label / caption above the value (already resolved by the consumer) */\n  label: string;\n  /** Main value (number or pre-formatted string) */\n  value: string | number;\n  /** Value prefix (e.g. \"$\") */\n  prefix?: string;\n  /** Value suffix (e.g. \"%\", \"users\") */\n  suffix?: string;\n  /** Value color (Ionic color name or CSS color) */\n  color?: Color | string;\n  /** Optional token identifier */\n  token?: string;\n}\n\n/**\n * Metadata for val-stats-bar.\n *\n * Horizontal row of headline stats separated by dividers (AWS / SES \"Daily\n * email usage\" style). Stacks vertically on mobile.\n */\nexport interface StatsBarMetadata {\n  /** Stats to display */\n  stats: StatItem[];\n  /** Show vertical dividers between stats. Default: true */\n  dividers?: boolean;\n  /** Horizontal alignment of the group. Default: 'start' */\n  align?: 'start' | 'center' | 'spaced';\n  /** Value size. Default: 'large' */\n  size?: 'medium' | 'large';\n  /** Stack stats vertically on small screens. Default: true */\n  stackOnMobile?: boolean;\n}\n\n/**\n * Default values for StatsBarMetadata.\n */\nexport const STATS_BAR_DEFAULTS: Required<Omit<StatsBarMetadata, 'stats'>> = {\n  dividers: true,\n  align: 'start',\n  size: 'large',\n  stackOnMobile: true,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport { StatsBarMetadata, StatItem, STATS_BAR_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-stats-bar\n *\n * Horizontal row of headline stats separated by dividers (AWS / SES \"Daily\n * email usage\" style). Stacks vertically on mobile.\n *\n * Presentational: values + labels are passed already resolved/formatted.\n *\n * @example\n * ```html\n * <val-stats-bar\n *   [props]=\"{\n *     stats: [\n *       { label: 'Emails sent', value: 0 },\n *       { label: 'Remaining sends', value: 200 },\n *       { label: 'Sending quota used', value: '0.00', suffix: '%' }\n *     ]\n *   }\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-stats-bar',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"stats-bar\"\n      [class.stats-bar--dividers]=\"config().dividers\"\n      [class.stats-bar--center]=\"config().align === 'center'\"\n      [class.stats-bar--spaced]=\"config().align === 'spaced'\"\n      [class.stats-bar--medium]=\"config().size === 'medium'\"\n      [class.stats-bar--stack]=\"config().stackOnMobile\"\n    >\n      @for (stat of config().stats; track $index) {\n        <div class=\"stats-bar__item\">\n          <span class=\"stats-bar__label\">{{ stat.label }}</span>\n          <span class=\"stats-bar__value\" [style.color]=\"getColor(stat)\">\n            @if (stat.prefix) {\n              <span class=\"stats-bar__affix\">{{ stat.prefix }}</span>\n            }\n            {{ stat.value }}\n            @if (stat.suffix) {\n              <span class=\"stats-bar__affix\">{{ stat.suffix }}</span>\n            }\n          </span>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./stats-bar.component.scss'],\n})\nexport class StatsBarComponent {\n  /** Component configuration */\n  readonly props = input<Partial<StatsBarMetadata>>({});\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...STATS_BAR_DEFAULTS,\n        stats: [],\n        ...this.props(),\n      }) as StatsBarMetadata & typeof STATS_BAR_DEFAULTS\n  );\n\n  getColor(stat: StatItem): string | null {\n    const color = stat.color as string | undefined;\n    if (!color) return null;\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Click event emitted by val-article-card.\n */\nexport interface ArticleCardClickEvent {\n  /** Token identifier for the card */\n  token?: string;\n  /** Whether navigation was triggered (routerLink / href set) */\n  navigated?: boolean;\n}\n\n/**\n * Metadata for val-article-card.\n *\n * Article / blog teaser card: cover image, topic chip, title, excerpt and date.\n * Presentational — pass already-resolved/formatted strings (the date should be\n * pre-formatted by the consumer, e.g. with a locale-aware pipe).\n */\nexport interface ArticleCardMetadata {\n  /** Unique token identifier */\n  token?: string;\n\n  /** Cover image URL */\n  image?: string;\n  /** Alt text for the cover image */\n  imageAlt?: string;\n  /** Image aspect ratio (CSS). Default: '16 / 9' */\n  aspectRatio?: string;\n\n  /** Topic / category label (rendered as a chip) */\n  topic?: string;\n  /** Topic chip color (Ionic color name or CSS color) */\n  topicColor?: Color | string;\n\n  /** Article title */\n  title: string;\n  /** Short excerpt / summary */\n  excerpt?: string;\n  /** Pre-formatted publication date string */\n  date?: string;\n\n  /** Internal Angular route */\n  routerLink?: string | any[];\n  /** External URL (opens in a new tab) */\n  href?: string;\n\n  /** Show border. Default: true */\n  bordered?: boolean;\n  /** Show shadow. Default: false */\n  shadowed?: boolean;\n  /** Number of lines before the excerpt is clamped. Default: 3 */\n  excerptLines?: number;\n}\n\n/**\n * Default values for ArticleCardMetadata.\n */\nexport const ARTICLE_CARD_DEFAULTS: Required<\n  Pick<ArticleCardMetadata, 'aspectRatio' | 'bordered' | 'shadowed' | 'excerptLines'>\n> = {\n  aspectRatio: '16 / 9',\n  bordered: true,\n  shadowed: false,\n  excerptLines: 3,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonRippleEffect } from '@ionic/angular/standalone';\nimport { NavigationService } from '../../../services/navigation';\nimport { ArticleCardMetadata, ArticleCardClickEvent, ARTICLE_CARD_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-article-card\n *\n * Article / blog teaser card: cover image, topic chip, title, excerpt and date.\n * Clickable (routerLink or external href).\n *\n * Presentational — pass already-resolved/formatted strings (pre-format the date\n * in the consumer with a locale-aware pipe).\n *\n * @example\n * ```html\n * <val-article-card\n *   [props]=\"{\n *     image: '/assets/post.jpg',\n *     topic: 'Holidays',\n *     title: 'New Holiday Shopping Features',\n *     excerpt: 'A short summary of the article that gets clamped after a few lines.',\n *     date: 'Oct 31, 2025',\n *     routerLink: '/blog/holiday-shopping'\n *   }\"\n *   (onClick)=\"open($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-article-card',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonRippleEffect],\n  template: `\n    <article\n      class=\"article-card\"\n      [class.article-card--bordered]=\"config().bordered\"\n      [class.article-card--shadowed]=\"config().shadowed\"\n      [class.article-card--clickable]=\"isClickable()\"\n      [routerLink]=\"config().routerLink ?? null\"\n      (click)=\"handleClick($event)\"\n      [attr.tabindex]=\"isClickable() ? 0 : null\"\n      [attr.role]=\"isClickable() ? 'link' : null\"\n    >\n      @if (isClickable()) {\n        <ion-ripple-effect></ion-ripple-effect>\n      }\n\n      @if (config().image) {\n        <div class=\"article-card__media\" [style.aspect-ratio]=\"config().aspectRatio\">\n          <img [src]=\"config().image\" [alt]=\"config().imageAlt || config().title\" />\n        </div>\n      }\n\n      <div class=\"article-card__body\">\n        @if (config().date || config().topic) {\n          <div class=\"article-card__meta\">\n            @if (config().date) {\n              <span class=\"article-card__date\">{{ config().date }}</span>\n            }\n            @if (config().topic) {\n              <span class=\"article-card__topic\" [style.color]=\"getTopicColor()\">{{ config().topic }}</span>\n            }\n          </div>\n        }\n\n        <h3 class=\"article-card__title\">{{ config().title }}</h3>\n\n        @if (config().excerpt) {\n          <p class=\"article-card__excerpt\" [style.-webkit-line-clamp]=\"config().excerptLines\">\n            {{ config().excerpt }}\n          </p>\n        }\n      </div>\n    </article>\n  `,\n  styleUrls: ['./article-card.component.scss'],\n})\nexport class ArticleCardComponent {\n  private navigation = inject(NavigationService);\n\n  /** Component configuration */\n  readonly props = input<Partial<ArticleCardMetadata>>({});\n\n  /** Emitted when the card is clicked */\n  @Output() onClick = new EventEmitter<ArticleCardClickEvent>();\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...ARTICLE_CARD_DEFAULTS,\n        ...this.props(),\n      }) as ArticleCardMetadata & typeof ARTICLE_CARD_DEFAULTS\n  );\n\n  isClickable = computed(() => !!this.config().routerLink || !!this.config().href);\n\n  getTopicColor(): string | null {\n    const color = this.config().topicColor as string | undefined;\n    if (!color) return 'var(--ion-color-primary)';\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n\n  handleClick(event: MouseEvent): void {\n    const cfg = this.config();\n    this.onClick.emit({ token: cfg.token, navigated: this.isClickable() });\n    if (cfg.href) {\n      event.preventDefault();\n      this.navigation.openInNewTab(cfg.href);\n    }\n  }\n}\n","import { Color } from '@ionic/core';\nimport { ButtonGroupMetadata } from '../button-group/types';\n\n/**\n * Metadata for val-cta-card.\n *\n * Card with a title, optional description and a group of action buttons, with\n * customisable padding, corner rounding and background (Ionic colors\n * supported). The \"Read the Bible Online / Continue Reading + Listen\" pattern.\n *\n * Presentational — pass already-resolved strings. Buttons reuse\n * `ButtonGroupMetadata` (same as banner / layered-card).\n */\nexport interface CtaCardMetadata {\n  /** Unique token identifier */\n  token?: string;\n\n  /** Small label above the title */\n  overtitle?: string;\n  /** Main title */\n  title: string;\n  /** Description / supporting text */\n  description?: string;\n\n  /** Action buttons configuration (reuses val-button-group) */\n  actions?: ButtonGroupMetadata;\n\n  /** Background color (Ionic color name or CSS color). Default: light surface */\n  backgroundColor?: Color | string;\n  /** Text color (Ionic color name or CSS color) */\n  color?: Color | string;\n\n  /** Custom padding (CSS value). Default: '2rem' */\n  padding?: string;\n  /** Custom corner rounding (CSS value). Default: '20px' */\n  borderRadius?: string;\n\n  /** Content alignment. Default: 'start' */\n  align?: 'start' | 'center';\n  /** Show border. Default: false */\n  bordered?: boolean;\n  /** Show shadow. Default: false */\n  shadowed?: boolean;\n}\n\n/**\n * Default values for CtaCardMetadata.\n */\nexport const CTA_CARD_DEFAULTS: Required<\n  Pick<CtaCardMetadata, 'padding' | 'borderRadius' | 'align' | 'bordered' | 'shadowed'>\n> = {\n  padding: '2rem',\n  borderRadius: '20px',\n  align: 'start',\n  bordered: false,\n  shadowed: false,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, input, Output } from '@angular/core';\nimport { ButtonGroupComponent } from '../button-group/button-group.component';\nimport { CtaCardMetadata, CTA_CARD_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-cta-card\n *\n * Card with a title, optional description and a group of action buttons, with\n * customisable padding, corner rounding and background (Ionic colors\n * supported). Buttons reuse `val-button-group`.\n *\n * Presentational — pass already-resolved strings.\n *\n * @example\n * ```html\n * <val-cta-card\n *   [props]=\"{\n *     title: 'Read the Bible Online',\n *     description: 'Trusted translations, in your language.',\n *     actions: {\n *       position: 'left',\n *       columned: false,\n *       buttons: [\n *         { text: 'Continue Reading', color: 'dark', type: 'button', shape: 'round', state: 'ENABLED', token: 'read' },\n *         { text: 'Listen', color: 'dark', fill: 'outline', type: 'button', shape: 'round', state: 'ENABLED', token: 'listen' }\n *       ]\n *     }\n *   }\"\n *   (onAction)=\"onAction($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-cta-card',\n  standalone: true,\n  imports: [CommonModule, ButtonGroupComponent],\n  template: `\n    <section\n      class=\"cta-card\"\n      [class.cta-card--center]=\"config().align === 'center'\"\n      [class.cta-card--bordered]=\"config().bordered\"\n      [class.cta-card--shadowed]=\"config().shadowed\"\n      [style.padding]=\"config().padding\"\n      [style.border-radius]=\"config().borderRadius\"\n      [style.background]=\"getBackground()\"\n      [style.color]=\"getColor()\"\n    >\n      @if (config().overtitle) {\n        <span class=\"cta-card__overtitle\">{{ config().overtitle }}</span>\n      }\n\n      <h2 class=\"cta-card__title\">{{ config().title }}</h2>\n\n      @if (config().description) {\n        <p class=\"cta-card__description\">{{ config().description }}</p>\n      }\n\n      @if (config().actions; as actions) {\n        <div class=\"cta-card__actions\">\n          <val-button-group [props]=\"actions\" (onClick)=\"onAction.emit($event)\"></val-button-group>\n        </div>\n      }\n    </section>\n  `,\n  styleUrls: ['./cta-card.component.scss'],\n})\nexport class CtaCardComponent {\n  /** Component configuration */\n  readonly props = input<Partial<CtaCardMetadata>>({});\n\n  /** Emitted with the token of the clicked action button */\n  @Output() onAction = new EventEmitter<string>();\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...CTA_CARD_DEFAULTS,\n        ...this.props(),\n      }) as CtaCardMetadata & typeof CTA_CARD_DEFAULTS\n  );\n\n  private resolveColor(color?: string): string | null {\n    if (!color) return null;\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n\n  getBackground(): string {\n    return this.resolveColor(this.config().backgroundColor as string) || 'var(--ion-color-light, #f4f5f8)';\n  }\n\n  getColor(): string | null {\n    return this.resolveColor(this.config().color as string);\n  }\n}\n","/**\n * Evento emitido por val-invitation-card (accept / decline).\n */\nexport interface InvitationCardEvent {\n  /** Token identificador de la invitación (orgId u otro). */\n  token?: string;\n}\n\n/**\n * Metadata para val-invitation-card.\n *\n * El contenido dinámico (orgName, inviterName, role) llega por props.\n * Las etiquetas de acción se traducen vía i18n (namespace por defecto\n * `InvitationCard`) o se sobrescriben con acceptLabel / declineLabel.\n */\nexport interface InvitationCardMetadata {\n  /** Token identificador (e.g. orgId). Se reenvía en los eventos. */\n  token?: string;\n\n  /** Nombre de la organización que invita. */\n  orgName: string;\n  /** Nombre de quien invita (opcional). */\n  inviterName?: string;\n  /** Rol asignado — id crudo (e.g. 'viewer') o etiqueta ya traducida. */\n  role?: string;\n\n  /** Muestra spinner en lugar de acciones (acción en curso). */\n  accepting?: boolean;\n  /** Deshabilita las acciones. */\n  disabled?: boolean;\n\n  /** Namespace i18n para las etiquetas de acción. */\n  i18nNamespace?: string;\n  /** Key i18n para \"aceptar\". */\n  acceptKey?: string;\n  /** Key i18n para \"rechazar\". */\n  declineKey?: string;\n\n  /** Etiqueta estática para aceptar (override de i18n). */\n  acceptLabel?: string;\n  /** Etiqueta estática para rechazar (override de i18n). */\n  declineLabel?: string;\n}\n\n/**\n * Defaults de InvitationCardMetadata.\n */\nexport const INVITATION_CARD_DEFAULTS: Required<\n  Pick<\n    InvitationCardMetadata,\n    'accepting' | 'disabled' | 'i18nNamespace' | 'acceptKey' | 'declineKey'\n  >\n> = {\n  accepting: false,\n  disabled: false,\n  i18nNamespace: 'InvitationCard',\n  acceptKey: 'accept',\n  declineKey: 'decline',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';\nimport { IonSpinner } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { InvitationCardEvent, InvitationCardMetadata, INVITATION_CARD_DEFAULTS } from './types';\n\n/**\n * val-invitation-card\n *\n * Tarjeta de invitación pendiente a una organización. Muestra el nombre de la\n * org, quién invita y el rol, con acciones aceptar / rechazar.\n *\n * Soporta i18n (namespace `InvitationCard` por defecto) y dark mode vía\n * variables Ionic basadas en `dark` (sin tonos light/medium).\n *\n * @example\n * ```html\n * <val-invitation-card\n *   [props]=\"{\n *     token: invite.orgId,\n *     orgName: invite.orgName,\n *     inviterName: invite.inviterName,\n *     role: invite.roleId,\n *     accepting: accepting() === invite.orgId\n *   }\"\n *   (onAccept)=\"accept(invite)\"\n *   (onDecline)=\"decline(invite)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-invitation-card',\n  standalone: true,\n  imports: [CommonModule, IonSpinner],\n  template: `\n    <div class=\"invitation-card\">\n      <div class=\"invitation-card__body\">\n        <span class=\"invitation-card__name\">{{ config().orgName }}</span>\n        @if (subtitle()) {\n          <span class=\"invitation-card__subtitle\">{{ subtitle() }}</span>\n        }\n      </div>\n      <div class=\"invitation-card__actions\">\n        @if (config().accepting) {\n          <ion-spinner name=\"crescent\" class=\"invitation-card__spinner\" />\n        } @else {\n          <button\n            type=\"button\"\n            class=\"invitation-card__action invitation-card__action--accept\"\n            [disabled]=\"config().disabled\"\n            (click)=\"emitAccept()\"\n          >\n            {{ acceptLabel() }}\n          </button>\n          <button\n            type=\"button\"\n            class=\"invitation-card__action invitation-card__action--decline\"\n            [disabled]=\"config().disabled\"\n            (click)=\"emitDecline()\"\n          >\n            {{ declineLabel() }}\n          </button>\n        }\n      </div>\n    </div>\n  `,\n  styleUrls: ['./invitation-card.component.scss'],\n})\nexport class InvitationCardComponent {\n  private i18n = inject(I18nService);\n\n  readonly props = input<Partial<InvitationCardMetadata>>({});\n\n  @Output() onAccept = new EventEmitter<InvitationCardEvent>();\n  @Output() onDecline = new EventEmitter<InvitationCardEvent>();\n\n  readonly config = computed(() => ({\n    ...INVITATION_CARD_DEFAULTS,\n    ...this.props(),\n  }));\n\n  readonly subtitle = computed(() => {\n    const cfg = this.config();\n    return [cfg.inviterName, cfg.role].filter(Boolean).join(' · ');\n  });\n\n  readonly acceptLabel = computed(() => {\n    const cfg = this.config();\n    if (cfg.acceptLabel) return cfg.acceptLabel;\n    this.i18n.lang();\n    return this.i18n.t(cfg.acceptKey, cfg.i18nNamespace);\n  });\n\n  readonly declineLabel = computed(() => {\n    const cfg = this.config();\n    if (cfg.declineLabel) return cfg.declineLabel;\n    this.i18n.lang();\n    return this.i18n.t(cfg.declineKey, cfg.i18nNamespace);\n  });\n\n  emitAccept(): void {\n    if (this.config().disabled) return;\n    this.onAccept.emit({ token: this.config().token });\n  }\n\n  emitDecline(): void {\n    if (this.config().disabled) return;\n    this.onDecline.emit({ token: this.config().token });\n  }\n}\n","/** Props for `val-member-card` — a reusable person/member row with avatar,\n *  name, secondary line (handle or email), optional role pill and an action. */\nexport interface MemberCardMetadata {\n  /** Optional identifier echoed back on the action event. */\n  id?: string;\n  name?: string;\n  handle?: string;\n  email?: string;\n  avatarUrl?: string;\n  /** Already-translated role label shown as a pill below the name. */\n  roleLabel?: string;\n  /** Show the trailing action button. */\n  showAction?: boolean;\n  /** Ionicon name for the action button. */\n  actionIcon?: string;\n  /** Accessible label for the action button. */\n  actionAriaLabel?: string;\n}\n\nexport const MEMBER_CARD_DEFAULTS: Partial<MemberCardMetadata> = {\n  showAction: true,\n  actionIcon: 'eye-outline',\n};\n","import { Component, computed, EventEmitter, input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { eyeOutline } from 'ionicons/icons';\nimport { UserAvatarComponent } from '../../atoms/user-avatar/user-avatar.component';\nimport { MEMBER_CARD_DEFAULTS, MemberCardMetadata } from './types';\n\n@Component({\n  selector: 'val-member-card',\n  standalone: true,\n  imports: [CommonModule, IonIcon, UserAvatarComponent],\n  template: `\n    <div class=\"member-card\">\n      <val-user-avatar\n        [props]=\"{\n          name: config().name,\n          avatarUrl: config().avatarUrl,\n          email: config().email,\n          size: 'medium',\n        }\"\n      />\n      <div class=\"member-card__body\">\n        <span class=\"member-card__name\">{{ displayName() }}</span>\n        @if (subtitle()) {\n          <span class=\"member-card__sub\">{{ subtitle() }}</span>\n        }\n        @if (config().roleLabel) {\n          <span class=\"member-card__role\">{{ config().roleLabel }}</span>\n        }\n      </div>\n      @if (config().showAction) {\n        <button\n          type=\"button\"\n          class=\"member-card__action\"\n          [attr.aria-label]=\"config().actionAriaLabel\"\n          (click)=\"emitAction()\"\n        >\n          <ion-icon [name]=\"config().actionIcon\" />\n        </button>\n      }\n    </div>\n  `,\n  styleUrls: ['./member-card.component.scss'],\n})\nexport class MemberCardComponent {\n  readonly props = input<MemberCardMetadata>({});\n\n  /** Emitted when the trailing action button is clicked. */\n  @Output() onAction = new EventEmitter<string | undefined>();\n\n  protected config = computed(() => ({\n    ...MEMBER_CARD_DEFAULTS,\n    ...this.props(),\n  }));\n\n  protected displayName = computed(() => {\n    const c = this.config();\n    return c.name || c.handle || c.email || '—';\n  });\n\n  protected subtitle = computed(() => {\n    const c = this.config();\n    if (c.handle) return '@' + c.handle;\n    return c.email ?? '';\n  });\n\n  constructor() {\n    addIcons({ eyeOutline });\n  }\n\n  emitAction(): void {\n    this.onAction.emit(this.config().id);\n  }\n}\n","import { Component, Input, OnInit, OnDestroy, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { IonInput, IonSpinner, IonIcon, IonText } from '@ionic/angular/standalone';\nimport {\n  Observable,\n  Subject,\n  debounceTime,\n  distinctUntilChanged,\n  takeUntil,\n  switchMap,\n  of,\n  catchError,\n  map,\n} from 'rxjs';\nimport { addIcons } from 'ionicons';\nimport { checkmarkCircle, closeCircle, alertCircle } from 'ionicons/icons';\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { UsernameInputMetadata, UsernameAvailabilityStatus } from './types';\n\naddIcons({ checkmarkCircle, closeCircle, alertCircle });\n\n/**\n * Username Input Component\n *\n * Input especializado para usernames/handles con:\n * - Prefijo '@' visual\n * - Validación de formato (alfanuméricos y _)\n * - Normalización automática (lowercase, sin espacios)\n * - Verificación de disponibilidad con debounce\n * - Estados visuales: available, taken, checking\n *\n * @example\n * <val-username-input\n *   [props]=\"{\n *     control: usernameControl,\n *     label: 'Nombre de usuario',\n *     placeholder: 'tu_username',\n *     checkAvailability: checkFn\n *   }\"\n * />\n */\n@Component({\n  selector: 'val-username-input',\n  standalone: true,\n  imports: [CommonModule, ReactiveFormsModule, IonInput, IonSpinner, IonIcon, IonText],\n  template: `\n    <div class=\"username-input-container\">\n      @if (props.label) {\n        <label class=\"username-label\">{{ props.label }}</label>\n      }\n\n      <!-- ion-input nativo: renderiza la pill shape como val-text-input.\n           Prefijo @ via slot=\"start\", status indicator via slot=\"end\". -->\n      <ion-input\n        [formControl]=\"props.control\"\n        type=\"text\"\n        [placeholder]=\"props.placeholder || 'username'\"\n        [maxlength]=\"props.maxLength || 30\"\n        (ionFocus)=\"onFocus()\"\n        (ionBlur)=\"onBlur()\"\n        (ionInput)=\"onInput($event)\"\n        class=\"username-field\"\n        [class.has-error]=\"hasError()\"\n      >\n        <span slot=\"start\" class=\"username-prefix\">{{ props.prefix || '@' }}</span>\n        @if (props.showAvailability !== false) {\n          <span slot=\"end\" class=\"availability-indicator\">\n            @switch (availabilityStatus()) {\n              @case ('checking') {\n                <ion-spinner name=\"circular\" class=\"checking-spinner\" />\n              }\n              @case ('available') {\n                <ion-icon name=\"checkmark-circle\" class=\"status-icon available\" />\n              }\n              @case ('taken') {\n                <ion-icon name=\"close-circle\" class=\"status-icon taken\" />\n              }\n              @case ('invalid') {\n                <ion-icon name=\"alert-circle\" class=\"status-icon invalid\" />\n              }\n            }\n          </span>\n        }\n      </ion-input>\n\n      @if (showStatusMessage()) {\n        <ion-text [color]=\"statusColor()\" class=\"status-message\">\n          <small>{{ statusMessage() }}</small>\n        </ion-text>\n      }\n\n      @if (hasError() && errorMessage()) {\n        <ion-text color=\"danger\" class=\"error-message\">\n          <small>{{ errorMessage() }}</small>\n        </ion-text>\n      }\n\n      <!-- Texto explicativo (hint). Consistente con phone-input.hint. -->\n      @if (props.hint && !hasError()) {\n        <small class=\"username-hint\">{{ props.hint }}</small>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .username-input-container {\n        margin-bottom: 1rem;\n      }\n\n      /* Match val-title (size=\"small\") — 16px/24 bold dark. Igual que\n       * phone-label y el resto de labels que val-form renderiza con val-title.\n       * Antes era 0.875rem → más chico que el resto. */\n      .username-label {\n        display: block;\n        font-size: 16px;\n        line-height: 24px;\n        font-weight: 700;\n        color: var(--ion-color-dark);\n        margin-bottom: 8px;\n      }\n\n      /* Hint igual al de phone-input: dark sólido, alineado a la derecha\n       * para coherencia visual con los demás inputs del formulario. */\n      .username-hint {\n        display: block;\n        font-size: 12px;\n        color: var(--ion-color-dark);\n        margin-top: 6px;\n        padding-right: 4px;\n        text-align: right;\n      }\n\n      /* Prefijo @ y indicador status renderizados como slots nativos de ion-input.\n       * Esto da consistencia visual perfecta con val-text-input (mismo ancho,\n       * misma shape pill, mismo padding). */\n      .username-prefix {\n        font-size: 1rem;\n        font-weight: 500;\n        color: var(--ion-color-medium);\n        user-select: none;\n        margin-inline-end: 0.25rem;\n        display: inline-flex;\n        align-items: center;\n      }\n\n      .username-field {\n        width: 100%;\n      }\n\n      .username-field.has-error {\n        --highlight-color: var(--ion-color-danger);\n      }\n\n      .availability-indicator {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        margin-inline-start: 0.5rem;\n      }\n\n      .checking-spinner {\n        width: 18px;\n        height: 18px;\n        --color: var(--ion-color-medium);\n      }\n\n      .status-icon {\n        font-size: 1.25rem;\n      }\n\n      .status-icon.available {\n        color: var(--ion-color-success);\n      }\n\n      .status-icon.taken {\n        color: var(--ion-color-danger);\n      }\n\n      .status-icon.invalid {\n        color: var(--ion-color-warning);\n      }\n\n      .status-message,\n      .error-message {\n        display: block;\n        margin-top: 0.25rem;\n        padding-left: 0.25rem;\n      }\n\n      /* Dark mode — usar --ion-color-dark (que en dark.class.css se invierte a\n         claro). NO usar --ion-color-light porque en dark mode mapea a oscuro y\n         dejaba el label casi invisible. */\n      :host-context(body.dark) .username-label,\n      :host-context(.dark) .username-label,\n      :host-context(.ion-palette-dark) .username-label,\n      :host-context(html.ion-palette-dark) .username-label,\n      :host-context([data-theme='dark']) .username-label {\n        color: var(--ion-color-dark);\n      }\n    `,\n  ],\n})\nexport class UsernameInputComponent implements OnInit, OnDestroy {\n  @Input() props!: UsernameInputMetadata;\n\n  /**\n   * AuthService optional — si está inyectado y `props.checkAvailability` no se provee,\n   * el component cae automáticamente a `AuthService.checkHandleAvailability` (backend\n   * de Valtech). Consumers que quieran otro endpoint pasan su propio callback.\n   */\n  private authService = inject(AuthService, { optional: true });\n\n  private destroy$ = new Subject<void>();\n  private checkAvailability$ = new Subject<string>();\n\n  // Signals\n  isFocused = signal(false);\n  availabilityStatus = signal<UsernameAvailabilityStatus>('idle');\n\n  // Computed\n  hasError = computed(() => {\n    const control = this.props?.control;\n    return control?.touched && control?.invalid;\n  });\n\n  showStatusMessage = computed(() => {\n    const status = this.availabilityStatus();\n    return status === 'available' || status === 'taken';\n  });\n\n  statusColor = computed(() => {\n    return this.availabilityStatus() === 'available' ? 'success' : 'danger';\n  });\n\n  statusMessage = computed(() => {\n    const status = this.availabilityStatus();\n    if (status === 'available') return 'Username disponible';\n    if (status === 'taken') return 'Username ya está en uso';\n    return '';\n  });\n\n  errorMessage = computed(() => {\n    const control = this.props?.control;\n    if (!control?.errors) return '';\n\n    const errors = this.props?.errors || {};\n\n    if (control.errors['required']) {\n      return errors['required'] || 'El username es requerido';\n    }\n    if (control.errors['minlength']) {\n      const min = this.props?.minLength || 3;\n      return errors['minlength'] || `Mínimo ${min} caracteres`;\n    }\n    if (control.errors['maxlength']) {\n      const max = this.props?.maxLength || 30;\n      return errors['maxlength'] || `Máximo ${max} caracteres`;\n    }\n    if (control.errors['pattern']) {\n      return errors['pattern'] || 'Solo letras, números y guión bajo (_)';\n    }\n\n    return '';\n  });\n\n  ngOnInit(): void {\n    this.setupAvailabilityCheck();\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  onFocus(): void {\n    this.isFocused.set(true);\n  }\n\n  onBlur(): void {\n    this.isFocused.set(false);\n    this.props.control.markAsTouched();\n  }\n\n  onInput(event: CustomEvent): void {\n    const input = event.detail.value || '';\n    // Normalize: lowercase, remove spaces, only allow valid chars\n    const normalized = this.normalizeUsername(input);\n\n    if (normalized !== input) {\n      this.props.control.setValue(normalized, { emitEvent: false });\n    }\n\n    // Trigger availability check (callback explícito o AuthService inyectado)\n    const canCheck = !!this.props.checkAvailability || !!this.authService;\n    if (canCheck && this.isValidFormat(normalized)) {\n      this.checkAvailability$.next(normalized);\n    } else if (!this.isValidFormat(normalized) && normalized.length > 0) {\n      this.availabilityStatus.set('invalid');\n    } else {\n      this.availabilityStatus.set('idle');\n    }\n  }\n\n  /**\n   * Resolve la fn de check de disponibilidad:\n   * 1. Si el caller pasa `props.checkAvailability` → usar esa\n   * 2. Si AuthService está inyectado → caer a `checkHandleAvailability` (backend Valtech)\n   * 3. Sino → undefined (no se muestra status indicator)\n   */\n  private resolveCheckFn(): ((username: string) => Observable<boolean>) | undefined {\n    if (this.props?.checkAvailability) return this.props.checkAvailability;\n    if (this.authService) {\n      return (username: string) =>\n        this.authService!.checkHandleAvailability(username).pipe(map(res => !!res?.available));\n    }\n    return undefined;\n  }\n\n  private setupAvailabilityCheck(): void {\n    const checkFn = this.resolveCheckFn();\n    if (!checkFn) return;\n\n    this.checkAvailability$\n      .pipe(\n        debounceTime(this.props.debounceTime || 500),\n        distinctUntilChanged(),\n        switchMap(username => {\n          if (!username || username.length < (this.props.minLength || 3)) {\n            return of(null);\n          }\n\n          this.availabilityStatus.set('checking');\n\n          return checkFn(username).pipe(catchError(() => of(null)));\n        }),\n        takeUntil(this.destroy$)\n      )\n      .subscribe(available => {\n        if (available === null) {\n          this.availabilityStatus.set('idle');\n        } else if (available) {\n          this.availabilityStatus.set('available');\n        } else {\n          this.availabilityStatus.set('taken');\n        }\n      });\n  }\n\n  private normalizeUsername(value: string): string {\n    return value\n      .toLowerCase()\n      .replace(/\\s/g, '')\n      .replace(/[^a-z0-9_]/g, '');\n  }\n\n  private isValidFormat(value: string): boolean {\n    if (!value) return false;\n    const minLen = this.props?.minLength || 3;\n    const maxLen = this.props?.maxLength || 30;\n    const pattern = /^[a-z0-9_]+$/;\n    return value.length >= minLen && value.length <= maxLen && pattern.test(value);\n  }\n}\n","import { LinkedProvider, OAuthProvider } from '../../../services/auth/types';\n\n/**\n * Metadata para LinkedProvidersComponent.\n */\nexport interface LinkedProvidersMetadata {\n  /** Lista de proveedores vinculados */\n  providers: LinkedProvider[];\n  /** Proveedores disponibles para vincular (default: ['google']) */\n  availableProviders?: OAuthProvider[];\n  /** Callback cuando se quiere vincular un provider */\n  onLink?: (provider: OAuthProvider) => void;\n  /** Callback cuando se quiere desvincular un provider */\n  onUnlink?: (provider: OAuthProvider) => void;\n  /** Mostrar botón para vincular nuevos (default: true) */\n  showLinkButton?: boolean;\n  /** Permitir desvincular (default: true si hay más de un método de auth) */\n  allowUnlink?: boolean;\n  /** Título de la sección */\n  title?: string;\n  /** Descripción de la sección */\n  description?: string;\n  /** Modo compacto sin card */\n  compact?: boolean;\n}\n\n/**\n * Información visual de un proveedor OAuth.\n */\nexport interface ProviderDisplayInfo {\n  id: OAuthProvider;\n  name: string;\n  icon: string;\n  color: string;\n  bgColor: string;\n}\n\n/**\n * Información de proveedores OAuth disponibles.\n */\nexport const OAUTH_PROVIDERS_INFO: Record<OAuthProvider, ProviderDisplayInfo> = {\n  google: {\n    id: 'google',\n    name: 'Google',\n    icon: 'logo-google',\n    color: '#DB4437',\n    bgColor: '#DB443715',\n  },\n  apple: {\n    id: 'apple',\n    name: 'Apple',\n    icon: 'logo-apple',\n    color: '#000000',\n    bgColor: '#00000010',\n  },\n  microsoft: {\n    id: 'microsoft',\n    name: 'Microsoft',\n    icon: 'logo-microsoft',\n    color: '#00A4EF',\n    bgColor: '#00A4EF15',\n  },\n};\n","import { Component, Input, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  IonCard,\n  IonCardHeader,\n  IonCardTitle,\n  IonCardContent,\n  IonList,\n  IonItem,\n  IonLabel,\n  IonIcon,\n  IonButton,\n  IonText,\n  IonChip,\n  AlertController,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  logoGoogle,\n  logoApple,\n  logoMicrosoft,\n  linkOutline,\n  unlinkOutline,\n  checkmarkCircle,\n} from 'ionicons/icons';\nimport { LinkedProvidersMetadata, OAUTH_PROVIDERS_INFO, ProviderDisplayInfo } from './types';\nimport { LinkedProvider, OAuthProvider } from '../../../services/auth/types';\n\naddIcons({\n  logoGoogle,\n  logoApple,\n  logoMicrosoft,\n  linkOutline,\n  unlinkOutline,\n  checkmarkCircle,\n});\n\n/**\n * Linked Providers Component\n *\n * Muestra los proveedores OAuth vinculados al usuario y permite\n * vincular nuevos o desvincular existentes.\n *\n * @example\n * <val-linked-providers\n *   [props]=\"{\n *     providers: linkedProviders(),\n *     onLink: linkProvider,\n *     onUnlink: unlinkProvider\n *   }\"\n * />\n */\n@Component({\n  selector: 'val-linked-providers',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonCard,\n    IonCardHeader,\n    IonCardTitle,\n    IonCardContent,\n    IonList,\n    IonItem,\n    IonLabel,\n    IonIcon,\n    IonButton,\n    IonText,\n    IonChip,\n  ],\n  template: `\n    @if (props.compact) {\n      <ng-container *ngTemplateOutlet=\"providersList\" />\n    } @else {\n      <ion-card>\n        <ion-card-header>\n          <ion-card-title>{{ props.title || 'Cuentas vinculadas' }}</ion-card-title>\n        </ion-card-header>\n        <ion-card-content>\n          @if (props.description) {\n            <p class=\"section-description\">{{ props.description }}</p>\n          }\n          <ng-container *ngTemplateOutlet=\"providersList\" />\n        </ion-card-content>\n      </ion-card>\n    }\n\n    <ng-template #providersList>\n      <ion-list lines=\"none\" class=\"providers-list\">\n        <!-- Linked providers -->\n        @for (provider of linkedProviders(); track provider.provider) {\n          <ion-item class=\"provider-item linked\">\n            <div class=\"provider-icon\" [style.background-color]=\"getProviderInfo(provider.provider).bgColor\" slot=\"start\">\n              <ion-icon [name]=\"getProviderInfo(provider.provider).icon\" [style.color]=\"getProviderInfo(provider.provider).color\" />\n            </div>\n            <ion-label>\n              <h3>{{ getProviderInfo(provider.provider).name }}</h3>\n              <p>{{ provider.email }}</p>\n            </ion-label>\n            <ion-icon name=\"checkmark-circle\" color=\"success\" slot=\"end\" class=\"linked-icon\" />\n            @if (props.allowUnlink !== false && canUnlink()) {\n              <ion-button\n                fill=\"clear\"\n                color=\"medium\"\n                slot=\"end\"\n                (click)=\"confirmUnlink(provider.provider)\"\n                class=\"unlink-btn\"\n              >\n                <ion-icon name=\"unlink-outline\" slot=\"icon-only\" />\n              </ion-button>\n            }\n          </ion-item>\n        }\n\n        <!-- Available providers to link -->\n        @if (props.showLinkButton !== false) {\n          @for (provider of unlinkedProviders(); track provider.id) {\n            <ion-item class=\"provider-item available\" button (click)=\"onLinkProvider(provider.id)\">\n              <div class=\"provider-icon muted\" slot=\"start\">\n                <ion-icon [name]=\"provider.icon\" />\n              </div>\n              <ion-label>\n                <h3>{{ provider.name }}</h3>\n                <p>Vincular cuenta</p>\n              </ion-label>\n              <ion-icon name=\"link-outline\" color=\"primary\" slot=\"end\" />\n            </ion-item>\n          }\n        }\n\n        @if (linkedProviders().length === 0 && unlinkedProviders().length === 0) {\n          <ion-item>\n            <ion-label class=\"ion-text-center\">\n              <p>No hay proveedores disponibles</p>\n            </ion-label>\n          </ion-item>\n        }\n      </ion-list>\n    </ng-template>\n  `,\n  styles: [`\n    ion-card {\n      margin: 0;\n      border-radius: 12px;\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n    }\n\n    ion-card-title {\n      font-size: 1.125rem;\n      font-weight: 600;\n    }\n\n    .section-description {\n      margin: 0 0 1rem;\n      color: var(--ion-color-medium);\n      font-size: 0.875rem;\n    }\n\n    .providers-list {\n      padding: 0;\n    }\n\n    .provider-item {\n      --padding-start: 0;\n      --padding-end: 0;\n      --inner-padding-end: 0;\n      margin-bottom: 0.5rem;\n      border-radius: 8px;\n      border: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    .provider-item:last-child {\n      margin-bottom: 0;\n    }\n\n    .provider-icon {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 40px;\n      height: 40px;\n      border-radius: 8px;\n      margin-right: 0.75rem;\n    }\n\n    .provider-icon ion-icon {\n      font-size: 1.25rem;\n    }\n\n    .provider-icon.muted {\n      background: var(--ion-color-light);\n    }\n\n    .provider-icon.muted ion-icon {\n      color: var(--ion-color-medium);\n    }\n\n    .provider-item ion-label h3 {\n      font-weight: 600;\n      font-size: 0.9375rem;\n      margin-bottom: 0.125rem;\n    }\n\n    .provider-item ion-label p {\n      font-size: 0.8125rem;\n      color: var(--ion-color-medium);\n    }\n\n    .linked-icon {\n      font-size: 1.25rem;\n    }\n\n    .unlink-btn {\n      --padding-start: 0.5rem;\n      --padding-end: 0.5rem;\n    }\n\n    .provider-item.available {\n      cursor: pointer;\n    }\n\n    .provider-item.available:hover {\n      background: var(--ion-color-light-tint);\n    }\n\n    /* Dark mode */\n    :host-context(body.dark) {\n      .provider-item {\n        border-color: var(--ion-color-step-150);\n      }\n\n      .provider-icon.muted {\n        background: var(--ion-color-step-100);\n      }\n    }\n  `],\n})\nexport class LinkedProvidersComponent {\n  @Input() props!: LinkedProvidersMetadata;\n\n  private alertCtrl = new AlertController();\n\n  // Computed signals\n  linkedProviders = computed(() => this.props?.providers || []);\n\n  unlinkedProviders = computed(() => {\n    const linked = new Set(this.linkedProviders().map(p => p.provider));\n    const available = this.props?.availableProviders || ['google'];\n    return available\n      .filter(p => !linked.has(p))\n      .map(p => OAUTH_PROVIDERS_INFO[p]);\n  });\n\n  canUnlink = computed(() => {\n    // Can unlink if there's more than one provider or user has password\n    return this.linkedProviders().length > 1;\n  });\n\n  getProviderInfo(provider: OAuthProvider): ProviderDisplayInfo {\n    return OAUTH_PROVIDERS_INFO[provider] || OAUTH_PROVIDERS_INFO.google;\n  }\n\n  onLinkProvider(provider: OAuthProvider): void {\n    this.props.onLink?.(provider);\n  }\n\n  async confirmUnlink(provider: OAuthProvider): Promise<void> {\n    const info = this.getProviderInfo(provider);\n\n    const alert = await this.alertCtrl.create({\n      header: 'Desvincular cuenta',\n      message: `¿Estás seguro de que quieres desvincular tu cuenta de ${info.name}?`,\n      buttons: [\n        {\n          text: 'Cancelar',\n          role: 'cancel',\n        },\n        {\n          text: 'Desvincular',\n          role: 'destructive',\n          handler: () => {\n            this.props.onUnlink?.(provider);\n          },\n        },\n      ],\n    });\n\n    await alert.present();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n} from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  alertCircleOutline,\n  cloudOfflineOutline,\n  documentOutline,\n} from 'ionicons/icons';\n\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ButtonMetadata, ComponentStates } from '../../types';\nimport { EmptyStateMetadata, EmptyStateVariant } from './types';\n\n// Registra los 3 iconos default (variantes). Si la página pasa un icono custom\n// en `props.icon`, debe registrarlo ella misma con addIcons() — Ionic\n// standalone no resuelve nombres global, solo los del registry local.\naddIcons({\n  alertCircleOutline,\n  cloudOfflineOutline,\n  documentOutline,\n});\n\nconst DEFAULT_ICON_BY_VARIANT: Record<EmptyStateVariant, string> = {\n  empty: 'document-outline',\n  error: 'alert-circle-outline',\n  offline: 'cloud-offline-outline',\n};\n\n/**\n * `<val-empty-state>` — molecule declarativo para estados de \"no hay datos /\n * hubo error / sin red\". Reemplaza el patrón ad-hoc (ion-icon + val-title +\n * val-text + val-button) que cada página venía improvisando.\n *\n * Uso típico:\n *\n * ```html\n * @if (loading()) {\n *   <val-skeleton-layout [props]=\"...\" />\n * } @else if (errorState(); as e) {\n *   <val-empty-state [props]=\"e\" />\n * } @else if (items().length === 0) {\n *   <val-empty-state [props]=\"emptyProps\" />\n * } @else {\n *   <!-- contenido normal -->\n * }\n * ```\n *\n * I18n: las cadenas vienen ya traducidas en las props (la lib es agnóstica de\n * namespaces). Para wiring automático desde un error capturado, usar el\n * helper `createErrorStateProps(err, ...)` (`valtech-components`).\n */\n@Component({\n  selector: 'val-empty-state',\n  standalone: true,\n  imports: [CommonModule, IonIcon, ButtonComponent, TextComponent, TitleComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <section\n      class=\"empty-state\"\n      [class.empty-state--error]=\"variantClass() === 'error'\"\n      [class.empty-state--offline]=\"variantClass() === 'offline'\"\n      role=\"status\"\n      aria-live=\"polite\"\n    >\n      <ion-icon\n        class=\"empty-state__icon\"\n        [name]=\"iconName()\"\n        [style.font-size.px]=\"iconSize()\"\n        aria-hidden=\"true\"\n      />\n\n      <val-title\n        [props]=\"{\n          size: 'large',\n          color: 'dark',\n          bold: true,\n          content: props().title,\n        }\"\n      />\n\n      @if (props().description; as desc) {\n        <val-text\n          [props]=\"{\n            size: 'large',\n            color: 'medium',\n            bold: false,\n            content: desc,\n          }\"\n        />\n      }\n\n      @if (props().action; as a) {\n        <val-button\n          class=\"empty-state__cta\"\n          [props]=\"ctaProps()\"\n          (click)=\"a.handler()\"\n        />\n      }\n    </section>\n  `,\n  styles: [\n    `\n      .empty-state {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        text-align: center;\n        gap: 12px;\n        padding: 32px 16px;\n        min-height: 240px;\n      }\n      .empty-state__icon {\n        color: var(--ion-color-medium);\n      }\n      .empty-state--error .empty-state__icon {\n        color: var(--ion-color-warning, #ffb800);\n      }\n      .empty-state--offline .empty-state__icon {\n        color: var(--ion-color-medium);\n        opacity: 0.7;\n      }\n      .empty-state__cta {\n        margin-top: 8px;\n      }\n    `,\n  ],\n})\nexport class EmptyStateComponent {\n  props = input.required<EmptyStateMetadata>();\n\n  /** Variante resuelta (default `'empty'`). */\n  protected variantClass = computed<EmptyStateVariant>(\n    () => this.props().variant ?? 'empty',\n  );\n\n  /** Icono final — custom si se pasó, default de la variante si no. */\n  protected iconName = computed(\n    () => this.props().icon ?? DEFAULT_ICON_BY_VARIANT[this.variantClass()],\n  );\n\n  /** Tamaño en px. Default 64. */\n  protected iconSize = computed(() => this.props().iconSize ?? 64);\n\n  /**\n   * Props del botón CTA. Construidas a partir de `props().action`. El estado\n   * `WORKING` se aplica cuando `action.loading === true` (spinner mientras\n   * el handler corre).\n   */\n  protected ctaProps = computed<ButtonMetadata>(() => {\n    const action = this.props().action;\n    return {\n      text: action?.label ?? '',\n      color: 'dark',\n      type: 'button',\n      fill: 'solid',\n      size: 'default',\n      shape: 'round',\n      state: action?.loading ? ComponentStates.WORKING : ComponentStates.ENABLED,\n    } as ButtonMetadata;\n  });\n}\n","import { interpretError } from '../../../services/errors/interpret-error';\nimport { EmptyStateMetadata } from './types';\n\n/**\n * Opciones del helper. Los strings son requeridos para mantener el\n * componente i18n-agnóstico — la página los resuelve (con su namespace) y los\n * pasa ya traducidos. El helper solo decide la VARIANTE y compone los props.\n */\nexport interface CreateErrorStateOpts {\n  /**\n   * Título a mostrar. Convención: la página lo resuelve por escenario:\n   *  - red caída     → `t('offlineTitle')`\n   *  - error backend → `t('errorTitle')`\n   *\n   * Si pasás un solo string, se usa en ambas variantes. Si pasás el objeto,\n   * el helper elige según `isNetwork` del error interpretado.\n   */\n  title: string | { offline: string; error: string };\n  /** Descripción a mostrar (típicamente el `message` del backend en español). */\n  description?: string | { offline: string; error: string };\n  /** Label del botón CTA (típicamente `t('retry')`). Si se omite, no se muestra botón. */\n  retryLabel?: string;\n  /** Handler invocado al click de retry. Requerido si `retryLabel` está. */\n  onRetry?: () => void | Promise<void>;\n  /** `true` mientras el retry está corriendo — el botón pasa a WORKING. */\n  retrying?: boolean;\n}\n\n/**\n * Convierte un error capturado en `EmptyStateMetadata` listo para\n * `<val-empty-state>`. Decide la variante (`offline` vs `error`) según\n * `interpretError(err).isNetwork`.\n *\n * Uso típico en una page:\n *\n * ```ts\n * readonly errorState = computed(() => {\n *   const err = this.loadError();\n *   if (!err) return null;\n *   return createErrorStateProps(err, {\n *     title: { offline: this.t('offlineTitle'), error: this.t('errorTitle') },\n *     description: { offline: this.t('offlineHint'), error: interpretError(err).message },\n *     retryLabel: this.t('retry'),\n *     onRetry: () => this.reload(),\n *     retrying: this.reloading(),\n *   });\n * });\n * ```\n *\n * En el template:\n *\n * ```html\n * @if (errorState(); as e) {\n *   <val-empty-state [props]=\"e\" />\n * }\n * ```\n *\n * Para escenarios SIN error (lista vacía), construir `EmptyStateMetadata`\n * manualmente con `variant: 'empty'` — no es lo que este helper resuelve.\n */\nexport function createErrorStateProps(\n  err: unknown,\n  opts: CreateErrorStateOpts,\n): EmptyStateMetadata {\n  const interpreted = interpretError(err);\n  const variant = interpreted.isNetwork ? 'offline' : 'error';\n\n  const pick = <T>(v: T | { offline: T; error: T }): T =>\n    typeof v === 'object' && v !== null && 'offline' in v\n      ? (v as { offline: T; error: T })[variant]\n      : (v as T);\n\n  const action =\n    opts.retryLabel && opts.onRetry\n      ? {\n          label: opts.retryLabel,\n          handler: opts.onRetry,\n          loading: opts.retrying ?? false,\n        }\n      : undefined;\n\n  return {\n    variant,\n    title: pick(opts.title),\n    description: opts.description ? pick(opts.description) : undefined,\n    action,\n  };\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output, signal } from '@angular/core';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone';\nimport { ImageCroppedEvent, ImageCropperComponent } from 'ngx-image-cropper';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * ImageCropComponent\n *\n * A modal-ready component for cropping images with a specified aspect ratio.\n * Uses ngx-image-cropper internally and provides a simple interface.\n *\n * @example Inside an ion-modal\n * ```html\n * <ion-modal [isOpen]=\"showCropModal\">\n *   <ng-template>\n *     <val-image-crop\n *       [image]=\"selectedFile\"\n *       [aspectRatio]=\"1\"\n *       [roundCropper]=\"true\"\n *       (cropComplete)=\"onCropComplete($event)\"\n *       (cancel)=\"showCropModal = false\"\n *     />\n *   </ng-template>\n * </ion-modal>\n * ```\n */\n@Component({\n  selector: 'val-image-crop',\n  standalone: true,\n  imports: [CommonModule, IonHeader, IonToolbar, IonTitle, IonButtons, IonButton, IonContent, ImageCropperComponent],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"start\">\n          <ion-button (click)=\"cancel.emit()\" color=\"medium\">\n            {{ cancelText() }}\n          </ion-button>\n        </ion-buttons>\n        <ion-title>{{ titleText() }}</ion-title>\n        <ion-buttons slot=\"end\">\n          <ion-button\n            (click)=\"confirmCrop()\"\n            color=\"primary\"\n            [strong]=\"true\"\n            [disabled]=\"!croppedBlob()\"\n            data-testid=\"image-crop-confirm\"\n          >\n            {{ confirmText() }}\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n\n    <ion-content class=\"image-crop-content\">\n      <image-cropper\n        [imageFile]=\"image()\"\n        [aspectRatio]=\"aspectRatio()\"\n        [maintainAspectRatio]=\"true\"\n        [roundCropper]=\"roundCropper()\"\n        [resizeToWidth]=\"resizeToWidth()\"\n        format=\"jpeg\"\n        outputType=\"blob\"\n        (imageCropped)=\"onImageCropped($event)\"\n        (loadImageFailed)=\"onLoadFailed()\"\n      />\n    </ion-content>\n  `,\n  styles: [\n    `\n      :host {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n      }\n\n      .image-crop-content {\n        --background: var(--ion-color-dark);\n      }\n\n      .image-crop-content::part(scroll) {\n        display: flex;\n        flex-direction: column;\n      }\n\n      image-cropper {\n        --cropper-outline-color: rgba(255, 255, 255, 0.3);\n        --cropper-background-color: var(--ion-color-dark);\n        flex: 1;\n        height: 100%;\n        max-height: calc(100vh - 56px);\n      }\n\n      /* Ensure the cropper wrapper takes full height */\n      ::ng-deep .ngx-ic-component {\n        height: 100% !important;\n      }\n\n      ::ng-deep .ngx-ic-source-image {\n        max-height: 100% !important;\n      }\n    `,\n  ],\n})\nexport class ImageCropComponent {\n  private i18n = inject(I18nService);\n\n  /** Image file to crop */\n  readonly image = input.required<File>();\n\n  /** Aspect ratio (1 for square, 16/9 for widescreen, etc.) */\n  readonly aspectRatio = input<number>(1);\n\n  /** Use round cropper (for avatars) */\n  readonly roundCropper = input<boolean>(true);\n\n  /** Resize output to specific width (0 = no resize) */\n  readonly resizeToWidth = input<number>(0);\n\n  /** i18n namespace for labels */\n  readonly i18nNamespace = input<string>('ImageCrop');\n\n  /** Emitted when crop is confirmed with the cropped blob */\n  @Output() cropComplete = new EventEmitter<Blob>();\n\n  /** Emitted when user cancels the crop */\n  @Output() cancel = new EventEmitter<void>();\n\n  /** Emitted when image fails to load */\n  @Output() loadFailed = new EventEmitter<void>();\n\n  /** Internal signal for cropped blob */\n  protected croppedBlob = signal<Blob | null>(null);\n\n  /** Computed text for cancel button */\n  protected cancelText = computed(() => {\n    this.i18n.lang(); // Track language changes\n    return this.i18n.t('cancel', 'Common') || 'Cancelar';\n  });\n\n  /** Computed text for confirm button */\n  protected confirmText = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('confirm', 'Common') || 'Confirmar';\n  });\n\n  /** Computed text for title */\n  protected titleText = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('cropImage', this.i18nNamespace()) || 'Recortar imagen';\n  });\n\n  /** Handle crop event from ngx-image-cropper */\n  onImageCropped(event: ImageCroppedEvent): void {\n    if (event.blob) {\n      this.croppedBlob.set(event.blob);\n    }\n  }\n\n  /** Confirm and emit the cropped blob */\n  confirmCrop(): void {\n    const blob = this.croppedBlob();\n    if (blob) {\n      this.cropComplete.emit(blob);\n    }\n  }\n\n  /** Handle load failure */\n  onLoadFailed(): void {\n    this.loadFailed.emit();\n  }\n}\n","import { Component, computed, inject, input, output } from '@angular/core';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonToolbar } from '@ionic/angular/standalone';\n\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * `val-modal-shell` — wrapper canónico para modales del factory.\n *\n * Implementa el patrón obligatorio de la Regla #5 (`frontend/CLAUDE.md`):\n *  - Header sin `<ion-title>`, solo botón de cierre con texto `Cerrar` en\n *    `slot=\"end\"`.\n *  - Título principal del modal en el BODY como `val-display size=\"small\"`\n *    (32/24 px).\n *  - Subtítulo opcional como `val-title size=\"large\"` (24/18 px).\n *\n * El contenido del modal se proyecta vía `<ng-content>`.\n *\n * @example\n * ```html\n * <val-modal-shell [title]=\"title\" [subtitle]=\"subtitle\" (close)=\"dismiss()\">\n *   <!-- body del modal -->\n *   <p>Contenido...</p>\n * </val-modal-shell>\n * ```\n *\n * @example Sin subtitle, con label de cierre custom:\n * ```html\n * <val-modal-shell [title]=\"title\" [closeLabel]=\"'Fechar'\" (close)=\"dismiss()\">\n *   ...\n * </val-modal-shell>\n * ```\n */\n@Component({\n  selector: 'val-modal-shell',\n  standalone: true,\n  imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, DisplayComponent, TitleComponent],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        @if (showClose()) {\n          <ion-buttons slot=\"end\">\n            <ion-button fill=\"clear\" color=\"dark\" (click)=\"onClose()\">\n              <strong>{{ resolvedCloseLabel() }}</strong>\n            </ion-button>\n          </ion-buttons>\n        }\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      @if (title()) {\n        <val-display [props]=\"{ content: title(), size: 'small', color: 'dark' }\" />\n      }\n      @if (subtitle()) {\n        <val-title [props]=\"{ content: subtitle(), size: 'large', color: '', bold: false }\" />\n      }\n      <ng-content />\n    </ion-content>\n  `,\n  styles: [\n    `\n      :host {\n        display: contents;\n      }\n    `,\n  ],\n})\nexport class ModalShellComponent {\n  private i18n = inject(I18nService);\n\n  /** Título principal del modal — se renderiza como `val-display size=\"small\"`. */\n  readonly title = input<string>('');\n\n  /** Subtítulo opcional — se renderiza como `val-title size=\"large\"`. */\n  readonly subtitle = input<string>('');\n\n  /**\n   * Label del botón de cierre. Si no se provee, se resuelve vía i18n con la\n   * clave `close` del namespace `_global` (\"Cerrar\" / \"Close\" / \"Fechar\").\n   */\n  readonly closeLabel = input<string>('');\n\n  /**\n   * Muestra el botón de cierre del header. `true` por defecto (estándar\n   * canónico). Solo se desactiva en modales no-dismissable (ej. confirmaciones\n   * bloqueantes que requieren respuesta explícita).\n   */\n  readonly showClose = input<boolean>(true);\n\n  /** Emite cuando el user toca el botón de cierre del header. */\n  readonly close = output<void>();\n\n  /** Label efectivo — usa `closeLabel` si viene, sino cae al i18n `_global.close`. */\n  readonly resolvedCloseLabel = computed(() => {\n    const label = this.closeLabel();\n    if (label) return label;\n    return this.i18n.t('close', '_global');\n  });\n\n  onClose(): void {\n    this.close.emit();\n  }\n}\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { ValtechFeedbackConfig } from './types';\n\n/**\n * Token de inyección para la configuración de Feedback.\n */\nexport const VALTECH_FEEDBACK_CONFIG = new InjectionToken<ValtechFeedbackConfig>(\n  'ValtechFeedbackConfig'\n);\n\n/**\n * Configuración por defecto.\n */\nexport const DEFAULT_FEEDBACK_CONFIG: Partial<ValtechFeedbackConfig> = {\n  feedbackPrefix: '/v1/feedback',\n  maxAttachments: 5,\n  // Estándar acordado para adjuntos de feedback: solo imágenes (JPEG/PNG/WebP)\n  // y PDF, máx 5 MB. Reflejado en `storage.rules` (path `users/{uid}/feedback/`).\n  maxFileSize: 5 * 1024 * 1024,\n  allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp', 'application/pdf'],\n  storagePath: 'feedback',\n};\n\n/**\n * Provee el servicio de feedback a la aplicación Angular.\n *\n * @param config - Configuración de feedback\n * @returns EnvironmentProviders para usar en bootstrapApplication\n *\n * @example\n * ```typescript\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechFeedback } from 'valtech-components';\n * import { environment } from './environments/environment';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAuth({ apiUrl: environment.apiUrl }),\n *     provideValtechFeedback({\n *       apiUrl: environment.apiUrl,\n *       appId: 'my-app-name',\n *     }),\n *   ],\n * });\n * ```\n */\nexport function provideValtechFeedback(config: ValtechFeedbackConfig): EnvironmentProviders {\n  const mergedConfig: ValtechFeedbackConfig = {\n    ...DEFAULT_FEEDBACK_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([{ provide: VALTECH_FEEDBACK_CONFIG, useValue: mergedConfig }]);\n}\n","import { Injectable, inject, isDevMode, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\nimport { VALTECH_FEEDBACK_CONFIG } from './config';\nimport {\n  CreateFeedbackRequest,\n  CreateFeedbackResponse,\n  GetFeedbackResponse,\n  CheckFeedbackResponse,\n  DeviceContext,\n  FeedbackType,\n  ContentRef,\n  EntityRef,\n  ReactionValue,\n  FeedbackFirestoreDoc,\n} from './types';\nimport { FirestoreService } from '../firebase/firestore.service';\nimport { StorageService } from '../firebase/storage.service';\nimport { AuthService } from '../auth/auth.service';\n\n/**\n * Servicio para gestionar feedback de usuarios.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n *   private feedbackService = inject(FeedbackService);\n *\n *   async submitFeedback() {\n *     const response = await this.feedbackService.createAsync(\n *       'feedback',\n *       'Mi comentario',\n *       'Descripción detallada...'\n *     );\n *     console.log('Feedback enviado:', response.feedbackId);\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FeedbackService {\n  private config = inject(VALTECH_FEEDBACK_CONFIG, { optional: true });\n  private http = inject(HttpClient);\n  private firestore = inject(FirestoreService, { optional: true });\n  private storage = inject(StorageService, { optional: true });\n  private auth = inject(AuthService, { optional: true });\n\n  readonly isConfigured = signal(!!this.config);\n\n  constructor() {\n    if (!this.config && isDevMode()) {\n      console.warn(\n        '[valtech-components] FeedbackService: provideValtechFeedback() no está en main.ts. ' +\n          'Las reacciones y el feedback no funcionarán.'\n      );\n    }\n  }\n\n  /**\n   * URL base para endpoints de feedback.\n   */\n  private get baseUrl(): string {\n    return `${this.config?.apiUrl}${this.config?.feedbackPrefix}`;\n  }\n\n  /**\n   * Captura el contexto del dispositivo automáticamente.\n   */\n  captureDeviceContext(): DeviceContext {\n    const ua = navigator.userAgent;\n    return {\n      browser: this.detectBrowser(ua),\n      os: this.detectOS(ua),\n      viewport: `${window.innerWidth}x${window.innerHeight}`,\n      language: navigator.language,\n      userAgent: ua,\n      pageUrl: window.location.href,\n    };\n  }\n\n  /**\n   * Crea un nuevo feedback.\n   *\n   * @param type - Tipo de feedback\n   * @param title - Título del feedback\n   * @param description - Descripción detallada\n   * @param attachments - URLs de archivos adjuntos (opcional)\n   * @param contentRef - Referencia a contenido específico (opcional)\n   * @returns Observable con la respuesta\n   */\n  create(\n    type: FeedbackType,\n    title: string,\n    description: string,\n    attachments: string[] = [],\n    contentRef?: ContentRef\n  ): Observable<CreateFeedbackResponse> {\n    const request: CreateFeedbackRequest = {\n      type,\n      title,\n      description,\n      attachments,\n      contentRef,\n      deviceContext: this.captureDeviceContext(),\n      appId: this.config?.appId,\n    };\n\n    return this.http.post<CreateFeedbackResponse>(this.baseUrl, request);\n  }\n\n  /**\n   * Crea un nuevo feedback (versión async/await).\n   */\n  async createAsync(\n    type: FeedbackType,\n    title: string,\n    description: string,\n    attachments: string[] = [],\n    contentRef?: ContentRef\n  ): Promise<CreateFeedbackResponse> {\n    return firstValueFrom(this.create(type, title, description, attachments, contentRef));\n  }\n\n  /**\n   * Obtiene un feedback por ID (solo el propietario).\n   *\n   * @param feedbackId - ID del feedback\n   * @returns Observable con la respuesta\n   */\n  getById(feedbackId: string): Observable<GetFeedbackResponse> {\n    return this.http.get<GetFeedbackResponse>(`${this.baseUrl}/${feedbackId}`);\n  }\n\n  /**\n   * Obtiene un feedback por ID (versión async/await).\n   */\n  async getByIdAsync(feedbackId: string): Promise<GetFeedbackResponse> {\n    return firstValueFrom(this.getById(feedbackId));\n  }\n\n  /**\n   * Valida si un archivo cumple con las restricciones.\n   */\n  validateFile(file: File): { valid: boolean; error?: string } {\n    // Verificar tamaño\n    if (file.size > this.config?.maxFileSize!) {\n      const maxSizeMB = Math.round(this.config?.maxFileSize! / (1024 * 1024));\n      return {\n        valid: false,\n        error: `El archivo excede el tamaño máximo de ${maxSizeMB}MB`,\n      };\n    }\n\n    // Verificar tipo\n    const allowedTypes = this.config?.allowedFileTypes || [];\n    const isAllowed = allowedTypes.some(pattern => {\n      if (pattern.endsWith('/*')) {\n        const baseType = pattern.replace('/*', '');\n        return file.type.startsWith(baseType);\n      }\n      return file.type === pattern;\n    });\n\n    if (!isAllowed) {\n      return {\n        valid: false,\n        error: 'Tipo de archivo no permitido',\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Valida el CONTENIDO del archivo por magic-bytes (firma binaria) —\n   * defensa contra spoofing del content-type declarado. Lee los primeros 12\n   * bytes y los compara con las firmas de JPEG/PNG/WebP/PDF (whitelist\n   * estricta). Es client-side, ergo bypasseable; la defensa real vive en las\n   * Storage rules. Esto corta el 99% de los casos accidentales o no-targeted.\n   */\n  async validateFileContent(file: File): Promise<{ valid: boolean; error?: string }> {\n    const buf = await file.slice(0, 12).arrayBuffer();\n    const b = new Uint8Array(buf);\n\n    // JPEG: FF D8 FF\n    if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) {\n      return { valid: true };\n    }\n    // PNG: 89 50 4E 47 0D 0A 1A 0A\n    if (\n      b[0] === 0x89 &&\n      b[1] === 0x50 &&\n      b[2] === 0x4e &&\n      b[3] === 0x47 &&\n      b[4] === 0x0d &&\n      b[5] === 0x0a &&\n      b[6] === 0x1a &&\n      b[7] === 0x0a\n    ) {\n      return { valid: true };\n    }\n    // WebP: \"RIFF\" (0..3) + \"WEBP\" (8..11)\n    if (\n      b[0] === 0x52 &&\n      b[1] === 0x49 &&\n      b[2] === 0x46 &&\n      b[3] === 0x46 &&\n      b[8] === 0x57 &&\n      b[9] === 0x45 &&\n      b[10] === 0x42 &&\n      b[11] === 0x50\n    ) {\n      return { valid: true };\n    }\n    // PDF: \"%PDF-\"\n    if (b[0] === 0x25 && b[1] === 0x50 && b[2] === 0x44 && b[3] === 0x46 && b[4] === 0x2d) {\n      return { valid: true };\n    }\n\n    return {\n      valid: false,\n      error: 'El contenido del archivo no coincide con un tipo permitido (imagen o PDF).',\n    };\n  }\n\n  /**\n   * Sube un adjunto a Firebase Storage en `users/{uid}/feedback/{uuid}/{name}`\n   * y devuelve su download URL. Ejecuta tres validaciones en orden:\n   *   1. tamaño + tipo declarado (`validateFile`)\n   *   2. contenido por magic-bytes (`validateFileContent`)\n   *   3. usuario autenticado (no soportamos adjuntos en feedback anónimo)\n   *\n   * Si cualquier validación falla → rechaza la promesa con un Error legible;\n   * el componente que la consuma debe cancelar la operación de adjuntar.\n   */\n  async uploadAttachment(file: File): Promise<string> {\n    const sizeTypeCheck = this.validateFile(file);\n    if (!sizeTypeCheck.valid) {\n      throw new Error(sizeTypeCheck.error);\n    }\n\n    const contentCheck = await this.validateFileContent(file);\n    if (!contentCheck.valid) {\n      throw new Error(contentCheck.error);\n    }\n\n    const userId = this.auth?.user()?.userId;\n    if (!userId) {\n      throw new Error('Debes iniciar sesión para adjuntar archivos.');\n    }\n\n    if (!this.storage) {\n      throw new Error('StorageService no está configurado.');\n    }\n\n    // Path bajo `users/{uid}/feedback/` — sibling de `files/`, con su propia\n    // regla en `storage.rules` (whitelist estricta JPEG/PNG/WebP/PDF + 5MB).\n    // skipPrefix=true porque `users/{uid}/` es path GLOBAL cross-app.\n    const uuid =\n      typeof crypto !== 'undefined' && 'randomUUID' in crypto\n        ? crypto.randomUUID()\n        : `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n    const safeName = file.name.replace(/[^a-zA-Z0-9._-]/g, '_');\n    const path = `users/${userId}/feedback/${uuid}/${safeName}`;\n\n    const result = await this.storage.uploadAndGetUrl(path, file, {\n      contentType: file.type,\n      skipPrefix: true,\n    });\n    return result.downloadUrl;\n  }\n\n  /**\n   * Obtiene la configuración actual del servicio.\n   */\n  getConfig(): Readonly<typeof this.config> {\n    return this.config;\n  }\n\n  // =========================================================================\n  // Reaction Methods (Content feedback with emojis)\n  // =========================================================================\n\n  /**\n   * Verifica si el usuario ya dio feedback para una entidad específica.\n   *\n   * Primero intenta leer de Firebase (rápido, sin latencia de red al backend).\n   * Si Firebase no está disponible o falla, hace fallback a la API.\n   *\n   * @param entityType - Tipo de entidad (article, docs, feature, etc.)\n   * @param entityId - ID de la entidad\n   * @returns Promise con la respuesta de verificación\n   *\n   * @example\n   * ```typescript\n   * const check = await this.feedbackService.checkFeedback('article', 'art-123');\n   * if (check.hasFeedback) {\n   *   console.log('Ya dio feedback:', check.reactionValue);\n   * }\n   * ```\n   */\n  async checkFeedback(entityType: string, entityId: string): Promise<CheckFeedbackResponse> {\n    // Si no hay usuario autenticado, no puede haber feedback previo\n    // Retornar inmediatamente sin llamar al API (evita 401 y redirect a login)\n    const userId = this.auth?.user()?.userId;\n    if (!userId) {\n      return { operationId: '', hasFeedback: false };\n    }\n\n    // 1. Intentar Firebase primero (si está disponible)\n    if (this.firestore) {\n      try {\n        // Path: feedback/{entityType}/{entityId}/{userId}\n        // FirestoreService agrega automáticamente el prefijo apps/{appId}/\n        const collectionPath = `feedback/${entityType}/${entityId}`;\n        const doc = await this.firestore.getDoc<FeedbackFirestoreDoc>(collectionPath, userId);\n\n        if (doc) {\n          return {\n            operationId: '',\n            hasFeedback: true,\n            feedbackId: doc.feedbackId,\n            type: doc.type as FeedbackType,\n            reactionValue: doc.reactionValue as ReactionValue,\n            createdAt: doc.createdAt?.toISOString(),\n          };\n        }\n\n        // Doc no existe = no hay feedback\n        return { operationId: '', hasFeedback: false };\n      } catch (error) {\n        console.warn('[FeedbackService] Firebase check failed, falling back to API:', error);\n        // Fallback a API\n      }\n    }\n\n    // 2. Fallback: llamar API (solo si hay usuario autenticado)\n    const params = new URLSearchParams({\n      appId: this.config?.appId,\n      entityType,\n      entityId,\n    });\n\n    return firstValueFrom(this.http.get<CheckFeedbackResponse>(`${this.baseUrl}/check?${params}`));\n  }\n\n  /**\n   * Crea o actualiza una reacción (feedback con emoji).\n   *\n   * @param entityRef - Referencia a la entidad\n   * @param value - Valor de la reacción (negative, neutral, positive)\n   * @param comment - Comentario opcional (máx 500 caracteres)\n   * @returns Promise con la respuesta\n   *\n   * @example\n   * ```typescript\n   * const response = await this.feedbackService.createReaction(\n   *   { entityType: 'article', entityId: 'art-123' },\n   *   'positive',\n   *   'Muy útil!'\n   * );\n   * ```\n   */\n  async createReaction(\n    entityRef: EntityRef,\n    value: ReactionValue,\n    comment?: string\n  ): Promise<CreateFeedbackResponse> {\n    const request: CreateFeedbackRequest = {\n      type: 'reaction',\n      entityRef,\n      reactionValue: value,\n      description: comment || '',\n      deviceContext: this.captureDeviceContext(),\n      appId: this.config?.appId,\n    };\n\n    return firstValueFrom(this.http.post<CreateFeedbackResponse>(this.baseUrl, request));\n  }\n\n  /**\n   * Crea feedback anónimo (sin autenticación requerida).\n   * Usado para blogs, FAQs y contenido público.\n   *\n   * @param entityRef - Referencia a la entidad\n   * @param value - Valor de la reacción (negative, neutral, positive)\n   * @param comment - Comentario opcional (máx 500 caracteres)\n   * @returns Promise con la respuesta\n   *\n   * @example\n   * ```typescript\n   * // En un blog público\n   * const response = await this.feedbackService.createAnonymousReaction(\n   *   { entityType: 'blog', entityId: 'my-post-slug' },\n   *   'positive'\n   * );\n   * ```\n   */\n  async createAnonymousReaction(\n    entityRef: EntityRef,\n    value: ReactionValue,\n    comment?: string\n  ): Promise<CreateFeedbackResponse> {\n    const request = {\n      type: 'reaction' as const,\n      entityRef,\n      reactionValue: value,\n      description: comment || '',\n      deviceContext: this.captureDeviceContext(),\n      appId: this.config?.appId,\n    };\n\n    return firstValueFrom(\n      this.http.post<CreateFeedbackResponse>(`${this.baseUrl}/anonymous`, request)\n    );\n  }\n\n  // =========================================================================\n  // Helpers privados para detección de browser/OS\n  // =========================================================================\n\n  private detectBrowser(ua: string): string {\n    if (ua.includes('Edg/')) return 'Edge';\n    if (ua.includes('Chrome/')) return 'Chrome';\n    if (ua.includes('Firefox/')) return 'Firefox';\n    if (ua.includes('Safari/') && !ua.includes('Chrome')) return 'Safari';\n    if (ua.includes('Opera') || ua.includes('OPR/')) return 'Opera';\n    return 'Unknown';\n  }\n\n  private detectOS(ua: string): string {\n    if (ua.includes('Windows NT 10')) return 'Windows 10';\n    if (ua.includes('Windows NT 11')) return 'Windows 11';\n    if (ua.includes('Windows')) return 'Windows';\n    if (ua.includes('Mac OS X')) {\n      const match = ua.match(/Mac OS X (\\d+[._]\\d+)/);\n      if (match) {\n        return `macOS ${match[1].replace('_', '.')}`;\n      }\n      return 'macOS';\n    }\n    if (ua.includes('Android')) return 'Android';\n    if (ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n    if (ua.includes('Linux')) return 'Linux';\n    return 'Unknown';\n  }\n}\n","/**\n * Configuración del servicio de Feedback.\n */\nexport interface ValtechFeedbackConfig {\n  /** URL base de la API */\n  apiUrl: string;\n  /** ID de la aplicación (ej: 'my-valtech-app') */\n  appId: string;\n  /** Prefijo para endpoints (default: '/v1/feedback') */\n  feedbackPrefix?: string;\n  /** Número máximo de adjuntos (default: 5) */\n  maxAttachments?: number;\n  /** Tamaño máximo por archivo en bytes (default: 10MB) */\n  maxFileSize?: number;\n  /** Tipos de archivo permitidos (default: ['image/*', 'video/*', 'application/pdf']) */\n  allowedFileTypes?: string[];\n  /** Ruta en Firebase Storage para adjuntos (default: 'feedback') */\n  storagePath?: string;\n}\n\n/**\n * Tipos de feedback disponibles.\n */\nexport type FeedbackType =\n  | 'issue'\n  | 'poor-content'\n  | 'feedback'\n  | 'suggestion'\n  | 'reaction';\n\n/**\n * Valor de reacción (para feedback tipo emoji).\n */\nexport type ReactionValue = 'negative' | 'neutral' | 'positive';\n\n/**\n * Estado de un feedback.\n */\nexport type FeedbackStatus = 'new' | 'reviewed' | 'resolved';\n\n/**\n * Tipos de contenido para referencia.\n */\nexport type ContentType =\n  | 'article'\n  | 'faq'\n  | 'news'\n  | 'page'\n  | 'product'\n  | 'event'\n  | 'other';\n\n/**\n * Referencia a contenido específico.\n */\nexport interface ContentRef {\n  contentId: string;\n  contentType: ContentType;\n}\n\n/**\n * Referencia a entidad (para reactions y feedback de contenido).\n */\nexport interface EntityRef {\n  /** Tipo de entidad: 'article', 'docs', 'feature', 'bug', etc. */\n  entityType: string;\n  /** ID de la entidad */\n  entityId: string;\n}\n\n/**\n * Contexto del dispositivo del usuario.\n */\nexport interface DeviceContext {\n  browser: string;\n  os: string;\n  viewport: string;\n  language: string;\n  userAgent: string;\n  pageUrl: string;\n}\n\n/**\n * Entrada de feedback completa.\n */\nexport interface Feedback {\n  feedbackId: string;\n  appId: string;\n  userId: string;\n  type: FeedbackType;\n  title: string;\n  description: string;\n  attachments: string[];\n  contentRef?: ContentRef;\n  entityRef?: EntityRef;\n  reactionValue?: ReactionValue;\n  deviceContext: DeviceContext;\n  status: FeedbackStatus;\n  createdAt: string;\n  updatedAt: string;\n}\n\n/**\n * Request para crear feedback.\n */\nexport interface CreateFeedbackRequest {\n  type: FeedbackType;\n  title?: string;\n  description?: string;\n  attachments?: string[];\n  contentRef?: ContentRef;\n  entityRef?: EntityRef;\n  reactionValue?: ReactionValue;\n  deviceContext: DeviceContext;\n  appId: string;\n}\n\n/**\n * Response al crear feedback.\n */\nexport interface CreateFeedbackResponse {\n  operationId: string;\n  feedbackId: string;\n  status: FeedbackStatus;\n  createdAt: string;\n}\n\n/**\n * Response al obtener feedback.\n */\nexport interface GetFeedbackResponse {\n  operationId: string;\n  feedback: Feedback;\n}\n\n/**\n * Opciones de tipo de feedback para UI.\n */\nexport interface FeedbackTypeOption {\n  value: FeedbackType;\n  label: string;\n  description?: string;\n  icon?: string;\n}\n\n/**\n * Configuración por defecto de tipos de feedback.\n */\nexport const DEFAULT_FEEDBACK_TYPE_OPTIONS: FeedbackTypeOption[] = [\n  {\n    value: 'issue',\n    label: 'Reportar problema',\n    description: 'Algo no funciona correctamente',\n    icon: 'bug-outline',\n  },\n  {\n    value: 'poor-content',\n    label: 'Contenido incorrecto',\n    description: 'Información incorrecta o desactualizada',\n    icon: 'document-text-outline',\n  },\n  {\n    value: 'feedback',\n    label: 'Comentario general',\n    description: 'Tu opinión o experiencia',\n    icon: 'chatbubble-outline',\n  },\n  {\n    value: 'suggestion',\n    label: 'Sugerencia',\n    description: 'Propuesta de mejora o nueva funcionalidad',\n    icon: 'bulb-outline',\n  },\n];\n\n// =============================================================================\n// Check Feedback Types\n// =============================================================================\n\n/**\n * Response al verificar si existe feedback para una entidad.\n */\nexport interface CheckFeedbackResponse {\n  operationId: string;\n  hasFeedback: boolean;\n  feedbackId?: string;\n  type?: FeedbackType;\n  reactionValue?: ReactionValue;\n  createdAt?: string;\n}\n\n// =============================================================================\n// List Feedback Types (Admin)\n// =============================================================================\n\n/**\n * Request para listar feedback (admin).\n */\nexport interface ListFeedbackRequest {\n  appId?: string;\n  type?: FeedbackType;\n  status?: FeedbackStatus;\n  entityType?: string;\n  entityId?: string;\n  userId?: string;\n  dateFrom?: string;\n  dateTo?: string;\n  limit?: number;\n  nextToken?: string;\n}\n\n/**\n * Response al listar feedback.\n */\nexport interface ListFeedbackResponse {\n  operationId: string;\n  feedbacks: Feedback[];\n  nextToken?: string;\n  count: number;\n}\n\n// =============================================================================\n// Firebase Types\n// =============================================================================\n\n/**\n * Documento de feedback en Firestore.\n * Usado para lectura rápida del estado de feedback del usuario.\n *\n * Path: apps/{appId}/feedback/{entityType}/{entityId}/{userId}\n */\nexport interface FeedbackFirestoreDoc {\n  id?: string;\n  feedbackId: string;\n  type: string;\n  reactionValue: string;\n  createdAt?: Date;\n  updatedAt?: Date;\n}\n","/**\n * Valtech Feedback Service\n *\n * Servicio para gestionar feedback de usuarios a nivel de plataforma.\n *\n * @example\n * ```typescript\n * // main.ts - Configuración\n * import { provideValtechFeedback } from 'valtech-components';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAuth({ apiUrl: environment.apiUrl }),\n *     provideValtechFeedback({\n *       apiUrl: environment.apiUrl,\n *       appId: 'my-app-name',\n *     }),\n *   ],\n * });\n *\n * // component.ts - Uso\n * import { FeedbackService } from 'valtech-components';\n *\n * @Component({...})\n * export class MyComponent {\n *   private feedbackService = inject(FeedbackService);\n *\n *   async submitFeedback() {\n *     const response = await this.feedbackService.createAsync(\n *       'feedback',\n *       'Título',\n *       'Descripción...'\n *     );\n *   }\n * }\n * ```\n */\n\n// Configuration\nexport { VALTECH_FEEDBACK_CONFIG, provideValtechFeedback, DEFAULT_FEEDBACK_CONFIG } from './config';\n\n// Service\nexport { FeedbackService } from './feedback.service';\n\n// Types\nexport {\n  ValtechFeedbackConfig,\n  FeedbackType,\n  FeedbackStatus,\n  ContentType,\n  ContentRef,\n  DeviceContext,\n  Feedback,\n  CreateFeedbackRequest,\n  CreateFeedbackResponse,\n  GetFeedbackResponse,\n  FeedbackTypeOption,\n  DEFAULT_FEEDBACK_TYPE_OPTIONS,\n} from './types';\n","import Compressor from 'compressorjs';\nimport { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { IonButton, IonIcon, IonNote, IonSpinner } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  attachOutline,\n  cameraOutline,\n  checkmarkCircleOutline,\n  closeCircleOutline,\n  closeOutline,\n  documentOutline,\n  imageOutline,\n} from 'ionicons/icons';\nimport { FeedbackService } from '../../../services/feedback';\nimport { I18nService } from '../../../services/i18n';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { AttachmentItem, AttachmentUploaderMetadata } from './types';\n\n@Component({\n  selector: 'val-attachment-uploader',\n  standalone: true,\n  imports: [IonButton, IonIcon, IonNote, IonSpinner, TitleComponent],\n  templateUrl: './attachment-uploader.component.html',\n  styleUrl: './attachment-uploader.component.scss',\n})\nexport class AttachmentUploaderComponent {\n  props = input<AttachmentUploaderMetadata>({});\n\n  attachmentsChange = output<AttachmentItem[]>();\n\n  protected i18n = inject(I18nService);\n  private feedbackService = inject(FeedbackService, { optional: true });\n\n  attachments = signal<AttachmentItem[]>([]);\n\n  maxFiles = computed(() => this.props().maxFiles ?? 5);\n  accept = computed(() => this.props().accept ?? 'image/jpeg,image/png,image/webp,application/pdf');\n  maxReached = computed(() => this.attachments().length >= this.maxFiles());\n  isDisabled = computed(() => this.props().disabled === true || this.maxReached());\n  isUploading = computed(() => this.attachments().some(a => a.status === 'uploading'));\n\n  get readyUrls(): string[] {\n    return this.attachments()\n      .filter(a => a.status === 'ready')\n      .map(a => a.url!);\n  }\n\n  constructor() {\n    addIcons({\n      attachOutline,\n      cameraOutline,\n      checkmarkCircleOutline,\n      closeCircleOutline,\n      closeOutline,\n      documentOutline,\n      imageOutline,\n    });\n  }\n\n  async onFilesSelected(event: Event): Promise<void> {\n    const input = event.target as HTMLInputElement;\n    const files = Array.from(input.files ?? []);\n    input.value = '';\n    const available = this.maxFiles() - this.attachments().length;\n    const toProcess = files.slice(0, available);\n    for (const file of toProcess) {\n      const id = crypto.randomUUID();\n      this.attachments.update(list => [...list, { id, file, status: 'uploading' }]);\n      this.attachmentsChange.emit(this.attachments());\n      this.uploadFile(id, file);\n    }\n  }\n\n  private compressImage(file: File): Promise<File> {\n    return new Promise((resolve, reject) => {\n      new Compressor(file, {\n        quality: 0.8,\n        maxWidth: 1920,\n        maxHeight: 1920,\n        convertSize: 2 * 1024 * 1024, // PNG > 2 MB → JPEG\n        success(result) {\n          resolve(new File([result], file.name, { type: result.type }));\n        },\n        error: reject,\n      });\n    });\n  }\n\n  private async uploadFile(id: string, file: File): Promise<void> {\n    try {\n      const shouldCompress = this.props().compressImages !== false && file.type.startsWith('image/');\n      const fileToUpload = shouldCompress ? await this.compressImage(file) : file;\n      const uploadFn = this.props().uploadFn ?? this.feedbackService?.uploadAttachment.bind(this.feedbackService);\n      if (!uploadFn) throw new Error('No upload function configured');\n      const url = await uploadFn(fileToUpload);\n      this.attachments.update(list => list.map(a => (a.id === id ? { ...a, status: 'ready', url } : a)));\n    } catch {\n      const error = this.i18n.t('attachUploadFailed');\n      this.attachments.update(list => list.map(a => (a.id === id ? { ...a, status: 'error', error } : a)));\n    }\n    this.attachmentsChange.emit(this.attachments());\n  }\n\n  remove(id: string): void {\n    this.attachments.update(list => list.filter(a => a.id !== id));\n    this.attachmentsChange.emit(this.attachments());\n  }\n\n  formatSize(bytes: number): string {\n    if (bytes < 1024) return `${bytes} B`;\n    if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n    return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n  }\n}\n","<div class=\"attachment-uploader\">\n  @if (props().title) {\n  <val-title class=\"attachment-title\" [props]=\"{ content: props().title, size: 'small', color: 'dark', bold: false }\" />\n  }\n\n  <input #filePicker type=\"file\" [accept]=\"accept()\" multiple class=\"hidden-input\" (change)=\"onFilesSelected($event)\" />\n\n  <div class=\"attachment-actions\">\n    <ion-button fill=\"outline\" color=\"dark\" size=\"small\" [disabled]=\"isDisabled()\" (click)=\"filePicker.click()\">\n      <ion-icon slot=\"start\" name=\"attach-outline\"></ion-icon>\n      {{ i18n.t('attachAdd') }}\n    </ion-button>\n    <!-- label trick: native browser gesture forwarding → iOS/PWA no bloquea el picker -->\n    <label class=\"camera-label\" [class.camera-label--disabled]=\"isDisabled()\">\n      <input\n        type=\"file\"\n        accept=\"image/*\"\n        capture=\"environment\"\n        class=\"hidden-input\"\n        [disabled]=\"isDisabled()\"\n        (change)=\"onFilesSelected($event)\"\n      />\n      <ion-icon name=\"camera-outline\"></ion-icon>\n      {{ i18n.t('attachCamera') }}\n    </label>\n  </div>\n\n  @if (maxReached()) {\n  <ion-note color=\"warning\" class=\"max-note\">\n    {{ i18n.t('attachMaxCount', '_global', { count: maxFiles().toString() }) }}\n  </ion-note>\n  } @if (attachments().length > 0) {\n  <div class=\"attachment-list\">\n    @for (item of attachments(); track item.id) {\n    <div class=\"attachment-item\" [class]=\"'status-' + item.status\">\n      <ion-icon\n        class=\"file-icon\"\n        [name]=\"item.file.type.startsWith('image/') ? 'image-outline' : 'document-outline'\"\n      ></ion-icon>\n      <div class=\"file-info\">\n        <span class=\"file-name\">{{ item.file.name }}</span>\n        <span class=\"file-size\">{{ formatSize(item.file.size) }}</span>\n      </div>\n\n      @if (item.status === 'uploading') {\n      <ion-spinner class=\"status-icon\" name=\"circular\"></ion-spinner>\n      } @else if (item.status === 'ready') {\n      <ion-icon class=\"status-icon\" name=\"checkmark-circle-outline\" color=\"success\"></ion-icon>\n      } @else if (item.status === 'error') {\n      <ion-icon class=\"status-icon\" name=\"close-circle-outline\" color=\"danger\"></ion-icon>\n      } @if (item.status !== 'uploading') {\n      <ion-button fill=\"clear\" size=\"small\" color=\"dark\" (click)=\"remove(item.id)\">\n        <ion-icon slot=\"icon-only\" name=\"close-outline\"></ion-icon>\n      </ion-button>\n      } @if (item.status === 'error' && item.error) {\n      <ion-note color=\"danger\" class=\"error-note\">{{ item.error }}</ion-note>\n      }\n    </div>\n    }\n  </div>\n  } @if (props().hint) {\n  <p class=\"attachment-hint\">{{ props().hint }}</p>\n  }\n</div>\n","import { Color } from '@ionic/core';\nimport { TextMetadata } from '../../atoms/text/types';\nimport { TitleMetadata } from '../../atoms/title/types';\nimport { ButtonMetadata } from '../../types';\n\n/**\n * Tipos de contenido soportados en el componente val-article\n */\nexport type ArticleContentType =\n  | 'title'\n  | 'subtitle'\n  | 'text'\n  | 'paragraph'\n  | 'quote'\n  | 'highlight'\n  | 'code'\n  | 'note'\n  | 'command'\n  | 'list'\n  | 'button'\n  | 'separator'\n  | 'image'\n  | 'video'\n  | 'custom';\n\n/**\n * Configuración de espaciado entre elementos\n */\nexport interface ArticleSpacing {\n  /** Espaciado superior */\n  top?: 'none' | 'small' | 'medium' | 'large' | 'xlarge';\n  /** Espaciado inferior */\n  bottom?: 'none' | 'small' | 'medium' | 'large' | 'xlarge';\n  /** Espaciado lateral */\n  horizontal?: 'none' | 'small' | 'medium' | 'large' | 'xlarge';\n}\n\n/**\n * Configuración base para cualquier elemento del artículo\n */\nexport interface BaseArticleElement {\n  /** Tipo de elemento */\n  type: ArticleContentType;\n  /** ID único del elemento (opcional) */\n  id?: string;\n  /** Clases CSS adicionales */\n  cssClass?: string;\n  /** Configuración de espaciado */\n  spacing?: ArticleSpacing;\n  /** Elemento visible condicionalmente */\n  visible?: boolean;\n}\n\n/**\n * Elemento de título\n */\nexport interface ArticleTitleElement extends BaseArticleElement {\n  type: 'title';\n  props: TitleMetadata;\n}\n\n/**\n * Elemento de subtítulo\n */\nexport interface ArticleSubtitleElement extends BaseArticleElement {\n  type: 'subtitle';\n  props: TitleMetadata;\n}\n\n/**\n * Elemento de texto/párrafo\n */\nexport interface ArticleTextElement extends BaseArticleElement {\n  type: 'text' | 'paragraph';\n  props: TextMetadata;\n}\n\n/**\n * Elemento de cita\n */\nexport interface ArticleQuoteElement extends BaseArticleElement {\n  type: 'quote';\n  props: TextMetadata & {\n    /** Autor de la cita */\n    author?: string;\n    /** Fuente de la cita */\n    source?: string;\n    /** Color del nombre del autor */\n    authorColor?: Color;\n    /** Alineación del texto */\n    alignment?: 'left' | 'center' | 'right';\n    /** Mostrar comillas decorativas */\n    showQuoteMark?: boolean;\n  };\n}\n\n/**\n * Elemento de texto destacado\n */\nexport interface ArticleHighlightElement extends BaseArticleElement {\n  type: 'highlight';\n  props: TextMetadata & {\n    /** Color de fondo del highlight */\n    backgroundColor?: Color;\n    /** Esquinas redondeadas */\n    rounded?: boolean;\n  };\n}\n\n/**\n * Elemento de código\n */\nexport interface ArticleCodeElement extends BaseArticleElement {\n  type: 'code';\n  props: {\n    /** Código a mostrar */\n    code: string;\n    /** Lenguaje de programación */\n    language?: string;\n    /** Mostrar números de línea */\n    showLineNumbers?: boolean;\n    /** Tema del código */\n    theme?: 'light' | 'dark';\n  };\n}\n\n/**\n * Elemento de nota destacada\n */\nexport interface ArticleNoteElement extends BaseArticleElement {\n  type: 'note';\n  props: {\n    /** Texto principal de la nota. Puede contener `<strong>`/`<b>` si `allowPartialBold` está activo. */\n    text: string;\n    /** Prefijo en negrita (ej: \"Nota:\"). Pasa `''` (string vacío) para suprimir el prefijo. */\n    prefix?: string;\n    /** Color de fondo */\n    color?: Color;\n    /** Color del texto */\n    textColor?: Color;\n    /** Tamaño del texto */\n    size?: 'small' | 'medium' | 'large' | 'xlarge';\n    /** Esquinas redondeadas */\n    rounded?: boolean;\n    /** Padding personalizado */\n    padding?: string;\n    /** Renderiza `<strong>`/`<b>` inline en `text` via innerHTML. Default `false`. */\n    allowPartialBold?: boolean;\n    /** Procesa URLs y `[text](url)` en `text`. Default `false`. */\n    processLinks?: boolean;\n    /** Compact mode — inline-block fit-content, padding reducido, sin left-border. */\n    compact?: boolean;\n    /** Alineación del texto. Default `'left'`. */\n    align?: 'left' | 'center' | 'right';\n  };\n}\n\n/**\n * Elemento de comando de terminal\n */\nexport interface ArticleCommandElement extends BaseArticleElement {\n  type: 'command';\n  props: {\n    /** Líneas de comando */\n    lines: Array<{\n      /** Texto del comando */\n      text: string;\n      /** Tipo de línea */\n      type?: 'normal' | 'command' | 'success' | 'error';\n    }>;\n    /** Mostrar botón de copiar */\n    showCopyButton?: boolean;\n    /** Lenguaje (opcional) */\n    language?: string;\n  };\n}\n\n/**\n * Elemento de lista\n */\nexport interface ArticleListElement extends BaseArticleElement {\n  type: 'list';\n  props: {\n    /** Elementos de la lista */\n    items: Array<{\n      /** Texto del elemento */\n      text: string;\n      /** Configuración de contenido reactivo */\n      contentKey?: string;\n      contentClass?: string;\n      contentFallback?: string;\n      contentInterpolation?: Record<string, string | number>;\n    }>;\n    /** Tipo de lista */\n    listType?: 'unordered' | 'ordered' | 'checklist';\n    /** Color de los elementos */\n    color?: Color;\n  };\n}\n\n/**\n * Elemento de botón\n */\nexport interface ArticleButtonElement extends BaseArticleElement {\n  type: 'button';\n  props: ButtonMetadata & {\n    /** Alineación del botón */\n    alignment?: 'left' | 'center' | 'right';\n  };\n}\n\n/**\n * Elemento separador\n */\nexport interface ArticleSeparatorElement extends BaseArticleElement {\n  type: 'separator';\n  props: {\n    /** Tipo de separador */\n    style?: 'line' | 'dots' | 'space';\n    /** Color del separador */\n    color?: Color;\n    /** Grosor del separador */\n    thickness?: 'thin' | 'medium' | 'thick';\n  };\n}\n\n/**\n * Elemento de imagen\n */\nexport interface ArticleImageElement extends BaseArticleElement {\n  type: 'image';\n  props: {\n    /** URL de la imagen */\n    src: string;\n    /** Texto alternativo */\n    alt: string;\n    /** Título de la imagen */\n    title?: string;\n    /** Leyenda de la imagen */\n    caption?: string;\n    /** Configuración de contenido reactivo para caption */\n    captionContentKey?: string;\n    captionContentClass?: string;\n    captionContentFallback?: string;\n    /** Alineación de la imagen */\n    alignment?: 'left' | 'center' | 'right';\n    /** Ancho máximo */\n    maxWidth?: string;\n    /** Imagen con bordes redondeados */\n    rounded?: boolean;\n    /** Tamaño de la imagen */\n    size?: 'small' | 'medium' | 'large' | 'xlarge';\n    /** Modo preview (click para ampliar) */\n    preview?: boolean;\n  };\n}\n\n/**\n * Elemento de video\n */\nexport interface ArticleVideoElement extends BaseArticleElement {\n  type: 'video';\n  props: {\n    /** URL del video */\n    src: string;\n    /** Imagen de poster */\n    poster?: string;\n    /** Título del video */\n    title?: string;\n    /** Controles visibles */\n    controls?: boolean;\n    /** Reproducción automática */\n    autoplay?: boolean;\n    /** Silenciado por defecto */\n    muted?: boolean;\n    /** Ancho máximo */\n    maxWidth?: string;\n  };\n}\n\n/**\n * Elemento personalizado\n */\nexport interface ArticleCustomElement extends BaseArticleElement {\n  type: 'custom';\n  props: {\n    /** Contenido HTML personalizado */\n    htmlContent?: string;\n    /** Clase de componente personalizado */\n    componentClass?: any;\n    /** Props para el componente personalizado */\n    componentProps?: any;\n  };\n}\n\n/**\n * Unión de todos los tipos de elementos posibles\n */\nexport type ArticleElement =\n  | ArticleTitleElement\n  | ArticleSubtitleElement\n  | ArticleTextElement\n  | ArticleQuoteElement\n  | ArticleHighlightElement\n  | ArticleCodeElement\n  | ArticleNoteElement\n  | ArticleCommandElement\n  | ArticleListElement\n  | ArticleButtonElement\n  | ArticleSeparatorElement\n  | ArticleImageElement\n  | ArticleVideoElement\n  | ArticleCustomElement;\n\n/**\n * Configuración del artículo completo\n */\nexport interface ArticleMetadata {\n  /** Elementos del artículo */\n  elements: ArticleElement[];\n  /** Padding interno del contenedor article */\n  containerSpacing?: ArticleSpacing;\n  /** Override global de spacing para elementos (prioridad sobre spacing por tipo) */\n  elementSpacing?: ArticleSpacing;\n  /** @deprecated Usar elementSpacing en su lugar */\n  defaultSpacing?: ArticleSpacing;\n  /** Ancho máximo del artículo */\n  maxWidth?: string;\n  /** Centrar el artículo */\n  centered?: boolean;\n  /** Tema del artículo */\n  theme?: 'light' | 'dark' | 'auto';\n  /** Clases CSS adicionales */\n  cssClass?: string;\n}\n\n/**\n * Configuración de espaciado predefinida\n */\nexport const ARTICLE_SPACING = {\n  NONE: { top: 'none', bottom: 'none' } as ArticleSpacing,\n  SMALL: { top: 'small', bottom: 'small' } as ArticleSpacing,\n  MEDIUM: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  LARGE: { top: 'large', bottom: 'large' } as ArticleSpacing,\n  XLARGE: { top: 'xlarge', bottom: 'xlarge' } as ArticleSpacing,\n\n  // Espaciados específicos para elementos\n  TITLE: { top: 'large', bottom: 'medium' } as ArticleSpacing,\n  SUBTITLE: { top: 'medium', bottom: 'small' } as ArticleSpacing,\n  PARAGRAPH: { top: 'small', bottom: 'medium' } as ArticleSpacing,\n  QUOTE: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  CODE: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  NOTE: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  COMMAND: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  LIST: { top: 'small', bottom: 'medium' } as ArticleSpacing,\n  BUTTON: { top: 'medium', bottom: 'medium' } as ArticleSpacing,\n  IMAGE: { top: 'large', bottom: 'large' } as ArticleSpacing,\n  SEPARATOR: { top: 'large', bottom: 'large' } as ArticleSpacing,\n} as const;\n\n/**\n * Función helper para crear elementos de artículo de forma fácil\n */\nexport class ArticleBuilder {\n  private elements: ArticleElement[] = [];\n\n  /**\n   * Añade un título al artículo\n   */\n  title(props: TitleMetadata, options?: Partial<BaseArticleElement>): ArticleBuilder {\n    this.elements.push({\n      type: 'title',\n      props,\n      ...options,\n    } as ArticleTitleElement);\n    return this;\n  }\n\n  /**\n   * Añade un subtítulo al artículo\n   */\n  subtitle(props: TitleMetadata, options?: Partial<BaseArticleElement>): ArticleBuilder {\n    this.elements.push({\n      type: 'subtitle',\n      props,\n      ...options,\n    } as ArticleSubtitleElement);\n    return this;\n  }\n\n  /**\n   * Añade un párrafo al artículo\n   */\n  paragraph(props: TextMetadata, options?: Partial<BaseArticleElement>): ArticleBuilder {\n    this.elements.push({\n      type: 'paragraph',\n      props,\n      ...options,\n    } as ArticleTextElement);\n    return this;\n  }\n\n  /**\n   * Añade una cita al artículo\n   */\n  quote(\n    props: ArticleQuoteElement['props'],\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'quote',\n      props,\n      ...options,\n    } as ArticleQuoteElement);\n    return this;\n  }\n\n  /**\n   * Añade código al artículo\n   */\n  code(code: string, language?: string, options?: Partial<BaseArticleElement>): ArticleBuilder {\n    this.elements.push({\n      type: 'code',\n      props: { code, language },\n      ...options,\n    } as ArticleCodeElement);\n    return this;\n  }\n\n  /**\n   * Añade una lista al artículo\n   */\n  list(\n    items: ArticleListElement['props']['items'],\n    listType?: ArticleListElement['props']['listType'],\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'list',\n      props: { items, listType },\n      ...options,\n    } as ArticleListElement);\n    return this;\n  }\n\n  /**\n   * Añade un botón al artículo\n   */\n  button(\n    props: ButtonMetadata,\n    alignment?: 'left' | 'center' | 'right',\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'button',\n      props: { ...props, alignment },\n      ...options,\n    } as ArticleButtonElement);\n    return this;\n  }\n\n  /**\n   * Añade un separador al artículo\n   */\n  separator(\n    style?: 'line' | 'dots' | 'space',\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'separator',\n      props: { style },\n      ...options,\n    } as ArticleSeparatorElement);\n    return this;\n  }\n\n  /**\n   * Añade una imagen al artículo\n   */\n  image(\n    src: string,\n    alt: string,\n    caption?: string,\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'image',\n      props: { src, alt, caption },\n      ...options,\n    } as ArticleImageElement);\n    return this;\n  }\n\n  /**\n   * Añade una nota destacada al artículo\n   */\n  note(\n    text: string,\n    prefix?: string,\n    color?: Color,\n    options?: Partial<BaseArticleElement>\n  ): ArticleBuilder {\n    this.elements.push({\n      type: 'note',\n      props: {\n        text,\n        prefix: prefix || 'Nota:',\n        color: color || 'warning',\n        textColor: 'dark',\n        size: 'medium',\n        rounded: true,\n      },\n      ...options,\n    } as ArticleNoteElement);\n    return this;\n  }\n\n  /**\n   * Añade un comando de terminal al artículo\n   * Acepta un string simple o un array de comandos\n   */\n  command(command: string | string[], options?: Partial<BaseArticleElement>): ArticleBuilder {\n    const commands = Array.isArray(command) ? command : [command];\n    this.elements.push({\n      type: 'command',\n      props: {\n        lines: commands.map(cmd => ({ text: cmd, type: 'command' as const })),\n        showCopyButton: true,\n      },\n      ...options,\n    } as ArticleCommandElement);\n    return this;\n  }\n\n  /**\n   * Construye el artículo final\n   */\n  build(config?: Partial<ArticleMetadata>): ArticleMetadata {\n    return {\n      elements: this.elements,\n      maxWidth: 'auto',\n      centered: true,\n      theme: 'auto',\n      ...config,\n    };\n  }\n\n  /**\n   * Resetea el builder para crear un nuevo artículo\n   */\n  clear(): ArticleBuilder {\n    this.elements = [];\n    return this;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { ImageMetadata } from '../../atoms/image/types';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { CodeDisplayComponent } from '../../molecules/code-display/code-display.component';\nimport { CodeDisplayMetadata } from '../../molecules/code-display/types';\nimport { NotesBoxComponent } from '../../molecules/notes-box/notes-box.component';\nimport { NotesBoxMetadata } from '../../molecules/notes-box/types';\nimport { PlainCodeBoxComponent } from '../../molecules/plain-code-box/plain-code-box.component';\nimport { PlainCodeBoxMetadata } from '../../molecules/plain-code-box/types';\nimport {\n  ARTICLE_SPACING,\n  ArticleButtonElement,\n  ArticleCodeElement,\n  ArticleCommandElement,\n  ArticleContentType,\n  ArticleCustomElement,\n  ArticleElement,\n  ArticleHighlightElement,\n  ArticleImageElement,\n  ArticleListElement,\n  ArticleMetadata,\n  ArticleNoteElement,\n  ArticleQuoteElement,\n  ArticleSeparatorElement,\n  ArticleSpacing,\n  ArticleSubtitleElement,\n  ArticleTextElement,\n  ArticleTitleElement,\n  ArticleVideoElement,\n} from './types';\n\n@Component({\n  selector: 'val-article',\n  standalone: true,\n  imports: [\n    CommonModule,\n    DisplayComponent,\n    TitleComponent,\n    TextComponent,\n    ButtonComponent,\n    ImageComponent,\n    CodeDisplayComponent,\n    NotesBoxComponent,\n    PlainCodeBoxComponent,\n  ],\n  template: `\n    <article\n      class=\"val-article\"\n      [class]=\"props.cssClass\"\n      [ngClass]=\"{\n        'val-article--centered': props.centered,\n        'val-article--light': props.theme === 'light',\n        'val-article--dark': props.theme === 'dark',\n      }\"\n      [style.max-width]=\"props.maxWidth\"\n      [ngStyle]=\"getContainerStyles()\"\n    >\n      <div\n        *ngFor=\"let element of props.elements; trackBy: trackByFn\"\n        class=\"val-article__element\"\n        [class]=\"element.cssClass\"\n        [ngClass]=\"getElementSpacingClass(element)\"\n        [style.display]=\"element.visible === false ? 'none' : 'block'\"\n      >\n        <!-- Título -->\n        <ng-container *ngIf=\"element.type === 'title'\">\n          <val-display [props]=\"getTitleElement(element).props\"></val-display>\n        </ng-container>\n\n        <!-- Subtítulo -->\n        <ng-container *ngIf=\"element.type === 'subtitle'\">\n          <val-title [props]=\"getSubtitleElement(element).props\"></val-title>\n        </ng-container>\n\n        <!-- Texto/Párrafo -->\n        <ng-container *ngIf=\"element.type === 'text' || element.type === 'paragraph'\">\n          <val-text [props]=\"getTextElement(element).props\"></val-text>\n        </ng-container>\n\n        <!-- Cita -->\n        <ng-container *ngIf=\"element.type === 'quote'\">\n          <div class=\"val-article__quote\">\n            <div class=\"val-article__quote-content\">\n              <val-text [props]=\"getQuoteTextProps(element)\"></val-text>\n            </div>\n            <div *ngIf=\"getQuoteElement(element).props.author\" class=\"val-article__quote-author\">\n              — {{ getQuoteElement(element).props.author }}\n              <span *ngIf=\"getQuoteElement(element).props.source\" class=\"val-article__quote-source\">\n                , {{ getQuoteElement(element).props.source }}\n              </span>\n            </div>\n          </div>\n        </ng-container>\n\n        <!-- Texto destacado -->\n        <ng-container *ngIf=\"element.type === 'highlight'\">\n          <div\n            class=\"val-article__highlight\"\n            [ngClass]=\"{\n              'val-article__highlight--rounded': getHighlightElement(element).props.rounded,\n            }\"\n            [style.background-color]=\"getHighlightColor(element)\"\n          >\n            <val-text [props]=\"getHighlightTextProps(element)\"></val-text>\n          </div>\n        </ng-container>\n\n        <!-- Código -->\n        <ng-container *ngIf=\"element.type === 'code'\">\n          <val-code-display [props]=\"getCodeDisplayProps(element)\"></val-code-display>\n        </ng-container>\n\n        <!-- Nota destacada -->\n        <ng-container *ngIf=\"element.type === 'note'\">\n          <val-notes-box [props]=\"getNoteBoxProps(element)\"></val-notes-box>\n        </ng-container>\n\n        <!-- Comando de terminal -->\n        <ng-container *ngIf=\"element.type === 'command'\">\n          <val-plain-code-box [props]=\"getCommandProps(element)\"></val-plain-code-box>\n        </ng-container>\n\n        <!-- Lista -->\n        <ng-container *ngIf=\"element.type === 'list'\">\n          <ul *ngIf=\"getListElement(element).props.listType !== 'ordered'\" class=\"val-article__list\">\n            <li *ngFor=\"let item of getListElement(element).props.items\" class=\"val-article__list-item\">\n              <span *ngIf=\"getListElement(element).props.listType === 'checklist'\" class=\"val-article__list-check\"\n                >✓</span\n              >\n              <span [innerHTML]=\"item.text\"></span>\n            </li>\n          </ul>\n          <ol\n            *ngIf=\"getListElement(element).props.listType === 'ordered'\"\n            class=\"val-article__list val-article__list--ordered\"\n          >\n            <li *ngFor=\"let item of getListElement(element).props.items\" class=\"val-article__list-item\">\n              <span [innerHTML]=\"item.text\"></span>\n            </li>\n          </ol>\n        </ng-container>\n\n        <!-- Botón -->\n        <ng-container *ngIf=\"element.type === 'button'\">\n          <div\n            class=\"val-article__button-container\"\n            [ngClass]=\"{\n              'val-article__button-container--left': getButtonElement(element).props.alignment === 'left',\n              'val-article__button-container--center': getButtonElement(element).props.alignment === 'center',\n              'val-article__button-container--right': getButtonElement(element).props.alignment === 'right',\n            }\"\n          >\n            <val-button [props]=\"getButtonProps(element)\"></val-button>\n          </div>\n        </ng-container>\n\n        <!-- Separador -->\n        <ng-container *ngIf=\"element.type === 'separator'\">\n          <div class=\"val-article__separator\">\n            <hr\n              *ngIf=\"getSeparatorElement(element).props.style === 'line'\"\n              class=\"val-article__separator-line\"\n              [ngClass]=\"{\n                'val-article__separator-line--thin': getSeparatorElement(element).props.thickness === 'thin',\n                'val-article__separator-line--thick': getSeparatorElement(element).props.thickness === 'thick',\n              }\"\n            />\n            <div *ngIf=\"getSeparatorElement(element).props.style === 'dots'\" class=\"val-article__separator-dots\">\n              • • •\n            </div>\n            <div\n              *ngIf=\"getSeparatorElement(element).props.style === 'space'\"\n              class=\"val-article__separator-space\"\n            ></div>\n          </div>\n        </ng-container>\n\n        <!-- Imagen -->\n        <ng-container *ngIf=\"element.type === 'image'\">\n          <val-image [props]=\"getImageMetadata(element)\"></val-image>\n        </ng-container>\n\n        <!-- Video -->\n        <ng-container *ngIf=\"element.type === 'video'\">\n          <div class=\"val-article__video\">\n            <video\n              [src]=\"getVideoElement(element).props.src\"\n              [poster]=\"getVideoElement(element).props.poster\"\n              [controls]=\"getVideoElement(element).props.controls !== false\"\n              [autoplay]=\"getVideoElement(element).props.autoplay\"\n              [muted]=\"getVideoElement(element).props.muted\"\n              [style.max-width]=\"getVideoElement(element).props.maxWidth\"\n              class=\"val-article__video-content\"\n            >\n              Tu navegador no soporta el elemento video.\n            </video>\n            <div *ngIf=\"getVideoElement(element).props.title\" class=\"val-article__video-title\">\n              {{ getVideoElement(element).props.title }}\n            </div>\n          </div>\n        </ng-container>\n\n        <!-- Contenido personalizado -->\n        <ng-container *ngIf=\"element.type === 'custom'\">\n          <div class=\"val-article__custom\" [innerHTML]=\"getCustomElement(element).props.htmlContent\"></div>\n        </ng-container>\n      </div>\n    </article>\n  `,\n  styleUrls: ['./article.component.scss'],\n  // changeDetection: ChangeDetectionStrategy.OnPush, // Comentado temporalmente para debug\n})\n/**\n * val-article\n *\n * Componente para crear artículos, blogs y documentación de forma declarativa.\n * Permite combinar múltiples elementos (títulos, texto, imágenes, código, etc.)\n * con espaciado automático y soporte multi-idioma.\n *\n * @example Uso básico:\n * ```html\n * <val-article [props]=\"articleConfig\"></val-article>\n * ```\n *\n * @example Con ArticleBuilder:\n * ```typescript\n * articleConfig = new ArticleBuilder()\n *   .title(titleProps)\n *   .paragraph(textProps)\n *   .code('console.log(\"Hello World\")', 'javascript')\n *   .build();\n * ```\n *\n * @input props: ArticleMetadata - Configuración completa del artículo\n */\nexport class ArticleComponent implements OnInit {\n  /**\n   * Configuración del artículo\n   * @type {ArticleMetadata}\n   */\n  @Input()\n  props!: ArticleMetadata;\n\n  constructor() {}\n\n  ngOnInit() {\n    // Validación básica\n    if (!this.props || !this.props.elements) {\n      console.warn('val-article: props.elements is required');\n    }\n  }\n\n  /**\n   * Obtiene los estilos de padding para el contenedor article\n   */\n  getContainerStyles(): { [key: string]: string } {\n    const spacing = this.props.containerSpacing;\n    if (!spacing) return {};\n\n    const styles: { [key: string]: string } = {};\n    const spacingValues: Record<string, string> = {\n      none: '0',\n      small: '0.5rem',\n      medium: '1rem',\n      large: '1.5rem',\n      xlarge: '2.5rem',\n    };\n\n    if (spacing.top) styles['padding-top'] = spacingValues[spacing.top];\n    if (spacing.bottom) styles['padding-bottom'] = spacingValues[spacing.bottom];\n    if (spacing.horizontal) {\n      styles['padding-left'] = spacingValues[spacing.horizontal];\n      styles['padding-right'] = spacingValues[spacing.horizontal];\n    }\n\n    return styles;\n  }\n\n  /**\n   * Función de trackBy para optimizar el rendering de elementos\n   */\n  trackByFn(index: number, element: ArticleElement): any {\n    return element.id || index;\n  }\n\n  /**\n   * Obtiene el espaciado por defecto según el tipo de elemento\n   */\n  private getDefaultSpacingForType(type: ArticleContentType): ArticleSpacing {\n    const spacingMap: Record<ArticleContentType, ArticleSpacing> = {\n      title: ARTICLE_SPACING.TITLE,\n      subtitle: ARTICLE_SPACING.SUBTITLE,\n      text: ARTICLE_SPACING.PARAGRAPH,\n      paragraph: ARTICLE_SPACING.PARAGRAPH,\n      quote: ARTICLE_SPACING.QUOTE,\n      highlight: ARTICLE_SPACING.MEDIUM,\n      code: ARTICLE_SPACING.CODE,\n      note: ARTICLE_SPACING.NOTE,\n      command: ARTICLE_SPACING.COMMAND,\n      list: ARTICLE_SPACING.LIST,\n      button: ARTICLE_SPACING.BUTTON,\n      separator: ARTICLE_SPACING.SEPARATOR,\n      image: ARTICLE_SPACING.IMAGE,\n      video: ARTICLE_SPACING.IMAGE,\n      custom: ARTICLE_SPACING.MEDIUM,\n    };\n    return spacingMap[type] || ARTICLE_SPACING.MEDIUM;\n  }\n\n  /**\n   * Obtiene las clases CSS para el espaciado del elemento.\n   * Prioridad: element.spacing > elementSpacing > espaciado nativo por tipo\n   */\n  getElementSpacingClass(element: ArticleElement): string {\n    const defaultForType = this.getDefaultSpacingForType(element.type);\n    const globalOverride = this.props.elementSpacing || this.props.defaultSpacing; // backward compat\n\n    const spacing: ArticleSpacing = {\n      top: element.spacing?.top ?? globalOverride?.top ?? defaultForType.top,\n      bottom: element.spacing?.bottom ?? globalOverride?.bottom ?? defaultForType.bottom,\n      horizontal: element.spacing?.horizontal ?? globalOverride?.horizontal ?? defaultForType.horizontal,\n    };\n\n    const classes: string[] = [];\n    if (spacing.top) classes.push(`val-article__spacing-top--${spacing.top}`);\n    if (spacing.bottom) classes.push(`val-article__spacing-bottom--${spacing.bottom}`);\n    if (spacing.horizontal) classes.push(`val-article__spacing-horizontal--${spacing.horizontal}`);\n\n    return classes.join(' ');\n  }\n\n  // === FUNCIONES DE TIPO PARA TYPESCRIPT ===\n\n  getTitleElement(element: ArticleElement): ArticleTitleElement {\n    return element as ArticleTitleElement;\n  }\n\n  getSubtitleElement(element: ArticleElement): ArticleSubtitleElement {\n    return element as ArticleSubtitleElement;\n  }\n\n  getTextElement(element: ArticleElement): ArticleTextElement {\n    return element as ArticleTextElement;\n  }\n\n  getQuoteElement(element: ArticleElement): ArticleQuoteElement {\n    return element as ArticleQuoteElement;\n  }\n\n  getHighlightElement(element: ArticleElement): ArticleHighlightElement {\n    return element as ArticleHighlightElement;\n  }\n\n  getCodeElement(element: ArticleElement): ArticleCodeElement {\n    return element as ArticleCodeElement;\n  }\n\n  getListElement(element: ArticleElement): ArticleListElement {\n    return element as ArticleListElement;\n  }\n\n  getButtonElement(element: ArticleElement): ArticleButtonElement {\n    return element as ArticleButtonElement;\n  }\n\n  getSeparatorElement(element: ArticleElement): ArticleSeparatorElement {\n    return element as ArticleSeparatorElement;\n  }\n\n  getImageElement(element: ArticleElement): ArticleImageElement {\n    return element as ArticleImageElement;\n  }\n\n  getVideoElement(element: ArticleElement): ArticleVideoElement {\n    return element as ArticleVideoElement;\n  }\n\n  getCustomElement(element: ArticleElement): ArticleCustomElement {\n    return element as ArticleCustomElement;\n  }\n\n  // === FUNCIONES AUXILIARES PARA PROPS ===\n\n  getQuoteTextProps(element: ArticleElement) {\n    const quoteElement = this.getQuoteElement(element);\n    const { author, source, ...textProps } = quoteElement.props;\n    return textProps;\n  }\n\n  getHighlightTextProps(element: ArticleElement) {\n    const highlightElement = this.getHighlightElement(element);\n    const { backgroundColor, rounded, ...textProps } = highlightElement.props;\n    return textProps;\n  }\n\n  getHighlightColor(element: ArticleElement): string {\n    const highlightElement = this.getHighlightElement(element);\n    return highlightElement.props.backgroundColor || 'var(--ion-color-light)';\n  }\n\n  getButtonProps(element: ArticleElement) {\n    const buttonElement = this.getButtonElement(element);\n    const { alignment, ...buttonProps } = buttonElement.props;\n    return buttonProps;\n  }\n\n  getCodeDisplayProps(element: ArticleElement): CodeDisplayMetadata {\n    const codeElement = this.getCodeElement(element);\n    return {\n      code: codeElement.props.code,\n      language: codeElement.props.language || 'typescript',\n      tabs: [],\n    };\n  }\n\n  getNoteElement(element: ArticleElement): ArticleNoteElement {\n    return element as ArticleNoteElement;\n  }\n\n  getCommandElement(element: ArticleElement): ArticleCommandElement {\n    return element as ArticleCommandElement;\n  }\n\n  getNoteBoxProps(element: ArticleElement): NotesBoxMetadata {\n    const noteElement = this.getNoteElement(element);\n    return {\n      text: noteElement.props.text,\n      // `??` (not `||`) so explicit empty string suppresses the prefix.\n      prefix: noteElement.props.prefix ?? 'Nota:',\n      color: noteElement.props.color || 'warning',\n      textColor: noteElement.props.textColor || 'dark',\n      size: noteElement.props.size || 'medium',\n      rounded: noteElement.props.rounded ?? true,\n      padding: noteElement.props.padding,\n      allowPartialBold: noteElement.props.allowPartialBold,\n      processLinks: noteElement.props.processLinks,\n      compact: noteElement.props.compact,\n      align: noteElement.props.align,\n    };\n  }\n\n  getCommandProps(element: ArticleElement): PlainCodeBoxMetadata {\n    const commandElement = this.getCommandElement(element);\n    return {\n      lines: commandElement.props.lines,\n      showCopyButton: commandElement.props.showCopyButton ?? true,\n      language: commandElement.props.language,\n    };\n  }\n\n  getImageMetadata(element: ArticleElement): ImageMetadata {\n    const imageElement = this.getImageElement(element);\n    const props = imageElement.props;\n\n    return {\n      src: props.src,\n      alt: props.alt,\n      mode: props.rounded ? 'rounded' : 'box',\n      size: props.size || 'medium',\n      shaded: false,\n      bordered: false,\n      alignment: props.alignment || 'center',\n      caption: props.caption,\n      captionSize: 'medium' as const,\n      width: props.maxWidth ? parseInt(props.maxWidth.replace('px', '')) : undefined,\n      previewMode: props.preview || false,\n    };\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { BoxComponent } from '../../atoms/box/box.component';\nimport { ButtonGroupComponent } from '../../molecules/button-group/button-group.component';\nimport { TitleBlockComponent } from '../../molecules/title-block/title-block.component';\nimport { BannerMetadata } from './types';\n\n@Component({\n  selector: 'val-banner',\n  standalone: true,\n  imports: [CommonModule, BoxComponent, TitleBlockComponent, ButtonGroupComponent],\n  template: `\n    <val-box\n      [props]=\"{\n        icon: props.closable ? 'close-outline' : '',\n        bordered: props.bordered,\n        color: props.color,\n        padding: props.padding,\n      }\"\n      (onClick)=\"closeHandler()\"\n    >\n      <div [ngClass]=\"['content-container', props.mode, props.alignment]\" body>\n        <val-title-block\n          [props]=\"{\n            position: props.content.position,\n            aboveTitle: props.content.aboveTitle,\n            title: props.content.title,\n            bellowTitle: props.content.bellowTitle,\n          }\"\n        ></val-title-block>\n        @if (props.actions) {\n          <val-button-group\n            [ngClass]=\"['buttons-container', props.mode, props.alignment]\"\n            [props]=\"props.actions\"\n            (onClick)=\"clickHandler($event)\"\n          ></val-button-group>\n        }\n      </div>\n    </val-box>\n  `,\n  styleUrls: ['./banner.component.scss'],\n})\n/**\n * val-banner\n *\n * Displays a banner with title block, actions, and optional close button.\n *\n * @example\n * <val-banner [props]=\"{ content: {...}, actions: {...}, closable: true, bordered: true, mode: 'center', alignment: 'center', padding: '8px' }\" (onClick)=\"handler($event)\" (onClose)=\"closeHandler()\"></val-banner>\n *\n * @input props: BannerMetadata - Configuration for the banner (content, actions, closable, bordered, mode, alignment, padding)\n * @output onClick - Emits when an action is clicked\n * @output onClose - Emits when the banner is closed\n */\nexport class BannerComponent implements OnInit {\n  @Input()\n  props: BannerMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  @Output()\n  onClose = new EventEmitter();\n\n  ngOnInit() {}\n\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n\n  closeHandler() {\n    this.onClose.emit();\n  }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nconst MIN_LENGTH = 8;\n// bcrypt silently truncates input at 72 bytes — cap here so FE/BE stay aligned.\nconst MAX_LENGTH = 72;\n// Special chars: ASCII 33-47, 58-64, 91-96, 123-126\nconst SPECIAL_CHAR_RE = /[\\x21-\\x2F\\x3A-\\x40\\x5B-\\x60\\x7B-\\x7E]/;\n\n/**\n * Mirrors the backend `authPassword` validator (services/authv2/password.go):\n * min 8 chars, max 72 chars (bcrypt limit), ≥1 uppercase, ≥1 lowercase,\n * ≥1 digit, ≥1 special char.\n *\n * Returns `{ authPassword: true }` on failure so the form can surface the\n * inline error via `errorKeys: { authPassword: 'passwordStrength' }`.\n */\nexport function authPasswordValidator(): ValidatorFn {\n  return (control: AbstractControl): ValidationErrors | null => {\n    const value: string = control.value ?? '';\n    if (!value) return null; // `required` handles empty\n\n    const valid =\n      value.length >= MIN_LENGTH &&\n      value.length <= MAX_LENGTH &&\n      /[A-Z]/.test(value) &&\n      /[a-z]/.test(value) &&\n      /[0-9]/.test(value) &&\n      SPECIAL_CHAR_RE.test(value);\n\n    return valid ? null : { authPassword: true };\n  };\n}\n","import { ElementRef } from '@angular/core';\n\n/**\n * Scrolls smoothly to the top of the element with the given id.\n * @param id The id of the element to scroll to\n */\nexport const goToTop = (id: string): void => {\n  const element = document.getElementById(id);\n  if (element) {\n    element.scrollIntoView({\n      block: 'start',\n      inline: 'nearest',\n      behavior: 'smooth',\n    });\n  }\n};\n\n/**\n * Checks if the bottom of the given ElementRef is within the viewport.\n * Useful for determining if a form or element is fully visible.\n * @param elementRef The Angular ElementRef to check\n * @returns True if the element's bottom is at or above the window's bottom\n */\nexport const isAtEnd = (elementRef: ElementRef): boolean => {\n  const formElement = elementRef.nativeElement;\n  const rect = formElement.getBoundingClientRect();\n  const windowHeight = window.innerHeight;\n  return rect.bottom <= windowHeight;\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  DoCheck,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n  signal,\n} from '@angular/core';\nimport { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { isAtEnd } from '../../../shared/utils/dom';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { DividerComponent } from '../../atoms/divider/divider.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ButtonGroupComponent } from '../../molecules/button-group/button-group.component';\nimport { CheckInputComponent } from '../../molecules/check-input/check-input.component';\nimport { CommentInputComponent } from '../../molecules/comment-input/comment-input.component';\nimport { DateInputComponent } from '../../molecules/date-input/date-input.component';\nimport { EmailInputComponent } from '../../molecules/email-input/email-input.component';\nimport { FileInputComponent } from '../../molecules/file-input/file-input.component';\nimport { HintComponent } from '../../molecules/hint/hint.component';\nimport { HourInputComponent } from '../../molecules/hour-input/hour-input.component';\nimport { NumberInputComponent } from '../../molecules/number-input/number-input.component';\nimport { NumberFromToComponent } from '../../molecules/number-from-to/number-from-to.component';\nimport { PasswordInputComponent } from '../../molecules/password-input/password-input.component';\nimport { PinInputComponent } from '../../molecules/pin-input/pin-input.component';\nimport { RadioInputComponent } from '../../molecules/radio-input/radio-input.component';\nimport { SearchSelectorComponent } from '../../molecules/select-input/select-input.component';\nimport { SelectSearchComponent } from '../../molecules/select-search/select-search.component';\nimport { MultiSelectSearchComponent } from '../../molecules/multi-select-search/multi-select-search.component';\nimport { TextInputComponent } from '../../molecules/text-input/text-input.component';\nimport { TextareaInputComponent } from '../../molecules/textarea-input/textarea-input.component';\nimport { TextareaInputMetadata } from '../../molecules/textarea-input/types';\nimport { PhoneInputComponent } from '../../molecules/phone-input/phone-input.component';\nimport { ToggleInputComponent } from '../../molecules/toggle-input/toggle-input.component';\nimport { CheckboxRadioInputComponent } from '../../molecules/checkbox-radio-input/checkbox-radio-input.component';\nimport { UsernameInputComponent } from '../../molecules/username-input/username-input.component';\nimport { UsernameInputMetadata } from '../../molecules/username-input/types';\nimport { AttachmentUploaderComponent } from '../attachment-uploader/attachment-uploader.component';\nimport { AttachmentItem } from '../attachment-uploader/types';\nimport { ButtonMetadata, ComponentStates, FormMetadata, FormSubmit, InputMetadata, InputType } from '../../types';\n\n@Component({\n  selector: 'val-form',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    DisplayComponent,\n    TitleComponent,\n    TextInputComponent,\n    TextareaInputComponent,\n    CheckInputComponent,\n    ButtonGroupComponent,\n    DividerComponent,\n    HintComponent,\n    CommentInputComponent,\n    DateInputComponent,\n    FileInputComponent,\n    HourInputComponent,\n    EmailInputComponent,\n    NumberInputComponent,\n    NumberFromToComponent,\n    RadioInputComponent,\n    PasswordInputComponent,\n    PinInputComponent,\n    SelectSearchComponent,\n    MultiSelectSearchComponent,\n    SearchSelectorComponent,\n    PhoneInputComponent,\n    ToggleInputComponent,\n    CheckboxRadioInputComponent,\n    UsernameInputComponent,\n    AttachmentUploaderComponent,\n  ],\n  template: `\n    <div class=\"container\" [style.--val-form-field-gap]=\"props.fieldSpacing != null ? props.fieldSpacing + 'px' : null\">\n      <form [formGroup]=\"form\">\n        @if (props.name) {\n          <val-display\n            [props]=\"{\n              content: props.name,\n              color: 'dark',\n              size: 'small',\n            }\"\n          ></val-display>\n        }\n        @for (s of props.sections; track s.name) {\n          <div class=\"section\">\n            <val-title [props]=\"{ content: s.name, size: 'large', color: '', bold: false }\"></val-title>\n            @for (f of s.fields; track f.name) {\n              <div class=\"input\" [attr.data-testid]=\"f.token\">\n                @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {\n                  <val-title [props]=\"{ content: f.label, size: 'small', color: 'dark', bold: false }\"></val-title>\n                }\n                @if (f.description) {\n                  <span class=\"field-description\">{{ f.description }}</span>\n                }\n                @switch (f.type) {\n                  @case (types.TEXT) {\n                    <val-text-input [props]=\"getFieldProp(f)\"></val-text-input>\n                  }\n                  @case (types.TEXTAREA) {\n                    <val-textarea-input [props]=\"getTextareaProp(f)\"></val-textarea-input>\n                  }\n                  @case (types.CHECK) {\n                    <val-check-input></val-check-input>\n                  }\n                  @case (types.COMMENT) {\n                    <val-comment-input [props]=\"getFieldProp(f)\"></val-comment-input>\n                  }\n                  @case (types.DATE) {\n                    <val-date-input [props]=\"getFieldProp(f)\"></val-date-input>\n                  }\n                  @case (types.EMAIL) {\n                    <val-email-input [props]=\"getFieldProp(f)\"></val-email-input>\n                  }\n                  @case (types.FILE) {\n                    <val-file-input [props]=\"getFieldProp(f)\"></val-file-input>\n                  }\n                  @case (types.HOUR) {\n                    <val-hour-input [props]=\"getFieldProp(f)\"></val-hour-input>\n                  }\n                  @case (types.NUMBER) {\n                    <val-number-input [props]=\"getFieldProp(f)\"></val-number-input>\n                  }\n                  @case (types.NUMBER_FROM_TO) {\n                    <val-number-from-to [props]=\"getFieldProp(f)\"></val-number-from-to>\n                  }\n                  @case (types.PASSWORD) {\n                    <val-password-input [props]=\"getFieldProp(f)\"></val-password-input>\n                  }\n                  @case (types.PIN_CODE) {\n                    <val-pin-input [props]=\"getFieldProp(f)\"></val-pin-input>\n                  }\n                  @case (types.RADIO) {\n                    <val-radio-input [props]=\"getFieldProp(f)\"></val-radio-input>\n                  }\n                  @case (types.SELECT) {\n                    <val-select-input [props]=\"getSelectProp(f)\"></val-select-input>\n                  }\n                  @case (types.SEARCH_SELECT) {\n                    <val-select-search [props]=\"getFieldProp(f)\"></val-select-search>\n                  }\n                  @case (types.MULTI_SELECT) {\n                    <val-multi-select-search [props]=\"getFieldProp(f)\"></val-multi-select-search>\n                  }\n                  @case (types.PHONE) {\n                    <val-phone-input [props]=\"getFieldProp(f)\"></val-phone-input>\n                  }\n                  @case (types.HANDLE) {\n                    <val-username-input [props]=\"getUsernameProp(f)\"></val-username-input>\n                  }\n                  @case (types.TOGGLE) {\n                    <val-toggle-input [props]=\"getFieldProp(f)\"></val-toggle-input>\n                  }\n                  @case (types.CHECKBOX_RADIO) {\n                    <val-checkbox-radio-input [props]=\"getFieldProp(f)\"></val-checkbox-radio-input>\n                  }\n                  @case (types.ATTACHMENT) {\n                    <val-attachment-uploader\n                      [props]=\"{\n                        title: f.label,\n                        hint: f.hint,\n                        uploadFn: f.uploadFn,\n                        disabled: f.state === states.DISABLED || f.state === states.WORKING,\n                      }\"\n                      (attachmentsChange)=\"onAttachmentChange(f.name, $event)\"\n                    ></val-attachment-uploader>\n                  }\n                }\n                <val-hint [props]=\"getFieldProp(f)\"></val-hint>\n              </div>\n            }\n            <val-divider [props]=\"{ fill: 'solid', size: 'medium', color: 'medium' }\"></val-divider>\n            <ng-content></ng-content>\n          </div>\n        }\n        @if (!props.controlled) {\n          <div class=\"submit-actions\" [class.submit-actions--sticky]=\"props.stickyFooter\">\n            <val-button-group\n              [props]=\"{ buttons: actions, position: 'center', columned: false }\"\n              (onClick)=\"submitHandler($event)\"\n            ></val-button-group>\n          </div>\n        }\n      </form>\n    </div>\n  `,\n  styleUrls: ['./form.component.scss'],\n})\nexport class FormComponent implements OnInit, OnChanges, DoCheck {\n  @Input()\n  props: FormMetadata;\n\n  @Output()\n  onSubmit = new EventEmitter<FormSubmit>();\n\n  @Output()\n  onInvalid = new EventEmitter();\n\n  @Output()\n  onSelectChange = new EventEmitter<{ field: string; value: any }>();\n\n  form: FormGroup;\n  types = InputType;\n  states = ComponentStates;\n\n  /**\n   * Valor actual del form (`form.getRawValue()`), actualizado en cada\n   * `valueChanges`. Pensado para el modo `controlled`: el host lo lee vía\n   * `@ViewChild(FormComponent)` sin tocar el FormGroup directo. En modo normal\n   * también está disponible.\n   */\n  readonly value = signal<Record<string, any>>({});\n\n  /**\n   * Estado de validez del form, actualizado en cada `statusChanges`. Para que\n   * el host (wizard) habilite/deshabilite su botón \"Siguiente\".\n   */\n  readonly valid = signal(false);\n\n  private subscriptions: Subscription[] = [];\n\n  private actionsCache: ButtonMetadata[] = [];\n\n  // Memo de getFieldProp/getUsernameProp por referencia de field — evita\n  // crear un nuevo objeto props por keystroke (cada CD cycle invocaría el\n  // template binding, multiplicando re-renders en cascada por # fields).\n  // WeakMap: si la referencia del field cambia, el cache se libera.\n  private fieldPropMemo = new WeakMap<InputMetadata, InputMetadata>();\n  private usernamePropMemo = new WeakMap<InputMetadata, UsernameInputMetadata>();\n  private textareaPropMemo = new WeakMap<InputMetadata, TextareaInputMetadata>();\n  private selectPropMemo = new WeakMap<InputMetadata, InputMetadata>();\n\n  // Estado previo para detectar cambios en ngDoCheck\n  private previousState: string | undefined;\n  private previousUploadingCount = 0;\n\n  // Campos ATTACHMENT con uploads en curso — bloquea submit + DESHABILITA el\n  // botón (no loading: el spinner se reserva para el submit real del form).\n  private uploadingFields = new Set<string>();\n\n  constructor(\n    private fb: FormBuilder,\n    private elementRef: ElementRef\n  ) {}\n\n  ngOnInit() {\n    const formControls = {};\n    this.props.sections.forEach(section => {\n      section.fields.forEach(field => {\n        // Honra `field.value` al construir el FormGroup para que controles tipo\n        // HANDLE (que consumen el control directo via [formControl]) reciban el\n        // valor inicial sin que el caller tenga que patchValue post-mount.\n        // El helper applyDefaultValueToControl (val-text-input etc.) sigue\n        // funcionando — escribe sobre un control ya inicializado, idempotente.\n        const initialValue = field.value ?? null;\n        if (field.type === this.types.NUMBER_FROM_TO) {\n          // Crear dos controles para campos NUMBER_FROM_TO\n          formControls[`${field.name}_from`] = [initialValue, field.validators || []];\n          formControls[`${field.name}_to`] = [initialValue, field.validators || []];\n        } else if (field.type === this.types.ATTACHMENT) {\n          formControls[field.name] = [[], field.validators || []];\n        } else {\n          formControls[field.name] = [initialValue, field.validators || []];\n        }\n      });\n    });\n    this.form = this.fb.group(formControls);\n    this.props.sections.forEach(section => {\n      section.fields\n        .filter(\n          x =>\n            x.type === this.types.SELECT ||\n            x.type === this.types.TEXT ||\n            x.type === this.types.SEARCH_SELECT ||\n            x.type === this.types.MULTI_SELECT\n        )\n        .forEach(field => {\n          this.trackSelectChanges(field.name);\n        });\n    });\n\n    // Estado reactivo público (value/valid) — actualizado por suscripción RxJS,\n    // NO dentro de un effect: setear signals acá es seguro (no dispara NG0600).\n    this.value.set(this.form.getRawValue());\n    this.valid.set(this.form.valid);\n    this.subscriptions.push(this.form.valueChanges.subscribe(() => this.value.set(this.form.getRawValue())));\n    this.subscriptions.push(this.form.statusChanges.subscribe(() => this.valid.set(this.form.valid)));\n\n    this.syncFieldControlStates();\n    this.updateActionsCache();\n    this.previousState = this.props.state;\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    // Cuando props cambia, reconstruir el cache\n    if (changes['props'] && this.form) {\n      this.syncFieldControlStates();\n      this.updateActionsCache();\n      this.previousState = this.props.state;\n    }\n  }\n\n  ngDoCheck() {\n    // Detectar cambios en el estado del formulario (mutación sin cambiar referencia)\n    const uploadingCount = this.uploadingFields.size;\n    if (\n      this.form &&\n      this.props &&\n      (this.props.state !== this.previousState || uploadingCount !== this.previousUploadingCount)\n    ) {\n      this.previousState = this.props.state;\n      this.previousUploadingCount = uploadingCount;\n      this.updateActionsCache();\n    }\n  }\n\n  /**\n   * Synchronizes form control disabled/enabled state with field metadata.\n   */\n  private syncFieldControlStates() {\n    this.props.sections.forEach(section => {\n      section.fields.forEach(field => {\n        if (field.type === this.types.ATTACHMENT) return;\n        if (field.type === this.types.NUMBER_FROM_TO) {\n          const fromControl = this.getControl(`${field.name}_from`);\n          const toControl = this.getControl(`${field.name}_to`);\n\n          if (field.state === ComponentStates.DISABLED) {\n            fromControl.disable({ emitEvent: false });\n            toControl.disable({ emitEvent: false });\n          } else {\n            fromControl.enable({ emitEvent: false });\n            toControl.enable({ emitEvent: false });\n          }\n        } else {\n          const control = this.getControl(field.name);\n          if (field.state === ComponentStates.DISABLED) {\n            control.disable({ emitEvent: false });\n          } else {\n            control.enable({ emitEvent: false });\n          }\n        }\n      });\n    });\n  }\n\n  /**\n   * Actualiza el cache de actions basado en el estado actual del form.\n   */\n  private updateActionsCache() {\n    // En modo controlled (o sin submit) no hay botón propio que cachear.\n    if (!this.props.actions) {\n      this.actionsCache = [];\n      return;\n    }\n    let actionState = this.props.actions.state;\n\n    if (this.props.state === ComponentStates.WORKING) {\n      // Submit real del form en curso → botón en loading (spinner).\n      actionState = ComponentStates.WORKING;\n    } else if (this.props.state === ComponentStates.DISABLED || this.uploadingFields.size > 0) {\n      // Subida de adjunto en curso → DESHABILITAR el submit, NO loading: todavía\n      // no se está enviando el form, solo subiendo un archivo. Un spinner acá\n      // confunde (parece que el form se está enviando).\n      actionState = ComponentStates.DISABLED;\n    } else if (this.props.state === ComponentStates.ENABLED || this.form?.valid) {\n      actionState = ComponentStates.ENABLED;\n    }\n\n    this.actionsCache = [{ ...this.props.actions, state: actionState }];\n  }\n\n  ngOnDestroy() {\n    // Cleanup subscriptions to avoid memory leaks\n    this.subscriptions.forEach(sub => sub.unsubscribe());\n  }\n\n  trackSelectChanges(fieldName: string) {\n    const control = this.getControl(fieldName);\n    const subscription = control.valueChanges.subscribe(value => {\n      this.onSelectChange.emit({ field: fieldName, value });\n    });\n    this.subscriptions.push(subscription);\n  }\n\n  async submitHandler(token?: string) {\n    if (this.uploadingFields.size > 0) return;\n    if (!this.form.valid) {\n      this.form.markAllAsTouched();\n      this.onInvalid.emit();\n      return;\n    }\n    this.onSubmit.emit({ fields: this.form.getRawValue(), token });\n  }\n\n  onAttachmentChange(fieldName: string, items: AttachmentItem[]): void {\n    const readyUrls = items.filter(a => a.status === 'ready' && a.url).map(a => a.url!);\n    this.form.get(fieldName)?.setValue(readyUrls, { emitEvent: false });\n    if (items.some(a => a.status === 'uploading')) {\n      this.uploadingFields.add(fieldName);\n    } else {\n      this.uploadingFields.delete(fieldName);\n    }\n  }\n\n  getControl(field: string): FormControl {\n    return this.Form.get(field) as FormControl;\n  }\n\n  getFieldProp(field: InputMetadata): InputMetadata {\n    const cached = this.fieldPropMemo.get(field);\n    if (cached) return cached;\n\n    if (!field.token) {\n      field.token = `input-${field.type}-${field.name}`;\n    }\n\n    let result: InputMetadata;\n    if (field.type === this.types.NUMBER_FROM_TO) {\n      const fromControl = this.getControl(`${field.name}_from`);\n      const toControl = this.getControl(`${field.name}_to`);\n      result = { ...field, fromControl, toControl, control: undefined };\n    } else {\n      const control = this.getControl(field.name);\n      result = { ...field, control };\n    }\n    this.fieldPropMemo.set(field, result);\n    return result;\n  }\n\n  /**\n   * Adapter para SELECT — igual que `getFieldProp` pero limpia `label`.\n   * val-form ya renderiza el título del campo con `<val-title>` arriba del input;\n   * si además pasáramos `label` al `<ion-select>`, este lo pinta DENTRO del pill\n   * → redundancia visual (\"Tipo\" dos veces). Reusa el mismo memo (con la entrada\n   * ya label-stripped) para no romper la identidad de referencia.\n   */\n  getSelectProp(field: InputMetadata): InputMetadata {\n    const cached = this.selectPropMemo.get(field);\n    if (cached) return cached;\n\n    const base = this.getFieldProp(field);\n    const result: InputMetadata = { ...base, label: '' };\n    this.selectPropMemo.set(field, result);\n    return result;\n  }\n\n  /**\n   * Adapter — convierte un `InputMetadata` (con type=HANDLE) a `UsernameInputMetadata`.\n   * El check de disponibilidad se resuelve dentro del component (AuthService inyectado);\n   * el caller puede sobrescribirlo pasando `field.errors` o un `UsernameInputMetadata`\n   * custom usando type=TEXT si necesita otra fuente de truth.\n   */\n  getUsernameProp(field: InputMetadata): UsernameInputMetadata {\n    const cached = this.usernamePropMemo.get(field);\n    if (cached) return cached;\n\n    const control = this.getControl(field.name);\n    const result: UsernameInputMetadata = {\n      control: control as FormControl<string>,\n      label: field.label,\n      hint: field.hint,\n      placeholder: field.placeholder,\n      minLength: field.range?.min,\n      maxLength: field.range?.max,\n      errors: field.errors,\n      state: field.state,\n    };\n    this.usernamePropMemo.set(field, result);\n    return result;\n  }\n\n  /**\n   * Adapter — convierte un `InputMetadata` (con type=TEXTAREA) a `TextareaInputMetadata`.\n   * Defaults sensatos: autoGrow + counter habilitado, 4-12 rows.\n   */\n  getTextareaProp(field: InputMetadata): TextareaInputMetadata {\n    const cached = this.textareaPropMemo.get(field);\n    if (cached) return cached;\n\n    const control = this.getControl(field.name);\n    const result: TextareaInputMetadata = {\n      control: control as FormControl<string>,\n      name: field.name,\n      // label vacío — val-form ya renderiza el título con <val-title> arriba del\n      // input. Pasarlo al <ion-textarea> duplicaría el texto (\"Descripción\" x2).\n      label: '',\n      hint: field.hint,\n      placeholder: field.placeholder,\n      autoGrow: true,\n      minRows: 4,\n      maxRows: 12,\n      maxLength: field.range?.max ?? 2000,\n      showCounter: true,\n      counterFormat: 'current',\n      fill: 'outline',\n      errors: field.errors,\n      state: field.state,\n    };\n    this.textareaPropMemo.set(field, result);\n    return result;\n  }\n\n  get isAtEndOfForm(): boolean {\n    return isAtEnd(this.elementRef);\n  }\n\n  /**\n   * Fuerza mostrar los errores de validación (marca todos los controles como\n   * touched) y devuelve si el form es válido. Pensado para el modo `controlled`:\n   * el host lo invoca en su \"Siguiente\" para gatear la navegación del wizard.\n   */\n  validate(): boolean {\n    this.form.markAllAsTouched();\n    return this.form.valid;\n  }\n\n  /**\n   * Marca todos los controles como touched (muestra errores) sin devolver nada.\n   * Alias semántico de la primera mitad de `validate()`.\n   */\n  markAllTouched(): void {\n    this.form.markAllAsTouched();\n  }\n\n  get Form(): FormGroup {\n    return this.form;\n  }\n\n  get FormState(): { form: FormGroup; data: FormMetadata } {\n    return {\n      form: this.Form,\n      data: this.props,\n    };\n  }\n\n  get actions(): ButtonMetadata[] {\n    // Retornar del cache para evitar crear nuevos objetos en cada ciclo de change detection\n    return this.actionsCache;\n  }\n}\n","import { inject } from '@angular/core';\nimport {\n  Router,\n  CanActivateFn,\n  UrlTree,\n  ActivatedRouteSnapshot,\n  RouterStateSnapshot,\n} from '@angular/router';\nimport { AuthService } from './auth.service';\nimport { VALTECH_AUTH_CONFIG } from './config';\n\n/**\n * Guard que verifica si el usuario está autenticado.\n * Redirige a loginRoute si no está autenticado.\n *\n * Preserva la URL solicitada en el query param `returnUrl` para que la\n * página de login pueda devolver al usuario a su destino tras autenticarse.\n *\n * @example\n * ```typescript\n * import { authGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'dashboard',\n *     canActivate: [authGuard],\n *     loadComponent: () => import('./dashboard.page'),\n *   },\n * ];\n * ```\n */\nexport const authGuard: CanActivateFn = (\n  _route: ActivatedRouteSnapshot,\n  state: RouterStateSnapshot\n): boolean | UrlTree => {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n  const config = inject(VALTECH_AUTH_CONFIG);\n\n  if (authService.isAuthenticated()) {\n    return true;\n  }\n\n  return router.createUrlTree([config.loginRoute], {\n    queryParams: { returnUrl: state.url },\n  });\n};\n\n/**\n * Guard que verifica si el usuario NO está autenticado.\n * Redirige a homeRoute si ya está autenticado.\n * Útil para páginas de login/registro.\n *\n * @example\n * ```typescript\n * import { guestGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'login',\n *     canActivate: [guestGuard],\n *     loadComponent: () => import('./login.page'),\n *   },\n * ];\n * ```\n */\nexport const guestGuard: CanActivateFn = (): boolean | UrlTree => {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n  const config = inject(VALTECH_AUTH_CONFIG);\n\n  if (!authService.isAuthenticated()) {\n    return true;\n  }\n\n  return router.createUrlTree([config.homeRoute]);\n};\n\n/**\n * Factory para crear guard de permisos.\n * Verifica si el usuario tiene el permiso especificado.\n *\n * @param permissions - Permiso o lista de permisos requeridos (OR)\n * @returns Guard function\n *\n * @example\n * ```typescript\n * import { authGuard, permissionGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'templates',\n *     canActivate: [authGuard, permissionGuard('templates:read')],\n *     loadComponent: () => import('./templates.page'),\n *   },\n *   {\n *     path: 'admin',\n *     canActivate: [authGuard, permissionGuard(['admin:*', 'super_admin'])],\n *     loadComponent: () => import('./admin.page'),\n *   },\n * ];\n * ```\n */\nexport function permissionGuard(permissions: string | string[]): CanActivateFn {\n  return (): boolean | UrlTree => {\n    const authService = inject(AuthService);\n    const router = inject(Router);\n    const config = inject(VALTECH_AUTH_CONFIG);\n\n    const permArray = Array.isArray(permissions) ? permissions : [permissions];\n\n    if (authService.hasAnyPermission(permArray)) {\n      return true;\n    }\n\n    console.warn(`[ValtechAuth] Permiso denegado. Requerido: ${permArray.join(' o ')}`);\n    return router.createUrlTree([config.unauthorizedRoute]);\n  };\n}\n\n/**\n * Guard que lee permisos desde route.data.\n * Permite configurar permisos directamente en la definición de rutas.\n *\n * @example\n * ```typescript\n * import { authGuard, permissionGuardFromRoute } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'admin/users',\n *     canActivate: [authGuard, permissionGuardFromRoute],\n *     data: {\n *       permissions: ['users:read', 'users:manage'],\n *       requireAll: false  // true = AND, false = OR (default)\n *     },\n *     loadComponent: () => import('./users.page'),\n *   },\n * ];\n * ```\n */\nexport const permissionGuardFromRoute: CanActivateFn = (\n  route: ActivatedRouteSnapshot\n): boolean | UrlTree => {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n  const config = inject(VALTECH_AUTH_CONFIG);\n\n  const permissions = route.data['permissions'] as string[] | undefined;\n  const requireAll = route.data['requireAll'] as boolean | undefined;\n\n  if (!permissions || permissions.length === 0) {\n    return true;\n  }\n\n  const hasAccess = requireAll\n    ? authService.hasAllPermissions(permissions)\n    : authService.hasAnyPermission(permissions);\n\n  if (hasAccess) {\n    return true;\n  }\n\n  console.warn(\n    `[ValtechAuth] Permiso denegado. Requerido: ${permissions.join(requireAll ? ' y ' : ' o ')}`\n  );\n  return router.createUrlTree([config.unauthorizedRoute]);\n};\n\n/**\n * Guard que verifica si el usuario es super admin.\n *\n * @example\n * ```typescript\n * import { authGuard, superAdminGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'super-admin',\n *     canActivate: [authGuard, superAdminGuard],\n *     loadComponent: () => import('./super-admin.page'),\n *   },\n * ];\n * ```\n */\nexport const superAdminGuard: CanActivateFn = (): boolean | UrlTree => {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n  const config = inject(VALTECH_AUTH_CONFIG);\n\n  if (authService.isSuperAdmin()) {\n    return true;\n  }\n\n  console.warn('[ValtechAuth] Acceso de super admin requerido');\n  return router.createUrlTree([config.unauthorizedRoute]);\n};\n\n/**\n * Guard que verifica si el usuario tiene un rol específico.\n *\n * @param roles - Rol o lista de roles requeridos (OR)\n * @returns Guard function\n *\n * @example\n * ```typescript\n * import { authGuard, roleGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   {\n *     path: 'editor',\n *     canActivate: [authGuard, roleGuard(['editor', 'admin'])],\n *     loadComponent: () => import('./editor.page'),\n *   },\n * ];\n * ```\n */\nexport function roleGuard(roles: string | string[]): CanActivateFn {\n  return (): boolean | UrlTree => {\n    const authService = inject(AuthService);\n    const router = inject(Router);\n    const config = inject(VALTECH_AUTH_CONFIG);\n\n    const roleArray = Array.isArray(roles) ? roles : [roles];\n\n    const hasRole = roleArray.some(role => authService.hasRole(role));\n\n    if (hasRole) {\n      return true;\n    }\n\n    console.warn(`[ValtechAuth] Rol requerido: ${roleArray.join(' o ')}`);\n    return router.createUrlTree([config.unauthorizedRoute]);\n  };\n}\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\n\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport {\n  ValtechAuthConfig,\n  DeviceInfo,\n  ListDevicesResponse,\n  DeviceActionResult,\n  DeviceActionRequest,\n  DeviceActionResponse,\n  ValidateActionResponse,\n} from './types';\n\n/**\n * Servicio para gestión de dispositivos del usuario.\n * Permite listar, aprobar, bloquear y eliminar dispositivos registrados.\n *\n * @example\n * ```typescript\n * import { DeviceService } from 'valtech-components';\n *\n * @Component({...})\n * export class DevicesPage {\n *   private deviceService = inject(DeviceService);\n *\n *   devices = signal<DeviceInfo[]>([]);\n *\n *   async ngOnInit() {\n *     const devices = await firstValueFrom(this.deviceService.listDevices());\n *     this.devices.set(devices);\n *   }\n *\n *   async blockDevice(deviceId: string) {\n *     await firstValueFrom(this.deviceService.blockDevice(deviceId));\n *     // Recargar lista\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class DeviceService {\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private http: HttpClient\n  ) {}\n\n  private get baseUrl(): string {\n    return `${this.config?.apiUrl}/v2/users/me/devices`;\n  }\n\n  /**\n   * Lista todos los dispositivos registrados del usuario.\n   */\n  listDevices(): Observable<DeviceInfo[]> {\n    return this.http.get<ListDevicesResponse>(this.baseUrl).pipe(\n      map(response => response.devices)\n    );\n  }\n\n  /**\n   * Obtiene información de un dispositivo específico.\n   */\n  getDevice(deviceId: string): Observable<DeviceInfo> {\n    return this.http.get<{ operationId: string; device: DeviceInfo }>(\n      `${this.baseUrl}/${deviceId}`\n    ).pipe(map(response => response.device));\n  }\n\n  /**\n   * Bloquea un dispositivo.\n   * Revoca todas las sesiones activas de ese dispositivo.\n   */\n  blockDevice(deviceId: string): Observable<DeviceActionResult> {\n    return this.http.post<DeviceActionResult>(\n      `${this.baseUrl}/${deviceId}/block`,\n      {}\n    );\n  }\n\n  /**\n   * Aprueba un dispositivo pendiente.\n   * Cambia el estado de pending_approval a active.\n   */\n  approveDevice(deviceId: string): Observable<DeviceActionResult> {\n    return this.http.post<DeviceActionResult>(\n      `${this.baseUrl}/${deviceId}/approve`,\n      {}\n    );\n  }\n\n  /**\n   * Elimina un dispositivo registrado.\n   */\n  deleteDevice(deviceId: string): Observable<DeviceActionResult> {\n    return this.http.delete<DeviceActionResult>(`${this.baseUrl}/${deviceId}`);\n  }\n\n  /**\n   * Valida un token de acción SIN ejecutarlo.\n   * Útil para mostrar confirmación al usuario antes de ejecutar.\n   * Este endpoint NO requiere autenticación.\n   *\n   * @param token Token JWT de acción\n   * @returns Información del token si es válido\n   *\n   * @example\n   * ```typescript\n   * const token = this.route.snapshot.queryParams['token'];\n   * if (token) {\n   *   const validation = await firstValueFrom(this.deviceService.validateAction(token));\n   *   if (validation.valid) {\n   *     // Mostrar confirmación al usuario\n   *     console.log(`Acción: ${validation.actionType}`);\n   *   }\n   * }\n   * ```\n   */\n  validateAction(token: string): Observable<ValidateActionResponse> {\n    return this.http.post<ValidateActionResponse>(\n      `${this.config?.apiUrl}/v2/actions/validate`,\n      { token }\n    );\n  }\n\n  /**\n   * Ejecuta una acción de dispositivo desde un token de email.\n   * Este endpoint NO requiere autenticación.\n   * El token viene en la URL del email de alerta de nuevo inicio de sesión.\n   *\n   * @param token Token JWT de acción (24h, un solo uso)\n   *\n   * @example\n   * ```typescript\n   * // En la página de dispositivos, al detectar ?token=xxx en la URL:\n   * const token = this.route.snapshot.queryParams['token'];\n   * if (token) {\n   *   const result = await firstValueFrom(this.deviceService.executeAction(token));\n   *   if (result.success) {\n   *     console.log(`Dispositivo bloqueado, ${result.sessionsRevoked} sesiones cerradas`);\n   *   }\n   * }\n   * ```\n   */\n  executeAction(token: string): Observable<DeviceActionResponse> {\n    // Usa el endpoint unificado de acciones\n    return this.http.post<{ operationId: string; success: boolean; message: string; data?: Record<string, unknown> }>(\n      `${this.config?.apiUrl}/v2/actions/execute`,\n      { token }\n    ).pipe(\n      map(response => ({\n        operationId: response.operationId,\n        success: response.success,\n        message: response.message,\n        action: (response.data?.['action'] as string) || 'refuse',\n        deviceId: (response.data?.['deviceId'] as string) || '',\n        sessionsRevoked: response.data?.['sessionsRevoked'] as number | undefined,\n      }))\n    );\n  }\n}\n","import { Injectable, Inject, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport {\n  ValtechAuthConfig,\n  SessionInfo,\n  ListSessionsResponse,\n  RevokeSessionsResponse,\n} from './types';\n\n/**\n * Servicio para gestión de sesiones activas del usuario.\n * Permite listar y revocar sesiones.\n *\n * @example\n * ```typescript\n * import { SessionService } from 'valtech-components';\n *\n * @Component({...})\n * export class SessionsPage {\n *   private sessionService = inject(SessionService);\n *\n *   sessions = signal<SessionInfo[]>([]);\n *\n *   async ngOnInit() {\n *     const sessions = await firstValueFrom(this.sessionService.listSessions());\n *     this.sessions.set(sessions);\n *   }\n *\n *   async revokeSession(sessionId: string) {\n *     await firstValueFrom(this.sessionService.revokeSession(sessionId));\n *     // Recargar lista\n *   }\n *\n *   async revokeAllOthers() {\n *     const result = await firstValueFrom(this.sessionService.revokeAllSessions());\n *     console.log(`${result.sessionsRevoked} sesiones cerradas`);\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class SessionService {\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private http: HttpClient\n  ) {}\n\n  private get baseUrl(): string {\n    return `${this.config?.apiUrl}/v2/users/me/sessions`;\n  }\n\n  /**\n   * Lista todas las sesiones activas del usuario.\n   * La sesión actual está marcada con isCurrent=true.\n   */\n  listSessions(): Observable<SessionInfo[]> {\n    return this.http.get<ListSessionsResponse>(this.baseUrl).pipe(\n      map(response => response.sessions)\n    );\n  }\n\n  /**\n   * Revoca una sesión específica.\n   * Fuerza el cierre de sesión en ese dispositivo/navegador.\n   */\n  revokeSession(sessionId: string): Observable<RevokeSessionsResponse> {\n    return this.http.delete<RevokeSessionsResponse>(`${this.baseUrl}/${sessionId}`);\n  }\n\n  /**\n   * Revoca todas las sesiones excepto la actual.\n   * Útil para \"cerrar sesión en todos los dispositivos\".\n   *\n   * @returns Número de sesiones revocadas\n   */\n  revokeAllSessions(): Observable<RevokeSessionsResponse> {\n    return this.http.delete<RevokeSessionsResponse>(this.baseUrl);\n  }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MFAMethod, OAuthCallbackData, OAuthResult, OAuthError } from './types';\n\n/**\n * Componente de callback para OAuth.\n *\n * Este componente procesa la respuesta del servidor OAuth y envía\n * los tokens a la ventana padre via postMessage.\n *\n * Debe agregarse a las rutas de la aplicación:\n * ```typescript\n * // app.routes.ts\n * import { OAuthCallbackComponent } from 'valtech-components';\n *\n * export const routes: Routes = [\n *   { path: 'auth/oauth/callback', component: OAuthCallbackComponent },\n *   // ... otras rutas\n * ];\n * ```\n *\n * El backend redirige a esta ruta con los tokens en query params:\n * `/auth/oauth/callback?access_token=xxx&refresh_token=xxx&expires_in=900`\n *\n * O con error:\n * `/auth/oauth/callback?error=INVALID_CODE&error_description=...`\n */\n@Component({\n  selector: 'val-oauth-callback',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div class=\"oauth-callback\">\n      <div class=\"oauth-callback__spinner\"></div>\n      <p class=\"oauth-callback__text\">{{ message }}</p>\n    </div>\n  `,\n  styles: [\n    `\n      .oauth-callback {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        height: 100vh;\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n      }\n\n      .oauth-callback__spinner {\n        width: 40px;\n        height: 40px;\n        border: 3px solid #f3f3f3;\n        border-top: 3px solid #3498db;\n        border-radius: 50%;\n        animation: spin 1s linear infinite;\n        margin-bottom: 16px;\n      }\n\n      @keyframes spin {\n        0% {\n          transform: rotate(0deg);\n        }\n        100% {\n          transform: rotate(360deg);\n        }\n      }\n\n      .oauth-callback__text {\n        color: #666;\n        font-size: 14px;\n      }\n    `,\n  ],\n})\nexport class OAuthCallbackComponent implements OnInit {\n  message = 'Procesando autenticación...';\n\n  ngOnInit(): void {\n    this.processCallback();\n  }\n\n  private processCallback(): void {\n    const params = new URLSearchParams(window.location.search);\n\n    // DEBUG: Log all received params\n    console.log('[OAuthCallback] URL params received:', {\n      url: window.location.href,\n      hasAccessToken: params.has('access_token'),\n      hasRefreshToken: params.has('refresh_token'),\n      hasFirebaseToken: params.has('firebase_token'),\n      firebaseTokenLength: params.get('firebase_token')?.length || 0,\n      error: params.get('error'),\n    });\n\n    // Verificar si hay error\n    const error = params.get('error');\n    if (error) {\n      this.sendToParent({\n        type: 'oauth-callback',\n        error: {\n          code: error,\n          message: params.get('error_description') || 'Error de autenticación',\n        } as OAuthError,\n      });\n      this.message = 'Error de autenticación';\n      this.closeAfterDelay();\n      return;\n    }\n\n    // MFA requerido — el backend redirige sin tokens, con mfa_token. El flujo\n    // continúa con el challenge MFA (AuthService.setMFAPending → modal verify).\n    if (params.get('mfa_required') === 'true') {\n      this.sendToParent({\n        type: 'oauth-callback',\n        tokens: {\n          accessToken: '',\n          refreshToken: '',\n          expiresIn: 0,\n          mfaRequired: true,\n          mfaToken: params.get('mfa_token') || undefined,\n          mfaMethod: (params.get('mfa_method') as MFAMethod) || undefined,\n        },\n      });\n      this.message = 'Verificación adicional requerida';\n      this.closeAfterDelay();\n      return;\n    }\n\n    // Extraer tokens\n    const accessToken = params.get('access_token');\n    const refreshToken = params.get('refresh_token');\n    const expiresIn = params.get('expires_in');\n    const firebaseToken = params.get('firebase_token');\n\n    if (!accessToken || !refreshToken) {\n      this.sendToParent({\n        type: 'oauth-callback',\n        error: {\n          code: 'MISSING_TOKENS',\n          message: 'No se recibieron los tokens de autenticación',\n        } as OAuthError,\n      });\n      this.message = 'Error: tokens no recibidos';\n      this.closeAfterDelay();\n      return;\n    }\n\n    // Extraer roles y permisos (pueden venir como JSON en base64)\n    let roles: string[] | undefined;\n    let permissions: string[] | undefined;\n\n    const rolesParam = params.get('roles');\n    const permissionsParam = params.get('permissions');\n\n    if (rolesParam) {\n      try {\n        roles = JSON.parse(atob(rolesParam));\n      } catch {\n        roles = rolesParam.split(',');\n      }\n    }\n\n    if (permissionsParam) {\n      try {\n        permissions = JSON.parse(atob(permissionsParam));\n      } catch {\n        permissions = permissionsParam.split(',');\n      }\n    }\n\n    // Enviar tokens a la ventana padre\n    const result: OAuthResult = {\n      accessToken,\n      refreshToken,\n      expiresIn: expiresIn ? parseInt(expiresIn, 10) : 900,\n      firebaseToken: firebaseToken || undefined,\n      roles,\n      permissions,\n      isNewUser: params.get('is_new_user') === 'true',\n      linked: params.get('linked') === 'true',\n    };\n\n    this.sendToParent({\n      type: 'oauth-callback',\n      tokens: result,\n    });\n\n    this.message = 'Autenticación exitosa';\n    this.closeAfterDelay();\n  }\n\n  private sendToParent(data: OAuthCallbackData): void {\n    // Siempre guardar en localStorage como fallback (para COOP issues)\n    try {\n      localStorage.setItem('oauth_callback_data', JSON.stringify(data));\n      localStorage.setItem('oauth_callback_timestamp', Date.now().toString());\n      console.log('[OAuthCallback] Saved to localStorage as fallback');\n    } catch (e) {\n      console.warn('[OAuthCallback] Could not save to localStorage:', e);\n    }\n\n    // Intentar postMessage (puede fallar por COOP)\n    try {\n      if (window.opener && !window.opener.closed) {\n        window.opener.postMessage(data, window.location.origin);\n        console.log('[OAuthCallback] postMessage sent to opener');\n      } else if (window.parent !== window) {\n        window.parent.postMessage(data, window.location.origin);\n        console.log('[OAuthCallback] postMessage sent to parent');\n      } else {\n        console.log('[OAuthCallback] No opener/parent available, using localStorage only');\n      }\n    } catch (e) {\n      // COOP blocks postMessage - localStorage fallback already saved\n      console.warn('[OAuthCallback] postMessage blocked (COOP), using localStorage fallback:', e);\n    }\n  }\n\n  private closeAfterDelay(): void {\n    // Dar tiempo para que el mensaje se envíe antes de cerrar\n    setTimeout(() => {\n      if (window.opener) {\n        window.close();\n      }\n    }, 500);\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { firstValueFrom, Observable } from 'rxjs';\nimport { catchError, tap } from 'rxjs/operators';\n\nimport { AuthService } from './auth.service';\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport { ValtechAuthConfig } from './types';\n\n/**\n * Name of the query param that carries the handoff token. Apps may override\n * via `detectAndExchangeHandoff({ tokenParam })` but the default keeps the\n * convention consistent across the factory.\n */\nexport const HANDOFF_TOKEN_PARAM = 'handoff';\n\n/**\n * Name of the query param that carries the post-exchange route.\n */\nexport const HANDOFF_ROUTE_PARAM = 'route';\n\n/**\n * Options for `HandoffService.detectAndExchangeHandoff`.\n */\nexport interface DetectAndExchangeOptions {\n  /** Override the query param name. Default: `'handoff'`. */\n  tokenParam?: string;\n  /** Override the route param name. Default: `'route'`. */\n  routeParam?: string;\n  /** Where to navigate if no route param is present. Default: `'/'`. */\n  defaultRoute?: string;\n  /** Where to navigate on exchange error. Default: app's configured `loginRoute`. */\n  errorRoute?: string;\n}\n\n/**\n * Request body for `POST /v2/auth/handoff`.\n *\n * Both fields are optional and stored for audit only — the exchange step\n * does not enforce that the redeeming app matches `targetAppId`.\n */\nexport interface HandoffCreateRequest {\n  /** Target app the handoff is intended for (e.g. `\"myvaltech\"`). Audit-only. */\n  targetAppId?: string;\n  /** Route the target app should navigate to after exchange. Echoed back. */\n  route?: string;\n}\n\n/**\n * Response body from `POST /v2/auth/handoff`.\n */\nexport interface HandoffCreateResponse {\n  operationId: string;\n  /** Raw token to embed in the redirect URL as `?handoff=<token>`. 30s TTL, single-use. */\n  token: string;\n  /** RFC3339 expiration timestamp. */\n  expiresAt: string;\n  /** Echoed `route` from the request, when provided. */\n  route?: string;\n  /**\n   * Absolute base URL of the target app (e.g. `\"https://sigify.com\"`).\n   *\n   * When present, callers should use this as the destination for the redirect.\n   * Backend resolves it from the `app-config` table (single source of truth).\n   *\n   * Optional for backward compatibility — when missing, callers may fall back\n   * to a client-side `appUrls` mapping.\n   */\n  targetBaseUrl?: string;\n}\n\n/**\n * Response body from `POST /v2/auth/handoff/exchange`.\n *\n * Same shape as `SigninResponse` — installable via `AuthService.setExternalAuth`.\n */\nexport interface HandoffExchangeResponse {\n  operationId: string;\n  accessToken: string;\n  refreshToken: string;\n  firebaseToken?: string;\n  expiresIn: number;\n  tokenType: string;\n  userId: string;\n}\n\n/**\n * HandoffService — cross-app session transfer.\n *\n * Implements the OAuth Authorization Code pattern, applied internally between\n * apps that share the same backend.\n *\n * **Origin app (user is authenticated):**\n *\n * ```typescript\n * const { token, route } = await firstValueFrom(\n *   handoff.createHandoff({ targetAppId: 'myvaltech', route: '/app/dashboard' })\n * );\n * window.location.href = `https://myvaltech.app/?handoff=${token}&route=${encodeURIComponent(route ?? '/')}`;\n * ```\n *\n * **Target app (boot):** call `exchangeHandoff(token)`. On success, the session\n * is installed (`AuthService.setExternalAuth`) and the user is authenticated.\n * See `detectAndExchangeHandoff` helper for the typical bootstrap pattern.\n *\n * Security notes:\n * - Token is single-use and short-lived (30s) — enforced server-side.\n * - Token in URL must be removed from history after exchange to avoid log leakage.\n * - The exchange endpoint is public; do NOT add auth header. The\n *   `HttpClient` request below avoids triggering the auth interceptor since the\n *   user isn't logged in yet on the target app.\n */\n@Injectable({ providedIn: 'root' })\nexport class HandoffService {\n  private detected = false;\n\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private http: HttpClient,\n    private auth: AuthService,\n    private router: Router\n  ) {}\n\n  /**\n   * Create a handoff token. Caller must be authenticated.\n   *\n   * @param request Optional metadata: target app id and intended route.\n   * @returns Observable emitting `{ token, expiresAt, route? }`.\n   */\n  createHandoff(request: HandoffCreateRequest = {}): Observable<HandoffCreateResponse> {\n    return this.http.post<HandoffCreateResponse>(`${this.baseUrl}/handoff`, request);\n  }\n\n  /**\n   * Exchange a handoff token for a session and install it.\n   *\n   * On success, the response is piped through `AuthService.setExternalAuth`\n   * so the user becomes authenticated. Subsequent navigation can proceed.\n   *\n   * On failure, the observable errors. The caller is responsible for\n   * showing an error and routing to `/login`.\n   *\n   * @param token Raw handoff token read from the URL.\n   */\n  exchangeHandoff(token: string): Observable<HandoffExchangeResponse> {\n    return this.http\n      .post<HandoffExchangeResponse>(`${this.baseUrl}/handoff/exchange`, { token })\n      .pipe(\n        tap(response => this.installSession(response)),\n        catchError(err => {\n          // Surface the error untouched — the caller decides how to react\n          // (typically: redirect to /login + toast). Don't install a bad session.\n          throw err;\n        })\n      );\n  }\n\n  /**\n   * Bootstrap helper — reads the handoff token from the current URL, exchanges\n   * it for a session, and navigates to the intended route with the token\n   * stripped from history.\n   *\n   * Idempotent: subsequent calls are no-ops. Wire from an\n   * `APP_INITIALIZER`/`provideAppInitializer` factory in `main.ts`.\n   *\n   * ```typescript\n   * // main.ts\n   * provideAppInitializer(() => inject(HandoffService).detectAndExchangeHandoff())\n   * ```\n   *\n   * On error (expired/used/invalid token), redirects to `errorRoute` (default:\n   * the app's configured `loginRoute`). The URL is always cleaned, even on\n   * error, so the token cannot be retried by refreshing the page.\n   *\n   * @returns `true` if a handoff was detected and processed (success or fail).\n   *          `false` if no token was present (cold boot, normal flow).\n   */\n  async detectAndExchangeHandoff(options: DetectAndExchangeOptions = {}): Promise<boolean> {\n    if (this.detected || typeof window === 'undefined') {\n      return false;\n    }\n    this.detected = true;\n\n    const tokenParam = options.tokenParam ?? HANDOFF_TOKEN_PARAM;\n    const routeParam = options.routeParam ?? HANDOFF_ROUTE_PARAM;\n    const defaultRoute = options.defaultRoute ?? '/';\n    const errorRoute = options.errorRoute ?? this.config?.loginRoute ?? '/login';\n\n    const params = new URLSearchParams(window.location.search);\n    const token = params.get(tokenParam);\n    if (!token) {\n      return false;\n    }\n\n    const targetRoute = params.get(routeParam) || defaultRoute;\n\n    try {\n      await firstValueFrom(this.exchangeHandoff(token));\n      await this.router.navigateByUrl(targetRoute, { replaceUrl: true });\n    } catch (err) {\n      console.warn('[Handoff] Exchange failed, redirecting to login', err);\n      await this.router.navigateByUrl(errorRoute, { replaceUrl: true });\n    }\n\n    return true;\n  }\n\n  /**\n   * Persist the session in `AuthService`. Mirrors the install flow used by\n   * the normal signin path so timers, Firebase, and tab-sync all kick in.\n   */\n  private installSession(response: HandoffExchangeResponse): void {\n    this.auth.setExternalAuth({\n      accessToken: response.accessToken,\n      refreshToken: response.refreshToken,\n      firebaseToken: response.firebaseToken,\n      expiresIn: response.expiresIn,\n    });\n  }\n\n  private get baseUrl(): string {\n    return `${this.config?.apiUrl}${this.config?.authPrefix}`;\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { firstValueFrom, Observable, Subject } from 'rxjs';\n\nimport { AuthService } from './auth.service';\n\n/**\n * Event emitted when the active organization changes.\n */\nexport interface OrgChangedEvent {\n  /** Org the user was on before the switch. May be empty on first sign-in. */\n  previousOrg: string;\n  /** Org the user just switched to. */\n  newOrg: string;\n}\n\n/**\n * Options for `OrgSwitchService.switchTo`.\n */\nexport interface SwitchOrgOptions {\n  /**\n   * If `true`, after the switch succeeds the page is fully reloaded via\n   * `window.location.reload()`. Useful for apps with significant in-memory\n   * state tied to the previous org that's hard to invalidate piece by piece.\n   *\n   * Trade-off: reload loses all in-memory state (forms, scroll position).\n   * Default: `false` — relies on `orgChanged$` and `auth.user()` signal\n   * propagation for components to react.\n   */\n  reload?: boolean;\n}\n\n/**\n * OrgSwitchService — orchestrates active organization changes across the app.\n *\n * Built on top of `AuthService.switchOrg`, which already:\n * - Hits `POST /v2/auth/switch-org` and receives a new Firebase custom token.\n * - Re-authenticates Firebase Auth with the new token (RBAC claims update).\n * - Broadcasts `ORG_SWITCH` to other tabs via `AuthSyncService` (multi-tab sync).\n *\n * What this service adds on top:\n * - A `switching` signal so the UI can show a loading indicator (1-2s switch).\n * - An `orgChanged$` Observable that components subscribe to in order to\n *   invalidate their org-scoped caches (e.g. drop old query results, reset\n *   page state) without a full page reload.\n * - Optional `reload: true` for apps where invalidating in-memory state piece\n *   by piece is impractical.\n *\n * **What this service does NOT do automatically:**\n *\n * 1. **Teardown Firestore listeners.** Listeners are owned by their subscribing\n *    components (typically via `takeUntilDestroyed` or async pipe). When the\n *    component re-renders or unsubscribes, the listener disposes. If a\n *    component does NOT unsubscribe on org change, its listener will keep\n *    pointing at the previous org's path and may start failing rules. The fix\n *    is component-level: subscribe to `orgChanged$` and reset state, or use\n *    the `reload: true` option.\n *\n * 2. **Re-instantiate routed components.** Angular keeps mounted components\n *    alive across navigations. If you need fresh state, either subscribe to\n *    `orgChanged$` in the component, or use `reload: true`.\n *\n * @example Basic switch with loading state\n * ```typescript\n * private orgSwitch = inject(OrgSwitchService);\n *\n * async onSwitchOrg(orgId: string) {\n *   await this.orgSwitch.switchTo(orgId);\n *   // Components subscribed to orgChanged$ have already reset their state.\n * }\n *\n * // In template:\n * @if (orgSwitch.switching()) { <val-loading /> }\n * ```\n *\n * @example Component reacting to org change\n * ```typescript\n * private orgSwitch = inject(OrgSwitchService);\n *\n * constructor() {\n *   this.orgSwitch.orgChanged$\n *     .pipe(takeUntilDestroyed())\n *     .subscribe(() => this.resetState());\n * }\n * ```\n *\n * @example Brutal reload mode\n * ```typescript\n * await this.orgSwitch.switchTo(orgId, { reload: true });\n * // window.location.reload() — clean slate, loses scroll position\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class OrgSwitchService {\n  private readonly _switching = signal(false);\n  private readonly _orgChanged = new Subject<OrgChangedEvent>();\n\n  /**\n   * `true` while a switch is in flight. UI should disable interactions\n   * with org-scoped data and show a loading indicator.\n   */\n  readonly switching = this._switching.asReadonly();\n\n  /**\n   * Fires after a successful switch, with the previous and new org ids.\n   * Components subscribe to invalidate caches / reset state.\n   *\n   * Fires AFTER the Firebase re-auth completes — listeners attached here\n   * see the updated Firebase user / activeOrg claim.\n   */\n  readonly orgChanged$: Observable<OrgChangedEvent> = this._orgChanged.asObservable();\n\n  constructor(private auth: AuthService) {}\n\n  /**\n   * Switch the user's active organization.\n   *\n   * Re-entrant safe: while a switch is in flight, additional calls are\n   * rejected silently (returns immediately). Inspect `switching()` to gate UI.\n   *\n   * @param orgId Target organization id. Must be one the user has a role in\n   *              — backend rejects otherwise with `PERMISSION_DENIED`.\n   * @param options See `SwitchOrgOptions`.\n   *\n   * @throws The error from `auth.switchOrg` if the backend call fails.\n   *         `switching` returns to `false` before the error propagates.\n   */\n  async switchTo(orgId: string, options: SwitchOrgOptions = {}): Promise<void> {\n    if (this._switching()) {\n      return;\n    }\n\n    const previousOrg = this.currentActiveOrg();\n    if (previousOrg === orgId) {\n      // No-op — already on this org.\n      return;\n    }\n\n    this._switching.set(true);\n    try {\n      await firstValueFrom(this.auth.switchOrg(orgId));\n      this._orgChanged.next({ previousOrg, newOrg: orgId });\n\n      if (options.reload && typeof window !== 'undefined') {\n        window.location.reload();\n      }\n    } finally {\n      this._switching.set(false);\n    }\n  }\n\n  /**\n   * Read the current `activeOrg` from the auth user signal.\n   * Falls back to empty string if the user isn't loaded yet.\n   */\n  private currentActiveOrg(): string {\n    const user = this.auth.user();\n    // AuthUser may expose activeOrgId under different names depending on\n    // backend version — keep tolerant.\n    return (\n      (user as { activeOrgId?: string; activeOrg?: string } | null)?.activeOrgId ??\n      (user as { activeOrgId?: string; activeOrg?: string } | null)?.activeOrg ??\n      ''\n    );\n  }\n}\n","/**\n * NotificationActionService — orquesta el \"click en notificación\" cross-app cross-org.\n *\n * Flujo:\n *   1. markAsRead (best-effort, no bloquea)\n *   2. Si appId destino !== appId actual → handoff token + redirect a app destino\n *   3. Si orgId destino !== activeOrg → switchTo(orgId) (sin reload, navega después)\n *   4. router.navigateByUrl(actionRoute)\n *\n * Requiere:\n *   - ValtechAuthConfig.appId  (identifica la app actual)\n *   - ValtechAuthConfig.appUrls (mapa baseUrl para handoff cross-app)\n */\n\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\n\nimport { AuthService } from './auth.service';\nimport { VALTECH_AUTH_CONFIG } from './config';\nimport { HandoffService } from './handoff.service';\nimport { OrgSwitchService } from './org-switch.service';\nimport { ValtechAuthConfig } from './types';\nimport { NotificationDocument, NotificationsService } from '../firebase/notifications.service';\n\n/** Resultado descriptivo del open() — útil para tests y telemetría. */\nexport type NotificationOpenResult =\n  | 'navigated'\n  | 'navigated-after-switch-org'\n  | 'redirected-cross-app'\n  | 'no-action-route'\n  | 'cross-app-unconfigured'\n  | 'handoff-failed';\n\n@Injectable({ providedIn: 'root' })\nexport class NotificationActionService {\n  constructor(\n    @Optional() @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig | null,\n    private auth: AuthService,\n    private orgSwitch: OrgSwitchService,\n    private handoff: HandoffService,\n    private notifications: NotificationsService,\n    private router: Router\n  ) {}\n\n  /**\n   * Abre la notificación: marca como leída, switch-org si toca, navegación local o\n   * redirect cross-app vía handoff.\n   *\n   * No lanza errores hacia la UI — devuelve un resultado descriptivo. Errores\n   * técnicos quedan en console.warn.\n   */\n  async open(notif: NotificationDocument): Promise<NotificationOpenResult> {\n    // 1) Mark as read (best-effort, no bloquea el flujo principal)\n    if (notif.id && !notif.isRead) {\n      this.notifications.markAsRead(notif.id).catch(err => {\n        console.warn('[NotificationAction] markAsRead failed', err);\n      });\n    }\n\n    const route = notif.actionRoute;\n    if (!route) {\n      return 'no-action-route';\n    }\n\n    const currentApp = this.config?.appId;\n    const targetApp = notif.appId;\n\n    // 2) Cross-app: handoff + full redirect\n    //\n    // baseUrl resolution priority:\n    //   (1) response.targetBaseUrl  — backend lookup en app-config (preferred, single source of truth)\n    //   (2) config.appUrls[targetApp] — fallback frontend mientras backend agrega el campo\n    if (targetApp && currentApp && targetApp !== currentApp) {\n      try {\n        const resp = await firstValueFrom(\n          this.handoff.createHandoff({ targetAppId: targetApp, route })\n        );\n        const baseUrl = resp.targetBaseUrl ?? this.config?.appUrls?.[targetApp];\n        if (!baseUrl) {\n          console.warn(\n            `[NotificationAction] No baseUrl for app '${targetApp}' — backend did not return targetBaseUrl and no appUrls fallback configured`\n          );\n          return 'cross-app-unconfigured';\n        }\n        const url = this.buildHandoffUrl(baseUrl, resp.token, route);\n        if (typeof window !== 'undefined') {\n          window.location.href = url;\n        }\n        return 'redirected-cross-app';\n      } catch (err) {\n        const msg = err instanceof HttpErrorResponse ? err.message : String(err);\n        console.warn('[NotificationAction] createHandoff failed:', msg);\n        return 'handoff-failed';\n      }\n    }\n\n    // 3) Same app — switch-org si toca (sin reload — la navegación posterior monta page fresh)\n    let switched = false;\n    if (notif.orgId) {\n      const active = this.activeOrg();\n      if (active && active !== notif.orgId) {\n        await this.orgSwitch.switchTo(notif.orgId);\n        switched = true;\n      }\n    }\n\n    // 4) Navigate local\n    await this.router.navigateByUrl(route);\n    return switched ? 'navigated-after-switch-org' : 'navigated';\n  }\n\n  private activeOrg(): string {\n    const user = this.auth.user();\n    return (\n      (user as { activeOrgId?: string; activeOrg?: string } | null)?.activeOrgId ??\n      (user as { activeOrgId?: string; activeOrg?: string } | null)?.activeOrg ??\n      ''\n    );\n  }\n\n  /**\n   * Construye URL absoluta para handoff cross-app preservando pathname y otros\n   * params existentes de la baseUrl.\n   */\n  private buildHandoffUrl(baseUrl: string, token: string, route: string): string {\n    const url = new URL(baseUrl);\n    url.searchParams.set('handoff', token);\n    url.searchParams.set('route', route);\n    return url.toString();\n  }\n}\n","/**\n * Valtech Auth Service\n *\n * Servicio de autenticación reutilizable para aplicaciones Angular.\n * Proporciona autenticación con AuthV2, MFA, sincronización entre pestañas,\n * refresh proactivo de tokens, y registro automático de dispositivos para\n * push notifications.\n *\n * @example\n * ```typescript\n * // En main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechAuth, provideValtechFirebase } from 'valtech-components';\n * import { environment } from './environments/environment';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechFirebase(environment.firebase),\n *     provideValtechAuth({\n *       apiUrl: environment.apiUrl,\n *       enableFirebaseIntegration: true,\n *       enableDeviceRegistration: true, // Auto-registra dispositivos para push\n *     }),\n *   ],\n * });\n *\n * // En app.routes.ts\n * import { authGuard, guestGuard, permissionGuard } from 'valtech-components';\n *\n * const routes: Routes = [\n *   { path: 'login', canActivate: [guestGuard], loadComponent: () => import('./login.page') },\n *   { path: 'dashboard', canActivate: [authGuard], loadComponent: () => import('./dashboard.page') },\n *   { path: 'admin', canActivate: [authGuard, permissionGuard('admin:*')], loadComponent: () => import('./admin.page') },\n * ];\n *\n * // En componentes\n * import { AuthService } from 'valtech-components';\n *\n * @Component({...})\n * export class LoginComponent {\n *   private auth = inject(AuthService);\n *\n *   async login() {\n *     await firstValueFrom(this.auth.signin({ email, password }));\n *     if (this.auth.mfaPending().required) {\n *       // Mostrar UI de MFA\n *     } else {\n *       this.router.navigate(['/dashboard']);\n *     }\n *   }\n *\n *   // Habilitar notificaciones push (solicita permisos + registra dispositivo)\n *   async enableNotifications() {\n *     const result = await this.auth.enableNotifications();\n *     if (result.granted) {\n *       console.log('Notificaciones habilitadas');\n *     }\n *   }\n *\n *   // Verificar estado de permisos\n *   get canReceiveNotifications(): boolean {\n *     return this.auth.getNotificationPermissionState() === 'granted';\n *   }\n *\n *   // En template: usar signals directamente\n *   // {{ auth.user()?.email }}\n *   // @if (auth.hasPermission('templates:edit')) { ... }\n * }\n * ```\n */\n\n// Tipos\nexport * from './types';\n\n// Configuración\nexport {\n  VALTECH_AUTH_CONFIG,\n  provideValtechAuth,\n  provideValtechAuthInterceptor,\n  DEFAULT_AUTH_CONFIG,\n} from './config';\n\n// Servicio principal\nexport { AuthService } from './auth.service';\n\n// Guards\nexport {\n  authGuard,\n  guestGuard,\n  permissionGuard,\n  permissionGuardFromRoute,\n  superAdminGuard,\n  roleGuard,\n} from './guards';\n\n// Interceptor (para uso avanzado)\nexport { authInterceptor } from './interceptor';\n\n// Servicios internos (para testing o extensión)\nexport { AuthStateService } from './auth-state.service';\nexport { TokenService } from './token.service';\nexport { AuthStorageService } from './storage.service';\nexport { AuthSyncService } from './sync.service';\n\n// Servicios de gestión de dispositivos y sesiones\nexport { DeviceService } from './device.service';\nexport { SessionService } from './session.service';\n\n// OAuth (Login social)\nexport { OAuthService } from './oauth.service';\nexport { OAuthCallbackComponent } from './oauth-callback.component';\n\n// Cross-app session handoff (OAuth Authorization Code pattern internal)\nexport { HandoffService, HANDOFF_TOKEN_PARAM, HANDOFF_ROUTE_PARAM } from './handoff.service';\nexport type {\n  HandoffCreateRequest,\n  HandoffCreateResponse,\n  HandoffExchangeResponse,\n  DetectAndExchangeOptions,\n} from './handoff.service';\n\n// Active organization switch orchestration\nexport { OrgSwitchService } from './org-switch.service';\nexport type { OrgChangedEvent, SwitchOrgOptions } from './org-switch.service';\n\n// Cross-app cross-org notification click handler\nexport { NotificationActionService } from './notification-action.service';\nexport type { NotificationOpenResult } from './notification-action.service';\n","import { Component, computed, EventEmitter, inject, Input, Output, signal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport { authPasswordValidator } from '../../../shared/utils/validators';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonModal,\n  IonSpinner,\n  IonToolbar,\n} from '@ionic/angular/standalone';\n\nimport { SolidDefaultBlock } from '../../atoms/button/factory';\nimport { ComponentState, ComponentStates, FormMetadata, FormSubmit, InputType } from '../../types';\nimport { FormComponent } from '../form/form.component';\nimport { AuthService } from '../../../services/auth';\nimport { ConfirmationDialogService } from '../../../services/confirmation-dialog/confirmation-dialog.service';\nimport { I18nService, InputI18nHelper } from '../../../services/i18n';\nimport { ToastService } from '../../../services/toast.service';\n\n/** Modo del modal, resuelto al abrir según si el user ya tiene contraseña. */\ntype PasswordModalMode = 'loading' | 'change' | 'set';\n\n/**\n * `val-change-password-modal` — modal de gestión de contraseña para un usuario\n * autenticado. Análogo al modal de \"recuperar contraseña\" del `val-login`.\n *\n * Es dual-mode: al abrirse consulta `AuthService.checkHasPassword()` y se adapta:\n *  - **change** — el user ya tiene contraseña → pide actual + nueva →\n *    `changePassword()`.\n *  - **set** — el user es OAuth-only (sin contraseña) → pide solo la nueva,\n *    pide confirmación explícita (no pierde el acceso social, es aditivo) →\n *    `setPasswordForOAuthUser()`.\n *\n * Self-contained: inyecta `AuthService` y llama el endpoint directo — la app\n * solo controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`.\n *\n * i18n: usa el namespace compartido `_auth` (mismas claves que `val-login`).\n *\n * @example\n * ```html\n * <val-change-password-modal\n *   [isOpen]=\"isModalOpen()\"\n *   (changed)=\"isModalOpen.set(false)\"\n *   (dismissed)=\"isModalOpen.set(false)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-change-password-modal',\n  standalone: true,\n  imports: [IonButton, IonButtons, IonContent, IonHeader, IonModal, IonSpinner, IonToolbar, FormComponent],\n  templateUrl: './change-password-modal.component.html',\n  styleUrls: ['./change-password-modal.component.scss'],\n})\nexport class ChangePasswordModalComponent {\n  private _isOpen = false;\n\n  /**\n   * Controla la visibilidad del modal. Lo decide el componente padre. Cada vez\n   * que pasa de cerrado a abierto se resuelve el modo (change vs set).\n   */\n  @Input()\n  set isOpen(value: boolean) {\n    const opening = value && !this._isOpen;\n    this._isOpen = value;\n    if (opening) {\n      this.resolveMode();\n    }\n  }\n  get isOpen(): boolean {\n    return this._isOpen;\n  }\n\n  /** Emite al cambiar/crear la contraseña con éxito. El padre cierra el modal. */\n  @Output() changed = new EventEmitter<void>();\n\n  /** Emite cuando el user cierra el modal (botón X o backdrop). */\n  @Output() dismissed = new EventEmitter<void>();\n\n  private auth = inject(AuthService);\n  private toast = inject(ToastService);\n  private i18n = inject(I18nService);\n  private i18nHelper = inject(InputI18nHelper);\n  private confirmDialog = inject(ConfirmationDialogService);\n\n  private readonly _mode = signal<PasswordModalMode>('loading');\n  /** Modo actual — `loading` mientras se consulta `checkHasPassword()`. */\n  readonly mode = this._mode.asReadonly();\n\n  private readonly _formState = signal<ComponentState>(ComponentStates.ENABLED);\n\n  /** Traduce una clave del namespace `_auth`. */\n  t(key: string): string {\n    return this.i18n.t(key, '_auth');\n  }\n\n  readonly formProps = computed<FormMetadata>(() => {\n    if (this._mode() === 'set') {\n      return this.i18nHelper.resolveForm({\n        nameKey: 'setPasswordTitle',\n        i18nNamespace: '_auth',\n        sections: [\n          {\n            name: this.t('setPasswordDescription'),\n            order: 0,\n            fields: [this.newPasswordField(0)],\n          },\n        ],\n        actions: {\n          ...SolidDefaultBlock('', 'submit'),\n          token: 'set-submit',\n          textKey: 'setPasswordSubmit',\n        },\n        state: this._formState(),\n      });\n    }\n\n    return this.i18nHelper.resolveForm({\n      nameKey: 'changePasswordTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: this.t('changePasswordDescription'),\n          order: 0,\n          fields: [\n            {\n              type: InputType.PASSWORD,\n              name: 'currentPassword',\n              token: 'change-current-password',\n              labelKey: 'currentPassword',\n              hint: '',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: {\n                required: 'currentPasswordRequired',\n              },\n              validators: [Validators.required],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n            this.newPasswordField(1),\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'change-submit',\n        textKey: 'changePasswordSubmit',\n      },\n      state: this._formState(),\n    });\n  });\n\n  /** Campo \"nueva contraseña\" — compartido por ambos modos. */\n  private newPasswordField(order: number) {\n    return {\n      type: InputType.PASSWORD,\n      name: 'newPassword',\n      token: 'change-new-password',\n      labelKey: 'newPassword',\n      hintKey: 'newPasswordHint',\n      placeholderKey: 'passwordPlaceholder',\n      errorKeys: {\n        required: 'passwordRequired',\n        authPassword: 'passwordStrength',\n      },\n      validators: [Validators.required, authPasswordValidator()],\n      order,\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  /** Cierre iniciado por el user (X / backdrop). */\n  close(): void {\n    this.dismissed.emit();\n  }\n\n  /** Consulta si el user ya tiene contraseña para elegir el modo del modal. */\n  private resolveMode(): void {\n    this._mode.set('loading');\n    this._formState.set(ComponentStates.ENABLED);\n    this.auth.checkHasPassword().subscribe({\n      next: res => this._mode.set(res.hasPassword ? 'change' : 'set'),\n      // Fallback conservador: ante un fallo, asumir flujo de cambio normal.\n      error: () => this._mode.set('change'),\n    });\n  }\n\n  async submitHandler(event: FormSubmit): Promise<void> {\n    if (this._mode() === 'set') {\n      await this.handleSetPassword(event);\n      return;\n    }\n    this.handleChangePassword(event);\n  }\n\n  /** Flujo normal: el user tiene contraseña y la cambia. */\n  private handleChangePassword(event: FormSubmit): void {\n    const currentPassword = event.fields['currentPassword'];\n    const newPassword = event.fields['newPassword'];\n\n    if (!currentPassword || !newPassword) {\n      this.showToast(this.t('completeAllFields'));\n      return;\n    }\n\n    this._formState.set(ComponentStates.WORKING);\n\n    this.auth.changePassword(currentPassword, newPassword).subscribe({\n      next: () => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.t('passwordChangedSuccess'));\n        this.changed.emit();\n      },\n      error: err => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /**\n   * Flujo OAuth-only: el user no tiene contraseña. Antes de crearla pide\n   * confirmación explícita — es un cambio de cuenta, aunque aditivo (conserva\n   * el acceso social).\n   */\n  private async handleSetPassword(event: FormSubmit): Promise<void> {\n    const newPassword = event.fields['newPassword'];\n\n    if (!newPassword) {\n      this.showToast(this.t('completeAllFields'));\n      return;\n    }\n\n    const result = await this.confirmDialog.confirm({\n      title: this.t('setPasswordConfirmTitle'),\n      message: this.t('setPasswordConfirmMessage'),\n      confirmButton: { text: this.t('setPasswordConfirmOk'), role: 'confirm' },\n      cancelButton: { text: this.t('setPasswordConfirmCancel'), role: 'cancel' },\n    });\n    if (!result.confirmed) {\n      return;\n    }\n\n    this._formState.set(ComponentStates.WORKING);\n\n    this.auth.setPasswordForOAuthUser(newPassword).subscribe({\n      next: () => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.t('passwordSetSuccess'));\n        this.changed.emit();\n      },\n      error: err => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Mapea los códigos de error del backend a mensajes del namespace `_auth`. */\n  private resolveError(err: unknown): string {\n    const code = (err as { code?: string })?.code;\n    switch (code) {\n      case 'AUTHV2_INVALID_CURRENT_PASSWORD':\n        return this.t('errorCurrentPasswordWrong');\n      case 'AUTHV2_SAME_PASSWORD':\n        return this.t('errorSamePassword');\n      case 'AUTHV2_PASSWORD_ALREADY_SET':\n        return this.t('errorPasswordAlreadySet');\n      case 'VALIDATION_MISSING_REQUIRED_FIELDS':\n        return this.t('errorPasswordTooWeak');\n      default:\n        return this.t('errorGeneric');\n    }\n  }\n\n  private showToast(message: string): void {\n    this.toast.show({ message, duration: 3500 });\n  }\n}\n","<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (mode() === 'loading') {\n        <div class=\"modal-loading\">\n          <ion-spinner name=\"crescent\"></ion-spinner>\n        </div>\n        } @else {\n        <val-form [props]=\"formProps()\" (onSubmit)=\"submitHandler($event)\" />\n        }\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n","import { Component, computed, EventEmitter, inject, Input, Output, signal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonModal,\n  IonSpinner,\n  IonToolbar,\n} from '@ionic/angular/standalone';\n\nimport { SolidDefaultBlock } from '../../atoms/button/factory';\nimport { ComponentState, ComponentStates, FormMetadata, FormSubmit, InputType } from '../../types';\nimport { FormComponent } from '../form/form.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { AuthService } from '../../../services/auth';\nimport { I18nService, InputI18nHelper } from '../../../services/i18n';\nimport { ToastService } from '../../../services/toast.service';\n\ntype EmailModalStep = 'loading' | 'no-password' | 'step1' | 'step2' | 'step3';\n\n/**\n * `val-change-email-modal` — modal de cambio de email en 3 pasos.\n *\n * Paso 1: contraseña actual + nuevo email → `initiateEmailChange()`\n * Paso 2: código enviado al email actual → `confirmEmailChangeStep1()`\n * Paso 3: código enviado al nuevo email → `confirmEmailChangeStep2()`\n *\n * Si el user no tiene contraseña (cuenta OAuth-only), muestra aviso.\n *\n * @example\n * ```html\n * <val-change-email-modal\n *   [isOpen]=\"isEmailModalOpen()\"\n *   (changed)=\"isEmailModalOpen.set(false)\"\n *   (dismissed)=\"isEmailModalOpen.set(false)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-change-email-modal',\n  standalone: true,\n  imports: [\n    IonButton,\n    IonButtons,\n    IonContent,\n    IonHeader,\n    IonModal,\n    IonSpinner,\n    IonToolbar,\n    FormComponent,\n    DisplayComponent,\n    TextComponent,\n    TitleComponent,\n  ],\n  templateUrl: './change-email-modal.component.html',\n  styleUrls: ['./change-email-modal.component.scss'],\n})\nexport class ChangeEmailModalComponent {\n  private _isOpen = false;\n\n  @Input()\n  set isOpen(value: boolean) {\n    const opening = value && !this._isOpen;\n    this._isOpen = value;\n    if (opening) {\n      this.resolveMode();\n    }\n  }\n  get isOpen(): boolean {\n    return this._isOpen;\n  }\n\n  /** Emite al completar el cambio de email con éxito. El padre cierra el modal. */\n  @Output() changed = new EventEmitter<void>();\n\n  /** Emite cuando el user cierra el modal. */\n  @Output() dismissed = new EventEmitter<void>();\n\n  private auth = inject(AuthService);\n  private toast = inject(ToastService);\n  private i18n = inject(I18nService);\n  private i18nHelper = inject(InputI18nHelper);\n\n  readonly _step = signal<EmailModalStep>('loading');\n  readonly _pendingEmail = signal('');\n  private readonly _formState = signal<ComponentState>(ComponentStates.ENABLED);\n\n  t(key: string): string {\n    return this.i18n.t(key, '_auth');\n  }\n\n  readonly noPasswordTitle = computed(() => this.t('changeEmailNoPasswordTitle'));\n  readonly noPasswordHint = computed(() => this.t('changeEmailNoPasswordHint'));\n\n  readonly step1Props = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'changeEmailTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: this.t('changeEmailStep1Description'),\n          order: 0,\n          fields: [\n            {\n              type: InputType.PASSWORD,\n              name: 'currentPassword',\n              token: 'change-email-password',\n              labelKey: 'currentPassword',\n              hint: '',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: { required: 'currentPasswordRequired' },\n              validators: [Validators.required],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n            {\n              type: InputType.EMAIL,\n              name: 'newEmail',\n              token: 'change-email-new',\n              labelKey: 'changeEmailNewEmail',\n              hint: '',\n              placeholderKey: 'emailPlaceholder',\n              errorKeys: {\n                required: 'emailRequired',\n                email: 'changeEmailNewEmailInvalid',\n              },\n              validators: [Validators.required, Validators.email],\n              order: 1,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'change-email-initiate',\n        textKey: 'changeEmailInitiate',\n      },\n      state: this._formState(),\n    })\n  );\n\n  readonly step2Props = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'changeEmailStep2Title',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: this.t('changeEmailStep2Description'),\n          order: 0,\n          fields: [\n            {\n              type: InputType.PIN_CODE,\n              name: 'code',\n              token: 'change-email-code-current',\n              labelKey: 'changeEmailCodeCurrent',\n              hint: '',\n              placeholderKey: '',\n              errorKeys: { required: 'mfaCodeInvalid' },\n              validators: [Validators.required],\n              order: 0,\n              state: ComponentStates.ENABLED,\n              length: 6,\n              allowNumbersOnly: true,\n              autoFocus: true,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'change-email-confirm-1',\n        textKey: 'changeEmailConfirm1',\n      },\n      state: this._formState(),\n    })\n  );\n\n  readonly step3Props = computed<FormMetadata>(() => {\n    const email = this._pendingEmail();\n    const desc = this.t('changeEmailStep3Description').replace('{email}', email);\n    return this.i18nHelper.resolveForm({\n      nameKey: 'changeEmailStep3Title',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: desc,\n          order: 0,\n          fields: [\n            {\n              type: InputType.PIN_CODE,\n              name: 'code',\n              token: 'change-email-code-new',\n              labelKey: 'changeEmailCodeNew',\n              hint: '',\n              placeholderKey: '',\n              errorKeys: { required: 'mfaCodeInvalid' },\n              validators: [Validators.required],\n              order: 0,\n              state: ComponentStates.ENABLED,\n              length: 6,\n              allowNumbersOnly: true,\n              autoFocus: true,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'change-email-confirm-2',\n        textKey: 'changeEmailConfirm2',\n      },\n      state: this._formState(),\n    });\n  });\n\n  close(): void {\n    this.dismissed.emit();\n  }\n\n  private resolveMode(): void {\n    this._step.set('loading');\n    this._formState.set(ComponentStates.ENABLED);\n    this._pendingEmail.set('');\n    this.auth.checkHasPassword().subscribe({\n      next: res => this._step.set(res.hasPassword ? 'step1' : 'no-password'),\n      error: () => this._step.set('step1'),\n    });\n  }\n\n  handleStep1(event: FormSubmit): void {\n    const currentPassword = event.fields['currentPassword'];\n    const newEmail = event.fields['newEmail'];\n    if (!currentPassword || !newEmail) {\n      this.showToast(this.t('completeAllFields'));\n      return;\n    }\n    this._formState.set(ComponentStates.WORKING);\n    this.auth.initiateEmailChange(currentPassword, newEmail).subscribe({\n      next: res => {\n        this._formState.set(ComponentStates.ENABLED);\n        this._pendingEmail.set(res.pendingEmail);\n        this._step.set('step2');\n      },\n      error: err => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  handleStep2(event: FormSubmit): void {\n    const code = event.fields['code'];\n    if (!code) {\n      this.showToast(this.t('mfaCodeInvalid'));\n      return;\n    }\n    this._formState.set(ComponentStates.WORKING);\n    this.auth.confirmEmailChangeStep1(code).subscribe({\n      next: () => {\n        this._formState.set(ComponentStates.ENABLED);\n        this._step.set('step3');\n      },\n      error: err => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  handleStep3(event: FormSubmit): void {\n    const code = event.fields['code'];\n    if (!code) {\n      this.showToast(this.t('mfaCodeInvalid'));\n      return;\n    }\n    this._formState.set(ComponentStates.WORKING);\n    this.auth.confirmEmailChangeStep2(code).subscribe({\n      next: () => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.t('changeEmailSuccess'));\n        this.changed.emit();\n      },\n      error: err => {\n        this._formState.set(ComponentStates.ENABLED);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  private resolveError(err: unknown): string {\n    const code = (err as { code?: string })?.code;\n    switch (code) {\n      case 'AUTHV2_INVALID_CURRENT_PASSWORD':\n        return this.t('errorCurrentPasswordWrong');\n      case 'AUTHV2_EMAIL_SAME_AS_CURRENT':\n        return this.t('errorEmailSameAsCurrent');\n      case 'AUTHV2_EMAIL_EXISTS':\n        return this.t('errorEmailAlreadyInUse');\n      case 'AUTHV2_EMAIL_CHANGE_PENDING_EXPIRED':\n        return this.t('errorEmailChangePendingExpired');\n      case 'AUTHV2_INVALID_CODE':\n        return this.t('errorInvalidCode');\n      case 'AUTHV2_EXPIRED_CODE':\n        return this.t('errorExpiredCode');\n      case 'AUTHV2_TOO_MANY_ATTEMPTS':\n        return this.t('errorTooManyAttempts');\n      default:\n        return this.t('errorGeneric');\n    }\n  }\n\n  private showToast(message: string): void {\n    this.toast.show({ message, duration: 3500 });\n  }\n}\n","<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (_step() === 'loading') {\n        <div class=\"modal-loading\">\n          <ion-spinner name=\"crescent\"></ion-spinner>\n        </div>\n        } @else if (_step() === 'no-password') {\n        <val-display [props]=\"{ content: noPasswordTitle(), size: 'small', color: 'dark' }\" />\n        <val-title [props]=\"{ content: noPasswordHint(), size: 'large', color: 'dark', bold: false }\" />\n        <ion-button expand=\"block\" fill=\"solid\" color=\"dark\" (click)=\"close()\">\n          <strong>{{ t('close') }}</strong>\n        </ion-button>\n        } @else if (_step() === 'step1') {\n        <val-form [props]=\"step1Props()\" (onSubmit)=\"handleStep1($event)\" />\n        } @else if (_step() === 'step2') {\n        <val-form [props]=\"step2Props()\" (onSubmit)=\"handleStep2($event)\" />\n        } @else if (_step() === 'step3') {\n        <val-form [props]=\"step3Props()\" (onSubmit)=\"handleStep3($event)\" />\n        }\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n","import { SharePlatform } from '../../molecules/share-buttons/types';\nimport { QrDisplayTheme } from '../../atoms/qr-code/types';\n\n/**\n * Metadata for val-share-profile-modal.\n *\n * Reusable modal to share a profile (or any entity) via QR + URL: avatar,\n * name, a QR code encoding the URL, an optional caption and share buttons\n * (copy link / native / social).\n *\n * Content-driven: `name` + `url` are required; the rest is optional. Static\n * chrome text (caption, button hints) auto-registra defaults i18n\n * (namespace `ShareProfileModal`) — override pasando los campos directos.\n */\nexport interface ShareProfileModalMetadata {\n  /** Display name shown under the avatar (and default modal title) */\n  name: string;\n  /** URL encoded in the QR and shared by the buttons */\n  url: string;\n\n  /** Avatar image URL (falls back to initials of `name`) */\n  avatarUrl?: string;\n  /** Email — used for the avatar initials/color when no avatarUrl */\n  email?: string;\n  /** Handle shown as @handle below the name */\n  handle?: string;\n\n  /** Modal title (val-display). Default: `name` */\n  title?: string;\n  /** Caption under the QR. Default: i18n `ShareProfileModal.caption` */\n  caption?: string;\n\n  /** Title used by the native share sheet. Default: `name` */\n  shareTitle?: string;\n  /** Text used by the native share sheet / social messages */\n  shareText?: string;\n\n  /** Platforms shown in the share buttons. Default: ['copy', 'native', 'whatsapp'] */\n  platforms?: SharePlatform[];\n\n  /** QR visual theme. Default: 'default' */\n  qrTheme?: QrDisplayTheme;\n  /** QR size in pixels. Default: 220 */\n  qrSize?: number;\n\n  /** Modal corner rounding in px. Default: 24 */\n  borderRadius?: number;\n  /** Close button label. Default: i18n `_global.close` */\n  closeLabel?: string;\n}\n\n/**\n * Default values for ShareProfileModalMetadata.\n */\nexport const SHARE_PROFILE_MODAL_DEFAULTS: Required<\n  Pick<ShareProfileModalMetadata, 'platforms' | 'qrTheme' | 'qrSize'>\n> = {\n  platforms: ['copy', 'native', 'whatsapp'],\n  qrTheme: 'default',\n  qrSize: 220,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, Input, Output, signal } from '@angular/core';\nimport { IonModal, IonSpinner } from '@ionic/angular/standalone';\n\nimport { ModalShellComponent } from '../../molecules/modal-shell/modal-shell.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { UserAvatarComponent } from '../../atoms/user-avatar/user-avatar.component';\nimport { QrCodeComponent } from '../../atoms/qr-code/qr-code.component';\nimport { ShareButtonsComponent } from '../../molecules/share-buttons/share-buttons.component';\nimport { QrGeneratorService } from '../../../services/qr-generator/qr-generator.service';\nimport { QrResult } from '../../../services/qr-generator/types';\nimport { ShareEvent } from '../../molecules/share-buttons/types';\nimport { I18nService } from '../../../services/i18n';\nimport { ShareProfileModalMetadata, SHARE_PROFILE_MODAL_DEFAULTS } from './types';\n\n/**\n * Defaults i18n (es/en). Auto-registrados en el constructor si el consumer no\n * proveyó el namespace `ShareProfileModal`. Garantiza que nunca haya una key\n * faltante (ver nota en valtech-components/CLAUDE.md sobre el storm de CD).\n */\nconst SHARE_PROFILE_MODAL_I18N = {\n  es: {\n    title: 'Compartir perfil',\n    caption: 'Escanea el código QR para añadirme como contacto',\n  },\n  en: {\n    title: 'Share profile',\n    caption: 'Scan the QR code to add me as a contact',\n  },\n};\n\n/**\n * `val-share-profile-modal` — modal reutilizable para compartir un perfil (o\n * cualquier entidad) vía QR + URL. Sigue la Regla #5 (header canónico vía\n * `val-modal-shell`).\n *\n * Self-contained: genera el QR con `QrGeneratorService` a partir de `url` al\n * abrirse. El padre solo controla `[isOpen]` y reacciona a `(dismissed)`.\n *\n * @example\n * ```html\n * <val-share-profile-modal\n *   [isOpen]=\"isOpen()\"\n *   [props]=\"{ name: 'Víctor Valenzuela', url: 'https://app.myvaltech.com/u/victor', avatarUrl: '/me.jpg' }\"\n *   (dismissed)=\"isOpen.set(false)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-share-profile-modal',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonModal,\n    IonSpinner,\n    ModalShellComponent,\n    DisplayComponent,\n    UserAvatarComponent,\n    QrCodeComponent,\n    ShareButtonsComponent,\n  ],\n  template: `\n    <ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n      <ng-template>\n        <val-modal-shell [title]=\"''\" [closeLabel]=\"config().closeLabel || ''\" (close)=\"close()\">\n          <div class=\"share-profile\">\n            <val-user-avatar\n              [props]=\"{ name: config().name, avatarUrl: config().avatarUrl, email: config().email, size: 'xlarge' }\"\n            />\n            <val-display [props]=\"{ content: displayName(), size: 'small', color: 'dark' }\" />\n            @if (config().handle) {\n              <p class=\"share-profile__handle\">{{ '@' + config().handle }}</p>\n            }\n\n            <div class=\"share-profile__qr\">\n              @if (qr(); as qrResult) {\n                <val-qr-code\n                  [props]=\"{\n                    qr: qrResult,\n                    theme: config().qrTheme,\n                    displaySize: config().qrSize,\n                    alt: config().name,\n                  }\"\n                />\n              } @else if (qrError()) {\n                <p class=\"share-profile__qr-error\">{{ config().url }}</p>\n              } @else {\n                <div class=\"share-profile__qr-loading\" [style.height.px]=\"config().qrSize\">\n                  <ion-spinner name=\"crescent\"></ion-spinner>\n                </div>\n              }\n            </div>\n\n            <p class=\"share-profile__caption\">{{ caption() }}</p>\n\n            <val-share-buttons\n              [props]=\"{\n                shareData: { title: config().shareTitle || config().name, text: config().shareText, url: config().url },\n                platforms: config().platforms,\n                layout: 'horizontal',\n                variant: 'outline',\n                color: 'dark',\n                usePlatformColors: false,\n              }\"\n              (shareComplete)=\"shared.emit($event)\"\n            />\n          </div>\n        </val-modal-shell>\n      </ng-template>\n    </ion-modal>\n  `,\n  styleUrls: ['./share-profile-modal.component.scss'],\n})\nexport class ShareProfileModalComponent {\n  private qrGenerator = inject(QrGeneratorService);\n  private i18n = inject(I18nService);\n\n  private _isOpen = false;\n\n  /** Controla la visibilidad. Al pasar de cerrado a abierto genera el QR. */\n  @Input()\n  set isOpen(value: boolean) {\n    const opening = value && !this._isOpen;\n    this._isOpen = value;\n    if (opening) {\n      this.generateQr();\n    }\n  }\n  get isOpen(): boolean {\n    return this._isOpen;\n  }\n\n  /** Configuración del modal. */\n  @Input() props: Partial<ShareProfileModalMetadata> = {};\n\n  /** Emite cuando el user cierra el modal (botón Cerrar o backdrop). */\n  @Output() dismissed = new EventEmitter<void>();\n  /** Emite al completar una acción de compartir. */\n  @Output() shared = new EventEmitter<ShareEvent>();\n\n  private readonly _qr = signal<QrResult | null>(null);\n  readonly qr = this._qr.asReadonly();\n\n  private readonly _qrError = signal(false);\n  readonly qrError = this._qrError.asReadonly();\n\n  config = computed(\n    () =>\n      ({\n        ...SHARE_PROFILE_MODAL_DEFAULTS,\n        ...this.props,\n      }) as ShareProfileModalMetadata & typeof SHARE_PROFILE_MODAL_DEFAULTS\n  );\n\n  displayName = computed(() => this.config().title || this.config().name || this.t('title'));\n  caption = computed(() => this.config().caption || this.t('caption'));\n\n  constructor() {\n    if (!this.i18n.hasNamespace('ShareProfileModal')) {\n      this.i18n.registerContent('ShareProfileModal', SHARE_PROFILE_MODAL_I18N);\n    }\n  }\n\n  private t(key: string): string {\n    this.i18n.lang();\n    return this.i18n.t(key, 'ShareProfileModal');\n  }\n\n  private async generateQr(): Promise<void> {\n    const url = this.config().url;\n    if (!url) return;\n    this._qr.set(null);\n    this._qrError.set(false);\n    try {\n      // Formato SVG: lo genera qr-code-styling sin canvas.toBlob (que cuelga en\n      // algunos contextos de bundler/Storybook). Renderiza igual de nítido.\n      const result = await this.qrGenerator.generate({ data: url, width: this.config().qrSize, format: 'svg' });\n      this._qr.set(result);\n    } catch {\n      // QR opcional — si falla, mostramos la URL como fallback (no spinner eterno).\n      this._qr.set(null);\n      this._qrError.set(true);\n    }\n  }\n\n  close(): void {\n    this._isOpen = false;\n    this.dismissed.emit();\n  }\n}\n","import { ButtonGroupMetadata } from '../../molecules/button-group/types';\n\n/**\n * Metadata for val-fun-modal.\n *\n * Modal moderno tipo promo/onboarding: imagen o ilustración arriba, título,\n * cuerpo y botones de acción, con redondeo personalizable. Sigue la Regla #5\n * (header canónico vía `val-modal-shell`).\n *\n * Content-driven — pasar strings ya resueltos. Botones reusan\n * `ButtonGroupMetadata`.\n */\nexport interface FunModalMetadata {\n  /** Imagen / ilustración mostrada arriba del título */\n  image?: string;\n  /** Alt de la imagen */\n  imageAlt?: string;\n  /** Emoji decorativo (alternativa a la imagen) */\n  emoji?: string;\n\n  /** Título principal (val-display) */\n  title: string;\n  /** Cuerpo / subtítulo (val-title) */\n  subtitle?: string;\n\n  /** Botones de acción (reusa val-button-group) */\n  actions?: ButtonGroupMetadata;\n\n  /** Redondeo del modal en px. Default: 28 */\n  borderRadius?: number;\n  /** Redondeo de la imagen en px. Default: 16 */\n  imageRadius?: number;\n  /** Color de fondo del modal (Ionic color o CSS). Default: surface */\n  backgroundColor?: string;\n  /** Label del botón de cierre. Default: i18n `_global.close` */\n  closeLabel?: string;\n}\n\n/**\n * Default values for FunModalMetadata.\n */\nexport const FUN_MODAL_DEFAULTS: Required<Pick<FunModalMetadata, 'borderRadius' | 'imageRadius'>> =\n  {\n    borderRadius: 28,\n    imageRadius: 16,\n  };\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, Input, Output } from '@angular/core';\nimport { IonModal } from '@ionic/angular/standalone';\n\nimport { ModalShellComponent } from '../../molecules/modal-shell/modal-shell.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ButtonGroupComponent } from '../../molecules/button-group/button-group.component';\nimport { FunModalMetadata, FUN_MODAL_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * `val-fun-modal` — modal moderno tipo promo/onboarding: imagen o ilustración\n * arriba, título, cuerpo y botones de acción, con redondeo personalizable.\n * Sigue la Regla #5 (header canónico vía `val-modal-shell`).\n *\n * El padre controla `[isOpen]` y reacciona a `(dismissed)` / `(action)`.\n *\n * @example\n * ```html\n * <val-fun-modal\n *   [isOpen]=\"isOpen()\"\n *   [props]=\"{\n *     image: '/promo.png',\n *     title: '¿Cómo se conecta Lucas con los Salmos?',\n *     subtitle: 'Pulsa la referencia cruzada para descubrirlo.',\n *     actions: { position: 'center', columned: false, buttons: [\n *       { text: 'Probar ahora', color: 'primary', shape: 'round', type: 'button', state: 'ENABLED', token: 'try' }\n *     ] }\n *   }\"\n *   (action)=\"onAction($event)\"\n *   (dismissed)=\"isOpen.set(false)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-fun-modal',\n  standalone: true,\n  imports: [CommonModule, IonModal, ModalShellComponent, DisplayComponent, TitleComponent, ButtonGroupComponent],\n  template: `\n    <ion-modal [isOpen]=\"isOpen\" [style.--border-radius.px]=\"config().borderRadius\" (didDismiss)=\"close()\">\n      <ng-template>\n        <val-modal-shell [title]=\"''\" [closeLabel]=\"config().closeLabel || ''\" (close)=\"close()\">\n          <div class=\"fun-modal\" [style.background]=\"getBackground()\">\n            @if (config().image) {\n              <div class=\"fun-modal__media\" [style.border-radius.px]=\"config().imageRadius\">\n                <img [src]=\"config().image\" [alt]=\"config().imageAlt || config().title\" />\n              </div>\n            } @else if (config().emoji) {\n              <div class=\"fun-modal__emoji\">{{ config().emoji }}</div>\n            }\n\n            <val-display [props]=\"{ content: config().title, size: 'small', color: 'dark' }\" />\n            @if (config().subtitle) {\n              <val-title [props]=\"{ content: config().subtitle, size: 'large', color: '', bold: false }\" />\n            }\n\n            @if (config().actions; as actions) {\n              <div class=\"fun-modal__actions\">\n                <val-button-group [props]=\"actions\" (onClick)=\"action.emit($event)\"></val-button-group>\n              </div>\n            }\n          </div>\n        </val-modal-shell>\n      </ng-template>\n    </ion-modal>\n  `,\n  styleUrls: ['./fun-modal.component.scss'],\n})\nexport class FunModalComponent {\n  private _isOpen = false;\n\n  /** Controla la visibilidad del modal. */\n  @Input()\n  set isOpen(value: boolean) {\n    this._isOpen = value;\n  }\n  get isOpen(): boolean {\n    return this._isOpen;\n  }\n\n  /** Configuración del modal. */\n  @Input() props: Partial<FunModalMetadata> = {};\n\n  /** Emite cuando el user cierra el modal (botón Cerrar o backdrop). */\n  @Output() dismissed = new EventEmitter<void>();\n  /** Emite con el token del botón de acción presionado. */\n  @Output() action = new EventEmitter<string>();\n\n  config = computed(\n    () =>\n      ({\n        ...FUN_MODAL_DEFAULTS,\n        ...this.props,\n      }) as FunModalMetadata & typeof FUN_MODAL_DEFAULTS\n  );\n\n  getBackground(): string | null {\n    const color = this.config().backgroundColor;\n    if (!color) return null;\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n\n  close(): void {\n    this._isOpen = false;\n    this.dismissed.emit();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { closeOutline } from 'ionicons/icons';\nimport { CookieBannerMetadata } from './types';\n\n/**\n * `val-cookie-banner` — bottom/top fixed banner asking the user to choose\n * a cookie consent option. Presentational only: emits events on each\n * action, the parent decides what to do (typically wiring to\n * `AnalyticsService` from `valtech-components`).\n *\n * @example\n * <val-cookie-banner\n *   [props]=\"bannerProps()\"\n *   (accept)=\"onAccept()\"\n *   (reject)=\"onReject()\"\n *   (customize)=\"onCustomize()\"\n *   (dismiss)=\"onDismiss()\"\n * />\n *\n * Wire `props.visible` to `analytics.consentState().hasDecided === false`\n * so the banner auto-hides once the user makes a choice.\n */\n@Component({\n  selector: 'val-cookie-banner',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonButton, IonIcon],\n  template: `\n    @if (props?.visible) {\n      <div\n        class=\"val-cookie-banner\"\n        [class.val-cookie-banner--top]=\"props.position === 'top'\"\n        [class.val-cookie-banner--bottom]=\"props.position !== 'top'\"\n        [class.val-cookie-banner--translucent]=\"props.translucent\"\n        role=\"dialog\"\n        aria-modal=\"false\"\n        aria-live=\"polite\"\n      >\n        <div class=\"val-cookie-banner__inner\" [style.max-width]=\"props.maxWidth || '1200px'\">\n          @if (props.dismissible) {\n            <button\n              type=\"button\"\n              class=\"val-cookie-banner__dismiss\"\n              [attr.aria-label]=\"'dismiss'\"\n              (click)=\"dismiss.emit()\"\n            >\n              <ion-icon name=\"close-outline\"></ion-icon>\n            </button>\n          }\n\n          <div class=\"val-cookie-banner__copy\">\n            @if (props.title) {\n              <h3 class=\"val-cookie-banner__title\">{{ props.title }}</h3>\n            }\n            <p class=\"val-cookie-banner__message\">\n              {{ props.message }}\n              @if (props.policyLinkText && props.policyHref) {\n                <a class=\"val-cookie-banner__policy\" [href]=\"props.policyHref\" target=\"_blank\" rel=\"noopener\">\n                  {{ props.policyLinkText }}\n                </a>\n              }\n            </p>\n          </div>\n\n          <div class=\"val-cookie-banner__actions\">\n            <ion-button fill=\"clear\" size=\"small\" [color]=\"props.rejectColor || 'dark'\" (click)=\"reject.emit()\">\n              {{ props.rejectText }}\n            </ion-button>\n\n            @if (props.customizeText) {\n              @if (props.customizeRouterLink) {\n                <ion-button\n                  fill=\"outline\"\n                  size=\"small\"\n                  [color]=\"props.customizeColor || 'dark'\"\n                  [routerLink]=\"props.customizeRouterLink\"\n                  (click)=\"customize.emit()\"\n                >\n                  {{ props.customizeText }}\n                </ion-button>\n              } @else {\n                <ion-button\n                  fill=\"outline\"\n                  size=\"small\"\n                  [color]=\"props.customizeColor || 'dark'\"\n                  (click)=\"customize.emit()\"\n                >\n                  {{ props.customizeText }}\n                </ion-button>\n              }\n            }\n\n            <ion-button fill=\"solid\" size=\"small\" [color]=\"props.acceptColor || 'primary'\" (click)=\"accept.emit()\">\n              {{ props.acceptText }}\n            </ion-button>\n          </div>\n        </div>\n      </div>\n    }\n  `,\n  styleUrls: ['./cookie-banner.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CookieBannerComponent {\n  /** Banner configuration object. */\n  @Input() props!: CookieBannerMetadata;\n\n  /** Fired when the user clicks the primary \"accept\" button. */\n  @Output() accept = new EventEmitter<void>();\n  /** Fired when the user clicks the secondary \"reject\" button. */\n  @Output() reject = new EventEmitter<void>();\n  /** Fired when the user clicks the tertiary \"customize/configure\" button. */\n  @Output() customize = new EventEmitter<void>();\n  /** Fired when the user clicks the dismiss (X) icon. */\n  @Output() dismiss = new EventEmitter<void>();\n\n  constructor() {\n    addIcons({ closeOutline });\n  }\n}\n","/**\n * DebugConsole Types\n *\n * Tipos para el overlay de logs en pantalla (`val-debug-console`).\n */\n\n/**\n * Configuración del proveedor de DebugConsole.\n *\n * @property enabled - Gate maestro. Cuando es `false` el componente NO parchea\n *   `console` y NO renderiza nada. La app decide el valor — normalmente\n *   `!environment.production`. Sin provider, el default es `false`.\n */\nexport interface DebugConsoleConfig {\n  enabled?: boolean;\n}\n\n/**\n * Configuración por defecto: deshabilitado (inerte).\n */\nexport const DEFAULT_DEBUG_CONSOLE_CONFIG: Required<DebugConsoleConfig> = {\n  enabled: false,\n};\n\n/** Nivel de log capturado. */\nexport type DebugLogLevel = 'log' | 'warn' | 'error' | 'info';\n\n/** Entrada del buffer de logs. */\nexport interface DebugLogEntry {\n  ts: string;\n  level: DebugLogLevel;\n  text: string;\n}\n","/**\n * DebugConsole Provider\n *\n * Provider e injection token para el overlay de logs `val-debug-console`.\n */\n\nimport { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nimport { DebugConsoleConfig, DEFAULT_DEBUG_CONSOLE_CONFIG } from './types';\n\n/**\n * Token de inyección para la configuración de DebugConsole.\n */\nexport const VALTECH_DEBUG_CONSOLE = new InjectionToken<Required<DebugConsoleConfig>>(\n  'ValtechDebugConsole'\n);\n\n/**\n * Provee el overlay de logs `val-debug-console` a la aplicación Angular.\n *\n * El componente parchea `console.*` para espejar cada llamada a un panel en\n * pantalla — útil para leer logs en un PWA iOS añadido al home screen, donde\n * la consola del navegador no es accesible.\n *\n * El gate `enabled` lo decide la app (la lib no puede importar su\n * `environment`). Sin provider, el componente queda inerte (`enabled: false`).\n *\n * @example\n * ```typescript\n * // main.ts\n * import { provideValtechDebugConsole } from 'valtech-components';\n * import { environment } from './environments/environment';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechDebugConsole({ enabled: !environment.production }),\n *   ],\n * });\n * ```\n *\n * Luego declarar `<val-debug-console />` una vez en el componente raíz.\n */\nexport function provideValtechDebugConsole(config: DebugConsoleConfig = {}): EnvironmentProviders {\n  const mergedConfig: Required<DebugConsoleConfig> = {\n    ...DEFAULT_DEBUG_CONSOLE_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([{ provide: VALTECH_DEBUG_CONSOLE, useValue: mergedConfig }]);\n}\n","import { ChangeDetectionStrategy, Component, inject, OnDestroy, OnInit, signal } from '@angular/core';\n\nimport { VALTECH_DEBUG_CONSOLE } from './config';\nimport { DebugLogEntry, DebugLogLevel } from './types';\n\n/**\n * `val-debug-console` — overlay de logs en pantalla para diagnóstico.\n *\n * Herramienta de desarrollo. Permite leer los `console.*` desde un PWA en iOS\n * añadido a la pantalla de inicio, donde la consola del navegador no es\n * accesible.\n *\n * Comportamiento:\n *  - Monkey-patch de `console.log/warn/error/info`: cada llamada también empuja\n *    una entrada al buffer (últimas ~150) además de llamar al `console` original.\n *  - Botón flotante (esquina) que abre/cierra un panel scrollable con las\n *    entradas más nuevas abajo, coloreadas por nivel.\n *  - Botones \"copiar\" (al portapapeles) y \"limpiar\".\n *\n * Gate maestro vía `provideValtechDebugConsole({ enabled })` en `main.ts`. Sin\n * provider — o con `enabled: false` — el componente NO parchea `console` y NO\n * renderiza nada. La app decide el valor (normalmente `!environment.production`).\n *\n * i18n: NO usa i18n a propósito — es un dev-tool que ningún end-user ve;\n * los labels van en español plano.\n *\n * @example\n * ```typescript\n * // main.ts\n * provideValtechDebugConsole({ enabled: !environment.production }),\n * ```\n * ```html\n * <!-- componente raíz, una sola vez -->\n * <val-debug-console />\n * ```\n */\n\n/** Máximo de entradas retenidas en el buffer. */\nconst MAX_ENTRIES = 150;\n\n/** Ventana de throttle del volcado al signal (ms). Acota la frecuencia de CD. */\nconst FLUSH_THROTTLE_MS = 250;\n\n@Component({\n  selector: 'val-debug-console',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    @if (enabled) {\n      <button\n        type=\"button\"\n        class=\"dbg-fab\"\n        (click)=\"toggle()\"\n        [attr.aria-label]=\"open() ? 'Cerrar consola' : 'Abrir consola'\"\n      >\n        {{ open() ? '×' : '‹/›' }}\n        @if (!open() && entries().length) {\n          <span class=\"dbg-fab__count\">{{ entries().length }}</span>\n        }\n      </button>\n\n      @if (open()) {\n        <div class=\"dbg-panel\" role=\"log\">\n          <div class=\"dbg-panel__bar\">\n            <span class=\"dbg-panel__title\"> Debug · {{ entries().length }} </span>\n            <span class=\"dbg-panel__actions\">\n              <button type=\"button\" (click)=\"copy()\">copiar</button>\n              <button type=\"button\" (click)=\"clear()\">limpiar</button>\n            </span>\n          </div>\n          <div class=\"dbg-panel__body\">\n            @for (e of entries(); track $index) {\n              <div class=\"dbg-line\" [class]=\"'dbg-line--' + e.level\">\n                <span class=\"dbg-line__ts\">{{ e.ts }}</span>\n                <span class=\"dbg-line__text\">{{ e.text }}</span>\n              </div>\n            } @empty {\n              <div class=\"dbg-empty\">Sin logs todavía.</div>\n            }\n          </div>\n        </div>\n      }\n    }\n  `,\n  styleUrls: ['./debug-console.component.scss'],\n})\nexport class DebugConsoleComponent implements OnInit, OnDestroy {\n  /** Gate maestro: `false` (sin provider o `enabled: false`) → todo inerte. */\n  readonly enabled = inject(VALTECH_DEBUG_CONSOLE, { optional: true })?.enabled ?? false;\n\n  readonly open = signal(false);\n  readonly entries = signal<DebugLogEntry[]>([]);\n\n  /**\n   * Buffer plano (NO signal). `console.log` puede invocarse dentro de un\n   * `effect()`/`computed()`; escribir el signal `entries` ahí mismo dispara\n   * NG0600. Acumulamos en este array y volcamos al signal en un microtask,\n   * fuera de todo contexto reactivo.\n   */\n  private buffer: DebugLogEntry[] = [];\n  private flushScheduled = false;\n\n  /** Referencias a los métodos originales para restaurarlos en destroy. */\n  private original: Partial<Record<DebugLogLevel, (...args: unknown[]) => void>> = {};\n\n  ngOnInit(): void {\n    if (!this.enabled) return;\n    this.patchConsole();\n  }\n\n  ngOnDestroy(): void {\n    if (!this.enabled) return;\n    this.restoreConsole();\n  }\n\n  toggle(): void {\n    this.open.update(v => !v);\n  }\n\n  clear(): void {\n    this.buffer = [];\n    this.entries.set([]);\n  }\n\n  async copy(): Promise<void> {\n    const text = this.entries()\n      .map(e => `${e.ts} [${e.level}] ${e.text}`)\n      .join('\\n');\n    try {\n      await navigator.clipboard.writeText(text);\n    } catch {\n      // Fallback para WebViews sin Clipboard API.\n      const ta = document.createElement('textarea');\n      ta.value = text;\n      ta.style.position = 'fixed';\n      ta.style.opacity = '0';\n      document.body.appendChild(ta);\n      ta.select();\n      try {\n        document.execCommand('copy');\n      } catch {\n        /* sin recurso de copia disponible */\n      }\n      document.body.removeChild(ta);\n    }\n  }\n\n  /** Reemplaza los métodos de `console` para espejar cada llamada al buffer. */\n  private patchConsole(): void {\n    const levels: DebugLogLevel[] = ['log', 'warn', 'error', 'info'];\n    for (const level of levels) {\n      const orig = console[level].bind(console) as (...a: unknown[]) => void;\n      this.original[level] = orig;\n      console[level] = (...args: unknown[]) => {\n        orig(...args);\n        this.push(level, args);\n      };\n    }\n  }\n\n  /** Restaura los métodos originales de `console`. */\n  private restoreConsole(): void {\n    for (const level of Object.keys(this.original) as DebugLogLevel[]) {\n      const orig = this.original[level];\n      if (orig) {\n        console[level] = orig;\n      }\n    }\n    this.original = {};\n  }\n\n  /**\n   * Agrega una entrada al buffer plano y programa el volcado al signal.\n   * El volcado se difiere a un microtask: `console.log` puede llamarse desde\n   * dentro de un `effect()`, y escribir un signal ahí lanzaría NG0600.\n   */\n  private push(level: DebugLogLevel, args: unknown[]): void {\n    const text = args.map(a => this.stringify(a)).join(' ');\n    const ts = new Date().toISOString().slice(11, 23);\n    this.buffer.push({ ts, level, text });\n    if (this.buffer.length > MAX_ENTRIES) {\n      this.buffer = this.buffer.slice(this.buffer.length - MAX_ENTRIES);\n    }\n    this.scheduleFlush();\n  }\n\n  /**\n   * Vuelca el buffer al signal `entries`, diferido y throttled.\n   *\n   * `entries.set()` dispara change-detection (el signal se lee en el template).\n   * Si algo emite `console.*` en cada CD (p.ej. un binding que loguea), un flush\n   * por microtask re-encola CD inmediatamente → loop infinito que congela el\n   * navegador. El throttle por tiempo acota el peor caso a ~1 CD/ventana en vez\n   * de 1 CD/microtask: el buffer absorbe todos los logs intermedios en una sola\n   * escritura. Sigue fuera del contexto reactivo del `console.log` (evita NG0600).\n   */\n  private scheduleFlush(): void {\n    if (this.flushScheduled) return;\n    this.flushScheduled = true;\n    setTimeout(() => {\n      this.flushScheduled = false;\n      this.entries.set([...this.buffer]);\n    }, FLUSH_THROTTLE_MS);\n  }\n\n  /** Convierte cualquier argumento a una representación legible de una línea. */\n  private stringify(value: unknown): string {\n    if (typeof value === 'string') return value;\n    if (value instanceof Error) return `${value.name}: ${value.message}`;\n    try {\n      return JSON.stringify(value);\n    } catch {\n      return String(value);\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, OnInit, Output } from '@angular/core';\nimport {\n  IonButton,\n  IonButtons,\n  IonIcon,\n  IonMenuButton,\n  IonText,\n  IonTitle,\n  IonToolbar,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronBackOutline } from 'ionicons/icons';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\nimport { IconService } from '../../../services/icons.service';\nimport { AvatarComponent } from '../../atoms/avatar/avatar.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { UserAvatarComponent } from '../../atoms/user-avatar/user-avatar.component';\nimport { LanguageSelectorComponent } from '../../molecules/language-selector/language-selector.component';\nimport { ToolbarAction, ToolbarActionType } from '../../types';\nimport { ToolbarMetadata } from './types';\n\n/**\n * ToolbarComponent\n *\n * Componente de barra de herramientas reutilizable para encabezados y pies de página.\n * Permite acciones, botón de retroceso, menú y personalización de colores y título.\n *\n * @example\n * <val-toolbar [props]=\"{ title: 'Mi App', withBack: true, actions: [...] }\" (onClick)=\"handleToolbarAction($event)\"></val-toolbar>\n *\n * @input props {ToolbarMetadata} - Metadatos de la barra de herramientas.\n * @output onClick - Emite el token de la acción clicada.\n */\n@Component({\n  selector: 'val-toolbar',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    IonIcon,\n    IonText,\n    IonTitle,\n    AvatarComponent,\n    ImageComponent,\n    UserAvatarComponent,\n    IonMenuButton,\n    LanguageSelectorComponent,\n  ],\n  template: `\n    <ion-toolbar [color]=\"props.color\" [class.background]=\"props.color === 'background'\">\n      <ng-container *ngIf=\"props.withBack\">\n        <ion-buttons class=\"left-buttons\" slot=\"start\" *ngIf=\"props.withBack\">\n          <ion-button fill=\"clear\" (click)=\"goBack()\" [color]=\"props.textColor\" style=\"margin-left: 8px;\">\n            <ion-icon name=\"chevron-back-outline\" [slot]=\"props.backText ? 'start' : 'icon-only'\"></ion-icon>\n            <ion-text *ngIf=\"props.backText\">{{ props.backText }}</ion-text>\n          </ion-button>\n        </ion-buttons>\n      </ng-container>\n      <ng-container *ngIf=\"props.withActions\">\n        <ion-buttons slot=\"end\" *ngIf=\"someInRight() || props.withMenu || props.languageSelector\">\n          <ng-container *ngFor=\"let action of rightActions()\">\n            <ion-button *ngIf=\"action.type === actionTypes.ICON\" (click)=\"clickHandler(action.token)\">\n              <ion-icon slot=\"icon-only\" [name]=\"action.description\" [color]=\"props.textColor\"></ion-icon>\n            </ion-button>\n            <val-user-avatar\n              *ngIf=\"action.type === actionTypes.AVATAR\"\n              [props]=\"{\n                user: action.user,\n                avatarUrl: action.description,\n                size: action.avatarSize ?? 'small',\n              }\"\n              (onClick)=\"clickHandler(action.token)\"\n            ></val-user-avatar>\n            <val-image\n              *ngIf=\"action.type === actionTypes.IMAGE\"\n              [props]=\"action.image\"\n              (click)=\"clickHandler(action.token)\"\n            ></val-image>\n            <ion-button\n              [color]=\"props.textColor\"\n              *ngIf=\"action.type === actionTypes.BUTTON\"\n              (click)=\"clickHandler(action.token)\"\n              >{{ action.description }}</ion-button\n            >\n          </ng-container>\n          @if (props.languageSelector) {\n            <val-language-selector [props]=\"languageSelectorProps\"></val-language-selector>\n          }\n          @if (props.withMenu) {\n            <ion-menu-button color=\"dark\"></ion-menu-button>\n          }\n        </ion-buttons>\n        <ion-buttons slot=\"start\" *ngIf=\"someInLeft()\" style=\"padding-left: 4px;\">\n          <ng-container *ngFor=\"let action of leftActions()\">\n            <ion-button *ngIf=\"action.type === actionTypes.ICON\" (click)=\"clickHandler(action.token)\">\n              <ion-icon slot=\"icon-only\" [name]=\"action.description\" [color]=\"props.textColor\"></ion-icon>\n            </ion-button>\n            <val-user-avatar\n              *ngIf=\"action.type === actionTypes.AVATAR\"\n              [props]=\"{\n                user: action.user,\n                avatarUrl: action.description,\n                size: action.avatarSize ?? 'small',\n              }\"\n              (onClick)=\"clickHandler(action.token)\"\n            ></val-user-avatar>\n            <val-image\n              *ngIf=\"action.type === actionTypes.IMAGE\"\n              [props]=\"action.image\"\n              (click)=\"clickHandler(action.token)\"\n            ></val-image>\n            <ion-button *ngIf=\"action.type === actionTypes.BUTTON\" (click)=\"clickHandler(action.token)\">{{\n              action.description\n            }}</ion-button>\n          </ng-container>\n        </ion-buttons>\n      </ng-container>\n      <ion-title *ngIf=\"props.title\" [color]=\"props.textColor\">{{ props.title }}</ion-title>\n      <!-- experimental -->\n      <ng-content select=\"[toolbar-bottom]\"></ng-content>\n    </ion-toolbar>\n  `,\n  styleUrls: ['./toolbar.component.scss'],\n})\nexport class ToolbarComponent implements OnInit {\n  /**\n   * Metadatos de la barra de herramientas.\n   */\n  @Input()\n  props: ToolbarMetadata;\n\n  private _lspInput: { ls: any; color: any } = { ls: null, color: null };\n  private _lspCache: any = null;\n\n  /**\n   * Evento emitido al hacer click en una acción o botón de la barra.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  actionTypes = ToolbarActionType;\n\n  private nav = inject(NavigationService);\n\n  constructor(icon: IconService) {\n    addIcons({ chevronBackOutline });\n  }\n\n  ngOnInit() {}\n\n  /**\n   * Emite el token de la acción clicada.\n   * @param token Token de la acción\n   */\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n\n  goBack() {\n    this.nav.back();\n  }\n\n  /**\n   * Determina si hay acciones a la derecha.\n   */\n  someInRight(): boolean {\n    return !!this.props.actions.find(x => x.position === 'right');\n  }\n\n  /**\n   * Determina si hay acciones a la izquierda.\n   */\n  someInLeft(): boolean {\n    return !!this.props.actions.find(x => x.position === 'left');\n  }\n\n  /**\n   * Devuelve las acciones de la derecha.\n   */\n  rightActions(): ToolbarAction[] {\n    return this.props.actions.filter(x => x.position === 'right');\n  }\n\n  /**\n   * Devuelve las acciones de la izquierda.\n   */\n  leftActions(): ToolbarAction[] {\n    return this.props.actions.filter(x => x.position === 'left');\n  }\n\n  /**\n   * Language selector props — memoized to avoid new object reference on every CD cycle.\n   */\n  get languageSelectorProps() {\n    const ls = this.props.languageSelector;\n    const color = this.props.textColor;\n    if (this._lspCache !== null && this._lspInput.ls === ls && this._lspInput.color === color) {\n      return this._lspCache;\n    }\n    this._lspInput = { ls, color };\n    this._lspCache = { mode: 'icon' as const, color: color || 'dark', ...ls };\n    return this._lspCache;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { IonFooter } from '@ionic/angular/standalone';\nimport { ToolbarComponent } from '../toolbar/toolbar.component';\nimport { FooterMetadata } from './types';\n\n/**\n * FooterComponent\n *\n * Componente de pie de página reutilizable para aplicaciones Ionic/Angular.\n * Permite mostrar una barra de herramientas (toolbar) y contenido adicional.\n *\n * @example\n * <val-footer [props]=\"footerProps\" (onClick)=\"handleFooterAction($event)\">\n *   <div extra>Contenido extra</div>\n * </val-footer>\n *\n * @input props {FooterMetadata} - Metadatos del pie de página y su toolbar.\n * @output onClick - Emite el token de la acción clicada en la toolbar.\n */\n@Component({\n  selector: 'val-footer',\n  standalone: true,\n  imports: [CommonModule, IonFooter, ToolbarComponent],\n  template: `\n    <ion-footer\n      [class.ion-no-border]=\"!props.bordered\"\n      [translucent]=\"props.translucent\"\n      [class.background]=\"props.toolbar.color === 'background'\"\n    >\n      <val-toolbar\n        *ngIf=\"props.toolbar.title || props.toolbar.withActions || props.toolbar.withBack\"\n        [props]=\"props.toolbar\"\n        (onClick)=\"clickHandler($event)\"\n      ></val-toolbar>\n      <ng-content select=\"[extra]\"></ng-content>\n    </ion-footer>\n  `,\n  styleUrls: ['./footer.component.scss'],\n})\nexport class FooterComponent implements OnInit {\n  /**\n   * Metadatos del pie de página y su toolbar.\n   */\n  @Input()\n  props: FooterMetadata;\n\n  /**\n   * Evento emitido al hacer click en una acción de la toolbar.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  constructor() {}\n\n  ngOnInit() {}\n\n  /**\n   * Emite el token de la acción clicada en la toolbar.\n   * @param token Token de la acción\n   */\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n}\n","import { ValidatorFn, Validators } from '@angular/forms';\nimport { ComponentStates, InputMetadata, InputType } from '../../types';\n\nexport const maxLength = (\n  field: string,\n  max: number\n): { validator: ValidatorFn; error: string } => {\n  return {\n    validator: Validators.maxLength(max),\n    error: `El campo ${field} no debe superar los ${max} caracteres.`,\n  };\n};\n\nexport const createNumberFromToField = (\n  name: string,\n  label: string,\n  fromLabel: string,\n  toLabel: string,\n  options?: {\n    fromPlaceholder?: string;\n    toPlaceholder?: string;\n    hint?: string;\n    range?: { min: number; max: number };\n    validators?: ValidatorFn[];\n    order?: number;\n  }\n): InputMetadata => {\n  return {\n    control: null as any, // Will be set by form component\n    token: `number-from-to-${name}`,\n    label,\n    name,\n    hint: options?.hint || '',\n    placeholder: '',\n    type: InputType.NUMBER_FROM_TO,\n    order: options?.order || 0,\n    validators: options?.validators || [],\n    range: options?.range,\n    errors: {},\n    state: ComponentStates.ENABLED,\n    fromLabel,\n    toLabel,\n    fromPlaceholder: options?.fromPlaceholder,\n    toPlaceholder: options?.toPlaceholder,\n  };\n};\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { IonHeader } from '@ionic/angular/standalone';\nimport { ToolbarComponent } from '../toolbar/toolbar.component';\nimport { HeaderMetadata } from './types';\n\n@Component({\n  selector: 'val-header',\n  standalone: true,\n  imports: [IonHeader, ToolbarComponent],\n  template: `\n    <ion-header [class.ion-no-border]=\"!props.bordered\" [translucent]=\"props.translucent\">\n      <val-toolbar [props]=\"props.toolbar\" (onClick)=\"clickHandler($event)\"></val-toolbar>\n    </ion-header>\n  `,\n  styleUrls: ['./header.component.scss'],\n})\n/**\n * HeaderComponent\n *\n * Componente de encabezado reutilizable para aplicaciones Ionic/Angular.\n * Permite mostrar una barra de herramientas (toolbar) configurable.\n *\n * @example\n * <val-header [props]=\"headerProps\" (onClick)=\"handleHeaderAction($event)\"></val-header>\n *\n * @input props {HeaderMetadata} - Metadatos del encabezado y su toolbar.\n * @output onClick - Emite el token de la acción clicada en la toolbar.\n */\nexport class HeaderComponent implements OnInit {\n  /**\n   * Metadatos del encabezado y su toolbar.\n   */\n  @Input()\n  props: HeaderMetadata;\n\n  /**\n   * Evento emitido al hacer click en una acción de la toolbar.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  constructor() {}\n\n  ngOnInit() {}\n\n  /**\n   * Emite el token de la acción clicada en la toolbar.\n   * @param token Token de la acción\n   */\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n}\n","import { HeaderMetadata } from '../header/types';\nimport { SearchbarMetadata } from '../../molecules/searchbar/types';\n\n/**\n * Metadata for val-search-header.\n *\n * Header/toolbar con un botón de búsqueda que, al presionarse, despliega un\n * `val-searchbar` colapsable debajo del toolbar (100% del ancho en mobile, un\n * máximo centrado en desktop). El botón de búsqueda es una ICON action más del\n * toolbar (idéntica a menu/avatar/notificaciones): se identifica por su `token`.\n */\nexport interface SearchHeaderMetadata {\n  /** Configuración del header + toolbar (reusa val-header/val-toolbar). */\n  header: HeaderMetadata;\n\n  /**\n   * Token de la ICON action que dispara la búsqueda. La action correspondiente\n   * debe existir en `header.toolbar.actions`. Default: 'search'.\n   */\n  searchToken?: string;\n\n  /** Configuración del searchbar desplegado. */\n  searchbar?: SearchbarMetadata;\n\n  /** Ancho máximo de la barra en desktop (CSS). Default: '720px'. */\n  maxWidth?: string;\n\n  /** Si arranca con la barra abierta. Default: false. */\n  startOpen?: boolean;\n\n  /** Mostrar botón de cierre (X) a la derecha de la barra. Default: true. */\n  showClose?: boolean;\n}\n\n/**\n * Default values for SearchHeaderMetadata.\n */\nexport const SEARCH_HEADER_DEFAULTS: Required<\n  Pick<SearchHeaderMetadata, 'searchToken' | 'maxWidth' | 'startOpen' | 'showClose'>\n> = {\n  searchToken: 'search',\n  maxWidth: '720px',\n  startOpen: false,\n  showClose: true,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, EventEmitter, inject, Input, Output, signal } from '@angular/core';\nimport { IonButton, IonButtons, IonHeader, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { closeOutline } from 'ionicons/icons';\n\nimport { ToolbarComponent } from '../toolbar/toolbar.component';\nimport { SearchbarComponent } from '../../molecules/searchbar/searchbar.component';\nimport { SearchHeaderMetadata, SEARCH_HEADER_DEFAULTS } from './types';\n\naddIcons({ closeOutline });\n\n/**\n * `val-search-header` — header/toolbar con búsqueda desplegable.\n *\n * El botón de búsqueda es una ICON action del toolbar (igual que\n * menu/avatar/notificaciones), identificada por su `token` (`searchToken`).\n * Al presionarla se despliega un `val-searchbar` debajo del toolbar: 100% del\n * ancho en mobile, un máximo centrado en desktop.\n *\n * Reusa `val-toolbar` para el header — las demás acciones se emiten por\n * `(onAction)`. La query se emite por `(search)`.\n *\n * @example\n * ```html\n * <val-search-header\n *   [props]=\"{\n *     header: { toolbar: { title: 'AWS', withActions: true, withBack: false,\n *       actions: [\n *         { type: 'ICON', description: 'search-outline', token: 'search', position: 'right' },\n *         { type: 'ICON', description: 'notifications-outline', token: 'notif', position: 'right' }\n *       ] } },\n *     searchbar: { placeholder: 'Buscar...' }\n *   }\"\n *   (search)=\"onSearch($event)\"\n *   (onAction)=\"onAction($event)\"\n * >\n *   <ion-button slot=\"search-actions\" fill=\"outline\">Filter: All</ion-button>\n * </val-search-header>\n * ```\n */\n@Component({\n  selector: 'val-search-header',\n  standalone: true,\n  imports: [CommonModule, IonHeader, IonButton, IonButtons, IonIcon, ToolbarComponent, SearchbarComponent],\n  template: `\n    <ion-header [class.ion-no-border]=\"!config().header.bordered\" [translucent]=\"config().header.translucent\">\n      <val-toolbar [props]=\"config().header.toolbar\" (onClick)=\"handleToolbar($event)\"></val-toolbar>\n\n      @if (open()) {\n        <div class=\"search-reveal\">\n          <div class=\"search-reveal__inner\" [style.max-width]=\"config().maxWidth\">\n            <val-searchbar\n              class=\"search-reveal__bar\"\n              [props]=\"config().searchbar || {}\"\n              (filterEvent)=\"search.emit($event)\"\n              (blurEvent)=\"blur.emit()\"\n            ></val-searchbar>\n\n            <ng-content select=\"[search-actions]\"></ng-content>\n\n            @if (config().showClose) {\n              <ion-buttons>\n                <ion-button class=\"search-reveal__close\" fill=\"clear\" color=\"dark\" (click)=\"toggle()\">\n                  <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n                </ion-button>\n              </ion-buttons>\n            }\n          </div>\n        </div>\n      }\n    </ion-header>\n  `,\n  styleUrls: ['./search-header.component.scss'],\n})\nexport class SearchHeaderComponent {\n  private host = inject(ElementRef<HTMLElement>);\n\n  /** Configuración del search header. */\n  @Input() props: SearchHeaderMetadata = {\n    header: { toolbar: { title: '', withActions: true, withBack: false, actions: [] } },\n  };\n\n  /** Emite el token de cualquier acción del toolbar que NO sea la de búsqueda. */\n  @Output() onAction = new EventEmitter<string>();\n  /** Emite la query del searchbar. */\n  @Output() search = new EventEmitter<string>();\n  /** Emite al abrir/cerrar la barra de búsqueda. */\n  @Output() searchToggle = new EventEmitter<boolean>();\n  /** Emite cuando el searchbar pierde el foco. */\n  @Output() blur = new EventEmitter<void>();\n\n  private readonly _open = signal(false);\n  readonly open = this._open.asReadonly();\n\n  config = computed(\n    () =>\n      ({\n        ...SEARCH_HEADER_DEFAULTS,\n        ...this.props,\n      }) as SearchHeaderMetadata & typeof SEARCH_HEADER_DEFAULTS\n  );\n\n  constructor() {\n    // startOpen se respeta una vez, en la primera lectura de props.\n    if (this.props.startOpen) {\n      this._open.set(true);\n    }\n  }\n\n  handleToolbar(token?: string): void {\n    if (token && token === this.config().searchToken) {\n      this.toggle();\n      return;\n    }\n    this.onAction.emit(token);\n  }\n\n  toggle(): void {\n    const next = !this._open();\n    this._open.set(next);\n    this.searchToggle.emit(next);\n    if (next) {\n      this.focusSearchbar();\n    }\n  }\n\n  private focusSearchbar(): void {\n    // Enfoca el ion-searchbar nativo al desplegar (mejor UX, como AWS/Slack).\n    setTimeout(() => {\n      const el = this.host.nativeElement.querySelector('ion-searchbar') as HTMLIonSearchbarElement | null;\n      el?.setFocus?.();\n    }, 50);\n  }\n}\n","import { Component, computed, EventEmitter, inject, Input, OnDestroy, Output, signal } from '@angular/core';\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonInput,\n  IonItem,\n  IonLabel,\n  IonModal,\n  IonRadio,\n  IonRadioGroup,\n  IonSpinner,\n  IonToolbar,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { informationCircleOutline, copyOutline, checkmarkOutline } from 'ionicons/icons';\n\nimport { SolidDefaultBlock } from '../../atoms/button/factory';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { QrCodeComponent } from '../../atoms/qr-code/qr-code.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { PinInputComponent } from '../../molecules/pin-input/pin-input.component';\nimport { ComponentStates, FormMetadata, FormSubmit, InputType } from '../../types';\nimport { FormComponent } from '../form/form.component';\nimport { AuthService } from '../../../services/auth';\nimport { MFAMethod, TOTPSetupResponse } from '../../../services/auth/types';\nimport { I18nService, InputI18nHelper } from '../../../services/i18n';\nimport { QrGeneratorService } from '../../../services/qr-generator/qr-generator.service';\nimport { QrResult } from '../../../services/qr-generator/types';\nimport { ToastService } from '../../../services/toast.service';\n\n/** Paso del flujo del modal. */\ntype MfaStep = 'loading' | 'status' | 'method-select' | 'totp-setup' | 'code-confirm' | 'disable';\n\n/** Segundos de espera antes de poder reenviar el código EMAIL/SMS. */\nconst RESEND_COOLDOWN_SECONDS = 30;\n\n/**\n * `val-mfa-modal` — modal de gestión de autenticación de dos factores (MFA)\n * para un usuario autenticado. Mismo patrón que `val-change-password-modal`.\n *\n * Flujo (máquina de estados interna):\n *  - `loading` → `getProfile()` para conocer el estado MFA.\n *  - `status` → muestra MFA habilitado/deshabilitado. Si está habilitado:\n *    gestión de backup codes (TOTP) + deshabilitar. Si no: botón habilitar.\n *  - `method-select` → elegir TOTP / EMAIL / SMS.\n *  - `totp-setup` → QR + secreto manual + backup codes → verificar código.\n *  - `code-confirm` → (EMAIL/SMS) ingresar código recibido, con reenvío.\n *  - `disable` → contraseña para deshabilitar MFA.\n *\n * El QR se genera **client-side** (`QrGeneratorService`) — el secreto TOTP\n * nunca sale del navegador.\n *\n * Self-contained: inyecta `AuthService` y llama los endpoints directo. La app\n * controla `[isOpen]` y reacciona a `(changed)` / `(dismissed)`.\n *\n * i18n: namespace compartido `_auth`.\n *\n * @example\n * ```html\n * <val-mfa-modal\n *   [isOpen]=\"isModalOpen()\"\n *   (dismissed)=\"isModalOpen.set(false)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-mfa-modal',\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    IonButton,\n    IonButtons,\n    IonContent,\n    IonHeader,\n    IonIcon,\n    IonInput,\n    IonItem,\n    IonLabel,\n    IonModal,\n    IonRadio,\n    IonRadioGroup,\n    IonSpinner,\n    IonToolbar,\n    DisplayComponent,\n    FormComponent,\n    QrCodeComponent,\n    TextComponent,\n    TitleComponent,\n    PinInputComponent,\n  ],\n  templateUrl: './mfa-modal.component.html',\n  styleUrls: ['./mfa-modal.component.scss'],\n})\nexport class MfaModalComponent implements OnDestroy {\n  private _isOpen = false;\n\n  /** Controla la visibilidad. Cada apertura re-resuelve el estado MFA. */\n  @Input()\n  set isOpen(value: boolean) {\n    const opening = value && !this._isOpen;\n    this._isOpen = value;\n    if (opening) {\n      // Diferimos al próximo microtask para que el resto de @Input\n      // (`prefillCode`) ya estén asignados — Angular procesa los inputs en\n      // orden de declaración, y sin esto `open()` lee `prefillCode` undefined\n      // cuando el padre setea ambos en el mismo tick (deep-link MFA-email).\n      queueMicrotask(() => this.open());\n    }\n  }\n  get isOpen(): boolean {\n    return this._isOpen;\n  }\n\n  /**\n   * Código MFA pre-cargado (deep-link desde el email de setup MFA-email). Si\n   * está presente al abrir, el modal salta directo al paso de confirmación\n   * con el código rellenado.\n   */\n  @Input() prefillCode?: string;\n\n  /** Emite cuando el estado MFA cambia (habilitado / deshabilitado). */\n  @Output() changed = new EventEmitter<void>();\n\n  /**\n   * Emitido cuando un setup MFA se confirma exitosamente y el modal fue abierto\n   * vía deep-link (con `prefillCode`). El host puede usarlo para cerrar el\n   * modal y navegar (ej. a home) en lugar de quedarse en la página de Security.\n   */\n  @Output() enabledViaDeeplink = new EventEmitter<void>();\n\n  /** Emite cuando el user cierra el modal (botón X o backdrop). */\n  @Output() dismissed = new EventEmitter<void>();\n\n  private auth = inject(AuthService);\n  private toast = inject(ToastService);\n  private i18n = inject(I18nService);\n  private i18nHelper = inject(InputI18nHelper);\n  private qrGen = inject(QrGeneratorService);\n\n  private readonly _step = signal<MfaStep>('loading');\n  /** Paso actual del flujo. */\n  readonly step = this._step.asReadonly();\n\n  /** `true` mientras una llamada al backend está en curso. */\n  readonly working = signal(false);\n\n  // Estado MFA actual.\n  readonly mfaEnabled = signal(false);\n  readonly mfaMethod = signal<MFAMethod | null>(null);\n  readonly userPhone = signal<string | null>(null);\n  readonly backupCodesCount = signal(0);\n  /** Default true para no romper el flow viejo si el backend no devuelve el campo. */\n  readonly hasPassword = signal(true);\n\n  // Estado del flujo de habilitación.\n  readonly selectedMethod = signal<MFAMethod>('TOTP');\n  readonly totpSetup = signal<TOTPSetupResponse | null>(null);\n  readonly totpQr = signal<QrResult | null>(null);\n  /** Códigos de respaldo recién regenerados — se muestran una sola vez. */\n  readonly regeneratedCodes = signal<string[] | null>(null);\n  /** Marca momentánea cuando el secreto TOTP se acaba de copiar (feedback visual). */\n  readonly copiedSecret = signal(false);\n  readonly resendCooldown = signal(0);\n  readonly disableCodeSent = signal(false);\n\n  readonly pinControl = new FormControl('', [Validators.required, Validators.minLength(6), Validators.maxLength(6)]);\n  readonly phoneControl = new FormControl('', [Validators.required, Validators.pattern(/^\\+[1-9]\\d{6,14}$/)]);\n\n  readonly pinInputProps = {\n    control: this.pinControl,\n    token: 'mfa-code',\n    length: 6,\n    allowNumbersOnly: true,\n    autoFocus: true,\n  };\n\n  /** Form de deshabilitación — `val-form` con un campo de contraseña. */\n  readonly disableFormProps = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'mfaDisableTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: this.t('mfaDisablePrompt'),\n          order: 0,\n          fields: [\n            {\n              type: InputType.PASSWORD,\n              name: 'password',\n              token: 'mfa-disable-password',\n              labelKey: 'mfaPasswordLabel',\n              hint: '',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: { required: 'mfaPasswordRequired' },\n              validators: [Validators.required],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'mfa-disable-submit',\n        textKey: 'mfaDisableButton',\n      },\n      state: this.working() ? ComponentStates.WORKING : ComponentStates.ENABLED,\n    })\n  );\n\n  private resendTimer: ReturnType<typeof setInterval> | null = null;\n\n  constructor() {\n    addIcons({ informationCircleOutline, copyOutline, checkmarkOutline });\n  }\n\n  ngOnDestroy(): void {\n    this.stopCooldown();\n  }\n\n  /** Traduce una clave del namespace `_auth`. */\n  t(key: string): string {\n    return this.i18n.t(key, '_auth');\n  }\n\n  /** Cierre iniciado por el user (X / backdrop). */\n  close(): void {\n    this.dismissed.emit();\n  }\n\n  /**\n   * Punto de entrada al abrir el modal. Con `prefillCode` (deep-link del email\n   * de setup MFA-email) salta directo a la confirmación; si no, resuelve el\n   * estado MFA actual.\n   */\n  private open(): void {\n    if (this.prefillCode) {\n      this.resetFlow();\n      this.selectedMethod.set('EMAIL');\n      this.pinControl.setValue(this.prefillCode);\n      this._step.set('code-confirm');\n      return;\n    }\n    this.resolveStatus();\n  }\n\n  // ===========================================================================\n  // Carga de estado\n  // ===========================================================================\n\n  /** Consulta el perfil para conocer el estado MFA y posicionar el flujo. */\n  private resolveStatus(): void {\n    this._step.set('loading');\n    this.resetFlow();\n    this.auth.getProfile().subscribe({\n      next: profile => {\n        this.mfaEnabled.set(profile.mfaEnabled);\n        this.mfaMethod.set(profile.mfaMethod ?? null);\n        this.userPhone.set(profile.phone ?? null);\n        this.hasPassword.set(profile.hasPassword ?? true);\n        if (profile.mfaEnabled && profile.mfaMethod === 'TOTP') {\n          this.loadBackupCount();\n        }\n        this._step.set('status');\n      },\n      error: () => {\n        // Fallback: usar el signal de usuario en sesión.\n        const user = this.auth.user();\n        this.mfaEnabled.set(user?.mfaEnabled ?? false);\n        this.mfaMethod.set(user?.mfaMethod ?? null);\n        this._step.set('status');\n      },\n    });\n  }\n\n  private loadBackupCount(): void {\n    this.auth.getBackupCodesCount().subscribe({\n      next: res => this.backupCodesCount.set(res.count),\n      error: () => this.backupCodesCount.set(0),\n    });\n  }\n\n  // ===========================================================================\n  // Navegación entre pasos\n  // ===========================================================================\n\n  goToMethodSelect(): void {\n    this.regeneratedCodes.set(null);\n    this._step.set('method-select');\n  }\n\n  goToDisable(): void {\n    this.pinControl.reset();\n    this._step.set('disable');\n  }\n\n  backToStatus(): void {\n    this.stopCooldown();\n    this.disableCodeSent.set(false);\n    this.resolveStatus();\n  }\n\n  // ===========================================================================\n  // Habilitar MFA\n  // ===========================================================================\n\n  /** Continúa desde el selector de método al setup correspondiente. */\n  proceedWithMethod(): void {\n    const method = this.selectedMethod();\n    if (method === 'TOTP') {\n      this.setupTotp();\n      return;\n    }\n\n    let phone: string | undefined;\n    if (method === 'SMS' && !this.userPhone()) {\n      if (this.phoneControl.invalid) {\n        this.phoneControl.markAsTouched();\n        this.showToast(this.t('mfaPhoneInvalid'));\n        return;\n      }\n      phone = this.phoneControl.value ?? undefined;\n    }\n\n    this.working.set(true);\n    this.auth.setupMFA(method, phone).subscribe({\n      next: res => {\n        this.working.set(false);\n        if (res.codeSent) {\n          this.pinControl.reset();\n          this._step.set('code-confirm');\n          this.startCooldown();\n        }\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  private setupTotp(): void {\n    this.working.set(true);\n    this.auth.setupTOTP().subscribe({\n      next: res => {\n        this.totpSetup.set(res);\n        this.pinControl.reset();\n        this.qrGen\n          .generate({ data: res.qrCodeUrl, width: 220 })\n          .then(qr => this.totpQr.set(qr))\n          .catch(() => this.totpQr.set(null));\n        this.working.set(false);\n        this._step.set('totp-setup');\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Verifica el código TOTP de la app de autenticación y activa MFA. */\n  verifyTotp(): void {\n    const code = this.pinControl.value;\n    if (!code || code.length !== 6) {\n      this.showToast(this.t('mfaCodeInvalid'));\n      return;\n    }\n    this.working.set(true);\n    this.auth.verifyTOTPSetup(code).subscribe({\n      next: res => {\n        this.working.set(false);\n        if (res.enabled) {\n          this.showToast(this.t('mfaEnabledOk'));\n          this.changed.emit();\n          this.resolveStatus();\n        }\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Confirma el código EMAIL/SMS y activa MFA. */\n  confirmCode(): void {\n    const code = this.pinControl.value;\n    if (!code || code.length !== 6) {\n      this.showToast(this.t('mfaCodeInvalid'));\n      return;\n    }\n    this.working.set(true);\n    const cameFromDeeplink = !!this.prefillCode;\n    this.auth.confirmMFA(code).subscribe({\n      next: res => {\n        this.working.set(false);\n        if (res.mfaEnabled) {\n          this.showToast(this.t('mfaEnabledOk'));\n          this.changed.emit();\n          if (cameFromDeeplink) {\n            // El user llegó vía link del email → el host se encarga de cerrar\n            // el modal y navegar (ej. a home). No resolvemos status acá porque\n            // implicaría dejar el modal abierto mostrando el estado nuevo.\n            this.enabledViaDeeplink.emit();\n          } else {\n            this.resolveStatus();\n          }\n        }\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Reenvía el código EMAIL/SMS (re-ejecuta el setup). */\n  resendCode(): void {\n    if (this.resendCooldown() > 0) {\n      return;\n    }\n    this.proceedWithMethod();\n  }\n\n  // ===========================================================================\n  // Gestión (MFA habilitado)\n  // ===========================================================================\n\n  /** Regenera los códigos de respaldo TOTP y los muestra una vez. */\n  regenerateBackupCodes(): void {\n    this.working.set(true);\n    this.auth.regenerateBackupCodes().subscribe({\n      next: res => {\n        this.working.set(false);\n        this.backupCodesCount.set(res.backupCodes.length);\n        this.regeneratedCodes.set(res.backupCodes);\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Deshabilita MFA usando la contraseña de la cuenta. */\n  onDisableSubmit(event: FormSubmit): void {\n    const password = event.fields['password'];\n    if (!password) {\n      this.showToast(this.t('mfaPasswordRequired'));\n      return;\n    }\n    this.disable({ password });\n  }\n\n  /** Deshabilita MFA usando un código TOTP — para cuentas OAuth-only sin contraseña. */\n  disableWithMfaCode(): void {\n    const code = this.pinControl.value;\n    if (!code || code.length !== 6) {\n      this.showToast(this.t('mfaCodeInvalid'));\n      return;\n    }\n    this.disable({ mfaCode: code });\n  }\n\n  sendDisableCode(): void {\n    this.working.set(true);\n    this.auth.sendMFADisableCode().subscribe({\n      next: () => {\n        this.working.set(false);\n        this.disableCodeSent.set(true);\n        this.showToast(this.t('mfaDisableCodeSent'));\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  private disable(input: { password?: string; mfaCode?: string }): void {\n    this.working.set(true);\n    this.auth.disableMFA(input).subscribe({\n      next: res => {\n        this.working.set(false);\n        if (res.mfaDisabled) {\n          this.showToast(this.t('mfaDisabledOk'));\n          this.changed.emit();\n          this.resolveStatus();\n        }\n      },\n      error: err => {\n        this.working.set(false);\n        this.showToast(this.resolveError(err));\n      },\n    });\n  }\n\n  /** Copia una lista de códigos de respaldo al portapapeles. */\n  async copyCodes(codes: string[]): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(codes.join('\\n'));\n      this.showToast(this.t('mfaCodesCopied'));\n    } catch {\n      /* sin recurso de copia disponible */\n    }\n  }\n\n  /** Copia el secreto TOTP al portapapeles + feedback visual (check) durante 2s. */\n  async copySecret(secret: string): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(secret);\n      this.copiedSecret.set(true);\n      this.showToast(this.t('mfaSecretCopied'));\n      setTimeout(() => this.copiedSecret.set(false), 2000);\n    } catch {\n      /* sin recurso de copia disponible */\n    }\n  }\n\n  /** Etiqueta i18n legible para un método MFA. */\n  methodLabel(method: MFAMethod | null): string {\n    switch (method) {\n      case 'TOTP':\n        return this.t('mfaMethodTotp');\n      case 'EMAIL':\n        return this.t('mfaMethodEmail');\n      case 'SMS':\n        return this.t('mfaMethodSms');\n      default:\n        return '';\n    }\n  }\n\n  // ===========================================================================\n  // Helpers\n  // ===========================================================================\n\n  private resetFlow(): void {\n    this.pinControl.reset();\n    this.phoneControl.reset();\n    this.totpSetup.set(null);\n    this.totpQr.set(null);\n    this.regeneratedCodes.set(null);\n    this.selectedMethod.set('TOTP');\n    this.stopCooldown();\n  }\n\n  private startCooldown(): void {\n    this.stopCooldown();\n    this.resendCooldown.set(RESEND_COOLDOWN_SECONDS);\n    this.resendTimer = setInterval(() => {\n      this.resendCooldown.update(v => v - 1);\n      if (this.resendCooldown() <= 0) {\n        this.stopCooldown();\n      }\n    }, 1000);\n  }\n\n  private stopCooldown(): void {\n    if (this.resendTimer) {\n      clearInterval(this.resendTimer);\n      this.resendTimer = null;\n    }\n    this.resendCooldown.set(0);\n  }\n\n  /** Mapea los códigos de error MFA del backend a mensajes del namespace `_auth`. */\n  private resolveError(err: unknown): string {\n    const code = (err as { code?: string })?.code;\n    switch (code) {\n      case 'AUTHV2_MFA_INVALID_CODE':\n        return this.t('mfaErrorInvalidCode');\n      case 'AUTHV2_EXPIRED_CODE':\n        return this.t('mfaErrorExpiredCode');\n      case 'AUTHV2_CODE_USED':\n        return this.t('mfaErrorCodeUsed');\n      case 'AUTHV2_MFA_ALREADY_ACTIVE':\n        return this.t('mfaErrorAlreadyActive');\n      case 'AUTHV2_MFA_NOT_ENABLED':\n        return this.t('mfaErrorNotEnabled');\n      case 'AUTHV2_PHONE_REQUIRED':\n        return this.t('mfaErrorPhoneRequired');\n      case 'AUTHV2_PHONE_EXISTS':\n        return this.t('mfaErrorPhoneExists');\n      case 'AUTHV2_TOO_MANY_ATTEMPTS':\n        return this.t('errorTooManyAttempts');\n      case 'AUTHV2_INVALID_CURRENT_PASSWORD':\n        return this.t('errorCurrentPasswordWrong');\n      default:\n        return this.t('errorGeneric');\n    }\n  }\n\n  private showToast(message: string): void {\n    this.toast.show({ message, duration: 3500 });\n  }\n}\n","<ion-modal [isOpen]=\"isOpen\" (didDismiss)=\"close()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n\n    <ion-content class=\"ion-padding\">\n      <section class=\"mfa-modal\">\n        <val-display [props]=\"{ content: t('mfaManageTitle'), size: 'small', color: 'dark' }\" />\n\n        @switch (step()) { @case ('loading') {\n        <div class=\"mfa-loading\">\n          <ion-spinner name=\"crescent\"></ion-spinner>\n        </div>\n        } @case ('status') { @if (mfaEnabled()) {\n        <p class=\"mfa-status mfa-status--on\">{{ t('mfaEnabledLabel') }} · {{ methodLabel(mfaMethod()) }}</p>\n\n        @if (mfaMethod() === 'TOTP') {\n        <div class=\"mfa-block\">\n          <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n          <val-text\n            [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaBackupCodesAvailable') + ': ' + backupCodesCount() }\"\n          />\n\n          @if (regeneratedCodes(); as codes) {\n          <div class=\"mfa-alert\">\n            <ion-icon name=\"information-circle-outline\"></ion-icon>\n            <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n          </div>\n          <div class=\"mfa-codes\">\n            @for (code of codes; track code) {\n            <code class=\"mfa-code\">{{ code }}</code>\n            }\n          </div>\n          <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(codes)\">\n            {{ t('mfaCopyCodes') }}\n          </ion-button>\n          } @else { @if (backupCodesCount() < 3) {\n          <div class=\"mfa-alert\">\n            <ion-icon name=\"information-circle-outline\"></ion-icon>\n            <p>{{ t('mfaBackupCodesLow') }}</p>\n          </div>\n          }\n          <ion-button\n            expand=\"block\"\n            color=\"dark\"\n            fill=\"outline\"\n            [disabled]=\"working()\"\n            (click)=\"regenerateBackupCodes()\"\n          >\n            @if (working()) {\n            <ion-spinner name=\"crescent\"></ion-spinner>\n            } @else { {{ t('mfaRegenerateCodes') }} }\n          </ion-button>\n          }\n        </div>\n        }\n\n        <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"goToDisable()\">\n          {{ t('mfaDisableButton') }}\n        </ion-button>\n        } @else {\n        <p class=\"mfa-status mfa-status--off\">{{ t('mfaDisabledLabel') }}</p>\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisabledHint') }\" />\n        <ion-button expand=\"block\" (click)=\"goToMethodSelect()\"> {{ t('mfaEnableButton') }} </ion-button>\n        } } @case ('method-select') {\n        <val-title [props]=\"{ content: t('mfaEnableTitle'), size: 'large', color: 'dark', bold: false }\" />\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaMethodPrompt') }\" />\n\n        <div class=\"mfa-method-list\" role=\"radiogroup\">\n          <button\n            type=\"button\"\n            class=\"mfa-method-card\"\n            [class.mfa-method-card--active]=\"selectedMethod() === 'TOTP'\"\n            (click)=\"selectedMethod.set('TOTP')\"\n            role=\"radio\"\n            [attr.aria-checked]=\"selectedMethod() === 'TOTP'\"\n          >\n            <span class=\"mfa-method-card__dot\"></span>\n            <span class=\"mfa-method-card__body\">\n              <strong>{{ t('mfaMethodTotp') }}</strong>\n              <span>{{ t('mfaMethodTotpHint') }}</span>\n            </span>\n          </button>\n          <button\n            type=\"button\"\n            class=\"mfa-method-card\"\n            [class.mfa-method-card--active]=\"selectedMethod() === 'EMAIL'\"\n            (click)=\"selectedMethod.set('EMAIL')\"\n            role=\"radio\"\n            [attr.aria-checked]=\"selectedMethod() === 'EMAIL'\"\n          >\n            <span class=\"mfa-method-card__dot\"></span>\n            <span class=\"mfa-method-card__body\">\n              <strong>{{ t('mfaMethodEmail') }}</strong>\n              <span>{{ t('mfaMethodEmailHint') }}</span>\n            </span>\n          </button>\n          <button\n            type=\"button\"\n            class=\"mfa-method-card\"\n            [class.mfa-method-card--active]=\"selectedMethod() === 'SMS'\"\n            (click)=\"selectedMethod.set('SMS')\"\n            role=\"radio\"\n            [attr.aria-checked]=\"selectedMethod() === 'SMS'\"\n          >\n            <span class=\"mfa-method-card__dot\"></span>\n            <span class=\"mfa-method-card__body\">\n              <strong>{{ t('mfaMethodSms') }}</strong>\n              <span>{{ t('mfaMethodSmsHint') }}</span>\n            </span>\n          </button>\n        </div>\n\n        @if (selectedMethod() === 'SMS' && !userPhone()) {\n        <ion-input\n          label=\"{{ t('mfaPhoneLabel') }}\"\n          labelPlacement=\"floating\"\n          fill=\"outline\"\n          type=\"tel\"\n          placeholder=\"+56912345678\"\n          [formControl]=\"phoneControl\"\n        ></ion-input>\n        @if (phoneControl.invalid && phoneControl.touched) {\n        <p class=\"mfa-error\">{{ t('mfaPhoneInvalid') }}</p>\n        } } @if (selectedMethod() === 'SMS' && userPhone(); as phone) {\n        <val-text\n          [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaPhoneRegistered') + ': ' + phone }\"\n        />\n        }\n\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"proceedWithMethod()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaContinue') }} }\n        </ion-button>\n        <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n          {{ t('mfaCancel') }}\n        </ion-button>\n        } @case ('totp-setup') {\n        <val-title [props]=\"{ content: t('mfaTotpSetupTitle'), size: 'large', color: '', bold: false }\" />\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep1') }\" />\n\n        @if (totpQr(); as qr) {\n        <div class=\"mfa-qr\">\n          <val-qr-code [props]=\"{ qr: qr }\" />\n        </div>\n        } @if (totpSetup(); as setup) {\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpManualEntry') }\" />\n        <div class=\"mfa-secret-row\">\n          <code class=\"mfa-secret\">{{ setup.secret }}</code>\n          <ion-button fill=\"clear\" size=\"small\" (click)=\"copySecret(setup.secret)\" [attr.aria-label]=\"t('copy')\">\n            @if (copiedSecret()) {\n            <ion-icon name=\"checkmark-outline\"></ion-icon>\n            } @else {\n            <ion-icon name=\"copy-outline\"></ion-icon>\n            }\n          </ion-button>\n        </div>\n\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaTotpStep2') }\" />\n        <div class=\"mfa-pin\">\n          <val-pin-input [props]=\"pinInputProps\" />\n        </div>\n\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"verifyTotp()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaTotpVerify') }} }\n        </ion-button>\n\n        <div class=\"mfa-backup\">\n          <val-title [props]=\"{ size: 'small', color: 'dark', bold: true, content: t('mfaBackupCodesTitle') }\" />\n          <div class=\"mfa-alert\">\n            <ion-icon name=\"information-circle-outline\"></ion-icon>\n            <p>{{ t('mfaBackupCodesSaveWarning') }} {{ t('mfaBackupCodesExplain') }}</p>\n          </div>\n          <div class=\"mfa-codes\">\n            @for (code of setup.backupCodes; track code) {\n            <code class=\"mfa-code\">{{ code }}</code>\n            }\n          </div>\n          <ion-button expand=\"block\" color=\"dark\" fill=\"outline\" (click)=\"copyCodes(setup.backupCodes)\">\n            {{ t('mfaCopyCodes') }}\n          </ion-button>\n        </div>\n        }\n\n        <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n          {{ t('mfaCancel') }}\n        </ion-button>\n        } @case ('code-confirm') {\n        <val-title [props]=\"{ content: t('mfaConfirmTitle'), size: 'large', color: '', bold: false }\" />\n        <val-text\n          [props]=\"{ size: 'medium', color: 'dark', bold: false, content: selectedMethod() === 'EMAIL' ? t('mfaConfirmPromptEmail') : t('mfaConfirmPromptSms') }\"\n        />\n\n        <div class=\"mfa-pin\">\n          <val-pin-input [props]=\"pinInputProps\" />\n        </div>\n\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"confirmCode()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaConfirmButton') }} }\n        </ion-button>\n\n        <p class=\"mfa-resend\">\n          {{ t('mfaNoCode') }} @if (resendCooldown() > 0) {\n          <span>{{ t('mfaResendIn') }} {{ resendCooldown() }}s</span>\n          } @else {\n          <a (click)=\"resendCode()\">{{ t('mfaResend') }}</a>\n          }\n        </p>\n\n        <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n          {{ t('mfaCancel') }}\n        </ion-button>\n        } @case ('disable') { @if (hasPassword()) {\n        <val-form [props]=\"disableFormProps()\" (onSubmit)=\"onDisableSubmit($event)\" />\n        } @else if (mfaMethod() === 'TOTP') {\n        <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableTotpPrompt') }\" />\n        <div class=\"mfa-pin\">\n          <val-pin-input [props]=\"pinInputProps\" />\n        </div>\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaDisableButton') }} }\n        </ion-button>\n        } @else if (mfaMethod() === 'EMAIL' || mfaMethod() === 'SMS') {\n        <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n        @if (!disableCodeSent()) {\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaDisableSendCode') }} }\n        </ion-button>\n        } @else {\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableCodePrompt') }\" />\n        <div class=\"mfa-pin\">\n          <val-pin-input [props]=\"pinInputProps\" />\n        </div>\n        <ion-button expand=\"block\" [disabled]=\"working()\" (click)=\"disableWithMfaCode()\">\n          @if (working()) {\n          <ion-spinner name=\"crescent\"></ion-spinner>\n          } @else { {{ t('mfaDisableButton') }} }\n        </ion-button>\n        <ion-button expand=\"block\" fill=\"clear\" color=\"medium\" [disabled]=\"working()\" (click)=\"sendDisableCode()\">\n          {{ t('mfaDisableResendCode') }}\n        </ion-button>\n        } } @else {\n        <val-title [props]=\"{ content: t('mfaDisableTitle'), size: 'large', color: '', bold: false }\" />\n        <val-text [props]=\"{ size: 'medium', color: 'dark', bold: false, content: t('mfaDisableNeedsPassword') }\" />\n        }\n        <ion-button expand=\"block\" fill=\"clear\" color=\"dark\" (click)=\"backToStatus()\">\n          {{ t('mfaCancel') }}\n        </ion-button>\n        } }\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n","import { NgClass, NgStyle } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport {\n  IonAvatar,\n  IonButton,\n  IonIcon,\n  IonItem,\n  IonLabel,\n  IonList,\n  IonListHeader,\n  IonNote,\n  IonSpinner,\n} from '@ionic/angular/standalone';\nimport { IconService } from '../../../services/icons.service';\nimport { resolveColor } from '../../../shared/utils/styles';\nimport { ComponentStates } from '../../types';\nimport { ListMetadata } from './types';\n\n@Component({\n  selector: 'val-item-list',\n  standalone: true,\n  imports: [\n    RouterLink,\n    NgStyle,\n    NgClass,\n    IonList,\n    IonListHeader,\n    IonLabel,\n    IonNote,\n    IonItem,\n    IonAvatar,\n    IonIcon,\n    IonButton,\n    IonSpinner,\n  ],\n  template: `\n    <ion-list\n      [inset]=\"props.rounded\"\n      [class.shadowed]=\"props.shadowed\"\n      [class.bordered]=\"props.bordered\"\n      [style.borderColor]=\"this.color()\"\n    >\n      @if (props.title) {\n        <ion-list-header>\n          <ion-label>{{ props.title }}</ion-label>\n        </ion-list-header>\n      }\n      @for (item of props.items; track item.token) {\n        @if (item.mode == 'justext') {\n          <ion-item\n            [lines]=\"item.lines\"\n            [button]=\"item.clickable\"\n            [disabled]=\"item.disabled\"\n            (click)=\"clickHandler(item.token)\"\n          >\n            @if (item.unreadIndicator) {\n              <div class=\"unread-indicator-wrapper\" slot=\"start\">\n                <div class=\"unread-indicator\"></div>\n              </div>\n            }\n\n            <ion-label [ngClass]=\"{ 'ion-text-nowrap': item.ellipsis }\">\n              <h2>{{ item.text }}</h2>\n\n              @if (item.comments) {\n                <ion-note color=\"medium\"> {{ item.comments }} </ion-note>\n              }\n\n              @if (item.subtitle) {\n                <p>{{ item.subtitle }}</p>\n              }\n            </ion-label>\n\n            @if (item.endNote) {\n              <ion-note slot=\"end\">{{ item.endNote }}</ion-note>\n            }\n          </ion-item>\n        }\n\n        @if (item.mode == 'actionable') {\n          <ion-item [lines]=\"item.lines\" [button]=\"item.clickable\" [disabled]=\"item.disabled\">\n            @if (item.unreadIndicator) {\n              <div class=\"unread-indicator-wrapper\" slot=\"start\">\n                <div class=\"unread-indicator\"></div>\n              </div>\n            }\n\n            <ion-label [ngClass]=\"{ 'ion-text-nowrap': item.ellipsis }\">\n              <h2>{{ item.text }}</h2>\n\n              @if (item.endNote) {\n                <h3>{{ item.endNote }}</h3>\n              }\n\n              @if (item.subtitle) {\n                <ion-note color=\"medium\"> {{ item.subtitle }} </ion-note>\n              }\n\n              @if (item.comments) {\n                <ion-note color=\"medium\"> {{ item.comments }} </ion-note>\n              }\n            </ion-label>\n\n            @if (item.actions) {\n              @for (action of item.actions; track action.token) {\n                <ion-button\n                  fill=\"outline\"\n                  color=\"dark\"\n                  slot=\"end\"\n                  [disabled]=\"action.state === states.WORKING\"\n                  (click)=\"onActionClickHandler(action.token)\"\n                >\n                  @if (action.state !== states.WORKING) {\n                    @if (action.icon) {\n                      <ion-icon aria-hidden=\"true\" [name]=\"action.icon\" size=\"medium\" slot=\"start\"></ion-icon>\n                    }\n\n                    {{ action.description }}\n                  }\n\n                  @if (action.state === states.WORKING) {\n                    <ion-spinner class=\"action-spinner\" name=\"circular\"></ion-spinner>\n                  }\n                </ion-button>\n              }\n            }\n          </ion-item>\n        }\n\n        @if (item.mode == 'route') {\n          <ion-item\n            [lines]=\"item.lines\"\n            [button]=\"item.clickable\"\n            [disabled]=\"item.disabled\"\n            (click)=\"clickHandler(item.token)\"\n            [routerLink]=\"item.routerLink\"\n          >\n            @if (item.unreadIndicator) {\n              <div class=\"unread-indicator-wrapper\" slot=\"start\">\n                <div class=\"unread-indicator\"></div>\n              </div>\n            }\n            @if (item.icon) {\n              <ion-icon aria-hidden=\"true\" [name]=\"item.icon\" size=\"medium\" slot=\"start\"></ion-icon>\n            }\n\n            <ion-label [ngClass]=\"{ 'ion-text-nowrap': item.ellipsis }\">\n              <h2>{{ item.text }}</h2>\n\n              @if (item.comments) {\n                <ion-note color=\"medium\"> {{ item.comments }} </ion-note>\n              }\n            </ion-label>\n          </ion-item>\n        }\n\n        @if (item.mode == 'subtitule') {\n          <ion-item\n            [lines]=\"item.lines\"\n            [button]=\"item.clickable\"\n            [disabled]=\"item.disabled\"\n            (click)=\"clickHandler(item.token)\"\n          >\n            @if (item.unreadIndicator) {\n              <div class=\"unread-indicator-wrapper\" slot=\"start\">\n                <div class=\"unread-indicator\"></div>\n              </div>\n            }\n\n            <ion-label [ngClass]=\"{ 'ion-text-nowrap': item.ellipsis }\">\n              <h1>{{ item.text }}</h1>\n              <p>{{ item.subtitle }}</p>\n            </ion-label>\n          </ion-item>\n        }\n\n        @if (item.mode == 'avatar') {\n          <ion-item\n            [lines]=\"item.lines\"\n            [button]=\"item.clickable\"\n            [disabled]=\"item.disabled\"\n            (click)=\"clickHandler(item.token)\"\n          >\n            <ion-avatar aria-hidden=\"true\" slot=\"start\">\n              <img alt=\"\" [src]=\"item.image\" />\n            </ion-avatar>\n            <ion-label>{{ item.text }}</ion-label>\n          </ion-item>\n        }\n\n        @if (item.mode == 'icon') {\n          <ion-item\n            [lines]=\"item.lines\"\n            [button]=\"item.clickable\"\n            [disabled]=\"item.disabled\"\n            (click)=\"clickHandler(item.token)\"\n          >\n            <ion-icon aria-hidden=\"true\" [name]=\"item.icon\" size=\"medium\" slot=\"start\"></ion-icon>\n            <ion-label>{{ item.text }}</ion-label>\n          </ion-item>\n        }\n      }\n    </ion-list>\n  `,\n  styleUrls: ['./item-list.component.scss'],\n})\n/**\n * ItemListComponent\n *\n * Componente de lista reutilizable para mostrar una colección de elementos con diferentes modos de visualización (texto, subtítulo, avatar, icono, ruta, acciones).\n * Permite acciones por elemento, indicadores de no leído, y personalización de estilos.\n *\n * @example\n * <val-item-list [props]=\"{ title: 'Usuarios', items: [{ text: 'Juan', mode: 'avatar', image: 'avatar.jpg' }] }\" (onClick)=\"handleClick($event)\"></val-item-list>\n *\n * @input props {ListMetadata} - Metadatos de la lista y sus elementos.\n * @output onClick - Emite el token del elemento clicado.\n * @output onActionClick - Emite el token de la acción clicada en un elemento.\n */\nexport class ItemListComponent implements OnInit {\n  states = ComponentStates;\n  defaultColor = 'primary';\n\n  /**\n   * Metadatos de la lista y sus elementos.\n   */\n  @Input()\n  props: ListMetadata;\n\n  /**\n   * Evento emitido al hacer click en un elemento de la lista.\n   */\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  /**\n   * Evento emitido al hacer click en una acción de un elemento.\n   */\n  @Output()\n  onActionClick = new EventEmitter<string>();\n\n  constructor(icon: IconService) {}\n\n  ngOnInit() {}\n\n  /**\n   * Emite el token del elemento clicado.\n   * @param token Token del elemento\n   */\n  clickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n\n  /**\n   * Emite el token de la acción clicada.\n   * @param token Token de la acción\n   */\n  onActionClickHandler(token?: string) {\n    this.onActionClick.emit(token);\n  }\n\n  /**\n   * Devuelve el color de borde de la lista.\n   */\n  color() {\n    return resolveColor(this.props.color || this.defaultColor);\n  }\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { BannerComponent } from '../banner/banner.component';\nimport { NoContentMetadata } from './types';\n\n@Component({\n  selector: 'val-no-content',\n  standalone: true,\n  imports: [ImageComponent, BannerComponent],\n  template: `\n    @if (props.topContent) {\n      <div>\n        <val-banner [props]=\"props.topContent\" (onClick)=\"onClickHandler($event)\"></val-banner>\n      </div>\n    }\n    <val-image class=\"image-container\" [props]=\"props.image\"></val-image>\n    <div>\n      <val-banner [props]=\"props.bottomContent\" (onClick)=\"onClickHandler($event)\"></val-banner>\n    </div>\n  `,\n  styleUrls: ['./no-content.component.scss'],\n})\n/**\n * NoContentComponent\n *\n * Componente para mostrar una pantalla de \"sin contenido\" con imagen y banners opcionales arriba y abajo.\n * Útil para estados vacíos, errores o mensajes informativos.\n *\n * @example\n * <val-no-content [props]=\"{ image: { src: 'empty.svg' }, bottomContent: { ... } }\"></val-no-content>\n *\n * @input props {NoContentMetadata} - Metadatos de la imagen y banners a mostrar.\n * @output onClick - Emite el token de acción de los banners si corresponde.\n */\nexport class NoContentComponent implements OnInit {\n  @Input()\n  props: NoContentMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  ngOnInit() {}\n\n  onClickHandler(token: string) {\n    this.onClick.emit(token);\n  }\n}\n","/**\n * Tipos y metadatos para el componente WizardComponent.\n * Permiten definir los pasos, botones, estado y navegación del wizard.\n */\nimport { ButtonMetadata, ComponentState } from '../../types';\nimport { EmptyStateMetadata } from '../../molecules/empty-state/types';\n\n/**\n * Metadatos del wizard.\n * @property state Estado global del wizard.\n * @property current Paso actual.\n * @property steps Colección de pasos.\n * @property error Paso de error.\n */\nexport type WizardMetadata = {\n  state: ComponentState;\n  current: number;\n  steps: Steps;\n  error: Step;\n};\n\n/**\n * Representa un paso del wizard.\n * @property titles Metadatos del empty-state para el encabezado del paso.\n * @property buttons Botones disponibles en el paso.\n */\nexport type Step = {\n  titles: EmptyStateMetadata;\n  buttons: ButtonMetadata[];\n};\n\n/**\n * Colección de pasos del wizard, indexados por número de paso.\n */\nexport type Steps = {\n  [step: number]: Step;\n};\n\n/**\n * Enumera los posibles movimientos de navegación en el wizard.\n */\nexport enum MOTION {\n  BACKWARD,\n  FORWARD,\n  RETRY,\n}\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { ProgressBarComponent } from '../../../atoms/progress-bar/progress-bar.component';\nimport { ButtonGroupComponent } from '../../../molecules/button-group/button-group.component';\nimport { ButtonMetadata, ComponentStates } from '../../../types';\nimport { FooterComponent } from '../../footer/footer.component';\nimport { MOTION, Step, WizardMetadata } from '../types';\n\n@Component({\n  selector: 'val-wizard-footer',\n  standalone: true,\n  imports: [FooterComponent, ProgressBarComponent, ButtonGroupComponent],\n  template: `\n    <val-footer\n      [props]=\"{\n        bordered: false,\n        translucent: false,\n        toolbar: {\n          title: '',\n          actions: [],\n          color: '',\n          withBack: false,\n          withActions: false,\n        },\n      }\"\n    >\n      <val-progress-bar\n        extra\n        [props]=\"{ progress: Progress, color: '', type: 'determinate', buffer: 1, size: 'small', rounded: false }\"\n      ></val-progress-bar>\n      <val-button-group\n        extra\n        [props]=\"{ buttons: actions, position: 'spaced', columned: false }\"\n        (onClick)=\"clickHandler($event)\"\n      ></val-button-group>\n    </val-footer>\n  `,\n  styleUrls: ['./wizard-footer.component.scss'],\n})\nexport class WizardFooterComponent implements OnInit {\n  @Input()\n  props: WizardMetadata;\n\n  @Output()\n  onClick = new EventEmitter<{ current: number; motion: MOTION }>();\n\n  wrapperId = 'wizard-wrapper';\n\n  ngOnInit() {}\n\n  clickHandler(token?: string) {\n    if (!token) {\n      return;\n    }\n    if (token.includes('right')) {\n      this.tryToStep(MOTION.FORWARD);\n    }\n    if (token.includes('left')) {\n      this.tryToStep(MOTION.BACKWARD);\n    }\n  }\n\n  get Current(): Step {\n    return this.props.steps[this.props.current];\n  }\n\n  get Progress(): number {\n    if (this.props.steps && this.props.current) {\n      return this.props.current / Object.keys(this.props.steps).length;\n    }\n    return 0;\n  }\n\n  get actions(): ButtonMetadata[] {\n    if (this.props.state === ComponentStates.ERROR && this.Current.buttons.length > 1) {\n      this.Current.buttons[1].state = ComponentStates.DISABLED;\n    }\n\n    if (this.props.current === 1 && this.Current.buttons.length > 1) {\n      return [this.Current.buttons[1]];\n    }\n    return this.Current.buttons;\n  }\n\n  tryToStep(motion: MOTION): void {\n    this.onClick.emit({ current: this.props.current, motion });\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  inject,\n  Input,\n  OnChanges,\n  OnInit,\n  Output,\n  SimpleChanges,\n} from '@angular/core';\nimport { goToTop } from '../../../shared/utils/dom';\nimport { ContentLoaderComponent } from '../../molecules/content-loader/content-loader.component';\nimport { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';\nimport { EmptyStateMetadata } from '../../molecules/empty-state/types';\nimport { ComponentStates } from '../../types';\nimport { MOTION, Step, WizardMetadata } from './types';\n\n@Component({\n  selector: 'val-wizard',\n  standalone: true,\n  imports: [CommonModule, EmptyStateComponent, ContentLoaderComponent],\n  template: `\n    <div [id]=\"wrapperId\" class=\"wrapper\">\n      <ng-container *ngIf=\"props.state !== 'ERROR'\">\n        <val-empty-state [props]=\"currentStepTitles\" [attr.data-step]=\"props.current\"></val-empty-state>\n        <div class=\"step\">\n          <div *ngIf=\"props.state === 'WORKING'\">\n            <val-content-loader\n              [props]=\"{\n                name: 'circular',\n                color: 'primary',\n                size: 'large',\n                text: loadingText,\n              }\"\n            />\n          </div>\n          <ng-content select=\"[step]\"></ng-content>\n        </div>\n      </ng-container>\n      <ng-container *ngIf=\"props.state === 'ERROR'\">\n        <val-empty-state [props]=\"props.error.titles\"></val-empty-state>\n      </ng-container>\n    </div>\n  `,\n  styleUrls: ['./wizard.component.scss'],\n})\nexport class WizardComponent implements OnInit, OnChanges {\n  @Input()\n  props: WizardMetadata;\n\n  @Output()\n  onClick = new EventEmitter<{ current: number; motion: MOTION }>();\n\n  wrapperId = 'wizard-wrapper';\n  currentStep: Step | null = null;\n  currentStepTitles: EmptyStateMetadata = { title: '' };\n  loadingText = 'Por favor espere...';\n\n  private cdr = inject(ChangeDetectorRef);\n\n  ngOnInit() {\n    this.updateCurrentStep();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.updateCurrentStep();\n    }\n  }\n\n  private updateCurrentStep(): void {\n    if (this.props?.steps && this.props?.current) {\n      this.currentStep = this.props.steps[this.props.current];\n      this.currentStepTitles = this.currentStep?.titles ?? { title: '' };\n    }\n  }\n\n  working() {\n    this.props.state = ComponentStates.WORKING;\n    if (this.Current?.buttons) {\n      this.Current.buttons.forEach(button => {\n        button.state = ComponentStates.DISABLED;\n      });\n    }\n    this.cdr.markForCheck();\n  }\n\n  done() {\n    if (this.props.state === ComponentStates.ENABLED) {\n      return;\n    }\n\n    this.props.state = ComponentStates.ENABLED;\n    if (this.Current?.buttons) {\n      this.Current.buttons.forEach(button => {\n        button.state = ComponentStates.ENABLED;\n      });\n    }\n    this.cdr.markForCheck();\n  }\n\n  get Current(): Step {\n    if (this.props?.steps && this.props?.current) {\n      return this.props.steps[this.props.current];\n    }\n    return this.currentStep || { titles: { title: '' }, buttons: [] };\n  }\n\n  setCurrent(newStep: number) {\n    if (newStep === this.props.current) {\n      return;\n    }\n\n    this.props.current = newStep;\n    this.updateCurrentStep();\n\n    goToTop(this.wrapperId);\n  }\n\n  setError(error: string) {\n    if (this.props.state === ComponentStates.ERROR) {\n      return;\n    }\n\n    this.props.error.titles.description = error;\n    this.props.state = ComponentStates.ERROR;\n    this.cdr.markForCheck();\n    goToTop(this.wrapperId);\n  }\n\n  reset() {\n    this.props.error.titles.description = '';\n    this.done();\n  }\n\n  clickHandler(token?: string) {\n    if (!token) {\n      return;\n    }\n    if (token.includes('retry')) {\n      this.reset();\n    }\n\n    this.onClick.emit({ current: this.props.current, motion: MOTION.RETRY });\n  }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { I18nService } from '../../../services/i18n';\nimport {\n  IonIcon,\n  IonButton,\n  IonBadge,\n  IonTextarea,\n  IonItem,\n  IonSelect,\n  IonSelectOption,\n  IonSpinner,\n  IonInfiniteScroll,\n  IonInfiniteScrollContent,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  chatbubblesOutline,\n  filterOutline,\n  sendOutline,\n  chatbubbleEllipsesOutline,\n  swapVerticalOutline,\n} from 'ionicons/icons';\n\nimport { CommentComponent } from '../../molecules/comment/comment.component';\nimport { AvatarComponent } from '../../atoms/avatar/avatar.component';\nimport { SkeletonComponent } from '../../atoms/skeleton/skeleton.component';\nimport {\n  CommentSectionMetadata,\n  CommentSortOption,\n  CommentSortChangeEvent,\n  CommentSubmitEvent,\n  CommentSectionLoadMoreEvent,\n} from './types';\nimport {\n  CommentAuthorClickEvent,\n  CommentReactionClickEvent,\n  CommentActionClickEvent,\n  CommentMenuItemClickEvent,\n  CommentLoadMoreEvent,\n} from '../../molecules/comment/types';\n\naddIcons({\n  chatbubblesOutline,\n  filterOutline,\n  sendOutline,\n  chatbubbleEllipsesOutline,\n  swapVerticalOutline,\n});\n\n@Component({\n  selector: 'val-comment-section',\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    IonIcon,\n    IonButton,\n    IonBadge,\n    IonTextarea,\n    IonItem,\n    IonSelect,\n    IonSelectOption,\n    IonSpinner,\n    IonInfiniteScroll,\n    IonInfiniteScrollContent,\n    CommentComponent,\n    AvatarComponent,\n    SkeletonComponent,\n  ],\n  template: `\n    <div class=\"comment-section\" [class.loading]=\"props.loading\">\n      <!-- Header -->\n      <div class=\"section-header\">\n        <div class=\"header-title\">\n          <ion-icon name=\"chatbubbles-outline\" class=\"title-icon\"></ion-icon>\n          <h3 class=\"title\">{{ displayTitle }}</h3>\n          @if (props.showCount !== false && props.count !== undefined) {\n            <ion-badge color=\"medium\" class=\"count-badge\">\n              {{ formatCount(props.count) }}\n            </ion-badge>\n          }\n        </div>\n\n        @if (props.sortOptions && props.sortOptions.length > 0) {\n          <div class=\"header-actions\">\n            <ion-item lines=\"none\" class=\"sort-select-item\">\n              <ion-icon name=\"swap-vertical-outline\" slot=\"start\" class=\"sort-icon\"></ion-icon>\n              <ion-select\n                [value]=\"props.selectedSort\"\n                [placeholder]=\"props.sortLabel || getSortByLabel()\"\n                interface=\"popover\"\n                (ionChange)=\"onSortChange($event)\"\n              >\n                @for (option of props.sortOptions; track option.token) {\n                  <ion-select-option [value]=\"option.token\">\n                    {{ getSortOptionLabel(option) }}\n                  </ion-select-option>\n                }\n              </ion-select>\n            </ion-item>\n          </div>\n        }\n      </div>\n\n      <!-- New Comment Input -->\n      @if (props.showInput !== false) {\n        <div class=\"new-comment-section\">\n          <div class=\"input-wrapper\">\n            @if (props.inputConfig?.currentUser?.avatar) {\n              <div class=\"input-avatar\">\n                <val-avatar [props]=\"props.inputConfig.currentUser.avatar\"></val-avatar>\n              </div>\n            }\n\n            <div class=\"input-container\">\n              <ion-textarea\n                [(ngModel)]=\"newCommentText\"\n                [placeholder]=\"getInputPlaceholder()\"\n                [maxlength]=\"props.inputConfig?.maxLength || 2000\"\n                [disabled]=\"props.inputConfig?.disabled || props.loading\"\n                [autoGrow]=\"true\"\n                rows=\"2\"\n                class=\"comment-textarea\"\n              ></ion-textarea>\n\n              <div class=\"input-actions\">\n                @if (props.inputConfig?.showCounter && props.inputConfig?.maxLength) {\n                  <span class=\"char-counter\" [class.warning]=\"isNearLimit()\">\n                    {{ newCommentText.length }} / {{ props.inputConfig.maxLength }}\n                  </span>\n                }\n\n                <ion-button\n                  [color]=\"props.inputConfig?.submitColor || props.color || 'primary'\"\n                  [disabled]=\"!canSubmit()\"\n                  size=\"small\"\n                  (click)=\"onSubmitComment()\"\n                >\n                  <ion-icon name=\"send-outline\" slot=\"start\"></ion-icon>\n                  {{ getSubmitLabel() }}\n                </ion-button>\n              </div>\n            </div>\n          </div>\n        </div>\n      }\n\n      @if (props.loading) {\n        <div class=\"loading-state\">\n          @for (i of getSkeletonArray(); track i) {\n            <div class=\"skeleton-comment\">\n              <val-skeleton [props]=\"{ type: 'avatar', width: '36px', height: '36px' }\"></val-skeleton>\n              <div class=\"skeleton-content\">\n                <val-skeleton [props]=\"{ type: 'text', width: '120px', height: '14px' }\"></val-skeleton>\n                <val-skeleton [props]=\"{ type: 'paragraph', lines: 2 }\"></val-skeleton>\n              </div>\n            </div>\n          }\n        </div>\n      } @else if (props.comments && props.comments.length > 0) {\n        <div class=\"comments-list\" [class.with-dividers]=\"props.showDividers\">\n          @for (comment of props.comments; track comment.token) {\n            <val-comment\n              [props]=\"comment\"\n              (authorClick)=\"authorClick.emit($event)\"\n              (reactionClick)=\"reactionClick.emit($event)\"\n              (actionClick)=\"onCommentAction($event)\"\n              (menuItemClick)=\"menuItemClick.emit($event)\"\n              (loadMoreClick)=\"commentLoadMore.emit($event)\"\n              (collapseToggle)=\"collapseToggle.emit($event)\"\n            ></val-comment>\n\n            @if (props.showDividers && !$last) {\n              <div class=\"comment-divider\"></div>\n            }\n          }\n\n          @if (props.hasMore && props.paginationMode !== 'infinite') {\n            <div class=\"load-more-section\">\n              @if (props.loadingMore) {\n                <ion-spinner name=\"circular\" [color]=\"props.color || 'primary'\"></ion-spinner>\n              } @else {\n                <ion-button fill=\"outline\" [color]=\"props.color || 'primary'\" expand=\"block\" (click)=\"onLoadMore()\">\n                  {{ displayLoadMoreLabel }}\n                </ion-button>\n              }\n            </div>\n          }\n        </div>\n\n        @if (props.paginationMode === 'infinite') {\n          <ion-infinite-scroll\n            [threshold]=\"props.infiniteScrollThreshold || '100px'\"\n            [position]=\"props.infiniteScrollPosition || 'bottom'\"\n            [disabled]=\"!props.hasMore\"\n            (ionInfinite)=\"onInfiniteScroll($event)\"\n          >\n            <ion-infinite-scroll-content\n              [loadingSpinner]=\"'crescent'\"\n              [loadingText]=\"displayLoadMoreLabel\"\n            ></ion-infinite-scroll-content>\n          </ion-infinite-scroll>\n        }\n      } @else {\n        <div class=\"empty-state\">\n          <ion-icon [name]=\"props.emptyState?.icon || 'chatbubble-ellipses-outline'\" class=\"empty-icon\"></ion-icon>\n          <h4 class=\"empty-title\">{{ getEmptyTitle() }}</h4>\n          <p class=\"empty-message\">{{ getEmptyMessage() }}</p>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./comment-section.component.scss'],\n})\n/**\n * val-comment-section\n *\n * An organism component that provides a complete comment section with:\n * - Header with title and count\n * - Sort/filter options\n * - New comment input\n * - Comments list with val-comment\n * - Load more pagination\n * - Empty state\n *\n * @example Basic usage\n * <val-comment-section [props]=\"{\n *   title: 'Comments',\n *   count: 42,\n *   comments: commentsArray,\n *   showInput: true\n * }\"></val-comment-section>\n *\n * @example With sorting\n * <val-comment-section [props]=\"{\n *   title: 'Reviews',\n *   count: 128,\n *   comments: reviews,\n *   sortOptions: [\n *     { token: 'newest', label: 'Newest first' },\n *     { token: 'oldest', label: 'Oldest first' },\n *     { token: 'popular', label: 'Most popular' }\n *   ],\n *   selectedSort: 'newest'\n * }\" (sortChange)=\"onSort($event)\"></val-comment-section>\n *\n * @input props: CommentSectionMetadata - Configuration for the section\n * @output sortChange - Sort option changed\n * @output commentSubmit - New comment submitted\n * @output loadMore - Load more clicked\n * @output authorClick - Comment author clicked (bubbled from val-comment)\n * @output reactionClick - Reaction clicked (bubbled)\n * @output actionClick - Action clicked (bubbled)\n * @output menuItemClick - Menu item clicked (bubbled)\n * @output commentLoadMore - Load more replies clicked (bubbled)\n * @output collapseToggle - Comment collapse toggled (bubbled)\n */\nexport class CommentSectionComponent implements OnInit {\n  private i18n = inject(I18nService);\n\n  @Input() props: CommentSectionMetadata;\n\n  // Section events\n  @Output() sortChange = new EventEmitter<CommentSortChangeEvent>();\n  @Output() commentSubmit = new EventEmitter<CommentSubmitEvent>();\n  @Output() loadMore = new EventEmitter<CommentSectionLoadMoreEvent>();\n\n  // Bubbled events from val-comment\n  @Output() authorClick = new EventEmitter<CommentAuthorClickEvent>();\n  @Output() reactionClick = new EventEmitter<CommentReactionClickEvent>();\n  @Output() actionClick = new EventEmitter<CommentActionClickEvent>();\n  @Output() menuItemClick = new EventEmitter<CommentMenuItemClickEvent>();\n  @Output() commentLoadMore = new EventEmitter<CommentLoadMoreEvent>();\n  @Output() collapseToggle = new EventEmitter<{ token: string; collapsed: boolean }>();\n\n  // Reply state\n  @Output() replyStart = new EventEmitter<{ commentToken: string }>();\n\n  newCommentText = '';\n  replyingTo: string | null = null;\n\n  displayTitle = '';\n  displayLoadMoreLabel = '';\n\n  ngOnInit(): void {\n    this.updateDisplayTexts();\n  }\n\n  private updateDisplayTexts(): void {\n    this.displayTitle = this.props.title || this.i18n.t('comments');\n    this.displayLoadMoreLabel = this.props.loadMoreLabel || this.i18n.t('loadMoreComments');\n  }\n\n  getSortByLabel(): string {\n    return this.i18n.t('sortBy');\n  }\n\n  formatCount(count: number): string {\n    if (count >= 1000000) {\n      return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n    }\n    if (count >= 1000) {\n      return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n    }\n    return count.toString();\n  }\n\n  getSortOptionLabel(option: CommentSortOption): string {\n    return option.label;\n  }\n\n  getInputPlaceholder(): string {\n    return this.props.inputConfig?.placeholder || this.i18n.t('writeComment');\n  }\n\n  getSubmitLabel(): string {\n    return this.props.inputConfig?.submitLabel || this.i18n.t('publish');\n  }\n\n  getEmptyTitle(): string {\n    return this.props.emptyState?.title || this.i18n.t('noCommentsYet');\n  }\n\n  getEmptyMessage(): string {\n    return this.props.emptyState?.message || this.i18n.t('beFirstToComment');\n  }\n\n  getSkeletonArray(): number[] {\n    const count = this.props.skeletonCount || 3;\n    return Array(count)\n      .fill(0)\n      .map((_, i) => i);\n  }\n\n  canSubmit(): boolean {\n    const minLength = this.props.inputConfig?.minLength || 1;\n    return this.newCommentText.trim().length >= minLength && !this.props.loading && !this.props.inputConfig?.disabled;\n  }\n\n  isNearLimit(): boolean {\n    const maxLength = this.props.inputConfig?.maxLength || 2000;\n    return this.newCommentText.length > maxLength * 0.9;\n  }\n\n  onSortChange(event: CustomEvent): void {\n    const selectedToken = event.detail.value;\n    const option = this.props.sortOptions?.find(o => o.token === selectedToken);\n\n    if (option) {\n      this.sortChange.emit({\n        option,\n        previousSort: this.props.selectedSort,\n      });\n    }\n  }\n\n  onSubmitComment(): void {\n    if (!this.canSubmit()) return;\n\n    this.commentSubmit.emit({\n      content: this.newCommentText.trim(),\n      parentToken: this.replyingTo || undefined,\n      sectionToken: this.props.token,\n    });\n\n    this.newCommentText = '';\n    this.replyingTo = null;\n  }\n\n  onCommentAction(event: CommentActionClickEvent): void {\n    // Check if it's a reply action\n    if (event.action.token === 'reply') {\n      this.replyingTo = event.commentToken;\n      this.replyStart.emit({ commentToken: event.commentToken });\n    }\n\n    this.actionClick.emit(event);\n  }\n\n  onLoadMore(): void {\n    this.loadMore.emit({\n      sectionToken: this.props.token,\n      currentCount: this.props.comments?.length || 0,\n    });\n  }\n\n  onInfiniteScroll(event: CustomEvent): void {\n    this.loadMore.emit({\n      sectionToken: this.props.token,\n      currentCount: this.props.comments?.length || 0,\n    });\n\n    // The parent component should call completeInfiniteScroll() when done loading\n    // Store reference to complete the infinite scroll\n    this.infiniteScrollEvent = event;\n  }\n\n  // Call this method from parent after loading more comments\n  completeInfiniteScroll(): void {\n    if (this.infiniteScrollEvent) {\n      (this.infiniteScrollEvent.target as HTMLIonInfiniteScrollElement).complete();\n      this.infiniteScrollEvent = null;\n    }\n  }\n\n  private infiniteScrollEvent: CustomEvent | null = null;\n\n  // Method to programmatically start a reply\n  startReply(commentToken: string): void {\n    this.replyingTo = commentToken;\n  }\n\n  // Method to cancel reply\n  cancelReply(): void {\n    this.replyingTo = null;\n  }\n}\n","import { Color } from '@ionic/core';\nimport { TemplateRef } from '@angular/core';\n\n/**\n * Column definition for the data table.\n */\nexport interface DataTableColumn<T = any> {\n  /** Unique identifier for the column */\n  key: string;\n  /** Header label */\n  label: string;\n  /** Property path in the data object (supports dot notation) */\n  field?: string;\n  /** Column width (CSS value) */\n  width?: string;\n  /** Minimum width */\n  minWidth?: string;\n  /** Maximum width */\n  maxWidth?: string;\n  /** Text alignment */\n  align?: 'left' | 'center' | 'right';\n  /** Whether the column is sortable */\n  sortable?: boolean;\n  /** Custom sort function */\n  sortFn?: (a: T, b: T) => number;\n  /** Whether the column is visible */\n  visible?: boolean;\n  /** Custom cell template */\n  cellTemplate?: TemplateRef<any>;\n  /** Custom header template */\n  headerTemplate?: TemplateRef<any>;\n  /** Format function for cell value */\n  format?: (value: any, row: T) => string;\n  /** CSS class for the column */\n  cssClass?: string;\n  /** Whether this is a sticky column */\n  sticky?: 'start' | 'end';\n}\n\n/**\n * Sort configuration.\n */\nexport interface DataTableSort {\n  /** Column key to sort by */\n  column: string;\n  /** Sort direction */\n  direction: 'asc' | 'desc';\n}\n\n/**\n * Pagination configuration.\n */\nexport interface DataTablePagination {\n  /** Current page (0-indexed) */\n  page: number;\n  /** Items per page */\n  pageSize: number;\n  /** Total number of items */\n  total: number;\n  /** Available page size options */\n  pageSizeOptions?: number[];\n}\n\n/**\n * Selection configuration.\n */\nexport interface DataTableSelection<T = any> {\n  /** Selection mode */\n  mode: 'none' | 'single' | 'multiple';\n  /** Currently selected items */\n  selected: T[];\n  /** Function to get unique ID from row */\n  trackBy?: (row: T) => any;\n}\n\n/**\n * Row click event.\n */\nexport interface DataTableRowClickEvent<T = any> {\n  /** The row data */\n  row: T;\n  /** Row index */\n  index: number;\n  /** Original mouse event */\n  event: MouseEvent;\n}\n\n/**\n * Selection change event.\n */\nexport interface DataTableSelectionChangeEvent<T = any> {\n  /** Selected rows */\n  selected: T[];\n  /** Row that was changed (if single change) */\n  changedRow?: T;\n  /** Action performed */\n  action: 'select' | 'deselect' | 'selectAll' | 'deselectAll';\n}\n\n/**\n * Sort change event.\n */\nexport interface DataTableSortChangeEvent {\n  /** Column key */\n  column: string;\n  /** Sort direction */\n  direction: 'asc' | 'desc' | null;\n}\n\n/**\n * Page change event.\n */\nexport interface DataTablePageChangeEvent {\n  /** New page number */\n  page: number;\n  /** Page size */\n  pageSize: number;\n  /** Previous page */\n  previousPage: number;\n}\n\n/**\n * Empty state configuration.\n */\nexport interface DataTableEmptyState {\n  /** Icon to display */\n  icon?: string;\n  /** Title text */\n  title?: string;\n  /** Description text */\n  description?: string;\n  /** Custom template */\n  template?: TemplateRef<any>;\n}\n\n/**\n * Loading state configuration.\n */\nexport interface DataTableLoadingState {\n  /** Whether data is loading */\n  loading: boolean;\n  /** Number of skeleton rows to show */\n  skeletonRows?: number;\n  /** Loading message */\n  message?: string;\n}\n\n/**\n * Metadata for the data table component.\n */\nexport interface DataTableMetadata<T = any> {\n  /** Column definitions */\n  columns: DataTableColumn<T>[];\n  /** Data rows */\n  data: T[];\n\n  // === Sorting ===\n  /** Current sort configuration */\n  sort?: DataTableSort;\n  /** Enable client-side sorting */\n  clientSort?: boolean;\n\n  // === Pagination ===\n  /** Pagination configuration */\n  pagination?: DataTablePagination;\n  /** Enable client-side pagination */\n  clientPagination?: boolean;\n  /** Show pagination controls */\n  showPagination?: boolean;\n\n  // === Selection ===\n  /** Selection configuration */\n  selection?: DataTableSelection<T>;\n  /** Show selection column */\n  showSelectionColumn?: boolean;\n\n  // === Display options ===\n  /** Table size variant */\n  size?: 'small' | 'medium' | 'large';\n  /** Show borders */\n  bordered?: boolean;\n  /** Striped rows */\n  striped?: boolean;\n  /** Hoverable rows */\n  hoverable?: boolean;\n  /** Fixed header */\n  stickyHeader?: boolean;\n  /** Table max height (enables scrolling) */\n  maxHeight?: string;\n  /** Show row numbers */\n  showRowNumbers?: boolean;\n  /** Row number start */\n  rowNumberStart?: number;\n\n  // === Empty & Loading states ===\n  /** Empty state configuration */\n  emptyState?: DataTableEmptyState;\n  /** Loading state */\n  loadingState?: DataTableLoadingState;\n\n  // === Styling ===\n  /** Custom CSS class */\n  cssClass?: string;\n  /** Header color */\n  headerColor?: Color;\n  /** Row click enabled */\n  rowClickable?: boolean;\n\n  // === Modern Styling Options ===\n  /** Elevation level for box shadow */\n  elevation?: 'none' | 'low' | 'medium' | 'high';\n  /** Show gradient accent on top border */\n  headerGradient?: boolean;\n  /** Checkbox style variant */\n  checkboxStyle?: 'default' | 'circular';\n  /** Row selection highlight style */\n  rowHighlightStyle?: 'background' | 'border-left' | 'both';\n\n  // === Actions ===\n  /** Row actions template */\n  actionsTemplate?: TemplateRef<any>;\n  /** Actions column width */\n  actionsWidth?: string;\n  /** Actions column label */\n  actionsLabel?: string;\n\n  // === Accessibility ===\n  /** Table caption for screen readers */\n  caption?: string;\n  /** ARIA label */\n  ariaLabel?: string;\n\n  // === Reactive content ===\n  /** Content class for reactive content */\n  contentClass?: string;\n\n  // === Responsive ===\n  /** Responsive mode: 'scroll' (default) or 'cards' for mobile card view */\n  responsiveMode?: 'scroll' | 'cards';\n  /** Breakpoint for card view in pixels. Default: 768 */\n  responsiveBreakpoint?: number;\n  /** Custom template for mobile card view */\n  mobileCardTemplate?: TemplateRef<any>;\n}\n\n/**\n * Default pagination options.\n */\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];\n\n/**\n * Default empty state.\n */\nexport const DEFAULT_EMPTY_STATE: DataTableEmptyState = {\n  icon: 'document-outline',\n  title: 'No hay datos',\n  description: 'No se encontraron registros para mostrar.',\n};\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  inject,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { IonButton, IonIcon, IonCheckbox, IonSpinner, IonSelect, IonSelectOption } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  chevronUpOutline,\n  chevronDownOutline,\n  chevronBackOutline,\n  chevronForwardOutline,\n  documentOutline,\n} from 'ionicons/icons';\nimport { I18nService } from '../../../services/i18n';\nimport {\n  DataTableMetadata,\n  DataTableColumn,\n  DataTableSort,\n  DataTableRowClickEvent,\n  DataTableSelectionChangeEvent,\n  DataTableSortChangeEvent,\n  DataTablePageChangeEvent,\n  DataTableEmptyState,\n  DEFAULT_PAGE_SIZE_OPTIONS,\n} from './types';\n\naddIcons({\n  chevronUpOutline,\n  chevronDownOutline,\n  chevronBackOutline,\n  chevronForwardOutline,\n  documentOutline,\n});\n\n@Component({\n  selector: 'val-data-table',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, IonButton, IonIcon, IonCheckbox, IonSpinner, IonSelect, IonSelectOption],\n  template: `\n    <div\n      class=\"data-table-container\"\n      [class]=\"props.cssClass\"\n      [class.size-small]=\"props.size === 'small'\"\n      [class.size-medium]=\"props.size === 'medium' || !props.size\"\n      [class.size-large]=\"props.size === 'large'\"\n      [class.bordered]=\"props.bordered\"\n      [class.striped]=\"props.striped\"\n      [class.hoverable]=\"props.hoverable !== false\"\n      [class.sticky-header]=\"props.stickyHeader\"\n      [class.responsive-cards]=\"props.responsiveMode === 'cards'\"\n      [class.elevation-none]=\"props.elevation === 'none'\"\n      [class.elevation-low]=\"props.elevation === 'low'\"\n      [class.elevation-high]=\"props.elevation === 'high'\"\n      [class.header-gradient]=\"props.headerGradient\"\n      [class.checkbox-circular]=\"props.checkboxStyle === 'circular'\"\n      [class.row-highlight-border]=\"props.rowHighlightStyle === 'border-left'\"\n      [class.row-highlight-both]=\"props.rowHighlightStyle === 'both'\"\n      [style.--max-height]=\"props.maxHeight\"\n    >\n      <!-- Toolbar slot -->\n      <div class=\"table-toolbar\" #toolbarContainer>\n        <ng-content select=\"[toolbar]\"></ng-content>\n      </div>\n\n      <!-- Loading overlay -->\n      @if (props.loadingState?.loading) {\n        <div class=\"loading-overlay\">\n          <ion-spinner name=\"circular\"></ion-spinner>\n          @if (props.loadingState?.message) {\n            <span class=\"loading-message\">{{ props.loadingState.message }}</span>\n          }\n        </div>\n      }\n\n      <div class=\"table-wrapper\" [class.is-loading]=\"props.loadingState?.loading\">\n        <table role=\"grid\" [attr.aria-label]=\"props.ariaLabel\">\n          @if (props.caption) {\n            <caption class=\"sr-only\">\n              {{\n                props.caption\n              }}\n            </caption>\n          }\n\n          <thead>\n            <tr>\n              <!-- Selection column -->\n              @if (props.showSelectionColumn && props.selection?.mode === 'multiple') {\n                <th class=\"selection-cell\">\n                  <ion-checkbox\n                    [checked]=\"isAllSelected\"\n                    [indeterminate]=\"isIndeterminate\"\n                    (ionChange)=\"toggleSelectAll($event)\"\n                  ></ion-checkbox>\n                </th>\n              }\n              @if (props.showSelectionColumn && props.selection?.mode === 'single') {\n                <th class=\"selection-cell\"></th>\n              }\n\n              <!-- Row number column -->\n              @if (props.showRowNumbers) {\n                <th class=\"row-number-cell\">#</th>\n              }\n\n              <!-- Data columns -->\n              @for (column of visibleColumns; track column.key) {\n                <th\n                  [class]=\"getColumnClass(column)\"\n                  [style.width]=\"column.width\"\n                  [style.min-width]=\"column.minWidth\"\n                  [style.max-width]=\"column.maxWidth\"\n                  [class.sortable]=\"column.sortable\"\n                  [class.sorted]=\"currentSort?.column === column.key\"\n                  (click)=\"column.sortable ? onSort(column) : null\"\n                  [attr.aria-sort]=\"getAriaSort(column)\"\n                >\n                  @if (column.headerTemplate) {\n                    <ng-container *ngTemplateOutlet=\"column.headerTemplate; context: { column }\"></ng-container>\n                  } @else {\n                    <span class=\"header-content\">\n                      {{ column.label }}\n                      @if (column.sortable) {\n                        <span class=\"sort-icons\">\n                          <ion-icon\n                            name=\"chevron-up-outline\"\n                            [class.active]=\"currentSort?.column === column.key && currentSort?.direction === 'asc'\"\n                          ></ion-icon>\n                          <ion-icon\n                            name=\"chevron-down-outline\"\n                            [class.active]=\"currentSort?.column === column.key && currentSort?.direction === 'desc'\"\n                          ></ion-icon>\n                        </span>\n                      }\n                    </span>\n                  }\n                </th>\n              }\n\n              <!-- Actions column -->\n              @if (props.actionsTemplate) {\n                <th class=\"actions-cell\" [style.width]=\"props.actionsWidth || '100px'\">\n                  {{ getActionsLabel() }}\n                </th>\n              }\n            </tr>\n          </thead>\n\n          <tbody>\n            @if (displayedData.length === 0 && !props.loadingState?.loading) {\n              <tr class=\"empty-row\">\n                <td [attr.colspan]=\"totalColumns\">\n                  <div class=\"empty-state\">\n                    @if (emptyState.template) {\n                      <ng-container *ngTemplateOutlet=\"emptyState.template\"></ng-container>\n                    } @else {\n                      @if (emptyState.icon) {\n                        <ion-icon [name]=\"emptyState.icon\" class=\"empty-icon\"></ion-icon>\n                      }\n                      @if (emptyState.title) {\n                        <h4 class=\"empty-title\">{{ emptyState.title }}</h4>\n                      }\n                      @if (emptyState.description) {\n                        <p class=\"empty-description\">{{ emptyState.description }}</p>\n                      }\n                    }\n                  </div>\n                </td>\n              </tr>\n            } @else {\n              @for (row of displayedData; track trackByFn(row); let i = $index) {\n                <tr\n                  [class.selected]=\"isRowSelected(row)\"\n                  [class.clickable]=\"props.rowClickable\"\n                  (click)=\"onRowClick(row, i, $event)\"\n                >\n                  <!-- Selection cell -->\n                  @if (props.showSelectionColumn) {\n                    <td class=\"selection-cell\">\n                      @if (props.selection?.mode === 'multiple') {\n                        <ion-checkbox\n                          [checked]=\"isRowSelected(row)\"\n                          (ionChange)=\"toggleRowSelection(row, $event)\"\n                          (click)=\"$event.stopPropagation()\"\n                        ></ion-checkbox>\n                      } @else if (props.selection?.mode === 'single') {\n                        <input\n                          type=\"radio\"\n                          [checked]=\"isRowSelected(row)\"\n                          (click)=\"selectSingleRow(row); $event.stopPropagation()\"\n                        />\n                      }\n                    </td>\n                  }\n\n                  <!-- Row number -->\n                  @if (props.showRowNumbers) {\n                    <td class=\"row-number-cell\">{{ getRowNumber(i) }}</td>\n                  }\n\n                  <!-- Data cells -->\n                  @for (column of visibleColumns; track column.key) {\n                    <td [class]=\"getColumnClass(column)\" [style.text-align]=\"column.align\">\n                      @if (column.cellTemplate) {\n                        <ng-container\n                          *ngTemplateOutlet=\"\n                            column.cellTemplate;\n                            context: { row, column, value: getCellValue(row, column) }\n                          \"\n                        ></ng-container>\n                      } @else {\n                        {{ getFormattedValue(row, column) }}\n                      }\n                    </td>\n                  }\n\n                  <!-- Actions cell -->\n                  @if (props.actionsTemplate) {\n                    <td class=\"actions-cell\">\n                      <ng-container\n                        *ngTemplateOutlet=\"props.actionsTemplate; context: { row, index: i }\"\n                      ></ng-container>\n                    </td>\n                  }\n                </tr>\n              }\n            }\n          </tbody>\n        </table>\n      </div>\n\n      <!-- Card view (responsive mobile) -->\n      @if (props.responsiveMode === 'cards') {\n        <div class=\"card-list\">\n          @if (displayedData.length === 0 && !props.loadingState?.loading) {\n            <div class=\"empty-state\">\n              @if (emptyState.icon) {\n                <ion-icon [name]=\"emptyState.icon\" class=\"empty-icon\"></ion-icon>\n              }\n              @if (emptyState.title) {\n                <h4 class=\"empty-title\">{{ emptyState.title }}</h4>\n              }\n              @if (emptyState.description) {\n                <p class=\"empty-description\">{{ emptyState.description }}</p>\n              }\n            </div>\n          } @else {\n            @for (row of displayedData; track trackByFn(row); let i = $index) {\n              @if (props.mobileCardTemplate) {\n                <ng-container\n                  *ngTemplateOutlet=\"props.mobileCardTemplate; context: { row, index: i, columns: visibleColumns }\"\n                ></ng-container>\n              } @else {\n                <div\n                  class=\"data-card\"\n                  [class.selected]=\"isRowSelected(row)\"\n                  [class.clickable]=\"props.rowClickable\"\n                  (click)=\"onRowClick(row, i, $event)\"\n                >\n                  <!-- Card header with selection -->\n                  @if (props.showSelectionColumn) {\n                    <div class=\"card-header\">\n                      <div class=\"card-selection\">\n                        @if (props.selection?.mode === 'multiple') {\n                          <ion-checkbox\n                            [checked]=\"isRowSelected(row)\"\n                            (ionChange)=\"toggleRowSelection(row, $event)\"\n                            (click)=\"$event.stopPropagation()\"\n                          ></ion-checkbox>\n                        } @else if (props.selection?.mode === 'single') {\n                          <input\n                            type=\"radio\"\n                            [checked]=\"isRowSelected(row)\"\n                            (click)=\"selectSingleRow(row); $event.stopPropagation()\"\n                          />\n                        }\n                      </div>\n                      @if (props.showRowNumbers) {\n                        <span class=\"row-number\">{{ getRowNumber(i) }}</span>\n                      }\n                    </div>\n                  }\n\n                  <!-- Card body with fields -->\n                  <div class=\"card-body\">\n                    @for (column of visibleColumns; track column.key) {\n                      <div class=\"card-field\">\n                        <span class=\"card-field__label\">{{ column.label }}</span>\n                        <span class=\"card-field__value\">\n                          @if (column.cellTemplate) {\n                            <ng-container\n                              *ngTemplateOutlet=\"\n                                column.cellTemplate;\n                                context: { row, column, value: getCellValue(row, column) }\n                              \"\n                            ></ng-container>\n                          } @else {\n                            {{ getFormattedValue(row, column) }}\n                          }\n                        </span>\n                      </div>\n                    }\n                  </div>\n\n                  <!-- Card actions -->\n                  @if (props.actionsTemplate) {\n                    <div class=\"card-actions\">\n                      <ng-container\n                        *ngTemplateOutlet=\"props.actionsTemplate; context: { row, index: i }\"\n                      ></ng-container>\n                    </div>\n                  }\n                </div>\n              }\n            }\n          }\n        </div>\n      }\n\n      <!-- Pagination -->\n      @if (props.showPagination && props.pagination) {\n        <div class=\"pagination-container\">\n          <div class=\"pagination-info\">\n            <span>\n              {{ getPaginationInfoText() }}\n            </span>\n\n            @if (pageSizeOptions.length > 1) {\n              <ion-select\n                [value]=\"props.pagination.pageSize\"\n                (ionChange)=\"onPageSizeChange($event)\"\n                interface=\"popover\"\n                class=\"page-size-select\"\n              >\n                @for (size of pageSizeOptions; track size) {\n                  <ion-select-option [value]=\"size\">{{ getPerPageText(size) }}</ion-select-option>\n                }\n              </ion-select>\n            }\n          </div>\n\n          <div class=\"pagination-controls\">\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              [disabled]=\"props.pagination.page === 0\"\n              (click)=\"goToPage(0)\"\n              [attr.aria-label]=\"getFirstPageLabel()\"\n            >\n              <ion-icon slot=\"icon-only\" name=\"chevron-back-outline\"></ion-icon>\n              <ion-icon slot=\"icon-only\" name=\"chevron-back-outline\" style=\"margin-left: -12px\"></ion-icon>\n            </ion-button>\n\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              [disabled]=\"props.pagination.page === 0\"\n              (click)=\"goToPage(props.pagination.page - 1)\"\n              [attr.aria-label]=\"getPreviousPageLabel()\"\n            >\n              <ion-icon slot=\"icon-only\" name=\"chevron-back-outline\"></ion-icon>\n            </ion-button>\n\n            <span class=\"page-indicator\"> {{ props.pagination.page + 1 }} / {{ totalPages }} </span>\n\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              [disabled]=\"props.pagination.page >= totalPages - 1\"\n              (click)=\"goToPage(props.pagination.page + 1)\"\n              [attr.aria-label]=\"getNextPageLabel()\"\n            >\n              <ion-icon slot=\"icon-only\" name=\"chevron-forward-outline\"></ion-icon>\n            </ion-button>\n\n            <ion-button\n              fill=\"clear\"\n              size=\"small\"\n              [disabled]=\"props.pagination.page >= totalPages - 1\"\n              (click)=\"goToPage(totalPages - 1)\"\n              [attr.aria-label]=\"getLastPageLabel()\"\n            >\n              <ion-icon slot=\"icon-only\" name=\"chevron-forward-outline\"></ion-icon>\n              <ion-icon slot=\"icon-only\" name=\"chevron-forward-outline\" style=\"margin-left: -12px\"></ion-icon>\n            </ion-button>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./data-table.component.scss'],\n})\n/**\n * val-data-table\n *\n * A flexible data table component for displaying tabular data with sorting,\n * pagination, and selection features.\n *\n * @example Basic usage\n * ```html\n * <val-data-table\n *   [props]=\"{\n *     columns: [\n *       { key: 'name', label: 'Nombre', sortable: true },\n *       { key: 'email', label: 'Email' },\n *       { key: 'status', label: 'Estado' }\n *     ],\n *     data: users\n *   }\"\n * ></val-data-table>\n * ```\n *\n * @example With pagination and selection\n * ```html\n * <val-data-table\n *   [props]=\"{\n *     columns: columns,\n *     data: participants,\n *     showPagination: true,\n *     pagination: {\n *       page: 0,\n *       pageSize: 25,\n *       total: totalCount\n *     },\n *     selection: {\n *       mode: 'multiple',\n *       selected: selectedParticipants\n *     },\n *     showSelectionColumn: true\n *   }\"\n *   (selectionChange)=\"onSelectionChange($event)\"\n *   (pageChange)=\"onPageChange($event)\"\n * ></val-data-table>\n * ```\n */\nexport class DataTableComponent<T = any> implements OnInit, OnChanges {\n  @Input() props: DataTableMetadata<T>;\n\n  @Output() rowClick = new EventEmitter<DataTableRowClickEvent<T>>();\n  @Output() selectionChange = new EventEmitter<DataTableSelectionChangeEvent<T>>();\n  @Output() sortChange = new EventEmitter<DataTableSortChangeEvent>();\n  @Output() pageChange = new EventEmitter<DataTablePageChangeEvent>();\n\n  displayedData: T[] = [];\n  currentSort: DataTableSort | null = null;\n  selectedRows: Set<any> = new Set();\n\n  /** Cached visible columns for performance */\n  private _visibleColumns: DataTableColumn<T>[] = [];\n\n  private cdr = inject(ChangeDetectorRef);\n  private i18n = inject(I18nService);\n\n  ngOnInit(): void {\n    this.initializeState();\n    this.updateDisplayedData();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.initializeState();\n      this.updateDisplayedData();\n    }\n  }\n\n  private initializeState(): void {\n    // Cache visible columns for performance\n    this._visibleColumns = this.props.columns.filter(c => c.visible !== false);\n\n    // Initialize sort\n    this.currentSort = this.props.sort || null;\n\n    // Initialize selection\n    if (this.props.selection?.selected) {\n      this.selectedRows = new Set(this.props.selection.selected.map(row => this.getRowId(row)));\n    }\n  }\n\n  private updateDisplayedData(): void {\n    let data = [...this.props.data];\n\n    // Apply client-side sorting\n    if (this.props.clientSort && this.currentSort) {\n      data = this.sortData(data);\n    }\n\n    // Apply client-side pagination\n    if (this.props.clientPagination && this.props.pagination) {\n      const start = this.props.pagination.page * this.props.pagination.pageSize;\n      const end = start + this.props.pagination.pageSize;\n      data = data.slice(start, end);\n    }\n\n    this.displayedData = data;\n    this.cdr.markForCheck();\n  }\n\n  private sortData(data: T[]): T[] {\n    if (!this.currentSort) return data;\n\n    const column = this.props.columns.find(c => c.key === this.currentSort?.column);\n    if (!column) return data;\n\n    return [...data].sort((a, b) => {\n      if (column.sortFn) {\n        const result = column.sortFn(a, b);\n        return this.currentSort?.direction === 'desc' ? -result : result;\n      }\n\n      const valueA = this.getCellValue(a, column);\n      const valueB = this.getCellValue(b, column);\n\n      let comparison = 0;\n      if (valueA == null && valueB == null) comparison = 0;\n      else if (valueA == null) comparison = 1;\n      else if (valueB == null) comparison = -1;\n      else if (typeof valueA === 'string' && typeof valueB === 'string') {\n        comparison = valueA.localeCompare(valueB);\n      } else {\n        comparison = valueA < valueB ? -1 : valueA > valueB ? 1 : 0;\n      }\n\n      return this.currentSort?.direction === 'desc' ? -comparison : comparison;\n    });\n  }\n\n  get visibleColumns(): DataTableColumn<T>[] {\n    return this._visibleColumns;\n  }\n\n  get totalColumns(): number {\n    let count = this.visibleColumns.length;\n    if (this.props.showSelectionColumn) count++;\n    if (this.props.showRowNumbers) count++;\n    if (this.props.actionsTemplate) count++;\n    return count;\n  }\n\n  get emptyState(): DataTableEmptyState {\n    const defaultEmptyState: DataTableEmptyState = {\n      icon: 'document-outline',\n      title: this.i18n.t('noData'),\n      description: this.i18n.t('noRecordsFound'),\n    };\n    return this.props.emptyState || defaultEmptyState;\n  }\n\n  /** Get actions column label */\n  getActionsLabel(): string {\n    return this.props.actionsLabel || this.i18n.t('actions');\n  }\n\n  /** Get pagination info text */\n  getPaginationInfoText(): string {\n    return `${this.i18n.t('showing')} ${this.paginationStart}-${this.paginationEnd} ${this.i18n.t('of')} ${this.props.pagination?.total}`;\n  }\n\n  /** Get per page text */\n  getPerPageText(size: number): string {\n    return `${size} ${this.i18n.t('perPage')}`;\n  }\n\n  /** Get first page aria label */\n  getFirstPageLabel(): string {\n    return this.i18n.t('firstPage');\n  }\n\n  /** Get previous page aria label */\n  getPreviousPageLabel(): string {\n    return this.i18n.t('previousPage');\n  }\n\n  /** Get next page aria label */\n  getNextPageLabel(): string {\n    return this.i18n.t('nextPage');\n  }\n\n  /** Get last page aria label */\n  getLastPageLabel(): string {\n    return this.i18n.t('lastPage');\n  }\n\n  get pageSizeOptions(): number[] {\n    return this.props.pagination?.pageSizeOptions || DEFAULT_PAGE_SIZE_OPTIONS;\n  }\n\n  get totalPages(): number {\n    if (!this.props.pagination) return 1;\n    return Math.ceil(this.props.pagination.total / this.props.pagination.pageSize);\n  }\n\n  get paginationStart(): number {\n    if (!this.props.pagination) return 1;\n    return this.props.pagination.page * this.props.pagination.pageSize + 1;\n  }\n\n  get paginationEnd(): number {\n    if (!this.props.pagination) return this.displayedData.length;\n    return Math.min((this.props.pagination.page + 1) * this.props.pagination.pageSize, this.props.pagination.total);\n  }\n\n  get isAllSelected(): boolean {\n    if (this.displayedData.length === 0) return false;\n    return this.displayedData.every(row => this.isRowSelected(row));\n  }\n\n  get isIndeterminate(): boolean {\n    const selectedCount = this.displayedData.filter(row => this.isRowSelected(row)).length;\n    return selectedCount > 0 && selectedCount < this.displayedData.length;\n  }\n\n  getCellValue(row: T, column: DataTableColumn<T>): any {\n    const field = column.field || column.key;\n    return field.split('.').reduce((obj: any, key) => obj?.[key], row);\n  }\n\n  getFormattedValue(row: T, column: DataTableColumn<T>): string {\n    const value = this.getCellValue(row, column);\n    if (column.format) {\n      return column.format(value, row);\n    }\n    return value ?? '';\n  }\n\n  getColumnClass(column: DataTableColumn<T>): string {\n    const classes = [column.cssClass || ''];\n    if (column.sticky) {\n      classes.push(`sticky-${column.sticky}`);\n    }\n    if (column.align) {\n      classes.push(`align-${column.align}`);\n    }\n    return classes.filter(Boolean).join(' ');\n  }\n\n  getAriaSort(column: DataTableColumn<T>): string | null {\n    if (!column.sortable) return null;\n    if (this.currentSort?.column !== column.key) return 'none';\n    return this.currentSort.direction === 'asc' ? 'ascending' : 'descending';\n  }\n\n  getRowNumber(index: number): number {\n    const start = this.props.rowNumberStart ?? 1;\n    if (this.props.pagination) {\n      return start + this.props.pagination.page * this.props.pagination.pageSize + index;\n    }\n    return start + index;\n  }\n\n  getRowId(row: T): any {\n    if (this.props.selection?.trackBy) {\n      return this.props.selection.trackBy(row);\n    }\n    return row;\n  }\n\n  trackByFn(row: T): any {\n    return this.getRowId(row);\n  }\n\n  isRowSelected(row: T): boolean {\n    return this.selectedRows.has(this.getRowId(row));\n  }\n\n  onSort(column: DataTableColumn<T>): void {\n    if (!column.sortable) return;\n\n    let direction: 'asc' | 'desc' | null = 'asc';\n\n    if (this.currentSort?.column === column.key) {\n      if (this.currentSort.direction === 'asc') {\n        direction = 'desc';\n      } else {\n        direction = null;\n      }\n    }\n\n    if (direction) {\n      this.currentSort = { column: column.key, direction };\n    } else {\n      this.currentSort = null;\n    }\n\n    this.sortChange.emit({\n      column: column.key,\n      direction,\n    });\n\n    if (this.props.clientSort) {\n      this.updateDisplayedData();\n    }\n  }\n\n  onRowClick(row: T, index: number, event: MouseEvent): void {\n    if (!this.props.rowClickable) return;\n\n    this.rowClick.emit({\n      row,\n      index,\n      event,\n    });\n  }\n\n  toggleSelectAll(event: CustomEvent): void {\n    const checked = event.detail.checked;\n\n    if (checked) {\n      this.displayedData.forEach(row => {\n        this.selectedRows.add(this.getRowId(row));\n      });\n    } else {\n      this.displayedData.forEach(row => {\n        this.selectedRows.delete(this.getRowId(row));\n      });\n    }\n\n    this.emitSelectionChange(checked ? 'selectAll' : 'deselectAll');\n  }\n\n  toggleRowSelection(row: T, event: CustomEvent): void {\n    const rowId = this.getRowId(row);\n    const checked = event.detail.checked;\n\n    if (checked) {\n      this.selectedRows.add(rowId);\n    } else {\n      this.selectedRows.delete(rowId);\n    }\n\n    this.emitSelectionChange(checked ? 'select' : 'deselect', row);\n  }\n\n  selectSingleRow(row: T): void {\n    const rowId = this.getRowId(row);\n    const wasSelected = this.selectedRows.has(rowId);\n\n    this.selectedRows.clear();\n\n    if (!wasSelected) {\n      this.selectedRows.add(rowId);\n      this.emitSelectionChange('select', row);\n    } else {\n      this.emitSelectionChange('deselect', row);\n    }\n  }\n\n  private emitSelectionChange(action: 'select' | 'deselect' | 'selectAll' | 'deselectAll', changedRow?: T): void {\n    const selected = this.props.data.filter(row => this.isRowSelected(row));\n\n    this.selectionChange.emit({\n      selected,\n      changedRow,\n      action,\n    });\n  }\n\n  goToPage(page: number): void {\n    if (!this.props.pagination) return;\n\n    const previousPage = this.props.pagination.page;\n    const maxPage = this.totalPages - 1;\n    const newPage = Math.max(0, Math.min(page, maxPage));\n\n    this.pageChange.emit({\n      page: newPage,\n      pageSize: this.props.pagination.pageSize,\n      previousPage,\n    });\n\n    if (this.props.clientPagination) {\n      this.props.pagination.page = newPage;\n      this.updateDisplayedData();\n    }\n  }\n\n  onPageSizeChange(event: CustomEvent): void {\n    if (!this.props.pagination) return;\n\n    const newPageSize = event.detail.value;\n    const previousPage = this.props.pagination.page;\n\n    // Recalculate page to keep first visible item\n    const firstItem = previousPage * this.props.pagination.pageSize;\n    const newPage = Math.floor(firstItem / newPageSize);\n\n    this.pageChange.emit({\n      page: newPage,\n      pageSize: newPageSize,\n      previousPage,\n    });\n\n    if (this.props.clientPagination) {\n      this.props.pagination.pageSize = newPageSize;\n      this.props.pagination.page = newPage;\n      this.updateDisplayedData();\n    }\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { IonCard, IonCardContent } from '@ionic/angular/standalone';\nimport { ActionHeaderComponent } from '../../molecules/action-header/action-header.component';\nimport { HorizontalScrollComponent } from '../../atoms/horizontal-scroll/horizontal-scroll.component';\nimport { LinkComponent } from '../../molecules/link/link.component';\nimport { TitleBlockComponent } from '../../molecules/title-block/title-block.component';\nimport { CardsCarouselMetadata, CarouselCardShape } from './types';\n\n/**\n * val-cards-carousel\n *\n * A horizontal carousel of cards with optional action header.\n * Combines HorizontalScroll for smooth horizontal scrolling with inline\n * card rendering for consistent card styling.\n *\n * @example\n * <val-cards-carousel\n *   [props]=\"{\n *     header: { title: 'Featured Items', actionType: 'link', actionLabel: 'View All' },\n *     cards: [\n *       { title: { title: 'Card 1' }, link: { text: 'Learn more', url: '/item/1' } },\n *       { title: { title: 'Card 2' }, link: { text: 'Learn more', url: '/item/2' } }\n *     ]\n *   }\"\n * ></val-cards-carousel>\n *\n * @input props - Carousel configuration with cards and optional header\n */\n@Component({\n  selector: 'val-cards-carousel',\n  standalone: true,\n  imports: [\n    CommonModule,\n    HorizontalScrollComponent,\n    ActionHeaderComponent,\n    IonCard,\n    IonCardContent,\n    LinkComponent,\n    TitleBlockComponent,\n  ],\n  template: `\n    @if (props.header) {\n      <val-action-header [props]=\"props.header\" />\n    }\n\n    <val-horizontal-scroll [items]=\"props.cards\" [itemTemplate]=\"cardTemplate\" />\n    <ng-template #cardTemplate let-card>\n      <ion-card class=\"carousel-card\" [color]=\"card.color || ''\">\n        <div class=\"shapes\">\n          <ng-container *ngFor=\"let shape of card.shapes\">\n            <div class=\"shape\" [ngStyle]=\"mergeShapeStyle(shape)\"></div>\n          </ng-container>\n        </div>\n        <ion-card-content\n          class=\"carousel-card__content\"\n          [style.min-height]=\"card.minHeight || '400px'\"\n          [style.min-width]=\"card.width || '280px'\"\n          [style.max-width]=\"card.width || '280px'\"\n        >\n          <val-title-block [props]=\"card.title\" />\n          <val-link [props]=\"card.link\" />\n        </ion-card-content>\n      </ion-card>\n    </ng-template>\n  `,\n  styles: `\n    :host {\n      display: block;\n    }\n\n    .carousel-card {\n      border-radius: 24px;\n      box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\n      margin: 10px;\n      position: relative;\n      overflow: hidden;\n\n      .shapes {\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        opacity: 0.7;\n        pointer-events: none;\n\n        .shape {\n          position: absolute;\n          border-radius: 50%;\n        }\n      }\n\n      .carousel-card__content {\n        position: relative;\n        z-index: 1;\n        display: flex;\n        flex-direction: column;\n        justify-content: space-between;\n        height: 100%;\n        padding: 16px;\n      }\n    }\n  `,\n})\nexport class CardsCarouselComponent {\n  /**\n   * Carousel configuration with cards and optional header.\n   */\n  @Input() props: CardsCarouselMetadata = { cards: [] };\n\n  /**\n   * Merges shape color with additional styles.\n   */\n  mergeShapeStyle(shape: CarouselCardShape): { [key: string]: string | number } {\n    return { 'background-color': shape.color, ...(shape.style || {}) };\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { SwipeCarouselComponent } from '../../molecules/swipe-carousel/swipe-carousel.component';\nimport { SwipeCarouselMetadata } from '../../molecules/swipe-carousel/types';\nimport { TestimonialCardComponent } from '../../molecules/testimonial-card/testimonial-card.component';\nimport { TestimonialCarouselMetadata } from './types';\n\n/**\n * val-testimonial-carousel\n *\n * A carousel of testimonial cards using Swiper.js with centered slides\n * and responsive breakpoints for optimal viewing on all devices.\n *\n * @example\n * <val-testimonial-carousel\n *   [props]=\"{\n *     cards: [\n *       { title: 'John Doe', image: '/john.jpg', link: { text: 'CEO', route: ['/team'] } },\n *       { title: 'Jane Smith', image: '/jane.jpg', link: { text: 'CTO', route: ['/team'] } }\n *     ]\n *   }\"\n * ></val-testimonial-carousel>\n *\n * @input props - Carousel configuration with testimonial cards\n */\n@Component({\n  selector: 'val-testimonial-carousel',\n  standalone: true,\n  imports: [CommonModule, TestimonialCardComponent, SwipeCarouselComponent],\n  template: `\n    <val-swipe-carousel [items]=\"props.cards\" [itemTemplate]=\"testimonialTemplate\" [props]=\"swiperProps\" />\n    <ng-template #testimonialTemplate let-card>\n      <val-testimonial-card [props]=\"card\"></val-testimonial-card>\n    </ng-template>\n  `,\n  styles: `\n    :host {\n      display: block;\n    }\n  `,\n})\nexport class TestimonialCarouselComponent {\n  /**\n   * Carousel configuration with testimonial cards.\n   */\n  @Input() props: TestimonialCarouselMetadata = { cards: [] };\n\n  /**\n   * Swiper configuration optimized for testimonial cards.\n   */\n  swiperProps: SwipeCarouselMetadata = {\n    slidesPerView: 1.1,\n    spaceBetween: 40,\n    loop: true,\n    centeredSlides: true,\n    effect: 'slide',\n    pagination: true,\n    navigation: true,\n    breakpoints: {\n      768: {\n        slidesPerView: 1.5,\n        spaceBetween: 40,\n      },\n      1024: {\n        slidesPerView: 1.7,\n        spaceBetween: 50,\n      },\n    },\n  };\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, Input, signal } from '@angular/core';\nimport { LandingSplitMetadata } from './types';\n\n@Component({\n  selector: 'val-landing-split',\n  standalone: true,\n  imports: [CommonModule],\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      .split-wrap {\n        display: grid;\n        grid-template-columns: 1fr 1fr;\n        gap: 64px;\n        align-items: center;\n      }\n\n      .split-wrap--reversed .split-text {\n        order: 1;\n      }\n      .split-wrap--reversed .split-visual {\n        order: 0;\n      }\n\n      @media (max-width: 767px) {\n        .split-wrap {\n          grid-template-columns: 1fr;\n          gap: 36px;\n        }\n        .split-wrap--reversed .split-text {\n          order: 0;\n        }\n        .split-wrap--reversed .split-visual {\n          order: 1;\n        }\n      }\n\n      .split-text {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n      }\n\n      .split-kicker {\n        font-size: 11px;\n        font-weight: 700;\n        text-transform: uppercase;\n        letter-spacing: 0.1em;\n        color: var(--ion-color-primary, #7026df);\n        margin: 0;\n      }\n\n      .split-title {\n        font-size: clamp(26px, 3vw, 38px);\n        font-weight: 800;\n        color: #090f1b;\n        letter-spacing: -0.025em;\n        line-height: 1.1;\n        margin: 0;\n      }\n\n      .split-desc {\n        font-size: 16px;\n        line-height: 1.75;\n        color: #354c69;\n        margin: 0;\n      }\n\n      .split-visual {\n        display: block;\n        width: 100%;\n        min-width: 0;\n      }\n\n      @media (prefers-color-scheme: dark) {\n        .split-title {\n          color: #f0eaff;\n        }\n        .split-desc {\n          color: #a0b4c8;\n        }\n      }\n      :host-context(body.dark) .split-title,\n      :host-context(html.ion-palette-dark) .split-title,\n      :host-context([data-theme='dark']) .split-title {\n        color: #f0eaff;\n      }\n      :host-context(body.dark) .split-desc,\n      :host-context(html.ion-palette-dark) .split-desc,\n      :host-context([data-theme='dark']) .split-desc {\n        color: #a0b4c8;\n      }\n    `,\n  ],\n  template: `\n    <div class=\"split-wrap\" [class.split-wrap--reversed]=\"p().reversed\">\n      <div class=\"split-text\">\n        @if (p().kicker) {\n          <p class=\"split-kicker\">{{ p().kicker }}</p>\n        }\n        <h2 class=\"split-title\">{{ p().title }}</h2>\n        @if (p().description) {\n          <p class=\"split-desc\">{{ p().description }}</p>\n        }\n        <ng-content select=\"[actions]\" />\n      </div>\n      <div class=\"split-visual\">\n        <ng-content select=\"[visual]\" />\n      </div>\n    </div>\n  `,\n})\nexport class LandingSplitComponent {\n  private readonly props_ = signal<LandingSplitMetadata>(\n    { title: '' },\n    {\n      equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),\n    }\n  );\n\n  @Input() set props(v: LandingSplitMetadata) {\n    this.props_.set(v);\n  }\n\n  readonly p = computed(() => this.props_());\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, Input, signal } from '@angular/core';\nimport { LandingStepsMetadata } from './types';\n\n@Component({\n  selector: 'val-landing-steps',\n  standalone: true,\n  imports: [CommonModule],\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      .steps-grid {\n        display: grid;\n        grid-template-columns: repeat(3, 1fr);\n        gap: 32px;\n      }\n      .steps-grid.cols-2 {\n        grid-template-columns: repeat(2, 1fr);\n      }\n      .steps-grid.cols-4 {\n        grid-template-columns: repeat(4, 1fr);\n      }\n\n      @media (max-width: 767px) {\n        .steps-grid,\n        .steps-grid.cols-2,\n        .steps-grid.cols-4 {\n          grid-template-columns: 1fr;\n          gap: 24px;\n        }\n      }\n\n      .step {\n        padding-top: 20px;\n        border-top: 2px solid var(--accent, var(--ion-color-primary, #7026df));\n      }\n\n      .step__num {\n        display: block;\n        font-family: ui-monospace, 'JetBrains Mono', monospace;\n        font-size: 12px;\n        font-weight: 700;\n        color: var(--accent, var(--ion-color-primary, #7026df));\n        margin-bottom: 14px;\n        letter-spacing: 0.05em;\n      }\n\n      .step__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: #090f1b;\n        margin: 0 0 8px 0;\n        letter-spacing: -0.01em;\n        line-height: 1.25;\n      }\n\n      .step__desc {\n        font-size: 14px;\n        line-height: 1.65;\n        color: #354c69;\n        margin: 0;\n      }\n\n      @media (prefers-color-scheme: dark) {\n        .step__title {\n          color: #f0eaff;\n        }\n        .step__desc {\n          color: #a0b4c8;\n        }\n      }\n      :host-context(body.dark) .step__title,\n      :host-context(html.ion-palette-dark) .step__title,\n      :host-context([data-theme='dark']) .step__title {\n        color: #f0eaff;\n      }\n      :host-context(body.dark) .step__desc,\n      :host-context(html.ion-palette-dark) .step__desc,\n      :host-context([data-theme='dark']) .step__desc {\n        color: #a0b4c8;\n      }\n    `,\n  ],\n  template: `\n    <div class=\"steps-grid\" [class.cols-2]=\"cols() === 2\" [class.cols-4]=\"cols() === 4\">\n      @for (step of p().steps; track step.title; let i = $index) {\n        <div class=\"step\" [style.--accent]=\"accentColor()\">\n          <span class=\"step__num\">0{{ i + 1 }}</span>\n          <h3 class=\"step__title\">{{ step.title }}</h3>\n          <p class=\"step__desc\">{{ step.description }}</p>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class LandingStepsComponent {\n  private readonly props_ = signal<LandingStepsMetadata>(\n    { steps: [] },\n    {\n      equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),\n    }\n  );\n\n  @Input() set props(v: LandingStepsMetadata) {\n    this.props_.set(v);\n  }\n\n  readonly p = computed(() => this.props_());\n  readonly cols = computed(() => this.p().columns ?? 3);\n  readonly accentColor = computed(() => this.p().accentColor ?? '');\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, Input } from '@angular/core';\nimport { IonCol, IonGrid, IonRow } from '@ionic/angular/standalone';\nimport { BannerComponent } from '../banner/banner.component';\nimport { ThemeService } from '../../../services/theme.service';\nimport { FunHeaderMetadata } from './types';\n\n/**\n * val-fun-header\n *\n * A decorative header component with flexible background options,\n * optional logo, and integrated banner content. Supports dark mode,\n * gradients, images with overlays, and various styling options.\n *\n * @example\n * <val-fun-header\n *   [props]=\"{\n *     image: '/assets/logo.png',\n *     background: 'primary',\n *     gradient: true,\n *     content: {\n *       title: 'Welcome',\n *       description: 'Get started with our platform'\n *     },\n *     rounded: true,\n *     shadowed: true\n *   }\"\n * ></val-fun-header>\n *\n * @input props - Header configuration\n */\n@Component({\n  selector: 'val-fun-header',\n  standalone: true,\n  imports: [CommonModule, BannerComponent, IonGrid, IonRow, IonCol],\n  template: `\n    <ion-grid>\n      <ion-row\n        class=\"ion-justify-content-center header-ground\"\n        [class.bordered]=\"props.bordered\"\n        [class.shadowed]=\"props.shadowed\"\n        [class.rounded]=\"props.rounded\"\n        [ngStyle]=\"headerStyle()\"\n      >\n        <ion-col size=\"12\" size-md=\"12\" size-lg=\"8\">\n          <div class=\"fun-image-container\" *ngIf=\"props.image\">\n            <img\n              [src]=\"getImageSrc()\"\n              [ngStyle]=\"{\n                content: isImageVariable(props.image) ? 'var(' + props.image + ')' : undefined,\n              }\"\n              alt=\"header logo\"\n            />\n          </div>\n          <val-banner [props]=\"props.content\" />\n        </ion-col>\n      </ion-row>\n    </ion-grid>\n  `,\n  styleUrls: ['./fun-header.component.scss'],\n})\nexport class FunHeaderComponent {\n  private theme = inject(ThemeService);\n\n  /**\n   * Header configuration.\n   */\n  @Input() props: FunHeaderMetadata = {\n    content: {\n      color: 'primary',\n      bordered: false,\n      closable: false,\n      mode: 'column',\n      alignment: 'center',\n      content: {\n        position: 'center',\n        title: { content: '', size: 'medium', color: 'light', bold: true },\n      },\n    },\n  };\n\n  /**\n   * Check if the image is a CSS variable (starts with --)\n   */\n  isImageVariable(image?: string): boolean {\n    return image?.startsWith('--') || false;\n  }\n\n  /**\n   * Get the image source, handling CSS variables\n   */\n  getImageSrc(): string {\n    if (!this.props.image) return '';\n    return this.isImageVariable(this.props.image) ? '' : this.props.image;\n  }\n\n  /**\n   * Generate header background styles\n   * Supports: images, gradients, colors, CSS variables, and dark mode\n   */\n  headerStyle(): Record<string, string> {\n    const style: Record<string, string> = {};\n    const isDark = this.theme.IsDark;\n    const background = isDark ? this.props.backgroundDark || this.props.background : this.props.background;\n\n    if (this.props.paddingTop) {\n      style['paddingTop'] = this.props.paddingTop;\n    }\n    if (this.props.paddingBottom) {\n      style['paddingBottom'] = this.props.paddingBottom;\n    }\n\n    if (!background) {\n      // Default gradient if no background specified\n      style['background'] = isDark\n        ? 'linear-gradient(180deg, var(--ion-background-color) 12%, var(--ion-color-dark) 80%)'\n        : 'linear-gradient(180deg, var(--ion-background-color) 12%, var(--ion-color-secondary) 90%)';\n      return style;\n    }\n\n    // If gradient is enabled, create automatic gradient from --ion-background-color to the specified color\n    if (this.props.gradient) {\n      const targetColor = this.resolveBackgroundColor(background);\n      const gradientPercentage = isDark ? '80%' : '90%';\n      style['background'] =\n        `linear-gradient(180deg, var(--ion-background-color) 12%, ${targetColor} ${gradientPercentage})`;\n      return style;\n    }\n\n    // Handle different background types\n    if (this.isBackgroundImage(background)) {\n      this.applyImageBackground(style, background);\n    } else if (this.isGradient(background)) {\n      style['background'] = background;\n    } else if (this.isCSSVariable(background)) {\n      style['background'] = `var(${background})`;\n    } else if (this.isColorValue(background)) {\n      style['background'] = background;\n    } else {\n      // Assume it's an Ionic color name\n      style['background'] = `var(--ion-color-${background})`;\n    }\n\n    return style;\n  }\n\n  /**\n   * Resolve background color for gradient generation\n   */\n  private resolveBackgroundColor(background: string): string {\n    if (this.isCSSVariable(background)) {\n      return `var(${background})`;\n    } else if (this.isColorValue(background)) {\n      return background;\n    } else {\n      // Assume it's an Ionic color name\n      return `var(--ion-color-${background})`;\n    }\n  }\n\n  /**\n   * Check if background is an image URL\n   */\n  private isBackgroundImage(bg: string): boolean {\n    const lower = bg.trim().toLowerCase();\n    return (\n      lower.includes('.jpg') ||\n      lower.includes('.png') ||\n      lower.includes('.jpeg') ||\n      lower.includes('.webp') ||\n      lower.includes('.svg') ||\n      lower.startsWith('url(')\n    );\n  }\n\n  /**\n   * Check if background is a gradient\n   */\n  private isGradient(bg: string): boolean {\n    return bg.includes('linear-gradient') || bg.includes('radial-gradient') || bg.includes('conic-gradient');\n  }\n\n  /**\n   * Check if background is a CSS variable\n   */\n  private isCSSVariable(bg: string): boolean {\n    return bg.startsWith('--');\n  }\n\n  /**\n   * Check if background is a direct color value\n   */\n  private isColorValue(bg: string): boolean {\n    return bg.startsWith('#') || bg.startsWith('rgb') || bg.startsWith('hsl');\n  }\n\n  /**\n   * Apply image background with optional overlay\n   */\n  private applyImageBackground(style: Record<string, string>, background: string): void {\n    const imageUrl = background.startsWith('url(') ? background : `url(${background})`;\n\n    if (this.props.overlay) {\n      const opacity = this.props.overlayOpacity || 0.3;\n      const isDark = this.theme.IsDark;\n      const overlayColor = isDark ? `rgba(0,0,0,${opacity})` : `rgba(255,255,255,${opacity})`;\n\n      style['backgroundImage'] = `linear-gradient(0deg, ${overlayColor}, ${overlayColor}), ${imageUrl}`;\n    } else {\n      style['backgroundImage'] = imageUrl;\n    }\n\n    style['backgroundSize'] = 'cover';\n    style['backgroundPosition'] = 'center';\n    style['backgroundRepeat'] = 'no-repeat';\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { AnimatedTerminalMetadata } from './types';\n\n@Component({\n  selector: 'val-animated-terminal',\n  standalone: true,\n  imports: [CommonModule],\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n      }\n\n      .terminal {\n        width: 100%;\n        overflow: hidden;\n        box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);\n      }\n\n      .terminal.rounded {\n        border-radius: 16px;\n      }\n\n      .terminal-header {\n        padding: 12px 16px;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .terminal-dot {\n        width: 12px;\n        height: 12px;\n        border-radius: 50%;\n        flex-shrink: 0;\n      }\n\n      .dot-red {\n        background: #ff5f56;\n      }\n      .dot-yellow {\n        background: #ffbd2e;\n      }\n      .dot-green {\n        background: #27ca40;\n      }\n\n      .terminal-title {\n        flex: 1;\n        text-align: center;\n        color: #8b949e;\n        font-size: 0.8rem;\n        font-family: ui-monospace, 'Fira Code', 'Monaco', 'Consolas', monospace;\n      }\n\n      .terminal-body {\n        padding: 20px 24px 24px;\n        font-family: ui-monospace, 'Fira Code', 'Monaco', 'Consolas', monospace;\n        font-size: 0.875rem;\n        line-height: 1.9;\n      }\n\n      .line {\n        opacity: 0;\n        animation: terminalFadeIn 0.25s ease forwards;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n\n      @keyframes terminalFadeIn {\n        to {\n          opacity: 1;\n        }\n      }\n\n      .prompt-text {\n        color: #7ee787;\n      }\n\n      .command-text {\n        color: #c9d1d9;\n      }\n\n      .arrow-icon {\n        color: #c8aafd;\n      }\n\n      .arrow-text {\n        color: #8b949e;\n      }\n\n      .success-icon {\n        color: #4ade80;\n        font-weight: 700;\n      }\n\n      .success-text {\n        color: #4ade80;\n      }\n\n      .error-text {\n        color: #f85149;\n      }\n\n      .output-text {\n        color: #8b949e;\n      }\n\n      .cursor {\n        display: inline-block;\n        width: 9px;\n        height: 1em;\n        background: #7ee787;\n        margin-left: 2px;\n        vertical-align: text-bottom;\n        animation: terminalBlink 1s step-end infinite;\n      }\n\n      @keyframes terminalBlink {\n        0%,\n        100% {\n          opacity: 1;\n        }\n        50% {\n          opacity: 0;\n        }\n      }\n    `,\n  ],\n  template: `\n    <div\n      class=\"terminal\"\n      [class.rounded]=\"props.rounded !== false\"\n      [ngStyle]=\"{ background: props.background || '#0c0818' }\"\n    >\n      <div class=\"terminal-header\" [ngStyle]=\"{ background: props.headerBackground || '#161b22' }\">\n        <div class=\"terminal-dot dot-red\"></div>\n        <div class=\"terminal-dot dot-yellow\"></div>\n        <div class=\"terminal-dot dot-green\"></div>\n        <span class=\"terminal-title\">{{ props.title || 'bash' }}</span>\n      </div>\n      <div class=\"terminal-body\">\n        @for (line of props.lines; track $index; let i = $index) {\n          <div class=\"line\" [style.animation-delay]=\"getDelay(i)\">\n            @switch (line.type) {\n              @case ('prompt') {\n                <span class=\"prompt-text\">{{ props.prompt || '~' }} $ </span\n                ><span class=\"command-text\">{{ line.content }}</span>\n              }\n              @case ('arrow') {\n                <span class=\"arrow-icon\">→ </span><span class=\"arrow-text\">{{ line.content }}</span>\n              }\n              @case ('success') {\n                <span class=\"success-icon\">✓ </span><span class=\"success-text\">{{ line.content }}</span>\n              }\n              @case ('error') {\n                <span class=\"error-text\">✗ {{ line.content }}</span>\n              }\n              @default {\n                <span class=\"output-text\">{{ line.content }}</span>\n              }\n            }\n          </div>\n        }\n        <div class=\"line\" [style.animation-delay]=\"getDelay(props.lines.length)\">\n          <span class=\"prompt-text\">{{ props.prompt || '~' }} $ </span><span class=\"cursor\"></span>\n        </div>\n      </div>\n    </div>\n  `,\n})\nexport class AnimatedTerminalComponent {\n  @Input() props: AnimatedTerminalMetadata = { lines: [] };\n\n  getDelay(index: number): string {\n    const delay = this.props.lineDelay ?? 0.45;\n    return `${index * delay + 0.2}s`;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport { IonCol, IonGrid, IonRow } from '@ionic/angular/standalone';\nimport { FooterLinksComponent } from '../../molecules/footer-links/footer-links.component';\nimport { RightsFooterComponent } from '../../atoms/rights-footer/rights-footer.component';\nimport { CompanyFooterMetadata } from './types';\n\n/**\n * val-company-footer\n *\n * A complete footer component combining footer links (with logo and social icons)\n * and a rights/copyright footer. Configurable padding and background options.\n *\n * @example\n * <val-company-footer\n *   [props]=\"{\n *     links: {\n *       leftLinks: { title: 'Company', size: 'medium', links: [...] },\n *       rightLinks: { title: 'Support', size: 'medium', links: [...] },\n *       logo: '/assets/logo.png',\n *       socialLinks: [...]\n *     },\n *     rights: { companyName: 'Acme Inc' },\n *     withPadding: true\n *   }\"\n * ></val-company-footer>\n *\n * @input props - Footer configuration\n */\n@Component({\n  selector: 'val-company-footer',\n  standalone: true,\n  imports: [CommonModule, IonGrid, IonRow, IonCol, RightsFooterComponent, FooterLinksComponent],\n  template: `\n    <footer\n      [class.withPadding]=\"propsWithPadding()\"\n      [class.withBackground]=\"propsWithBackground()\"\n      [class.withRoundedTop]=\"propsWithRoundedTop()\"\n      [class.borderless]=\"propsBorderless()\"\n      [style.--val-footer-top-radius]=\"propsTopRadius()\"\n      [style.background-color]=\"propsBackground()\"\n    >\n      <ion-grid>\n        <val-footer-links [props]=\"propsLinks()\" />\n        <ion-row>\n          <ion-col size=\"12\">\n            <val-rights-footer [props]=\"propsRights()\" />\n          </ion-col>\n        </ion-row>\n      </ion-grid>\n    </footer>\n  `,\n  styles: `\n    :host {\n      display: block;\n    }\n\n    .withPadding {\n      padding: 16px;\n    }\n\n    .withBackground {\n      background-color: #f5f3fa;\n    }\n\n    :host-context(body.dark) .withBackground,\n    :host-context(html.ion-palette-dark) .withBackground,\n    :host-context([data-theme='dark']) .withBackground {\n      background-color: #0e0420;\n    }\n\n    .withRoundedTop {\n      border-radius: var(--val-footer-top-radius, 24px) var(--val-footer-top-radius, 24px) 0 0;\n      overflow: hidden;\n    }\n\n    .borderless {\n      border-top: none !important;\n    }\n  `,\n})\nexport class CompanyFooterComponent {\n  /**\n   * Footer configuration.\n   * Signal-based input for full reactivity with computed().\n   */\n  readonly props = input<CompanyFooterMetadata>({\n    links: {\n      leftLinks: { title: '', size: 'medium', links: [] },\n      rightLinks: { title: '', size: 'medium', links: [] },\n    },\n  });\n\n  // Computed helpers for template bindings\n  propsWithPadding = computed(() => this.props()?.withPadding);\n  propsWithBackground = computed(() => this.props()?.withBackground);\n  propsLinks = computed(() => this.props()?.links);\n  propsRights = computed(() => this.props()?.rights || {});\n  propsWithRoundedTop = computed(() => !!this.props()?.roundedTop);\n  propsBorderless = computed(() => this.props()?.borderless || !!this.props()?.roundedTop);\n  propsTopRadius = computed(() => {\n    const v = this.props()?.roundedTop;\n    if (!v || v === true) return null;\n    return v;\n  });\n  propsBackground = computed(() => this.props()?.background ?? null);\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input } from '@angular/core';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonMenu,\n  IonMenuToggle,\n  IonToolbar,\n  MenuController,\n} from '@ionic/angular/standalone';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { MenuMetadata } from './types';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * val-menu\n *\n * A side menu component using Ionic IonMenu with customizable logo,\n * close button, and content projection for menu items.\n *\n * @example\n * <val-menu\n *   [props]=\"{\n *     id: 'main-menu',\n *     contentId: 'main-content',\n *     side: 'start',\n *     type: 'overlay',\n *     swipe: true,\n *     showCloseButton: true\n *   }\"\n * >\n *   <val-links-accordion [props]=\"menuLinks\"></val-links-accordion>\n * </val-menu>\n *\n * <ion-router-outlet id=\"main-content\"></ion-router-outlet>\n *\n * @input props - Menu configuration\n */\n@Component({\n  selector: 'val-menu',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonMenu,\n    IonButtons,\n    IonMenuToggle,\n    IonButton,\n    IonIcon,\n    IonHeader,\n    IonToolbar,\n    IonContent,\n    ImageComponent,\n    ButtonComponent,\n  ],\n  template: `\n    <ion-menu\n      [menuId]=\"props.id\"\n      [contentId]=\"props.contentId\"\n      [type]=\"props.type || 'overlay'\"\n      [side]=\"props.side || 'start'\"\n      [swipeGesture]=\"props.swipe !== false\"\n    >\n      <ion-header [class.ion-no-border]=\"true\">\n        <ion-toolbar>\n          <ion-buttons slot=\"start\" style=\"padding-left: .5rem;\">\n            <val-image\n              *ngIf=\"props.logo\"\n              [props]=\"props.logo\"\n            />\n            <val-image\n              *ngIf=\"!props.logo\"\n              [props]=\"{\n                src: '--main-logo-mini',\n                alt: 'menu logo',\n                mode: 'box',\n                shaded: false,\n                bordered: false,\n                size: 'small',\n                limited: false,\n                width: 2,\n                flex: true\n              }\"\n            />\n          </ion-buttons>\n\n          <ion-buttons slot=\"end\">\n            <ion-menu-toggle>\n              <ion-button>\n                <ion-icon color=\"dark\" slot=\"icon-only\" name=\"close-outline\"></ion-icon>\n              </ion-button>\n            </ion-menu-toggle>\n          </ion-buttons>\n        </ion-toolbar>\n      </ion-header>\n      <ion-content>\n        <ng-content></ng-content>\n      </ion-content>\n      @if (props.showCloseButton) {\n        <val-button\n          class=\"menu-close-button\"\n          [props]=\"{\n            text: closeButtonText(),\n            color: 'dark',\n            size: 'default',\n            type: 'button',\n            state: 'ENABLED',\n            fill: 'outline',\n            shape: 'round',\n            icon: {\n              name: 'close-outline',\n              slot: 'start'\n            }\n          }\"\n          (onClick)=\"closeMenu()\"\n        />\n      }\n    </ion-menu>\n  `,\n  styleUrls: ['./menu.component.scss'],\n})\nexport class MenuComponent {\n  private menuCtrl = inject(MenuController);\n  private i18n = inject(I18nService);\n\n  /**\n   * Menu configuration.\n   */\n  @Input() props: MenuMetadata = {\n    side: 'start',\n    type: 'overlay',\n    swipe: true,\n  };\n\n  /**\n   * Close button text - reactive to language changes.\n   */\n  closeButtonText = computed(() => {\n    this.i18n.lang(); // Track language changes\n    return this.props.closeButtonText || this.i18n.t('close');\n  });\n\n  /**\n   * Closes the menu.\n   */\n  async closeMenu(): Promise<void> {\n    await this.menuCtrl.close(this.props.id);\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  signal,\n  computed,\n  ChangeDetectionStrategy,\n  OnInit,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SegmentControlComponent } from '../../molecules/segment-control/segment-control.component';\nimport { SegmentControlMetadata, SegmentOption } from '../../molecules/segment-control/types';\nimport { TabbedContentMetadata, TabbedContentTab, TabbedContentContext } from './types';\n\n/**\n * val-tabbed-content\n *\n * A container component that combines segment navigation with dynamic content panels.\n * Uses segment-control internally for tab navigation and renders the associated\n * template for the active tab.\n *\n * @example Basic usage with templates\n * ```html\n * <ng-template #catalogTemplate>\n *   <div>Catalog Content</div>\n * </ng-template>\n * <ng-template #settingsTemplate>\n *   <div>Settings Content</div>\n * </ng-template>\n *\n * <val-tabbed-content [props]=\"{\n *   tabs: [\n *     { value: 'catalog', label: 'Catalog', icon: 'layers-outline', template: catalogTemplate },\n *     { value: 'settings', label: 'Settings', icon: 'settings-outline', template: settingsTemplate }\n *   ],\n *   selectedTab: 'catalog',\n *   scrollable: true,\n *   animated: true\n * }\" (tabChange)=\"onTabChange($event)\"></val-tabbed-content>\n * ```\n *\n * @input props: TabbedContentMetadata - Configuration for the tabbed content\n * @output tabChange: string - Emits the selected tab value when changed\n */\n@Component({\n  selector: 'val-tabbed-content',\n  standalone: true,\n  imports: [CommonModule, SegmentControlComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    <div\n      class=\"tabbed-content\"\n      [class]=\"props.cssClass\"\n      [style.--animation-duration]=\"animationDuration()\"\n    >\n      <!-- Segment Control Navigation -->\n      <val-segment-control\n        [props]=\"segmentControlProps()\"\n        (segmentChange)=\"onSegmentChange($event)\"\n      ></val-segment-control>\n\n      <!-- Tab Content Panel -->\n      <div\n        class=\"tabbed-content__panel\"\n        [class.tabbed-content__panel--animated]=\"props.animated !== false\"\n        [class.tabbed-content__panel--transitioning]=\"isTransitioning()\"\n      >\n        @if (activeTab(); as tab) {\n          <ng-container\n            *ngTemplateOutlet=\"tab.template; context: getTemplateContext(tab)\"\n          ></ng-container>\n        }\n      </div>\n    </div>\n  `,\n  styleUrls: ['./tabbed-content.component.scss'],\n})\nexport class TabbedContentComponent implements OnInit {\n  /**\n   * Configuration object for the tabbed content.\n   */\n  @Input() props!: TabbedContentMetadata;\n\n  /**\n   * Emits when the active tab changes.\n   */\n  @Output() tabChange = new EventEmitter<string>();\n\n  /** Currently selected tab value */\n  private selectedValue = signal<string>('');\n\n  /** Whether a transition is in progress */\n  isTransitioning = signal<boolean>(false);\n\n  /** Computed animation duration string */\n  animationDuration = computed(() => `${this.props.animationDuration || 300}ms`);\n\n  /** Computed segment control props derived from tabs config */\n  segmentControlProps = computed<SegmentControlMetadata>(() => {\n    const options: SegmentOption[] = this.props.tabs.map(tab => ({\n      value: tab.value,\n      label: tab.label,\n      icon: tab.icon,\n      disabled: tab.disabled,\n      layout: tab.layout || 'icon-top',\n    }));\n\n    return {\n      options,\n      value: this.selectedValue(),\n      color: this.props.color || 'primary',\n      scrollable: this.props.scrollable ?? false,\n      swipeGesture: this.props.swipeGesture ?? true,\n      mode: this.props.mode,\n    };\n  });\n\n  /** Computed active tab object */\n  activeTab = computed<TabbedContentTab | undefined>(() => {\n    return this.props.tabs.find(tab => tab.value === this.selectedValue());\n  });\n\n  ngOnInit(): void {\n    // Set initial selected tab\n    const initialValue = this.props.selectedTab || this.props.tabs[0]?.value || '';\n    this.selectedValue.set(initialValue);\n  }\n\n  /**\n   * Handles segment change events.\n   */\n  onSegmentChange(value: string): void {\n    if (value === this.selectedValue()) {\n      return;\n    }\n\n    // Trigger transition animation\n    if (this.props.animated !== false) {\n      this.isTransitioning.set(true);\n\n      // Reset transition state after animation completes\n      setTimeout(() => {\n        this.selectedValue.set(value);\n        this.isTransitioning.set(false);\n        this.tabChange.emit(value);\n      }, (this.props.animationDuration || 300) / 2);\n    } else {\n      this.selectedValue.set(value);\n      this.tabChange.emit(value);\n    }\n  }\n\n  /**\n   * Creates the context object for the template outlet.\n   */\n  getTemplateContext(tab: TabbedContentTab): TabbedContentContext {\n    const index = this.props.tabs.findIndex(t => t.value === tab.value);\n    return {\n      $implicit: tab.value,\n      tab,\n      index,\n    };\n  }\n}\n","import { TemplateRef } from '@angular/core';\nimport { Color } from '@ionic/core';\nimport { Observable } from 'rxjs';\nimport { SkeletonTemplateName, SkeletonTemplateConfig } from '../../../services/skeleton/types';\nimport { RefresherMetadata } from '../../molecules/refresher/types';\n\n/**\n * Direccion de carga de mas items.\n */\nexport type LoadDirection = 'bottom' | 'top' | 'both';\n\n/**\n * Estado de la lista infinita.\n */\nexport type InfiniteListState = 'idle' | 'loading' | 'error' | 'complete';\n\n/**\n * Parametros pasados a la funcion de carga.\n */\nexport interface LoadParams {\n  /** Direccion de carga */\n  direction: 'bottom' | 'top';\n  /** Pagina actual (para paginacion basada en offset) */\n  page: number;\n  /** Items por pagina */\n  pageSize: number;\n  /** Ultimo item (para paginacion basada en cursor) */\n  lastItem?: unknown;\n  /** Primer item (para carga top con cursor) */\n  firstItem?: unknown;\n  /** Cursor personalizado (del LoadResult anterior) */\n  cursor?: unknown;\n}\n\n/**\n * Resultado de la funcion de carga.\n */\nexport interface LoadResult<T> {\n  /** Items cargados */\n  items: T[];\n  /** Si hay mas items disponibles */\n  hasMore: boolean;\n  /** Cursor personalizado para proxima carga (opcional) */\n  cursor?: unknown;\n  /** Actualizacion de conteo total (opcional) */\n  totalCount?: number;\n}\n\n/**\n * Configuracion del data source.\n */\nexport interface InfiniteListDataSource<T> {\n  /** Items iniciales (opcional si usa loadFn) */\n  items?: T[];\n  /** Funcion para cargar mas items */\n  loadFn?: (params: LoadParams) => Observable<LoadResult<T>> | Promise<LoadResult<T>>;\n  /** Funcion track para ngFor (default: index) */\n  trackBy?: (index: number, item: T) => unknown;\n  /** Conteo total si se conoce (habilita indicador de progreso) */\n  totalCount?: number;\n}\n\n/**\n * Evento emitido al cargar mas items.\n */\nexport interface LoadMoreEvent {\n  /** Parametros de carga */\n  params: LoadParams;\n  /** Llamar cuando la carga completa */\n  complete: (result: LoadResult<unknown>) => void;\n  /** Llamar cuando la carga falla */\n  error: (error: Error) => void;\n}\n\n/**\n * Configuracion de estado vacio.\n */\nexport interface InfiniteListEmptyState {\n  /** Nombre del icono */\n  icon?: string;\n  /** Texto del titulo */\n  title?: string;\n  /** Texto del mensaje */\n  message?: string;\n  /** Template personalizado */\n  template?: TemplateRef<void>;\n  // Soporte i18n\n  titleKey?: string;\n  messageKey?: string;\n  contentClass?: string;\n}\n\n/**\n * Configuracion de estado de error.\n */\nexport interface InfiniteListErrorState {\n  /** Icono de error */\n  icon?: string;\n  /** Titulo del error */\n  title?: string;\n  /** Mensaje del error */\n  message?: string;\n  /** Mostrar boton de reintentar */\n  showRetry?: boolean;\n  /** Texto del boton de reintentar */\n  retryText?: string;\n  /** Template personalizado */\n  template?: TemplateRef<{ error: Error; retry: () => void }>;\n  // Soporte i18n\n  titleKey?: string;\n  messageKey?: string;\n  retryTextKey?: string;\n  contentClass?: string;\n}\n\n/**\n * Configuracion de skeleton para carga.\n */\nexport interface InfiniteListSkeletonConfig {\n  /** Template de skeleton a usar */\n  template?: SkeletonTemplateName | string;\n  /** Numero de items skeleton a mostrar */\n  count?: number;\n  /** Template personalizado */\n  customTemplate?: TemplateRef<void>;\n  /** Configuracion adicional */\n  config?: SkeletonTemplateConfig;\n}\n\n/**\n * Contexto para el template de items.\n */\nexport interface InfiniteListItemContext<T> {\n  /** El item actual */\n  $implicit: T;\n  /** Indice del item */\n  index: number;\n  /** Si es el primer item */\n  first: boolean;\n  /** Si es el ultimo item */\n  last: boolean;\n  /** Items totales */\n  count: number;\n}\n\n/**\n * Metadata para el componente val-infinite-list.\n */\nexport interface InfiniteListMetadata<T = unknown> {\n  /** Configuracion del data source */\n  dataSource: InfiniteListDataSource<T>;\n\n  // === Comportamiento de carga ===\n  /** Direccion de carga */\n  direction?: LoadDirection;\n  /** Items por pagina (default: 20) */\n  pageSize?: number;\n  /** Distancia del borde para activar carga (default: '100px') */\n  threshold?: string;\n  /** Tiempo de debounce para eventos de carga en ms (default: 300) */\n  debounceTime?: number;\n  /** Cargar primera pagina automaticamente al inicializar (default: true) */\n  autoLoad?: boolean;\n\n  // === Content projection ===\n  /** Template para renderizar cada item (requerido) */\n  itemTemplate: TemplateRef<InfiniteListItemContext<T>>;\n  /** Template para el indicador de carga en bottom */\n  loadingTemplate?: TemplateRef<void>;\n  /** Template para el indicador de carga en top */\n  topLoadingTemplate?: TemplateRef<void>;\n\n  // === Estados ===\n  /** Configuracion de estado vacio */\n  emptyState?: InfiniteListEmptyState;\n  /** Configuracion de estado de error */\n  errorState?: InfiniteListErrorState;\n  /** Configuracion de skeleton para carga inicial */\n  skeleton?: InfiniteListSkeletonConfig;\n\n  // === Indicadores de carga ===\n  /** Tipo de spinner */\n  spinnerType?: 'circular' | 'crescent' | 'dots' | 'lines-sharp';\n  /** Color del spinner */\n  color?: Color;\n  /** Usar boton \"Cargar mas\" en lugar de auto-carga */\n  useLoadMoreButton?: boolean;\n  /** Texto del boton \"Cargar mas\" */\n  loadMoreText?: string;\n  /** Texto cuando no hay mas items */\n  noMoreText?: string;\n\n  // === Integracion con pull to refresh ===\n  /** Habilitar pull-to-refresh */\n  enableRefresh?: boolean;\n  /** Configuracion del refresher */\n  refreshConfig?: RefresherMetadata;\n\n  // === Estilos ===\n  /** Clase CSS para el contenedor */\n  cssClass?: string;\n  /** Altura maxima (habilita scroll interno) */\n  maxHeight?: string;\n  /** Mostrar divisores entre items */\n  showDividers?: boolean;\n\n  // === Accesibilidad ===\n  /** ARIA label para la lista */\n  ariaLabel?: string;\n  /** ARIA description */\n  ariaDescription?: string;\n\n  /** Identificador unico */\n  token?: string;\n\n  // Soporte i18n\n  loadMoreTextKey?: string;\n  noMoreTextKey?: string;\n  contentClass?: string;\n}\n\n/**\n * Valores por defecto para infinite list.\n */\nexport const DEFAULT_INFINITE_LIST_METADATA: Partial<InfiniteListMetadata> = {\n  direction: 'bottom',\n  pageSize: 20,\n  threshold: '100px',\n  debounceTime: 300,\n  autoLoad: true,\n  spinnerType: 'circular',\n  useLoadMoreButton: false,\n  showDividers: false,\n  enableRefresh: false,\n};\n","import { Signal, TemplateRef, Type } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { SkeletonMetadata } from '../../components/atoms/skeleton/types';\n\n/**\n * Nombres de templates de skeleton disponibles.\n */\nexport type SkeletonTemplateName =\n  | 'list'\n  | 'list-avatar'\n  | 'grid'\n  | 'grid-cards'\n  | 'form'\n  | 'form-compact'\n  | 'profile'\n  | 'profile-full'\n  | 'detail'\n  | 'table';\n\n/**\n * Configuracion para un skeleton template.\n */\nexport interface SkeletonTemplateConfig {\n  /** Numero de items skeleton a mostrar */\n  count?: number;\n  /** Variante del layout */\n  variant?: string;\n  /** Gap entre items (valor CSS) */\n  gap?: string;\n  /** Ancho personalizado */\n  width?: string;\n  /** Animacion habilitada */\n  animated?: boolean;\n  /** Clases CSS adicionales */\n  cssClass?: string;\n  /** Numero de columnas (para grid/table) */\n  columns?: number;\n  /** Numero de filas (para table) */\n  rows?: number;\n  /** Numero de secciones (para detail) */\n  sections?: number;\n}\n\n/**\n * Fuente de estado de carga - puede ser Signal, Observable o Promise.\n */\nexport type LoadingSource<T = boolean> =\n  | Signal<T>\n  | Observable<T>\n  | Promise<T>\n  | boolean;\n\n/**\n * Configuracion para la directiva valSkeleton.\n */\nexport interface SkeletonDirectiveConfig {\n  /** Mostrar skeleton cuando esto sea truthy */\n  when: LoadingSource;\n  /** Nombre del template o componente a usar */\n  template?: SkeletonTemplateName | string;\n  /** Configuracion del template */\n  config?: SkeletonTemplateConfig;\n  /** Delay antes de mostrar skeleton (ms) - previene flash */\n  delay?: number;\n  /** Tiempo minimo de visualizacion (ms) - previene parpadeo */\n  minTime?: number;\n}\n\n/**\n * Configuracion para la directiva valLoading.\n */\nexport interface LoadingDirectiveConfig {\n  /** Fuente de estado de carga */\n  loading: LoadingSource;\n  /** Template de skeleton a mostrar durante carga */\n  skeleton?: SkeletonTemplateName | string;\n  /** Configuracion del skeleton */\n  skeletonConfig?: SkeletonTemplateConfig;\n  /** Template ref personalizado para skeleton */\n  skeletonTemplate?: TemplateRef<unknown>;\n  /** Mostrar spinner en lugar de skeleton */\n  spinner?: boolean;\n  /** Delay antes de mostrar estado de carga (ms) */\n  delay?: number;\n  /** Tiempo minimo de carga (ms) */\n  minTime?: number;\n}\n\n/**\n * Template de skeleton registrado.\n */\nexport interface RegisteredSkeletonTemplate {\n  name: string;\n  component: Type<unknown>;\n  defaultConfig?: SkeletonTemplateConfig;\n}\n\n/**\n * Configuracion para provideValtechSkeleton().\n */\nexport interface SkeletonConfig {\n  /** Animacion habilitada por defecto */\n  animated?: boolean;\n  /** Delay global antes de mostrar skeletons */\n  defaultDelay?: number;\n  /** Tiempo minimo de visualizacion global */\n  defaultMinTime?: number;\n  /** Templates de skeleton personalizados a registrar */\n  templates?: RegisteredSkeletonTemplate[];\n  /** Template por defecto para listas */\n  defaultListTemplate?: SkeletonTemplateName;\n  /** Template por defecto para grids */\n  defaultGridTemplate?: SkeletonTemplateName;\n}\n\n/**\n * Configuracion por defecto para el sistema de skeletons.\n */\nexport const DEFAULT_SKELETON_CONFIG: SkeletonConfig = {\n  animated: true,\n  defaultDelay: 0,\n  defaultMinTime: 300,\n  defaultListTemplate: 'list',\n  defaultGridTemplate: 'grid-cards',\n};\n\n/**\n * Contexto para templates de skeleton en directivas.\n */\nexport interface SkeletonTemplateContext {\n  /** Configuracion del skeleton */\n  config: SkeletonTemplateConfig;\n  /** Estado de animacion */\n  animated: boolean;\n}\n\n/**\n * Tipo base para componentes de skeleton template.\n */\nexport interface SkeletonTemplateComponent {\n  config: SkeletonTemplateConfig;\n}\n","import { Injectable, signal, computed, Type } from '@angular/core';\nimport {\n  SkeletonTemplateName,\n  SkeletonTemplateConfig,\n  RegisteredSkeletonTemplate,\n  SkeletonConfig,\n  DEFAULT_SKELETON_CONFIG,\n} from './types';\n\n/**\n * Servicio para gestionar templates de skeleton y estados de carga globales.\n *\n * @example\n * // En un componente\n * skeleton = inject(SkeletonService);\n *\n * // Registrar template personalizado\n * skeleton.registerTemplate('my-custom', MyCustomSkeletonComponent);\n *\n * // Obtener componente de template\n * const component = skeleton.getTemplate('list');\n *\n * // Gestionar estados de carga globales\n * skeleton.setLoadingState('dashboard', true);\n * const isDashboardLoading = skeleton.loadingState('dashboard');\n */\n@Injectable({ providedIn: 'root' })\nexport class SkeletonService {\n  private readonly _config = signal<SkeletonConfig>(DEFAULT_SKELETON_CONFIG);\n  private readonly _templates = signal<Map<string, RegisteredSkeletonTemplate>>(new Map());\n  private readonly _loadingStates = signal<Map<string, boolean>>(new Map());\n  private _initialized = false;\n\n  /** Configuracion actual (solo lectura) */\n  readonly config = this._config.asReadonly();\n\n  /** Templates registrados (solo lectura) */\n  readonly templates = this._templates.asReadonly();\n\n  /** Estado de carga global (cualquier estado registrado esta cargando) */\n  readonly isAnyLoading = computed(() => {\n    const states = this._loadingStates();\n    return Array.from(states.values()).some((v) => v);\n  });\n\n  /** Cantidad de templates registrados */\n  readonly templateCount = computed(() => this._templates().size);\n\n  /**\n   * Configura el servicio de skeleton.\n   * Llamado por provideValtechSkeleton().\n   */\n  configure(config: SkeletonConfig): void {\n    if (this._initialized) {\n      console.warn('[SkeletonService] Service already configured. Ignoring reconfiguration.');\n      return;\n    }\n\n    this._config.set({ ...DEFAULT_SKELETON_CONFIG, ...config });\n\n    // Registrar templates personalizados de la configuracion\n    config.templates?.forEach((t) => {\n      this.registerTemplate(t.name, t.component, t.defaultConfig);\n    });\n\n    this._initialized = true;\n  }\n\n  /**\n   * Registra un template de skeleton personalizado.\n   *\n   * @param name Nombre unico del template\n   * @param component Componente a usar\n   * @param defaultConfig Configuracion por defecto opcional\n   */\n  registerTemplate(\n    name: string,\n    component: Type<unknown>,\n    defaultConfig?: SkeletonTemplateConfig\n  ): void {\n    this._templates.update((map) => {\n      const newMap = new Map(map);\n      newMap.set(name, { name, component, defaultConfig });\n      return newMap;\n    });\n  }\n\n  /**\n   * Obtiene un template de skeleton registrado.\n   *\n   * @param name Nombre del template\n   * @returns Template registrado o undefined si no existe\n   */\n  getTemplate(name: SkeletonTemplateName | string): RegisteredSkeletonTemplate | undefined {\n    return this._templates().get(name);\n  }\n\n  /**\n   * Verifica si un template esta registrado.\n   *\n   * @param name Nombre del template\n   * @returns true si el template existe\n   */\n  hasTemplate(name: string): boolean {\n    return this._templates().has(name);\n  }\n\n  /**\n   * Obtiene todos los nombres de templates registrados.\n   *\n   * @returns Array de nombres de templates\n   */\n  getTemplateNames(): string[] {\n    return Array.from(this._templates().keys());\n  }\n\n  /**\n   * Registra un estado de carga nombrado.\n   * Util para indicadores de carga globales.\n   *\n   * @param key Identificador unico del estado\n   * @param isLoading Estado de carga\n   */\n  setLoadingState(key: string, isLoading: boolean): void {\n    this._loadingStates.update((map) => {\n      const newMap = new Map(map);\n      if (isLoading) {\n        newMap.set(key, true);\n      } else {\n        newMap.delete(key);\n      }\n      return newMap;\n    });\n  }\n\n  /**\n   * Obtiene el estado de carga para una clave especifica.\n   *\n   * @param key Identificador del estado\n   * @returns Estado de carga actual\n   */\n  getLoadingState(key: string): boolean {\n    return this._loadingStates().get(key) ?? false;\n  }\n\n  /**\n   * Crea un signal computado para un estado de carga especifico.\n   *\n   * @param key Identificador del estado\n   * @returns Signal reactivo del estado de carga\n   */\n  loadingState(key: string) {\n    return computed(() => this._loadingStates().get(key) ?? false);\n  }\n\n  /**\n   * Obtiene todas las claves de estados de carga activos.\n   *\n   * @returns Array de claves con estado de carga activo\n   */\n  getActiveLoadingKeys(): string[] {\n    const states = this._loadingStates();\n    return Array.from(states.entries())\n      .filter(([, isLoading]) => isLoading)\n      .map(([key]) => key);\n  }\n\n  /**\n   * Limpia todos los estados de carga.\n   */\n  clearLoadingStates(): void {\n    this._loadingStates.set(new Map());\n  }\n\n  /**\n   * Limpia un estado de carga especifico.\n   *\n   * @param key Identificador del estado a limpiar\n   */\n  clearLoadingState(key: string): void {\n    this.setLoadingState(key, false);\n  }\n\n  /**\n   * Ejecuta una funcion async con tracking de estado de carga.\n   *\n   * @param key Identificador del estado\n   * @param fn Funcion async a ejecutar\n   * @returns Resultado de la funcion\n   */\n  async withLoading<T>(key: string, fn: () => Promise<T>): Promise<T> {\n    this.setLoadingState(key, true);\n    try {\n      return await fn();\n    } finally {\n      this.setLoadingState(key, false);\n    }\n  }\n\n  /**\n   * Obtiene la configuracion de animacion por defecto.\n   */\n  get animated(): boolean {\n    return this._config().animated ?? true;\n  }\n\n  /**\n   * Obtiene el delay por defecto.\n   */\n  get defaultDelay(): number {\n    return this._config().defaultDelay ?? 0;\n  }\n\n  /**\n   * Obtiene el tiempo minimo por defecto.\n   */\n  get defaultMinTime(): number {\n    return this._config().defaultMinTime ?? 300;\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  signal,\n  computed,\n  OnInit,\n  OnDestroy,\n  ViewChild,\n  inject,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { I18nService } from '../../../services/i18n';\nimport {\n  IonInfiniteScroll,\n  IonInfiniteScrollContent,\n  IonButton,\n  IonSpinner,\n  IonIcon,\n  IonText,\n  IonList,\n  IonItem,\n} from '@ionic/angular/standalone';\nimport { firstValueFrom, isObservable } from 'rxjs';\nimport {\n  InfiniteListMetadata,\n  InfiniteListState,\n  LoadMoreEvent,\n  LoadParams,\n  LoadResult,\n  DEFAULT_INFINITE_LIST_METADATA,\n} from './types';\nimport { RefreshEvent, RefresherMetadata } from '../../molecules/refresher/types';\nimport { RefresherComponent } from '../../molecules/refresher/refresher.component';\nimport { SkeletonService } from '../../../services/skeleton/skeleton.service';\nimport { SkeletonTemplateComponent } from '../../../services/skeleton/types';\n\n/**\n * Componente wrapper para listas con infinite scroll.\n *\n * @example\n * <!-- Uso basico con data source -->\n * <val-infinite-list\n *   [props]=\"{\n *     dataSource: { loadFn: loadUsers, trackBy: trackByUserId },\n *     itemTemplate: userTemplate,\n *     pageSize: 20,\n *     threshold: '150px'\n *   }\"\n * ></val-infinite-list>\n *\n * <ng-template #userTemplate let-user let-index=\"index\">\n *   <val-card [props]=\"{ title: user.name, subtitle: user.email }\">\n *     <p>{{ user.bio }}</p>\n *   </val-card>\n * </ng-template>\n *\n * @example\n * <!-- Con pull-to-refresh y estado vacio personalizado -->\n * <val-infinite-list\n *   [props]=\"{\n *     dataSource: { loadFn: loadMessages },\n *     itemTemplate: messageTemplate,\n *     direction: 'both',\n *     enableRefresh: true,\n *     emptyState: {\n *       icon: 'chatbubbles-outline',\n *       title: 'Sin mensajes',\n *       message: 'Inicia una conversacion'\n *     },\n *     skeleton: { template: 'list', count: 5 }\n *   }\"\n *   (refresh)=\"onRefresh($event)\"\n * ></val-infinite-list>\n */\n@Component({\n  selector: 'val-infinite-list',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonInfiniteScroll,\n    IonInfiniteScrollContent,\n    IonButton,\n    IonSpinner,\n    IonIcon,\n    IonText,\n    IonList,\n    IonItem,\n    RefresherComponent,\n  ],\n  template: `\n    <!-- Pull to refresh wrapper -->\n    @if (mergedProps.enableRefresh) {\n      <val-refresher [props]=\"refresherConfig\" (refresh)=\"onRefreshTriggered($event)\">\n        <ng-container *ngTemplateOutlet=\"listContent\"></ng-container>\n      </val-refresher>\n    } @else {\n      <ng-container *ngTemplateOutlet=\"listContent\"></ng-container>\n    }\n\n    <!-- Main list content template -->\n    <ng-template #listContent>\n      <div\n        class=\"infinite-list-container\"\n        [class]=\"mergedProps.cssClass\"\n        [style.max-height]=\"mergedProps.maxHeight\"\n        [style.overflow-y]=\"mergedProps.maxHeight ? 'auto' : 'visible'\"\n        role=\"feed\"\n        [attr.aria-busy]=\"state() === 'loading'\"\n        [attr.aria-label]=\"mergedProps.ariaLabel\"\n        [attr.aria-description]=\"mergedProps.ariaDescription\"\n      >\n        <!-- Loading state (initial) -->\n        @if (state() === 'loading' && items().length === 0) {\n          <div class=\"infinite-list-skeleton\">\n            @if (mergedProps.skeleton?.customTemplate) {\n              <ng-container *ngTemplateOutlet=\"mergedProps.skeleton.customTemplate\"></ng-container>\n            } @else {\n              <ng-container *ngComponentOutlet=\"skeletonComponent; inputs: skeletonInputs\"></ng-container>\n            }\n          </div>\n        }\n\n        <!-- Empty state -->\n        @if (state() === 'idle' && items().length === 0 && !isInitialLoad()) {\n          <div class=\"infinite-list-empty\">\n            @if (mergedProps.emptyState?.template) {\n              <ng-container *ngTemplateOutlet=\"mergedProps.emptyState.template\"></ng-container>\n            } @else {\n              @if (mergedProps.emptyState?.icon) {\n                <ion-icon [name]=\"mergedProps.emptyState.icon\" size=\"large\"></ion-icon>\n              }\n              @if (mergedProps.emptyState?.title) {\n                <h3>{{ mergedProps.emptyState.title }}</h3>\n              }\n              @if (mergedProps.emptyState?.message) {\n                <p>{{ mergedProps.emptyState.message }}</p>\n              }\n            }\n          </div>\n        }\n\n        <!-- Error state -->\n        @if (state() === 'error') {\n          <div class=\"infinite-list-error\">\n            @if (mergedProps.errorState?.template) {\n              <ng-container\n                *ngTemplateOutlet=\"mergedProps.errorState.template; context: { error: error(), retry: retry.bind(this) }\"\n              ></ng-container>\n            } @else {\n              @if (mergedProps.errorState?.icon) {\n                <ion-icon [name]=\"mergedProps.errorState.icon\" color=\"danger\" size=\"large\"></ion-icon>\n              } @else {\n                <ion-icon name=\"alert-circle-outline\" color=\"danger\" size=\"large\"></ion-icon>\n              }\n              <h3>{{ mergedProps.errorState?.title || i18n.t('error') }}</h3>\n              <p>{{ mergedProps.errorState?.message || error()?.message || i18n.t('errorOccurred') }}</p>\n              @if (mergedProps.errorState?.showRetry !== false) {\n                <ion-button fill=\"outline\" (click)=\"retry()\">\n                  {{ mergedProps.errorState?.retryText || i18n.t('retry') }}\n                </ion-button>\n              }\n            }\n          </div>\n        }\n\n        <!-- Items list -->\n        @if (items().length > 0) {\n          <div class=\"infinite-list-items\" [class.with-dividers]=\"mergedProps.showDividers\">\n            @for (item of items(); track trackByFn($index, item); let i = $index; let first = $first; let last = $last) {\n              <article\n                class=\"infinite-list-item\"\n                [attr.aria-setsize]=\"mergedProps.dataSource.totalCount || null\"\n                [attr.aria-posinset]=\"i + 1\"\n              >\n                <ng-container\n                  *ngTemplateOutlet=\"\n                    mergedProps.itemTemplate;\n                    context: { $implicit: item, index: i, first: first, last: last, count: items().length }\n                  \"\n                ></ng-container>\n              </article>\n            }\n          </div>\n        }\n\n        <!-- Bottom infinite scroll -->\n        @if (shouldShowBottomScroll()) {\n          @if (mergedProps.useLoadMoreButton) {\n            <div class=\"infinite-list-load-more\">\n              @if (hasMoreBottom()) {\n                <ion-button\n                  fill=\"outline\"\n                  [color]=\"mergedProps.color\"\n                  [disabled]=\"state() === 'loading'\"\n                  (click)=\"loadBottom()\"\n                >\n                  @if (state() === 'loading') {\n                    <ion-spinner [name]=\"mergedProps.spinnerType\" slot=\"start\"></ion-spinner>\n                  }\n                  {{ mergedProps.loadMoreText || i18n.t('loadMore') }}\n                </ion-button>\n              } @else {\n                <ion-text color=\"medium\">{{ mergedProps.noMoreText || i18n.t('noMoreItems') }}</ion-text>\n              }\n            </div>\n          } @else {\n            <ion-infinite-scroll\n              [threshold]=\"mergedProps.threshold\"\n              [disabled]=\"!hasMoreBottom()\"\n              (ionInfinite)=\"onInfiniteScroll($event)\"\n            >\n              <ion-infinite-scroll-content\n                [loadingSpinner]=\"mergedProps.spinnerType\"\n                [loadingText]=\"state() === 'loading' ? i18n.t('loading') : ''\"\n              ></ion-infinite-scroll-content>\n            </ion-infinite-scroll>\n          }\n        }\n\n        <!-- No more items indicator -->\n        @if (!hasMoreBottom() && items().length > 0 && !mergedProps.useLoadMoreButton) {\n          <div class=\"infinite-list-end\">\n            <ion-text color=\"medium\">{{ mergedProps.noMoreText || i18n.t('noMoreItems') }}</ion-text>\n          </div>\n        }\n      </div>\n    </ng-template>\n\n    <!-- Live region for accessibility announcements -->\n    <div class=\"sr-only\" role=\"status\" aria-live=\"polite\" [attr.aria-atomic]=\"true\">\n      {{ statusAnnouncement() }}\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n\n      .infinite-list-container {\n        width: 100%;\n      }\n\n      .infinite-list-skeleton,\n      .infinite-list-empty,\n      .infinite-list-error {\n        padding: 24px 16px;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n        text-align: center;\n        gap: 12px;\n      }\n\n      .infinite-list-empty ion-icon,\n      .infinite-list-error ion-icon {\n        font-size: 48px;\n        opacity: 0.6;\n      }\n\n      .infinite-list-empty h3,\n      .infinite-list-error h3 {\n        margin: 0;\n        font-size: 18px;\n        font-weight: 600;\n      }\n\n      .infinite-list-empty p,\n      .infinite-list-error p {\n        margin: 0;\n        color: var(--ion-color-medium);\n        font-size: 14px;\n      }\n\n      .infinite-list-items {\n        &.with-dividers .infinite-list-item:not(:last-child) {\n          border-bottom: 1px solid var(--ion-color-light-shade, #d7d8da);\n        }\n      }\n\n      .infinite-list-load-more {\n        display: flex;\n        justify-content: center;\n        padding: 16px;\n      }\n\n      .infinite-list-end {\n        display: flex;\n        justify-content: center;\n        padding: 16px;\n        font-size: 14px;\n      }\n\n      .sr-only {\n        position: absolute;\n        width: 1px;\n        height: 1px;\n        padding: 0;\n        margin: -1px;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        white-space: nowrap;\n        border: 0;\n      }\n    `,\n  ],\n})\nexport class InfiniteListComponent<T = unknown> implements OnInit, OnDestroy {\n  private readonly skeletonService = inject(SkeletonService);\n  private readonly cdr = inject(ChangeDetectorRef);\n  protected readonly i18n = inject(I18nService);\n\n  @ViewChild(IonInfiniteScroll) infiniteScroll?: IonInfiniteScroll;\n\n  /** Configuracion del componente */\n  @Input() props!: InfiniteListMetadata<T>;\n\n  // === Events ===\n  @Output() loadMore = new EventEmitter<LoadMoreEvent>();\n  @Output() refresh = new EventEmitter<RefreshEvent>();\n  @Output() stateChange = new EventEmitter<InfiniteListState>();\n  @Output() itemsChange = new EventEmitter<T[]>();\n  @Output() errorOccurred = new EventEmitter<Error>();\n\n  // === Reactive State ===\n  readonly items = signal<T[]>([]);\n  readonly state = signal<InfiniteListState>('idle');\n  readonly hasMoreBottom = signal<boolean>(true);\n  readonly hasMoreTop = signal<boolean>(false);\n  readonly error = signal<Error | null>(null);\n  readonly isInitialLoad = signal<boolean>(true);\n\n  private currentPage = 0;\n  private currentCursor: unknown = null;\n\n  /** Progreso de carga (0-1 si totalCount conocido) */\n  readonly loadProgress = computed(() => {\n    if (!this.props?.dataSource?.totalCount) return null;\n    return this.items().length / this.props.dataSource.totalCount;\n  });\n\n  /** Props combinados con defaults */\n  get mergedProps(): InfiniteListMetadata<T> {\n    return { ...DEFAULT_INFINITE_LIST_METADATA, ...this.props } as InfiniteListMetadata<T>;\n  }\n\n  /** Config del refresher */\n  get refresherConfig(): RefresherMetadata {\n    return this.mergedProps.refreshConfig ?? {};\n  }\n\n  /** Componente de skeleton a usar */\n  get skeletonComponent() {\n    const templateName = this.mergedProps.skeleton?.template || 'list';\n    const template = this.skeletonService.getTemplate(templateName);\n    return template?.component ?? null;\n  }\n\n  /** Inputs para el skeleton */\n  get skeletonInputs(): { config: unknown } {\n    return {\n      config: {\n        count: this.mergedProps.skeleton?.count ?? 3,\n        animated: true,\n        ...this.mergedProps.skeleton?.config,\n      },\n    };\n  }\n\n  /** Anuncio de estado para lectores de pantalla */\n  readonly statusAnnouncement = computed(() => {\n    switch (this.state()) {\n      case 'loading':\n        return this.i18n.t('loadingItems');\n      case 'error':\n        return `${this.i18n.t('error')}: ${this.error()?.message || this.i18n.t('errorOccurred')}`;\n      case 'complete':\n        return this.i18n.t('allItemsLoaded');\n      default:\n        return '';\n    }\n  });\n\n  ngOnInit(): void {\n    // Cargar items iniciales del dataSource si existen\n    if (this.props.dataSource.items?.length) {\n      this.items.set([...this.props.dataSource.items]);\n      this.isInitialLoad.set(false);\n    }\n\n    // Auto-cargar si esta habilitado\n    if (this.mergedProps.autoLoad && !this.items().length) {\n      this.loadInitial();\n    }\n  }\n\n  ngOnDestroy(): void {\n    // Cleanup\n  }\n\n  /** Funcion de tracking para ngFor */\n  trackByFn(index: number, item: T): unknown {\n    if (this.props.dataSource.trackBy) {\n      return this.props.dataSource.trackBy(index, item);\n    }\n    return index;\n  }\n\n  /** Si debe mostrar el scroll inferior */\n  shouldShowBottomScroll(): boolean {\n    const dir = this.mergedProps.direction;\n    return (dir === 'bottom' || dir === 'both') && this.items().length > 0;\n  }\n\n  /** Carga inicial de datos */\n  async loadInitial(): Promise<void> {\n    if (!this.props.dataSource.loadFn) return;\n\n    this.state.set('loading');\n    this.stateChange.emit('loading');\n    this.error.set(null);\n\n    try {\n      const params: LoadParams = {\n        direction: 'bottom',\n        page: 0,\n        pageSize: this.mergedProps.pageSize ?? 20,\n      };\n\n      const result = await this.executeLoad(params);\n\n      this.items.set(result.items as T[]);\n      this.hasMoreBottom.set(result.hasMore);\n      this.currentPage = 1;\n      this.currentCursor = result.cursor;\n      this.isInitialLoad.set(false);\n\n      this.state.set('idle');\n      this.stateChange.emit('idle');\n      this.itemsChange.emit(this.items());\n    } catch (err) {\n      this.handleError(err as Error);\n    }\n  }\n\n  /** Cargar mas items en la parte inferior */\n  async loadBottom(): Promise<void> {\n    if (!this.hasMoreBottom() || this.state() === 'loading') return;\n    if (!this.props.dataSource.loadFn) return;\n\n    this.state.set('loading');\n    this.stateChange.emit('loading');\n\n    try {\n      const params: LoadParams = {\n        direction: 'bottom',\n        page: this.currentPage,\n        pageSize: this.mergedProps.pageSize ?? 20,\n        cursor: this.currentCursor,\n        lastItem: this.items()[this.items().length - 1],\n      };\n\n      const result = await this.executeLoad(params);\n\n      this.items.update((current) => [...current, ...(result.items as T[])]);\n      this.hasMoreBottom.set(result.hasMore);\n      this.currentPage++;\n      this.currentCursor = result.cursor;\n\n      this.state.set(result.hasMore ? 'idle' : 'complete');\n      this.stateChange.emit(result.hasMore ? 'idle' : 'complete');\n      this.itemsChange.emit(this.items());\n    } catch (err) {\n      this.handleError(err as Error);\n    }\n  }\n\n  /** Cargar mas items en la parte superior */\n  async loadTop(): Promise<void> {\n    if (!this.hasMoreTop() || this.state() === 'loading') return;\n    if (!this.props.dataSource.loadFn) return;\n\n    this.state.set('loading');\n\n    try {\n      const params: LoadParams = {\n        direction: 'top',\n        page: 0,\n        pageSize: this.mergedProps.pageSize ?? 20,\n        firstItem: this.items()[0],\n      };\n\n      const result = await this.executeLoad(params);\n\n      this.items.update((current) => [...(result.items as T[]), ...current]);\n      this.hasMoreTop.set(result.hasMore);\n\n      this.state.set('idle');\n      this.itemsChange.emit(this.items());\n    } catch (err) {\n      this.handleError(err as Error);\n    }\n  }\n\n  /** Refresh - recargar desde cero */\n  async refreshList(): Promise<void> {\n    this.currentPage = 0;\n    this.currentCursor = null;\n    this.hasMoreBottom.set(true);\n    this.items.set([]);\n    await this.loadInitial();\n  }\n\n  /** Reintentar despues de error */\n  async retry(): Promise<void> {\n    this.error.set(null);\n    if (this.items().length === 0) {\n      await this.loadInitial();\n    } else {\n      await this.loadBottom();\n    }\n  }\n\n  /** Reset completo */\n  async reset(): Promise<void> {\n    this.items.set([]);\n    this.currentPage = 0;\n    this.currentCursor = null;\n    this.hasMoreBottom.set(true);\n    this.hasMoreTop.set(false);\n    this.error.set(null);\n    this.isInitialLoad.set(true);\n    this.state.set('idle');\n\n    if (this.mergedProps.autoLoad) {\n      await this.loadInitial();\n    }\n  }\n\n  /** Agregar items al inicio */\n  prependItems(newItems: T[]): void {\n    this.items.update((current) => [...newItems, ...current]);\n    this.itemsChange.emit(this.items());\n  }\n\n  /** Agregar items al final */\n  appendItems(newItems: T[]): void {\n    this.items.update((current) => [...current, ...newItems]);\n    this.itemsChange.emit(this.items());\n  }\n\n  /** Actualizar un item por indice */\n  updateItem(index: number, item: T): void {\n    this.items.update((current) => {\n      const updated = [...current];\n      updated[index] = item;\n      return updated;\n    });\n    this.itemsChange.emit(this.items());\n  }\n\n  /** Remover un item por indice */\n  removeItem(index: number): void {\n    this.items.update((current) => current.filter((_, i) => i !== index));\n    this.itemsChange.emit(this.items());\n  }\n\n  /** Handler para evento de infinite scroll */\n  async onInfiniteScroll(event: CustomEvent): Promise<void> {\n    await this.loadBottom();\n    (event.target as HTMLIonInfiniteScrollElement).complete();\n  }\n\n  /** Handler para evento de refresh */\n  async onRefreshTriggered(event: RefreshEvent): Promise<void> {\n    this.refresh.emit(event);\n    await this.refreshList();\n    event.complete();\n  }\n\n  private async executeLoad(params: LoadParams): Promise<LoadResult<unknown>> {\n    const loadFn = this.props.dataSource.loadFn!;\n    const result = loadFn(params);\n\n    if (isObservable(result)) {\n      return await firstValueFrom(result);\n    }\n    return await result;\n  }\n\n  private handleError(err: Error): void {\n    this.error.set(err);\n    this.state.set('error');\n    this.stateChange.emit('error');\n    this.errorOccurred.emit(err);\n    console.error('[InfiniteList] Error loading items:', err);\n  }\n}\n","import { ImageMetadata } from '../../atoms/image/types';\nimport { OAuthProvider } from '../../../services/auth/types';\nimport { AuthUser } from '../../../services/auth/types';\n\n/**\n * Configuration for legal notice displayed in the login component\n */\nexport interface LoginLegalConfig {\n  /** Company name to display */\n  companyName: string;\n  /** Link for company name (optional) */\n  companyLink?: string;\n  /** Link to terms and conditions page */\n  termsLink?: string;\n  /** Link to privacy policy page */\n  privacyLink?: string;\n}\n\n/**\n * Main configuration for the Login component\n */\nexport interface LoginMetadata {\n  /** Logo to display at the top of the form */\n  logo?: ImageMetadata;\n\n  /** Show OAuth login buttons (default: true) */\n  showOAuth?: boolean;\n\n  /** OAuth providers to show (default: ['google']) */\n  oauthProviders?: OAuthProvider[];\n\n  /** Show register link and modal (default: true) */\n  showRegister?: boolean;\n\n  /** Show forgot password link and modal (default: true) */\n  showForgotPassword?: boolean;\n\n  /** Wrap component in card-style container with background, shadow, rounded corners (default: false) */\n  showCard?: boolean;\n\n  /** Legal notice configuration */\n  legal?: LoginLegalConfig;\n\n  /** Route to redirect after successful login (optional - if not set, emits event) */\n  redirectOnSuccess?: string;\n}\n\n/**\n * Event emitted when login is successful\n */\nexport interface LoginSuccessEvent {\n  /** The authenticated user */\n  user: AuthUser | null;\n  /** Whether MFA was required and completed */\n  mfaCompleted?: boolean;\n  /** Whether this was an OAuth login */\n  oauthProvider?: OAuthProvider;\n}\n\n/**\n * Event emitted when login fails\n */\nexport interface LoginErrorEvent {\n  /** Error code from the backend */\n  code?: string;\n  /** Human-readable error message */\n  message: string;\n  /** The operation that failed */\n  operation: 'signin' | 'signup' | 'verify' | 'forgot' | 'reset' | 'mfa' | 'oauth';\n}\n\n/**\n * Event emitted when MFA verification is required\n */\nexport interface MFARequiredEvent {\n  /** MFA method required */\n  method: 'TOTP' | 'EMAIL' | 'SMS';\n}\n\n/**\n * Default values for LoginMetadata\n */\nexport const LOGIN_DEFAULTS: Required<Omit<LoginMetadata, 'logo' | 'legal' | 'redirectOnSuccess'>> = {\n  showOAuth: true,\n  oauthProviders: ['google'],\n  showRegister: true,\n  showForgotPassword: true,\n  showCard: false,\n};\n","import { Component, computed, EventEmitter, inject, Input, OnDestroy, Output, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Validators } from '@angular/forms';\nimport { authPasswordValidator } from '../../../shared/utils/validators';\nimport { Router } from '@angular/router';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonModal,\n  IonText,\n  IonToolbar,\n} from '@ionic/angular/standalone';\n\nimport { AuthService } from '../../../services/auth';\nimport { ToastService } from '../../../services/toast.service';\nimport { I18nService, InputI18nHelper } from '../../../services/i18n';\nimport { FormComponent } from '../form/form.component';\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { FormMetadata, FormSubmit, InputType, ComponentStates, ComponentState } from '../../types';\nimport { SolidDefaultBlock } from '../../atoms/button/factory';\nimport { LoginMetadata, LoginSuccessEvent, LoginErrorEvent, MFARequiredEvent, LOGIN_DEFAULTS } from './types';\n\n@Component({\n  selector: 'val-login',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonButton,\n    IonButtons,\n    IonContent,\n    IonHeader,\n    IonIcon,\n    IonModal,\n    IonText,\n    IonToolbar,\n    FormComponent,\n    ImageComponent,\n  ],\n  templateUrl: './login.component.html',\n  styleUrls: ['./login.component.scss'],\n})\nexport class LoginComponent implements OnDestroy {\n  @Input() props: LoginMetadata = {};\n\n  @Output() onSuccess = new EventEmitter<LoginSuccessEvent>();\n  @Output() onError = new EventEmitter<LoginErrorEvent>();\n  @Output() onMFARequired = new EventEmitter<MFARequiredEvent>();\n\n  // Services\n  authService = inject(AuthService);\n  private toastService = inject(ToastService);\n  private router = inject(Router);\n  private i18n = inject(I18nService);\n  private i18nHelper = inject(InputI18nHelper);\n\n  /**\n   * Helper method for translating auth-related strings.\n   * Exposed to template for dynamic text.\n   */\n  t(key: string, data?: Record<string, string>): string {\n    return this.i18n.t(key, '_auth', data);\n  }\n\n  // Timers\n  private resendTimer: ReturnType<typeof setInterval> | null = null;\n  private resetResendTimer: ReturnType<typeof setInterval> | null = null;\n\n  // State\n  isOAuthLoading = false;\n  isRegisterModalOpen = false;\n  isVerifyModalOpen = false;\n  isForgotPasswordModalOpen = false;\n  isResetPasswordModalOpen = false;\n  isMFAVerifyModalOpen = false;\n  private _mfaSuccessPending = false;\n\n  pendingVerificationEmail = '';\n  pendingResetEmail = '';\n  resendCooldown = 0;\n  resetResendCooldown = 0;\n\n  // Resolved props with defaults\n  get config(): Required<Omit<LoginMetadata, 'logo' | 'legal' | 'redirectOnSuccess'>> & LoginMetadata {\n    return { ...LOGIN_DEFAULTS, ...this.props };\n  }\n\n  // ==========================================\n  // FORM STATE SIGNALS\n  // ==========================================\n\n  private _loginFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _registerFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _verifyFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _verifyFormSectionName = signal('');\n  private _mfaVerifyFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _mfaMethod = signal<'TOTP' | 'EMAIL' | 'SMS'>('TOTP');\n  private _forgotPasswordFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _resetPasswordFormState = signal<ComponentState>(ComponentStates.ENABLED);\n  private _resetFormSectionName = signal('');\n\n  // ==========================================\n  // LOGIN FORM (computed)\n  // ==========================================\n\n  readonly loginFormProps = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'loginTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: '',\n          order: 0,\n          fields: [\n            {\n              type: InputType.EMAIL,\n              name: 'email',\n              token: 'login-email',\n              hint: '',\n              labelKey: 'email',\n              placeholderKey: 'emailPlaceholder',\n              errorKeys: {\n                required: 'emailRequired',\n                email: 'emailInvalid',\n              },\n              validators: [Validators.required, Validators.email],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n            {\n              type: InputType.PASSWORD,\n              name: 'password',\n              token: 'login-password',\n              hint: '',\n              labelKey: 'password',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: {\n                required: 'passwordRequired',\n              },\n              validators: [Validators.required],\n              order: 1,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'login-submit',\n        textKey: 'loginSubmit',\n      },\n      state: this._loginFormState(),\n    })\n  );\n\n  // ==========================================\n  // REGISTER FORM (computed)\n  // ==========================================\n\n  readonly registerFormProps = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'registerTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: '',\n          order: 0,\n          fields: [\n            {\n              type: InputType.TEXT,\n              name: 'name',\n              token: 'register-name',\n              hint: '',\n              labelKey: 'fullName',\n              placeholderKey: 'namePlaceholder',\n              errorKeys: {\n                required: 'nameRequired',\n                minlength: 'nameMinLength',\n              },\n              validators: [Validators.required, Validators.minLength(2)],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n            {\n              type: InputType.EMAIL,\n              name: 'email',\n              token: 'register-email',\n              hint: '',\n              labelKey: 'email',\n              placeholderKey: 'emailPlaceholder',\n              errorKeys: {\n                required: 'emailRequired',\n                email: 'emailInvalid',\n              },\n              validators: [Validators.required, Validators.email],\n              order: 1,\n              state: ComponentStates.ENABLED,\n            },\n            {\n              type: InputType.PASSWORD,\n              name: 'password',\n              token: 'register-password',\n              hint: '',\n              labelKey: 'password',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: {\n                required: 'passwordRequired',\n                authPassword: 'passwordStrength',\n              },\n              validators: [Validators.required, authPasswordValidator()],\n              order: 2,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'register-submit',\n        textKey: 'registerSubmit',\n      },\n      state: this._registerFormState(),\n    })\n  );\n\n  // ==========================================\n  // VERIFY EMAIL FORM (computed)\n  // ==========================================\n\n  readonly verifyFormProps = computed<FormMetadata>(() => {\n    const sectionName = this._verifyFormSectionName() || this.t('verifyDescription');\n    return this.i18nHelper.resolveForm({\n      nameKey: 'verifyTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: sectionName,\n          order: 0,\n          fields: [\n            {\n              type: InputType.PIN_CODE,\n              label: '',\n              name: 'code',\n              token: 'verify-pin',\n              hint: '',\n              placeholder: '',\n              errorKeys: {\n                required: 'codeRequired',\n                minlength: 'codeMinLength',\n              },\n              validators: [Validators.required, Validators.minLength(6)],\n              order: 0,\n              state: ComponentStates.ENABLED,\n              length: 6,\n              allowNumbersOnly: true,\n              autoFocus: true,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'verify-submit',\n        textKey: 'verifySubmit',\n      },\n      state: this._verifyFormState(),\n    });\n  });\n\n  // ==========================================\n  // MFA VERIFY FORM (computed)\n  // ==========================================\n\n  readonly mfaVerifyFormProps = computed<FormMetadata>(() => {\n    const method = this._mfaMethod();\n    const sectionName =\n      method === 'TOTP' ? this.t('mfaTOTP') : method === 'EMAIL' ? this.t('mfaEmail') : this.t('mfaSMS');\n\n    return this.i18nHelper.resolveForm({\n      nameKey: 'mfaTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: sectionName,\n          order: 0,\n          fields: [\n            {\n              type: InputType.PIN_CODE,\n              label: '',\n              name: 'code',\n              token: 'mfa-pin',\n              hint: '',\n              placeholder: '',\n              errorKeys: {\n                required: 'codeRequired',\n                minlength: 'codeMinLength',\n              },\n              validators: [Validators.required, Validators.minLength(6)],\n              order: 0,\n              state: ComponentStates.ENABLED,\n              length: 6,\n              allowNumbersOnly: true,\n              autoFocus: true,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'mfa-verify-submit',\n        textKey: 'verifySubmit',\n      },\n      state: this._mfaVerifyFormState(),\n    });\n  });\n\n  // ==========================================\n  // FORGOT PASSWORD FORM (computed)\n  // ==========================================\n\n  readonly forgotPasswordFormProps = computed<FormMetadata>(() =>\n    this.i18nHelper.resolveForm({\n      nameKey: 'forgotTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: this.t('forgotDescription'),\n          order: 0,\n          fields: [\n            {\n              type: InputType.EMAIL,\n              label: '',\n              name: 'email',\n              token: 'forgot-email',\n              hint: '',\n              placeholderKey: 'emailPlaceholder',\n              errorKeys: {\n                required: 'emailRequired',\n                email: 'emailInvalid',\n              },\n              validators: [Validators.required, Validators.email],\n              order: 0,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'forgot-submit',\n        textKey: 'forgotSubmit',\n      },\n      state: this._forgotPasswordFormState(),\n    })\n  );\n\n  // ==========================================\n  // RESET PASSWORD FORM (computed)\n  // ==========================================\n\n  readonly resetPasswordFormProps = computed<FormMetadata>(() => {\n    const sectionName = this._resetFormSectionName() || this.t('resetDescription');\n    return this.i18nHelper.resolveForm({\n      nameKey: 'resetTitle',\n      i18nNamespace: '_auth',\n      sections: [\n        {\n          name: sectionName,\n          order: 0,\n          fields: [\n            {\n              type: InputType.PIN_CODE,\n              label: '',\n              name: 'code',\n              token: 'reset-pin',\n              hint: '',\n              placeholder: '',\n              errorKeys: {\n                required: 'codeRequired',\n                minlength: 'codeMinLength',\n              },\n              validators: [Validators.required, Validators.minLength(6)],\n              order: 0,\n              state: ComponentStates.ENABLED,\n              length: 6,\n              allowNumbersOnly: true,\n              autoFocus: true,\n            },\n            {\n              type: InputType.PASSWORD,\n              name: 'newPassword',\n              token: 'reset-new-password',\n              labelKey: 'newPassword',\n              hintKey: 'newPasswordHint',\n              placeholderKey: 'passwordPlaceholder',\n              errorKeys: {\n                required: 'passwordRequired',\n                authPassword: 'passwordStrength',\n              },\n              validators: [Validators.required, authPasswordValidator()],\n              order: 1,\n              state: ComponentStates.ENABLED,\n            },\n          ],\n        },\n      ],\n      actions: {\n        ...SolidDefaultBlock('', 'submit'),\n        token: 'reset-submit',\n        textKey: 'resetSubmit',\n      },\n      state: this._resetPasswordFormState(),\n    });\n  });\n\n  // ==========================================\n  // HANDLERS\n  // ==========================================\n\n  loginHandler(event: FormSubmit): void {\n    const email = event.fields['email'];\n    const password = event.fields['password'];\n\n    if (!email || !password) {\n      this.showToast(this.t('completeAllFields'));\n      return;\n    }\n\n    this._loginFormState.set(ComponentStates.WORKING);\n\n    this.authService.signin({ email, password }).subscribe({\n      next: () => {\n        this._loginFormState.set(ComponentStates.ENABLED);\n\n        if (this.authService.mfaPending().required) {\n          this.openMFAVerifyModal();\n          return;\n        }\n\n        this.handleLoginSuccess();\n      },\n      error: err => {\n        this._loginFormState.set(ComponentStates.ENABLED);\n\n        const errorCode = (err as { code?: string })?.code;\n        if (errorCode === 'AUTHV2_EMAIL_NOT_VERIFIED') {\n          this.openVerifyModal(email);\n          return;\n        }\n\n        this.handleError(err, 'signin');\n      },\n    });\n  }\n\n  loginWithOAuth(provider: 'google' | 'apple' | 'microsoft'): void {\n    this.isOAuthLoading = true;\n\n    this.authService.signinWithOAuth(provider).subscribe({\n      next: () => {\n        this.isOAuthLoading = false;\n\n        if (this.authService.mfaPending().required) {\n          this.openMFAVerifyModal();\n          return;\n        }\n\n        this.handleLoginSuccess(provider);\n      },\n      error: err => {\n        this.isOAuthLoading = false;\n\n        const errorCode = (err as { code?: string })?.code;\n        if (errorCode === 'POPUP_CLOSED') {\n          return;\n        }\n\n        this.handleError(err, 'oauth');\n      },\n    });\n  }\n\n  // ==========================================\n  // REGISTER HANDLERS\n  // ==========================================\n\n  openRegisterModal(): void {\n    this.isRegisterModalOpen = true;\n  }\n\n  closeRegisterModal(): void {\n    this.isRegisterModalOpen = false;\n  }\n\n  registerHandler(event: FormSubmit): void {\n    const name = event.fields['name'];\n    const email = event.fields['email'];\n    const password = event.fields['password'];\n\n    if (!name || !email || !password) {\n      this.showToast(this.t('completeAllFields'));\n      return;\n    }\n\n    this._registerFormState.set(ComponentStates.WORKING);\n\n    this.authService.signup({ name, email, password }).subscribe({\n      next: () => {\n        this._registerFormState.set(ComponentStates.ENABLED);\n        this.closeRegisterModal();\n        this.openVerifyModal(email);\n      },\n      error: err => {\n        this._registerFormState.set(ComponentStates.ENABLED);\n        this.handleError(err, 'signup');\n      },\n    });\n  }\n\n  // ==========================================\n  // VERIFY EMAIL HANDLERS\n  // ==========================================\n\n  openVerifyModal(email: string): void {\n    this.pendingVerificationEmail = email;\n    this._verifyFormSectionName.set(`${this.t('verifyDescription').replace('.', '')} (${email})`);\n    this._verifyFormState.set(ComponentStates.ENABLED);\n    this.isVerifyModalOpen = true;\n    this.startResendCooldown();\n  }\n\n  closeVerifyModal(): void {\n    this.isVerifyModalOpen = false;\n    this.pendingVerificationEmail = '';\n    this._verifyFormSectionName.set('');\n    this.stopResendCooldown();\n  }\n\n  verifyHandler(event: FormSubmit): void {\n    const code = event.fields['code'];\n\n    this._verifyFormState.set(ComponentStates.WORKING);\n\n    this.authService\n      .verifyEmail({\n        email: this.pendingVerificationEmail,\n        code,\n      })\n      .subscribe({\n        next: () => {\n          this._verifyFormState.set(ComponentStates.ENABLED);\n          this.showToast(this.t('emailVerified'));\n          this.closeVerifyModal();\n          this.handleLoginSuccess();\n        },\n        error: err => {\n          this._verifyFormState.set(ComponentStates.ENABLED);\n          this.handleError(err, 'verify');\n        },\n      });\n  }\n\n  resendCode(): void {\n    if (this.resendCooldown > 0) return;\n\n    this.authService\n      .resendCode({\n        email: this.pendingVerificationEmail,\n        type: 'EMAIL_VERIFY',\n      })\n      .subscribe({\n        next: () => {\n          this.showToast(this.t('codeSent'));\n          this.startResendCooldown();\n        },\n        error: err => {\n          this.handleError(err, 'verify');\n        },\n      });\n  }\n\n  // ==========================================\n  // MFA HANDLERS\n  // ==========================================\n\n  openMFAVerifyModal(): void {\n    const method = this.authService.mfaPending().method as 'TOTP' | 'EMAIL' | 'SMS';\n    this._mfaMethod.set(method);\n    this._mfaVerifyFormState.set(ComponentStates.ENABLED);\n    this.isMFAVerifyModalOpen = true;\n\n    this.onMFARequired.emit({ method });\n  }\n\n  closeMFAVerifyModal(): void {\n    this.isMFAVerifyModalOpen = false;\n  }\n\n  verifyMFAHandler(event: FormSubmit): void {\n    const code = event.fields['code'];\n\n    this._mfaVerifyFormState.set(ComponentStates.WORKING);\n\n    this.authService.verifyMFA(code).subscribe({\n      next: () => {\n        this._mfaVerifyFormState.set(ComponentStates.ENABLED);\n        // Diferimos handleLoginSuccess hasta que ion-modal complete su\n        // animación de cierre (didDismiss). Sin esto, `router.navigate` del\n        // padre destruye al host del modal antes de que Ionic procese el\n        // dismiss, y el modal queda visible encima de la página destino\n        // (iOS PWA).\n        this._mfaSuccessPending = true;\n        this.closeMFAVerifyModal();\n      },\n      error: err => {\n        this._mfaVerifyFormState.set(ComponentStates.ENABLED);\n        this.handleError(err, 'mfa');\n      },\n    });\n  }\n\n  onMFAVerifyDismissed(): void {\n    if (this._mfaSuccessPending) {\n      this._mfaSuccessPending = false;\n      this.handleLoginSuccess(undefined, true);\n    }\n  }\n\n  // ==========================================\n  // FORGOT PASSWORD HANDLERS\n  // ==========================================\n\n  openForgotPasswordModal(): void {\n    this.isForgotPasswordModalOpen = true;\n  }\n\n  closeForgotPasswordModal(): void {\n    this.isForgotPasswordModalOpen = false;\n  }\n\n  forgotPasswordHandler(event: FormSubmit): void {\n    const email = event.fields['email'];\n\n    if (!email) {\n      this.showToast(this.t('enterEmail'));\n      return;\n    }\n\n    this._forgotPasswordFormState.set(ComponentStates.WORKING);\n\n    this.authService.forgotPassword({ email }).subscribe({\n      next: () => {\n        this._forgotPasswordFormState.set(ComponentStates.ENABLED);\n        this.closeForgotPasswordModal();\n        this.openResetPasswordModal(email);\n        this.showToast(this.t('codeSent'));\n      },\n      error: err => {\n        this._forgotPasswordFormState.set(ComponentStates.ENABLED);\n        this.handleError(err, 'forgot');\n      },\n    });\n  }\n\n  // ==========================================\n  // RESET PASSWORD HANDLERS\n  // ==========================================\n\n  openResetPasswordModal(email: string): void {\n    this.pendingResetEmail = email;\n    this._resetFormSectionName.set(`${this.t('resetDescription').replace('.', '')} (${email})`);\n    this._resetPasswordFormState.set(ComponentStates.ENABLED);\n    this.isResetPasswordModalOpen = true;\n    this.startResetResendCooldown();\n  }\n\n  closeResetPasswordModal(): void {\n    this.isResetPasswordModalOpen = false;\n    this.pendingResetEmail = '';\n    this._resetFormSectionName.set('');\n    this.stopResetResendCooldown();\n  }\n\n  resetPasswordHandler(event: FormSubmit): void {\n    const code = event.fields['code'];\n    const newPassword = event.fields['newPassword'];\n\n    this._resetPasswordFormState.set(ComponentStates.WORKING);\n\n    this.authService\n      .resetPassword({\n        email: this.pendingResetEmail,\n        code,\n        newPassword,\n      })\n      .subscribe({\n        next: () => {\n          this._resetPasswordFormState.set(ComponentStates.ENABLED);\n          this.showToast(this.t('passwordUpdated'));\n          this.closeResetPasswordModal();\n        },\n        error: err => {\n          this._resetPasswordFormState.set(ComponentStates.ENABLED);\n          this.handleError(err, 'reset');\n        },\n      });\n  }\n\n  resendResetCode(): void {\n    if (this.resetResendCooldown > 0) return;\n\n    this.authService\n      .resendCode({\n        email: this.pendingResetEmail,\n        type: 'PASSWORD_RESET',\n      })\n      .subscribe({\n        next: () => {\n          this.showToast(this.t('codeSent'));\n          this.startResetResendCooldown();\n        },\n        error: err => {\n          this.handleError(err, 'reset');\n        },\n      });\n  }\n\n  // ==========================================\n  // HELPERS\n  // ==========================================\n\n  private handleLoginSuccess(oauthProvider?: 'google' | 'apple' | 'microsoft', mfaCompleted?: boolean): void {\n    this.showToast(this.t('welcome'));\n\n    this.onSuccess.emit({\n      user: this.authService.user(),\n      mfaCompleted,\n      oauthProvider,\n    });\n\n    if (this.props.redirectOnSuccess) {\n      this.router.navigate([this.props.redirectOnSuccess]);\n    }\n  }\n\n  private handleError(err: unknown, operation: LoginErrorEvent['operation']): void {\n    const message = this.getErrorMessage(err);\n    this.showToast(message);\n\n    this.onError.emit({\n      code: (err as { code?: string })?.code,\n      message,\n      operation,\n    });\n  }\n\n  private showToast(message: string): void {\n    this.toastService.show({\n      message,\n      duration: 3500,\n    });\n  }\n\n  private getErrorMessage(err: unknown): string {\n    const error = err as {\n      error?: { message?: string; code?: string };\n      code?: string;\n    };\n\n    // Map error codes to i18n keys\n    const errorKeyMap: Record<string, string> = {\n      // Signin\n      AUTHV2_INVALID_CREDENTIALS: 'errorInvalidCredentials',\n      AUTHV2_EMAIL_NOT_VERIFIED: 'errorEmailNotVerified',\n      AUTHV2_ACCOUNT_SUSPENDED: 'errorAccountSuspended',\n\n      // Signup\n      AUTHV2_EMAIL_EXISTS: 'errorEmailExists',\n      AUTHV2_WEAK_PASSWORD: 'errorWeakPassword',\n\n      // Verification codes\n      AUTHV2_INVALID_CODE: 'errorInvalidCode',\n      AUTHV2_EXPIRED_CODE: 'errorExpiredCode',\n      AUTHV2_CODE_EXPIRED: 'errorExpiredCode',\n      AUTHV2_TOO_MANY_ATTEMPTS: 'errorTooManyAttempts',\n\n      // MFA\n      AUTHV2_MFA_INVALID_CODE: 'errorMFAInvalidCode',\n\n      // OAuth\n      POPUP_BLOCKED: 'errorPopupBlocked',\n      OAUTH_FAILED: 'errorOAuthFailed',\n    };\n\n    const errorCode = error?.error?.code || error?.code;\n    if (errorCode && errorKeyMap[errorCode]) {\n      return this.t(errorKeyMap[errorCode]);\n    }\n\n    if (error?.error?.message) {\n      return error.error.message;\n    }\n\n    return this.t('errorGeneric');\n  }\n\n  // ==========================================\n  // COOLDOWN TIMERS\n  // ==========================================\n\n  private startResendCooldown(): void {\n    this.resendCooldown = 30;\n    this.resendTimer = setInterval(() => {\n      this.resendCooldown--;\n      if (this.resendCooldown <= 0) {\n        this.stopResendCooldown();\n      }\n    }, 1000);\n  }\n\n  private stopResendCooldown(): void {\n    if (this.resendTimer) {\n      clearInterval(this.resendTimer);\n      this.resendTimer = null;\n    }\n    this.resendCooldown = 0;\n  }\n\n  private startResetResendCooldown(): void {\n    this.resetResendCooldown = 30;\n    this.resetResendTimer = setInterval(() => {\n      this.resetResendCooldown--;\n      if (this.resetResendCooldown <= 0) {\n        this.stopResetResendCooldown();\n      }\n    }, 1000);\n  }\n\n  private stopResetResendCooldown(): void {\n    if (this.resetResendTimer) {\n      clearInterval(this.resetResendTimer);\n      this.resetResendTimer = null;\n    }\n    this.resetResendCooldown = 0;\n  }\n\n  ngOnDestroy(): void {\n    this.stopResendCooldown();\n    this.stopResetResendCooldown();\n  }\n}\n","<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n  <!-- Logo -->\n  @if (props.logo) {\n  <div class=\"logo-container\">\n    <val-image [props]=\"props.logo\" />\n  </div>\n  }\n\n  <!-- Login Form -->\n  <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n  <!-- OAuth Section -->\n  @if (config.showOAuth && config.oauthProviders.length > 0) {\n  <div class=\"oauth-separator\">\n    <span>{{ t('orContinueWith') }}</span>\n  </div>\n\n  <div class=\"oauth-buttons\">\n    @for (provider of config.oauthProviders; track provider) {\n    <ion-button\n      expand=\"block\"\n      fill=\"outline\"\n      color=\"dark\"\n      (click)=\"loginWithOAuth(provider)\"\n      [disabled]=\"isOAuthLoading\"\n    >\n      @switch (provider) { @case ('google') {\n      <ion-icon slot=\"start\" name=\"logo-google\"></ion-icon>\n      {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n      <ion-icon slot=\"start\" name=\"logo-apple\"></ion-icon>\n      {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n      <ion-icon slot=\"start\" name=\"logo-microsoft\"></ion-icon>\n      {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n    </ion-button>\n    }\n  </div>\n  }\n\n  <!-- Register Link -->\n  @if (config.showRegister) {\n  <div class=\"auth-link\">\n    <ion-text color=\"dark\">\n      {{ t('noAccount') }}\n      <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n    </ion-text>\n  </div>\n  }\n\n  <!-- Forgot Password Link -->\n  @if (config.showForgotPassword) {\n  <div class=\"auth-link forgot-password\">\n    <ion-text color=\"dark\">\n      {{ t('forgotLink') }}\n      <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n    </ion-text>\n  </div>\n  }\n\n  <!-- Legal Notice -->\n  @if (props.legal) {\n  <div class=\"legal-notice\">\n    <ion-text color=\"dark\">\n      <p>\n        {{ t('legalPrefix') }} @if (props.legal.companyLink) {\n        <a [href]=\"props.legal.companyLink\"><strong>{{ props.legal.companyName }}</strong></a>\n        } @else {\n        <strong>{{ props.legal.companyName }}</strong>\n        } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n        <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n        } @else {\n        <span>{{ t('termsAndConditions') }}</span>\n        } {{ t('and') }} @if (props.legal.privacyLink) {\n        <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n        } @else {\n        <span>{{ t('privacyPolicy') }}</span>\n        }.\n      </p>\n    </ion-text>\n  </div>\n  }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" (click)=\"closeRegisterModal()\">\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (props.logo) {\n        <div class=\"logo-container\">\n          <val-image [props]=\"props.logo\" />\n        </div>\n        }\n        <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n        <div class=\"auth-link\">\n          <ion-text color=\"dark\">\n            {{ t('hasAccount') }}\n            <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n          </ion-text>\n        </div>\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" (click)=\"closeVerifyModal()\">\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (props.logo) {\n        <div class=\"logo-container\">\n          <val-image [props]=\"props.logo\" />\n        </div>\n        }\n        <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n        <div class=\"resend-link\">\n          <ion-text color=\"dark\">\n            {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n            <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n            } @else {\n            <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n            }\n          </ion-text>\n        </div>\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" (click)=\"closeForgotPasswordModal()\">\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (props.logo) {\n        <div class=\"logo-container\">\n          <val-image [props]=\"props.logo\" />\n        </div>\n        }\n        <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" (click)=\"closeResetPasswordModal()\">\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (props.logo) {\n        <div class=\"logo-container\">\n          <val-image [props]=\"props.logo\" />\n        </div>\n        }\n        <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n        <div class=\"resend-link\">\n          <ion-text color=\"dark\">\n            {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n            <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n            } @else {\n            <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n            }\n          </ion-text>\n        </div>\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n  <ng-template>\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" (click)=\"closeMFAVerifyModal()\">\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (props.logo) {\n        <div class=\"logo-container\">\n          <val-image [props]=\"props.logo\" />\n        </div>\n        }\n        <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n      </section>\n    </ion-content>\n  </ng-template>\n</ion-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnDestroy, OnInit, signal, computed } from '@angular/core';\nimport { RotatingTextMetadata, RotatingTextMessage } from './types';\n\n/**\n * val-rotating-text\n *\n * A component that rotates through an array of text messages with smooth animations.\n * Features entrance/exit animations with fade, blur, and scale effects.\n *\n * @example\n * <val-rotating-text\n *   [props]=\"{\n *     messages: [\n *       { aboveTitle: 'Welcome', title: 'Hello World' },\n *       { aboveTitle: 'Tip:', title: 'Stay curious' }\n *     ],\n *     interval: 4000,\n *     showDots: true\n *   }\"\n * ></val-rotating-text>\n *\n * @input props - Configuration for the rotating text component\n */\n@Component({\n  selector: 'val-rotating-text',\n  standalone: true,\n  imports: [CommonModule],\n  styles: [\n    `\n      .rotating-banner {\n        text-align: center;\n        padding: 2rem 1rem;\n        min-height: 120px;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n      }\n\n      .rotating-text {\n        position: relative;\n        overflow: hidden;\n      }\n\n      .rotating-text .above-title {\n        font-size: 1.125rem;\n        margin-bottom: 0.75rem;\n        font-family: monospace;\n      }\n\n      .rotating-text .title {\n        font-size: 2rem;\n        font-weight: 900;\n      }\n\n      .text-enter {\n        animation: textEnter 0.6s ease-out forwards;\n      }\n\n      .text-exit {\n        animation: textExit 0.4s ease-in forwards;\n      }\n\n      @keyframes textEnter {\n        0% {\n          opacity: 0;\n          transform: translateY(20px) scale(0.95);\n          filter: blur(4px);\n        }\n        100% {\n          opacity: 1;\n          transform: translateY(0) scale(1);\n          filter: blur(0);\n        }\n      }\n\n      @keyframes textExit {\n        0% {\n          opacity: 1;\n          transform: translateY(0) scale(1);\n          filter: blur(0);\n        }\n        100% {\n          opacity: 0;\n          transform: translateY(-20px) scale(0.95);\n          filter: blur(4px);\n        }\n      }\n\n      .progress-dots {\n        display: flex;\n        gap: 8px;\n        margin-top: 1.5rem;\n      }\n\n      .progress-dot {\n        width: 8px;\n        height: 8px;\n        border-radius: 50%;\n        background: var(--ion-color-medium-tint);\n        transition: all 0.3s ease;\n        cursor: pointer;\n      }\n\n      .progress-dot.active {\n        background: var(--ion-color-dark);\n        transform: scale(1.3);\n      }\n    `,\n  ],\n  template: `\n    <div\n      class=\"rotating-banner\"\n      [ngStyle]=\"{ background: props.backgroundColor || 'transparent' }\"\n    >\n      <div\n        class=\"rotating-text\"\n        [class.text-enter]=\"isEntering()\"\n        [class.text-exit]=\"isExiting()\"\n      >\n        <div\n          class=\"above-title\"\n          [ngStyle]=\"{ color: aboveTitleColorValue }\"\n        >\n          {{ currentMessage()?.aboveTitle }}\n        </div>\n        <div\n          class=\"title\"\n          [ngStyle]=\"{ color: titleColorValue }\"\n        >\n          {{ currentMessage()?.title }}\n        </div>\n      </div>\n      <div class=\"progress-dots\" *ngIf=\"props.showDots !== false\">\n        <div\n          *ngFor=\"let message of props.messages; let i = index\"\n          class=\"progress-dot\"\n          [class.active]=\"i === currentIndex()\"\n          (click)=\"goToMessage(i)\"\n        ></div>\n      </div>\n    </div>\n  `,\n})\nexport class RotatingTextComponent implements OnInit, OnDestroy {\n  private intervalId: ReturnType<typeof setInterval> | null = null;\n\n  /**\n   * Component configuration.\n   */\n  @Input() props: RotatingTextMetadata = {\n    messages: [],\n    interval: 4000,\n    showDots: true,\n    aboveTitleColor: 'medium',\n    titleColor: 'dark',\n  };\n\n  // Animation state\n  currentIndex = signal(0);\n  isEntering = signal(true);\n  isExiting = signal(false);\n\n  // Current message computed from index\n  currentMessage = computed(() => this.props.messages[this.currentIndex()]);\n\n  // Color values\n  get aboveTitleColorValue(): string {\n    const color = this.props.aboveTitleColor || 'medium';\n    return color.startsWith('--') || color.startsWith('#') || color.startsWith('rgb')\n      ? color\n      : `var(--ion-color-${color})`;\n  }\n\n  get titleColorValue(): string {\n    const color = this.props.titleColor || 'dark';\n    return color.startsWith('--') || color.startsWith('#') || color.startsWith('rgb')\n      ? color\n      : `var(--ion-color-${color})`;\n  }\n\n  ngOnInit(): void {\n    if (this.props.messages.length > 1) {\n      this.startRotation();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.stopRotation();\n  }\n\n  private startRotation(): void {\n    const interval = this.props.interval ?? 4000;\n    this.intervalId = setInterval(() => {\n      this.rotateToNext();\n    }, interval);\n  }\n\n  private stopRotation(): void {\n    if (this.intervalId) {\n      clearInterval(this.intervalId);\n      this.intervalId = null;\n    }\n  }\n\n  private rotateToNext(): void {\n    // Start exit animation\n    this.isEntering.set(false);\n    this.isExiting.set(true);\n\n    // After exit animation, change text and start enter animation\n    setTimeout(() => {\n      this.currentIndex.update((i) => (i + 1) % this.props.messages.length);\n      this.isExiting.set(false);\n      this.isEntering.set(true);\n    }, 400); // Match exit animation duration\n  }\n\n  /**\n   * Navigate to a specific message by index.\n   */\n  goToMessage(index: number): void {\n    if (index === this.currentIndex()) return;\n\n    this.stopRotation();\n    this.isEntering.set(false);\n    this.isExiting.set(true);\n\n    setTimeout(() => {\n      this.currentIndex.set(index);\n      this.isExiting.set(false);\n      this.isEntering.set(true);\n      if (this.props.messages.length > 1) {\n        this.startRotation();\n      }\n    }, 400);\n  }\n}\n","import { Component, computed, inject, Input, OnInit, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink } from '@angular/router';\nimport { IonButton } from '@ionic/angular/standalone';\nimport { Terminal404Metadata } from './types';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * val-terminal-404\n *\n * A fun, terminal-styled 404 page component with typing animations.\n *\n * Features:\n * - Terminal window aesthetic with colored dots\n * - Typing animation effect with sequential line reveals\n * - Blinking cursor\n * - Customizable colors to match brand\n * - Shows the attempted path\n *\n * @example\n * <val-terminal-404\n *   [props]=\"{\n *     primaryColor: '#4a1d96',\n *     homeRoute: '/',\n *     homeButtonText: 'cd /home'\n *   }\"\n * ></val-terminal-404>\n */\n@Component({\n  selector: 'val-terminal-404',\n  standalone: true,\n  imports: [CommonModule, IonButton, RouterLink],\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n        --terminal-primary: var(--ion-color-primary, #4a1d96);\n        --terminal-primary-light: var(--ion-color-primary-tint, #5b21b6);\n      }\n\n      .terminal-container {\n        min-height: 70vh;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        padding: 2rem;\n        border-radius: 16px;\n      }\n\n      .terminal {\n        border-radius: 12px;\n        padding: 0;\n        max-width: 600px;\n        width: 100%;\n        box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n        overflow: hidden;\n      }\n\n      .terminal-header {\n        background: #161b22;\n        padding: 12px 16px;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n\n      .terminal-dot {\n        width: 12px;\n        height: 12px;\n        border-radius: 50%;\n      }\n\n      .dot-red {\n        background: #ff5f56;\n      }\n      .dot-yellow {\n        background: #ffbd2e;\n      }\n      .dot-green {\n        background: #27ca40;\n      }\n\n      .terminal-title {\n        flex: 1;\n        text-align: center;\n        color: #8b949e;\n        font-size: 0.85rem;\n        font-family: monospace;\n      }\n\n      .terminal-body {\n        padding: 24px;\n        font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;\n        font-size: 0.95rem;\n        line-height: 1.8;\n      }\n\n      .line {\n        margin-bottom: 8px;\n        opacity: 0;\n        animation: fadeIn 0.3s ease forwards;\n      }\n\n      .line:nth-child(1) {\n        animation-delay: 0.2s;\n      }\n      .line:nth-child(2) {\n        animation-delay: 0.8s;\n      }\n      .line:nth-child(3) {\n        animation-delay: 1.4s;\n      }\n      .line:nth-child(4) {\n        animation-delay: 2s;\n      }\n      .line:nth-child(5) {\n        animation-delay: 2.6s;\n      }\n      .line:nth-child(6) {\n        animation-delay: 3.2s;\n      }\n\n      @keyframes fadeIn {\n        to {\n          opacity: 1;\n        }\n      }\n\n      .prompt {\n        color: #7ee787;\n      }\n\n      .command {\n        color: #c9d1d9;\n      }\n\n      .error {\n        color: #f85149;\n      }\n\n      .info {\n        color: #58a6ff;\n      }\n\n      .warning {\n        color: #d29922;\n      }\n\n      .cursor {\n        display: inline-block;\n        width: 10px;\n        height: 18px;\n        background: #7ee787;\n        margin-left: 4px;\n        animation: blink 1s step-end infinite;\n        vertical-align: text-bottom;\n      }\n\n      @keyframes blink {\n        0%,\n        100% {\n          opacity: 1;\n        }\n        50% {\n          opacity: 0;\n        }\n      }\n\n      .error-code {\n        font-size: 6rem;\n        font-weight: 900;\n        text-align: center;\n        margin: 0.5rem 0 1rem;\n        font-family: monospace;\n      }\n\n      .action-container {\n        margin-top: 2rem;\n        text-align: center;\n        opacity: 0;\n        animation: fadeIn 0.5s ease forwards;\n        animation-delay: 3.8s;\n      }\n\n      .home-button {\n        --border-radius: 8px;\n        --background: var(--terminal-primary);\n        --background-hover: var(--terminal-primary-light);\n        font-family: monospace;\n      }\n\n      .error-code {\n        color: var(--terminal-primary);\n        text-shadow: 0 0 40px color-mix(in srgb, var(--terminal-primary) 30%, transparent);\n      }\n\n      .search-icon {\n        animation: searching 2s ease-in-out infinite;\n        display: inline-block;\n      }\n\n      @keyframes searching {\n        0%,\n        100% {\n          transform: translateX(0);\n        }\n        25% {\n          transform: translateX(5px);\n        }\n        75% {\n          transform: translateX(-5px);\n        }\n      }\n    `,\n  ],\n  template: `\n    <div\n      class=\"terminal-container\"\n      [ngStyle]=\"containerStyles\"\n    >\n      <div class=\"error-code\">404</div>\n\n      <div\n        class=\"terminal\"\n        [ngStyle]=\"{ background: props.terminalBackground || '#0d1117' }\"\n      >\n        <div class=\"terminal-header\">\n          <div class=\"terminal-dot dot-red\"></div>\n          <div class=\"terminal-dot dot-yellow\"></div>\n          <div class=\"terminal-dot dot-green\"></div>\n          <span class=\"terminal-title\">bash - 404</span>\n        </div>\n\n        <div class=\"terminal-body\">\n          <div class=\"line\">\n            <span class=\"prompt\">user&#64;app</span>\n            <span class=\"command\">:~$ </span>\n            <span class=\"command\">cd /{{ requestedPath() }}</span>\n          </div>\n\n          <div class=\"line\">\n            <span class=\"error\"\n              >bash: cd: /{{ requestedPath() }}: {{ directoryNotFound() }}</span\n            >\n          </div>\n\n          <div class=\"line\">\n            <span class=\"prompt\">user&#64;app</span>\n            <span class=\"command\">:~$ </span>\n            <span class=\"command\">sudo find / -name \"{{ searchTerm() }}\"</span>\n          </div>\n\n          <div class=\"line\">\n            <span class=\"info\"\n              ><span class=\"search-icon\">🔍</span> {{ searching() }}</span\n            >\n          </div>\n\n          <div class=\"line\">\n            <span class=\"warning\">find: {{ noResults() }}</span>\n          </div>\n\n          <div class=\"line\">\n            <span class=\"prompt\">user&#64;app</span>\n            <span class=\"command\">:~$ </span>\n            <span class=\"cursor\"></span>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"action-container\">\n        <ion-button\n          class=\"home-button\"\n          [routerLink]=\"props.homeRoute || '/'\"\n          expand=\"block\"\n        >\n          {{ props.homeButtonText || homeButton() }}\n        </ion-button>\n      </div>\n    </div>\n  `,\n})\nexport class Terminal404Component implements OnInit {\n  @Input() props: Terminal404Metadata = {};\n\n  private i18n = inject(I18nService);\n\n  requestedPath = signal('page-not-found');\n\n  // i18n texts - t(key, namespace)\n  directoryNotFound = computed(() =>\n    this.i18n.t('directoryNotFound', 'terminal404')\n  );\n  searching = computed(() => this.i18n.t('searching', 'terminal404'));\n  noResults = computed(() => this.i18n.t('noResults', 'terminal404'));\n  searchTerm = computed(() => this.i18n.t('searchTerm', 'terminal404'));\n  homeButton = computed(() => this.i18n.t('homeButton', 'terminal404'));\n\n  get containerStyles(): Record<string, string> {\n    const styles: Record<string, string> = {};\n\n    // Background gradient\n    const bg = this.props.backgroundColor;\n    if (bg) {\n      styles['background'] = `linear-gradient(135deg, ${bg.start} 0%, ${bg.middle} 50%, ${bg.end} 100%)`;\n    } else {\n      styles['background'] = 'linear-gradient(135deg, #ede9fe 0%, #ddd6fe 50%, #c4b5fd 100%)';\n    }\n\n    // Override primary color if provided\n    if (this.props.primaryColor) {\n      styles['--terminal-primary'] = this.props.primaryColor;\n      styles['--terminal-primary-light'] = this.lightenColor(this.props.primaryColor);\n    }\n\n    return styles;\n  }\n\n  ngOnInit(): void {\n    if (typeof window !== 'undefined') {\n      const path = window.location.pathname.slice(1) || 'unknown';\n      this.requestedPath.set(path);\n    }\n  }\n\n  /**\n   * Lighten a hex color for hover states\n   */\n  lightenColor(hex: string): string {\n    // Simple lighten by adding to RGB values\n    const num = parseInt(hex.replace('#', ''), 16);\n    const r = Math.min(255, (num >> 16) + 20);\n    const g = Math.min(255, ((num >> 8) & 0x00ff) + 20);\n    const b = Math.min(255, (num & 0x0000ff) + 20);\n    return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;\n  }\n}\n","import { Color } from '@ionic/core';\n\n/**\n * Badge configuration for a nav item\n */\nexport interface BottomNavBadge {\n  /** Badge text (e.g., \"3\", \"NEW\") */\n  text?: string;\n  /** Badge color */\n  color?: Color | string;\n  /** Badge background color */\n  backgroundColor?: Color | string;\n  /** Show as dot only (no text) */\n  dot?: boolean;\n}\n\n/**\n * Icon configuration - supports multiple icon sources\n */\nexport interface BottomNavIcon {\n  /** Ionicon name for inactive state (e.g., 'home-outline') */\n  default: string;\n  /** Ionicon name for active state (e.g., 'home') - defaults to default if not provided */\n  active?: string;\n}\n\n/**\n * Configuration for a single nav tab item\n */\nexport interface BottomNavTab {\n  /** Unique identifier for the tab */\n  token: string;\n  /** Icon configuration */\n  icon: BottomNavIcon;\n  /** Static label text */\n  label?: string;\n  /** i18n key for label */\n  labelKey?: string;\n  /** Route to navigate to (supports string or array format) */\n  route: string | string[];\n  /** Routes that should also mark this tab as active (for nested routes) */\n  activeRoutes?: string[];\n  /** Badge configuration */\n  badge?: BottomNavBadge;\n  /** Whether the tab is disabled */\n  disabled?: boolean;\n  /** Aria label for accessibility */\n  ariaLabel?: string;\n}\n\n/**\n * Configuration for the central FAB button (optional)\n */\nexport interface BottomNavFab {\n  /** Icon name */\n  icon: string;\n  /** FAB color */\n  color?: Color | string;\n  /** FAB size */\n  size?: 'small' | 'default';\n  /** Route to navigate to (if navigation action) */\n  route?: string | string[];\n  /** Whether this is an action (emits event) or navigation */\n  isAction?: boolean;\n  /** Aria label for accessibility */\n  ariaLabel?: string;\n}\n\n/**\n * Theme configuration for bottom nav\n */\nexport interface BottomNavTheme {\n  /** Background color (CSS variable or color value) */\n  background?: string;\n  /** Active tab color */\n  activeColor?: Color | string;\n  /** Inactive tab color */\n  inactiveColor?: Color | string;\n  /** Border radius for the nav bar */\n  borderRadius?: string;\n  /** Whether to show a top border/shadow */\n  elevated?: boolean;\n  /** Blur effect for translucent background */\n  translucent?: boolean;\n  /** Floating island style - detached from edges with rounded corners */\n  floating?: boolean;\n}\n\n/**\n * Click event emitted by bottom nav\n */\nexport interface BottomNavClickEvent {\n  /** Token of the clicked item */\n  token: string;\n  /** Whether it's the FAB button */\n  isFab: boolean;\n  /** The route if navigation occurred */\n  route?: string | string[];\n}\n\n/**\n * Main metadata for val-bottom-nav component\n */\nexport interface BottomNavMetadata {\n  /** Array of tab configurations */\n  tabs: BottomNavTab[];\n  /** Central FAB button configuration (optional) */\n  fab?: BottomNavFab;\n  /** i18n namespace for labels */\n  i18nNamespace?: string;\n  /** Theme configuration */\n  theme?: BottomNavTheme;\n  /** Hide labels (icon-only mode) */\n  hideLabels?: boolean;\n  /** Safe area padding for iOS notch */\n  safeArea?: boolean;\n  /** Animation style */\n  animation?: 'fade' | 'scale' | 'slide' | 'none';\n  /** Cap del ancho de la barra. Token sm|md|lg|xl|full o valor CSS crudo. Default: 'md' (720px) — bottom-nav típicamente tiene pocos tabs y se ve mejor estrecho aunque el contenido use 'xl' */\n  maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | 'full' | string;\n}\n\n/**\n * Default values for BottomNavMetadata\n */\nexport const BOTTOM_NAV_DEFAULTS: Required<\n  Pick<BottomNavMetadata, 'hideLabels' | 'safeArea' | 'animation' | 'maxWidth'>\n> & { theme: Required<BottomNavTheme> } = {\n  hideLabels: false,\n  safeArea: true,\n  animation: 'scale',\n  maxWidth: 'md',\n  theme: {\n    background: 'var(--ion-background-color)',\n    activeColor: 'primary',\n    inactiveColor: 'medium',\n    borderRadius: '16px 16px 0 0',\n    elevated: false,\n    translucent: true,\n    floating: false,\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, OnDestroy, OnInit, Output, signal } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { IonIcon, IonRippleEffect } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { filter, Subscription } from 'rxjs';\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation';\nimport { BottomNavMetadata, BottomNavTab, BottomNavClickEvent, BOTTOM_NAV_DEFAULTS } from './types';\n\n// Register common navigation icons\nimport {\n  home,\n  homeOutline,\n  search,\n  searchOutline,\n  person,\n  personOutline,\n  settings,\n  settingsOutline,\n  notifications,\n  notificationsOutline,\n  add,\n  addOutline,\n  heart,\n  heartOutline,\n  cart,\n  cartOutline,\n  chatbubble,\n  chatbubbleOutline,\n  compass,\n  compassOutline,\n  grid,\n  gridOutline,\n  list,\n  listOutline,\n  calendar,\n  calendarOutline,\n  folder,\n  folderOutline,\n  documents,\n  documentsOutline,\n  statsChart,\n  statsChartOutline,\n} from 'ionicons/icons';\n\naddIcons({\n  home,\n  homeOutline,\n  search,\n  searchOutline,\n  person,\n  personOutline,\n  settings,\n  settingsOutline,\n  notifications,\n  notificationsOutline,\n  add,\n  addOutline,\n  heart,\n  heartOutline,\n  cart,\n  cartOutline,\n  chatbubble,\n  chatbubbleOutline,\n  compass,\n  compassOutline,\n  grid,\n  gridOutline,\n  list,\n  listOutline,\n  calendar,\n  calendarOutline,\n  folder,\n  folderOutline,\n  documents,\n  documentsOutline,\n  statsChart,\n  statsChartOutline,\n});\n\n/**\n * val-bottom-nav\n *\n * A modern bottom navigation bar component with support for tabs,\n * optional central FAB button, badges, and route-based active state detection.\n *\n * @example Basic usage\n * ```html\n * <val-bottom-nav\n *   [props]=\"{\n *     tabs: [\n *       { token: 'home', icon: { default: 'home-outline', active: 'home' }, label: 'Home', route: '/app/home' },\n *       { token: 'settings', icon: { default: 'settings-outline', active: 'settings' }, label: 'Settings', route: '/app/settings' }\n *     ]\n *   }\"\n *   (tabClick)=\"onTabClick($event)\"\n * />\n * ```\n *\n * @example With i18n and translucent theme\n * ```html\n * <val-bottom-nav\n *   [props]=\"{\n *     tabs: [\n *       { token: 'home', icon: { default: 'home-outline' }, labelKey: 'menuHome', route: '/app/home' },\n *       { token: 'settings', icon: { default: 'settings-outline' }, labelKey: 'menuSettings', route: '/app/settings' }\n *     ],\n *     i18nNamespace: 'Menu',\n *     theme: { translucent: true }\n *   }\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-bottom-nav',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonRippleEffect],\n  template: `\n    <nav\n      class=\"bottom-nav\"\n      [class.bottom-nav--elevated]=\"config().theme.elevated\"\n      [class.bottom-nav--translucent]=\"config().theme.translucent\"\n      [class.bottom-nav--floating]=\"config().theme.floating\"\n      [class.bottom-nav--safe-area]=\"config().safeArea\"\n      [class.bottom-nav--hide-labels]=\"config().hideLabels\"\n      [ngStyle]=\"getThemeStyles()\"\n      role=\"navigation\"\n      aria-label=\"Bottom navigation\"\n    >\n      <div class=\"bottom-nav__container\">\n        @for (item of displayTabs(); track $index) {\n          @if (item === null && config().fab) {\n            <!-- FAB Button -->\n            <button\n              class=\"bottom-nav__fab\"\n              [class.bottom-nav__fab--small]=\"config().fab!.size === 'small'\"\n              [style.--fab-color]=\"resolveColor(config().fab!.color || 'primary')\"\n              (click)=\"onFabClick()\"\n              [attr.aria-label]=\"config().fab!.ariaLabel || 'Action button'\"\n              type=\"button\"\n            >\n              <ion-ripple-effect></ion-ripple-effect>\n              <ion-icon [name]=\"config().fab!.icon\"></ion-icon>\n            </button>\n          } @else if (item) {\n            <!-- Tab Item -->\n            <button\n              class=\"bottom-nav__tab\"\n              [class.bottom-nav__tab--active]=\"isActive(item)\"\n              [class.bottom-nav__tab--disabled]=\"item.disabled\"\n              [attr.data-animation]=\"config().animation\"\n              (click)=\"onTabClick(item)\"\n              [attr.aria-label]=\"item.ariaLabel || getLabel(item)\"\n              [attr.aria-current]=\"isActive(item) ? 'page' : null\"\n              [disabled]=\"item.disabled\"\n              type=\"button\"\n            >\n              <ion-ripple-effect></ion-ripple-effect>\n\n              <div class=\"bottom-nav__tab-icon\">\n                <ion-icon [name]=\"getIcon(item)\"></ion-icon>\n\n                <!-- Badge -->\n                @if (item.badge) {\n                  <span\n                    class=\"bottom-nav__badge\"\n                    [class.bottom-nav__badge--dot]=\"item.badge.dot\"\n                    [style.color]=\"item.badge.color ? resolveColor(item.badge.color) : null\"\n                    [style.background-color]=\"\n                      item.badge.backgroundColor ? resolveColor(item.badge.backgroundColor) : null\n                    \"\n                  >\n                    @if (!item.badge.dot && item.badge.text) {\n                      {{ item.badge.text }}\n                    }\n                  </span>\n                }\n              </div>\n\n              @if (!config().hideLabels && getLabel(item)) {\n                <span class=\"bottom-nav__tab-label\">{{ getLabel(item) }}</span>\n              }\n            </button>\n          }\n        }\n      </div>\n    </nav>\n  `,\n  styleUrls: ['./bottom-nav.component.scss'],\n})\nexport class BottomNavComponent implements OnInit, OnDestroy {\n  private router = inject(Router);\n  private navigation = inject(NavigationService);\n  private i18n = inject(I18nService);\n  private routerSubscription?: Subscription;\n\n  /** Component configuration */\n  readonly props = input<BottomNavMetadata>({ tabs: [] });\n\n  /** Event emitted when a tab is clicked */\n  @Output() tabClick = new EventEmitter<BottomNavClickEvent>();\n\n  /** Event emitted when the FAB button is clicked */\n  @Output() fabClick = new EventEmitter<void>();\n\n  /** Current active route signal for reactive updates */\n  private currentRoute = signal<string>('');\n\n  /** Merged configuration with defaults */\n  config = computed(() => ({\n    ...BOTTOM_NAV_DEFAULTS,\n    ...this.props(),\n    theme: {\n      ...BOTTOM_NAV_DEFAULTS.theme,\n      ...this.props().theme,\n    },\n  }));\n\n  /** Computed tabs with FAB inserted if present */\n  displayTabs = computed(() => {\n    const tabs = this.config().tabs;\n    const fab = this.config().fab;\n\n    if (!fab) return tabs;\n\n    // Insert placeholder at center for FAB positioning\n    const midpoint = Math.floor(tabs.length / 2);\n    return [\n      ...tabs.slice(0, midpoint),\n      null as unknown as BottomNavTab, // FAB placeholder\n      ...tabs.slice(midpoint),\n    ];\n  });\n\n  /** Check if a tab is currently active */\n  isActive(tab: BottomNavTab): boolean {\n    const route = this.currentRoute();\n    if (!route) return false;\n\n    // Check main route\n    const tabRoute = Array.isArray(tab.route) ? tab.route.join('/') : tab.route;\n    if (route.startsWith(tabRoute)) return true;\n\n    // Check additional active routes\n    if (tab.activeRoutes) {\n      return tab.activeRoutes.some(r => route.startsWith(r));\n    }\n\n    return false;\n  }\n\n  /** Get the appropriate icon for a tab based on active state */\n  getIcon(tab: BottomNavTab): string {\n    const active = this.isActive(tab);\n    if (active && tab.icon.active) {\n      return tab.icon.active;\n    }\n    return tab.icon.default;\n  }\n\n  /** Get translated label for a tab */\n  getLabel(tab: BottomNavTab): string {\n    if (tab.label) return tab.label;\n    if (tab.labelKey) {\n      this.i18n.lang(); // Track language changes for reactivity\n      return this.i18n.t(tab.labelKey, this.config().i18nNamespace);\n    }\n    return '';\n  }\n\n  /** Get CSS variables for theming */\n  getThemeStyles(): Record<string, string> {\n    const theme = this.config().theme;\n    return {\n      '--bottom-nav-bg': theme.background || '',\n      '--bottom-nav-active': this.resolveColor(theme.activeColor),\n      '--bottom-nav-inactive': this.resolveColor(theme.inactiveColor),\n      '--bottom-nav-radius': theme.borderRadius || '',\n      '--bottom-nav-max-width': this.resolveMaxWidth(this.config().maxWidth),\n    };\n  }\n\n  /** Resolve maxWidth token (sm|md|lg|xl|full) to CSS var or raw value */\n  resolveMaxWidth(v?: string): string {\n    switch (v) {\n      case 'sm':\n        return 'var(--val-container-sm, 540px)';\n      case 'md':\n        return 'var(--val-container-md, 720px)';\n      case 'lg':\n        return 'var(--val-container-lg, 880px)';\n      case 'xl':\n        return 'var(--val-container-xl, 1100px)';\n      case 'full':\n        return 'none';\n      case undefined:\n      case '':\n        return 'var(--val-container-md, 720px)';\n      default:\n        return v;\n    }\n  }\n\n  ngOnInit(): void {\n    // Set initial route\n    this.currentRoute.set(this.router.url);\n\n    // Subscribe to route changes\n    this.routerSubscription = this.router.events\n      .pipe(filter(event => event instanceof NavigationEnd))\n      .subscribe(event => {\n        this.currentRoute.set((event as NavigationEnd).urlAfterRedirects);\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.routerSubscription?.unsubscribe();\n  }\n\n  /** Handle tab click */\n  onTabClick(tab: BottomNavTab): void {\n    if (tab.disabled) return;\n\n    // Emit event\n    this.tabClick.emit({\n      token: tab.token,\n      isFab: false,\n      route: tab.route,\n    });\n\n    // Navigate\n    const route = Array.isArray(tab.route) ? tab.route : [tab.route];\n    this.router.navigate(route);\n  }\n\n  /** Handle FAB click */\n  onFabClick(): void {\n    const fab = this.config().fab;\n    if (!fab) return;\n\n    // Emit event\n    this.fabClick.emit();\n\n    // Navigate if route is defined and not an action-only button\n    if (fab.route && !fab.isAction) {\n      const route = Array.isArray(fab.route) ? fab.route : [fab.route];\n      this.router.navigate(route);\n    }\n  }\n\n  /** Resolve Ionic color name to CSS variable */\n  resolveColor(color?: string): string {\n    if (!color) return '';\n    const ionicColors = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n    if (ionicColors.includes(color)) {\n      return `var(--ion-color-${color})`;\n    }\n    return color;\n  }\n}\n","/**\n * Options for image compression\n */\nexport interface ImageCompressOptions {\n  /** Maximum width in pixels (default: 800) */\n  maxWidth?: number;\n  /** Maximum height in pixels (default: 800) */\n  maxHeight?: number;\n  /** Quality 0-1 (default: 0.8) */\n  quality?: number;\n  /** Output MIME type (default: 'image/jpeg') */\n  mimeType?: 'image/jpeg' | 'image/png' | 'image/webp';\n}\n\n/**\n * Options for image validation\n */\nexport interface ImageValidateOptions {\n  /** Maximum file size in bytes (default: 10MB) */\n  maxSize?: number;\n  /** Allowed MIME types (default: ['image/jpeg', 'image/png', 'image/webp', 'image/gif']) */\n  allowedTypes?: string[];\n  /** Minimum width in pixels */\n  minWidth?: number;\n  /** Minimum height in pixels */\n  minHeight?: number;\n}\n\n/**\n * Result of image validation\n */\nexport interface ImageValidationResult {\n  valid: boolean;\n  error?: 'invalidType' | 'fileTooLarge' | 'imageTooSmall';\n  message?: string;\n}\n\n/**\n * Processed image result\n */\nexport interface ProcessedImage {\n  /** Processed image as Blob */\n  blob: Blob;\n  /** Data URL for preview */\n  dataUrl: string;\n  /** Final width in pixels */\n  width: number;\n  /** Final height in pixels */\n  height: number;\n  /** File size in bytes */\n  size: number;\n}\n\n/**\n * Crop data for manual cropping\n */\nexport interface CropData {\n  /** X position of crop area */\n  x: number;\n  /** Y position of crop area */\n  y: number;\n  /** Width of crop area */\n  width: number;\n  /** Height of crop area */\n  height: number;\n}\n\n/**\n * Default values for image processing\n */\nexport const IMAGE_DEFAULTS = {\n  maxWidth: 800,\n  maxHeight: 800,\n  quality: 0.8,\n  mimeType: 'image/jpeg' as const,\n  maxSize: 10 * 1024 * 1024, // 10MB\n  allowedTypes: ['image/jpeg', 'image/png', 'image/webp', 'image/gif'],\n  thumbnailSize: 150,\n};\n","import { Injectable } from '@angular/core';\nimport {\n  CropData,\n  IMAGE_DEFAULTS,\n  ImageCompressOptions,\n  ImageValidateOptions,\n  ImageValidationResult,\n  ProcessedImage,\n} from './types';\n\n/**\n * ImageService\n *\n * Service for image processing including compression, thumbnails, cropping and validation.\n * Uses HTML Canvas for all operations - no external dependencies.\n *\n * @example\n * ```typescript\n * const imageService = inject(ImageService);\n *\n * // Compress an image\n * const compressed = await imageService.compress(file, { maxWidth: 800, quality: 0.8 });\n *\n * // Generate thumbnail\n * const thumb = await imageService.thumbnail(file, 150);\n *\n * // Validate before processing\n * const validation = imageService.validate(file, { maxSize: 5 * 1024 * 1024 });\n * if (!validation.valid) {\n *   console.error(validation.message);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ImageService {\n  /**\n   * Compress an image maintaining aspect ratio\n   * @param file - File or Blob to compress\n   * @param options - Compression options\n   * @returns Promise with processed image data\n   */\n  async compress(\n    file: File | Blob,\n    options?: ImageCompressOptions\n  ): Promise<ProcessedImage> {\n    const opts = {\n      maxWidth: options?.maxWidth ?? IMAGE_DEFAULTS.maxWidth,\n      maxHeight: options?.maxHeight ?? IMAGE_DEFAULTS.maxHeight,\n      quality: options?.quality ?? IMAGE_DEFAULTS.quality,\n      mimeType: options?.mimeType ?? IMAGE_DEFAULTS.mimeType,\n    };\n\n    const img = await this.loadImage(file);\n    const { width, height } = this.calculateDimensions(\n      img.width,\n      img.height,\n      opts.maxWidth,\n      opts.maxHeight\n    );\n\n    const canvas = document.createElement('canvas');\n    canvas.width = width;\n    canvas.height = height;\n\n    const ctx = canvas.getContext('2d')!;\n    ctx.drawImage(img, 0, 0, width, height);\n\n    const blob = await this.canvasToBlob(canvas, opts.mimeType, opts.quality);\n    const dataUrl = canvas.toDataURL(opts.mimeType, opts.quality);\n\n    return {\n      blob,\n      dataUrl,\n      width,\n      height,\n      size: blob.size,\n    };\n  }\n\n  /**\n   * Generate a square thumbnail from an image\n   * @param file - File or Blob to process\n   * @param size - Thumbnail size in pixels (default: 150)\n   * @returns Promise with processed thumbnail\n   */\n  async thumbnail(file: File | Blob, size?: number): Promise<ProcessedImage> {\n    const thumbSize = size ?? IMAGE_DEFAULTS.thumbnailSize;\n    const img = await this.loadImage(file);\n\n    // Calculate square crop from center\n    const minDim = Math.min(img.width, img.height);\n    const cropX = (img.width - minDim) / 2;\n    const cropY = (img.height - minDim) / 2;\n\n    const canvas = document.createElement('canvas');\n    canvas.width = thumbSize;\n    canvas.height = thumbSize;\n\n    const ctx = canvas.getContext('2d')!;\n    ctx.drawImage(\n      img,\n      cropX,\n      cropY,\n      minDim,\n      minDim,\n      0,\n      0,\n      thumbSize,\n      thumbSize\n    );\n\n    const blob = await this.canvasToBlob(\n      canvas,\n      IMAGE_DEFAULTS.mimeType,\n      0.7 // Lower quality for thumbnails\n    );\n    const dataUrl = canvas.toDataURL(IMAGE_DEFAULTS.mimeType, 0.7);\n\n    return {\n      blob,\n      dataUrl,\n      width: thumbSize,\n      height: thumbSize,\n      size: blob.size,\n    };\n  }\n\n  /**\n   * Crop an image with specific coordinates\n   * @param file - File or Blob to crop\n   * @param cropData - Crop coordinates and dimensions\n   * @param options - Optional compression options for output\n   * @returns Promise with cropped image\n   */\n  async crop(\n    file: File | Blob,\n    cropData: CropData,\n    options?: ImageCompressOptions\n  ): Promise<ProcessedImage> {\n    const img = await this.loadImage(file);\n    const opts = {\n      quality: options?.quality ?? IMAGE_DEFAULTS.quality,\n      mimeType: options?.mimeType ?? IMAGE_DEFAULTS.mimeType,\n    };\n\n    const canvas = document.createElement('canvas');\n    canvas.width = cropData.width;\n    canvas.height = cropData.height;\n\n    const ctx = canvas.getContext('2d')!;\n    ctx.drawImage(\n      img,\n      cropData.x,\n      cropData.y,\n      cropData.width,\n      cropData.height,\n      0,\n      0,\n      cropData.width,\n      cropData.height\n    );\n\n    // Apply max dimensions if specified\n    if (options?.maxWidth || options?.maxHeight) {\n      return this.compress(await this.canvasToBlob(canvas, opts.mimeType, 1), options);\n    }\n\n    const blob = await this.canvasToBlob(canvas, opts.mimeType, opts.quality);\n    const dataUrl = canvas.toDataURL(opts.mimeType, opts.quality);\n\n    return {\n      blob,\n      dataUrl,\n      width: cropData.width,\n      height: cropData.height,\n      size: blob.size,\n    };\n  }\n\n  /**\n   * Validate an image file before processing\n   * @param file - File to validate\n   * @param options - Validation options\n   * @returns Validation result with error details if invalid\n   */\n  validate(file: File, options?: ImageValidateOptions): ImageValidationResult {\n    const opts = {\n      maxSize: options?.maxSize ?? IMAGE_DEFAULTS.maxSize,\n      allowedTypes: options?.allowedTypes ?? IMAGE_DEFAULTS.allowedTypes,\n    };\n\n    // Check file type\n    if (!opts.allowedTypes.includes(file.type)) {\n      return {\n        valid: false,\n        error: 'invalidType',\n        message: `Formato no válido. Usa: ${opts.allowedTypes.map(t => t.split('/')[1].toUpperCase()).join(', ')}`,\n      };\n    }\n\n    // Check file size\n    if (file.size > opts.maxSize) {\n      const maxMB = Math.round(opts.maxSize / (1024 * 1024));\n      return {\n        valid: false,\n        error: 'fileTooLarge',\n        message: `La imagen es muy grande. Máximo ${maxMB}MB`,\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Validate image dimensions (async - requires loading image)\n   * @param file - File to validate\n   * @param options - Validation options with minWidth/minHeight\n   * @returns Promise with validation result\n   */\n  async validateDimensions(\n    file: File,\n    options: Pick<ImageValidateOptions, 'minWidth' | 'minHeight'>\n  ): Promise<ImageValidationResult> {\n    const img = await this.loadImage(file);\n\n    if (options.minWidth && img.width < options.minWidth) {\n      return {\n        valid: false,\n        error: 'imageTooSmall',\n        message: `La imagen debe tener al menos ${options.minWidth}px de ancho`,\n      };\n    }\n\n    if (options.minHeight && img.height < options.minHeight) {\n      return {\n        valid: false,\n        error: 'imageTooSmall',\n        message: `La imagen debe tener al menos ${options.minHeight}px de alto`,\n      };\n    }\n\n    return { valid: true };\n  }\n\n  /**\n   * Convert a Blob/File to a data URL\n   */\n  async toDataUrl(file: File | Blob): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const reader = new FileReader();\n      reader.onload = () => resolve(reader.result as string);\n      reader.onerror = reject;\n      reader.readAsDataURL(file);\n    });\n  }\n\n  /**\n   * Convert a data URL to a Blob\n   */\n  dataUrlToBlob(dataUrl: string): Blob {\n    const arr = dataUrl.split(',');\n    const mime = arr[0].match(/:(.*?);/)![1];\n    const bstr = atob(arr[1]);\n    let n = bstr.length;\n    const u8arr = new Uint8Array(n);\n    while (n--) {\n      u8arr[n] = bstr.charCodeAt(n);\n    }\n    return new Blob([u8arr], { type: mime });\n  }\n\n  // ============== Private Helpers ==============\n\n  private loadImage(file: File | Blob): Promise<HTMLImageElement> {\n    return new Promise((resolve, reject) => {\n      const img = new Image();\n      img.onload = () => {\n        URL.revokeObjectURL(img.src);\n        resolve(img);\n      };\n      img.onerror = reject;\n      img.src = URL.createObjectURL(file);\n    });\n  }\n\n  private calculateDimensions(\n    originalWidth: number,\n    originalHeight: number,\n    maxWidth: number,\n    maxHeight: number\n  ): { width: number; height: number } {\n    let width = originalWidth;\n    let height = originalHeight;\n\n    // Scale down if necessary, maintaining aspect ratio\n    if (width > maxWidth) {\n      height = (height * maxWidth) / width;\n      width = maxWidth;\n    }\n\n    if (height > maxHeight) {\n      width = (width * maxHeight) / height;\n      height = maxHeight;\n    }\n\n    return {\n      width: Math.round(width),\n      height: Math.round(height),\n    };\n  }\n\n  private canvasToBlob(\n    canvas: HTMLCanvasElement,\n    mimeType: string,\n    quality: number\n  ): Promise<Blob> {\n    return new Promise((resolve, reject) => {\n      canvas.toBlob(\n        (blob) => {\n          if (blob) resolve(blob);\n          else reject(new Error('Failed to create blob from canvas'));\n        },\n        mimeType,\n        quality\n      );\n    });\n  }\n}\n","/**\n * Configuration for AvatarUploadComponent\n */\nexport interface AvatarUploadMetadata {\n  /** Current avatar URL */\n  currentUrl?: string;\n  /** Initials to show when no avatar (e.g., \"JD\" for John Doe) */\n  initials?: string;\n  /** Background color for initials avatar */\n  backgroundColor?: string;\n  /** Avatar size in pixels (default: 100) */\n  size?: number;\n  /** Show edit button (default: true) */\n  editable?: boolean;\n  /** Storage path prefix without userId (default: 'avatars') */\n  storagePath?: string;\n  /** i18n namespace for labels (default: 'AvatarUpload') */\n  i18nNamespace?: string;\n  /** Max file size in bytes (default: 10MB) */\n  maxFileSize?: number;\n  /** Quality for compressed image 0-1 (default: 0.8) */\n  compressQuality?: number;\n  /** Max width for avatar (default: 800) */\n  maxWidth?: number;\n  /** Thumbnail size (default: 150) */\n  thumbnailSize?: number;\n  /** Show \"ver foto\" button to open photo viewer modal (default: false) */\n  showViewButton?: boolean;\n}\n\n/**\n * Result emitted after successful upload\n */\nexport interface AvatarUploadResult {\n  /** Full-size avatar URL */\n  avatarUrl: string;\n  /** Thumbnail URL */\n  thumbnailUrl: string;\n}\n\n/**\n * Error types that can occur during upload\n */\nexport type AvatarUploadErrorType =\n  | 'invalidType'\n  | 'fileTooLarge'\n  | 'uploadFailed'\n  | 'backendFailed'\n  | 'cancelled';\n\n/**\n * Error object emitted on failure\n */\nexport interface AvatarUploadError {\n  type: AvatarUploadErrorType;\n  message: string;\n  originalError?: unknown;\n}\n\n/**\n * Default values\n */\nexport const AVATAR_UPLOAD_DEFAULTS = {\n  size: 100,\n  editable: true,\n  storagePath: 'avatars',\n  i18nNamespace: 'AvatarUpload',\n  maxFileSize: 10 * 1024 * 1024, // 10MB\n  compressQuality: 0.8,\n  maxWidth: 800,\n  thumbnailSize: 150,\n  backgroundColor: '#6366f1', // Indigo\n  showViewButton: false,\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, EventEmitter, inject, input, Output, signal, ViewChild } from '@angular/core';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonModal,\n  IonSpinner,\n  IonToolbar,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { cameraOutline } from 'ionicons/icons';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthService } from '../../../services/auth';\nimport { StorageService } from '../../../services/firebase';\nimport { I18nService } from '../../../services/i18n';\nimport { ImageService } from '../../../services/image';\nimport { ImageCropComponent } from '../../molecules/image-crop';\nimport { AVATAR_UPLOAD_DEFAULTS, AvatarUploadError, AvatarUploadMetadata, AvatarUploadResult } from './types';\n\naddIcons({ cameraOutline });\n\n/**\n * AvatarUploadComponent\n *\n * A complete avatar upload solution with:\n * - Image selection from device\n * - Crop modal with round preview\n * - Automatic compression and thumbnail generation\n * - Upload to Firebase Storage\n * - Backend sync via AuthService\n *\n * @example Basic usage\n * ```html\n * <val-avatar-upload\n *   [props]=\"{\n *     currentUrl: user()?.avatarUrl,\n *     initials: 'JD',\n *     size: 120\n *   }\"\n *   (uploaded)=\"onAvatarUploaded($event)\"\n *   (error)=\"onError($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-avatar-upload',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonIcon,\n    IonSpinner,\n    IonModal,\n    IonContent,\n    IonHeader,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    ImageCropComponent,\n  ],\n  template: `\n    <div class=\"avatar-upload\" [style.--avatar-size.px]=\"config().size\" [class.avatar-upload--loading]=\"loading()\">\n      <div class=\"avatar-container\">\n        <!-- Avatar Image or Initials -->\n        @if (displayUrl()) {\n          <img class=\"avatar-image\" [src]=\"displayUrl()\" alt=\"Avatar\" (error)=\"onImageError()\" />\n        } @else {\n          <div class=\"avatar-initials\" [style.background-color]=\"config().backgroundColor\">\n            {{ config().initials || '?' }}\n          </div>\n        }\n\n        <!-- Edit Button -->\n        @if (config().editable && !loading()) {\n          <button class=\"edit-button\" type=\"button\" (click)=\"openFilePicker()\" [attr.aria-label]=\"editButtonLabel()\">\n            <ion-icon name=\"camera-outline\"></ion-icon>\n          </button>\n        }\n\n        <!-- Loading Overlay -->\n        @if (loading()) {\n          <div class=\"loading-overlay\">\n            <ion-spinner name=\"circular\"></ion-spinner>\n          </div>\n        }\n      </div>\n\n      <!-- Hidden File Input -->\n      <input\n        #fileInput\n        type=\"file\"\n        accept=\"image/jpeg,image/png,image/webp\"\n        (change)=\"onFileSelected($event)\"\n        data-testid=\"avatar-upload-input\"\n        hidden\n      />\n\n      <!-- View Photo Button -->\n      @if (config().showViewButton && displayUrl()) {\n        <button class=\"view-photo-btn\" type=\"button\" (click)=\"showViewModal.set(true)\">\n          {{ viewPhotoLabel() }}\n        </button>\n      }\n\n      <!-- Crop Modal -->\n      <ion-modal\n        [isOpen]=\"showCropModal()\"\n        (didDismiss)=\"onCropCancel()\"\n        [breakpoints]=\"[0, 1]\"\n        [initialBreakpoint]=\"1\"\n      >\n        <ng-template>\n          @if (selectedFile()) {\n            <val-image-crop\n              [image]=\"selectedFile()!\"\n              [aspectRatio]=\"1\"\n              [roundCropper]=\"true\"\n              [i18nNamespace]=\"config().i18nNamespace\"\n              (cropComplete)=\"onCropComplete($event)\"\n              (cancel)=\"onCropCancel()\"\n              (loadFailed)=\"onCropLoadFailed()\"\n            />\n          }\n        </ng-template>\n      </ion-modal>\n\n      <!-- Photo Viewer Modal -->\n      <ion-modal\n        [isOpen]=\"showViewModal()\"\n        (didDismiss)=\"showViewModal.set(false)\"\n        [breakpoints]=\"[0, 0.55]\"\n        [initialBreakpoint]=\"0.55\"\n        [handle]=\"true\"\n      >\n        <ng-template>\n          <ion-header [translucent]=\"true\">\n            <ion-toolbar>\n              <ion-buttons slot=\"end\">\n                <ion-button fill=\"clear\" color=\"dark\" (click)=\"showViewModal.set(false)\">\n                  <strong>{{ closePhotoLabel() }}</strong>\n                </ion-button>\n              </ion-buttons>\n            </ion-toolbar>\n          </ion-header>\n          <ion-content>\n            <div class=\"photo-viewer\">\n              <img class=\"photo-viewer__img\" [src]=\"displayUrl()\" alt=\"Photo\" />\n            </div>\n          </ion-content>\n        </ng-template>\n      </ion-modal>\n    </div>\n  `,\n  styleUrls: ['./avatar-upload.component.scss'],\n})\nexport class AvatarUploadComponent {\n  private imageService = inject(ImageService);\n  private storageService = inject(StorageService);\n  private authService = inject(AuthService);\n  private i18n = inject(I18nService);\n\n  @ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;\n\n  /** Component configuration */\n  readonly props = input<AvatarUploadMetadata>({});\n\n  /** Emitted after successful upload and backend sync */\n  @Output() uploaded = new EventEmitter<AvatarUploadResult>();\n\n  /** Emitted on any error during the process */\n  @Output() error = new EventEmitter<AvatarUploadError>();\n\n  /** Emitted when upload starts */\n  @Output() uploadStart = new EventEmitter<void>();\n\n  // Internal state\n  protected loading = signal(false);\n  protected showCropModal = signal(false);\n  protected showViewModal = signal(false);\n  protected selectedFile = signal<File | null>(null);\n  protected previewUrl = signal<string | null>(null);\n  protected imageLoadError = signal(false);\n\n  /** Merged config with defaults */\n  protected config = computed(() => ({\n    ...AVATAR_UPLOAD_DEFAULTS,\n    ...this.props(),\n  }));\n\n  /** URL to display (preview takes priority over current) */\n  protected displayUrl = computed(() => {\n    if (this.imageLoadError()) return null;\n    return this.previewUrl() || this.config().currentUrl || null;\n  });\n\n  /** Aria label for edit button */\n  protected editButtonLabel = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('changePhoto', this.config().i18nNamespace) || 'Cambiar foto';\n  });\n\n  /** Label for view photo button */\n  protected viewPhotoLabel = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('viewPhoto', 'AvatarUpload');\n  });\n\n  /** Label for close button inside photo viewer */\n  protected closePhotoLabel = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('close', '_global');\n  });\n\n  /** Open file picker dialog */\n  openFilePicker(): void {\n    this.fileInput.nativeElement.click();\n  }\n\n  /** Handle file selection */\n  onFileSelected(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const file = input.files?.[0];\n\n    if (!file) return;\n\n    // Reset input for same file selection\n    input.value = '';\n\n    // Validate file\n    const validation = this.imageService.validate(file, {\n      maxSize: this.config().maxFileSize,\n      allowedTypes: ['image/jpeg', 'image/png', 'image/webp'],\n    });\n\n    if (!validation.valid) {\n      this.emitError(validation.error as AvatarUploadError['type'], validation.message!);\n      return;\n    }\n\n    // Open crop modal\n    this.selectedFile.set(file);\n    this.showCropModal.set(true);\n  }\n\n  /** Handle crop completion */\n  async onCropComplete(croppedBlob: Blob): Promise<void> {\n    this.showCropModal.set(false);\n    this.selectedFile.set(null);\n\n    await this.processAndUpload(croppedBlob);\n  }\n\n  /** Handle crop cancel */\n  onCropCancel(): void {\n    this.showCropModal.set(false);\n    this.selectedFile.set(null);\n  }\n\n  /** Handle crop load failure */\n  onCropLoadFailed(): void {\n    this.showCropModal.set(false);\n    this.selectedFile.set(null);\n    this.emitError(\n      'invalidType',\n      this.i18n.t('loadFailed', this.config().i18nNamespace) || 'No se pudo cargar la imagen'\n    );\n  }\n\n  /** Handle image load error */\n  onImageError(): void {\n    this.imageLoadError.set(true);\n  }\n\n  /** Timeout for upload operations (30 seconds) */\n  private static readonly UPLOAD_TIMEOUT_MS = 30000;\n\n  /** Process cropped image and upload */\n  private async processAndUpload(croppedBlob: Blob): Promise<void> {\n    this.loading.set(true);\n    this.uploadStart.emit();\n\n    // Timeout promise to prevent infinite loading\n    const uploadTimeout = new Promise<never>((_, reject) =>\n      setTimeout(() => reject(new Error('Upload timeout')), AvatarUploadComponent.UPLOAD_TIMEOUT_MS)\n    );\n\n    try {\n      const config = this.config();\n\n      // 1. Compress image\n      const compressed = await this.imageService.compress(croppedBlob, {\n        maxWidth: config.maxWidth,\n        maxHeight: config.maxWidth,\n        quality: config.compressQuality,\n      });\n\n      // 2. Generate thumbnail\n      const thumbnail = await this.imageService.thumbnail(compressed.blob, config.thumbnailSize);\n\n      // 3. Set preview immediately\n      this.previewUrl.set(compressed.dataUrl);\n      this.imageLoadError.set(false);\n\n      // 4. Get user ID for storage path\n      const userId = this.authService.user()?.userId;\n      if (!userId) {\n        throw new Error('User not authenticated');\n      }\n\n      // 5. Upload to Firebase Storage with predictable paths\n      // Path: users/{userId}/avatar.jpg - allows any app to construct URL with just userId\n      // skipPrefix: true - bypasses appId prefix for shared/cross-app paths\n      const avatarPath = `users/${userId}/avatar.jpg`;\n      const thumbPath = `users/${userId}/thumb.jpg`;\n      const uploadMetadata = { skipPrefix: true, contentType: 'image/jpeg' };\n\n      // Race against timeout to prevent infinite loading\n      const [avatarResult, thumbResult] = await Promise.race([\n        Promise.all([\n          this.storageService.uploadAndGetUrl(avatarPath, compressed.blob, uploadMetadata),\n          this.storageService.uploadAndGetUrl(thumbPath, thumbnail.blob, uploadMetadata),\n        ]),\n        uploadTimeout,\n      ]);\n\n      // 6. Update backend with URLs\n      await firstValueFrom(\n        this.authService.updateAvatar({\n          avatarUrl: avatarResult.downloadUrl,\n          avatarThumbnail: thumbResult.downloadUrl,\n        })\n      );\n\n      // 7. Update preview with cache-busting to force refresh\n      const cacheBuster = `?t=${Date.now()}`;\n      this.previewUrl.set(avatarResult.downloadUrl + cacheBuster);\n\n      // 8. Emit success\n      const result: AvatarUploadResult = {\n        avatarUrl: avatarResult.downloadUrl,\n        thumbnailUrl: thumbResult.downloadUrl,\n      };\n\n      this.uploaded.emit(result);\n    } catch (err) {\n      console.error('[AvatarUpload] processAndUpload failed:', err);\n      // Revert preview on error\n      this.previewUrl.set(null);\n\n      // Determine error message based on error type\n      let message: string;\n      if (err instanceof Error) {\n        if (err.message === 'Upload timeout') {\n          message =\n            this.i18n.t('uploadTimeout', this.config().i18nNamespace) ||\n            'La subida tardó demasiado. Verifica tu conexión.';\n        } else {\n          message = err.message;\n        }\n      } else {\n        message = this.i18n.t('uploadError', this.config().i18nNamespace) || 'Error al subir la imagen';\n      }\n\n      this.emitError('uploadFailed', message, err);\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  /** Emit error event */\n  private emitError(type: AvatarUploadError['type'], message: string, originalError?: unknown): void {\n    this.error.emit({ type, message, originalError });\n  }\n}\n","/**\n * Presets de layout para `val-skeleton-layout`.\n *\n * Cada preset compone átomos `val-skeleton` en la forma de una shape de página\n * común. Para agregar uno nuevo: añadir el valor acá + un `@case` en el\n * template del componente. Cero cambios en los consumers.\n */\nexport type SkeletonLayoutPreset =\n  | 'form' // header avatar opcional + N field blocks (label+input) + botón\n  | 'list' // N filas list-item (icono + 2 líneas)\n  | 'article' // título + meta + párrafos (doc legal / markdown)\n  | 'cards' // grid de N card blocks\n  | 'detail' // N filas key-value (label izq + valor der)\n  | 'hero'; // banner grande + filas de contenido debajo\n\n/**\n * Configuración del componente `val-skeleton-layout`.\n *\n * @example Form con avatar (perfil):\n * ```html\n * <val-skeleton-layout [props]=\"{ preset: 'form', rows: 3, showAvatar: true }\" />\n * ```\n *\n * @example Lista (notificaciones, sesiones):\n * ```html\n * <val-skeleton-layout [props]=\"{ preset: 'list', rows: 5 }\" />\n * ```\n *\n * @example Artículo legal:\n * ```html\n * <val-skeleton-layout [props]=\"{ preset: 'article' }\" />\n * ```\n */\nexport interface SkeletonLayoutMetadata {\n  /** Shape de la página a esqueletizar. */\n  preset: SkeletonLayoutPreset;\n\n  /**\n   * Cantidad de items repetibles (fields en `form`, filas en `list`/`detail`,\n   * párrafos en `article`, cards en `cards`). Si se omite usa el default del\n   * preset.\n   */\n  rows?: number;\n\n  /** `form` — antepone un bloque avatar + meta lines. Default `false`. */\n  showAvatar?: boolean;\n\n  /** `form` — renderiza un bloque de botón al final. Default `true`. */\n  showButton?: boolean;\n\n  /** `cards` — columnas por fila. Default `2`. */\n  columns?: number;\n\n  /** `article` / `hero` — incluye bloque de título grande. Default `true`. */\n  showTitle?: boolean;\n\n  /** Desactiva el shimmer. Default animado. */\n  animated?: boolean;\n\n  /** Clase CSS extra para el contenedor. */\n  cssClass?: string;\n}\n\n/** Defaults de `rows` por preset cuando el consumer no lo especifica. */\nexport const SKELETON_LAYOUT_DEFAULT_ROWS: Record<SkeletonLayoutPreset, number> = {\n  form: 3,\n  list: 5,\n  article: 3,\n  cards: 4,\n  detail: 4,\n  hero: 3,\n};\n","import { Component, computed, Input, signal } from '@angular/core';\nimport { SkeletonComponent } from '../../atoms/skeleton/skeleton.component';\nimport { SkeletonLayoutMetadata, SkeletonLayoutPreset, SKELETON_LAYOUT_DEFAULT_ROWS } from './types';\n\n/**\n * `val-skeleton-layout`\n *\n * Skeleton de página **preset-driven**. En vez de que cada vista componga\n * átomos `val-skeleton` a mano, declara una shape y este organism arma el\n * placeholder completo. Estándar único para loading states en todo el factory.\n *\n * Presets: `form` · `list` · `article` · `cards` · `detail` · `hero`.\n *\n * Extender = agregar un valor a `SkeletonLayoutPreset` + un `@case` acá.\n * Los consumers no cambian.\n *\n * @example\n * ```html\n * @if (loading()) {\n *   <val-skeleton-layout [props]=\"{ preset: 'form', rows: 3, showAvatar: true }\" />\n * } @else {\n *   ...contenido real...\n * }\n * ```\n */\n@Component({\n  selector: 'val-skeleton-layout',\n  standalone: true,\n  imports: [SkeletonComponent],\n  template: `\n    <div class=\"val-skeleton-layout\" [class]=\"resolved().cssClass || ''\" aria-busy=\"true\" aria-live=\"polite\">\n      @switch (resolved().preset) {\n        <!-- FORM — avatar opcional + N fields (label+input) + botón -->\n        @case ('form') {\n          @if (resolved().showAvatar) {\n            <div class=\"sk-form__avatar\">\n              <val-skeleton\n                [props]=\"{\n                  type: 'avatar',\n                  width: '96px',\n                  height: '96px',\n                  circle: true,\n                  animated: anim(),\n                }\"\n              />\n              <div class=\"sk-form__avatar-meta\">\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '150px',\n                    height: '18px',\n                    animated: anim(),\n                  }\"\n                />\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '190px',\n                    height: '13px',\n                    animated: anim(),\n                  }\"\n                />\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '110px',\n                    height: '13px',\n                    animated: anim(),\n                  }\"\n                />\n              </div>\n            </div>\n          }\n          <div class=\"sk-form__fields\">\n            @for (i of rowsArray(); track i) {\n              <div class=\"sk-form__field\">\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '90px',\n                    height: '13px',\n                    animated: anim(),\n                  }\"\n                />\n                <val-skeleton\n                  [props]=\"{\n                    type: 'custom',\n                    width: '100%',\n                    height: '48px',\n                    borderRadius: '12px',\n                    animated: anim(),\n                  }\"\n                />\n              </div>\n            }\n            @if (resolved().showButton !== false) {\n              <val-skeleton\n                [props]=\"{\n                  type: 'custom',\n                  width: '100%',\n                  height: '48px',\n                  borderRadius: '24px',\n                  animated: anim(),\n                }\"\n              />\n            }\n          </div>\n        }\n\n        <!-- LIST — N filas list-item (el átomo ya trae icono + 2 líneas) -->\n        @case ('list') {\n          <div class=\"sk-list\">\n            @for (i of rowsArray(); track i) {\n              <val-skeleton [props]=\"{ type: 'list-item', animated: anim() }\" />\n            }\n          </div>\n        }\n\n        <!-- ARTICLE — título + meta + párrafos -->\n        @case ('article') {\n          <div class=\"sk-article\">\n            @if (resolved().showTitle !== false) {\n              <val-skeleton\n                [props]=\"{\n                  type: 'text',\n                  width: '70%',\n                  height: '30px',\n                  animated: anim(),\n                }\"\n              />\n              <val-skeleton\n                [props]=\"{\n                  type: 'text',\n                  width: '40%',\n                  height: '14px',\n                  animated: anim(),\n                }\"\n              />\n            }\n            @for (i of rowsArray(); track i) {\n              <val-skeleton [props]=\"{ type: 'paragraph', lines: 4, animated: anim() }\" />\n            }\n          </div>\n        }\n\n        <!-- CARDS — grid de N card blocks -->\n        @case ('cards') {\n          <div class=\"sk-cards\" [style.grid-template-columns]=\"gridColumns()\">\n            @for (i of rowsArray(); track i) {\n              <val-skeleton [props]=\"{ type: 'card', animated: anim() }\" />\n            }\n          </div>\n        }\n\n        <!-- DETAIL — N filas key-value -->\n        @case ('detail') {\n          <div class=\"sk-detail\">\n            @for (i of rowsArray(); track i) {\n              <div class=\"sk-detail__row\">\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '110px',\n                    height: '14px',\n                    animated: anim(),\n                  }\"\n                />\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '160px',\n                    height: '14px',\n                    animated: anim(),\n                  }\"\n                />\n              </div>\n            }\n          </div>\n        }\n\n        <!-- HERO — banner grande + filas de contenido -->\n        @case ('hero') {\n          <div class=\"sk-hero\">\n            @if (resolved().showTitle !== false) {\n              <val-skeleton\n                [props]=\"{\n                  type: 'custom',\n                  width: '100%',\n                  height: '140px',\n                  borderRadius: '20px',\n                  animated: anim(),\n                }\"\n              />\n            }\n            <div class=\"sk-hero__rows\">\n              @for (i of rowsArray(); track i) {\n                <val-skeleton\n                  [props]=\"{\n                    type: 'custom',\n                    width: '100%',\n                    height: '72px',\n                    borderRadius: '14px',\n                    animated: anim(),\n                  }\"\n                />\n              }\n            </div>\n          </div>\n        }\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n      }\n\n      .val-skeleton-layout {\n        width: 100%;\n      }\n\n      /* FORM */\n      .sk-form__avatar {\n        display: flex;\n        align-items: center;\n        gap: 16px;\n        padding: 16px 0;\n      }\n      .sk-form__avatar-meta {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n      .sk-form__fields {\n        padding: 16px 0;\n        display: flex;\n        flex-direction: column;\n        gap: 18px;\n      }\n      .sk-form__field {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      /* LIST */\n      .sk-list {\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n        padding: 8px 0;\n      }\n\n      /* ARTICLE */\n      .sk-article {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        padding: 8px 0;\n      }\n\n      /* CARDS */\n      .sk-cards {\n        display: grid;\n        gap: 12px;\n        padding: 8px 0;\n      }\n\n      /* DETAIL */\n      .sk-detail {\n        display: flex;\n        flex-direction: column;\n        gap: 14px;\n        padding: 8px 0;\n      }\n      .sk-detail__row {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 16px;\n      }\n\n      /* HERO */\n      .sk-hero {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        padding: 8px 0;\n      }\n      .sk-hero__rows {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n    `,\n  ],\n})\nexport class SkeletonLayoutComponent {\n  private readonly props_ = signal<SkeletonLayoutMetadata>(\n    { preset: 'list' },\n    {\n      equal: (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b),\n    }\n  );\n\n  @Input() set props(value: SkeletonLayoutMetadata | undefined) {\n    if (value) this.props_.set(value);\n  }\n\n  /** Props con defaults aplicados. */\n  readonly resolved = computed<SkeletonLayoutMetadata>(() => this.props_());\n\n  /** Shimmer on/off — default on. */\n  readonly anim = computed(() => this.resolved().animated !== false);\n\n  /** Array `[0..rows)` para los `@for`. rows del prop o default del preset. */\n  readonly rowsArray = computed<number[]>(() => {\n    const p = this.resolved();\n    const preset: SkeletonLayoutPreset = p.preset;\n    const count = p.rows && p.rows > 0 ? Math.floor(p.rows) : SKELETON_LAYOUT_DEFAULT_ROWS[preset];\n    return Array.from({ length: count }, (_, i) => i);\n  });\n\n  /** `grid-template-columns` para el preset cards. */\n  readonly gridColumns = computed(() => {\n    const cols = this.resolved().columns ?? 2;\n    return `repeat(${Math.max(1, cols)}, 1fr)`;\n  });\n}\n","import { DestroyRef, inject, Injectable, signal } from '@angular/core';\n\n/**\n * Handler de refresh que registra una página. Puede ser sync o async —\n * `val-page-wrapper` espera (`await`) a que termine antes de cerrar el spinner.\n */\nexport type PageRefreshHandler = () => Promise<void> | void;\n\n/**\n * PageRefreshService — bus del pull-to-refresh estándar del factory.\n *\n * **Por qué existe:** `val-page-wrapper` posee un único `<ion-content>` y todas\n * las páginas se renderizan dentro vía `<router-outlet>`. Un `<ion-refresher>`\n * tiene que vivir dentro de ese `ion-content`, así que el refresher NO puede\n * declararse en el template de cada página — vive una sola vez en\n * `val-page-wrapper`. Este servicio es el puente: la página activa registra\n * *qué hacer* al refrescar; el page-wrapper dispara el gesto y cierra el spinner.\n *\n * **Uso en una página** (ver `frontend/CLAUDE.md` — es el patrón estándar):\n *\n * ```ts\n * export class MiPage implements ViewWillEnter, ViewWillLeave {\n *   private pageRefresh = inject(PageRefreshService);\n *\n *   ionViewWillEnter(): void {\n *     this.pageRefresh.register(() => this.reload());\n *   }\n *   ionViewWillLeave(): void {\n *     this.pageRefresh.unregister();\n *   }\n *\n *   private async reload(): Promise<void> {\n *     // re-fetch / re-suscribir streams / etc.\n *   }\n * }\n * ```\n *\n * Páginas que no llaman `register()` simplemente no muestran refresher —\n * opt-in, sin impacto.\n */\n@Injectable({ providedIn: 'root' })\nexport class PageRefreshService {\n  private handler: PageRefreshHandler | null = null;\n\n  /**\n   * `true` cuando hay una página con handler registrado. `val-page-wrapper`\n   * renderiza el `<val-refresher>` sólo cuando esto es `true`.\n   */\n  readonly hasHandler = signal(false);\n\n  /**\n   * Registra el handler de refresh de la página activa. Llamar en\n   * `ionViewWillEnter`. Si ya había uno, lo reemplaza (sólo hay una página\n   * activa a la vez en el router-outlet de Ionic).\n   */\n  register(handler: PageRefreshHandler): void {\n    this.handler = handler;\n    this.hasHandler.set(true);\n  }\n\n  /**\n   * Quita el handler. Llamar en `ionViewWillLeave` para que el refresher\n   * desaparezca al salir de la vista.\n   */\n  unregister(): void {\n    this.handler = null;\n    this.hasHandler.set(false);\n  }\n\n  /**\n   * Ejecuta el handler registrado y espera a que termine. Lo invoca\n   * `val-page-wrapper` al detectar el gesto de pull. No-op si no hay handler.\n   */\n  async run(): Promise<void> {\n    if (!this.handler) return;\n    await this.handler();\n  }\n}\n\n/**\n * Conecta una página al pull-to-refresh estándar en UNA línea, sin lifecycle\n * hooks manuales: registra el handler y lo desregistra al destruir la página\n * (vía `DestroyRef`).\n *\n * DEBE llamarse en un injection context (constructor o field initializer).\n *\n * @example\n * ```ts\n * export class MiPage {\n *   private data = createRefreshableStream(() => this.svc.getX());\n *   readonly items = this.data.data;\n *\n *   constructor() {\n *     connectPageRefresh(() => this.data.reload());\n *   }\n * }\n * ```\n *\n * Reemplaza el patrón `ngOnInit`→`register` / `ngOnDestroy`→`unregister`.\n */\nexport function connectPageRefresh(handler: PageRefreshHandler): void {\n  const svc = inject(PageRefreshService);\n  const destroyRef = inject(DestroyRef);\n  svc.register(handler);\n  destroyRef.onDestroy(() => svc.unregister());\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-profile-view`. Auto-registrados en el\n * constructor del componente si el consumer no proveyó el namespace\n * (`Settings.Profile` por default). Garantiza que nunca haya una key faltante\n * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md\n * sobre el storm de CD con `val-debug-console`). El consumer puede override\n * registrando el mismo namespace antes de que el componente monte.\n *\n * SOLO incluye las keys que la vista realmente usa.\n */\nexport const PROFILE_VIEW_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'Perfil',\n    pageDescription: 'Administra tu informacion personal',\n    name: 'Nombre completo',\n    namePlaceholder: 'Tu nombre completo',\n    nameHint: 'Tu nombre real que se mostrara en tu perfil.',\n    email: 'Correo electronico',\n    handle: 'Nombre de usuario',\n    handlePlaceholder: 'usuario',\n    handleHint: 'Tu identificador unico (@usuario). Otros pueden buscarte con este nombre.',\n    handleInUse: 'Ese nombre de usuario ya está tomado',\n    handleError: 'Error al actualizar el nombre de usuario',\n    phoneInUse: 'Ese teléfono ya está en uso por otra cuenta',\n    phoneInvalid: 'Formato de teléfono inválido (usa E.164: +56...)',\n    phone: 'Telefono',\n    phonePlaceholder: '+1 234 567 8900',\n    phoneHint: 'Opcional. Para recuperacion de cuenta y notificaciones.',\n    save: 'Guardar cambios',\n    saving: 'Guardando...',\n    saveSuccess: 'Perfil actualizado',\n    saveError: 'Error al actualizar el perfil',\n    usernameInvalid: 'Solo letras, numeros y guion bajo',\n    avatarSuccess: 'Foto actualizada',\n    avatarError: 'Error al actualizar la foto',\n    changePhoto: 'Cambiar foto',\n    viewPhoto: 'Ver foto',\n    errorTitle: 'No pudimos cargar tu perfil',\n    offlineTitle: 'Sin conexión',\n    offlineHint: 'Revisa tu conexión a internet e intenta nuevamente.',\n    retry: 'Reintentar',\n    shareCtaTitle: 'Compartí tu perfil',\n    shareCtaDesc: 'Generá un QR para que te agreguen como contacto al instante.',\n    shareCtaBtn: 'Mostrar QR',\n  },\n  en: {\n    pageTitle: 'Profile',\n    pageDescription: 'Manage your personal information',\n    name: 'Full name',\n    namePlaceholder: 'Your full name',\n    nameHint: 'Your real name that will be displayed on your profile.',\n    email: 'Email',\n    handle: 'Username',\n    handlePlaceholder: 'username',\n    handleHint: 'Your unique identifier (@username). Others can search for you with this name.',\n    handleInUse: 'That username is already taken',\n    handleError: 'Failed to update username',\n    phoneInUse: 'That phone is already in use by another account',\n    phoneInvalid: 'Invalid phone format (use E.164: +1...)',\n    phone: 'Phone',\n    phonePlaceholder: '+1 234 567 8900',\n    phoneHint: 'Optional. For account recovery and notifications.',\n    save: 'Save changes',\n    saving: 'Saving...',\n    saveSuccess: 'Profile updated',\n    saveError: 'Failed to update profile',\n    usernameInvalid: 'Only letters, numbers and underscore',\n    avatarSuccess: 'Photo updated',\n    avatarError: 'Failed to update photo',\n    changePhoto: 'Change photo',\n    viewPhoto: 'View photo',\n    errorTitle: \"We couldn't load your profile\",\n    offlineTitle: 'Offline',\n    offlineHint: 'Check your internet connection and try again.',\n    retry: 'Retry',\n    shareCtaTitle: 'Share your profile',\n    shareCtaDesc: 'Generate a QR so people can add you as a contact instantly.',\n    shareCtaBtn: 'Show QR',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, Input, signal, viewChild } from '@angular/core';\nimport { ReactiveFormsModule, Validators } from '@angular/forms';\nimport { ActivatedRoute } from '@angular/router';\nimport { firstValueFrom, Subscription } from 'rxjs';\n\nimport { AvatarUploadComponent } from '../avatar-upload/avatar-upload.component';\nimport { AvatarUploadError, AvatarUploadMetadata, AvatarUploadResult } from '../avatar-upload/types';\nimport { FormComponent } from '../form/form.component';\nimport { ShareProfileModalComponent } from '../share-profile-modal/share-profile-modal.component';\nimport { ShareProfileModalMetadata } from '../share-profile-modal/types';\nimport { CtaCardComponent } from '../../molecules/cta-card/cta-card.component';\nimport { CtaCardMetadata } from '../../molecules/cta-card/types';\nimport { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';\nimport { EmptyStateMetadata } from '../../molecules/empty-state/types';\nimport { createErrorStateProps } from '../../molecules/empty-state/factory';\nimport { ButtonMetadata, ComponentStates, FormMetadata, FormSubmit, InputMetadata, InputType } from '../../types';\n\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { GetProfileResponse } from '../../../services/auth/types';\nimport { FirebaseService } from '../../../services/firebase/firebase.service';\nimport { FirestoreCollectionFactory, TypedCollection } from '../../../services/firebase/firestore-collection';\nimport { FirestoreDocument } from '../../../services/firebase/types';\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\nimport { connectPageRefresh } from '../../../services/page-refresh/page-refresh.service';\nimport { ToastService } from '../../../services/toast.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\nimport { interpretError } from '../../../services/errors/interpret-error';\n\nimport { ProfileViewConfig } from './types';\nimport { PROFILE_VIEW_I18N } from './profile-view.i18n';\n\n/**\n * Forma del doc Firestore /users/{uid} que la vista consume. Subset del schema\n * escrito por el backend (SyncProfileToFirestore) — solo los campos que esta\n * vista necesita; los demás (status, mfaEnabled, roles, etc.) se ignoran.\n */\ninterface UserMirrorDoc extends FirestoreDocument {\n  userId: string;\n  email: string;\n  name?: string;\n  handle?: string;\n  phone?: string;\n  avatarUrl?: string;\n  avatarThumbnail?: string;\n}\n\n/** Patrón sincronizado con backend handleRegex: lowercase alfanum + underscore. */\nconst HANDLE_PATTERN = /^[a-z_][a-z0-9_]*$/;\nconst HANDLE_MIN = 3;\nconst HANDLE_MAX = 20;\n\nconst DEFAULT_NAMESPACE = 'Settings.Profile';\n\n/**\n * `val-profile-view` — vista Perfil full-feature autocontenida (organism).\n *\n * Edita los campos públicos del usuario en UN solo formulario con UN solo botón\n * \"Guardar\". Wireup:\n *  - Avatar — val-avatar-upload (Firebase Storage + backend sync). Separado del\n *    form porque es upload sync independiente.\n *  - Handle (@usuario) — InputType.HANDLE (val-username-input con check de\n *    disponibilidad async resuelto vía AuthService inyectado).\n *  - Nombre — InputType.TEXT.\n *  - Teléfono — InputType.PHONE.\n *\n * Submit handler dispatcha:\n *  1. Si handle cambió → updateHandle PRIMERO (uniqueness).\n *  2. Si name o phone cambió → updateProfile con ambos.\n *\n * Lectura del perfil: suscribe al doc Firestore /users/{uid} (mirror que mantiene\n * el backend). Reactivo cross-tab + auto-refresca tras save. Fallback REST\n * (auth.getProfile) si el doc no existe o el listener falla.\n *\n * NO renderiza ion-content — vive dentro de val-page-wrapper.\n *\n * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no\n * proveyó el namespace configurado (default `Settings.Profile`).\n */\n@Component({\n  selector: 'val-profile-view',\n  standalone: true,\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    AvatarUploadComponent,\n    EmptyStateComponent,\n    FormComponent,\n    DisplayComponent,\n    TextComponent,\n    TitleComponent,\n    SkeletonLayoutComponent,\n    CtaCardComponent,\n    ShareProfileModalComponent,\n  ],\n  template: `\n    <div class=\"page\">\n      <header class=\"page-header\">\n        <val-display [props]=\"{ size: 'small', color: 'dark', content: t('pageTitle') }\" />\n        <val-title\n          [props]=\"{\n            size: 'large',\n            color: 'dark',\n            bold: false,\n            content: t('pageDescription'),\n          }\"\n        />\n      </header>\n\n      @if (loading()) {\n        <val-skeleton-layout [props]=\"{ preset: 'form', rows: 3, showAvatar: true }\" />\n      } @else if (errorState()) {\n        <val-empty-state [props]=\"errorState()!\" />\n      } @else {\n        @if (profile(); as p) {\n          @if (resolvedConfig().showAvatar) {\n            <section class=\"settings-section avatar-section\">\n              <val-avatar-upload\n                [props]=\"avatarProps()\"\n                (uploaded)=\"onAvatarUploaded($event)\"\n                (error)=\"onAvatarError($event)\"\n              />\n              <div class=\"avatar-meta\">\n                <val-title\n                  [props]=\"{\n                    size: 'medium',\n                    color: 'dark',\n                    bold: true,\n                    content: p.name || '—',\n                  }\"\n                />\n                <val-text\n                  [props]=\"{\n                    size: 'small',\n                    color: 'dark',\n                    bold: false,\n                    content: p.email,\n                  }\"\n                />\n                @if (p.handle) {\n                  <val-text\n                    [props]=\"{\n                      size: 'small',\n                      color: 'dark',\n                      bold: true,\n                      content: '@' + p.handle,\n                    }\"\n                  />\n                }\n              </div>\n            </section>\n          }\n\n          <val-form #form [props]=\"formMeta\" (onSubmit)=\"onSubmit($event)\" />\n\n          @if (resolvedConfig().showShareCta && p.handle) {\n            <section class=\"settings-section share-cta-section\">\n              <val-cta-card [props]=\"shareCta()\" (onAction)=\"shareOpen.set(true)\" />\n            </section>\n          }\n        }\n      }\n    </div>\n\n    <val-share-profile-modal [isOpen]=\"shareOpen()\" [props]=\"shareModal()\" (dismissed)=\"shareOpen.set(false)\" />\n  `,\n  styles: [\n    `\n      .page {\n        padding: 16px 0;\n        max-width: 720px;\n        margin: 0 auto;\n      }\n      .page-header {\n        margin-bottom: 16px;\n      }\n      .page-header h1 {\n        font-size: 22px;\n        font-weight: 700;\n        margin: 0 0 4px;\n      }\n      .hint {\n        font-size: 13px;\n        opacity: 0.7;\n        margin: 0 0 12px;\n      }\n      .settings-section {\n        padding: 16px 0;\n      }\n      .settings-section + .settings-section {\n        border-top: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      .avatar-section {\n        display: flex;\n        align-items: center;\n        gap: 16px;\n      }\n      .avatar-meta {\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n      }\n    `,\n  ],\n})\nexport class ProfileViewComponent {\n  private nav = inject(NavigationService);\n  private auth = inject(AuthService);\n  private i18n = inject(I18nService);\n  private toast = inject(ToastService);\n  private errors = inject(ValtechErrorService);\n  private firebase = inject(FirebaseService);\n  private collections = inject(FirestoreCollectionFactory);\n  private route = inject(ActivatedRoute, { optional: true });\n\n  /**\n   * Config vía @Input (object-first). Si no se pasa, se cae al route data\n   * `profileConfig` (poblado por `provideValtechProfileRoutes`). `resolvedConfig`\n   * mergea con los defaults.\n   */\n  @Input() config?: ProfileViewConfig;\n\n  /** Config mergeada con defaults. @Input gana sobre route data. */\n  readonly resolvedConfig = computed<\n    Required<Omit<ProfileViewConfig, 'onSaved' | 'onAvatarUploaded' | 'profileBaseUrl'>> &\n      Pick<ProfileViewConfig, 'onSaved' | 'onAvatarUploaded' | 'profileBaseUrl'>\n  >(() => {\n    const fromRoute = (this.route?.snapshot.data['profileConfig'] ?? {}) as ProfileViewConfig;\n    const merged: ProfileViewConfig = { ...fromRoute, ...(this.config ?? {}) };\n    return {\n      showAvatar: merged.showAvatar ?? true,\n      showHandle: merged.showHandle ?? true,\n      showPhone: merged.showPhone ?? true,\n      showShareCta: merged.showShareCta ?? true,\n      profileBaseUrl: merged.profileBaseUrl ?? '',\n      i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,\n      onSaved: merged.onSaved,\n      onAvatarUploaded: merged.onAvatarUploaded,\n    };\n  });\n\n  /** Namespace i18n resuelto (capturado una vez para llamadas no-reactivas). */\n  private get ns(): string {\n    return this.resolvedConfig().i18nNamespace;\n  }\n\n  /**\n   * Colección global /users/{uid} (skipAppPrefix: true — el doc vive fuera de\n   * apps/{appId}/... porque es cross-app, ver firestore.rules).\n   */\n  private usersCol: TypedCollection<UserMirrorDoc> = this.collections.create<UserMirrorDoc>('users', {\n    skipAppPrefix: true,\n  });\n\n  private formCmp = viewChild<FormComponent>('form');\n\n  readonly profile = signal<GetProfileResponse | null>(null);\n  readonly loading = signal(true);\n  readonly saving = signal(false);\n  readonly loadError = signal<unknown | null>(null);\n\n  readonly shareOpen = signal(false);\n\n  readonly shareCta = computed<CtaCardMetadata>(() => {\n    this.i18n.lang();\n    return {\n      title: this.t('shareCtaTitle'),\n      description: this.t('shareCtaDesc'),\n      bordered: true,\n      actions: {\n        position: 'left',\n        columned: false,\n        buttons: [\n          {\n            text: this.t('shareCtaBtn'),\n            color: 'dark',\n            shape: 'round',\n            type: 'button',\n            state: 'ENABLED',\n            token: 'share',\n          },\n        ],\n      },\n    };\n  });\n\n  readonly shareModal = computed<ShareProfileModalMetadata>(() => {\n    const p = this.profile();\n    const handle = p?.handle ?? 'me';\n    const base = this.resolvedConfig().profileBaseUrl;\n    return {\n      name: p?.name ?? '',\n      handle: p?.handle,\n      avatarUrl: p?.avatarUrl,\n      email: p?.email,\n      url: base ? `${base}/u/${handle}` : `/u/${handle}`,\n    };\n  });\n\n  private readonly _userId = computed(() => this.auth.user()?.userId ?? null);\n\n  readonly errorState = computed<EmptyStateMetadata | null>(() => {\n    this.i18n.lang();\n    const err = this.loadError();\n    if (!err) return null;\n    return createErrorStateProps(err, {\n      title: {\n        offline: this.t('offlineTitle'),\n        error: this.t('errorTitle'),\n      },\n      description: {\n        offline: this.t('offlineHint'),\n        error: interpretError(err).message,\n      },\n      retryLabel: this.t('retry'),\n      onRetry: () => this.loadFromApi(),\n      retrying: this.loading(),\n    });\n  });\n\n  readonly avatarProps = computed<AvatarUploadMetadata>(() => {\n    this.i18n.lang();\n    const p = this.profile();\n    return {\n      currentUrl: p?.avatarUrl,\n      initials: this.initialsFromName(p?.name),\n      size: 96,\n      editable: true,\n      showViewButton: true,\n      i18nNamespace: this.ns,\n    };\n  });\n\n  formMeta: FormMetadata = this.buildFormMeta();\n\n  constructor() {\n    // Auto-registro i18n — respeta override del consumer. El namespace puede\n    // venir de @Input.config o del route data; lo resolvemos acá.\n    const ns = this.ns;\n    if (!this.i18n.hasNamespace(ns)) {\n      this.i18n.registerContent(ns, PROFILE_VIEW_I18N);\n    }\n\n    this.nav.setBackHeader('pageTitle', ns, { withMenu: true });\n\n    connectPageRefresh(() => this.loadFromApi());\n\n    effect(\n      onCleanup => {\n        const uid = this._userId();\n        if (!uid) {\n          this.profile.set(null);\n          this.loading.set(false);\n          return;\n        }\n        this.loading.set(true);\n\n        let sub: Subscription | null = null;\n        let cancelled = false;\n        let apiFallbackUsed = false;\n\n        void this.firebase.whenFirebaseAuthReady().then(() => {\n          if (cancelled) return;\n          sub = this.usersCol.watch(uid).subscribe({\n            next: doc => {\n              if (doc) {\n                this.profile.set(this.mapMirrorToProfile(doc));\n                this.loadError.set(null);\n                this.loading.set(false);\n              } else if (!apiFallbackUsed) {\n                apiFallbackUsed = true;\n                void this.loadFromApi();\n              }\n            },\n            error: () => {\n              if (!apiFallbackUsed) {\n                apiFallbackUsed = true;\n                void this.loadFromApi();\n              }\n            },\n          });\n        });\n\n        onCleanup(() => {\n          cancelled = true;\n          sub?.unsubscribe();\n        });\n      },\n      { allowSignalWrites: true }\n    );\n\n    // saving → mutar state (val-form.ngDoCheck lo detecta).\n    effect(() => {\n      const isSaving = this.saving();\n      const state = isSaving ? ComponentStates.WORKING : ComponentStates.ENABLED;\n      this.formMeta.state = state;\n      (this.formMeta.actions as ButtonMetadata).state = state;\n      (this.formMeta.actions as ButtonMetadata).text = isSaving ? this.t('saving') : this.t('save');\n    });\n\n    // profile loaded + form mounted → patchValue al FormGroup.\n    effect(() => {\n      const p = this.profile();\n      const form = this.formCmp()?.Form;\n      if (!p || !form) return;\n      form.patchValue(\n        {\n          handle: p.handle || '',\n          name: p.name || '',\n          phone: p.phone || '',\n        },\n        { emitEvent: false }\n      );\n    });\n\n    // i18n.lang change → mutar labels (rare, no afecta typing).\n    effect(() => {\n      this.i18n.lang();\n      this.applyI18nLabels();\n    });\n  }\n\n  /** Construcción inicial — UNA vez. Gatea handle/phone según config. */\n  private buildFormMeta(): FormMetadata {\n    const cfg = this.resolvedConfig();\n\n    const handleField: InputMetadata = {\n      token: 'profile-handle',\n      name: 'handle',\n      label: this.t('handle'),\n      hint: this.t('handleHint'),\n      placeholder: this.t('handlePlaceholder'),\n      type: InputType.HANDLE,\n      order: 1,\n      validators: [\n        Validators.required,\n        Validators.minLength(HANDLE_MIN),\n        Validators.maxLength(HANDLE_MAX),\n        Validators.pattern(HANDLE_PATTERN),\n      ],\n      errors: {\n        required: this.t('usernameInvalid'),\n        minlength: this.t('usernameInvalid'),\n        maxlength: this.t('usernameInvalid'),\n        pattern: this.t('usernameInvalid'),\n      },\n      value: '',\n      range: { min: HANDLE_MIN, max: HANDLE_MAX },\n      state: ComponentStates.ENABLED,\n    };\n\n    const nameField: InputMetadata = {\n      token: 'profile-name',\n      name: 'name',\n      label: this.t('name'),\n      hint: this.t('nameHint'),\n      placeholder: this.t('namePlaceholder'),\n      type: InputType.TEXT,\n      order: 2,\n      validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],\n      errors: {},\n      value: '',\n      state: ComponentStates.ENABLED,\n    };\n\n    const phoneField: InputMetadata = {\n      token: 'profile-phone',\n      name: 'phone',\n      label: this.t('phone'),\n      hint: this.t('phoneHint'),\n      placeholder: this.t('phonePlaceholder'),\n      type: InputType.PHONE,\n      order: 3,\n      validators: [],\n      errors: {},\n      value: '',\n      state: ComponentStates.ENABLED,\n    };\n\n    // Filtrado por config: el name siempre va; handle/phone son opt-out.\n    const fields: InputMetadata[] = [];\n    if (cfg.showHandle) fields.push(handleField);\n    fields.push(nameField);\n    if (cfg.showPhone) fields.push(phoneField);\n\n    const submitButton: ButtonMetadata = {\n      text: this.t('save'),\n      color: 'dark',\n      type: 'submit',\n      fill: 'solid',\n      size: 'default',\n      shape: 'round',\n      expand: 'block',\n      state: ComponentStates.ENABLED,\n      token: 'profile-save',\n    } as ButtonMetadata;\n\n    return {\n      name: '',\n      state: ComponentStates.ENABLED,\n      sections: [\n        {\n          name: '',\n          order: 1,\n          fields,\n        },\n      ],\n      actions: submitButton,\n    };\n  }\n\n  /** Re-aplica labels/hints/placeholders en cambio de idioma. */\n  private applyI18nLabels(): void {\n    const section = this.formMeta.sections[0];\n    for (const field of section.fields) {\n      switch (field.name) {\n        case 'handle':\n          field.label = this.t('handle');\n          field.hint = this.t('handleHint');\n          field.placeholder = this.t('handlePlaceholder');\n          field.errors = {\n            required: this.t('usernameInvalid'),\n            minlength: this.t('usernameInvalid'),\n            maxlength: this.t('usernameInvalid'),\n            pattern: this.t('usernameInvalid'),\n          };\n          break;\n        case 'name':\n          field.label = this.t('name');\n          field.hint = this.t('nameHint');\n          field.placeholder = this.t('namePlaceholder');\n          break;\n        case 'phone':\n          field.label = this.t('phone');\n          field.hint = this.t('phoneHint');\n          field.placeholder = this.t('phonePlaceholder');\n          break;\n      }\n    }\n    const button = this.formMeta.actions as ButtonMetadata;\n    button.text = this.saving() ? this.t('saving') : this.t('save');\n  }\n\n  /**\n   * Fallback REST. Capa 4 (UI declarativa): NO toasteamos acá — el\n   * val-empty-state ES la UI del error.\n   */\n  private async loadFromApi(): Promise<void> {\n    this.loading.set(true);\n    try {\n      const p = await firstValueFrom(this.auth.getProfile());\n      this.profile.set(p);\n      this.loadError.set(null);\n    } catch (err) {\n      this.loadError.set(err);\n    } finally {\n      this.loading.set(false);\n    }\n  }\n\n  private mapMirrorToProfile(doc: UserMirrorDoc): GetProfileResponse {\n    return {\n      operationId: '',\n      userId: doc.userId,\n      email: doc.email,\n      name: doc.name ?? '',\n      handle: doc.handle,\n      phone: doc.phone,\n      avatarUrl: doc.avatarUrl,\n      emailVerified: false,\n      phoneVerified: false,\n      mfaEnabled: false,\n      createdAt: '',\n      updatedAt: '',\n    };\n  }\n\n  async onSubmit(event: FormSubmit): Promise<void> {\n    if (this.saving()) return;\n\n    const current = this.profile();\n    if (!current) return;\n\n    const cfg = this.resolvedConfig();\n    const fields = event.fields || {};\n    const nextHandle = String(fields['handle'] || '')\n      .trim()\n      .toLowerCase();\n    const nextName = String(fields['name'] || '').trim();\n    const nextPhone = String(fields['phone'] || '').trim();\n\n    const handleChanged = cfg.showHandle && !!nextHandle && nextHandle !== (current.handle || '').toLowerCase();\n    const nameChanged = !!nextName && nextName !== (current.name || '');\n    const phoneChanged = cfg.showPhone && nextPhone !== (current.phone || '');\n\n    if (!handleChanged && !nameChanged && !phoneChanged) {\n      this.toast.show({\n        message: this.t('saveSuccess'),\n        duration: 2000,\n        color: 'dark',\n        position: 'top',\n      });\n      return;\n    }\n\n    this.saving.set(true);\n    try {\n      if (handleChanged) {\n        try {\n          await firstValueFrom(this.auth.updateHandle(nextHandle));\n        } catch (err) {\n          this.errors.handle(err, {\n            context: 'profile.updateHandle',\n            i18nMap: { AUTH_USERNAME_EXISTS: 'handleInUse' },\n            fallbackKey: 'handleError',\n            i18nNamespace: this.ns,\n          });\n          await this.loadFromApi();\n          return;\n        }\n      }\n\n      if (nameChanged || phoneChanged) {\n        const payload: { name?: string; phone?: string } = {};\n        if (nameChanged) payload.name = nextName;\n        if (phoneChanged) payload.phone = nextPhone;\n        try {\n          await firstValueFrom(this.auth.updateProfile(payload));\n        } catch (err) {\n          this.errors.handle(err, {\n            context: 'profile.updateProfile',\n            i18nMap: {\n              AUTHV2_PHONE_EXISTS: 'phoneInUse',\n              AUTHV2_INVALID_PHONE: 'phoneInvalid',\n            },\n            fallbackKey: 'saveError',\n            i18nNamespace: this.ns,\n          });\n          await this.loadFromApi();\n          return;\n        }\n      }\n\n      this.toast.show({\n        message: this.t('saveSuccess'),\n        duration: 2500,\n        color: 'dark',\n        position: 'top',\n      });\n      cfg.onSaved?.(this.profile() ?? current);\n    } finally {\n      this.saving.set(false);\n    }\n  }\n\n  onAvatarUploaded(result: AvatarUploadResult): void {\n    this.toast.show({\n      message: this.t('avatarSuccess'),\n      duration: 2500,\n      color: 'dark',\n      position: 'top',\n    });\n    this.resolvedConfig().onAvatarUploaded?.(result);\n  }\n\n  onAvatarError(_err: AvatarUploadError): void {\n    this.toast.show({\n      message: this.t('avatarError'),\n      duration: 3000,\n      color: 'dark',\n      position: 'top',\n    });\n  }\n\n  /** Lee del namespace configurado. */\n  protected t(key: string): string {\n    return this.i18n.t(key, this.ns);\n  }\n\n  private initialsFromName(name?: string): string {\n    if (!name) return '?';\n    const parts = name.trim().split(/\\s+/).filter(Boolean);\n    if (parts.length === 0) return '?';\n    const first = parts[0]?.[0] ?? '';\n    const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n    return (first + last).toUpperCase() || '?';\n  }\n}\n","import { Routes } from '@angular/router';\n\nimport { ProfileViewComponent } from './profile-view.component';\nimport { ProfileViewConfig } from './types';\n\n/**\n * Helper para montar la vista Perfil (`val-profile-view`) como ruta en una app\n * del factory. El `config` se pasa por route `data` (`profileConfig`) y el\n * componente lo lee como fallback de su `@Input() config`.\n *\n * @example\n * ```ts\n * // settings.routes.ts\n * export const settingsRoutes: Routes = [\n *   ...provideValtechProfileRoutes(),\n *   { path: 'preferences', loadComponent: () => ... },\n * ];\n *\n * // con config acotada:\n * ...provideValtechProfileRoutes({ config: { showPhone: false } }),\n * ```\n */\nexport function provideValtechProfileRoutes(opts?: {\n  path?: string;\n  config?: ProfileViewConfig;\n}): Routes {\n  return [\n    {\n      path: opts?.path ?? 'profile',\n      component: ProfileViewComponent,\n      data: { profileConfig: opts?.config },\n    },\n  ];\n}\n","import { Inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { FONT_SIZE } from '../../shared/constants/storage';\nimport { LocalStorageService } from '../local-storage.service';\n\nexport enum FontSizeOption {\n  SMALL = 'small',\n  MEDIUM = 'medium',\n  LARGE = 'large',\n}\n\nconst SIZE_PX: Record<FontSizeOption, string> = {\n  [FontSizeOption.SMALL]: '14px',\n  [FontSizeOption.MEDIUM]: '16px',\n  [FontSizeOption.LARGE]: '19px',\n};\n\n@Injectable({ providedIn: 'root' })\nexport class FontSizeService {\n  private readonly _size = signal<FontSizeOption>(FontSizeOption.MEDIUM);\n  readonly size = this._size.asReadonly();\n\n  private readonly isBrowser: boolean;\n\n  constructor(@Inject(PLATFORM_ID) platformId: object) {\n    this.isBrowser = isPlatformBrowser(platformId);\n    if (!this.isBrowser) return;\n\n    const stored = LocalStorageService.get<FontSizeOption>(FONT_SIZE);\n    const initial = stored && SIZE_PX[stored] ? stored : FontSizeOption.MEDIUM;\n    this._size.set(initial);\n    this.applySize(initial);\n  }\n\n  setSize(size: FontSizeOption): void {\n    if (!SIZE_PX[size]) return;\n    this._size.set(size);\n    if (this.isBrowser) {\n      LocalStorageService.set(FONT_SIZE, size);\n    }\n    this.applySize(size);\n  }\n\n  private applySize(size: FontSizeOption): void {\n    if (!this.isBrowser) return;\n    document.documentElement.style.fontSize = SIZE_PX[size];\n    document.body.classList.toggle('font-large', size === FontSizeOption.LARGE);\n    document.body.classList.toggle('font-small', size === FontSizeOption.SMALL);\n  }\n}\n","import { DestroyRef, Inject, Injectable, Optional, effect, inject, signal } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Subscription, firstValueFrom } from 'rxjs';\n\nimport { AuthService } from '../auth/auth.service';\nimport { VALTECH_AUTH_CONFIG } from '../auth/config';\nimport { ValtechAuthConfig } from '../auth/types';\nimport { FirestoreService } from '../firebase/firestore.service';\nimport { I18nLang } from '../i18n/types';\nimport { I18nService } from '../i18n/i18n.service';\nimport { ThemeOption, ThemeService } from '../theme.service';\nimport { FontSizeOption, FontSizeService } from '../font-size/font-size.service';\nimport {\n  PreferencesDocument,\n  PreferencesFontSize,\n  PreferencesLanguage,\n  PreferencesTheme,\n  PreferencesUpdate,\n  PreferencesUpdateResponse,\n} from './preferences.types';\n\n/**\n * PreferencesService — preferencias del user en el doc canónico Firestore\n * `/apps/{appId}/users/{uid}/preferences/main`.\n *\n * Read reactivo (signals) via listener Firestore.\n * Write via `PUT /v2/auth/preferences` (cliente NUNCA escribe Firestore directo —\n * ver memoria `feedback_no_direct_firestore_writes`).\n *\n * Side-effects automáticos:\n * - Cuando `theme()` cambia → `ThemeService.Theme = ...`\n * - Cuando `language()` cambia → `I18nService.setLanguage(...)`\n *\n * Auto-bind al user actual via `AuthService.user()`. Sin user (logout) → unbind.\n */\n@Injectable({ providedIn: 'root' })\nexport class PreferencesService {\n  private readonly _theme = signal<PreferencesTheme>('auto');\n  private readonly _language = signal<PreferencesLanguage>('es');\n  private readonly _fontSize = signal<PreferencesFontSize>('medium');\n  // Default `false` (opt-in). El user debe activar explícitamente las notificaciones;\n  // no asumimos consentimiento implícito. Backend debe coincidir.\n  private readonly _notificationsMaster = signal<boolean>(false);\n  /** `true` después del primer snapshot Firestore. Antes, defaults sin side-effects. */\n  private readonly _synced = signal<boolean>(false);\n\n  readonly theme = this._theme.asReadonly();\n  readonly language = this._language.asReadonly();\n  readonly fontSize = this._fontSize.asReadonly();\n  readonly notificationsMaster = this._notificationsMaster.asReadonly();\n  readonly synced = this._synced.asReadonly();\n\n  private subscription?: Subscription;\n  private currentUserId?: string;\n  /**\n   * `true` mientras un `update()` está en vuelo (PUT al backend).\n   *\n   * El listener Firestore (`bindToUser`) es real-time y puede emitir un snapshot\n   * *stale* — anterior al sync del backend — que pisaría el valor optimista de\n   * `_notificationsMaster` y revertiría el toggle. Mientras este flag esté `true`\n   * el listener ignora las emisiones; el `update()` ya alinea las señales con la\n   * respuesta del backend al terminar.\n   */\n  private _updateInFlight = false;\n\n  constructor(\n    @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig,\n    private firestore: FirestoreService,\n    private auth: AuthService,\n    private http: HttpClient,\n    @Optional() private themeService: ThemeService | null,\n    @Optional() private fontSizeService: FontSizeService | null,\n    @Optional() private i18n: I18nService | null\n  ) {\n    const destroyRef = inject(DestroyRef);\n    destroyRef.onDestroy(() => this.unbind());\n\n    // Auto-bind al user actual. effect() corre en injection context (constructor OK).\n    // allowSignalWrites: bindToUser/unbind escriben `_synced` (señal interna sin\n    // dependencias del propio effect) → seguro y necesario.\n    effect(\n      () => {\n        const user = this.auth.user();\n        if (user?.userId) {\n          this.bindToUser(user.userId);\n        } else {\n          this.unbind();\n        }\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Side-effect: aplicar theme local cuando llega snapshot real.\n    // OJO: usar `toggleUserPreference()` y NO el setter `Theme =`. El setter\n    // solo persiste localStorage + emite el BehaviorSubject; no aplica las\n    // clases `body.dark`/`body.light` que el palette `dark.class.css` de\n    // Ionic necesita para conmutar el tema visible.\n    effect(() => {\n      if (!this._synced()) return;\n      const t = this._theme();\n      if (this.themeService) {\n        this.themeService.toggleUserPreference(t as ThemeOption);\n      }\n    });\n\n    // Side-effect: aplicar language local cuando llega snapshot real.\n    effect(() => {\n      if (!this._synced()) return;\n      const l = this._language();\n      if (this.i18n && this.i18n.lang() !== l) {\n        this.i18n.setLanguage(l as I18nLang);\n      }\n    });\n\n    // Side-effect: aplicar fontSize local cuando llega snapshot real.\n    // allowSignalWrites: fontSizeService.setSize() escribe this._size (signal).\n    effect(\n      () => {\n        if (!this._synced()) return;\n        const fs = this._fontSize();\n        if (this.fontSizeService) {\n          this.fontSizeService.setSize(fs as FontSizeOption);\n        }\n      },\n      { allowSignalWrites: true }\n    );\n  }\n\n  /** Actualiza preferencias via backend. Optimistic UI: aplica local, revierte si falla. */\n  async update(partial: PreferencesUpdate): Promise<PreferencesUpdateResponse> {\n    const url = `${this.config.apiUrl}/v2/auth/preferences`;\n\n    const prev = {\n      theme: this._theme(),\n      language: this._language(),\n      fontSize: this._fontSize(),\n      master: this._notificationsMaster(),\n    };\n\n    if (partial.theme) this._theme.set(partial.theme);\n    if (partial.language) this._language.set(partial.language);\n    if (partial.fontSize) this._fontSize.set(partial.fontSize);\n    if (partial.notifications && typeof partial.notifications.master === 'boolean') {\n      this._notificationsMaster.set(partial.notifications.master);\n    }\n\n    // Bloquear el listener Firestore mientras el PUT está en vuelo: un snapshot\n    // stale no debe pisar el valor optimista recién aplicado.\n    this._updateInFlight = true;\n\n    try {\n      // Enviar appId explícito — el backend lo usa para escribir el mirror\n      // Firestore en apps/{appId}/... correcto, sin depender del header Origin\n      // (que en PWA iOS puede no resolver al AppID esperado).\n      const body = { ...partial, appId: this.config.appId };\n      const res = await firstValueFrom(this.http.put<PreferencesUpdateResponse>(url, body));\n      // El listener Firestore es la fuente final, pero alinear ya con la\n      // respuesta del backend acelera UX (especialmente si el listener\n      // tarda en propagar).\n      if (res.theme) this._theme.set(res.theme as PreferencesTheme);\n      if (res.language) this._language.set(res.language as PreferencesLanguage);\n      if (res.fontSize) this._fontSize.set(res.fontSize as PreferencesFontSize);\n      if (typeof res.notifications?.master === 'boolean') {\n        this._notificationsMaster.set(res.notifications.master);\n      }\n      return res;\n    } catch (err) {\n      // Revert optimistic.\n      this._theme.set(prev.theme);\n      this._language.set(prev.language);\n      this._fontSize.set(prev.fontSize);\n      this._notificationsMaster.set(prev.master);\n      throw err;\n    } finally {\n      this._updateInFlight = false;\n    }\n  }\n\n  setTheme(theme: PreferencesTheme): Promise<PreferencesUpdateResponse> {\n    return this.update({ theme });\n  }\n\n  setLanguage(language: PreferencesLanguage): Promise<PreferencesUpdateResponse> {\n    return this.update({ language });\n  }\n\n  setFontSize(fontSize: PreferencesFontSize): Promise<PreferencesUpdateResponse> {\n    return this.update({ fontSize });\n  }\n\n  setNotificationsMaster(enabled: boolean): Promise<PreferencesUpdateResponse> {\n    return this.update({ notifications: { master: enabled } });\n  }\n\n  private bindToUser(userId: string): void {\n    if (this.currentUserId === userId && this.subscription) return;\n    this.unbind();\n    this.currentUserId = userId;\n    // FirestoreService.docChanges prefija automáticamente `apps/{appId}/`\n    // cuando `config.appId` está seteado en ValtechAuthConfig.\n    this.subscription = this.firestore\n      .docChanges<PreferencesDocument & { id?: string }>(`users/${userId}/preferences`, 'main')\n      .subscribe(doc => {\n        if (!doc) {\n          // Doc no existe aún (user nuevo, sin primer sync). Mantenemos\n          // defaults locales pero NO marcamos synced — los side-effects no\n          // pisan el theme/lang locales con valores arbitrarios.\n          return;\n        }\n        // Ignorar emisiones del listener mientras hay un update() en vuelo: un\n        // snapshot stale (anterior al sync del backend) revertiría el valor\n        // optimista. El update() ya alinea las señales con la respuesta real.\n        if (this._updateInFlight) {\n          return;\n        }\n        if (doc.theme) this._theme.set(doc.theme);\n        if (doc.language) this._language.set(doc.language);\n        if (doc.fontSize) this._fontSize.set(doc.fontSize);\n        if (doc.notifications && typeof doc.notifications.master === 'boolean') {\n          this._notificationsMaster.set(doc.notifications.master);\n        }\n        this._synced.set(true);\n      });\n  }\n\n  private unbind(): void {\n    this.subscription?.unsubscribe();\n    this.subscription = undefined;\n    this.currentUserId = undefined;\n    this._synced.set(false);\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-preferences-view`. Auto-registrados\n * en el constructor del componente si el consumer no proveyó el namespace\n * (`Settings.General` por default). Garantiza que nunca haya una key faltante\n * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md\n * sobre el storm de CD con `val-debug-console`). El consumer puede override\n * registrando el mismo namespace antes de que el componente monte.\n *\n * SOLO incluye las keys que la vista realmente usa.\n */\nexport const PREFERENCES_VIEW_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'General',\n    pageDescription: 'Apariencia e idioma',\n    themeTitle: 'Tema',\n    themeHint: 'Cómo se ve la app: claro, oscuro o según tu sistema.',\n    themeLight: 'Claro',\n    themeDark: 'Oscuro',\n    themeAuto: 'Auto',\n    languageTitle: 'Idioma',\n    languageHint: 'Idioma de la interfaz y de los correos que recibes.',\n    fontSizeTitle: 'Tamaño de texto',\n    fontSizeHint: 'Ajusta el tamaño de la letra en toda la app.',\n    fontSizeSmall: 'Pequeño',\n    fontSizeMedium: 'Mediano',\n    fontSizeLarge: 'Grande',\n    saveError: 'No se pudo guardar la preferencia.',\n  },\n  en: {\n    pageTitle: 'General',\n    pageDescription: 'Appearance and language',\n    themeTitle: 'Theme',\n    themeHint: 'How the app looks: light, dark, or matching your system.',\n    themeLight: 'Light',\n    themeDark: 'Dark',\n    themeAuto: 'Auto',\n    languageTitle: 'Language',\n    languageHint: 'Language of the interface and of the emails you receive.',\n    fontSizeTitle: 'Text size',\n    fontSizeHint: 'Adjust the font size across the entire app.',\n    fontSizeSmall: 'Small',\n    fontSizeMedium: 'Medium',\n    fontSizeLarge: 'Large',\n    saveError: 'Could not save preference.',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\n\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { LanguageSelectorComponent } from '../../molecules/language-selector/language-selector.component';\nimport { LanguageSelectorMetadata } from '../../molecules/language-selector/types';\nimport { PopoverSelectorComponent } from '../../molecules/popover-selector/popover-selector.component';\nimport { PopoverSelectorMetadata } from '../../molecules/popover-selector/types';\n\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\nimport { PreferencesService } from '../../../services/preferences/preferences.service';\nimport {\n  PreferencesFontSize,\n  PreferencesLanguage,\n  PreferencesTheme,\n} from '../../../services/preferences/preferences.types';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { PreferencesViewConfig } from './types';\nimport { PREFERENCES_VIEW_I18N } from './preferences-view.i18n';\n\nconst DEFAULT_NAMESPACE = 'Settings.General';\nconst DEFAULT_LANGUAGES: PreferencesLanguage[] = ['es', 'en'];\n\n/**\n * `val-preferences-view` — vista de preferencias de UI cross-app (tema +\n * idioma) full-feature autocontenida (organism). Promovida desde `showcase`\n * bajo el proceso de ADR-021.\n *\n * Backend integration 100% en `PreferencesService`:\n *  - Read: listener Firestore reactivo (`prefs.theme()` / `prefs.language()`).\n *  - Write: `PUT /v2/auth/preferences` (`prefs.setTheme` / `prefs.setLanguage`).\n *    El cliente NUNCA escribe Firestore directo.\n *\n * NO renderiza ion-content — vive dentro de val-page-wrapper.\n *\n * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no\n * proveyó el namespace configurado (default `Settings.General`).\n */\n@Component({\n  selector: 'val-preferences-view',\n  standalone: true,\n  imports: [\n    CommonModule,\n    PopoverSelectorComponent,\n    LanguageSelectorComponent,\n    DisplayComponent,\n    TitleComponent,\n    TextComponent,\n  ],\n  template: `\n    <div class=\"page\">\n      <header class=\"page-header\">\n        <val-display [props]=\"{ size: 'small', color: 'dark', content: pageTitle() }\" />\n        <val-title\n          [props]=\"{\n            size: 'large',\n            color: 'dark',\n            bold: false,\n            content: pageDescription(),\n          }\"\n        />\n      </header>\n\n      @if (resolvedConfig().showTheme) {\n        <section class=\"settings-section\">\n          <val-title\n            [props]=\"{\n              size: 'medium',\n              color: 'dark',\n              bold: true,\n              content: themeTitle(),\n            }\"\n          />\n          <div class=\"section-body\">\n            <val-text\n              [props]=\"{\n                size: 'medium',\n                color: 'dark',\n                bold: false,\n                content: themeHint(),\n              }\"\n            />\n            <val-popover-selector [props]=\"themePickerProps()\" (selectionChange)=\"onThemeChange($event)\" />\n          </div>\n        </section>\n      }\n\n      @if (resolvedConfig().showLanguage) {\n        <section class=\"settings-section\">\n          <val-title\n            [props]=\"{\n              size: 'medium',\n              color: 'dark',\n              bold: true,\n              content: langTitle(),\n            }\"\n          />\n          <div class=\"section-body\">\n            <val-text\n              [props]=\"{\n                size: 'medium',\n                color: 'dark',\n                bold: false,\n                content: langHint(),\n              }\"\n            />\n            <val-language-selector [props]=\"langProps()\" (languageChange)=\"onLanguageChange($event)\" />\n          </div>\n        </section>\n      }\n\n      @if (resolvedConfig().showFontSize) {\n        <section class=\"settings-section\">\n          <val-title\n            [props]=\"{\n              size: 'medium',\n              color: 'dark',\n              bold: true,\n              content: fontSizeTitle(),\n            }\"\n          />\n          <div class=\"section-body\">\n            <val-text\n              [props]=\"{\n                size: 'medium',\n                color: 'dark',\n                bold: false,\n                content: fontSizeHint(),\n              }\"\n            />\n            <val-popover-selector [props]=\"fontSizePickerProps()\" (selectionChange)=\"onFontSizeChange($event)\" />\n          </div>\n        </section>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .page {\n        padding: 16px 0;\n        max-width: 720px;\n        margin: 0 auto;\n      }\n      .settings-section {\n        padding: 16px 0;\n      }\n      .settings-section + .settings-section {\n        border-top: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      .section-body {\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n    `,\n  ],\n})\nexport class PreferencesViewComponent {\n  private nav = inject(NavigationService);\n  protected prefs = inject(PreferencesService);\n  private i18n = inject(I18nService);\n  private errors = inject(ValtechErrorService);\n  private route = inject(ActivatedRoute, { optional: true });\n\n  /**\n   * Config vía @Input (object-first). Si no se pasa, se cae al route data\n   * `preferencesConfig` (poblado por `provideValtechPreferencesRoutes`).\n   * `resolvedConfig` mergea con los defaults.\n   */\n  @Input() config?: PreferencesViewConfig;\n\n  /** Config mergeada con defaults. @Input gana sobre route data. */\n  readonly resolvedConfig = computed<\n    Required<Omit<PreferencesViewConfig, 'onThemeChanged' | 'onLanguageChanged' | 'onFontSizeChanged'>> &\n      Pick<PreferencesViewConfig, 'onThemeChanged' | 'onLanguageChanged' | 'onFontSizeChanged'>\n  >(() => {\n    const fromRoute = (this.route?.snapshot.data['preferencesConfig'] ?? {}) as PreferencesViewConfig;\n    const merged: PreferencesViewConfig = { ...fromRoute, ...(this.config ?? {}) };\n    return {\n      showTheme: merged.showTheme ?? true,\n      showLanguage: merged.showLanguage ?? true,\n      showFontSize: merged.showFontSize ?? true,\n      supportedLanguages: merged.supportedLanguages ?? DEFAULT_LANGUAGES,\n      i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,\n      onThemeChanged: merged.onThemeChanged,\n      onLanguageChanged: merged.onLanguageChanged,\n      onFontSizeChanged: merged.onFontSizeChanged,\n    };\n  });\n\n  /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */\n  private get ns(): string {\n    return this.resolvedConfig().i18nNamespace;\n  }\n\n  readonly saving = signal(false);\n\n  readonly pageTitle = computed(() => this.t('pageTitle'));\n  readonly pageDescription = computed(() => this.t('pageDescription'));\n  readonly themeTitle = computed(() => this.t('themeTitle'));\n  readonly themeHint = computed(() => this.t('themeHint'));\n  readonly langTitle = computed(() => this.t('languageTitle'));\n  readonly langHint = computed(() => this.t('languageHint'));\n  readonly fontSizeTitle = computed(() => this.t('fontSizeTitle'));\n  readonly fontSizeHint = computed(() => this.t('fontSizeHint'));\n  readonly langProps = computed<Partial<LanguageSelectorMetadata>>(() => ({\n    currentLanguage: this.prefs.language(),\n    availableLanguages: this.resolvedConfig().supportedLanguages,\n    showLabel: false,\n    disabled: this.saving(),\n    expand: 'block',\n    fill: 'outline',\n  }));\n\n  readonly themePickerProps = computed<PopoverSelectorMetadata>(() => ({\n    selectedValue: this.prefs.theme(),\n    disabled: this.saving(),\n    fill: 'outline',\n    interface: 'popover',\n    options: [\n      { value: 'light', label: this.t('themeLight') },\n      { value: 'dark', label: this.t('themeDark') },\n      { value: 'auto', label: this.t('themeAuto') },\n    ],\n  }));\n\n  readonly fontSizePickerProps = computed<PopoverSelectorMetadata>(() => ({\n    selectedValue: this.prefs.fontSize(),\n    disabled: this.saving(),\n    fill: 'outline',\n    interface: 'popover',\n    options: [\n      { value: 'small', label: this.t('fontSizeSmall') },\n      { value: 'medium', label: this.t('fontSizeMedium') },\n      { value: 'large', label: this.t('fontSizeLarge') },\n    ],\n  }));\n\n  constructor() {\n    // Auto-registro i18n — respeta override del consumer. El namespace puede\n    // venir de @Input.config o del route data; lo resolvemos acá.\n    const ns = this.ns;\n    if (!this.i18n.hasNamespace(ns)) {\n      this.i18n.registerContent(ns, PREFERENCES_VIEW_I18N);\n    }\n\n    this.nav.setBackHeader('pageTitle', ns, { withMenu: true });\n  }\n\n  async onThemeChange(value: string | string[]): Promise<void> {\n    const v = Array.isArray(value) ? value[0] : value;\n    if (this.saving() || v === this.prefs.theme()) return;\n    const theme = v as PreferencesTheme;\n    await this.dispatch(\n      () => this.prefs.setTheme(theme),\n      () => this.resolvedConfig().onThemeChanged?.(theme)\n    );\n  }\n\n  async onFontSizeChange(value: string | string[]): Promise<void> {\n    const v = Array.isArray(value) ? value[0] : value;\n    const fontSize = v as PreferencesFontSize;\n    if (this.saving() || v === this.prefs.fontSize()) return;\n    await this.dispatch(\n      () => this.prefs.setFontSize(fontSize),\n      () => this.resolvedConfig().onFontSizeChanged?.(fontSize)\n    );\n  }\n\n  async onLanguageChange(value: string): Promise<void> {\n    const lang = value as PreferencesLanguage;\n    if (!this.resolvedConfig().supportedLanguages.includes(lang)) return;\n    if (this.saving() || value === this.prefs.language()) return;\n    await this.dispatch(\n      () => this.prefs.setLanguage(lang),\n      () => this.resolvedConfig().onLanguageChanged?.(lang)\n    );\n  }\n\n  private async dispatch(fn: () => Promise<unknown>, onSuccess?: () => void): Promise<void> {\n    this.saving.set(true);\n    try {\n      await fn();\n      onSuccess?.();\n    } catch (err) {\n      this.errors.handle(err, {\n        context: 'settings.preferences.save',\n        fallbackKey: 'saveError',\n        i18nNamespace: this.ns,\n      });\n    } finally {\n      this.saving.set(false);\n    }\n  }\n\n  /** Lee del namespace configurado. */\n  protected t(key: string): string {\n    return this.i18n.t(key, this.ns);\n  }\n}\n","import { Routes } from '@angular/router';\n\nimport { PreferencesViewComponent } from './preferences-view.component';\nimport { PreferencesViewConfig } from './types';\n\n/**\n * Helper para montar la vista de preferencias (`val-preferences-view`) como\n * ruta en una app del factory. El `config` se pasa por route `data`\n * (`preferencesConfig`) y el componente lo lee como fallback de su\n * `@Input() config`.\n *\n * @example\n * ```ts\n * // settings.routes.ts\n * export const settingsRoutes: Routes = [\n *   ...provideValtechPreferencesRoutes(),\n *   { path: 'profile', loadComponent: () => ... },\n * ];\n *\n * // con config acotada:\n * ...provideValtechPreferencesRoutes({ config: { showLanguage: false } }),\n * ```\n */\nexport function provideValtechPreferencesRoutes(opts?: {\n  path?: string;\n  config?: PreferencesViewConfig;\n}): Routes {\n  return [\n    {\n      path: opts?.path ?? 'preferences',\n      component: PreferencesViewComponent,\n      data: { preferencesConfig: opts?.config },\n    },\n  ];\n}\n","import { ActionCardMetadata } from '../../molecules/action-card/types';\n\n/**\n * Modelo de una sección del HUB de settings. Cada sección se proyecta a un\n * `val-action-card` (vía `buildSettingsCards`). El catálogo default\n * (`SETTINGS_SECTIONS_CATALOG`) cubre las secciones estándar del factory;\n * el consumer puede filtrar (`exclude`), reordenar (`order`), reescribir las\n * rutas base (`basePath`) o sumar las suyas (`include`).\n */\nexport interface SettingsSection {\n  /** Identificador estable de la sección (dispatch de click + filtrado). */\n  token: string;\n  /** i18n key del título de la card (resuelto contra el namespace de labels). */\n  titleKey: string;\n  /** i18n key de la descripción (opcional — logout no la tiene). */\n  descKey?: string;\n  /** Ionicon de la card. */\n  ionicon: string;\n  /**\n   * Ruta de navegación. Las secciones bajo `/app/settings` se reescriben si el\n   * consumer pasa `basePath`. `action-logout` no tiene ruta (callback).\n   */\n  routerLink?: string;\n  /** Muestra el chevron a la derecha. Default `true`. */\n  showChevron?: boolean;\n  /** Card con sombra. Default `true`. */\n  shadowed?: boolean;\n}\n\n/**\n * Catálogo default de secciones del HUB de settings (8 entradas). `logout` va\n * incluida pero sin `routerLink` (la maneja un callback). Mismo set, mismos\n * tokens/iconos/rutas que el builder original de showcase\n * (`shared/settings-action-cards.ts`) que esta promoción reemplaza.\n */\nexport const SETTINGS_SECTIONS_CATALOG: SettingsSection[] = [\n  {\n    token: 'action-general',\n    titleKey: 'general',\n    descKey: 'generalDesc',\n    ionicon: 'options-outline',\n    routerLink: '/app/settings/general',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-account',\n    titleKey: 'account',\n    descKey: 'accountDesc',\n    ionicon: 'business-outline',\n    routerLink: '/app/settings/account',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-profile',\n    titleKey: 'editProfile',\n    descKey: 'editProfileDesc',\n    ionicon: 'person-outline',\n    routerLink: '/app/settings/profile',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-preferences',\n    titleKey: 'preferences',\n    descKey: 'preferencesDesc',\n    ionicon: 'options-outline',\n    routerLink: '/app/settings/preferences',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-notifications',\n    titleKey: 'notifications',\n    descKey: 'notificationsDesc',\n    ionicon: 'notifications-outline',\n    routerLink: '/app/settings/notifications',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-security',\n    titleKey: 'security',\n    descKey: 'securityDesc',\n    ionicon: 'shield-checkmark-outline',\n    routerLink: '/app/settings/security',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-about',\n    titleKey: 'about',\n    descKey: 'aboutDesc',\n    ionicon: 'information-circle-outline',\n    routerLink: '/app/about',\n    showChevron: true,\n    shadowed: true,\n  },\n  {\n    token: 'action-logout',\n    titleKey: 'logout',\n    ionicon: 'log-out-outline',\n    showChevron: false,\n    shadowed: true,\n  },\n];\n\n/** Opciones del builder `buildSettingsCards`. */\nexport interface SettingsCardsOptions {\n  /** Oculta secciones por token (típicamente la entrada de la página actual). */\n  exclude?: string[];\n  /** Secciones extra a sumar al catálogo (las de la app aún no promovidas). */\n  include?: SettingsSection[];\n  /** Orden explícito por token. Las no listadas quedan al final, en su orden. */\n  order?: string[];\n  /** Incluye la card de logout (sin ruta). Default `false`. */\n  includeLogout?: boolean;\n  /**\n   * Reescribe el prefijo `/app/settings` de las rutas del catálogo. Ej.\n   * `basePath: '/app/config'` → `/app/config/general`. Si se omite, las rutas\n   * quedan tal cual el catálogo.\n   */\n  basePath?: string;\n}\n\nconst CATALOG_BASE = '/app/settings';\n\n/**\n * Construye el grid de cards de navegación del HUB de settings (versión\n * promovida del `buildSettingsActionCards` de showcase). Usa el catálogo\n * default + las `include` del consumer, filtra `exclude`, gatea logout por\n * `includeLogout`, reordena por `order` y reescribe las rutas por `basePath`.\n *\n * El `t` resuelve los `titleKey`/`descKey` contra el namespace de labels\n * (default del componente: `Dashboard`). `logout` NO tiene `routerLink` — el\n * consumer maneja el flujo de cierre de sesión por token / callback.\n */\nexport function buildSettingsCards(\n  t: (key: string) => string,\n  options: SettingsCardsOptions = {}\n): ActionCardMetadata[] {\n  const exclude = new Set<string>(options.exclude ?? []);\n  const includeLogout = options.includeLogout ?? false;\n  const basePath = options.basePath;\n\n  const sections: SettingsSection[] = [...SETTINGS_SECTIONS_CATALOG, ...(options.include ?? [])];\n\n  let resolved = sections.filter(s => {\n    if (exclude.has(s.token)) return false;\n    if (s.token === 'action-logout' && !includeLogout) return false;\n    return true;\n  });\n\n  if (options.order && options.order.length > 0) {\n    const rank = new Map(options.order.map((token, i) => [token, i]));\n    resolved = [...resolved].sort((a, b) => {\n      const ra = rank.has(a.token) ? rank.get(a.token)! : Number.MAX_SAFE_INTEGER;\n      const rb = rank.has(b.token) ? rank.get(b.token)! : Number.MAX_SAFE_INTEGER;\n      return ra - rb;\n    });\n  }\n\n  return resolved.map(s => {\n    const card: ActionCardMetadata = {\n      token: s.token,\n      title: t(s.titleKey),\n      icon: {\n        ionicon: s.ionicon,\n        color: 'dark',\n        backgroundColor: 'light',\n      },\n      showChevron: s.showChevron ?? true,\n      shadowed: s.shadowed ?? true,\n    };\n    if (s.descKey) card.description = t(s.descKey);\n    if (s.routerLink) {\n      card.routerLink = basePath ? rewriteBasePath(s.routerLink, basePath) : s.routerLink;\n    }\n    return card;\n  });\n}\n\n/** Reescribe el prefijo `/app/settings` de una ruta del catálogo por `basePath`. */\nfunction rewriteBasePath(routerLink: string, basePath: string): string {\n  if (routerLink.startsWith(CATALOG_BASE)) {\n    return basePath + routerLink.slice(CATALOG_BASE.length);\n  }\n  return routerLink;\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n embebidos en `val-settings-hub`. Dos sets, uno por namespace\n * (ver `SettingsHubConfig.i18nNamespace` / `.pageI18nNamespace`). Auto-registrados\n * en el constructor SOLO si el namespace no existe (respeta override del consumer).\n *\n * `SETTINGS_HUB_LABELS_I18N` — labels de cada sección (namespace `Dashboard` por\n * default). Mismo set que showcase mantiene en `src/i18n/index.ts` (queda como\n * override). `SETTINGS_HUB_PAGE_I18N` — header del HUB (namespace\n * `Settings.Preferences` por default), tomado de la page Preferencias original.\n */\nexport const SETTINGS_HUB_LABELS_I18N: LanguagesContent = {\n  es: {\n    general: 'General',\n    generalDesc: 'Apariencia e idioma',\n    account: 'Cuenta',\n    accountDesc: 'Organizaciones y sesión',\n    editProfile: 'Editar perfil',\n    editProfileDesc: 'Actualiza tu información personal',\n    preferences: 'Preferencias',\n    preferencesDesc: 'Tema, idioma y otras opciones',\n    notifications: 'Notificaciones',\n    notificationsDesc: 'Configura tus preferencias',\n    security: 'Seguridad',\n    securityDesc: 'Gestiona contraseñas y MFA',\n    about: 'Acerca de',\n    aboutDesc: 'Versión, feedback y enlaces útiles',\n    logout: 'Cerrar sesión',\n  },\n  en: {\n    general: 'General',\n    generalDesc: 'Appearance and language',\n    account: 'Account',\n    accountDesc: 'Organizations and session',\n    editProfile: 'Edit profile',\n    editProfileDesc: 'Update your personal information',\n    preferences: 'Preferences',\n    preferencesDesc: 'Theme, language and other options',\n    notifications: 'Notifications',\n    notificationsDesc: 'Configure your preferences',\n    security: 'Security',\n    securityDesc: 'Manage passwords and MFA',\n    about: 'About',\n    aboutDesc: 'Version, feedback and useful links',\n    logout: 'Sign out',\n  },\n};\n\nexport const SETTINGS_HUB_PAGE_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'Preferencias',\n    pageDescription: 'Ajusta tu cuenta y la app',\n  },\n  en: {\n    pageTitle: 'Preferences',\n    pageDescription: 'Tune your account and the app',\n  },\n};\n","import { Component, computed, inject, Input } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IonCol, IonGrid, IonRow } from '@ionic/angular/standalone';\n\nimport { ActionCardComponent } from '../../molecules/action-card/action-card.component';\nimport { ActionCardMetadata } from '../../molecules/action-card/types';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\n\nimport { I18nService } from '../../../services/i18n';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\n\nimport { SettingsHubConfig } from './types';\nimport { buildSettingsCards } from './settings-sections';\nimport { SETTINGS_HUB_LABELS_I18N, SETTINGS_HUB_PAGE_I18N } from './settings-hub.i18n';\n\nconst DEFAULT_LABELS_NS = 'Dashboard';\nconst DEFAULT_PAGE_NS = 'Settings.Preferences';\n\n/**\n * `val-settings-hub` — portada de la sección Settings (organism). Renderiza un\n * header (título + descripción) + un grid de `val-action-card` que navega a las\n * sub-vistas. Promovido desde `showcase` (`pages/settings/pages/preferences`)\n * bajo el proceso de ADR-021.\n *\n * Las cards salen de `buildSettingsCards` sobre el catálogo default\n * (`SETTINGS_SECTIONS_CATALOG`), filtrado/extendido/reordenado por la config.\n *\n * Navegación: cards con `routerLink` navegan vía `Router`; la card de logout\n * (sin ruta) invoca `config.onLogout`. Cada click emite `config.onSectionClick`.\n *\n * NO renderiza ion-content — vive dentro de val-page-wrapper.\n *\n * Auto-registra sus dos sets de defaults i18n (labels + header) en sus\n * respectivos namespaces si el consumer no los proveyó.\n */\n@Component({\n  selector: 'val-settings-hub',\n  standalone: true,\n  imports: [IonGrid, IonRow, IonCol, ActionCardComponent, DisplayComponent, TitleComponent],\n  template: `\n    <div class=\"page\">\n      <header class=\"page-header\">\n        <val-display [props]=\"{ size: 'small', color: 'dark', content: pageTitle() }\" />\n        <val-title\n          [props]=\"{\n            size: 'large',\n            color: 'dark',\n            bold: false,\n            content: pageDescription(),\n          }\"\n        />\n      </header>\n\n      <ion-grid class=\"cards-grid\">\n        <ion-row>\n          @for (action of actionCards(); track action.token) {\n            <ion-col size=\"12\" size-sm=\"6\">\n              <val-action-card [props]=\"action\" (onClick)=\"onActionClick(action)\" />\n            </ion-col>\n          }\n        </ion-row>\n      </ion-grid>\n    </div>\n  `,\n  styles: [\n    `\n      .page {\n        padding: 16px 0;\n        max-width: 720px;\n        margin: 0 auto;\n      }\n      .page-header {\n        margin-bottom: 16px;\n      }\n      .cards-grid {\n        margin: 0 -4px;\n        padding: 0;\n      }\n      .cards-grid ion-col {\n        padding: 4px;\n      }\n    `,\n  ],\n})\nexport class SettingsHubComponent {\n  private nav = inject(NavigationService);\n  private i18n = inject(I18nService);\n  private router = inject(Router);\n  private route = inject(ActivatedRoute, { optional: true });\n\n  /**\n   * Config vía @Input (object-first). Si no se pasa, cae al route data\n   * `settingsHubConfig` (poblado por `provideValtechSettingsRoutes`).\n   * `resolvedConfig` mergea con defaults — @Input gana sobre route data.\n   */\n  @Input() config?: SettingsHubConfig;\n\n  readonly resolvedConfig = computed<\n    Required<Pick<SettingsHubConfig, 'i18nNamespace' | 'pageI18nNamespace'>> & SettingsHubConfig\n  >(() => {\n    const fromRoute = (this.route?.snapshot.data['settingsHubConfig'] ?? {}) as SettingsHubConfig;\n    const merged: SettingsHubConfig = { ...fromRoute, ...(this.config ?? {}) };\n    return {\n      ...merged,\n      i18nNamespace: merged.i18nNamespace ?? DEFAULT_LABELS_NS,\n      pageI18nNamespace: merged.pageI18nNamespace ?? DEFAULT_PAGE_NS,\n    };\n  });\n\n  private get labelsNs(): string {\n    return this.resolvedConfig().i18nNamespace;\n  }\n  private get pageNs(): string {\n    return this.resolvedConfig().pageI18nNamespace;\n  }\n\n  readonly pageTitle = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('pageTitle', this.pageNs);\n  });\n  readonly pageDescription = computed(() => {\n    this.i18n.lang();\n    return this.i18n.t('pageDescription', this.pageNs);\n  });\n\n  /** Cards del HUB, resueltas desde la config. */\n  readonly actionCards = computed<ActionCardMetadata[]>(() => {\n    this.i18n.lang();\n    const cfg = this.resolvedConfig();\n    return buildSettingsCards(k => this.i18n.t(k, cfg.i18nNamespace), {\n      exclude: cfg.exclude,\n      include: cfg.include,\n      order: cfg.order,\n      includeLogout: cfg.includeLogout,\n      basePath: cfg.basePath,\n    });\n  });\n\n  constructor() {\n    // Auto-registro i18n — respeta override del consumer. Los namespaces pueden\n    // venir de @Input.config o del route data; los resolvemos acá.\n    const labelsNs = this.labelsNs;\n    if (!this.i18n.hasNamespace(labelsNs)) {\n      this.i18n.registerContent(labelsNs, SETTINGS_HUB_LABELS_I18N);\n    }\n    const pageNs = this.pageNs;\n    if (!this.i18n.hasNamespace(pageNs)) {\n      this.i18n.registerContent(pageNs, SETTINGS_HUB_PAGE_I18N);\n    }\n\n    this.nav.setBackHeader('pageTitle', pageNs, { withMenu: true });\n  }\n\n  onActionClick(action: ActionCardMetadata): void {\n    const token = action.token;\n    this.resolvedConfig().onSectionClick?.(token ?? '');\n    if (token === 'action-logout') {\n      this.resolvedConfig().onLogout?.();\n      return;\n    }\n    if (action.routerLink) {\n      this.router.navigate(Array.isArray(action.routerLink) ? action.routerLink : [action.routerLink]);\n    }\n  }\n}\n","import { Routes } from '@angular/router';\n\nimport { provideValtechProfileRoutes } from '../profile-view/profile.routes';\nimport { ProfileViewConfig } from '../profile-view/types';\nimport { provideValtechPreferencesRoutes } from '../preferences-view/preferences.routes';\nimport { PreferencesViewConfig } from '../preferences-view/types';\n\nimport { SettingsHubComponent } from './settings-hub.component';\nimport { SettingsHubConfig } from './types';\n\n/**\n * Opciones de `provideValtechSettingsRoutes`. Agrupa el HUB (`val-settings-hub`)\n * con las vistas ya promovidas (Perfil + Preferencias) bajo un único `path`\n * base, y deja `extraRoutes` para las secciones de la app aún no promovidas\n * (security, account, notifications, organization, …).\n */\nexport interface ValtechSettingsRoutesOptions {\n  /** Path base del bloque de settings. Default `'settings'`. */\n  basePath?: string;\n  /** Config del HUB (pasada por route data `settingsHubConfig`). */\n  hubConfig?: SettingsHubConfig;\n  /** Config de la vista Perfil (pass-through a `provideValtechProfileRoutes`). */\n  profileConfig?: ProfileViewConfig;\n  /** Config de la vista Preferencias (pass-through a `provideValtechPreferencesRoutes`). */\n  preferencesConfig?: PreferencesViewConfig;\n  /** Monta la ruta `profile`. Default `true`. */\n  includeProfile?: boolean;\n  /** Monta la ruta de preferencias. Default `true`. */\n  includePreferences?: boolean;\n  /** Path de la vista Preferencias. Default `'preferences'`. */\n  preferencesPath?: string;\n  /** Rutas extra a sumar como hijas (secciones de la app no promovidas). */\n  extraRoutes?: Routes;\n}\n\n/**\n * Helper para montar el bloque completo de Settings en una app del factory: el\n * HUB de navegación (`val-settings-hub`) en el index + las vistas promovidas\n * (Perfil, Preferencias) + las rutas propias de la app (`extraRoutes`).\n *\n * Pensado para apps nuevas (greenfield) que adoptan el set entero. showcase NO\n * lo usa hoy (preserva su `settings.routes.ts` por la semántica de sus muchas\n * secciones no promovidas — ver guía de promoción), pero el provider debe\n * existir y compilar para el resto de apps.\n *\n * @example\n * ```ts\n * // app.routes.ts\n * import { provideValtechSettingsRoutes } from 'valtech-components';\n *\n * export const routes: Routes = [\n *   {\n *     path: 'app',\n *     children: [\n *       ...provideValtechSettingsRoutes({\n *         hubConfig: { onLogout: () => auth.logoutWithConfirmation() },\n *         extraRoutes: [\n *           { path: 'security', loadComponent: () => ... },\n *         ],\n *       }),\n *     ],\n *   },\n * ];\n * ```\n */\nexport function provideValtechSettingsRoutes(opts?: ValtechSettingsRoutesOptions): Routes {\n  const basePath = opts?.basePath ?? 'settings';\n  const includeProfile = opts?.includeProfile ?? true;\n  const includePreferences = opts?.includePreferences ?? true;\n\n  return [\n    {\n      path: basePath,\n      children: [\n        {\n          path: '',\n          component: SettingsHubComponent,\n          data: { settingsHubConfig: opts?.hubConfig },\n        },\n        ...(includeProfile ? provideValtechProfileRoutes({ config: opts?.profileConfig }) : []),\n        ...(includePreferences\n          ? provideValtechPreferencesRoutes({\n              path: opts?.preferencesPath ?? 'preferences',\n              config: opts?.preferencesConfig,\n            })\n          : []),\n        ...(opts?.extraRoutes ?? []),\n      ],\n    },\n  ];\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, signal } from '@angular/core';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonToolbar } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { checkmarkCircleOutline, shieldCheckmarkOutline } from 'ionicons/icons';\n\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { ButtonMetadata, ComponentStates } from '../../types';\n\naddIcons({ shieldCheckmarkOutline, checkmarkCircleOutline });\n\n/**\n * `val-login-attempt-modal` — modal de confirmación de intento de inicio de sesión.\n *\n * Se abre cuando el usuario llega a la vista Seguridad vía\n * `?token=...` desde el email/push de \"nuevo acceso\". Muestra el dispositivo\n * detectado y dos acciones: confirmar que fue uno mismo (cierra sin hacer nada)\n * o bloquear el dispositivo (ejecuta el token de acción).\n *\n * Inputs vía `componentProps` del ModalService. Sin `@Output` (no funcionan con\n * `modalController.create()`) — usa callback `onBlock` y `_modalRef.dismiss`.\n * Recibe los labels ya traducidos (agnóstico a i18n).\n *\n * Header canónico (Regla #5): sin `ion-title`, botón Cerrar texto en `slot=end`,\n * título en el body con `val-display`.\n */\n@Component({\n  selector: 'val-login-attempt-modal',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonContent,\n    IonHeader,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    IonIcon,\n    DisplayComponent,\n    TextComponent,\n    ButtonComponent,\n  ],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ closeLabel }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <val-display [props]=\"{ content: title, size: 'small', color: 'dark' }\" />\n      <div class=\"attempt\">\n        <div class=\"attempt__hero\">\n          <ion-icon name=\"shield-checkmark-outline\" aria-hidden=\"true\" />\n        </div>\n\n        <val-text\n          [props]=\"{\n            content: body,\n            size: 'medium',\n            color: 'dark',\n            bold: false,\n          }\"\n        />\n\n        <div class=\"attempt__device\">\n          <ion-icon [name]=\"deviceIcon\" aria-hidden=\"true\" />\n          <div class=\"attempt__device-body\">\n            <val-text\n              [props]=\"{\n                content: deviceLabel,\n                size: 'medium',\n                color: 'dark',\n                bold: true,\n              }\"\n            />\n            @if (metaLabel) {\n              <val-text\n                [props]=\"{\n                  content: metaLabel,\n                  size: 'small',\n                  color: 'medium',\n                  bold: false,\n                }\"\n              />\n            }\n          </div>\n        </div>\n\n        @if (done()) {\n          <div class=\"attempt__done\">\n            <ion-icon name=\"checkmark-circle-outline\" aria-hidden=\"true\" />\n            <val-text\n              [props]=\"{\n                content: doneLabel,\n                size: 'small',\n                color: 'medium',\n                bold: false,\n              }\"\n            />\n          </div>\n        }\n      </div>\n    </ion-content>\n\n    @if (!done()) {\n      <div class=\"attempt__actions\">\n        <val-button [props]=\"mineBtn\" (click)=\"confirmMine()\" />\n        <val-button [props]=\"blockBtn\" (click)=\"confirmBlock()\" />\n      </div>\n    } @else {\n      <div class=\"attempt__actions\">\n        <val-button [props]=\"closeBtn\" (click)=\"close()\" />\n      </div>\n    }\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n      }\n      .attempt {\n        display: flex;\n        flex-direction: column;\n        gap: 18px;\n        align-items: flex-start;\n      }\n      .attempt__hero {\n        width: 56px;\n        height: 56px;\n        border-radius: 16px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        background: rgba(112, 38, 223, 0.1);\n      }\n      .attempt__hero ion-icon {\n        font-size: 30px;\n        color: var(--ion-color-primary, #7026df);\n      }\n      .attempt__device {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        width: 100%;\n        padding: 14px 16px;\n        border-radius: 12px;\n        background: var(--ion-color-light, #f4f5f8);\n        border: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      .attempt__device ion-icon {\n        font-size: 26px;\n        color: var(--ion-color-dark);\n        flex-shrink: 0;\n      }\n      .attempt__device-body {\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n        min-width: 0;\n      }\n      .attempt__done {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n      }\n      .attempt__done ion-icon {\n        font-size: 20px;\n        color: var(--ion-color-success);\n        flex-shrink: 0;\n      }\n      .attempt__actions {\n        display: flex;\n        gap: 10px;\n        padding: 12px 16px calc(12px + env(safe-area-inset-bottom, 0px));\n        border-top: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      .attempt__actions val-button {\n        flex: 1;\n      }\n    `,\n  ],\n})\nexport class LoginAttemptModalComponent {\n  /** Título del modal (i18n ya resuelto). */\n  @Input() title = '';\n  /** Texto explicativo. */\n  @Input() body = '';\n  /** Descripción del dispositivo (navegador · OS · ubicación). */\n  @Input() deviceLabel = '';\n  /** Metadata secundaria (fecha, IP). Opcional. */\n  @Input() metaLabel = '';\n  /** Mensaje mostrado tras bloquear. */\n  @Input() doneLabel = '';\n  /** Labels de botones. */\n  @Input() mineLabel = '';\n  @Input() blockLabel = '';\n  @Input() closeLabel = '';\n  /** `true` si el dispositivo es móvil — cambia el icono. */\n  @Input() isMobile = false;\n\n  /**\n   * Callback que ejecuta el bloqueo (executeAction con el token) contra el\n   * backend. Lo provee el parent vía `componentProps`. Debe lanzar si falla.\n   */\n  @Input() onBlock?: () => Promise<void>;\n\n  /** Inyectado por `ModalService.open` — referencia para cerrar. */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  /** `true` tras bloquear con éxito — cambia el modal a estado \"hecho\". */\n  protected readonly done = signal(false);\n  private working = false;\n\n  get deviceIcon(): string {\n    return this.isMobile ? 'phone-portrait-outline' : 'laptop-outline';\n  }\n\n  /** \"Sí, fui yo\" — cierra sin acción. El dispositivo ya está activo. */\n  confirmMine(): void {\n    this._modalRef?.dismiss(undefined, 'mine');\n  }\n\n  /** \"No fui yo\" — ejecuta el bloqueo y pasa a estado done. */\n  async confirmBlock(): Promise<void> {\n    if (this.working || !this.onBlock) return;\n    this.working = true;\n    try {\n      await this.onBlock();\n      this.done.set(true);\n    } catch {\n      // El parent muestra el toast de error; cerramos el modal.\n      this._modalRef?.dismiss(undefined, 'error');\n    } finally {\n      this.working = false;\n    }\n  }\n\n  close(): void {\n    this._modalRef?.dismiss(undefined, this.done() ? 'blocked' : 'close');\n  }\n\n  get mineBtn(): Partial<ButtonMetadata> {\n    return {\n      text: this.mineLabel,\n      color: 'medium',\n      fill: 'outline',\n      size: 'default',\n      type: 'button',\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  get blockBtn(): Partial<ButtonMetadata> {\n    return {\n      text: this.blockLabel,\n      color: 'danger',\n      fill: 'solid',\n      size: 'default',\n      type: 'button',\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  get closeBtn(): Partial<ButtonMetadata> {\n    return {\n      text: this.closeLabel,\n      color: 'dark',\n      fill: 'solid',\n      size: 'default',\n      type: 'button',\n      state: ComponentStates.ENABLED,\n    };\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, signal } from '@angular/core';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonToolbar } from '@ionic/angular/standalone';\n\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { ButtonMetadata, ComponentStates } from '../../types';\n\nimport { SessionInfo } from '../../../services/auth/types';\n\n/**\n * `val-session-list-modal` — modal de \"Ver todas las sesiones activas\". Organism\n * compartido entre la vista Seguridad y la vista Cuenta del factory.\n *\n * Render reusa el mismo markup de la sección de sesiones inline (mismas clases\n * CSS) pero sin truncar la lista.\n *\n * Inputs (vienen de `componentProps` del ModalService):\n *  - `sessions` — snapshot inicial (mostrado al abrir)\n *  - `thisLabel` / `revokeLabel` — i18n strings ya resueltas\n *  - `onRevoke` — callback async que el parent ejecuta contra el backend; debe\n *    retornar la lista actualizada para que el modal refresque en sitio.\n *\n * `@Output` events NO funcionan con `modalController.create()` — por eso usamos\n * callback pasado por props + `_modalRef` para dismiss desde dentro.\n *\n * Header canónico (Regla #5): sin `ion-title`, botón Cerrar texto en `slot=end`,\n * título en el body con `val-display`.\n */\n@Component({\n  selector: 'val-session-list-modal',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonContent,\n    IonHeader,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    IonIcon,\n    DisplayComponent,\n    TextComponent,\n    ButtonComponent,\n  ],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ closeLabel }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <val-display [props]=\"{ content: title, size: 'small', color: 'dark' }\" />\n      <ul class=\"sessions\">\n        @for (s of sessionsLocal(); track s.sessionId) {\n          <li class=\"session\" [class.session--current]=\"s.isCurrent\">\n            <ion-icon class=\"session__icon\" [name]=\"deviceIcon(s)\" aria-hidden=\"true\" />\n            <div class=\"session__body\">\n              <val-text\n                [props]=\"{\n                  content: s.deviceInfo || s.deviceId || '—',\n                  size: 'medium',\n                  color: 'dark',\n                  bold: true,\n                }\"\n              />\n              <val-text\n                [props]=\"{\n                  content: formatMeta(s),\n                  size: 'small',\n                  color: 'medium',\n                  bold: false,\n                }\"\n              />\n            </div>\n            <div class=\"session__end\">\n              @if (s.isCurrent) {\n                <span class=\"session__badge\">{{ thisLabel }}</span>\n              } @else {\n                <val-button [props]=\"revokeBtn\" (click)=\"handleRevoke(s.sessionId)\" />\n              }\n            </div>\n          </li>\n        }\n      </ul>\n    </ion-content>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        height: 100%;\n      }\n\n      .sessions {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n\n      .session {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 14px 16px;\n        border-radius: 14px;\n        background: var(--ion-color-light, rgba(0, 0, 0, 0.04));\n        border: 1px solid transparent;\n      }\n\n      .session--current {\n        background: rgba(45, 211, 111, 0.1);\n        border-color: rgba(45, 211, 111, 0.3);\n      }\n\n      .session__icon {\n        font-size: 26px;\n        color: var(--ion-color-dark, #1a1a1a);\n        flex-shrink: 0;\n      }\n\n      .session--current .session__icon {\n        color: var(--ion-color-success-shade, #28ba62);\n      }\n\n      .session__body {\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n        min-width: 0;\n        flex: 1;\n      }\n\n      .session__end {\n        flex-shrink: 0;\n      }\n\n      .session__badge {\n        display: inline-block;\n        padding: 4px 10px;\n        font-size: 11px;\n        font-weight: 700;\n        letter-spacing: 0.02em;\n        text-transform: uppercase;\n        color: var(--ion-color-success-shade, #28ba62);\n        background: rgba(45, 211, 111, 0.18);\n        border-radius: 999px;\n      }\n    `,\n  ],\n})\nexport class SessionListModalComponent {\n  /** Snapshot inicial — el modal mantiene su propia copia y la refresca tras revoke. */\n  @Input() set sessions(value: SessionInfo[]) {\n    this.sessionsLocal.set([...value]);\n  }\n\n  /** Título del modal (ya traducido). */\n  @Input() title = '';\n\n  /** Label del botón cerrar del header (ya traducido). */\n  @Input() closeLabel = '';\n\n  /** Label \"Esta sesión\" (en idioma activo). */\n  @Input() thisLabel = '';\n\n  /** Label del botón revoke individual. */\n  @Input() revokeLabel = '';\n\n  /**\n   * Callback que ejecuta el revoke contra el backend y retorna la lista\n   * actualizada. Pasado por `componentProps` del ModalService.\n   */\n  @Input() onRevoke?: (sessionId: string) => Promise<SessionInfo[]>;\n\n  /**\n   * Inyectado por `ModalService.open` — referencia para cerrar desde dentro.\n   * Cualquier componente abierto vía el service recibe este objeto en\n   * `componentProps`.\n   */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  close(): void {\n    this._modalRef?.dismiss(undefined, 'close');\n  }\n\n  /** Lista local mutable — refrescada después de cada revoke confirmado. */\n  protected readonly sessionsLocal = signal<SessionInfo[]>([]);\n\n  async handleRevoke(sessionId: string): Promise<void> {\n    if (!this.onRevoke) return;\n    try {\n      const updated = await this.onRevoke(sessionId);\n      this.sessionsLocal.set([...updated]);\n    } catch {\n      // El parent muestra el toast de error; modal no necesita feedback extra.\n    }\n  }\n\n  get revokeBtn(): Partial<ButtonMetadata> {\n    return {\n      text: this.revokeLabel,\n      color: 'dark',\n      fill: 'clear',\n      size: 'small',\n      type: 'button',\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  deviceIcon(s: SessionInfo): string {\n    const ua = (s.deviceInfo || '').toLowerCase();\n    const isMobile = /iphone|ipad|ipod|android|mobile/.test(ua);\n    return isMobile ? 'phone-portrait-outline' : 'laptop-outline';\n  }\n\n  formatMeta(s: SessionInfo): string {\n    const parts: string[] = [];\n    if (s.location) parts.push(s.location);\n    else if (s.ip) parts.push(s.ip);\n    if (s.createdAt) parts.push(new Date(s.createdAt).toLocaleString());\n    return parts.join(' · ');\n  }\n}\n","/**\n * Standard cross-app site links (env-aware)\n *\n * En el factory MyValtech cada producto satélite (showcase, sigify, …) enlaza a\n * `web` —la landing de marca— para soporte, contacto y contenido legal. `web`\n * es el dueño canónico de esas rutas. Este módulo centraliza:\n *\n *  1. El mapa ambiente → base URL de `web` (`VALTECH_WEB_BASE_URLS`).\n *  2. El catálogo de paths estándar que viven en `web` (`VALTECH_SITE_PATHS`).\n *\n * El ambiente se decide en BUILD TIME (campo `valtechEnv` en el `environment*.ts`\n * de cada app), igual que `apiUrl`. Es el mecanismo más confiable: detectar por\n * hostname en runtime se rompe con dominios custom / `web.app` / variantes de\n * localhost.\n *\n * La resolución real (join baseUrl + path, abrir en tab nueva, `?lang=`) la hace\n * `LegalLinkService`; este módulo solo le entrega el `baseUrl` correcto por env.\n *\n * @see provideValtechSite — wiring de una sola línea para apps satélite.\n */\n\n/** Ambientes del factory. Coincide con los `environment*.ts` de cada app. */\nexport type ValtechEnv = 'local' | 'dev' | 'prod';\n\n/**\n * Base URL de `web` (landing de marca) por ambiente.\n *\n * - `local` → `ng serve` de `web` (puerto 8100).\n * - `dev`   → proyecto Firebase `myvaltech-dev`.\n * - `prod`  → dominio custom de producción.\n *\n * Sin trailing slash (lo asume `LegalLinkService`).\n */\nexport const VALTECH_WEB_BASE_URLS: Record<ValtechEnv, string> = {\n  local: 'http://localhost:8100',\n  dev: 'https://myvaltech-dev.web.app',\n  prod: 'https://myvaltech.com',\n};\n\n/**\n * Resuelve la base URL de `web` para un ambiente.\n *\n * Fallback a `prod` cuando el env es desconocido o falta: ante la duda, apuntar\n * a producción es lo seguro (nunca enlaza a un host local/dev inexistente).\n */\nexport function resolveWebBaseUrl(env?: ValtechEnv | string | null): string {\n  if (env && env in VALTECH_WEB_BASE_URLS) {\n    return VALTECH_WEB_BASE_URLS[env as ValtechEnv];\n  }\n  return VALTECH_WEB_BASE_URLS.prod;\n}\n\n/**\n * Catálogo de paths estándar que viven en `web`. Las apps resuelven estos\n * contra la base URL del ambiente vía `LegalLinkService.resolve(path)`.\n *\n * Mantener alineado con las rutas reales de `web/src/app/app.routes.ts` y con\n * `VALTECH_COMPANY_LINKS` (footer).\n */\nexport const VALTECH_SITE_PATHS = {\n  home: '/',\n  support: '/contact',\n  contact: '/contact',\n  faq: '/faq',\n  about: '/about',\n  terms: '/legal/terms',\n  privacy: '/legal/privacy',\n  cookies: '/legal/cookies',\n  legalNotice: '/legal/legal-notice',\n} as const;\n\n/** Clave de un link estándar del sitio (`'home' | 'support' | …`). */\nexport type ValtechSitePathKey = keyof typeof VALTECH_SITE_PATHS;\n","import { InjectionToken, Injectable, Provider, inject } from '@angular/core';\nimport { ValtechEnv, resolveWebBaseUrl } from '../../config/site-links.config';\n\n/**\n * Config for cross-app legal/site link resolution.\n *\n * Used by satellite apps (showcase, sigify, admin-portal, …) to point their legal\n * and site links (terms, privacy, about, contact, …) to the main marketing site,\n * which owns the canonical legal content. The main site itself does NOT call\n * `provideValtechLegal` — its links stay relative.\n */\nexport interface ValtechLegalConfig {\n  /**\n   * Absolute base URL of the main site (no trailing slash).\n   * @example 'https://myvaltech.com'\n   */\n  baseUrl?: string;\n\n  /** Open resolved external links in a new tab. Defaults to `true` when `baseUrl` is set. */\n  openInNewTab?: boolean;\n}\n\nexport const VALTECH_LEGAL_CONFIG = new InjectionToken<ValtechLegalConfig>('VALTECH_LEGAL_CONFIG');\n\n/**\n * Resolves legal/site paths against a configurable main-site base URL.\n *\n * - **Main site mode**: no `provideValtechLegal` called → `resolve('/legal/terms')` returns `/legal/terms` (relative).\n * - **Satellite mode**: `provideValtechLegal({ baseUrl: 'https://myvaltech.com' })` → `resolve('/legal/terms')` returns `'https://myvaltech.com/legal/terms'` and `isExternal('/legal/terms')` returns `true`.\n *\n * Absolute URLs passed in are returned unchanged (no double-prefix).\n */\n@Injectable({ providedIn: 'root' })\nexport class LegalLinkService {\n  private readonly config = inject(VALTECH_LEGAL_CONFIG, { optional: true }) ?? {};\n\n  /** Effective base URL (null if running as main site). */\n  get baseUrl(): string | null {\n    return this.config.baseUrl?.replace(/\\/$/, '') ?? null;\n  }\n\n  /** Whether resolved external links should open in a new tab. */\n  get openInNewTab(): boolean {\n    return this.config.openInNewTab ?? Boolean(this.config.baseUrl);\n  }\n\n  /**\n   * Returns the URL to use for a given internal path. Absolute URLs pass through.\n   *\n   * When `locale` is provided AND the resolved URL would be cross-origin, appends\n   * `?lang={locale}` so the main site can render the legal doc in the user's\n   * active language (instead of its default). Locale is omitted for same-origin\n   * resolves since the main site reads locale from its own `LocaleService`.\n   *\n   * @example\n   * resolve('/legal/terms')\n   *   // main site:  '/legal/terms'\n   *   // satellite:  'https://myvaltech.com/legal/terms'\n   *\n   * resolve('/legal/terms', { locale: 'pt' })\n   *   // main site:  '/legal/terms'  (locale stays implicit)\n   *   // satellite:  'https://myvaltech.com/legal/terms?lang=pt'\n   *\n   * resolve('https://x.com/y') // unchanged\n   */\n  resolve(path: string, options?: { locale?: string }): string {\n    if (!path) return path;\n    if (/^https?:\\/\\//i.test(path)) return path;\n    const base = this.baseUrl;\n    if (!base) return path;\n    const url = `${base}${path.startsWith('/') ? '' : '/'}${path}`;\n    if (options?.locale) {\n      const sep = url.includes('?') ? '&' : '?';\n      return `${url}${sep}lang=${encodeURIComponent(options.locale)}`;\n    }\n    return url;\n  }\n\n  /** `true` if the path would be resolved to a cross-origin URL. */\n  isExternal(path: string): boolean {\n    if (/^https?:\\/\\//i.test(path)) return true;\n    return this.baseUrl !== null;\n  }\n}\n\n/**\n * Wires `LegalLinkService` for satellite apps. Omit in the main site (the one\n * that hosts the canonical /legal/* routes) so links stay relative.\n *\n * @example\n * // main.ts of showcase / sigify / etc.\n * provideValtechLegal({\n *   baseUrl: 'https://myvaltech.com',\n *   openInNewTab: true,\n * }),\n */\nexport function provideValtechLegal(config: ValtechLegalConfig): Provider {\n  return { provide: VALTECH_LEGAL_CONFIG, useValue: config };\n}\n\n/**\n * Wiring de una sola línea para que una app satélite apunte sus links de sitio\n * (legal, soporte, contacto, …) a `web` —la landing de marca— en el ambiente\n * correcto. Resuelve el `baseUrl` desde `VALTECH_WEB_BASE_URLS` según el `env`\n * baked en build-time (`environment.valtechEnv`) y delega en `provideValtechLegal`.\n *\n * Ambiente desconocido/ausente → fallback a `prod` (ver `resolveWebBaseUrl`).\n * El main site (`web`) NO llama esto — sus links quedan relativos.\n *\n * @example\n * // main.ts de showcase / sigify / …\n * import { environment } from './environments/environment';\n * provideValtechSite(environment.valtechEnv),  // 'local' | 'dev' | 'prod'\n *\n * @see resolveWebBaseUrl\n * @see VALTECH_SITE_PATHS — catálogo de paths estándar que viven en `web`.\n */\nexport function provideValtechSite(\n  env?: ValtechEnv | string | null,\n  options?: { openInNewTab?: boolean }\n): Provider {\n  return provideValtechLegal({\n    baseUrl: resolveWebBaseUrl(env),\n    openInNewTab: options?.openInNewTab ?? true,\n  });\n}\n","import { Type } from '@angular/core';\nimport { Color } from '@ionic/core';\nimport { ButtonMetadata } from '../../components/types';\n\n/**\n * Modal size preset.\n */\nexport type ModalSize = 'small' | 'medium' | 'large' | 'full' | 'auto';\n\n/**\n * Modal breakpoint configuration for sheet modals.\n */\nexport interface ModalBreakpoint {\n  /** Initial breakpoint (0-1) */\n  initialBreakpoint?: number;\n  /** Available breakpoints */\n  breakpoints?: number[];\n  /** Can dismiss by dragging below threshold */\n  canDismiss?: boolean | (() => boolean | Promise<boolean>);\n  /** Handle element */\n  handleBehavior?: 'cycle' | 'none';\n  /** Show handle */\n  showHandle?: boolean;\n}\n\n/**\n * Modal header configuration.\n */\nexport interface ModalHeader {\n  /** Title text */\n  title?: string;\n  /** Subtitle text */\n  subtitle?: string;\n  /** Show close button */\n  showCloseButton?: boolean;\n  /** Close button icon */\n  closeIcon?: string;\n  /** Header color */\n  color?: Color;\n  /** Custom CSS class */\n  cssClass?: string;\n}\n\n/**\n * Modal footer configuration.\n */\nexport interface ModalFooter {\n  /** Footer buttons */\n  buttons?: ModalButton[];\n  /** Footer alignment */\n  alignment?: 'start' | 'center' | 'end' | 'space-between';\n  /** Custom CSS class */\n  cssClass?: string;\n}\n\n/**\n * Modal button configuration.\n */\nexport interface ModalButton {\n  /** Button text */\n  text: string;\n  /** Button role */\n  role?: 'cancel' | 'confirm' | 'destructive' | string;\n  /** Button color */\n  color?: Color;\n  /** Button fill */\n  fill?: 'clear' | 'outline' | 'solid';\n  /** Button size */\n  size?: 'small' | 'default' | 'large';\n  /** Custom CSS class */\n  cssClass?: string;\n  /** Disabled state */\n  disabled?: boolean;\n  /** Loading state */\n  loading?: boolean;\n  /** Handler function */\n  handler?: (data?: any) => void | boolean | Promise<void | boolean>;\n}\n\n/**\n * Metadata for creating a modal with a component.\n */\nexport interface ModalMetadata<T = any> {\n  /** Component to render in modal */\n  component: Type<T>;\n  /** Component inputs/props */\n  componentProps?: Partial<T>;\n  /** Unique identifier */\n  id?: string;\n  /** Modal header configuration */\n  header?: ModalHeader;\n  /** Modal footer configuration */\n  footer?: ModalFooter;\n  /** Modal size */\n  size?: ModalSize;\n  /** Custom width (overrides size) */\n  width?: string;\n  /** Custom height (overrides size) */\n  height?: string;\n  /** Show backdrop */\n  showBackdrop?: boolean;\n  /** Backdrop dismiss */\n  backdropDismiss?: boolean;\n  /** Enable keyboard close (ESC) */\n  keyboardClose?: boolean;\n  /** CSS class for modal */\n  cssClass?: string;\n  /** Animation mode */\n  mode?: 'ios' | 'md';\n  /** Enter animation */\n  enterAnimation?: any;\n  /** Leave animation */\n  leaveAnimation?: any;\n  /** Sheet modal breakpoints */\n  breakpoints?: ModalBreakpoint;\n  /** Presenting element for card modal */\n  presentingElement?: HTMLElement;\n  /** Can dismiss callback */\n  canDismiss?: boolean | (() => boolean | Promise<boolean>);\n  /** Animated */\n  animated?: boolean;\n}\n\n/**\n * Metadata for creating a simple content modal.\n */\nexport interface SimpleModalMetadata {\n  /** Modal title */\n  title: string;\n  /** Modal content (HTML or plain text) */\n  content: string;\n  /** Modal size */\n  size?: ModalSize;\n  /** Footer buttons */\n  buttons?: ModalButton[];\n  /** Show close button in header */\n  showCloseButton?: boolean;\n  /** Backdrop dismiss */\n  backdropDismiss?: boolean;\n  /** CSS class */\n  cssClass?: string;\n}\n\n/**\n * Result from modal dismissal.\n */\nexport interface ModalResult<T = any> {\n  /** Role of the dismissal (button role or 'backdrop') */\n  role?: string;\n  /** Data returned from modal */\n  data?: T;\n}\n\n/**\n * Default modal sizes.\n */\nexport const MODAL_SIZES: Record<ModalSize, { width?: string; height?: string }> = {\n  small: { width: '320px', height: '220px' },\n  medium: { width: '500px', height: '400px' },\n  large: { width: '800px', height: '80vh' },\n  full: { width: '100%', height: '100%' },\n  auto: { width: 'auto', height: '50vh' },\n};\n\n/**\n * Default modal buttons.\n */\nexport const DEFAULT_MODAL_CONFIRM_BUTTON: ModalButton = {\n  text: 'Confirm',\n  role: 'confirm',\n  color: 'primary',\n  fill: 'solid',\n};\n\nexport const DEFAULT_MODAL_CANCEL_BUTTON: ModalButton = {\n  text: 'Cancel',\n  role: 'cancel',\n  color: 'medium',\n  fill: 'clear',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { IonButton, IonFooter, IonSpinner, IonToolbar } from '@ionic/angular/standalone';\nimport { ModalShellComponent } from '../../components/molecules/modal-shell/modal-shell.component';\nimport { ModalButton } from './types';\n\n/**\n * Internal component for simple content modals.\n * Used by ModalService.openSimple()\n *\n * Header + título + close button delegados a `val-modal-shell` (estándar\n * canónico — ver Regla #5 en `frontend/CLAUDE.md`). El cuerpo (innerHTML) +\n * footer con botones quedan locales.\n */\n@Component({\n  selector: 'val-simple-modal-content',\n  standalone: true,\n  imports: [CommonModule, IonToolbar, IonButton, IonFooter, IonSpinner, ModalShellComponent],\n  template: `\n    <val-modal-shell [title]=\"title\" [showClose]=\"showCloseButton\" (close)=\"onDismiss('close')\">\n      <div [innerHTML]=\"content\"></div>\n    </val-modal-shell>\n\n    @if (buttons && buttons.length > 0) {\n      <ion-footer>\n        <ion-toolbar>\n          <div class=\"button-container\">\n            @for (button of buttons; track button.text) {\n              <ion-button\n                [color]=\"button.color || 'medium'\"\n                [fill]=\"button.fill || 'solid'\"\n                [size]=\"button.size || 'default'\"\n                [disabled]=\"button.disabled || button.loading\"\n                [class]=\"button.cssClass\"\n                (click)=\"onButtonClick(button)\"\n              >\n                @if (button.loading) {\n                  <ion-spinner name=\"circular\"></ion-spinner>\n                } @else {\n                  {{ button.text }}\n                }\n              </ion-button>\n            }\n          </div>\n        </ion-toolbar>\n      </ion-footer>\n    }\n  `,\n  styles: [\n    `\n      :host {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        min-height: 0;\n      }\n\n      ion-footer {\n        flex-shrink: 0;\n      }\n\n      .button-container {\n        display: flex;\n        justify-content: flex-end;\n        gap: 8px;\n        padding: 8px 0;\n      }\n\n      ion-footer ion-toolbar {\n        --padding-start: 16px;\n        --padding-end: 16px;\n      }\n\n      /* List styling for innerHTML content */\n      :host ::ng-deep ul,\n      :host ::ng-deep ol {\n        padding-left: 20px;\n        margin: 8px 0;\n      }\n\n      :host ::ng-deep li {\n        margin: 4px 0;\n      }\n\n      :host ::ng-deep p {\n        margin: 8px 0;\n      }\n    `,\n  ],\n})\nexport class SimpleModalContentComponent {\n  @Input() title: string = '';\n  @Input() content: string = '';\n  @Input() buttons: ModalButton[] = [];\n  @Input() showCloseButton: boolean = true;\n\n  // Injected by ModalService\n  @Input() _modalRef: { dismiss: (data?: any, role?: string) => Promise<boolean> };\n\n  async onButtonClick(button: ModalButton): Promise<void> {\n    if (button.handler) {\n      const result = await button.handler();\n      // If handler returns false, don't dismiss\n      if (result === false) {\n        return;\n      }\n    }\n\n    this._modalRef?.dismiss(undefined, button.role || 'confirm');\n  }\n\n  onDismiss(role: string): void {\n    this._modalRef?.dismiss(undefined, role);\n  }\n}\n","import { Injectable, Type } from '@angular/core';\nimport { ModalController } from '@ionic/angular/standalone';\nimport {\n  ModalMetadata,\n  SimpleModalMetadata,\n  ModalResult,\n  ModalButton,\n  MODAL_SIZES,\n  DEFAULT_MODAL_CONFIRM_BUTTON,\n  DEFAULT_MODAL_CANCEL_BUTTON,\n} from './types';\nimport { SimpleModalContentComponent } from './simple-modal-content.component';\n\n/**\n * ModalService\n *\n * A service for creating and managing modals with various configurations.\n *\n * @example Basic component modal\n * ```typescript\n * const result = await modalService.open({\n *   component: MyFormComponent,\n *   componentProps: { userId: 123 },\n *   header: { title: 'Edit User', showCloseButton: true },\n *   size: 'medium'\n * });\n *\n * if (result.role === 'confirm') {\n *   console.log('Saved:', result.data);\n * }\n * ```\n *\n * @example Simple content modal\n * ```typescript\n * await modalService.openSimple({\n *   title: 'Terms of Service',\n *   content: '<p>Terms content here...</p>',\n *   size: 'large',\n *   showCloseButton: true\n * });\n * ```\n *\n * @example Sheet modal (mobile)\n * ```typescript\n * const result = await modalService.openSheet({\n *   component: FilterComponent,\n *   breakpoints: {\n *     initialBreakpoint: 0.5,\n *     breakpoints: [0, 0.5, 1],\n *     showHandle: true\n *   }\n * });\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ModalService {\n  constructor(private modalController: ModalController) {}\n\n  /**\n   * Opens a modal with a component.\n   * @param options - Modal configuration\n   * @returns Promise resolving to the modal result\n   */\n  async open<T = any, R = any>(options: ModalMetadata<T>): Promise<ModalResult<R>> {\n    // A sheet modal (breakpoints present) gets its height from the breakpoints\n    // and must span the full viewport width. Applying a size preset's\n    // `--width`/`--height` here collapses the sheet (e.g. `auto` → shrink to\n    // content) or fights the breakpoint height. So when it's a sheet we skip\n    // the size preset entirely.\n    const isSheet = !!options.breakpoints?.breakpoints?.length;\n    const size = isSheet ? undefined : MODAL_SIZES[options.size || 'medium'];\n    const cssClasses = this.buildCssClasses(options);\n\n    const modal = await this.modalController.create({\n      component: options.component,\n      componentProps: {\n        ...options.componentProps,\n        // Pass modal reference for dismiss from within component\n        _modalRef: {\n          dismiss: (data?: any, role?: string) => modal.dismiss(data, role),\n        },\n      },\n      id: options.id,\n      showBackdrop: options.showBackdrop ?? true,\n      backdropDismiss: options.backdropDismiss ?? true,\n      keyboardClose: options.keyboardClose ?? true,\n      cssClass: cssClasses,\n      mode: options.mode,\n      animated: options.animated ?? true,\n      canDismiss: this.normalizeCanDismiss(options.canDismiss ?? true),\n      presentingElement: options.presentingElement,\n      // Sheet modal options\n      initialBreakpoint: options.breakpoints?.initialBreakpoint,\n      breakpoints: options.breakpoints?.breakpoints,\n      handle: options.breakpoints?.showHandle,\n      handleBehavior: options.breakpoints?.handleBehavior,\n    });\n\n    // Apply custom size styles. Skipped for sheet modals — their dimensions\n    // come from the breakpoints (Ionic spans the sheet full-width and uses the\n    // breakpoint values for height).\n    if (!isSheet && (options.width || options.height || size)) {\n      const modalEl = modal as HTMLIonModalElement;\n      modalEl.style.setProperty('--width', options.width || size?.width || 'auto');\n      modalEl.style.setProperty('--height', options.height || size?.height || '50vh');\n    }\n\n    await modal.present();\n    const { data, role } = await modal.onDidDismiss();\n\n    return { data, role };\n  }\n\n  /**\n   * Opens a simple content modal without a custom component.\n   * Uses Ionic's alert-like styling but with modal capabilities.\n   * @param options - Simple modal configuration\n   * @returns Promise resolving to the modal result\n   */\n  async openSimple(options: SimpleModalMetadata): Promise<ModalResult> {\n    return this.open({\n      component: SimpleModalContentComponent,\n      componentProps: {\n        title: options.title,\n        content: options.content,\n        buttons: options.buttons || [DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON],\n        showCloseButton: options.showCloseButton ?? true,\n      },\n      size: options.size || 'medium',\n      backdropDismiss: options.backdropDismiss ?? true,\n      cssClass: ['simple-modal', options.cssClass].filter(Boolean).join(' '),\n    });\n  }\n\n  /**\n   * Opens a confirmation modal.\n   * @param title - Modal title\n   * @param message - Modal message\n   * @param confirmButton - Confirm button config (optional)\n   * @param cancelButton - Cancel button config (optional)\n   * @returns Promise resolving to true if confirmed\n   */\n  async confirm(\n    title: string,\n    message: string,\n    confirmButton?: Partial<ModalButton>,\n    cancelButton?: Partial<ModalButton>\n  ): Promise<boolean> {\n    const result = await this.openSimple({\n      title,\n      content: message,\n      size: 'small',\n      showCloseButton: false,\n      backdropDismiss: false,\n      buttons: [\n        { ...DEFAULT_MODAL_CANCEL_BUTTON, ...cancelButton },\n        { ...DEFAULT_MODAL_CONFIRM_BUTTON, ...confirmButton },\n      ],\n    });\n\n    return result.role === 'confirm';\n  }\n\n  /**\n   * Opens a sheet modal (iOS-style bottom sheet).\n   * @param options - Modal configuration with sheet-specific options\n   * @returns Promise resolving to the modal result\n   */\n  async openSheet<T = any, R = any>(\n    options: Omit<ModalMetadata<T>, 'breakpoints'> & {\n      initialBreakpoint?: number;\n      breakpoints?: number[];\n      showHandle?: boolean;\n    }\n  ): Promise<ModalResult<R>> {\n    return this.open({\n      ...options,\n      breakpoints: {\n        initialBreakpoint: options.initialBreakpoint ?? 0.5,\n        breakpoints: options.breakpoints ?? [0, 0.5, 1],\n        showHandle: options.showHandle ?? true,\n      },\n      cssClass: ['sheet-modal', options.cssClass].filter(Boolean).join(' '),\n    });\n  }\n\n  /**\n   * Opens a fullscreen modal.\n   * @param options - Modal configuration\n   * @returns Promise resolving to the modal result\n   */\n  async openFullscreen<T = any, R = any>(options: ModalMetadata<T>): Promise<ModalResult<R>> {\n    return this.open({\n      ...options,\n      size: 'full',\n      cssClass: ['fullscreen-modal', options.cssClass].filter(Boolean).join(' '),\n    });\n  }\n\n  /**\n   * Dismisses the top-most modal.\n   * @param data - Optional data to return\n   * @param role - Optional role\n   */\n  async dismiss(data?: any, role?: string): Promise<boolean> {\n    return this.modalController.dismiss(data, role);\n  }\n\n  /**\n   * Gets the top-most modal.\n   */\n  async getTop(): Promise<HTMLIonModalElement | undefined> {\n    return this.modalController.getTop();\n  }\n\n  private normalizeCanDismiss(\n    canDismiss: boolean | (() => boolean | Promise<boolean>)\n  ): boolean | ((data?: any, role?: string) => Promise<boolean>) {\n    if (typeof canDismiss === 'boolean') {\n      return canDismiss;\n    }\n    // Wrap the function to ensure it returns a Promise\n    return async (data?: any, role?: string) => {\n      const result = canDismiss();\n      return Promise.resolve(result);\n    };\n  }\n\n  private buildCssClasses(options: ModalMetadata): string {\n    const classes: string[] = ['val-modal'];\n\n    if (options.size) {\n      classes.push(`modal-${options.size}`);\n    }\n\n    if (options.header) {\n      classes.push('modal-with-header');\n    }\n\n    if (options.footer) {\n      classes.push('modal-with-footer');\n    }\n\n    if (options.cssClass) {\n      classes.push(options.cssClass);\n    }\n\n    return classes.join(' ');\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-security-view`. Auto-registrados en el\n * constructor del componente si el consumer no proveyó el namespace\n * (`Settings.Security` por default). Garantiza que nunca haya una key faltante\n * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md\n * sobre el storm de CD con `val-debug-console`). El consumer puede override\n * registrando el mismo namespace antes de que el componente monte.\n *\n * SOLO incluye las keys que la vista realmente usa.\n */\nexport const SECURITY_VIEW_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'Seguridad',\n    pageDescription: 'Contraseñas, MFA y sesiones activas',\n\n    blocked: 'Dispositivo bloqueado',\n    tokenActionFailed: 'El enlace del email no es válido o expiró.',\n\n    loginAttemptTitle: 'Confirmar inicio de sesión',\n    loginAttemptBody:\n      'Detectamos un inicio de sesión en este dispositivo. Si fuiste tú, no tienes que hacer nada. Si no lo reconoces, bloquéalo.',\n    loginAttemptMine: 'Sí, fui yo',\n    loginAttemptBlock: 'No fui yo — bloquear',\n    loginAttemptClose: 'Cerrar',\n    loginAttemptDone: 'Dispositivo bloqueado. Restablece tu contraseña para reforzar tu cuenta.',\n    loginAttemptUnknownDevice: 'Dispositivo desconocido',\n\n    sessionsTitle: 'Sesiones activas',\n    sessionsTitleCount: 'Sesiones activas ({n})',\n    sessionsLoading: 'Cargando sesiones…',\n    sessionsEmpty: 'No hay sesiones activas.',\n    sessionsThis: 'Esta sesión',\n    sessionsRevoke: 'Cerrar',\n    sessionsRevokeAll: 'Cerrar todas las demás',\n    sessionsViewAll: 'Ver todas',\n    sessionsModalTitle: 'Todas las sesiones activas',\n    sessionsRevoked: 'Sesión cerrada.',\n    sessionsAllRevoked: 'Todas las demás sesiones fueron cerradas.',\n    sessionsError: 'No se pudo completar la operación.',\n    revokeAllConfirmTitle: 'Cerrar todas las otras sesiones',\n    revokeAllConfirmMessage:\n      'Vas a cerrar todas tus sesiones excepto la actual. Tendrás que volver a iniciar sesión en los otros dispositivos.',\n    revokeAllConfirm: 'Cerrar todas',\n    cancel: 'Cancelar',\n\n    quickActionsTitle: 'Otras opciones',\n    changePassword: 'Cambiar contraseña',\n    changePasswordDesc: 'Actualiza tu contraseña de acceso',\n    changeEmail: 'Cambiar email',\n    changeEmailDesc: 'Actualiza el correo electrónico de tu cuenta',\n    mfa: 'Autenticación de dos pasos (MFA)',\n    mfaDesc: 'Agrega un segundo factor a tu inicio de sesión',\n    sessions: 'Sesiones activas',\n    sessionsDesc: 'Revisa y cierra sesiones en otros dispositivos',\n\n    policiesTitle: 'Políticas relacionadas',\n    privacyLink: 'Política de Privacidad',\n    cookiesLink: 'Política de Cookies',\n    dataUsageLink: 'Uso de Datos',\n    termsLink: 'Términos y Condiciones',\n    thirdPartyLink: 'Software y Servicios de Terceros',\n    legalNoticeLink: 'Aviso Legal',\n\n    soonHint: 'Próximamente',\n  },\n  en: {\n    pageTitle: 'Security',\n    pageDescription: 'Passwords, MFA, and active sessions',\n\n    blocked: 'Device blocked',\n    tokenActionFailed: 'The email link is invalid or has expired.',\n\n    loginAttemptTitle: 'Confirm sign-in',\n    loginAttemptBody:\n      \"We detected a sign-in on this device. If it was you, there's nothing to do. If you don't recognize it, block it.\",\n    loginAttemptMine: 'Yes, it was me',\n    loginAttemptBlock: 'Not me — block it',\n    loginAttemptClose: 'Close',\n    loginAttemptDone: 'Device blocked. Reset your password to secure your account.',\n    loginAttemptUnknownDevice: 'Unknown device',\n\n    sessionsTitle: 'Active sessions',\n    sessionsTitleCount: 'Active sessions ({n})',\n    sessionsLoading: 'Loading sessions…',\n    sessionsEmpty: 'No active sessions.',\n    sessionsThis: 'This session',\n    sessionsRevoke: 'End',\n    sessionsRevokeAll: 'End all others',\n    sessionsViewAll: 'View all',\n    sessionsModalTitle: 'All active sessions',\n    sessionsRevoked: 'Session ended.',\n    sessionsAllRevoked: 'All other sessions were ended.',\n    sessionsError: 'Could not complete the operation.',\n    revokeAllConfirmTitle: 'End all other sessions',\n    revokeAllConfirmMessage:\n      \"You're about to end every session except this one. You'll need to sign in again on the other devices.\",\n    revokeAllConfirm: 'End all',\n    cancel: 'Cancel',\n\n    quickActionsTitle: 'Other options',\n    changePassword: 'Change password',\n    changePasswordDesc: 'Update your access password',\n    changeEmail: 'Change email',\n    changeEmailDesc: 'Update the email address on your account',\n    mfa: 'Two-step verification (MFA)',\n    mfaDesc: 'Add a second factor to your sign-in',\n    sessions: 'Active sessions',\n    sessionsDesc: 'Review and sign out from other devices',\n\n    policiesTitle: 'Related policies',\n    privacyLink: 'Privacy Policy',\n    cookiesLink: 'Cookie Policy',\n    dataUsageLink: 'Data Usage',\n    termsLink: 'Terms and Conditions',\n    thirdPartyLink: 'Third-Party Software and Services',\n    legalNoticeLink: 'Legal Notice',\n\n    soonHint: 'Coming soon',\n  },\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, Input, signal, untracked } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IonCol, IonGrid, IonIcon, IonRow } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { laptopOutline, phonePortraitOutline } from 'ionicons/icons';\nimport { firstValueFrom } from 'rxjs';\n\nimport { ActionCardComponent } from '../../molecules/action-card/action-card.component';\nimport { ActionCardMetadata } from '../../molecules/action-card/types';\nimport { ActionHeaderComponent } from '../../molecules/action-header/action-header.component';\nimport { ActionHeaderMetadata } from '../../molecules/action-header/types';\nimport { PageLinksComponent } from '../../molecules/page-links/page-links.component';\nimport { PageLinksMetadata } from '../../molecules/page-links/types';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';\nimport { ChangeEmailModalComponent } from '../change-email-modal/change-email-modal.component';\nimport { ChangePasswordModalComponent } from '../change-password-modal/change-password-modal.component';\nimport { MfaModalComponent } from '../mfa-modal/mfa-modal.component';\nimport { LoginAttemptModalComponent } from '../login-attempt-modal/login-attempt-modal.component';\nimport { SessionListModalComponent } from '../session-list-modal/session-list-modal.component';\nimport { ButtonMetadata, ComponentStates } from '../../types';\n\nimport { DeviceService } from '../../../services/auth/device.service';\nimport { SessionService } from '../../../services/auth/session.service';\nimport { DeviceInfo, SessionInfo, ValidateActionResponse } from '../../../services/auth/types';\nimport { I18nService } from '../../../services/i18n';\nimport { LegalLinkService } from '../../../services/legal-link/legal-link.service';\nimport { ModalService } from '../../../services/modal/modal.service';\nimport { ConfirmationDialogService } from '../../../services/confirmation-dialog/confirmation-dialog.service';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\nimport { connectPageRefresh } from '../../../services/page-refresh/page-refresh.service';\nimport { ToastService } from '../../../services/toast.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { SecurityViewConfig } from './types';\nimport { SECURITY_VIEW_I18N } from './security-view.i18n';\n\naddIcons({ laptopOutline, phonePortraitOutline });\n\nconst DEFAULT_NAMESPACE = 'Settings.Security';\n\n/**\n * `val-security-view` — vista Seguridad full-feature autocontenida (organism).\n *\n * Promovida desde `showcase` bajo el proceso de ADR-021. Reúne en una sola vista:\n *  - **Sesiones activas** — única vista user-facing de \"dónde tengo sesión\".\n *    Lista inline (limit 3) + modal \"Ver todas\" (`val-session-list-modal`) +\n *    revoke individual / revoke-all (con confirmación).\n *  - **Action-cards** — cambiar contraseña, cambiar email y MFA (cada una abre\n *    el modal correspondiente de la lib).\n *  - **Políticas legales** — links resueltos vía `LegalLinkService` (apps\n *    satélite apuntan al main site).\n *\n * Deep-links del email (gateados por `config.handleDeepLinks`, default `true`):\n *  - `?token=...&action=...` → modal `val-login-attempt-modal` (autorizar/bloquear\n *    el nuevo acceso).\n *  - `?mfaCode=...` → abre el modal MFA con el código pre-cargado.\n *\n * NO renderiza ion-content — vive dentro de val-page-wrapper.\n *\n * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no\n * proveyó el namespace configurado (default `Settings.Security`).\n */\n@Component({\n  selector: 'val-security-view',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonGrid,\n    IonRow,\n    IonCol,\n    IonIcon,\n    DisplayComponent,\n    TitleComponent,\n    TextComponent,\n    ButtonComponent,\n    ActionCardComponent,\n    ActionHeaderComponent,\n    PageLinksComponent,\n    SkeletonLayoutComponent,\n    ChangeEmailModalComponent,\n    ChangePasswordModalComponent,\n    MfaModalComponent,\n  ],\n  template: `\n    <div class=\"page\">\n      <header class=\"page-header\">\n        <val-display [props]=\"{ size: 'small', color: 'dark', content: pageTitle() }\" />\n        <val-title\n          [props]=\"{\n            size: 'large',\n            color: 'dark',\n            bold: false,\n            content: pageDescription(),\n          }\"\n        />\n      </header>\n\n      @if (resolvedConfig().showSessions) {\n        <!-- 1. Active sessions - unica vista user-facing de donde tengo sesion. -->\n        <section class=\"settings-section\">\n          @if (hasOtherSessions()) {\n            <val-action-header [props]=\"sessionsHeader()\" />\n          } @else {\n            <val-title\n              [props]=\"{\n                size: 'medium',\n                color: 'dark',\n                bold: true,\n                content: sessionsTitleWithCount(),\n              }\"\n            />\n          }\n\n          <div class=\"section-body\">\n            @if (sessionsLoading()) {\n              <val-skeleton-layout [props]=\"{ preset: 'list', rows: 3 }\" />\n            } @else if (sessions().length === 0) {\n              <val-text\n                [props]=\"{\n                  content: sessionsEmptyLabel(),\n                  size: 'small',\n                  color: 'medium',\n                  bold: false,\n                }\"\n              />\n            } @else {\n              <ul class=\"sessions\">\n                @for (s of visibleSessions(); track s.sessionId) {\n                  <li class=\"session\" [class.session--current]=\"s.isCurrent\">\n                    <ion-icon class=\"session__icon\" [name]=\"deviceIcon(s)\" aria-hidden=\"true\" />\n                    <div class=\"session__body\">\n                      <val-text\n                        [props]=\"{\n                          content: s.deviceInfo || s.deviceId || '—',\n                          size: 'medium',\n                          color: 'dark',\n                          bold: true,\n                        }\"\n                      />\n                      <val-text\n                        [props]=\"{\n                          content: formatSessionMeta(s),\n                          size: 'small',\n                          color: 'medium',\n                          bold: false,\n                        }\"\n                      />\n                    </div>\n                    <div class=\"session__end\">\n                      @if (s.isCurrent) {\n                        <span class=\"session__badge\">{{ sessionsThis() }}</span>\n                      } @else {\n                        <val-button [props]=\"revokeOneButtonProps()\" (click)=\"onRevokeOne(s.sessionId)\" />\n                      }\n                    </div>\n                  </li>\n                }\n              </ul>\n              @if (hasMoreSessions()) {\n                <div class=\"row-actions row-actions--center\">\n                  <val-button [props]=\"viewAllButtonProps()\" (click)=\"openSessionsModal()\" />\n                </div>\n              }\n            }\n          </div>\n        </section>\n      }\n\n      @if (hasActionCards()) {\n        <!-- 2. Quick actions: change password, change email, MFA -->\n        <section class=\"settings-section\">\n          <h2>{{ quickActionsTitle() }}</h2>\n          <ion-grid class=\"cards-grid\">\n            <ion-row>\n              @for (action of actionCards(); track action.token) {\n                <ion-col size=\"12\" size-sm=\"6\">\n                  <val-action-card [props]=\"action\" (onClick)=\"onActionClick(action)\" />\n                </ion-col>\n              }\n            </ion-row>\n          </ion-grid>\n        </section>\n      }\n\n      @if (resolvedConfig().showPolicies) {\n        <!-- 3. Related policies -->\n        <section class=\"settings-section\">\n          <h2>{{ policiesTitle() }}</h2>\n          <val-page-links [props]=\"policyLinksProps()\" />\n        </section>\n      }\n\n      <val-change-email-modal\n        [isOpen]=\"isChangeEmailModalOpen()\"\n        (changed)=\"isChangeEmailModalOpen.set(false)\"\n        (dismissed)=\"isChangeEmailModalOpen.set(false)\"\n      />\n\n      <val-change-password-modal\n        [isOpen]=\"isChangePasswordModalOpen()\"\n        (changed)=\"isChangePasswordModalOpen.set(false)\"\n        (dismissed)=\"isChangePasswordModalOpen.set(false)\"\n      />\n\n      <val-mfa-modal\n        [isOpen]=\"isMfaModalOpen()\"\n        [prefillCode]=\"mfaPrefillCode()\"\n        (dismissed)=\"onMfaModalDismissed()\"\n        (enabledViaDeeplink)=\"onMfaEnabledViaDeeplink()\"\n      />\n    </div>\n  `,\n  styles: [\n    `\n      .page {\n        padding: 16px 0;\n        max-width: 720px;\n        margin: 0 auto;\n      }\n      .page-header {\n        margin-bottom: 16px;\n      }\n      .settings-section {\n        padding: 16px 0;\n      }\n      .settings-section + .settings-section {\n        border-top: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      h2 {\n        font-size: 16px;\n        font-weight: 600;\n        margin: 0 0 4px;\n      }\n      .cards-grid {\n        margin: 0 -4px 0;\n        padding: 0;\n      }\n      .cards-grid ion-col {\n        padding: 4px;\n        display: flex;\n        flex-direction: column;\n      }\n      .cards-grid ion-col val-action-card {\n        flex: 1;\n        display: flex;\n        flex-direction: column;\n      }\n\n      /* --- Sessions section --- */\n      .section-body {\n        margin-top: 16px;\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n      .row-actions {\n        margin-top: 12px;\n      }\n      .row-actions--center {\n        display: flex;\n        justify-content: center;\n        margin-top: 4px;\n      }\n      .sessions {\n        list-style: none;\n        padding: 0;\n        margin: 0;\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n      .session {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 14px 16px;\n        border-radius: 14px;\n        background: var(--ion-color-light, rgba(0, 0, 0, 0.04));\n        border: 1px solid transparent;\n        transition:\n          background 0.15s ease,\n          border-color 0.15s ease;\n      }\n      .session--current {\n        background: rgba(45, 211, 111, 0.1);\n        border-color: rgba(45, 211, 111, 0.3);\n      }\n      .session__icon {\n        font-size: 26px;\n        color: var(--ion-color-dark, #1a1a1a);\n        flex-shrink: 0;\n      }\n      .session--current .session__icon {\n        color: var(--ion-color-success-shade, #28ba62);\n      }\n      .session__body {\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n        min-width: 0;\n        flex: 1;\n      }\n      .session__end {\n        flex-shrink: 0;\n      }\n      .session__badge {\n        display: inline-block;\n        padding: 4px 10px;\n        font-size: 11px;\n        font-weight: 700;\n        letter-spacing: 0.02em;\n        text-transform: uppercase;\n        color: var(--ion-color-success-shade, #28ba62);\n        background: rgba(45, 211, 111, 0.18);\n        border-radius: 999px;\n      }\n    `,\n  ],\n})\nexport class SecurityViewComponent {\n  private nav = inject(NavigationService);\n  private i18n = inject(I18nService);\n  private deviceService = inject(DeviceService);\n  private legalLink = inject(LegalLinkService);\n  private toast = inject(ToastService);\n  private errors = inject(ValtechErrorService);\n  private router = inject(Router, { optional: true });\n  private route = inject(ActivatedRoute, { optional: true });\n  private sessionService = inject(SessionService);\n  private modalService = inject(ModalService);\n  private confirmDialog = inject(ConfirmationDialogService);\n\n  /**\n   * Config vía @Input (object-first). Si no se pasa, se cae al route data\n   * `securityConfig` (poblado por `provideValtechSecurityRoutes`).\n   * `resolvedConfig` mergea con los defaults — `@Input` gana sobre route data.\n   */\n  @Input() config?: SecurityViewConfig;\n\n  readonly resolvedConfig = computed<\n    Required<Omit<SecurityViewConfig, 'onMfaCompleted'>> & Pick<SecurityViewConfig, 'onMfaCompleted'>\n  >(() => {\n    const fromRoute = (this.route?.snapshot.data['securityConfig'] ?? {}) as SecurityViewConfig;\n    const merged: SecurityViewConfig = { ...fromRoute, ...(this.config ?? {}) };\n    return {\n      showSessions: merged.showSessions ?? true,\n      showChangePassword: merged.showChangePassword ?? true,\n      showChangeEmail: merged.showChangeEmail ?? true,\n      showMfa: merged.showMfa ?? true,\n      showPolicies: merged.showPolicies ?? true,\n      i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,\n      handleDeepLinks: merged.handleDeepLinks ?? true,\n      homeRoute: merged.homeRoute ?? '/app/home',\n      onMfaCompleted: merged.onMfaCompleted,\n    };\n  });\n\n  /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */\n  private get ns(): string {\n    return this.resolvedConfig().i18nNamespace;\n  }\n\n  /**\n   * Lista de dispositivos del user. No se renderiza — solo alimenta el modal\n   * de confirmación de inicio de sesión (`handleActionTokenFromUrl`) para\n   * resolver un label legible desde el `targetId` del token.\n   */\n  protected devices = signal<DeviceInfo[]>([]);\n\n  readonly sessions = signal<SessionInfo[]>([]);\n  readonly sessionsLoading = signal(true);\n\n  readonly isChangeEmailModalOpen = signal(false);\n  readonly isChangePasswordModalOpen = signal(false);\n  readonly isMfaModalOpen = signal(false);\n  /** Código MFA del deep-link `/verify` — pre-carga el modal en confirmación. */\n  readonly mfaPrefillCode = signal<string | undefined>(undefined);\n\n  readonly pageTitle = computed(() => this.tt('pageTitle'));\n  readonly pageDescription = computed(() => this.tt('pageDescription'));\n\n  readonly quickActionsTitle = computed(() => this.tt('quickActionsTitle'));\n  readonly policiesTitle = computed(() => this.tt('policiesTitle'));\n\n  readonly hasActionCards = computed(() => this.actionCards().length > 0);\n\n  readonly actionCards = computed<ActionCardMetadata[]>(() => {\n    this.i18n.lang();\n    const cfg = this.resolvedConfig();\n    const cards: ActionCardMetadata[] = [];\n    if (cfg.showChangePassword) {\n      cards.push({\n        token: 'action-change-password',\n        title: this.tt('changePassword'),\n        description: this.tt('changePasswordDesc'),\n        icon: { ionicon: 'key-outline', color: 'dark', backgroundColor: 'light' },\n        showChevron: true,\n        shadowed: true,\n      });\n    }\n    if (cfg.showChangeEmail) {\n      cards.push({\n        token: 'action-change-email',\n        title: this.tt('changeEmail'),\n        description: this.tt('changeEmailDesc'),\n        icon: { ionicon: 'mail-outline', color: 'dark', backgroundColor: 'light' },\n        showChevron: true,\n        shadowed: true,\n      });\n    }\n    if (cfg.showMfa) {\n      cards.push({\n        token: 'action-mfa',\n        title: this.tt('mfa'),\n        description: this.tt('mfaDesc'),\n        icon: { ionicon: 'shield-checkmark-outline', color: 'dark', backgroundColor: 'light' },\n        showChevron: true,\n        shadowed: true,\n      });\n    }\n    return cards;\n  });\n\n  /**\n   * Fuente única de links legales del producto. Se resuelven vía\n   * `LegalLinkService` — apps satélite apuntan al main site, el main site los\n   * deja relativos.\n   */\n  readonly policyLinksProps = computed<PageLinksMetadata>(() => {\n    const locale = this.i18n.lang();\n    const link = (path: string, labelKey: string) => ({\n      label: this.tt(labelKey),\n      href: this.legalLink.resolve(path, { locale }),\n      external: this.legalLink.isExternal(path),\n    });\n    return {\n      links: [\n        link('/legal/terms', 'termsLink'),\n        link('/legal/privacy', 'privacyLink'),\n        link('/legal/cookies', 'cookiesLink'),\n        link('/legal/data-usage', 'dataUsageLink'),\n        link('/legal/third-party', 'thirdPartyLink'),\n        link('/legal/legal-notice', 'legalNoticeLink'),\n      ],\n      showDividers: true,\n    };\n  });\n\n  // ===========================================================================\n  // Sessions\n  // ===========================================================================\n\n  readonly sessionsTitle = computed(() => this.tt('sessionsTitle'));\n  readonly sessionsEmptyLabel = computed(() => this.tt('sessionsEmpty'));\n  readonly sessionsThis = computed(() => this.tt('sessionsThis'));\n\n  readonly hasOtherSessions = computed(() => this.sessions().some(s => !s.isCurrent));\n\n  /** Sesiones ordenadas: current primero, resto por createdAt desc. */\n  readonly sortedSessions = computed<SessionInfo[]>(() => {\n    const all = [...this.sessions()];\n    return all.sort((a, b) => {\n      if (a.isCurrent && !b.isCurrent) return -1;\n      if (!a.isCurrent && b.isCurrent) return 1;\n      return (b.createdAt || '').localeCompare(a.createdAt || '');\n    });\n  });\n\n  /** Limit de sesiones mostradas inline. Si total > limit, \"Ver todas\" abre modal. */\n  private readonly VISIBLE_LIMIT = 3;\n\n  readonly visibleSessions = computed<SessionInfo[]>(() => this.sortedSessions().slice(0, this.VISIBLE_LIMIT));\n\n  readonly hasMoreSessions = computed(() => this.sortedSessions().length > this.VISIBLE_LIMIT);\n\n  /** Titulo con count: \"Sesiones activas (4)\". Sin count si N=0. */\n  readonly sessionsTitleWithCount = computed(() => {\n    const n = this.sortedSessions().length;\n    if (n === 0) return this.sessionsTitle();\n    return this.tt('sessionsTitleCount').replace('{n}', String(n));\n  });\n\n  readonly revokeOneButtonProps = computed<Partial<ButtonMetadata>>(() => ({\n    text: this.tt('sessionsRevoke'),\n    color: 'dark',\n    fill: 'clear',\n    size: 'small',\n    type: 'button',\n    token: 'session-revoke',\n  }));\n\n  readonly viewAllButtonProps = computed<Partial<ButtonMetadata>>(() => ({\n    text: this.tt('sessionsViewAll'),\n    color: 'dark',\n    fill: 'clear',\n    size: 'small',\n    type: 'button',\n    state: ComponentStates.ENABLED,\n  }));\n\n  /** Action-header de Sesiones: title + count + boton \"Cerrar todas las demas\". */\n  readonly sessionsHeader = computed<ActionHeaderMetadata>(() => ({\n    headingKind: 'title',\n    title: {\n      size: 'medium',\n      color: 'dark',\n      bold: true,\n      content: this.sessionsTitleWithCount(),\n    },\n    action: {\n      text: this.tt('sessionsRevokeAll'),\n      color: 'dark',\n      fill: 'outline',\n      size: 'small',\n      type: 'button',\n      state: ComponentStates.ENABLED,\n      token: 'session-revoke-all',\n      handler: () => this.onRevokeAll(),\n    },\n  }));\n\n  constructor() {\n    const ns = this.ns;\n    if (!this.i18n.hasNamespace(ns)) {\n      this.i18n.registerContent(ns, SECURITY_VIEW_I18N);\n    }\n    this.nav.setBackHeader('pageTitle', ns, { withMenu: true });\n\n    // Carga inicial de sesiones - recarga reactiva a cambio de locale para\n    // que los textos y metadatos se mantengan frescos. Los devices solo se\n    // cargan on-demand desde el flujo del modal (handleActionTokenFromUrl).\n    effect(\n      () => {\n        this.i18n.lang();\n        const showSessions = this.resolvedConfig().showSessions;\n        untracked(() => {\n          if (showSessions) void this.loadSessions();\n        });\n      },\n      { allowSignalWrites: true }\n    );\n\n    // Pull-to-refresh estandar (Regla #3) - re-fetchea las sesiones activas.\n    connectPageRefresh(() => this.loadSessions());\n\n    // Deep-links del email - solo si estan habilitados Y hay ruta (montada como\n    // route). En modo embebido sin ruta es no-op.\n    if (this.resolvedConfig().handleDeepLinks && this.route) {\n      // Si el user llego via link del email (?token=...&action=...), abre el\n      // modal de confirmacion para autorizar/rechazar el intento.\n      void this.handleActionTokenFromUrl();\n      // Deep-link del email de setup MFA-email (?mfaCode=...).\n      this.handleMfaCodeFromUrl();\n    }\n  }\n\n  /**\n   * Llega vía link del email de \"nuevo acceso\" (`?token=...`). Valida el token\n   * (sin ejecutar) y levanta el modal de confirmación. El bloqueo solo se\n   * ejecuta si el user confirma \"no fui yo\" dentro del modal.\n   */\n  private async handleActionTokenFromUrl(): Promise<void> {\n    const token = this.route?.snapshot.queryParamMap.get('token');\n    if (!token) return;\n\n    // Limpia ?token/?action de la URL ya - el modal es la fuente de verdad;\n    // un refresh no debe re-abrirlo ni re-validar.\n    void this.router?.navigate([], {\n      relativeTo: this.route ?? undefined,\n      queryParams: { token: null, action: null },\n      queryParamsHandling: 'merge',\n      replaceUrl: true,\n    });\n\n    let validation: ValidateActionResponse;\n    try {\n      validation = await firstValueFrom(this.deviceService.validateAction(token));\n    } catch (err) {\n      this.errors.handle(err, {\n        context: 'security.validateActionToken',\n        fallbackKey: 'tokenActionFailed',\n        i18nNamespace: this.ns,\n      });\n      return;\n    }\n    if (!validation.valid) {\n      this.toastTokenInvalid();\n      return;\n    }\n\n    // Resuelve el dispositivo objetivo desde la lista cargada para mostrarlo.\n    await this.loadDevices();\n    const target = this.devices().find(d => d.deviceId === validation.targetId);\n    const isMobile = target?.platform === 'ios' || target?.platform === 'android';\n\n    const onBlock = async (): Promise<void> => {\n      await firstValueFrom(this.deviceService.executeAction(token));\n      await this.loadDevices();\n    };\n\n    const result = await this.modalService.open<LoginAttemptModalComponent>({\n      component: LoginAttemptModalComponent,\n      componentProps: {\n        title: this.tt('loginAttemptTitle'),\n        body: this.tt('loginAttemptBody'),\n        deviceLabel: target ? this.describeDevice(target) : this.tt('loginAttemptUnknownDevice'),\n        metaLabel: target ? this.formatDate(target.lastActive) : '',\n        mineLabel: this.tt('loginAttemptMine'),\n        blockLabel: this.tt('loginAttemptBlock'),\n        closeLabel: this.tt('loginAttemptClose'),\n        doneLabel: this.tt('loginAttemptDone'),\n        isMobile,\n        onBlock,\n      },\n    });\n\n    if (result.role === 'blocked') {\n      this.toastOk(this.tt('blocked'));\n    } else if (result.role === 'error') {\n      this.toastTokenInvalid();\n    }\n  }\n\n  private toastTokenInvalid(): void {\n    this.toast.show({\n      message: this.tt('tokenActionFailed'),\n      duration: 3500,\n      color: 'dark',\n      position: 'top',\n    });\n  }\n\n  async loadDevices(): Promise<void> {\n    try {\n      const list = await firstValueFrom(this.deviceService.listDevices());\n      this.devices.set(list || []);\n    } catch {\n      this.devices.set([]);\n    }\n  }\n\n  onActionClick(action: ActionCardMetadata): void {\n    if (action.token === 'action-change-password') {\n      this.isChangePasswordModalOpen.set(true);\n      return;\n    }\n    if (action.token === 'action-change-email') {\n      this.isChangeEmailModalOpen.set(true);\n      return;\n    }\n    if (action.token === 'action-mfa') {\n      this.mfaPrefillCode.set(undefined);\n      this.isMfaModalOpen.set(true);\n    }\n  }\n\n  onMfaModalDismissed(): void {\n    this.isMfaModalOpen.set(false);\n    this.mfaPrefillCode.set(undefined);\n  }\n\n  /**\n   * El user llegó vía link del email, confirmó MFA en el modal. Cerramos el\n   * modal y, si hay hook `onMfaCompleted`, lo invocamos; si no, navegamos al\n   * `homeRoute` configurado — quedarse en Settings → Security daría la\n   * sensación de \"tarea inconclusa\" cuando el flow ya terminó.\n   */\n  onMfaEnabledViaDeeplink(): void {\n    this.isMfaModalOpen.set(false);\n    this.mfaPrefillCode.set(undefined);\n    const cfg = this.resolvedConfig();\n    if (cfg.onMfaCompleted) {\n      cfg.onMfaCompleted();\n    } else {\n      void this.router?.navigateByUrl(cfg.homeRoute);\n    }\n  }\n\n  /**\n   * Deep-link `/verify?...&verify-code=` → redirige a esta vista con `?mfaCode=`.\n   * Abre el modal MFA con el código pre-cargado en el paso de confirmación.\n   */\n  private handleMfaCodeFromUrl(): void {\n    const code = this.route?.snapshot.queryParamMap.get('mfaCode');\n    if (!code) return;\n    // Limpia el query param - un refresh no debe re-abrir el modal.\n    void this.router?.navigate([], {\n      relativeTo: this.route ?? undefined,\n      queryParams: { mfaCode: null },\n      queryParamsHandling: 'merge',\n      replaceUrl: true,\n    });\n    this.mfaPrefillCode.set(code);\n    this.isMfaModalOpen.set(true);\n  }\n\n  protected describeDevice(d: DeviceInfo): string {\n    const parts = [d.platform, d.browser, d.location].filter(Boolean);\n    return parts.join(' · ') || d.deviceId;\n  }\n\n  protected formatDate(iso?: string): string {\n    if (!iso) return '';\n    try {\n      return new Date(iso).toLocaleString(this.i18n.lang());\n    } catch {\n      return iso;\n    }\n  }\n\n  private toastOk(msg: string): void {\n    this.toast.show({\n      message: msg,\n      duration: 2200,\n      color: 'dark',\n      position: 'top',\n    });\n  }\n\n  // ===========================================================================\n  // Sessions - métodos\n  // ===========================================================================\n\n  /** Icono según device: phone si UA mobile, sino laptop. */\n  deviceIcon(s: SessionInfo): string {\n    const ua = (s.deviceInfo || '').toLowerCase();\n    const isMobile = /iphone|ipad|ipod|android|mobile/.test(ua);\n    return isMobile ? 'phone-portrait-outline' : 'laptop-outline';\n  }\n\n  formatSessionMeta(s: SessionInfo): string {\n    const parts: string[] = [];\n    if (s.location) parts.push(s.location);\n    else if (s.ip) parts.push(s.ip);\n    if (s.createdAt) parts.push(new Date(s.createdAt).toLocaleString());\n    return parts.join(' · ');\n  }\n\n  async onRevokeOne(sessionId: string): Promise<void> {\n    try {\n      await firstValueFrom(this.sessionService.revokeSession(sessionId));\n      this.toast.show({\n        message: this.tt('sessionsRevoked'),\n        duration: 2500,\n        color: 'dark',\n        position: 'top',\n      });\n      await this.loadSessions();\n    } catch (err) {\n      this.errors.handle(err, {\n        context: 'security.revokeSession',\n        fallbackKey: 'sessionsError',\n        i18nNamespace: this.ns,\n      });\n    }\n  }\n\n  async onRevokeAll(): Promise<void> {\n    const result = await this.confirmDialog.confirmDestructive({\n      title: this.tt('revokeAllConfirmTitle'),\n      message: this.tt('revokeAllConfirmMessage'),\n      confirmButton: { text: this.tt('revokeAllConfirm') },\n      cancelButton: { text: this.tt('cancel') },\n    });\n    if (!result.confirmed) return;\n\n    try {\n      await firstValueFrom(this.sessionService.revokeAllSessions());\n      this.toast.show({\n        message: this.tt('sessionsAllRevoked'),\n        duration: 2500,\n        color: 'dark',\n        position: 'top',\n      });\n      await this.loadSessions();\n    } catch (err) {\n      this.errors.handle(err, {\n        context: 'security.revokeAllSessions',\n        fallbackKey: 'sessionsError',\n        i18nNamespace: this.ns,\n      });\n    }\n  }\n\n  /** Abre modal con la lista completa. Cada revoke pasa por `onRevoke`. */\n  async openSessionsModal(): Promise<void> {\n    const onRevoke = async (sessionId: string): Promise<SessionInfo[]> => {\n      try {\n        await firstValueFrom(this.sessionService.revokeSession(sessionId));\n        this.toast.show({\n          message: this.tt('sessionsRevoked'),\n          duration: 2500,\n          color: 'dark',\n          position: 'top',\n        });\n      } catch (err) {\n        this.errors.handle(err, {\n          context: 'security.revokeSession.modal',\n          fallbackKey: 'sessionsError',\n          i18nNamespace: this.ns,\n        });\n        throw err;\n      }\n      await this.loadSessions();\n      return this.sortedSessions();\n    };\n\n    await this.modalService.openSheet<SessionListModalComponent>({\n      component: SessionListModalComponent,\n      componentProps: {\n        sessions: this.sortedSessions(),\n        title: this.tt('sessionsModalTitle'),\n        closeLabel: this.tt('loginAttemptClose'),\n        thisLabel: this.sessionsThis(),\n        revokeLabel: this.tt('sessionsRevoke'),\n        onRevoke,\n      },\n      initialBreakpoint: 1,\n      breakpoints: [0, 1],\n      showHandle: false,\n    });\n  }\n\n  private async loadSessions(): Promise<void> {\n    this.sessionsLoading.set(true);\n    try {\n      const list = await firstValueFrom(this.sessionService.listSessions());\n      this.sessions.set(list);\n    } catch (err) {\n      console.error('[Security] listSessions failed:', err);\n      this.sessions.set([]);\n    } finally {\n      this.sessionsLoading.set(false);\n    }\n  }\n\n  /** Lee del namespace configurado. */\n  protected tt(key: string): string {\n    return this.i18n.t(key, this.ns);\n  }\n}\n","import { Routes } from '@angular/router';\n\nimport { SecurityViewComponent } from './security-view.component';\nimport { SecurityViewConfig } from './types';\n\n/**\n * Helper para montar la vista Seguridad (`val-security-view`) como ruta en una\n * app del factory. El `config` se pasa por route `data` (`securityConfig`) y el\n * componente lo lee como fallback de su `@Input() config`.\n *\n * @example\n * ```ts\n * // settings.routes.ts\n * export const settingsRoutes: Routes = [\n *   ...provideValtechSecurityRoutes(),\n *   { path: 'preferences', loadComponent: () => ... },\n * ];\n *\n * // con config acotada:\n * ...provideValtechSecurityRoutes({ config: { showPolicies: false } }),\n * ...provideValtechSecurityRoutes({ config: { homeRoute: '/app/dashboard' } }),\n * ```\n */\nexport function provideValtechSecurityRoutes(opts?: {\n  path?: string;\n  config?: SecurityViewConfig;\n}): Routes {\n  return [\n    {\n      path: opts?.path ?? 'security',\n      component: SecurityViewComponent,\n      data: { securityConfig: opts?.config },\n    },\n  ];\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { VALTECH_AUTH_CONFIG } from '../auth/config';\nimport { ValtechAuthConfig } from '../auth/types';\nimport {\n  Organization,\n  ListMyOrgsResponse,\n  OrgResponse,\n  CreateOrgRequest,\n  UpdateOrgRequest,\n  InviteUserRequest,\n  InviteUserResponse,\n  LeaveOrgResponse,\n  ListOrgMembersResponse,\n  OrgRole,\n  ListOrgRolesResponse,\n  ChangeMemberRoleRequest,\n  ChangeMemberRoleResponse,\n  PendingInvitation,\n  ListPendingInvitationsResponse,\n  AcceptInvitationResponse,\n} from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class OrgService {\n  constructor(\n    @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig,\n    private http: HttpClient\n  ) {}\n\n  private get baseUrl(): string {\n    return `${this.config.apiUrl}/org`;\n  }\n\n  listMyOrgs(): Observable<Organization[]> {\n    return this.http.get<ListMyOrgsResponse>(`${this.baseUrl}/my`).pipe(map(r => r.organizations));\n  }\n\n  listMyOrgsPage(params?: { limit?: number; nextToken?: string }): Observable<ListMyOrgsResponse> {\n    const queryParams = new URLSearchParams();\n    if (params?.limit) queryParams.set('limit', String(params.limit));\n    if (params?.nextToken) queryParams.set('nextToken', params.nextToken);\n    const qs = queryParams.toString();\n    const url = `${this.baseUrl}/my${qs ? '?' + qs : ''}`;\n    return this.http.get<ListMyOrgsResponse>(url);\n  }\n\n  getOrg(orgId: string): Observable<Organization> {\n    return this.http.get<OrgResponse>(`${this.baseUrl}/${orgId}`).pipe(map(r => r.organization));\n  }\n\n  createOrg(req: CreateOrgRequest): Observable<Organization> {\n    return this.http.post<OrgResponse>(`${this.baseUrl}`, req).pipe(map(r => r.organization));\n  }\n\n  updateOrg(orgId: string, req: UpdateOrgRequest): Observable<Organization> {\n    return this.http\n      .put<OrgResponse>(`${this.baseUrl}/${orgId}`, req)\n      .pipe(map(r => r.organization));\n  }\n\n  deleteOrg(orgId: string): Observable<{ deleted: boolean; message: string }> {\n    return this.http.delete<{ deleted: boolean; message: string }>(`${this.baseUrl}/${orgId}`);\n  }\n\n  inviteUser(orgId: string, req: InviteUserRequest): Observable<InviteUserResponse> {\n    return this.http.post<InviteUserResponse>(`${this.baseUrl}/${orgId}/invite`, req);\n  }\n\n  leaveOrg(orgId: string): Observable<LeaveOrgResponse> {\n    return this.http.post<LeaveOrgResponse>(`${this.baseUrl}/${orgId}/leave`, {});\n  }\n\n  getOrgMembers(\n    orgId: string,\n    params?: { limit?: number; nextToken?: string }\n  ): Observable<ListOrgMembersResponse> {\n    const queryParams = new URLSearchParams();\n    if (params?.limit) queryParams.set('limit', String(params.limit));\n    if (params?.nextToken) queryParams.set('nextToken', params.nextToken);\n    const qs = queryParams.toString();\n    const url = `${this.baseUrl}/${orgId}/members${qs ? '?' + qs : ''}`;\n    return this.http.get<ListOrgMembersResponse>(url);\n  }\n\n  listOrgRoles(orgId: string): Observable<OrgRole[]> {\n    return this.http\n      .get<ListOrgRolesResponse>(`${this.baseUrl}/${orgId}/roles`)\n      .pipe(map(r => r.roles ?? []));\n  }\n\n  changeMemberRole(\n    orgId: string,\n    userId: string,\n    roleId: string\n  ): Observable<ChangeMemberRoleResponse> {\n    const body: ChangeMemberRoleRequest = { roleId };\n    return this.http.put<ChangeMemberRoleResponse>(\n      `${this.baseUrl}/${orgId}/members/${userId}/role`,\n      body\n    );\n  }\n\n  removeMember(orgId: string, userId: string): Observable<void> {\n    return this.http.delete<void>(`${this.baseUrl}/${orgId}/members/${userId}`);\n  }\n\n  transferOwnership(orgId: string, newOwnerId: string): Observable<Organization> {\n    return this.http\n      .post<OrgResponse>(`${this.baseUrl}/${orgId}/transfer-ownership`, { newOwnerId })\n      .pipe(map(r => r.organization));\n  }\n\n  validateInviteToken(token: string): Observable<{\n    valid: boolean;\n    actionType?: string;\n    targetType?: string;\n    targetId?: string;\n    data?: { orgName?: string; roleId?: string; inviterName?: string };\n    message?: string;\n  }> {\n    return this.http.post<{\n      valid: boolean;\n      actionType?: string;\n      targetType?: string;\n      targetId?: string;\n      data?: { orgName?: string; roleId?: string; inviterName?: string };\n      message?: string;\n    }>(`${this.config.apiUrl}/v2/actions/validate`, { token });\n  }\n\n  executeInviteToken(token: string): Observable<{\n    success: boolean;\n    message: string;\n    data?: { organizationId?: string; organizationName?: string; roleId?: string };\n  }> {\n    return this.http.post<{\n      success: boolean;\n      message: string;\n      data?: { organizationId?: string; organizationName?: string; roleId?: string };\n    }>(`${this.config.apiUrl}/v2/actions/execute`, { token });\n  }\n\n  getPendingInvitations(): Observable<PendingInvitation[]> {\n    return this.http\n      .get<ListPendingInvitationsResponse>(\n        `${this.config.apiUrl}/organizations/invitations/pending`\n      )\n      .pipe(map(r => r.items ?? []));\n  }\n\n  acceptInvitation(orgId: string): Observable<AcceptInvitationResponse> {\n    return this.http.post<AcceptInvitationResponse>(\n      `${this.baseUrl}/invitations/${orgId}/accept`,\n      {}\n    );\n  }\n\n  declineInvitation(orgId: string): Observable<void> {\n    return this.http.post<void>(`${this.baseUrl}/invitations/${orgId}/decline`, {});\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-create-org-modal`. Auto-registrados en\n * el constructor del componente si el consumer no proveyó el namespace\n * (`CreateOrgModal` por default). SOLO incluye las keys que el modal usa.\n */\nexport const CREATE_ORG_MODAL_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'Nueva organización',\n    pageDescription: 'Crea una nueva organización',\n    nameLabel: 'Nombre',\n    namePlaceholder: 'Nombre de la organización',\n    typeLabel: 'Tipo',\n    descriptionLabel: 'Descripción',\n    descriptionPlaceholder: 'Opcional',\n    createCta: 'Crear organización',\n    close: 'Cancelar',\n    nameRequired: 'El nombre es obligatorio',\n    nameMin: 'Mínimo 2 caracteres',\n    typePersonal: 'Personal',\n    typePrivate: 'Privada',\n    typePublic: 'Pública',\n    typeBusiness: 'Empresa',\n    successMsg: 'Organización creada. Cambiando...',\n    fillRequired: 'Completa todos los campos requeridos.',\n  },\n  en: {\n    pageTitle: 'New organization',\n    pageDescription: 'Create a new organization',\n    nameLabel: 'Name',\n    namePlaceholder: 'Organization name',\n    typeLabel: 'Type',\n    descriptionLabel: 'Description',\n    descriptionPlaceholder: 'Optional',\n    createCta: 'Create organization',\n    close: 'Cancel',\n    nameRequired: 'Name is required',\n    nameMin: 'Minimum 2 characters',\n    typePersonal: 'Personal',\n    typePrivate: 'Private',\n    typePublic: 'Public',\n    typeBusiness: 'Business',\n    successMsg: 'Organization created. Switching...',\n    fillRequired: 'Please fill in all required fields.',\n  },\n};\n","import { Component, effect, inject, Input, signal, WritableSignal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport { firstValueFrom } from 'rxjs';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonToolbar } from '@ionic/angular/standalone';\n\nimport { FormComponent } from '../form/form.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ComponentStates, FormMetadata, FormSubmit, InputMetadata, InputType } from '../../types';\n\nimport { I18nService } from '../../../services/i18n';\nimport { OrgService } from '../../../services/org/org.service';\nimport { Organization, OrgType } from '../../../services/org/types';\nimport { OrgSwitchService } from '../../../services/auth/org-switch.service';\nimport { ToastService } from '../../../services/toast.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { CREATE_ORG_MODAL_I18N } from './create-org-modal.i18n';\n\nconst DEFAULT_NAMESPACE = 'CreateOrgModal';\n\n/**\n * `val-create-org-modal` — modal de creación de organización (organism\n * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por\n * la vista Cuenta (y futuras vistas org-aware).\n *\n * Crea la org vía `OrgService.createOrg` y, en éxito, cambia a ella con\n * `OrgSwitchService.switchTo`. El formulario (nombre + tipo + descripción) se\n * construye una vez y se mantiene reactivo a idioma + estado de trabajo vía\n * effects `allowSignalWrites`.\n *\n * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` + callback\n * `onSuccess(newOrg)`. Header canónico (Regla #5): sin `ion-title`, botón Cerrar\n * texto en `slot=end`, título/subtítulo en el body con `val-display`/`val-title`.\n *\n * Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el namespace\n * `CreateOrgModal`.\n */\n@Component({\n  selector: 'val-create-org-modal',\n  standalone: true,\n  imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, FormComponent, DisplayComponent, TitleComponent],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"dismiss()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n    <ion-content class=\"ion-padding\">\n      <val-display [props]=\"{ content: t('pageTitle'), size: 'small', color: 'dark' }\" />\n      <val-title\n        [props]=\"{\n          content: t('pageDescription'),\n          size: 'large',\n          color: '',\n          bold: false,\n        }\"\n      />\n      <val-form [props]=\"formMeta()\" (onSubmit)=\"onSubmit($event)\" />\n    </ion-content>\n  `,\n})\nexport class CreateOrgModalComponent {\n  private i18n = inject(I18nService);\n  private orgService = inject(OrgService);\n  private orgSwitch = inject(OrgSwitchService);\n  private toast = inject(ToastService);\n  private errors = inject(ValtechErrorService);\n\n  /** Inyectado por `ModalService.open` — referencia para cerrar desde dentro. */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  /** Callback tras crear la org (pasado por `componentProps`). */\n  @Input() onSuccess?: (newOrg: Organization) => void;\n\n  /** Namespace i18n con que la vista resuelve sus textos. */\n  @Input() i18nNamespace = DEFAULT_NAMESPACE;\n\n  private readonly _busy = signal(false);\n  readonly formMeta: WritableSignal<FormMetadata>;\n\n  constructor() {\n    if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {\n      this.i18n.registerContent(DEFAULT_NAMESPACE, CREATE_ORG_MODAL_I18N);\n    }\n    this.formMeta = signal(this.buildFormMeta());\n\n    effect(\n      () => {\n        this.i18n.lang();\n        this.formMeta.set(this.buildFormMeta());\n      },\n      { allowSignalWrites: true }\n    );\n\n    effect(\n      () => {\n        const working = this._busy();\n        this.formMeta.update(meta => ({\n          ...meta,\n          state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,\n          actions: {\n            ...meta.actions,\n            state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,\n          },\n        }));\n      },\n      { allowSignalWrites: true }\n    );\n  }\n\n  async onSubmit(event: FormSubmit): Promise<void> {\n    if (this._busy()) return;\n    const name = event.fields['name'] as string;\n    const type = event.fields['type'] as OrgType;\n    if (!name?.trim() || !type) {\n      this.toast.show({\n        message: this.t('fillRequired'),\n        duration: 3000,\n        color: 'dark',\n        position: 'top',\n      });\n      return;\n    }\n    this._busy.set(true);\n    try {\n      const description = event.fields['description'] as string | undefined;\n      const newOrg = await firstValueFrom(this.orgService.createOrg({ name, type, description }));\n      this.toast.show({\n        message: this.t('successMsg'),\n        color: 'dark',\n        duration: 3500,\n      });\n      await this.orgSwitch.switchTo(newOrg.id);\n      this.onSuccess?.(newOrg);\n      this._modalRef?.dismiss(newOrg, 'confirm');\n    } catch (err) {\n      this.errors.handle(err, { i18nNamespace: this.i18nNamespace });\n    } finally {\n      this._busy.set(false);\n    }\n  }\n\n  dismiss(): void {\n    this._modalRef?.dismiss(null, 'cancel');\n  }\n\n  private buildFormMeta(): FormMetadata {\n    const nameField: InputMetadata = {\n      token: 'new-org-name',\n      name: 'name',\n      label: this.t('nameLabel'),\n      hint: '',\n      placeholder: this.t('namePlaceholder'),\n      type: InputType.TEXT,\n      order: 1,\n      validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],\n      errors: {\n        required: this.t('nameRequired'),\n        minlength: this.t('nameMin'),\n      },\n      value: '',\n      state: ComponentStates.ENABLED,\n    } as InputMetadata;\n\n    const typeField: InputMetadata = {\n      token: 'new-org-type',\n      name: 'type',\n      label: this.t('typeLabel'),\n      hint: '',\n      placeholder: '',\n      type: InputType.SELECT,\n      order: 2,\n      validators: [Validators.required],\n      errors: {},\n      value: 'PERSONAL',\n      withDefault: 'PERSONAL',\n      state: ComponentStates.ENABLED,\n      options: [\n        { id: 'PERSONAL', name: this.t('typePersonal'), order: 1 },\n        { id: 'PRIVATE', name: this.t('typePrivate'), order: 2 },\n        { id: 'PUBLIC', name: this.t('typePublic'), order: 3 },\n        { id: 'BUSINESS', name: this.t('typeBusiness'), order: 4 },\n      ],\n    } as InputMetadata;\n\n    const descriptionField: InputMetadata = {\n      token: 'new-org-description',\n      name: 'description',\n      label: this.t('descriptionLabel'),\n      hint: '',\n      placeholder: this.t('descriptionPlaceholder'),\n      type: InputType.TEXTAREA,\n      order: 3,\n      validators: [],\n      errors: {},\n      value: '',\n      state: ComponentStates.ENABLED,\n    } as InputMetadata;\n\n    const submitButton = {\n      text: this.t('createCta'),\n      color: 'dark' as const,\n      type: 'submit' as const,\n      fill: 'solid' as const,\n      size: 'default' as const,\n      shape: 'round' as const,\n      expand: 'block' as const,\n      state: ComponentStates.ENABLED,\n      token: 'new-org-submit',\n    };\n\n    return {\n      name: '',\n      state: ComponentStates.ENABLED,\n      sections: [\n        {\n          name: '',\n          order: 1,\n          fields: [nameField, typeField, descriptionField],\n        },\n      ],\n      actions: submitButton,\n    };\n  }\n\n  t(key: string): string {\n    return this.i18n.t(key, this.i18nNamespace);\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-delete-account-modal`. Auto-registrados\n * en el constructor del componente si el consumer no proveyó el namespace\n * (`Settings.DeleteAccount` por default). SOLO incluye las keys que el modal usa.\n */\nexport const DELETE_ACCOUNT_MODAL_I18N: LanguagesContent = {\n  es: {\n    title: 'Eliminar cuenta',\n    warningPassword:\n      'Esta acción es permanente y no se puede deshacer. Se eliminarán tu cuenta, sesiones activas, organizaciones personales y todos los datos asociados.',\n    passwordLabel: 'Contraseña actual',\n    passwordPlaceholder: 'Ingresa tu contraseña',\n    passwordRequired: 'La contraseña es requerida',\n    warningSendCode:\n      'Tu cuenta está vinculada a un proveedor externo. Para confirmar la eliminación, enviaremos un código de verificación a tu correo electrónico.',\n    sendCodeCta: 'Enviar código de confirmación',\n    warningEnterCode: 'Ingresa el código que enviamos a tu correo. Expira en 15 minutos.',\n    codeLabel: 'Código de verificación',\n    codePlaceholder: 'Código de 6 dígitos',\n    codeRequired: 'El código es requerido',\n    confirmCta: 'Eliminar mi cuenta',\n    close: 'Cancelar',\n    resend: 'Reenviar código',\n  },\n  en: {\n    title: 'Delete account',\n    warningPassword:\n      'This action is permanent and cannot be undone. Your account, active sessions, personal organizations and all associated data will be permanently deleted.',\n    passwordLabel: 'Current password',\n    passwordPlaceholder: 'Enter your password',\n    passwordRequired: 'Password is required',\n    warningSendCode:\n      \"Your account is linked to an external provider. To confirm deletion, we'll send a verification code to your email address.\",\n    sendCodeCta: 'Send confirmation code',\n    warningEnterCode: 'Enter the code we sent to your email. It expires in 15 minutes.',\n    codeLabel: 'Verification code',\n    codePlaceholder: '6-digit code',\n    codeRequired: 'Code is required',\n    confirmCta: 'Delete my account',\n    close: 'Cancel',\n    resend: 'Resend code',\n  },\n};\n","import { Component, computed, inject, Input, OnInit, signal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonSpinner, IonToolbar } from '@ionic/angular/standalone';\nimport { firstValueFrom } from 'rxjs';\n\nimport { FormComponent } from '../form/form.component';\nimport { ComponentState, ComponentStates, FormMetadata, FormSubmit, InputMetadata, InputType } from '../../types';\n\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { I18nService } from '../../../services/i18n';\nimport { ToastService } from '../../../services/toast.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { DELETE_ACCOUNT_MODAL_I18N } from './delete-account-modal.i18n';\n\nconst DEFAULT_NAMESPACE = 'Settings.DeleteAccount';\n\n/**\n * `val-delete-account-modal` — modal de eliminación de cuenta (organism,\n * cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.\n *\n * Decide el flujo según si la cuenta tiene contraseña:\n *  - **con password** → pide la contraseña actual y la verifica vía\n *    `auth.deleteAccount({ password })`.\n *  - **sin password** (cuenta OAuth) → envía un código por email\n *    (`auth.sendDeleteAccountCode()`) y lo pide para confirmar\n *    (`auth.deleteAccount({ code })`).\n *\n * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` para\n * cerrar desde dentro. Header canónico (Regla #5): sin `ion-title`, botón Cerrar\n * texto en `slot=end`, título/subtítulo en el body vía `val-form`.\n *\n * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no\n * proveyó el namespace `Settings.DeleteAccount`.\n */\n@Component({\n  selector: 'val-delete-account-modal',\n  standalone: true,\n  imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, IonSpinner, FormComponent],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"close()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n\n    <ion-content class=\"ion-padding\">\n      <section class=\"modal-form-section\">\n        @if (hasPassword() === null) {\n          <div class=\"spinner-center\">\n            <ion-spinner name=\"crescent\" />\n          </div>\n        } @else if (hasPassword()) {\n          <val-form [props]=\"passwordFormProps()\" (onSubmit)=\"onPasswordSubmit($event)\" />\n        } @else if (!codeSent()) {\n          <val-form [props]=\"sendCodeFormProps()\" (onSubmit)=\"onSendCode()\" />\n        } @else {\n          <val-form [props]=\"codeFormProps()\" (onSubmit)=\"onCodeSubmit($event)\" />\n          <div class=\"resend-row\">\n            <ion-button\n              fill=\"clear\"\n              color=\"medium\"\n              size=\"small\"\n              [disabled]=\"formState() === 'WORKING'\"\n              (click)=\"onResendCode()\"\n            >\n              {{ t('resend') }}\n            </ion-button>\n          </div>\n        }\n      </section>\n    </ion-content>\n  `,\n  styles: [\n    `\n      .modal-form-section {\n        display: flex;\n        flex-direction: column;\n        gap: 16px;\n        max-width: 420px;\n        margin: 0 auto;\n        padding-top: 8px;\n      }\n      .resend-row {\n        display: flex;\n        justify-content: center;\n        margin-top: -8px;\n      }\n      .spinner-center {\n        display: flex;\n        justify-content: center;\n        padding-top: 32px;\n      }\n    `,\n  ],\n})\nexport class DeleteAccountModalComponent implements OnInit {\n  private auth = inject(AuthService);\n  private errors = inject(ValtechErrorService);\n  private i18n = inject(I18nService);\n  private toast = inject(ToastService);\n\n  /** Inyectado por `ModalService.open` — referencia para cerrar desde dentro. */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  /** Namespace i18n con que la vista resuelve sus textos. */\n  @Input() i18nNamespace = DEFAULT_NAMESPACE;\n\n  readonly hasPassword = signal<boolean | null>(null);\n  readonly codeSent = signal(false);\n  readonly formState = signal<ComponentState>(ComponentStates.ENABLED);\n\n  constructor() {\n    if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {\n      this.i18n.registerContent(DEFAULT_NAMESPACE, DELETE_ACCOUNT_MODAL_I18N);\n    }\n  }\n\n  ngOnInit(): void {\n    firstValueFrom(this.auth.getProfile())\n      .then(profile => this.hasPassword.set(profile.hasPassword ?? true))\n      .catch(() => this.hasPassword.set(true));\n  }\n\n  t = (key: string): string => this.i18n.t(key, this.i18nNamespace);\n\n  private submitBtn(token: string, textKey: string) {\n    return {\n      text: this.t(textKey),\n      type: 'submit' as const,\n      expand: 'block' as const,\n      fill: 'solid' as const,\n      color: 'dark',\n      size: 'default' as const,\n      token,\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  readonly passwordFormProps = computed<FormMetadata>(() => ({\n    name: this.t('title'),\n    state: this.formState(),\n    sections: [\n      {\n        name: this.t('warningPassword'),\n        order: 0,\n        fields: [\n          {\n            token: 'delete-password',\n            name: 'password',\n            label: this.t('passwordLabel'),\n            hint: '',\n            placeholder: this.t('passwordPlaceholder'),\n            type: InputType.PASSWORD,\n            order: 0,\n            validators: [Validators.required],\n            errors: { required: this.t('passwordRequired') },\n            state: ComponentStates.ENABLED,\n          } as InputMetadata,\n        ],\n      },\n    ],\n    actions: this.submitBtn('delete-password-submit', 'confirmCta'),\n  }));\n\n  readonly sendCodeFormProps = computed<FormMetadata>(() => ({\n    name: this.t('title'),\n    state: this.formState(),\n    sections: [\n      {\n        name: this.t('warningSendCode'),\n        order: 0,\n        fields: [],\n      },\n    ],\n    actions: this.submitBtn('delete-send-code-submit', 'sendCodeCta'),\n  }));\n\n  readonly codeFormProps = computed<FormMetadata>(() => ({\n    name: this.t('title'),\n    state: this.formState(),\n    sections: [\n      {\n        name: this.t('warningEnterCode'),\n        order: 0,\n        fields: [\n          {\n            token: 'delete-code',\n            name: 'code',\n            label: this.t('codeLabel'),\n            hint: '',\n            placeholder: this.t('codePlaceholder'),\n            type: InputType.TEXT,\n            order: 0,\n            validators: [Validators.required],\n            errors: { required: this.t('codeRequired') },\n            state: ComponentStates.ENABLED,\n          } as InputMetadata,\n        ],\n      },\n    ],\n    actions: this.submitBtn('delete-code-submit', 'confirmCta'),\n  }));\n\n  close(): void {\n    this._modalRef?.dismiss(undefined, 'cancel');\n  }\n\n  async onPasswordSubmit(event: FormSubmit): Promise<void> {\n    const password = event.fields['password'];\n    if (!password) {\n      this.toast.show({\n        message: this.t('passwordRequired'),\n        duration: 3000,\n        color: 'dark',\n        position: 'top',\n      });\n      return;\n    }\n    this.formState.set(ComponentStates.WORKING);\n    try {\n      await firstValueFrom(this.auth.deleteAccount({ password }));\n    } catch (err) {\n      this.errors.handle(err, { context: 'delete-account.password' });\n      this.formState.set(ComponentStates.ENABLED);\n    }\n  }\n\n  async onSendCode(): Promise<void> {\n    this.formState.set(ComponentStates.WORKING);\n    try {\n      await firstValueFrom(this.auth.sendDeleteAccountCode());\n      this.codeSent.set(true);\n    } catch (err) {\n      this.errors.handle(err, { context: 'delete-account.send-code' });\n    } finally {\n      this.formState.set(ComponentStates.ENABLED);\n    }\n  }\n\n  async onResendCode(): Promise<void> {\n    this.codeSent.set(false);\n    await this.onSendCode();\n  }\n\n  async onCodeSubmit(event: FormSubmit): Promise<void> {\n    const code = event.fields['code'];\n    if (!code) {\n      this.toast.show({\n        message: this.t('codeRequired'),\n        duration: 3000,\n        color: 'dark',\n        position: 'top',\n      });\n      return;\n    }\n    this.formState.set(ComponentStates.WORKING);\n    try {\n      await firstValueFrom(this.auth.deleteAccount({ code }));\n    } catch (err) {\n      this.errors.handle(err, { context: 'delete-account.code' });\n      this.formState.set(ComponentStates.ENABLED);\n    }\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-org-info-sheet`. Auto-registrados en el\n * constructor del componente si el consumer no proveyó el namespace\n * (`OrgInfoSheet`). Cubre los textos de los 3 features (que en la versión inline\n * de showcase estaban hardcoded) más fallbacks de título/subtítulo/closeLabel.\n *\n * `title`/`subtitle`/`body`/`closeLabel` los suele pasar el consumer ya resueltos\n * por props (patrón del resto de modales); las keys `feature*` se auto-resuelven\n * desde este namespace.\n */\nexport const ORG_INFO_SHEET_I18N: LanguagesContent = {\n  es: {\n    title: '¿Qué son las organizaciones?',\n    subtitle: 'Todo lo que necesitas saber',\n    close: 'Cerrar',\n    featureCollabTitle: 'Colaboración',\n    featureCollabDesc: 'Separa proyectos y datos por empresa o equipo.',\n    featureSwitchTitle: 'Cambio rápido',\n    featureSwitchDesc: 'Cambia entre organizaciones en cualquier momento.',\n    featureInviteTitle: 'Invitaciones',\n    featureInviteDesc: 'Invita a otros a unirse mediante email.',\n  },\n  en: {\n    title: 'What are organizations?',\n    subtitle: 'Everything you need to know',\n    close: 'Close',\n    featureCollabTitle: 'Collaboration',\n    featureCollabDesc: 'Separate projects and data by company or team.',\n    featureSwitchTitle: 'Quick switch',\n    featureSwitchDesc: 'Switch between organizations at any time.',\n    featureInviteTitle: 'Invitations',\n    featureInviteDesc: 'Invite others to join via email.',\n  },\n};\n","import { Component, computed, inject, Input } from '@angular/core';\nimport { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonToolbar } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { mailOutline, peopleOutline, swapHorizontalOutline } from 'ionicons/icons';\n\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { ButtonMetadata } from '../../types';\n\nimport { I18nService } from '../../../services/i18n';\n\nimport { ORG_INFO_SHEET_I18N } from './org-info-sheet.i18n';\n\nconst DEFAULT_NAMESPACE = 'OrgInfoSheet';\n\n/**\n * `val-org-info-sheet` — sheet informativo \"¿Qué son las organizaciones?\".\n * Extraído del `OrgInfoSheetComponent` inline de `AccountPage` bajo el proceso de\n * ADR-021.\n *\n * El consumer pasa `title`/`subtitle`/`body`/`closeLabel` ya resueltos por props\n * (patrón del resto de modales del factory). Los textos de los 3 features\n * (Colaboración / Cambio rápido / Invitaciones), que en la versión inline estaban\n * hardcoded, ahora se auto-resuelven desde el namespace `OrgInfoSheet`\n * (auto-registrado en el constructor).\n *\n * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps`. Header\n * canónico (Regla #5): sin `ion-title`, botón Cerrar texto en `slot=end`,\n * título/subtítulo en el body con `val-display`/`val-title`.\n */\n@Component({\n  selector: 'val-org-info-sheet',\n  standalone: true,\n  imports: [\n    IonHeader,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    IonContent,\n    IonIcon,\n    ButtonComponent,\n    DisplayComponent,\n    TextComponent,\n    TitleComponent,\n  ],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"dismiss()\">\n            <strong>{{ resolvedCloseLabel() }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n\n    <ion-content class=\"ion-padding\">\n      <val-display [props]=\"{ content: resolvedTitle(), size: 'small', color: 'dark' }\" />\n      <val-title [props]=\"{ content: resolvedSubtitle(), size: 'large', color: '', bold: false }\" />\n\n      <div class=\"info-features\">\n        <div class=\"info-feature\">\n          <ion-icon name=\"people-outline\" class=\"info-feature__icon\" />\n          <div>\n            <div class=\"info-feature__title\">{{ tt('featureCollabTitle') }}</div>\n            <div class=\"info-feature__desc\">{{ tt('featureCollabDesc') }}</div>\n          </div>\n        </div>\n        <div class=\"info-feature\">\n          <ion-icon name=\"swap-horizontal-outline\" class=\"info-feature__icon\" />\n          <div>\n            <div class=\"info-feature__title\">{{ tt('featureSwitchTitle') }}</div>\n            <div class=\"info-feature__desc\">{{ tt('featureSwitchDesc') }}</div>\n          </div>\n        </div>\n        <div class=\"info-feature\">\n          <ion-icon name=\"mail-outline\" class=\"info-feature__icon\" />\n          <div>\n            <div class=\"info-feature__title\">{{ tt('featureInviteTitle') }}</div>\n            <div class=\"info-feature__desc\">{{ tt('featureInviteDesc') }}</div>\n          </div>\n        </div>\n      </div>\n\n      @for (para of paragraphs(); track $index) {\n        <val-text\n          [props]=\"{\n            size: 'medium',\n            color: 'dark',\n            bold: false,\n            content: para,\n          }\"\n        />\n      }\n\n      <div class=\"sheet-footer\">\n        <val-button [props]=\"resolvedCloseProps()\" (click)=\"dismiss()\" />\n      </div>\n    </ion-content>\n  `,\n  styles: [\n    `\n      ion-content {\n        --padding-bottom: 32px;\n      }\n      val-display {\n        margin-bottom: 4px;\n        display: block;\n      }\n      val-title {\n        margin-bottom: 8px;\n        display: block;\n      }\n      .info-features {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n        margin: 16px 0;\n      }\n      .info-feature {\n        display: flex;\n        align-items: flex-start;\n        gap: 14px;\n        padding: 12px 14px;\n        border-radius: 10px;\n        background: var(--ion-color-light, #f4f5f8);\n      }\n      :host-context(body.dark) .info-feature,\n      :host-context(html.ion-palette-dark) .info-feature,\n      :host-context([data-theme='dark']) .info-feature {\n        background: rgba(255, 255, 255, 0.05);\n      }\n      .info-feature__icon {\n        font-size: 22px;\n        color: var(--ion-color-primary);\n        flex-shrink: 0;\n        margin-top: 2px;\n      }\n      .info-feature__title {\n        font-weight: 600;\n        font-size: 0.9rem;\n        color: var(--ion-color-dark);\n      }\n      .info-feature__desc {\n        font-size: 0.82rem;\n        color: var(--ion-color-medium);\n        margin-top: 2px;\n      }\n      .sheet-footer {\n        margin-top: 20px;\n      }\n    `,\n  ],\n})\nexport class OrgInfoSheetComponent {\n  private i18n = inject(I18nService);\n\n  /** Título principal (resuelto por el consumer). Fallback al namespace propio. */\n  @Input() title = '';\n  /** Subtítulo (resuelto por el consumer). Fallback al namespace propio. */\n  @Input() subtitle = '';\n  /** Cuerpo en párrafos separados por doble salto de línea (resuelto por el consumer). */\n  @Input() body = '';\n  /** Label del botón cerrar (resuelto por el consumer). Fallback al namespace propio. */\n  @Input() closeLabel = '';\n\n  /** Props del botón cerrar del footer (el consumer puede pasar custom). */\n  @Input() closeProps: Partial<ButtonMetadata> = {\n    text: 'Cerrar',\n    fill: 'outline',\n    color: 'dark',\n    size: 'default',\n    expand: 'block',\n    type: 'button',\n  };\n\n  /** Inyectado por `ModalService.open` — referencia para cerrar desde dentro. */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  constructor() {\n    addIcons({ peopleOutline, swapHorizontalOutline, mailOutline });\n    if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {\n      this.i18n.registerContent(DEFAULT_NAMESPACE, ORG_INFO_SHEET_I18N);\n    }\n  }\n\n  readonly resolvedTitle = computed(() => this.title || this.tt('title'));\n  readonly resolvedSubtitle = computed(() => this.subtitle || this.tt('subtitle'));\n  readonly resolvedCloseLabel = computed(() => this.closeLabel || this.tt('close'));\n\n  readonly paragraphs = computed<string[]>(() => this.body.split('\\n\\n').filter(Boolean));\n\n  readonly resolvedCloseProps = computed<Partial<ButtonMetadata>>(() => ({\n    ...this.closeProps,\n    text: this.closeProps.text || this.resolvedCloseLabel(),\n  }));\n\n  dismiss(): void {\n    this._modalRef?.dismiss(null, 'cancel');\n  }\n\n  protected tt(key: string): string {\n    return this.i18n.t(key, DEFAULT_NAMESPACE);\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-switch-org-modal`. Auto-registrados en\n * el constructor del componente si el consumer no proveyó el namespace\n * (`Settings.SwitchOrg` por default). SOLO incluye las keys que el modal usa.\n */\nexport const SWITCH_ORG_MODAL_I18N: LanguagesContent = {\n  es: {\n    title: 'Cambiar de cuenta',\n    subtitle: 'Selecciona la organización a la que quieres cambiar.',\n    searchPlaceholder: 'Buscar organización...',\n    noResults: 'No se encontraron organizaciones.',\n    current: 'Actual',\n    close: 'Cerrar',\n    switchError: 'No se pudo cambiar de organización.',\n  },\n  en: {\n    title: 'Switch account',\n    subtitle: 'Select the organization you want to switch to.',\n    searchPlaceholder: 'Search organization...',\n    noResults: 'No organizations found.',\n    current: 'Active',\n    close: 'Close',\n    switchError: 'Could not switch organization.',\n  },\n};\n","import { Component, computed, inject, Input, signal } from '@angular/core';\nimport { take } from 'rxjs/operators';\nimport {\n  IonButton,\n  IonButtons,\n  IonContent,\n  IonHeader,\n  IonIcon,\n  IonSpinner,\n  IonToolbar,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { businessOutline, checkmarkCircleOutline } from 'ionicons/icons';\n\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';\nimport { SearchbarComponent } from '../../molecules/searchbar/searchbar.component';\n\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { I18nService } from '../../../services/i18n';\nimport { OrgService } from '../../../services/org/org.service';\nimport { Organization } from '../../../services/org/types';\nimport { OrgSwitchService } from '../../../services/auth/org-switch.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { SWITCH_ORG_MODAL_I18N } from './switch-org-modal.i18n';\n\nconst DEFAULT_NAMESPACE = 'Settings.SwitchOrg';\n\naddIcons({ businessOutline, checkmarkCircleOutline });\n\n/**\n * `val-switch-org-modal` — modal de cambio de organización activa (organism\n * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por\n * la vista Cuenta (y futuras vistas org-aware).\n *\n * Lista las organizaciones del user (vía `OrgService.listMyOrgs`), permite buscar\n * por nombre, y cambia la org activa con `OrgSwitchService.switchTo`. La org\n * actual queda primera y deshabilitada.\n *\n * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` + callback\n * `onSuccess`. Header canónico (Regla #5): sin `ion-title`, botón Cerrar texto en\n * `slot=end`, título/subtítulo en el body con `val-display`/`val-title`.\n *\n * Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el namespace\n * `Settings.SwitchOrg`.\n */\n@Component({\n  selector: 'val-switch-org-modal',\n  standalone: true,\n  imports: [\n    IonHeader,\n    IonToolbar,\n    IonButtons,\n    IonButton,\n    IonContent,\n    IonSpinner,\n    IonIcon,\n    DisplayComponent,\n    EmptyStateComponent,\n    SearchbarComponent,\n    TitleComponent,\n  ],\n  template: `\n    <ion-header>\n      <ion-toolbar>\n        <ion-buttons slot=\"end\">\n          <ion-button fill=\"clear\" color=\"dark\" (click)=\"dismiss()\">\n            <strong>{{ t('close') }}</strong>\n          </ion-button>\n        </ion-buttons>\n      </ion-toolbar>\n    </ion-header>\n\n    <ion-content class=\"ion-padding\">\n      <val-display [props]=\"{ content: t('title'), size: 'small', color: 'dark' }\" />\n      <val-title\n        [props]=\"{\n          content: t('subtitle'),\n          size: 'large',\n          color: '',\n          bold: false,\n        }\"\n      />\n\n      <div class=\"switch-section\">\n        <val-searchbar\n          [props]=\"{\n            placeholder: t('searchPlaceholder'),\n            debounce: 200,\n            showCancelButton: 'never',\n          }\"\n          (filterEvent)=\"onQueryChange($event)\"\n        />\n\n        @if (loading()) {\n          <div class=\"switch-state\">\n            <ion-spinner name=\"crescent\" />\n          </div>\n        } @else if (filteredOrgs().length === 0) {\n          <val-empty-state\n            [props]=\"{\n              variant: 'empty',\n              title: t('noResults'),\n              icon: 'business-outline',\n            }\"\n          />\n        } @else {\n          <div class=\"orgs-list\">\n            @for (org of filteredOrgs(); track org.id) {\n              <button\n                type=\"button\"\n                class=\"org-row\"\n                [class.org-row--active]=\"org.id === activeOrgId()\"\n                [disabled]=\"!!switchingId() || org.id === activeOrgId()\"\n                (click)=\"onSelect(org)\"\n              >\n                <div class=\"org-row__icon\">\n                  <ion-icon name=\"business-outline\" />\n                </div>\n                <div class=\"org-row__body\">\n                  <span class=\"org-row__name\">{{ org.name }}</span>\n                  <span class=\"org-row__type\">{{ org.type }}</span>\n                </div>\n                <div class=\"org-row__end\">\n                  @if (switchingId() === org.id) {\n                    <ion-spinner name=\"crescent\" class=\"org-row__spinner\" />\n                  } @else if (org.id === activeOrgId()) {\n                    <span class=\"org-row__current\">{{ t('current') }}</span>\n                    <ion-icon name=\"checkmark-circle-outline\" class=\"org-row__check\" />\n                  }\n                </div>\n              </button>\n            }\n          </div>\n        }\n      </div>\n    </ion-content>\n  `,\n  styles: [\n    `\n      .switch-section {\n        margin-top: 16px;\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n      }\n      .switch-state {\n        display: flex;\n        justify-content: center;\n        padding: 24px 0;\n      }\n      .orgs-list {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n      .org-row {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        width: 100%;\n        padding: 12px 14px;\n        border: 1px solid rgba(var(--ion-color-dark-rgb), 0.14);\n        border-radius: 12px;\n        background: var(--ion-card-background, var(--ion-background-color));\n        cursor: pointer;\n        text-align: left;\n        transition:\n          border-color 0.15s ease,\n          opacity 0.15s ease;\n      }\n      .org-row:not(:disabled):active {\n        opacity: 0.7;\n      }\n      .org-row:disabled {\n        cursor: default;\n      }\n      .org-row--active {\n        border-color: var(--ion-color-dark);\n      }\n      .org-row__icon {\n        width: 36px;\n        height: 36px;\n        border-radius: 50%;\n        flex-shrink: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 18px;\n        color: var(--ion-color-dark);\n        background: rgba(var(--ion-color-dark-rgb), 0.08);\n      }\n      .org-row__body {\n        flex: 1;\n        min-width: 0;\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n      }\n      .org-row__name {\n        font-weight: 600;\n        font-size: 0.95rem;\n        color: var(--ion-color-dark);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .org-row__type {\n        font-size: 0.8rem;\n        color: rgba(var(--ion-color-dark-rgb), 0.7);\n      }\n      .org-row__end {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        flex-shrink: 0;\n      }\n      .org-row__current {\n        font-size: 0.74rem;\n        font-weight: 600;\n        text-transform: uppercase;\n        letter-spacing: 0.04em;\n        color: rgba(var(--ion-color-dark-rgb), 0.7);\n      }\n      .org-row__check {\n        font-size: 1.1rem;\n        color: var(--ion-color-dark);\n      }\n      .org-row__spinner {\n        width: 18px;\n        height: 18px;\n        color: var(--ion-color-dark);\n      }\n    `,\n  ],\n})\nexport class SwitchOrgModalComponent {\n  private i18n = inject(I18nService);\n  private auth = inject(AuthService);\n  private orgService = inject(OrgService);\n  private orgSwitch = inject(OrgSwitchService);\n  private errors = inject(ValtechErrorService);\n\n  /** Inyectado por `ModalService.open` — referencia para cerrar desde dentro. */\n  @Input() _modalRef?: { dismiss: (data?: unknown, role?: string) => void };\n\n  /** Callback tras un switch exitoso (pasado por `componentProps`). */\n  @Input() onSuccess?: () => void;\n\n  /** Namespace i18n con que la vista resuelve sus textos. */\n  @Input() i18nNamespace = DEFAULT_NAMESPACE;\n\n  readonly orgs = signal<Organization[]>([]);\n  readonly loading = signal(false);\n  readonly query = signal('');\n  readonly switchingId = signal<string | null>(null);\n\n  readonly activeOrgId = computed(() => {\n    const u = this.auth.user() as {\n      activeOrgId?: string;\n      activeOrg?: string;\n    } | null;\n    return u?.activeOrgId ?? u?.activeOrg ?? '';\n  });\n\n  readonly filteredOrgs = computed(() => {\n    const q = this.query().trim().toLowerCase();\n    const list = this.orgs();\n    if (!q) return list;\n    return list.filter(o => o.name.toLowerCase().includes(q));\n  });\n\n  constructor() {\n    if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {\n      this.i18n.registerContent(DEFAULT_NAMESPACE, SWITCH_ORG_MODAL_I18N);\n    }\n    this.loadOrgs();\n  }\n\n  onQueryChange(value: string): void {\n    this.query.set(value ?? '');\n  }\n\n  async onSelect(org: Organization): Promise<void> {\n    if (this.switchingId() || org.id === this.activeOrgId()) return;\n    this.switchingId.set(org.id);\n    try {\n      await this.orgSwitch.switchTo(org.id);\n      this.onSuccess?.();\n      this.dismiss();\n    } catch (err) {\n      this.errors.handle(err, {\n        context: 'account.switchOrg',\n        fallbackKey: 'switchError',\n        i18nNamespace: this.i18nNamespace,\n      });\n      this.switchingId.set(null);\n    }\n  }\n\n  private loadOrgs(): void {\n    this.loading.set(true);\n    this.orgService\n      .listMyOrgs()\n      .pipe(take(1))\n      .subscribe({\n        next: orgs => {\n          const activeId = this.activeOrgId();\n          this.orgs.set([...orgs].sort((a, b) => (a.id === activeId ? -1 : b.id === activeId ? 1 : 0)));\n          this.loading.set(false);\n        },\n        error: () => this.loading.set(false),\n      });\n  }\n\n  dismiss(): void {\n    this._modalRef?.dismiss(null, 'cancel');\n  }\n\n  t(key: string): string {\n    return this.i18n.t(key, this.i18nNamespace);\n  }\n}\n","import { LanguagesContent } from '../../../services/i18n/types';\n\n/**\n * Defaults i18n (es/en) embebidos en `val-account-view`. Auto-registrados en el\n * constructor del componente si el consumer no proveyó el namespace\n * (`Settings.Account` por default). SOLO incluye las keys que la vista usa.\n */\nexport const ACCOUNT_VIEW_I18N: LanguagesContent = {\n  es: {\n    pageTitle: 'Cuenta',\n    pageDescription: 'Organizaciones y seguridad de la cuenta',\n    orgsTitle: 'Tus organizaciones',\n    orgsCurrent: 'Actual',\n    orgsEmpty: 'Aún no perteneces a otras organizaciones.',\n    orgsSwitch: 'Cambiar',\n    switchAccountCta: 'Cambiar de cuenta',\n    orgsViewAll: 'Ver todas',\n    orgsManage: 'Gestionar',\n    orgsEmptyHint: 'Aún no perteneces a otras organizaciones.',\n    orgsNewCta: 'Nueva organización',\n    orgsNewQuestion: '¿Necesitas otra organización?',\n    orgsNewHint: 'Crea un espacio separado para otro equipo, empresa o proyecto.',\n    orgsMoreInfo: 'Más información',\n    orgsInfoTitle: '¿Qué son las organizaciones?',\n    orgsInfoSubtitle: 'Todo lo que necesitas saber',\n    orgsInfoClose: 'Cerrar',\n    orgsInfoContent:\n      'Las organizaciones te permiten separar tus proyectos y datos por empresa, equipo o contexto. Puedes pertenecer a varias organizaciones y cambiar entre ellas en cualquier momento.\\n\\nCada organización tiene sus propios miembros, roles y permisos. La organización activa determina qué datos ves y qué acciones puedes realizar.\\n\\nPuedes crear una organización nueva o unirte a una existente mediante invitación.',\n    orgsTypePersonal: 'Personal',\n    orgsTypePrivate: 'Privada',\n    orgsTypePublic: 'Pública',\n    orgsTypeBusiness: 'Empresa',\n    orgsLabelType: 'Tipo',\n    orgsLabelRole: 'Rol',\n    orgsLabelStatus: 'Estado',\n    orgsStatusActive: 'Activa',\n    logoutTitle: 'Cerrar esta sesión',\n    logoutHint: 'Cierra tu sesión en este dispositivo.',\n    logout: 'Cerrar sesión',\n    dangerTitle: 'Zona peligrosa',\n    dangerDeleteTitle: 'Eliminar cuenta',\n    dangerDeleteHint:\n      'Borra tu cuenta y todos los datos asociados. Esta acción no se puede deshacer.',\n    dangerDeleteCta: 'Eliminar cuenta',\n    inviteAccepted: 'Te has unido a la organización.',\n    inviteDeclined: 'Invitación rechazada.',\n    accept: 'Aceptar',\n    decline: 'Rechazar',\n    pendingInvitesTitle: 'Invitaciones pendientes',\n    orgsErrorTitle: 'No se pudieron cargar las organizaciones',\n    orgsOfflineTitle: 'Sin conexión',\n    orgsOfflineHint: 'Verifica tu conexión e intenta de nuevo.',\n    orgsRetry: 'Reintentar',\n  },\n  en: {\n    pageTitle: 'Account',\n    pageDescription: 'Organizations and account security',\n    orgsTitle: 'Your organizations',\n    orgsCurrent: 'Active',\n    orgsEmpty: \"You don't belong to other organizations yet.\",\n    orgsSwitch: 'Switch',\n    switchAccountCta: 'Switch account',\n    orgsViewAll: 'View all',\n    orgsManage: 'Manage',\n    orgsEmptyHint: \"You don't belong to other organizations yet.\",\n    orgsNewCta: 'New organization',\n    orgsNewQuestion: 'Need another organization?',\n    orgsNewHint: 'Create a separate space for another team, company or project.',\n    orgsMoreInfo: 'More information',\n    orgsInfoTitle: 'What are organizations?',\n    orgsInfoSubtitle: 'Everything you need to know',\n    orgsInfoClose: 'Close',\n    orgsInfoContent:\n      'Organizations let you separate your projects and data by company, team, or context. You can belong to multiple organizations and switch between them at any time.\\n\\nEach organization has its own members, roles, and permissions. The active organization determines what data you see and what actions you can take.\\n\\nYou can create a new organization or join an existing one via invitation.',\n    orgsTypePersonal: 'Personal',\n    orgsTypePrivate: 'Private',\n    orgsTypePublic: 'Public',\n    orgsTypeBusiness: 'Business',\n    orgsLabelType: 'Type',\n    orgsLabelRole: 'Role',\n    orgsLabelStatus: 'Status',\n    orgsStatusActive: 'Active',\n    logoutTitle: 'Sign out of this device',\n    logoutHint: 'End your session on this device.',\n    logout: 'Sign out',\n    dangerTitle: 'Danger zone',\n    dangerDeleteTitle: 'Delete account',\n    dangerDeleteHint: 'Delete your account and all related data. This action cannot be undone.',\n    dangerDeleteCta: 'Delete account',\n    inviteAccepted: 'You have joined the organization.',\n    inviteDeclined: 'Invitation declined.',\n    accept: 'Accept',\n    decline: 'Decline',\n    pendingInvitesTitle: 'Pending invitations',\n    orgsErrorTitle: 'Could not load organizations',\n    orgsOfflineTitle: 'No connection',\n    orgsOfflineHint: 'Check your connection and try again.',\n    orgsRetry: 'Retry',\n  },\n};\n","import { TitleCasePipe } from '@angular/common';\nimport { Component, computed, inject, Input, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  businessOutline,\n  chevronForwardOutline,\n  mailOutline,\n  peopleOutline,\n  swapHorizontalOutline,\n} from 'ionicons/icons';\nimport { take } from 'rxjs/operators';\n\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { DisplayComponent } from '../../atoms/display/display.component';\nimport { TextComponent } from '../../atoms/text/text.component';\nimport { TitleComponent } from '../../atoms/title/title.component';\nimport { CtaCardComponent } from '../../molecules/cta-card/cta-card.component';\nimport { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';\nimport { EmptyStateMetadata } from '../../molecules/empty-state/types';\nimport { createErrorStateProps } from '../../molecules/empty-state/factory';\nimport { InvitationCardComponent } from '../../molecules/invitation-card/invitation-card.component';\nimport { ButtonGroupMetadata } from '../../molecules/button-group/types';\nimport { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';\nimport { ButtonMetadata } from '../../types';\n\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { I18nService } from '../../../services/i18n';\nimport { interpretError } from '../../../services/errors/interpret-error';\nimport { ModalService } from '../../../services/modal/modal.service';\nimport { NavigationService } from '../../../services/navigation/navigation.service';\nimport { OrgService } from '../../../services/org/org.service';\nimport { Organization, PendingInvitation } from '../../../services/org/types';\nimport { connectPageRefresh } from '../../../services/page-refresh/page-refresh.service';\nimport { ToastService } from '../../../services/toast.service';\nimport { ValtechErrorService } from '../../../services/errors/valtech-error.service';\n\nimport { CreateOrgModalComponent } from '../create-org-modal/create-org-modal.component';\nimport { DeleteAccountModalComponent } from '../delete-account-modal/delete-account-modal.component';\nimport { OrgInfoSheetComponent } from '../org-info-sheet/org-info-sheet.component';\nimport { SwitchOrgModalComponent } from '../switch-org-modal/switch-org-modal.component';\n\nimport { AccountViewConfig } from './types';\nimport { ACCOUNT_VIEW_I18N } from './account-view.i18n';\n\naddIcons({ peopleOutline, businessOutline, chevronForwardOutline, swapHorizontalOutline, mailOutline });\n\nconst DEFAULT_NAMESPACE = 'Settings.Account';\nconst DEFAULT_MANAGE_ORG_ROUTE = '/app/settings/organization';\n\n/**\n * `val-account-view` — vista Cuenta full-feature autocontenida (organism).\n * Promovida desde `showcase` bajo el proceso de ADR-021. Reúne:\n *  - **Invitaciones pendientes** — aceptar / rechazar (`val-invitation-card`).\n *  - **Organizaciones** — card de org activa + empty-card + CTA \"Nueva org\"\n *    (modal `val-create-org-modal`) + \"Ver todas\" (modal `val-switch-org-modal`).\n *  - **Cerrar esta sesión** — `auth.logoutWithConfirmation()`.\n *  - **Eliminar cuenta** — modal `val-delete-account-modal`.\n *\n * NO renderiza ion-content — vive dentro de val-page-wrapper. No usa deep-links;\n * `ActivatedRoute` se inyecta `{ optional: true }` solo para leer el route data\n * de config. La navegación a la org route va por `NavigationService`.\n *\n * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no\n * proveyó el namespace configurado (default `Settings.Account`).\n */\n@Component({\n  selector: 'val-account-view',\n  standalone: true,\n  imports: [\n    DisplayComponent,\n    EmptyStateComponent,\n    SkeletonLayoutComponent,\n    TitleComponent,\n    TextComponent,\n    ButtonComponent,\n    CtaCardComponent,\n    InvitationCardComponent,\n    IonIcon,\n    IonButton,\n    TitleCasePipe,\n  ],\n  template: `\n    <div class=\"page\">\n      <header class=\"page-header\">\n        <val-display [props]=\"{ size: 'small', color: 'dark', content: pageTitle() }\" />\n        <val-title\n          [props]=\"{\n            size: 'large',\n            color: 'dark',\n            bold: false,\n            content: pageDescription(),\n          }\"\n        />\n      </header>\n\n      @if (resolvedConfig().showPendingInvites && pendingInvites().length > 0) {\n        <val-title\n          [props]=\"{\n            size: 'medium',\n            color: 'dark',\n            bold: true,\n            content: tt('pendingInvitesTitle'),\n          }\"\n        />\n        @for (invite of pendingInvites(); track invite.orgId) {\n          <val-invitation-card\n            [props]=\"{\n              token: invite.orgId,\n              orgName: invite.orgName,\n              inviterName: invite.inviterName,\n              role: invite.roleId,\n              accepting: inviteAccepting() === invite.orgId,\n              disabled: !!inviteAccepting(),\n              acceptLabel: tt('accept'),\n              declineLabel: tt('decline'),\n            }\"\n            (onAccept)=\"acceptPendingInvite(invite)\"\n            (onDecline)=\"declinePendingInvite(invite)\"\n          />\n        }\n      }\n\n      @if (resolvedConfig().showOrganizations) {\n        <!-- Organizations -->\n        <section class=\"settings-section\">\n          <div class=\"section-header-row\">\n            <val-title\n              [props]=\"{\n                size: 'medium',\n                color: 'dark',\n                bold: true,\n                content: orgsTitle(),\n              }\"\n            />\n            @if (orgs().length > 1) {\n              <ion-button fill=\"outline\" color=\"dark\" shape=\"round\" size=\"small\" (click)=\"onSwitchAccount()\">\n                {{ tt('orgsViewAll') }}\n              </ion-button>\n            }\n          </div>\n          <div class=\"section-body\">\n            @if (orgsLoading()) {\n              <val-skeleton-layout [props]=\"{ preset: 'list', rows: 3 }\" />\n            } @else if (orgsErrorState()) {\n              <val-empty-state [props]=\"orgsErrorState()!\" />\n            } @else {\n              @if (activeOrg(); as org) {\n                <div class=\"orgs-list\">\n                  <div class=\"org-card org-card--active\">\n                    <div class=\"org-card__icon\">\n                      <ion-icon name=\"business-outline\" />\n                    </div>\n                    <div class=\"org-card__body\">\n                      <span class=\"org-card__name\">{{ org.name }}</span>\n                      <div class=\"org-card__meta\">\n                        <span class=\"org-card__meta-item\">\n                          <span class=\"org-card__meta-label\">{{ tt('orgsLabelType') }}</span>\n                          {{ orgTypeLabel(org.type) }}\n                        </span>\n                        @if (activeOrgRole()) {\n                          <span class=\"org-card__meta-item\">\n                            <span class=\"org-card__meta-label\">{{ tt('orgsLabelRole') }}</span>\n                            {{ activeOrgRole() | titlecase }}\n                          </span>\n                        }\n                        <span class=\"org-card__meta-item\">\n                          <span class=\"org-card__meta-label\">{{ tt('orgsLabelStatus') }}</span>\n                          {{ tt('orgsStatusActive') }}\n                        </span>\n                      </div>\n                    </div>\n                    <div class=\"org-card__end\">\n                      <ion-button fill=\"outline\" color=\"dark\" shape=\"round\" size=\"small\" (click)=\"onManageOrg()\">\n                        {{ tt('orgsManage') }}\n                      </ion-button>\n                    </div>\n                  </div>\n                </div>\n              } @else if (orgs().length === 0) {\n                <div class=\"orgs-empty-card\">\n                  <div class=\"orgs-empty-card__main\">\n                    <ion-icon name=\"people-outline\" class=\"orgs-empty-card__icon\" />\n                    <span class=\"orgs-empty-card__text\">{{ orgsEmpty() }}</span>\n                  </div>\n                  <button class=\"orgs-empty-card__link\" (click)=\"onMoreInfo()\">\n                    {{ orgsMoreInfo() }}\n                  </button>\n                </div>\n              }\n              @if (resolvedConfig().showNewOrgCta) {\n                <!-- Nueva organizacion: CTA card con titulo, subtitulo y boton -->\n                <val-cta-card class=\"org-new-cta-card\" [props]=\"newOrgCtaProps()\" (onAction)=\"onNewOrg()\" />\n              }\n            }\n          </div>\n        </section>\n      }\n\n      @if (resolvedConfig().showLogout) {\n        <!-- Logout this session -->\n        <section class=\"settings-section\">\n          <val-title\n            [props]=\"{\n              size: 'medium',\n              color: 'dark',\n              bold: true,\n              content: logoutTitle(),\n            }\"\n          />\n          <div class=\"section-body\">\n            <val-text\n              [props]=\"{\n                content: logoutHint(),\n                size: 'medium',\n                color: 'dark',\n                bold: false,\n              }\"\n            />\n            <div class=\"row-actions\">\n              <val-button [props]=\"logoutButtonProps()\" (click)=\"onLogout()\" />\n            </div>\n          </div>\n        </section>\n      }\n\n      @if (resolvedConfig().showDeleteAccount) {\n        <!-- Delete account -->\n        <section class=\"settings-section\">\n          <val-title\n            [props]=\"{\n              size: 'medium',\n              color: 'dark',\n              bold: true,\n              content: dangerDeleteTitle(),\n            }\"\n          />\n          <div class=\"section-body\">\n            <val-text\n              [props]=\"{\n                content: dangerDeleteHint(),\n                size: 'medium',\n                color: 'dark',\n                bold: false,\n              }\"\n            />\n            <div class=\"row-actions\">\n              <val-button [props]=\"deleteAccountButtonProps()\" (onClick)=\"onDeleteAccount()\" />\n            </div>\n          </div>\n        </section>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .page {\n        padding: 16px 0;\n        max-width: 720px;\n        margin: 0 auto;\n      }\n      .page-header {\n        margin-bottom: 16px;\n      }\n      .settings-section {\n        padding: 16px 0;\n      }\n      .settings-section + .settings-section {\n        border-top: 1px solid var(--val-border-color, rgba(0, 0, 0, 0.08));\n      }\n      .settings-section val-title {\n        display: block;\n        margin-bottom: 12px;\n      }\n      .section-body {\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n      }\n      .row-actions {\n        margin-top: 12px;\n      }\n      .row-actions--gap {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n      .section-header-row {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 8px;\n        margin-bottom: 8px;\n      }\n      .org-new-cta-card {\n        display: block;\n        margin-top: 12px;\n      }\n      .orgs-empty-card {\n        background: var(--ion-color-secondary-tint, rgba(var(--ion-color-secondary-rgb, 130, 101, 208), 0.2));\n        border-radius: 18px;\n        padding: 18px 16px 12px;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n      .orgs-empty-card__main {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n      }\n      .orgs-empty-card__icon {\n        font-size: 20px;\n        flex-shrink: 0;\n        color: var(--ion-color-dark);\n      }\n      .orgs-empty-card__text {\n        font-size: 0.875rem;\n        color: var(--ion-color-dark);\n      }\n      .orgs-empty-card__link {\n        background: none;\n        border: none;\n        padding: 0;\n        cursor: pointer;\n        font-size: 0.8125rem;\n        color: var(--ion-color-primary);\n        text-align: left;\n        text-decoration: underline;\n        text-underline-offset: 2px;\n        font-family: inherit;\n      }\n      .orgs-list {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n      .org-card {\n        display: flex;\n        align-items: center;\n        gap: 14px;\n        padding: 14px 16px;\n        border-radius: 12px;\n        background: var(--ion-color-light, #f4f5f8);\n        border: 1.5px solid transparent;\n        cursor: pointer;\n        transition:\n          background 0.15s,\n          border-color 0.15s;\n      }\n      .org-card:active {\n        opacity: 0.75;\n      }\n      .org-card--active {\n        border-color: var(--ion-color-primary);\n        background: color-mix(in srgb, var(--ion-color-primary) 8%, transparent);\n      }\n      :host-context(body.dark) .org-card,\n      :host-context(html.ion-palette-dark) .org-card,\n      :host-context([data-theme='dark']) .org-card {\n        background: rgba(255, 255, 255, 0.05);\n      }\n      :host-context(body.dark) .org-card--active,\n      :host-context(html.ion-palette-dark) .org-card--active,\n      :host-context([data-theme='dark']) .org-card--active {\n        background: color-mix(in srgb, var(--ion-color-primary) 15%, transparent);\n      }\n      .org-card__icon {\n        width: 40px;\n        height: 40px;\n        border-radius: 50%;\n        background: color-mix(in srgb, var(--ion-color-primary) 15%, transparent);\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        flex-shrink: 0;\n        font-size: 20px;\n        color: var(--ion-color-primary);\n      }\n      .org-card__body {\n        flex: 1;\n        min-width: 0;\n        display: flex;\n        flex-direction: column;\n        gap: 2px;\n      }\n      .org-card__name {\n        font-weight: 600;\n        font-size: 0.95rem;\n        color: var(--ion-color-dark);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .org-card__meta {\n        display: flex;\n        flex-direction: column;\n        gap: 1px;\n        margin-top: 3px;\n      }\n      .org-card__meta-item {\n        font-size: 0.78rem;\n        color: var(--ion-color-dark);\n      }\n      .org-card__meta-label {\n        font-weight: 600;\n        color: var(--ion-color-dark);\n        margin-right: 4px;\n      }\n      .org-card__end {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex-shrink: 0;\n      }\n    `,\n  ],\n})\nexport class AccountViewComponent {\n  private nav = inject(NavigationService);\n  private i18n = inject(I18nService);\n  private auth = inject(AuthService);\n  private orgService = inject(OrgService);\n  private modalService = inject(ModalService);\n  private toast = inject(ToastService);\n  private errors = inject(ValtechErrorService);\n  private route = inject(ActivatedRoute, { optional: true });\n\n  /**\n   * Config vía @Input (object-first). Si no se pasa, se cae al route data\n   * `accountConfig` (poblado por `provideValtechAccountRoutes`). `resolvedConfig`\n   * mergea con los defaults — `@Input` gana sobre route data.\n   */\n  @Input() config?: AccountViewConfig;\n\n  readonly resolvedConfig = computed<\n    Required<Omit<AccountViewConfig, 'onOrgSwitched' | 'onOrgCreated' | 'onLoggedOut' | 'onAccountDeleted'>> &\n      Pick<AccountViewConfig, 'onOrgSwitched' | 'onOrgCreated' | 'onLoggedOut' | 'onAccountDeleted'>\n  >(() => {\n    const fromRoute = (this.route?.snapshot.data['accountConfig'] ?? {}) as AccountViewConfig;\n    const merged: AccountViewConfig = { ...fromRoute, ...(this.config ?? {}) };\n    return {\n      showPendingInvites: merged.showPendingInvites ?? true,\n      showOrganizations: merged.showOrganizations ?? true,\n      showNewOrgCta: merged.showNewOrgCta ?? true,\n      showLogout: merged.showLogout ?? true,\n      showDeleteAccount: merged.showDeleteAccount ?? true,\n      i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,\n      manageOrgRoute: merged.manageOrgRoute ?? DEFAULT_MANAGE_ORG_ROUTE,\n      onOrgSwitched: merged.onOrgSwitched,\n      onOrgCreated: merged.onOrgCreated,\n      onLoggedOut: merged.onLoggedOut,\n      onAccountDeleted: merged.onAccountDeleted,\n    };\n  });\n\n  /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */\n  private get ns(): string {\n    return this.resolvedConfig().i18nNamespace;\n  }\n\n  readonly orgs = signal<Organization[]>([]);\n  readonly orgsLoading = signal(false);\n  private readonly orgsError = signal<unknown>(null);\n\n  readonly orgsErrorState = computed<EmptyStateMetadata | null>(() => {\n    this.i18n.lang();\n    const err = this.orgsError();\n    if (!err) return null;\n    return createErrorStateProps(err, {\n      title: {\n        offline: this.tt('orgsOfflineTitle'),\n        error: this.tt('orgsErrorTitle'),\n      },\n      description: {\n        offline: this.tt('orgsOfflineHint'),\n        error: interpretError(err).message,\n      },\n      retryLabel: this.tt('orgsRetry'),\n      onRetry: () => this.loadOrgs(),\n      retrying: this.orgsLoading(),\n    });\n  });\n\n  readonly pendingInvites = signal<PendingInvitation[]>([]);\n  readonly pendingInvitesLoading = signal(false);\n  readonly inviteAccepting = signal<string | null>(null);\n\n  readonly pageTitle = computed(() => this.tt('pageTitle'));\n  readonly pageDescription = computed(() => this.tt('pageDescription'));\n  readonly orgsTitle = computed(() => this.tt('orgsTitle'));\n  readonly orgsEmpty = computed(() => this.tt('orgsEmpty'));\n  readonly orgsMoreInfo = computed(() => this.tt('orgsMoreInfo'));\n  readonly orgsNewQuestion = computed(() => this.tt('orgsNewQuestion'));\n  readonly orgsNewHint = computed(() => this.tt('orgsNewHint'));\n  readonly newOrgCtaProps = computed(() => ({\n    title: this.tt('orgsNewQuestion'),\n    description: this.tt('orgsNewHint'),\n    padding: '16px',\n    borderRadius: '14px',\n    actions: {\n      position: 'right',\n      columned: false,\n      buttons: [\n        {\n          text: this.tt('orgsNewCta'),\n          color: 'primary',\n          fill: 'outline',\n          shape: 'round',\n          size: 'default',\n          type: 'button',\n          state: 'ENABLED',\n          token: 'account-new-org',\n        },\n      ],\n    } as ButtonGroupMetadata,\n  }));\n  readonly logoutTitle = computed(() => this.tt('logoutTitle'));\n  readonly logoutHint = computed(() => this.tt('logoutHint'));\n  readonly dangerTitle = computed(() => this.tt('dangerTitle'));\n  readonly dangerDeleteTitle = computed(() => this.tt('dangerDeleteTitle'));\n  readonly dangerDeleteHint = computed(() => this.tt('dangerDeleteHint'));\n\n  readonly activeOrgId = computed(() => {\n    const u = this.auth.user() as {\n      activeOrgId?: string;\n      activeOrg?: string;\n    } | null;\n    return u?.activeOrgId ?? u?.activeOrg ?? '';\n  });\n\n  readonly activeOrgRole = computed(() => {\n    const roles = (this.auth as unknown as { roles?: () => string[] }).roles?.() ?? [];\n    return roles[0] ?? null;\n  });\n\n  readonly activeOrg = computed(() => this.orgs().find(o => o.id === this.activeOrgId()) ?? null);\n\n  readonly logoutButtonProps = computed<Partial<ButtonMetadata>>(() => ({\n    text: this.tt('logout'),\n    color: 'dark',\n    fill: 'outline',\n    size: 'default',\n    shape: 'round',\n    type: 'button',\n    token: 'account-logout',\n  }));\n\n  readonly deleteAccountButtonProps = computed<Partial<ButtonMetadata>>(() => ({\n    text: this.tt('dangerDeleteCta'),\n    color: 'dark',\n    fill: 'outline',\n    size: 'default',\n    shape: 'round',\n    type: 'button',\n    token: 'account-delete',\n  }));\n\n  readonly switchAccountButtonProps = computed<Partial<ButtonMetadata>>(() => ({\n    text: this.tt('switchAccountCta'),\n    color: 'dark',\n    fill: 'outline',\n    size: 'default',\n    shape: 'round',\n    type: 'button',\n    token: 'account-switch',\n  }));\n\n  constructor() {\n    const ns = this.ns;\n    if (!this.i18n.hasNamespace(ns)) {\n      this.i18n.registerContent(ns, ACCOUNT_VIEW_I18N);\n    }\n    this.nav.setBackHeader('pageTitle', ns, { withMenu: true });\n    this.loadOrgs();\n    this.loadPendingInvites();\n    connectPageRefresh(async () => {\n      await Promise.all([this.loadOrgs(), this.loadPendingInvites()]);\n    });\n  }\n\n  orgTypeLabel(type: string): string {\n    const map: Record<string, string> = {\n      PERSONAL: this.tt('orgsTypePersonal'),\n      PRIVATE: this.tt('orgsTypePrivate'),\n      PUBLIC: this.tt('orgsTypePublic'),\n      BUSINESS: this.tt('orgsTypeBusiness'),\n    };\n    return map[type] ?? type;\n  }\n\n  onSwitchAccount(): void {\n    void this.modalService.open({\n      component: SwitchOrgModalComponent,\n      componentProps: {\n        i18nNamespace: 'Settings.SwitchOrg',\n        onSuccess: () => {\n          this.loadOrgs();\n          this.loadPendingInvites();\n          this.resolvedConfig().onOrgSwitched?.();\n        },\n      },\n      breakpoints: {\n        breakpoints: [0, 0.85],\n        initialBreakpoint: 0.85,\n        showHandle: true,\n      },\n      backdropDismiss: true,\n    });\n  }\n\n  onDeleteAccount(): void {\n    void this.modalService.open({\n      component: DeleteAccountModalComponent,\n      componentProps: {\n        i18nNamespace: 'Settings.DeleteAccount',\n      },\n      breakpoints: {\n        breakpoints: [0, 0.85],\n        initialBreakpoint: 0.85,\n        showHandle: true,\n      },\n      backdropDismiss: false,\n    });\n    this.resolvedConfig().onAccountDeleted?.();\n  }\n\n  onManageOrg(): void {\n    this.nav.navigateByUrl(this.resolvedConfig().manageOrgRoute);\n  }\n\n  onNewOrg(): void {\n    void this.modalService.open({\n      component: CreateOrgModalComponent,\n      componentProps: {\n        i18nNamespace: 'CreateOrgModal',\n        onSuccess: (newOrg: Organization) => {\n          this.loadOrgs();\n          this.resolvedConfig().onOrgCreated?.(newOrg);\n        },\n      },\n      breakpoints: {\n        breakpoints: [0, 0.92],\n        initialBreakpoint: 0.92,\n        showHandle: true,\n      },\n      backdropDismiss: true,\n    });\n  }\n\n  onMoreInfo(): void {\n    void this.modalService.open({\n      component: OrgInfoSheetComponent,\n      componentProps: {\n        title: this.tt('orgsInfoTitle'),\n        subtitle: this.tt('orgsInfoSubtitle'),\n        body: this.tt('orgsInfoContent'),\n        closeLabel: this.tt('orgsInfoClose'),\n        closeProps: {\n          text: this.tt('orgsInfoClose'),\n          fill: 'outline',\n          color: 'dark',\n          size: 'default',\n          expand: 'block',\n          type: 'button',\n        },\n      },\n      breakpoints: {\n        breakpoints: [0, 0.85],\n        initialBreakpoint: 0.85,\n        showHandle: true,\n      },\n      backdropDismiss: true,\n    });\n  }\n\n  onLogout(): void {\n    this.auth.logoutWithConfirmation();\n    this.resolvedConfig().onLoggedOut?.();\n  }\n\n  private loadPendingInvites(): Promise<void> {\n    this.pendingInvitesLoading.set(true);\n    return new Promise<void>(resolve => {\n      this.orgService\n        .getPendingInvitations()\n        .pipe(take(1))\n        .subscribe({\n          next: items => {\n            this.pendingInvites.set(items);\n            this.pendingInvitesLoading.set(false);\n            resolve();\n          },\n          error: () => {\n            this.pendingInvitesLoading.set(false);\n            resolve();\n          },\n        });\n    });\n  }\n\n  acceptPendingInvite(invite: PendingInvitation): void {\n    if (this.inviteAccepting()) return;\n    this.inviteAccepting.set(invite.orgId);\n    this.orgService\n      .acceptInvitation(invite.orgId)\n      .pipe(take(1))\n      .subscribe({\n        next: () => {\n          this.toast.show({\n            message: this.tt('inviteAccepted'),\n            color: 'dark',\n            duration: 3500,\n          });\n          this.pendingInvites.update(list => list.filter(i => i.orgId !== invite.orgId));\n          this.loadOrgs();\n        },\n        error: err => {\n          this.errors.handle(err, { context: 'account.acceptPendingInvite' });\n          this.inviteAccepting.set(null);\n        },\n        complete: () => this.inviteAccepting.set(null),\n      });\n  }\n\n  declinePendingInvite(invite: PendingInvitation): void {\n    if (this.inviteAccepting()) return;\n    this.inviteAccepting.set(invite.orgId);\n    this.orgService\n      .declineInvitation(invite.orgId)\n      .pipe(take(1))\n      .subscribe({\n        next: () => {\n          this.toast.show({\n            message: this.tt('inviteDeclined'),\n            color: 'dark',\n            duration: 2500,\n          });\n          this.pendingInvites.update(list => list.filter(i => i.orgId !== invite.orgId));\n        },\n        error: err => {\n          this.errors.handle(err, { context: 'account.declinePendingInvite' });\n          this.inviteAccepting.set(null);\n        },\n        complete: () => this.inviteAccepting.set(null),\n      });\n  }\n\n  private loadOrgs(): Promise<void> {\n    this.orgsLoading.set(true);\n    this.orgsError.set(null);\n    return new Promise<void>(resolve => {\n      this.orgService.listMyOrgs().subscribe({\n        next: orgs => {\n          const activeId = this.activeOrgId();\n          this.orgs.set([...orgs].sort((a, b) => (a.id === activeId ? -1 : b.id === activeId ? 1 : 0)));\n          this.orgsLoading.set(false);\n          resolve();\n        },\n        error: err => {\n          this.orgsError.set(err);\n          this.orgsLoading.set(false);\n          resolve();\n        },\n      });\n    });\n  }\n\n  protected tt(key: string): string {\n    return this.i18n.t(key, this.ns);\n  }\n}\n","import { Routes } from '@angular/router';\n\nimport { AccountViewComponent } from './account-view.component';\nimport { AccountViewConfig } from './types';\n\n/**\n * Helper para montar la vista Cuenta (`val-account-view`) como ruta en una app\n * del factory. El `config` se pasa por route `data` (`accountConfig`) y el\n * componente lo lee como fallback de su `@Input() config`.\n *\n * @example\n * ```ts\n * // settings.routes.ts\n * export const settingsRoutes: Routes = [\n *   ...provideValtechAccountRoutes(),\n *   { path: 'preferences', loadComponent: () => ... },\n * ];\n *\n * // con config acotada:\n * ...provideValtechAccountRoutes({ config: { showDeleteAccount: false } }),\n * ...provideValtechAccountRoutes({ config: { manageOrgRoute: '/app/org' } }),\n * ```\n */\nexport function provideValtechAccountRoutes(opts?: {\n  path?: string;\n  config?: AccountViewConfig;\n}): Routes {\n  return [\n    {\n      path: opts?.path ?? 'account',\n      component: AccountViewComponent,\n      data: { accountConfig: opts?.config },\n    },\n  ];\n}\n","import {\n  ArticleElement,\n  ArticleListElement,\n  ArticleMetadata,\n  ArticleNoteElement,\n  ArticleSubtitleElement,\n  ArticleTitleElement,\n} from '../../components/organisms/article/types';\n\nexport type CalloutType = 'NOTE' | 'TIP' | 'INFO' | 'WARNING' | 'CAUTION' | 'IMPORTANT';\n\n/**\n * Localized label per callout kind. Used as the prefix shown inside the\n * resulting note element (e.g. `> [!NOTE] …` → `<val-notes-box prefix=\"Nota\">`).\n *\n * Defaults to Spanish for back-compat. Pass a different map per locale when\n * parsing translated documents so the prefix matches the body language.\n */\nexport type CalloutLabels = Record<CalloutType, string>;\n\n/** Built-in label sets for the three platform locales. */\nexport const CALLOUT_LABELS: Record<'es' | 'en' | 'pt', CalloutLabels> = {\n  es: {\n    NOTE: 'Nota',\n    TIP: 'Tip',\n    INFO: 'Info',\n    IMPORTANT: 'Importante',\n    WARNING: 'Atención',\n    CAUTION: 'Precaución',\n  },\n  en: {\n    NOTE: 'Note',\n    TIP: 'Tip',\n    INFO: 'Info',\n    IMPORTANT: 'Important',\n    WARNING: 'Warning',\n    CAUTION: 'Caution',\n  },\n  pt: {\n    NOTE: 'Nota',\n    TIP: 'Dica',\n    INFO: 'Info',\n    IMPORTANT: 'Importante',\n    WARNING: 'Atenção',\n    CAUTION: 'Cuidado',\n  },\n};\n\n/**\n * Per-callout-kind color (Ionic semantic color). Fixed across locales since\n * red = danger no matter what language you speak.\n */\nconst CALLOUT_COLORS: Record<CalloutType, ArticleNoteElement['props']['color']> = {\n  NOTE: 'primary',\n  TIP: 'success',\n  INFO: 'tertiary',\n  IMPORTANT: 'warning',\n  WARNING: 'warning',\n  CAUTION: 'danger',\n};\n\n/** Optional configuration for the parser. */\nexport interface ParseMarkdownArticleOptions extends Partial<ArticleMetadata> {\n  /**\n   * Locale used to pick built-in callout labels. Convenience shortcut so\n   * callers don't have to spread `CALLOUT_LABELS.en` themselves. Ignored\n   * when `calloutLabels` is provided explicitly.\n   */\n  locale?: 'es' | 'en' | 'pt';\n  /** Override every callout label individually. Takes precedence over `locale`. */\n  calloutLabels?: CalloutLabels;\n}\n\nconst BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;\nconst CALLOUT_RE = /^>\\s*\\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\\]\\s*(.*)$/i;\nconst FENCE_RE = /^```([\\w-]*)\\s*$/;\nconst HEADING_RE = /^(#{1,6})\\s+(.+)$/;\nconst SEPARATOR_RE = /^\\s*(?:-{3,}|\\*{3,}|_{3,})\\s*$/;\nconst UNORDERED_RE = /^\\s*[-*+]\\s+(.+)$/;\nconst CHECKLIST_RE = /^\\s*[-*+]\\s+\\[([ xX])\\]\\s+(.+)$/;\nconst ORDERED_RE = /^\\s*\\d+\\.\\s+(.+)$/;\nconst TABLE_DIVIDER_RE = /^\\s*\\|?[\\s:|-]+\\|?\\s*$/;\nconst TABLE_ROW_RE = /^\\s*\\|(.+)\\|\\s*$/;\n\n/**\n * Pure Markdown → ArticleMetadata parser. No Angular deps — usable from Node scripts\n * (build-time generation) and from the Angular `MarkdownArticleParserService` wrapper.\n *\n * Supported syntax:\n * - Headings (#, ##, ### …) → title / subtitle\n * - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)\n * - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)\n * - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes\n * - Code fences (```lang) → code\n * - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code\n * - Tables → flattened into paragraphs with bold keys\n * - Horizontal rules (---, ***, ___) → separator\n */\nexport function parseMarkdownArticle(\n  markdown: string,\n  options?: ParseMarkdownArticleOptions\n): ArticleMetadata {\n  const lines = normalize(markdown).split('\\n');\n  const elements: ArticleElement[] = [];\n  const labels: CalloutLabels =\n    options?.calloutLabels ??\n    (options?.locale ? CALLOUT_LABELS[options.locale] : CALLOUT_LABELS.es);\n\n  let i = 0;\n  while (i < lines.length) {\n    const line = lines[i];\n\n    if (line.trim() === '') {\n      i++;\n      continue;\n    }\n\n    const fence = line.match(FENCE_RE);\n    if (fence) {\n      const lang = fence[1] || undefined;\n      const body: string[] = [];\n      i++;\n      while (i < lines.length && !FENCE_RE.test(lines[i])) {\n        body.push(lines[i]);\n        i++;\n      }\n      i++;\n      elements.push({\n        type: 'code',\n        props: { code: body.join('\\n'), language: lang, theme: 'dark' },\n      });\n      continue;\n    }\n\n    if (BOX_DRAWING.test(line)) {\n      const body: string[] = [];\n      while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {\n        body.push(lines[i]);\n        i++;\n      }\n      while (body.length && body[body.length - 1].trim() === '') body.pop();\n      elements.push({\n        type: 'code',\n        props: { code: body.join('\\n'), language: 'text', theme: 'dark' },\n      });\n      continue;\n    }\n\n    if (SEPARATOR_RE.test(line)) {\n      elements.push({ type: 'separator', props: { style: 'line' } });\n      i++;\n      continue;\n    }\n\n    const heading = line.match(HEADING_RE);\n    if (heading) {\n      elements.push(makeHeading(heading[1].length, heading[2].trim()));\n      i++;\n      continue;\n    }\n\n    if (line.startsWith('>')) {\n      const block: string[] = [];\n      while (i < lines.length && lines[i].startsWith('>')) {\n        block.push(lines[i]);\n        i++;\n      }\n      elements.push(makeQuoteOrCallout(block, labels));\n      continue;\n    }\n\n    if (TABLE_ROW_RE.test(line)) {\n      const rows: string[] = [];\n      while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {\n        rows.push(lines[i]);\n        i++;\n      }\n      elements.push(...makeTable(rows));\n      continue;\n    }\n\n    if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {\n      const listType: 'checklist' | 'unordered' | 'ordered' = CHECKLIST_RE.test(line)\n        ? 'checklist'\n        : ORDERED_RE.test(line)\n          ? 'ordered'\n          : 'unordered';\n\n      const items: ArticleListElement['props']['items'] = [];\n      while (i < lines.length && lines[i].trim() !== '') {\n        const cur = lines[i];\n        const check = cur.match(CHECKLIST_RE);\n        const unord = cur.match(UNORDERED_RE);\n        const ord = cur.match(ORDERED_RE);\n        if (check) items.push({ text: processInlineBold(check[2].trim()) });\n        else if (ord && listType === 'ordered')\n          items.push({ text: processInlineBold(ord[1].trim()) });\n        else if (unord && listType !== 'ordered')\n          items.push({ text: processInlineBold(unord[1].trim()) });\n        else break;\n        i++;\n      }\n      elements.push({ type: 'list', props: { items, listType } });\n      continue;\n    }\n\n    const paragraph: string[] = [];\n    while (i < lines.length && lines[i].trim() !== '' && !startsNewBlock(lines[i])) {\n      paragraph.push(lines[i]);\n      i++;\n    }\n    const text = processInlineBold(paragraph.join(' ').trim());\n    if (text) {\n      elements.push({\n        type: 'paragraph',\n        props: {\n          content: text,\n          size: 'medium',\n          color: 'dark',\n          bold: false,\n          processLinks: true,\n          allowPartialBold: true,\n        },\n      });\n    }\n  }\n\n  // Strip parser-only options before merging into ArticleMetadata\n  const { locale: _l, calloutLabels: _c, ...metadataOverrides } = options ?? {};\n\n  return {\n    elements,\n    maxWidth: '900px',\n    centered: true,\n    theme: 'auto',\n    ...metadataOverrides,\n  };\n}\n\nfunction normalize(md: string): string {\n  return md.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\nfunction startsNewBlock(line: string): boolean {\n  return (\n    HEADING_RE.test(line) ||\n    FENCE_RE.test(line) ||\n    SEPARATOR_RE.test(line) ||\n    TABLE_ROW_RE.test(line) ||\n    UNORDERED_RE.test(line) ||\n    ORDERED_RE.test(line) ||\n    CHECKLIST_RE.test(line) ||\n    line.startsWith('>') ||\n    BOX_DRAWING.test(line)\n  );\n}\n\nfunction processInlineBold(text: string): string {\n  return text.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n}\n\nfunction makeHeading(level: number, content: string): ArticleTitleElement | ArticleSubtitleElement {\n  if (level === 1) {\n    return {\n      type: 'title',\n      props: { content, size: 'xlarge', color: 'dark', bold: true },\n    };\n  }\n  const size: 'large' | 'medium' | 'small' =\n    level === 2 ? 'large' : level === 3 ? 'medium' : 'small';\n  return {\n    type: 'subtitle',\n    props: { content, size, color: 'dark', bold: true },\n  };\n}\n\nfunction makeQuoteOrCallout(block: string[], labels: CalloutLabels): ArticleElement {\n  const first = block[0];\n  const callout = first.match(CALLOUT_RE);\n  const lines = block.map(l => l.replace(/^>\\s?/, ''));\n\n  if (callout) {\n    const type = callout[1].toUpperCase() as CalloutType;\n    const firstLineRest = callout[2] || '';\n    const rest = lines.slice(1).join(' ').trim();\n    const text = processInlineBold([firstLineRest, rest].filter(Boolean).join(' ').trim());\n    return makeNote(type, text, labels);\n  }\n\n  const text = processInlineBold(lines.join(' ').trim());\n  return {\n    type: 'quote',\n    props: {\n      content: text,\n      size: 'medium',\n      color: 'medium',\n      bold: false,\n      showQuoteMark: true,\n      alignment: 'left',\n    },\n  };\n}\n\nfunction makeNote(kind: CalloutType, text: string, labels: CalloutLabels): ArticleNoteElement {\n  return {\n    type: 'note',\n    props: {\n      text,\n      prefix: `${labels[kind]}:`,\n      color: CALLOUT_COLORS[kind],\n      textColor: 'dark',\n      size: 'medium',\n      rounded: true,\n      allowPartialBold: true,\n      processLinks: true,\n    },\n  };\n}\n\nfunction makeTable(rows: string[]): ArticleElement[] {\n  const parsed = rows\n    .filter(r => !TABLE_DIVIDER_RE.test(r))\n    .map(r =>\n      r\n        .trim()\n        .replace(/^\\|/, '')\n        .replace(/\\|$/, '')\n        .split('|')\n        .map(c => c.trim())\n    );\n  if (parsed.length === 0) return [];\n\n  const header = parsed[0];\n  const dataRows = parsed.slice(1);\n  if (dataRows.length === 0) {\n    return [\n      {\n        type: 'paragraph',\n        props: {\n          content: header.join(' · '),\n          size: 'medium',\n          color: 'dark',\n          bold: false,\n          processLinks: true,\n          allowPartialBold: true,\n        },\n      },\n    ];\n  }\n\n  return dataRows.map(row => {\n    const pairs = row.map((cell, idx) => {\n      const key = header[idx] ?? '';\n      return key ? `<strong>${key}:</strong> ${cell}` : cell;\n    });\n    return {\n      type: 'paragraph',\n      props: {\n        content: pairs.join(' · '),\n        size: 'medium',\n        color: 'dark',\n        bold: false,\n        processLinks: true,\n        allowPartialBold: true,\n      },\n    } as ArticleElement;\n  });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input, signal } from '@angular/core';\nimport { IonAccordion, IonAccordionGroup, IonItem, IonLabel } from '@ionic/angular/standalone';\nimport { parseMarkdownArticle } from '../../../services/markdown-article/markdown-article-parser';\nimport { I18nService } from '../../../services/i18n/i18n.service';\nimport { ArticleComponent } from '../article/article.component';\nimport { ArticleMetadata } from '../article/types';\nimport { SearchbarComponent } from '../../molecules/searchbar/searchbar.component';\nimport { FaqCategory, FaqItem, FaqMetadata } from './types';\n\n/**\n * `val-faq`\n *\n * Organism de preguntas frecuentes. Q&A categorizado con accordion colapsable\n * y buscador en vivo. Pensado para vistas FAQ públicas — el caller puede\n * reusar la misma data (`FaqMetadata.categories`) para emitir el structured\n * data `FAQPage` (JSON-LD) y ganar rich results en buscadores.\n *\n * Las respuestas (`FaqItem.answer`) son **Markdown** — se parsean con\n * `parseMarkdownArticle` y se renderizan vía `val-article`. Soportan links,\n * listas, negritas, tablas, etc.\n *\n * @example\n * ```html\n * <val-faq [props]=\"{ categories: faqCategories, searchable: true }\" />\n * ```\n */\n@Component({\n  selector: 'val-faq',\n  standalone: true,\n  imports: [CommonModule, IonAccordion, IonAccordionGroup, IonItem, IonLabel, SearchbarComponent, ArticleComponent],\n  template: `\n    <div class=\"val-faq\">\n      @if (props.searchable !== false) {\n        <div class=\"val-faq__search\">\n          <val-searchbar\n            [props]=\"{\n              placeholder: props.searchPlaceholder || '',\n              debounce: 200,\n            }\"\n            (filterEvent)=\"onSearch($event)\"\n          />\n        </div>\n      }\n\n      @if (visibleCategories().length === 0) {\n        <p class=\"val-faq__empty\">\n          {{ props.noResultsText || 'Sin resultados' }}\n        </p>\n      } @else {\n        @for (cat of visibleCategories(); track cat.id) {\n          <section class=\"val-faq__category\">\n            @if (showCategoryLabel()) {\n              <h3 class=\"val-faq__category-label\">{{ cat.label }}</h3>\n            }\n            <ion-accordion-group [multiple]=\"props.multiple ?? false\">\n              @for (item of cat.items; track item.id) {\n                <ion-accordion [value]=\"item.id\" class=\"val-faq__item\">\n                  <ion-item slot=\"header\" lines=\"none\" class=\"val-faq__q\">\n                    <ion-label class=\"val-faq__q-label\">\n                      {{ item.question }}\n                    </ion-label>\n                  </ion-item>\n                  <div slot=\"content\" class=\"val-faq__a\">\n                    <val-article [props]=\"answerOf(item)\" />\n                  </div>\n                </ion-accordion>\n              }\n            </ion-accordion-group>\n          </section>\n        }\n      }\n    </div>\n  `,\n  styles: [\n    `\n      :host {\n        display: block;\n        width: 100%;\n      }\n\n      .val-faq__search {\n        margin-bottom: 16px;\n      }\n\n      .val-faq__category + .val-faq__category {\n        margin-top: 24px;\n      }\n\n      .val-faq__category-label {\n        font-size: 0.8rem;\n        font-weight: 700;\n        letter-spacing: 0.06em;\n        text-transform: uppercase;\n        color: var(--ion-color-medium, #92949c);\n        margin: 0 0 8px;\n        padding-inline: 4px;\n      }\n\n      ion-accordion-group {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .val-faq__item {\n        border-radius: 12px;\n        overflow: hidden;\n        background: var(--ion-color-light, #f4f5f8);\n      }\n\n      .val-faq__q {\n        --background: transparent;\n        --min-height: 56px;\n      }\n\n      .val-faq__q-label {\n        font-weight: 600;\n        white-space: normal;\n      }\n\n      .val-faq__a {\n        padding: 4px 16px 16px;\n      }\n\n      .val-faq__empty {\n        text-align: center;\n        padding: 32px 16px;\n        color: var(--ion-color-medium, #92949c);\n        font-size: 0.95rem;\n      }\n    `,\n  ],\n})\nexport class FaqComponent {\n  private readonly i18n = inject(I18nService);\n  private readonly props_ = signal<FaqMetadata>({ categories: [] });\n\n  @Input() set props(value: FaqMetadata | undefined) {\n    if (value) this.props_.set(value);\n  }\n  get props(): FaqMetadata {\n    return this.props_();\n  }\n\n  /** Término de búsqueda actual. */\n  private readonly query = signal('');\n\n  /**\n   * Cache de respuestas parseadas (Markdown → ArticleMetadata). Se reconstruye\n   * solo cuando cambian las categorías — el parseo NO corre por keystroke.\n   * Keyed por id de item (los ids son únicos en toda la FAQ).\n   */\n  private readonly parsedAnswers = computed<Map<string, ArticleMetadata>>(() => {\n    const locale = (this.i18n.lang() ?? 'es') as 'es' | 'en' | 'pt';\n    const map = new Map<string, ArticleMetadata>();\n    for (const cat of this.props_().categories ?? []) {\n      for (const item of cat.items) {\n        map.set(item.id, parseMarkdownArticle(item.answer, { locale }));\n      }\n    }\n    return map;\n  });\n\n  /** Respuesta parseada de un item — desde el cache. */\n  answerOf(item: FaqItem): ArticleMetadata {\n    return this.parsedAnswers().get(item.id) ?? { elements: [] };\n  }\n\n  /**\n   * Categorías visibles tras el filtro. Una categoría desaparece si ninguna\n   * de sus preguntas matchea. Match sobre pregunta + respuesta (raw markdown),\n   * case-insensitive.\n   */\n  readonly visibleCategories = computed<FaqCategory[]>(() => {\n    const q = this.query().trim().toLowerCase();\n    const cats = this.props_().categories ?? [];\n    if (!q) return cats;\n    return cats\n      .map(cat => ({\n        ...cat,\n        items: cat.items.filter(it => it.question.toLowerCase().includes(q) || it.answer.toLowerCase().includes(q)),\n      }))\n      .filter(cat => cat.items.length > 0);\n  });\n\n  /** `true` si se debe mostrar el label de cada categoría. */\n  readonly showCategoryLabel = computed(() => {\n    const p = this.props_();\n    if (p.hideSingleCategoryLabel === false) return true;\n    return (p.categories?.length ?? 0) > 1;\n  });\n\n  onSearch(term: string): void {\n    this.query.set(term ?? '');\n  }\n}\n","/**\n * Tipos del organism `val-faq`.\n *\n * Modelo Q&A categorizado. Pensado para vistas FAQ públicas (sitio corporativo)\n * — el caller también puede usar la misma data para emitir structured data\n * `FAQPage` (JSON-LD) y ganar rich results en buscadores.\n */\n\n/** Una pregunta-respuesta. */\nexport interface FaqItem {\n  /** Identificador único dentro de la FAQ — usado como track + accordion value. */\n  id: string;\n  /** La pregunta. */\n  question: string;\n  /** La respuesta. Texto plano (los saltos de línea se respetan). */\n  answer: string;\n}\n\n/** Grupo de preguntas bajo un tema. */\nexport interface FaqCategory {\n  /** Identificador único de la categoría. */\n  id: string;\n  /** Etiqueta visible del grupo. */\n  label: string;\n  /** Preguntas del grupo. */\n  items: FaqItem[];\n}\n\n/**\n * Configuración del organism `val-faq`.\n *\n * @example\n * ```html\n * <val-faq\n *   [props]=\"{\n *     categories: faqCategories,\n *     searchable: true,\n *     searchPlaceholder: 'Buscar...',\n *   }\"\n * />\n * ```\n */\nexport interface FaqMetadata {\n  /** Categorías con sus preguntas, en orden de aparición. */\n  categories: FaqCategory[];\n  /** Muestra el buscador que filtra preguntas en vivo. Default `true`. */\n  searchable?: boolean;\n  /** Placeholder del buscador. */\n  searchPlaceholder?: string;\n  /** Permite varias preguntas abiertas a la vez. Default `false`. */\n  multiple?: boolean;\n  /** Texto cuando la búsqueda no arroja resultados. */\n  noResultsText?: string;\n  /** Oculta el label de categoría cuando solo hay una. Default `true`. */\n  hideSingleCategoryLabel?: boolean;\n}\n","import { NgStyle } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone';\nimport { ThemeService } from '../../../services/theme.service';\nimport { DividerComponent } from '../../atoms/divider/divider.component';\nimport { ExpandableTextComponent } from '../../molecules/expandable-text/expandable-text.component';\nimport { LinkComponent } from '../../molecules/link/link.component';\nimport { HeaderComponent } from '../../organisms/header/header.component';\nimport { SimpleMetadata } from './types';\n\n@Component({\n  selector: 'val-simple',\n  standalone: true,\n  imports: [\n    NgStyle,\n    IonHeader,\n    IonToolbar,\n    IonTitle,\n    IonContent,\n    HeaderComponent,\n    DividerComponent,\n    LinkComponent,\n    ExpandableTextComponent,\n  ],\n  template: `\n    <val-header [props]=\"props.header\" />\n\n    <ion-content\n      [fullscreen]=\"true\"\n      [ngStyle]=\"{\n        '--background': theme.IsDark ? 'var(--ion-background-color)' : props.background,\n      }\"\n      [scrollEvents]=\"true\"\n      (ionScroll)=\"onScrollHandler($event)\"\n    >\n      <ion-header collapse=\"condense\">\n        <ion-toolbar style=\"--background: transparent;\">\n          <ion-title style=\"padding: 0;\" size=\"large\">{{ props.pageTitle }}</ion-title>\n        </ion-toolbar>\n      </ion-header>\n      @if (props.pageDescription) {\n        <div class=\"description-container\">\n          <val-expandable-text\n            [props]=\"{\n              limit: 180,\n              content: props.pageDescription,\n              color: 'primary',\n              expandText: 'más',\n            }\"\n          />\n        </div>\n      }\n      @if (props.link) {\n        <val-link [props]=\"props.link\" (onClick)=\"onClickHandler($event)\"></val-link>\n      }\n      @if (props.withDivider) {\n        <val-divider [props]=\"{ fill: 'solid', size: 'medium', color: 'dark' }\" />\n      }\n      <div class=\"layout-container\">\n        <ng-content select=\"[inner-container]\"></ng-content>\n      </div>\n    </ion-content>\n    <ng-content select=\"[outter-container]\"></ng-content>\n  `,\n  styleUrl: './simple.component.scss',\n})\nexport class SimpleComponent {\n  @Input()\n  props: SimpleMetadata;\n\n  @Output()\n  onClick = new EventEmitter<string>();\n\n  @Output()\n  onScrollEvent = new EventEmitter<boolean>();\n\n  theme = inject(ThemeService);\n\n  onClickHandler(token?: string) {\n    this.onClick.emit(token);\n  }\n\n  onScrollHandler($event: Event) {\n    this.onScrollEvent.emit(true);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { NavController } from '@ionic/angular';\nimport { IonCol, IonGrid, IonHeader, IonRow, IonTitle, IonToolbar } from '@ionic/angular/standalone';\nimport { ExpandableTextComponent } from '../../molecules/expandable-text/expandable-text.component';\nimport { ButtonComponent } from '../../atoms/button/button.component';\nimport { PageTemplateMetadata } from './types';\nimport { I18nService } from '../../../services/i18n';\n\n/**\n * val-page-template\n *\n * A page template component with title, expandable description,\n * content projection, and optional back navigation button.\n *\n * @example\n * <val-page-template\n *   [props]=\"{\n *     pageTitle: 'Getting Started',\n *     pageDescription: 'Learn how to use our components...',\n *     showBackButton: true\n *   }\"\n * >\n *   <div extra-description>\n *     <p>Additional info here</p>\n *   </div>\n *\n *   <!-- Main content -->\n *   <my-content></my-content>\n *\n *   <div extra-footer>\n *     <p>Footer content</p>\n *   </div>\n * </val-page-template>\n *\n * @input props - Page template configuration\n * @output onBack - Emits when back button is clicked\n */\n@Component({\n  selector: 'val-page-template',\n  standalone: true,\n  imports: [\n    CommonModule,\n    IonHeader,\n    IonToolbar,\n    IonTitle,\n    ExpandableTextComponent,\n    IonGrid,\n    IonRow,\n    IonCol,\n    ButtonComponent,\n  ],\n  template: `\n    @if (props.pageTitle) {\n      <ion-header [class.ion-no-border]=\"true\">\n        <ion-toolbar style=\"--background: transparent; --padding-start: 0; --padding-end: 0;\">\n          <ion-title class=\"page-title\" size=\"large\" style=\"--padding-start: 0; --padding-end: 0; padding: 0;\">{{ props.pageTitle }}</ion-title>\n        </ion-toolbar>\n      </ion-header>\n    }\n    <ion-grid>\n      <ion-row class=\"ion-justify-content-center description-row\">\n        <ion-col size=\"12\" size-md=\"10\" size-lg=\"8\">\n          @if (props.pageDescription) {\n            <div class=\"description-container\">\n              <val-expandable-text\n                [props]=\"{\n                  limit: props.descriptionLimit || 180,\n                  content: props.pageDescription,\n                  color: props.descriptionColor || 'dark',\n                }\"\n              />\n            </div>\n          }\n          <ng-content select=\"[extra-description]\"></ng-content>\n        </ion-col>\n      </ion-row>\n      <ng-content></ng-content>\n      <ng-content select=\"[extra-footer]\"></ng-content>\n      @if (props.showBackButton) {\n        <ion-row class=\"ion-justify-content-center back-row\">\n          <ion-col size=\"12\" size-md=\"10\" size-lg=\"8\">\n            <val-button\n              class=\"back-button\"\n              [props]=\"{\n                text: backButtonText(),\n                color: 'dark',\n                size: 'small',\n                type: 'button',\n                state: 'ENABLED',\n                fill: 'outline',\n                shape: 'round',\n                icon: {\n                  name: 'arrow-back-outline',\n                  slot: 'start'\n                }\n              }\"\n              (onClick)=\"handleBack()\"\n            />\n          </ion-col>\n        </ion-row>\n      }\n    </ion-grid>\n  `,\n  styles: `\n    .page-title {\n      font-size: 1.6rem;\n      font-weight: 800;\n    }\n\n    @media (min-width: 768px) {\n      .page-title {\n        font-size: 2rem;\n      }\n    }\n\n    .description-row {\n      margin-bottom: 16px;\n    }\n\n    .description-container {\n      margin-top: 1rem;\n    }\n\n    .back-row {\n      margin-bottom: 16px;\n    }\n\n    .back-button {\n      display: block;\n      margin: 1rem 0;\n    }\n  `,\n})\nexport class PageTemplateComponent {\n  private nav = inject(NavController);\n  private i18n = inject(I18nService);\n\n  /**\n   * Page template configuration.\n   */\n  @Input() props: PageTemplateMetadata = {};\n\n  /**\n   * Emits when the back button is clicked.\n   */\n  @Output() onBack = new EventEmitter<void>();\n\n  /**\n   * Back button text - reactive to language changes.\n   */\n  backButtonText = computed(() => {\n    this.i18n.lang(); // Track language changes\n    return this.props.backButtonText || this.i18n.t('back');\n  });\n\n  /**\n   * Handles back navigation.\n   */\n  handleBack(): void {\n    this.onBack.emit();\n    this.nav.back();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { IonContent } from '@ionic/angular/standalone';\nimport { HeaderComponent } from '../../organisms/header/header.component';\nimport { UpdateBannerComponent } from '../../molecules/update-banner/update-banner.component';\nimport { ThemeService } from '../../../services/theme.service';\nimport { NavigationService } from '../../../services/navigation';\nimport { VALTECH_APP_CONFIG } from '../../../services/app-config/config';\nimport { PageContentMetadata } from './types';\nimport { resolveColor } from '../../../shared/utils/styles';\n\n/**\n * val-page-content\n *\n * A page content template with corporate header, main content area,\n * and footer slots. Supports dark mode and customizable backgrounds.\n *\n * @example\n * <val-page-content\n *   [props]=\"{\n *     header: { ... },\n *     background: '--main-background',\n *     homeRoute: '/'\n *   }\"\n *   (onHeaderClick)=\"handleHeaderAction($event)\"\n * >\n *   <div content>\n *     <!-- Main page content -->\n *   </div>\n *   <div footer>\n *     <val-company-footer [props]=\"footerProps\"></val-company-footer>\n *   </div>\n * </val-page-content>\n *\n * @input props - Page content configuration\n * @output onHeaderClick - Emits when a header action is clicked\n */\n@Component({\n  selector: 'val-page-content',\n  standalone: true,\n  imports: [CommonModule, HeaderComponent, IonContent, UpdateBannerComponent],\n  template: `\n    <div class=\"ion-page\">\n      <val-header [props]=\"headerProps\" (onClick)=\"onHeaderClickHandler($event)\" />\n      <ion-content\n        [fullscreen]=\"true\"\n        [ngStyle]=\"{\n          '--background': getBackground(),\n        }\"\n      >\n        @if (showUpdateBanner) {\n          <val-update-banner />\n        }\n        <div class=\"page-wrapper\">\n          <main>\n            <ng-content select=\"[content]\"></ng-content>\n          </main>\n          <ng-content select=\"[footer]\"></ng-content>\n        </div>\n      </ion-content>\n      <ng-content select=\"[extra-footer]\"></ng-content>\n    </div>\n  `,\n  styles: `\n    .page-wrapper {\n      display: flex;\n      flex-direction: column;\n      min-height: 100%;\n    }\n\n    main {\n      flex: 1;\n    }\n  `,\n})\nexport class PageContentComponent {\n  /**\n   * Page content configuration.\n   */\n  @Input() props: PageContentMetadata = {};\n\n  private appConfigEnabled = inject(VALTECH_APP_CONFIG, { optional: true });\n\n  constructor(\n    private theme: ThemeService,\n    private nav: NavigationService\n  ) {}\n\n  /**\n   * Whether to show the update banner.\n   * Only shows if AppConfigService is configured and not disabled via props.\n   */\n  get showUpdateBanner(): boolean {\n    return this.appConfigEnabled !== null && this.props.showUpdateBanner !== false;\n  }\n\n  /**\n   * Emits when a header action is clicked.\n   */\n  @Output() onHeaderClick = new EventEmitter<string>();\n\n  private _hpInputs: { header: any; ls: any; sbf: any } = { header: null, ls: null, sbf: null };\n  private _hpCache: any = null;\n\n  /**\n   * Default header configuration (cached to avoid infinite change detection).\n   */\n  private readonly defaultHeader = {\n    bordered: true,\n    translucent: true,\n    toolbar: {\n      withBack: false,\n      withActions: true,\n      textColor: 'dark' as const,\n      withMenu: true,\n      title: '',\n      languageSelector: undefined as undefined,\n      actions: [\n        {\n          token: 'header-logo',\n          description: '',\n          position: 'left' as const,\n          type: 'IMAGE' as const,\n          image: {\n            width: 8,\n            src: '--main-logo',\n            alt: 'header logo',\n            mode: 'box' as const,\n            shaded: false,\n            bordered: false,\n            size: 'small' as const,\n            limited: false,\n            flex: true,\n          },\n        },\n      ],\n    },\n  };\n\n  /**\n   * Gets header props, using cached default if not provided.\n   * Memoized to return a stable object reference when inputs haven't changed,\n   * preventing cascading change detection cycles in child components.\n   */\n  get headerProps() {\n    const header = this.props.header || this.defaultHeader;\n    const ls = this.props.languageSelector;\n    const sbf = this.props.showBackButton;\n\n    if (\n      this._hpCache !== null &&\n      this._hpInputs.header === header &&\n      this._hpInputs.ls === ls &&\n      this._hpInputs.sbf === sbf\n    ) {\n      return this._hpCache;\n    }\n\n    let result = header;\n    if (ls && !header.toolbar.languageSelector) {\n      result = { ...result, toolbar: { ...result.toolbar, languageSelector: ls } };\n    }\n    if (sbf) {\n      result = { ...result, toolbar: { ...result.toolbar, withBack: true } };\n    }\n\n    this._hpInputs = { header, ls, sbf };\n    this._hpCache = result;\n    return result;\n  }\n\n  /**\n   * Gets the background color based on theme.\n   */\n  getBackground(): string {\n    if (this.theme.IsDark) {\n      return 'var(--ion-background-color)';\n    }\n\n    const bg = this.props.background;\n    if (!bg) {\n      return 'var(--ion-background-color)';\n    }\n\n    return resolveColor(bg);\n  }\n\n  /**\n   * Handles header action clicks.\n   */\n  onHeaderClickHandler(token: string): void {\n    this.onHeaderClick.emit(token);\n\n    // Navigate to home route if configured and logo was clicked\n    if (token === 'header-logo' && this.props.homeRoute) {\n      this.nav.navigateByUrl(this.props.homeRoute);\n    }\n  }\n}\n","import { Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class NetworkStatusService {\n  private _isOnline = signal(typeof navigator !== 'undefined' ? navigator.onLine : true);\n  private _justReconnected = signal(false);\n  private _countdown = signal<number | null>(null);\n  private _countdownTimer?: ReturnType<typeof setInterval>;\n\n  readonly isOnline = this._isOnline.asReadonly();\n  readonly justReconnected = this._justReconnected.asReadonly();\n  readonly countdown = this._countdown.asReadonly();\n\n  constructor() {\n    if (typeof window !== 'undefined') {\n      window.addEventListener('online', () => this.onOnline());\n      window.addEventListener('offline', () => this.onOffline());\n    }\n  }\n\n  private onOnline(): void {\n    if (!this._isOnline()) {\n      this._isOnline.set(true);\n      this._justReconnected.set(true);\n      this.startCountdown();\n    }\n  }\n\n  private onOffline(): void {\n    this._isOnline.set(false);\n    this._justReconnected.set(false);\n    this.clearCountdown();\n  }\n\n  private startCountdown(): void {\n    this.clearCountdown();\n    this._countdown.set(10);\n    this._countdownTimer = setInterval(() => {\n      const current = this._countdown();\n      if (current === null || current <= 1) {\n        this.dismiss();\n      } else {\n        this._countdown.set(current - 1);\n      }\n    }, 1000);\n  }\n\n  private clearCountdown(): void {\n    if (this._countdownTimer) {\n      clearInterval(this._countdownTimer);\n      this._countdownTimer = undefined;\n    }\n    this._countdown.set(null);\n  }\n\n  dismiss(): void {\n    this._justReconnected.set(false);\n    this.clearCountdown();\n  }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { I18nService } from '../../../services/i18n';\nimport { NetworkStatusService } from '../../../services/network-status/network-status.service';\n\nconst NAMESPACE = 'NetworkBanner';\n\n/**\n * val-network-banner\n *\n * Banner de estado de red que empuja el contenido hacia abajo (no fixed/overlay).\n * - Offline: banner rojo sin cierre, persiste hasta reconexion.\n * - Reconexion: banner verde con boton de cierre y countdown 10s.\n * - Online desde inicio: no renderiza nada.\n *\n * Colocar como primer hijo dentro de ion-content, antes de val-container.\n *\n * @example\n * <val-network-banner />\n */\n@Component({\n  selector: 'val-network-banner',\n  standalone: true,\n  template: `\n    <div\n      class=\"network-banner\"\n      [class.network-banner--visible]=\"showBanner()\"\n      [class.network-banner--offline]=\"isOffline()\"\n      [class.network-banner--reconnected]=\"isReconnected()\"\n      role=\"alert\"\n      [attr.aria-live]=\"isOffline() ? 'assertive' : 'polite'\"\n    >\n      <div class=\"network-banner__content\">\n        <span class=\"network-banner__icon\">{{ isOffline() ? '&#9888;' : '&#10003;' }}</span>\n        <span class=\"network-banner__text\">\n          @if (isOffline()) {\n            <strong>{{ t('offlineTitle') }}</strong>\n            {{ t('offlineBody') }}\n          } @else {\n            <strong>{{ t('reconnectedTitle') }}</strong>\n          }\n        </span>\n        @if (isReconnected()) {\n          <button class=\"network-banner__close\" (click)=\"dismiss()\" [attr.aria-label]=\"t('close')\">\n            {{ closeLabel() }} &#x2715;\n          </button>\n        }\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .network-banner {\n        max-height: 0;\n        overflow: hidden;\n        transition: max-height 350ms ease-out;\n      }\n\n      .network-banner--visible {\n        max-height: 100px;\n      }\n\n      .network-banner__content {\n        display: flex;\n        align-items: center;\n        gap: 0.5rem;\n        padding: 0.6rem 1rem;\n        font-size: 0.875rem;\n        line-height: 1.4;\n      }\n\n      .network-banner--offline .network-banner__content {\n        background: var(--ion-color-danger, #eb445a);\n        color: #fff;\n      }\n\n      .network-banner--reconnected .network-banner__content {\n        background: var(--ion-color-success, #2dd36f);\n        color: #fff;\n      }\n\n      .network-banner__icon {\n        flex-shrink: 0;\n        font-size: 1rem;\n      }\n\n      .network-banner__text {\n        flex: 1;\n      }\n\n      .network-banner__close {\n        background: rgba(255, 255, 255, 0.2);\n        border: 1px solid rgba(255, 255, 255, 0.4);\n        border-radius: 4px;\n        color: #fff;\n        cursor: pointer;\n        font-size: 0.8rem;\n        padding: 0.25rem 0.5rem;\n        white-space: nowrap;\n      }\n\n      .network-banner__close:hover {\n        background: rgba(255, 255, 255, 0.35);\n      }\n    `,\n  ],\n})\nexport class NetworkBannerComponent {\n  private readonly i18n = inject(I18nService);\n  private readonly network = inject(NetworkStatusService);\n\n  readonly showBanner = computed(() => !this.network.isOnline() || this.network.justReconnected());\n  readonly isOffline = computed(() => !this.network.isOnline());\n  readonly isReconnected = computed(() => this.network.justReconnected());\n  readonly countdown = this.network.countdown;\n\n  readonly closeLabel = computed(() => {\n    this.i18n.lang();\n    const s = String(this.countdown() ?? 0);\n    return this.t('closeCountdown').replace('{s}', s);\n  });\n\n  t(key: string): string {\n    return this.i18n.t(key, NAMESPACE);\n  }\n\n  dismiss(): void {\n    this.network.dismiss();\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { NavigationEnd, Router, RouterOutlet } from '@angular/router';\nimport { IonContent, IonRefresher, IonRefresherContent, ViewWillEnter, ViewWillLeave } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronDownCircleOutline } from 'ionicons/icons';\nimport { filter, Subscription } from 'rxjs';\nimport { HeaderComponent } from '../../organisms/header/header.component';\nimport { CompanyFooterComponent } from '../../organisms/company-footer/company-footer.component';\nimport { ContainerComponent } from '../../atoms/container/container.component';\nimport { ContainerSize } from '../../atoms/container/types';\nimport { ThemeService } from '../../../services/theme.service';\nimport { NavigationService } from '../../../services/navigation';\nimport { PageRefreshService } from '../../../services/page-refresh/page-refresh.service';\nimport { PageWrapperMetadata } from './types';\nimport { resolveColor } from '../../../shared/utils/styles';\nimport { NetworkBannerComponent } from '../../molecules/network-banner/network-banner.component';\n\n// Icono del indicador de pull (ion-refresher-content pullingIcon).\naddIcons({ chevronDownCircleOutline });\n\n/**\n * val-page-wrapper\n *\n * A complete page wrapper template with header, router outlet, footer,\n * and automatic scroll-to-top on navigation.\n *\n * @example\n * <val-page-wrapper\n *   [props]=\"{\n *     homeRoute: '/',\n *     scrollToTopOnNavigate: true,\n *     footer: {\n *       links: { ... },\n *       rights: { companyName: 'Acme' }\n *     }\n *   }\"\n * ></val-page-wrapper>\n *\n * @input props - Page wrapper configuration\n * @output onHeaderClick - Emits when a header action is clicked\n */\n@Component({\n  selector: 'val-page-wrapper',\n  standalone: true,\n  imports: [\n    CommonModule,\n    HeaderComponent,\n    CompanyFooterComponent,\n    ContainerComponent,\n    IonRefresher,\n    IonRefresherContent,\n    RouterOutlet,\n    IonContent,\n    NetworkBannerComponent,\n  ],\n  template: `\n    <div class=\"ion-page\">\n      <val-header [props]=\"headerProps()\" (onClick)=\"onHeaderClickHandler($event)\" />\n      <ion-content\n        [id]=\"contentId()\"\n        [fullscreen]=\"true\"\n        [ngStyle]=\"{\n          '--background': background(),\n        }\"\n      >\n        <!-- Pull-to-refresh estándar del factory. Se renderiza sólo cuando la\n             página activa registró un handler vía PageRefreshService.\n             ion-refresher con slot=\"fixed\" DEBE ser hijo directo de\n             ion-content — por eso va aquí crudo, no envuelto en val-refresher. -->\n        @if (pageRefresh.hasHandler()) {\n          <ion-refresher slot=\"fixed\" (ionRefresh)=\"onPageRefresh($event)\">\n            <ion-refresher-content\n              pullingIcon=\"chevron-down-circle-outline\"\n              refreshingSpinner=\"circular\"\n            ></ion-refresher-content>\n          </ion-refresher>\n        }\n        <val-network-banner />\n        <val-container [props]=\"{ size: contentMaxWidth() }\">\n          <main>\n            <router-outlet></router-outlet>\n          </main>\n        </val-container>\n        @if (propsFooter()) {\n          <val-company-footer [props]=\"propsFooter()\" />\n        }\n      </ion-content>\n    </div>\n  `,\n  styles: `\n    main {\n      min-height: 60vh;\n      /* Reserva espacio para el bottom-nav floating + safe-area (iOS home indicator)\n         + breathing room (16px). Sin esto, el último elemento queda tapado por\n         el nav en mobile/PWA. */\n      padding-bottom: calc(var(--val-bottom-nav-height, 0px) + env(safe-area-inset-bottom, 0px) + 16px);\n    }\n  `,\n})\nexport class PageWrapperComponent implements ViewWillEnter, ViewWillLeave, OnInit, OnDestroy {\n  private theme = inject(ThemeService);\n  private nav = inject(NavigationService);\n  private router = inject(Router);\n  private routerSubscription?: Subscription;\n\n  /** Bus del pull-to-refresh — la página activa registra su handler aquí. */\n  protected pageRefresh = inject(PageRefreshService);\n\n  /**\n   * Handler del gesto pull-to-refresh (`ion-refresher` ionRefresh). Delega en\n   * el handler que registró la página activa y cierra el spinner al terminar.\n   */\n  async onPageRefresh(event: Event): Promise<void> {\n    try {\n      await this.pageRefresh.run();\n    } finally {\n      (event.target as HTMLIonRefresherElement | null)?.complete();\n    }\n  }\n\n  /**\n   * Page wrapper configuration.\n   * Signal-based input for full reactivity with computed().\n   */\n  readonly props = input<PageWrapperMetadata>({\n    scrollToTopOnNavigate: true,\n  });\n\n  /**\n   * Emits when a header action is clicked.\n   */\n  @Output() onHeaderClick = new EventEmitter<string>();\n\n  /**\n   * Default header configuration (cached to avoid infinite change detection).\n   */\n  private readonly defaultHeader = {\n    bordered: true,\n    translucent: true,\n    toolbar: {\n      withBack: false,\n      withActions: true,\n      textColor: 'dark' as const,\n      withMenu: true,\n      title: '',\n      actions: [\n        {\n          token: 'header-logo',\n          description: '',\n          position: 'left' as const,\n          type: 'IMAGE' as const,\n          image: {\n            width: 10,\n            src: '--main-logo',\n            alt: 'header logo',\n            mode: 'box' as const,\n            shaded: false,\n            bordered: false,\n            size: 'small' as const,\n            limited: false,\n            flex: true,\n          },\n        },\n      ],\n    },\n  };\n\n  // Computed helpers for template bindings\n  headerProps = computed(() => this.props()?.header || this.defaultHeader);\n  contentId = computed(() => this.props()?.contentId || 'page-wrapper');\n  propsFooter = computed(() => this.props()?.footer);\n  contentMaxWidth = computed<ContainerSize>(() => this.props()?.contentMaxWidth ?? 'fluid');\n  background = computed(() => {\n    if (this.theme.IsDark) {\n      return 'var(--ion-background-color)';\n    }\n    const bg = this.props()?.background;\n    if (!bg) {\n      return 'var(--ion-background-color)';\n    }\n    return resolveColor(bg);\n  });\n\n  ngOnInit(): void {\n    if (this.props()?.scrollToTopOnNavigate !== false) {\n      this.routerSubscription = this.router.events\n        .pipe(filter(event => event instanceof NavigationEnd))\n        .subscribe(() => {\n          this.scrollToTop();\n        });\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.routerSubscription) {\n      this.routerSubscription.unsubscribe();\n    }\n  }\n\n  ionViewWillLeave(): void {\n    // Optional: can add logic on view leave\n  }\n\n  ionViewWillEnter(): void {\n    this.scrollToTop();\n  }\n\n  /**\n   * Scrolls the content to the top.\n   */\n  private scrollToTop(): void {\n    const id = this.props()?.contentId || 'page-wrapper';\n    const ionContent = document.querySelector(`#${id}`) as any;\n    if (ionContent && ionContent.scrollToTop) {\n      ionContent.scrollToTop(300);\n    } else {\n      window.scrollTo({ top: 0, behavior: 'smooth' });\n    }\n  }\n\n  /**\n   * Handles header action clicks.\n   */\n  onHeaderClickHandler(token: string): void {\n    this.onHeaderClick.emit(token);\n\n    const homeRoute = this.props()?.homeRoute;\n    if (token === 'header-logo' && homeRoute) {\n      this.nav.navigateByUrl(homeRoute);\n    }\n  }\n}\n","/**\n * MaintenancePageComponent\n *\n * Página de mantenimiento que se muestra cuando la aplicación está en modo mantenimiento.\n */\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, Input } from '@angular/core';\nimport { IonContent } from '@ionic/angular/standalone';\n\nimport { ImageComponent } from '../../atoms/image/image.component';\nimport { I18nService } from '../../../services/i18n';\nimport { MaintenancePageMetadata } from './types';\n\n/**\n * val-maintenance-page\n *\n * Página completa de mantenimiento con imagen, título y mensaje personalizables.\n * Se integra con i18n para textos por defecto en múltiples idiomas.\n *\n * @example\n * ```html\n * <!-- Uso básico (usa textos por defecto) -->\n * <val-maintenance-page />\n *\n * <!-- Personalizado -->\n * <val-maintenance-page\n *   [props]=\"{\n *     title: 'En mantenimiento',\n *     message: 'Volvemos pronto',\n *     image: 'assets/maintenance.svg'\n *   }\"\n * />\n * ```\n *\n * @example\n * ```typescript\n * // En app.component.ts\n * @Component({\n *   template: \\`\n *     @if (appConfig.isMaintenanceMode()) {\n *       <val-maintenance-page />\n *     } @else {\n *       <ion-router-outlet />\n *     }\n *   \\`\n * })\n * export class AppComponent {\n *   appConfig = inject(AppConfigService);\n * }\n * ```\n */\n@Component({\n  selector: 'val-maintenance-page',\n  standalone: true,\n  imports: [CommonModule, IonContent, ImageComponent],\n  template: `\n    <ion-content class=\"maintenance-content\">\n      <div class=\"maintenance-container\">\n        <div class=\"maintenance-icon\">\n          @if (props.image) {\n            <val-image\n              [props]=\"{\n                src: props.image,\n                alt: 'Maintenance',\n                mode: 'box',\n                size: 'large',\n                shaded: false,\n                bordered: false\n              }\"\n            />\n          } @else {\n            <div class=\"default-icon\">\n              <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                viewBox=\"0 0 24 24\"\n                fill=\"currentColor\"\n              >\n                <path\n                  d=\"M12 6v6l4 2m6-2a10 10 0 11-20 0 10 10 0 0120 0z\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                  fill=\"none\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                />\n              </svg>\n            </div>\n          }\n        </div>\n\n        <h1 class=\"maintenance-title\">{{ title() }}</h1>\n        <p class=\"maintenance-message\">{{ message() }}</p>\n      </div>\n    </ion-content>\n  `,\n  styleUrls: ['./maintenance-page.component.scss'],\n})\nexport class MaintenancePageComponent {\n  /**\n   * Configuración de la página de mantenimiento.\n   */\n  @Input() props: MaintenancePageMetadata = {};\n\n  private i18n = inject(I18nService);\n\n  /**\n   * Título de la página (reactivo a cambios de idioma).\n   */\n  title = computed(\n    () => this.props.title || this.i18n.t('maintenanceMode', 'AppConfig')\n  );\n\n  /**\n   * Mensaje de la página (reactivo a cambios de idioma).\n   */\n  message = computed(\n    () => this.props.message || this.i18n.t('maintenanceMessage', 'AppConfig')\n  );\n}\n","import { Component, Input, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { AuthBackgroundMetadata } from './types';\n\ninterface WaveData {\n  id: number;\n  path: string;\n  color: string;\n  thickness: number;\n  opacity: number;\n  pulseDuration: number;\n  pulseDelay: number;\n  travelDuration: number;\n  travelDelay: number;\n  travelDirection: 'left' | 'right';\n}\n\n/**\n * val-auth-background\n *\n * A visually striking background component for authentication pages.\n * Features animated wave patterns, grain texture, and glassmorphism effects.\n * Supports dark mode automatically via CSS variables.\n *\n * @example Basic usage\n * ```html\n * <val-auth-background>\n *   <div class=\"my-content\">\n *     <h1>Welcome</h1>\n *     <val-login [props]=\"loginProps\" />\n *   </div>\n * </val-auth-background>\n * ```\n *\n * @example Custom configuration\n * ```html\n * <val-auth-background [props]=\"{\n *   waveCount: 30,\n *   showGrain: false,\n *   minHeight: '100vh'\n * }\">\n *   <div class=\"content\">...</div>\n * </val-auth-background>\n * ```\n */\n@Component({\n  selector: 'val-auth-background',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <section class=\"auth-background\" [style.min-height]=\"config().minHeight\">\n      @if (config().showGrain) {\n        <div class=\"grain\"></div>\n      }\n      @if (config().showGlass) {\n        <div class=\"glass-layer\"></div>\n      }\n      <div class=\"wave-bg\">\n        <svg class=\"waves\" viewBox=\"0 0 1440 800\" preserveAspectRatio=\"none\">\n          @for (wave of waves(); track wave.id) {\n            <path\n              [attr.d]=\"wave.path\"\n              [attr.stroke]=\"wave.color\"\n              [attr.stroke-width]=\"wave.thickness\"\n              [class.travel-left]=\"wave.travelDirection === 'left'\"\n              [class.travel-right]=\"wave.travelDirection === 'right'\"\n              [style.opacity]=\"wave.opacity\"\n              [style.--pulse-duration]=\"wave.pulseDuration + 's'\"\n              [style.--pulse-delay]=\"wave.pulseDelay + 's'\"\n              [style.--travel-duration]=\"wave.travelDuration + 's'\"\n              [style.--travel-delay]=\"wave.travelDelay + 's'\"\n            />\n          }\n        </svg>\n      </div>\n\n      <div class=\"content-layer\">\n        <ng-content></ng-content>\n      </div>\n    </section>\n  `,\n  styles: [\n    `\n      /* Theme variables - Light mode (default) */\n      :host {\n        display: block;\n        --auth-bg-start: #ffffff;\n        --auth-bg-mid: #f8f9fa;\n        --auth-bg-end: #f0f0f0;\n        --auth-glass-bg: rgba(255, 255, 255, 0.3);\n        --auth-grain-opacity: 0.035;\n        --auth-wave-color: var(--ion-color-primary, #6366f1);\n      }\n\n      /* Dark mode - Class-based ONLY (ThemeService toggles body.dark/html.ion-palette-dark).\n         No @media prefers-color-scheme — pisaba el manual toggle del user. */\n      :host-context(body.dark),\n      :host-context(.dark),\n      :host-context(.ion-palette-dark),\n      :host-context(html.ion-palette-dark),\n      :host-context([data-theme='dark']) {\n        --auth-bg-start: #0f0f1a;\n        --auth-bg-mid: #1a1a2e;\n        --auth-bg-end: #16213e;\n        --auth-glass-bg: rgba(0, 0, 0, 0.3);\n        --auth-grain-opacity: 0.05;\n        --auth-wave-color: var(--ion-color-primary, #818cf8);\n      }\n\n      .auth-background {\n        position: relative;\n        display: flex;\n        align-items: center;\n        padding: 0;\n        background: linear-gradient(135deg, var(--auth-bg-start) 0%, var(--auth-bg-mid) 50%, var(--auth-bg-end) 100%);\n        overflow: hidden;\n      }\n\n      .grain {\n        position: absolute;\n        inset: 0;\n        pointer-events: none;\n        z-index: 0;\n        opacity: var(--auth-grain-opacity);\n        background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.5' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E\");\n      }\n\n      .glass-layer {\n        position: absolute;\n        inset: 0;\n        pointer-events: none;\n        z-index: 1;\n        background: var(--auth-glass-bg);\n        backdrop-filter: blur(3px) saturate(120%);\n        -webkit-backdrop-filter: blur(3px) saturate(120%);\n      }\n\n      .wave-bg {\n        position: absolute;\n        inset: 0;\n        pointer-events: none;\n        z-index: 0;\n        transition: filter 0.3s ease;\n      }\n\n      /* Invert waves en dark — class-based only (ThemeService toggle). */\n      :host-context(body.dark) .wave-bg,\n      :host-context(.dark) .wave-bg,\n      :host-context(.ion-palette-dark) .wave-bg,\n      :host-context(html.ion-palette-dark) .wave-bg,\n      :host-context([data-theme='dark']) .wave-bg {\n        filter: invert(1) opacity(0.6);\n      }\n\n      .waves {\n        width: 100%;\n        height: 100%;\n        overflow: visible;\n      }\n\n      .waves path {\n        fill: none;\n        transform-box: fill-box;\n        transform-origin: center;\n        will-change: transform;\n        animation:\n          wave-pulse var(--pulse-duration, 3s) ease-in-out var(--pulse-delay, 0s) infinite alternate,\n          wave-travel-right var(--travel-duration, 12s) linear var(--travel-delay, 0s) infinite;\n      }\n\n      .waves path.travel-left {\n        animation:\n          wave-pulse var(--pulse-duration, 3s) ease-in-out var(--pulse-delay, 0s) infinite alternate,\n          wave-travel-left var(--travel-duration, 12s) linear var(--travel-delay, 0s) infinite;\n      }\n\n      /* Vertical breathing — equalizer-style pulse per wave */\n      @keyframes wave-pulse {\n        0% {\n          transform: scaleY(0.85);\n        }\n        50% {\n          transform: scaleY(1.25);\n        }\n        100% {\n          transform: scaleY(0.85);\n        }\n      }\n\n      /* Horizontal traveling — like sound traveling across the canvas */\n      @keyframes wave-travel-right {\n        from {\n          transform: translateX(-300px);\n        }\n        to {\n          transform: translateX(300px);\n        }\n      }\n\n      @keyframes wave-travel-left {\n        from {\n          transform: translateX(300px);\n        }\n        to {\n          transform: translateX(-300px);\n        }\n      }\n\n      /* Reduced motion — keep waves still */\n      @media (prefers-reduced-motion: reduce) {\n        .waves path {\n          animation: none;\n        }\n      }\n\n      .content-layer {\n        position: relative;\n        z-index: 2;\n        width: 100%;\n        height: 100%;\n        display: flex;\n        align-items: center;\n      }\n    `,\n  ],\n})\nexport class AuthBackgroundComponent {\n  private _props = signal<AuthBackgroundMetadata>({});\n\n  @Input()\n  set props(value: AuthBackgroundMetadata) {\n    this._props.set(value);\n    this.regenerateWaves();\n  }\n  get props(): AuthBackgroundMetadata {\n    return this._props();\n  }\n\n  private defaultColors = ['#e0e0e0', '#bdbdbd', '#9e9e9e', '#757575', '#616161', '#424242'];\n  private wavesSignal = signal<WaveData[]>([]);\n\n  config = computed(() => {\n    const props = this._props();\n    return {\n      waveCount: props.waveCount ?? 45,\n      waveColors: props.waveColors ?? this.defaultColors,\n      showGrain: props.showGrain !== false,\n      showGlass: props.showGlass !== false,\n      minHeight: props.minHeight ?? 'calc(100vh - 120px)',\n    };\n  });\n\n  waves = computed(() => this.wavesSignal());\n\n  constructor() {\n    this.regenerateWaves();\n  }\n\n  private regenerateWaves(): void {\n    const cfg = this.config();\n    const colors = cfg.waveColors;\n    const count = cfg.waveCount;\n\n    const newWaves = Array.from({ length: count }, (_, i) => {\n      // Distribuir uniforme a lo largo del viewBox (0..800) — sin huecos arriba\n      const y = ((i + 0.5) / count) * 800;\n      const isThick = i % 5 === 0;\n      const isMedium = i % 3 === 0 && !isThick;\n\n      const amplitude = 10 + Math.random() * 20;\n      const frequency = 1 + Math.random() * 2;\n      const phase = Math.random() * Math.PI * 2;\n\n      // Path extendido off-canvas (-400 .. 1840) para que translateX no deje huecos\n      let path = `M-400,${y}`;\n      for (let x = -400; x <= 1840; x += 40) {\n        const waveY = y + amplitude * Math.sin((x / 1440) * Math.PI * frequency * 2 + phase);\n        path += ` L${x},${waveY.toFixed(1)}`;\n      }\n\n      const color = colors[Math.floor(Math.random() * colors.length)];\n\n      return {\n        id: i,\n        path,\n        color,\n        thickness: isThick ? 1.2 : isMedium ? 0.7 : 0.3,\n        opacity: isThick ? 0.5 : isMedium ? 0.4 : 0.3,\n        // Pulse vertical (equalizer) — ~1/3 de las waves son \"rápidas\"\n        pulseDuration: Math.random() < 0.33 ? 0.8 + Math.random() * 0.8 : 1.6 + Math.random() * 2.4,\n        pulseDelay: -Math.random() * 4,\n        // Traveling horizontal — ~1/3 más rápidas para sensación de ecualizador\n        travelDuration: Math.random() < 0.33 ? 5 + Math.random() * 4 : 10 + Math.random() * 12,\n        travelDelay: -Math.random() * 12,\n        travelDirection: i % 2 === 0 ? ('right' as const) : ('left' as const),\n      };\n    });\n\n    this.wavesSignal.set(newWaves);\n  }\n}\n","import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\n/**\n * Tipos de idioma soportados\n */\nexport type SupportedLang = 'es' | 'en';\n\n/**\n * Clave para persistir el idioma en localStorage\n */\nconst LANG_STORAGE_KEY = 'app_lang';\n\n/**\n * Idioma por defecto\n */\nconst DEFAULT_LANG: SupportedLang = 'es';\n\n/**\n * Servicio mínimo de localización.\n *\n * - Lee el idioma desde localStorage al iniciar\n * - Proporciona método para cambiar idioma (recarga la página)\n * - Sin observables ni subscripciones\n *\n * @example\n * // En un componente\n * locale = inject(LocaleService);\n *\n * // Obtener idioma actual\n * console.log(this.locale.lang); // 'es' o 'en'\n *\n * // Cambiar idioma (recarga la página)\n * this.locale.setLang('en');\n */\n@Injectable({ providedIn: 'root' })\nexport class LocaleService {\n  /**\n   * Idioma actual de la aplicación.\n   * Se lee una vez al iniciar desde localStorage.\n   */\n  readonly lang: SupportedLang;\n  private readonly isBrowser: boolean;\n\n  constructor(@Inject(PLATFORM_ID) platformId: Object) {\n    this.isBrowser = isPlatformBrowser(platformId);\n    this.lang = this.getStoredLang();\n  }\n\n  /**\n   * Cambia el idioma de la aplicación.\n   * Guarda en localStorage y recarga la página para aplicar el cambio.\n   *\n   * @param lang Nuevo idioma ('es' o 'en')\n   */\n  setLang(lang: SupportedLang): void {\n    if (lang === this.lang || !this.isBrowser) {\n      return;\n    }\n    localStorage.setItem(LANG_STORAGE_KEY, lang);\n    window.location.reload();\n  }\n\n  /**\n   * Obtiene el idioma almacenado en localStorage.\n   * Si no existe o no es válido, retorna el idioma por defecto.\n   * En SSR (sin localStorage) retorna el default.\n   */\n  private getStoredLang(): SupportedLang {\n    if (!this.isBrowser) {\n      return DEFAULT_LANG;\n    }\n    const stored = localStorage.getItem(LANG_STORAGE_KEY);\n    if (stored === 'es' || stored === 'en') {\n      return stored;\n    }\n    return DEFAULT_LANG;\n  }\n\n  /**\n   * Verifica si el idioma actual es español\n   */\n  get isSpanish(): boolean {\n    return this.lang === 'es';\n  }\n\n  /**\n   * Verifica si el idioma actual es inglés\n   */\n  get isEnglish(): boolean {\n    return this.lang === 'en';\n  }\n}\n","// Types for valtech-components services\n// ValtechConfig and LangProvider have been removed in v3.0.0\n// Use LocaleService for language management instead\n\n// Empty export to maintain module compatibility\nexport {};\n","import { Injectable, inject } from '@angular/core';\nimport { Meta, Title } from '@angular/platform-browser';\nimport { PageMetadata, MetaConfig } from './types';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class MetaService {\n  private meta = inject(Meta);\n  private titleService = inject(Title);\n\n  private baseUrl = '';\n  private defaultImage = '/assets/images/main-icon.png';\n  private siteName = '';\n\n  /**\n   * Configurar el servicio con valores de la app\n   */\n  configure(config: MetaConfig): void {\n    this.baseUrl = config.baseUrl;\n    this.siteName = config.siteName;\n    if (config.defaultImage) {\n      this.defaultImage = config.defaultImage;\n    }\n  }\n\n  /**\n   * Actualizar meta tags de la página\n   */\n  updatePageMeta(metadata: PageMetadata, path?: string): void {\n    const fullTitle = `${metadata.title} | ${this.siteName}`;\n    const url = path ? `${this.baseUrl}${path}` : this.baseUrl;\n    const ogImage = metadata.ogImage || this.defaultImage;\n    const fullImageUrl = ogImage.startsWith('http') ? ogImage : `${this.baseUrl}${ogImage}`;\n\n    // Title\n    this.titleService.setTitle(fullTitle);\n\n    // Basic meta tags\n    this.meta.updateTag({ name: 'description', content: metadata.description });\n    if (metadata.keywords) {\n      this.meta.updateTag({ name: 'keywords', content: metadata.keywords });\n    }\n\n    // Open Graph\n    this.meta.updateTag({ property: 'og:title', content: fullTitle });\n    this.meta.updateTag({ property: 'og:description', content: metadata.description });\n    this.meta.updateTag({ property: 'og:url', content: url });\n    this.meta.updateTag({ property: 'og:image', content: fullImageUrl });\n    this.meta.updateTag({ property: 'og:type', content: metadata.type || 'website' });\n\n    // Twitter Card\n    this.meta.updateTag({ name: 'twitter:title', content: fullTitle });\n    this.meta.updateTag({ name: 'twitter:description', content: metadata.description });\n    this.meta.updateTag({ name: 'twitter:image', content: fullImageUrl });\n  }\n\n  /**\n   * Resetear a valores por defecto\n   */\n  resetToDefault(metadata: PageMetadata): void {\n    this.updatePageMeta(metadata);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { ArticleMetadata } from '../../components/organisms/article/types';\nimport { parseMarkdownArticle } from './markdown-article-parser';\n\n/**\n * Angular service wrapper for the pure {@link parseMarkdownArticle} function.\n * Provided in root so it can be injected anywhere. The actual parsing logic lives in\n * `markdown-article-parser.ts` and is also usable from Node scripts (build-time generation).\n */\n@Injectable({ providedIn: 'root' })\nexport class MarkdownArticleParserService {\n  parse(\n    markdown: string,\n    config?: Partial<ArticleMetadata>,\n    locale?: 'es' | 'en' | 'pt'\n  ): ArticleMetadata {\n    return parseMarkdownArticle(markdown, { ...config, locale });\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { InjectionToken, Injectable, Provider, inject } from '@angular/core';\nimport { Observable, catchError, from, map, of, shareReplay, switchMap, throwError } from 'rxjs';\nimport { ArticleMetadata } from '../../components/organisms/article/types';\nimport { MarkdownArticleParserService } from './markdown-article-parser.service';\n\nexport type LegalSlug = 'terms' | 'privacy' | 'cookies' | 'data-usage' | 'legal-notice' | string;\n\n/**\n * Factory that returns a Record<slug, ArticleMetadata> for a given locale.\n * Use a dynamic `import()` so each locale module is code-split by the bundler.\n */\nexport type LegalContentFactory = () => Promise<Record<string, ArticleMetadata>>;\n\nexport interface LegalContentConfig {\n  /** Pre-generated content factories keyed by locale (e.g. `{ es: () => import('./generated/legal-content.es') ... }`). */\n  factories?: Record<string, LegalContentFactory>;\n  /** Override default `/assets/legal` base path used when no factory matches. */\n  basePath?: string;\n  /** Fallback locale (default `es`). Set null to disable. */\n  fallbackLocale?: string | null;\n}\n\nexport const LEGAL_CONTENT_CONFIG = new InjectionToken<LegalContentConfig>('LEGAL_CONTENT_CONFIG');\n\nexport interface LegalLoadOptions {\n  /** Two-letter locale code (es, en, pt). */\n  locale?: string;\n  /** Override base path for runtime mode (default `/assets/legal`). */\n  basePath?: string;\n  /** Fallback locale tried when the requested one is missing. Set null to disable. */\n  fallbackLocale?: string | null;\n}\n\n/**\n * Loads legal articles via one of two modes:\n *\n * 1. **Build-time** (preferred): when the app provides `LEGAL_CONTENT_CONFIG.factories`\n *    via `provideLegalContent()`, the service dynamically imports the matching\n *    locale module and returns the pre-parsed `ArticleMetadata` synchronously\n *    (wrapped in an Observable). Each locale is code-split.\n *\n * 2. **Runtime**: when no factory matches, falls back to fetching\n *    `/assets/legal/{locale}/{slug}.md` and parsing on the fly.\n *\n * Both modes cache by `locale:slug` so concurrent loads share one promise/HTTP request.\n */\n@Injectable({ providedIn: 'root' })\nexport class LegalContentService {\n  private readonly http = inject(HttpClient);\n  private readonly parser = inject(MarkdownArticleParserService);\n  private readonly config = inject(LEGAL_CONTENT_CONFIG, { optional: true }) ?? {};\n\n  private readonly DEFAULT_BASE = '/assets/legal';\n  private readonly cache = new Map<string, Observable<ArticleMetadata>>();\n  private readonly factoryCache = new Map<string, Promise<Record<string, ArticleMetadata>>>();\n\n  load(slug: LegalSlug, options: LegalLoadOptions = {}): Observable<ArticleMetadata> {\n    const locale = (options.locale ?? 'es').toLowerCase();\n    const fallback =\n      options.fallbackLocale === undefined\n        ? (this.config.fallbackLocale ?? 'es')\n        : options.fallbackLocale;\n\n    const key = `${locale}|${slug}`;\n    const cached = this.cache.get(key);\n    if (cached) return cached;\n\n    const primary = this.loadOne(slug, locale, options.basePath);\n    const stream =\n      fallback && fallback !== locale\n        ? primary.pipe(catchError(() => this.loadOne(slug, fallback, options.basePath)))\n        : primary;\n\n    const shared = stream.pipe(shareReplay({ bufferSize: 1, refCount: false }));\n    this.cache.set(key, shared);\n    return shared;\n  }\n\n  /** Raw Markdown — only available in runtime mode (HTTP). */\n  raw(slug: LegalSlug, options: LegalLoadOptions = {}): Observable<string> {\n    const locale = (options.locale ?? 'es').toLowerCase();\n    const base = options.basePath ?? this.config.basePath ?? this.DEFAULT_BASE;\n    return this.http.get(`${base}/${locale}/${slug}.md`, { responseType: 'text' });\n  }\n\n  /** Clears in-memory caches. Call on runtime locale change. */\n  invalidate(): void {\n    this.cache.clear();\n    this.factoryCache.clear();\n  }\n\n  private loadOne(\n    slug: string,\n    locale: string,\n    basePathOverride?: string\n  ): Observable<ArticleMetadata> {\n    const factory = this.config.factories?.[locale];\n    if (factory) {\n      return from(this.runFactory(locale, factory)).pipe(\n        switchMap(content => {\n          const article = content[slug];\n          return article\n            ? of(article)\n            : throwError(() => new Error(`Legal doc not found: ${locale}/${slug}`));\n        })\n      );\n    }\n    const base = basePathOverride ?? this.config.basePath ?? this.DEFAULT_BASE;\n    return this.fetchAndParse(`${base}/${locale}/${slug}.md`);\n  }\n\n  private runFactory(\n    locale: string,\n    factory: LegalContentFactory\n  ): Promise<Record<string, ArticleMetadata>> {\n    const cached = this.factoryCache.get(locale);\n    if (cached) return cached;\n    const promise = factory();\n    this.factoryCache.set(locale, promise);\n    return promise;\n  }\n\n  private fetchAndParse(url: string): Observable<ArticleMetadata> {\n    return this.http.get(url, { responseType: 'text' }).pipe(\n      switchMap(md =>\n        md && md.trim().length > 0\n          ? of(this.parser.parse(md))\n          : throwError(() => new Error(`Empty legal doc: ${url}`))\n      ),\n      map(parsed => parsed)\n    );\n  }\n}\n\n/**\n * Wires pre-generated legal content into `LegalContentService`. Call from `main.ts`\n * (or any `providers: []` array). The factories use dynamic `import()` so each\n * locale is code-split — only the active locale's bundle is loaded.\n *\n * @example\n * provideLegalContent({\n *   factories: {\n *     es: () => import('./app/generated/legal-content.es').then((m) => m.LEGAL_CONTENT_ES),\n *     en: () => import('./app/generated/legal-content.en').then((m) => m.LEGAL_CONTENT_EN),\n *     pt: () => import('./app/generated/legal-content.pt').then((m) => m.LEGAL_CONTENT_PT),\n *   },\n * })\n */\nexport function provideLegalContent(config: LegalContentConfig): Provider {\n  return { provide: LEGAL_CONTENT_CONFIG, useValue: config };\n}\n","import {\n  ArticleElement,\n  ArticleMetadata,\n  ArticleTextElement,\n} from '../../components/organisms/article/types';\n\n/**\n * Pattern that matches the doc metadata paragraph emitted by the parser, e.g.\n *   \"**Última actualización:** 1 de enero de 2026 **Versión:** 1.0\"\n *   \"**Last updated:** January 1, 2026 **Version:** 1.0\"\n *   \"**Última atualização:** 1 de janeiro de 2026 **Versão:** 1.0\"\n */\nconst META_KEYWORDS = [/última actualización/i, /last updated/i, /última atualização/i];\n\n/** Per-type spacing presets — gives the page a calmer rhythm than the parser default. */\nconst SPACING: Record<string, { top: any; bottom: any }> = {\n  title: { top: 'none', bottom: 'medium' },\n  subtitle: { top: 'large', bottom: 'small' },\n  paragraph: { top: 'small', bottom: 'small' },\n  quote: { top: 'medium', bottom: 'medium' },\n  note: { top: 'medium', bottom: 'medium' },\n  code: { top: 'medium', bottom: 'medium' },\n  list: { top: 'small', bottom: 'medium' },\n  separator: { top: 'large', bottom: 'large' },\n};\n\n/**\n * Converts inline `**bold**` markdown to `<strong>` HTML so val-text (with\n * `processLinks: true`) renders it natively via innerHTML. The parser keeps\n * the raw `**` because val-text doesn't understand markdown bold.\n *\n * Order matters: run **bold** before single-asterisk processing (we don't\n * support `*italic*` yet — would conflict with the `**` capture).\n */\nfunction renderInlineBold(text: string): string {\n  return text.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n}\n\nfunction applyBoldToElement(el: ArticleElement): ArticleElement {\n  if (el.type === 'paragraph' || el.type === 'text' || el.type === 'quote') {\n    const props = el.props as { content?: string };\n    if (props.content) {\n      return {\n        ...el,\n        props: { ...el.props, content: renderInlineBold(props.content) },\n      } as ArticleElement;\n    }\n  }\n  if (el.type === 'list') {\n    const props = el.props as { items: { text: string }[] };\n    return {\n      ...el,\n      props: {\n        ...props,\n        items: props.items.map(it => ({\n          ...it,\n          text: renderInlineBold(it.text),\n        })),\n      },\n    } as ArticleElement;\n  }\n  if (el.type === 'note') {\n    const props = el.props as { text: string };\n    return {\n      ...el,\n      props: { ...props, text: renderInlineBold(props.text) },\n    } as ArticleElement;\n  }\n  return el;\n}\n\nfunction applySpacing(el: ArticleElement): ArticleElement {\n  const preset = SPACING[el.type];\n  if (!preset) return el;\n  return { ...el, spacing: { ...preset, ...el.spacing } };\n}\n\n/** True if this paragraph contains the doc metadata (last updated / version). */\nfunction isDocMeta(el: ArticleElement): boolean {\n  if (el.type !== 'paragraph') return false;\n  const text = (el.props as { content?: string }).content ?? '';\n  return META_KEYWORDS.some(re => re.test(text));\n}\n\n/**\n * Upgrade a metadata paragraph to small muted inline text. Better visual hierarchy\n * than a full-width note box for short doc-header info like \"Last updated · Version\".\n */\nfunction metaToInlineText(el: ArticleElement): ArticleTextElement {\n  const text = (el.props as { content?: string }).content ?? '';\n  return {\n    type: 'paragraph',\n    props: {\n      content: text,\n      size: 'small',\n      color: 'medium',\n      bold: false,\n      allowPartialBold: true,\n      processLinks: true,\n    },\n    spacing: { top: 'none', bottom: 'small' },\n  };\n}\n\n/**\n * Post-processes the raw `ArticleMetadata` from `LegalContentService` /\n * `parseMarkdownArticle` for better visual hierarchy in legal / markdown docs:\n *\n * - Renders inline `**bold**` markdown as `<strong>` HTML.\n * - Groups the doc metadata line (`**Last updated:** … **Version:** …`)\n *   into a styled inline text block at the top.\n * - Sets per-element spacing presets so paragraphs/sections breathe.\n *\n * Pure, side-effect-free — usable from any app or a Node script. Reusable for\n * any markdown-driven article (legal, docs, blog), not only legal pages.\n */\nexport function beautifyLegalArticle(article: ArticleMetadata): ArticleMetadata {\n  const elements = article.elements\n    .map(el => (isDocMeta(el) ? metaToInlineText(el) : el))\n    .map(applyBoldToElement)\n    .map(applySpacing);\n\n  return {\n    ...article,\n    elements,\n    maxWidth: '720px',\n    centered: true,\n  };\n}\n","/**\n * Preferences types — Fase 1 schema simple (theme + language + notifications.master).\n * Doc canónico: /apps/{appId}/users/{uid}/preferences/main\n * Cliente NUNCA escribe directo — todas las mutaciones via PUT /v2/auth/preferences.\n */\n\nexport type PreferencesTheme = 'light' | 'dark' | 'auto';\nexport type PreferencesLanguage = 'es' | 'en';\nexport type PreferencesFontSize = 'small' | 'medium' | 'large';\n\n/** Forma del doc tal como lo escribe el backend (Admin SDK). */\nexport interface PreferencesDocument {\n  theme?: PreferencesTheme;\n  language?: PreferencesLanguage;\n  fontSize?: PreferencesFontSize;\n  notifications?: {\n    master?: boolean;\n  };\n  /** serverTimestamp escrito por el backend en cada sync. */\n  syncedAt?: unknown;\n}\n\n/** Payload aceptado por `PUT /v2/auth/preferences` — partial update. */\nexport interface PreferencesUpdate {\n  theme?: PreferencesTheme;\n  language?: PreferencesLanguage;\n  fontSize?: PreferencesFontSize;\n  notifications?: {\n    master?: boolean;\n  };\n}\n\n/** Response del backend tras el PUT. */\nexport interface PreferencesUpdateResponse {\n  operationId: string;\n  theme: PreferencesTheme | '';\n  language: PreferencesLanguage | '';\n  fontSize: PreferencesFontSize | '';\n  notifications: { master?: boolean };\n  updated: boolean;\n}\n","/**\n * Refreshable Stream\n *\n * Helper estándar para vistas que consumen datos de Firestore. Soporta DOS\n * modos — el caller decide cuál vía la `factory`:\n *\n *  - **one-shot** (recomendado por defecto): `() => from(svc.getAllOnce())`.\n *    Carga una vez y completa. Más barato — sin listener vivo.\n *  - **real-time**: `() => svc.getAll()`. Listener Firestore que auto-actualiza.\n *    Solo donde importa (inbox de notificaciones, badges).\n *\n * En ambos modos la primera suscripción se gatea por `firebaseAuthReady`\n * (sesión de Firebase Auth lista) — así el listener/lectura nunca se adjunta\n * antes de que `request.auth` esté disponible en las reglas de Firestore, lo\n * que cierra la ventana de `permission-denied` en cold start de PWA.\n *\n * El `retry` con backoff corto es solo red de seguridad para reconexiones\n * transitorias (no para cubrir cold start — eso lo cubre el gate de auth).\n */\n\nimport { inject, Injector, Signal } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { signal } from '@angular/core';\nimport { Observable, of, race, timer } from 'rxjs';\nimport { catchError, map, retry, switchMap, take, tap, timeout } from 'rxjs/operators';\n\nimport { FirebaseService } from '../firebase/firebase.service';\n\n/** Opciones de configuración para `createRefreshableStream`. */\nexport interface RefreshableStreamOptions<T> {\n  /**\n   * Valor emitido cuando la factory falla tras agotar los reintentos.\n   * Default: `null`.\n   */\n  fallback?: T;\n  /**\n   * Número máximo de reintentos ante un error de la factory.\n   * Backoff corto — NO cubre cold start (eso lo hace el gate de auth), solo\n   * reconexiones transitorias. Default: 4.\n   */\n  retryCount?: number;\n  /**\n   * Delay base del backoff (ms). El delay efectivo crece exponencialmente\n   * acotado: 500ms → 1s → 2s ... Default: 500.\n   */\n  retryBaseDelayMs?: number;\n  /**\n   * Si `false`, NO espera a `firebaseAuthReady` antes de la primera\n   * suscripción. Útil para streams que no leen Firestore. Default: `true`.\n   */\n  gateOnFirebaseAuth?: boolean;\n  /**\n   * Timeout (ms) del gate de Firebase Auth. Si la sesión de Firebase Auth no\n   * se establece en este tiempo, el stream procede igual (la factory correrá\n   * y, si no hay permiso, terminará en estado `error` — NUNCA en skeleton\n   * infinito). Muy por encima de cualquier handshake real. Default: 20000.\n   */\n  authGateTimeoutMs?: number;\n  /**\n   * Timeout (ms) de la PRIMERA emisión de la factory. Si la factory no emite\n   * ni un valor ni un error en este tiempo (caso típico: un servicio Firestore\n   * que nunca se inicializó → `EMPTY` → silencio total), el stream pasa a\n   * estado `error` en vez de quedarse en skeleton perpetuo. Default: 20000.\n   */\n  firstEmitTimeoutMs?: number;\n  /**\n   * Injector explícito. Solo necesario si `createRefreshableStream` se llama\n   * fuera de un injection context (raro). Por defecto usa `inject(Injector)`.\n   */\n  injector?: Injector;\n}\n\n/**\n * Resultado de `createRefreshableStream`.\n */\nexport interface RefreshableStream<T> {\n  /** Datos actuales. `null` mientras la primera emisión no ha llegado. */\n  readonly data: Signal<T | null>;\n  /** `true` mientras se espera la primera emisión de la suscripción actual. */\n  readonly loading: Signal<boolean>;\n  /** `true` si la factory falló tras agotar los reintentos. */\n  readonly error: Signal<boolean>;\n  /**\n   * Re-suscribe la factory desde cero (nuevo listener / nueva lectura).\n   * Es lo que registra el `PageRefreshService` como handler de pull-to-refresh,\n   * y también el \"reconectar manual\" si un listener murió.\n   */\n  reload: () => void;\n}\n\n/**\n * Crea un stream refrescable a partir de una factory de Observable.\n *\n * DEBE llamarse en un injection context (field initializer o constructor) —\n * usa `toSignal`/`toObservable`/`inject` internamente.\n *\n * @param factory - Función que produce el Observable a consumir. El caller\n *   decide el modo: `() => from(svc.getAllOnce())` (one-shot) o\n *   `() => svc.getAll()` (real-time).\n * @param options - Configuración opcional (fallback, retry, gate).\n *\n * @example\n * ```typescript\n * // one-shot (recomendado por defecto)\n * private readonly stream = createRefreshableStream(\n *   () => from(this.svc.getAllOnce()),\n * );\n *\n * // real-time (inbox)\n * private readonly stream = createRefreshableStream(\n *   () => this.notifs.getAll(50),\n * );\n *\n * readonly items = this.stream.data;\n * readonly loading = this.stream.loading;\n *\n * ionViewWillEnter() {\n *   this.pageRefresh.register(() => this.stream.reload());\n * }\n * ```\n */\nexport function createRefreshableStream<T>(\n  factory: () => Observable<T>,\n  options?: RefreshableStreamOptions<T>\n): RefreshableStream<T> {\n  const injector = options?.injector ?? inject(Injector);\n  const fallback = (options?.fallback ?? null) as T | null;\n  const retryCount = options?.retryCount ?? 4;\n  const retryBaseDelayMs = options?.retryBaseDelayMs ?? 500;\n  const gateOnFirebaseAuth = options?.gateOnFirebaseAuth ?? true;\n  const authGateTimeoutMs = options?.authGateTimeoutMs ?? 20000;\n  const firstEmitTimeoutMs = options?.firstEmitTimeoutMs ?? 20000;\n\n  // FirebaseService es opcional — sin él (apps sin Firebase) no se gatea.\n  const firebase = gateOnFirebaseAuth ? injector.get(FirebaseService, null) : null;\n\n  const _reload = signal(0);\n  const _loading = signal(true);\n  const _error = signal(false);\n\n  // Gate de Firebase Auth: el stream no abre la primera suscripción hasta que\n  // la sesión esté confirmada. `race` con un `timer` de seguridad — si la\n  // sesión NUNCA se establece (token inválido, signInWithFirebase falló), el\n  // gate igual se libera tras `authGateTimeoutMs` y la factory procede: si no\n  // hay permiso terminará en estado `error`, jamás en skeleton infinito.\n  // Tag los dos inputs del `race` para distinguir en logs cuál ganó: la sesión\n  // de Firebase Auth (`auth-ready`) o el timeout de seguridad (`timeout`).\n  const authGate$: Observable<unknown> = firebase\n    ? race(\n        firebase.firebaseAuthReady$.pipe(map(() => 'auth-ready' as const)),\n        timer(authGateTimeoutMs).pipe(map(() => 'timeout' as const))\n      ).pipe(\n        take(1),\n        tap(winner => {\n          if (winner === 'timeout') {\n            console.warn(\n              `[RefreshStream] auth gate resolved by TIMEOUT after ${authGateTimeoutMs}ms ` +\n                '(Firebase Auth session never confirmed)'\n            );\n          } else {\n            console.log('[RefreshStream] auth gate resolved by firebaseAuthReady$ (session ready)');\n          }\n        })\n      )\n    : of(true);\n\n  const data = toSignal(\n    toObservable(_reload, { injector }).pipe(\n      tap(() => {\n        _loading.set(true);\n        _error.set(false);\n      }),\n      // Esperar a Firebase Auth listo antes de cada (re)suscripción. Como\n      // `firebaseAuthReady$` completa tras la primera emisión, las reloads\n      // posteriores resuelven el gate de inmediato (auth ya está listo).\n      switchMap(() =>\n        authGate$.pipe(\n          switchMap(() =>\n            factory().pipe(\n              tap(() => {\n                _loading.set(false);\n                _error.set(false);\n                console.log('[RefreshStream] factory emitted first value — loading=false');\n              }),\n              // Backoff corto exponencial acotado — solo red de seguridad para\n              // reconexiones transitorias, NO para cubrir cold start.\n              retry({\n                count: retryCount,\n                delay: (_err, attempt) =>\n                  timer(Math.min(retryBaseDelayMs * 2 ** (attempt - 1), 4000)),\n              }),\n              // Techo absoluto para la PRIMERA emisión. Si la factory no emite\n              // ni valor ni error (servicio nunca inicializado → `EMPTY` →\n              // silencio), `timeout` dispara un error → `catchError` → estado\n              // `error`. Nunca skeleton perpetuo. Va DESPUÉS de `retry` para\n              // que cuente el tiempo total, no por intento.\n              timeout({ first: firstEmitTimeoutMs }),\n              catchError(err => {\n                _loading.set(false);\n                _error.set(true);\n                console.error(\n                  `[RefreshStream] factory failed/timed out → error state: ${\n                    err instanceof Error ? err.message : String(err)\n                  }`\n                );\n                return of(fallback as T);\n              })\n            )\n          )\n        )\n      )\n    ),\n    { initialValue: null as T | null, injector }\n  );\n\n  return {\n    data,\n    loading: _loading.asReadonly(),\n    error: _error.asReadonly(),\n    reload: () => _reload.update(n => n + 1),\n  };\n}\n","/**\n * Refreshable Stream\n *\n * Helper `createRefreshableStream` para vistas con datos Firestore.\n * Soporta modo one-shot y real-time, con gate de `firebaseAuthReady`.\n */\nexport {\n  createRefreshableStream,\n  type RefreshableStream,\n  type RefreshableStreamOptions,\n} from './refreshable-stream';\n","/**\n * Cross-Platform Version Helpers\n *\n * Funciones para obtener la versión de la aplicación de forma\n * cross-platform (web y mobile con Capacitor).\n */\n\nimport { Capacitor } from '@capacitor/core';\n\n/**\n * Info completa de la app en plataformas nativas.\n */\nexport interface AppVersionInfo {\n  /** Versión semver (ej: \"1.2.3\") */\n  version: string;\n  /** Número de build (ej: \"123\") */\n  build: string;\n  /** Nombre de la app */\n  name: string;\n  /** Bundle ID / Package name */\n  id: string;\n}\n\n/**\n * Obtiene la versión de la aplicación de forma cross-platform.\n *\n * - En web: retorna la versión de package.json (pasada como parámetro)\n * - En mobile: usa @capacitor/app para obtener la versión nativa\n *\n * @param webVersion - Versión de package.json para fallback en web\n * @returns Promise<string> - La versión actual de la app\n *\n * @example\n * ```typescript\n * import { getAppVersion } from 'valtech-components';\n * import { version } from '../package.json';\n *\n * const appVersion = await getAppVersion(version);\n *\n * // Uso en main.ts\n * async function bootstrap() {\n *   const appVersion = await getAppVersion(version);\n *   bootstrapApplication(AppComponent, {\n *     providers: [\n *       provideValtechAppConfig({ currentVersion: appVersion }),\n *     ],\n *   });\n * }\n * bootstrap();\n * ```\n */\nexport async function getAppVersion(webVersion: string): Promise<string> {\n  // En web, siempre usar la versión de package.json\n  if (!Capacitor.isNativePlatform()) {\n    return webVersion;\n  }\n\n  // En native (iOS/Android), obtener versión del binario\n  try {\n    const { App } = await import('@capacitor/app');\n    const info = await App.getInfo();\n    return info.version;\n  } catch (error) {\n    console.warn(\n      '[getAppVersion] Failed to get native version, using fallback:',\n      error\n    );\n    return webVersion;\n  }\n}\n\n/**\n * Obtiene información completa de la app (solo en nativo).\n * En web retorna null.\n *\n * @returns Promise<AppVersionInfo | null> - Info completa o null en web\n *\n * @example\n * ```typescript\n * const info = await getAppInfo();\n * if (info) {\n *   console.log(`App: ${info.name} v${info.version} (build ${info.build})`);\n *   console.log(`Bundle ID: ${info.id}`);\n * }\n * ```\n */\nexport async function getAppInfo(): Promise<AppVersionInfo | null> {\n  if (!Capacitor.isNativePlatform()) {\n    return null;\n  }\n\n  try {\n    const { App } = await import('@capacitor/app');\n    const info = await App.getInfo();\n    return {\n      version: info.version,\n      build: info.build,\n      name: info.name,\n      id: info.id,\n    };\n  } catch {\n    return null;\n  }\n}\n","/**\n * AppConfig Service Module\n *\n * Servicio de configuración remota para aplicaciones Angular.\n * Lee configuración desde Firestore y provee feature flags, variables dinámicas,\n * y detección de actualizaciones.\n *\n * Soporta detección de versión cross-platform (web y mobile con Capacitor).\n *\n * @example\n * ```typescript\n * // main.ts - Con soporte cross-platform\n * import { provideValtechAppConfig, getAppVersion } from 'valtech-components';\n * import { version } from '../package.json';\n *\n * async function bootstrap() {\n *   const appVersion = await getAppVersion(version);\n *\n *   bootstrapApplication(AppComponent, {\n *     providers: [\n *       provideValtechFirebase(environment.valtechFirebase),\n *       provideValtechAppConfig({\n *         currentVersion: appVersion,\n *         showUpdateBanner: true,\n *       }),\n *     ],\n *   });\n * }\n * bootstrap();\n *\n * // component.ts\n * import { AppConfigService } from 'valtech-components';\n *\n * @Component({...})\n * export class MyComponent {\n *   private appConfig = inject(AppConfigService);\n *\n *   showFeature = computed(() =>\n *     this.appConfig.isFeatureEnabled('newDashboard')\n *   );\n * }\n * ```\n */\n\nexport * from './types';\nexport { VALTECH_APP_CONFIG, provideValtechAppConfig } from './config';\nexport { AppConfigService } from './app-config.service';\nexport { getAppVersion, getAppInfo, type AppVersionInfo } from './version';\n","/**\n * AppVersion Service Module\n *\n * Verificación de versión de la app para PWA / web. Detecta cuándo hay una\n * versión nueva combinando el service worker (`SwUpdate`) y el config remoto\n * (`AppConfigService`), con soporte para actualización obligatoria (hard gate).\n *\n * @example\n * ```typescript\n * // main.ts\n * import { provideValtechAppVersion } from 'valtech-components';\n * import pkg from '../package.json';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAppVersion({ currentVersion: pkg.version }),\n *   ],\n * });\n * ```\n */\n\nexport * from './types';\nexport { VALTECH_APP_VERSION, provideValtechAppVersion } from './config';\nexport { AppVersionService } from './app-version.service';\n","import {\n  Directive,\n  Input,\n  TemplateRef,\n  ViewContainerRef,\n  inject,\n  effect,\n  signal,\n  OnDestroy,\n  isSignal,\n  DestroyRef,\n  ComponentRef,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { isObservable } from 'rxjs';\nimport { SkeletonService } from '../skeleton.service';\nimport { LoadingSource, SkeletonTemplateName, SkeletonTemplateComponent } from '../types';\n\n/**\n * Directiva estructural simplificada para estados de carga.\n *\n * Soporta multiples fuentes de estado de carga:\n * - Angular Signal<boolean>\n * - RxJS Observable<boolean>\n * - Promise<any> (cargando hasta que se resuelve)\n * - boolean literal\n *\n * @example\n * <!-- Uso simple con signal -->\n * <ng-container *valLoading=\"isLoading(); skeleton: 'list'\">\n *   <app-list [items]=\"items()\"></app-list>\n * </ng-container>\n *\n * @example\n * <!-- Con configuracion -->\n * <ng-container *valLoading=\"loading$; skeleton: 'grid-cards'; count: 8\">\n *   <app-grid [data]=\"data\"></app-grid>\n * </ng-container>\n *\n * @example\n * <!-- Con template personalizado -->\n * <ng-container *valLoading=\"isLoading(); skeletonTpl: customSkeleton\">\n *   <app-content></app-content>\n * </ng-container>\n * <ng-template #customSkeleton>\n *   <val-skeleton [props]=\"{ type: 'card' }\"></val-skeleton>\n * </ng-template>\n */\n@Directive({\n  selector: '[valLoading]',\n  standalone: true,\n})\nexport class LoadingDirective implements OnDestroy {\n  private readonly templateRef = inject(TemplateRef<unknown>);\n  private readonly viewContainer = inject(ViewContainerRef);\n  private readonly skeletonService = inject(SkeletonService);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private readonly _loading = signal(false);\n  private hasContentView = false;\n  private skeletonComponentRef: ComponentRef<SkeletonTemplateComponent> | null = null;\n\n  /** Template de skeleton a usar */\n  @Input('valLoadingSkeleton') skeleton: SkeletonTemplateName | string = 'list';\n\n  /** Template personalizado para skeleton */\n  @Input('valLoadingSkeletonTpl') skeletonTpl: TemplateRef<unknown> | null = null;\n\n  /** Cantidad de items skeleton */\n  @Input('valLoadingCount') count = 3;\n\n  /** Animacion habilitada */\n  @Input('valLoadingAnimated') animated = true;\n\n  /** Gap entre items */\n  @Input('valLoadingGap') gap: string | undefined;\n\n  /** Variante del template */\n  @Input('valLoadingVariant') variant: string | undefined;\n\n  /** Mostrar spinner en lugar de skeleton */\n  @Input('valLoadingSpinner') spinner = false;\n\n  constructor() {\n    effect(() => {\n      const isLoading = this._loading();\n      this.updateView(isLoading);\n    });\n  }\n\n  /**\n   * Input principal - puede ser boolean, Signal, Observable o Promise.\n   */\n  @Input('valLoading')\n  set loading(source: LoadingSource) {\n    this.resolveLoadingSource(source);\n  }\n\n  ngOnDestroy(): void {\n    this.viewContainer.clear();\n    this.skeletonComponentRef = null;\n  }\n\n  private resolveLoadingSource(source: LoadingSource): void {\n    if (typeof source === 'boolean') {\n      this._loading.set(source);\n    } else if (isSignal(source)) {\n      // Sincronizar signal con effect\n      effect(\n        () => {\n          this._loading.set((source as () => boolean)());\n        },\n        { injector: this.viewContainer.injector }\n      );\n    } else if (isObservable(source)) {\n      // Convertir observable a signal\n      const signalValue = toSignal(source, {\n        initialValue: true,\n        injector: this.viewContainer.injector,\n      });\n      effect(\n        () => {\n          this._loading.set(signalValue());\n        },\n        { injector: this.viewContainer.injector }\n      );\n    } else if (source instanceof Promise) {\n      this._loading.set(true);\n      source.finally(() => this._loading.set(false));\n    }\n  }\n\n  private updateView(isLoading: boolean): void {\n    if (isLoading) {\n      this.showSkeleton();\n    } else {\n      this.showContent();\n    }\n  }\n\n  private showSkeleton(): void {\n    // Limpiar contenido previo\n    this.viewContainer.clear();\n    this.hasContentView = false;\n\n    if (this.skeletonTpl) {\n      // Usar template personalizado\n      this.viewContainer.createEmbeddedView(this.skeletonTpl);\n    } else if (this.spinner) {\n      // Mostrar spinner (usar val-content-loader si esta disponible)\n      this.showSpinner();\n    } else {\n      // Usar template de skeleton registrado\n      this.showSkeletonTemplate();\n    }\n  }\n\n  private showSkeletonTemplate(): void {\n    const template = this.skeletonService.getTemplate(this.skeleton);\n\n    if (template) {\n      this.skeletonComponentRef = this.viewContainer.createComponent(\n        template.component as new () => SkeletonTemplateComponent\n      );\n\n      // Combinar config por defecto con inputs\n      const config = {\n        ...template.defaultConfig,\n        count: this.count,\n        animated: this.animated,\n        gap: this.gap,\n        variant: this.variant,\n      };\n\n      this.skeletonComponentRef.instance.config = config;\n    } else {\n      // Fallback: mostrar texto de carga si no hay template\n      console.warn(`[valLoading] Template '${this.skeleton}' not found. Using fallback.`);\n      this.showFallback();\n    }\n  }\n\n  private showSpinner(): void {\n    // Crear un div con spinner simple\n    const element = document.createElement('div');\n    element.className = 'val-loading-spinner';\n    element.innerHTML = `\n      <ion-spinner name=\"circular\"></ion-spinner>\n    `;\n    element.style.cssText = 'display: flex; justify-content: center; padding: 20px;';\n\n    const hostElement = this.viewContainer.element.nativeElement as HTMLElement;\n    hostElement.parentElement?.insertBefore(element, hostElement);\n  }\n\n  private showFallback(): void {\n    // Fallback simple si no hay template registrado\n    const element = document.createElement('div');\n    element.className = 'val-loading-fallback';\n    element.style.cssText = 'display: flex; flex-direction: column; gap: 12px; padding: 16px;';\n\n    for (let i = 0; i < this.count; i++) {\n      const skeleton = document.createElement('div');\n      skeleton.style.cssText = `\n        background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\n        background-size: 200% 100%;\n        animation: skeleton-loading 1.5s infinite;\n        height: 56px;\n        border-radius: 8px;\n      `;\n      element.appendChild(skeleton);\n    }\n\n    const hostElement = this.viewContainer.element.nativeElement as HTMLElement;\n    hostElement.parentElement?.insertBefore(element, hostElement);\n  }\n\n  private showContent(): void {\n    // Limpiar skeleton\n    this.viewContainer.clear();\n    this.skeletonComponentRef = null;\n\n    // Mostrar contenido real\n    if (!this.hasContentView) {\n      this.viewContainer.createEmbeddedView(this.templateRef);\n      this.hasContentView = true;\n    }\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para listas.\n *\n * @example\n * <val-skeleton-list [config]=\"{ count: 5 }\"></val-skeleton-list>\n *\n * @example\n * <val-skeleton-list [config]=\"{ count: 3, variant: 'avatar', gap: '16px' }\"></val-skeleton-list>\n */\n@Component({\n  selector: 'val-skeleton-list',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div class=\"skeleton-list\" [style.gap]=\"config.gap || '12px'\" [class]=\"config.cssClass\">\n      @for (item of items; track $index) {\n        @if (config.variant === 'avatar') {\n          <div class=\"skeleton-list-item-avatar\">\n            <val-skeleton\n              [props]=\"{\n                type: 'avatar',\n                animated: config.animated !== false\n              }\"\n            ></val-skeleton>\n            <div class=\"skeleton-content\">\n              <val-skeleton\n                [props]=\"{\n                  type: 'text',\n                  width: '70%',\n                  height: '16px',\n                  animated: config.animated !== false\n                }\"\n              ></val-skeleton>\n              <val-skeleton\n                [props]=\"{\n                  type: 'text',\n                  width: '50%',\n                  height: '14px',\n                  animated: config.animated !== false\n                }\"\n              ></val-skeleton>\n            </div>\n          </div>\n        } @else {\n          <val-skeleton\n            [props]=\"{\n              type: 'list-item',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n        }\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-list {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n      }\n\n      .skeleton-list-item-avatar {\n        display: flex;\n        align-items: center;\n        gap: 12px;\n        padding: 8px 0;\n      }\n\n      .skeleton-content {\n        display: flex;\n        flex-direction: column;\n        gap: 6px;\n        flex: 1;\n      }\n    `,\n  ],\n})\nexport class ListSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = { count: 3 };\n\n  get items(): number[] {\n    return Array(this.config.count ?? 3).fill(0);\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para grids de cards.\n *\n * @example\n * <val-skeleton-grid [config]=\"{ count: 6 }\"></val-skeleton-grid>\n *\n * @example\n * <val-skeleton-grid [config]=\"{ count: 8, variant: 'cards', columns: 4 }\"></val-skeleton-grid>\n */\n@Component({\n  selector: 'val-skeleton-grid',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div\n      class=\"skeleton-grid\"\n      [class]=\"'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')\"\n      [style.gap]=\"config.gap || '16px'\"\n      [style.grid-template-columns]=\"gridColumns\"\n    >\n      @for (item of items; track $index) {\n        @switch (config.variant) {\n          @case ('cards') {\n            <div class=\"skeleton-card\">\n              <val-skeleton\n                [props]=\"{\n                  type: 'custom',\n                  width: '100%',\n                  height: '140px',\n                  borderRadius: '8px 8px 0 0',\n                  animated: config.animated !== false\n                }\"\n              ></val-skeleton>\n              <div class=\"skeleton-card-content\">\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '80%',\n                    height: '18px',\n                    animated: config.animated !== false\n                  }\"\n                ></val-skeleton>\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '60%',\n                    height: '14px',\n                    animated: config.animated !== false\n                  }\"\n                ></val-skeleton>\n              </div>\n            </div>\n          }\n          @case ('compact') {\n            <val-skeleton\n              [props]=\"{\n                type: 'thumbnail',\n                animated: config.animated !== false\n              }\"\n            ></val-skeleton>\n          }\n          @default {\n            <val-skeleton\n              [props]=\"{\n                type: 'card',\n                animated: config.animated !== false\n              }\"\n            ></val-skeleton>\n          }\n        }\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-grid {\n        display: grid;\n        width: 100%;\n\n        &.variant-default {\n          grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n        }\n\n        &.variant-cards {\n          grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n        }\n\n        &.variant-compact {\n          grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n          gap: 12px;\n        }\n      }\n\n      .skeleton-card {\n        border-radius: 8px;\n        overflow: hidden;\n        background: var(--ion-color-light, #f4f5f8);\n      }\n\n      .skeleton-card-content {\n        padding: 12px;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n    `,\n  ],\n})\nexport class GridSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = { count: 6 };\n\n  get items(): number[] {\n    return Array(this.config.count ?? 6).fill(0);\n  }\n\n  get gridColumns(): string {\n    if (this.config.columns) {\n      return `repeat(${this.config.columns}, 1fr)`;\n    }\n    return '';\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para formularios.\n *\n * @example\n * <val-skeleton-form [config]=\"{ count: 4 }\"></val-skeleton-form>\n *\n * @example\n * <val-skeleton-form [config]=\"{ count: 3, variant: 'compact' }\"></val-skeleton-form>\n */\n@Component({\n  selector: 'val-skeleton-form',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div\n      class=\"skeleton-form\"\n      [class]=\"'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')\"\n    >\n      @for (field of fields; track $index) {\n        <div class=\"skeleton-field\">\n          <!-- Label -->\n          <val-skeleton\n            [props]=\"{\n              type: 'text',\n              width: labelWidth,\n              height: '14px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n          <!-- Input -->\n          <val-skeleton\n            [props]=\"{\n              type: 'custom',\n              width: '100%',\n              height: inputHeight,\n              borderRadius: '8px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n        </div>\n      }\n      <!-- Submit button -->\n      <div class=\"skeleton-button\">\n        <val-skeleton\n          [props]=\"{\n            type: 'custom',\n            width: buttonWidth,\n            height: buttonHeight,\n            borderRadius: '8px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-form {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n\n        &.variant-default {\n          gap: 20px;\n        }\n\n        &.variant-compact {\n          gap: 12px;\n        }\n      }\n\n      .skeleton-field {\n        display: flex;\n        flex-direction: column;\n        gap: 6px;\n      }\n\n      .skeleton-button {\n        margin-top: 8px;\n      }\n    `,\n  ],\n})\nexport class FormSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = { count: 3 };\n\n  get fields(): number[] {\n    return Array(this.config.count ?? 3).fill(0);\n  }\n\n  get isCompact(): boolean {\n    return this.config.variant === 'compact';\n  }\n\n  get labelWidth(): string {\n    return this.isCompact ? '60px' : '80px';\n  }\n\n  get inputHeight(): string {\n    return this.isCompact ? '38px' : '44px';\n  }\n\n  get buttonWidth(): string {\n    return this.isCompact ? '120px' : '100%';\n  }\n\n  get buttonHeight(): string {\n    return this.isCompact ? '38px' : '48px';\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para perfiles de usuario.\n *\n * @example\n * <val-skeleton-profile></val-skeleton-profile>\n *\n * @example\n * <val-skeleton-profile [config]=\"{ variant: 'full' }\"></val-skeleton-profile>\n */\n@Component({\n  selector: 'val-skeleton-profile',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div\n      class=\"skeleton-profile\"\n      [class]=\"'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')\"\n    >\n      <div class=\"profile-header\">\n        <!-- Avatar -->\n        <val-skeleton\n          [props]=\"{\n            type: 'avatar',\n            width: avatarSize,\n            height: avatarSize,\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n\n        <div class=\"profile-info\">\n          <!-- Name -->\n          <val-skeleton\n            [props]=\"{\n              type: 'text',\n              width: nameWidth,\n              height: '20px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n          <!-- Subtitle -->\n          <val-skeleton\n            [props]=\"{\n              type: 'text',\n              width: subtitleWidth,\n              height: '14px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n          @if (config.variant === 'full') {\n            <!-- Extra info -->\n            <val-skeleton\n              [props]=\"{\n                type: 'text',\n                width: '100px',\n                height: '12px',\n                animated: config.animated !== false\n              }\"\n            ></val-skeleton>\n          }\n        </div>\n      </div>\n\n      @if (config.variant === 'full') {\n        <div class=\"profile-details\">\n          <val-skeleton\n            [props]=\"{\n              type: 'paragraph',\n              lines: 3,\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n\n          <div class=\"profile-stats\">\n            @for (stat of stats; track $index) {\n              <div class=\"stat-item\">\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '40px',\n                    height: '24px',\n                    animated: config.animated !== false\n                  }\"\n                ></val-skeleton>\n                <val-skeleton\n                  [props]=\"{\n                    type: 'text',\n                    width: '60px',\n                    height: '12px',\n                    animated: config.animated !== false\n                  }\"\n                ></val-skeleton>\n              </div>\n            }\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-profile {\n        width: 100%;\n\n        &.variant-default .profile-header {\n          display: flex;\n          align-items: center;\n          gap: 12px;\n        }\n\n        &.variant-full {\n          .profile-header {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            gap: 16px;\n            text-align: center;\n          }\n\n          .profile-info {\n            align-items: center;\n          }\n\n          .profile-details {\n            margin-top: 24px;\n          }\n        }\n      }\n\n      .profile-info {\n        display: flex;\n        flex-direction: column;\n        gap: 6px;\n      }\n\n      .profile-stats {\n        display: flex;\n        justify-content: center;\n        gap: 32px;\n        margin-top: 20px;\n      }\n\n      .stat-item {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 4px;\n      }\n    `,\n  ],\n})\nexport class ProfileSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = {};\n\n  get avatarSize(): string {\n    return this.config.variant === 'full' ? '96px' : '48px';\n  }\n\n  get nameWidth(): string {\n    return this.config.variant === 'full' ? '180px' : '160px';\n  }\n\n  get subtitleWidth(): string {\n    return this.config.variant === 'full' ? '140px' : '120px';\n  }\n\n  get stats(): number[] {\n    return [1, 2, 3];\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para tablas.\n *\n * @example\n * <val-skeleton-table [config]=\"{ columns: 5, rows: 10 }\"></val-skeleton-table>\n */\n@Component({\n  selector: 'val-skeleton-table',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div class=\"skeleton-table\" [class]=\"config.cssClass\">\n      <!-- Header -->\n      <div class=\"skeleton-table-header\">\n        @for (col of columns; track $index) {\n          <div class=\"skeleton-table-cell\" [style.flex]=\"getColumnFlex($index)\">\n            <val-skeleton\n              [props]=\"{\n                type: 'text',\n                width: '80%',\n                height: '16px',\n                animated: config.animated !== false\n              }\"\n            ></val-skeleton>\n          </div>\n        }\n      </div>\n\n      <!-- Rows -->\n      @for (row of rows; track $index) {\n        <div class=\"skeleton-table-row\">\n          @for (col of columns; track $index) {\n            <div class=\"skeleton-table-cell\" [style.flex]=\"getColumnFlex($index)\">\n              <val-skeleton\n                [props]=\"{\n                  type: 'text',\n                  width: getColumnContentWidth($index),\n                  height: '14px',\n                  animated: config.animated !== false\n                }\"\n              ></val-skeleton>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-table {\n        width: 100%;\n        overflow: hidden;\n        border-radius: 8px;\n        border: 1px solid var(--ion-color-light-shade, #d7d8da);\n      }\n\n      .skeleton-table-header {\n        display: flex;\n        align-items: center;\n        gap: 16px;\n        padding: 14px 16px;\n        background: var(--ion-color-light, #f4f5f8);\n        border-bottom: 1px solid var(--ion-color-light-shade, #d7d8da);\n      }\n\n      .skeleton-table-row {\n        display: flex;\n        align-items: center;\n        gap: 16px;\n        padding: 12px 16px;\n        border-bottom: 1px solid var(--ion-color-light-shade, #d7d8da);\n\n        &:last-child {\n          border-bottom: none;\n        }\n      }\n\n      .skeleton-table-cell {\n        min-width: 0;\n      }\n    `,\n  ],\n})\nexport class TableSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = { columns: 4, rows: 5 };\n\n  get columns(): number[] {\n    return Array(this.config.columns ?? 4).fill(0);\n  }\n\n  get rows(): number[] {\n    return Array(this.config.rows ?? 5).fill(0);\n  }\n\n  getColumnFlex(index: number): string {\n    // Primera columna mas ancha, ultima mas angosta\n    const totalCols = this.config.columns ?? 4;\n    if (index === 0) return '1.5';\n    if (index === totalCols - 1) return '0.8';\n    return '1';\n  }\n\n  getColumnContentWidth(index: number): string {\n    // Variar anchos para aspecto natural\n    const widths = ['90%', '70%', '60%', '80%', '50%'];\n    return widths[index % widths.length];\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';\nimport { SkeletonTemplateConfig, SkeletonTemplateComponent } from '../types';\n\n/**\n * Template de skeleton para paginas de detalle.\n *\n * @example\n * <val-skeleton-detail></val-skeleton-detail>\n *\n * @example\n * <val-skeleton-detail [config]=\"{ sections: 3 }\"></val-skeleton-detail>\n */\n@Component({\n  selector: 'val-skeleton-detail',\n  standalone: true,\n  imports: [CommonModule, SkeletonComponent],\n  template: `\n    <div class=\"skeleton-detail\" [class]=\"config.cssClass\">\n      <!-- Hero/Header section -->\n      <div class=\"skeleton-detail-hero\">\n        <val-skeleton\n          [props]=\"{\n            type: 'custom',\n            width: '100%',\n            height: '200px',\n            borderRadius: '8px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n      </div>\n\n      <!-- Title section -->\n      <div class=\"skeleton-detail-title\">\n        <val-skeleton\n          [props]=\"{\n            type: 'text',\n            width: '70%',\n            height: '28px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n        <val-skeleton\n          [props]=\"{\n            type: 'text',\n            width: '40%',\n            height: '16px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n      </div>\n\n      <!-- Metadata row -->\n      <div class=\"skeleton-detail-meta\">\n        @for (meta of metaItems; track $index) {\n          <val-skeleton\n            [props]=\"{\n              type: 'custom',\n              width: '80px',\n              height: '24px',\n              borderRadius: '12px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n        }\n      </div>\n\n      <!-- Content sections -->\n      @for (section of sections; track $index) {\n        <div class=\"skeleton-detail-section\">\n          <!-- Section title -->\n          <val-skeleton\n            [props]=\"{\n              type: 'text',\n              width: '30%',\n              height: '20px',\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n          <!-- Section content -->\n          <val-skeleton\n            [props]=\"{\n              type: 'paragraph',\n              lines: 4,\n              animated: config.animated !== false\n            }\"\n          ></val-skeleton>\n        </div>\n      }\n\n      <!-- Action buttons -->\n      <div class=\"skeleton-detail-actions\">\n        <val-skeleton\n          [props]=\"{\n            type: 'custom',\n            width: '120px',\n            height: '44px',\n            borderRadius: '8px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n        <val-skeleton\n          [props]=\"{\n            type: 'custom',\n            width: '120px',\n            height: '44px',\n            borderRadius: '8px',\n            animated: config.animated !== false\n          }\"\n        ></val-skeleton>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .skeleton-detail {\n        display: flex;\n        flex-direction: column;\n        gap: 20px;\n        width: 100%;\n      }\n\n      .skeleton-detail-hero {\n        width: 100%;\n      }\n\n      .skeleton-detail-title {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n      }\n\n      .skeleton-detail-meta {\n        display: flex;\n        gap: 12px;\n        flex-wrap: wrap;\n      }\n\n      .skeleton-detail-section {\n        display: flex;\n        flex-direction: column;\n        gap: 12px;\n        padding-top: 16px;\n        border-top: 1px solid var(--ion-color-light-shade, #d7d8da);\n      }\n\n      .skeleton-detail-actions {\n        display: flex;\n        gap: 12px;\n        padding-top: 16px;\n      }\n    `,\n  ],\n})\nexport class DetailSkeletonComponent implements SkeletonTemplateComponent {\n  @Input() config: SkeletonTemplateConfig = { sections: 2 };\n\n  get sections(): number[] {\n    return Array(this.config.sections ?? 2).fill(0);\n  }\n\n  get metaItems(): number[] {\n    return [1, 2, 3];\n  }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders, APP_INITIALIZER } from '@angular/core';\nimport { SkeletonConfig, DEFAULT_SKELETON_CONFIG } from './types';\nimport { SkeletonService } from './skeleton.service';\n\n// Import built-in templates\nimport { ListSkeletonComponent } from './templates/list-skeleton.component';\nimport { GridSkeletonComponent } from './templates/grid-skeleton.component';\nimport { FormSkeletonComponent } from './templates/form-skeleton.component';\nimport { ProfileSkeletonComponent } from './templates/profile-skeleton.component';\nimport { TableSkeletonComponent } from './templates/table-skeleton.component';\nimport { DetailSkeletonComponent } from './templates/detail-skeleton.component';\n\n/**\n * Configura el sistema de skeletons para Valtech Components.\n *\n * @param config Configuracion de skeletons\n * @returns Providers para app.config.ts\n *\n * @example\n * // app.config.ts\n * import { provideValtechSkeleton } from 'valtech-components';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     provideValtechSkeleton({\n *       animated: true,\n *       defaultDelay: 100,\n *       defaultMinTime: 500,\n *       templates: [\n *         { name: 'custom-card', component: MyCustomCardSkeleton }\n *       ]\n *     }),\n *   ]\n * };\n *\n * @example\n * // Uso minimo - usa configuracion por defecto\n * providers: [provideValtechSkeleton()]\n */\nexport function provideValtechSkeleton(config: SkeletonConfig = {}): EnvironmentProviders {\n  const mergedConfig = { ...DEFAULT_SKELETON_CONFIG, ...config };\n\n  return makeEnvironmentProviders([\n    {\n      provide: APP_INITIALIZER,\n      useFactory: (skeletonService: SkeletonService) => {\n        return () => {\n          // Configurar servicio\n          skeletonService.configure(mergedConfig);\n\n          // Registrar templates built-in\n          skeletonService.registerTemplate('list', ListSkeletonComponent, { count: 3 });\n          skeletonService.registerTemplate('list-avatar', ListSkeletonComponent, {\n            count: 3,\n            variant: 'avatar',\n          });\n          skeletonService.registerTemplate('grid', GridSkeletonComponent, { count: 4 });\n          skeletonService.registerTemplate('grid-cards', GridSkeletonComponent, {\n            count: 6,\n            variant: 'cards',\n          });\n          skeletonService.registerTemplate('form', FormSkeletonComponent, { count: 3 });\n          skeletonService.registerTemplate('form-compact', FormSkeletonComponent, {\n            count: 2,\n            variant: 'compact',\n          });\n          skeletonService.registerTemplate('profile', ProfileSkeletonComponent, {});\n          skeletonService.registerTemplate('profile-full', ProfileSkeletonComponent, {\n            variant: 'full',\n          });\n          skeletonService.registerTemplate('table', TableSkeletonComponent, {\n            columns: 4,\n            rows: 5,\n          });\n          skeletonService.registerTemplate('detail', DetailSkeletonComponent, { sections: 2 });\n        };\n      },\n      deps: [SkeletonService],\n      multi: true,\n    },\n  ]);\n}\n","// Types\nexport {\n  SkeletonTemplateName,\n  SkeletonTemplateConfig,\n  LoadingSource,\n  SkeletonDirectiveConfig,\n  LoadingDirectiveConfig,\n  RegisteredSkeletonTemplate,\n  SkeletonConfig,\n  SkeletonTemplateContext,\n  SkeletonTemplateComponent,\n  DEFAULT_SKELETON_CONFIG,\n} from './types';\n\n// Service\nexport { SkeletonService } from './skeleton.service';\n\n// Directives\nexport { LoadingDirective } from './directives/loading.directive';\n\n// Templates\nexport { ListSkeletonComponent } from './templates/list-skeleton.component';\nexport { GridSkeletonComponent } from './templates/grid-skeleton.component';\nexport { FormSkeletonComponent } from './templates/form-skeleton.component';\nexport { ProfileSkeletonComponent } from './templates/profile-skeleton.component';\nexport { TableSkeletonComponent } from './templates/table-skeleton.component';\nexport { DetailSkeletonComponent } from './templates/detail-skeleton.component';\n\n// Config / Provider\nexport { provideValtechSkeleton } from './config';\n","import { Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Estrategia de paginacion.\n */\nexport type PaginationStrategy = 'offset' | 'cursor' | 'page';\n\n/**\n * Estado de paginacion.\n */\nexport interface PaginationState<T> {\n  /** Items actuales */\n  items: T[];\n  /** Pagina actual (para estrategia offset/page) */\n  page: number;\n  /** Tamano de pagina */\n  pageSize: number;\n  /** Conteo total (si se conoce) */\n  total?: number;\n  /** Cursor para siguiente pagina (para estrategia cursor) */\n  nextCursor?: unknown;\n  /** Cursor para pagina anterior */\n  prevCursor?: unknown;\n  /** Si existen mas items */\n  hasMore: boolean;\n  /** Estado de carga */\n  isLoading: boolean;\n  /** Estado de error */\n  error?: Error;\n}\n\n/**\n * Parametros para funcion de carga.\n */\nexport interface PaginationLoadParams {\n  /** Estrategia de paginacion */\n  strategy: PaginationStrategy;\n  /** Numero de pagina */\n  page: number;\n  /** Tamano de pagina */\n  pageSize: number;\n  /** Cursor (para estrategia cursor) */\n  cursor?: unknown;\n  /** Direccion de carga */\n  direction: 'forward' | 'backward';\n}\n\n/**\n * Resultado de funcion de carga.\n */\nexport interface PaginationLoadResult<T> {\n  /** Items cargados */\n  items: T[];\n  /** Si hay mas items */\n  hasMore: boolean;\n  /** Total de items (opcional) */\n  total?: number;\n  /** Cursor para siguiente pagina */\n  nextCursor?: unknown;\n  /** Cursor para pagina anterior */\n  prevCursor?: unknown;\n}\n\n/**\n * Configuracion para crear un controlador de paginacion.\n */\nexport interface PaginationConfig<T> {\n  /** Estrategia de paginacion */\n  strategy: PaginationStrategy;\n  /** Tamano de pagina */\n  pageSize?: number;\n  /** Items iniciales (opcional) */\n  initialItems?: T[];\n  /** Funcion de carga */\n  loadFn: (params: PaginationLoadParams) => Observable<PaginationLoadResult<T>> | Promise<PaginationLoadResult<T>>;\n  /** Funcion de tracking para items */\n  trackBy?: (item: T) => unknown;\n}\n\n/**\n * Interface del controlador de paginacion.\n */\nexport interface PaginationController<T> {\n  /** Estado reactivo como signal */\n  state: Signal<PaginationState<T>>;\n  /** Signal de items (accessor de conveniencia) */\n  items: Signal<T[]>;\n  /** Signal de carga */\n  isLoading: Signal<boolean>;\n  /** Signal de mas items */\n  hasMore: Signal<boolean>;\n  /** Signal de error */\n  error: Signal<Error | null>;\n  /** Signal de pagina actual */\n  currentPage: Signal<number>;\n  /** Signal de total */\n  total: Signal<number | undefined>;\n\n  /** Cargar siguiente pagina */\n  loadNext(): Promise<void>;\n  /** Cargar pagina anterior (si soportado) */\n  loadPrevious(): Promise<void>;\n  /** Refresh (recargar desde inicio) */\n  refresh(): Promise<void>;\n  /** Reset a estado inicial */\n  reset(): void;\n  /** Actualizar un item */\n  updateItem(predicate: (item: T) => boolean, updates: Partial<T>): void;\n  /** Remover un item */\n  removeItem(predicate: (item: T) => boolean): void;\n  /** Agregar items al inicio */\n  prependItems(items: T[]): void;\n  /** Agregar items al final */\n  appendItems(items: T[]): void;\n}\n\n/**\n * Estado inicial para controladores de paginacion.\n */\nexport function createInitialPaginationState<T>(\n  pageSize: number,\n  initialItems: T[] = []\n): PaginationState<T> {\n  return {\n    items: initialItems,\n    page: 0,\n    pageSize,\n    hasMore: true,\n    isLoading: false,\n    error: undefined,\n  };\n}\n","import { Injectable, signal, computed, Signal } from '@angular/core';\nimport { firstValueFrom, isObservable } from 'rxjs';\nimport {\n  PaginationConfig,\n  PaginationController,\n  PaginationLoadParams,\n  PaginationLoadResult,\n  PaginationState,\n  createInitialPaginationState,\n} from './types';\n\n/**\n * Implementacion del controlador de paginacion.\n */\nclass PaginationControllerImpl<T> implements PaginationController<T> {\n  private readonly _state = signal<PaginationState<T>>(\n    createInitialPaginationState(this.config.pageSize ?? 20, this.config.initialItems)\n  );\n\n  readonly state = this._state.asReadonly();\n  readonly items = computed(() => this._state().items);\n  readonly isLoading = computed(() => this._state().isLoading);\n  readonly hasMore = computed(() => this._state().hasMore);\n  readonly error = computed(() => this._state().error ?? null);\n  readonly currentPage = computed(() => this._state().page);\n  readonly total = computed(() => this._state().total);\n\n  constructor(private readonly config: PaginationConfig<T>) {}\n\n  async loadNext(): Promise<void> {\n    const currentState = this._state();\n    if (currentState.isLoading || !currentState.hasMore) return;\n\n    this._state.update((s) => ({ ...s, isLoading: true, error: undefined }));\n\n    try {\n      const params: PaginationLoadParams = {\n        strategy: this.config.strategy,\n        page: currentState.page,\n        pageSize: currentState.pageSize,\n        cursor: currentState.nextCursor,\n        direction: 'forward',\n      };\n\n      const result = await this.executeLoad(params);\n\n      this._state.update((s) => ({\n        ...s,\n        items: [...s.items, ...result.items],\n        page: s.page + 1,\n        hasMore: result.hasMore,\n        total: result.total ?? s.total,\n        nextCursor: result.nextCursor,\n        prevCursor: result.prevCursor ?? s.prevCursor,\n        isLoading: false,\n      }));\n    } catch (err) {\n      this._state.update((s) => ({\n        ...s,\n        isLoading: false,\n        error: err as Error,\n      }));\n    }\n  }\n\n  async loadPrevious(): Promise<void> {\n    const currentState = this._state();\n    if (currentState.isLoading || currentState.page <= 0) return;\n\n    this._state.update((s) => ({ ...s, isLoading: true, error: undefined }));\n\n    try {\n      const params: PaginationLoadParams = {\n        strategy: this.config.strategy,\n        page: currentState.page - 1,\n        pageSize: currentState.pageSize,\n        cursor: currentState.prevCursor,\n        direction: 'backward',\n      };\n\n      const result = await this.executeLoad(params);\n\n      this._state.update((s) => ({\n        ...s,\n        items: [...result.items, ...s.items],\n        page: s.page - 1,\n        prevCursor: result.prevCursor,\n        isLoading: false,\n      }));\n    } catch (err) {\n      this._state.update((s) => ({\n        ...s,\n        isLoading: false,\n        error: err as Error,\n      }));\n    }\n  }\n\n  async refresh(): Promise<void> {\n    this._state.update((s) => ({\n      ...s,\n      items: [],\n      page: 0,\n      hasMore: true,\n      nextCursor: undefined,\n      prevCursor: undefined,\n      isLoading: true,\n      error: undefined,\n    }));\n\n    try {\n      const params: PaginationLoadParams = {\n        strategy: this.config.strategy,\n        page: 0,\n        pageSize: this._state().pageSize,\n        direction: 'forward',\n      };\n\n      const result = await this.executeLoad(params);\n\n      this._state.update((s) => ({\n        ...s,\n        items: result.items,\n        page: 1,\n        hasMore: result.hasMore,\n        total: result.total,\n        nextCursor: result.nextCursor,\n        isLoading: false,\n      }));\n    } catch (err) {\n      this._state.update((s) => ({\n        ...s,\n        isLoading: false,\n        error: err as Error,\n      }));\n    }\n  }\n\n  reset(): void {\n    this._state.set(\n      createInitialPaginationState(this.config.pageSize ?? 20, this.config.initialItems)\n    );\n  }\n\n  updateItem(predicate: (item: T) => boolean, updates: Partial<T>): void {\n    this._state.update((s) => ({\n      ...s,\n      items: s.items.map((item) => (predicate(item) ? { ...item, ...updates } : item)),\n    }));\n  }\n\n  removeItem(predicate: (item: T) => boolean): void {\n    this._state.update((s) => ({\n      ...s,\n      items: s.items.filter((item) => !predicate(item)),\n    }));\n  }\n\n  prependItems(items: T[]): void {\n    this._state.update((s) => ({\n      ...s,\n      items: [...items, ...s.items],\n    }));\n  }\n\n  appendItems(items: T[]): void {\n    this._state.update((s) => ({\n      ...s,\n      items: [...s.items, ...items],\n    }));\n  }\n\n  private async executeLoad(params: PaginationLoadParams): Promise<PaginationLoadResult<T>> {\n    const result = this.config.loadFn(params);\n\n    if (isObservable(result)) {\n      return await firstValueFrom(result);\n    }\n    return await result;\n  }\n}\n\n/**\n * Servicio para crear controladores de paginacion reutilizables.\n *\n * @example\n * // En un componente\n * pagination = inject(PaginationService);\n *\n * usersController = this.pagination.createController<User>({\n *   strategy: 'offset',\n *   pageSize: 20,\n *   loadFn: (params) => this.userService.getUsers(params.page, params.pageSize)\n * });\n *\n * // En el template\n * @for (user of usersController.items(); track user.id) {\n *   <app-user-card [user]=\"user\"></app-user-card>\n * }\n *\n * @if (usersController.hasMore()) {\n *   <ion-button (click)=\"usersController.loadNext()\">Cargar mas</ion-button>\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class PaginationService {\n  /**\n   * Crea un controlador de paginacion para una fuente de datos.\n   *\n   * @param config Configuracion del controlador\n   * @returns Controlador de paginacion\n   */\n  createController<T>(config: PaginationConfig<T>): PaginationController<T> {\n    return new PaginationControllerImpl<T>(config);\n  }\n\n  /**\n   * Crea un controlador simple para arrays estaticos con paginacion local.\n   *\n   * @param items Array completo de items\n   * @param pageSize Tamano de pagina\n   * @returns Controlador de paginacion\n   */\n  createLocalController<T>(items: T[], pageSize = 20): PaginationController<T> {\n    let currentIndex = 0;\n\n    return this.createController<T>({\n      strategy: 'offset',\n      pageSize,\n      loadFn: async (params) => {\n        const start = params.page * params.pageSize;\n        const end = start + params.pageSize;\n        const pageItems = items.slice(start, end);\n\n        return {\n          items: pageItems,\n          hasMore: end < items.length,\n          total: items.length,\n        };\n      },\n    });\n  }\n}\n","// Types\nexport {\n  PaginationStrategy,\n  PaginationState,\n  PaginationLoadParams,\n  PaginationLoadResult,\n  PaginationConfig,\n  PaginationController,\n  createInitialPaginationState,\n} from './types';\n\n// Service\nexport { PaginationService } from './pagination.service';\n","/**\n * Ads Loader Service\n *\n * Maneja la carga lazy del script de Google AdSense.\n * Solo carga el script cuando se necesita el primer ad.\n */\n\nimport { Injectable, Inject, PLATFORM_ID, signal } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\n\nimport { VALTECH_ADS_CONFIG } from './config';\nimport { ValtechAdsConfig } from './types';\n\n/** URL del script AdSense */\nconst ADSENSE_SCRIPT_URL = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';\n\n/**\n * Servicio para cargar el script de Google AdSense.\n *\n * Implementa lazy loading: el script solo se carga cuando\n * se solicita renderizar el primer ad slot.\n */\n@Injectable({ providedIn: 'root' })\nexport class AdsLoaderService {\n  private readonly _isLoading = signal<boolean>(false);\n  private readonly _isLoaded = signal<boolean>(false);\n  private readonly _error = signal<Error | null>(null);\n\n  /** Indica si el script esta cargando */\n  readonly isLoading = this._isLoading.asReadonly();\n\n  /** Indica si el script esta cargado */\n  readonly isLoaded = this._isLoaded.asReadonly();\n\n  /** Error de carga (si existe) */\n  readonly error = this._error.asReadonly();\n\n  private loadPromise: Promise<boolean> | null = null;\n\n  constructor(\n    @Inject(VALTECH_ADS_CONFIG) private config: ValtechAdsConfig,\n    @Inject(PLATFORM_ID) private platformId: Object\n  ) {}\n\n  /**\n   * Carga el script AdSense de forma lazy.\n   * Retorna true si se cargo correctamente, false si fallo.\n   *\n   * @returns Promise<boolean>\n   */\n  loadAdSense(): Promise<boolean> {\n    // SSR check\n    if (!isPlatformBrowser(this.platformId)) {\n      return Promise.resolve(false);\n    }\n\n    // Ya cargado\n    if (this._isLoaded()) {\n      return Promise.resolve(true);\n    }\n\n    // Ya hay una carga en progreso\n    if (this.loadPromise) {\n      return this.loadPromise;\n    }\n\n    this._isLoading.set(true);\n    this._error.set(null);\n\n    this.loadPromise = new Promise<boolean>((resolve) => {\n      // Inicializar adsbygoogle array\n      window.adsbygoogle = window.adsbygoogle || [];\n\n      // Crear script\n      const script = document.createElement('script');\n      script.async = true;\n      script.src = ADSENSE_SCRIPT_URL;\n      script.crossOrigin = 'anonymous';\n\n      // Agregar data-ad-client (Publisher ID)\n      script.setAttribute('data-ad-client', this.config.adClient);\n\n      // Test mode para desarrollo\n      if (this.config.testMode) {\n        script.setAttribute('data-adtest', 'on');\n      }\n\n      script.onload = () => {\n        this._isLoaded.set(true);\n        this._isLoading.set(false);\n\n        if (this.config.debugMode) {\n          console.log('[ValtechAds] Script AdSense cargado', {\n            adClient: this.config.adClient,\n            testMode: this.config.testMode,\n          });\n        }\n\n        resolve(true);\n      };\n\n      script.onerror = (error) => {\n        console.error('[ValtechAds] Error cargando AdSense:', error);\n        this._error.set(new Error('Error cargando Google AdSense'));\n        this._isLoading.set(false);\n        this.loadPromise = null;\n        resolve(false);\n      };\n\n      // Insertar script en head\n      document.head.appendChild(script);\n    });\n\n    return this.loadPromise;\n  }\n\n  /**\n   * Verifica si el script AdSense esta disponible.\n   */\n  isAdSenseAvailable(): boolean {\n    return isPlatformBrowser(this.platformId) && !!window.adsbygoogle && this._isLoaded();\n  }\n\n  /**\n   * Ejecuta un comando AdSense (push a la queue).\n   * Usado internamente para activar ad slots.\n   */\n  pushAdCommand(): void {\n    if (this.isAdSenseAvailable() && window.adsbygoogle) {\n      window.adsbygoogle.push({});\n    }\n  }\n}\n","/**\n * Ads Service\n *\n * Servicio principal para Google AdSense.\n * Integra con el sistema de auth para detectar usuarios premium.\n */\n\nimport { Inject, Injectable, PLATFORM_ID, signal, computed, OnDestroy } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { filter } from 'rxjs/operators';\nimport { Subscription } from 'rxjs';\n\nimport { VALTECH_ADS_CONFIG } from './config';\nimport { AdsLoaderService } from './ads-loader.service';\nimport { AuthStateService } from '../auth/auth-state.service';\nimport { ValtechAdsConfig, AdSlotState, AdEvent } from './types';\n\n/**\n * Servicio principal de Google AdSense.\n *\n * Maneja la carga del script y el estado de ads.\n * Detecta automaticamente usuarios premium para ocultar ads.\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n *   private ads = inject(AdsService);\n *\n *   // Verificar si mostrar ads\n *   showAds = this.ads.isEnabled;\n *\n *   // Verificar si usuario es premium\n *   isPremium = this.ads.isPremiumUser;\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class AdsService implements OnDestroy {\n  // ===========================================================================\n  // ESTADO (Signals)\n  // ===========================================================================\n\n  private readonly _isInitialized = signal<boolean>(false);\n  private readonly _isEnabled = signal<boolean>(false);\n  private readonly _isDebugMode = signal<boolean>(false);\n  private readonly _slotStates = signal<Map<string, AdSlotState>>(new Map());\n  private readonly _events = signal<AdEvent[]>([]);\n  private readonly _adClient = signal<string>('');\n\n  /** Indica si el servicio esta inicializado */\n  readonly isInitialized = this._isInitialized.asReadonly();\n\n  /** Indica si los ads estan habilitados (no premium + inicializado) */\n  readonly isEnabled = computed(() => {\n    return this._isInitialized() && this._isEnabled() && !this.authStateService.isPremium();\n  });\n\n  /** Indica si el usuario es premium (no ve ads) */\n  readonly isPremiumUser = this.authStateService.isPremium;\n\n  /** Indica si esta en modo debug */\n  readonly isDebugMode = this._isDebugMode.asReadonly();\n\n  /** Publisher ID de AdSense */\n  readonly adClient = this._adClient.asReadonly();\n\n  /** Eventos de ads (historial) */\n  readonly events = this._events.asReadonly();\n\n  // ===========================================================================\n  // INTERNOS\n  // ===========================================================================\n\n  private activeSlotIds = new Set<string>();\n  private routerSubscription: Subscription | null = null;\n\n  constructor(\n    @Inject(VALTECH_ADS_CONFIG) private config: ValtechAdsConfig,\n    @Inject(PLATFORM_ID) private platformId: Object,\n    private router: Router,\n    private loaderService: AdsLoaderService,\n    private authStateService: AuthStateService\n  ) {\n    this._isDebugMode.set(config.debugMode ?? false);\n    this._adClient.set(config.adClient);\n  }\n\n  // ===========================================================================\n  // INICIALIZACION\n  // ===========================================================================\n\n  /**\n   * Inicializa el servicio de ads.\n   * Llamado automaticamente por APP_INITIALIZER.\n   * NO carga el script AdSense hasta que se necesite el primer ad.\n   */\n  async initialize(): Promise<void> {\n    if (!isPlatformBrowser(this.platformId)) {\n      return;\n    }\n\n    // Si es premium, no inicializar ads\n    if (this.authStateService.isPremium()) {\n      if (this._isDebugMode()) {\n        console.log('[ValtechAds] Usuario premium detectado - ads deshabilitados');\n      }\n      this._isInitialized.set(true);\n      return;\n    }\n\n    // Suscribirse a cambios de ruta para verificar exclusiones\n    this.setupRouteListener();\n\n    this._isEnabled.set(true);\n    this._isInitialized.set(true);\n\n    if (this._isDebugMode()) {\n      console.log('[ValtechAds] Inicializado', {\n        adClient: this.config.adClient,\n        testMode: this.config.testMode,\n        excludeRoutes: this.config.excludeRoutes,\n      });\n    }\n  }\n\n  /**\n   * Carga el script AdSense de forma lazy.\n   * Llamado automaticamente cuando se renderiza el primer ad slot.\n   */\n  async ensureAdSenseLoaded(): Promise<boolean> {\n    if (!this.isEnabled()) {\n      return false;\n    }\n\n    return this.loaderService.loadAdSense();\n  }\n\n  // ===========================================================================\n  // GESTION DE SLOTS\n  // ===========================================================================\n\n  /**\n   * Registra un ad slot.\n   * Llamado internamente por el componente AdSlot.\n   *\n   * @param slotId - ID unico del slot\n   * @returns true si el slot se puede mostrar\n   */\n  async registerSlot(slotId: string): Promise<boolean> {\n    if (!this.isEnabled()) {\n      this.updateSlotState(slotId, 'hidden');\n      return false;\n    }\n\n    // Verificar si la ruta actual esta excluida\n    if (this.isRouteExcluded()) {\n      this.updateSlotState(slotId, 'hidden');\n      return false;\n    }\n\n    this.updateSlotState(slotId, 'loading');\n\n    const loaded = await this.ensureAdSenseLoaded();\n    if (!loaded) {\n      this.updateSlotState(slotId, 'error');\n      return false;\n    }\n\n    this.activeSlotIds.add(slotId);\n\n    // Push ad command para activar el slot\n    this.loaderService.pushAdCommand();\n\n    this.updateSlotState(slotId, 'rendered');\n    this.emitEvent({ type: 'loaded', slotId, isEmpty: false });\n\n    if (this._isDebugMode()) {\n      console.log(`[ValtechAds] Slot registrado: ${slotId}`);\n    }\n\n    return true;\n  }\n\n  /**\n   * Desregistra un slot.\n   *\n   * @param slotId - ID del slot a desregistrar\n   */\n  unregisterSlot(slotId: string): void {\n    this.activeSlotIds.delete(slotId);\n    this._slotStates.update((states) => {\n      const newStates = new Map(states);\n      newStates.delete(slotId);\n      return newStates;\n    });\n\n    if (this._isDebugMode()) {\n      console.log(`[ValtechAds] Slot desregistrado: ${slotId}`);\n    }\n  }\n\n  /**\n   * Obtiene el estado de un slot.\n   *\n   * @param slotId - ID del slot\n   * @returns Estado actual del slot\n   */\n  getSlotState(slotId: string): AdSlotState {\n    return this._slotStates().get(slotId) ?? 'idle';\n  }\n\n  // ===========================================================================\n  // PRIVATE METHODS\n  // ===========================================================================\n\n  private updateSlotState(slotId: string, state: AdSlotState): void {\n    this._slotStates.update((states) => new Map(states).set(slotId, state));\n  }\n\n  private emitEvent(event: Omit<AdEvent, 'timestamp'>): void {\n    const fullEvent: AdEvent = { ...event, timestamp: new Date() };\n    this._events.update((events) => [...events.slice(-99), fullEvent]);\n\n    // Callbacks de configuracion\n    if (event.type === 'loaded' || event.type === 'empty') {\n      this.config.onAdLoaded?.(event.slotId, event.isEmpty ?? false);\n    } else if (event.type === 'error' && event.error) {\n      this.config.onAdError?.(event.slotId, event.error);\n    }\n  }\n\n  private setupRouteListener(): void {\n    if (!this.config.excludeRoutes || this.config.excludeRoutes.length === 0) {\n      return;\n    }\n\n    this.routerSubscription = this.router.events\n      .pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))\n      .subscribe(() => {\n        // Los slots se ocultan/muestran automaticamente via isEnabled()\n        // No necesitamos destruir slots con AdSense\n      });\n  }\n\n  private isRouteExcluded(url?: string): boolean {\n    if (!this.config.excludeRoutes || this.config.excludeRoutes.length === 0) {\n      return false;\n    }\n\n    const currentUrl = url ?? this.router.url;\n    return this.config.excludeRoutes.some((pattern) => {\n      const regex = new RegExp(pattern);\n      return regex.test(currentUrl);\n    });\n  }\n\n  // ===========================================================================\n  // LIFECYCLE\n  // ===========================================================================\n\n  ngOnDestroy(): void {\n    this.routerSubscription?.unsubscribe();\n    this.activeSlotIds.clear();\n    this._slotStates.set(new Map());\n  }\n}\n","/**\n * Ads Configuration\n *\n * Configuracion e inicializacion de Google AdSense para Angular.\n * Usa provideValtechAds() en el bootstrap de tu aplicacion.\n */\n\nimport {\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n  APP_INITIALIZER,\n} from '@angular/core';\nimport { ValtechAdsConfig } from './types';\nimport { AdsService } from './ads.service';\n\n/**\n * Token de inyeccion para la configuracion de Ads.\n * Usado internamente por los servicios de ads.\n */\nexport const VALTECH_ADS_CONFIG = new InjectionToken<ValtechAdsConfig>('ValtechAdsConfig');\n\n/**\n * Configuracion por defecto del servicio de ads.\n */\nexport const DEFAULT_ADS_CONFIG: Partial<ValtechAdsConfig> = {\n  debugMode: false,\n  testMode: false,\n  autoAds: false,\n};\n\n/**\n * Factory para inicializar AdsService.\n * Se ejecuta durante el bootstrap de la aplicacion.\n */\nfunction initializeAds(adsService: AdsService): () => Promise<void> {\n  return () => adsService.initialize();\n}\n\n/**\n * Provee el servicio de Ads a la aplicacion Angular.\n *\n * @param config - Configuracion de Google AdSense\n * @returns EnvironmentProviders para usar en bootstrapApplication\n *\n * @example\n * ```typescript\n * // main.ts\n * import { bootstrapApplication } from '@angular/platform-browser';\n * import { provideValtechAds } from 'valtech-components';\n *\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideValtechAds({\n *       adClient: 'ca-pub-XXXXXXXXXXXXXXXX',\n *       testMode: true, // Usa ads de prueba en desarrollo\n *       debugMode: true,\n *     }),\n *   ],\n * });\n * ```\n *\n * @example Con rutas excluidas\n * ```typescript\n * provideValtechAds({\n *   adClient: 'ca-pub-XXXXXXXXXXXXXXXX',\n *   excludeRoutes: [\n *     '^/checkout',\n *     '^/payment',\n *     '^/premium',\n *   ],\n * })\n * ```\n */\nexport function provideValtechAds(config: ValtechAdsConfig): EnvironmentProviders {\n  // Merge config con defaults\n  const mergedConfig: ValtechAdsConfig = {\n    ...DEFAULT_ADS_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([\n    { provide: VALTECH_ADS_CONFIG, useValue: mergedConfig },\n    // Inicializar AdsService al arrancar (pero NO cargar script AdSense aun)\n    {\n      provide: APP_INITIALIZER,\n      useFactory: initializeAds,\n      deps: [AdsService],\n      multi: true,\n    },\n  ]);\n}\n","/**\n * Ads Types\n *\n * Tipos e interfaces para el servicio de Google AdSense.\n * Simplificado para usar AdSense en lugar de GPT (Ad Manager).\n */\n\n// ============================================================================\n// CONFIGURACION\n// ============================================================================\n\n/**\n * Configuracion del servicio de Ads.\n * Pasada a provideValtechAds() en el bootstrap de la aplicacion.\n */\nexport interface ValtechAdsConfig {\n  /** Publisher ID de AdSense (formato: ca-pub-XXXXXXXXXXXXXXXX) */\n  adClient: string;\n\n  /** Habilitar modo debug (muestra info de ads en consola) */\n  debugMode?: boolean;\n\n  /** Test mode - usa ads de prueba durante desarrollo */\n  testMode?: boolean;\n\n  /** Habilitar Auto Ads (Google decide ubicacion automaticamente) */\n  autoAds?: boolean;\n\n  /** Callback cuando se carga un ad */\n  onAdLoaded?: (slotId: string, isEmpty: boolean) => void;\n\n  /** Callback cuando falla un ad */\n  onAdError?: (slotId: string, error: Error) => void;\n\n  /** Rutas donde NO mostrar ads (regex patterns) */\n  excludeRoutes?: string[];\n}\n\n// ============================================================================\n// AD SLOTS\n// ============================================================================\n\n/**\n * Formato de ad para AdSense.\n */\nexport type AdFormat = 'auto' | 'fluid' | 'rectangle' | 'horizontal' | 'vertical';\n\n/**\n * Configuracion de un ad slot individual.\n */\nexport interface AdSlotConfig {\n  /** ID unico del slot (usado para el div container) */\n  slotId: string;\n\n  /** Ad Slot ID de AdSense (numero de unidad de anuncio) */\n  adSlot?: string;\n\n  /** Formato del ad */\n  format?: AdFormat;\n\n  /** Responsive - ocupa todo el ancho disponible */\n  fullWidth?: boolean;\n\n  /** CSS class adicional */\n  cssClass?: string;\n\n  /** Altura minima mientras carga */\n  minHeight?: string;\n\n  /** Mostrar skeleton mientras carga */\n  showSkeleton?: boolean;\n}\n\n// ============================================================================\n// ESTADO\n// ============================================================================\n\n/**\n * Estado de un ad slot.\n */\nexport type AdSlotState =\n  | 'idle' // No cargado\n  | 'loading' // Script/ad cargando\n  | 'rendered' // Ad visible\n  | 'empty' // Sin ad disponible\n  | 'hidden' // Usuario premium o sin consent\n  | 'error'; // Error de carga\n\n/**\n * Evento emitido por el servicio de ads.\n */\nexport interface AdEvent {\n  type: 'loaded' | 'empty' | 'error' | 'viewable' | 'clicked';\n  slotId: string;\n  timestamp: Date;\n  isEmpty?: boolean;\n  error?: Error;\n}\n\n// ============================================================================\n// CONSENT\n// ============================================================================\n\n/**\n * Estado de consent para ads (mapeado desde AnalyticsService).\n */\nexport interface AdsConsentState {\n  /** Permite almacenamiento de ads */\n  adStorage: boolean;\n\n  /** Permite personalizacion de ads */\n  adPersonalization: boolean;\n\n  /** Permite datos de usuario para ads */\n  adUserData: boolean;\n}\n\n// ============================================================================\n// ADSENSE (Google AdSense) Types\n// ============================================================================\n\n/** AdSense global array */\nexport type AdSenseCommand = Record<string, unknown>;\n\n// Extend Window interface for adsbygoogle and googletag (GPT)\ndeclare global {\n  interface Window {\n    adsbygoogle?: AdSenseCommand[];\n    googletag?: GoogleTag;\n  }\n}\n\n/** Google Publisher Tags (GPT) interface */\nexport interface GoogleTag {\n  cmd: Array<() => void>;\n  pubads(): GoogleTagPubAds;\n}\n\n/** GPT PubAds service */\nexport interface GoogleTagPubAds {\n  setRequestNonPersonalizedAds(value: 0 | 1): void;\n}\n\n// ============================================================================\n// LEGACY TYPES (mantenidos para compatibilidad)\n// ============================================================================\n\n/**\n * @deprecated Use AdFormat instead\n */\nexport type AdSlotSize =\n  | 'leaderboard'\n  | 'billboard'\n  | 'medium-rectangle'\n  | 'large-rectangle'\n  | 'half-page'\n  | 'skyscraper'\n  | 'mobile-banner'\n  | 'mobile-leaderboard'\n  | 'fluid'\n  | 'native'\n  | 'custom';\n\n/**\n * @deprecated AdSense handles sizes automatically\n */\nexport const AD_SIZE_MAP: Record<AdSlotSize, [number, number] | 'fluid'> = {\n  leaderboard: [728, 90],\n  billboard: [970, 250],\n  'medium-rectangle': [300, 250],\n  'large-rectangle': [336, 280],\n  'half-page': [300, 600],\n  skyscraper: [160, 600],\n  'mobile-banner': [320, 50],\n  'mobile-leaderboard': [320, 100],\n  fluid: 'fluid',\n  native: 'fluid',\n  custom: 'fluid',\n};\n\n/**\n * @deprecated Not used with AdSense\n */\nexport interface SizeMapping {\n  viewportWidth: number;\n  sizes: ([number, number] | 'fluid')[];\n}\n","/**\n * Ads Module\n *\n * Exports publicos para el servicio de Google AdSense.\n */\n\n// Configuration\nexport { provideValtechAds, VALTECH_ADS_CONFIG, DEFAULT_ADS_CONFIG } from './config';\n\n// Services\nexport { AdsService } from './ads.service';\nexport { AdsLoaderService } from './ads-loader.service';\n\n// Types\nexport {\n  // Config types\n  ValtechAdsConfig,\n  // Slot types\n  AdSlotConfig,\n  AdFormat,\n  // State types\n  AdSlotState,\n  AdEvent,\n  AdsConsentState,\n  // Legacy types (deprecated)\n  AdSlotSize,\n  AD_SIZE_MAP,\n  SizeMapping,\n} from './types';\n","/**\n * Ad Slot Component\n *\n * Componente standalone para mostrar ads de Google AdSense.\n * Se integra automaticamente con el servicio de Ads y respeta consent + premium.\n *\n * @example\n * ```html\n * <!-- Banner basico -->\n * <val-ad-slot\n *   slotId=\"homepage-top\"\n *   format=\"horizontal\"\n *   [fullWidth]=\"true\"\n * />\n *\n * <!-- Rectangle ad -->\n * <val-ad-slot\n *   slotId=\"sidebar-ad\"\n *   adSlot=\"1234567890\"\n *   format=\"rectangle\"\n * />\n *\n * <!-- Auto format (Google decides) -->\n * <val-ad-slot\n *   slotId=\"article-ad\"\n *   format=\"auto\"\n *   [fullWidth]=\"true\"\n * />\n * ```\n */\n\nimport {\n  Component,\n  Input,\n  OnInit,\n  OnDestroy,\n  inject,\n  signal,\n  computed,\n  PLATFORM_ID,\n  ChangeDetectionStrategy,\n  ElementRef,\n  AfterViewInit,\n} from '@angular/core';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { AdsService } from '../../../services/ads/ads.service';\nimport { AdFormat, AdSlotState } from '../../../services/ads/types';\n\n@Component({\n  selector: 'val-ad-slot',\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  template: `\n    @if (shouldRender()) {\n      <div\n        class=\"val-ad-slot\"\n        [class.val-ad-slot--loading]=\"state() === 'loading'\"\n        [class.val-ad-slot--rendered]=\"state() === 'rendered'\"\n        [class.val-ad-slot--empty]=\"state() === 'empty'\"\n        [class.val-ad-slot--hidden]=\"state() === 'hidden'\"\n        [class.val-ad-slot--placeholder]=\"isPlaceholderMode()\"\n        [class]=\"cssClass\"\n        [style.min-height]=\"minHeight\"\n      >\n        <!-- Placeholder mode (desarrollo local) -->\n        @if (isPlaceholderMode()) {\n          <div class=\"val-ad-slot__placeholder\" [style.height]=\"minHeight\">\n            <div class=\"val-ad-slot__placeholder-content\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\n                <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/>\n                <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/>\n              </svg>\n              <span class=\"val-ad-slot__placeholder-label\">Ad Placeholder</span>\n              <span class=\"val-ad-slot__placeholder-info\">{{ slotId }} | {{ format }}</span>\n            </div>\n          </div>\n        } @else {\n          <!-- Skeleton mientras carga -->\n          @if (showSkeleton && state() === 'loading') {\n            <div\n              class=\"val-ad-slot__skeleton\"\n              [style.height]=\"minHeight\"\n            ></div>\n          }\n\n          <!-- AdSense ins element -->\n          <ins\n            class=\"adsbygoogle val-ad-slot__container\"\n            [class.val-ad-slot__container--hidden]=\"state() === 'loading' && showSkeleton\"\n            [style.display]=\"'block'\"\n            [attr.data-ad-client]=\"adsService.adClient()\"\n            [attr.data-ad-slot]=\"adSlot || null\"\n            [attr.data-ad-format]=\"format\"\n            [attr.data-full-width-responsive]=\"fullWidth ? 'true' : null\"\n          ></ins>\n        }\n\n        <!-- Debug info -->\n        @if (adsService.isDebugMode()) {\n          <div class=\"val-ad-slot__debug\">\n            <small>{{ slotId }} | {{ format }} | {{ state() }}{{ isPlaceholderMode() ? ' | PLACEHOLDER' : '' }}</small>\n          </div>\n        }\n      </div>\n    }\n  `,\n  styles: [\n    `\n      .val-ad-slot {\n        position: relative;\n        display: flex;\n        justify-content: center;\n        align-items: center;\n        overflow: hidden;\n        width: 100%;\n      }\n\n      .val-ad-slot--loading {\n        background-color: var(--ion-color-light, #f4f4f4);\n      }\n\n      .val-ad-slot--empty,\n      .val-ad-slot--hidden {\n        display: none !important;\n      }\n\n      .val-ad-slot__skeleton {\n        width: 100%;\n        background: linear-gradient(\n          90deg,\n          var(--ion-color-light, #f4f4f4) 25%,\n          var(--ion-color-light-shade, #e0e0e0) 50%,\n          var(--ion-color-light, #f4f4f4) 75%\n        );\n        background-size: 200% 100%;\n        animation: skeleton-loading 1.5s infinite;\n        border-radius: 4px;\n      }\n\n      .val-ad-slot__container {\n        width: 100%;\n      }\n\n      .val-ad-slot__container--hidden {\n        visibility: hidden;\n        position: absolute;\n      }\n\n      /* Placeholder styles */\n      .val-ad-slot__placeholder {\n        width: 100%;\n        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n        border-radius: 8px;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        color: white;\n        border: 2px dashed rgba(255, 255, 255, 0.4);\n      }\n\n      .val-ad-slot__placeholder-content {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        gap: 8px;\n        padding: 16px;\n        text-align: center;\n      }\n\n      .val-ad-slot__placeholder-content svg {\n        opacity: 0.8;\n      }\n\n      .val-ad-slot__placeholder-label {\n        font-weight: 600;\n        font-size: 14px;\n        letter-spacing: 0.5px;\n      }\n\n      .val-ad-slot__placeholder-info {\n        font-size: 11px;\n        opacity: 0.7;\n        font-family: monospace;\n      }\n\n      .val-ad-slot__debug {\n        position: absolute;\n        bottom: 0;\n        left: 0;\n        background: rgba(0, 0, 0, 0.7);\n        color: white;\n        padding: 2px 6px;\n        font-size: 10px;\n        z-index: 1000;\n        font-family: monospace;\n      }\n\n      @keyframes skeleton-loading {\n        0% {\n          background-position: 200% 0;\n        }\n        100% {\n          background-position: -200% 0;\n        }\n      }\n    `,\n  ],\n})\nexport class AdSlotComponent implements OnInit, OnDestroy, AfterViewInit {\n  readonly adsService = inject(AdsService);\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly elementRef = inject(ElementRef);\n\n  // ===========================================================================\n  // INPUTS (Configuracion del slot)\n  // ===========================================================================\n\n  /** ID unico del slot (para tracking interno) */\n  @Input({ required: true }) slotId!: string;\n\n  /** Ad Slot ID de AdSense (opcional, para unidades manuales) */\n  @Input() adSlot?: string;\n\n  /** Formato del ad */\n  @Input() format: AdFormat = 'auto';\n\n  /** Full width responsive */\n  @Input() fullWidth = true;\n\n  /** CSS class adicional */\n  @Input() cssClass = '';\n\n  /** Altura minima */\n  @Input() minHeight = '90px';\n\n  /** Mostrar skeleton */\n  @Input() showSkeleton = true;\n\n  // ===========================================================================\n  // ESTADO\n  // ===========================================================================\n\n  private readonly _state = signal<AdSlotState>('idle');\n  readonly state = this._state.asReadonly();\n  private adInitialized = false;\n\n  /** Indica si el componente debe renderizarse */\n  readonly shouldRender = computed(() => {\n    // No renderizar en SSR\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n\n    // No renderizar si usuario es premium\n    if (this.adsService.isPremiumUser()) {\n      return false;\n    }\n\n    // No renderizar si ads estan deshabilitados y aun no inicializado\n    if (!this.adsService.isInitialized()) {\n      return false;\n    }\n\n    return true;\n  });\n\n  /**\n   * Indica si debe mostrar placeholder en vez de ad real.\n   * Activo en localhost o con Publisher ID placeholder.\n   */\n  readonly isPlaceholderMode = computed(() => {\n    if (!isPlatformBrowser(this.platformId)) {\n      return false;\n    }\n\n    const adClient = this.adsService.adClient();\n    const isLocalhost = window.location.hostname === 'localhost' ||\n                        window.location.hostname === '127.0.0.1';\n    const isPlaceholderClient = !adClient ||\n                                 adClient === 'ca-pub-0000000000000000' ||\n                                 adClient.includes('0000000000');\n\n    return isLocalhost || isPlaceholderClient;\n  });\n\n  // ===========================================================================\n  // LIFECYCLE\n  // ===========================================================================\n\n  async ngOnInit(): Promise<void> {\n    if (!this.shouldRender()) {\n      return;\n    }\n\n    this._state.set('loading');\n  }\n\n  async ngAfterViewInit(): Promise<void> {\n    if (!this.shouldRender() || this.adInitialized) {\n      return;\n    }\n\n    // En modo placeholder, solo marcar como rendered\n    if (this.isPlaceholderMode()) {\n      this._state.set('rendered');\n      this.adInitialized = true;\n\n      if (this.adsService.isDebugMode()) {\n        console.log(`[ValtechAds] Ad slot '${this.slotId}' in PLACEHOLDER mode (localhost or invalid adClient)`);\n      }\n      return;\n    }\n\n    await this.initializeAd();\n  }\n\n  ngOnDestroy(): void {\n    // AdSense no requiere cleanup manual como GPT\n    this.adInitialized = false;\n  }\n\n  // ===========================================================================\n  // PRIVATE\n  // ===========================================================================\n\n  private async initializeAd(): Promise<void> {\n    try {\n      // Registrar slot y cargar AdSense si no esta cargado\n      const success = await this.adsService.registerSlot(this.slotId);\n\n      if (success) {\n        this._state.set('rendered');\n        this.adInitialized = true;\n\n        if (this.adsService.isDebugMode()) {\n          console.log(`[ValtechAds] Ad slot '${this.slotId}' rendered`, {\n            format: this.format,\n            adSlot: this.adSlot,\n            fullWidth: this.fullWidth,\n          });\n        }\n      } else {\n        this._state.set('empty');\n      }\n    } catch (error) {\n      console.error(`[ValtechAds] Error initializing ad slot '${this.slotId}':`, error);\n      this._state.set('error');\n    }\n  }\n}\n","/**\n * Content Transformer\n *\n * Transforms ContentDocument instances into ArticleMetadata\n * for rendering with the val-article component.\n */\n\nimport { Color } from '@ionic/core';\nimport { ArticleBuilder, ArticleMetadata } from '../../components/organisms/article/types';\nimport { ComponentStates } from '../../components/types';\nimport {\n  ContentDocument,\n  ContentBlock,\n  ContentMeta,\n  ContentAuthor,\n  HeadingBlock,\n  ParagraphBlock,\n  QuoteBlock,\n  CodeBlock,\n  ListBlock,\n  ImageBlock,\n  CalloutBlock,\n  DividerBlock,\n  ButtonBlock,\n  CommandBlock,\n} from './types';\n\n/**\n * Maps callout variants to Ionic colors\n */\nconst CALLOUT_COLOR_MAP: Record<string, Color> = {\n  info: 'primary',\n  warning: 'warning',\n  success: 'success',\n  error: 'danger',\n};\n\n/**\n * Maps callout variants to prefix text\n */\nconst CALLOUT_PREFIX_MAP: Record<string, string> = {\n  info: 'Info:',\n  warning: 'Aviso:',\n  success: 'Listo:',\n  error: 'Error:',\n};\n\n/**\n * ContentTransformer converts ContentDocument objects into ArticleMetadata\n * that can be rendered by the val-article component.\n *\n * @example\n * ```typescript\n * const doc: BlogPost = { ... };\n * const article = ContentTransformer.toArticle(doc);\n * // Use article with <val-article [props]=\"article\">\n * ```\n */\nexport class ContentTransformer {\n  /**\n   * Transforms a ContentDocument into ArticleMetadata\n   *\n   * @param doc - The content document to transform\n   * @returns ArticleMetadata ready for val-article component\n   */\n  static toArticle(doc: ContentDocument): ArticleMetadata {\n    const builder = new ArticleBuilder();\n\n    // Add header based on document type and meta\n    this.addHeader(builder, doc);\n\n    // Transform each content block\n    for (const block of doc.content) {\n      this.addBlock(builder, block);\n    }\n\n    // Add footer based on document type\n    this.addFooter(builder, doc);\n\n    return builder.build({\n      theme: doc.config?.theme ?? 'auto',\n      maxWidth: doc.config?.maxWidth ?? '800px',\n      centered: doc.config?.centered ?? true,\n    });\n  }\n\n  /**\n   * Adds header elements based on document type and metadata\n   */\n  private static addHeader(builder: ArticleBuilder, doc: ContentDocument): void {\n    // Add author/date info if showMeta is enabled\n    if (doc.config?.showMeta && doc.meta.author) {\n      this.addAuthorBlock(builder, doc.meta.author, doc.meta.publishedAt);\n      builder.separator('space', { spacing: { top: 'small', bottom: 'medium' } });\n    }\n  }\n\n  /**\n   * Adds footer elements based on document type\n   */\n  private static addFooter(builder: ArticleBuilder, doc: ContentDocument): void {\n    // Add tags if present\n    if (doc.meta.tags && doc.meta.tags.length > 0) {\n      builder.separator('line', { spacing: { top: 'large', bottom: 'medium' } });\n      builder.paragraph({\n        content: `Tags: ${doc.meta.tags.join(', ')}`,\n        size: 'small',\n        color: 'medium',\n        bold: false,\n      });\n    }\n  }\n\n  /**\n   * Adds author information block\n   */\n  private static addAuthorBlock(\n    builder: ArticleBuilder,\n    author: ContentAuthor,\n    publishedAt?: Date | string\n  ): void {\n    let authorText = author.name;\n    if (author.role) {\n      authorText += ` - ${author.role}`;\n    }\n    if (publishedAt) {\n      const date = typeof publishedAt === 'string' ? new Date(publishedAt) : publishedAt;\n      authorText += ` | ${date.toLocaleDateString()}`;\n    }\n\n    builder.paragraph({\n      content: authorText,\n      size: 'small',\n      color: 'medium',\n      bold: false,\n    });\n  }\n\n  /**\n   * Transforms a single content block and adds it to the builder\n   */\n  private static addBlock(builder: ArticleBuilder, block: ContentBlock): void {\n    switch (block.type) {\n      case 'heading':\n        this.addHeading(builder, block);\n        break;\n      case 'paragraph':\n        this.addParagraph(builder, block);\n        break;\n      case 'quote':\n        this.addQuote(builder, block);\n        break;\n      case 'code':\n        this.addCode(builder, block);\n        break;\n      case 'list':\n        this.addList(builder, block);\n        break;\n      case 'image':\n        this.addImage(builder, block);\n        break;\n      case 'callout':\n        this.addCallout(builder, block);\n        break;\n      case 'divider':\n        this.addDivider(builder, block);\n        break;\n      case 'button':\n        this.addButton(builder, block);\n        break;\n      case 'command':\n        this.addCommand(builder, block);\n        break;\n    }\n  }\n\n  /**\n   * Adds a heading block\n   */\n  private static addHeading(builder: ArticleBuilder, block: HeadingBlock): void {\n    if (block.level === 1) {\n      builder.title({\n        content: block.text,\n        size: 'large',\n        color: 'dark',\n        bold: true,\n      });\n    } else {\n      builder.subtitle({\n        content: block.text,\n        size: block.level === 2 ? 'medium' : 'small',\n        color: 'dark',\n        bold: true,\n      });\n    }\n  }\n\n  /**\n   * Adds a paragraph block\n   */\n  private static addParagraph(builder: ArticleBuilder, block: ParagraphBlock): void {\n    builder.paragraph({\n      content: block.text,\n      size: 'medium',\n      color: 'dark',\n      bold: block.emphasis ?? false,\n    });\n  }\n\n  /**\n   * Adds a quote block\n   */\n  private static addQuote(builder: ArticleBuilder, block: QuoteBlock): void {\n    builder.quote({\n      content: block.text,\n      size: 'medium',\n      color: 'dark',\n      bold: false,\n      author: block.author,\n      source: block.source,\n    });\n  }\n\n  /**\n   * Adds a code block\n   */\n  private static addCode(builder: ArticleBuilder, block: CodeBlock): void {\n    builder.code(block.code, block.language);\n  }\n\n  /**\n   * Adds a list block\n   */\n  private static addList(builder: ArticleBuilder, block: ListBlock): void {\n    const items = block.items.map((text) => ({ text }));\n    const listType = block.checklist ? 'checklist' : block.ordered ? 'ordered' : 'unordered';\n    builder.list(items, listType);\n  }\n\n  /**\n   * Adds an image block\n   */\n  private static addImage(builder: ArticleBuilder, block: ImageBlock): void {\n    builder.image(block.src, block.alt, block.caption, {\n      // Note: alignment is handled differently in ArticleBuilder\n    });\n  }\n\n  /**\n   * Adds a callout/note block\n   */\n  private static addCallout(builder: ArticleBuilder, block: CalloutBlock): void {\n    const color = CALLOUT_COLOR_MAP[block.variant] ?? 'primary';\n    const prefix = block.title ?? CALLOUT_PREFIX_MAP[block.variant] ?? 'Nota:';\n    builder.note(block.text, prefix, color);\n  }\n\n  /**\n   * Adds a divider/separator block\n   */\n  private static addDivider(builder: ArticleBuilder, block: DividerBlock): void {\n    builder.separator(block.style ?? 'line');\n  }\n\n  /**\n   * Adds a button block\n   */\n  private static addButton(builder: ArticleBuilder, block: ButtonBlock): void {\n    const colorMap: Record<string, Color> = {\n      primary: 'primary',\n      secondary: 'secondary',\n      success: 'success',\n      warning: 'warning',\n      danger: 'danger',\n    };\n\n    builder.button(\n      {\n        text: block.text,\n        color: colorMap[block.color ?? 'primary'] ?? 'primary',\n        fill: 'solid',\n        type: 'button',\n        state: ComponentStates.ENABLED,\n        href: block.href,\n        token: block.action,\n      },\n      block.alignment ?? 'center'\n    );\n  }\n\n  /**\n   * Adds a command/terminal block\n   */\n  private static addCommand(builder: ArticleBuilder, block: CommandBlock): void {\n    builder.command(block.command);\n  }\n}\n\n/**\n * Convenience function to transform a ContentDocument to ArticleMetadata\n *\n * @param doc - The content document to transform\n * @returns ArticleMetadata ready for val-article component\n *\n * @example\n * ```typescript\n * const article = toArticle(myBlogPost);\n * ```\n */\nexport function toArticle(doc: ContentDocument): ArticleMetadata {\n  return ContentTransformer.toArticle(doc);\n}\n","/**\n * Blog Post Content Type\n *\n * Represents a blog post with title, excerpt, cover image,\n * and structured content blocks.\n */\n\nimport { ArticleMetadata } from '../../../components/organisms/article/types';\nimport { ContentDocument, ContentMeta, ContentBlock, ContentConfig } from '../types';\nimport { ContentTransformer } from '../transformer';\n\n/**\n * Blog post document interface\n */\nexport interface BlogPost extends ContentDocument<'blog'> {\n  /** Blog post title */\n  title: string;\n  /** Short excerpt/summary for listings */\n  excerpt: string;\n  /** Cover image URL */\n  coverImage?: string;\n  /** Estimated reading time in minutes */\n  readingTime?: number;\n  /** Featured post flag */\n  featured?: boolean;\n}\n\n/**\n * Calculates estimated reading time based on word count\n * @param content - Array of content blocks\n * @returns Estimated minutes to read\n */\nfunction calculateReadingTime(content: ContentBlock[]): number {\n  const wordsPerMinute = 200;\n  let wordCount = 0;\n\n  for (const block of content) {\n    if ('text' in block && typeof block.text === 'string') {\n      wordCount += block.text.split(/\\s+/).length;\n    }\n    if (block.type === 'list') {\n      wordCount += block.items.join(' ').split(/\\s+/).length;\n    }\n    if (block.type === 'code') {\n      wordCount += block.code.split(/\\s+/).length * 0.5; // Code reads faster\n    }\n  }\n\n  return Math.max(1, Math.ceil(wordCount / wordsPerMinute));\n}\n\n/**\n * BlogPostBuilder provides a fluent API for creating blog posts.\n *\n * @example\n * ```typescript\n * const post = new BlogPostBuilder()\n *   .title('My First Post')\n *   .excerpt('A brief introduction...')\n *   .author('John Doe', '/avatars/john.jpg')\n *   .coverImage('/images/post-cover.jpg')\n *   .heading('Introduction')\n *   .paragraph('Welcome to my blog...')\n *   .build();\n *\n * // Convert to ArticleMetadata\n * const article = post.toArticle();\n * ```\n */\nexport class BlogPostBuilder {\n  private post: Partial<BlogPost> = {\n    type: 'blog',\n    content: [],\n    meta: {},\n    config: { showMeta: true },\n  };\n\n  /**\n   * Sets the blog post title\n   */\n  title(title: string): this {\n    this.post.title = title;\n    return this;\n  }\n\n  /**\n   * Sets the blog post excerpt\n   */\n  excerpt(excerpt: string): this {\n    this.post.excerpt = excerpt;\n    return this;\n  }\n\n  /**\n   * Sets the cover image URL\n   */\n  coverImage(url: string): this {\n    this.post.coverImage = url;\n    return this;\n  }\n\n  /**\n   * Marks the post as featured\n   */\n  featured(value: boolean = true): this {\n    this.post.featured = value;\n    return this;\n  }\n\n  /**\n   * Sets the post author\n   */\n  author(name: string, avatar?: string, role?: string): this {\n    this.post.meta = {\n      ...this.post.meta,\n      author: { name, avatar, role },\n    };\n    return this;\n  }\n\n  /**\n   * Sets the publication date\n   */\n  publishedAt(date: Date | string): this {\n    this.post.meta = {\n      ...this.post.meta,\n      publishedAt: date,\n    };\n    return this;\n  }\n\n  /**\n   * Sets tags for the post\n   */\n  tags(...tags: string[]): this {\n    this.post.meta = {\n      ...this.post.meta,\n      tags,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the category\n   */\n  category(category: string): this {\n    this.post.meta = {\n      ...this.post.meta,\n      category,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the slug\n   */\n  slug(slug: string): this {\n    this.post.meta = {\n      ...this.post.meta,\n      slug,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the ID\n   */\n  id(id: string): this {\n    this.post.meta = {\n      ...this.post.meta,\n      id,\n    };\n    return this;\n  }\n\n  // Content block methods\n\n  /**\n   * Adds a heading block\n   */\n  heading(text: string, level: 1 | 2 | 3 = 2): this {\n    this.post.content!.push({ type: 'heading', level, text });\n    return this;\n  }\n\n  /**\n   * Adds a paragraph block\n   */\n  paragraph(text: string, emphasis?: boolean): this {\n    this.post.content!.push({ type: 'paragraph', text, emphasis });\n    return this;\n  }\n\n  /**\n   * Adds a quote block\n   */\n  quote(text: string, author?: string, source?: string): this {\n    this.post.content!.push({ type: 'quote', text, author, source });\n    return this;\n  }\n\n  /**\n   * Adds a code block\n   */\n  code(code: string, language?: string): this {\n    this.post.content!.push({ type: 'code', code, language });\n    return this;\n  }\n\n  /**\n   * Adds an unordered list\n   */\n  list(items: string[]): this {\n    this.post.content!.push({ type: 'list', items });\n    return this;\n  }\n\n  /**\n   * Adds an ordered/numbered list\n   */\n  orderedList(items: string[]): this {\n    this.post.content!.push({ type: 'list', items, ordered: true });\n    return this;\n  }\n\n  /**\n   * Adds a checklist\n   */\n  checklist(items: string[]): this {\n    this.post.content!.push({ type: 'list', items, checklist: true });\n    return this;\n  }\n\n  /**\n   * Adds an image block\n   */\n  image(src: string, alt: string, caption?: string): this {\n    this.post.content!.push({ type: 'image', src, alt, caption });\n    return this;\n  }\n\n  /**\n   * Adds a callout/note block\n   */\n  callout(text: string, variant: 'info' | 'warning' | 'success' | 'error' = 'info', title?: string): this {\n    this.post.content!.push({ type: 'callout', text, variant, title });\n    return this;\n  }\n\n  /**\n   * Adds a divider\n   */\n  divider(style?: 'line' | 'dots' | 'space'): this {\n    this.post.content!.push({ type: 'divider', style });\n    return this;\n  }\n\n  /**\n   * Adds a button/CTA\n   */\n  button(text: string, href?: string, color?: 'primary' | 'secondary' | 'success'): this {\n    this.post.content!.push({ type: 'button', text, href, color });\n    return this;\n  }\n\n  /**\n   * Configures rendering options\n   */\n  config(config: Partial<ContentConfig>): this {\n    this.post.config = { ...this.post.config, ...config };\n    return this;\n  }\n\n  /**\n   * Builds the final BlogPost object\n   */\n  build(): BlogPost {\n    const content = this.post.content || [];\n\n    // Auto-calculate reading time if not set\n    if (!this.post.readingTime) {\n      this.post.readingTime = calculateReadingTime(content);\n    }\n\n    return {\n      type: 'blog',\n      title: this.post.title || 'Untitled Post',\n      excerpt: this.post.excerpt || '',\n      coverImage: this.post.coverImage,\n      readingTime: this.post.readingTime,\n      featured: this.post.featured,\n      meta: this.post.meta as ContentMeta,\n      content,\n      config: this.post.config,\n    };\n  }\n\n  /**\n   * Builds and converts to ArticleMetadata\n   */\n  toArticle(): ArticleMetadata {\n    return ContentTransformer.toArticle(this.build());\n  }\n\n  /**\n   * Resets the builder for reuse\n   */\n  clear(): this {\n    this.post = {\n      type: 'blog',\n      content: [],\n      meta: {},\n      config: { showMeta: true },\n    };\n    return this;\n  }\n}\n\n/**\n * Creates a new BlogPostBuilder instance\n */\nexport function blogPost(): BlogPostBuilder {\n  return new BlogPostBuilder();\n}\n","/**\n * Documentation Content Type\n *\n * Represents technical documentation with navigation,\n * sections, and structured content blocks.\n */\n\nimport { ArticleMetadata } from '../../../components/organisms/article/types';\nimport { ContentDocument, ContentMeta, ContentBlock, ContentConfig } from '../types';\nimport { ContentTransformer } from '../transformer';\n\n/**\n * Navigation link for prev/next page navigation\n */\nexport interface DocNavLink {\n  /** Page title */\n  title: string;\n  /** Page slug/URL */\n  slug: string;\n}\n\n/**\n * Documentation document interface\n */\nexport interface Documentation extends ContentDocument<'docs'> {\n  /** Documentation page title */\n  title: string;\n  /** Section name (e.g., \"Getting Started\", \"API Reference\") */\n  section?: string;\n  /** Version of the documentation */\n  version?: string;\n  /** Previous page navigation */\n  prevPage?: DocNavLink;\n  /** Next page navigation */\n  nextPage?: DocNavLink;\n  /** Table of contents items (auto-generated from headings if not provided) */\n  toc?: { text: string; level: number; id: string }[];\n}\n\n/**\n * Generates a URL-friendly ID from text\n */\nfunction slugify(text: string): string {\n  return text\n    .toLowerCase()\n    .replace(/[^\\w\\s-]/g, '')\n    .replace(/\\s+/g, '-')\n    .trim();\n}\n\n/**\n * Extracts table of contents from content blocks\n */\nfunction extractToc(content: ContentBlock[]): { text: string; level: number; id: string }[] {\n  const toc: { text: string; level: number; id: string }[] = [];\n\n  for (const block of content) {\n    if (block.type === 'heading') {\n      toc.push({\n        text: block.text,\n        level: block.level,\n        id: slugify(block.text),\n      });\n    }\n  }\n\n  return toc;\n}\n\n/**\n * DocsBuilder provides a fluent API for creating documentation pages.\n *\n * @example\n * ```typescript\n * const docs = new DocsBuilder()\n *   .title('Installation Guide')\n *   .section('Getting Started')\n *   .version('1.0.0')\n *   .heading('Prerequisites', 1)\n *   .paragraph('Before you begin, ensure you have...')\n *   .callout('Node.js 18+ is required', 'warning')\n *   .heading('Installation', 1)\n *   .code('npm install valtech-components', 'bash')\n *   .prevPage('Introduction', '/docs/intro')\n *   .nextPage('Configuration', '/docs/config')\n *   .build();\n *\n * // Convert to ArticleMetadata\n * const article = docs.toArticle();\n * ```\n */\nexport class DocsBuilder {\n  private doc: Partial<Documentation> = {\n    type: 'docs',\n    content: [],\n    meta: {},\n    config: { showMeta: false, showTableOfContents: true },\n  };\n\n  /**\n   * Sets the documentation page title\n   */\n  title(title: string): this {\n    this.doc.title = title;\n    return this;\n  }\n\n  /**\n   * Sets the section name\n   */\n  section(section: string): this {\n    this.doc.section = section;\n    return this;\n  }\n\n  /**\n   * Sets the documentation version\n   */\n  version(version: string): this {\n    this.doc.version = version;\n    return this;\n  }\n\n  /**\n   * Sets the previous page navigation\n   */\n  prevPage(title: string, slug: string): this {\n    this.doc.prevPage = { title, slug };\n    return this;\n  }\n\n  /**\n   * Sets the next page navigation\n   */\n  nextPage(title: string, slug: string): this {\n    this.doc.nextPage = { title, slug };\n    return this;\n  }\n\n  /**\n   * Sets the slug for the page\n   */\n  slug(slug: string): this {\n    this.doc.meta = {\n      ...this.doc.meta,\n      slug,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the ID for the page\n   */\n  id(id: string): this {\n    this.doc.meta = {\n      ...this.doc.meta,\n      id,\n    };\n    return this;\n  }\n\n  /**\n   * Sets tags for the documentation page\n   */\n  tags(...tags: string[]): this {\n    this.doc.meta = {\n      ...this.doc.meta,\n      tags,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the category\n   */\n  category(category: string): this {\n    this.doc.meta = {\n      ...this.doc.meta,\n      category,\n    };\n    return this;\n  }\n\n  // Content block methods\n\n  /**\n   * Adds a heading block\n   */\n  heading(text: string, level: 1 | 2 | 3 = 2): this {\n    this.doc.content!.push({ type: 'heading', level, text });\n    return this;\n  }\n\n  /**\n   * Adds a paragraph block\n   */\n  paragraph(text: string, emphasis?: boolean): this {\n    this.doc.content!.push({ type: 'paragraph', text, emphasis });\n    return this;\n  }\n\n  /**\n   * Adds a code block\n   */\n  code(code: string, language?: string): this {\n    this.doc.content!.push({ type: 'code', code, language });\n    return this;\n  }\n\n  /**\n   * Adds a command/terminal block\n   */\n  command(command: string): this {\n    this.doc.content!.push({ type: 'command', command });\n    return this;\n  }\n\n  /**\n   * Adds a callout/note block\n   */\n  callout(text: string, variant: 'info' | 'warning' | 'success' | 'error' = 'info', title?: string): this {\n    this.doc.content!.push({ type: 'callout', text, variant, title });\n    return this;\n  }\n\n  /**\n   * Adds an info callout (alias for callout with info variant)\n   */\n  info(text: string, title?: string): this {\n    return this.callout(text, 'info', title);\n  }\n\n  /**\n   * Adds a warning callout\n   */\n  warning(text: string, title?: string): this {\n    return this.callout(text, 'warning', title);\n  }\n\n  /**\n   * Adds an error callout\n   */\n  error(text: string, title?: string): this {\n    return this.callout(text, 'error', title);\n  }\n\n  /**\n   * Adds a success callout\n   */\n  success(text: string, title?: string): this {\n    return this.callout(text, 'success', title);\n  }\n\n  /**\n   * Adds an unordered list\n   */\n  list(items: string[]): this {\n    this.doc.content!.push({ type: 'list', items });\n    return this;\n  }\n\n  /**\n   * Adds an ordered/numbered list\n   */\n  orderedList(items: string[]): this {\n    this.doc.content!.push({ type: 'list', items, ordered: true });\n    return this;\n  }\n\n  /**\n   * Adds a checklist\n   */\n  checklist(items: string[]): this {\n    this.doc.content!.push({ type: 'list', items, checklist: true });\n    return this;\n  }\n\n  /**\n   * Adds an image block\n   */\n  image(src: string, alt: string, caption?: string): this {\n    this.doc.content!.push({ type: 'image', src, alt, caption });\n    return this;\n  }\n\n  /**\n   * Adds a quote block\n   */\n  quote(text: string, author?: string, source?: string): this {\n    this.doc.content!.push({ type: 'quote', text, author, source });\n    return this;\n  }\n\n  /**\n   * Adds a divider\n   */\n  divider(style?: 'line' | 'dots' | 'space'): this {\n    this.doc.content!.push({ type: 'divider', style });\n    return this;\n  }\n\n  /**\n   * Adds a button/CTA\n   */\n  button(text: string, href?: string, color?: 'primary' | 'secondary' | 'success'): this {\n    this.doc.content!.push({ type: 'button', text, href, color });\n    return this;\n  }\n\n  /**\n   * Configures rendering options\n   */\n  config(config: Partial<ContentConfig>): this {\n    this.doc.config = { ...this.doc.config, ...config };\n    return this;\n  }\n\n  /**\n   * Builds the final Documentation object\n   */\n  build(): Documentation {\n    const content = this.doc.content || [];\n\n    // Auto-generate TOC if not provided and showTableOfContents is enabled\n    if (!this.doc.toc && this.doc.config?.showTableOfContents) {\n      this.doc.toc = extractToc(content);\n    }\n\n    return {\n      type: 'docs',\n      title: this.doc.title || 'Untitled Documentation',\n      section: this.doc.section,\n      version: this.doc.version,\n      prevPage: this.doc.prevPage,\n      nextPage: this.doc.nextPage,\n      toc: this.doc.toc,\n      meta: this.doc.meta as ContentMeta,\n      content,\n      config: this.doc.config,\n    };\n  }\n\n  /**\n   * Builds and converts to ArticleMetadata\n   */\n  toArticle(): ArticleMetadata {\n    return ContentTransformer.toArticle(this.build());\n  }\n\n  /**\n   * Resets the builder for reuse\n   */\n  clear(): this {\n    this.doc = {\n      type: 'docs',\n      content: [],\n      meta: {},\n      config: { showMeta: false, showTableOfContents: true },\n    };\n    return this;\n  }\n}\n\n/**\n * Creates a new DocsBuilder instance\n */\nexport function docs(): DocsBuilder {\n  return new DocsBuilder();\n}\n","/**\n * News Article Content Type\n *\n * Represents a news article or announcement with headline,\n * summary, featured image, and structured content blocks.\n */\n\nimport { ArticleMetadata } from '../../../components/organisms/article/types';\nimport { ContentDocument, ContentMeta, ContentBlock, ContentConfig } from '../types';\nimport { ContentTransformer } from '../transformer';\n\n/**\n * News article document interface\n */\nexport interface NewsArticle extends ContentDocument<'news'> {\n  /** News headline */\n  headline: string;\n  /** Short summary for listings */\n  summary: string;\n  /** Featured image URL */\n  featuredImage?: string;\n  /** Breaking news flag */\n  breaking?: boolean;\n  /** News source/outlet */\n  source?: string;\n  /** Related articles */\n  relatedArticles?: { title: string; slug: string }[];\n}\n\n/**\n * Calculates estimated reading time based on word count\n * @param content - Array of content blocks\n * @returns Estimated minutes to read\n */\nfunction calculateReadingTime(content: ContentBlock[]): number {\n  const wordsPerMinute = 200;\n  let wordCount = 0;\n\n  for (const block of content) {\n    if ('text' in block && typeof block.text === 'string') {\n      wordCount += block.text.split(/\\s+/).length;\n    }\n    if (block.type === 'list') {\n      wordCount += block.items.join(' ').split(/\\s+/).length;\n    }\n  }\n\n  return Math.max(1, Math.ceil(wordCount / wordsPerMinute));\n}\n\n/**\n * NewsBuilder provides a fluent API for creating news articles.\n *\n * @example\n * ```typescript\n * const news = new NewsBuilder()\n *   .headline('New Product Launch Announced')\n *   .summary('Company reveals groundbreaking new product...')\n *   .author('Jane Smith', '/avatars/jane.jpg', 'Technology Reporter')\n *   .publishedAt(new Date())\n *   .breaking()\n *   .featuredImage('/images/product-launch.jpg')\n *   .paragraph('In a surprise announcement today...')\n *   .quote('This is our most innovative product yet', 'CEO John Doe')\n *   .build();\n *\n * // Convert to ArticleMetadata\n * const article = news.toArticle();\n * ```\n */\nexport class NewsBuilder {\n  private article: Partial<NewsArticle> = {\n    type: 'news',\n    content: [],\n    meta: {},\n    config: { showMeta: true },\n  };\n\n  /**\n   * Sets the news headline\n   */\n  headline(headline: string): this {\n    this.article.headline = headline;\n    return this;\n  }\n\n  /**\n   * Sets the news summary\n   */\n  summary(summary: string): this {\n    this.article.summary = summary;\n    return this;\n  }\n\n  /**\n   * Sets the featured image URL\n   */\n  featuredImage(url: string): this {\n    this.article.featuredImage = url;\n    return this;\n  }\n\n  /**\n   * Marks the article as breaking news\n   */\n  breaking(value: boolean = true): this {\n    this.article.breaking = value;\n    return this;\n  }\n\n  /**\n   * Sets the news source/outlet\n   */\n  source(source: string): this {\n    this.article.source = source;\n    return this;\n  }\n\n  /**\n   * Sets the article author\n   */\n  author(name: string, avatar?: string, role?: string): this {\n    this.article.meta = {\n      ...this.article.meta,\n      author: { name, avatar, role },\n    };\n    return this;\n  }\n\n  /**\n   * Sets the publication date\n   */\n  publishedAt(date: Date | string): this {\n    this.article.meta = {\n      ...this.article.meta,\n      publishedAt: date,\n    };\n    return this;\n  }\n\n  /**\n   * Sets tags for the article\n   */\n  tags(...tags: string[]): this {\n    this.article.meta = {\n      ...this.article.meta,\n      tags,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the category\n   */\n  category(category: string): this {\n    this.article.meta = {\n      ...this.article.meta,\n      category,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the slug\n   */\n  slug(slug: string): this {\n    this.article.meta = {\n      ...this.article.meta,\n      slug,\n    };\n    return this;\n  }\n\n  /**\n   * Sets the ID\n   */\n  id(id: string): this {\n    this.article.meta = {\n      ...this.article.meta,\n      id,\n    };\n    return this;\n  }\n\n  /**\n   * Adds related articles\n   */\n  relatedArticles(articles: { title: string; slug: string }[]): this {\n    this.article.relatedArticles = articles;\n    return this;\n  }\n\n  // Content block methods\n\n  /**\n   * Adds a heading block\n   */\n  heading(text: string, level: 1 | 2 | 3 = 2): this {\n    this.article.content!.push({ type: 'heading', level, text });\n    return this;\n  }\n\n  /**\n   * Adds a paragraph block\n   */\n  paragraph(text: string, emphasis?: boolean): this {\n    this.article.content!.push({ type: 'paragraph', text, emphasis });\n    return this;\n  }\n\n  /**\n   * Adds a quote block\n   */\n  quote(text: string, author?: string, source?: string): this {\n    this.article.content!.push({ type: 'quote', text, author, source });\n    return this;\n  }\n\n  /**\n   * Adds an image block\n   */\n  image(src: string, alt: string, caption?: string): this {\n    this.article.content!.push({ type: 'image', src, alt, caption });\n    return this;\n  }\n\n  /**\n   * Adds an unordered list\n   */\n  list(items: string[]): this {\n    this.article.content!.push({ type: 'list', items });\n    return this;\n  }\n\n  /**\n   * Adds an ordered/numbered list\n   */\n  orderedList(items: string[]): this {\n    this.article.content!.push({ type: 'list', items, ordered: true });\n    return this;\n  }\n\n  /**\n   * Adds a callout/note block\n   */\n  callout(text: string, variant: 'info' | 'warning' | 'success' | 'error' = 'info', title?: string): this {\n    this.article.content!.push({ type: 'callout', text, variant, title });\n    return this;\n  }\n\n  /**\n   * Adds a divider\n   */\n  divider(style?: 'line' | 'dots' | 'space'): this {\n    this.article.content!.push({ type: 'divider', style });\n    return this;\n  }\n\n  /**\n   * Adds a button/CTA\n   */\n  button(text: string, href?: string, color?: 'primary' | 'secondary' | 'success'): this {\n    this.article.content!.push({ type: 'button', text, href, color });\n    return this;\n  }\n\n  /**\n   * Configures rendering options\n   */\n  config(config: Partial<ContentConfig>): this {\n    this.article.config = { ...this.article.config, ...config };\n    return this;\n  }\n\n  /**\n   * Builds the final NewsArticle object\n   */\n  build(): NewsArticle {\n    const content = this.article.content || [];\n\n    return {\n      type: 'news',\n      headline: this.article.headline || 'Untitled News',\n      summary: this.article.summary || '',\n      featuredImage: this.article.featuredImage,\n      breaking: this.article.breaking,\n      source: this.article.source,\n      relatedArticles: this.article.relatedArticles,\n      meta: this.article.meta as ContentMeta,\n      content,\n      config: this.article.config,\n    };\n  }\n\n  /**\n   * Builds and converts to ArticleMetadata\n   */\n  toArticle(): ArticleMetadata {\n    return ContentTransformer.toArticle(this.build());\n  }\n\n  /**\n   * Gets the estimated reading time in minutes\n   */\n  getReadingTime(): number {\n    return calculateReadingTime(this.article.content || []);\n  }\n\n  /**\n   * Resets the builder for reuse\n   */\n  clear(): this {\n    this.article = {\n      type: 'news',\n      content: [],\n      meta: {},\n      config: { showMeta: true },\n    };\n    return this;\n  }\n}\n\n/**\n * Creates a new NewsBuilder instance\n */\nexport function news(): NewsBuilder {\n  return new NewsBuilder();\n}\n","/**\n * Content Types Module\n *\n * Provides a flexible content abstraction layer that transforms\n * structured content documents into ArticleMetadata for rendering\n * with the val-article component.\n *\n * @example\n * ```typescript\n * // Using BlogPostBuilder\n * import { blogPost } from 'valtech-components';\n *\n * const post = blogPost()\n *   .title('My First Post')\n *   .author('John Doe')\n *   .heading('Introduction')\n *   .paragraph('Welcome to my blog...')\n *   .toArticle();\n *\n * // Using DocsBuilder\n * import { docs } from 'valtech-components';\n *\n * const page = docs()\n *   .title('Installation')\n *   .section('Getting Started')\n *   .code('npm install valtech-components', 'bash')\n *   .toArticle();\n *\n * // Using NewsBuilder\n * import { news } from 'valtech-components';\n *\n * const article = news()\n *   .headline('Breaking News')\n *   .summary('Important announcement...')\n *   .breaking()\n *   .toArticle();\n *\n * // From JSON/API response\n * import { ContentTransformer, BlogPost } from 'valtech-components';\n *\n * const json: BlogPost = await fetch('/api/posts/1').then(r => r.json());\n * const article = ContentTransformer.toArticle(json);\n * ```\n */\n\n// Base types\n// NOTA: el `ContentDocument<T>` block-based (builder) se reexporta como\n// `ContentBuilderDocument` para no colisionar con el `ContentDocument` flat\n// canónico de la plataforma de contenido (`services/content-platform`, ADR-020).\nexport {\n  ContentAuthor,\n  ContentMeta,\n  ContentConfig,\n  ContentDocument as ContentBuilderDocument,\n  ContentBlock,\n  HeadingBlock,\n  ParagraphBlock,\n  QuoteBlock,\n  CodeBlock,\n  ListBlock,\n  ImageBlock,\n  CalloutBlock,\n  DividerBlock,\n  ButtonBlock,\n  CommandBlock,\n} from './types';\n\n// Transformer\nexport { ContentTransformer, toArticle } from './transformer';\n\n// Content types\nexport { BlogPost, BlogPostBuilder, blogPost } from './content-types/blog';\nexport { Documentation, DocNavLink, DocsBuilder, docs } from './content-types/documentation';\nexport { NewsArticle, NewsBuilder, news } from './content-types/news';\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { ValtechContentConfig } from './types';\n\n/**\n * Token de inyección para la configuración de la plataforma de contenido.\n */\nexport const VALTECH_CONTENT_CONFIG = new InjectionToken<ValtechContentConfig>(\n  'ValtechContentConfig'\n);\n\n/**\n * Provee la plataforma de contenido (`ContentService`) a la aplicación Angular.\n *\n * Wire en el `main.ts` de la app consumer. El origen es **híbrido** (ADR-020):\n * el backend siempre está disponible vía `apiUrl`; las `staticSources` son\n * opcionales — factories lazy generadas build-time por `scripts/build-content.ts`\n * (mismo patrón que `provideLegalContent`). Cada locale queda code-split por el\n * `import()` dinámico.\n *\n * @param config - Configuración de contenido (`apiUrl`, `appId`, `staticSources?`).\n * @returns EnvironmentProviders para usar en `bootstrapApplication`.\n *\n * @example\n * ```typescript\n * // main.ts — solo backend\n * provideValtechContent({\n *   apiUrl: environment.apiUrl,\n *   appId: 'showcase',\n * });\n *\n * // main.ts — híbrido (estático curado + backend)\n * provideValtechContent({\n *   apiUrl: environment.apiUrl,\n *   appId: 'web',\n *   staticSources: {\n *     es: () => import('./app/generated/content-store.es').then(m => m.CONTENT_STORE_ES),\n *     en: () => import('./app/generated/content-store.en').then(m => m.CONTENT_STORE_EN),\n *   },\n * });\n * ```\n */\nexport function provideValtechContent(config: ValtechContentConfig): EnvironmentProviders {\n  return makeEnvironmentProviders([{ provide: VALTECH_CONTENT_CONFIG, useValue: config }]);\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject, isDevMode, signal } from '@angular/core';\nimport { Observable, catchError, forkJoin, from, map, of, switchMap, throwError } from 'rxjs';\nimport { ArticleMetadata } from '../../components/organisms/article/types';\nimport { AuthService } from '../auth/auth.service';\nimport { MarkdownArticleParserService } from '../markdown-article/markdown-article-parser.service';\nimport { VALTECH_CONTENT_CONFIG } from './config';\nimport { ContentDocument, ContentDocumentType, ContentLoadOptions } from './types';\n\n/**\n * Servicio de la plataforma de contenido (ADR-020 §2.5).\n *\n * Une dos orígenes (**híbrido**):\n *  - **Estático** — `staticSources` lazy por locale, generadas build-time.\n *  - **Backend** — DynamoDB + API (`/v2/content*`), publicación sin redeploy.\n *\n * Reglas de merge:\n *  - `list()` une ambos orígenes por `type`. Colisión de `slug` → **estático\n *    gana** (contenido curado). Ordena por `publishedAt` desc (sin fecha al final).\n *  - `load()` resuelve estático primero, con **fallback** al backend.\n *\n * Render: `toArticle(doc)` convierte `doc.body` (Markdown) a `ArticleMetadata`\n * vía el `markdown-article-parser` existente — la page hace `<val-article [props]=\"...\">`.\n *\n * Requiere `provideValtechContent({ apiUrl, appId, staticSources? })` en `main.ts`.\n * Sin provider, el servicio queda inerte (`isConfigured() === false`).\n */\n@Injectable({ providedIn: 'root' })\nexport class ContentService {\n  private readonly config = inject(VALTECH_CONTENT_CONFIG, { optional: true });\n  private readonly http = inject(HttpClient);\n  private readonly parser = inject(MarkdownArticleParserService);\n  private readonly auth = inject(AuthService, { optional: true });\n\n  /** `true` si `provideValtechContent()` fue llamado en el bootstrap. */\n  readonly isConfigured = signal(!!this.config);\n\n  /** Cache de las promesas de cada factory estática, keyed por locale. */\n  private readonly staticCache = new Map<string, Promise<ContentDocument[]>>();\n\n  constructor() {\n    if (!this.config && isDevMode()) {\n      console.warn(\n        '[valtech-components] ContentService: provideValtechContent() no está en main.ts. ' +\n          'El listado y la carga de contenido no funcionarán.'\n      );\n    }\n  }\n\n  /**\n   * Lista los documentos publicados de un `type`, uniendo estático + backend.\n   * Colisión de `slug` → estático gana. Ordenados por `publishedAt` desc.\n   *\n   * @param type - Tipo de contenido (`'blog'`, `'news'`, …).\n   * @param options - `{ locale }` (default `'es'`).\n   */\n  list(type: ContentDocumentType, options: ContentLoadOptions = {}): Observable<ContentDocument[]> {\n    const locale = (options.locale ?? 'es').toLowerCase();\n\n    const static$ = from(this.loadStatic(locale)).pipe(\n      map(docs => docs.filter(d => d.type === type && d.status === 'published'))\n    );\n\n    const backend$ = this.listBackend(type, locale).pipe(\n      catchError(() => of<ContentDocument[]>([]))\n    );\n\n    return forkJoin({ staticDocs: static$, backendDocs: backend$ }).pipe(\n      map(({ staticDocs, backendDocs }) => this.merge(staticDocs, backendDocs))\n    );\n  }\n\n  /**\n   * Carga un documento por `slug`: estático primero, fallback al backend.\n   *\n   * @param type - Tipo de contenido.\n   * @param slug - Slug del documento.\n   * @param options - `{ locale }` (default `'es'`).\n   */\n  load(\n    type: ContentDocumentType,\n    slug: string,\n    options: ContentLoadOptions = {}\n  ): Observable<ContentDocument> {\n    const locale = (options.locale ?? 'es').toLowerCase();\n\n    return from(this.loadStatic(locale)).pipe(\n      map(docs => docs.find(d => d.type === type && d.slug === slug && d.status === 'published')),\n      switchMap(staticDoc =>\n        staticDoc\n          ? of(staticDoc)\n          : this.loadBackend(type, slug, locale).pipe(\n              catchError(() =>\n                throwError(() => new Error(`Contenido no encontrado: ${type}/${locale}/${slug}`))\n              )\n            )\n      )\n    );\n  }\n\n  /**\n   * Convierte el `body` (Markdown) de un documento en `ArticleMetadata` para\n   * renderizar con `<val-article [props]=\"...\">`. Usa el parser existente.\n   *\n   * @param doc - Documento de contenido a renderizar.\n   * @param config - Override parcial de la `ArticleMetadata` resultante.\n   */\n  toArticle(doc: ContentDocument, config?: Partial<ArticleMetadata>): ArticleMetadata {\n    const locale = (doc.locale ?? 'es') as 'es' | 'en' | 'pt';\n    return this.parser.parse(doc.body, config, locale);\n  }\n\n  /** Limpia la cache de fuentes estáticas. Llamar al cambiar de locale en runtime. */\n  invalidate(): void {\n    this.staticCache.clear();\n  }\n\n  /**\n   * Lista los documentos publicados de la org activa del usuario autenticado.\n   *\n   * Requiere sesión activa (`AuthService.isAuthenticated()`). El interceptor de\n   * auth agrega automáticamente `Authorization: Bearer {token}` a la request.\n   *\n   * @param type  - Tipo de contenido (`'blog'`, `'news'`, …).\n   * @param options - `{ locale }` (default `'es'`).\n   * @returns Documentos de la org o `[]` si no hay config/sesión.\n   */\n  listForOrg(\n    type: ContentDocumentType,\n    options: ContentLoadOptions = {}\n  ): Observable<ContentDocument[]> {\n    if (!this.config?.apiUrl) return of([]);\n    if (!this.auth?.isAuthenticated()) return of([]);\n    const locale = (options.locale ?? 'es').toLowerCase();\n    return this.listBackendOrg(type, locale).pipe(catchError(() => of<ContentDocument[]>([])));\n  }\n\n  /**\n   * Carga un documento de la org activa del usuario autenticado por `slug`.\n   *\n   * Requiere sesión activa. El interceptor de auth agrega el Bearer token.\n   *\n   * @param type  - Tipo de contenido.\n   * @param slug  - Slug del documento.\n   * @param options - `{ locale }` (default `'es'`).\n   * @returns El documento o error si no se encuentra / no hay sesión.\n   */\n  loadForOrg(\n    type: ContentDocumentType,\n    slug: string,\n    options: ContentLoadOptions = {}\n  ): Observable<ContentDocument> {\n    if (!this.config?.apiUrl) {\n      return throwError(() => new Error('ContentService no está configurado.'));\n    }\n    if (!this.auth?.isAuthenticated()) {\n      return throwError(() => new Error('Se requiere sesión activa para cargar contenido de org.'));\n    }\n    const locale = (options.locale ?? 'es').toLowerCase();\n    return this.loadBackendOrg(type, slug, locale);\n  }\n\n  // ===========================================================================\n  // Internos\n  // ===========================================================================\n\n  /** Une estático + backend: estático gana por slug; orden por publishedAt desc. */\n  private merge(staticDocs: ContentDocument[], backendDocs: ContentDocument[]): ContentDocument[] {\n    const bySlug = new Map<string, ContentDocument>();\n    for (const doc of backendDocs) bySlug.set(doc.slug, doc);\n    // Estático gana — sobrescribe cualquier colisión del backend.\n    for (const doc of staticDocs) bySlug.set(doc.slug, doc);\n    return [...bySlug.values()].sort(this.byPublishedDesc);\n  }\n\n  /** Comparador: más reciente primero; sin `publishedAt` al final. */\n  private byPublishedDesc = (a: ContentDocument, b: ContentDocument): number => {\n    const ta = a.publishedAt ? Date.parse(a.publishedAt) : -Infinity;\n    const tb = b.publishedAt ? Date.parse(b.publishedAt) : -Infinity;\n    return tb - ta;\n  };\n\n  /** Carga (y cachea) los documentos estáticos de un locale, si hay factory. */\n  private loadStatic(locale: string): Promise<ContentDocument[]> {\n    const factory = this.config?.staticSources?.[locale];\n    if (!factory) return Promise.resolve([]);\n\n    const cached = this.staticCache.get(locale);\n    if (cached) return cached;\n\n    const promise = factory().catch(() => [] as ContentDocument[]);\n    this.staticCache.set(locale, promise);\n    return promise;\n  }\n\n  /** GET `{apiUrl}/v2/content?type=&locale=` — solo publicados. */\n  private listBackend(type: ContentDocumentType, locale: string): Observable<ContentDocument[]> {\n    if (!this.config?.apiUrl) return of([]);\n    const params = new URLSearchParams({ type, locale });\n    if (this.config.appId) params.set('appId', this.config.appId);\n    return this.http\n      .get<ContentListResponse>(`${this.config.apiUrl}/v2/content?${params}`)\n      .pipe(map(res => res?.items ?? []));\n  }\n\n  /** GET `{apiUrl}/v2/content/{type}/{locale}/{slug}` — detalle publicado. */\n  private loadBackend(\n    type: ContentDocumentType,\n    slug: string,\n    locale: string\n  ): Observable<ContentDocument> {\n    if (!this.config?.apiUrl) {\n      return throwError(() => new Error('ContentService no está configurado.'));\n    }\n    const path = `${this.config.apiUrl}/v2/content/${type}/${locale}/${encodeURIComponent(slug)}`;\n    return this.http\n      .get<ContentDetailResponse>(path)\n      .pipe(map(res => res?.item ?? (res as unknown as ContentDocument)));\n  }\n\n  /**\n   * GET `{apiUrl}/v2/content/org?type=&locale=` — publicados de la org activa.\n   * El Bearer token lo añade el interceptor de auth automáticamente.\n   */\n  private listBackendOrg(type: ContentDocumentType, locale: string): Observable<ContentDocument[]> {\n    const params = new URLSearchParams({ type, locale });\n    return this.http\n      .get<ContentListResponse>(`${this.config!.apiUrl}/v2/content/org?${params}`)\n      .pipe(map(res => res?.items ?? []));\n  }\n\n  /**\n   * GET `{apiUrl}/v2/content/org/{type}/{locale}/{slug}` — detalle de la org activa.\n   * El Bearer token lo añade el interceptor de auth automáticamente.\n   */\n  private loadBackendOrg(\n    type: ContentDocumentType,\n    slug: string,\n    locale: string\n  ): Observable<ContentDocument> {\n    const path = `${this.config!.apiUrl}/v2/content/org/${type}/${locale}/${encodeURIComponent(slug)}`;\n    return this.http\n      .get<ContentDetailResponse>(path)\n      .pipe(map(res => res?.item ?? (res as unknown as ContentDocument)));\n  }\n}\n\n/** Shape de la respuesta de listado del backend (`/v2/content`). */\ninterface ContentListResponse {\n  items?: ContentDocument[];\n  operationId?: string;\n}\n\n/** Shape de la respuesta de detalle del backend (`/v2/content/{type}/{locale}/{slug}`). */\ninterface ContentDetailResponse {\n  item?: ContentDocument;\n  operationId?: string;\n}\n","/**\n * Content Platform — `ContentService` + `provideValtechContent` (ADR-020).\n *\n * Modelo canónico unificado (`ContentDocument`, flat + Markdown) con origen\n * híbrido (estático build-time + backend DynamoDB/API). Render vía el\n * `markdown-article-parser` existente.\n */\n\nexport {\n  ContentDocumentType,\n  ContentDocumentStatus,\n  ContentDocumentSource,\n  ContentDocument,\n  ContentDocumentAuthor,\n  ContentStaticFactory,\n  ValtechContentConfig,\n  ContentLoadOptions,\n} from './types';\n\nexport { VALTECH_CONTENT_CONFIG, provideValtechContent } from './config';\nexport { ContentService } from './content.service';\n","import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\nimport { ValtechDonationConfig } from './types';\n\n/**\n * Token de inyección para la configuración de Donation/Support.\n */\nexport const VALTECH_DONATION_CONFIG = new InjectionToken<ValtechDonationConfig>(\n  'ValtechDonationConfig'\n);\n\n/** Configuración por defecto — sin métodos habilitados. */\nexport const DEFAULT_DONATION_CONFIG: Partial<ValtechDonationConfig> = {\n  methods: [],\n};\n\n/**\n * Provee el feature de aportes (Support) a la aplicación Angular.\n *\n * Cada app del factory declara qué métodos habilita. La vista de Support\n * (heredada o local) renderiza solo los métodos configurados.\n *\n * @example\n * ```typescript\n * // main.ts\n * provideValtechDonations({\n *   appId: 'showcase',\n *   methods: ['coffee', 'bank', 'ads'],\n *   coffee: { provider: 'buymeacoffee', url: 'https://buymeacoffee.com/valtech' },\n *   bank: {\n *     accounts: [{\n *       country: 'CL', bank: 'Banco X', accountType: 'Cuenta Corriente',\n *       number: '000000000', taxId: '11.111.111-1', holder: 'Valtech SpA',\n *       email: 'aportes@valtech.com', currency: 'CLP',\n *     }],\n *   },\n *   ads: { provider: 'admob', rewardedUnitId: 'ca-app-pub-xxx' },\n * }),\n * ```\n */\nexport function provideValtechDonations(config: ValtechDonationConfig): EnvironmentProviders {\n  const merged: ValtechDonationConfig = {\n    ...DEFAULT_DONATION_CONFIG,\n    ...config,\n  };\n\n  return makeEnvironmentProviders([{ provide: VALTECH_DONATION_CONFIG, useValue: merged }]);\n}\n","import { computed, inject, Injectable, signal } from '@angular/core';\nimport { VALTECH_DONATION_CONFIG } from './config';\nimport { BankAccount, DonationActionResult, DonationMethod, ValtechDonationConfig } from './types';\n\n/**\n * `DonationService`\n *\n * Servicio cross-app para el feature de aportes voluntarios (Support).\n * Patrón factory: cada app llama `provideValtechDonations(...)` y este\n * servicio expone solo los métodos habilitados.\n *\n * **Fase 0 (placeholder)** — abre links externos + expone datos de config.\n * Sin backend. Fases futuras: rewarded ads reales, webhook de café,\n * registro de intents para una página de transparencia.\n *\n * @example\n * ```typescript\n * private donations = inject(DonationService);\n *\n * methods = this.donations.enabledMethods();  // ['coffee', 'bank']\n * onCoffee() { this.donations.openCoffee(); }\n * accounts = this.donations.bankAccounts();\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class DonationService {\n  private readonly config = inject<ValtechDonationConfig>(VALTECH_DONATION_CONFIG, {\n    optional: true,\n  }) ?? { methods: [] };\n\n  /** Último intent registrado — útil para tests / debugging / UI feedback. */\n  private readonly _lastIntent = signal<DonationMethod | null>(null);\n  readonly lastIntent = this._lastIntent.asReadonly();\n\n  /** Métodos habilitados por la app, en orden de config. */\n  readonly enabledMethods = computed<DonationMethod[]>(() => this.config.methods ?? []);\n\n  /** `true` si el método está habilitado en la config de la app. */\n  isEnabled(method: DonationMethod): boolean {\n    return this.enabledMethods().includes(method);\n  }\n\n  /** Cuentas bancarias configuradas (vacío si `bank` no está habilitado). */\n  bankAccounts(): BankAccount[] {\n    if (!this.isEnabled('bank')) return [];\n    return this.config.bank?.accounts ?? [];\n  }\n\n  /** Cuentas filtradas por país ISO — para apps multi-mercado. */\n  bankAccountsByCountry(country: string): BankAccount[] {\n    return this.bankAccounts().filter(a => a.country.toUpperCase() === country.toUpperCase());\n  }\n\n  /**\n   * Abre el checkout de \"café\" (Buy Me a Coffee / Ko-fi) en una pestaña nueva.\n   * El proveedor es el merchant of record — Valtech no procesa el pago.\n   */\n  openCoffee(): DonationActionResult {\n    if (!this.isEnabled('coffee')) {\n      return { method: 'coffee', ok: false, reason: 'not-enabled' };\n    }\n    const url = this.config.coffee?.url;\n    if (!url) {\n      return { method: 'coffee', ok: false, reason: 'not-configured' };\n    }\n    this.recordIntent('coffee');\n    window.open(url, '_blank', 'noopener,noreferrer');\n    return { method: 'coffee', ok: true };\n  }\n\n  /**\n   * Muestra un anuncio rewarded (opt-in). **Fase 0: no implementado** —\n   * placeholder hasta integrar el plugin de ads (AdMob/AdSense) + la\n   * categoría de consentimiento. Retorna `not-supported`.\n   */\n  async showRewardedAd(): Promise<DonationActionResult> {\n    if (!this.isEnabled('ads')) {\n      return { method: 'ads', ok: false, reason: 'not-enabled' };\n    }\n    // TODO Fase 3 — integrar Capacitor AdMob (mobile) / AdSense (web)\n    // + gate en una nueva categoría de consentimiento.\n    return { method: 'ads', ok: false, reason: 'not-supported' };\n  }\n\n  /**\n   * Registra la intención de aporte. **Fase 0: solo estado local.**\n   * Fase 4 — POST a un endpoint para una página de transparencia.\n   */\n  recordIntent(method: DonationMethod): void {\n    this._lastIntent.set(method);\n  }\n}\n","/**\n * Valtech Donation / Support Service\n *\n * Feature cross-app de aportes voluntarios. Patrón factory: cada app llama\n * `provideValtechDonations(...)` y habilita los métodos que quiera\n * (`ads` · `coffee` · `bank`).\n *\n * Importante (legal): el dinero recibido por una entidad con fines de lucro\n * es ingreso afecto a impuesto, NO una donación deducible. La UI debe usar\n * lenguaje de \"aporte voluntario / apoyo\", nunca \"donación\".\n *\n * @example\n * ```typescript\n * // main.ts\n * provideValtechDonations({\n *   appId: 'showcase',\n *   methods: ['coffee', 'bank'],\n *   coffee: { provider: 'buymeacoffee', url: 'https://buymeacoffee.com/valtech' },\n *   bank: { accounts: [ ... ] },\n * }),\n * ```\n */\n\nexport {\n  VALTECH_DONATION_CONFIG,\n  provideValtechDonations,\n  DEFAULT_DONATION_CONFIG,\n} from './config';\n\nexport { DonationService } from './donation.service';\n\nexport {\n  DonationMethod,\n  CoffeeProvider,\n  AdsProvider,\n  BankAccount,\n  CoffeeConfig,\n  AdsConfig,\n  ValtechDonationConfig,\n  DonationActionResult,\n} from './types';\n","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output, inject, signal } from '@angular/core';\nimport { Validators } from '@angular/forms';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { checkmarkCircleOutline, closeCircleOutline } from 'ionicons/icons';\n\nimport { FeedbackService, FeedbackType, DEFAULT_FEEDBACK_TYPE_OPTIONS } from '../../../services/feedback';\nimport { I18nService } from '../../../services/i18n';\nimport { ComponentStates, FormMetadata, FormSubmit, InputMetadata, InputOption, InputType } from '../../types';\nimport { FormComponent } from '../../organisms/form/form.component';\nimport { AttachmentUploaderComponent } from '../../organisms/attachment-uploader/attachment-uploader.component';\nimport { AttachmentItem } from '../../organisms/attachment-uploader/types';\nimport { FeedbackFormMetadata, FeedbackSubmitEvent } from './types';\n\n@Component({\n  selector: 'val-feedback-form',\n  standalone: true,\n  imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon],\n  template: `\n    <div class=\"feedback-form-wrapper\" [class.compact]=\"props.compact\" [ngClass]=\"props.cssClass\">\n      <val-form [props]=\"formProps\" (onSubmit)=\"handleFormSubmit($event)\">\n        @if (props.showAttachments !== false) {\n          <val-attachment-uploader\n            [props]=\"{ maxFiles: 5 }\"\n            (attachmentsChange)=\"onAttachmentsChange($event)\"\n          ></val-attachment-uploader>\n        }\n\n        @if (error()) {\n          <div class=\"feedback-alert error\">\n            <ion-icon name=\"close-circle-outline\"></ion-icon>\n            <span>{{ error() }}</span>\n          </div>\n        }\n\n        @if (isSuccess()) {\n          <div class=\"feedback-alert success\">\n            <ion-icon name=\"checkmark-circle-outline\"></ion-icon>\n            <span>{{ props.successMessage || i18n.t('feedbackSuccess') }}</span>\n          </div>\n        }\n      </val-form>\n\n      @if (props.cancelButtonText) {\n        <ion-button fill=\"outline\" color=\"medium\" expand=\"block\" class=\"cancel-button\" (click)=\"onCancelClick()\">\n          {{ props.cancelButtonText }}\n        </ion-button>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .feedback-form-wrapper {\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n\n        &.compact {\n          gap: 4px;\n        }\n      }\n\n      .feedback-alert {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        padding: 12px 16px;\n        border-radius: 8px;\n        margin-top: 8px;\n\n        &.error {\n          background-color: var(--ion-color-danger-tint);\n          color: var(--ion-color-danger-shade);\n        }\n\n        &.success {\n          background-color: var(--ion-color-success-tint);\n          color: var(--ion-color-success-shade);\n        }\n\n        ion-icon {\n          font-size: 20px;\n        }\n      }\n\n      .cancel-button {\n        margin-top: 8px;\n      }\n    `,\n  ],\n})\nexport class FeedbackFormComponent implements OnInit {\n  @Input() props: FeedbackFormMetadata = {};\n\n  @Output() onSubmit = new EventEmitter<FeedbackSubmitEvent>();\n  @Output() onCancel = new EventEmitter<void>();\n\n  protected i18n = inject(I18nService);\n  private feedbackService = inject(FeedbackService);\n\n  formProps!: FormMetadata;\n  typeOptions = DEFAULT_FEEDBACK_TYPE_OPTIONS;\n\n  isSubmitting = signal(false);\n  isSuccess = signal(false);\n  error = signal<string | null>(null);\n\n  private currentAttachments: AttachmentItem[] = [];\n\n  constructor() {\n    addIcons({ checkmarkCircleOutline, closeCircleOutline });\n  }\n\n  ngOnInit(): void {\n    if (this.props.enabledTypes?.length) {\n      this.typeOptions = this.typeOptions.filter(opt => this.props.enabledTypes!.includes(opt.value));\n    }\n    if (this.props.typeOptions?.length) {\n      this.typeOptions = this.props.typeOptions;\n    }\n    this.formProps = this.buildFormProps();\n  }\n\n  private buildFormProps(): FormMetadata {\n    const fields: InputMetadata[] = [];\n\n    if (this.props.showTypeSelector !== false) {\n      const options: InputOption[] = this.typeOptions.map((opt, i) => ({\n        id: opt.value,\n        name: opt.label,\n        order: i,\n        selected: opt.value === (this.props.defaultType ?? 'feedback'),\n      }));\n      fields.push({\n        token: 'feedback-type',\n        name: 'type',\n        label: this.i18n.t('feedbackType'),\n        hint: '',\n        placeholder: '',\n        type: InputType.SELECT,\n        order: 1,\n        validators: [Validators.required],\n        options,\n        value: this.props.defaultType ?? 'feedback',\n        errors: {},\n        state: ComponentStates.ENABLED,\n      });\n    }\n\n    fields.push(\n      {\n        token: 'feedback-title',\n        name: 'title',\n        label: this.props.titleLabel ?? this.i18n.t('title'),\n        hint: '',\n        placeholder: this.props.titlePlaceholder ?? this.i18n.t('titlePlaceholder'),\n        type: InputType.TEXT,\n        order: 2,\n        validators: [Validators.required, Validators.minLength(5), Validators.maxLength(200)],\n        errors: {\n          required: this.i18n.t('titleValidation'),\n          minlength: this.i18n.t('titleValidation'),\n          maxlength: this.i18n.t('titleValidation'),\n        },\n        state: ComponentStates.ENABLED,\n      },\n      {\n        token: 'feedback-description',\n        name: 'description',\n        label: this.props.descriptionLabel ?? this.i18n.t('description'),\n        hint: '',\n        placeholder: this.props.descriptionPlaceholder ?? this.i18n.t('descriptionPlaceholder'),\n        type: InputType.TEXTAREA,\n        order: 3,\n        range: { min: 10, max: 5000 },\n        validators: [Validators.required, Validators.minLength(10), Validators.maxLength(5000)],\n        errors: {\n          required: this.i18n.t('descriptionValidation'),\n          minlength: this.i18n.t('descriptionValidation'),\n          maxlength: this.i18n.t('descriptionValidation'),\n        },\n        state: ComponentStates.ENABLED,\n      }\n    );\n\n    return {\n      name: '',\n      sections: [{ name: '', order: 0, fields }],\n      actions: {\n        type: 'submit',\n        color: 'primary',\n        text: this.props.submitButtonText ?? this.i18n.t('submit'),\n        state: ComponentStates.ENABLED,\n        expand: 'block',\n      },\n      state: ComponentStates.ENABLED,\n    };\n  }\n\n  async handleFormSubmit(submitted: FormSubmit): Promise<void> {\n    if (this.isSubmitting()) return;\n    if (this.currentAttachments.some(a => a.status === 'uploading')) return;\n\n    this.isSubmitting.set(true);\n    this.error.set(null);\n    this.isSuccess.set(false);\n    this.formProps.state = ComponentStates.WORKING;\n    this.formProps.actions.state = ComponentStates.WORKING;\n\n    try {\n      const type = (submitted.fields['type'] as FeedbackType) ?? this.props.defaultType ?? 'feedback';\n      const title = submitted.fields['title'] as string;\n      const description = submitted.fields['description'] as string;\n      const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url!);\n\n      const response = await this.feedbackService.createAsync(\n        type,\n        title,\n        description,\n        attachmentUrls,\n        this.props.contentRef\n      );\n\n      this.isSuccess.set(true);\n\n      this.onSubmit.emit({ response, type, title, attachmentUrls });\n    } catch (err: any) {\n      this.error.set(err.error?.message || err.message || this.i18n.t('feedbackError'));\n    } finally {\n      this.isSubmitting.set(false);\n      this.formProps.state = ComponentStates.ENABLED;\n      this.formProps.actions.state = ComponentStates.ENABLED;\n    }\n  }\n\n  onAttachmentsChange(items: AttachmentItem[]): void {\n    this.currentAttachments = items;\n  }\n\n  onCancelClick(): void {\n    this.onCancel.emit();\n  }\n}\n","import {\n  Component,\n  inject,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  signal,\n  computed,\n  isDevMode,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { IonButton, IonSpinner, IonTextarea } from '@ionic/angular/standalone';\nimport { FeedbackService } from '../../../services/feedback/feedback.service';\nimport { ReactionValue } from '../../../services/feedback/types';\nimport { ToastService } from '../../../services/toast.service';\nimport { I18nService } from '../../../services/i18n';\nimport { AuthService } from '../../../services/auth/auth.service';\nimport { ContentReactionMetadata, ContentReactionState, ReactionSubmitEvent, ReactionChangeEvent } from './types';\n\n/**\n * Defaults i18n del componente (es/en). El componente los auto-registra en su\n * constructor si el consumer no proveyó el namespace `ContentReaction`. Esto\n * garantiza que NUNCA haya una key faltante: una key faltante se evalúa en el\n * template por cada change-detection → `console.warn` por CD → con el\n * `val-debug-console` activo (espeja console.* a un signal) se dispara un loop\n * infinito que congela el navegador en dev. Auto-registrar lo elimina de raíz.\n */\nconst CONTENT_REACTION_I18N = {\n  es: {\n    question: '¿Te resultó útil este contenido?',\n    commentPlaceholder: 'Cuéntanos más (opcional)...',\n    submit: 'Enviar opinión',\n    update: 'Actualizar opinión',\n    thankYou: '¡Gracias por tu opinión!',\n    submitted: 'Tu opinión ha sido registrada',\n    errorSubmitting: 'Error al enviar. Intenta de nuevo.',\n    positiveLabel: 'Sí, mucho',\n    negativeLabel: 'No tanto',\n    negativeFeedbackTitle: '¿Cuéntanos qué no te gustó?',\n  },\n  en: {\n    question: 'Was this content helpful?',\n    commentPlaceholder: 'Tell us more (optional)...',\n    submit: 'Send feedback',\n    update: 'Update feedback',\n    thankYou: 'Thanks for your feedback!',\n    submitted: 'Your feedback has been recorded',\n    errorSubmitting: 'Failed to send. Please try again.',\n    positiveLabel: 'Yes, a lot',\n    negativeLabel: 'Not really',\n    negativeFeedbackTitle: \"Tell us what you didn't like?\",\n  },\n};\n\n/**\n * Componente para reacciones de contenido con emojis.\n *\n * @example\n * ```html\n * <val-content-reaction\n *   [props]=\"{\n *     entityRef: { entityType: 'article', entityId: 'art-123' },\n *     question: '¿Te fue útil este artículo?'\n *   }\"\n *   (reactionSubmit)=\"onReactionSubmit($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-content-reaction',\n  standalone: true,\n  imports: [CommonModule, FormsModule, IonButton, IonSpinner, IonTextarea],\n  templateUrl: './content-reaction.component.html',\n  styleUrls: ['./content-reaction.component.scss'],\n})\nexport class ContentReactionComponent implements OnInit, OnChanges {\n  private feedbackService = inject(FeedbackService);\n  private toast = inject(ToastService);\n  private i18n = inject(I18nService);\n  private auth = inject(AuthService, { optional: true });\n\n  readonly isConfigured = computed(() => this.feedbackService.isConfigured());\n\n  @Input() props: Partial<ContentReactionMetadata> = {};\n  @Output() reactionSubmit = new EventEmitter<ReactionSubmitEvent>();\n  @Output() reactionChange = new EventEmitter<ReactionChangeEvent>();\n\n  // Estado reactivo\n  state = signal<ContentReactionState>({\n    selectedValue: null,\n    comment: '',\n    isLoading: false,\n    isSubmitted: false,\n    hadPreviousReaction: false,\n    error: null,\n  });\n\n  // Valores por defecto\n  readonly defaultEmojis: [string, string, string] = ['😞', '😐', '😊'];\n  readonly defaultLabels: [string, string, string] = ['No me ayudó', 'Regular', 'Muy útil'];\n\n  // Computed properties\n  resolvedProps = computed(() => ({\n    entityRef: this.props.entityRef!,\n    question: this.props.question || this.t('question'),\n    showComment: this.props.showComment ?? true,\n    commentOnValues: this.props.commentOnValues,\n    commentPlaceholder: this.props.commentPlaceholder || this.t('commentPlaceholder'),\n    maxCommentLength: this.props.maxCommentLength ?? 500,\n    emojis: this.props.emojis || this.defaultEmojis,\n    emojiLabels: this.props.emojiLabels || this.defaultLabels,\n    showThankYou: this.props.showThankYou ?? true,\n    thankYouMessage: this.props.thankYouMessage || this.t('thankYou'),\n    disabled: this.props.disabled ?? false,\n    readonly: this.props.readonly ?? false,\n    // Variante: 'emoji' cuando se declara explícitamente o cuando se pasan emojis custom.\n    variant: this.props.variant ?? (this.props.emojis ? 'emoji' : 'buttons'),\n  }));\n\n  readonly activeReactionValues = computed<ReactionValue[]>(() =>\n    this.resolvedProps().emojis.length === 2 ? ['negative', 'positive'] : ['negative', 'neutral', 'positive']\n  );\n\n  showCommentField = computed(() => {\n    const sel = this.state().selectedValue;\n    if (!sel) return false;\n    const commentOn = this.resolvedProps().commentOnValues;\n    if (commentOn !== undefined) return commentOn.includes(sel);\n    return this.resolvedProps().showComment;\n  });\n\n  canSubmit = computed(() => this.state().selectedValue !== null && !this.state().isLoading);\n\n  constructor() {\n    // Auto-registro de defaults i18n (es/en) si el consumer no proveyó el\n    // namespace. Garantiza que `t()` nunca caiga en key faltante. Ver\n    // CONTENT_REACTION_I18N. Idempotente: solo la 1ª instancia registra.\n    if (!this.i18n.hasNamespace('ContentReaction')) {\n      this.i18n.registerContent('ContentReaction', CONTENT_REACTION_I18N);\n    }\n  }\n\n  ngOnInit() {\n    this.loadPreviousReaction();\n  }\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['props'] && !changes['props'].firstChange) {\n      this.loadPreviousReaction();\n    }\n  }\n\n  private async loadPreviousReaction(): Promise<void> {\n    if (!this.props.entityRef) return;\n\n    // Si hay initialValue, usarlo directamente sin consultar\n    if (this.props.initialValue) {\n      this.state.update(s => ({\n        ...s,\n        selectedValue: this.props.initialValue!,\n        hadPreviousReaction: true,\n        isLoading: false,\n        isSubmitted: true,\n      }));\n      return;\n    }\n\n    // Si skipInitialCheck está activo, no consultar\n    if (this.props.skipInitialCheck) {\n      return;\n    }\n\n    this.state.update(s => ({ ...s, isLoading: true, error: null }));\n\n    try {\n      const check = await this.feedbackService.checkFeedback(\n        this.props.entityRef.entityType,\n        this.props.entityRef.entityId\n      );\n\n      if (check.hasFeedback && check.reactionValue) {\n        this.state.update(s => ({\n          ...s,\n          selectedValue: check.reactionValue!,\n          hadPreviousReaction: true,\n          isLoading: false,\n          isSubmitted: true,\n        }));\n      } else {\n        this.state.update(s => ({ ...s, isLoading: false }));\n      }\n    } catch (error) {\n      console.error('Error loading previous reaction:', error);\n      this.state.update(s => ({ ...s, isLoading: false }));\n    }\n  }\n\n  selectReaction(value: ReactionValue): void {\n    if (this.resolvedProps().disabled || this.resolvedProps().readonly) return;\n\n    const previousValue = this.state().selectedValue;\n\n    this.state.update(s => ({\n      ...s,\n      selectedValue: value,\n      isSubmitted: false,\n      error: null,\n    }));\n\n    this.reactionChange.emit({ value, previousValue });\n  }\n\n  async submitReaction(): Promise<void> {\n    const currentState = this.state();\n    const props = this.resolvedProps();\n\n    if (!currentState.selectedValue || props.disabled) return;\n\n    this.state.update(s => ({ ...s, isLoading: true, error: null }));\n\n    try {\n      // Determinar si usar endpoint anónimo o autenticado\n      const isAuthenticated = this.auth?.isAuthenticated() ?? false;\n      const useAnonymous = this.props.allowAnonymous && !isAuthenticated;\n\n      if (useAnonymous) {\n        // Usar endpoint anónimo (público)\n        await this.feedbackService.createAnonymousReaction(\n          props.entityRef,\n          currentState.selectedValue,\n          currentState.comment || undefined\n        );\n      } else {\n        // Usar endpoint autenticado\n        await this.feedbackService.createReaction(\n          props.entityRef,\n          currentState.selectedValue,\n          currentState.comment || undefined\n        );\n      }\n\n      this.state.update(s => ({\n        ...s,\n        isLoading: false,\n        isSubmitted: true,\n        comment: '',\n        hadPreviousReaction: !useAnonymous, // Solo para autenticados\n      }));\n\n      this.reactionSubmit.emit({\n        value: currentState.selectedValue,\n        comment: currentState.comment || undefined,\n        entityRef: props.entityRef,\n        isUpdate: currentState.hadPreviousReaction,\n      });\n\n      if (props.showThankYou) {\n        this.toast.show({\n          message: props.thankYouMessage,\n          duration: 2000,\n        });\n      }\n    } catch (error) {\n      console.error('Error submitting reaction:', error);\n      this.state.update(s => ({\n        ...s,\n        isLoading: false,\n        error: this.t('errorSubmitting'),\n      }));\n\n      this.toast.show({\n        message: this.t('errorSubmitting'),\n        duration: 3000,\n      });\n    }\n  }\n\n  updateComment(event: CustomEvent): void {\n    const value = event.detail.value || '';\n    this.state.update(s => ({ ...s, comment: value }));\n  }\n\n  getEmoji(index: number): string {\n    return this.resolvedProps().emojis[index];\n  }\n\n  getEmojiLabel(index: number): string {\n    return this.resolvedProps().emojiLabels[index];\n  }\n\n  isSelected(value: ReactionValue): boolean {\n    return this.state().selectedValue === value;\n  }\n\n  t(key: string): string {\n    const translations: Record<string, string> = {\n      question: '¿Te resultó útil este contenido?',\n      commentPlaceholder: 'Cuéntanos más (opcional)...',\n      submit: 'Enviar opinión',\n      update: 'Actualizar opinión',\n      thankYou: '¡Gracias por tu opinión!',\n      submitted: 'Tu opinión ha sido registrada',\n      errorSubmitting: 'Error al enviar. Intenta de nuevo.',\n      positiveLabel: 'Sí, mucho',\n      negativeLabel: 'No tanto',\n      negativeFeedbackTitle: '¿Cuéntanos qué no te gustó?',\n    };\n    return this.i18n.t(key, 'ContentReaction') || translations[key] || key;\n  }\n}\n","@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n  <!-- Loading inicial -->\n  @if (state().isLoading && !state().selectedValue) {\n  <div class=\"loading-container\">\n    <ion-spinner name=\"crescent\"></ion-spinner>\n  </div>\n  } @else {\n  <!-- Pregunta -->\n  <p class=\"question\">\n    {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n  </p>\n\n  <!-- Botones de reacción — variante emoji (caras, estrellas, thumbs, …) -->\n  @if (resolvedProps().variant === 'emoji') {\n  <div class=\"reaction-buttons reaction-buttons--emoji\">\n    @for (value of activeReactionValues(); track value; let i = $index) {\n    <ion-button\n      fill=\"clear\"\n      shape=\"round\"\n      [class.selected]=\"isSelected(value)\"\n      [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n      [attr.aria-pressed]=\"isSelected(value)\"\n      [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n      (click)=\"selectReaction(value)\"\n    >\n      <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n    </ion-button>\n    }\n  </div>\n  } @else {\n  <!-- Botones de reacción — variante texto (default) -->\n  <div class=\"reaction-buttons\">\n    <ion-button\n      [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n      shape=\"round\"\n      color=\"dark\"\n      [attr.aria-pressed]=\"isSelected('positive')\"\n      [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n      (click)=\"selectReaction('positive')\"\n    >\n      {{ t('positiveLabel') }}\n    </ion-button>\n    <ion-button\n      [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n      shape=\"round\"\n      color=\"dark\"\n      [attr.aria-pressed]=\"isSelected('negative')\"\n      [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n      (click)=\"selectReaction('negative')\"\n    >\n      {{ t('negativeLabel') }}\n    </ion-button>\n  </div>\n  }\n\n  <!-- Campo de comentario (solo si hay selección) -->\n  @if (showCommentField()) {\n  <div class=\"comment-section\">\n    <ion-textarea\n      [value]=\"state().comment\"\n      [placeholder]=\"resolvedProps().commentPlaceholder\"\n      [maxlength]=\"resolvedProps().maxCommentLength\"\n      [disabled]=\"resolvedProps().disabled\"\n      [rows]=\"3\"\n      class=\"comment-textarea\"\n      (ionInput)=\"updateComment($event)\"\n    ></ion-textarea>\n    <span class=\"char-count\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n  </div>\n  }\n\n  <!-- Botón de envío -->\n  @if (state().selectedValue && !state().isSubmitted) {\n  <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n    @if (state().isLoading) {\n    <ion-spinner name=\"crescent\"></ion-spinner>\n    } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n  </ion-button>\n  }\n\n  <!-- Mensaje de confirmación -->\n  @if (state().isSubmitted) {\n  <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n  }\n\n  <!-- Error -->\n  @if (state().error) {\n  <p class=\"error-message\">{{ state().error }}</p>\n  } }\n</div>\n}\n","export interface SplashScreenConfig {\n  fadeOutDuration?: number;\n}\n\nexport const DEFAULT_SPLASH_SCREEN_CONFIG: Required<SplashScreenConfig> = {\n  fadeOutDuration: 300,\n};\n","import { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class SplashScreenService {\n  async hide(fadeOutDuration = 300): Promise<void> {\n    try {\n      const { SplashScreen } = await import('@capacitor/splash-screen');\n      await SplashScreen.hide({ fadeOutDuration });\n    } catch {\n      // no-op on web or if @capacitor/splash-screen is not installed\n    }\n  }\n}\n","import {\n  APP_INITIALIZER,\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n} from '@angular/core';\n\nimport { SplashScreenService } from './splash-screen.service';\nimport { DEFAULT_SPLASH_SCREEN_CONFIG, SplashScreenConfig } from './types';\n\nexport const VALTECH_SPLASH_SCREEN = new InjectionToken<Required<SplashScreenConfig>>(\n  'ValtechSplashScreen'\n);\n\n/**\n * Oculta el splash screen nativo (Capacitor) al completar el bootstrap de Angular.\n * En web/PWA es no-op — el skeleton HTML en index.html se elimina cuando Angular\n * reemplaza <app-root>.\n *\n * Requiere @capacitor/splash-screen instalado en la app consumer y\n * launchAutoHide: false en capacitor.config.ts.\n *\n * @example\n * // main.ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideSplashScreen()],\n * });\n *\n * // capacitor.config.ts\n * plugins: { SplashScreen: { launchAutoHide: false } }\n */\nexport function provideSplashScreen(config: SplashScreenConfig = {}): EnvironmentProviders {\n  const merged: Required<SplashScreenConfig> = { ...DEFAULT_SPLASH_SCREEN_CONFIG, ...config };\n\n  return makeEnvironmentProviders([\n    { provide: VALTECH_SPLASH_SCREEN, useValue: merged },\n    {\n      provide: APP_INITIALIZER,\n      multi: true,\n      deps: [SplashScreenService, VALTECH_SPLASH_SCREEN],\n      useFactory: (svc: SplashScreenService, cfg: Required<SplashScreenConfig>) => () =>\n        svc.hide(cfg.fadeOutDuration),\n    },\n  ]);\n}\n","/**\n * SplashScreen Service\n *\n * Gestiona el splash screen nativo (Capacitor) y el skeleton PWA.\n *\n * - Nativo: oculta el splash screen de Capacitor con fade al completar bootstrap.\n * - PWA/web: no-op (el skeleton en index.html se elimina cuando Angular reemplaza <app-root>).\n *\n * Setup:\n * 1. Agregar el skeleton HTML/CSS en index.html (ver docs/splash-screen.md o CLAUDE.md).\n * 2. Instalar @capacitor/splash-screen en la app consumer.\n * 3. Configurar capacitor.config.ts con launchAutoHide: false.\n * 4. Agregar provideSplashScreen() en main.ts.\n *\n * @example\n * // main.ts\n * import { provideSplashScreen } from 'valtech-components';\n * bootstrapApplication(AppComponent, {\n *   providers: [provideSplashScreen()],\n * });\n */\n\nexport * from './types';\nexport { VALTECH_SPLASH_SCREEN, provideSplashScreen } from './config';\nexport { SplashScreenService } from './splash-screen.service';\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  HostListener,\n  signal,\n  computed,\n} from '@angular/core';\nimport { IonIcon, IonButton } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { menuOutline, closeOutline } from 'ionicons/icons';\nimport { DocsLayoutMetadata } from './types';\n\naddIcons({ menuOutline, closeOutline });\n\n/**\n * val-docs-layout\n *\n * A responsive 3-column layout template for documentation sites.\n * Provides slots for sidebar navigation, main content, and table of contents.\n *\n * @example Basic usage\n * ```html\n * <val-docs-layout [props]=\"{ showToc: true }\">\n *   <ng-container sidebar>\n *     <val-docs-sidebar [props]=\"sidebarConfig\"></val-docs-sidebar>\n *   </ng-container>\n *\n *   <ng-container content>\n *     <val-article [props]=\"articleConfig\"></val-article>\n *   </ng-container>\n *\n *   <ng-container toc>\n *     <val-docs-toc [props]=\"tocConfig\"></val-docs-toc>\n *   </ng-container>\n * </val-docs-layout>\n * ```\n */\n@Component({\n  selector: 'val-docs-layout',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonButton],\n  template: `\n    <div\n      class=\"docs-layout\"\n      [class]=\"props.cssClass\"\n      [class.docs-layout--sidebar-open]=\"sidebarOpen()\"\n      [class.docs-layout--mobile]=\"isMobile()\"\n      [class.docs-layout--tablet]=\"isTablet()\"\n      [style.--sidebar-width]=\"props.sidebarWidth || '260px'\"\n      [style.--toc-width]=\"props.tocWidth || '220px'\"\n      [style.--content-max-width]=\"props.contentMaxWidth || '900px'\"\n    >\n      <!-- Mobile header with menu toggle -->\n      @if (isMobile() || isTablet()) {\n        <header class=\"docs-layout__mobile-header\">\n          <ion-button\n            fill=\"clear\"\n            class=\"docs-layout__menu-toggle\"\n            (click)=\"toggleSidebar()\"\n            [attr.aria-label]=\"sidebarOpen() ? 'Close menu' : 'Open menu'\"\n            [attr.aria-expanded]=\"sidebarOpen()\"\n            aria-controls=\"docs-sidebar\"\n          >\n            <ion-icon\n              slot=\"icon-only\"\n              [name]=\"sidebarOpen() ? 'close-outline' : 'menu-outline'\"\n            ></ion-icon>\n          </ion-button>\n          <ng-content select=\"[mobile-header]\"></ng-content>\n        </header>\n      }\n\n      <!-- Backdrop for mobile sidebar -->\n      @if ((isMobile() || isTablet()) && sidebarOpen()) {\n        <div\n          class=\"docs-layout__backdrop\"\n          role=\"presentation\"\n          aria-hidden=\"true\"\n          (click)=\"closeSidebar()\"\n        ></div>\n      }\n\n      <!-- Sidebar -->\n      @if (props.showSidebar !== false) {\n        <aside\n          id=\"docs-sidebar\"\n          class=\"docs-layout__sidebar\"\n          [class.docs-layout__sidebar--open]=\"sidebarOpen() || (!isMobile() && !isTablet())\"\n        >\n          <div class=\"docs-layout__sidebar-content\">\n            <ng-content select=\"[sidebar]\"></ng-content>\n          </div>\n        </aside>\n      }\n\n      <!-- Main content area -->\n      <main class=\"docs-layout__main\">\n        <div class=\"docs-layout__content\">\n          <ng-content select=\"[content]\"></ng-content>\n        </div>\n      </main>\n\n      <!-- Table of contents -->\n      @if (props.showToc !== false && !isMobile()) {\n        <aside class=\"docs-layout__toc\">\n          <div class=\"docs-layout__toc-content\">\n            <ng-content select=\"[toc]\"></ng-content>\n          </div>\n        </aside>\n      }\n    </div>\n  `,\n  styleUrls: ['./docs-layout.component.scss'],\n})\nexport class DocsLayoutComponent {\n  @Input() props: DocsLayoutMetadata = {};\n\n  @Output() sidebarToggle = new EventEmitter<boolean>();\n\n  // Responsive breakpoints\n  private readonly MOBILE_BREAKPOINT = 768;\n  private readonly TABLET_BREAKPOINT = 1024;\n\n  // Signals for reactive state\n  private windowWidth = signal(typeof window !== 'undefined' ? window.innerWidth : 1200);\n  protected sidebarOpen = signal(false);\n\n  protected isMobile = computed(() => this.windowWidth() < this.MOBILE_BREAKPOINT);\n  protected isTablet = computed(\n    () => this.windowWidth() >= this.MOBILE_BREAKPOINT && this.windowWidth() < this.TABLET_BREAKPOINT\n  );\n\n  @HostListener('window:resize')\n  onResize(): void {\n    this.windowWidth.set(window.innerWidth);\n    // Auto-close sidebar when resizing to desktop\n    if (!this.isMobile() && !this.isTablet()) {\n      this.sidebarOpen.set(false);\n    }\n  }\n\n  @HostListener('document:keydown.escape')\n  onEscapeKey(): void {\n    if (this.sidebarOpen()) {\n      this.closeSidebar();\n    }\n  }\n\n  toggleSidebar(): void {\n    this.sidebarOpen.update(open => !open);\n    this.sidebarToggle.emit(this.sidebarOpen());\n  }\n\n  closeSidebar(): void {\n    this.sidebarOpen.set(false);\n    this.sidebarToggle.emit(false);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { Router, NavigationEnd } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { chevronDownOutline, chevronForwardOutline } from 'ionicons/icons';\nimport { filter } from 'rxjs/operators';\nimport { DocsSidebarMetadata, DocsSidebarSection, DocsSidebarLink } from './types';\n\naddIcons({ chevronDownOutline, chevronForwardOutline });\n\n/**\n * val-docs-sidebar\n *\n * A hierarchical navigation sidebar for documentation sites.\n * Supports collapsible sections, active route highlighting, and badges.\n *\n * @example Basic usage\n * ```html\n * <val-docs-sidebar\n *   [props]=\"{\n *     logo: { src: '/assets/logo.svg', alt: 'Docs', title: 'DOCS' },\n *     sections: [\n *       { title: 'Getting Started', route: ['/docs', 'getting-started'] },\n *       {\n *         title: 'Components',\n *         expanded: true,\n *         children: [\n *           { label: 'Button', route: ['/docs', 'components', 'button'] },\n *           { label: 'Card', route: ['/docs', 'components', 'card'], badge: 'New' }\n *         ]\n *       }\n *     ]\n *   }\"\n *   (navigate)=\"onNavigate($event)\"\n * ></val-docs-sidebar>\n * ```\n */\n@Component({\n  selector: 'val-docs-sidebar',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <nav\n      class=\"docs-sidebar\"\n      [class]=\"props.cssClass\"\n      [style.background]=\"props.backgroundColor\"\n      role=\"navigation\"\n      aria-label=\"Documentation navigation\"\n    >\n      <!-- Logo -->\n      @if (props.logo) {\n        <div\n          class=\"docs-sidebar__logo\"\n          [class.docs-sidebar__logo--clickable]=\"props.logo.route\"\n          (click)=\"props.logo.route ? onNavigate(props.logo.route) : null\"\n        >\n          <img\n            [src]=\"props.logo.src\"\n            [alt]=\"props.logo.alt\"\n            [style.height]=\"props.logo.height || '32px'\"\n          />\n          @if (props.logo.title) {\n            <span class=\"docs-sidebar__logo-title\">{{ props.logo.title }}</span>\n          }\n        </div>\n      }\n\n      <!-- Navigation sections -->\n      <div class=\"docs-sidebar__nav\">\n        @for (section of props.sections; track section.title) {\n          <div class=\"docs-sidebar__section\">\n            <!-- Section header -->\n            <button\n              type=\"button\"\n              class=\"docs-sidebar__section-header\"\n              [class.docs-sidebar__section-header--active]=\"isSectionActive(section)\"\n              [class.docs-sidebar__section-header--expanded]=\"expandedSections[section.title]\"\n              [class.docs-sidebar__section-header--clickable]=\"section.route || section.children?.length\"\n              [attr.aria-expanded]=\"section.children?.length ? expandedSections[section.title] : null\"\n              [attr.aria-current]=\"section.route && isSectionActive(section) ? 'page' : null\"\n              (click)=\"onSectionClick(section)\"\n            >\n              @if (section.icon) {\n                <ion-icon [name]=\"section.icon\" class=\"docs-sidebar__section-icon\"></ion-icon>\n              }\n              <span class=\"docs-sidebar__section-title\">{{ section.title }}</span>\n              @if (section.badge) {\n                <span class=\"docs-sidebar__badge docs-sidebar__badge--section\">{{ section.badge }}</span>\n              }\n              @if (section.children?.length) {\n                <ion-icon\n                  class=\"docs-sidebar__chevron\"\n                  [name]=\"expandedSections[section.title] ? 'chevron-down-outline' : 'chevron-forward-outline'\"\n                ></ion-icon>\n              }\n            </button>\n\n            <!-- Section children -->\n            @if (section.children?.length && expandedSections[section.title]) {\n              <div class=\"docs-sidebar__children\">\n                @for (link of section.children; track link.label) {\n                  <button\n                    type=\"button\"\n                    class=\"docs-sidebar__link\"\n                    [class.docs-sidebar__link--active]=\"isLinkActive(link)\"\n                    [attr.aria-current]=\"isLinkActive(link) ? 'page' : null\"\n                    (click)=\"onNavigate(link.route)\"\n                  >\n                    <span class=\"docs-sidebar__link-label\">{{ link.label }}</span>\n                    @if (link.badge) {\n                      <span\n                        class=\"docs-sidebar__badge\"\n                        [class.docs-sidebar__badge--primary]=\"link.badgeColor === 'primary'\"\n                        [class.docs-sidebar__badge--success]=\"link.badgeColor === 'success'\"\n                        [class.docs-sidebar__badge--warning]=\"link.badgeColor === 'warning'\"\n                        [class.docs-sidebar__badge--danger]=\"link.badgeColor === 'danger'\"\n                      >{{ link.badge }}</span>\n                    }\n                  </button>\n                }\n              </div>\n            }\n          </div>\n        }\n      </div>\n    </nav>\n  `,\n  styleUrls: ['./docs-sidebar.component.scss'],\n})\nexport class DocsSidebarComponent implements OnInit, OnChanges {\n  @Input() props: DocsSidebarMetadata = { sections: [] };\n\n  @Output() navigate = new EventEmitter<string[]>();\n\n  expandedSections: Record<string, boolean> = {};\n  private currentRoute: string[] = [];\n\n  constructor(private router: Router) {}\n\n  ngOnInit(): void {\n    this.initializeExpandedSections();\n    this.updateCurrentRoute();\n\n    // Listen for route changes\n    this.router.events\n      .pipe(filter(event => event instanceof NavigationEnd))\n      .subscribe(() => {\n        this.updateCurrentRoute();\n        this.autoExpandActiveSection();\n      });\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.initializeExpandedSections();\n    }\n  }\n\n  private initializeExpandedSections(): void {\n    this.props.sections.forEach(section => {\n      if (this.expandedSections[section.title] === undefined) {\n        this.expandedSections[section.title] = section.expanded ?? false;\n      }\n    });\n  }\n\n  private updateCurrentRoute(): void {\n    this.currentRoute = this.router.url.split('/').filter(Boolean);\n    // Use activeRoute from props if provided\n    if (this.props.activeRoute) {\n      this.currentRoute = this.props.activeRoute;\n    }\n  }\n\n  private autoExpandActiveSection(): void {\n    this.props.sections.forEach(section => {\n      if (section.children?.some(link => this.isLinkActive(link))) {\n        this.expandedSections[section.title] = true;\n      }\n    });\n  }\n\n  onSectionClick(section: DocsSidebarSection): void {\n    if (section.route) {\n      this.onNavigate(section.route);\n    } else if (section.children?.length) {\n      this.expandedSections[section.title] = !this.expandedSections[section.title];\n    }\n  }\n\n  onNavigate(route: string[]): void {\n    this.navigate.emit(route);\n    this.router.navigate(route);\n  }\n\n  isSectionActive(section: DocsSidebarSection): boolean {\n    if (section.route) {\n      return this.routesMatch(section.route, this.currentRoute);\n    }\n    return section.children?.some(link => this.isLinkActive(link)) ?? false;\n  }\n\n  isLinkActive(link: DocsSidebarLink): boolean {\n    return this.routesMatch(link.route, this.currentRoute);\n  }\n\n  private routesMatch(route: string[], current: string[]): boolean {\n    const routePath = route.join('/').replace(/^\\//, '');\n    const currentPath = current.join('/');\n    return currentPath === routePath || currentPath.startsWith(routePath + '/');\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  AfterViewInit,\n  NgZone,\n  signal,\n} from '@angular/core';\nimport { DocsTocMetadata, DocsTocItem } from './types';\n\n/**\n * val-docs-toc\n *\n * A table of contents component with scroll spy functionality.\n * Automatically highlights the current section based on scroll position.\n *\n * @example Manual items\n * ```html\n * <val-docs-toc\n *   [props]=\"{\n *     title: 'On this page',\n *     items: [\n *       { id: 'overview', label: 'Overview', level: 1 },\n *       { id: 'installation', label: 'Installation', level: 1 },\n *       { id: 'npm', label: 'Using npm', level: 2 },\n *       { id: 'yarn', label: 'Using yarn', level: 2 }\n *     ]\n *   }\"\n * ></val-docs-toc>\n * ```\n *\n * @example Auto-generated from headings\n * ```html\n * <val-docs-toc\n *   [props]=\"{\n *     autoGenerate: true,\n *     containerSelector: '.article-content',\n *     headingLevels: [2, 3]\n *   }\"\n * ></val-docs-toc>\n * ```\n */\n@Component({\n  selector: 'val-docs-toc',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <nav\n      class=\"docs-toc\"\n      [class]=\"props.cssClass\"\n      role=\"navigation\"\n      aria-label=\"Table of contents\"\n    >\n      @if (!props.hideTitle) {\n        <h4 class=\"docs-toc__title\">{{ props.title || 'Contents' }}</h4>\n      }\n\n      <ul class=\"docs-toc__list\">\n        @for (item of flatItems(); track item.id) {\n          <li\n            class=\"docs-toc__item\"\n            [class.docs-toc__item--level-1]=\"item.level === 1\"\n            [class.docs-toc__item--level-2]=\"item.level === 2\"\n            [class.docs-toc__item--level-3]=\"item.level === 3\"\n            [class.docs-toc__item--active]=\"activeId() === item.id\"\n          >\n            <a\n              class=\"docs-toc__link\"\n              [href]=\"'#' + item.id\"\n              [attr.aria-current]=\"activeId() === item.id ? 'location' : null\"\n              (click)=\"scrollToSection($event, item.id)\"\n            >\n              {{ item.label }}\n            </a>\n          </li>\n        }\n      </ul>\n    </nav>\n  `,\n  styleUrls: ['./docs-toc.component.scss'],\n})\nexport class DocsTocComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\n  @Input() props: DocsTocMetadata = {};\n\n  @Output() sectionChange = new EventEmitter<string>();\n\n  // Reactive state\n  protected activeId = signal<string>('');\n  protected flatItems = signal<DocsTocItem[]>([]);\n\n  private headingElements: HTMLElement[] = [];\n  private scrollHandler: (() => void) | null = null;\n  private rafId: number | null = null;\n\n  constructor(private ngZone: NgZone) {}\n\n  ngOnInit(): void {\n    this.updateFlatItems();\n  }\n\n  ngAfterViewInit(): void {\n    // Delay to ensure DOM is ready\n    setTimeout(() => {\n      if (this.props.autoGenerate) {\n        this.generateTocFromHeadings();\n      }\n      this.setupScrollSpy();\n    }, 100);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['props']) {\n      this.updateFlatItems();\n      if (this.props.autoGenerate) {\n        setTimeout(() => this.generateTocFromHeadings(), 100);\n      }\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.destroyScrollSpy();\n  }\n\n  private updateFlatItems(): void {\n    if (this.props.items) {\n      this.flatItems.set(this.flattenItems(this.props.items));\n    }\n  }\n\n  private flattenItems(items: DocsTocItem[]): DocsTocItem[] {\n    const result: DocsTocItem[] = [];\n    const flatten = (itemList: DocsTocItem[]) => {\n      itemList.forEach(item => {\n        result.push(item);\n        if (item.children?.length) {\n          flatten(item.children);\n        }\n      });\n    };\n    flatten(items);\n    return result;\n  }\n\n  private generateTocFromHeadings(): void {\n    const selector = this.props.containerSelector || '.docs-layout__content';\n    const container = document.querySelector(selector);\n\n    if (!container) {\n      console.warn(`[docs-toc] Container not found: ${selector}`);\n      return;\n    }\n\n    const levels = this.props.headingLevels || [2, 3];\n    const headingSelector = levels.map(l => `h${l}`).join(', ');\n    const headings = container.querySelectorAll(headingSelector);\n\n    const items: DocsTocItem[] = [];\n    headings.forEach((heading: Element) => {\n      const el = heading as HTMLElement;\n      // Generate ID if not present\n      if (!el.id) {\n        el.id = this.generateId(el.textContent || '');\n      }\n\n      const level = parseInt(el.tagName[1], 10);\n      items.push({\n        id: el.id,\n        label: el.textContent?.trim() || '',\n        level: level - 1, // h2 = level 1, h3 = level 2\n      });\n    });\n\n    this.flatItems.set(items);\n    // Re-setup scroll spy with new items\n    this.setupScrollSpy();\n  }\n\n  private generateId(text: string): string {\n    return text\n      .toLowerCase()\n      .trim()\n      .replace(/[^\\w\\s-]/g, '')\n      .replace(/\\s+/g, '-')\n      .substring(0, 50);\n  }\n\n  private scrollContainer: HTMLElement | Window | null = null;\n\n  private setupScrollSpy(): void {\n    this.destroyScrollSpy();\n\n    const items = this.flatItems();\n    if (items.length === 0) return;\n\n    // Collect heading elements\n    this.headingElements = items\n      .map(item => document.getElementById(item.id))\n      .filter((el): el is HTMLElement => el !== null);\n\n    if (this.headingElements.length === 0) {\n      console.warn('[docs-toc] No heading elements found for IDs:', items.map(i => i.id));\n      return;\n    }\n\n    // Find the scroll container - check for ion-content first, then use window\n    this.scrollContainer = this.findScrollContainer();\n\n    // Set initial active item\n    this.updateActiveHeading();\n\n    // Use scroll event with requestAnimationFrame for performance\n    this.ngZone.runOutsideAngular(() => {\n      this.scrollHandler = () => {\n        if (this.rafId) {\n          cancelAnimationFrame(this.rafId);\n        }\n        this.rafId = requestAnimationFrame(() => {\n          this.updateActiveHeading();\n        });\n      };\n\n      // Listen on both window and the scroll container for maximum compatibility\n      window.addEventListener('scroll', this.scrollHandler, { passive: true });\n      document.addEventListener('scroll', this.scrollHandler, { passive: true, capture: true });\n\n      // Also listen on ion-content if present\n      const ionContent = document.querySelector('ion-content');\n      if (ionContent) {\n        ionContent.addEventListener('ionScroll', this.scrollHandler as EventListener, { passive: true });\n      }\n    });\n  }\n\n  private findScrollContainer(): HTMLElement | Window {\n    // Check for ion-content's scroll element\n    const ionContent = document.querySelector('ion-content');\n    if (ionContent) {\n      // ion-content has a shadow DOM with the actual scrollable element\n      const scrollEl = (ionContent as any).shadowRoot?.querySelector('.inner-scroll');\n      if (scrollEl) return scrollEl;\n    }\n    return window;\n  }\n\n  private updateActiveHeading(): void {\n    const offsetTop = this.props.offsetTop ?? 100;\n\n    // Find the heading closest to or above the trigger point (offset from top of viewport)\n    // Using getBoundingClientRect().top which is relative to viewport - works regardless of scroll container\n    let activeHeading: HTMLElement | null = null;\n\n    for (const heading of this.headingElements) {\n      const rect = heading.getBoundingClientRect();\n\n      // If heading's top is at or above the trigger point (offset pixels from viewport top)\n      if (rect.top <= offsetTop + 10) {\n        activeHeading = heading;\n      } else {\n        // Since headings are in DOM order, stop once we find one below the trigger\n        break;\n      }\n    }\n\n    // If no heading is above the trigger point, use the first one\n    if (!activeHeading && this.headingElements.length > 0) {\n      activeHeading = this.headingElements[0];\n    }\n\n    if (activeHeading && activeHeading.id !== this.activeId()) {\n      this.ngZone.run(() => {\n        this.activeId.set(activeHeading!.id);\n        this.sectionChange.emit(activeHeading!.id);\n      });\n    }\n  }\n\n  private destroyScrollSpy(): void {\n    if (this.scrollHandler) {\n      window.removeEventListener('scroll', this.scrollHandler);\n      document.removeEventListener('scroll', this.scrollHandler, { capture: true } as EventListenerOptions);\n\n      const ionContent = document.querySelector('ion-content');\n      if (ionContent) {\n        ionContent.removeEventListener('ionScroll', this.scrollHandler as EventListener);\n      }\n\n      this.scrollHandler = null;\n    }\n    if (this.rafId) {\n      cancelAnimationFrame(this.rafId);\n      this.rafId = null;\n    }\n    this.headingElements = [];\n    this.scrollContainer = null;\n  }\n\n  scrollToSection(event: Event, id: string): void {\n    event.preventDefault();\n\n    const element = document.getElementById(id);\n    if (!element) return;\n\n    // Use native scrollIntoView - most reliable across all containers\n    // Requires CSS scroll-margin-top on target elements for offset\n    element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n    // Update active immediately for better UX\n    this.activeId.set(id);\n\n    // Update URL hash while preserving current path\n    const currentPath = window.location.pathname + window.location.search;\n    history.pushState(null, '', `${currentPath}#${id}`);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n/**\n * Service for handling documentation navigation with scroll management.\n *\n * @example\n * ```typescript\n * import { DocsNavigationService } from 'valtech-components';\n *\n * @Component({...})\n * export class MyComponent {\n *   private docsNav = inject(DocsNavigationService);\n *\n *   onLinkClick(route: string[]) {\n *     this.docsNav.navigateAndScroll(route);\n *   }\n * }\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class DocsNavigationService {\n  private router = inject(Router);\n\n  /**\n   * Default scroll container selector.\n   * Can be overridden per-call or globally.\n   */\n  private defaultScrollSelector = '.docs-main-scroll';\n\n  /**\n   * Navigate to a route and scroll to top.\n   * @param route - Route segments to navigate to\n   * @param scrollSelector - Optional custom scroll container selector\n   */\n  async navigateAndScroll(route: string[], scrollSelector?: string): Promise<boolean> {\n    const result = await this.router.navigate(route);\n    if (result) {\n      this.scrollToTop(scrollSelector);\n    }\n    return result;\n  }\n\n  /**\n   * Scroll to top of the documentation content.\n   * Tries multiple scroll containers for compatibility.\n   * @param scrollSelector - Optional custom scroll container selector\n   */\n  scrollToTop(scrollSelector?: string): void {\n    const selector = scrollSelector || this.defaultScrollSelector;\n\n    // 1. Try ion-content first (Ionic)\n    const ionContent = document.querySelector('ion-content');\n    if (ionContent && typeof (ionContent as any).scrollToTop === 'function') {\n      (ionContent as any).scrollToTop(0);\n    }\n\n    // 2. Try the main scrollable element\n    const mainScroll = document.querySelector(selector);\n    if (mainScroll) {\n      mainScroll.scrollTop = 0;\n    }\n\n    // 3. Fallback to window/document scroll\n    window.scrollTo({ top: 0, behavior: 'instant' });\n    document.documentElement.scrollTop = 0;\n    document.body.scrollTop = 0;\n  }\n\n  /**\n   * Scroll to a specific element by ID.\n   * @param elementId - The ID of the element to scroll to\n   * @param scrollSelector - Optional custom scroll container selector\n   */\n  scrollToElement(elementId: string, scrollSelector?: string): void {\n    const element = document.getElementById(elementId);\n    if (element) {\n      element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  }\n\n  /**\n   * Set the default scroll container selector.\n   * @param selector - CSS selector for the scroll container\n   */\n  setDefaultScrollSelector(selector: string): void {\n    this.defaultScrollSelector = selector;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, inject, computed } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { arrowBackOutline, arrowForwardOutline } from 'ionicons/icons';\nimport { DocsNavLinksMetadata } from './types';\nimport { DocsNavigationService } from '../../../services/docs/docs-navigation.service';\nimport { I18nService } from '../../../services/i18n';\n\naddIcons({ arrowBackOutline, arrowForwardOutline });\n\n/**\n * val-docs-nav-links\n *\n * Navigation links for previous/next page navigation in documentation.\n *\n * @example\n * ```html\n * <val-docs-nav-links\n *   [props]=\"{\n *     previous: { label: 'Previous', title: 'Getting Started', route: ['/docs', 'getting-started'] },\n *     next: { label: 'Next', title: 'Components', route: ['/docs', 'components'] }\n *   }\"\n * ></val-docs-nav-links>\n * ```\n */\n@Component({\n  selector: 'val-docs-nav-links',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <nav class=\"docs-nav-links\" [class]=\"props.cssClass\" aria-label=\"Page navigation\">\n      <!-- Previous -->\n      <div\n        class=\"docs-nav-links__item docs-nav-links__item--prev\"\n        [class.docs-nav-links__item--empty]=\"!props.previous\"\n      >\n        @if (props.previous) {\n          <a\n            class=\"docs-nav-links__link\"\n            [href]=\"getHref(props.previous.route)\"\n            (click)=\"onNavigate($event, props.previous.route)\"\n          >\n            <ion-icon name=\"arrow-back-outline\" class=\"docs-nav-links__icon\"></ion-icon>\n            <div class=\"docs-nav-links__text\">\n              <span class=\"docs-nav-links__label\">{{ props.previous.label || previousLabel() }}</span>\n              <span class=\"docs-nav-links__title\">{{ props.previous.title }}</span>\n            </div>\n          </a>\n        }\n      </div>\n\n      <!-- Next -->\n      <div\n        class=\"docs-nav-links__item docs-nav-links__item--next\"\n        [class.docs-nav-links__item--empty]=\"!props.next\"\n      >\n        @if (props.next) {\n          <a\n            class=\"docs-nav-links__link\"\n            [href]=\"getHref(props.next.route)\"\n            (click)=\"onNavigate($event, props.next.route)\"\n          >\n            <div class=\"docs-nav-links__text\">\n              <span class=\"docs-nav-links__label\">{{ props.next.label || nextLabel() }}</span>\n              <span class=\"docs-nav-links__title\">{{ props.next.title }}</span>\n            </div>\n            <ion-icon name=\"arrow-forward-outline\" class=\"docs-nav-links__icon\"></ion-icon>\n          </a>\n        }\n      </div>\n    </nav>\n  `,\n  styles: [`\n    .docs-nav-links {\n      display: flex;\n      gap: 1rem;\n      margin-top: 3rem;\n      padding-top: 2rem;\n      border-top: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    .docs-nav-links__item {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .docs-nav-links__item--empty {\n      visibility: hidden;\n    }\n\n    .docs-nav-links__item--next {\n      text-align: right;\n    }\n\n    .docs-nav-links__item--next .docs-nav-links__link {\n      justify-content: flex-end;\n    }\n\n    .docs-nav-links__item--next .docs-nav-links__text {\n      align-items: flex-end;\n    }\n\n    .docs-nav-links__link {\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n      padding: 1rem;\n      border-radius: 8px;\n      text-decoration: none;\n      color: inherit;\n      transition: all 0.2s ease;\n      border: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    .docs-nav-links__link:hover {\n      background: rgba(0, 0, 0, 0.03);\n      border-color: #1a1a1a;\n    }\n\n    .docs-nav-links__link:hover .docs-nav-links__title {\n      color: #1a1a1a;\n    }\n\n    .docs-nav-links__link:hover .docs-nav-links__icon {\n      color: #1a1a1a;\n    }\n\n    .docs-nav-links__icon {\n      font-size: 1.25rem;\n      color: var(--ion-color-medium, #666);\n      flex-shrink: 0;\n    }\n\n    .docs-nav-links__text {\n      display: flex;\n      flex-direction: column;\n      gap: 0.25rem;\n    }\n\n    .docs-nav-links__label {\n      font-size: 0.75rem;\n      font-weight: 500;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      color: var(--ion-color-medium, #666);\n    }\n\n    .docs-nav-links__title {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--ion-text-color, #1a1a1a);\n      transition: color 0.2s ease;\n    }\n\n    /* Mobile responsive */\n    @media (max-width: 600px) {\n      .docs-nav-links {\n        flex-direction: column;\n      }\n\n      .docs-nav-links__item--next {\n        text-align: left;\n      }\n\n      .docs-nav-links__item--next .docs-nav-links__link {\n        justify-content: flex-start;\n        flex-direction: row-reverse;\n      }\n\n      .docs-nav-links__item--next .docs-nav-links__text {\n        align-items: flex-start;\n      }\n    }\n\n    /* Dark mode */\n    :host-context(.dark) .docs-nav-links__link,\n    :host-context([color-scheme='dark']) .docs-nav-links__link {\n      border-color: #3a3a3a;\n    }\n\n    :host-context(.dark) .docs-nav-links__link:hover,\n    :host-context([color-scheme='dark']) .docs-nav-links__link:hover {\n      background: rgba(255, 255, 255, 0.05);\n    }\n\n    :host-context(.dark) .docs-nav-links__title,\n    :host-context([color-scheme='dark']) .docs-nav-links__title {\n      color: #f4f5f8;\n    }\n  `],\n})\nexport class DocsNavLinksComponent {\n  @Input() props: DocsNavLinksMetadata = {};\n\n  @Output() navigate = new EventEmitter<string[]>();\n\n  private docsNav = inject(DocsNavigationService);\n  private i18n = inject(I18nService);\n\n  // i18n labels - uses _global namespace from valtech-components defaults\n  previousLabel = computed(() => this.i18n.t('previous') || 'Previous');\n  nextLabel = computed(() => this.i18n.t('next') || 'Next');\n\n  getHref(route: string[]): string {\n    // Handle routes that already start with '/'\n    const path = route.join('/');\n    return path.startsWith('/') ? path : '/' + path;\n  }\n\n  onNavigate(event: Event, route: string[]): void {\n    event.preventDefault();\n    this.navigate.emit(route);\n    this.docsNav.navigateAndScroll(route);\n  }\n}\n","/**\n * Configuration for the docs-api-table component.\n */\nexport interface DocsApiTableMetadata {\n  /**\n   * Table title (e.g., \"Properties\", \"Events\", \"Methods\").\n   */\n  title?: string;\n\n  /**\n   * API items to display.\n   */\n  items: DocsApiItem[];\n\n  /**\n   * Columns to show (subset of available columns).\n   * @default ['name', 'type', 'default', 'description']\n   */\n  columns?: DocsApiColumn[];\n\n  /**\n   * Custom CSS class.\n   */\n  cssClass?: string;\n\n  /**\n   * Show border around the table.\n   * @default true\n   */\n  bordered?: boolean;\n}\n\nexport type DocsApiColumn = 'name' | 'type' | 'default' | 'description' | 'required';\n\nexport interface DocsApiItem {\n  /**\n   * Property/event/method name.\n   */\n  name: string;\n\n  /**\n   * TypeScript type (e.g., \"string\", \"boolean\", \"EventEmitter<T>\").\n   */\n  type?: string;\n\n  /**\n   * Default value.\n   */\n  default?: string;\n\n  /**\n   * Description of the property/event/method.\n   */\n  description?: string;\n\n  /**\n   * Whether it's required.\n   */\n  required?: boolean;\n\n  /**\n   * Whether it's deprecated.\n   */\n  deprecated?: boolean;\n\n  /**\n   * Deprecation message or alternative.\n   */\n  deprecationNote?: string;\n}\n\n/**\n * Column labels configuration.\n */\nexport const API_TABLE_COLUMN_LABELS: Record<DocsApiColumn, string> = {\n  name: 'Name',\n  type: 'Type',\n  default: 'Default',\n  description: 'Description',\n  required: 'Required',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\nimport { DocsApiTableMetadata, DocsApiColumn, DocsApiItem, API_TABLE_COLUMN_LABELS } from './types';\n\n/**\n * val-docs-api-table\n *\n * A table component for documenting component APIs (inputs, outputs, methods).\n *\n * @example Properties table\n * ```html\n * <val-docs-api-table\n *   [props]=\"{\n *     title: 'Properties',\n *     items: [\n *       { name: 'disabled', type: 'boolean', default: 'false', description: 'Disables the button' },\n *       { name: 'color', type: 'string', default: 'primary', description: 'Button color variant' }\n *     ]\n *   }\"\n * ></val-docs-api-table>\n * ```\n *\n * @example Events table\n * ```html\n * <val-docs-api-table\n *   [props]=\"{\n *     title: 'Events',\n *     columns: ['name', 'type', 'description'],\n *     items: [\n *       { name: 'click', type: 'EventEmitter<MouseEvent>', description: 'Emitted when clicked' }\n *     ]\n *   }\"\n * ></val-docs-api-table>\n * ```\n */\n@Component({\n  selector: 'val-docs-api-table',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"docs-api-table\"\n      [class]=\"props.cssClass\"\n      [class.docs-api-table--bordered]=\"props.bordered !== false\"\n    >\n      @if (props.title) {\n        <h3 class=\"docs-api-table__title\">{{ props.title }}</h3>\n      }\n\n      <div class=\"docs-api-table__wrapper\">\n        <table class=\"docs-api-table__table\">\n          <thead>\n            <tr>\n              @for (col of displayColumns; track col) {\n                <th\n                  scope=\"col\"\n                  class=\"docs-api-table__th\"\n                  [class.docs-api-table__th--name]=\"col === 'name'\"\n                  [class.docs-api-table__th--type]=\"col === 'type'\"\n                  [class.docs-api-table__th--default]=\"col === 'default'\"\n                  [class.docs-api-table__th--description]=\"col === 'description'\"\n                >\n                  {{ getColumnLabel(col) }}\n                </th>\n              }\n            </tr>\n          </thead>\n          <tbody>\n            @for (item of props.items; track item.name) {\n              <tr\n                class=\"docs-api-table__row\"\n                [class.docs-api-table__row--deprecated]=\"item.deprecated\"\n              >\n                @for (col of displayColumns; track col) {\n                  <td\n                    class=\"docs-api-table__td\"\n                    [class.docs-api-table__td--name]=\"col === 'name'\"\n                    [class.docs-api-table__td--type]=\"col === 'type'\"\n                    [class.docs-api-table__td--default]=\"col === 'default'\"\n                    [class.docs-api-table__td--description]=\"col === 'description'\"\n                    [attr.data-label]=\"getColumnLabel(col)\"\n                  >\n                    @switch (col) {\n                      @case ('name') {\n                        <code class=\"docs-api-table__code\">{{ item.name }}</code>\n                        @if (item.required) {\n                          <span class=\"docs-api-table__required\" aria-label=\"Required\" title=\"Required\">*</span>\n                        }\n                        @if (item.deprecated) {\n                          <span class=\"docs-api-table__badge docs-api-table__badge--deprecated\" aria-label=\"This property is deprecated\">Deprecated</span>\n                        }\n                      }\n                      @case ('type') {\n                        <code class=\"docs-api-table__type\">{{ item.type || '-' }}</code>\n                      }\n                      @case ('default') {\n                        <code class=\"docs-api-table__default\">{{ item.default || '-' }}</code>\n                      }\n                      @case ('description') {\n                        <span>{{ item.description || '-' }}</span>\n                        @if (item.deprecated && item.deprecationNote) {\n                          <div class=\"docs-api-table__deprecation-note\">\n                            {{ item.deprecationNote }}\n                          </div>\n                        }\n                      }\n                      @case ('required') {\n                        {{ item.required ? 'Yes' : 'No' }}\n                      }\n                    }\n                  </td>\n                }\n              </tr>\n            }\n          </tbody>\n        </table>\n      </div>\n\n      @if (props.items.length === 0) {\n        <p class=\"docs-api-table__empty\">No items to display.</p>\n      }\n    </div>\n  `,\n  styleUrls: ['./docs-api-table.component.scss'],\n})\nexport class DocsApiTableComponent {\n  @Input() props: DocsApiTableMetadata = { items: [] };\n\n  readonly columnLabels = API_TABLE_COLUMN_LABELS;\n\n  get displayColumns(): DocsApiColumn[] {\n    return this.props.columns || ['name', 'type', 'default', 'description'];\n  }\n\n  getColumnLabel(col: DocsApiColumn): string {\n    return this.columnLabels[col];\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, signal, TemplateRef, ContentChild, ViewEncapsulation } from '@angular/core';\nimport { IonIcon, IonButton } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { copyOutline, checkmarkOutline, openOutline } from 'ionicons/icons';\nimport { DocsCodeExampleMetadata, DocsCodeTab } from './types';\n\n// Prism.js imports (same pattern as code-display and plain-code-box)\nimport * as Prism from 'prismjs';\nimport 'prismjs/components/prism-typescript';\nimport 'prismjs/components/prism-javascript';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/components/prism-scss';\nimport 'prismjs/components/prism-bash';\nimport 'prismjs/components/prism-json';\nimport 'prismjs/components/prism-markup';\n\naddIcons({ copyOutline, checkmarkOutline, openOutline });\n\n/**\n * val-docs-code-example\n *\n * A code example component with tabs, preview, and copy functionality.\n *\n * @example Basic usage\n * ```html\n * <val-docs-code-example\n *   [props]=\"{\n *     title: 'Basic Button',\n *     tabs: [\n *       { label: 'HTML', language: 'html', code: '<val-button>Click me</val-button>' },\n *       { label: 'TypeScript', language: 'typescript', code: 'import { ButtonComponent } from ...' }\n *     ]\n *   }\"\n * >\n *   <ng-template #preview>\n *     <val-button [props]=\"{ label: 'Click me' }\"></val-button>\n *   </ng-template>\n * </val-docs-code-example>\n * ```\n */\n@Component({\n  selector: 'val-docs-code-example',\n  standalone: true,\n  imports: [CommonModule, IonIcon, IonButton],\n  encapsulation: ViewEncapsulation.None,\n  template: `\n    <div class=\"docs-code-example\" [class]=\"props.cssClass\">\n      <!-- Header -->\n      @if (props.title || props.description || props.externalLink) {\n        <div class=\"docs-code-example__header\">\n          @if (props.title) {\n            <h4 class=\"docs-code-example__title\">{{ props.title }}</h4>\n          }\n          @if (props.description) {\n            <p class=\"docs-code-example__description\">{{ props.description }}</p>\n          }\n          @if (props.externalLink) {\n            <a\n              class=\"docs-code-example__external-link\"\n              [href]=\"props.externalLink.url\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              {{ props.externalLink.label || 'Open in StackBlitz' }}\n              <ion-icon name=\"open-outline\"></ion-icon>\n            </a>\n          }\n        </div>\n      }\n\n      <!-- Preview -->\n      @if (previewTpl) {\n        <div class=\"docs-code-example__preview\">\n          <ng-container *ngTemplateOutlet=\"previewTpl\"></ng-container>\n        </div>\n      }\n\n      <!-- Tabs -->\n      @if (props.tabs?.length) {\n        <div class=\"docs-code-example__tabs\">\n          <div class=\"docs-code-example__tab-list\" role=\"tablist\">\n            @for (tab of props.tabs; track tab.label; let i = $index) {\n              <button\n                class=\"docs-code-example__tab\"\n                [class.docs-code-example__tab--active]=\"activeTab() === i\"\n                (click)=\"activeTab.set(i)\"\n                role=\"tab\"\n                [attr.aria-selected]=\"activeTab() === i\"\n              >\n                {{ tab.label }}\n              </button>\n            }\n          </div>\n\n          <!-- Code Panel -->\n          <div class=\"docs-code-example__code-panel\">\n            <div class=\"docs-code-example__code-header\">\n              @if (props.showCopyButton !== false) {\n                <ion-button\n                  fill=\"clear\"\n                  size=\"small\"\n                  class=\"docs-code-example__copy-btn\"\n                  [attr.aria-label]=\"copied() ? 'Code copied' : 'Copy code'\"\n                  (click)=\"copyCode()\"\n                >\n                  <ion-icon slot=\"icon-only\" [name]=\"copied() ? 'checkmark-outline' : 'copy-outline'\"></ion-icon>\n                </ion-button>\n              }\n            </div>\n            <pre\n              class=\"docs-code-example__pre\"\n              [class.docs-code-example__pre--line-numbers]=\"props.showLineNumbers\"\n            ><code\n              class=\"docs-code-example__code\"\n              [class]=\"'language-' + currentTab().language\"\n              [innerHTML]=\"highlightedCode()\"\n            ></code></pre>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n  styles: [\n    `\n      .docs-code-example {\n        margin: 1.5rem 0;\n        border: 1px solid #f2f6f7;\n        border-radius: 12px;\n        overflow: hidden;\n        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);\n        background: #ffffff;\n      }\n\n      .docs-code-example__header {\n        padding: 1rem 1.25rem;\n        border-bottom: 1px solid #f2f6f7;\n        background: #ffffff;\n      }\n\n      .docs-code-example__title {\n        font-size: 1rem;\n        font-weight: 600;\n        margin: 0 0 0.25rem 0;\n        color: var(--ion-text-color, #1a1a1a);\n      }\n\n      .docs-code-example__description {\n        font-size: 0.875rem;\n        color: var(--ion-color-medium, #666);\n        margin: 0;\n      }\n\n      .docs-code-example__external-link {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.25rem;\n        margin-top: 0.5rem;\n        font-size: 0.8125rem;\n        color: #555;\n        text-decoration: none;\n      }\n\n      .docs-code-example__external-link:hover {\n        color: #1a1a1a;\n        text-decoration: underline;\n      }\n\n      .docs-code-example__external-link ion-icon {\n        font-size: 0.875rem;\n      }\n\n      .docs-code-example__preview {\n        padding: 1.5rem;\n        background: #ffffff;\n        border-bottom: 1px solid #f2f6f7;\n      }\n\n      .docs-code-example__tabs {\n        background: #f6f9fa;\n      }\n\n      .docs-code-example__tab-list {\n        display: flex;\n        gap: 2px;\n        border-bottom: 1px solid #f2f6f7;\n        overflow-x: auto;\n        scrollbar-width: thin;\n        font-size: 12px;\n      }\n\n      .docs-code-example__tab {\n        padding: 10px 18px 8px 18px;\n        font-family: 'Roboto Mono', 'SF Mono', Monaco, monospace;\n        font-size: 0.95em;\n        font-weight: 500;\n        color: #899396;\n        background: transparent;\n        border: 1px solid transparent;\n        border-bottom: none;\n        border-radius: 8px 8px 0 0;\n        cursor: pointer;\n        transition:\n          background 0.2s,\n          color 0.2s;\n        margin-bottom: -1px;\n        white-space: nowrap;\n      }\n\n      .docs-code-example__tab:hover {\n        background: #e8eef2;\n      }\n\n      .docs-code-example__tab--active {\n        background: #ffffff;\n        color: #19422d;\n        border: 1px solid #f2f6f7;\n        border-bottom: 1px solid #ffffff;\n        font-weight: 600;\n        z-index: 2;\n      }\n\n      .docs-code-example__code-panel {\n        position: relative;\n        background: #ffffff;\n      }\n\n      .docs-code-example__code-header {\n        position: sticky;\n        top: 10px;\n        float: right;\n        z-index: 10;\n        height: 0;\n        margin-right: 15px;\n      }\n\n      .docs-code-example__copy-btn {\n        --padding-start: 2px;\n        --padding-end: 2px;\n        min-width: 28px;\n        min-height: 28px;\n        height: 28px;\n        width: 28px;\n        --color: var(--ion-color-primary);\n        --background: rgba(255, 255, 255, 0.7);\n        border-radius: 6px;\n        box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);\n        opacity: 0;\n        transition: opacity 0.2s ease;\n      }\n\n      .docs-code-example__code-panel:hover .docs-code-example__copy-btn {\n        opacity: 1;\n      }\n\n      .docs-code-example__copy-btn:hover {\n        --background: rgba(255, 255, 255, 0.9);\n      }\n\n      .docs-code-example__pre {\n        margin: 0;\n        padding: 0;\n        overflow-x: auto;\n        overflow-y: auto;\n        max-height: 30rem;\n        min-height: 3rem;\n        background: #ffffff;\n        white-space: pre;\n        word-break: normal;\n      }\n\n      .docs-code-example__pre--line-numbers {\n        padding-left: 3rem;\n        counter-reset: line;\n      }\n\n      .docs-code-example__code {\n        display: block;\n        font-family: 'Roboto Mono', 'SF Mono', Monaco, 'Courier New', monospace;\n        font-size: 0.75em;\n        line-height: 1.5;\n        color: #24292f;\n        white-space: inherit;\n        word-break: normal;\n        tab-size: 2;\n      }\n\n      /* Prism.js syntax highlighting - Light theme (GitHub style) */\n      .docs-code-example__code .token {\n        text-decoration: none !important;\n      }\n\n      .docs-code-example__code .token.comment,\n      .docs-code-example__code .token.prolog,\n      .docs-code-example__code .token.doctype,\n      .docs-code-example__code .token.cdata {\n        color: #6a737d;\n      }\n\n      .docs-code-example__code .token.punctuation {\n        color: #24292f;\n      }\n\n      .docs-code-example__code .token.property,\n      .docs-code-example__code .token.tag,\n      .docs-code-example__code .token.boolean,\n      .docs-code-example__code .token.number,\n      .docs-code-example__code .token.constant,\n      .docs-code-example__code .token.symbol,\n      .docs-code-example__code .token.deleted {\n        color: #005cc5;\n      }\n\n      .docs-code-example__code .token.selector,\n      .docs-code-example__code .token.attr-name,\n      .docs-code-example__code .token.string,\n      .docs-code-example__code .token.char,\n      .docs-code-example__code .token.builtin,\n      .docs-code-example__code .token.inserted {\n        color: #22863a;\n      }\n\n      .docs-code-example__code .token.operator,\n      .docs-code-example__code .token.entity,\n      .docs-code-example__code .token.url {\n        color: #24292f;\n      }\n\n      .docs-code-example__code .token.atrule,\n      .docs-code-example__code .token.attr-value,\n      .docs-code-example__code .token.keyword {\n        color: #d73a49;\n      }\n\n      .docs-code-example__code .token.function,\n      .docs-code-example__code .token.class-name {\n        color: #6f42c1;\n      }\n\n      .docs-code-example__code .token.regex,\n      .docs-code-example__code .token.important,\n      .docs-code-example__code .token.variable {\n        color: #e36209;\n      }\n\n      /* Responsive */\n      @media (max-width: 600px) {\n        .docs-code-example {\n          border-radius: 8px;\n        }\n        .docs-code-example__tab-list {\n          font-size: 11px;\n        }\n        .docs-code-example__pre {\n          max-height: 20rem;\n        }\n        .docs-code-example__code {\n          font-size: 0.7em;\n        }\n      }\n\n      /* Dark mode — class-based ONLY (Ionic body.dark / html.ion-palette-dark) */\n      :host-context(.dark),\n      :host-context(.ion-palette-dark),\n      :host-context(html.ion-palette-dark),\n      :host-context(body.dark),\n      :host-context([data-theme='dark']) {\n        .docs-code-example {\n          background: #21252b;\n          border-color: #3b4048;\n          box-shadow: 0 4px 15px rgba(0, 0, 0, 0.6);\n        }\n\n        .docs-code-example__header {\n          background: #21252b;\n          border-color: #3b4048;\n        }\n\n        .docs-code-example__title {\n          color: #c9d1d9;\n        }\n\n        .docs-code-example__preview {\n          background: #161b22;\n          border-color: #3b4048;\n        }\n\n        .docs-code-example__tabs {\n          background: #1a1a1a;\n        }\n\n        .docs-code-example__tab-list {\n          border-color: #3b4048;\n        }\n\n        .docs-code-example__tab {\n          color: #8b949e;\n        }\n\n        .docs-code-example__tab:hover {\n          background: #21252b;\n        }\n\n        .docs-code-example__tab--active {\n          background: #282c34;\n          color: #c9d1d9;\n          border-color: #3b4048;\n          border-bottom-color: #282c34;\n        }\n\n        .docs-code-example__code-panel {\n          background: #161b22;\n        }\n\n        .docs-code-example__pre {\n          background: #161b22;\n        }\n\n        .docs-code-example__code {\n          color: #c9d1d9;\n        }\n\n        .docs-code-example__copy-btn {\n          --background: rgba(0, 0, 0, 0.4);\n        }\n\n        .docs-code-example__copy-btn:hover {\n          --background: rgba(0, 0, 0, 0.6);\n        }\n\n        /* Dark mode syntax highlighting */\n        .docs-code-example__code .token.comment,\n        .docs-code-example__code .token.prolog,\n        .docs-code-example__code .token.doctype,\n        .docs-code-example__code .token.cdata {\n          color: #8b949e;\n        }\n\n        .docs-code-example__code .token.punctuation {\n          color: #c9d1d9;\n        }\n\n        .docs-code-example__code .token.property,\n        .docs-code-example__code .token.tag,\n        .docs-code-example__code .token.boolean,\n        .docs-code-example__code .token.number,\n        .docs-code-example__code .token.constant,\n        .docs-code-example__code .token.symbol,\n        .docs-code-example__code .token.deleted {\n          color: #79c0ff;\n        }\n\n        .docs-code-example__code .token.selector,\n        .docs-code-example__code .token.attr-name,\n        .docs-code-example__code .token.string,\n        .docs-code-example__code .token.char,\n        .docs-code-example__code .token.builtin,\n        .docs-code-example__code .token.inserted {\n          color: #7ee787;\n        }\n\n        .docs-code-example__code .token.operator,\n        .docs-code-example__code .token.entity,\n        .docs-code-example__code .token.url {\n          color: #c9d1d9;\n        }\n\n        .docs-code-example__code .token.atrule,\n        .docs-code-example__code .token.attr-value,\n        .docs-code-example__code .token.keyword {\n          color: #ff7b72;\n        }\n\n        .docs-code-example__code .token.function,\n        .docs-code-example__code .token.class-name {\n          color: #d2a8ff;\n        }\n\n        .docs-code-example__code .token.regex,\n        .docs-code-example__code .token.important,\n        .docs-code-example__code .token.variable {\n          color: #ffa657;\n        }\n      }\n    `,\n  ],\n})\nexport class DocsCodeExampleComponent {\n  @Input() props: DocsCodeExampleMetadata = { tabs: [] };\n\n  @ContentChild('preview') previewTpl?: TemplateRef<any>;\n\n  protected activeTab = signal(0);\n  protected copied = signal(false);\n\n  protected currentTab(): DocsCodeTab {\n    return this.props.tabs[this.activeTab()] || { label: '', code: '', language: 'text' };\n  }\n\n  protected highlightedCode(): string {\n    const tab = this.currentTab();\n    const lang = this.normalizeLanguage(tab.language);\n    const grammar = Prism.languages[lang];\n\n    if (!grammar) {\n      return this.escapeHtml(tab.code);\n    }\n\n    return Prism.highlight(tab.code, grammar, lang);\n  }\n\n  async copyCode(): Promise<void> {\n    const code = this.currentTab().code;\n    try {\n      await navigator.clipboard.writeText(code);\n      this.copied.set(true);\n      setTimeout(() => this.copied.set(false), 2000);\n    } catch (err) {\n      console.error('Failed to copy code:', err);\n    }\n  }\n\n  private normalizeLanguage(language: string): string {\n    const aliases: Record<string, string> = {\n      ts: 'typescript',\n      js: 'javascript',\n      html: 'markup',\n      xml: 'markup',\n      sh: 'bash',\n      shell: 'bash',\n    };\n    return aliases[language.toLowerCase()] || language.toLowerCase();\n  }\n\n  private escapeHtml(text: string): string {\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  HostListener,\n  signal,\n  computed,\n  ElementRef,\n  ViewChild,\n  OnDestroy,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { searchOutline, closeOutline } from 'ionicons/icons';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { DocsSearchMetadata, DocsSearchResult, DocsSearchItem, DocsSearchSection } from './types';\n\naddIcons({ searchOutline, closeOutline });\n\n/**\n * val-docs-search\n *\n * A search component for documentation with keyboard navigation support.\n * Supports Cmd+K / Ctrl+K shortcut to open.\n *\n * @example\n * ```html\n * <val-docs-search\n *   [props]=\"{\n *     placeholder: 'Search docs...',\n *     sections: sidebarSections,\n *     showShortcut: true\n *   }\"\n *   (navigate)=\"onNavigate($event)\"\n * ></val-docs-search>\n * ```\n */\n@Component({\n  selector: 'val-docs-search',\n  standalone: true,\n  imports: [CommonModule, FormsModule, IonIcon],\n  template: `\n    <div class=\"docs-search\" [class]=\"props.cssClass\">\n      <div class=\"docs-search__input-wrapper\">\n        <ion-icon name=\"search-outline\" class=\"docs-search__icon\"></ion-icon>\n        <input\n          #searchInput\n          type=\"text\"\n          class=\"docs-search__input\"\n          [placeholder]=\"props.placeholder || 'Search...'\"\n          [(ngModel)]=\"searchQuery\"\n          (ngModelChange)=\"onQueryChange($event)\"\n          (keydown)=\"onInputKeydown($event)\"\n          (focus)=\"onFocus()\"\n          (blur)=\"onBlur()\"\n          aria-label=\"Search documentation\"\n          autocomplete=\"off\"\n        />\n        @if (searchQuery()) {\n          <button\n            type=\"button\"\n            class=\"docs-search__clear\"\n            (click)=\"clearSearch()\"\n            aria-label=\"Clear search\"\n          >\n            <ion-icon name=\"close-outline\"></ion-icon>\n          </button>\n        } @else if (props.showShortcut) {\n          <span class=\"docs-search__shortcut\">{{ isMac ? '⌘' : 'Ctrl' }}+K</span>\n        }\n      </div>\n\n      @if (showResults() && results().length > 0) {\n        <div class=\"docs-search__results\" role=\"listbox\">\n          @for (result of results(); track result.item.label; let i = $index) {\n            <button\n              type=\"button\"\n              class=\"docs-search__result\"\n              [class.docs-search__result--active]=\"selectedIndex() === i\"\n              role=\"option\"\n              [attr.aria-selected]=\"selectedIndex() === i\"\n              (click)=\"selectResult(result)\"\n              (mouseenter)=\"selectedIndex.set(i)\"\n            >\n              <span class=\"docs-search__result-section\">{{ result.section }}</span>\n              <span class=\"docs-search__result-label\">{{ result.item.label }}</span>\n              @if (result.item.description) {\n                <span class=\"docs-search__result-description\">{{ result.item.description }}</span>\n              }\n            </button>\n          }\n        </div>\n      }\n\n      @if (showResults() && searchQuery() && results().length === 0) {\n        <div class=\"docs-search__no-results\">\n          No results found for \"{{ searchQuery() }}\"\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./docs-search.component.scss'],\n})\nexport class DocsSearchComponent implements OnDestroy {\n  @Input() props: DocsSearchMetadata = {};\n\n  @Output() navigate = new EventEmitter<string[]>();\n  @Output() search = new EventEmitter<string>();\n\n  @ViewChild('searchInput') searchInputEl?: ElementRef<HTMLInputElement>;\n\n  protected searchQuery = signal('');\n  protected showResults = signal(false);\n  protected selectedIndex = signal(0);\n\n  private searchSubject = new Subject<string>();\n  private destroy$ = new Subject<void>();\n\n  readonly isMac = typeof navigator !== 'undefined' && navigator.platform.toLowerCase().includes('mac');\n\n  protected results = computed(() => {\n    const query = this.searchQuery().toLowerCase().trim();\n    if (!query || !this.props.sections) return [];\n\n    const results: DocsSearchResult[] = [];\n\n    this.props.sections.forEach((section: DocsSearchSection) => {\n      section.items.forEach((item: DocsSearchItem) => {\n        // Match label\n        if (item.label.toLowerCase().includes(query)) {\n          results.push({ section: section.title, item, matchType: 'label' });\n          return;\n        }\n        // Match description\n        if (item.description?.toLowerCase().includes(query)) {\n          results.push({ section: section.title, item, matchType: 'description' });\n          return;\n        }\n        // Match keywords\n        if (item.keywords?.some((kw: string) => kw.toLowerCase().includes(query))) {\n          results.push({ section: section.title, item, matchType: 'keyword' });\n        }\n      });\n    });\n\n    return results.slice(0, 10); // Limit results\n  });\n\n  constructor(private router: Router) {\n    this.searchSubject\n      .pipe(debounceTime(this.props.debounceMs || 150), takeUntil(this.destroy$))\n      .subscribe((query) => {\n        this.search.emit(query);\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  @HostListener('document:keydown', ['$event'])\n  onGlobalKeydown(event: KeyboardEvent): void {\n    // Cmd+K or Ctrl+K to focus search\n    if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n      event.preventDefault();\n      this.searchInputEl?.nativeElement.focus();\n    }\n  }\n\n  onQueryChange(query: string): void {\n    this.searchQuery.set(query);\n    this.selectedIndex.set(0);\n    this.searchSubject.next(query);\n  }\n\n  onFocus(): void {\n    this.showResults.set(true);\n  }\n\n  onBlur(): void {\n    // Delay to allow click on results\n    setTimeout(() => this.showResults.set(false), 200);\n  }\n\n  onInputKeydown(event: KeyboardEvent): void {\n    const resultsArray = this.results();\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.selectedIndex.update((i) => Math.min(i + 1, resultsArray.length - 1));\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.selectedIndex.update((i) => Math.max(i - 1, 0));\n        break;\n      case 'Enter':\n        event.preventDefault();\n        if (resultsArray[this.selectedIndex()]) {\n          this.selectResult(resultsArray[this.selectedIndex()]);\n        }\n        break;\n      case 'Escape':\n        event.preventDefault();\n        this.clearSearch();\n        this.searchInputEl?.nativeElement.blur();\n        break;\n    }\n  }\n\n  selectResult(result: DocsSearchResult): void {\n    this.navigate.emit(result.item.route);\n    this.router.navigate(result.item.route);\n    this.clearSearch();\n  }\n\n  clearSearch(): void {\n    this.searchQuery.set('');\n    this.selectedIndex.set(0);\n    this.showResults.set(false);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DocsBreadcrumbMetadata, DocsBreadcrumbItem } from './types';\n\n/**\n * val-docs-breadcrumb\n *\n * A breadcrumb navigation component for documentation.\n *\n * @example\n * ```html\n * <val-docs-breadcrumb\n *   [props]=\"{\n *     showHome: true,\n *     items: [\n *       { label: 'Components', route: ['/docs', 'components'] },\n *       { label: 'Button' }\n *     ]\n *   }\"\n * ></val-docs-breadcrumb>\n * ```\n */\n@Component({\n  selector: 'val-docs-breadcrumb',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <nav\n      class=\"docs-breadcrumb\"\n      [class]=\"props.cssClass\"\n      aria-label=\"Breadcrumb\"\n    >\n      <ol class=\"docs-breadcrumb__list\">\n        @if (props.showHome) {\n          <li class=\"docs-breadcrumb__item\">\n            <button\n              type=\"button\"\n              class=\"docs-breadcrumb__link\"\n              (click)=\"onNavigate(props.homeRoute || ['/'])\"\n            >\n              {{ props.homeLabel || 'Home' }}\n            </button>\n            <span class=\"docs-breadcrumb__separator\" aria-hidden=\"true\">\n              {{ props.separator || '>' }}\n            </span>\n          </li>\n        }\n\n        @for (item of props.items; track item.label; let last = $last) {\n          <li class=\"docs-breadcrumb__item\">\n            @if (item.route && !last) {\n              <button\n                type=\"button\"\n                class=\"docs-breadcrumb__link\"\n                (click)=\"onNavigate(item.route)\"\n              >\n                {{ item.label }}\n              </button>\n            } @else {\n              <span\n                class=\"docs-breadcrumb__current\"\n                aria-current=\"page\"\n              >\n                {{ item.label }}\n              </span>\n            }\n\n            @if (!last) {\n              <span class=\"docs-breadcrumb__separator\" aria-hidden=\"true\">\n                {{ props.separator || '>' }}\n              </span>\n            }\n          </li>\n        }\n      </ol>\n    </nav>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      font-family: var(--ion-font-family, system-ui, sans-serif);\n    }\n\n    :host .docs-breadcrumb__list {\n      display: flex !important;\n      flex-direction: row !important;\n      flex-wrap: wrap;\n      align-items: center;\n      gap: 0.5rem;\n      list-style: none !important;\n      list-style-type: none !important;\n      margin: 0 !important;\n      padding: 0 !important;\n    }\n\n    :host .docs-breadcrumb__item {\n      display: flex !important;\n      flex-direction: row !important;\n      align-items: center;\n      gap: 0.5rem;\n      margin: 0 !important;\n      padding: 0 !important;\n    }\n\n    :host .docs-breadcrumb__link {\n      display: inline;\n      padding: 0;\n      border: none;\n      background: transparent;\n      font-size: 0.875rem;\n      color: var(--ion-color-medium, #666);\n      text-decoration: none;\n      cursor: pointer;\n      transition: color 0.15s ease;\n    }\n\n    :host .docs-breadcrumb__link:hover {\n      color: var(--ion-text-color, #1a1a1a);\n    }\n\n    :host .docs-breadcrumb__link:focus-visible {\n      outline: 2px solid #1a1a1a;\n      outline-offset: 2px;\n    }\n\n    :host .docs-breadcrumb__separator {\n      color: var(--ion-color-medium, #666);\n      font-size: 0.875rem;\n    }\n\n    :host .docs-breadcrumb__current {\n      font-size: 0.875rem;\n      font-weight: 600;\n      color: var(--ion-text-color, #1a1a1a);\n    }\n\n    /* Dark mode */\n    :host-context(.dark) .docs-breadcrumb__link:hover,\n    :host-context([color-scheme='dark']) .docs-breadcrumb__link:hover {\n      color: #f4f5f8;\n    }\n\n    :host-context(.dark) .docs-breadcrumb__current,\n    :host-context([color-scheme='dark']) .docs-breadcrumb__current {\n      color: #f4f5f8;\n    }\n  `],\n})\nexport class DocsBreadcrumbComponent {\n  @Input() props: DocsBreadcrumbMetadata = { items: [] };\n\n  @Output() navigate = new EventEmitter<string[]>();\n\n  constructor(private router: Router) {}\n\n  onNavigate(route: string[]): void {\n    this.navigate.emit(route);\n    this.router.navigate(route);\n  }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, input } from '@angular/core';\n\nexport type DocsCalloutVariant = 'note' | 'warning' | 'tip' | 'danger' | 'info';\n\nexport interface DocsCalloutMetadata {\n  /** Variant determines the color scheme */\n  variant?: DocsCalloutVariant;\n  /** Optional title (defaults to variant name if not provided) */\n  title?: string;\n  /** Hide the title completely */\n  hideTitle?: boolean;\n}\n\n@Component({\n  selector: 'val-docs-callout',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"docs-callout\"\n      [class.docs-callout--note]=\"variant() === 'note'\"\n      [class.docs-callout--warning]=\"variant() === 'warning'\"\n      [class.docs-callout--tip]=\"variant() === 'tip'\"\n      [class.docs-callout--danger]=\"variant() === 'danger'\"\n      [class.docs-callout--info]=\"variant() === 'info'\"\n    >\n      @if (!props().hideTitle) {\n        <div class=\"docs-callout__title\">{{ displayTitle() }}</div>\n      }\n      <div class=\"docs-callout__content\">\n        <ng-content></ng-content>\n      </div>\n    </div>\n  `,\n  styleUrls: ['./docs-callout.component.scss'],\n})\nexport class DocsCalloutComponent {\n  props = input<DocsCalloutMetadata>({});\n\n  variant = () => this.props().variant || 'note';\n\n  displayTitle = () => {\n    if (this.props().title) return this.props().title;\n\n    const titles: Record<DocsCalloutVariant, string> = {\n      note: 'Note',\n      warning: 'Warning',\n      tip: 'Tip',\n      danger: 'Danger',\n      info: 'Info',\n    };\n    return titles[this.variant()];\n  };\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DocsSectionMetadata } from './types';\n\n/**\n * val-docs-section\n *\n * A semantic section wrapper for documentation pages.\n * Automatically creates headings with IDs for TOC linking.\n *\n * @example Basic usage\n * ```html\n * <val-docs-section [props]=\"{ id: 'installation', title: 'Installation' }\">\n *   <p>Install the package using npm...</p>\n *   <val-docs-code-example [props]=\"codeExample\"></val-docs-code-example>\n * </val-docs-section>\n * ```\n *\n * @example With level 3 heading\n * ```html\n * <val-docs-section [props]=\"{ id: 'npm', title: 'Using npm', level: 3 }\">\n *   <val-docs-code-example [props]=\"npmExample\"></val-docs-code-example>\n * </val-docs-section>\n * ```\n */\n@Component({\n  selector: 'val-docs-section',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <section\n      [id]=\"props.id\"\n      class=\"docs-section\"\n      [class]=\"props.cssClass\"\n      [class.docs-section--level-2]=\"level === 2\"\n      [class.docs-section--level-3]=\"level === 3\"\n    >\n      @if (level === 2) {\n        <h2 class=\"docs-section__title\">{{ props.title }}</h2>\n      } @else {\n        <h3 class=\"docs-section__title\">{{ props.title }}</h3>\n      }\n\n      @if (props.description) {\n        <p class=\"docs-section__description\">{{ props.description }}</p>\n      }\n\n      <div class=\"docs-section__content\">\n        <ng-content></ng-content>\n      </div>\n    </section>\n  `,\n  styles: [`\n    .docs-section {\n      margin-bottom: 2.5rem;\n    }\n\n    .docs-section__title {\n      margin: 0 0 1rem;\n      font-weight: 600;\n      color: var(--ion-text-color);\n      scroll-margin-top: 80px;\n    }\n\n    .docs-section--level-2 .docs-section__title {\n      font-size: 1.5rem;\n      padding-bottom: 0.5rem;\n      border-bottom: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    .docs-section--level-3 .docs-section__title {\n      font-size: 1.25rem;\n    }\n\n    .docs-section__description {\n      margin: 0 0 1.25rem;\n      color: var(--ion-color-medium);\n      font-size: 1rem;\n      line-height: 1.6;\n    }\n\n    .docs-section__content > *:last-child {\n      margin-bottom: 0;\n    }\n\n    /* Dark mode */\n    :host-context(.dark) .docs-section--level-2 .docs-section__title,\n    :host-context([color-scheme=\"dark\"]) .docs-section--level-2 .docs-section__title {\n      border-bottom-color: var(--ion-border-color, #333);\n    }\n  `],\n})\nexport class DocsSectionComponent {\n  @Input() props: DocsSectionMetadata = { id: '', title: '' };\n\n  get level(): 2 | 3 {\n    return this.props.level ?? 2;\n  }\n}\n","import { Component, Input, computed, signal, AfterViewInit, OnDestroy, ElementRef, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { DocsBreadcrumbComponent } from '../../molecules/docs-breadcrumb/docs-breadcrumb.component';\nimport { DocsBreadcrumbMetadata } from '../../molecules/docs-breadcrumb/types';\nimport { DocsNavLinksComponent } from '../../molecules/docs-nav-links/docs-nav-links.component';\nimport { DocsNavLinksMetadata } from '../../molecules/docs-nav-links/types';\nimport { DocsTocComponent } from '../../organisms/docs-toc/docs-toc.component';\nimport { DocsTocMetadata } from '../../organisms/docs-toc/types';\nimport { ContentReactionComponent } from '../../molecules/content-reaction/content-reaction.component';\nimport { ContentReactionMetadata } from '../../molecules/content-reaction/types';\nimport { DocsPageMetadata } from './types';\n\n/**\n * val-docs-page\n *\n * A complete documentation page template that eliminates boilerplate.\n * Provides automatic TOC generation, navigation links, and consistent styling.\n *\n * @example Basic usage\n * ```html\n * <val-docs-page [props]=\"{\n *   title: 'Button',\n *   lead: 'A clickable element for user interactions.',\n *   previousPage: { title: 'Quick Start', route: ['/docs', 'quick-start'] },\n *   nextPage: { title: 'Card', route: ['/docs', 'components', 'card'] }\n * }\">\n *   <val-docs-section [props]=\"{ id: 'basic-usage', title: 'Basic Usage' }\">\n *     <p>Content here...</p>\n *   </val-docs-section>\n *\n *   <val-docs-section [props]=\"{ id: 'variants', title: 'Variants' }\">\n *     <p>More content...</p>\n *   </val-docs-section>\n * </val-docs-page>\n * ```\n *\n * @example With badge\n * ```html\n * <val-docs-page [props]=\"{\n *   title: 'New Component',\n *   badge: 'New',\n *   badgeColor: 'success'\n * }\">\n *   ...\n * </val-docs-page>\n * ```\n */\n@Component({\n  selector: 'val-docs-page',\n  standalone: true,\n  imports: [CommonModule, DocsBreadcrumbComponent, DocsNavLinksComponent, DocsTocComponent, ContentReactionComponent],\n  template: `\n    <div class=\"docs-page\" [class]=\"props.cssClass\">\n      <div class=\"docs-page__content\" #content>\n        @if (breadcrumbProps()) {\n          <val-docs-breadcrumb [props]=\"breadcrumbProps()!\"></val-docs-breadcrumb>\n        }\n        <header class=\"docs-page__header\">\n          <div class=\"docs-page__title-row\">\n            <h1 class=\"docs-page__title\">{{ props.title }}</h1>\n            @if (props.badge) {\n              <span\n                class=\"docs-page__badge\"\n                [class.docs-page__badge--success]=\"props.badgeColor === 'success'\"\n                [class.docs-page__badge--warning]=\"props.badgeColor === 'warning'\"\n                [class.docs-page__badge--danger]=\"props.badgeColor === 'danger'\"\n              >\n                {{ props.badge }}\n              </span>\n            }\n          </div>\n          @if (props.lead) {\n            <p class=\"docs-page__lead\">{{ props.lead }}</p>\n          }\n        </header>\n\n        <div class=\"docs-page__sections\">\n          <ng-content></ng-content>\n        </div>\n\n        @if (props.feedback?.enabled) {\n          <div class=\"docs-page__feedback\">\n            <val-content-reaction [props]=\"feedbackProps()\"></val-content-reaction>\n          </div>\n        }\n\n        @if (showNavLinks()) {\n          <val-docs-nav-links [props]=\"navLinksProps()\"></val-docs-nav-links>\n        }\n      </div>\n\n      @if (!props.toc?.hide) {\n        <aside class=\"docs-page__toc\">\n          <val-docs-toc [props]=\"tocProps()\"></val-docs-toc>\n        </aside>\n      }\n    </div>\n  `,\n  styles: [`\n    /* Main layout */\n    .docs-page {\n      display: grid;\n      grid-template-columns: 1fr;\n      gap: 2rem;\n      max-width: 1400px;\n      margin: 0 auto;\n      padding: 2rem 1.5rem;\n    }\n\n    @media (min-width: 1200px) {\n      .docs-page {\n        grid-template-columns: 1fr 220px;\n        padding: 2rem;\n      }\n    }\n\n    .docs-page__content {\n      min-width: 0;\n      max-width: 900px;\n    }\n\n    val-docs-breadcrumb {\n      display: block;\n      margin-bottom: 1rem;\n    }\n\n    .docs-page__header {\n      margin-bottom: 2rem;\n    }\n\n    .docs-page__title-row {\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n      flex-wrap: wrap;\n    }\n\n    .docs-page__title {\n      margin: 0;\n      font-size: 2rem;\n      font-weight: 700;\n      color: var(--ion-text-color, #1a1a1a);\n      line-height: 1.2;\n    }\n\n    @media (min-width: 768px) {\n      .docs-page__title {\n        font-size: 2.5rem;\n      }\n    }\n\n    .docs-page__badge {\n      display: inline-flex;\n      align-items: center;\n      padding: 0.25rem 0.5rem;\n      font-size: 0.6875rem;\n      font-weight: 500;\n      text-transform: uppercase;\n      letter-spacing: 0.03em;\n      border-radius: 4px;\n      background: rgba(0, 0, 0, 0.04);\n      color: #888;\n    }\n\n    .docs-page__badge--success {\n      background: rgba(0, 0, 0, 0.04);\n      color: #888;\n    }\n\n    .docs-page__badge--warning {\n      background: var(--ion-color-warning-tint, #fff3e0);\n      color: var(--ion-color-warning-shade, #e65100);\n    }\n\n    .docs-page__badge--danger {\n      background: var(--ion-color-danger-tint, #ffebee);\n      color: var(--ion-color-danger-shade, #c62828);\n    }\n\n    .docs-page__lead {\n      margin: 1rem 0 0;\n      font-size: 1.125rem;\n      line-height: 1.7;\n      color: var(--ion-color-medium, #666);\n    }\n\n    .docs-page__sections > *:last-child {\n      margin-bottom: 0;\n    }\n\n    /* Feedback section */\n    .docs-page__feedback {\n      margin-top: 3rem;\n      padding-top: 2rem;\n      border-top: 1px solid rgba(0, 0, 0, 0.08);\n      display: flex;\n      justify-content: center;\n    }\n\n    /* TOC - Hidden on mobile, visible on desktop */\n    .docs-page__toc {\n      display: none;\n    }\n\n    @media (min-width: 1200px) {\n      .docs-page__toc {\n        display: block;\n        position: sticky;\n        top: 2rem;\n        height: fit-content;\n        max-height: calc(100vh - 4rem);\n        overflow-y: auto;\n      }\n    }\n\n    /* Content typography styles */\n    .docs-page__sections h2 {\n      font-size: 1.5rem;\n      font-weight: 600;\n      margin: 0 0 1rem 0;\n      color: var(--ion-text-color, #1a1a1a);\n      scroll-margin-top: 2rem;\n    }\n\n    .docs-page__sections h3 {\n      font-size: 1.125rem;\n      font-weight: 600;\n      margin: 1.5rem 0 1rem 0;\n      color: var(--ion-text-color, #1a1a1a);\n    }\n\n    .docs-page__sections h4 {\n      font-size: 1rem;\n      font-weight: 600;\n      margin: 1.25rem 0 0.75rem 0;\n      color: var(--ion-text-color, #1a1a1a);\n    }\n\n    .docs-page__sections p {\n      line-height: 1.7;\n      color: var(--ion-text-color, #1a1a1a);\n      margin: 0 0 1rem 0;\n    }\n\n    .docs-page__sections ul,\n    .docs-page__sections ol {\n      padding-left: 1.5rem;\n      margin: 0 0 1rem 0;\n    }\n\n    .docs-page__sections li {\n      margin-bottom: 0.5rem;\n      line-height: 1.6;\n      color: var(--ion-text-color, #1a1a1a);\n    }\n\n    .docs-page__sections a {\n      color: var(--ion-color-primary, #3880ff);\n      text-decoration: none;\n    }\n\n    .docs-page__sections a:hover {\n      text-decoration: underline;\n    }\n\n    .docs-page__sections code:not([class*='language-']) {\n      background: rgba(0, 0, 0, 0.06);\n      padding: 0.125rem 0.375rem;\n      border-radius: 4px;\n      font-family: 'SF Mono', 'Fira Code', Consolas, monospace;\n      font-size: 0.875em;\n    }\n\n    .docs-page__sections pre:not([class*='language-']) {\n      background: rgba(0, 0, 0, 0.04);\n      padding: 1rem;\n      border-radius: 8px;\n      overflow-x: auto;\n      margin: 0 0 1rem 0;\n    }\n\n    .docs-page__sections pre:not([class*='language-']) code {\n      background: none;\n      padding: 0;\n    }\n\n    .docs-page__sections table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 0 0 1rem 0;\n      font-size: 0.875rem;\n    }\n\n    .docs-page__sections th,\n    .docs-page__sections td {\n      padding: 0.75rem;\n      text-align: left;\n      border-bottom: 1px solid rgba(0, 0, 0, 0.1);\n    }\n\n    .docs-page__sections th {\n      font-weight: 600;\n      background: rgba(0, 0, 0, 0.02);\n    }\n\n    .docs-page__sections blockquote {\n      margin: 0 0 1rem 0;\n      padding: 1rem 1.5rem;\n      border-left: 4px solid var(--ion-color-primary, #3880ff);\n      background: rgba(0, 0, 0, 0.02);\n      border-radius: 0 8px 8px 0;\n    }\n\n    .docs-page__sections blockquote p:last-child {\n      margin-bottom: 0;\n    }\n\n    .docs-page__sections img {\n      max-width: 100%;\n      height: auto;\n      border-radius: 8px;\n    }\n\n    .docs-page__sections hr {\n      border: none;\n      border-top: 1px solid rgba(0, 0, 0, 0.1);\n      margin: 2rem 0;\n    }\n\n    .docs-page__sections strong {\n      font-weight: 600;\n    }\n\n    .docs-page__sections section {\n      margin-bottom: 2rem;\n    }\n\n    /* Dark mode */\n    :host-context(.dark) .docs-page__badge,\n    :host-context([color-scheme=\"dark\"]) .docs-page__badge {\n      background: rgba(255, 255, 255, 0.06);\n      color: #999;\n    }\n\n    :host-context(.dark) .docs-page__badge--success,\n    :host-context([color-scheme=\"dark\"]) .docs-page__badge--success {\n      background: rgba(255, 255, 255, 0.06);\n      color: #999;\n    }\n\n    :host-context(.dark) .docs-page__badge--warning,\n    :host-context([color-scheme=\"dark\"]) .docs-page__badge--warning {\n      background: rgba(230, 81, 0, 0.2);\n      color: #ffb74d;\n    }\n\n    :host-context(.dark) .docs-page__badge--danger,\n    :host-context([color-scheme=\"dark\"]) .docs-page__badge--danger {\n      background: rgba(198, 40, 40, 0.2);\n      color: #e57373;\n    }\n\n    :host-context(.dark) .docs-page__sections code:not([class*='language-']),\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections code:not([class*='language-']) {\n      background: rgba(255, 255, 255, 0.1);\n    }\n\n    :host-context(.dark) .docs-page__sections pre:not([class*='language-']),\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections pre:not([class*='language-']) {\n      background: rgba(255, 255, 255, 0.06);\n    }\n\n    :host-context(.dark) .docs-page__sections th,\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections th {\n      background: rgba(255, 255, 255, 0.04);\n    }\n\n    :host-context(.dark) .docs-page__sections th,\n    :host-context(.dark) .docs-page__sections td,\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections th,\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections td {\n      border-color: rgba(255, 255, 255, 0.1);\n    }\n\n    :host-context(.dark) .docs-page__sections blockquote,\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections blockquote {\n      background: rgba(255, 255, 255, 0.04);\n    }\n\n    :host-context(.dark) .docs-page__sections hr,\n    :host-context([color-scheme=\"dark\"]) .docs-page__sections hr {\n      border-color: rgba(255, 255, 255, 0.1);\n    }\n\n    :host-context(.dark) .docs-page__feedback,\n    :host-context([color-scheme=\"dark\"]) .docs-page__feedback {\n      border-color: rgba(255, 255, 255, 0.1);\n    }\n\n    /* Responsive feedback */\n    @media (max-width: 768px) {\n      .docs-page__feedback {\n        margin-top: 2rem;\n        padding-top: 1.5rem;\n      }\n    }\n  `],\n})\nexport class DocsPageComponent implements AfterViewInit, OnDestroy {\n  private elementRef = inject(ElementRef);\n  private router = inject(Router);\n\n  // Use signal internally so computed properties react to changes\n  private _props = signal<DocsPageMetadata>({ title: '' });\n\n  @Input()\n  set props(value: DocsPageMetadata) {\n    this._props.set(value);\n  }\n  get props(): DocsPageMetadata {\n    return this._props();\n  }\n\n  private tocItems = signal<{ id: string; label: string; level: number }[]>([]);\n  private observer: MutationObserver | null = null;\n\n  ngAfterViewInit(): void {\n    // Initial scan\n    this.scanForSections();\n\n    // Watch for dynamic content changes\n    this.observer = new MutationObserver(() => {\n      this.scanForSections();\n    });\n\n    const contentEl = this.elementRef.nativeElement.querySelector('.docs-page__sections');\n    if (contentEl) {\n      this.observer.observe(contentEl, { childList: true, subtree: true });\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.observer?.disconnect();\n  }\n\n  private scanForSections(): void {\n    const contentEl = this.elementRef.nativeElement.querySelector('.docs-page__sections');\n    if (!contentEl) return;\n\n    const headings = contentEl.querySelectorAll('h2[id], h3[id], section[id] > h2, section[id] > h3');\n    const items: { id: string; label: string; level: number }[] = [];\n\n    headings.forEach((heading: Element) => {\n      // Get ID from heading or parent section\n      let id = heading.id;\n      if (!id && heading.parentElement?.tagName === 'SECTION') {\n        id = heading.parentElement.id;\n      }\n\n      if (id) {\n        const level = heading.tagName === 'H2' ? 2 : 3;\n        items.push({ id, label: heading.textContent?.trim() || '', level });\n      }\n    });\n\n    this.tocItems.set(items);\n  }\n\n  tocProps = computed<DocsTocMetadata>(() => {\n    const props = this._props();\n    return {\n      title: props.toc?.title ?? 'On this page',\n      items: this.tocItems(),\n    };\n  });\n\n  navLinksProps = computed<DocsNavLinksMetadata>(() => {\n    const props = this._props();\n    return {\n      previous: props.previousPage\n        ? {\n            // Don't pass label - let DocsNavLinksComponent use its internal i18n-reactive labels\n            title: props.previousPage.title,\n            route: props.previousPage.route,\n          }\n        : undefined,\n      next: props.nextPage\n        ? {\n            // Don't pass label - let DocsNavLinksComponent use its internal i18n-reactive labels\n            title: props.nextPage.title,\n            route: props.nextPage.route,\n          }\n        : undefined,\n    };\n  });\n\n  showNavLinks = computed(() => {\n    const props = this._props();\n    return !!props.previousPage || !!props.nextPage;\n  });\n\n  breadcrumbProps = computed<DocsBreadcrumbMetadata | null>(() => {\n    const props = this._props();\n    if (!props.breadcrumb?.items?.length) {\n      return null;\n    }\n    return {\n      items: props.breadcrumb.items,\n      showHome: props.breadcrumb.showHome ?? true,\n      homeRoute: props.breadcrumb.homeRoute ?? ['/'],\n    };\n  });\n\n  feedbackProps = computed<ContentReactionMetadata>(() => {\n    const props = this._props();\n    const feedback = props.feedback;\n\n    // Derive entityId from route if not provided\n    const entityId =\n      feedback?.entityId || this.router.url.replace(/^\\//, '').replace(/\\//g, '-') || 'unknown';\n\n    return {\n      entityRef: {\n        entityType: feedback?.entityType || 'docs-page',\n        entityId: entityId,\n      },\n      question: feedback?.question,\n      showComment: feedback?.showComment ?? true,\n      allowAnonymous: feedback?.allowAnonymous ?? true,\n      showThankYou: true,\n    };\n  });\n}\n","import { Component, Input, Output, EventEmitter, inject, signal, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport {\n  IonSplitPane,\n  IonMenu,\n  IonHeader,\n  IonToolbar,\n  IonContent,\n  IonIcon,\n  IonMenuButton,\n  IonButtons,\n  MenuController,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport {\n  chevronDownOutline,\n  chevronForwardOutline,\n  closeOutline,\n} from 'ionicons/icons';\nimport { DocsSearchComponent } from '../../molecules/docs-search/docs-search.component';\nimport { DocsSearchMetadata, DocsSearchSection } from '../../molecules/docs-search/types';\nimport { CompanyFooterComponent } from '../../organisms/company-footer/company-footer.component';\nimport { DocsNavigationService } from '../../../services/docs/docs-navigation.service';\nimport { DocsShellMetadata, DocsShellSection } from './types';\n\naddIcons({\n  chevronDownOutline,\n  chevronForwardOutline,\n  closeOutline,\n});\n\n/**\n * val-docs-shell\n *\n * A complete documentation shell with sidebar navigation, search, and content area.\n * Use this component as the root layout for documentation pages.\n *\n * @example\n * ```html\n * <val-docs-shell [props]=\"shellConfig\">\n *   <router-outlet></router-outlet>\n * </val-docs-shell>\n * ```\n */\n@Component({\n  selector: 'val-docs-shell',\n  standalone: true,\n  imports: [\n    CommonModule,\n    RouterModule,\n    IonSplitPane,\n    IonMenu,\n    IonHeader,\n    IonToolbar,\n    IonContent,\n    IonIcon,\n    IonMenuButton,\n    IonButtons,\n    DocsSearchComponent,\n    CompanyFooterComponent,\n  ],\n  template: `\n    <ion-split-pane contentId=\"docs-content\" when=\"lg\">\n      <ion-menu contentId=\"docs-content\" type=\"overlay\" menuId=\"docs-menu\">\n        <ion-header class=\"ion-no-border\">\n          <ion-toolbar>\n            <div class=\"sidebar-header\">\n              <a [routerLink]=\"props.logo.route || ['/']\" class=\"logo-link\" [attr.aria-label]=\"props.logo.alt\">\n                @if (props.logo.cssVariable) {\n                  <span\n                    class=\"sidebar-logo sidebar-logo--css-var\"\n                    role=\"img\"\n                    [attr.aria-label]=\"props.logo.alt\"\n                    [style.--logo-var]=\"'var(' + props.logo.cssVariable + ')'\"\n                    [style.width]=\"props.logo.width || '10rem'\"\n                    [style.height]=\"props.logo.height || '3rem'\"\n                  ></span>\n                } @else if (props.logo.src) {\n                  <img\n                    [src]=\"props.logo.src\"\n                    [alt]=\"props.logo.alt\"\n                    class=\"sidebar-logo sidebar-logo--img\"\n                    [style.width]=\"props.logo.width || '10rem'\"\n                    [style.height]=\"props.logo.height || '3rem'\"\n                  />\n                }\n              </a>\n              <button\n                type=\"button\"\n                class=\"sidebar-close\"\n                (click)=\"closeMenu()\"\n                aria-label=\"Close menu\"\n              >\n                <ion-icon name=\"close-outline\"></ion-icon>\n              </button>\n            </div>\n          </ion-toolbar>\n        </ion-header>\n\n        <ion-content>\n          <!-- Search -->\n          @if (props.search) {\n            <div class=\"search-wrapper\">\n              <val-docs-search\n                [props]=\"searchProps()\"\n                (navigate)=\"onNavigate($event)\"\n              ></val-docs-search>\n            </div>\n          }\n\n          <nav class=\"sidebar-nav\">\n            @for (section of sectionsState(); track section.key) {\n              <div class=\"nav-section\">\n                <button\n                  type=\"button\"\n                  class=\"nav-section__header\"\n                  (click)=\"toggleSection(section)\"\n                >\n                  @if (section.icon) {\n                    <ion-icon [name]=\"section.icon\"></ion-icon>\n                  }\n                  <span>{{ section.title }}</span>\n                  <ion-icon\n                    [name]=\"section.expanded ? 'chevron-down-outline' : 'chevron-forward-outline'\"\n                    class=\"nav-chevron\"\n                  ></ion-icon>\n                </button>\n\n                @if (section.expanded) {\n                  <ul class=\"nav-links\">\n                    @for (link of section.children; track link.label) {\n                      <li>\n                        <a\n                          [routerLink]=\"link.route\"\n                          routerLinkActive=\"active\"\n                          (click)=\"closeMenu()\"\n                        >\n                          {{ link.label }}\n                          @if (link.badge) {\n                            <span\n                              class=\"nav-badge\"\n                              [class.nav-badge--success]=\"link.badgeColor === 'success'\"\n                            >{{ link.badge }}</span>\n                          }\n                        </a>\n                      </li>\n                    }\n                  </ul>\n                }\n              </div>\n            }\n          </nav>\n        </ion-content>\n      </ion-menu>\n\n      <div class=\"ion-page\" id=\"docs-content\">\n        <ion-header class=\"ion-no-border mobile-header\">\n          <ion-toolbar>\n            <ion-buttons slot=\"start\">\n              <a [routerLink]=\"props.logo.route || ['/']\" class=\"mobile-logo\" [attr.aria-label]=\"props.logo.alt\">\n                @if (props.mobileLogo?.cssVariable) {\n                  <span\n                    class=\"mobile-logo__icon mobile-logo__icon--css-var\"\n                    role=\"img\"\n                    [style.--logo-var]=\"'var(' + props.mobileLogo.cssVariable + ')'\"\n                    [style.width]=\"props.mobileLogo.width || '32px'\"\n                    [style.height]=\"props.mobileLogo.height || '32px'\"\n                  ></span>\n                } @else if (props.mobileLogo?.src) {\n                  <img\n                    [src]=\"props.mobileLogo.src\"\n                    [alt]=\"props.logo.alt\"\n                    class=\"mobile-logo__icon mobile-logo__icon--img\"\n                    [style.width]=\"props.mobileLogo.width || '32px'\"\n                    [style.height]=\"props.mobileLogo.height || '32px'\"\n                  />\n                }\n              </a>\n            </ion-buttons>\n            <ion-buttons slot=\"end\">\n              <ion-menu-button menu=\"docs-menu\" color=\"dark\"></ion-menu-button>\n            </ion-buttons>\n          </ion-toolbar>\n        </ion-header>\n\n        <main class=\"docs-main-scroll\">\n          <ng-content></ng-content>\n          @if (props.footer) {\n            <val-company-footer [props]=\"props.footer\"></val-company-footer>\n          }\n        </main>\n      </div>\n    </ion-split-pane>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      height: 100%;\n    }\n\n    ion-split-pane {\n      height: 100%;\n      --side-width: var(--docs-sidebar-width, 260px);\n      --side-min-width: var(--docs-sidebar-width, 260px);\n      --side-max-width: var(--docs-sidebar-width, 260px);\n    }\n\n    .sidebar-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 0rem 1rem;\n    }\n\n    .logo-link {\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n      text-decoration: none;\n      transition: opacity 0.2s ease;\n    }\n\n    .logo-link:hover {\n      opacity: 0.8;\n    }\n\n    .sidebar-logo--css-var {\n      display: block;\n      background-image: var(--logo-var);\n      background-size: contain;\n      background-repeat: no-repeat;\n      background-position: left center;\n    }\n\n    .sidebar-logo--img {\n      display: block;\n      object-fit: contain;\n    }\n\n    .sidebar-close {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 2.5rem;\n      height: 2.5rem;\n      border: none;\n      background: transparent;\n      border-radius: 50%;\n      cursor: pointer;\n      color: var(--ion-text-color, #333);\n      transition: background 0.2s ease;\n    }\n\n    .sidebar-close:hover {\n      background: rgba(0, 0, 0, 0.05);\n    }\n\n    .sidebar-close ion-icon {\n      font-size: 1.5rem;\n    }\n\n    @media (min-width: 992px) {\n      .sidebar-close {\n        display: none;\n      }\n    }\n\n    .search-wrapper {\n      padding: 0.75rem 1rem;\n      border-bottom: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    .sidebar-nav {\n      padding: 0.5rem 0;\n    }\n\n    .nav-section__header {\n      display: flex;\n      align-items: center;\n      gap: 0.5rem;\n      width: 100%;\n      padding: 0.75rem 1rem;\n      border: none;\n      background: transparent;\n      font-size: 0.75rem;\n      font-weight: 600;\n      text-transform: uppercase;\n      letter-spacing: 0.5px;\n      color: #666;\n      cursor: pointer;\n    }\n\n    .nav-section__header:hover {\n      color: var(--ion-text-color);\n    }\n\n    .nav-section__header span {\n      flex: 1;\n      text-align: left;\n    }\n\n    .nav-chevron {\n      font-size: 0.875rem;\n    }\n\n    .nav-links {\n      list-style: none;\n      margin: 0;\n      padding: 0;\n    }\n\n    .nav-links a {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 0.5rem 1rem 0.5rem 2.5rem;\n      font-size: 0.875rem;\n      color: #555;\n      text-decoration: none;\n      border-left: 2px solid transparent;\n    }\n\n    .nav-links a:hover {\n      color: var(--ion-text-color);\n      background: rgba(0, 0, 0, 0.03);\n    }\n\n    .nav-links a.active {\n      color: var(--ion-text-color);\n      font-weight: 500;\n      background: rgba(0, 0, 0, 0.05);\n      border-left-color: var(--ion-color-primary);\n    }\n\n    .nav-badge {\n      font-size: 0.625rem;\n      font-weight: 500;\n      text-transform: uppercase;\n      padding: 0.125rem 0.375rem;\n      border-radius: 4px;\n      background: rgba(0, 0, 0, 0.04);\n      color: #888;\n    }\n\n    .nav-badge--success {\n      background: #e8f5e9;\n      color: #2e7d32;\n    }\n\n    .docs-main-scroll {\n      flex: 1;\n      overflow-y: auto;\n      background: var(--ion-background-color);\n    }\n\n    ion-menu {\n      --width: 100%;\n      --max-width: 100%;\n      --background: var(--ion-background-color);\n      border-right: 1px solid var(--ion-border-color, #e0e0e0);\n    }\n\n    /* Mobile logo styles */\n    .mobile-logo {\n      display: flex;\n      align-items: center;\n      padding: 0 0.5rem;\n      text-decoration: none;\n    }\n\n    .mobile-logo__icon {\n      display: block;\n    }\n\n    .mobile-logo__icon--css-var {\n      background-image: var(--logo-var);\n      background-size: contain;\n      background-repeat: no-repeat;\n      background-position: center;\n    }\n\n    .mobile-logo__icon--img {\n      object-fit: contain;\n    }\n\n    @media (min-width: 992px) {\n      ion-menu {\n        --width: var(--docs-sidebar-width, 260px);\n        --max-width: var(--docs-sidebar-width, 260px);\n      }\n\n      .mobile-header {\n        display: none;\n      }\n    }\n\n    #docs-content {\n      display: flex;\n      flex-direction: column;\n    }\n\n    /* Dark mode */\n    :host-context(.dark) .nav-badge,\n    :host-context([color-scheme=\"dark\"]) .nav-badge {\n      background: rgba(255, 255, 255, 0.06);\n      color: #999;\n    }\n\n    :host-context(.dark) .nav-badge--success,\n    :host-context([color-scheme=\"dark\"]) .nav-badge--success {\n      background: rgba(46, 125, 50, 0.2);\n      color: #81c784;\n    }\n\n    :host-context(.dark) .sidebar-close:hover,\n    :host-context([color-scheme=\"dark\"]) .sidebar-close:hover {\n      background: rgba(255, 255, 255, 0.1);\n    }\n  `],\n})\nexport class DocsShellComponent {\n  private menuCtrl = inject(MenuController);\n  private docsNav = inject(DocsNavigationService);\n\n  @Input() props: DocsShellMetadata = {\n    logo: { alt: 'Logo' },\n    sections: [],\n  };\n\n  @Output() navigate = new EventEmitter<string[]>();\n\n  // Internal state for expanded sections\n  private _sectionsState = signal<DocsShellSection[]>([]);\n\n  sectionsState = computed(() => {\n    // Initialize from props if empty\n    if (this._sectionsState().length === 0 && this.props.sections.length > 0) {\n      return this.props.sections.map(s => ({\n        ...s,\n        expanded: s.expanded ?? true,\n      }));\n    }\n    return this._sectionsState().length > 0 ? this._sectionsState() : this.props.sections;\n  });\n\n  searchProps = computed<DocsSearchMetadata>(() => ({\n    placeholder: this.props.search?.placeholder || 'Search...',\n    showShortcut: this.props.search?.showShortcut ?? true,\n    sections: this.buildSearchSections(),\n  }));\n\n  ngOnChanges(): void {\n    // Update sections state when props change\n    if (this.props.sections.length > 0) {\n      this._sectionsState.set(\n        this.props.sections.map(s => ({\n          ...s,\n          expanded: s.expanded ?? true,\n        }))\n      );\n    }\n  }\n\n  toggleSection(section: DocsShellSection): void {\n    this._sectionsState.update(sections =>\n      sections.map(s =>\n        s.key === section.key ? { ...s, expanded: !s.expanded } : s\n      )\n    );\n  }\n\n  async closeMenu(): Promise<void> {\n    await this.menuCtrl.close('docs-menu');\n    this.docsNav.scrollToTop();\n  }\n\n  onNavigate(route: string[]): void {\n    this.navigate.emit(route);\n    this.docsNav.navigateAndScroll(route);\n    this.menuCtrl.close('docs-menu');\n  }\n\n  private buildSearchSections(): DocsSearchSection[] {\n    return this.props.sections.map(section => ({\n      title: section.title,\n      items: section.children.map(child => ({\n        label: child.label,\n        route: child.route,\n        description: `${section.title} > ${child.label}`,\n      })),\n    }));\n  }\n}\n","/**\n * Shared Company Footer Configuration\n *\n * This configuration is shared across all Valtech products:\n * - ui-docs\n * - showcase\n * - myvaltech (company website)\n *\n * When links or social profiles change, update here and publish a new version.\n */\nimport type { CompanyFooterMetadata } from '../components/organisms/company-footer/types';\nimport type { LegalLinkService } from '../services/legal-link/legal-link.service';\n\n/**\n * Social media links for Valtech\n */\nexport const VALTECH_SOCIAL_LINKS = [\n  {\n    icon: 'logo-facebook',\n    url: 'https://m.facebook.com/profile.php?id=61557610734470',\n    name: 'Facebook',\n  },\n  { icon: 'logo-instagram', url: 'https://www.instagram.com/valtechltda/', name: 'Instagram' },\n  { icon: 'logo-linkedin', url: 'https://www.linkedin.com/company/valtechltda/', name: 'LinkedIn' },\n  { icon: 'logo-twitter', url: 'https://twitter.com/valtechltda', name: 'Twitter' },\n  {\n    icon: 'logo-youtube',\n    url: 'https://www.youtube.com/channel/UCuF4FGdTiUXxANx1HS4Wi5Q',\n    name: 'YouTube',\n  },\n  { icon: 'logo-tiktok', url: 'https://www.tiktok.com/@valtechltda', name: 'TikTok' },\n];\n\n/**\n * Footer logo configuration\n * Uses CSS variable for automatic theme-aware logo switching\n */\nexport const VALTECH_FOOTER_LOGO = {\n  logoCssVariable: '--main-logo',\n  logoAlt: 'Valtech Logo',\n  logoRoute: '/',\n};\n\n/**\n * Company link definition\n */\nexport interface CompanyLink {\n  /** i18n key for the link text */\n  key: string;\n  /** URL path (relative) or absolute URL */\n  url: string;\n  /**\n   * Hint for `LegalLinkService` about which app owns this link in a multi-app factory:\n   * - `'legal'` — canonical legal content (terms, privacy, …) — lives on main site\n   * - `'site'`  — marketing/info pages (about, blog, …) — lives on main site\n   * - `'support'` — support/help — typically per-app (each product has own support)\n   *\n   * In satellite apps with `provideValtechLegal({ baseUrl })`, links with kind\n   * `'legal'` or `'site'` get rewritten to the main site URL.\n   */\n  kind?: 'legal' | 'site' | 'support';\n  /** Force opens in a new tab. Resolver may also set this when rewriting cross-origin. */\n  external?: boolean;\n}\n\n/**\n * Company links organized by section\n */\nexport const VALTECH_COMPANY_LINKS = {\n  // Links legales con `external: true` → abren en tab nueva (target=_blank).\n  legal: [\n    { key: 'aboutUs', url: '/about', kind: 'site', external: false },\n    { key: 'privacyPolicy', url: '/legal/privacy', kind: 'legal', external: true },\n    { key: 'termsConditions', url: '/legal/terms', kind: 'legal', external: true },\n    { key: 'cookiesPolicy', url: '/legal/cookies', kind: 'legal', external: true },\n    { key: 'legalNotice', url: '/legal/legal-notice', kind: 'legal', external: true },\n  ] as CompanyLink[],\n  support: [\n    { key: 'contactSupport', url: '/contact', kind: 'support', external: false },\n    // FAQ — página dedicada `/faq` (kind 'site': vive en el sitio corporativo;\n    // en apps satellite se reescribe al main site vía LegalLinkService).\n    { key: 'faq', url: '/faq', kind: 'site', external: false },\n    { key: 'feedback', url: '/feedback', kind: 'support', external: false },\n  ] as CompanyLink[],\n};\n\n/**\n * i18n keys for the footer (Layout namespace)\n * These should be registered in each app's i18n config\n */\nexport const VALTECH_FOOTER_I18N = {\n  es: {\n    // Footer titles\n    footerLeftTitle: 'Hablemos',\n    footerRightTitle: 'Soporte',\n    // Legal links\n    aboutUs: 'Nosotros',\n    privacyPolicy: 'Política de privacidad',\n    termsConditions: 'Términos y condiciones',\n    cookiesPolicy: 'Política de cookies',\n    legalNotice: 'Aviso legal',\n    // Support links\n    contactSupport: 'Contactar a soporte',\n    faq: 'Preguntas frecuentes',\n    feedback: 'Feedback',\n    // Copyright - {year} is replaced with current year\n    copyrightText:\n      '© {year}, Soluciones Valtech Ltda. o sus empresas afiliadas. Todos los derechos reservados.',\n  },\n  en: {\n    // Footer titles\n    footerLeftTitle: \"Let's talk\",\n    footerRightTitle: 'Support',\n    // Legal links\n    aboutUs: 'About Us',\n    privacyPolicy: 'Privacy Policy',\n    termsConditions: 'Terms & Conditions',\n    cookiesPolicy: 'Cookie Policy',\n    legalNotice: 'Legal Notice',\n    // Support links\n    contactSupport: 'Contact Support',\n    faq: 'FAQ',\n    feedback: 'Feedback',\n    // Copyright - {year} is replaced with current year\n    copyrightText: '© {year}, Soluciones Valtech Ltda. or its affiliates. All rights reserved.',\n  },\n};\n\n/**\n * Default language selector configuration for footer\n */\nexport const VALTECH_LANGUAGE_SELECTOR = {\n  mode: 'default' as const,\n  showFlags: true,\n  showLabel: false,\n  fill: 'outline' as const,\n  size: 'default' as const,\n};\n\n/**\n * Optional URL resolver applied per link (e.g. `LegalLinkService.resolve.bind(svc)`).\n * Returns `{ url, external? }` to allow cross-origin rewrites.\n */\nexport type CompanyLinkResolver = (link: CompanyLink) => { url: string; external?: boolean };\n\n/**\n * Helper to build footer links from company links config.\n *\n * @param links - Array of company links\n * @param t - Translation function (key: string) => string\n * @param resolver - Optional resolver — typically `(link) => ({ url: legalLink.resolve(link.url), external: legalLink.isExternal(link.url) && (link.kind === 'legal' || link.kind === 'site') })` to point cross-app legal/site links to the main site.\n * @returns Array of link objects ready for FooterLinksMetadata\n */\nexport function buildFooterLinks(\n  links: CompanyLink[],\n  t: (key: string) => string,\n  resolver?: CompanyLinkResolver\n): Array<{\n  url: string;\n  text: string;\n  color: string;\n  token: string;\n  download: boolean;\n  hoverable: boolean;\n  target?: string;\n}> {\n  return links.map(link => {\n    const resolved = resolver ? resolver(link) : { url: link.url, external: link.external };\n    const external = resolved.external ?? link.external;\n    return {\n      url: resolved.url,\n      text: t(link.key),\n      color: 'dark',\n      token: '',\n      download: false,\n      hoverable: true,\n      ...(external ? { target: '_blank' } : {}),\n    };\n  });\n}\n\n/**\n * Translation helper for the `Layout` namespace — `(key) => translatedString`.\n * Typically `i18n.t.bind(i18n)` scoped to the footer namespace.\n */\nexport type LayoutTranslator = (key: string) => string;\n\n/**\n * Builds a `CompanyLinkResolver` that rewrites cross-app `legal`/`site` links to\n * the main brand site via `LegalLinkService`, leaving `support` (and any other)\n * links untouched.\n *\n * Satellite apps (showcase, sigify, …) wire `provideValtechSite(env)` so that\n * `legal`/`site` links resolve to the canonical main-site URLs; `support` links\n * stay per-app. This is the generic half of an app's footer resolver — apps that\n * need extra per-link overrides (e.g. redirecting `/feedback` to an authed route)\n * compose this with their own logic.\n *\n * @param legal Injected `LegalLinkService` (no-op when running as the main site).\n * @param locale Getter for the active locale (e.g. `() => i18n.lang()`) — appended\n *   as `?lang=` when the resolved URL is cross-origin.\n *\n * @example\n * const base = buildLegalLinkResolver(legal, () => i18n.lang());\n * const resolver: CompanyLinkResolver = (link) =>\n *   link.url === '/feedback' ? { url: '/app/feedback', external: false } : base(link);\n */\nexport function buildLegalLinkResolver(\n  legal: LegalLinkService,\n  locale: () => string\n): CompanyLinkResolver {\n  return (link: CompanyLink) => {\n    const shouldRewrite = link.kind === 'legal' || link.kind === 'site';\n    return {\n      url: shouldRewrite ? legal.resolve(link.url, { locale: locale() }) : link.url,\n      external: link.external || (shouldRewrite && legal.isExternal(link.url)),\n    };\n  };\n}\n\n/**\n * Builds the shared `CompanyFooterMetadata` used across Valtech apps (login,\n * legal, public landing, …) so the footer stays consistent. Assembles the\n * standard left/right link sections, logo, social links and language selector\n * from the shared config.\n *\n * Call from a `computed()` that reads the active language for reactivity.\n *\n * @param t Translation helper for the `Layout` namespace.\n * @param linkResolver Optional resolver applied to every footer link — typically\n *   `buildLegalLinkResolver(...)` (or an app wrapper) to point `legal`/`site`\n *   links at the main site when running as a satellite app.\n */\nexport function buildCompanyFooterProps(\n  t: LayoutTranslator,\n  linkResolver?: CompanyLinkResolver\n): CompanyFooterMetadata {\n  return {\n    links: {\n      leftLinks: {\n        title: t('footerLeftTitle'),\n        size: 'small' as const,\n        links: buildFooterLinks(VALTECH_COMPANY_LINKS.legal, t, linkResolver),\n      },\n      rightLinks: {\n        title: t('footerRightTitle'),\n        size: 'small' as const,\n        links: buildFooterLinks(VALTECH_COMPANY_LINKS.support, t, linkResolver),\n      },\n      logoCssVariable: VALTECH_FOOTER_LOGO.logoCssVariable,\n      logoAlt: VALTECH_FOOTER_LOGO.logoAlt,\n      logoRoute: VALTECH_FOOTER_LOGO.logoRoute,\n      socialLinks: VALTECH_SOCIAL_LINKS,\n      languageSelector: VALTECH_LANGUAGE_SELECTOR,\n    },\n    rights: {\n      fullText: t('copyrightText'),\n      align: 'center',\n    },\n    withPadding: true,\n  };\n}\n","/**\n * Shared configuration exports\n */\nexport * from './company-footer.config';\nexport * from './site-links.config';\n","export type RequestStatus =\n  | 'pending'\n  | 'in_review'\n  | 'approved'\n  | 'rejected'\n  | 'cancelled'\n  | 'closed';\n\nexport const REQUEST_STATUSES: RequestStatus[] = [\n  'pending',\n  'in_review',\n  'approved',\n  'rejected',\n  'cancelled',\n  'closed',\n];\n\nexport interface RequestActor {\n  userId?: string;\n  name: string;\n  email: string;\n  phone?: string;\n}\n\nexport interface AppRequest {\n  id: string;\n  appId: string;\n  orgId: string;\n  type: string;\n  status: RequestStatus;\n  title: string;\n  fields: Record<string, unknown>;\n  metadata?: Record<string, unknown>;\n  tags?: string[];\n  priority?: string;\n  submitter: RequestActor;\n  assignee?: RequestActor;\n  dueAt?: string;\n  createdAt: string;\n  updatedAt: string;\n  closedAt?: string;\n}\n\nexport interface RequestComment {\n  commentId: string;\n  requestId: string;\n  author: RequestActor;\n  body: string;\n  createdAt: string;\n}\n\nexport interface FieldOption {\n  id: string;\n  name: string;\n  order: number;\n}\n\nexport interface FieldSchemaDef {\n  /** InputType enum name as string: 'TEXT', 'TEXTAREA', 'SELECT', etc. */\n  type: string;\n  name: string;\n  labelKey: string;\n  placeholder?: string;\n  required: boolean;\n  /** e.g. 'required', 'email', 'maxLength:500', 'minLength:3' */\n  validators?: string[];\n  options?: FieldOption[];\n  order: number;\n}\n\n/** Quién puede leer un tipo de solicitud (y sus solicitudes públicas). */\nexport type RequestVisibility = 'PUBLIC' | 'ORG' | 'INTERNAL';\n\nexport interface RequestTypeConfig {\n  typeId: string;\n  appId: string;\n  orgId: string;\n  labelEs: string;\n  labelEn: string;\n  fieldSchema: FieldSchemaDef[];\n  allowAnonymous: boolean;\n  /** PUBLIC: cualquiera · ORG/INTERNAL: solo miembros de la org. Default ORG. */\n  visibility?: RequestVisibility;\n  createdAt: string;\n  updatedAt: string;\n}\n\n// ── Request / Response ──\n\nexport interface CreateRequestPayload {\n  type: string;\n  title: string;\n  fields?: Record<string, unknown>;\n  tags?: string[];\n  priority?: string;\n  /** Para solicitudes anónimas */\n  submitter?: RequestActor;\n  dueAt?: string;\n}\n\nexport interface UpdateRequestPayload {\n  title?: string;\n  fields?: Record<string, unknown>;\n  tags?: string[];\n  priority?: string;\n  assignee?: RequestActor;\n  dueAt?: string;\n}\n\nexport interface TransitionPayload {\n  status: RequestStatus;\n}\n\nexport interface AddCommentPayload {\n  body: string;\n}\n\nexport interface ListRequestsParams {\n  type?: string;\n  status?: string;\n  limit?: number;\n  nextToken?: string;\n}\n\nexport interface ListRequestsResponse {\n  requests: AppRequest[];\n  nextToken?: string;\n  count: number;\n}\n\nexport interface ListCommentsResponse {\n  comments: RequestComment[];\n  count: number;\n}\n\nexport interface ListRequestTypesResponse {\n  types: RequestTypeConfig[];\n}\n\nexport interface CreateRequestTypePayload {\n  typeId?: string; // opcional: backend genera desde labelEs si no se envía\n  labelEs: string;\n  labelEn: string;\n  fieldSchema: FieldSchemaDef[];\n  allowAnonymous: boolean;\n  visibility?: RequestVisibility;\n}\n\nexport interface UpdateRequestTypePayload {\n  labelEs: string;\n  labelEn: string;\n  fieldSchema: FieldSchemaDef[];\n  allowAnonymous: boolean;\n  visibility?: RequestVisibility;\n}\n","import { Injectable, Inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport { VALTECH_AUTH_CONFIG } from '../auth/config';\nimport { ValtechAuthConfig } from '../auth/types';\nimport {\n  AppRequest,\n  RequestComment,\n  RequestTypeConfig,\n  RequestStatus,\n  CreateRequestPayload,\n  UpdateRequestPayload,\n  TransitionPayload,\n  AddCommentPayload,\n  ListRequestsParams,\n  ListRequestsResponse,\n  ListCommentsResponse,\n  ListRequestTypesResponse,\n  CreateRequestTypePayload,\n  UpdateRequestTypePayload,\n} from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class RequestService {\n  constructor(\n    @Inject(VALTECH_AUTH_CONFIG) private config: ValtechAuthConfig,\n    private http: HttpClient\n  ) {}\n\n  private get baseUrl(): string {\n    return `${this.config.apiUrl}/v2/requests`;\n  }\n\n  private get typesUrl(): string {\n    return `${this.config.apiUrl}/v2/request-types`;\n  }\n\n  // ── Requests ──\n\n  createRequest(\n    payload: CreateRequestPayload\n  ): Observable<{ requestId: string; request: AppRequest }> {\n    return this.http.post<{ requestId: string; request: AppRequest }>(this.baseUrl, payload);\n  }\n\n  createAnonymousRequest(\n    payload: CreateRequestPayload\n  ): Observable<{ requestId: string; request: AppRequest }> {\n    return this.http.post<{ requestId: string; request: AppRequest }>(\n      `${this.baseUrl}/anonymous`,\n      payload\n    );\n  }\n\n  listRequests(params?: ListRequestsParams): Observable<ListRequestsResponse> {\n    const qs = this.buildQueryString(params);\n    return this.http.get<ListRequestsResponse>(`${this.baseUrl}${qs}`);\n  }\n\n  listMyRequests(params?: ListRequestsParams): Observable<ListRequestsResponse> {\n    const qs = this.buildQueryString(params);\n    return this.http.get<ListRequestsResponse>(`${this.baseUrl}/my${qs}`);\n  }\n\n  getRequest(id: string): Observable<AppRequest> {\n    return this.http\n      .get<{ request: AppRequest }>(`${this.baseUrl}/${id}`)\n      .pipe(map(r => r.request));\n  }\n\n  updateRequest(id: string, payload: UpdateRequestPayload): Observable<AppRequest> {\n    return this.http\n      .put<{ request: AppRequest }>(`${this.baseUrl}/${id}`, payload)\n      .pipe(map(r => r.request));\n  }\n\n  transition(id: string, payload: TransitionPayload): Observable<{ status: RequestStatus }> {\n    return this.http.post<{ status: RequestStatus }>(`${this.baseUrl}/${id}/transition`, payload);\n  }\n\n  // ── Comments ──\n\n  addComment(requestId: string, payload: AddCommentPayload): Observable<RequestComment> {\n    return this.http\n      .post<{ comment: RequestComment }>(`${this.baseUrl}/${requestId}/comments`, payload)\n      .pipe(map(r => r.comment));\n  }\n\n  listComments(requestId: string): Observable<ListCommentsResponse> {\n    return this.http.get<ListCommentsResponse>(`${this.baseUrl}/${requestId}/comments`);\n  }\n\n  // ── Request Types ──\n\n  listRequestTypes(): Observable<ListRequestTypesResponse> {\n    return this.http.get<ListRequestTypesResponse>(this.typesUrl);\n  }\n\n  getRequestType(typeId: string): Observable<RequestTypeConfig> {\n    return this.http.get<RequestTypeConfig>(`${this.typesUrl}/${typeId}`);\n  }\n\n  createRequestType(payload: CreateRequestTypePayload): Observable<RequestTypeConfig> {\n    return this.http\n      .post<{ typeConfig: RequestTypeConfig }>(this.typesUrl, payload)\n      .pipe(map(r => r.typeConfig));\n  }\n\n  updateRequestType(\n    typeId: string,\n    payload: UpdateRequestTypePayload\n  ): Observable<RequestTypeConfig> {\n    return this.http\n      .put<{ typeConfig: RequestTypeConfig }>(`${this.typesUrl}/${typeId}`, payload)\n      .pipe(map(r => r.typeConfig));\n  }\n\n  deleteRequestType(typeId: string): Observable<void> {\n    return this.http.delete<void>(`${this.typesUrl}/${typeId}`);\n  }\n\n  // ── Helpers ──\n\n  private buildQueryString(params?: ListRequestsParams): string {\n    if (!params) return '';\n    const qs = new URLSearchParams();\n    if (params.type) qs.set('type', params.type);\n    if (params.status) qs.set('status', params.status);\n    if (params.limit != null) qs.set('limit', String(params.limit));\n    if (params.nextToken) qs.set('nextToken', params.nextToken);\n    const str = qs.toString();\n    return str ? `?${str}` : '';\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ValidatorFn, Validators } from '@angular/forms';\n\nimport {\n  ComponentState,\n  ComponentStates,\n  FormMetadata,\n  FormSection,\n  InputMetadata,\n  InputOption,\n  InputType,\n} from '../../components/types';\nimport { SolidDefaultBlock } from '../../components/atoms/button/factory';\nimport { I18nService } from '../i18n/i18n.service';\nimport { FieldSchemaDef } from './types';\n\n@Injectable({ providedIn: 'root' })\nexport class RequestFormBuilderService {\n  private i18n = inject(I18nService);\n\n  buildForm(\n    schema: FieldSchemaDef[],\n    i18nNamespace: string,\n    formName: string,\n    submitLabelKey: string = 'submit',\n    state: ComponentState = ComponentStates.ENABLED\n  ): FormMetadata {\n    const sorted = [...schema].sort((a, b) => a.order - b.order);\n\n    const fields: InputMetadata[] = sorted.map(def => this.buildField(def, i18nNamespace, state));\n\n    const section: FormSection = {\n      name: '',\n      order: 0,\n      fields,\n    };\n\n    return {\n      name: formName,\n      sections: [section],\n      actions: SolidDefaultBlock(this.i18n.t(submitLabelKey, i18nNamespace), 'submit'),\n      state,\n    };\n  }\n\n  private buildField(\n    def: FieldSchemaDef,\n    i18nNamespace: string,\n    state: ComponentState\n  ): InputMetadata {\n    const label = this.i18n.t(def.labelKey, i18nNamespace);\n    const placeholder = def.placeholder ? this.i18n.t(def.placeholder, i18nNamespace) : '';\n\n    const validators = this.parseValidators(def);\n\n    const errors: Record<string, string> = {};\n    if (def.required || (def.validators ?? []).includes('required')) {\n      errors['required'] = this.i18n.t('fieldRequired', '_common');\n    }\n\n    const options: InputOption[] | undefined = def.options\n      ? def.options.map(o => ({ id: o.id, name: o.name, order: o.order }))\n      : undefined;\n\n    return {\n      token: def.name,\n      name: def.name,\n      label,\n      placeholder,\n      hint: '',\n      type: this.parseInputType(def.type),\n      order: def.order,\n      validators,\n      options,\n      errors,\n      state,\n    };\n  }\n\n  private parseValidators(def: FieldSchemaDef): ValidatorFn[] {\n    const result: ValidatorFn[] = [];\n    const entries = def.validators ?? [];\n    const hasRequired = def.required || entries.includes('required');\n\n    if (hasRequired) {\n      result.push(Validators.required);\n    }\n\n    for (const entry of entries) {\n      if (entry === 'required') {\n        // already handled above\n        continue;\n      }\n      if (entry === 'email') {\n        result.push(Validators.email);\n        continue;\n      }\n      const minLengthMatch = entry.match(/^minLength:(\\d+)$/);\n      if (minLengthMatch) {\n        result.push(Validators.minLength(Number(minLengthMatch[1])));\n        continue;\n      }\n      const maxLengthMatch = entry.match(/^maxLength:(\\d+)$/);\n      if (maxLengthMatch) {\n        result.push(Validators.maxLength(Number(maxLengthMatch[1])));\n        continue;\n      }\n      const minMatch = entry.match(/^min:(\\d+)$/);\n      if (minMatch) {\n        result.push(Validators.min(Number(minMatch[1])));\n        continue;\n      }\n      const maxMatch = entry.match(/^max:(\\d+)$/);\n      if (maxMatch) {\n        result.push(Validators.max(Number(maxMatch[1])));\n        continue;\n      }\n    }\n\n    return result;\n  }\n\n  private parseInputType(typeStr: string): InputType {\n    const map: Record<string, InputType> = {\n      TEXT: InputType.TEXT,\n      TEXTAREA: InputType.TEXTAREA,\n      EMAIL: InputType.EMAIL,\n      NUMBER: InputType.NUMBER,\n      DATE: InputType.DATE,\n      SELECT: InputType.SELECT,\n      MULTI_SELECT: InputType.MULTI_SELECT,\n      RADIO: InputType.RADIO,\n      TOGGLE: InputType.TOGGLE,\n      CHECK: InputType.CHECK,\n      FILE: InputType.FILE,\n      PHONE: InputType.PHONE,\n      CURRENCY: InputType.CURRENCY,\n    };\n    return map[typeStr] ?? InputType.TEXT;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\n\nimport { FirestoreCollectionFactory } from '../firebase/firestore-collection';\nimport { FirestoreDocument } from '../firebase/types';\nimport { AppRequest, RequestTypeConfig } from './types';\n\n/**\n * Lectura de Requests / RequestTypes desde Firestore (one-shot, sin listener).\n *\n * El backend proyecta DynamoDB → Firestore (réplica de solo-lectura); el cliente\n * lee desde acá en vez de pegarle al REST, así no se expone un endpoint JSON\n * replayable y el acceso queda gobernado por las security rules. Las mutaciones\n * (create/update/transition) siguen yendo por `RequestService` (REST → backend).\n *\n * Los paths se prefijan automáticamente con `apps/{appId}/` (FirestoreService),\n * resultando en:\n *   - apps/{appId}/users/{uid}/requests\n *   - apps/{appId}/orgs/{orgId}/requests\n *   - apps/{appId}/orgs/{orgId}/requestTypes\n */\n@Injectable({ providedIn: 'root' })\nexport class RequestFirestoreService {\n  private factory = inject(FirestoreCollectionFactory);\n\n  // Las colecciones se tipan como FirestoreDocument genérico (el doc trae las\n  // claves camelCase proyectadas por el backend); casteamos al tipo de dominio.\n  // AppRequest/RequestTypeConfig no extienden FirestoreDocument porque su\n  // createdAt es string (no Date) — de ahí el cast.\n  private async read<T>(path: string): Promise<T[]> {\n    const docs = await this.factory.create<FirestoreDocument>(path).getAllOnce();\n    return docs as unknown as T[];\n  }\n\n  /** Solicitudes enviadas por el usuario (scope usuario). */\n  async listMyRequests(userId: string): Promise<AppRequest[]> {\n    if (!userId) return [];\n    return this.read<AppRequest>(`users/${userId}/requests`);\n  }\n\n  /** Solicitudes de la organización (scope staff). */\n  async listOrgRequests(orgId: string): Promise<AppRequest[]> {\n    if (!orgId) return [];\n    return this.read<AppRequest>(`orgs/${orgId}/requests`);\n  }\n\n  /** Catálogo de tipos de solicitud de la organización. */\n  async listRequestTypes(orgId: string): Promise<RequestTypeConfig[]> {\n    if (!orgId) return [];\n    return this.read<RequestTypeConfig>(`orgs/${orgId}/requestTypes`);\n  }\n}\n","import { ArticleCardMetadata } from '../../molecules/article-card/types';\n\n/**\n * Metadata for val-article-strip.\n *\n * Horizontal scroll row of article cards with an optional section header\n * and a \"see all\" link/action on the right side.\n */\nexport interface ArticleStripMetadata {\n  /** Section title shown on the left of the header */\n  title?: string;\n  /** Label for the \"see all\" link/button */\n  seeAllLabel?: string;\n  /** Internal Angular route for the \"see all\" action */\n  seeAllRoute?: string | any[];\n  /** External href for the \"see all\" action */\n  seeAllHref?: string;\n  /** Token emitted by (onSeeAll) when neither route nor href is set */\n  seeAllToken?: string;\n  /** Articles to display */\n  articles: ArticleCardMetadata[];\n  /** Fixed width of each article card. Default: '280px' */\n  cardWidth?: string;\n  /** Gap between cards. Default: '16px' */\n  gap?: string;\n}\n\n/**\n * Default values for ArticleStripMetadata.\n */\nexport const ARTICLE_STRIP_DEFAULTS: Required<Pick<ArticleStripMetadata, 'cardWidth' | 'gap'>> = {\n  cardWidth: '280px',\n  gap: '16px',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output, TemplateRef, ViewChild } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { NavigationService } from '../../../services/navigation';\nimport { ArticleCardComponent } from '../../molecules/article-card/article-card.component';\nimport { ArticleCardClickEvent } from '../../molecules/article-card/types';\nimport { HorizontalScrollComponent } from '../../atoms/horizontal-scroll/horizontal-scroll.component';\nimport { ArticleStripMetadata, ARTICLE_STRIP_DEFAULTS } from './types';\n\n/**\n * val-article-strip\n *\n * Horizontal scroll row of article cards with a section header and an optional\n * \"see all\" link/action. Reuses val-horizontal-scroll + val-article-card.\n *\n * @example\n * ```html\n * <val-article-strip\n *   [props]=\"{\n *     title: 'Latest Articles',\n *     seeAllLabel: 'View all',\n *     seeAllRoute: '/blog',\n *     articles: [...]\n *   }\"\n *   (onArticleClick)=\"openArticle($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-article-strip',\n  standalone: true,\n  imports: [CommonModule, RouterLink, HorizontalScrollComponent, ArticleCardComponent],\n  template: `\n    @if (config().title || hasSeeAll()) {\n      <div class=\"article-strip__header\">\n        @if (config().title) {\n          <h3 class=\"article-strip__title\">{{ config().title }}</h3>\n        }\n\n        @if (hasSeeAll()) {\n          <a\n            class=\"article-strip__see-all\"\n            [routerLink]=\"config().seeAllRoute ?? null\"\n            [attr.href]=\"config().seeAllHref ?? null\"\n            (click)=\"handleSeeAll($event)\"\n          >\n            {{ config().seeAllLabel }}\n          </a>\n        }\n      </div>\n    }\n\n    <val-horizontal-scroll\n      [items]=\"config().articles\"\n      [itemTemplate]=\"cardTpl\"\n      [props]=\"{ gap: config().gap }\"\n    ></val-horizontal-scroll>\n\n    <ng-template #cardTpl let-article>\n      <div [style.width]=\"config().cardWidth\" [style.flex-shrink]=\"0\">\n        <val-article-card [props]=\"article\" (onClick)=\"onArticleClick.emit($event)\"></val-article-card>\n      </div>\n    </ng-template>\n  `,\n  styleUrls: ['./article-strip.component.scss'],\n})\nexport class ArticleStripComponent {\n  private navigation = inject(NavigationService);\n\n  /** Component configuration */\n  readonly props = input<Partial<ArticleStripMetadata>>({ articles: [] });\n\n  /** Emitted when the \"see all\" link/button is clicked */\n  @Output() onSeeAll = new EventEmitter<string | undefined>();\n\n  /** Re-emits the onClick event from each article card */\n  @Output() onArticleClick = new EventEmitter<ArticleCardClickEvent>();\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...ARTICLE_STRIP_DEFAULTS,\n        articles: [],\n        ...this.props(),\n      }) as ArticleStripMetadata & typeof ARTICLE_STRIP_DEFAULTS\n  );\n\n  hasSeeAll = computed(\n    () =>\n      !!(\n        this.config().seeAllLabel &&\n        (this.config().seeAllRoute || this.config().seeAllHref || this.config().seeAllToken)\n      )\n  );\n\n  handleSeeAll(event: MouseEvent): void {\n    const cfg = this.config();\n    if (cfg.seeAllHref) {\n      event.preventDefault();\n      this.navigation.openInNewTab(cfg.seeAllHref);\n    }\n    this.onSeeAll.emit(cfg.seeAllToken);\n  }\n}\n","/**\n * A single key-value pair shown in the right column of val-info-card.\n */\nexport interface InfoCardKeyValue {\n  /** Label (shown in muted color) */\n  label: string;\n  /** Value (shown in bold) */\n  value: string;\n  /** Optional token for click identification */\n  token?: string;\n}\n\n/**\n * Metadata for val-info-card.\n *\n * Card with icon + overtitle + title + subtitle on the left side, and a list\n * of key-value pairs on the right side. Inspired by npm \"Provenance\" / metadata\n * panels. Two-column layout on desktop, stacked on mobile.\n */\nexport interface InfoCardMetadata {\n  /** ion-icon name */\n  icon?: string;\n  /** Icon color (Ionic color name or CSS color). Default: 'primary' */\n  iconColor?: string;\n  /** Small label above the title */\n  overtitle?: string;\n  /** Main title */\n  title: string;\n  /** Subtitle below the title */\n  subtitle?: string;\n  /** Key-value pairs shown in the right column */\n  keyValues?: InfoCardKeyValue[];\n  /** Show border. Default: true */\n  bordered?: boolean;\n  /** Show shadow. Default: false */\n  shadowed?: boolean;\n  /** Card padding. Default: '1.5rem' */\n  padding?: string;\n  /** Card border radius. Default: '16px' */\n  borderRadius?: string;\n}\n\n/**\n * Default values for InfoCardMetadata.\n */\nexport const INFO_CARD_DEFAULTS: Required<\n  Pick<InfoCardMetadata, 'iconColor' | 'bordered' | 'shadowed' | 'padding' | 'borderRadius'>\n> = {\n  iconColor: 'primary',\n  bordered: true,\n  shadowed: false,\n  padding: '1.5rem',\n  borderRadius: '16px',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { InfoCardMetadata, INFO_CARD_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\n/**\n * val-info-card\n *\n * Card with icon + overtitle + title + subtitle on the left side, and a list\n * of key-value pairs (label: value) on the right side. Inspired by npm's\n * \"Provenance\" / metadata panel style.\n *\n * Two-column layout on desktop, stacked single-column on mobile.\n *\n * Presentational — pass already-resolved strings.\n *\n * @example\n * ```html\n * <val-info-card\n *   [props]=\"{\n *     icon: 'cube-outline',\n *     title: 'valtech-components',\n *     subtitle: 'v2.0.962',\n *     keyValues: [\n *       { label: 'License', value: 'MIT' },\n *       { label: 'Downloads', value: '1.2M' }\n *     ]\n *   }\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-info-card',\n  standalone: true,\n  imports: [CommonModule, IonIcon],\n  template: `\n    <div\n      class=\"info-card\"\n      [class.info-card--bordered]=\"config().bordered\"\n      [class.info-card--shadowed]=\"config().shadowed\"\n      [style.padding]=\"config().padding\"\n      [style.border-radius]=\"config().borderRadius\"\n    >\n      <div class=\"info-card__left\">\n        @if (config().icon) {\n          <ion-icon class=\"info-card__icon\" [name]=\"config().icon\" [style.color]=\"getIconColor()\"></ion-icon>\n        }\n\n        @if (config().overtitle) {\n          <span class=\"info-card__overtitle\">{{ config().overtitle }}</span>\n        }\n\n        <h3 class=\"info-card__title\">{{ config().title }}</h3>\n\n        @if (config().subtitle) {\n          <p class=\"info-card__subtitle\">{{ config().subtitle }}</p>\n        }\n      </div>\n\n      @if (config().keyValues?.length) {\n        <div class=\"info-card__right\">\n          @for (kv of config().keyValues; track $index) {\n            <div class=\"info-card__kv\">\n              <span class=\"info-card__kv-label\">{{ kv.label }}</span>\n              <span class=\"info-card__kv-value\">{{ kv.value }}</span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./info-card.component.scss'],\n})\nexport class InfoCardComponent {\n  /** Component configuration */\n  readonly props = input<Partial<InfoCardMetadata>>({} as Partial<InfoCardMetadata>);\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...INFO_CARD_DEFAULTS,\n        ...this.props(),\n      }) as InfoCardMetadata & typeof INFO_CARD_DEFAULTS\n  );\n\n  getIconColor(): string {\n    const color = this.config().iconColor;\n    if (!color) return `var(--ion-color-primary)`;\n    return IONIC_COLORS.includes(color) ? `var(--ion-color-${color})` : color;\n  }\n}\n","import { StatsBarMetadata } from '../stats-bar/types';\n\n/**\n * A discrete action button shown in the top-right corner of val-metric-card.\n */\nexport interface MetricCardAction {\n  /** ion-icon name */\n  icon: string;\n  /** Token identifier emitted by (onAction) */\n  token: string;\n  /** Whether the action button is disabled */\n  disabled?: boolean;\n}\n\n/**\n * Metadata for val-metric-card.\n *\n * Card with title + optional info link + description + horizontal stats row\n * (val-stats-bar) + a discrete action button in the top-right corner.\n */\nexport interface MetricCardMetadata {\n  /** Card title */\n  title: string;\n  /** Text for the info link next to the title */\n  infoLabel?: string;\n  /** External href for the info link */\n  infoHref?: string;\n  /** Internal route for the info link */\n  infoRoute?: string | any[];\n  /** Description / subtitle below the title */\n  description?: string;\n  /** Stats to display using val-stats-bar */\n  stats?: StatsBarMetadata;\n  /** Discrete action button in top-right corner */\n  action?: MetricCardAction;\n  /** Show border. Default: true */\n  bordered?: boolean;\n  /** Show shadow. Default: false */\n  shadowed?: boolean;\n  /** Card padding. Default: '1.25rem 1.5rem' */\n  padding?: string;\n  /** Card border radius. Default: '16px' */\n  borderRadius?: string;\n}\n\n/**\n * Default values for MetricCardMetadata.\n */\nexport const METRIC_CARD_DEFAULTS: Required<\n  Pick<MetricCardMetadata, 'bordered' | 'shadowed' | 'padding' | 'borderRadius'>\n> = {\n  bordered: true,\n  shadowed: false,\n  padding: '1.25rem 1.5rem',\n  borderRadius: '16px',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { StatsBarComponent } from '../stats-bar/stats-bar.component';\nimport { MetricCardMetadata, METRIC_CARD_DEFAULTS } from './types';\n\n/**\n * val-metric-card\n *\n * Card with title + optional info link + description + horizontal stats row\n * (val-stats-bar) + a discrete icon action button in the top-right corner.\n *\n * Presentational — pass already-resolved strings.\n *\n * @example\n * ```html\n * <val-metric-card\n *   [props]=\"{\n *     title: 'Email Activity',\n *     description: 'Last 30 days',\n *     stats: { stats: [{ label: 'Sent', value: 1240 }, { label: 'Opens', value: 680 }] },\n *     action: { icon: 'refresh-outline', token: 'refresh' }\n *   }\"\n *   (onAction)=\"handleAction($event)\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-metric-card',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonButton, IonIcon, StatsBarComponent],\n  template: `\n    <div\n      class=\"metric-card\"\n      [class.metric-card--bordered]=\"config().bordered\"\n      [class.metric-card--shadowed]=\"config().shadowed\"\n      [style.padding]=\"config().padding\"\n      [style.border-radius]=\"config().borderRadius\"\n    >\n      <div class=\"metric-card__header\">\n        <div class=\"metric-card__header-left\">\n          <h3 class=\"metric-card__title\">{{ config().title }}</h3>\n\n          @if (config().infoLabel) {\n            <a\n              class=\"metric-card__info-link\"\n              [routerLink]=\"config().infoRoute ?? null\"\n              [attr.href]=\"config().infoHref ?? null\"\n              [attr.target]=\"config().infoHref ? '_blank' : null\"\n              [attr.rel]=\"config().infoHref ? 'noopener noreferrer' : null\"\n            >\n              {{ config().infoLabel }}\n            </a>\n          }\n        </div>\n\n        @if (config().action; as action) {\n          <ion-button\n            class=\"metric-card__action\"\n            fill=\"clear\"\n            size=\"small\"\n            [disabled]=\"action.disabled ?? false\"\n            (click)=\"onAction.emit(action.token)\"\n          >\n            <ion-icon [name]=\"action.icon\" slot=\"icon-only\"></ion-icon>\n          </ion-button>\n        }\n      </div>\n\n      @if (config().description) {\n        <p class=\"metric-card__description\">{{ config().description }}</p>\n      }\n\n      @if (config().stats; as stats) {\n        <div class=\"metric-card__stats\">\n          <val-stats-bar [props]=\"stats\"></val-stats-bar>\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./metric-card.component.scss'],\n})\nexport class MetricCardComponent {\n  /** Component configuration */\n  readonly props = input<Partial<MetricCardMetadata>>({} as Partial<MetricCardMetadata>);\n\n  /** Emitted with the token of the clicked action */\n  @Output() onAction = new EventEmitter<string>();\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...METRIC_CARD_DEFAULTS,\n        ...this.props(),\n      }) as MetricCardMetadata & typeof METRIC_CARD_DEFAULTS\n  );\n}\n","/**\n * Metadata for val-content-card.\n *\n * Generic container card with configurable padding, border radius, background\n * color and shadow. Supports ng-content for arbitrary inner content.\n */\nexport interface ContentCardMetadata {\n  /** Optional card title rendered above the content */\n  title?: string;\n  /** Optional description rendered below the title */\n  description?: string;\n  /** Background color — Ionic color name (primary…dark) or any CSS color */\n  backgroundColor?: string;\n  /** Text color — Ionic color name or any CSS color */\n  color?: string;\n  /** Card inner padding. Default: '1.5rem' */\n  padding?: string;\n  /** Card border radius. Default: '20px' */\n  borderRadius?: string;\n  /** Show border. Default: false */\n  bordered?: boolean;\n  /** Show box shadow. Default: true */\n  shadowed?: boolean;\n  /** Text alignment. Default: 'start' */\n  align?: 'start' | 'center';\n}\n\n/**\n * Default values for ContentCardMetadata.\n */\nexport const CONTENT_CARD_DEFAULTS: Required<\n  Pick<ContentCardMetadata, 'padding' | 'borderRadius' | 'bordered' | 'shadowed' | 'align'>\n> = {\n  padding: '1.5rem',\n  borderRadius: '20px',\n  bordered: false,\n  shadowed: true,\n  align: 'start',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\nimport { ContentCardMetadata, CONTENT_CARD_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\nfunction resolveColor(value: string | undefined): string | undefined {\n  if (!value) return undefined;\n  return IONIC_COLORS.includes(value) ? `var(--ion-color-${value})` : value;\n}\n\n/**\n * val-content-card\n *\n * Generic container card with configurable padding, border radius, background\n * color and shadow. Accepts arbitrary content via ng-content. Use it to wrap\n * val-article, stats, or any other content that needs a card shell.\n *\n * @example\n * ```html\n * <val-content-card [props]=\"{ title: 'Summary', shadowed: true }\">\n *   <p>Any inner content here.</p>\n * </val-content-card>\n * ```\n */\n@Component({\n  selector: 'val-content-card',\n  standalone: true,\n  imports: [CommonModule],\n  template: `\n    <div\n      class=\"content-card\"\n      [class.content-card--bordered]=\"config().bordered\"\n      [class.content-card--shadowed]=\"config().shadowed\"\n      [class.content-card--center]=\"config().align === 'center'\"\n      [style.padding]=\"config().padding\"\n      [style.border-radius]=\"config().borderRadius\"\n      [style.background-color]=\"resolvedBg()\"\n      [style.color]=\"resolvedColor()\"\n    >\n      @if (config().title) {\n        <h3 class=\"content-card__title\">{{ config().title }}</h3>\n      }\n\n      @if (config().description) {\n        <p class=\"content-card__description\">{{ config().description }}</p>\n      }\n\n      <ng-content></ng-content>\n    </div>\n  `,\n  styleUrls: ['./content-card.component.scss'],\n})\nexport class ContentCardComponent {\n  /** Component configuration */\n  readonly props = input<Partial<ContentCardMetadata>>({} as Partial<ContentCardMetadata>);\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...CONTENT_CARD_DEFAULTS,\n        ...this.props(),\n      }) as ContentCardMetadata & typeof CONTENT_CARD_DEFAULTS\n  );\n\n  resolvedBg = computed(() => resolveColor(this.config().backgroundColor));\n  resolvedColor = computed(() => resolveColor(this.config().color));\n}\n","/**\n * Metadata for val-auth-cta.\n *\n * Full-width CTA section that invites unauthenticated users to sign up or log in.\n * Supports an optional side image for desktop layouts.\n */\nexport interface AuthCtaMetadata {\n  /** Small label above the title (e.g. \"¡Únete gratis!\") */\n  eyebrow?: string;\n  /** Main heading */\n  title: string;\n  /** Supporting paragraph below the title */\n  subtitle?: string;\n  /** Label for the login button. Falls back to i18n key AuthCta.login */\n  loginLabel?: string;\n  /** Label for the register button. Falls back to i18n key AuthCta.register */\n  registerLabel?: string;\n  /** Internal route for the login button */\n  loginRoute?: string | any[];\n  /** External href for the login button */\n  loginHref?: string;\n  /** Internal route for the register button */\n  registerRoute?: string | any[];\n  /** External href for the register button */\n  registerHref?: string;\n  /** Decorative image shown to the right (desktop) */\n  image?: string;\n  /** Alt text for the image */\n  imageAlt?: string;\n  /** Background color — Ionic color name or any CSS color */\n  backgroundColor?: string;\n  /** Content alignment. Default: 'center' */\n  align?: 'start' | 'center';\n  /** Border radius of the wrapper. Default: '0' */\n  borderRadius?: string;\n  /** Inner padding. Default: '3rem 1.5rem' */\n  padding?: string;\n}\n\n/**\n * Default values for AuthCtaMetadata.\n */\nexport const AUTH_CTA_DEFAULTS: Required<\n  Pick<AuthCtaMetadata, 'align' | 'borderRadius' | 'padding'>\n> = {\n  align: 'center',\n  borderRadius: '0',\n  padding: '3rem 1.5rem',\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, EventEmitter, inject, input, Output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { IonButton } from '@ionic/angular/standalone';\nimport { I18nService } from '../../../services/i18n';\nimport { AuthCtaMetadata, AUTH_CTA_DEFAULTS } from './types';\n\nconst IONIC_COLORS = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];\n\nconst AUTH_CTA_I18N = {\n  es: { login: 'Iniciar sesión', register: 'Registrarse' },\n  en: { login: 'Log in', register: 'Sign up' },\n};\n\n/**\n * val-auth-cta\n *\n * Full-width CTA section inviting unauthenticated users to sign up or log in.\n * Desktop: text on the left, optional image on the right.\n * Mobile: stacked, image below text.\n *\n * Auto-registers its own i18n defaults (AuthCta namespace) so there are never\n * missing keys, even if the consumer does not register them.\n *\n * @example\n * ```html\n * <val-auth-cta\n *   [props]=\"{\n *     title: 'Join Valtech today',\n *     subtitle: 'The platform built for teams that ship.',\n *     loginRoute: '/login',\n *     registerRoute: '/register'\n *   }\"\n *   (onLogin)=\"openLogin()\"\n *   (onRegister)=\"openRegister()\"\n * />\n * ```\n */\n@Component({\n  selector: 'val-auth-cta',\n  standalone: true,\n  imports: [CommonModule, RouterLink, IonButton],\n  template: `\n    <div\n      class=\"auth-cta\"\n      [class.auth-cta--center]=\"config().align === 'center'\"\n      [class.auth-cta--has-image]=\"!!config().image\"\n      [style.padding]=\"config().padding\"\n      [style.border-radius]=\"config().borderRadius\"\n      [style.background-color]=\"resolvedBg()\"\n    >\n      <div class=\"auth-cta__text\">\n        @if (config().eyebrow) {\n          <span class=\"auth-cta__eyebrow\">{{ config().eyebrow }}</span>\n        }\n\n        <h2 class=\"auth-cta__title\">{{ config().title }}</h2>\n\n        @if (config().subtitle) {\n          <p class=\"auth-cta__subtitle\">{{ config().subtitle }}</p>\n        }\n\n        <div class=\"auth-cta__actions\">\n          <ion-button\n            class=\"auth-cta__btn-register\"\n            fill=\"solid\"\n            color=\"dark\"\n            shape=\"round\"\n            [routerLink]=\"config().registerRoute ?? null\"\n            [attr.href]=\"config().registerHref ?? null\"\n            (click)=\"onRegister.emit()\"\n          >\n            {{ registerLabel() }}\n          </ion-button>\n\n          <ion-button\n            class=\"auth-cta__btn-login\"\n            fill=\"outline\"\n            color=\"dark\"\n            shape=\"round\"\n            [routerLink]=\"config().loginRoute ?? null\"\n            [attr.href]=\"config().loginHref ?? null\"\n            (click)=\"onLogin.emit()\"\n          >\n            {{ loginLabel() }}\n          </ion-button>\n        </div>\n      </div>\n\n      @if (config().image) {\n        <div class=\"auth-cta__image-wrap\">\n          <img class=\"auth-cta__image\" [src]=\"config().image\" [alt]=\"config().imageAlt ?? ''\" loading=\"lazy\" />\n        </div>\n      }\n    </div>\n  `,\n  styleUrls: ['./auth-cta.component.scss'],\n})\nexport class AuthCtaComponent {\n  private i18n = inject(I18nService);\n\n  /** Component configuration */\n  readonly props = input<Partial<AuthCtaMetadata>>({} as Partial<AuthCtaMetadata>);\n\n  /** Emitted when the login button is clicked */\n  @Output() onLogin = new EventEmitter<void>();\n\n  /** Emitted when the register button is clicked */\n  @Output() onRegister = new EventEmitter<void>();\n\n  constructor() {\n    if (!this.i18n.hasNamespace('AuthCta')) {\n      this.i18n.registerContent('AuthCta', AUTH_CTA_I18N);\n    }\n  }\n\n  /** Merged configuration with defaults */\n  config = computed(\n    () =>\n      ({\n        ...AUTH_CTA_DEFAULTS,\n        ...this.props(),\n      }) as AuthCtaMetadata & typeof AUTH_CTA_DEFAULTS\n  );\n\n  loginLabel = computed(() => this.config().loginLabel ?? this.i18n.t('AuthCta.login'));\n  registerLabel = computed(() => this.config().registerLabel ?? this.i18n.t('AuthCta.register'));\n\n  resolvedBg = computed(() => {\n    const bg = this.config().backgroundColor;\n    if (!bg) return undefined;\n    return IONIC_COLORS.includes(bg) ? `var(--ion-color-${bg})` : bg;\n  });\n}\n","/*\n * Public API Surface of valtech-components\n */\n\n// Version\nexport * from './lib/version';\n\n// Directives\nexport * from './lib/directives/has-permission.directive';\n\nexport * from './lib/components/atoms/avatar/avatar.component';\nexport * from './lib/components/atoms/avatar/types';\nexport * from './lib/components/atoms/box/box.component';\nexport * from './lib/components/atoms/box/types';\nexport * from './lib/components/atoms/glow/glow.component';\nexport * from './lib/components/atoms/glow/types';\nexport * from './lib/components/atoms/container/container.component';\nexport * from './lib/components/atoms/container/types';\nexport * from './lib/components/atoms/button/button.component';\nexport * from './lib/components/atoms/button/factory';\nexport * from './lib/components/atoms/display/display.component';\nexport * from './lib/components/atoms/display/types';\nexport * from './lib/components/atoms/divider/divider.component';\nexport * from './lib/components/atoms/divider/types';\nexport * from './lib/components/atoms/href/href.component';\nexport * from './lib/components/atoms/href/types';\nexport * from './lib/components/atoms/icon/icon.component';\nexport * from './lib/components/atoms/icon/types';\nexport * from './lib/components/atoms/image/image.component';\nexport * from './lib/components/atoms/image/types';\nexport * from './lib/components/atoms/progress-bar/progress-bar.component';\nexport * from './lib/components/atoms/progress-bar/types';\nexport * from './lib/components/atoms/text/text.component';\nexport * from './lib/components/atoms/text/types';\nexport * from './lib/components/atoms/title/title.component';\nexport * from './lib/components/atoms/title/types';\nexport * from './lib/components/atoms/skeleton/skeleton.component';\nexport * from './lib/components/atoms/skeleton/types';\nexport * from './lib/components/atoms/progress-ring/progress-ring.component';\nexport * from './lib/components/atoms/progress-ring/types';\nexport * from './lib/components/atoms/fab/fab.component';\nexport * from './lib/components/atoms/fab/types';\nexport * from './lib/components/atoms/qr-code/qr-code.component';\nexport * from './lib/components/atoms/qr-code/types';\nexport * from './lib/components/atoms/countdown/countdown.component';\nexport * from './lib/components/atoms/countdown/types';\nexport * from './lib/components/atoms/price-tag/price-tag.component';\nexport * from './lib/components/atoms/price-tag/types';\nexport * from './lib/components/atoms/horizontal-scroll/horizontal-scroll.component';\nexport * from './lib/components/atoms/horizontal-scroll/types';\nexport * from './lib/components/atoms/rights-footer/rights-footer.component';\nexport * from './lib/components/atoms/rights-footer/types';\nexport * from './lib/components/atoms/pattern/pattern.component';\nexport * from './lib/components/atoms/pattern/types';\nexport * from './lib/components/atoms/pattern/motifs';\nexport * from './lib/components/atoms/page-waves/page-waves.component';\nexport * from './lib/components/atoms/page-waves/types';\nexport * from './lib/components/atoms/glass/glass.component';\nexport { GlassMetadata } from './lib/components/atoms/glass/types';\nexport * from './lib/components/atoms/user-avatar/user-avatar.component';\nexport { UserAvatarMetadata } from './lib/components/atoms/user-avatar/types';\n\nexport * from './lib/components/molecules/alert-box/alert-box.component';\nexport * from './lib/components/molecules/alert-box/types';\nexport * from './lib/components/molecules/button-group/button-group.component';\nexport * from './lib/components/molecules/button-group/types';\nexport * from './lib/components/molecules/card/card.component';\nexport * from './lib/components/molecules/card/types';\nexport * from './lib/components/molecules/check-input/check-input.component';\nexport * from './lib/components/molecules/checkbox-radio-input/checkbox-radio-input.component';\nexport * from './lib/components/molecules/comment-input/comment-input.component';\nexport * from './lib/components/molecules/comment-input/types';\nexport * from './lib/components/molecules/content-loader/content-loader.component';\nexport * from './lib/components/molecules/content-loader/types';\nexport * from './lib/components/molecules/date-input/date-input.component';\nexport * from './lib/components/molecules/date-input/types';\nexport * from './lib/components/molecules/email-input/email-input.component';\nexport * from './lib/components/molecules/expandable-text/expandable-text.component';\nexport * from './lib/components/molecules/expandable-text/types';\nexport * from './lib/components/molecules/file-input/file-input.component';\nexport * from './lib/components/molecules/file-input/types';\nexport * from './lib/components/molecules/hint/hint.component';\nexport * from './lib/components/molecules/hour-input/hour-input.component';\nexport * from './lib/components/molecules/language-selector/language-selector.component';\nexport * from './lib/components/molecules/language-selector/types';\nexport * from './lib/components/molecules/layered-card/layered-card.component';\nexport * from './lib/components/molecules/layered-card/types';\nexport * from './lib/components/molecules/link/link.component';\nexport * from './lib/components/molecules/link/types';\nexport * from './lib/components/molecules/links-cake/links-cake.component';\nexport * from './lib/components/molecules/links-cake/types';\nexport * from './lib/components/molecules/notes-box/notes-box.component';\nexport * from './lib/components/molecules/notes-box/types';\nexport * from './lib/components/molecules/page-links/page-links.component';\nexport * from './lib/components/molecules/page-links/types';\nexport * from './lib/components/molecules/number-input/number-input.component';\nexport * from './lib/components/molecules/number-from-to/number-from-to.component';\nexport * from './lib/components/molecules/number-from-to/types';\nexport * from './lib/components/molecules/password-input/password-input.component';\nexport * from './lib/components/molecules/pin-input/pin-input.component';\nexport * from './lib/components/molecules/pin-input/types';\nexport * from './lib/components/molecules/popover-selector/popover-selector.component';\nexport * from './lib/components/molecules/popover-selector/types';\nexport * from './lib/components/molecules/progress-status/progress-status.component';\nexport * from './lib/components/molecules/progress-status/types';\nexport * from './lib/components/molecules/prompter/prompter.component';\nexport * from './lib/components/molecules/prompter/types';\nexport * from './lib/components/molecules/radio-input/radio-input.component';\nexport * from './lib/components/molecules/range-input/range-input.component';\nexport * from './lib/components/molecules/range-input/types';\nexport * from './lib/components/molecules/searchbar/searchbar.component';\nexport * from './lib/components/molecules/select-input/select-input.component';\nexport * from './lib/components/molecules/select-search/select-search.component';\nexport * from './lib/components/molecules/segment-control/segment-control.component';\nexport * from './lib/components/molecules/segment-control/types';\nexport * from './lib/components/molecules/text-input/text-input.component';\nexport * from './lib/components/molecules/toggle-input/toggle-input.component';\nexport * from './lib/components/molecules/toggle-input/types';\nexport * from './lib/components/molecules/title-block/title-block.component';\nexport * from './lib/components/molecules/title-block/types';\nexport * from './lib/components/molecules/code-display/code-display.component';\nexport * from './lib/components/molecules/code-display/types';\nexport * from './lib/components/molecules/action-header/action-header.component';\nexport * from './lib/components/molecules/action-header/types';\nexport * from './lib/components/molecules/pill/pill.component';\nexport * from './lib/components/molecules/pill/types';\nexport * from './lib/components/molecules/command-display/command-display.component';\nexport * from './lib/components/molecules/command-display/types';\nexport * from './lib/components/molecules/info/info.component';\nexport * from './lib/components/molecules/info/types';\nexport * from './lib/components/molecules/plain-code-box/plain-code-box.component';\nexport * from './lib/components/molecules/plain-code-box/types';\nexport * from './lib/components/molecules/accordion/accordion.component';\nexport * from './lib/components/molecules/accordion/types';\nexport * from './lib/components/molecules/tabs/tabs.component';\nexport * from './lib/components/molecules/tabs/types';\nexport * from './lib/components/molecules/breadcrumb/breadcrumb.component';\nexport * from './lib/components/molecules/breadcrumb/types';\nexport * from './lib/components/molecules/pagination/pagination.component';\nexport * from './lib/components/molecules/pagination/types';\nexport * from './lib/components/molecules/stepper/stepper.component';\nexport * from './lib/components/molecules/stepper/types';\nexport * from './lib/components/molecules/chip-group/chip-group.component';\nexport * from './lib/components/molecules/chip-group/types';\nexport * from './lib/components/molecules/rating/rating.component';\nexport * from './lib/components/molecules/rating/types';\nexport * from './lib/components/molecules/timeline/timeline.component';\nexport * from './lib/components/molecules/timeline/types';\nexport * from './lib/components/molecules/stats-card/stats-card.component';\nexport * from './lib/components/molecules/stats-card/types';\nexport * from './lib/components/molecules/comment/comment.component';\nexport * from './lib/components/molecules/comment/types';\nexport * from './lib/components/molecules/multi-select-search/multi-select-search.component';\nexport * from './lib/components/molecules/quote-box/quote-box.component';\nexport * from './lib/components/molecules/textarea-input/textarea-input.component';\nexport * from './lib/components/molecules/textarea-input/types';\nexport * from './lib/components/molecules/phone-input/phone-input.component';\nexport * from './lib/components/molecules/phone-input/types';\nexport * from './lib/components/molecules/currency-input/currency-input.component';\nexport * from './lib/components/molecules/currency-input/types';\nexport * from './lib/components/molecules/date-range-input/date-range-input.component';\nexport * from './lib/components/molecules/date-range-input/types';\nexport * from './lib/components/molecules/number-stepper/number-stepper.component';\nexport * from './lib/components/molecules/number-stepper/types';\nexport * from './lib/components/molecules/share-buttons/share-buttons.component';\nexport * from './lib/components/molecules/share-buttons/types';\nexport * from './lib/components/molecules/glow-card/glow-card.component';\nexport * from './lib/components/molecules/glow-card/types';\nexport * from './lib/components/molecules/swipe-carousel/swipe-carousel.component';\nexport * from './lib/components/molecules/swipe-carousel/types';\nexport * from './lib/components/molecules/testimonial-card/testimonial-card.component';\nexport * from './lib/components/molecules/testimonial-card/types';\nexport * from './lib/components/molecules/features-list/features-list.component';\nexport * from './lib/components/molecules/features-list/types';\nexport * from './lib/components/molecules/footer-links/footer-links.component';\nexport * from './lib/components/molecules/footer-links/types';\nexport * from './lib/components/molecules/links-accordion/links-accordion.component';\nexport * from './lib/components/molecules/links-accordion/types';\nexport * from './lib/components/molecules/refresher/refresher.component';\nexport * from './lib/components/molecules/refresher/types';\nexport * from './lib/components/molecules/update-banner/update-banner.component';\nexport * from './lib/components/molecules/update-banner/types';\nexport * from './lib/components/molecules/action-card/action-card.component';\nexport * from './lib/components/molecules/action-card/types';\nexport * from './lib/components/molecules/media-object/media-object.component';\nexport * from './lib/components/molecules/media-object/types';\nexport * from './lib/components/molecules/stats-bar/stats-bar.component';\nexport * from './lib/components/molecules/stats-bar/types';\nexport * from './lib/components/molecules/article-card/article-card.component';\nexport * from './lib/components/molecules/article-card/types';\nexport * from './lib/components/molecules/cta-card/cta-card.component';\nexport * from './lib/components/molecules/cta-card/types';\nexport * from './lib/components/molecules/invitation-card/invitation-card.component';\nexport * from './lib/components/molecules/invitation-card/types';\nexport * from './lib/components/molecules/member-card/member-card.component';\nexport * from './lib/components/molecules/member-card/types';\nexport * from './lib/components/molecules/username-input/username-input.component';\nexport * from './lib/components/molecules/username-input/types';\nexport * from './lib/components/molecules/linked-providers/linked-providers.component';\nexport * from './lib/components/molecules/linked-providers/types';\nexport * from './lib/components/molecules/empty-state/empty-state.component';\nexport * from './lib/components/molecules/empty-state/factory';\nexport * from './lib/components/molecules/empty-state/types';\nexport * from './lib/components/molecules/image-crop/image-crop.component';\nexport * from './lib/components/molecules/modal-shell/modal-shell.component';\n\nexport * from './lib/components/organisms/attachment-uploader/attachment-uploader.component';\nexport * from './lib/components/organisms/attachment-uploader/types';\nexport * from './lib/components/organisms/article/article.component';\nexport * from './lib/components/organisms/article/types';\nexport * from './lib/components/organisms/banner/banner.component';\nexport * from './lib/components/organisms/banner/types';\nexport * from './lib/components/organisms/change-password-modal/change-password-modal.component';\nexport * from './lib/components/organisms/change-email-modal/change-email-modal.component';\nexport * from './lib/components/organisms/share-profile-modal/share-profile-modal.component';\nexport * from './lib/components/organisms/share-profile-modal/types';\nexport * from './lib/components/organisms/fun-modal/fun-modal.component';\nexport * from './lib/components/organisms/fun-modal/types';\nexport * from './lib/components/organisms/cookie-banner/cookie-banner.component';\nexport * from './lib/components/organisms/cookie-banner/types';\nexport * from './lib/components/organisms/debug-console/config';\nexport * from './lib/components/organisms/debug-console/debug-console.component';\nexport * from './lib/components/organisms/debug-console/types';\nexport * from './lib/components/organisms/footer/footer.component';\nexport * from './lib/components/organisms/form/factory';\nexport * from './lib/components/organisms/form/form.component';\nexport * from './lib/components/organisms/header/header.component';\nexport * from './lib/components/organisms/header/types';\nexport * from './lib/components/organisms/search-header/search-header.component';\nexport * from './lib/components/organisms/search-header/types';\nexport * from './lib/components/organisms/mfa-modal/mfa-modal.component';\nexport * from './lib/components/organisms/item-list/item-list.component';\nexport * from './lib/components/organisms/item-list/types';\nexport * from './lib/components/organisms/no-content/no-content.component';\nexport * from './lib/components/organisms/no-content/types';\nexport * from './lib/components/organisms/toolbar/toolbar.component';\nexport * from './lib/components/organisms/toolbar/types';\nexport * from './lib/components/organisms/wizard/types';\nexport * from './lib/components/organisms/wizard/wizard-footer/wizard-footer.component';\nexport * from './lib/components/organisms/wizard/wizard.component';\nexport * from './lib/components/organisms/comment-section/comment-section.component';\nexport * from './lib/components/organisms/comment-section/types';\nexport * from './lib/components/organisms/data-table/data-table.component';\nexport * from './lib/components/organisms/data-table/types';\nexport * from './lib/components/organisms/cards-carousel/cards-carousel.component';\nexport * from './lib/components/organisms/cards-carousel/types';\nexport * from './lib/components/organisms/testimonial-carousel/testimonial-carousel.component';\nexport * from './lib/components/organisms/testimonial-carousel/types';\nexport * from './lib/components/organisms/landing-split/landing-split.component';\nexport * from './lib/components/organisms/landing-split/types';\nexport * from './lib/components/organisms/landing-steps/landing-steps.component';\nexport * from './lib/components/organisms/landing-steps/types';\nexport * from './lib/components/organisms/fun-header/fun-header.component';\nexport * from './lib/components/organisms/fun-header/types';\nexport * from './lib/components/organisms/animated-terminal/animated-terminal.component';\nexport * from './lib/components/organisms/animated-terminal/types';\nexport * from './lib/components/organisms/company-footer/company-footer.component';\nexport * from './lib/components/organisms/company-footer/types';\nexport * from './lib/components/organisms/menu/menu.component';\nexport * from './lib/components/organisms/menu/types';\nexport * from './lib/components/organisms/tabbed-content/tabbed-content.component';\nexport * from './lib/components/organisms/tabbed-content/types';\nexport * from './lib/components/organisms/infinite-list/infinite-list.component';\nexport * from './lib/components/organisms/infinite-list/types';\nexport * from './lib/components/organisms/login/login.component';\nexport * from './lib/components/organisms/login/types';\nexport * from './lib/components/organisms/rotating-text/rotating-text.component';\nexport * from './lib/components/organisms/rotating-text/types';\nexport * from './lib/components/organisms/terminal-404/terminal-404.component';\nexport * from './lib/components/organisms/terminal-404/types';\nexport * from './lib/components/organisms/bottom-nav/bottom-nav.component';\nexport * from './lib/components/organisms/bottom-nav/types';\nexport * from './lib/components/organisms/avatar-upload/avatar-upload.component';\nexport * from './lib/components/organisms/avatar-upload/types';\nexport * from './lib/components/organisms/profile-view/profile-view.component';\nexport * from './lib/components/organisms/profile-view/types';\nexport * from './lib/components/organisms/profile-view/profile.routes';\nexport * from './lib/components/organisms/preferences-view/preferences-view.component';\nexport * from './lib/components/organisms/preferences-view/types';\nexport * from './lib/components/organisms/preferences-view/preferences.routes';\nexport * from './lib/components/organisms/settings-hub/settings-hub.component';\nexport * from './lib/components/organisms/settings-hub/types';\nexport * from './lib/components/organisms/settings-hub/settings-sections';\nexport * from './lib/components/organisms/settings-hub/settings.routes';\nexport * from './lib/components/organisms/security-view/security-view.component';\nexport * from './lib/components/organisms/security-view/types';\nexport * from './lib/components/organisms/security-view/security.routes';\nexport * from './lib/components/organisms/login-attempt-modal/login-attempt-modal.component';\nexport * from './lib/components/organisms/session-list-modal/session-list-modal.component';\nexport * from './lib/components/organisms/session-list-modal/types';\nexport * from './lib/components/organisms/account-view/account-view.component';\nexport * from './lib/components/organisms/account-view/types';\nexport * from './lib/components/organisms/account-view/account.routes';\nexport * from './lib/components/organisms/delete-account-modal/delete-account-modal.component';\nexport * from './lib/components/organisms/switch-org-modal/switch-org-modal.component';\nexport * from './lib/components/organisms/create-org-modal/create-org-modal.component';\nexport * from './lib/components/organisms/org-info-sheet/org-info-sheet.component';\nexport * from './lib/components/organisms/skeleton-layout/skeleton-layout.component';\nexport * from './lib/components/organisms/skeleton-layout/types';\nexport * from './lib/components/organisms/faq/faq.component';\nexport * from './lib/components/organisms/faq/types';\n\nexport * from './lib/components/templates/simple/simple.component';\nexport * from './lib/components/templates/simple/types';\nexport * from './lib/components/templates/page-template/page-template.component';\nexport * from './lib/components/templates/page-template/types';\nexport * from './lib/components/templates/page-content/page-content.component';\nexport * from './lib/components/templates/page-content/types';\nexport * from './lib/components/templates/page-wrapper/page-wrapper.component';\nexport * from './lib/components/templates/page-wrapper/types';\nexport * from './lib/components/templates/maintenance-page/maintenance-page.component';\nexport * from './lib/components/templates/maintenance-page/types';\nexport * from './lib/components/templates/auth-background/auth-background.component';\nexport * from './lib/components/templates/auth-background/types';\n\nexport * from './lib/services/download.service';\nexport * from './lib/services/icons.service';\nexport * from './lib/services/in-app-browser.service';\nexport * from './lib/services/link-processor.service';\nexport * from './lib/services/local-storage.service';\nexport * from './lib/services/locale.service';\nexport * from './lib/services/navigation';\nexport * from './lib/services/theme.service';\nexport * from './lib/services/font-size/font-size.service';\nexport * from './lib/services/toast.service';\nexport * from './lib/services/types';\n\n// Error Interpretation Helper\n// `interpretError` normaliza cualquier error (HttpErrorResponse crudo,\n// AuthError aplanado, Error de JS, valor arbitrario) a un `InterpretedError`\n// con forma estable. Función pura, sin Angular DI — usable desde cualquier app.\nexport * from './lib/services/errors';\n\nexport * from './lib/services/confirmation-dialog/confirmation-dialog.service';\nexport * from './lib/services/confirmation-dialog/types';\nexport * from './lib/services/qr-generator/qr-generator.service';\nexport * from './lib/services/qr-generator/types';\nexport * from './lib/services/modal/modal.service';\nexport * from './lib/services/modal/types';\nexport * from './lib/services/meta';\n\n// Markdown Article Services\n// Parser Markdown → ArticleMetadata + loader para docs legales en /assets/legal/{locale}/{slug}.md\n// `parseMarkdownArticle` (pure fn, no Angular deps) usable desde Node scripts.\nexport * from './lib/services/markdown-article/markdown-article-parser';\nexport * from './lib/services/markdown-article/markdown-article-parser.service';\nexport * from './lib/services/markdown-article/legal-content.service';\n// `beautifyLegalArticle` (pure fn) — post-procesa ArticleMetadata para docs markdown/legal.\nexport * from './lib/services/markdown-article/beautify-legal-article';\n\n// Legal Link Service\n// Cross-app resolver: satellite apps redirigen links legal/site al main site\nexport * from './lib/services/legal-link/legal-link.service';\n\n// Firebase Services\n// Los servicios de Firebase requieren provideValtechFirebase() en el bootstrap de la app\nexport * from './lib/services/firebase';\n\n// Auth Services\n// Los servicios de Auth requieren provideValtechAuth() en el bootstrap de la app\nexport * from './lib/services/auth';\n\n// Org Service — CRUD de organizaciones via /org\nexport { OrgService } from './lib/services/org/org.service';\nexport type {\n  Organization,\n  OrgType,\n  OrgPlan,\n  CreateOrgRequest,\n  UpdateOrgRequest,\n  InviteUserRequest,\n  InviteUserResponse,\n  LeaveOrgResponse,\n  ListMyOrgsResponse,\n  OrgResponse,\n  OrgMember,\n  ListOrgMembersResponse,\n  PendingInvitation,\n  ListPendingInvitationsResponse,\n  AcceptInvitationResponse,\n  OrgRole,\n  ListOrgRolesResponse,\n  ChangeMemberRoleRequest,\n  ChangeMemberRoleResponse,\n} from './lib/services/org/types';\n\n// i18n Services\n// Sistema de internacionalización basado en Signals\n// Requiere provideValtechI18n() en el bootstrap de la app\nexport * from './lib/services/i18n';\n\n// Preferences Service\n// Read reactivo del doc /apps/{appId}/users/{uid}/preferences/main + write via PUT backend.\n// Side-effects: cuando cambia el snapshot, aplica theme + language a ThemeService + I18nService.\nexport * from './lib/services/preferences';\n\n// Network Status Service — detecta online/offline y expone signals reactivos.\nexport * from './lib/services/network-status';\nexport * from './lib/components/molecules/network-banner/network-banner.component';\n\n// Page Refresh Service — bus del pull-to-refresh estándar.\n// La página activa registra su handler; val-page-wrapper dispara el gesto.\nexport * from './lib/services/page-refresh/page-refresh.service';\n\n// Refreshable Stream — helper estándar para vistas con datos Firestore.\n// `createRefreshableStream` soporta modo one-shot y real-time, gateado por\n// `firebaseAuthReady` (cierra la ventana de permission-denied en cold start).\nexport * from './lib/services/refreshable-stream';\n\n// App Config Services\n// Sistema de configuración remota, feature flags y detección de actualizaciones\n// Requiere provideValtechAppConfig() y provideValtechFirebase() en el bootstrap de la app\nexport * from './lib/services/app-config';\n\n// App Version Service\n// Verificación de versión PWA / web (SwUpdate + AppConfig) con hard-gate\n// Requiere provideValtechAppVersion({ currentVersion }) en el bootstrap de la app\nexport * from './lib/services/app-version';\n\n// Presets Services\n// Sistema de presets para configuración reutilizable de componentes\n// Requiere provideValtechPresets() en el bootstrap de la app\nexport * from './lib/services/presets';\n\n// Skeleton Services\n// Sistema de skeletons reutilizables con templates y directivas\n// Requiere provideValtechSkeleton() en el bootstrap de la app\nexport * from './lib/services/skeleton';\n\n// Pagination Services\n// Controladores de paginacion reutilizables\nexport * from './lib/services/pagination';\n\n// Image Services\n// Servicio para procesamiento de imágenes (compress, thumbnail, crop, validate)\nexport * from './lib/services/image';\n\n// Ads Services\n// Sistema de ads con Google Ad Manager (GPT)\n// Requiere provideValtechAds() en el bootstrap de la app\nexport * from './lib/services/ads';\nexport * from './lib/components/molecules/ad-slot/ad-slot.component';\n\n// Content Types\n// Abstracción de tipos de contenido que se transforman a ArticleMetadata\nexport * from './lib/services/content';\n\n// Content Platform — ContentService + provideValtechContent (ADR-020).\n// Modelo canónico ContentDocument (flat + Markdown), origen híbrido\n// (estático build-time + backend). Requiere provideValtechContent() en main.ts.\nexport * from './lib/services/content-platform';\n\n// Feedback Services & Components\n// Sistema de feedback de usuarios que requiere provideValtechFeedback() en el bootstrap\nexport * from './lib/services/feedback';\n\n// Donation / Support — aportes voluntarios. Requiere provideValtechDonations()\nexport * from './lib/services/donation';\nexport * from './lib/components/molecules/feedback-form/feedback-form.component';\nexport * from './lib/components/molecules/feedback-form/types';\nexport * from './lib/components/molecules/content-reaction/content-reaction.component';\nexport * from './lib/components/molecules/content-reaction/types';\n\n// Splash Screen — skeleton PWA + Capacitor native splash.\n// Requiere provideSplashScreen() en main.ts + launchAutoHide: false en capacitor.config.ts\nexport * from './lib/services/splash-screen';\n\n// Documentation Components\n// Componentes para construir documentación técnica estilo Ionic Docs\nexport * from './lib/components/templates/docs-layout/docs-layout.component';\nexport * from './lib/components/templates/docs-layout/types';\nexport * from './lib/components/organisms/docs-sidebar/docs-sidebar.component';\nexport * from './lib/components/organisms/docs-sidebar/types';\nexport * from './lib/components/organisms/docs-toc/docs-toc.component';\nexport * from './lib/components/organisms/docs-toc/types';\nexport * from './lib/components/molecules/docs-nav-links/docs-nav-links.component';\nexport * from './lib/components/molecules/docs-nav-links/types';\nexport * from './lib/components/molecules/docs-api-table/docs-api-table.component';\nexport * from './lib/components/molecules/docs-api-table/types';\nexport * from './lib/components/molecules/docs-code-example/docs-code-example.component';\nexport * from './lib/components/molecules/docs-code-example/types';\nexport * from './lib/components/molecules/docs-search/docs-search.component';\nexport * from './lib/components/molecules/docs-search/types';\nexport * from './lib/components/molecules/docs-breadcrumb/docs-breadcrumb.component';\nexport * from './lib/components/molecules/docs-breadcrumb/types';\nexport * from './lib/components/molecules/docs-callout/docs-callout.component';\nexport * from './lib/components/molecules/docs-section/docs-section.component';\nexport * from './lib/components/molecules/docs-section/types';\nexport * from './lib/components/templates/docs-page/docs-page.component';\nexport * from './lib/components/templates/docs-page/types';\nexport * from './lib/components/templates/docs-shell/docs-shell.component';\nexport * from './lib/components/templates/docs-shell/types';\nexport * from './lib/services/docs/docs-navigation.service';\n\nexport * from './lib/components/types';\nexport * from './lib/shared/pipes/process-links.pipe';\nexport * from './lib/shared/utils/datetime';\nexport * from './lib/shared/utils/dom';\nexport * from './lib/shared/utils/form-defaults';\nexport * from './lib/shared/utils/validators';\nexport * from './lib/shared/utils/styles';\nexport * from './lib/shared/utils/text';\n\n// Shared Configuration\n// Configuración compartida para todos los productos Valtech\nexport * from './lib/config';\n\n// Error handling\nexport {\n  ValtechErrorService,\n  VALTECH_NETWORK_ERROR_KEY,\n} from './lib/services/errors/valtech-error.service';\n\n// Request System — solicitudes genéricas (soporte, adopciones, reservas, etc.)\nexport * from './lib/services/requests/types';\nexport * from './lib/services/requests/request.service';\nexport * from './lib/services/requests/request-form-builder.service';\nexport * from './lib/services/requests/request-firestore.service';\n\n// Lote E\nexport * from './lib/components/organisms/article-strip/article-strip.component';\nexport * from './lib/components/organisms/article-strip/types';\nexport * from './lib/components/molecules/info-card/info-card.component';\nexport * from './lib/components/molecules/info-card/types';\nexport * from './lib/components/molecules/metric-card/metric-card.component';\nexport * from './lib/components/molecules/metric-card/types';\nexport * from './lib/components/molecules/content-card/content-card.component';\nexport * from './lib/components/molecules/content-card/types';\nexport * from './lib/components/organisms/auth-cta/auth-cta.component';\nexport * from './lib/components/organisms/auth-cta/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["LANG_STORAGE_KEY","i1","filter","take","query","i1.FirestoreService","fcmIsSupported","initializeApp","fcmGetMessaging","map","i1.FirestoreCollectionFactory","i2","i3.AuthStateService","i4.TokenService","i5.AuthStorageService","i6.AuthSyncService","i7.FirebaseService","i8.OAuthService","i7.MessagingService","i9.I18nService","i10.ConfirmationDialogService","i11","i1.IconService","i3.InAppBrowserService","i1.DownloadService","i2.IconService","i3.NavigationService","i4","resolveColor","i3","IONIC_COLORS","ToastController","switchMap","catchError","i2.AuthService","i1.AuthService","i2.OrgSwitchService","i3.HandoffService","i4.NotificationsService","i5","DEFAULT_NAMESPACE","i4.ThemeService","i5.FontSizeService","i6.I18nService","i1.ThemeService","i2.NavigationService","i2.AdsLoaderService","calculateReadingTime","debounceTime","takeUntil"],"mappings":"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"}