@ajuarezso/sui-design-system 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ajuarezso-sui-design-system.mjs","sources":["../../../projects/sui-design-system/src/lib/core/tokens.ts","../../../projects/sui-design-system/src/lib/sui-icon/sui-icon.ts","../../../projects/sui-design-system/src/lib/sui-icon/sui-icon.html","../../../projects/sui-design-system/src/lib/sui-accordion/sui-accordion.ts","../../../projects/sui-design-system/src/lib/sui-accordion/sui-accordion.html","../../../projects/sui-design-system/src/lib/sui-avatar/sui-avatar.ts","../../../projects/sui-design-system/src/lib/sui-avatar/sui-avatar.html","../../../projects/sui-design-system/src/lib/sui-activity-feed/sui-activity-feed.ts","../../../projects/sui-design-system/src/lib/sui-activity-feed/sui-activity-feed.html","../../../projects/sui-design-system/src/lib/sui-activity-filter/sui-activity-filter.ts","../../../projects/sui-design-system/src/lib/sui-activity-filter/sui-activity-filter.html","../../../projects/sui-design-system/src/lib/sui-link-button/sui-link-button.ts","../../../projects/sui-design-system/src/lib/sui-link-button/sui-link-button.html","../../../projects/sui-design-system/src/lib/sui-compact-button/sui-compact-button.ts","../../../projects/sui-design-system/src/lib/sui-compact-button/sui-compact-button.html","../../../projects/sui-design-system/src/lib/sui-alert/sui-alert.ts","../../../projects/sui-design-system/src/lib/sui-alert/sui-alert.html","../../../projects/sui-design-system/src/lib/sui-app-store-badge/sui-app-store-badge.ts","../../../projects/sui-design-system/src/lib/sui-app-store-badge/sui-app-store-badge.html","../../../projects/sui-design-system/src/lib/sui-avatar-group/sui-avatar-group.ts","../../../projects/sui-design-system/src/lib/sui-avatar-group/sui-avatar-group.html","../../../projects/sui-design-system/src/lib/sui-badge/sui-badge.ts","../../../projects/sui-design-system/src/lib/sui-badge/sui-badge.html","../../../projects/sui-design-system/src/lib/sui-banner/sui-banner.ts","../../../projects/sui-design-system/src/lib/sui-banner/sui-banner.html","../../../projects/sui-design-system/src/lib/sui-brand-logo/sui-brand-logo.ts","../../../projects/sui-design-system/src/lib/sui-brand-logo/sui-brand-logo.html","../../../projects/sui-design-system/src/lib/sui-breadcrumb-item/sui-breadcrumb-item.ts","../../../projects/sui-design-system/src/lib/sui-breadcrumb-item/sui-breadcrumb-item.html","../../../projects/sui-design-system/src/lib/sui-breadcrumbs/sui-breadcrumbs.ts","../../../projects/sui-design-system/src/lib/sui-breadcrumbs/sui-breadcrumbs.html","../../../projects/sui-design-system/src/lib/sui-button-group-item/sui-button-group-item.ts","../../../projects/sui-design-system/src/lib/sui-button-group-item/sui-button-group-item.html","../../../projects/sui-design-system/src/lib/sui-button-group/sui-button-group.ts","../../../projects/sui-design-system/src/lib/sui-button-group/sui-button-group.html","../../../projects/sui-design-system/src/lib/sui-button/sui-button.ts","../../../projects/sui-design-system/src/lib/sui-button/sui-button.html","../../../projects/sui-design-system/src/lib/sui-card/sui-card.ts","../../../projects/sui-design-system/src/lib/sui-card/sui-card.html","../../../projects/sui-design-system/src/lib/sui-checkbox/sui-checkbox.ts","../../../projects/sui-design-system/src/lib/sui-checkbox/sui-checkbox.html","../../../projects/sui-design-system/src/lib/sui-emoji/sui-emoji.ts","../../../projects/sui-design-system/src/lib/sui-emoji/sui-emoji.html","../../../projects/sui-design-system/src/lib/sui-checkbox-card/sui-checkbox-card.ts","../../../projects/sui-design-system/src/lib/sui-checkbox-card/sui-checkbox-card.html","../../../projects/sui-design-system/src/lib/sui-checkbox-label/sui-checkbox-label.ts","../../../projects/sui-design-system/src/lib/sui-checkbox-label/sui-checkbox-label.html","../../../projects/sui-design-system/src/lib/sui-circular-progress-bar/sui-circular-progress-bar.ts","../../../projects/sui-design-system/src/lib/sui-circular-progress-bar/sui-circular-progress-bar.html","../../../projects/sui-design-system/src/lib/sui-color-dot/sui-color-dot.ts","../../../projects/sui-design-system/src/lib/sui-color-dot/sui-color-dot.html","../../../projects/sui-design-system/src/lib/sui-color-picker/sui-color-picker.ts","../../../projects/sui-design-system/src/lib/sui-color-picker/sui-color-picker.html","../../../projects/sui-design-system/src/lib/sui-kbd/sui-kbd.ts","../../../projects/sui-design-system/src/lib/sui-kbd/sui-kbd.html","../../../projects/sui-design-system/src/lib/sui-command-menu-footer/sui-command-menu-footer.ts","../../../projects/sui-design-system/src/lib/sui-command-menu-footer/sui-command-menu-footer.html","../../../projects/sui-design-system/src/lib/sui-flag/sui-flag.ts","../../../projects/sui-design-system/src/lib/sui-flag/sui-flag.html","../../../projects/sui-design-system/src/lib/sui-command-menu-item/sui-command-menu-item.ts","../../../projects/sui-design-system/src/lib/sui-command-menu-item/sui-command-menu-item.html","../../../projects/sui-design-system/src/lib/sui-command-menu-search/sui-command-menu-search.ts","../../../projects/sui-design-system/src/lib/sui-command-menu-search/sui-command-menu-search.html","../../../projects/sui-design-system/src/lib/sui-compact-avatar-group/sui-compact-avatar-group.ts","../../../projects/sui-design-system/src/lib/sui-compact-avatar-group/sui-compact-avatar-group.html","../../../projects/sui-design-system/src/lib/sui-dropdown-item/sui-dropdown-item.ts","../../../projects/sui-design-system/src/lib/sui-dropdown-item/sui-dropdown-item.html","../../../projects/sui-design-system/src/lib/sui-dropdown-menu/sui-dropdown-panel.ts","../../../projects/sui-design-system/src/lib/sui-dropdown-menu/sui-dropdown-menu.ts","../../../projects/sui-design-system/src/lib/sui-dropdown-menu/sui-dropdown-menu.html","../../../projects/sui-design-system/src/lib/sui-compact-select-for-input/sui-compact-select-for-input.ts","../../../projects/sui-design-system/src/lib/sui-compact-select-for-input/sui-compact-select-for-input.html","../../../projects/sui-design-system/src/lib/sui-compact-select/sui-compact-select.ts","../../../projects/sui-design-system/src/lib/sui-compact-select/sui-compact-select.html","../../../projects/sui-design-system/src/lib/sui-content-card/sui-content-card.ts","../../../projects/sui-design-system/src/lib/sui-content-card/sui-content-card.html","../../../projects/sui-design-system/src/lib/sui-content-divider/sui-content-divider.ts","../../../projects/sui-design-system/src/lib/sui-content-divider/sui-content-divider.html","../../../projects/sui-design-system/src/lib/sui-tooltip/sui-tooltip-panel.ts","../../../projects/sui-design-system/src/lib/sui-tooltip/sui-tooltip-panel.html","../../../projects/sui-design-system/src/lib/sui-tooltip/sui-tooltip.ts","../../../projects/sui-design-system/src/lib/sui-form-label/sui-form-label.ts","../../../projects/sui-design-system/src/lib/sui-form-label/sui-form-label.html","../../../projects/sui-design-system/src/lib/sui-form-hint/sui-form-hint.ts","../../../projects/sui-design-system/src/lib/sui-form-hint/sui-form-hint.html","../../../projects/sui-design-system/src/lib/sui-counter-input/sui-counter-input.ts","../../../projects/sui-design-system/src/lib/sui-counter-input/sui-counter-input.html","../../../projects/sui-design-system/src/lib/sui-date-selector/sui-date-selector.ts","../../../projects/sui-design-system/src/lib/sui-date-selector/sui-date-selector.html","../../../projects/sui-design-system/src/lib/sui-datepicker/datepicker-utils.ts","../../../projects/sui-design-system/src/lib/sui-day-label/sui-day-label.ts","../../../projects/sui-design-system/src/lib/sui-day-label/sui-day-label.html","../../../projects/sui-design-system/src/lib/sui-day-cell/sui-day-cell.ts","../../../projects/sui-design-system/src/lib/sui-day-cell/sui-day-cell.html","../../../projects/sui-design-system/src/lib/sui-period-range/sui-period-range.ts","../../../projects/sui-design-system/src/lib/sui-period-range/sui-period-range.html","../../../projects/sui-design-system/src/lib/sui-datepicker/sui-datepicker.ts","../../../projects/sui-design-system/src/lib/sui-datepicker/sui-datepicker.html","../../../projects/sui-design-system/src/lib/sui-divider/sui-divider.ts","../../../projects/sui-design-system/src/lib/sui-divider/sui-divider.html","../../../projects/sui-design-system/src/lib/sui-switch/sui-switch.ts","../../../projects/sui-design-system/src/lib/sui-switch/sui-switch.html","../../../projects/sui-design-system/src/lib/sui-drawer-footer/sui-drawer-footer.ts","../../../projects/sui-design-system/src/lib/sui-drawer-footer/sui-drawer-footer.html","../../../projects/sui-design-system/src/lib/sui-drawer-header/sui-drawer-header.ts","../../../projects/sui-design-system/src/lib/sui-drawer-header/sui-drawer-header.html","../../../projects/sui-design-system/src/lib/sui-dropdown-caption/sui-dropdown-caption.ts","../../../projects/sui-design-system/src/lib/sui-dropdown-caption/sui-dropdown-caption.html","../../../projects/sui-design-system/src/lib/sui-dropdown-search/sui-dropdown-search.ts","../../../projects/sui-design-system/src/lib/sui-dropdown-search/sui-dropdown-search.html","../../../projects/sui-design-system/src/lib/sui-empty-state/sui-empty-state.ts","../../../projects/sui-design-system/src/lib/sui-empty-state/sui-empty-state.html","../../../projects/sui-design-system/src/lib/sui-fancy-button/sui-fancy-button.ts","../../../projects/sui-design-system/src/lib/sui-fancy-button/sui-fancy-button.html","../../../projects/sui-design-system/src/lib/sui-file-icon/sui-file-icon.ts","../../../projects/sui-design-system/src/lib/sui-file-icon/sui-file-icon.html","../../../projects/sui-design-system/src/lib/sui-progress-bar/sui-progress-bar.ts","../../../projects/sui-design-system/src/lib/sui-progress-bar/sui-progress-bar.html","../../../projects/sui-design-system/src/lib/sui-file-upload-card/sui-file-upload-card.ts","../../../projects/sui-design-system/src/lib/sui-file-upload-card/sui-file-upload-card.html","../../../projects/sui-design-system/src/lib/sui-file-upload/sui-file-upload.ts","../../../projects/sui-design-system/src/lib/sui-file-upload/sui-file-upload.html","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-bar.ts","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-bar.html","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-item.ts","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-item.html","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-panel-header.ts","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-panel-header.html","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-panel-footer.ts","../../../projects/sui-design-system/src/lib/sui-filter/sui-filter-panel-footer.html","../../../projects/sui-design-system/src/lib/sui-image-upload-profile/sui-image-upload-profile.ts","../../../projects/sui-design-system/src/lib/sui-image-upload-profile/sui-image-upload-profile.html","../../../projects/sui-design-system/src/lib/sui-image-upload/sui-image-upload.ts","../../../projects/sui-design-system/src/lib/sui-image-upload/sui-image-upload.html","../../../projects/sui-design-system/src/lib/sui-inline-input/sui-inline-input.ts","../../../projects/sui-design-system/src/lib/sui-inline-input/sui-inline-input.html","../../../projects/sui-design-system/src/lib/sui-inline-select/sui-inline-select.ts","../../../projects/sui-design-system/src/lib/sui-inline-select/sui-inline-select.html","../../../projects/sui-design-system/src/lib/sui-input/sui-input.ts","../../../projects/sui-design-system/src/lib/sui-input/sui-input.html","../../../projects/sui-design-system/src/lib/sui-integration-switch/sui-integration-switch.ts","../../../projects/sui-design-system/src/lib/sui-integration-switch/sui-integration-switch.html","../../../projects/sui-design-system/src/lib/sui-key-icon/sui-key-icon.ts","../../../projects/sui-design-system/src/lib/sui-key-icon/sui-key-icon.html","../../../projects/sui-design-system/src/lib/sui-modal-sheet/sui-modal-sheet.ts","../../../projects/sui-design-system/src/lib/sui-modal-sheet/sui-modal-sheet.html","../../../projects/sui-design-system/src/lib/sui-modal/sui-modal.ts","../../../projects/sui-design-system/src/lib/sui-modal/sui-modal.html","../../../projects/sui-design-system/src/lib/sui-notification-footer/sui-notification-footer.ts","../../../projects/sui-design-system/src/lib/sui-notification-footer/sui-notification-footer.html","../../../projects/sui-design-system/src/lib/sui-notification-tab-menu/sui-notification-tab-menu.ts","../../../projects/sui-design-system/src/lib/sui-notification-tab-menu/sui-notification-tab-menu.html","../../../projects/sui-design-system/src/lib/sui-notification/sui-notification.ts","../../../projects/sui-design-system/src/lib/sui-notification/sui-notification.html","../../../projects/sui-design-system/src/lib/sui-otp-input/sui-otp-input.ts","../../../projects/sui-design-system/src/lib/sui-otp-input/sui-otp-input.html","../../../projects/sui-design-system/src/lib/sui-page-header/sui-page-header.ts","../../../projects/sui-design-system/src/lib/sui-page-header/sui-page-header.html","../../../projects/sui-design-system/src/lib/sui-pagination/sui-pagination.ts","../../../projects/sui-design-system/src/lib/sui-pagination/sui-pagination.html","../../../projects/sui-design-system/src/lib/sui-popover/sui-popover.ts","../../../projects/sui-design-system/src/lib/sui-popover/sui-popover.html","../../../projects/sui-design-system/src/lib/sui-progress-bar-label/sui-progress-bar-label.ts","../../../projects/sui-design-system/src/lib/sui-progress-bar-label/sui-progress-bar-label.html","../../../projects/sui-design-system/src/lib/sui-radio/sui-radio-group.ts","../../../projects/sui-design-system/src/lib/sui-radio-card/sui-radio-card.ts","../../../projects/sui-design-system/src/lib/sui-radio-card/sui-radio-card.html","../../../projects/sui-design-system/src/lib/sui-radio/sui-radio.ts","../../../projects/sui-design-system/src/lib/sui-radio/sui-radio.html","../../../projects/sui-design-system/src/lib/sui-rating/sui-rating.ts","../../../projects/sui-design-system/src/lib/sui-rating/sui-rating.html","../../../projects/sui-design-system/src/lib/sui-rich-editor/sui-rich-editor-item.ts","../../../projects/sui-design-system/src/lib/sui-rich-editor/sui-rich-editor-item.html","../../../projects/sui-design-system/src/lib/sui-rich-editor/sui-rich-editor.ts","../../../projects/sui-design-system/src/lib/sui-rich-editor/sui-rich-editor.html","../../../projects/sui-design-system/src/lib/sui-select/sui-select.ts","../../../projects/sui-design-system/src/lib/sui-select/sui-select.html","../../../projects/sui-design-system/src/lib/sui-sidebar/sui-sidebar.ts","../../../projects/sui-design-system/src/lib/sui-sidebar/sui-sidebar.html","../../../projects/sui-design-system/src/lib/sui-slider/sui-slider.ts","../../../projects/sui-design-system/src/lib/sui-slider/sui-slider.html","../../../projects/sui-design-system/src/lib/sui-social-button/sui-social-button.ts","../../../projects/sui-design-system/src/lib/sui-social-button/sui-social-button.html","../../../projects/sui-design-system/src/lib/sui-status-badge/sui-status-badge.ts","../../../projects/sui-design-system/src/lib/sui-status-badge/sui-status-badge.html","../../../projects/sui-design-system/src/lib/sui-stepper/sui-stepper.ts","../../../projects/sui-design-system/src/lib/sui-stepper/sui-stepper.html","../../../projects/sui-design-system/src/lib/sui-store-card/sui-store-card.ts","../../../projects/sui-design-system/src/lib/sui-store-card/sui-store-card.html","../../../projects/sui-design-system/src/lib/sui-switch-card/sui-switch-card.ts","../../../projects/sui-design-system/src/lib/sui-switch-card/sui-switch-card.html","../../../projects/sui-design-system/src/lib/sui-switch-label/sui-switch-label.ts","../../../projects/sui-design-system/src/lib/sui-switch-label/sui-switch-label.html","../../../projects/sui-design-system/src/lib/sui-tab-chips/sui-tab-chips.ts","../../../projects/sui-design-system/src/lib/sui-tab-chips/sui-tab-chips.html","../../../projects/sui-design-system/src/lib/sui-table/sui-table-cell.directive.ts","../../../projects/sui-design-system/src/lib/sui-table/sui-table.ts","../../../projects/sui-design-system/src/lib/sui-table/sui-table.html","../../../projects/sui-design-system/src/lib/sui-tabs/sui-tabs.ts","../../../projects/sui-design-system/src/lib/sui-tabs/sui-tabs.html","../../../projects/sui-design-system/src/lib/sui-tag/sui-tag.ts","../../../projects/sui-design-system/src/lib/sui-tag/sui-tag.html","../../../projects/sui-design-system/src/lib/sui-tag-input/sui-tag-input.ts","../../../projects/sui-design-system/src/lib/sui-tag-input/sui-tag-input.html","../../../projects/sui-design-system/src/lib/sui-textarea/sui-textarea.ts","../../../projects/sui-design-system/src/lib/sui-textarea/sui-textarea.html","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-duration.ts","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-duration.html","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-item.ts","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-item.html","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-status.ts","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker-status.html","../../../projects/sui-design-system/src/lib/sui-time-picker/time-picker-utils.ts","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker.ts","../../../projects/sui-design-system/src/lib/sui-time-picker/sui-time-picker.html","../../../projects/sui-design-system/src/lib/sui-toast/sui-toast.service.ts","../../../projects/sui-design-system/src/lib/sui-toast/sui-toast-outlet.ts","../../../projects/sui-design-system/src/lib/sui-toast/sui-toast-outlet.html","../../../projects/sui-design-system/src/public-api.ts","../../../projects/sui-design-system/src/ajuarezso-sui-design-system.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * Contratos OPCIONALES que la app consumidora puede proveer para integrar los\n * overlays del DS con un tab bar nativo (ej. liquid glass de Capacitor). Si no se\n * proveen, los componentes hacen no-op → la librería queda 100% web-pura, sin\n * ninguna dependencia de Capacitor ni del proyecto host.\n */\n\n/** Oculta/muestra el tab bar nativo mientras un overlay (modal, sheet) está\n * abierto. La app la provee con su NavbarVisibilityService. */\nexport interface SuiNavbarVisibility {\n requestHide(id: string): void;\n release(id: string): void;\n}\nexport const SUI_NAVBAR_VISIBILITY = new InjectionToken<SuiNavbarVisibility>('SUI_NAVBAR_VISIBILITY');\n\n/** Altura (px) del tab bar nativo, para offsetear toasts por encima de él. La app\n * la provee con la signal de su LiquidGlassService. */\nexport interface SuiTabBar {\n tabBarHeight: Signal<number>;\n}\nexport const SUI_TAB_BAR = new InjectionToken<SuiTabBar>('SUI_TAB_BAR');\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Iconos CUSTOM de SUI que NO existen en RemixIcon (forma propia del DS).\n * Cuando `name` matchea una key de acá, sui-icon renderiza el SVG inline; para\n * cualquier otro `name` cae al font de RemixIcon (`ri-${name}`). Así la regla\n * \"para iconos siempre se usa sui-icon\" se cumple incluso para los custom del DS,\n * sin SVG inline disperso en los componentes consumidores.\n */\nexport const SUI_CUSTOM_ICONS: Record<string, { viewBox: string; path: string }> = {\n // info-custom-fill (Figma node 125:279): círculo relleno con \"i\" SERIF tipográfica.\n // NO es ri-information-fill (i recta). viewBox -4.5 -4.5 24 24 = vector 15u con\n // padding 18.75% → a size=20 el vector queda ~12.5px centrado (igual que Figma).\n 'info-custom-fill': {\n viewBox: '-4.5 -4.5 24 24',\n path: 'M7.5 15C11.6421 15 15 11.6421 15 7.5C15 3.35786 11.6421 0 7.5 0C3.35786 0 0 3.35786 0 7.5C0 11.6421 3.35786 15 7.5 15ZM8.83901 11.3503L8.95878 10.8607C8.89678 10.8898 8.79684 10.9231 8.65979 10.961C8.52236 10.9988 8.39868 11.0181 8.28998 11.0181C8.05844 11.0181 7.89542 10.9802 7.80078 10.9039C7.70683 10.8276 7.65997 10.6841 7.65997 10.4739C7.65997 10.3906 7.6741 10.2665 7.70368 10.104C7.73233 9.94048 7.76529 9.79513 7.80193 9.668L8.24903 8.0851C8.29282 7.93984 8.32285 7.78013 8.33899 7.60582C8.3555 7.4319 8.36319 7.31021 8.36319 7.24115C8.36319 6.90737 8.24619 6.6365 8.01212 6.42754C7.77804 6.21874 7.44472 6.11435 7.01275 6.11435C6.77238 6.11435 6.51826 6.15706 6.24931 6.24241C5.98036 6.32752 5.6992 6.43008 5.40505 6.54984L5.28498 7.03981C5.37263 7.00739 5.47703 6.97251 5.59918 6.9364C5.72078 6.90045 5.84009 6.88186 5.95616 6.88186C6.19315 6.88186 6.35279 6.92227 6.43645 7.00186C6.5201 7.08167 6.56212 7.22364 6.56212 7.4266C6.56212 7.53883 6.54883 7.66351 6.52126 7.79902C6.49406 7.93538 6.46011 8.07957 6.42016 8.23176L5.97114 9.82102C5.9312 9.98803 5.902 10.1374 5.88364 10.2701C5.86544 10.4026 5.85668 10.5327 5.85668 10.6591C5.85668 10.9858 5.97736 11.255 6.21866 11.4675C6.45995 11.6792 6.79827 11.7857 7.23323 11.7857C7.51647 11.7857 7.76506 11.7487 7.97901 11.6742C8.19272 11.6 8.47972 11.4921 8.83901 11.3503ZM8.75935 4.92024C8.96823 4.72658 9.07216 4.49105 9.07216 4.21526C9.07216 3.94009 8.96838 3.70409 8.75935 3.50797C8.55101 3.31239 8.29989 3.21429 8.00628 3.21429C7.71175 3.21429 7.45962 3.31216 7.24929 3.50797C7.03895 3.70409 6.93355 3.94001 6.93355 4.21526C6.93355 4.49105 7.03895 4.7265 7.24929 4.92024C7.46 5.1146 7.71167 5.21186 8.00628 5.21186C8.29996 5.21186 8.55101 5.1146 8.75935 4.92024Z',\n },\n // avatar-placeholder (silueta humana): fallback final del sui-avatar. Path EXACTO\n // del SVG inline previo (NO ri-user-fill, que difiere). viewBox 24×24, currentColor.\n 'avatar-placeholder': {\n viewBox: '0 0 24 24',\n path: 'M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm0 2c-4 0-8 2-8 6v1h16v-1c0-4-4-6-8-6Z',\n },\n // building-skyline: placeholder Empty del Image Upload Profile type=Company\n // (Figma 253:6939). Silueta compuesta de 2 torres + ventanas. El asset DS es un\n // SVG raster de 13 nodos; este path es la aproximación vectorial más fiel sin\n // inlinear el raster (más cercana que el RemixIcon building-2-fill de una línea).\n // viewBox 24×24, currentColor. Torre izquierda (más baja) + torre derecha (alta,\n // grid de ventanas 2col × 4row recortado por las contraformas evenodd).\n 'building-skyline': {\n viewBox: '0 0 24 24',\n path: 'M3 9h7v12H3V9Zm1.75 2v2h1.5v-2h-1.5Zm0 4v2h1.5v-2h-1.5Zm2.5-4v2h1.5v-2h-1.5Zm0 4v2h1.5v-2h-1.5ZM11 3h10v18H11V3Zm2 3v2h2V6h-2Zm4 0v2h2V6h-2Zm-4 4v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-4 4v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-4 4v3h2v-3h-2Zm4 0v3h2v-3h-2Z',\n },\n // heart-half-fill (Figma Rating Items 532:4150): MEDIO corazón (mitad izquierda\n // rellena, mitad derecha en contorno) — el estado Half del rating type='heart'.\n // RemixIcon NO tiene un heart-half (solo line/fill), por eso vive acá como custom.\n // Path EXACTO del asset SVG de Figma (viewBox 0 0 15 13.75, fill #FB3748 → currentColor).\n // El corazón en Figma se centra en un container 20×20 con inset 15.63%/12.5%\n // (= 3.126px top/bottom, 2.5px left/right). Para replicar ese encuadre dentro de un\n // viewBox cuadrado se desplaza el origen: '-2.5 -3.126 20 20'. Así el glyph queda del\n // mismo tamaño visual que heart-3-fill (Remix) a cualquier size. fill-rule evenodd\n // recorta la contraforma del contorno derecho (el hueco interno del medio corazón).\n 'heart-half-fill': {\n viewBox: '-2.5 -3.126 20 20',\n path: 'M10.875 0C9.7 0 8.44375 0.557263 7.50625 1.49021C6.56875 0.557263 5.3 0 4.125 0C1.8125 0 0 1.95981 0 4.47063C0 6.68716 1.025 8.76594 3.05 10.6631C4.5 12.0219 6.0875 12.9548 7.1875 13.5935L7.54375 13.75L7.85625 13.5684C8.84375 12.9924 10.5 12.0219 11.95 10.6631C13.975 8.7722 15 6.68716 15 4.47063C15 1.92224 13.225 0 10.875 0ZM11.1 9.74271C9.9 10.8698 8.53125 11.69 7.50625 12.2974C7.54375 10.563 7.53125 5.5288 7.50625 3.23714L8.38125 2.37933C8.65 2.11635 9.6125 1.25228 10.875 1.25228C12.5125 1.25228 13.75 2.63604 13.75 4.47063C13.75 6.30521 12.8562 8.09597 11.1 9.74271Z',\n },\n};\n\n@Component({\n selector: 'sui-icon',\n standalone: true,\n templateUrl: './sui-icon.html',\n styleUrl: './sui-icon.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuiIcon {\n /** RemixIcon name without prefix, e.g. 'home-line', 'search-line', 'shopping-bag-fill' */\n readonly name = input.required<string>();\n /** Size in px (number) or any CSS value (string). Default: 20 */\n readonly size = input<number | string>(20);\n /** CSS color value. Default: inherit (currentColor) */\n readonly color = input<string>('');\n\n /** SVG custom del DS si `name` está registrado; null → cae a RemixIcon font. */\n readonly customIcon = computed(() => SUI_CUSTOM_ICONS[this.name()] ?? null);\n\n readonly iconClass = computed(() => `ri-${this.name()}`);\n\n readonly sizeValue = computed(() => {\n const s = this.size();\n return typeof s === 'number' ? `${s}px` : s;\n });\n}\n","@if (customIcon(); as ci) {\n <svg\n [attr.viewBox]=\"ci.viewBox\"\n [style.width]=\"sizeValue()\"\n [style.height]=\"sizeValue()\"\n [style.color]=\"color() || null\"\n fill=\"none\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path [attr.d]=\"ci.path\" fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" />\n </svg>\n} @else {\n <i [class]=\"iconClass()\" [style.font-size]=\"sizeValue()\" [style.color]=\"color() || null\" [style.line-height]=\"sizeValue()\"></i>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiAccordionFlipIcon = 'off' | 'on';\n\n/**\n * SUI Accordion — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 210:4022 (component-set \"Accordion 11\") — VERIFIED via MCP\n *\n * Disclosure row con título, icono opcional a la izquierda y un toggle (+/−)\n * que indica el estado expandido. Al expandir, debajo del título aparece la\n * descripción. La variante `flipIcon=on` mueve el toggle a la izquierda y\n * desactiva el slot del icono lateral.\n *\n * EXACT (pulled from Figma 210:4022):\n * - Width (showcase): 440px (componente real es fluid; 440 es hint del frame)\n * - Padding: 14px (todos los lados)\n * - Gap: 10px (entre icono / texto / toggle)\n * - items-start (alinea iconos al top, no centrados)\n * - Border-radius: 10px (--sui-radius-10)\n *\n * Default (collapsed, no hover):\n * - background: --sui-bg-white-0 (#ffffff)\n * - border: 1px solid --sui-stroke-soft-200 (#ebebeb)\n * - box-shadow: --sui-shadow-x-small (0 1px 2px 0 #0a0d1408)\n * - toggle icon: add-line (right when flipIcon=off, left when on)\n *\n * Hover (collapsed, hovered):\n * - background: --sui-bg-weak-50 (#f7f7f7)\n * - border: none\n * - box-shadow: none\n * - toggle icon: add-line\n *\n * Active (expanded — open=true):\n * - background: --sui-bg-weak-50 (#f7f7f7)\n * - border: none\n * - box-shadow: none\n * - toggle icon: subtract-line (minus)\n * - description visible bajo el título, gap interno 6px\n *\n * Title typography (token \"Label/Small\"):\n * - font: Inter Medium 500\n * - size: 14px / line-height: 20px\n * - letter-spacing: var(--sui-type-label-sm-spacing) = -0.006em = -0.084px\n * (Figma reporta letterSpacing -0.6 en su unidad % del font-size, NO px:\n * -0.6% × 14px = -0.084px. El export Tailwind del MCP lo confirma con\n * `tracking-[-0.084px]`. El valor previo -0.6px estaba ~7× sobre-comprimido.)\n * - color: --sui-text-strong-950 (#171717)\n *\n * Description typography (token \"Paragraph/Small\", solo en Active):\n * - font: Inter Regular 400\n * - size: 14px / line-height: 20px\n * - letter-spacing: var(--sui-type-paragraph-sm-spacing) = -0.006em = -0.084px\n * (mismo caso que el title: -0.6% de Figma → -0.084px)\n * - color: --sui-text-sub-600 (#5c5c5c)\n *\n * Icons:\n * - container: 20×20\n * - left icon (default contenido): question-line (Remix `ri-question-line`)\n * - toggle icon: add-line / subtract-line (Remix `ri-add-line` / `ri-subtract-line`)\n * - Color icons: --sui-icon-sub-600 (#5c5c5c) — coincide con text-sub-600\n *\n * VERIFIED:\n * - Animación de expand/collapse: ✅ CSS @keyframes (approach Radix UI).\n * `--sui-accordion-content-height` mantenida por ResizeObserver sobre el inner.\n * Timing actual = 280ms con easing diferenciado open/close (open\n * cubic-bezier(0.65,0,0.35,1) easeInOutCubic; close cubic-bezier(0.32,0.72,0,1)\n * estilo Apple/iOS). Este tuning fue validado por el usuario y se PRESERVA\n * como extraFeature — ver PENDING VERIFY sobre el valor canon de Figma.\n * - Body slot: ✅ acepta contenido arbitrario via [sui-accordion-body] o default <ng-content>\n * - letter-spacing title + description: ✅ VERIFIED via MCP (2026-05-29). Tokens\n * \"Label/Small\" y \"Paragraph/Small\" reportan letterSpacing -0.6 (unidad % de\n * Figma) → -0.084px. Tailwind export del MCP confirma `tracking-[-0.084px]`.\n * Corregido de -0.6px (hardcoded, ~7× over-compressed) a los tokens canon.\n * - role=\"region\" del body: ✅ ahora con aria-labelledby → titleId (ARIA 1.2:\n * region landmark requiere accessible name; sin él falla WCAG 4.1.2).\n * - aria-expanded: ✅ vive solo en el <button> trigger (ubicación ARIA válida).\n * Removido del host <sui-accordion> (no tiene role widget interactivo).\n *\n * PENDING VERIFY:\n * - Timing de animación: el SUI usa 280ms (tuning validado por el user).\n * El nodo \"Motions and Animations\" del Figma podría especificar otro valor\n * canon (ej. 200ms). No verificado en los nodos 2859:4927 / 210:4022 (son\n * overview + component-set estático, no exponen el motion spec).\n * Mientras tanto se mantiene 280ms por estar explícitamente validado.\n * - Token icon/soft-400 (#a3a3a3): aparece en las variable defs del nodo\n * 210:4022 pero el SUI no lo usa en ningún estado (los iconos usan\n * icon-sub-600 #5c5c5c en todos los estados). Verificar si corresponde al\n * toggle en algún estado puntual (¿hover?) o es residual del DS.\n * - Focus ring (no presente en frame Figma; usamos outline 2px stroke-strong-950\n * del proyecto para WCAG — extraFeature de accesibilidad).\n * - Disabled state (no provisto en Figma; no implementado).\n * - El diseño Figma muestra ancho fijo 440px para showcase; el componente real\n * es fluid (block-level width:100%) — confirmar con diseñador si esto es OK.\n *\n * Behavior:\n * - `open` es `model<boolean>` para two-way binding `[(open)]`.\n * - Click en el botón togglea `open`. Con `lazy=false` (default), el body\n * siempre vive en el DOM y se anima vía CSS keyframes. Con `lazy=true`,\n * el contenido proyectado se monta solo cuando se abre la primera vez,\n * y permanece en el DOM (no se desmuenta al cerrar) para conservar\n * state interno y evitar re-medir.\n * - `leftIcon` (boolean) gates si se muestra el slot izquierdo cuando\n * `flipIcon=off`. Cuando `flipIcon=on`, el slot izquierdo nunca aparece\n * (el toggle ocupa esa posición — coincide con Figma 210:4105/4111/4117).\n *\n * iOS WKWebView :active fix: el host es interactive (botón), aplicamos los\n * listeners touchstart/touchend para liberar :active inmediatamente.\n */\n@Component({\n selector: 'sui-accordion',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-accordion.html',\n styleUrl: './sui-accordion.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr para evitar tooltip nativo gris del browser.\n Patrón canon Ontop — ver CLAUDE.md regla \"Input `title` en SUI\". */\n '[attr.title]': 'null',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-flip-icon]': 'flipIcon()',\n /* aria-expanded vive SOLO en el <button> trigger (HTML línea 4). NO se\n bindea en el host: <sui-accordion> no tiene role widget interactivo, y\n per ARIA 1.2 aria-expanded solo es semánticamente válido en roles\n interactivos (button, combobox, tree...). El estado del host se expone\n vía `data-sui-state` (default | active) para selectores CSS/JS. */\n },\n})\nexport class SuiAccordion {\n /** Contador estático para ids únicos por instancia (patrón canon sui-modal). */\n private static _nextId = 0;\n\n /**\n * Id del título, usado como `aria-labelledby` del body con `role=\"region\"`.\n * Per ARIA 1.2 una region landmark DEBE tener accessible name; sin él muchos\n * screen readers la tratan como contenedor genérico (falla WCAG 4.1.2).\n */\n protected readonly titleId = `sui-accordion-title-${++SuiAccordion._nextId}`;\n\n /** Texto del título (header del accordion). */\n readonly title = input<string>('');\n\n /** Texto de la descripción (visible solo cuando open=true). */\n readonly description = input<string>('');\n\n /**\n * Estado expandido. Two-way con `[(open)]`.\n * - false → muestra solo título + toggle (+)\n * - true → muestra título + descripción + toggle (−)\n */\n readonly open = model<boolean>(false);\n\n /**\n * Si `true`, el contenido proyectado no se monta en el DOM hasta que el\n * accordion se abra por primera vez. Una vez montado queda en el DOM\n * (no se desmuenta al cerrar). Útil cuando hay muchos accordions con\n * contenido pesado y querés evitar pagar el cost de Angular CD para\n * componentes nunca abiertos.\n *\n * Default `false` (comportamiento clásico: contenido siempre en DOM,\n * altura animada con overflow hidden).\n */\n readonly lazy = input<boolean>(false);\n\n /**\n * Tracking interno: ¿este accordion ya fue abierto al menos una vez?\n * Una vez `true`, queda `true` para siempre. Usado por el template\n * cuando `lazy=true` para decidir si proyectar el slot.\n */\n protected readonly _hasBeenOpened = signal(false);\n\n /**\n * El state que efectivamente se aplica al `data-state` del DOM. Cuando\n * `lazy=true` y es el primer open, el efecto `syncOpen` marca\n * `_hasBeenOpened=true` para montar el contenido pero NO setea\n * `_resolvedOpen=true` hasta que el `observeContent` haya medido la\n * altura del inner y seteado la CSS variable. Sin este delay, la\n * keyframe `sui-accordion-down` arranca con `var(--height) = undefined`\n * y no anima en el primer open.\n */\n protected readonly _resolvedOpen = signal(false);\n\n /** Computed que decide si renderizar el contenido proyectado. */\n protected readonly shouldRenderContent = computed(() =>\n !this.lazy() || this._hasBeenOpened()\n );\n\n /**\n * Posición del toggle.\n * - 'off' (default) → toggle a la derecha, slot del leftIcon disponible a la izquierda\n * - 'on' → toggle a la izquierda, NO hay slot leftIcon\n */\n readonly flipIcon = input<SuiAccordionFlipIcon>('off');\n\n /**\n * Si false, oculta el icono izquierdo (solo aplica con flipIcon=off).\n * Por default `true`; el icono por default es `question-line`.\n */\n readonly leftIcon = input<boolean>(true);\n\n /**\n * Nombre del icono izquierdo (Remix Icon, sin prefijo `ri-`).\n * Solo se renderiza si `flipIcon=off` y `leftIcon=true`.\n * Default: 'question-line'.\n */\n readonly leftIconName = input<string>('question-line');\n\n /**\n * Badge opcional en el header (ej. \"New\" / \"Old\" / \"Updated\"). Vacío = sin badge.\n * Usado en el catálogo (master-preview) para marcar el estado de homologación\n * de cada componente. Aditivo: sin valor, el header se renderiza igual que antes.\n */\n readonly badge = input<string>('');\n\n /** Variante de color del badge del header: new (verde) | upd (azul) | old (gris). */\n readonly badgeColor = input<'new' | 'old' | 'upd'>('new');\n\n /** Estado del data-attribute (default | active) — usa _resolvedOpen para\n * consistencia visual con el data-state del body (que también usa\n * _resolvedOpen). El icono y el bg cambian junto con la animation. */\n readonly state = computed<'default' | 'active'>(() =>\n this._resolvedOpen() ? 'active' : 'default',\n );\n\n /** Nombre del icono toggle según estado. */\n readonly toggleIconName = computed(() =>\n this._resolvedOpen() ? 'subtract-line' : 'add-line',\n );\n\n /** Body element ref para mantener la CSS variable de altura. */\n private readonly bodyRef = viewChild<ElementRef<HTMLElement>>('body');\n\n /** Inner element ref que contiene el contenido proyectado (altura intrinseca). */\n private readonly innerRef = viewChild<ElementRef<HTMLElement>>('inner');\n\n /**\n * Animación de expand/collapse — approach Radix UI.\n *\n * En lugar de manipular `style.height` desde JS con rAF (frágil contra\n * race conditions con Angular CD y lazy mount), exponemos\n * `--sui-accordion-content-height` como CSS variable y dejamos que CSS\n * keyframes hagan toda la animación:\n *\n * @keyframes sui-accordion-down {\n * from { height: 0; }\n * to { height: var(--sui-accordion-content-height); }\n * }\n * @keyframes sui-accordion-up {\n * from { height: var(--sui-accordion-content-height); }\n * to { height: 0; }\n * }\n *\n * El `ResizeObserver` mantiene la variable actualizada cada vez que el\n * contenido cambia (responsive, lazy mount, etc) para que la animación\n * use SIEMPRE la altura correcta.\n *\n * Ventajas vs el approach JS anterior:\n * - Sin doble `requestAnimationFrame` ni race conditions\n * - El browser engine de animaciones es óptimo (GPU-accelerated)\n * - No salta cuando se cierra desde `height: auto` (problema clásico)\n * - El `data-state` declarativo dispara automáticamente la keyframe correcta\n */\n private resizeObserver?: ResizeObserver;\n\n /**\n * Mide el contenido del inner y mantiene la CSS variable\n * `--sui-accordion-content-height` actualizada. Cuando el inner aparece\n * (lazy mount via `@if`), este effect corre, mide síncronamente y setea\n * la var ANTES de que la keyframe `sui-accordion-down` arranque, lo que\n * garantiza que el primer open SÍ anima en lazy mode.\n *\n * Después instala un `ResizeObserver` para mantener la var actualizada\n * si el contenido cambia (responsive, lazy data load, etc).\n */\n private readonly observeContent = effect((onCleanup) => {\n const body = this.bodyRef()?.nativeElement;\n const inner = this.innerRef()?.nativeElement;\n /* Guard: con `@if (shouldRenderContent())` gateando el #inner, en un\n acordeón lazy cerrado-nunca-abierto el #inner NO existe → innerRef es\n null → retornamos sin medir ni instalar el ResizeObserver. Así una página\n con N acordeones lazy (master-preview, ~85) NO crea N ResizeObservers ni\n hace N reflows síncronos al montar; el RO se instala recién en el primer\n open, cuando el @if monta el #inner y el viewChild dispara este effect. */\n if (!body || !inner) return;\n\n /* Medición síncrona inicial: ejecuta en el mismo tick que el mount\n del inner, antes del próximo paint donde correría la animation. */\n const h = inner.offsetHeight;\n body.style.setProperty('--sui-accordion-content-height', `${h}px`);\n\n /* Si veníamos esperando para resolver el first lazy open\n (open=true pero _resolvedOpen aún false), liberá ahora. */\n if (this.open() && !this._resolvedOpen()) {\n this._resolvedOpen.set(true);\n }\n\n this.resizeObserver?.disconnect();\n this.resizeObserver = new ResizeObserver(() => {\n /* offsetHeight = altura renderizada COMPLETA (incluye padding) — confiable y\n consistente con la medición inicial. NO usar entry.contentRect.height\n (EXCLUYE padding → recortaba 14px abajo) ni entry.borderBoxSize (daba\n lecturas raras de 14px durante la animación). */\n body.style.setProperty('--sui-accordion-content-height', `${inner.offsetHeight}px`);\n });\n this.resizeObserver.observe(inner);\n\n onCleanup(() => {\n this.resizeObserver?.disconnect();\n this.resizeObserver = undefined;\n });\n });\n\n /**\n * Sincroniza `_resolvedOpen` con `open()`, con delay especial para el\n * primer open en modo lazy:\n *\n * - Si cierra (`open=false`): aplicar `_resolvedOpen=false` inmediato.\n * El ResizeObserver ya tiene la var con la altura del open previo,\n * así que la keyframe `sui-accordion-up` arranca correctamente.\n *\n * - Si abre (`open=true`) Y `lazy && !hasBeenOpened`: triggear el mount\n * vía `_hasBeenOpened=true`, NO setear `_resolvedOpen` ahora.\n * `observeContent` lo va a setear en su próxima ejecución, después\n * de que el `@if` monte el inner y midamos su altura.\n *\n * - Si abre Y ya está montado: aplicar `_resolvedOpen=true` inmediato.\n */\n private readonly syncOpen = effect(() => {\n const open = this.open();\n if (!open) {\n this._resolvedOpen.set(false);\n return;\n }\n if (this.lazy() && !this._hasBeenOpened()) {\n this._hasBeenOpened.set(true);\n return;\n }\n this._resolvedOpen.set(true);\n });\n\n toggle(): void {\n this.open.set(!this.open());\n }\n}\n","<button\n type=\"button\"\n class=\"sui-accordion__trigger\"\n [attr.aria-expanded]=\"_resolvedOpen() ? 'true' : 'false'\"\n (click)=\"toggle()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n>\n @if (flipIcon() === 'on') {\n <span class=\"sui-accordion__icon sui-accordion__icon--toggle\" aria-hidden=\"true\">\n <sui-icon [name]=\"toggleIconName()\" [size]=\"20\" />\n </span>\n } @else if (leftIcon()) {\n <span class=\"sui-accordion__icon sui-accordion__icon--left\" aria-hidden=\"true\">\n <sui-icon [name]=\"leftIconName()\" [size]=\"20\" />\n </span>\n }\n\n <span class=\"sui-accordion__text\">\n @if (badge()) {\n <span class=\"sui-accordion__title-row\">\n <span class=\"sui-accordion__title\" [id]=\"titleId\">{{ title() }}</span>\n <span class=\"sui-accordion__badge\" [attr.data-variant]=\"badgeColor()\">{{ badge() }}</span>\n </span>\n } @else {\n <span class=\"sui-accordion__title\" [id]=\"titleId\">{{ title() }}</span>\n }\n @if (description()) {\n <!-- desc-wrap anima la aparición con grid-template-rows 0fr→1fr (CSS-only,\n estable en WKWebView). Vive en el __text → alineada con el título.\n aria-hidden cuando cerrado: la oculta del screen reader sin frenar la\n animación visual (sigue en el DOM para poder animar su altura). -->\n <span\n class=\"sui-accordion__desc-wrap\"\n [attr.aria-hidden]=\"_resolvedOpen() ? null : 'true'\"\n >\n <span class=\"sui-accordion__description\">{{ description() }}</span>\n </span>\n }\n </span>\n\n @if (flipIcon() === 'off') {\n <span class=\"sui-accordion__icon sui-accordion__icon--toggle\" aria-hidden=\"true\">\n <sui-icon [name]=\"toggleIconName()\" [size]=\"20\" />\n </span>\n }\n</button>\n\n<div\n #body\n class=\"sui-accordion__body\"\n role=\"region\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.data-state]=\"_resolvedOpen() ? 'open' : 'closed'\"\n [attr.aria-hidden]=\"_resolvedOpen() ? 'false' : 'true'\"\n>\n @if (shouldRenderContent()) {\n <div #inner class=\"sui-accordion__body-inner\">\n <ng-content select=\"[sui-accordion-body]\" />\n <ng-content />\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, effect, input, signal, untracked } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/**\n * 9 sizes canon de SUI 2.0 (Figma node 245:18786).\n * Pixel mapping: xs=20, sm=24, md=32, lg=40, xl=48, 2xl=56, 3xl=64, 4xl=72, 5xl=80.\n * Nota: `2xs=16` se removió en 2026-05 — NO existe en Figma (los sizes empiezan en 20).\n */\nexport type SuiAvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\nexport type SuiAvatarColor = 'slate' | 'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal';\n\n/**\n * BottomStatus types (Figma 245:18721): indicador bottom-right.\n * Online/offline/away/busy renderizan como dot; `company` renderiza el\n * `companyLogoSrc` como un mini-avatar pegado.\n */\nexport type SuiAvatarStatus = 'online' | 'offline' | 'away' | 'busy' | 'company';\n\n/**\n * TopStatus types (Figma 245:18697): badge top-right con icono.\n * Cada tipo tiene su color canon en SUI:\n * verified → green (state-success)\n * pin → blue\n * favorite → yellow\n * add → green\n * remove → red\n * notification → red\n */\nexport type SuiAvatarTopBadge = 'verified' | 'pin' | 'favorite' | 'add' | 'remove' | 'notification';\n\n/**\n * SUI Avatar — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component: Avatar [1.1] (frame 245:18786, component_set)\n * Sub-frames: Top Status [1.1] (245:18697), Bottom Status [1.1] (245:18721)\n *\n * EXACT (pulled from Figma 2026-06-21, verified per-variant via get_design_context\n * + get_variable_defs):\n * - 9 sizes: xs=20, sm=24, md=32, lg=40, xl=48, 2xl=56, 3xl=64, 4xl=72, 5xl=80.\n * - Initials (Text=On): el CONTEO depende del size (verificado por screenshot):\n * xs/sm/md (≤32px) → UNA letra \"J\" (node 247:4453); lg+ (≥40px) → DOS \"JB\"\n * (node 246:7237 size 80, 246:12379 size 40). El corte: 32→1, 40→2. Las\n * variantes Text=On usan Solid BG=Off; el bg por defecto del texto es\n * `neutral/gray/200` #ebebeb (NO bg-weak-50). Text color = `static/static-black`\n * #171717 (= --sui-text-strong-950). Texto centrado con inset 30% top/bottom\n * (line-height del token, word-break break-word). Lógica en `resolvedInitials`.\n * - Initials typography ramp (Figma style → font-size/line-height/tracking):\n * xs/sm (20/24) → Label/X Small 12 / 16 / 0\n * md (32) → Label/Small 14 / 20 / -0.006em\n * lg (40) → Label/Medium 16 / 24 / -0.011em\n * xl/2xl(48/56) → Label/Large 18 / 24 / -0.015em\n * 3xl-5xl(64+) → Title/H5 24 / 32 / 0 (Figma family = Inter Display)\n * NOTE: font-family stays Satoshi global (project decision, MEMORY.md). Only\n * font-size/line-height/letter-spacing homologated to Figma values.\n * - Placeholder silhouette (Icon/no-content fallback, node 246:7589 SVG): NO es\n * un glifo centrado al 65%, es un asset que LLENA el avatar y se recorta al\n * círculo. Geometría exacta del SVG de Figma (viewBox 80×80, clip rounded\n * rect rx40):\n * Head: circle cx40 cy32 r16, fill white, opacity 0.9\n * Body: ellipse cx40 cy78 rx32 ry24, fill white, opacity 0.72\n * bg del frame = gray/200 #ebebeb. → ahora se renderiza inline como SVG con\n * esas dos formas (escala perfecto a cualquier size, no depende de [size] px).\n * - SolidBG fallback fill uses the `*-200` pastel ramp (group size 80:\n * gray/200 #ebebeb, yellow/200 #ffecc0, blue/200 #c0d5ff, sky/200 #c0eaff).\n * - TopStatus per-type colors (245:18697, verified node-by-node):\n * verified → state/verified/base #47c2ff (SEAL escalopado, NO círculo)\n * pin → state/feature/base #7d52f4\n * favorite → state/success/base #1fc16b\n * add → state/faded/base #7b7b7b\n * remove → state/error/base #fb3748\n * notification → state/error/base #fb3748 (dot sólido sin glyph)\n * VERIFIED node 245:18698: el badge `verified` en Figma es un SEAL escalopado\n * (forma de sello con ondas REDONDEADAS), NO un círculo plano. Los demás\n * (pin/favorite/add/remove/notification) SÍ son círculos. → `verified` ahora\n * usa los PATHS REALES de Figma (3 capas SVG: stroke/bg/check, ver VERIFIED_SEAL),\n * con curvas Bézier → ondas redondeadas, NO un clip-path polígono (picos\n * angulares, descartado). El resto sigue circle.\n * - BottomStatus per-type colors (245:18721):\n * online → state/success/base #1fc16b\n * offline → state/faded/base #7b7b7b (NOT neutral-400)\n * busy → state/error/base #fb3748\n * away → state/away/base #f6b51e\n * company → purple/500 #7d52f4\n * - Status badge shadow (both top + bottom): regular-shadow/small =\n * DROP_SHADOW #1B1C1D0A, offset (0,2), radius 4, spread 0.\n * - BADGE GEOMETRY COMPOSED ON AVATAR (verified node 246:7237 — los símbolos\n * SÍ se componen sobre el avatar con posición porcentual relativa al\n * diámetro, NO en px fijos):\n * TopStatus frame inset = [0 -10% 60% 70%] → 40% × 40% del avatar,\n * pegado top-right, sobresale -10% a la derecha.\n * BottomStatus frame inset = [60% -10% 0 70%] → 40% × 40%, bottom-right.\n * → SUI ahora dimensiona el badge como `40%` del avatar (width/height en %)\n * y lo posiciona con `right: -10%` + top/bottom 0. Escala PROPORCIONAL a\n * cualquier size sin rampas px por-size (issue 5 resuelto).\n * Insets internos del badge (dentro del frame 32px → como % del badge):\n * TopStatus verified: Stroke 7.54%, BG 13.79%, Check 37.37%/33.21%/...\n * TopStatus circle : Stroke 6.25%, BG 12.5%\n * BottomStatus dot : Stroke ring 18.75%, Ellipse 31.25%\n * notification dot : ellipse 31.25% (sin stroke ring), badge ~25% efectivo\n *\n * PENDING VERIFY (inferred, not confirmed pixel-perfect in Figma):\n * - Company logo (BottomStatus type=Company): Figma usa BG blanco inset 6.25% +\n * logo \"Synergy\" inset 12.5% dentro del frame 32px. SUI lo aproxima con el\n * mismo frame 40% + ring blanco + `companyLogoSrc` cover; el logo Synergy es\n * un asset demo, no un token — se deja como mini-avatar genérico.\n * - Memoji / Illustration: se sirven como `<img>` cover vía [memojiSrc] /\n * [illustrationSrc] (o los assets demo bundled en src/assets/avatars/).\n * Figma hornea un asset por persona; el fit/crop se asume cover.\n * - Anillo blanco (`--sui-avatar-ring`): el grosor del ring (1px@xs → 3.5px@5xl)\n * es una rampa hand-tuned. Figma lo expresa como inset % (Stroke 18.75% del\n * frame), no como px por-size — la conversión a px exacta NO se extrajo para\n * los 9 sizes (riesgo ±0.5px en los extremos). El diámetro del dot/badge SÍ\n * es proporcional puro (%).\n *\n * Render priority (cascada): src → memojiSrc → illustrationSrc → initials →\n * icon → placeholder silhouette. Si src falla, cae automáticamente al siguiente.\n *\n * Initials: Figma muestra hasta 2 letras (ej. \"JB\"). Si el consumer pasa más, se\n * truncan a las 2 primeras (en mayúscula) para evitar overflow.\n */\n/**\n * Map de top-badge type → glyph SVG inline (viewBox 24×24, currentColor).\n * Se renderizan como SVG vectorial (igual que Figma, node 245:18697) para que\n * escalen con el badge sin px por-size. `notification` NO lleva glyph (Figma lo\n * dibuja como dot sólido) → null. Colores los maneja el SCSS via [data-sui-top-badge].\n *\n * Paths estilo RemixIcon (24×24): check / pin / star / plus / close.\n */\ninterface SuiBadgeGlyph {\n viewBox: string;\n path: string;\n}\nconst TOP_BADGE_GLYPH: Record<SuiAvatarTopBadge, SuiBadgeGlyph | null> = {\n // `verified` se renderiza como SEAL escalopado (SVG real de Figma, ver\n // VERIFIED_SEAL abajo), NO como glyph dentro de un círculo. → null acá para\n // que el template tome la rama del seal.\n verified: null,\n // pushpin-fill (chincheta DIAGONAL, RemixIcon) — Figma node 245:18702 usa la\n // versión inclinada (cabeza arriba-derecha, aguja abajo-izquierda), NO la\n // vertical pushpin-2-fill. Path canónico de remixicon/icons/Map/pushpin-fill.svg.\n pin: {\n viewBox: '0 0 24 24',\n path: 'M22.3126 10.1753L20.8984 11.5895L20.1913 10.8824L15.9486 15.125L15.2415 18.6606L13.8273 20.0748L9.58466 15.8321L4.63492 20.7819L3.2207 19.3677L8.17045 14.4179L3.92781 10.1753L5.34202 8.76107L8.87756 8.05396L13.1202 3.81132L12.4131 3.10422L13.8273 1.69L22.3126 10.1753Z',\n },\n // star-fill (estrella, RemixIcon).\n favorite: {\n viewBox: '0 0 24 24',\n path: 'M12 18.26l-7.053 3.948 1.575-7.928L.587 8.792l8.027-.952L12 .5l3.386 7.34 8.027.952-5.935 5.488 1.575 7.928z',\n },\n // add-line (plus grueso, centrado).\n add: {\n viewBox: '0 0 24 24',\n path: 'M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z',\n },\n // close-line (X gruesa, centrada).\n remove: {\n viewBox: '0 0 24 24',\n path: 'M12 10.586l4.95-4.95 1.414 1.414L13.414 12l4.95 4.95-1.414 1.414L12 13.414l-4.95 4.95-1.414-1.414L10.586 12l-4.95-4.95L7.05 5.636z',\n },\n notification: null,\n};\n\n/**\n * VERIFIED SEAL — assets REALES de Figma (node 245:18698 \"Top Status verified\").\n * Reemplaza el clip-path polígono (picos ANGULARES) por los paths con curvas\n * Bézier (C) reales → ondas REDONDEADAS (skill sui-figma-pixel-perfect, falla #5:\n * usar assets reales, no aproximar). Son 3 capas que se componen en un SVG con\n * viewBox unificado `0 0 27.1716 27.1716` (el del stroke, la capa más grande):\n *\n * - stroke: el ring/borde blanco escalopado (viewBox 27.1716, va DETRÁS).\n * - bg: el fondo escalopado azul verified (viewBox 23.1716, centrado dentro\n * del stroke → offset (27.1716-23.1716)/2 = 2.0 en x e y).\n * - check: el checkmark blanco (viewBox 10.0809×8.12132, centrado en el conjunto:\n * cx 27.1716/2=13.5858 → x = 13.5858-10.0809/2 = 8.54515;\n * cy 13.5858 → y = 13.5858-8.12132/2 = 9.52514).\n *\n * Cada capa conserva su path EXACTO de Figma y se posiciona con un `transform`\n * translate (más robusto que re-calcular las coordenadas de cada path a mano).\n */\nconst VERIFIED_SEAL = {\n /** viewBox del SVG compuesto = el del stroke (la capa más grande). */\n viewBox: '0 0 27.1716 27.1716',\n /** Ring/borde blanco escalopado (Figma seal-stroke.svg, viewBox 27.1716). */\n stroke:\n 'M17.9289 3.10051L15.7071 0.87868C14.5355 -0.292892 12.636 -0.292895 11.4645 0.878679L9.24264 3.10051H6.10051C4.44365 3.10051 3.10051 4.44365 3.10051 6.1005V9.24264L0.87868 11.4645C-0.292892 12.636 -0.292895 14.5355 0.878679 15.7071L3.10051 17.9289V21.0711C3.10051 22.7279 4.44365 24.0711 6.1005 24.0711H9.24264L11.4645 26.2929C12.636 27.4645 14.5355 27.4645 15.7071 26.2929L17.9289 24.0711H21.0711C22.7279 24.0711 24.0711 22.7279 24.0711 21.0711V17.9289L26.2929 15.7071C27.4645 14.5355 27.4645 12.636 26.2929 11.4645L24.0711 9.24264V6.10051C24.0711 4.44365 22.7279 3.10051 21.0711 3.10051H17.9289ZM16.8076 4.80761C16.9951 4.99515 17.2495 5.1005 17.5147 5.1005H21.0711C21.6234 5.1005 22.0711 5.54822 22.0711 6.10051V9.65685C22.0711 9.92207 22.1764 10.1764 22.364 10.364L24.8787 12.8787C25.2692 13.2692 25.2692 13.9024 24.8787 14.2929L22.364 16.8076C22.1764 16.9951 22.0711 17.2495 22.0711 17.5147V21.0711C22.0711 21.6234 21.6234 22.0711 21.0711 22.0711H17.5147C17.2495 22.0711 16.9951 22.1764 16.8076 22.364L14.2929 24.8787C13.9024 25.2692 13.2692 25.2692 12.8787 24.8787L10.364 22.364C10.1764 22.1764 9.92207 22.0711 9.65685 22.0711H6.1005C5.54822 22.0711 5.10051 21.6234 5.10051 21.0711V17.5147C5.10051 17.2495 4.99515 16.9951 4.80761 16.8076L2.29289 14.2929C1.90237 13.9024 1.90237 13.2692 2.29289 12.8787L4.80761 10.364C4.99515 10.1764 5.10051 9.92207 5.10051 9.65685V6.1005C5.10051 5.54822 5.54822 5.1005 6.10051 5.1005H9.65685C9.92207 5.1005 10.1764 4.99515 10.364 4.80761L12.8787 2.29289C13.2692 1.90237 13.9024 1.90237 14.2929 2.29289L16.8076 4.80761Z',\n /** Fondo escalopado azul (Figma seal-bg.svg, viewBox 23.1716), offset (2,2). */\n bg: 'M15.5147 3.10051C15.2495 3.10051 14.9951 2.99515 14.8076 2.80761L12.2929 0.292893C11.9024 -0.0976308 11.2692 -0.0976313 10.8787 0.292893L8.36396 2.80761C8.17642 2.99515 7.92207 3.10051 7.65685 3.10051H4.10051C3.54822 3.10051 3.10051 3.54822 3.10051 4.1005V7.65685C3.10051 7.92207 2.99515 8.17642 2.80761 8.36396L0.292893 10.8787C-0.0976309 11.2692 -0.0976313 11.9024 0.292893 12.2929L2.80761 14.8076C2.99515 14.9951 3.10051 15.2495 3.10051 15.5147V19.0711C3.10051 19.6234 3.54822 20.0711 4.1005 20.0711H7.65685C7.92207 20.0711 8.17642 20.1764 8.36396 20.364L10.8787 22.8787C11.2692 23.2692 11.9024 23.2692 12.2929 22.8787L14.8076 20.364C14.9951 20.1764 15.2495 20.0711 15.5147 20.0711H19.0711C19.6234 20.0711 20.0711 19.6234 20.0711 19.0711V15.5147C20.0711 15.2495 20.1764 14.9951 20.364 14.8076L22.8787 12.2929C23.2692 11.9024 23.2692 11.2692 22.8787 10.8787L20.364 8.36396C20.1764 8.17642 20.0711 7.92207 20.0711 7.65685V4.10051C20.0711 3.54822 19.6234 3.10051 19.0711 3.10051H15.5147Z',\n /** Checkmark blanco (Figma seal-check.svg, viewBox 10.0809×8.12132), centrado. */\n check:\n 'M10.0809 1.41421L3.37377 8.12132L0 4.74755L1.41421 3.33333L3.37377 5.29289L8.66667 0L10.0809 1.41421Z',\n} as const;\n\n@Component({\n selector: 'sui-avatar',\n standalone: true,\n templateUrl: './sui-avatar.html',\n styleUrl: './sui-avatar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-color]': 'color()',\n '[attr.data-sui-status]': 'status() ?? null',\n '[attr.data-sui-top-badge]': 'topBadge() ?? null',\n '[attr.data-sui-fallback]': 'showFallback() ? \"\" : null',\n '[attr.data-sui-placeholder]': 'showPlaceholder() ? \"\" : null',\n '[style.background-color]': 'showFallback() ? bgColor() : null',\n },\n})\nexport class SuiAvatar {\n readonly size = input<SuiAvatarSize>('md');\n readonly src = input<string | null>(null);\n readonly alt = input('');\n readonly initials = input('');\n readonly color = input<SuiAvatarColor>('slate');\n readonly status = input<SuiAvatarStatus | null>(null);\n\n /**\n * Content-type Memoji (Figma 👨🏻 Memoji=On): src de un memoji/avatar 3D.\n * Tiene prioridad sobre `initials`/`icon` pero menor que `src`. Renderiza\n * como <img> con object-fit cover (igual que `src`).\n */\n readonly memojiSrc = input<string | null>(null);\n\n /**\n * Content-type Illustration (Figma 🖌️ Illustration=On): src de una\n * ilustración custom. Misma cascada que `memojiSrc`.\n */\n readonly illustrationSrc = input<string | null>(null);\n\n /**\n * Content-type Icon (Figma 💠 Icon=On): RemixIcon que reemplaza el placeholder\n * silhouette por un glifo custom dentro del círculo. Solo se muestra en\n * fallback cuando NO hay src/memoji/illustration/initials. Si vacío, cae al\n * silhouette por defecto.\n */\n readonly icon = input<string | null>(null);\n\n /** BottomStatus `company`: src del logo de la empresa (mini-avatar adjacente). */\n readonly companyLogoSrc = input<string | null>(null);\n\n /**\n * TopStatus badge (top-right corner). 6 tipos canon SUI.\n * Cada tipo tiene un color por defecto; ver TOP_BADGE_ICON map.\n * Figma 245:18697.\n */\n readonly topBadge = input<SuiAvatarTopBadge | null>(null);\n\n /**\n * Override puntual del background-color del fallback (casos donde la entidad\n * trae su propio color asignado, ej. customers/employees con `color` en\n * firestore). Si se pasa, `[color]` se ignora. Acepta cualquier string CSS\n * válido (hex, rgb, var(--token)). Solo aplica en fallback.\n */\n readonly bgColor = input<string | null>(null);\n\n /** True cuando la imagen falla y debe mostrarse el fallback (initials/icon). */\n protected readonly imageFailed = signal(false);\n\n constructor() {\n /* Reset del flag de error cuando cambia el src resuelto: un src nuevo\n (o distinto) merece un intento fresco de carga. Sin esto, una vez que\n `imageFailed` queda true el <img> nunca se vuelve a montar y `onImageLoad`\n jamás puede dispararse (el fallback quedaría pegado para siempre). */\n effect(() => {\n this.resolvedImageSrc(); // dependencia\n untracked(() => {\n if (this.imageFailed()) this.imageFailed.set(false);\n });\n });\n }\n\n /**\n * Iniciales resueltas — el CONTEO depende del size (canon Figma verificado por\n * screenshot del set Text=On):\n * - xs/sm/md (20/24/32px) → UNA letra (node 247:4453 xs = \"J\")\n * - lg+ (40px+) → DOS letras (node 246:7237 80px = \"JB\", 246:12379 40px = \"JB\")\n * El corte está entre 32 (md, 1 letra) y 40 (lg, 2 letras): los avatares chicos\n * no tienen ancho para 2 iniciales sin que se amontonen (visible en avatar-group\n * apilado). Reglas de extracción: nombre con espacio (\"Emma Wright\") → inicial de\n * cada palabra (\"EW\"); una sola palabra (\"Emma\") → sus 2 primeros chars (\"EM\");\n * en sizes de 1 letra se toma solo la primera de ese par.\n */\n protected readonly resolvedInitials = computed(() => {\n const raw = this.initials().trim();\n if (!raw) return '';\n const words = raw.split(/\\s+/).filter(Boolean);\n const two =\n words.length >= 2\n ? (words[0].charAt(0) + words[1].charAt(0)).toUpperCase()\n : raw.slice(0, 2).toUpperCase();\n const s = this.size();\n const oneLetter = s === 'xs' || s === 'sm' || s === 'md';\n return oneLetter ? two.charAt(0) : two;\n });\n\n /**\n * Src de imagen resuelto en cascada: src → memojiSrc → illustrationSrc.\n * El primero no-vacío gana. Todos se renderizan como <img> cover.\n */\n protected readonly resolvedImageSrc = computed<string | null>(() => {\n return this.src() || this.memojiSrc() || this.illustrationSrc() || null;\n });\n\n /** Fallback cuando: no hay imagen resuelta, o cargó con error. */\n protected readonly showFallback = computed(() => {\n return !this.resolvedImageSrc() || this.imageFailed();\n });\n\n /**\n * True cuando se muestra la silueta placeholder (último nivel de la cascada):\n * sin imagen, sin iniciales, sin icon content-type. Gobierna el bg gray/200\n * del placeholder (Figma node 246:7589) en vez del bg-weak-50 del slate default.\n */\n protected readonly showPlaceholder = computed(() => {\n return this.showFallback() && !this.resolvedInitials() && !this.icon();\n });\n\n /** Glyph SVG inline del top-badge actual (o null si no hay badge / es dot). */\n protected readonly topBadgeGlyph = computed<SuiBadgeGlyph | null>(() => {\n const t = this.topBadge();\n return t ? TOP_BADGE_GLYPH[t] : null;\n });\n\n /**\n * `verified` es el único TopStatus con forma de SEAL escalopado (node 245:18698);\n * el resto (pin/favorite/add/remove/notification) son círculos. El flag gobierna\n * tanto la máscara SVG del seal como el inset del glyph (verified usa inset 7.54%\n * vs 6.25% del círculo — ver SCSS).\n */\n protected readonly isVerifiedSeal = computed(() => this.topBadge() === 'verified');\n\n /** Paths reales del seal verified de Figma (stroke/bg/check). Ver VERIFIED_SEAL. */\n protected readonly verifiedSeal = VERIFIED_SEAL;\n\n /**\n * Tamaño del ícono interno del avatar (content-type Icon). Escala con el\n * diámetro (~50%). Solo aplica cuando se renderea `icon()` en fallback.\n * (El `icon` content-type es una extensión propia: glifo RemixIcon dentro del\n * círculo — Figma no lo expone como variante, sí necesita un px para sui-icon.)\n */\n protected readonly innerIconSize = computed<number>(() => {\n switch (this.size()) {\n case 'xs': return 12;\n case 'sm': return 14;\n case 'md': return 18;\n case 'lg': return 22;\n case 'xl': return 26;\n case '2xl': return 30;\n case '3xl': return 34;\n case '4xl': return 38;\n case '5xl': return 42;\n }\n });\n\n protected onImageError(): void {\n this.imageFailed.set(true);\n }\n\n protected onImageLoad(): void {\n // Reset si re-cargo con un src nuevo válido después de un error previo.\n if (this.imageFailed()) this.imageFailed.set(false);\n }\n}\n","@if (resolvedImageSrc() && !imageFailed()) {\n <img\n class=\"sui-avatar__image\"\n [src]=\"resolvedImageSrc()\"\n [alt]=\"alt()\"\n (error)=\"onImageError()\"\n (load)=\"onImageLoad()\" />\n} @else if (resolvedInitials()) {\n <span class=\"sui-avatar__initial\">{{ resolvedInitials() }}</span>\n} @else if (icon()) {\n <!-- Content-type Icon: glifo custom dentro del círculo (extensión propia). -->\n <sui-icon class=\"sui-avatar__icon\" [name]=\"icon()!\" [size]=\"innerIconSize()\" />\n} @else {\n <!--\n Placeholder silueta (fallback final). Réplica EXACTA del SVG de Figma\n (node 246:7589, viewBox 80×80): Head circle (cx40 cy32 r16, op .9) + Body\n ellipse (cx40 cy78 rx32 ry24, op .72), blancos, recortados al círculo del\n avatar. Escala perfecto a cualquier size (viewBox + width/height 100%).\n -->\n <svg\n class=\"sui-avatar__placeholder\"\n viewBox=\"0 0 80 80\"\n fill=\"none\"\n aria-hidden=\"true\"\n preserveAspectRatio=\"xMidYMid slice\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <ellipse class=\"sui-avatar__ph-body\" cx=\"40\" cy=\"78\" rx=\"32\" ry=\"24\" />\n <circle class=\"sui-avatar__ph-head\" cx=\"40\" cy=\"32\" r=\"16\" />\n </svg>\n}\n\n@if (status() === 'company') {\n <!-- BottomStatus Company: mini avatar/logo pegado bottom-right. -->\n <span class=\"sui-avatar__company\" aria-hidden=\"true\">\n @if (companyLogoSrc()) {\n <img [src]=\"companyLogoSrc()\" alt=\"\" class=\"sui-avatar__company-img\" />\n }\n </span>\n} @else if (status()) {\n <!-- BottomStatus dot (online/offline/away/busy). -->\n <span class=\"sui-avatar__status\" aria-hidden=\"true\"></span>\n}\n\n@if (topBadge(); as t) {\n <!--\n TopStatus badge top-right (node 245:18697). Frame = 40% del avatar,\n pegado top-right sobresaliendo -10% a la derecha → escala proporcional.\n `verified` es un SEAL escalopado (SVG real de Figma, ondas REDONDEADAS); el\n resto son círculos. `notification` es un dot sólido (sin glyph).\n -->\n <span\n class=\"sui-avatar__top-badge\"\n [class.sui-avatar__top-badge--seal]=\"isVerifiedSeal()\"\n aria-hidden=\"true\">\n @if (isVerifiedSeal()) {\n <!--\n SEAL verified = 3 capas REALES de Figma (node 245:18698) compuestas en un\n SVG (skill sui-figma-pixel-perfect, falla #5: assets reales, no aproximar):\n 1. stroke: ring blanco escalopado (DETRÁS, viewBox 27.1716).\n 2. bg: fondo escalopado azul verified, offset (2,2) para centrarlo.\n 3. check: checkmark blanco centrado.\n Los paths llevan curvas Bézier → ondas REDONDEADAS (vs el clip-path\n polígono anterior, que daba picos angulares). Escala 100% con el badge\n (40% del avatar) sin px por-size.\n -->\n <svg\n class=\"sui-avatar__seal\"\n [attr.viewBox]=\"verifiedSeal.viewBox\"\n fill=\"none\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path class=\"sui-avatar__seal-stroke\" [attr.d]=\"verifiedSeal.stroke\" />\n <path\n class=\"sui-avatar__seal-bg\"\n [attr.d]=\"verifiedSeal.bg\"\n transform=\"translate(2,2)\" />\n <path\n class=\"sui-avatar__seal-check\"\n [attr.d]=\"verifiedSeal.check\"\n transform=\"translate(8.54515,9.52514)\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\" />\n </svg>\n } @else if (topBadgeGlyph(); as g) {\n <!--\n Glyph como SVG inline (igual que Figma: glyph vectorial, no font) →\n escala con el badge (que es 40% del avatar) sin px por-size.\n width/height ~55% del badge centran el ícono dentro del ring blanco.\n -->\n <svg\n class=\"sui-avatar__top-badge-glyph\"\n [attr.viewBox]=\"g.viewBox\"\n fill=\"none\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path [attr.d]=\"g.path\" fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" />\n </svg>\n }\n </span>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiAvatar, type SuiAvatarColor } from '../sui-avatar/sui-avatar';\n\nexport type SuiActivityTaskState = 'success' | 'warning' | 'pending' | 'error';\n\nexport interface SuiActivityFile {\n /** Nombre del archivo. Ej: \"apex-report.pdf\" */\n name: string;\n /** Etiqueta corta del peso. Ej: \"(4mb)\" — formatear desde el consumer. */\n size?: string;\n /** URL opcional. Si está, el download button dispara navigate. */\n href?: string;\n}\n\nexport interface SuiActivityTask {\n state: SuiActivityTaskState;\n /** Ej: \"12 tasks completed\" */\n label: string;\n}\n\nexport interface SuiActivityAvatarRef {\n src?: string | null;\n initials?: string;\n /**\n * Color canon SUI 2.0 (slate/gray/blue/orange/red/green/yellow/purple/sky/pink/teal).\n * Es la opción **preferida**: el sui-avatar mapea internamente a su par\n * canon de `bg-200 + text-950`, garantizando contraste correcto en\n * fallback (sin imagen).\n *\n * Cuando se pasa, NO usar `bgColor` simultáneamente — el `bgColor`\n * override visualmente el background pero deja el `data-sui-color`\n * desincronizado y las initials terminan en color slate default.\n */\n color?: SuiAvatarColor;\n /**\n * Background CSS color override de **escape hatch** (hex / rgb /\n * `var(--token)`). Útil SOLO cuando la entidad trae un color custom\n * que no está en el set canon (ej. `user.firestoreColor`).\n *\n * Si se pasa, el text-color de las initials NO se ajusta automáticamente —\n * dejará el text-color del color slate por default (`text-sub-600` gris).\n * Preferir `color` salvo necesidad explícita.\n */\n bgColor?: string;\n}\n\ninterface SuiActivityFeedItemBase {\n id: string;\n /** Avatar leading (32×32). Si no hay src, fallback a iniciales. */\n avatar?: SuiActivityAvatarRef;\n /** Alternativa al avatar: icon badge 32×32 (rounded full + white ring). */\n icon?: string;\n /** \"Wei Chen\" — strong-950 bold */\n userName: string;\n /** \"uploaded\" — sub-600 regular */\n verb: string;\n /** \"Q2 financial report\" — strong-950 bold (opcional) */\n target?: string;\n /** \"4 min ago\" — soft-400 */\n timestamp: string;\n /** Mostrar trailing more (3-dot) button. Default true. */\n showAction?: boolean;\n}\n\nexport type SuiActivityFeedItem =\n | (SuiActivityFeedItemBase & { type: 'default' })\n | (SuiActivityFeedItemBase & { type: 'file'; files: SuiActivityFile[] })\n | (SuiActivityFeedItemBase & { type: 'comment'; comment: string; replyLabel?: string })\n | (SuiActivityFeedItemBase & { type: 'avatar-group'; avatars: SuiActivityAvatarRef[]; extraCount?: number })\n | (SuiActivityFeedItemBase & { type: 'tasks'; tasks: SuiActivityTask[] });\n\n/**\n * SUI Activity Feed — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 166035:46833 (\"Activity Feed [1.1]\") + 4 sub-frames:\n * 165967:3881 (Filter chip), 165967:4028 (File item), 166017:612 (Comment item),\n * 166035:47290 (Task status chip).\n *\n * Monolithic — un solo componente que renderea las 5 row types vía discriminated\n * union (`type` del item). El consumer pasa `items[]` y el feed lo proyecta.\n *\n * EXACT (pulled from Figma):\n * Row outer gap 16, items-center (default) / items-start (file/comment/avatar/tasks)\n * Leading 32×32 avatar (166035:47346, border-4 white-0 INWARD, image 24px)\n * O icon-badge (166035:47387 Area border-4 white-0 + 166035:47388\n * inner circle 1px stroke/soft-200, ring bleeds outward via box-shadow)\n * Title row gap 2/3, flex-wrap, dot separator (text/disabled-300)\n * Typography\n * userName Label/Small 14/20 medium, ls -0.6%, color text/strong-950\n * verb Paragraph/Small 14/20 regular, ls -0.6%, color text/sub-600\n * target Label/Small 14/20 medium, ls -0.6%, color text/strong-950\n * timestamp Paragraph/Small 14/20 regular, color text/soft-400\n * Attachment chips (file/task)\n * padding 4px 10px (pl 6 pr 10), gap 6, rounded 8, border stroke/soft-200,\n * shadow xs (0 1 2 rgba(10,13,20,.03))\n * Comment bubble\n * border-radius tl 4 / tr 12 / bl 12 / br 12 (asymmetric — speech tail)\n * padding pl 8 / pr 14 / py 8 (asimétrico — 166017:582, NO shorthand 8 14),\n * gap 6, border + shadow xs\n * Avatar group pill\n * padding 2px 8px (pl 2 pr 8 py 2), gap 6, rounded-full, border + shadow xs\n * Stacked 24×24 avatars, border 2px white, mr -2 (overlap)\n * Trailing 20×20 Compact Button (166035:47358): p-px + more-2-line 18×18, rounded-full\n *\n * Task status icons (per state) — VALORES EXACTOS de Figma 166035:47290\n * (las 4 variantes Success/Warning/Pending/Error existen explicitamente):\n * success → select-box-circle-fill*, color state/success/base #1fc16b\n * warning → alert-fill, color state/warning/base #fa7319\n * pending → time-fill, color state/away/base #f6b51e\n * error → error-warning-fill, color state/error/base #fb3748\n *\n * *Figma usa el icon SUI \"select-box-circle-fill\" para success. RemixIcon\n * (la fuente del proyecto, ri-*) NO tiene ese glifo; el equivalente visual\n * 1:1 es `checkbox-circle-fill` (check dentro de circulo lleno). Se usa ese.\n *\n * Token map (Figma → sui-tokens.scss):\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * text/soft-400 → --sui-text-soft-400\n * text/disabled-300 → --sui-text-disabled-300\n * bg/white-0 → --sui-bg-white-0\n * stroke/soft-200 → --sui-stroke-soft-200\n * neutral/gray/200 → --sui-bg-weak-50 (avatar fallback bg)\n * primary-base → --sui-primary-base (project remaps to #fa7319)\n *\n * VERIFIED vs Figma (2026-05-29, homologation pass):\n * - Task icon colors: CONFIRMED — las 4 variants existen en Figma, text siempre\n * sub-600, icon usa state/{success,warning,away,error}/base. Tokens 1:1.\n * - File chip \"Hover\" variant (165967:4029): SOLO el download Button pasa a\n * bg weak-50 — el chip outer queda blanco con border. Implementado: el chip\n * ya NO hace whole-hover; solo el __file-download tiene :hover weak-50 (clipped\n * por overflow:hidden al border-radius 8 del chip).\n * - Comment \"Hover\" variant (166017:585): bubble bg → weak-50, border drops,\n * Reply link → primary-dark underline. Implementado en :hover del bubble.\n * - Title gaps: Title container gap 2px (items-start), Text sub-group gap 3px\n * (items-center). Implementado con wrapper __title-text.\n * - Comment padding (166017:582): CONFIRMED pl 8 / pr 14 / py 8. SCSS usa\n * `padding: 8px 14px 8px 8px` (NO el shorthand `8px 14px` que daba left=14).\n * - Leading avatar white ring (166035:47346): CONFIRMED — border-4 white-0\n * INWARD (border-box → footprint 32px, imagen 24px). Aplicado a sui-avatar.\n * - Icon-badge white ring (166035:47387/47388): CONFIRMED — ring bleeds\n * OUTWARD via box-shadow `0 0 0 4px white-0` (no outline inset que tapaba el\n * 1px stroke/soft-200 del circulo). drop-shadow xs apilado en el mismo prop.\n * - Trailing button size (166035:47358): CONFIRMED 20×20 (p-px + icon 18×18).\n * Antes inflado a 28×28 — corregido a VALORES EXACTOS Figma.\n *\n * PENDING VERIFY (no spec'd per-state en Figma, inferido):\n * - Action button (3-dot more): Figma no muestra hover variant aislado — se usa\n * el ghost-button hover del proyecto (bg-weak-50 rounded-full).\n * - Focus rings: 2px primary-base outline (convencion proyecto, no en Figma).\n *\n * Usage:\n * <sui-activity-feed [items]=\"feedItems\" (action)=\"onAction($event)\"\n * (fileDownload)=\"onDownload($event)\" (reply)=\"onReply($event)\" />\n */\n@Component({\n selector: 'sui-activity-feed',\n templateUrl: './sui-activity-feed.html',\n styleUrl: './sui-activity-feed.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiAvatar],\n host: {\n '[attr.role]': '\"feed\"',\n },\n})\nexport class SuiActivityFeed {\n readonly items = input.required<readonly SuiActivityFeedItem[]>();\n\n /** Click en el 3-dot menu trailing de cualquier row. */\n readonly action = output<{ item: SuiActivityFeedItem; event: MouseEvent }>();\n /** Click en download de un file chip. */\n readonly fileDownload = output<{ item: SuiActivityFeedItem; file: SuiActivityFile; event: MouseEvent }>();\n /** Click en \"Reply\" de un comment row. */\n readonly reply = output<{ item: SuiActivityFeedItem; event: MouseEvent }>();\n\n /** Maps cada estado de Task al icon name canonico de Remix Icon. */\n taskIcon(state: SuiActivityTaskState): string {\n switch (state) {\n case 'success': return 'checkbox-circle-fill';\n case 'warning': return 'alert-fill';\n case 'pending': return 'time-fill';\n case 'error': return 'error-warning-fill';\n }\n }\n\n /* Discriminating type-narrow helpers para el template — Angular template parser no\n hace narrowing por sí solo, así que exponemos as-casts tipados desde el TS. */\n asFile(item: SuiActivityFeedItem) {\n return item as Extract<SuiActivityFeedItem, { type: 'file' }>;\n }\n asComment(item: SuiActivityFeedItem) {\n return item as Extract<SuiActivityFeedItem, { type: 'comment' }>;\n }\n asAvatarGroup(item: SuiActivityFeedItem) {\n return item as Extract<SuiActivityFeedItem, { type: 'avatar-group' }>;\n }\n asTasks(item: SuiActivityFeedItem) {\n return item as Extract<SuiActivityFeedItem, { type: 'tasks' }>;\n }\n\n onAction(item: SuiActivityFeedItem, event: MouseEvent): void {\n event.stopPropagation();\n this.action.emit({ item, event });\n }\n\n onFileDownload(item: SuiActivityFeedItem, file: SuiActivityFile, event: MouseEvent): void {\n event.stopPropagation();\n this.fileDownload.emit({ item, file, event });\n }\n\n onReply(item: SuiActivityFeedItem, event: MouseEvent): void {\n event.stopPropagation();\n this.reply.emit({ item, event });\n }\n}\n","@for (item of items(); track item.id) {\n <article\n class=\"sui-activity-feed__item\"\n [attr.data-type]=\"item.type\"\n >\n <!-- Leading: avatar (default) o icon-badge (alternativo) -->\n @if (item.icon) {\n <div class=\"sui-activity-feed__icon-badge\" aria-hidden=\"true\">\n <sui-icon [name]=\"item.icon\" [size]=\"20\" />\n </div>\n } @else {\n <div class=\"sui-activity-feed__avatar-wrap\">\n <sui-avatar\n class=\"sui-activity-feed__leading-avatar\"\n size=\"md\"\n [src]=\"item.avatar?.src ?? null\"\n [initials]=\"item.avatar?.initials ?? ''\"\n [color]=\"item.avatar?.color ?? 'slate'\"\n [bgColor]=\"item.avatar?.bgColor ?? null\"\n [alt]=\"item.userName\"\n />\n </div>\n }\n\n <!-- Content: title row + opcional attachment block -->\n <div class=\"sui-activity-feed__content\">\n <div class=\"sui-activity-feed__title\">\n <!-- Text sub-group (userName + verb + target) — Figma gap 3px, items-center -->\n <span class=\"sui-activity-feed__title-text\">\n <span class=\"sui-activity-feed__user\">{{ item.userName }}</span>\n <span class=\"sui-activity-feed__verb\">{{ item.verb }}</span>\n @if (item.target) {\n <span class=\"sui-activity-feed__target\">{{ item.target }}</span>\n }\n </span>\n <span class=\"sui-activity-feed__sep\" aria-hidden=\"true\">・</span>\n <span class=\"sui-activity-feed__timestamp\">{{ item.timestamp }}</span>\n </div>\n\n <!-- File attachments -->\n @if (item.type === 'file') {\n <div class=\"sui-activity-feed__attachments\">\n @for (file of asFile(item).files; track file.name) {\n <div class=\"sui-activity-feed__file\">\n <div class=\"sui-activity-feed__file-content\">\n <sui-icon name=\"attachment-2\" [size]=\"20\" class=\"sui-activity-feed__file-icon\" />\n <span class=\"sui-activity-feed__file-name\">{{ file.name }}</span>\n @if (file.size) {\n <span class=\"sui-activity-feed__file-size\">{{ file.size }}</span>\n }\n </div>\n <button\n type=\"button\"\n class=\"sui-activity-feed__file-download\"\n [attr.aria-label]=\"'Descargar ' + file.name\"\n (click)=\"onFileDownload(item, file, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"download-2-line\" [size]=\"18\" />\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Comment bubble -->\n @if (item.type === 'comment') {\n <div class=\"sui-activity-feed__comment\">\n <sui-icon name=\"chat-1-line\" [size]=\"20\" class=\"sui-activity-feed__comment-icon\" />\n <span class=\"sui-activity-feed__comment-text\">{{ asComment(item).comment }}</span>\n <button\n type=\"button\"\n class=\"sui-activity-feed__reply\"\n (click)=\"onReply(item, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n {{ asComment(item).replyLabel ?? 'Reply' }}\n </button>\n </div>\n }\n\n <!-- Avatar group pill -->\n @if (item.type === 'avatar-group') {\n <div class=\"sui-activity-feed__avatar-group\">\n <div class=\"sui-activity-feed__avatar-stack\">\n @for (av of asAvatarGroup(item).avatars; track $index) {\n <sui-avatar\n class=\"sui-activity-feed__stack-avatar\"\n size=\"sm\"\n [src]=\"av.src ?? null\"\n [initials]=\"av.initials ?? ''\"\n [color]=\"av.color ?? 'slate'\"\n [bgColor]=\"av.bgColor ?? null\"\n />\n }\n </div>\n @if (asAvatarGroup(item).extraCount; as extra) {\n <span class=\"sui-activity-feed__avatar-extra\">+{{ extra }}</span>\n }\n </div>\n }\n\n <!-- Task status chips -->\n @if (item.type === 'tasks') {\n <div class=\"sui-activity-feed__tasks\">\n @for (task of asTasks(item).tasks; track $index) {\n <div class=\"sui-activity-feed__task\" [attr.data-state]=\"task.state\">\n <sui-icon [name]=\"taskIcon(task.state)\" [size]=\"20\" class=\"sui-activity-feed__task-icon\" />\n <span class=\"sui-activity-feed__task-label\">{{ task.label }}</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Trailing 3-dot menu -->\n @if (item.showAction !== false) {\n <button\n type=\"button\"\n class=\"sui-activity-feed__action\"\n aria-label=\"Más opciones\"\n (click)=\"onAction(item, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"more-2-line\" [size]=\"18\" />\n </button>\n }\n </article>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiActivityFilterState = 'default' | 'active';\n\n/**\n * SUI Activity Filter — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 165967:3881 (\"Activity Feed Selected Filter [1.1]\")\n *\n * EXACT (pulled from Figma):\n * Container px-10 py-4, gap-6, rounded-8, items-center, justify-center\n * Icon size 18×18 (slot, default file-list-2-line)\n * Typography Inter Medium 14/20, letter-spacing -0.6%\n * States\n * Default bg-white-0 + border stroke/soft-200 + text/sub-600 + icon gray\n * Hover bg-weak-50 + NO border + text/sub-600 (visual only, via CSS :hover)\n * Active bg primary-alpha-10 (rgba(71,108,255,0.1)) + NO border + text/icon primary-base\n *\n * Token map (Figma → sui-tokens.scss):\n * bg/white-0 → --sui-bg-white-0\n * bg/weak-50 → --sui-bg-weak-50\n * stroke/soft-200 → --sui-stroke-soft-200\n * text/sub-600 → --sui-text-sub-600\n * primary-base #335cff → --sui-primary-base (project remaps to #fa7319)\n * alpha/primary-alpha-10 → --sui-primary-alpha-10 (rgba project-primary 10%)\n *\n * PENDING VERIFY (inferred):\n * - Hover state: Figma shows bg-weak-50 swap. Implemented via CSS :hover instead\n * of a separate prop (Figma \"Hover\" variant = visual mockup of CSS hover).\n * - Active hover: not specified — assumed same active background.\n * - Disabled state: not in Figma — using opacity 0.4 + pointer-events: none per\n * project convention.\n * - Focus ring: 2px outline using --sui-primary-base.\n *\n * Usage:\n * <sui-activity-filter [active]=\"selected() === 'files'\" icon=\"file-list-2-line\"\n * (click)=\"selected.set('files')\">Files</sui-activity-filter>\n */\n@Component({\n selector: 'sui-activity-filter',\n templateUrl: './sui-activity-filter.html',\n styleUrl: './sui-activity-filter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '[attr.aria-pressed]': 'active()',\n /* iOS WKWebView fix — sin estos, el :active queda stuck 300-500ms\n en pages standalone. Ver feedback_ios_active_stuck.md */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event); $event.preventDefault()',\n },\n})\nexport class SuiActivityFilter {\n readonly active = input(false);\n readonly disabled = input(false);\n readonly icon = input<string | null>('file-list-2-line');\n\n readonly clicked = output<Event>();\n\n readonly state = computed<SuiActivityFilterState>(() => this.active() ? 'active' : 'default');\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","@if (icon(); as i) {\n <sui-icon [name]=\"i\" [size]=\"18\" class=\"sui-activity-filter__icon\" />\n}\n<span class=\"sui-activity-filter__label\"><ng-content /></span>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiLinkButtonVariant = 'gray' | 'black' | 'primary' | 'error' | 'modifiable';\nexport type SuiLinkButtonSize = 'medium' | 'small';\n\n/**\n * SUI Link Button — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 168:4889 (\"Link Buttons [1.1]\") — 80 variants total\n *\n * EXACT (pulled from Figma + verified against sui-tokens.scss):\n * Anatomy\n * Container flex / inline-flex, gap=4px, items=center\n * Medium size text 14/20/-0.6%, icons 20×20\n * Small size text 12/16/0, icons 16×16\n * Font features 'ss11' 1, 'calt' 0, 'liga' 0\n * Underline (hover / focus / underline=on): línea continua SOLO\n * bajo el texto (los iconos chevron NO van subrayados —\n * Figma 169:1391/169:1419: la clase `underline` vive solo\n * en el <p>). Implementado vía ::after en\n * .sui-link-button__text (NO `text-decoration` sobre el\n * flex, que se fragmentaba en 3 trazos icon|text|icon).\n * Variant × State color matrix\n * Gray Default → text/sub-600 | Hover → sub-600 + underline | Focus → strong-950 + underline | Disabled → disabled-300\n * Black Default → text/strong-950 | Hover → strong-950 + underline\n * Primary Default → primary-base | Hover → primary-dark + underline\n * Error Default → state/error/base | Hover → red/700 + underline\n * Modifiable → currentColor (consumer-controlled)\n *\n * Token map (Figma → sui-tokens.scss):\n * text/sub-600 #5c5c5c → --sui-text-sub-600\n * text/strong-950 #171717 → --sui-text-strong-950\n * text/disabled-300 #d1d1d1 → --sui-text-disabled-300\n * primary-base #335cff → --sui-primary-base (project remaps to orange #fa7319)\n * primary-dark #2547d0 → --sui-primary-dark (project remaps to dark orange #e16614)\n * state/error/base #fb3748 → --sui-state-error-base\n * red/700 #d02533 → --sui-red-700\n * icon/* same as text/* per token level\n *\n * FOCUS states PULLED from Figma (2026-05-29) — el Focus mantiene el color\n * BASE + underline; solo el Hover oscurece. Nodos verificados:\n * Gray focus 169:1034 → strong-950 + underline\n * Black focus 169:1090 → strong-950 + underline\n * Primary focus 169:1138 → primary-base (NO dark) + underline\n * Error focus 169:1187 → error-base (NO red-700) + underline\n * (Hover: Primary 169:1134 → primary-dark; Error 169:1183 → red-700)\n *\n * PENDING VERIFY (inferred, NOT pulled):\n * - Modifiable Focus / Hover / Disabled: currentColor para hover/focus; disabled assumed --sui-text-disabled-300\n * - Underline=On styling para todos: misma decoration spec que Gray (decoration solid, thickness/position from-font, skip-ink none)\n * - Active state: no es variante Figma; tactile-press scale(0.97) por convención project\n * - Figma usa font-feature 'cv09' 1 además de 'ss11' 1 'calt' 0 'liga' 0; SUI omite cv09 (alterna del 9) — diferencia tipográfica menor, no afecta layout\n *\n * Usage:\n * <sui-link-button variant=\"primary\" leftIcon=\"arrow-left-s-line\">Volver</sui-link-button>\n * <sui-link-button variant=\"error\" [underline]=\"true\" (click)=\"onDelete()\">Eliminar</sui-link-button>\n * <sui-link-button variant=\"primary\" href=\"https://docs.example\" target=\"_blank\">Ver documentación</sui-link-button>\n *\n * Floating vs inline: el componente es `display: inline-flex` con baseline align,\n * por lo que fluye dentro de un párrafo como un link normal. Para uso \"flotante\"\n * (toast actions, notification CTA), el consumer lo posiciona libremente — el\n * componente no impone position/z-index propios.\n */\n@Component({\n selector: 'sui-link-button',\n templateUrl: './sui-link-button.html',\n styleUrl: './sui-link-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-underline]': 'underline() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiLinkButton {\n readonly variant = input<SuiLinkButtonVariant>('gray');\n readonly size = input<SuiLinkButtonSize>('medium');\n readonly underline = input(false);\n readonly disabled = input(false);\n readonly leftIcon = input<string | null>(null);\n readonly rightIcon = input<string | null>(null);\n /** Cuando se setea, el componente renderiza un <a> nativo en vez de <button>. */\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>(null);\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly ariaLabel = input<string | null>(null);\n\n readonly clicked = output<MouseEvent>();\n\n readonly iconSize = computed<number>(() => (this.size() === 'medium' ? 20 : 16));\n\n readonly isAnchor = computed<boolean>(() => !!this.href() && !this.disabled());\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-link-button__el\"\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"rel()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (leftIcon()) {\n <sui-icon class=\"sui-link-button__icon\" [name]=\"leftIcon()!\" [size]=\"iconSize()\" />\n }\n <span class=\"sui-link-button__text\"><ng-content /></span>\n @if (rightIcon()) {\n <sui-icon class=\"sui-link-button__icon\" [name]=\"rightIcon()!\" [size]=\"iconSize()\" />\n }\n </a>\n} @else {\n <button\n class=\"sui-link-button__el\"\n [type]=\"type()\"\n [disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (leftIcon()) {\n <sui-icon class=\"sui-link-button__icon\" [name]=\"leftIcon()!\" [size]=\"iconSize()\" />\n }\n <span class=\"sui-link-button__text\"><ng-content /></span>\n @if (rightIcon()) {\n <sui-icon class=\"sui-link-button__icon\" [name]=\"rightIcon()!\" [size]=\"iconSize()\" />\n }\n </button>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiCompactButtonStyle = 'stroke' | 'ghost' | 'modifiable' | 'white';\nexport type SuiCompactButtonSize = 'medium' | 'large' | 'xlarge';\n// xlarge: project extension (no-Figma), sigue el patrón Δ4px de sui-checkbox/radio/switch\n\n/**\n * SUI Compact Button — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 189:3646 (\"Compact Button [1.1]\") — 64 variants total\n * 4 styles × 4 states × 2 sizes × 2 fullRadius\n *\n * Icon-only square (o circular si fullRadius=true) button. Minimal padding 2px,\n * perfecto para toolbars densos, header actions, table row actions, close X en\n * modales, etc. Diferencia vs sui-compact-avatar-group: este es un BOTÓN (clickeable)\n * con un solo icono; el grupo de avatares no es interactivo.\n *\n * EXACT (pulled from Figma):\n * Container:\n * padding: 2px (uniform — todo el espacio lo come el icono)\n * border-radius: 6px (fullRadius=off) | 999px (fullRadius=on, circular)\n * items-center, justify-center\n *\n * Sizes:\n * Large: 24×24 container, icon 20×20\n * Medium: 20×20 container, icon 16×16\n *\n * Style=Stroke (node 189:3645):\n * bg: var(--sui-bg-white-0)\n * border: 1px solid var(--sui-stroke-soft-200)\n * shadow: 0 1px 2px rgba(10,13,20,.03) (regular-shadow x-small)\n * icon: var(--sui-icon-sub-600) (gray)\n *\n * Style=Ghost (node 189:3674):\n * bg: transparent\n * border: none\n * shadow: none\n * icon: var(--sui-icon-sub-600) default → strong-950 hover\n *\n * Style=Modifiable (node 190:3808):\n * bg: transparent\n * border: none\n * shadow: none\n * icon: currentColor (consumer-controlled)\n *\n * Style=White (node 189:3698):\n * bg: var(--sui-bg-white-0)\n * border: none (sutil diferencia con stroke)\n * shadow: 0 1px 2px rgba(10,13,20,.03)\n * icon: var(--sui-icon-strong-950)\n *\n * HOVER/ACTIVE states (PULLED from Figma 2026-05-29 — ya NO inferidos):\n * stroke → hover 189:3647 bg-weak-50 + border desaparece;\n * active 189:3653 bg-surface-800 (#262626) + icon white-0\n * ghost → hover bg-weak-50 (icon strong-950);\n * active 189:3678 bg-surface-800 (#262626) + icon white-0\n * modifiable → hover 190:3810 alpha/white/alpha-16 (#ffffff29);\n * active 190:3812 alpha/white/alpha-16 + 1px solid white border\n * (escape hatch consumer: --sui-compact-button-hover-bg / -active-bg)\n * white → hover bg-weak-50; active bg-surface-800 + icon white-0 (homologado)\n *\n * PENDING VERIFY (no pulled per-state, baja prioridad):\n * - Ghost hover bg-weak-50 (Figma 189:3676 no pulleado, inferido del Ghost active+Stroke hover)\n * - White active bg-surface-800 (homologado con stroke/ghost; nodo White active no pulleado)\n * - Disabled: icon=icon-disabled-300, opacity 0.5 (Figma 189:3659 — patrón estándar)\n *\n * Usage:\n * <sui-compact-button icon=\"close-line\" (clicked)=\"close()\" />\n * <sui-compact-button icon=\"more-2-line\" variantStyle=\"ghost\" size=\"medium\" />\n * <sui-compact-button icon=\"settings-3-line\" [fullRadius]=\"true\" />\n */\n@Component({\n selector: 'sui-compact-button',\n templateUrl: './sui-compact-button.html',\n styleUrl: './sui-compact-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-style]': 'variantStyle()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-full-radius]': 'fullRadius() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiCompactButton {\n readonly icon = input.required<string>();\n readonly variantStyle = input<SuiCompactButtonStyle>('stroke');\n readonly size = input<SuiCompactButtonSize>('large');\n readonly fullRadius = input(false);\n readonly disabled = input(false);\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>('noopener noreferrer');\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly ariaLabel = input.required<string>();\n\n readonly clicked = output<MouseEvent>();\n\n readonly iconSize = computed<number>(() => {\n switch (this.size()) {\n case 'xlarge': return 24;\n case 'large': return 20;\n default: return 16; // medium\n }\n });\n readonly isAnchor = computed<boolean>(() => !!this.href() && !this.disabled());\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-compact-button__el\"\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"rel()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </a>\n} @else {\n <button\n class=\"sui-compact-button__el\"\n [type]=\"type()\"\n [disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon [name]=\"icon()\" [size]=\"iconSize()\" />\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\nexport type SuiAlertVariant = 'info' | 'success' | 'warning' | 'error' | 'feature';\nexport type SuiAlertStyle = 'filled' | 'light' | 'lighter' | 'stroke' | 'stroke-dark';\nexport type SuiAlertSize = 'xsmall' | 'small' | 'large' | 'xlarge';\n// xlarge: project extension (no-Figma), escala +Δ sobre large (ver .scss)\n\n/**\n * Action declarativo del alert. Canon SUI (Figma 170:1465 con\n * `doubleLink=true`): action[0] usa `underline: true`, el resto plain.\n * Si se pasa `href`, renderiza como `<a>`; sino como `<button>`.\n *\n * Color (canon SUI — verificado 2026-05-29 vs nodes 170:1465 filled,\n * 170:2985 lighter, 170:3595 stroke): los actions usan el color del TEXTO\n * del alert, NO el color del variant/icono.\n * - filled → white (= text/icon, neutral/slate/0)\n * - light/lighter/stroke → text/strong-950 (#171717) — mismo que el texto,\n * NO el variant base (azul info / rojo error)\n * - stroke-dark → white (extraFeature del proyecto)\n * Solo el icono leading toma el color del variant base. El middle-dot (∙)\n * usa el color del texto a opacity 48.\n * Override puntual: setear `color` con cualquier CSS color (hex, rgb,\n * var(--token)) o un literal canon ('neutral' usa text-strong-950).\n */\nexport interface SuiAlertAction {\n label: string;\n onClick?: () => void;\n underline?: boolean;\n href?: string;\n target?: '_blank' | '_self' | '_parent' | '_top';\n /** Override del color del link. Default = auto por variant×style. */\n color?: string;\n}\n\n/**\n * SUI Alert — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * Nodes pulled for verification:\n * 169:2394 — Error / Filled / Large\n * 170:1465 — Info / Filled / Large\n * 170:2985 — Info / Lighter / Large\n * 170:3595 — Info / Stroke / Large\n * 169:2580 — Error / Filled / X-Small (32)\n * 170:2917 — Info / Lighter / X-Small (32)\n *\n * EXACT specs from Figma:\n * Container:\n * padding: pt=14px pb=16px px=14px\n * gap (icon↔content): 12px\n * border-radius: --sui-radius-12 (12px)\n * overflow: hidden\n *\n * Filled style:\n * bg: --sui-state-{variant}-base\n * text (title+desc): --sui-static-white\n * icon color: white\n * close icon opacity: 0.72\n *\n * Light style:\n * bg: --sui-state-{variant}-light\n * text: --sui-text-strong-950\n * icon: --sui-state-{variant}-base\n * close icon opacity: 0.40\n *\n * Lighter style:\n * bg: --sui-state-{variant}-lighter\n * text title: --sui-text-strong-950\n * text desc: opacity 0.72 on strong-950\n * icon: --sui-state-{variant}-base\n * close icon opacity: 0.40\n *\n * Stroke style:\n * bg: --sui-bg-white-0\n * border: 1px solid --sui-stroke-soft-200\n * shadow: --sui-regular-shadow-medium (0 16px 32px -12px rgba(14,18,27,.10))\n * text title: --sui-text-strong-950\n * text desc: --sui-text-sub-600\n * icon: --sui-state-{variant}-base\n * close icon opacity: 0.40\n *\n * Content block gap: 10px (text stack), inner text gap: 4px (title ↔ desc)\n *\n * Typography PER SIZE (verified 2026-05-29 vs Figma component set 169:2399):\n * large title → Label/Small (14/500/20px/-0.006em) [node 170:1839]\n * large desc → Paragraph/Small (14/400/20px/-0.006em) opacity-72\n * small title → Paragraph/Small (14/400/20px/-0.084px) [node 170:1282]\n * xsmall title → Paragraph/X-Small (12/400/16px/0) [node 169:2580/170:2902]\n * ⇒ ONLY the large title is a Label (medium 500). The single-line\n * xsmall/small \"title\" is rendered as a Paragraph (regular 400).\n *\n * Icon size PER SIZE (verified 2026-05-29 vs Figma):\n * xsmall → 16px (leading + close) [node 169:2580 size-[16px]]\n * small → 20px (leading + close) [node 170:1282 size-[20px]]\n * large → 20px (leading + close) [node 170:1839 size-[20px]]\n *\n * Icon map (Remix):\n * info → information-fill\n * success → checkbox-circle-fill\n * warning → alert-fill\n * error → error-warning-fill\n * feature → sparkling-fill\n *\n * ⚠️ PENDING VERIFY — Feature status color:\n * Figma \"🚀 Feature\" status uses state/faded (gray #7b7b7b) + `magic-fill`\n * icon (nodes 170:1544 / 170:2996). The SUI project established `feature`\n * = state/feature (purple #7d52f4) + `sparkling-fill` across sui-banner +\n * master-preview. Kept purple here to preserve cross-component consistency;\n * flagged for Anthony in newQuestions. If SUI canon must win, remap\n * feature → --sui-state-faded-* + magic-fill in BOTH alert and banner.\n *\n * Sizes (Figma component set 169:2399):\n * xsmall → h=32, padding 8px (uniform), gap 8, radius-8, single-line (no desc/actions)\n * small → h=36, padding 8px 10px, gap 8, radius-8, single-line (no desc/actions)\n * large → padding 14px 14px 16px, gap 12, radius-12 (default — full layout)\n */\n@Component({\n selector: 'sui-alert',\n templateUrl: './sui-alert.html',\n styleUrl: './sui-alert.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, NgTemplateOutlet, SuiLinkButton, SuiCompactButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n },\n})\nexport class SuiAlert {\n readonly variant = input<SuiAlertVariant>('info');\n readonly variantStyle = input<SuiAlertStyle>('lighter');\n readonly size = input<SuiAlertSize>('large');\n readonly title = input<string | null>(null);\n readonly description = input<string | null>(null);\n readonly showIcon = input(true);\n readonly dismissible = input(false);\n\n /**\n * Cuando `true` (default), al presionar el X el alert se oculta a sí\n * mismo (set `dismissed = true`). Cuando `false`, el alert solo emite\n * el evento `closed` y deja al consumer manejar el unmount — útil\n * cuando el parent necesita animar la salida ANTES de quitar el alert\n * del DOM (ej. `sui-toast-outlet` que aplica fade-out con CSS antes de\n * `svc.dismiss`). Sin esto, en sui-toast el `dismissed=true` se aplicaba\n * inmediato al click X y el alert desaparecía sin animación.\n */\n readonly autoHideOnDismiss = input(true);\n\n /**\n * Actions declarativos canon SUI (Figma 170:1465 — pattern doubleLink).\n * Si se pasan, renderiza link-buttons con middle-dot separator automático\n * entre items, con colors correctos por `variantStyle` = color del TEXTO\n * (white en filled, text/strong-950 en lighter/light/stroke). NO el color\n * del variant/icono.\n *\n * Si vacío (default), cae al slot legacy `<ng-content select=\"[slot=action]\" />`\n * que acepta proyección manual (HTML libre).\n *\n * Convención canon: action[0].underline = true (primary), rest plain.\n */\n readonly actions = input<readonly SuiAlertAction[]>([]);\n\n readonly dismissed = signal(false);\n readonly closed = output<void>();\n\n readonly iconName = computed((): string => {\n const map: Record<SuiAlertVariant, string> = {\n info: 'information-fill',\n success: 'checkbox-circle-fill',\n warning: 'alert-fill',\n error: 'error-warning-fill',\n feature: 'sparkling-fill',\n };\n return map[this.variant()];\n });\n\n /**\n * Layout completo: descripción + acciones APILADAS debajo del texto. Lo tienen\n * `large` (canon Figma) y `xlarge`. `xsmall`/`small` son single-line: título +\n * (opcional) una acción INLINE a la derecha + cierre — canon Figma (el link\n * \"Upgrade\" de los alerts chicos). El render de acciones es el mismo `actions()`;\n * sólo cambia la ubicación (apilada en full, inline en compacto).\n */\n readonly isFullLayout = computed(\n (): boolean => this.size() === 'large' || this.size() === 'xlarge',\n );\n\n /**\n * Tamaño del `sui-link-button` de las acciones: `medium` (14/20) en large/xlarge,\n * `small` (12/16) en los compactos (small/xsmall). Mapea el tipo del action al\n * tamaño del alert.\n */\n readonly actionLinkSize = computed<'medium' | 'small'>(() =>\n this.isFullLayout() ? 'medium' : 'small',\n );\n\n /**\n * Tamaño del `sui-compact-button` del cierre, mapeado del size del alert para\n * conservar el footprint del icono: xsmall (icon 16) → compact `medium`;\n * small/large (icon 20) → `large`; xlarge (icon 24) → `xlarge`.\n */\n readonly closeButtonSize = computed<'medium' | 'large' | 'xlarge'>(() => {\n switch (this.size()) {\n case 'xsmall': return 'medium';\n case 'xlarge': return 'xlarge';\n default: return 'large';\n }\n });\n\n /**\n * Icon size per size variant (leading + close icons).\n * Figma: xsmall=16px, small=20px, large=20px. Verified 2026-05-29.\n * xlarge=24px (project extension, +Δ4 sobre large — espeja el .scss).\n */\n readonly iconSize = computed((): number => {\n switch (this.size()) {\n case 'xsmall':\n return 16;\n case 'xlarge':\n return 24;\n default:\n return 20;\n }\n });\n\n onDismiss(): void {\n if (this.autoHideOnDismiss()) {\n this.dismissed.set(true);\n }\n this.closed.emit();\n }\n}\n","@if (!dismissed()) {\n <div\n class=\"sui-alert\"\n [attr.data-sui-variant]=\"variant()\"\n [attr.data-sui-style]=\"variantStyle()\"\n role=\"alert\"\n >\n @if (showIcon()) {\n <div class=\"sui-alert__icon\" aria-hidden=\"true\">\n <sui-icon [name]=\"iconName()\" [size]=\"iconSize()\" />\n </div>\n }\n\n <div class=\"sui-alert__content\">\n @if (title()) {\n <p class=\"sui-alert__title\">{{ title() }}</p>\n }\n @if (isFullLayout() && description()) {\n <p class=\"sui-alert__description\" [innerHTML]=\"description()\"></p>\n }\n @if (isFullLayout()) {\n @if (actions().length > 0) {\n <!-- Actions declarativos APILADOS (canon SUI: link + middle-dot + link). -->\n <div class=\"sui-alert__actions\">\n <ng-container [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n } @else {\n <!-- Slot legacy para proyección manual cuando se necesita HTML custom. -->\n <div class=\"sui-alert__actions\">\n <ng-content select=\"[slot=action]\" />\n </div>\n }\n }\n </div>\n\n <!-- Compacto (small/xsmall): la acción va INLINE, alineada a la derecha\n antes del cierre — canon Figma (el link \"Upgrade\" de los alerts chicos).\n El `.sui-alert__content` (flex:1) la empuja contra el borde derecho. -->\n @if (!isFullLayout() && actions().length > 0) {\n <div class=\"sui-alert__actions sui-alert__actions--inline\">\n <ng-container [ngTemplateOutlet]=\"actionsTpl\" />\n </div>\n }\n\n @if (dismissible()) {\n <!-- Cierre = COMPONENTE sui-compact-button (variant modifiable → el icono\n hereda el currentColor del alert), NO un <button> maqueta. -->\n <sui-compact-button\n class=\"sui-alert__close\"\n icon=\"close-line\"\n variantStyle=\"modifiable\"\n [size]=\"closeButtonSize()\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"onDismiss()\"\n />\n }\n </div>\n}\n\n<!-- Render compartido de acciones — usa el COMPONENTE sui-link-button (variant\n `modifiable` hereda el currentColor del alert), NO markup propio. Apiladas\n en full, inline en compacto; separadas por el middle-dot. -->\n<ng-template #actionsTpl>\n @for (a of actions(); track a.label; let i = $index) {\n @if (i > 0) {\n <span class=\"sui-alert__action-sep\" aria-hidden=\"true\">∙</span>\n }\n <sui-link-button\n variant=\"modifiable\"\n [size]=\"actionLinkSize()\"\n [underline]=\"!!a.underline\"\n [href]=\"a.href ?? null\"\n [target]=\"a.target ?? null\"\n [rel]=\"a.target === '_blank' ? 'noopener noreferrer' : null\"\n [style.color]=\"a.color || null\"\n (clicked)=\"a.onClick?.()\"\n >{{ a.label }}</sui-link-button>\n }\n</ng-template>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport type SuiAppStoreBadgeCompany =\n | 'app-store'\n | 'mac-app-store'\n | 'amazon-appstore'\n | 'galaxy-store'\n | 'huawei-appgallery'\n | 'f-droid'\n | 'google-play'\n | 'microsoft-store';\n\nexport type SuiAppStoreBadgeAppearance = 'preferred' | 'alternative';\n\n/**\n * SUI App Store Badge — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 253:6998 (\"App Store Badges [1.1]\") — 16 variants total\n * 8 companies × 2 styles (Preferred = filled dark / Alternative = stroke light)\n *\n * EXACT (pulled from Figma metadata + official brand SVG exports):\n * Height (all variants): 40px\n * Native widths per company:\n * App Store: 120px (node 253:6999 / 253:7069)\n * Mac App Store: 156px (node 253:7003 / 253:7073)\n * Amazon Appstore: 137px (node 253:7007 / 253:7077)\n * Galaxy Store: 147px (node 253:7011 / 253:7081)\n * Huawei AppGallery: 133px (node 253:7016 / 253:7085)\n * F-Droid: 136px (node 253:7022 / 253:7089)\n * Google Play: 136px (node 253:7048 / 253:7100)\n * Microsoft Store: 112px (node 253:7055 / 253:7104)\n * Border radius: 8px\n * Border (Alternative): 1px solid #000000 (var(--sui-text-strong-950) fallback)\n * Background (Preferred): #000000\n *\n * Assets: SVG officially exported from the Figma file by the team. Stored at\n * /public/assets/brand/store-badges/{company}-{style}.svg\n * Each SVG includes the brand logo + locale-EN copy (\"Download on the / App Store\",\n * \"Get it on / Google Play\", etc.). They are vector and scale to any size.\n *\n * Brand compliance: each platform requires the use of their official badge as\n * shipped (no recoloring, no logo modifications). This component renders the\n * badge as an <img> referencing the SVG asset — DO NOT inline the SVG and\n * tweak its paths. Per-platform guidelines:\n * - Apple: https://developer.apple.com/app-store/marketing/guidelines/\n * - Google: https://play.google.com/intl/en_us/badges/\n * - Microsoft: https://developer.microsoft.com/microsoft-store/badge\n *\n * PENDING VERIFY (inferred, NOT pulled from Figma per-state):\n * - Hover state: no variant exists in Figma — implemented as `opacity: 0.85` per\n * Apple Marketing Guidelines recommendation (other platforms silent on hover).\n * - Active state: scale(0.97) per project tactile-press convention.\n * - Focus ring: 2px outline using --sui-primary-base (project convention) — Figma\n * badges have no focus variant.\n * - Disabled state: opacity 0.4, pointer-events none. NOT in Figma source.\n *\n * Usage:\n * <sui-app-store-badge company=\"app-store\" appearance=\"preferred\" />\n * <sui-app-store-badge\n * company=\"google-play\"\n * appearance=\"alternative\"\n * href=\"https://play.google.com/store/apps/details?id=com.masterpedidos.app\"\n * target=\"_blank\"\n * ariaLabel=\"Descargar Master Pedidos en Google Play\" />\n *\n * When `href` is set, renders an <a>. Otherwise renders a plain <span> wrapper.\n *\n * Sizing: `[height]` scales the badge proportionally. Width is computed from the\n * native aspect ratio per company. Default height 40px = native Figma size.\n */\n@Component({\n selector: 'sui-app-store-badge',\n templateUrl: './sui-app-store-badge.html',\n styleUrl: './sui-app-store-badge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-company]': 'company()',\n '[attr.data-sui-appearance]': 'appearance()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[style.--sui-app-store-badge-height]': 'heightPx()',\n },\n})\nexport class SuiAppStoreBadge {\n readonly company = input.required<SuiAppStoreBadgeCompany>();\n /**\n * Variante visual del badge. Se llama `appearance` para no colisionar con\n * el atributo HTML nativo `style=\"...\"` (el linter trata de parsearlo como CSS).\n */\n readonly appearance = input<SuiAppStoreBadgeAppearance>('preferred');\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>('noopener');\n readonly height = input<number>(40);\n readonly disabled = input(false);\n readonly ariaLabel = input<string | null>(null);\n\n readonly heightPx = computed(() => `${this.height()}px`);\n\n /** Path al SVG canon. Las URLs son estables (assets versionados). */\n readonly src = computed(() => `/assets/brand/store-badges/${this.company()}-${this.appearance()}.svg`);\n\n /** Alt automático derivado del company (override con ariaLabel para CTAs reales). */\n readonly alt = computed(() => {\n const label = this.ariaLabel();\n if (label) return label;\n const company = this.company();\n const map: Record<SuiAppStoreBadgeCompany, string> = {\n 'app-store': 'Download on the App Store',\n 'mac-app-store': 'Download on the Mac App Store',\n 'amazon-appstore': 'Available at Amazon Appstore',\n 'galaxy-store': 'Available on Galaxy Store',\n 'huawei-appgallery': 'Explore it on AppGallery',\n 'f-droid': 'Get it on F-Droid',\n 'google-play': 'Get it on Google Play',\n 'microsoft-store': 'Get it from Microsoft',\n };\n return map[company];\n });\n\n readonly isAnchor = computed(() => !!this.href() && !this.disabled());\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-app-store-badge__link\"\n [attr.href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"target() === '_blank' ? rel() : null\"\n [attr.aria-label]=\"alt()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <img class=\"sui-app-store-badge__img\" [src]=\"src()\" [alt]=\"alt()\" />\n </a>\n} @else {\n <img class=\"sui-app-store-badge__img\" [src]=\"src()\" [alt]=\"alt()\" />\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SuiAvatar, type SuiAvatarColor, type SuiAvatarSize } from '../sui-avatar/sui-avatar';\n\n/**\n * SUI Avatar Group — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 581:6198 (\"Avatar Group [1.1]\") — 9 sizes (20/24/32/40/48/56/64/72/80)\n *\n * Stack horizontal de avatares con overlap específico por size + opcional\n * \"+N\" pill al final cuando se trunca por `max`.\n *\n * EXACT (pulled from Figma 581:6198):\n * - Overlap (margin-right negativo entre avatares):\n * xs/sm (20/24) → -4px\n * md (32) → -6px\n * lg/xl (40/48) → -12px\n * 2xl–5xl (56+) → -16px\n * - Border: 2px solid var(--sui-bg-white-0) en cada avatar y en la pill.\n * - \"+N\" pill: bg=var(--bg/weak-50) #f7f7f7 (= --sui-bg-weak-50, valor canon\n * #f7f7f7 verificado en get_variable_defs), color=var(--text/sub-600) #5c5c5c,\n * fully rounded, mismo diámetro que el avatar.\n * - Typography del \"+N\" pill (Figma 581:6198, verificado per-size 2026-05-29).\n * NO es la misma rampa que el initial de sui-avatar — diverge en xs/xl/2xl:\n * xs (20) → Subheading/2X Small 11 / 12 / 0.02em UPPERCASE\n * sm (24) → Label/X Small 12 / 16 / 0\n * md (32) → Label/Small 14 / 20 / -0.006em\n * lg (40) → Label/Medium 16 / 24 / -0.011em\n * xl (48) → Title/H6 20 / 28 / 0\n * 2xl–5xl → Title/H5 24 / 32 / 0\n * Detalle de cada estilo y los node-ids fuente están en el .scss.\n *\n * PENDING VERIFY (inferred — NOT pulled from Figma):\n * - Font-family: el proyecto usa Satoshi, el canon Figma usa Inter / Inter\n * Display. Por decisión explícita del user (2026-05-15) NO se cambia la\n * family — sí se respetan size / line-height / letter-spacing / uppercase.\n * - El max default = 4 (no extraído de Figma — convención del DS).\n *\n * Uso:\n * <sui-avatar-group\n * size=\"md\"\n * [items]=\"[{src:'...'},{initials:'JD',color:'blue'},...]\"\n * [max]=\"4\"\n * />\n */\n\nexport interface SuiAvatarGroupItem {\n src?: string;\n initials?: string;\n color?: SuiAvatarColor;\n alt?: string;\n}\n\n@Component({\n selector: 'sui-avatar-group',\n standalone: true,\n templateUrl: './sui-avatar-group.html',\n styleUrl: './sui-avatar-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiAvatar],\n host: {\n '[attr.data-sui-size]': 'size()',\n },\n})\nexport class SuiAvatarGroup {\n readonly size = input<SuiAvatarSize>('md');\n readonly items = input<readonly SuiAvatarGroupItem[]>([]);\n /** Máximo de avatares visibles antes de colapsar en \"+N\". Default 4. */\n readonly max = input<number>(4);\n\n readonly visibleItems = computed(() => this.items().slice(0, this.max()));\n readonly overflow = computed(() => Math.max(0, this.items().length - this.max()));\n readonly overflowLabel = computed(() => `+${this.overflow()}`);\n}\n","<div class=\"sui-avatar-group__stack\">\n @for (item of visibleItems(); track $index) {\n <sui-avatar\n class=\"sui-avatar-group__item\"\n [size]=\"size()\"\n [src]=\"item.src ?? null\"\n [initials]=\"item.initials ?? ''\"\n [color]=\"item.color ?? 'slate'\"\n [alt]=\"item.alt ?? ''\"\n />\n }\n @if (overflow() > 0) {\n <span class=\"sui-avatar-group__more\" [attr.aria-label]=\"overflowLabel() + ' más'\">\n {{ overflowLabel() }}\n </span>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport type SuiBadgeColor =\n | 'gray'\n | 'blue'\n | 'orange'\n | 'red'\n | 'green'\n | 'yellow'\n | 'purple'\n | 'sky'\n | 'pink'\n | 'teal';\n\nexport type SuiBadgeVariant = 'filled' | 'light' | 'lighter' | 'stroke' | 'dark';\nexport type SuiBadgeSize = 'small' | 'medium';\nexport type SuiBadgeType = 'basic' | 'with-dot' | 'left-icon' | 'right-icon' | 'number';\n\n/**\n * SUI Badge — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Variants pulled for verification:\n * - 118:2584 Basic/Filled/Small/Gray\n * - 118:2587 Basic/Light/Small/Gray\n * - 118:2590 Basic/Lighter/Small/Gray\n * - 118:2616 With Dot/Filled/Small/Gray\n * - 118:2322 Left Icon/Light/Small/Gray\n * - 289:7551 Right Icon/Stroke/Small/Gray\n * - 118:2686 Basic/Filled/Small/Gray/Number=On\n * - 119:2361 Basic/Filled/Medium/Gray\n *\n * EXACT (pulled):\n * - Small: padding py=2px, font Subheading/2X Small 11/12/0.22px UPPERCASE, ss11 features\n * - Medium basic: padding px=8 py=2 (119:2361), font Label/X Small 12/16/0 NO uppercase, ss11\n * - Radius: 999 (full)\n * - Per-type padding Small: Basic=px8 / LeftIcon=pl4 pr8 / RightIcon=pl8 pr4 /\n * WithDot=pr8 ONLY (no left, no py) / Number=p2 (near-square, text w12)\n * - WithDot box: dot vive en CONTAINER 16×16 (full-height del badge small),\n * círculo r=2 → DIÁMETRO 4px centrado (asset SVG 118:2632). El dot del Badge\n * regular (4px) es DISTINTO del dot del sui-status-badge (6px, r=3) — assets\n * separados en el DS, NO unificar.\n * - WithDot Medium (119:2369): padding pl2 pr8 py2, dot box SIGUE 16×16 (NO 20).\n * - Style colors: Filled=bg-base+text-white, Light=bg-light+text-dark,\n * Lighter=bg-lighter+text-BASE (NOT dark!), Stroke=border1-base+text-base\n *\n * INFERRED (declared approximations):\n * - Medium Left/Right Icon padding: same asymmetric pattern as Small (4/8 vs 8/4)\n * - Medium Number: p=2 (proportional to Small)\n * - Medium icon size: 16x16 (scaled from Small's 12x12)\n *\n * PENDING VERIFY (inferido, sin confirmar pixel-exacto en Figma):\n * - Medium Left Icon / Right Icon: el padding asimétrico (pl4/pr8, pl8/pr4) se\n * asumió igual al Small. No se pulló la variante Medium+LeftIcon/RightIcon\n * específica del archivo — el frame 118:2324 es too-large para pull directo.\n * - Medium icon slot size 16×16: escalado del Small (12×12) sin confirmar contra\n * una variante Medium con icono real.\n * - Number type: el width del label (12px small / 16px medium) y el padding p2\n * se infirieron de la variante Small Number=On (118:2686); no se confirmó si\n * un número de 2 dígitos ('99') reflowea el width o se mantiene fijo.\n * - Disabled: Figma demuestra Disabled=On solo en color Gray (representativo).\n * El override universal a tokens disabled (todos los colores) es extrapolación\n * intencional — más completa que la demo, asumida consistente con SUI 2.0.\n *\n * CUSTOM (not in Figma 118:2324 — add-on local del proyecto):\n * - `variant='dark'` — glass translúcido vibrante pensado para superficies\n * oscuras. El color tiñe el bg (22% alpha) y borde (45% alpha) del\n * state-base, texto blanco para contraste. Se mantiene porque está en\n * uso en pantallas con backgrounds oscuros (master-preview, etc.).\n * Sin `[color]`, cae al fallback white-glass neutral.\n *\n * - `disabled` state: implementado con override de bg/border/text a tokens\n * disabled-300 y faded-light/lighter (matchea visual figma), NO con\n * `opacity` (que produciría tintes desaturados en lugar de gris uniforme).\n */\n@Component({\n selector: 'sui-badge',\n templateUrl: './sui-badge.html',\n styleUrl: './sui-badge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-color]': 'color()',\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"status\"',\n },\n})\nexport class SuiBadge {\n readonly color = input<SuiBadgeColor>('gray');\n readonly variant = input<SuiBadgeVariant>('lighter');\n readonly size = input<SuiBadgeSize>('small');\n readonly type = input<SuiBadgeType>('basic');\n readonly disabled = input(false);\n\n /** Internal: true when the badge renders its built-in dot (type=with-dot). */\n readonly showsDot = computed(() => this.type() === 'with-dot');\n}\n","@if (showsDot()) {\n <span class=\"sui-badge__dot\" aria-hidden=\"true\"></span>\n}\n<ng-content select=\"[data-slot=start]\"></ng-content>\n<span class=\"sui-badge__label\"><ng-content></ng-content></span>\n<ng-content select=\"[data-slot=end]\"></ng-content>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\nexport type SuiBannerVariant = 'info' | 'success' | 'warning' | 'error' | 'feature';\nexport type SuiBannerStyle = 'filled' | 'light' | 'lighter' | 'stroke';\n\n/**\n * SUI Banner — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 224:2249 (\"Banner [1.1]\") — 20 variants total\n *\n * Diferencia vs Alert / Toast / Notification: el Banner es full-width altura\n * fija 44px, pensado para vivir en el top del layout (offline / demo mode /\n * \"actualización disponible\"). No tiene `size` axis — siempre la misma altura.\n *\n * Nodes pulled for verification:\n * 225:208 — Error / Stroke (border-b, white bg)\n * 224:2399 — Error / Light (bg = state-error-light)\n * 224:2616 — Error / Lighter (bg = state-error-lighter)\n *\n * VERIFIED vs Figma design_context (224:2246 Error/Filled, 224:2310 Success/Filled,\n * 224:2369 Feature/Filled) + get_variable_defs:\n * - Filled style: bg=state/{variant}/base, text=static/static-white (#ffffff),\n * CLOSE OPACITY = 0.72 (no 0.48 — el comentario viejo estaba mal; el código SCSS\n * siempre fue correcto con 0.72).\n * - Feature variant uses --sui-state-faded-* (gray, base #7b7b7b), NOT\n * --sui-state-feature-* (purple) que sí usa sui-alert. Decisión deliberada del\n * Banner — el \"🚀 Feature\" se renderiza con el color \"faded\" para \"What's new\" softer.\n * - link button slot text usa neutral/slate/0 (#ffffff) sobre Filled.\n *\n * PENDING VERIFY: (ninguno — todas las variantes confirmadas vía design_context)\n * - Hover/active states: NO aparecen como variantes en Figma 224:2249 — banner es\n * mayoritariamente informativo. No se implementan estados interactivos al container\n * (solo el close button tiene hover/focus-visible por accesibilidad, extraFeature).\n *\n * EXACT specs from Figma:\n * Container:\n * padding: py=12px px=48px\n * height: 44px (fijo, content centrado vertical)\n * gap (icon ↔ text ↔ action): 12px\n * items-center, justify-center (content centered horizontally — patrón\n * distinto del alert que es left-aligned)\n * overflow: clip\n *\n * Text block (inner flex row gap 8):\n * title Label/Small Medium (Inter 500 14/20 -0.6%)\n * ∙ separator Inter Medium 14/20 (mismo color que título)\n * description Paragraph/Small Regular (Inter 400 14/20 -0.6%)\n *\n * Link button slot: ng-content [slot=action]\n * Icon: 20×20 leading\n * Close icon: absolute right=12 top=50% (translateY -50%), 20×20, opacity 0.48\n *\n * Stroke style:\n * bg: --sui-bg-white-0\n * border-bottom: 1px solid --sui-stroke-soft-200\n * text: --sui-text-strong-950\n * icon: --sui-state-{variant}-base\n *\n * Light style:\n * bg: --sui-state-{variant}-light\n * text: --sui-text-strong-950\n * icon: --sui-state-{variant}-base (icon contrasta sobre bg tintado)\n *\n * Lighter style:\n * bg: --sui-state-{variant}-lighter\n * text: --sui-text-strong-950\n * icon: --sui-state-{variant}-base\n *\n * Filled style (verified via design_context):\n * bg: --sui-state-{variant}-base ({variant} = info|success|warning|error|faded)\n * text: --sui-static-white (#ffffff)\n * icon: white\n * close opacity: 0.72 (filled — más visible sobre bg saturado)\n *\n * Icon map. Figma usa nombres internos SUI; se mapean al equivalente RemixIcon:\n * info → information-fill (Figma: information-fill)\n * success → checkbox-circle-fill (Figma: select-box-circle-fill — NO existe en\n * RemixIcon; checkbox-circle-fill es el mismo glyph check-en-círculo,\n * confirmado visualmente vs screenshot 224:2310)\n * warning → alert-fill (Figma: alert-fill)\n * error → error-warning-fill (Figma: error-warning-fill)\n * feature → magic-fill (Figma: magic-fill — EXISTE en RemixIcon, match exacto)\n *\n * pickLeft slot (Figma): `<ng-content select=\"[slot=icon]\" />` permite reemplazar\n * el icono default por contenido custom (logo de app, emoji, avatar) en Feature.\n *\n * Usage:\n * <sui-banner variant=\"warning\" variantStyle=\"light\" title=\"Modo demo\"\n * description=\"Los datos no son reales.\" [dismissible]=\"true\" />\n *\n * Para slot de acción (link button):\n * <sui-banner variant=\"info\" variantStyle=\"lighter\" title=\"Nueva versión\">\n * <sui-link-button slot=\"action\" variant=\"modifiable\" [underline]=\"true\">\n * Actualizar ahora\n * </sui-link-button>\n * </sui-banner>\n */\n@Component({\n selector: 'sui-banner',\n templateUrl: './sui-banner.html',\n styleUrl: './sui-banner.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiCompactButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md).\n El input `title` queda disponible como property + se expone via\n aria-label para accesibilidad. */\n '[attr.title]': 'null',\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-style]': 'variantStyle()',\n '[attr.role]': '\"region\"',\n '[attr.aria-label]': 'title()',\n },\n})\nexport class SuiBanner {\n readonly variant = input<SuiBannerVariant>('info');\n readonly variantStyle = input<SuiBannerStyle>('stroke');\n readonly title = input<string | null>(null);\n readonly description = input<string | null>(null);\n readonly showIcon = input(true);\n readonly dismissible = input(false);\n\n readonly dismissed = signal(false);\n readonly closed = output<void>();\n\n readonly iconName = computed((): string => {\n const map: Record<SuiBannerVariant, string> = {\n info: 'information-fill',\n success: 'checkbox-circle-fill',\n warning: 'alert-fill',\n error: 'error-warning-fill',\n feature: 'magic-fill',\n };\n return map[this.variant()];\n });\n\n onDismiss(): void {\n this.dismissed.set(true);\n this.closed.emit();\n }\n}\n","@if (!dismissed()) {\n <div class=\"sui-banner\">\n @if (showIcon()) {\n <div class=\"sui-banner__icon\" aria-hidden=\"true\">\n <!-- pickLeft slot (Figma): reemplaza el icono default por contenido\n custom (logo de app, emoji, avatar). Si está vacío, cae al icono\n por variante. Detección via `:empty` igual que .sui-banner__action. -->\n <span class=\"sui-banner__icon-slot\"><ng-content select=\"[slot=icon]\" /></span>\n <sui-icon class=\"sui-banner__icon-default\" [name]=\"iconName()\" [size]=\"20\" />\n </div>\n }\n\n <div class=\"sui-banner__text\">\n @if (title()) {\n <span class=\"sui-banner__title\">{{ title() }}</span>\n }\n @if (title() && description()) {\n <span class=\"sui-banner__sep\" aria-hidden=\"true\">∙</span>\n }\n @if (description()) {\n <span class=\"sui-banner__description\">{{ description() }}</span>\n }\n </div>\n\n <div class=\"sui-banner__action\">\n <ng-content select=\"[slot=action]\" />\n </div>\n\n @if (dismissible()) {\n <!-- Cierre = COMPONENTE sui-compact-button (variant modifiable → el icono\n hereda el currentColor del banner), NO un <button> maqueta. La opacity\n base por estilo + el posicionamiento absolute los aplica el SCSS del\n `.sui-banner__close`; el icono de 20px = compact size `large`. -->\n <sui-compact-button\n class=\"sui-banner__close\"\n icon=\"close-line\"\n variantStyle=\"modifiable\"\n size=\"large\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"onDismiss()\"\n />\n }\n </div>\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * Catálogo canon de marcas disponibles en el DS — Figma 177:3255 \"Major Brand Logos [1.1]\".\n * 28 brands, cada una en 3 styles (original / black / white).\n *\n * Assets en `src/assets/brand/brand-logos/{company}-{style}.svg` (84 SVGs).\n * Generados desde `/Users/anthonyjuarezsolis/Downloads/brand logos` (exportados oficiales del Figma).\n *\n * NO editar el array a mano — si se agrega/quita un SVG, regenerar con:\n * for f in src/assets/brand/brand-logos/*-original.svg; do basename \"$f\" -original.svg; done\n */\nexport const SUI_BRAND_LOGO_COMPANIES = [\n 'adobe',\n 'amazon',\n 'apple',\n 'bitcoin',\n 'discord',\n 'dropbox',\n 'facebook',\n 'figma',\n 'framer',\n 'github',\n 'google',\n 'instagram',\n 'linkedin',\n 'microsoft',\n 'netflix',\n 'notion',\n 'paypal',\n 'pinterest',\n 'slack',\n 'spotify',\n 'stripe',\n 'telegram',\n 'twitch',\n 'webflow',\n 'whatsapp',\n 'wise',\n 'x-twitter',\n 'youtube',\n] as const;\n\nexport type SuiBrandLogoCompany = (typeof SUI_BRAND_LOGO_COMPANIES)[number];\nexport type SuiBrandLogoStyle = 'original' | 'black' | 'white';\nexport type SuiBrandLogoSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Default labels for accessibility. Override via ariaLabel input. */\nconst BRAND_DISPLAY_NAMES: Record<SuiBrandLogoCompany, string> = {\n adobe: 'Adobe',\n amazon: 'Amazon',\n apple: 'Apple',\n bitcoin: 'Bitcoin',\n discord: 'Discord',\n dropbox: 'Dropbox',\n facebook: 'Facebook',\n figma: 'Figma',\n framer: 'Framer',\n github: 'GitHub',\n google: 'Google',\n instagram: 'Instagram',\n linkedin: 'LinkedIn',\n microsoft: 'Microsoft',\n netflix: 'Netflix',\n notion: 'Notion',\n paypal: 'PayPal',\n pinterest: 'Pinterest',\n slack: 'Slack',\n spotify: 'Spotify',\n stripe: 'Stripe',\n telegram: 'Telegram',\n twitch: 'Twitch',\n webflow: 'Webflow',\n whatsapp: 'WhatsApp',\n wise: 'Wise',\n 'x-twitter': 'X / Twitter',\n youtube: 'YouTube',\n};\n\n/** Sizes canon — alineados con sui-flag / sui-emoji. */\nconst SIZE_PX: Record<SuiBrandLogoSize, number> = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 40,\n};\n\n/**\n * SUI Brand Logo — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 177:3255 (\"Major Brand Logos [1.1]\") — 84 variants total\n * 28 companies × 3 styles (Original = full color / Black = monochrome dark / White = monochrome light)\n *\n * EXACT (pulled from Figma metadata):\n * Native size in Figma: 32×32 per symbol\n * Aspect ratio: 1:1 (square)\n * 3 styles per company: original | black | white\n *\n * Sizes (project convention — matches sui-flag/sui-emoji):\n * xs=16, sm=20, md=24, lg=32 (Figma native), xl=40\n *\n * Use cases:\n * - \"Sign in with Google / Apple / Facebook\" buttons (set `href` to render <a>)\n * - Brand logo strip (\"As featured in...\")\n * - Payment method icons in checkout (Stripe / PayPal / Wise)\n * - Footer social links (Instagram / X-Twitter / LinkedIn)\n *\n * Style selection:\n * - original: usar sobre fondos claros con espacio para color full\n * - black: usar sobre fondos claros donde el color full distrae (footer denso)\n * - white: usar sobre fondos oscuros (dark mode, banners filled)\n *\n * Brand compliance: cada marca tiene su propio guideline de logo. Estos SVG son\n * los exports oficiales del Figma file — NO inline el SVG y tweakees paths.\n * Si el consumer necesita un color custom (ej. marca corporativa), considerar\n * usar sui-icon con un Remix Icon equivalente.\n *\n * Polimórfico: si recibe `href`, renderiza <a>. Sin href, renderiza <span> wrapper.\n *\n * Usage:\n * <sui-brand-logo company=\"google\" />\n * <sui-brand-logo company=\"apple\" variant=\"black\" size=\"lg\" />\n * <sui-brand-logo\n * company=\"github\"\n * variant=\"white\"\n * size=\"md\"\n * href=\"https://github.com/master-pedidos\"\n * target=\"_blank\"\n * ariaLabel=\"Síguenos en GitHub\" />\n */\n@Component({\n selector: 'sui-brand-logo',\n templateUrl: './sui-brand-logo.html',\n styleUrl: './sui-brand-logo.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-company]': 'company()',\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[style.--sui-brand-logo-size]': 'sizePx()',\n },\n})\nexport class SuiBrandLogo {\n readonly company = input.required<SuiBrandLogoCompany>();\n readonly variant = input<SuiBrandLogoStyle>('original');\n readonly size = input<SuiBrandLogoSize>('md');\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>('noopener noreferrer');\n readonly disabled = input(false);\n readonly ariaLabel = input<string | null>(null);\n\n readonly sizePx = computed<string>(() => `${SIZE_PX[this.size()]}px`);\n\n readonly src = computed<string>(() =>\n `/assets/brand/brand-logos/${this.company()}-${this.variant()}.svg`\n );\n\n /** Alt label auto-derived from company name. Override via ariaLabel. */\n readonly alt = computed<string>(() =>\n this.ariaLabel() ?? `${BRAND_DISPLAY_NAMES[this.company()]} logo`\n );\n\n readonly isAnchor = computed<boolean>(() => !!this.href() && !this.disabled());\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-brand-logo__el\"\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"rel()\"\n [attr.aria-label]=\"alt()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <img class=\"sui-brand-logo__img\" [src]=\"src()\" [alt]=\"alt()\" />\n </a>\n} @else {\n <span class=\"sui-brand-logo__el\" [attr.aria-label]=\"alt()\">\n <img class=\"sui-brand-logo__img\" [src]=\"src()\" [alt]=\"alt()\" />\n </span>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/**\n * SUI Breadcrumb Item — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 447:8767 \"Breadcrumb Items [1.1]\" — VERIFIED via MCP\n *\n * Átomo individual del breadcrumb. Render polimórfico:\n * - `active=true` → `<span aria-current=\"page\">` (current page, no clickable)\n * - tiene `href` → `<a href>` (navegación nativa del browser)\n * - sin `href` → `<button>` (click handler imperativo via output)\n *\n * EXACT (pulled from Figma 447:8767):\n * - Container: flex items-center, gap 6px (cuando icon+text). Sin gap si solo icon o solo text.\n * - Icon: container 20×20 (Remix `home-smile-2-line` default en figma)\n * - Typography: Label/Small — Inter Medium 14/20, letter-spacing -0.6% (em)\n * - 3 states × 3 content combos = 9 variants en figma\n *\n * State colors (get_variable_defs 447:8767 → tokens):\n * - Default: text/icon = text-sub-600 / icon-sub-600 (#5c5c5c)\n * - Hover: text/icon = text-strong-950 / icon-strong-950 (#171717)\n * + text-decoration: underline (from-font, skip-ink: none,\n * underline-position: from-font)\n * + font-feature-settings agrega 'cv09' 1 (extra a 'ss11' 1)\n * - Active: text/icon = text-strong-950 / icon-strong-950 (#171717) SIN underline,\n * cursor default, no tab focus. SOLO 'ss11' 1 (sin cv09).\n *\n * Icon color: el icono hereda `currentColor` del inner wrapper. Verificado que\n * sui-icon NO hardcodea fill (sui-icon.scss no define color/fill; el input\n * `color` default = '' → inherit). Por eso el cambio a strong-950 en hover/active\n * propaga al icono vía CSS inheritance sin necesidad de tocar el icono.\n *\n * Behavior:\n * - `(clicked)` output emite cuando el item se clickea (anchor o button).\n * El consumer (sui-breadcrumbs) lo bubble como `(navigate)`.\n * - Active item NUNCA dispara click (cursor default + no event listeners).\n *\n * Accesibilidad:\n * - Active: `aria-current=\"page\"` para SR\n * - Icon-only items: `aria-label` derivado del `[ariaLabel]` input (opcional)\n *\n * iOS active fix: el host trigger es `<a>` o `<button>` con touchstart/touchend.\n *\n * PENDING VERIFY:\n * - cv09 on hover: confirmado en el JSON de Figma (fontFeatureSettings del\n * nodo 447:8788), pero su impacto visual con la font stack del proyecto\n * (Satoshi → InterVariable → Inter, ver --sui-font-sans) es marginal:\n * 'cv09' es una feature de Inter; con Satoshi como primera opción puede\n * no aplicar. Se deja la regla por fidelidad al spec; revisar 1×/2× si\n * el \"1\" en breadcrumbs se ve distinto al esperado.\n */\n@Component({\n selector: 'sui-breadcrumb-item',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-breadcrumb-item.html',\n styleUrl: './sui-breadcrumb-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-text]': 'hasText() ? \"\" : null',\n '[attr.data-sui-icon]': 'hasIcon() ? \"\" : null',\n },\n})\nexport class SuiBreadcrumbItem {\n /** Texto visible del item. Omitible para render icon-only. */\n readonly label = input<string>('');\n\n /** Nombre del icono Remix (sin prefijo `ri-`). Omitible para render text-only. */\n readonly icon = input<string>('');\n\n /** URL del item. Si presente → renderiza `<a>`. Sin → `<button>`. */\n readonly href = input<string>('');\n\n /** Marca este item como current page (no clickable, color strong-950). */\n readonly active = input(false);\n\n /** aria-label para items icon-only (a11y). */\n readonly ariaLabel = input<string>('');\n\n /** Emitido al clickear el item (no se dispara cuando active). */\n readonly clicked = output<void>();\n\n /** State actual del componente (default es \"default\"; hover lo maneja CSS) */\n readonly state = computed<'default' | 'active'>(() =>\n this.active() ? 'active' : 'default',\n );\n\n readonly hasText = computed(() => this.label().trim().length > 0);\n readonly hasIcon = computed(() => this.icon().trim().length > 0);\n\n protected onClick(ev: Event): void {\n if (this.active()) {\n ev.preventDefault();\n return;\n }\n // Si no hay href, prevenimos default (es un button \"fake link\").\n // Si hay href, dejamos que el browser navegue Y emitimos para consumers\n // que quieran interceptar (ej. Angular Router).\n if (!this.href()) ev.preventDefault();\n this.clicked.emit();\n }\n}\n","@if (active()) {\n <span class=\"sui-breadcrumb-item__inner\" aria-current=\"page\" [attr.aria-label]=\"ariaLabel() || null\">\n @if (hasIcon()) {\n <sui-icon class=\"sui-breadcrumb-item__icon\" [name]=\"icon()\" [size]=\"20\" />\n }\n @if (hasText()) {\n <span class=\"sui-breadcrumb-item__label\">{{ label() }}</span>\n }\n </span>\n} @else if (href()) {\n <a\n class=\"sui-breadcrumb-item__inner\"\n [attr.href]=\"href()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (hasIcon()) {\n <sui-icon class=\"sui-breadcrumb-item__icon\" [name]=\"icon()\" [size]=\"20\" />\n }\n @if (hasText()) {\n <span class=\"sui-breadcrumb-item__label\">{{ label() }}</span>\n }\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"sui-breadcrumb-item__inner\"\n [attr.aria-label]=\"ariaLabel() || null\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (hasIcon()) {\n <sui-icon class=\"sui-breadcrumb-item__icon\" [name]=\"icon()\" [size]=\"20\" />\n }\n @if (hasText()) {\n <span class=\"sui-breadcrumb-item__label\">{{ label() }}</span>\n }\n </button>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiBreadcrumbItem as SuiBreadcrumbItemComponent } from '../sui-breadcrumb-item/sui-breadcrumb-item';\n\nexport type SuiBreadcrumbDivider = 'arrow' | 'slash' | 'dot';\n\n/**\n * Config del item para el array `items` del group.\n * NO confundir con el componente `<sui-breadcrumb-item>` (átomo Figma 447:8767):\n * - `SuiBreadcrumbEntry` (esta interface) = shape de datos que recibe el group\n * - `SuiBreadcrumbItem` (clase Component) = el átomo que renderiza cada entry\n */\nexport interface SuiBreadcrumbEntry {\n label?: string;\n icon?: string;\n href?: string;\n /**\n * Override: marcar este item explícitamente como active (current page).\n * Por default el último item del array es active automáticamente.\n */\n active?: boolean;\n /** aria-label para items icon-only. */\n ariaLabel?: string;\n}\n\n/**\n * SUI Breadcrumbs — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 447:8832 \"Breadcrumbs Group [1.1]\" — VERIFIED via MCP\n *\n * Orquestador: recibe `items[]` y los renderiza usando `<sui-breadcrumb-item>`\n * (átomo separado, Figma 447:8767) con dividers entre cada par consecutivo.\n *\n * EXACT (pulled from Figma 447:8832 via get_design_context + get_variable_defs):\n * - 9 variants en figma = 3 dividers × 3 quantities (3/4/5)\n * - Layout root group (447:8831): flex items-start (align-items: flex-start),\n * gap 6px uniforme entre items y dividers. Los sub-grupos de cada item\n * (node-447_8818 etc.) usan items-center.\n * - Divider arrow: Remix `arrow-right-s-line` (container 20×20),\n * color icon-disabled-300 (#d1d1d1)\n * - Divider slash: glyph `/`, w-[20px], color text-disabled-300 (#d1d1d1),\n * Label/Small typography\n * - Divider dot: glyph `•` (BULLET U+2022, NO middot), w-[20px],\n * color text-disabled-300 (#d1d1d1)\n *\n * CONFIRMED (antes PENDING):\n * - Divider color = disabled-300 (#d1d1d1) — confirmado en get_variable_defs\n * (text/disabled-300 en los nodos de divider 447:8922/8923/8924/8925...).\n * - Dot glyph = U+2022 (•), NO U+00B7 (·) — confirmado en el string del\n * get_design_context (`isDot ? \"•\" : ...`). Corregido en el template.\n *\n * Behavior:\n * - El último item del array es active automáticamente (no clickable).\n * - Items pueden tener `href` (anchor) o no (button con click handler).\n * - Output `(navigate)` emite el item clickeado.\n *\n * Accesibilidad:\n * - host = `<nav aria-label=\"Breadcrumb\">`\n * - Lista interna `<ol>` (orden semántica) sin estilos default.\n * - Active item con `aria-current=\"page\"` (manejado por `<sui-breadcrumb-item>`).\n * - Dividers `aria-hidden=\"true\"`.\n */\n@Component({\n selector: 'sui-breadcrumbs',\n standalone: true,\n imports: [SuiIcon, SuiBreadcrumbItemComponent],\n templateUrl: './sui-breadcrumbs.html',\n styleUrl: './sui-breadcrumbs.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'navigation',\n '[attr.aria-label]': '\"Breadcrumb\"',\n '[attr.data-sui-divider]': 'divider()',\n },\n})\nexport class SuiBreadcrumbs {\n readonly items = input.required<readonly SuiBreadcrumbEntry[]>();\n readonly divider = input<SuiBreadcrumbDivider>('arrow');\n\n /** Emitido cuando un item NO-active es clickeado. */\n readonly navigate = output<SuiBreadcrumbEntry>();\n\n /**\n * Enriquece cada item con `_isActive` (último del array o `item.active=true`\n * explícito). El group decide quién es active, no el item — así el consumer\n * solo pasa la lista sin tener que pensar en marcar el último.\n */\n readonly resolvedItems = computed(() => {\n const list = this.items();\n const lastIdx = list.length - 1;\n return list.map((it, i) => ({\n data: it,\n isActive: it.active ?? i === lastIdx,\n }));\n });\n\n onItemClicked(item: SuiBreadcrumbEntry): void {\n this.navigate.emit(item);\n }\n}\n","<ol class=\"sui-breadcrumbs__list\">\n @for (entry of resolvedItems(); track $index; let last = $last) {\n <li class=\"sui-breadcrumbs__item\">\n <sui-breadcrumb-item\n [label]=\"entry.data.label ?? ''\"\n [icon]=\"entry.data.icon ?? ''\"\n [href]=\"entry.data.href ?? ''\"\n [active]=\"entry.isActive\"\n [ariaLabel]=\"entry.data.ariaLabel ?? ''\"\n (clicked)=\"onItemClicked(entry.data)\"\n />\n\n @if (!last) {\n <span class=\"sui-breadcrumbs__divider\" aria-hidden=\"true\">\n @switch (divider()) {\n @case ('arrow') {\n <sui-icon name=\"arrow-right-s-line\" [size]=\"20\" />\n }\n @case ('slash') {\n <span class=\"sui-breadcrumbs__divider-glyph\">/</span>\n }\n @case ('dot') {\n <span class=\"sui-breadcrumbs__divider-glyph\">•</span>\n }\n }\n </span>\n }\n </li>\n }\n</ol>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiButtonGroupItemSize = 'small' | 'xsmall' | '2xsmall';\n\n/**\n * SUI Button Group Item — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 226:4669 \"Button Group Items [1.1]\" — VERIFIED via MCP\n *\n * Átomo del button-group. Es un button que vive dentro de un wrapper\n * `<sui-button-group>` con bordes overlappeados, pero también puede usarse\n * standalone (mantiene su propio border).\n *\n * EXACT (pulled from Figma 226:4669, variants verificados 2026-05-29 vía MCP):\n * - 60 variants en figma = 3 sizes × 4 states × 5 content combos\n *\n * Padding + gap por size × content combo (VERIFICADO node por node):\n * small (36) — Label/Small (Inter Medium 14/20/-0.6%), icon 20px:\n * · text-only (226:4668): px16 py8\n * · left|right (226:4692/4724): px14 py8, gap 8\n * · both-icons (226:4796): p8 (cuadrado), gap 8\n * · only-icon (226:4760): p8 → 36×36, sin gap\n * xsmall (32) — Label/Small (Inter Medium 14/20/-0.6%), icon 20px:\n * · text-only (226:5488): px14 py6\n * · left|right (226:5490/5493): px12 py6, gap 6\n * · both-icons (226:5496): p6 (cuadrado), gap 6\n * · only-icon (226:5500): p6 → 32×32, sin gap\n * 2xsmall (24) — Label/X Small (Inter Medium 12/16/0), icon 16px:\n * · text-only (226:5336): px12 py4\n * · left|right (226:5338/5341): px10 py4, gap 4\n * · both-icons (226:5344): p4 (cuadrado), gap 4\n * · only-icon (226:5348): p4 → 24×24, sin gap\n *\n * States × visual:\n * Default: bg-white-0 + border stroke-soft-200 + text-sub-600\n * Hover: bg-weak-50 + border stroke-soft-200 + text-sub-600\n * Active: bg-weak-50 + border stroke-soft-200 + text-strong-950\n * Disabled: bg-weak-50 + NO border + text-disabled-300, pointer-events: none\n *\n * Behavior:\n * - `active` boolean prop: marca el item como seleccionado (state=\"active\")\n * - `disabled` boolean prop: state=\"disabled\", no clickable\n * - `(clicked)` emite al clickear (no se dispara si disabled)\n *\n * iOS active fix: native `<button>` con touchstart/touchend para liberar :active.\n */\n@Component({\n selector: 'sui-button-group-item',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-button-group-item.html',\n styleUrl: './sui-button-group-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-only-icon]': 'onlyIcon() ? \"\" : null',\n /* Combinación de iconos: none|left|right|both|only.\n Gobierna el padding-x adaptativo por size (Figma reduce px cuando hay\n icono de un lado, colapsa a padding cuadrado cuando hay dos / only). */\n '[attr.data-sui-icons]': 'iconLayout()',\n },\n})\nexport class SuiButtonGroupItem {\n /** Texto del item. Omitible para render icon-only (debe pasar leftIcon o rightIcon entonces). */\n readonly label = input<string>('');\n readonly leftIcon = input<string>('');\n readonly rightIcon = input<string>('');\n readonly size = input<SuiButtonGroupItemSize>('small');\n /** Marca como seleccionado (state=\"active\") */\n readonly active = input(false);\n readonly disabled = input(false);\n /** aria-label para icon-only buttons */\n readonly ariaLabel = input<string>('');\n\n /** Estado del data-attribute para CSS scoping */\n readonly state = computed<'default' | 'active' | 'disabled'>(() => {\n if (this.disabled()) return 'disabled';\n if (this.active()) return 'active';\n return 'default';\n });\n\n /** True cuando solo tiene icon (left o right) sin label */\n readonly onlyIcon = computed(() => {\n const hasLabel = this.label().trim().length > 0;\n const hasIcon = this.leftIcon().trim().length > 0 || this.rightIcon().trim().length > 0;\n return !hasLabel && hasIcon;\n });\n\n /**\n * Layout de iconos para padding adaptativo (Figma 226:4669):\n * - 'none' → text-only: padding px completo\n * - 'left' → solo left: px reducido\n * - 'right' → solo right: px reducido\n * - 'both' → ambos iconos: padding cuadrado (p)\n * - 'only' → icon-only: padding cuadrado (p) → square box\n */\n readonly iconLayout = computed<'none' | 'left' | 'right' | 'both' | 'only'>(() => {\n const hasLabel = this.label().trim().length > 0;\n const hasLeft = this.leftIcon().trim().length > 0;\n const hasRight = this.rightIcon().trim().length > 0;\n if (!hasLabel && (hasLeft || hasRight)) return 'only';\n if (hasLeft && hasRight) return 'both';\n if (hasLeft) return 'left';\n if (hasRight) return 'right';\n return 'none';\n });\n\n /** Tamaño del icono en px según size del item (small/xsmall=20, 2xsmall=16) */\n readonly iconSize = computed<number>(() => {\n switch (this.size()) {\n case 'small': return 20;\n case 'xsmall': return 20;\n case '2xsmall': return 16;\n }\n });\n\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (this.disabled()) return;\n this.clicked.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"sui-button-group-item__inner\"\n [disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-pressed]=\"active() ? 'true' : 'false'\"\n (click)=\"onClick()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n>\n @if (leftIcon()) {\n <sui-icon class=\"sui-button-group-item__icon\" [name]=\"leftIcon()\" [size]=\"iconSize()\" />\n }\n @if (label()) {\n <span class=\"sui-button-group-item__label\">{{ label() }}</span>\n }\n @if (rightIcon()) {\n <sui-icon class=\"sui-button-group-item__icon\" [name]=\"rightIcon()\" [size]=\"iconSize()\" />\n }\n</button>\n","import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\nimport {\n SuiButtonGroupItem,\n type SuiButtonGroupItemSize,\n} from '../sui-button-group-item/sui-button-group-item';\n\nexport interface SuiButtonGroupEntry {\n /** Valor único — usado para tracking de selección. */\n value: string;\n label?: string;\n leftIcon?: string;\n rightIcon?: string;\n disabled?: boolean;\n /** aria-label para items icon-only. */\n ariaLabel?: string;\n}\n\n/**\n * SUI Button Group — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 493:8644 \"Button Group [1.1]\" — VERIFIED via MCP\n *\n * Orquestador: recibe `items[]` + `value` (single o multi) y renderiza\n * `<sui-button-group-item>` por entry. El group hace overflow-clip + border\n * radius en las puntas y aplica negative margin a items > 0 para overlappear\n * los bordes individuales y producir un border compartido.\n *\n * EXACT (pulled from Figma 493:8644):\n * - 15 variants en figma = 3 sizes × 5 quantities (2/3/4/5/6)\n * - Layout: flex items-start (no items-stretch — items mantienen su height)\n * - Group container: bg-white-0, border 1px stroke-soft-200, rounded:\n * · small / xsmall → radius-8 (8px)\n * · 2xsmall → radius-6 (6px)\n * - overflow: clip (corta los bordes externos de items en las esquinas)\n *\n * Behavior:\n * - Single select (default): el clicked item reemplaza el value\n * - Multi select (`multi=true`): toggle del clicked en array\n * - Value es model<string | string[]> para two-way binding [(value)]\n *\n * Accesibilidad:\n * - host = `<div role=\"group\" aria-label>`\n * - Items individuales tienen `aria-pressed`\n * - Para semantic toggle group, el consumer puede sobrescribir el role.\n */\n@Component({\n selector: 'sui-button-group',\n standalone: true,\n imports: [SuiButtonGroupItem],\n templateUrl: './sui-button-group.html',\n styleUrl: './sui-button-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'group',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-multi]': 'multi() ? \"\" : null',\n '[attr.aria-label]': 'ariaLabel() || null',\n },\n})\nexport class SuiButtonGroup {\n readonly items = input.required<readonly SuiButtonGroupEntry[]>();\n readonly size = input<SuiButtonGroupItemSize>('small');\n\n /**\n * Permite seleccionar múltiples items simultáneamente.\n * - false (default): single-select, `value` es `string`\n * - true: multi-select, `value` es `string[]`\n */\n readonly multi = input(false);\n\n /**\n * Valor seleccionado. Two-way binding `[(value)]`.\n * En single: string del item active. En multi: string[] de items active.\n * En single, si value es null/'' nada está seleccionado.\n */\n readonly value = model<string | string[]>('');\n\n readonly ariaLabel = input<string>('');\n\n /** Emitido cuando cambia la selección (después de actualizar el model). */\n readonly change = output<string | string[]>();\n\n /** Set interno de valores selected (memo) para lookup O(1) por item. */\n readonly selectedSet = computed<Set<string>>(() => {\n const v = this.value();\n if (Array.isArray(v)) return new Set(v);\n if (typeof v === 'string' && v.length > 0) return new Set([v]);\n return new Set();\n });\n\n isActive(entry: SuiButtonGroupEntry): boolean {\n return this.selectedSet().has(entry.value);\n }\n\n onItemClicked(entry: SuiButtonGroupEntry): void {\n if (entry.disabled) return;\n\n if (this.multi()) {\n const current = this.selectedSet();\n const next = new Set(current);\n if (next.has(entry.value)) {\n next.delete(entry.value);\n } else {\n next.add(entry.value);\n }\n const arr = Array.from(next);\n this.value.set(arr);\n this.change.emit(arr);\n } else {\n // Single select: si ya está active, no hacer nada (no permite \"deselect\"\n // tocando el mismo — patrón típico segmented control).\n if (this.isActive(entry)) return;\n this.value.set(entry.value);\n this.change.emit(entry.value);\n }\n }\n}\n","@for (entry of items(); track entry.value; let first = $first; let last = $last) {\n <sui-button-group-item\n class=\"sui-button-group__item\"\n [attr.data-sui-first]=\"first ? '' : null\"\n [attr.data-sui-last]=\"last ? '' : null\"\n [size]=\"size()\"\n [label]=\"entry.label ?? ''\"\n [leftIcon]=\"entry.leftIcon ?? ''\"\n [rightIcon]=\"entry.rightIcon ?? ''\"\n [active]=\"isActive(entry)\"\n [disabled]=\"entry.disabled ?? false\"\n [ariaLabel]=\"entry.ariaLabel ?? ''\"\n (clicked)=\"onItemClicked(entry)\"\n />\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, inject, input } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiButtonColor = 'primary' | 'neutral' | 'error';\nexport type SuiButtonVariant = 'filled' | 'stroke' | 'lighter' | 'ghost';\nexport type SuiButtonSize = '2xsmall' | 'xsmall' | 'small' | 'medium';\n\n/**\n * SUI Button — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * EXACT specs (pulled from Figma — all 4 sizes, nodos confirmados 2026-05-29):\n * - 2X-Small (28, node 4582:8979): h=28px, py=4px px=6px, gap=6px, radius=8px\n * - X-Small (32, node 130:4169): h=32px, p=6px uniforme, gap=6px, radius=8px\n * - Small (36, node 130:3207): h=36px, p=8px uniforme, gap=8px, radius=8px\n * - Medium (40, node 129:1421): h=40px, p=10px uniforme, gap=8px, radius=10px\n * - Font: Label/Small (14/20/-0.6%) for ALL sizes — Inter Medium 500\n * - Icon: --sui-icon-size-md = 20px (all sizes)\n * - Font features: 'ss11' 1, 'calt' 0, 'liga' 0\n * - Only-icon (node 129:1489): square, padding uniforme = py del size, radius hereda\n *\n * HOMOLOGACIÓN 2026-05-29: el radius pasó de pill (99999px, override Ontop) a\n * radius-10/8 del DS, y el padding horizontal expandido (que compensaba el pill)\n * se redujo al p-uniforme exacto de Figma. Cambio visual app-wide → ver newQuestions.\n *\n * NOTE on gap: Figma's inner Text-wrap has px=4 padding. The exposed gap in the component\n * is outer-gap + 4 on each side. 2XS/XS use gap-2 (outer) + 4 (text-wrap) = 6 total,\n * SM/MD use gap-4 + 4 = 8 total. We implement the total as a single CSS `gap` value.\n *\n * Color mappings (semantic → project token):\n * - primary → brand accent (orange: --sui-primary-* = #fa7319). NOTA: el Figma\n * SUI base resuelve primary a #335cff (azul), pero este proyecto lo\n * sobreescribe a naranja en sui-tokens.scss — decisión de marca (ver CLAUDE.md).\n * - neutral → faded (gray: --sui-state-faded-* / bg-strong-950)\n * - error → error (red: --sui-state-error-*)\n *\n * CONFIRMED (pulled from variable_defs node 129:1422, 2026-05-29):\n * - focus rings = los tokens `components/buttons/{primary,error,important}-focus`:\n * `0 0 0 2px bg/white-0, 0 0 0 4px <alpha>`. primary→primary-alpha-10,\n * error→red-alpha-10, neutral→slate-alpha-16. Implementación SCSS ya matchea.\n * - NO existe estado \"Active/Pressed\" en Figma; :active espeja el Focus ring.\n * - NO existe estado \"Loading\" en Figma.\n *\n * HOVER/STATE values — VERIFIED against Figma 2026-05-29 (per-variant nodos pulleados):\n * - filled/primary/hover: --sui-primary-dark — confirmed in tokens\n * - filled/neutral/hover: --sui-bg-surface-800 — VERIFIED node 130:926 (default strong-950 → hover surface-800)\n * - filled/error/hover: --sui-red-700 (#d02533) — VERIFIED node 130:1888 (red/700 bound)\n * - lighter/neutral: VERIFIED nodes 130:972/982/987 — default bg-weak-50 + text-sub-600;\n * hover bg-white-0 + border stroke-soft-200 + regular-shadow-x-small + text-strong-950;\n * focus bg-white-0 + border stroke-strong-950 + ring slate-alpha-16.\n * (antes usaba faded-lighter/faded-light = fills grises — homologado al white+border de Figma)\n * - ghost/neutral/hover bg: --sui-bg-weak-50 + text-strong-950 — VERIFIED node 130:1010\n * - stroke/primary/hover: bg primary-alpha-10 + border transparent + color primary-base — VERIFIED node 130:483\n * - stroke/neutral/hover: bg-weak-50 + text-strong-950, border desaparece — VERIFIED node 130:954\n * - lighter/primary/hover: bg-white-0 + border primary-base — VERIFIED node 130:490\n * - stroke/lighter/ghost colored hover: el border desaparece en hover (border-color: transparent).\n * - disabled (todos): bg-weak-50 (#f7f7f7, = Figma bg-weak-25) + text-disabled-300 — VERIFIED node 130:921\n *\n * PENDING VERIFY:\n * - hover/focus de stroke/lighter/ghost para color=primary/error en sizes != Medium\n * (asumimos paridad con Medium; Figma define per-state pero solo Medium fue pulleado a nivel pixel)\n *\n * Difference vs SuiBadge:\n * - 3 semantic colors (primary/neutral/error) vs 10 taxonomic (gray/blue/red/…)\n * - Interactive states (hover/focus/active/disabled) — badge is static\n * - v1 omits: xsmall (32px), xxsmall (28px), icon-only dedicated, loading state\n */\n@Component({\n selector: 'sui-button',\n templateUrl: './sui-button.html',\n styleUrl: './sui-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-color]': 'color()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-only-icon]': 'onlyIcon() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n /* iOS WKWebView fix: la sola PRESENCIA de touchstart binding fuerza al\n browser a engage el touch event pipeline, lo cual hace que :active\n dispare y se libere correctamente. Sin esto, :active \"stickea\" 300-500ms\n en pages standalone (sin scroll container que prime el state machine).\n touchend.blur() empuja la deselection inmediata. */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n /* sui-button es custom element (no <button>): type=\"submit\" en el host NO\n dispara submit del form padre. Para que `<sui-button type=\"submit\">` se\n comporte como submit nativo, interceptamos el click y llamamos\n requestSubmit() del form más cercano. Si no hay form, no hace nada. */\n '(click)': '_onClick($event)',\n '(keydown.enter)': '_onClick($event)',\n '(keydown.space)': '_onClick($event)',\n },\n})\nexport class SuiButton {\n private readonly _el = inject(ElementRef<HTMLElement>);\n\n readonly variant = input<SuiButtonVariant>('filled');\n readonly color = input<SuiButtonColor>('primary');\n readonly size = input<SuiButtonSize>('medium');\n readonly onlyIcon = input(false);\n readonly disabled = input(false);\n /* Iconos por prop (nombre RemixIcon), mismo patrón que sui-link-button — homologa\n a Figma (Left Icon / Pick Left · Right Icon / Pick Right). Para íconos custom\n (no-RemixIcon, ej. spinner) siguen disponibles los slots [data-slot=start|end].\n Con onlyIcon=true, leftIcon es el ícono que se muestra (sin label). */\n readonly leftIcon = input<string | null>(null);\n readonly rightIcon = input<string | null>(null);\n /* Permite que `<sui-button type=\"submit\">` dentro de un <form> dispare el\n submit nativo (y por ende `(ngSubmit)` de Angular). El host se comporta\n como un <button type=submit> aunque no sea uno nativo. */\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n\n /** Intercept click/Enter/Space — cuando type=submit, busca el form padre y\n dispara requestSubmit(). Reset hace lo mismo con form.reset(). Disabled\n bloquea todo. */\n _onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n const t = this.type();\n if (t === 'button') return;\n const form = (this._el.nativeElement as HTMLElement).closest('form');\n if (!form) return;\n if (t === 'submit') {\n // requestSubmit dispara submit + ngSubmit; con sólo dispatchEvent no se\n // valida el form ni se previene default automáticamente.\n form.requestSubmit();\n } else if (t === 'reset') {\n form.reset();\n }\n }\n}\n","@if (leftIcon()) {\n <sui-icon class=\"sui-button__icon\" [name]=\"leftIcon()!\" [size]=\"20\" data-slot=\"start\" />\n}\n<ng-content select=\"[data-slot=start]\"></ng-content>\n@if (!onlyIcon()) {\n <span class=\"sui-button__label\"><ng-content></ng-content></span>\n}\n<ng-content select=\"[data-slot=end]\"></ng-content>\n@if (rightIcon()) {\n <sui-icon class=\"sui-button__icon\" [name]=\"rightIcon()!\" [size]=\"20\" data-slot=\"end\" />\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport type SuiCardVariant = 'default' | 'elevated' | 'flat';\nexport type SuiCardSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/**\n * SUI Card — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO (Card / Surface)\n *\n * Specs (project tokens, SUI 2.0 conventions):\n * - Small : padding 16, gap 12\n * - Medium : padding 20, gap 16 ← default\n * - Large : padding 24, gap 20\n * - XLarge : padding 28, gap 24 (project extension, no-Figma; sigue el Δ +4/+4)\n *\n * - Radius : 16px (radius-16)\n * - Background : --sui-bg-white-0\n *\n * Variants (visual treatment):\n * - default : 1px solid stroke-soft-200 + shadow-x-small (primary surface)\n * - elevated : no border + shadow-medium (raised, modal-like)\n * - flat : 1px solid stroke-soft-200, no shadow (dense lists)\n *\n * Slots (content projection, render order = template order):\n * - [sui-card-header] : top region (title + actions)\n * - default content : body — respeta padding del card\n * - [sui-card-media] : edge-to-edge — rompe padding lateral con margin\n * negativo. Para charts, hero images, mapas. Si NO\n * hay footer, también rompe el padding inferior y\n * absorbe el radius. Si HAY footer, queda flush sin\n * absorber radius (el footer cierra la card).\n * - [sui-card-footer] : bottom region (CTAs, summary)\n *\n * Header, body y footer se separan por gap, sin divider. Media NO contribuye\n * al gap visual (queda pegado al body o al footer según haya footer o no).\n *\n * Interactive cards:\n * - [interactive]=\"true\" → cursor pointer, hover lift, focus ring.\n * Apply only on cards that act as a single action surface (e.g., a tile that\n * navigates). For cards with multiple inner CTAs, leave non-interactive.\n *\n * iOS :active fix:\n * - Same touch event pipeline pattern as sui-button. Only applies when interactive.\n */\n@Component({\n selector: 'sui-card',\n templateUrl: './sui-card.html',\n styleUrl: './sui-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-interactive]': 'interactive() ? \"\" : null',\n '[attr.role]': 'interactive() ? \"button\" : null',\n '[attr.tabindex]': 'interactive() ? \"0\" : null',\n /* iOS WKWebView :active fix — solo cuando es interactivo. */\n '(touchstart)': 'interactive() ? $event.currentTarget : null',\n '(touchend)': 'interactive() ? $any($event.currentTarget).blur() : null',\n },\n})\nexport class SuiCard {\n readonly variant = input<SuiCardVariant>('default');\n readonly size = input<SuiCardSize>('medium');\n readonly interactive = input(false);\n}\n","<ng-content select=\"[sui-card-header]\" />\n<div class=\"sui-card__body\">\n <ng-content />\n</div>\n<ng-content select=\"[sui-card-media]\" />\n<ng-content select=\"[sui-card-footer]\" />\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type SuiCheckboxSize = 'small' | 'medium' | 'large' | 'xlarge';\n// large/xlarge: project extension (no-Figma)\n\n/**\n * SUI Checkbox — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 227:2002\n *\n * Structure:\n * - Container outer: Medium=20×20, Small=16×16 (no fill, no border)\n * - bg (outer colored): Medium=16×16, Small=14×14, radius=4px\n * - box (inner white visible surface): Medium=13×13, Small=11×11, radius=2.6px\n * - Check icon: 9.06×6.59px tick blanco strokeWidth=1.5\n * - Indeterminate dash: 8×1.5px rectángulo blanco\n *\n * States × Active value:\n * - Default unchecked: bg-soft-200 (#ebebeb)\n * - Default checked/indeterminate: primary-base (#335cff)\n * - Hover checked: primary-dark (#2547d0)\n * - Focus checked: primary-darkest (#1f3bad)\n * - Focus unchecked: primary-base (#335cff) — bg turns blue\n * - Disabled: bg-soft-200 (#ebebeb), no box inner\n *\n * Sizes:\n * - small / medium: Figma spec (227:2002)\n * - large / xlarge: project extension (no-Figma), scale follows Δ4px increments\n */\n@Component({\n selector: 'sui-checkbox',\n templateUrl: './sui-checkbox.html',\n styleUrl: './sui-checkbox.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCheckbox),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-checked]': 'checked() ? \"\" : null',\n '[attr.data-sui-indeterminate]': 'indeterminate() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.role]': '\"checkbox\"',\n '[attr.aria-checked]': 'indeterminate() ? \"mixed\" : (checked() ? \"true\" : \"false\")',\n '[attr.aria-disabled]': 'isDisabled() ? \"true\" : null',\n '[attr.tabindex]': 'isDisabled() ? \"-1\" : \"0\"',\n '(click)': 'onToggle($event)',\n '(keydown.space)': 'onToggle($event)',\n '(keydown.enter)': 'onToggle($event)',\n /* iOS WKWebView fix — ver CLAUDE.md \"iOS :active stuck en custom buttons\". */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiCheckbox implements ControlValueAccessor {\n readonly size = input<SuiCheckboxSize>('medium');\n readonly checked = model(false);\n readonly indeterminate = input(false);\n readonly disabled = input(false);\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n onToggle(e: Event): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n const newValue = !this.checked();\n this.checked.set(newValue);\n this._onChange(newValue);\n this._onTouched();\n }\n\n writeValue(v: boolean): void {\n this.checked.set(!!v);\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<span class=\"sui-checkbox__bg\">\n <span class=\"sui-checkbox__box\"></span>\n @if (checked() && !indeterminate()) {\n <svg class=\"sui-checkbox__check\" viewBox=\"0 0 10 8\" aria-hidden=\"true\">\n <path d=\"M1 4.5 L3.7 7 L9 1.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n </svg>\n }\n @if (indeterminate()) {\n <span class=\"sui-checkbox__dash\" aria-hidden=\"true\"></span>\n }\n</span>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * sui-emoji — Wrapper de emojis Fluent UI animados (PNG raster a color).\n *\n * Source: github.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis\n *\n * Diferencias vs sui-icon:\n * - sui-emoji = PNG raster animado, multi-color, no responde a `currentColor`.\n * - sui-icon = SVG monocromo, hereda color del padre vía `fill`/`stroke`.\n *\n * Uso típico: empty states, switch-card decorativos, celebraciones, onboarding.\n *\n * API:\n * - name: shortcut a un emoji del catálogo `SUI_EMOJI_MAP` (ej. 'package').\n * - src: URL directa al emoji (override del catálogo). Útil para usar\n * emojis fuera del map sin tener que registrarlos.\n * - size: xs (16) | sm (20) | md (24) | lg (32) | xl (48). Default md.\n * - ariaLabel: si se provee, el emoji se anuncia como `<img>` con ese label;\n * si no, se considera decorativo (`aria-hidden=\"true\"`).\n *\n * PENDING VERIFY:\n * - Cache de imágenes: actualmente lazy-loading nativo + CDN raw.githubusercontent.com.\n * Si se nota lag al hover/scroll, considerar mover assets a /assets/emojis/ o\n * un CDN propio (Firebase Storage / Cloudflare R2).\n * - El catálogo SUI_EMOJI_MAP es manual; cuando se agregue uno nuevo, hay que\n * registrarlo aquí (NO crear un dict paralelo en otros componentes — es la\n * fuente de verdad para todo el DS).\n * - Tamaños xs/sm/md/lg/xl son convención del DS, no pulled de Figma. Si\n * SUI publica un component \"Emoji\", verificar si las dims coinciden.\n */\n\nconst FLUENT_EMOJI_BASE = 'https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis';\n\n/**\n * Catálogo de emojis disponibles. Cada key mapea a un path relativo a FLUENT_EMOJI_BASE.\n * Categorías típicas: Smilies, Objects, Travel%20and%20places, People, Symbols, etc.\n * Encoding: usa %20 para espacios en el path.\n */\nexport const SUI_EMOJI_MAP = {\n // Smilies\n 'thinking-face': 'Smilies/Thinking%20Face.png',\n 'grinning-face': 'Smilies/Grinning%20Face.png',\n 'smiling-face-hearts': 'Smilies/Smiling%20Face%20with%20Hearts.png',\n 'face-with-rolling-eyes': 'Smilies/Face%20with%20Rolling%20Eyes.png',\n 'face-screaming': 'Smilies/Face%20Screaming%20in%20Fear.png',\n 'partying-face': 'Smilies/Partying%20Face.png',\n 'star-struck': 'Smilies/Star-Struck.png',\n 'sleeping-face': 'Smilies/Sleeping%20Face.png',\n // CSAT 5-level scale (usado por sui-rating type='emoji')\n 'pensive-face': 'Smilies/Pensive%20Face.png',\n 'confused-face': 'Smilies/Confused%20Face.png',\n 'neutral-face': 'Smilies/Neutral%20Face.png',\n 'slightly-smiling-face': 'Smilies/Slightly%20Smiling%20Face.png',\n 'grinning-face-smiling-eyes': 'Smilies/Grinning%20Face%20with%20Smiling%20Eyes.png',\n\n // Objects\n 'package': 'Objects/Package.png',\n 'receipt': 'Objects/Receipt.png',\n 'money-bag': 'Objects/Money%20Bag.png',\n 'money-with-wings': 'Objects/Money%20with%20Wings.png',\n 'shopping-cart': 'Objects/Shopping%20Cart.png',\n 'shopping-bags': 'Objects/Shopping%20Bags.png',\n 'card-index-dividers': 'Objects/Card%20Index%20Dividers.png',\n 'bell': 'Objects/Bell.png',\n 'bell-with-slash': 'Objects/Bell%20with%20Slash.png',\n 'pushpin': 'Objects/Round%20Pushpin.png',\n 'mobile-phone': 'Objects/Mobile%20Phone.png',\n 'gear': 'Objects/Gear.png',\n 'locked': 'Objects/Locked.png',\n 'unlocked': 'Objects/Unlocked.png',\n 'wrench': 'Objects/Wrench.png',\n 'hammer': 'Objects/Hammer.png',\n 'magnifying-glass-tilted-left': 'Objects/Magnifying%20Glass%20Tilted%20Left.png',\n 'label': 'Objects/Label.png',\n 'spiral-calendar': 'Objects/Spiral%20Calendar.png',\n 'bar-chart': 'Objects/Bar%20Chart.png',\n\n // Travel & Places\n 'delivery-truck': 'Travel%20and%20places/Delivery%20Truck.png',\n 'motorcycle': 'Travel%20and%20places/Motorcycle.png',\n 'rocket': 'Travel%20and%20places/Rocket.png',\n 'house': 'Travel%20and%20places/House.png',\n 'office-building': 'Travel%20and%20places/Office%20Building.png',\n 'shop': 'Travel%20and%20places/Convenience%20Store.png',\n 'dollar-banknote': 'Objects/Dollar%20Banknote.png',\n 'glowing-star': 'Travel%20and%20places/Glowing%20Star.png',\n 'kick-scooter': 'Travel%20and%20places/Kick%20Scooter.png',\n\n // Symbols\n 'check-mark': 'Symbols/Check%20Mark.png',\n 'check-mark-button': 'Symbols/Check%20Mark%20Button.png',\n 'cross-mark': 'Symbols/Cross%20Mark.png',\n 'warning': 'Symbols/Warning.png',\n 'no-entry': 'Symbols/No%20Entry.png',\n\n // Activities\n 'sparkles': 'Activities/Sparkles.png',\n 'party-popper': 'Activities/Party%20Popper.png',\n\n // People & Body (hand gestures viven en la carpeta \"Hand gestures\", no \"People\")\n 'waving-hand': 'Hand%20gestures/Waving%20Hand.png',\n 'thumbs-up': 'Hand%20gestures/Thumbs%20Up.png',\n 'clapping-hands': 'Hand%20gestures/Clapping%20Hands.png',\n 'handshake': 'Hand%20gestures/Handshake.png',\n\n // People (usado por sui-empty-state 'users')\n 'busts-in-silhouette': 'People/Busts%20in%20Silhouette.png',\n\n // Food\n 'pizza': 'Food/Pizza.png',\n 'hamburger': 'Food/Hamburger.png',\n 'taco': 'Food/Taco.png',\n 'birthday-cake': 'Food/Birthday%20Cake.png',\n} as const;\n\nexport type SuiEmojiName = keyof typeof SUI_EMOJI_MAP;\nexport type SuiEmojiSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n@Component({\n selector: 'sui-emoji',\n standalone: true,\n templateUrl: './sui-emoji.html',\n styleUrl: './sui-emoji.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-size]': 'size()',\n '[attr.aria-hidden]': 'ariaLabel() ? null : \"true\"',\n '[attr.role]': 'ariaLabel() ? \"img\" : null',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class SuiEmoji {\n /** Nombre del emoji del catálogo. Si se proveé `src`, este se ignora. */\n readonly name = input<SuiEmojiName | null>(null);\n\n /** URL directa al emoji (override del catálogo). Útil para usar emojis fuera del map. */\n readonly src = input<string | null>(null);\n\n /** Tamaño del emoji. */\n readonly size = input<SuiEmojiSize>('md');\n\n /**\n * Aria-label opcional. Si se provee, el emoji se anuncia como `<img>` con ese label.\n * Si no se provee, se considera decorativo (`aria-hidden=\"true\"`).\n */\n readonly ariaLabel = input<string | null>(null);\n\n /** URL final del emoji (catálogo o src directo). */\n readonly resolvedSrc = computed(() => {\n const srcOverride = this.src();\n if (srcOverride) return srcOverride;\n const n = this.name();\n if (!n) return null;\n return `${FLUENT_EMOJI_BASE}/${SUI_EMOJI_MAP[n]}`;\n });\n}\n","@if (resolvedSrc(); as src) {\n <img class=\"sui-emoji__img\" [src]=\"src\" [alt]=\"ariaLabel() ?? ''\" loading=\"lazy\" decoding=\"async\" />\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiCheckbox, type SuiCheckboxSize } from '../sui-checkbox/sui-checkbox';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiEmoji, type SuiEmojiName } from '../sui-emoji/sui-emoji';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\n\nexport type SuiCheckboxCardType =\n | 'basic'\n | 'left-icon'\n | 'avatar'\n // Figma types 4–6: el leading lo proyecta el consumer via slot\n // `[slot=leading]` (logo de proveedor de tarjeta, brand o company). El\n // componente solo aporta el contenedor + geometría. Ver HTML.\n | 'card-provider'\n | 'brand'\n | 'company';\n\n/**\n * SUI Checkbox Card — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 261:3896 (\"Checkbox Card [1.1]\") — 24 variants\n * 6 types (Basic / Left Icon / Avatar / Card Provider / Brand / Company)\n * × 4 states (Default / Hover / Active / Disabled)\n *\n * Espejo de `sui-radio-card` pero multi-select:\n * - Renderea un `sui-checkbox` interno (no radio dot custom)\n * - role=\"checkbox\" + aria-checked: true/false/mixed (indeterminate)\n * - Cada card es independiente — NO requiere parent group\n * - Click togglea (no select-only)\n *\n * 6 types canon (matchea el component_set 261:3896 al 100%):\n * - basic: solo título + descripción + checkbox trailing\n * - left-icon: 40×40 circle + icon/emoji + título + checkbox\n * - avatar: 40×40 imagen circular (sui-avatar size=lg) + título + checkbox\n * - card-provider / brand / company: leading proyectado por el consumer via\n * `<elemento slot=\"leading\">` (logo Mastercard/Visa, brand Spotify, logo de\n * company, etc.). El componente NO bundlea los assets de marca — son del\n * consumer. Geometría del slot por type:\n * card-provider → 32×24 radius-4 (formato tarjeta, Figma 265:539)\n * brand → 40×40 sin frame (Figma 265:699)\n * company → 40×40 redondo (Figma 265:863)\n * Si no se proyecta nada en el slot, el contenedor queda vacío (placeholder).\n *\n * EXACT (pulled from Figma 261:3921 — Basic Default, espejado a Checkbox Card):\n * Container w 360, padding 16, gap 14, radius 12,\n * border 1px stroke-soft-200, shadow x-small (0 1px 2px 0 #0a0d1408),\n * bg white-0\n * Active border 1px primary-base, sin shadow (Figma 262:232)\n * Title row gap 4, items-center, flex-wrap\n * Label 14/20 medium strong-950, letter-spacing -0.6%\n * Sublabel 12/16 regular sub-600\n * Description 12/16 regular sub-600\n * Checkbox slot size 20×20 (medium), flex-shrink 0, self-start\n *\n * Token map (Figma → sui-tokens):\n * bg/white-0 → --sui-bg-white-0\n * bg/weak-50 → --sui-bg-weak-50\n * stroke/soft-200 → --sui-stroke-soft-200\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * text/disabled-300 → --sui-text-disabled-300\n * primary-base → --sui-primary-base (proyecto: orange #fa7319)\n * radius-12 → 12px\n * radius-full → 999px\n * regular-shadow/x-small → --sui-shadow-x-small\n *\n * VERIFIED contra Figma 261:3896 (homologación 2026-05-29):\n * - Hover: bg-weak-50, sin border, sin shadow. CONFIRMADO (262:210).\n * - Active: bg-white-0, border 1px primary-base, sin shadow. CONFIRMADO (262:232).\n * - Disabled: bg-white-0, border stroke-soft-200, sin shadow. Textos NO se\n * desvanecen uniforme — label→text/sub-600, sublabel+description→text/soft-400,\n * badge→bordeado con texto disabled-300. CONFIRMADO (262:254/258/259).\n * - Badge \"NEW\": variant Light color Information (state/information/light +\n * dark), NO primary-base. CONFIRMADO (261:3928). Corregido del naranja previo.\n * - 6 types completos (basic/left-icon/avatar + card-provider/brand/company via\n * slot proyectado). CONFIRMADO contra los 24 variants.\n *\n * PENDING VERIFY (inferred):\n * - Hover sobre Active: bg-weak-50, mantiene border primary. Inferido (Figma\n * no publica el cruce hover×active explícito).\n *\n * NOTAS:\n * - Label letter-spacing = -0.084px (px exacto del Figma tracking -0.6% @14px),\n * espeja sui-checkbox-label. Antes era -0.006em; se pasó a px para que un\n * futuro cambio de font-size no escale el tracking en silencio.\n * - El hover sin-frame (border transparent) excluye checked E indeterminate\n * para no pisar su border primary-base — ver .scss regla de hover.\n *\n * Form integration:\n * - Implementa ControlValueAccessor con valor boolean (checked).\n * - Two-way `checked` model expuesto al template.\n *\n * iOS WKWebView fix: touchstart/touchend en host (CLAUDE.md).\n *\n * Usage:\n * <sui-checkbox-card label=\"Notificaciones por email\" [(checked)]=\"opts.email\" />\n *\n * <sui-checkbox-card\n * type=\"left-icon\"\n * icon=\"mail-line\"\n * label=\"Promos semanales\"\n * description=\"Recibe ofertas cada lunes\"\n * [(checked)]=\"opts.promos\" />\n *\n * <sui-checkbox-card\n * type=\"avatar\"\n * [imageUrl]=\"user.avatar\"\n * [label]=\"user.name\"\n * [sublabel]=\"user.role\"\n * [(checked)]=\"selectedUsers.has(user.id)\" />\n */\n@Component({\n selector: 'sui-checkbox-card',\n standalone: true,\n templateUrl: './sui-checkbox-card.html',\n styleUrl: './sui-checkbox-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiCheckbox, SuiIcon, SuiEmoji, SuiAvatar],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCheckboxCard),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-checked]': 'checked() ? \"\" : null',\n '[attr.data-sui-indeterminate]': 'indeterminate() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-leading-fill]': 'iconSrc() ? \"\" : null',\n '[attr.role]': '\"checkbox\"',\n '[attr.aria-checked]': 'indeterminate() ? \"mixed\" : (checked() ? \"true\" : \"false\")',\n '[attr.aria-disabled]': 'isDisabled() ? \"true\" : null',\n '[attr.aria-label]': 'label() || null',\n '[attr.tabindex]': 'isDisabled() ? \"-1\" : \"0\"',\n '(click)': 'onToggle($event)',\n '(keydown.space)': 'onToggle($event)',\n '(keydown.enter)': 'onToggle($event)',\n /* iOS WKWebView fix — sin esto :active stickea 300-500ms en standalone pages */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiCheckboxCard implements ControlValueAccessor {\n /** Tipo del leading slot — gobierna qué se renderiza a la izquierda. */\n readonly type = input<SuiCheckboxCardType>('basic');\n /** Tamaño del checkbox interno — lo decide el padre (componente dumb). */\n readonly size = input<SuiCheckboxSize>('medium');\n\n /** Título principal del card (label de la fila Title). */\n readonly label = input<string>('');\n\n /** Sublabel opcional (12/16 regular sub-600 al lado del label). */\n readonly sublabel = input<string | null>(null);\n\n /** Descripción secundaria opcional debajo del Title. */\n readonly description = input<string | null>(null);\n\n /** RemixIcon name (sin prefijo \"ri-\") para type='left-icon'. */\n readonly icon = input<string | null>(null);\n\n /** Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'. */\n readonly emoji = input<SuiEmojiName | null>(null);\n\n /** URL directa al emoji para type='left-icon'. Precedencia: icon > emoji > iconSrc. */\n readonly iconSrc = input<string | null>(null);\n\n /** URL de imagen para type='avatar'. Si falla, fallback a iniciales del label. */\n readonly imageUrl = input<string | null>(null);\n\n /** Muestra badge built-in al lado del sublabel (default 'NEW'). */\n readonly badge = input(false);\n readonly badgeLabel = input('NEW');\n\n /** Indeterminate state (tri-state checkbox). */\n readonly indeterminate = input(false);\n\n readonly disabled = input(false);\n\n /** Two-way binding del estado checked. */\n readonly checked = model(false);\n\n /** Emite el nuevo valor cuando cambia. */\n readonly checkedChange2 = output<boolean>();\n\n // ── ControlValueAccessor state ──────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** True si type requiere render del slot leading. */\n readonly hasLeading = computed(() => this.type() !== 'basic');\n\n /** Iniciales para fallback de sui-avatar. */\n readonly initialsFromLabel = computed(() => {\n const l = this.label().trim();\n if (!l) return '';\n return l.split(/\\s+/).slice(0, 2).map(w => w[0]?.toUpperCase() ?? '').join('');\n });\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n onToggle(e: Event): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n const next = !this.checked();\n this.checked.set(next);\n this._onChange(next);\n this._onTouched();\n this.checkedChange2.emit(next);\n }\n\n /** Bridge desde el sui-checkbox interno → reusa onToggle. */\n onCheckboxChange(next: boolean): void {\n if (next === this.checked()) return;\n this.checked.set(next);\n this._onChange(next);\n this._onTouched();\n this.checkedChange2.emit(next);\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────\n writeValue(v: unknown): void {\n this.checked.set(!!v);\n }\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!-- Leading slot — solo basic / left-icon / avatar (Figma 261:3921/264:2858/264:3023) -->\n@if (type() === 'left-icon') {\n <div class=\"sui-checkbox-card__leading sui-checkbox-card__leading--icon\" aria-hidden=\"true\">\n @if (icon()) {\n <sui-icon [name]=\"icon()!\" [size]=\"20\" />\n } @else if (emoji()) {\n <sui-emoji [name]=\"emoji()\" size=\"md\" />\n } @else if (iconSrc()) {\n <sui-emoji [src]=\"iconSrc()\" size=\"full\" />\n }\n </div>\n} @else if (type() === 'avatar') {\n <sui-avatar\n class=\"sui-checkbox-card__leading sui-checkbox-card__leading--avatar\"\n size=\"lg\"\n [src]=\"imageUrl()\"\n [initials]=\"initialsFromLabel()\" />\n} @else if (type() === 'card-provider' || type() === 'brand' || type() === 'company') {\n <!-- Leading proyectado por el consumer: logo de proveedor / brand / company.\n El componente solo da el contenedor + geometría por type (Figma\n 265:539/699/863). Ej: <sui-checkbox-card type=\"brand\"><img slot=\"leading\" …></sui-checkbox-card> -->\n <div class=\"sui-checkbox-card__leading sui-checkbox-card__leading--slot\" aria-hidden=\"true\">\n <ng-content select=\"[slot=leading]\" />\n </div>\n}\n\n<!-- Texto: Title row + description -->\n<div class=\"sui-checkbox-card__text\">\n <div class=\"sui-checkbox-card__title\">\n @if (label()) {\n <span class=\"sui-checkbox-card__label\">{{ label() }}</span>\n }\n @if (sublabel()) {\n <span class=\"sui-checkbox-card__sublabel\">{{ sublabel() }}</span>\n }\n @if (badge()) {\n <span class=\"sui-checkbox-card__badge\">{{ badgeLabel() }}</span>\n }\n </div>\n @if (description()) {\n <p class=\"sui-checkbox-card__description\">{{ description() }}</p>\n }\n</div>\n\n<!-- Checkbox trailing (20×20 medium). El click del host ya togglea — el checkbox\n interno solo refleja el estado visual (sus listeners propios disparan\n onCheckboxChange para mantener sync con el form). -->\n<sui-checkbox\n class=\"sui-checkbox-card__checkbox\"\n [size]=\"size()\"\n [checked]=\"checked()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"isDisabled()\"\n (checkedChange)=\"onCheckboxChange($event)\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n/>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiCheckbox } from '../sui-checkbox/sui-checkbox';\nimport { SuiBadge } from '../sui-badge/sui-badge';\n\n/**\n * SUI Checkbox Label — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 231:4897 (\"Checkbox Label [1.1]\") — 8 variants\n * Active(off/on) × Description(off/on) × Flip(off/on)\n *\n * EXACT (pulled from Figma 231:5040 — Active=On, Description=On variant + others):\n * Container flex gap-8 items-start\n * Checkbox slot size 20×20 (medium), shrink-0\n * Content column\n * description=off → flex gap-4 items-center: Label + Sublabel + Badge\n * description=on → flex flex-col gap-10:\n * Title row (gap-4 items-center): Label + Sublabel + Badge\n * Description (12/16 sub-600)\n * Link Button (12/16 primary-base, opcional)\n * Flip swap order checkbox ↔ content (label a la izquierda)\n *\n * Typography (pixel-perfect):\n * Label sin description Inter Regular 14/20, ls -0.6%, text/strong-950\n * Label con description Inter Medium 14/20, ls -0.6%, text/strong-950\n * Sublabel Inter Regular 12/16, ls 0, text/sub-600\n * Description Inter Regular 12/16, ls 0, text/sub-600\n * Badge \"NEW\" Inter Medium 11/12, tracking 2 (~18%) UPPERCASE,\n * bg state/warning/light, text state/warning/dark\n * (brand accent naranja — ver token map abajo)\n * Link Button Inter Medium 12/16, primary-base\n *\n * Token map (Figma → sui-tokens):\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * state/warning/light → --sui-state-warning-light (NEW badge bg, brand naranja)\n * state/warning/dark → --sui-state-warning-dark (NEW badge text, brand naranja)\n * primary-base → --sui-primary-base (project remaps to #fa7319)\n * radius-full → 999px\n *\n * PENDING VERIFY (inferred):\n * - Hover/Focus state: la animación de la check viene del sui-checkbox interno;\n * el wrapper no agrega estado propio. Click en cualquier parte del label\n * togglea el checkbox.\n * - Disabled visual: hereda del sui-checkbox + opacity del wrapper a 0.5 (estándar\n * del proyecto). Figma no publica variant disabled del wrapper — inferido.\n * - Letter-spacing hardcoded como -0.6% (no em). Funciona a 14px exacto.\n *\n * Form integration:\n * - Implementa ControlValueAccessor: usable con [(ngModel)] / [formControl].\n * - Modelo two-way `active` (paralelo a sui-checkbox.checked) para uso standalone.\n *\n * iOS WKWebView fix: touchstart/touchend en host.\n *\n * Usage:\n * <sui-checkbox-label label=\"Acepto los términos\" [(active)]=\"accepted\" />\n *\n * <sui-checkbox-label\n * label=\"Recibir newsletter\"\n * sublabel=\"(opcional)\"\n * description=\"Te enviaremos novedades cada 2 semanas.\"\n * [badge]=\"true\"\n * [(active)]=\"newsletter\"\n * />\n *\n * <sui-checkbox-label label=\"Confirmar\" [flip]=\"true\" [(active)]=\"confirm\" />\n */\n@Component({\n selector: 'sui-checkbox-label',\n standalone: true,\n templateUrl: './sui-checkbox-label.html',\n styleUrl: './sui-checkbox-label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiCheckbox, SuiBadge],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCheckboxLabel),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-flip]': 'flip() ? \"\" : null',\n '[attr.data-sui-with-description]': 'description() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '(click)': 'onLabelClick($event)',\n },\n})\nexport class SuiCheckboxLabel implements ControlValueAccessor {\n /** Texto principal del label. */\n readonly label = input<string>('');\n\n /** Sublabel opcional (12/16 sub-600 al lado del label). */\n readonly sublabel = input<string | null>(null);\n\n /** Descripción opcional debajo del title. Cuando está set, el variant\n cambia a \"with description\" (label en medium + multi-line content). */\n readonly description = input<string | null>(null);\n\n /** Muestra el badge built-in al lado del sublabel (default 'NEW'). */\n readonly badge = input(false);\n\n /** Custom label para el badge (default 'NEW'). */\n readonly badgeLabel = input('NEW');\n\n /** Texto del Link Button opcional debajo de la description. Solo se renderiza\n cuando description tiene valor. */\n readonly linkLabel = input<string | null>(null);\n\n /** Si true, invierte orden: [content] [checkbox] (label a la izquierda). */\n readonly flip = input(false);\n\n /** Deshabilita el checkbox + wrapper. */\n readonly disabled = input(false);\n\n /** Indeterminate state propagado al sui-checkbox interno. */\n readonly indeterminate = input(false);\n\n /** Two-way active state (espejo de sui-checkbox.checked). */\n readonly active = model(false);\n\n /** Click en el Link Button. Stop-propagation interno para no togglear el\n checkbox del wrapper. */\n readonly linkClick = output<MouseEvent>();\n\n // ── ControlValueAccessor ──────────────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Click en cualquier parte del label togglea el checkbox interno.\n Excluye clicks dentro del Link Button (que tienen su propio handler). */\n onLabelClick(event: MouseEvent): void {\n if (this.isDisabled()) return;\n const target = event.target as HTMLElement;\n /* Evitar doble-toggle cuando el click cae sobre el sui-checkbox interno\n (él dispara su propio click). Y evitar toggle cuando es el Link Button. */\n if (target.closest('sui-checkbox')) return;\n if (target.closest('.sui-checkbox-label__link')) return;\n const next = !this.active();\n this.active.set(next);\n this._onChange(next);\n this._onTouched();\n }\n\n /** Bridge desde sui-checkbox.checked change → active model + form. */\n onCheckboxChange(next: boolean): void {\n if (next === this.active()) return;\n this.active.set(next);\n this._onChange(next);\n this._onTouched();\n }\n\n onLinkClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) {\n event.preventDefault();\n return;\n }\n this.linkClick.emit(event);\n }\n\n writeValue(v: boolean): void {\n this.active.set(!!v);\n }\n registerOnChange(fn: (v: boolean) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!-- Layout flex: el orden visual depende de [flip]. CSS rota via `order` para\n mantener un solo DOM order accesible (checkbox primero). -->\n<sui-checkbox\n class=\"sui-checkbox-label__checkbox\"\n [checked]=\"active()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"isDisabled()\"\n (checkedChange)=\"onCheckboxChange($event)\"\n/>\n\n<div class=\"sui-checkbox-label__content\">\n <!-- Bloque de texto: Title + Description van pegados (gap-4 en Figma). -->\n <div class=\"sui-checkbox-label__text\">\n <div class=\"sui-checkbox-label__title\">\n <span class=\"sui-checkbox-label__label\">{{ label() }}</span>\n @if (sublabel(); as sl) {\n <span class=\"sui-checkbox-label__sublabel\">{{ sl }}</span>\n }\n @if (badge()) {\n <sui-badge\n class=\"sui-checkbox-label__badge\"\n color=\"orange\"\n variant=\"light\"\n size=\"small\"\n >{{ badgeLabel() }}</sui-badge>\n }\n </div>\n\n @if (description(); as desc) {\n <p class=\"sui-checkbox-label__description\">{{ desc }}</p>\n }\n </div>\n\n @if (description() && linkLabel(); as link) {\n <button\n type=\"button\"\n class=\"sui-checkbox-label__link\"\n [disabled]=\"isDisabled()\"\n (click)=\"onLinkClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >{{ link }}</button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport type SuiCircularProgressBarColor = 'blue' | 'green' | 'orange' | 'red' | 'purple';\n/** Tamaños canónicos del DS (px del diámetro exterior). */\nexport type SuiCircularProgressBarSize = 48 | 56 | 64 | 72 | 80;\n\n/**\n * sui-circular-progress-bar — SUI Design System 2.0 · Circular Progress Bar\n *\n * Figma: 8p1k72aKKvzJV4XcvPS4VO — frame \"Circular Progress Bar [1.1]\" node 466:4652.\n * VERIFIED via MCP (`get_metadata` + `get_design_context` + `get_variable_defs`).\n *\n * EXACT (pulled from Figma 2026-05-29, verified):\n * - Eje Size (5): 48 / 56 / 64 / 72 / 80 px (diámetro exterior cuadrado).\n * - Eje Percentage (5): 0 / 25 / 50 / 75 / 100 % (variantes discretas en Figma;\n * acá se acepta cualquier valor 0–100 con clamp).\n * - Prop `number` (bool): muestra el % en el centro. Default ON en Figma.\n * - Track: `bg/soft-200` #ebebeb.\n * - Fill: `primary-base` #335cff EN EL FIGMA DEL DS. En este proyecto\n * `--sui-primary-base` es naranja (#fa7319), por eso el default\n * `color='blue'` mapea a `--sui-state-information-base` (#335cff),\n * que ES el azul del DS. (mismo criterio que sui-progress-bar línea).\n * - Texto central: `text/strong-950` #171717.\n * · size ≥ 64 → Label/Small (Inter Medium 14 / lh20 / tracking -0.084px),\n * posición `left/right: 12px`, `top: calc(50% - 10px)` (lh/2 = 10).\n * Verificado en símbolos size=64 (466:4735 / label 466:4739) y\n * size=80 (466:4677 / label 466:4681).\n * · size 56 → Label/X Small (Inter Medium 12 / lh16 / tracking 0),\n * mismo inset `left/right: 12px`, `top: calc(50% - 8px)` (lh/2 = 8).\n * Verificado en símbolo size=56 (466:4740 / label 466:4744).\n * · size 48 → SIN texto. El símbolo Figma (466:4745) renderiza sólo\n * el anillo (no expone la prop `number`); tras descontar el stroke\n * no queda espacio interno. Acá `showLabel()` lo suprime.\n * OJO: el inset horizontal es 12px para TODOS los sizes — sólo cambian\n * la escala tipográfica y el offset vertical (= lh/2).\n *\n * DECISIÓN DE IMPLEMENTACIÓN (responde openQuestion #1 del audit):\n * Figma exporta el anillo como SVG (1 asset por size×percentage = 25 assets,\n * URLs que expiran a los 7 días). El SVG canónico dibuja el anillo como dos\n * `<path>` rellenos (annulus, NO stroke): un BG gris y un arco azul. Acá se\n * reimplementa con dos `<circle>` + `stroke-dasharray` dinámico → acepta\n * cualquier % (no sólo 0/25/50/75/100), es accesible (role=progressbar),\n * escala sin pérdida, y no depende de assets externos efímeros. Es la opción\n * correcta para un DS vivo.\n *\n * GEOMETRÍA VERIFICADA (extraída de los SVG canónicos de Figma 2026-05-29):\n * - [STROKE] El grosor del anillo NO es ratio 1/10. Medido del BG annulus de\n * cada SVG (diferencia entre radio exterior y radio interior):\n * size 80 → 6.40px (ratio 0.08 = size·2/25)\n * size 72 → 5.76px (ratio 0.08)\n * size 64 → 5.12px (ratio 0.08)\n * size 56 → 4.48px (ratio 0.08)\n * size 48 → 6.72px (ratio 0.14 — CASO ESPECIAL, anillo más grueso)\n * Sizes 56–80 comparten ratio 0.08; size 48 usa 0.14. `resolvedStroke()`\n * devuelve estos valores exactos. El input `strokeWidth` sigue como override.\n * - [CAP] El arco se dibuja como path RELLENO con extremos radiales PLANOS\n * (butt). El SVG canónico NO tiene `stroke-linecap` (no usa stroke). Acá el\n * arco usa `stroke-linecap=\"butt\"` (= flat) para reproducir esos extremos\n * rectos donde el azul corta contra el gris. (Antes se inferyó 'round' del\n * raster — incorrecto, corregido vs SVG canónico.)\n *\n * EXTENSIONES / CONVENCIONES (no en Figma, preservadas):\n * - [COLOR] color='purple' es extensión del proyecto (igual que en la barra\n * lineal); no está en el eje de color del Circular en Figma. PRESERVADO por\n * consistencia con sui-progress-bar.\n * - [MOTION] transición del arco (stroke-dashoffset) y del track NO está en\n * Figma (estático) — convención del proyecto, desactivada bajo\n * prefers-reduced-motion.\n *\n * Inputs:\n * - value: number 0–100 (clamp interno).\n * - size: 48 | 56 | 64 | 72 | 80 (default 64).\n * - color: 'blue' (default) | 'green' | 'orange' | 'red' | 'purple'.\n * - number: boolean (default true) — muestra el % en el centro. Ignorado\n * para size 48 (Figma no muestra texto en ese size).\n * - strokeWidth: number opcional — override del grosor del anillo (default =\n * valor canónico por size: 0.08·size para 56–80, 0.14·size para 48).\n * - ariaLabel: string opcional para `aria-label` del role=progressbar.\n */\n@Component({\n selector: 'sui-circular-progress-bar',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sui-circular-progress-bar.html',\n styleUrl: './sui-circular-progress-bar.scss',\n host: {\n role: 'progressbar',\n '[attr.aria-valuemin]': '0',\n '[attr.aria-valuemax]': '100',\n '[attr.aria-valuenow]': 'clampedValue()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.data-color]': 'color()',\n '[style.width.px]': 'size()',\n '[style.height.px]': 'size()',\n },\n})\nexport class SuiCircularProgressBar {\n readonly value = input<number>(0);\n readonly size = input<SuiCircularProgressBarSize>(64);\n readonly color = input<SuiCircularProgressBarColor>('blue');\n readonly number = input<boolean>(true);\n readonly strokeWidth = input<number | null>(null);\n readonly ariaLabel = input<string | null>(null);\n\n readonly clampedValue = computed(() => {\n const v = this.value();\n if (Number.isNaN(v)) return 0;\n return Math.max(0, Math.min(100, v));\n });\n\n /**\n * Grosor del anillo: override explícito, o el valor canónico medido del SVG\n * de Figma por size. Sizes 56–80 usan ratio 0.08; size 48 es especial (0.14).\n * (ver GEOMETRÍA VERIFICADA en el header del archivo).\n */\n readonly resolvedStroke = computed(() => {\n const override = this.strokeWidth();\n if (override != null && override > 0) return override;\n const size = this.size();\n // size 48: anillo más grueso (6.72px = 0.14·48). Resto: 0.08·size.\n return size === 48 ? size * 0.14 : size * 0.08;\n });\n\n /** Radio del path SVG (centrado, descontando medio stroke para no clippear). */\n readonly radius = computed(() => (this.size() - this.resolvedStroke()) / 2);\n\n /** Centro del viewBox = mitad del diámetro. */\n readonly center = computed(() => this.size() / 2);\n\n /** Circunferencia del anillo = 2πr. */\n readonly circumference = computed(() => 2 * Math.PI * this.radius());\n\n /** dashoffset = parte NO completada de la circunferencia. */\n readonly dashOffset = computed(() => {\n const c = this.circumference();\n return c - (this.clampedValue() / 100) * c;\n });\n\n /** Texto central formateado (% entero). */\n readonly label = computed(() => `${Math.round(this.clampedValue())}%`);\n\n /**\n * Muestra el texto central. Requiere `number()` Y size ≥ 56: en Figma el\n * size=48 (símbolo 466:4745) NUNCA renderiza texto — el anillo es demasiado\n * chico tras descontar el stroke. Para size 48 sólo se pinta el anillo.\n */\n readonly showLabel = computed(() => this.number() && this.size() >= 56);\n\n /** Size 56 usa tipografía Label/X Small (12/lh16) para no desbordar (ver header). */\n readonly compactLabel = computed(() => this.size() < 64);\n}\n","<svg\n class=\"sui-circular-progress-bar__svg\"\n [attr.viewBox]=\"'0 0 ' + size() + ' ' + size()\"\n [attr.width]=\"size()\"\n [attr.height]=\"size()\"\n aria-hidden=\"true\"\n>\n <!-- Track (anillo de fondo) -->\n <circle\n class=\"sui-circular-progress-bar__track\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"resolvedStroke()\"\n fill=\"none\"\n />\n <!-- Fill (arco de progreso) — arranca arriba (-90deg) y avanza horario -->\n <circle\n class=\"sui-circular-progress-bar__fill\"\n [attr.cx]=\"center()\"\n [attr.cy]=\"center()\"\n [attr.r]=\"radius()\"\n [attr.stroke-width]=\"resolvedStroke()\"\n [attr.stroke-dasharray]=\"circumference()\"\n [attr.stroke-dashoffset]=\"dashOffset()\"\n [attr.transform]=\"'rotate(-90 ' + center() + ' ' + center() + ')'\"\n stroke-linecap=\"butt\"\n fill=\"none\"\n />\n</svg>\n\n@if (showLabel()) {\n <span\n class=\"sui-circular-progress-bar__label\"\n [class.sui-circular-progress-bar__label--compact]=\"compactLabel()\"\n >{{ label() }}</span\n >\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\n\nexport type SuiColorDotColor =\n | 'gray'\n | 'blue'\n | 'orange'\n | 'red'\n | 'green'\n | 'yellow'\n | 'purple'\n | 'sky'\n | 'pink'\n | 'teal';\n\n/**\n * Set canon de 10 colores SUI 2.0 — usable como referencia desde el consumer.\n * Útil para iterar en pickers, badges, tag selectors.\n */\nexport const SUI_COLOR_DOT_COLORS: readonly SuiColorDotColor[] = [\n 'gray', 'blue', 'orange', 'red', 'green',\n 'yellow', 'purple', 'sky', 'pink', 'teal',\n] as const;\n\n/**\n * Mapa preset → hex canónico (Figma `<color>/500`).\n * Útil para que el `sui-color-picker` emita hex y para que el dot trigger\n * encuentre si un hex matches un preset y muestre el dot estilizado.\n */\nexport const SUI_COLOR_DOT_HEX: Record<SuiColorDotColor, string> = {\n gray: '#7b7b7b', // neutral/gray/500 (acromático) — Figma 3365:22464 / 166331:4100. NO slate-500 (#717784, shift azul).\n blue: '#335cff',\n orange: '#fa7319',\n red: '#fb3748',\n green: '#1fc16b',\n yellow: '#f6b51e',\n purple: '#7d52f4',\n sky: '#47c2ff',\n pink: '#fb4ba3',\n teal: '#22d3bb',\n};\n\n/** Mapa inverso: hex (lowercase, 6 chars con #) → preset name. */\nexport const SUI_HEX_TO_COLOR: Record<string, SuiColorDotColor> = Object\n .entries(SUI_COLOR_DOT_HEX)\n .reduce((acc, [name, hex]) => {\n acc[hex.toLowerCase()] = name as SuiColorDotColor;\n return acc;\n }, {} as Record<string, SuiColorDotColor>);\n\n/**\n * Normaliza un string hex al formato canon `#rrggbb` (lowercase, con #).\n * Devuelve null si el input no es un hex válido (3 o 6 chars).\n * Aceptado: '#fff', 'FFF', '#FFFFFF', 'ffffff'.\n */\nexport function normalizeHex(input: string | null | undefined): string | null {\n if (!input) return null;\n const raw = input.trim().replace(/^#/, '').toLowerCase();\n if (/^[0-9a-f]{3}$/.test(raw)) {\n // Expand 3-digit shorthand\n return '#' + raw.split('').map(c => c + c).join('');\n }\n if (/^[0-9a-f]{6}$/.test(raw)) {\n return '#' + raw;\n }\n return null;\n}\n\n/**\n * SUI Color Dot — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 3365:22464 \"Color Dots [1.1]\" — VERIFIED via MCP\n *\n * Átomo individual del color picker. CSS-only — NO usa `<input type=\"color\">`\n * (que abre un picker nativo distinto en iOS vs Android vs desktop) ni assets\n * SVG. Todo se pinta con `background` + ring vía `::before`.\n *\n * EXACT (pulled from Figma 3365:22464):\n * - 40 variants en figma = 10 colors × 4 states (default/hover/selected/disabled)\n * - Container: 24×24\n * - Dot inner default/hover: 16×16 (figma `inset-[16.67%]`)\n * - Dot inner selected: 12×12 (más chico para hacer hueco al ring)\n * - Ring selected: ~18×18 con border 2px del mismo color, CEÑIDO al dot\n * con gap ≈2px — medido píxel-a-píxel sobre el nodo Figma 3365:22565\n * (`WW.BWWBBBBBBBBBBBBWWB.WW`: ring exterior diámetro ~18px, NO 24px)\n *\n * Color tokens (Figma `neutral/gray/500` y `<color>/500`):\n * gray → --sui-neutral-500 (#7b7b7b acromático, NO slate-500 #717784)\n * blue → --sui-blue-500 (#335cff)\n * orange → --sui-orange-500 (#fa7319)\n * red → --sui-red-500 (#fb3748)\n * green → --sui-green-500 (#1fc16b)\n * yellow → --sui-yellow-500 (#f6b51e)\n * purple → --sui-purple-500 (#7d52f4)\n * sky → --sui-sky-500 (#47c2ff)\n * pink → --sui-pink-500 (#fb4ba3)\n * teal → --sui-teal-500 (#22d3bb)\n *\n * State disabled: dot gris pálido (--sui-bg-soft-200 #ebebeb), color tint\n * descartado. NO se aplica opacity (matchea figma: state-uniforme, no\n * \"current-color faded\").\n *\n * Custom hex: si el consumer pasa `[customHex]=\"#abc123\"` el dot pinta con\n * ese hex via inline style (ignora el `[color]` preset). Útil cuando el\n * color picker permite hex personalizado fuera de los 10 canon.\n *\n * Behavior:\n * - Click emite `(clicked)` solo si NO disabled.\n * - `[state]='selected'` se setea desde el consumer.\n *\n * iOS active fix: el host es un `<button>` con touchstart/touchend.\n */\n@Component({\n selector: 'sui-color-dot',\n standalone: true,\n templateUrl: './sui-color-dot.html',\n styleUrl: './sui-color-dot.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-color]': 'color()',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-custom]': 'customHex() ? \"\" : null',\n '[style.--c]': 'customHex() || null',\n },\n})\nexport class SuiColorDot {\n /** Nombre del preset. Default `gray` cuando se usa customHex (el preset no aplica). */\n readonly color = input<SuiColorDotColor>('gray');\n\n /**\n * Hex personalizado (override del preset). Si presente, el dot toma ese\n * color via inline `--c` y el `[data-sui-color]` queda en el preset por\n * default (no visual). Útil para previewer hex custom del color picker.\n */\n readonly customHex = input<string | null>(null);\n\n /**\n * Estado visual. Figma 3365:22464 define 4 estados nombrados por color\n * (40 variants = 10 colores × 4 estados):\n * - `default` → dot 16×16, sin ring.\n * - `hover` → dot 14×14 (achicado). El CSS `:hover` lo maneja solo en la\n * interacción real del browser; este valor permite además forzarlo de\n * forma programática (testing, secuencias de animación, previews).\n * - `selected` → dot 12×12 + ring 2px.\n * - `disabled` → dot gris pálido, sin pointer events.\n */\n readonly state = input<'default' | 'hover' | 'selected' | 'disabled'>('default');\n\n /** aria-label override. */\n readonly ariaLabel = input<string>('');\n\n readonly clicked = output<void>();\n\n /** Label por default: nombre del color capitalizado en spanish, o el hex. */\n readonly defaultAriaLabel = computed<string>(() => {\n const hex = this.customHex();\n if (hex) return `Color ${hex}`;\n const map: Record<SuiColorDotColor, string> = {\n gray: 'Gris', blue: 'Azul', orange: 'Naranja', red: 'Rojo', green: 'Verde',\n yellow: 'Amarillo', purple: 'Morado', sky: 'Celeste', pink: 'Rosado', teal: 'Turquesa',\n };\n return map[this.color()];\n });\n\n protected onClick(): void {\n if (this.state() === 'disabled') return;\n this.clicked.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"sui-color-dot__inner\"\n role=\"radio\"\n [disabled]=\"state() === 'disabled' || null\"\n [attr.aria-checked]=\"state() === 'selected' ? 'true' : 'false'\"\n [attr.aria-label]=\"ariaLabel() || defaultAriaLabel()\"\n (click)=\"onClick()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n></button>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport {\n SuiColorDot,\n SUI_COLOR_DOT_COLORS,\n SUI_COLOR_DOT_HEX,\n SUI_HEX_TO_COLOR,\n normalizeHex,\n type SuiColorDotColor,\n} from '../sui-color-dot/sui-color-dot';\n\n/* ════════════════════════════════════════════════════════════════════════\n * HSV ↔ RGB ↔ HEX conversion helpers\n *\n * Internal model: { h: [0..360), s: [0..1], v: [0..1] }, alpha [0..1].\n * Public value: `#rrggbb` (6 chars) cuando alpha=off;\n * `#rrggbbaa` (8 chars) cuando alpha=on y a<1.\n *\n * Math reference:\n * https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB_alternative\n * ════════════════════════════════════════════════════════════════════════ */\n\nfunction clamp01(v: number): number { return Math.max(0, Math.min(1, v)); }\n\nfunction hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n // Implementación canon — h in [0,360), s/v in [0,1], r/g/b out in [0,255]\n const c = v * s;\n const hh = (h % 360) / 60;\n const x = c * (1 - Math.abs((hh % 2) - 1));\n let r1 = 0, g1 = 0, b1 = 0;\n if (hh < 1) { r1 = c; g1 = x; b1 = 0; }\n else if (hh < 2) { r1 = x; g1 = c; b1 = 0; }\n else if (hh < 3) { r1 = 0; g1 = c; b1 = x; }\n else if (hh < 4) { r1 = 0; g1 = x; b1 = c; }\n else if (hh < 5) { r1 = x; g1 = 0; b1 = c; }\n else { r1 = c; g1 = 0; b1 = x; }\n const m = v - c;\n return {\n r: Math.round((r1 + m) * 255),\n g: Math.round((g1 + m) * 255),\n b: Math.round((b1 + m) * 255),\n };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const r1 = r / 255, g1 = g / 255, b1 = b / 255;\n const max = Math.max(r1, g1, b1);\n const min = Math.min(r1, g1, b1);\n const d = max - min;\n let h = 0;\n if (d !== 0) {\n if (max === r1) h = ((g1 - b1) / d) % 6;\n else if (max === g1) h = (b1 - r1) / d + 2;\n else h = (r1 - g1) / d + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n const s = max === 0 ? 0 : d / max;\n const v = max;\n return { h, s, v };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) => n.toString(16).padStart(2, '0');\n return '#' + toHex(r) + toHex(g) + toHex(b);\n}\n\n/**\n * Parsea un hex 3/4/6/8 chars → { hex: #rrggbb, alpha: [0..1] }.\n * Devuelve null si no es válido. Soporta:\n * #rgb, #rgba, #rrggbb, #rrggbbaa (con o sin `#`, case-insensitive).\n */\nfunction parseHexWithAlpha(\n input: string | null | undefined,\n): { hex: string; alpha: number; hasAlpha: boolean } | null {\n if (!input) return null;\n let raw = input.trim().replace(/^#/, '').toLowerCase();\n // Expand shorthand 3/4 → 6/8\n let hadAlphaShorthand = false;\n if (/^[0-9a-f]{3}$/.test(raw)) {\n raw = raw.split('').map(c => c + c).join('');\n } else if (/^[0-9a-f]{4}$/.test(raw)) {\n raw = raw.split('').map(c => c + c).join('');\n hadAlphaShorthand = true;\n }\n if (/^[0-9a-f]{6}$/.test(raw) && !hadAlphaShorthand) {\n return { hex: '#' + raw, alpha: 1, hasAlpha: false };\n }\n if (/^[0-9a-f]{8}$/.test(raw)) {\n const alpha = parseInt(raw.slice(6, 8), 16) / 255;\n return { hex: '#' + raw.slice(0, 6), alpha, hasAlpha: true };\n }\n return null;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const n = normalizeHex(hex);\n if (!n) return null;\n return {\n r: parseInt(n.slice(1, 3), 16),\n g: parseInt(n.slice(3, 5), 16),\n b: parseInt(n.slice(5, 7), 16),\n };\n}\n\n/** Convierte alpha [0..1] → 2-char hex (00..ff). */\nfunction alphaToHex(alpha: number): string {\n return Math.round(clamp01(alpha) * 255).toString(16).padStart(2, '0');\n}\n\n/**\n * SUI Color Picker — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 4456:115795 \"Color Picker [1.1]\" — VERIFIED via MCP\n * Sub-nodes: 4456:115716 (Colors), 4456:115765 (Recommended), 4456:115425\n * (Color Spectrum), 4415:53669 (Hue), 4415:53670 (Opacity),\n * 4456:115720 (Color Input), 4456:115721 (Dropdown), 4456:115796\n * (Sip / eyedropper), 4456:115727 (Opacity field).\n * Doc canon: https://www.sui.com/docs/v1.2/ui/color-picker\n *\n * Implementación 100% custom — NO usa `<input type=\"color\">` (que abre el\n * picker nativo distinto en iOS / Android / desktop). Toda la UI es Angular\n * + CSS + pointer events para que se vea idéntico en Capacitor.\n *\n * Features implementados (homologados vs Figma):\n * 1. HSV Color Spectrum — 232px alto, w-full (rounded-8), drag por pointer\n * events (touch + mouse + pen unificado). Thumb circular 16px sigue al\n * puntero.\n * 2. Hue slider arcoíris — track h-8px, thumb 16px.\n * 3. Opacity (alpha) slider — track checkerboard + transparent→color, thumb\n * 16px. Visible por default (Figma lo renderiza siempre). Ocultable con\n * `[alpha]=false` cuando el caso no necesita opacidad.\n * 4. Color Input row — fila bordeada (rounded-8) con: sip (eyedropper) |\n * hex field | opacity field. Hex validado con parse 3/4/6/8 chars.\n * 5. Format label \"Hex\" + chevron (arrow-down-s-line 20px) — visual del\n * dropdown de Figma. Hex-only por ahora (ver PENDING VERIFY).\n * 6. Eyedropper (sip-line) — usa la EyeDropper API nativa con feature-detect.\n * Oculto cuando el browser no la soporta (Safari/iOS/Android/Firefox).\n * 7. Recommended Colors — grid flex-wrap gap-4px de dots (`<sui-color-dot>`).\n * 8. Trigger button — muestra el dot del valor actual + label + chevron.\n *\n * ── PENDING VERIFY (decisiones de alcance, ver newQuestions del reporte) ──\n * - Alpha/opacity ahora es ON por default (`[alpha]=true`) para homologar el\n * estado default de Figma (slider + campo \"100%\" siempre presentes). El\n * value sigue emitiendo `#rrggbb` (6 chars) mientras a===1; solo emite\n * `#rrggbbaa` (8 chars) si el user baja la opacidad. Esto es un cambio de\n * comportamiento de API vs la versión previa (default era `false`):\n * los consumers de tags/branding podrían recibir 8 chars si el user\n * arrastra el slider. Pasar `[alpha]=false` para forzar siempre 6 chars.\n * - Format dropdown (Hex/RGB/HSL): se renderiza el label \"Hex\" + chevron\n * para homologar el visual, pero el picker SOLO emite/parsea Hex. Hacer\n * funcional el switch a RGB/HSL implica cambiar el formato de salida del\n * value (breaking). Confirmar si el proyecto necesita RGB/HSL.\n * - Eyedropper: la EyeDropper API solo existe en Chromium desktop. Con\n * feature-detect se oculta donde no aplica (NO se rompe ni se muestra\n * un botón muerto en iOS/Android).\n *\n * Conversiones internas: HSV ↔ RGB ↔ HEX. State source-of-truth es `{h,s,v}`\n * + `alpha` para evitar drift de precisión cuando el user mueve sliders rápido.\n *\n * Behavior:\n * - Click trigger → toggle popover\n * - Click outside / Esc → cierra\n * - Click en un dot → setea value al hex del preset + cierra\n * - Drag en spectrum/sliders → actualiza value en tiempo real\n * - Hex input → blur o Enter para commit (evita updates por cada keystroke)\n * - Eyedropper → abre el cuentagotas nativo (Chromium), aplica el hex tomado\n *\n * Accesibilidad:\n * - Trigger: aria-haspopup=\"dialog\" + aria-expanded\n * - Panel: role=\"dialog\" aria-label\n * - Spectrum: role=\"application\" aria-label=\"Saturación y brillo\"\n * - Sliders: role=\"slider\" aria-valuemin/max/now\n * - Dots: role=\"radio\" + aria-checked (los renderea sui-color-dot)\n */\n@Component({\n selector: 'sui-color-picker',\n standalone: true,\n imports: [SuiIcon, SuiColorDot],\n templateUrl: './sui-color-picker.html',\n styleUrl: './sui-color-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-open]': 'open() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.data-sui-presets-only]': 'presetsOnly() ? \"\" : null',\n },\n})\nexport class SuiColorPicker {\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Lista de colores recomendados (grid). Default los 10 canon SUI.\n * El consumer puede pasar sublista para limitar opciones (ej. solo brand colors).\n */\n readonly colors = input<readonly SuiColorDotColor[]>(SUI_COLOR_DOT_COLORS);\n\n /**\n * Valor actual en formato HEX. Two-way binding `[(value)]`.\n * Acepta hex con o sin `#`, 3/4/6/8 chars, lo normaliza internamente.\n * Emite `#rrggbb` (6 chars) cuando alpha=off o alpha=1;\n * emite `#rrggbbaa` (8 chars) cuando `[alpha]=true` y a<1.\n * Default `null` = sin valor seleccionado.\n */\n readonly value = model<string | null>(null);\n\n /** Label visible cuando no hay color seleccionado. */\n readonly placeholder = input<string>('Elegir color');\n\n /** Etiqueta de la sección Recommended Colors dentro del panel. */\n readonly recommendedLabel = input<string>('Colores recomendados');\n\n /** Si true, oculta el HSV spectrum + sliders + hex input — solo grid de presets. */\n readonly presetsOnly = input(false);\n\n /**\n * Canal alpha — controla la visibilidad del slider Opacity + el campo \"%\".\n *\n * Default `true` para homologar el estado default de Figma (node 4456:115795):\n * el spec renderiza el slider de opacity y el campo \"100%\" SIEMPRE, no detrás\n * de un opt-in. Con `true` (default) la fila de input muestra 3 celdas\n * (sip | hex | %), igual que el diseño.\n *\n * Emit del value:\n * - a === 1 (default, opacidad llena) → `#rrggbb` (6 chars). El contrato de\n * los consumers de tags/branding NO se rompe mientras no bajen la opacidad.\n * - a < 1 (user arrastra el slider) → `#rrggbbaa` (8 chars).\n *\n * Pasar `[alpha]=false` para ocultar el control de opacidad por completo\n * (caso: pickers donde el alpha no aplica y se quiere forzar siempre 6 chars).\n */\n readonly alpha = input(true);\n\n /**\n * Muestra el botón eyedropper (sip-line). Default `true` — pero internamente\n * solo se renderea si la EyeDropper API existe (feature-detect). En browsers\n * sin soporte (Safari/iOS/Android/Firefox) NO se muestra nunca.\n */\n readonly eyedropper = input(true);\n\n /** Muestra el label del formato (\"Hex\") + chevron arriba del input. */\n readonly showFormatLabel = input(true);\n\n readonly disabled = input(false);\n\n /** aria-label del trigger. */\n readonly ariaLabel = input<string>('Seleccionar color');\n\n /** Emitido cuando el value cambia (cualquier interacción). */\n readonly change = output<string>();\n\n /** Estado interno del popover. */\n readonly open = signal(false);\n\n /** Internal HSV state — source of truth durante el drag. */\n protected readonly h = signal(220); // matiz default azul\n protected readonly s = signal(1);\n protected readonly v = signal(1);\n /** Canal alpha [0..1]. Solo relevante cuando `[alpha]=true`. */\n protected readonly a = signal(1);\n\n /** Hex input visible (separate del value model para validación en blur). */\n protected readonly hexInput = signal<string>('');\n\n /** Refs del spectrum y sliders para cálculos de bounds */\n private readonly canvasRef = viewChild<ElementRef<HTMLElement>>('canvas');\n private readonly hueRef = viewChild<ElementRef<HTMLElement>>('hueSlider');\n private readonly opacityRef = viewChild<ElementRef<HTMLElement>>('opacitySlider');\n\n /** Feature-detect de la EyeDropper API (solo Chromium desktop). */\n protected readonly eyeDropperSupported =\n typeof window !== 'undefined' && 'EyeDropper' in window;\n\n /** El botón eyedropper se muestra solo si el consumer lo pide Y hay soporte. */\n protected readonly showEyedropper = computed(() =>\n this.eyedropper() && this.eyeDropperSupported\n );\n\n /**\n * Flag para evitar que el `externalValueSync` reaccione a sus propios sets.\n * Es field (no signal) — los effects no lo leen reactivamente, solo en\n * el momento de su ejecución. La reapertura via `queueMicrotask` da tiempo\n * a Angular de procesar el `tick` antes de aceptar el próximo evento externo.\n */\n private _internalSet = false;\n\n /**\n * Último hex emitido al output `(change)`. Defensiva contra re-emisión del\n * mismo hex durante drag rapid-fire o cuando el value model y el HSV\n * convergen al mismo color por caminos distintos. NUNCA disparamos\n * `change.emit(hex)` si `_lastEmittedHex === hex`.\n */\n private _lastEmittedHex: string | null = null;\n\n /**\n * Devuelve el hex a emitir según el estado actual de alpha. Con `[alpha]`\n * off (o a===1) → 6 chars. Con alpha on y a<1 → 8 chars (#rrggbbaa).\n */\n private composeHex(rgbHex: string): string {\n if (!this.alpha() || this.a() >= 1) return rgbHex;\n return rgbHex + alphaToHex(this.a());\n }\n\n /**\n * Punto único de emit. Garantiza:\n * 1. `value` model solo se setea si difiere del hex (skip redundante)\n * 2. `(change)` solo se emite si el hex difiere del último emitido\n */\n private emitHex(hex: string): void {\n if (this.value() !== hex) {\n this.value.set(hex);\n }\n if (this._lastEmittedHex !== hex) {\n this._lastEmittedHex = hex;\n this.change.emit(hex);\n }\n }\n\n /**\n * Operación atómica: setea HSV(+alpha) + value + hexInput en un solo paso.\n *\n * Resuelve el bug del round-trip HSV → hex lossy (Math.round causa ±1 en\n * componentes RGB). Marca `_internalSet` para que el effect de sync externo\n * no re-dispare.\n *\n * Acepta hex 6 u 8 chars: si trae alpha y `[alpha]=true`, lo aplica.\n */\n private setColor(hex: string): void {\n const parsed = parseHexWithAlpha(hex);\n if (!parsed) return;\n const rgb = hexToRgb(parsed.hex);\n if (!rgb) return;\n const { h, s, v } = rgbToHsv(rgb.r, rgb.g, rgb.b);\n this._internalSet = true;\n // Para grayscale (saturación 0), preservar el hue actual del slider\n // — sino el indicador del hue slider saltaría a 0 cada vez que el value\n // pasa por un gris puro.\n if (s > 0) this.h.set(h);\n this.s.set(s);\n this.v.set(v);\n // Solo sobreescribir alpha cuando el hex traía canal alpha explícito\n // (8 chars). Un preset/eyedropper (6 chars) preserva el alpha actual del\n // slider — el usuario lo seteó deliberadamente.\n if (this.alpha() && parsed.hasAlpha) this.a.set(parsed.alpha);\n const out = this.composeHex(parsed.hex);\n this.hexInput.set(parsed.hex);\n this.emitHex(out);\n queueMicrotask(() => {\n this._internalSet = false;\n });\n }\n\n /**\n * Sync externo one-way: cuando el consumer setea `value` desde afuera\n * (ej. `colorPicker.set('#abc123')`), refleja en HSV interno.\n *\n * Usa `untracked()` para leer h/s/v sin suscribirse — el effect solo se\n * dispara cuando `value` cambia (signal único trackeado).\n */\n private readonly externalValueSync = effect(() => {\n const v = this.value();\n if (this._internalSet) return;\n const parsed = parseHexWithAlpha(v);\n if (!parsed) return;\n // Lee HSV actual SIN trackearlo — evita el loop hsvSync ↔ valueSync\n // que causaba NG0103 (infinite change detection).\n const currentHsvHex = untracked(() => {\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n return this.composeHex(rgbToHex(r, g, b));\n });\n if (currentHsvHex === v) return;\n // Caso real: consumer cambió value externo. Aplicamos sin retriggear.\n const rgb = hexToRgb(parsed.hex);\n if (!rgb) return;\n const { h, s, v: val } = rgbToHsv(rgb.r, rgb.g, rgb.b);\n this._internalSet = true;\n if (s > 0) this.h.set(h);\n this.s.set(s);\n this.v.set(val);\n if (this.alpha() && parsed.hasAlpha) this.a.set(parsed.alpha);\n this.hexInput.set(parsed.hex);\n // Sync `_lastEmittedHex` con el value externo — así un drag posterior\n // al mismo hex NO re-emite (`change` no se dispara redundantemente).\n this._lastEmittedHex = v;\n queueMicrotask(() => {\n this._internalSet = false;\n });\n });\n\n /** Color base para el HSV spectrum (hue puro, full saturation/value) */\n readonly hueColor = computed<string>(() => {\n const { r, g, b } = hsvToRgb(this.h(), 1, 1);\n return rgbToHex(r, g, b);\n });\n\n /** Hex actual derivado del HSV interno (mostrado en input + dot preview) */\n readonly currentHex = computed<string>(() => {\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n return rgbToHex(r, g, b);\n });\n\n /** Si el value actual matches un preset, devolvemos su nombre (para mostrar dot estilizado) */\n readonly currentPreset = computed<SuiColorDotColor | null>(() => {\n const parsed = parseHexWithAlpha(this.value());\n if (!parsed) return null;\n return SUI_HEX_TO_COLOR[parsed.hex] ?? null;\n });\n\n /** Label del trigger (nombre del preset si match, sino el hex) */\n readonly currentLabel = computed<string>(() => {\n const v = this.value();\n if (!v) return this.placeholder();\n const preset = this.currentPreset();\n if (preset) {\n const map: Record<SuiColorDotColor, string> = {\n gray: 'Gris', blue: 'Azul', orange: 'Naranja', red: 'Rojo', green: 'Verde',\n yellow: 'Amarillo', purple: 'Morado', sky: 'Celeste', pink: 'Rosado', teal: 'Turquesa',\n };\n return map[preset];\n }\n return v.toUpperCase();\n });\n\n /** Position del thumb en el spectrum (% based) */\n readonly canvasThumbX = computed(() => (this.s() * 100).toFixed(2) + '%');\n readonly canvasThumbY = computed(() => ((1 - this.v()) * 100).toFixed(2) + '%');\n\n /** Position del thumb en el hue slider (% based) */\n readonly hueThumbX = computed(() => ((this.h() / 360) * 100).toFixed(2) + '%');\n\n /** Position del thumb en el opacity slider (% based) */\n readonly opacityThumbX = computed(() => (this.a() * 100).toFixed(2) + '%');\n\n /** Color rgb(a) para el track/thumb del opacity slider. */\n readonly opacityColor = computed<string>(() => this.currentHex());\n\n /** Color con alpha aplicado (rgba) para el thumb del opacity slider. */\n readonly opacityThumbColor = computed<string>(() => {\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n return `rgba(${r}, ${g}, ${b}, ${this.a().toFixed(3)})`;\n });\n\n /** Color del dot preview en el trigger (con alpha si aplica). */\n readonly previewColor = computed<string>(() => {\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n return this.alpha() ? `rgba(${r}, ${g}, ${b}, ${this.a().toFixed(3)})` : rgbToHex(r, g, b);\n });\n\n /** Round del hue para aria-valuenow (sin pipe) */\n readonly hueRounded = computed(() => Math.round(this.h()));\n\n /** Alpha en porcentaje entero (0..100) para el campo \"%\". */\n readonly alphaPercent = computed(() => Math.round(this.a() * 100));\n\n /**\n * Valor mostrado en el hex field (sin `#`, uppercase para que coincida con\n * la convención visual del figma \"335CFF\").\n */\n readonly hexDisplayValue = computed<string>(() =>\n this.hexInput().replace(/^#/, '').toUpperCase()\n );\n\n toggle(): void {\n if (this.disabled()) return;\n this.open.update(v => !v);\n // Al abrir, sync hex input con value actual\n if (this.open()) {\n const parsed = parseHexWithAlpha(this.value());\n this.hexInput.set(parsed?.hex ?? '');\n }\n }\n\n close(): void {\n if (this.open()) this.open.set(false);\n }\n\n /* ─────────── Recommended dot click ─────────── */\n\n onPresetClick(preset: SuiColorDotColor): void {\n // setColor atómico → garantiza que value, HSV y hexInput queden\n // todos sincronizados con el hex CANON del preset (no round-tripped).\n this.setColor(SUI_COLOR_DOT_HEX[preset]);\n this.close();\n }\n\n /* ─────────── HSV spectrum drag ─────────── */\n\n private canvasDragging = false;\n\n protected onCanvasPointerDown(ev: PointerEvent): void {\n const el = this.canvasRef()?.nativeElement;\n if (!el) return;\n this.canvasDragging = true;\n el.setPointerCapture?.(ev.pointerId);\n this.updateCanvasFromPointer(ev);\n ev.preventDefault();\n }\n\n protected onCanvasPointerMove(ev: PointerEvent): void {\n if (!this.canvasDragging) return;\n this.updateCanvasFromPointer(ev);\n }\n\n protected onCanvasPointerUp(ev: PointerEvent): void {\n if (!this.canvasDragging) return;\n this.canvasDragging = false;\n const el = this.canvasRef()?.nativeElement;\n el?.releasePointerCapture?.(ev.pointerId);\n }\n\n private updateCanvasFromPointer(ev: PointerEvent): void {\n const el = this.canvasRef()?.nativeElement;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const newS = clamp01((ev.clientX - rect.left) / rect.width);\n const newV = 1 - clamp01((ev.clientY - rect.top) / rect.height);\n const { r, g, b } = hsvToRgb(this.h(), newS, newV);\n const hex = rgbToHex(r, g, b);\n this._internalSet = true;\n this.s.set(newS);\n this.v.set(newV);\n this.hexInput.set(hex);\n this.emitHex(this.composeHex(hex));\n queueMicrotask(() => { this._internalSet = false; });\n }\n\n /* ─────────── Hue slider drag ─────────── */\n\n private hueDragging = false;\n\n protected onHuePointerDown(ev: PointerEvent): void {\n const el = this.hueRef()?.nativeElement;\n if (!el) return;\n this.hueDragging = true;\n el.setPointerCapture?.(ev.pointerId);\n this.updateHueFromPointer(ev);\n ev.preventDefault();\n }\n\n protected onHuePointerMove(ev: PointerEvent): void {\n if (!this.hueDragging) return;\n this.updateHueFromPointer(ev);\n }\n\n protected onHuePointerUp(ev: PointerEvent): void {\n if (!this.hueDragging) return;\n this.hueDragging = false;\n const el = this.hueRef()?.nativeElement;\n el?.releasePointerCapture?.(ev.pointerId);\n }\n\n private updateHueFromPointer(ev: PointerEvent): void {\n const el = this.hueRef()?.nativeElement;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const newH = clamp01((ev.clientX - rect.left) / rect.width) * 360;\n const { r, g, b } = hsvToRgb(newH, this.s(), this.v());\n const hex = rgbToHex(r, g, b);\n this._internalSet = true;\n this.h.set(newH);\n this.hexInput.set(hex);\n this.emitHex(this.composeHex(hex));\n queueMicrotask(() => { this._internalSet = false; });\n }\n\n /* ─────────── Opacity (alpha) slider drag ─────────── */\n\n private opacityDragging = false;\n\n protected onOpacityPointerDown(ev: PointerEvent): void {\n const el = this.opacityRef()?.nativeElement;\n if (!el) return;\n this.opacityDragging = true;\n el.setPointerCapture?.(ev.pointerId);\n this.updateOpacityFromPointer(ev);\n ev.preventDefault();\n }\n\n protected onOpacityPointerMove(ev: PointerEvent): void {\n if (!this.opacityDragging) return;\n this.updateOpacityFromPointer(ev);\n }\n\n protected onOpacityPointerUp(ev: PointerEvent): void {\n if (!this.opacityDragging) return;\n this.opacityDragging = false;\n const el = this.opacityRef()?.nativeElement;\n el?.releasePointerCapture?.(ev.pointerId);\n }\n\n private updateOpacityFromPointer(ev: PointerEvent): void {\n const el = this.opacityRef()?.nativeElement;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const newA = clamp01((ev.clientX - rect.left) / rect.width);\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n const hex = rgbToHex(r, g, b);\n this._internalSet = true;\n this.a.set(newA);\n this.hexInput.set(hex);\n this.emitHex(this.composeHex(hex));\n queueMicrotask(() => { this._internalSet = false; });\n }\n\n /* ─────────── Hex input ─────────── */\n\n protected onHexInputChange(ev: Event): void {\n const value = (ev.target as HTMLInputElement).value;\n // Guardamos lo que typea el user (con `#`), normalización al commit.\n this.hexInput.set('#' + value.replace(/^#/, ''));\n }\n\n /** Commit en blur o Enter — solo si es válido. Sino restaura el value actual. */\n protected onHexCommit(): void {\n const parsed = parseHexWithAlpha(this.hexInput());\n if (!parsed) {\n // Inválido → restaurar al value actual\n const current = parseHexWithAlpha(this.value());\n this.hexInput.set(current?.hex ?? '');\n return;\n }\n // Seteo atómico: actualiza value + HSV + hexInput en un solo paso.\n this.setColor(parsed.hex);\n }\n\n protected onHexKeyDown(ev: KeyboardEvent): void {\n if (ev.key === 'Enter') {\n (ev.target as HTMLInputElement)?.blur();\n } else if (ev.key === 'Escape') {\n this.close();\n }\n }\n\n /* ─────────── Opacity field (%) ─────────── */\n\n protected onOpacityFieldCommit(ev: Event): void {\n const raw = (ev.target as HTMLInputElement).value.replace(/[^0-9]/g, '');\n const pct = Math.max(0, Math.min(100, parseInt(raw, 10) || 0));\n const { r, g, b } = hsvToRgb(this.h(), this.s(), this.v());\n const hex = rgbToHex(r, g, b);\n this._internalSet = true;\n this.a.set(pct / 100);\n this.emitHex(this.composeHex(hex));\n queueMicrotask(() => { this._internalSet = false; });\n }\n\n /* ─────────── Eyedropper (sip-line) ─────────── */\n\n protected async onEyedropper(): Promise<void> {\n if (!this.eyeDropperSupported) return;\n try {\n // EyeDropper API — solo Chromium desktop. Tipado inline (no en lib.dom).\n const EyeDropperCtor = (window as unknown as {\n EyeDropper: new () => { open: () => Promise<{ sRGBHex: string }> };\n }).EyeDropper;\n const result = await new EyeDropperCtor().open();\n const normalized = normalizeHex(result.sRGBHex);\n if (normalized) this.setColor(normalized);\n } catch {\n // user canceló (Esc) — no-op.\n }\n }\n\n /* ─────────── Outside click + Esc ─────────── */\n\n @HostListener('document:click', ['$event.target'])\n protected onDocumentClick(target: EventTarget | null): void {\n if (!this.open()) return;\n if (target instanceof Node && !this.hostRef.nativeElement.contains(target)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.close();\n }\n}\n","<button\n type=\"button\"\n class=\"sui-color-picker__trigger\"\n [disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open() ? 'true' : 'false'\"\n (click)=\"toggle()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n>\n @if (value()) {\n @if (currentPreset()) {\n <sui-color-dot [color]=\"currentPreset()!\" state=\"selected\" class=\"sui-color-picker__preview\" />\n } @else {\n <sui-color-dot [customHex]=\"previewColor()\" state=\"selected\" class=\"sui-color-picker__preview\" />\n }\n } @else {\n <span class=\"sui-color-picker__placeholder-dot\" aria-hidden=\"true\"></span>\n }\n <span class=\"sui-color-picker__label\">{{ currentLabel() }}</span>\n <sui-icon name=\"arrow-down-s-line\" [size]=\"16\" class=\"sui-color-picker__chevron\" />\n</button>\n\n@if (open()) {\n <div\n class=\"sui-color-picker__panel\"\n role=\"dialog\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n @if (!presetsOnly()) {\n <!-- Sección \"Colors\" — Figma 4456:115716 -->\n <div class=\"sui-color-picker__section sui-color-picker__section--colors\">\n <!-- HSV Color Spectrum — Figma 4456:115425 -->\n <div\n #canvas\n class=\"sui-color-picker__canvas\"\n role=\"application\"\n aria-label=\"Saturación y brillo\"\n [style.--hue-color]=\"hueColor()\"\n (pointerdown)=\"onCanvasPointerDown($event)\"\n (pointermove)=\"onCanvasPointerMove($event)\"\n (pointerup)=\"onCanvasPointerUp($event)\"\n (pointercancel)=\"onCanvasPointerUp($event)\"\n >\n <div\n class=\"sui-color-picker__canvas-thumb\"\n [style.left]=\"canvasThumbX()\"\n [style.top]=\"canvasThumbY()\"\n [style.background-color]=\"currentHex()\"\n ></div>\n </div>\n\n <!-- Hue slider — Figma 4415:53669 -->\n <div\n #hueSlider\n class=\"sui-color-picker__slider sui-color-picker__hue\"\n role=\"slider\"\n aria-label=\"Matiz\"\n aria-valuemin=\"0\"\n aria-valuemax=\"360\"\n [attr.aria-valuenow]=\"hueRounded()\"\n (pointerdown)=\"onHuePointerDown($event)\"\n (pointermove)=\"onHuePointerMove($event)\"\n (pointerup)=\"onHuePointerUp($event)\"\n (pointercancel)=\"onHuePointerUp($event)\"\n >\n <div class=\"sui-color-picker__slider-track\"></div>\n <div\n class=\"sui-color-picker__slider-thumb\"\n [style.left]=\"hueThumbX()\"\n [style.background-color]=\"hueColor()\"\n ></div>\n </div>\n\n <!-- Opacity slider — Figma 4415:53670. Visible por default (alpha on);\n ocultable con [alpha]=false. -->\n @if (alpha()) {\n <div\n #opacitySlider\n class=\"sui-color-picker__slider sui-color-picker__opacity\"\n role=\"slider\"\n aria-label=\"Opacidad\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"alphaPercent()\"\n [style.--opacity-color]=\"opacityColor()\"\n (pointerdown)=\"onOpacityPointerDown($event)\"\n (pointermove)=\"onOpacityPointerMove($event)\"\n (pointerup)=\"onOpacityPointerUp($event)\"\n (pointercancel)=\"onOpacityPointerUp($event)\"\n >\n <div class=\"sui-color-picker__slider-track\"></div>\n <div\n class=\"sui-color-picker__slider-thumb\"\n [style.left]=\"opacityThumbX()\"\n [style.--thumb-color]=\"opacityThumbColor()\"\n ></div>\n </div>\n }\n\n <!-- Color Input — Figma 4456:115720 -->\n <div class=\"sui-color-picker__color-input\">\n <!-- Format label \"Hex\" + chevron — Figma 4456:115721.\n Hex-only por ahora (ver PENDING VERIFY en el .ts). -->\n @if (showFormatLabel()) {\n <div class=\"sui-color-picker__format\" aria-hidden=\"true\">\n <span class=\"sui-color-picker__format-label\">Hex</span>\n <sui-icon name=\"arrow-down-s-line\" [size]=\"20\" class=\"sui-color-picker__format-chevron\" />\n </div>\n }\n\n <!-- Input row — Figma 4456:115724: sip | hex | opacity -->\n <div class=\"sui-color-picker__input-row\">\n <!-- Sip (eyedropper) — Figma 4456:115796. Solo con EyeDropper API. -->\n @if (showEyedropper()) {\n <button\n type=\"button\"\n class=\"sui-color-picker__sip\"\n aria-label=\"Cuentagotas\"\n (click)=\"onEyedropper()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"sip-line\" [size]=\"20\" />\n </button>\n }\n\n <!-- Hex field — Figma 4456:115725 / 4456:115726: el texto va SIN\n prefijo '#' (Figma muestra \"335CFF\" pelado dentro de la celda). -->\n <div class=\"sui-color-picker__hex-cell\">\n <input\n class=\"sui-color-picker__hex-field\"\n type=\"text\"\n inputmode=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n maxlength=\"8\"\n aria-label=\"Valor hexadecimal\"\n [value]=\"hexDisplayValue()\"\n (input)=\"onHexInputChange($event)\"\n (keydown)=\"onHexKeyDown($event)\"\n (blur)=\"onHexCommit()\"\n />\n </div>\n\n <!-- Opacity field \"%\" — Figma 4456:115727. Visible por default\n (alpha on); ocultable con [alpha]=false. -->\n @if (alpha()) {\n <div class=\"sui-color-picker__opacity-cell\">\n <input\n class=\"sui-color-picker__opacity-field\"\n type=\"text\"\n inputmode=\"numeric\"\n autocomplete=\"off\"\n maxlength=\"3\"\n aria-label=\"Opacidad\"\n [value]=\"alphaPercent()\"\n (change)=\"onOpacityFieldCommit($event)\"\n (keydown)=\"onHexKeyDown($event)\"\n />\n <span class=\"sui-color-picker__opacity-suffix\" aria-hidden=\"true\">%</span>\n </div>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Sección \"Recommended Colors\" — Figma 4456:115765 -->\n <div class=\"sui-color-picker__section sui-color-picker__section--recommended\">\n <p class=\"sui-color-picker__panel-label\">{{ recommendedLabel() }}</p>\n <div class=\"sui-color-picker__grid\" role=\"radiogroup\">\n @for (c of colors(); track c) {\n <sui-color-dot\n [color]=\"c\"\n [state]=\"currentPreset() === c ? 'selected' : 'default'\"\n (clicked)=\"onPresetClick(c)\"\n />\n }\n </div>\n </div>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * SUI Kbd — SUI Design System 2.0\n *\n * Shortcut chip / keyboard-key pill. Utility primitive reusable fuera del\n * command menu (también útil en tooltips, menu items, help overlays).\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Pulled from:\n * - 4172:16051 (Footer shortcut con icono, bg=weak-50, padding 2px all sides)\n * - 4171:15855 (Search input shortcut con texto, bg=white, padding 6/2)\n * - 4172:16936 (Item shortcut, similar al search)\n *\n * EXACT specs:\n * Container:\n * border: 1px solid var(--stroke/soft-200) #ebebeb\n * radius: var(--radius-4) 4px\n * bg:\n * default → var(--bg/white-0) #ffffff (texto sobre superficies tintadas)\n * subtle → var(--bg/weak-50) #f7f7f7 (icono sobre superficies blancas)\n * Text content:\n * font: 12/16 Inter Medium 500\n * color: var(--text/soft-400) #a3a3a3\n * letter-spacing: 0.48px (4% × 12px → 0.04em)\n * text-transform: uppercase\n * padding: 2px 6px\n * Icon content (16×16):\n * padding: 2px (all sides)\n * color: inherit (consumer del sui-icon decide)\n *\n * Auto-detección: si el contenido proyectado contiene `<sui-icon>` se asume\n * variant `subtle` por default; consumer puede override con `[variant]=\"default\"`.\n *\n * Uso:\n * <sui-kbd>⌘K</sui-kbd> <!-- text default -->\n * <sui-kbd variant=\"subtle\">\n * <sui-icon name=\"arrow-up-line\" [size]=\"16\" />\n * </sui-kbd>\n */\n\nexport type SuiKbdVariant = 'default' | 'subtle';\n\n@Component({\n selector: 'sui-kbd',\n standalone: true,\n templateUrl: './sui-kbd.html',\n styleUrl: './sui-kbd.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-variant]': 'variant()',\n },\n})\nexport class SuiKbd {\n readonly variant = input<SuiKbdVariant>('default');\n}\n","<ng-content />\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiKbd } from '../sui-kbd/sui-kbd';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\n\n/**\n * SUI Command Menu Footer — SUI 2.0 (Figma 4172:16590)\n *\n * Footer del command menu (⌘K palette). 3 grupos:\n * 1. Navigate: kbd ↑ + kbd ↓ + text \"Navigate\"\n * 2. Select: kbd ↵ + text \"Select\"\n * 3. Help text + link button \"Help Center\" (push right via flex-1 + justify-end)\n *\n * Container: bg=white, border-top stroke-soft-200, padding 14px 20px, gap=12,\n * items-center, w=600px.\n *\n * EXACT:\n * Text labels (Navigate/Select/help): Paragraph/X Small 12/16 text-sub-600\n * Link button: Label/X Small Medium 12/16 primary-base (sin underline default)\n * Kbds: variant subtle, contienen iconos 16×16\n *\n * API:\n * - navigateLabel: string ('Navigate' por default)\n * - selectLabel: string ('Select')\n * - helpText: string | null ('Not what you're looking for? Try the')\n * - helpLinkLabel: string ('Help Center')\n * - helpHref: string | null (si null, renderiza button)\n * - (helpClicked): output cuando el link se clickea\n */\n@Component({\n selector: 'sui-command-menu-footer',\n standalone: true,\n templateUrl: './sui-command-menu-footer.html',\n styleUrl: './sui-command-menu-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiKbd, SuiLinkButton],\n})\nexport class SuiCommandMenuFooter {\n readonly navigateLabel = input<string>('Navigate');\n readonly selectLabel = input<string>('Select');\n readonly helpText = input<string | null>(\"Not what you're looking for? Try the\");\n readonly helpLinkLabel = input<string>('Help Center');\n readonly helpHref = input<string | null>(null);\n\n readonly helpClicked = output<MouseEvent>();\n}\n","<div class=\"sui-cmd-footer__group\">\n <sui-kbd variant=\"subtle\">\n <sui-icon name=\"arrow-up-line\" [size]=\"16\" />\n </sui-kbd>\n <sui-kbd variant=\"subtle\">\n <sui-icon name=\"arrow-down-line\" [size]=\"16\" />\n </sui-kbd>\n <span class=\"sui-cmd-footer__label\">{{ navigateLabel() }}</span>\n</div>\n\n<div class=\"sui-cmd-footer__group\">\n <sui-kbd variant=\"subtle\">\n <sui-icon name=\"corner-down-left-line\" [size]=\"16\" />\n </sui-kbd>\n <span class=\"sui-cmd-footer__label\">{{ selectLabel() }}</span>\n</div>\n\n@if (helpText()) {\n <div class=\"sui-cmd-footer__help\">\n <span class=\"sui-cmd-footer__label\">{{ helpText() }}</span>\n <sui-link-button\n variant=\"primary\"\n size=\"small\"\n [href]=\"helpHref()\"\n (clicked)=\"helpClicked.emit($event)\"\n >{{ helpLinkLabel() }}</sui-link-button>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\n/**\n * sui-flag — Wrapper de banderas circulares SUI 2.0.\n *\n * Source: SUI Design System 2.0 — Country Flags (Figma node 2806:2385).\n * Assets: `src/assets/flags/<slug>.svg` (262 banderas a 24×24 viewBox).\n *\n * Las banderas vienen pre-renderizadas como CÍRCULO dentro del viewBox 24×24\n * (path inicial es un circle covering the full viewBox; el contenido externo\n * queda transparente). Por eso NO se aplica border-radius en CSS — la forma\n * circular ya está bakeada en el SVG.\n *\n * Diferencias vs sui-icon / sui-emoji:\n * - sui-icon = SVG monocromo via icon-font (RemixIcon), hereda `currentColor`.\n * - sui-emoji = PNG raster animado multi-color (Fluent UI).\n * - sui-flag = SVG vectorial multi-color, sin animación, circular por diseño.\n *\n * Uso típico: phone input country selector, country picker (perfil), banderas\n * en tablas de envíos internacionales.\n *\n * API:\n * - name: slug kebab-case del país (ej. 'peru', 'united-states', 'sint-maarten').\n * - size: xs (16) | sm (20) | md (24) | lg (32) | xl (48). Default md.\n * - ariaLabel: si se provee, el flag se anuncia como `<img>` con ese label;\n * si no, se considera decorativo (`aria-hidden=\"true\"`).\n *\n * EXACT (pulled from Figma, verified):\n * - viewBox: 24×24 (todas las banderas)\n * - Shape: circle inscrito en el viewBox (path 1 = circle path)\n * - Asset count: 262 países (incluye disputed territories: kosovo, palestine,\n * abkhazia, sahrawi, somaliland, transnistria, taiwan, tibet, etc.)\n *\n * PENDING VERIFY (no pulled from Figma — heredado de convención del DS):\n * - Tamaños xs/sm/md/lg/xl son convención compartida con sui-emoji.\n * SUI no documenta tamaños oficiales para flags, asumir que escala\n * bien en cualquier tamaño (SVG vectorial con viewBox).\n */\n\nconst FLAG_BASE = 'assets/flags';\n\n/**\n * Catálogo canon de banderas disponibles en el DS.\n * Generado a partir de los assets en src/assets/flags/ (262 países).\n *\n * NO editar a mano — si se agrega/quita un SVG, regenerar con basename:\n * for f in src/assets/flags/*.svg; do basename \"$f\" .svg; done\n */\nexport const SUI_FLAG_NAMES = [\n 'abkhazia',\n 'afghanistan',\n 'aland-islands',\n 'albania',\n 'algeria',\n 'american-samoa',\n 'andorra',\n 'angola',\n 'anguilla',\n 'antigua-and-barbuda',\n 'argentina',\n 'armenia',\n 'aruba',\n 'australia',\n 'austria',\n 'azerbaijan',\n 'azores-islands',\n 'bahamas',\n 'bahrain',\n 'balearic-islands',\n 'bangladesh',\n 'barbados',\n 'basque-country',\n 'belarus',\n 'belgium',\n 'belize',\n 'benin',\n 'bermuda',\n 'bhutan',\n 'bolivia',\n 'bonaire',\n 'bosnia-and-herzegovina',\n 'botswana',\n 'brazil',\n 'british-columbia',\n 'british-indian-ocean-territory',\n 'british-virgin-islands',\n 'brunei',\n 'bulgaria',\n 'burkina-faso',\n 'burundi',\n 'cambodia',\n 'cameroon',\n 'canada',\n 'canary-islands',\n 'cape-verde',\n 'cayman-islands',\n 'central-african-republic',\n 'ceuta',\n 'chad',\n 'chile',\n 'china',\n 'christmas-island',\n 'cocos-island',\n 'colombia',\n 'comoros',\n 'cook-islands',\n 'corsica',\n 'costa-rica',\n 'croatia',\n 'cuba',\n 'curacao',\n 'cyprus',\n 'czech-republic',\n 'democratic-republic-of-congo',\n 'denmark',\n 'djibouti',\n 'dominica',\n 'dominican-republic',\n 'east-timor',\n 'ecuador',\n 'egypt',\n 'el-salvador',\n 'england',\n 'equatorial-guinea',\n 'eritrea',\n 'estonia',\n 'ethiopia',\n 'european-union',\n 'falkland-islands',\n 'faroe-islands',\n 'fiji',\n 'finland',\n 'france',\n 'french-polynesia',\n 'gabon',\n 'galapagos-islands',\n 'gambia',\n 'georgia',\n 'germany',\n 'ghana',\n 'gibraltar',\n 'greece',\n 'greenland',\n 'grenada',\n 'guam',\n 'guatemala',\n 'guernsey',\n 'guinea-bissau',\n 'guinea',\n 'guyana',\n 'haiti',\n 'hawaii',\n 'honduras',\n 'hong-kong',\n 'hungary',\n 'iceland',\n 'india',\n 'indonesia',\n 'iran',\n 'iraq',\n 'ireland',\n 'isle-of-man',\n 'israel',\n 'italy',\n 'ivory-coast',\n 'jamaica',\n 'japan',\n 'jersey',\n 'jordan',\n 'kazakhstan',\n 'kenya',\n 'kiribati',\n 'kosovo',\n 'kuwait',\n 'kyrgyzstan',\n 'laos',\n 'latvia',\n 'lebanon',\n 'lesotho',\n 'liberia',\n 'libya',\n 'liechtenstein',\n 'lithuania',\n 'luxembourg',\n 'macao',\n 'madagascar',\n 'madeira',\n 'malawi',\n 'malaysia',\n 'maldives',\n 'mali',\n 'malta',\n 'marshall-island',\n 'martinique',\n 'mauritania',\n 'mauritus',\n 'melilla',\n 'mexico',\n 'micronesia',\n 'moldova',\n 'monaco',\n 'mongolia',\n 'montenegro',\n 'montserrat',\n 'morocco',\n 'mozambique',\n 'myanmar',\n 'namibia',\n 'nato',\n 'nauru',\n 'nepal',\n 'netherlands',\n 'new-zealand',\n 'nicaragua',\n 'niger',\n 'nigeria',\n 'niue',\n 'norfolk-island',\n 'north-korea',\n 'northern-cyprus',\n 'northern-marianas-islands',\n 'norway',\n 'oman',\n 'orkney-islands',\n 'ossetia',\n 'pakistan',\n 'palau',\n 'palestine',\n 'panama',\n 'papua-new-guinea',\n 'paraguay',\n 'peru',\n 'philippines',\n 'pitcairn-islands',\n 'poland',\n 'portugal',\n 'puerto-rico',\n 'qatar',\n 'rapa-nui',\n 'republic-of-macedonia',\n 'republic-of-the-congo',\n 'romania',\n 'russia',\n 'rwanda',\n 'saba-island',\n 'sahrawi-arab-democratic-republic',\n 'saint-kitts-and-nevis',\n 'samoa',\n 'san-marino',\n 'sao-tome-and-prince',\n 'sardinia',\n 'saudi-arabia',\n 'scotland',\n 'senegal',\n 'serbia',\n 'seychelles',\n 'sierra-leone',\n 'singapore',\n 'sint-eustatius',\n 'sint-maarten',\n 'slovakia',\n 'slovania',\n 'solomon-islands',\n 'somalia',\n 'somaliland',\n 'south-africa',\n 'south-korea',\n 'south-sudan',\n 'spain',\n 'sri-lanka',\n 'st-barts',\n 'st-lucia',\n 'st-vincent-and-the-grenadines',\n 'sudan',\n 'suriname',\n 'swaziland',\n 'sweden',\n 'switzerland',\n 'syria',\n 'taijikistan',\n 'taiwan',\n 'tanzania',\n 'thailand',\n 'tibet',\n 'togo',\n 'tokelau',\n 'tonga',\n 'transnistria',\n 'trinidad-and-tobago',\n 'tunisia',\n 'turkey',\n 'turkmenistan',\n 'turks-and-caicos',\n 'tuvalu',\n 'uganda',\n 'ukraine',\n 'united-arab-emirates',\n 'united-kingdom',\n 'united-nations',\n 'united-states',\n 'uruguay',\n 'uzbekistan',\n 'vanuatu',\n 'vatican-city',\n 'venezuela',\n 'vietnam',\n 'virgin-islands',\n 'wales',\n 'yemen',\n 'zambia',\n 'zimbabwe',\n] as const;\n\nexport type SuiFlagName = (typeof SUI_FLAG_NAMES)[number];\nexport type SuiFlagSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'full';\n\n@Component({\n selector: 'sui-flag',\n standalone: true,\n templateUrl: './sui-flag.html',\n styleUrl: './sui-flag.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-size]': 'size()',\n '[attr.aria-hidden]': 'ariaLabel() ? null : \"true\"',\n '[attr.role]': 'ariaLabel() ? \"img\" : null',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class SuiFlag {\n /** Slug del país (ver SUI_FLAG_NAMES). Ej: 'peru', 'united-states'. */\n readonly name = input.required<SuiFlagName>();\n\n /** Tamaño del flag. Default md (24px) — matchea el viewBox nativo del SVG. */\n readonly size = input<SuiFlagSize>('md');\n\n /**\n * Aria-label opcional. Si se provee, el flag se anuncia como `<img>` con ese label.\n * Si no se provee, se considera decorativo (`aria-hidden=\"true\"`).\n */\n readonly ariaLabel = input<string | null>(null);\n\n /** URL absoluta al SVG. */\n readonly src = computed(() => `${FLAG_BASE}/${this.name()}.svg`);\n}\n","<img class=\"sui-flag__img\" [src]=\"src()\" [alt]=\"ariaLabel() ?? ''\" loading=\"lazy\" decoding=\"async\" />\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiBadge } from '../sui-badge/sui-badge';\nimport { SuiKbd } from '../sui-kbd/sui-kbd';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\nimport { SuiAvatar, type SuiAvatarColor } from '../sui-avatar/sui-avatar';\nimport { SuiFlag, type SuiFlagName } from '../sui-flag/sui-flag';\n\n/**\n * SUI Command Menu Item — SUI 2.0 (Figma 4171:15653)\n *\n * Item del list dentro del command menu (⌘K palette). 6 types × 2 sizes ×\n * Default/Hover state.\n *\n * **Types** (define el visual del leading element):\n * - basic → solo title (sin leading)\n * - left-icon → icon container (en medium: con border + shadow)\n * - avatar → sui-avatar (initials/img)\n * - brand → slot proyectado (consumer trae su brand logo SVG/img)\n * - company → sui-avatar variante company (purple bg + slot logo)\n * - country → sui-flag\n *\n * **Sizes**:\n * - small (48 hint / h=40 real) → single line (title + opt sublabel inline)\n * - medium (64) → multi-line (title row + description)\n *\n * **Optional bits** (right-aligned, en este orden):\n * - badge: sui-badge (gray pill, ej. \"Pro\")\n * - shortcut: sui-kbd con texto (ej. \"⌘K\")\n * - button: chevron arrow-right (Default) / lifted compact-button (Hover)\n *\n * Container (Figma 4171:15651 / 4172:16939):\n * bg=white (Default) / weak-50 (Hover) — manejado por :hover CSS\n * border-radius: radius-10 (10px) en TODOS los items\n * padding: 10px 12px (small) | 12px (medium)\n * gap: 12px\n * cursor: pointer\n *\n * Leading \"lifted box\" (medium): left-icon / brand / country / company envuelven\n * su contenido en un container blanco 40×40 con border 1px stroke-soft-200 +\n * regular-shadow/x-small + rounded-full (p-8, content 24). Small renderiza\n * directo sin box (company small = avatar 20px). Figma 4176:17588 / 4176:17361.\n *\n * EXACT typography (canon SUI — usa font-stack del proyecto, Satoshi):\n * title (medium): Label/Small 14/20 Medium (500) -0.006em strong-950\n * title (small): Paragraph/Small 14/20 Regular (400) -0.006em strong-950\n * sublabel: Paragraph/X Small 12/16 Regular sub-600 (inline en small)\n * description: Paragraph/X Small 12/16 Regular sub-600 (block en medium)\n *\n * Button \"lifted\" (hover): el compact-button toma bg-white + shadow-x-small\n * cuando el item está en hover (Figma 4187:30512). En default es ghost plano.\n *\n * PENDING VERIFY:\n * - Figma no muestra estado disabled en los 4 nodos auditados; no hay prop.\n * - Brand: el consumer proyecta el SVG (slot=brand). En medium el box espera\n * contenido ~24px; el consumer controla su tamaño.\n *\n * Uso:\n * <sui-command-menu-item type=\"left-icon\" size=\"medium\"\n * icon=\"user-line\"\n * title=\"Configuración de cuenta\"\n * description=\"Edita tu nombre, email, contraseña.\"\n * shortcut=\"⌘K\"\n * [showButton]=\"true\" />\n */\n\nexport type SuiCommandMenuItemType = 'basic' | 'left-icon' | 'avatar' | 'brand' | 'company' | 'country';\nexport type SuiCommandMenuItemSize = 'small' | 'medium';\n\n@Component({\n selector: 'sui-command-menu-item',\n standalone: true,\n templateUrl: './sui-command-menu-item.html',\n styleUrl: './sui-command-menu-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiBadge, SuiKbd, SuiCompactButton, SuiAvatar, SuiFlag],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-size]': 'size()',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': '0',\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiCommandMenuItem {\n readonly type = input<SuiCommandMenuItemType>('basic');\n readonly size = input<SuiCommandMenuItemSize>('small');\n\n readonly title = input.required<string>();\n /** Inline secondary text (gris al lado del title). Soportado en ambos sizes. */\n readonly sublabel = input<string | null>(null);\n /** Description block. Solo se renderiza en size=medium. */\n readonly description = input<string | null>(null);\n\n /** Type=left-icon: nombre RemixIcon para el leading. */\n readonly icon = input<string | null>(null);\n\n /** Type=avatar/company: src de la imagen (opcional, sino fallback initials). */\n readonly avatarSrc = input<string | null>(null);\n readonly avatarInitials = input<string>('');\n readonly avatarColor = input<SuiAvatarColor>('slate');\n\n /** Type=country: slug del país. */\n readonly flagName = input<SuiFlagName | null>(null);\n\n /** Right side: badge text (sui-badge gray). */\n readonly badge = input<string | null>(null);\n /** Right side: shortcut text (sui-kbd, ej. \"⌘K\"). */\n readonly shortcut = input<string | null>(null);\n /** Right side: chevron button (arrow-right). */\n readonly showButton = input<boolean>(false);\n\n readonly clicked = output<MouseEvent>();\n readonly buttonClicked = output<MouseEvent>();\n\n /** Tamaño del avatar/icon container según el size del item. */\n readonly leadingSize = computed(() => this.size() === 'medium' ? 40 : 20);\n\n /** Para sui-avatar, traduce a SuiAvatarSize. */\n readonly avatarSize = computed(() => this.size() === 'medium' ? 'lg' : 'xs');\n\n onClick(event: MouseEvent): void {\n this.clicked.emit(event);\n }\n\n onButtonClick(event: MouseEvent): void {\n event.stopPropagation();\n this.buttonClicked.emit(event);\n }\n}\n","<!-- Leading element según type. -->\n@switch (type()) {\n @case ('left-icon') {\n @if (size() === 'medium') {\n <!-- En medium: leading icon dentro de container blanco con border + shadow (look \"lifted\"). -->\n <span class=\"sui-cmd-item__leading sui-cmd-item__leading--icon-box\">\n @if (icon()) {\n <sui-icon [name]=\"icon()!\" [size]=\"20\" />\n }\n </span>\n } @else {\n <!-- En small: solo el icon, sin container. -->\n <sui-icon class=\"sui-cmd-item__leading sui-cmd-item__leading--icon\" [name]=\"icon() ?? 'apps-line'\" [size]=\"20\" />\n }\n }\n @case ('avatar') {\n <sui-avatar\n class=\"sui-cmd-item__leading\"\n [size]=\"avatarSize()\"\n [src]=\"avatarSrc()\"\n [initials]=\"avatarInitials()\"\n [color]=\"avatarColor()\"\n />\n }\n @case ('brand') {\n <!-- Brand: consumer proyecta el SVG/img de marca. -->\n <span class=\"sui-cmd-item__leading sui-cmd-item__leading--brand\">\n <ng-content select=\"[slot=brand]\" />\n </span>\n }\n @case ('company') {\n @if (size() === 'medium') {\n <!-- Medium: logo 24px (sm) dentro de container blanco 40px con border + shadow + rounded-full\n (p-8, content 24 — idéntico a country medium). Figma 4176:17588. -->\n <span class=\"sui-cmd-item__leading sui-cmd-item__leading--company-box\">\n <sui-avatar\n size=\"sm\"\n [initials]=\"avatarInitials()\"\n [color]=\"avatarColor()\"\n [src]=\"avatarSrc()\"\n />\n </span>\n } @else {\n <!-- Small: logo 20px (xs) directo, sin container. Figma 4176:17361. -->\n <sui-avatar\n class=\"sui-cmd-item__leading\"\n size=\"xs\"\n [initials]=\"avatarInitials()\"\n [color]=\"avatarColor()\"\n [src]=\"avatarSrc()\"\n />\n }\n }\n @case ('country') {\n @if (flagName()) {\n @if (size() === 'medium') {\n <!-- Medium: bandera 24px (md) dentro de container blanco 40px con border + shadow + rounded-full. -->\n <span class=\"sui-cmd-item__leading sui-cmd-item__leading--country\">\n <sui-flag [name]=\"flagName()!\" size=\"md\" />\n </span>\n } @else {\n <!-- Small: bandera 16px (xs) directa, sin container. -->\n <sui-flag class=\"sui-cmd-item__leading\" [name]=\"flagName()!\" size=\"xs\" />\n }\n }\n }\n}\n\n<!-- Text block: title (+ inline sublabel) + opt description. -->\n<div class=\"sui-cmd-item__text\">\n <div class=\"sui-cmd-item__title-row\">\n <span class=\"sui-cmd-item__title\">{{ title() }}</span>\n @if (sublabel()) {\n <span class=\"sui-cmd-item__sublabel\">{{ sublabel() }}</span>\n }\n </div>\n @if (size() === 'medium' && description()) {\n <span class=\"sui-cmd-item__description\">{{ description() }}</span>\n }\n</div>\n\n<!-- Right-aligned optionals: badge / shortcut / button. -->\n@if (badge()) {\n <sui-badge class=\"sui-cmd-item__badge\" color=\"gray\" variant=\"lighter\" size=\"small\">\n {{ badge() }}\n </sui-badge>\n}\n@if (shortcut()) {\n <sui-kbd class=\"sui-cmd-item__shortcut\">{{ shortcut() }}</sui-kbd>\n}\n@if (showButton()) {\n <sui-compact-button\n class=\"sui-cmd-item__button\"\n icon=\"arrow-right-s-line\"\n variantStyle=\"ghost\"\n size=\"medium\"\n ariaLabel=\"Abrir\"\n (clicked)=\"onButtonClick($event)\"\n />\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output, signal, viewChild, ElementRef } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiKbd } from '../sui-kbd/sui-kbd';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\n/**\n * SUI Command Menu Search — SUI 2.0 (Figma 4187:559)\n *\n * Top input del command menu (⌘K palette). 3 estados visuales:\n * - Default (empty + no focus) → placeholder soft-400, ⌘K + info icon\n * - Hover (empty + hover) → placeholder sub-600\n * - Active (typing / has value) → placeholder strong-950, close button\n *\n * Container: bg=white, border-bottom 1px stroke-soft-200, padding 14px 20px,\n * gap 8px, w=600px (consumer puede override).\n *\n * El estado se infiere automáticamente de `value()`:\n * - value === '' → Default (con :hover CSS para Hover)\n * - value !== '' → Active (search icon → primary-base, muestra close button)\n *\n * Hover requiere consumir CSS (no se puede en logic).\n *\n * EXACT (Figma 4172:15911 / 4187:560 / 4212:3573):\n * icon search-2-line: 20×20 (soft-400 default/hover; primary-base en active)\n * text: Paragraph/Small 14/20 -0.006em (placeholder soft-400→sub-600→strong-950)\n * shortcut chip: sui-kbd default text 12/16 uppercase — VISIBLE en los 3 estados\n * info icon: info-custom-fill 20×20 (state default/hover) — SVG custom DS Figma 125:279\n * close button: sui-compact-button con close-line 18×18 (state active)\n * container: bg-white, border-bottom 1px stroke-soft-200, padding 14/20, gap 8\n *\n * NOTAS:\n * - icono 'info-custom-fill' (Figma 125:279): SVG custom del DS ya registrado\n * en sui-icon (SUI_CUSTOM_ICONS). Usado directo en el template (no fallback).\n * - primary-base es naranja (#fa7319) en este proyecto, no el azul SUI\n * (#335cff). El search icon en active sale naranja por override de marca.\n */\n@Component({\n selector: 'sui-command-menu-search',\n standalone: true,\n templateUrl: './sui-command-menu-search.html',\n styleUrl: './sui-command-menu-search.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiKbd, SuiCompactButton],\n host: {\n '[attr.data-sui-active]': 'isActive() ? \"\" : null',\n },\n})\nexport class SuiCommandMenuSearch {\n readonly value = input<string>('');\n readonly placeholder = input<string>('Search or jump to');\n /** Mostrar el chip ⌘K cuando el input está vacío. */\n readonly shortcut = input<boolean>(true);\n /** Mostrar el botón derecho (info en default, close en active). */\n readonly button = input<boolean>(true);\n\n readonly valueChange = output<string>();\n readonly cleared = output<void>();\n\n /** True cuando hay texto → muestra close button, oculta ⌘K. */\n readonly isActive = computed(() => !!this.value());\n\n /** Ref al <input> nativo para clear focus. */\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\n\n onInput(event: Event): void {\n this.valueChange.emit((event.target as HTMLInputElement).value);\n }\n\n onClear(): void {\n this.valueChange.emit('');\n this.cleared.emit();\n this.inputRef()?.nativeElement.focus();\n }\n}\n","<sui-icon name=\"search-2-line\" [size]=\"20\" class=\"sui-cmd-search__icon\" />\n\n<input\n #inputRef\n type=\"text\"\n class=\"sui-cmd-search__input\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n (input)=\"onInput($event)\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n/>\n\n<!-- ⌘K chip: visible en los 3 estados (Default/Hover/Active) — Figma 4212:3573. -->\n@if (shortcut()) {\n <sui-kbd class=\"sui-cmd-search__kbd\">⌘K</sui-kbd>\n}\n\n@if (button()) {\n @if (!isActive()) {\n <!-- Default/Hover: ícono info custom del DS SUI (Figma node 125:279).\n 'info-custom-fill' es el SVG con \"i\" serif, ya registrado en sui-icon. -->\n <sui-icon name=\"info-custom-fill\" [size]=\"20\" class=\"sui-cmd-search__info\" />\n } @else {\n <!-- Active: close button (compact-button ghost). -->\n <sui-compact-button\n icon=\"close-line\"\n variantStyle=\"ghost\"\n size=\"medium\"\n ariaLabel=\"Limpiar búsqueda\"\n (clicked)=\"onClear()\"\n />\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\nimport type { SuiAvatarGroupItem } from '../sui-avatar-group/sui-avatar-group';\n\n/**\n * SUI Compact Avatar Group — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 2906:14962 (\"Compact Avatar Group [1.1]\")\n *\n * Pill horizontal con avatares stack a la izquierda y un text count \"+N\"\n * inline a la derecha. Pensado para tablas/listas donde la altura de fila\n * es limitada (la pill toma menos espacio vertical que `sui-avatar-group`).\n *\n * EXACT (pulled from Figma 2906:14962):\n * - 3 sizes: 24 / 32 / 40\n * - 2 styles: 'default' (no border) | 'stroke' (border 1px stroke-soft-200)\n * - Container:\n * bg = var(--bg/white-0, white)\n * border-radius = 999px (full)\n * padding = py-2px, pl-2px, pr varía por size\n * shadow = regular-shadow/x-small (0 1px 2px 0 rgba(10,13,20,0.03))\n * Stroke variant añade: border 1px var(--stroke/soft-200, #ebebeb)\n * - Avatars: stack con margin-right -2px (overlap más leve que Avatar Group)\n * - Per-size padding-right + gap text:\n * 24 → pr=8, gap=6\n * 32 → pr=10, gap=8\n * 40 → pr=12, gap=10\n *\n * PENDING VERIFY (inferred):\n * - Typography del count: el proyecto usa Satoshi, canon Figma usa Inter\n * Regular (no Medium). Por decisión del user, NO se cambia tipografía;\n * font-size se fija al matchea Paragraph del DS (12/14/16) pero la\n * familia queda en Satoshi global.\n * - max default = 3 (no extraído — convención del DS).\n *\n * Uso:\n * <sui-compact-avatar-group\n * size=\"32\"\n * appearance=\"stroke\"\n * [items]=\"[{src:'a.jpg'},{src:'b.jpg'},{initials:'JD',color:'blue'}]\"\n * count=\"+4\"\n * />\n */\n\nexport type SuiCompactAvatarGroupSize = '24' | '32' | '40';\nexport type SuiCompactAvatarGroupAppearance = 'default' | 'stroke';\n\n@Component({\n selector: 'sui-compact-avatar-group',\n standalone: true,\n templateUrl: './sui-compact-avatar-group.html',\n styleUrl: './sui-compact-avatar-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiAvatar],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-appearance]': 'appearance()',\n },\n})\nexport class SuiCompactAvatarGroup {\n readonly size = input<SuiCompactAvatarGroupSize>('32');\n /**\n * Variante visual del pill. Se llama `appearance` para no colisionar con el\n * atributo HTML nativo `style=\"...\"` (que el linter trata de parsear como CSS).\n */\n readonly appearance = input<SuiCompactAvatarGroupAppearance>('default');\n readonly items = input<readonly SuiAvatarGroupItem[]>([]);\n /** Máximo de avatares visibles antes del count. Default 3. */\n readonly max = input<number>(3);\n /** Texto del count (ej. \"+4\"). Si vacío, se calcula desde `items.length - max`. */\n readonly count = input<string | null>(null);\n\n /** Map del size compacto al SuiAvatarSize equivalente. */\n readonly avatarSize = computed(() => {\n const s = this.size();\n return s === '24' ? 'sm' : s === '32' ? 'md' : 'lg';\n });\n\n readonly visibleItems = computed(() => this.items().slice(0, this.max()));\n\n readonly countLabel = computed(() => {\n const override = this.count();\n if (override) return override;\n const overflow = Math.max(0, this.items().length - this.max());\n return overflow > 0 ? `+${overflow}` : '';\n });\n}\n","<div class=\"sui-compact-avatar-group__avatars\">\n @for (item of visibleItems(); track $index) {\n <sui-avatar\n class=\"sui-compact-avatar-group__item\"\n [size]=\"avatarSize()\"\n [src]=\"item.src ?? null\"\n [initials]=\"item.initials ?? ''\"\n [color]=\"item.color ?? 'slate'\"\n [alt]=\"item.alt ?? ''\"\n />\n }\n</div>\n@if (countLabel()) {\n <span class=\"sui-compact-avatar-group__count\">{{ countLabel() }}</span>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiDropdownItemSize = 'small' | 'large' | 'xlarge';\n// xlarge: project extension (no-Figma), escala el patrón small→large\n// (+20px min-height, +4px gap, +2px radius) un step más hacia arriba.\n\n/**\n * Mode del item:\n * - 'menuitem' (default): role=\"menuitem\", para menus contextuales (account\n * switcher, command palette, kebab menu). Selected NO muestra check icon.\n * - 'option': role=\"option\" + aria-selected, para listbox (sui-select y\n * compact-selects). Selected muestra check icon automático en trailing +\n * bg primary-alpha-10 (decisión UX: highlight fuerte para identificación\n * rápida del item seleccionado en listas largas).\n */\nexport type SuiDropdownItemMode = 'menuitem' | 'option';\n\n/**\n * SUI Dropdown Item — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 379:6629 (\"Dropdown Items [1.1]\") — 60 variants total\n * 6 types × 5 states × 2 sizes\n * - Types (controlado via slot=leading): basic / country / avatar / provider / brand / company\n * - States: default / hover / selected / selected-hover / disabled\n * - Sizes: small (36) / large (56)\n *\n * Item individual usado dentro de un dropdown menu, command palette, country\n * picker, account switcher, etc. Compone otros SUI via slots — el tipo del\n * item viene de QUÉ poné el consumer en [slot=leading]:\n * - sui-icon → basic\n * - sui-flag → country\n * - sui-avatar → avatar\n * - sui-brand-logo → provider/brand/company\n * - sui-checkbox → checkable item (multi-select menu)\n *\n * EXACT (pulled from Figma 379:6626 Basic Default Small + 401:3360 Selected):\n * Container Small (36):\n * bg white-0, p-8, gap-8, radius-8, w-390 (default — el consumer puede override)\n * flex items-center, overflow-clip\n *\n * Container Large (56):\n * bg white-0, p-8, gap-12, radius-8 (Figma 379:6629 Large)\n * El text container es flex-COL: label arriba, description abajo (NO inline).\n * leading icon (solo type=basic) va envuelto en un wrapper circular:\n * border 1px stroke-soft-200, padding-10, radius-full, shadow x-small.\n * → opt-in via [leadingFramed]=true (avatar/flag/brand-logo NO se enmarcan,\n * ya traen su propia forma). El frame solo aplica cuando size=large.\n *\n * Typography:\n * label: Inter Regular 14/20/-0.6%, text-strong-950\n * sublabel: Inter Regular 12/16/0, text-soft-400 (Small: inline tras label, gap-4)\n * description: Inter Regular 12/16/0, text-sub-600 (Large: 2da línea bajo el label)\n *\n * PENDING VERIFY (Figma MCP degradado durante esta pasada — valores tomados del\n * reporte de auditoría reports.json, no re-confirmados nodo a nodo):\n * - Large container padding: reporte dice p-8 + gap-12 (no p-12). Confirmar 379:6629.\n * - Large leading frame: padding-10 / radius-full / shadow x-small / border soft-200.\n * - description color: text-sub-600 (reporte). Confirmar contra el nodo Large.\n * - Type=Button Large: pill (bg primary-alpha-10, p-6, radius-8) — queda a cargo\n * del consumer vía slot=trailing; no built-in (ver newQuestions del reporte).\n *\n * Trailing helpers built-in:\n * shortcut: chip blanco con border stroke-soft-200, px-6 py-2 radius-4,\n * text uppercase tracking 0.48px, text-sub-600 12/16 medium\n * badge: sui-badge color=\"information\" variant=\"lighter\" (slot)\n * rightIcon: 20×20 (típicamente arrow-right-s-line)\n *\n * States:\n * default → bg white-0\n * hover → bg weak-50 (PENDING VERIFY — assumed por convención)\n * selected → checkbox=primary-base con check / toggle=primary\n * selected-hover → bg weak-50 + checked\n * disabled → opacity 0.5, pointer-events none (PENDING VERIFY)\n *\n * Usage:\n * <sui-dropdown-item label=\"Spain\" sublabel=\"(es)\" [selected]=\"true\">\n * <sui-flag slot=\"leading\" name=\"spain\" size=\"sm\" />\n * </sui-dropdown-item>\n *\n * <sui-dropdown-item label=\"John Doe\" sublabel=\"@john\">\n * <sui-avatar slot=\"leading\" size=\"2xs\" [initials]=\"'JD'\" />\n * <sui-badge slot=\"trailing\" color=\"success\" type=\"basic\">Online</sui-badge>\n * </sui-dropdown-item>\n *\n * <sui-dropdown-item label=\"Settings\" shortcut=\"⌘,\">\n * <sui-icon slot=\"leading\" name=\"settings-3-line\" />\n * </sui-dropdown-item>\n *\n * <sui-dropdown-item label=\"Stripe checkout\">\n * <sui-brand-logo slot=\"leading\" company=\"stripe\" variant=\"original\" size=\"sm\" />\n * </sui-dropdown-item>\n */\n@Component({\n selector: 'sui-dropdown-item',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-dropdown-item.html',\n styleUrl: './sui-dropdown-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': 'mode() === \"option\" ? \"option\" : \"menuitem\"',\n '[attr.data-sui-mode]': 'mode()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-framed]': 'leadingFramed() ? \"\" : null',\n '[attr.data-sui-selected]': 'selected() ? \"\" : null',\n '[attr.data-sui-highlighted]':'highlighted() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-selected]': 'mode() === \"option\" ? (selected() ? \"true\" : \"false\") : null',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)',\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiDropdownItem {\n readonly label = input.required<string>();\n readonly sublabel = input<string | null>(null);\n /**\n * Descripción — segunda línea bajo el label, solo visible en size='large'\n * (layout columnar de Figma 379:6629 Large). En size='small' se ignora\n * (el Small usa `sublabel` inline). Texto 12/16 text-sub-600.\n */\n readonly description = input<string | null>(null);\n /** Tamaño Small (36px), Large (56px) o XLarge (76px, extensión project). */\n readonly size = input<SuiDropdownItemSize>('small');\n /**\n * Envuelve el slot=leading en un frame circular (border soft-200, padding-10,\n * radius-full, shadow x-small) — patrón del Figma Large type=basic. Solo\n * surte efecto cuando size='large'/'xlarge'. NO usar con avatar/flag/brand-logo\n * (ya traen su propia forma). Default false.\n */\n readonly leadingFramed = input(false);\n /**\n * Mode ARIA: 'menuitem' (default, para menus) o 'option' (para listbox/select).\n * En 'option' se expone `[aria-selected]` y se renderea el check trailing\n * automático cuando `selected=true`.\n */\n readonly mode = input<SuiDropdownItemMode>('menuitem');\n /** Item seleccionado (highlight + check icon si mode=option). */\n readonly selected = input(false);\n /**\n * Keyboard-highlighted state — distinto al hover (mouse) y al selected (value).\n * Lo usa el sui-select para sincronizar el highlighted index con ArrowDown/Up.\n */\n readonly highlighted = input(false);\n /** Disabled (no clickeable, opacity 0.5). */\n readonly disabled = input(false);\n /** Shortcut text (ej. \"⌘1\", \"⇧K\") — renderiza chip blanco al trailing. */\n readonly shortcut = input<string | null>(null);\n\n readonly clicked = output<Event>();\n\n readonly hasSublabel = computed(() => !!this.sublabel());\n /** Description solo se renderiza en size='large'/'xlarge' (layout columnar). */\n readonly hasDescription = computed(() => {\n const s = this.size();\n return (s === 'large' || s === 'xlarge') && !!this.description();\n });\n /** Mostrar check icon trailing automático cuando es option seleccionada. */\n readonly showCheck = computed(() => this.mode() === 'option' && this.selected());\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<div class=\"sui-dropdown-item__leading\">\n <ng-content select=\"[slot=leading]\" />\n</div>\n\n<div class=\"sui-dropdown-item__text\">\n <span class=\"sui-dropdown-item__label\">{{ label() }}</span>\n @if (hasSublabel()) {\n <span class=\"sui-dropdown-item__sublabel\">{{ sublabel() }}</span>\n }\n @if (hasDescription()) {\n <span class=\"sui-dropdown-item__description\">{{ description() }}</span>\n }\n</div>\n\n<div class=\"sui-dropdown-item__trailing\">\n <!-- Canon trailing-slot (Figma 405:6432): el consumer proyecta en este orden DOM\n fijo → badge primero, luego shortcut (provisto por el input shortcut() abajo),\n luego toggle/button al final. El gap del flex (8px) los separa.\n Pill button (variante Large): bg primary-alpha-10, p-6, radius-8, label primary\n Inter Medium 14/20. Link button (variante Small): texto primary sin bg.\n El componente no fija sublots — el orden lo controla el consumer según este\n patrón para mantener consistencia visual vs Figma. -->\n <ng-content select=\"[slot=trailing]\" />\n @if (shortcut()) {\n <span class=\"sui-dropdown-item__shortcut\">{{ shortcut() }}</span>\n }\n @if (showCheck()) {\n <!-- Check icon automático en mode='option' cuando selected=true.\n Remixicon check-line (ri-check-line) vía sui-icon — mismo glyph que\n el resto del proyecto, color heredado de .sui-dropdown-item__check. -->\n <sui-icon class=\"sui-dropdown-item__check\" name=\"check-line\" [size]=\"20\" />\n }\n</div>\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Structural directive — marca un `<ng-template>` como panel del\n * sui-dropdown-menu. El componente padre captura este TemplateRef\n * via `@ContentChild(SuiDropdownPanel)` y lo monta en el CDK Overlay\n * cuando se abre el menu.\n *\n * Usa el patrón canon Angular (similar a `*matMenuContent` de Material):\n * un directive que se aplica al `<ng-template>` SE convierte en una\n * marca semántica, evitando que Angular renderee el contenido inline\n * cuando no hay `<ng-content>` matching para el template.\n *\n * Uso:\n * <sui-dropdown-menu>\n * <sui-compact-select trigger ... />\n * <ng-template suiDropdownPanel>\n * <sui-dropdown-item ...></sui-dropdown-item>\n * </ng-template>\n * </sui-dropdown-menu>\n */\n@Directive({\n selector: 'ng-template[suiDropdownPanel]',\n standalone: true,\n})\nexport class SuiDropdownPanel {\n readonly template = inject<TemplateRef<unknown>>(TemplateRef);\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n DestroyRef,\n ElementRef,\n ViewChild,\n ViewContainerRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport {\n ConnectedPosition,\n Overlay,\n OverlayConfig,\n OverlayRef,\n} from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { SuiDropdownPanel } from './sui-dropdown-panel';\n\n/**\n * SUI Dropdown Menu — Component wrapper\n *\n * Componente que envuelve un trigger + un panel template y maneja la\n * apertura/cierre del menu vía Angular CDK Overlay. Mismo stack que sui-select\n * (TemplatePortal + FlexibleConnectedPositionStrategy + ResizeObserver + reposition).\n *\n * **Modes de uso**:\n *\n * 1. **Content projection** (default) — proyectar trigger + panel:\n * ```html\n * <sui-dropdown-menu #menu>\n * <button trigger>Open</button>\n * <ng-template suiDropdownPanel>\n * <sui-dropdown-item ... />\n * </ng-template>\n * </sui-dropdown-menu>\n * ```\n *\n * 2. **External origin** — el parent maneja el trigger y solo delega el panel:\n * ```html\n * <sui-dropdown-menu #menu [origin]=\"hostEl\">\n * <ng-template suiDropdownPanel>...</ng-template>\n * </sui-dropdown-menu>\n * ```\n * Útil cuando el \"trigger\" es el host element del parent (caso compact-selects).\n * El parent llama `menu.toggle()` desde su propio click handler.\n *\n * APIs expuestas (via `exportAs: 'suiDropdownMenu'`):\n * - `isOpen()` signal — visual state del trigger\n * - `open()`, `close()`, `toggle()` — control imperativo\n * - `(openedChange)` — eventos open/close\n *\n * Specs internas (matchea sui-select canon):\n * - withFlexibleDimensions(true) + viewportMargin(8)\n * - scrollStrategy: reposition (panel sigue el trigger al scrollear)\n * - hasBackdrop: true con transparent backdrop (outside-click close)\n * - detachments() subscription sincroniza isOpen si el overlay se dispone\n * por disposeOnNavigation o externamente\n * - panelClass: sui-dropdown-menu__overlay-pane (estilos globales en\n * src/styles/_sui-dropdown-menu-overlay.scss)\n *\n * Estilos del panel viven en `src/styles/_sui-dropdown-menu-overlay.scss`\n * (global, porque CDK Overlay monta el panel fuera del shadow del component).\n */\n\nexport type SuiDropdownMenuPosition = 'auto' | 'below' | 'above';\n\n/**\n * Rol del popup que abre el trigger — gobierna el valor de `aria-haspopup`.\n * - 'menu' (default): el panel contiene items con role=\"menuitem\" (caso\n * canon de este wrapper: kebab menu, account switcher, command palette).\n * - 'listbox': el panel contiene items con role=\"option\" (sui-select y\n * compact-selects que reusan este wrapper). El consumer DEBE pasarlo\n * explícitamente en ese caso.\n * - 'true': popup genérico sin semántica de rol conocida.\n * Per ARIA spec, `aria-haspopup` debe matchear el role del popup poseído;\n * 'listbox' solo es válido cuando los hijos son option, no menuitem.\n */\nexport type SuiDropdownMenuPopupRole = 'menu' | 'listbox' | 'true';\n\n/* Posiciones con fallback HORIZONTAL: la primera (start-aligned, abre a la\n derecha) es la default; si el trigger está pegado al borde derecho y no entra,\n CDK cae a la end-aligned (abre hacia la izquierda) y recién después flipea\n vertical. Sin esto, un trigger en la esquina derecha (ej. kebab ⋮ de una card)\n recorta el panel fuera del viewport. */\nconst POSITIONS_BELOW: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n];\nconst POSITIONS_ABOVE: ConnectedPosition[] = [\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n];\n\n@Component({\n selector: 'sui-dropdown-menu',\n standalone: true,\n templateUrl: './sui-dropdown-menu.html',\n styleUrl: './sui-dropdown-menu.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n exportAs: 'suiDropdownMenu',\n})\nexport class SuiDropdownMenu {\n /** Si true, el panel matchea el ancho del trigger. Default: auto width. */\n readonly matchWidth = input<boolean>(false);\n\n /** Min-width fijo del panel (px). Si matchWidth + minWidth: `max(triggerWidth, minWidth)`. */\n readonly minWidth = input<number | null>(null);\n\n /** Position primary. Default: auto = below con fallback above. */\n readonly position = input<SuiDropdownMenuPosition>('auto');\n\n /** Margen 8px del viewport edge (canon SUI). */\n readonly viewportMargin = input<number>(8);\n\n /** Panel custom class para overrides de bg/padding/etc desde el consumer. */\n readonly panelClass = input<string>('');\n\n /** Disabled — no abre el menu al clickear el trigger. */\n readonly disabled = input<boolean>(false);\n\n /**\n * Rol del popup para `aria-haspopup` del trigger. Default 'menu' (los items\n * proyectados llevan role=\"menuitem\"). Los consumers de tipo listbox\n * (sui-select / compact-selects, items con role=\"option\") DEBEN pasar\n * `popupRole=\"listbox\"`. Ver SuiDropdownMenuPopupRole.\n */\n readonly popupRole = input<SuiDropdownMenuPopupRole>('menu');\n\n /**\n * Origin externo. Si presente, el menu se ancla a ese elemento y NO renderea\n * el trigger wrapper interno (el parent maneja el click). Caso de uso:\n * compact-selects donde el host element es el trigger visual.\n */\n readonly origin = input<ElementRef<HTMLElement> | HTMLElement | null>(null);\n\n readonly openedChange = output<boolean>();\n\n /** Signal pública — wire al `[open]` del trigger para visual state. */\n readonly isOpen = signal(false);\n\n /** Wrapper del trigger projection — captura el click. NO existe si `[origin]` se pasa. */\n @ViewChild('triggerWrap', { static: false })\n private readonly _triggerWrap?: ElementRef<HTMLElement>;\n\n /** Panel directive proyectado — capturado via `[suiDropdownPanel]` en un ng-template. */\n @ContentChild(SuiDropdownPanel)\n private readonly _panel?: SuiDropdownPanel;\n\n private _getTriggerEl(): HTMLElement | null {\n const o = this.origin();\n if (o) return o instanceof ElementRef ? o.nativeElement : o;\n return this._triggerWrap?.nativeElement ?? null;\n }\n\n private readonly _vcr = inject(ViewContainerRef);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _overlay = inject(Overlay);\n\n private _overlayRef: OverlayRef | null = null;\n private _overlaySubs: Subscription | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n\n constructor() {\n this._destroyRef.onDestroy(() => this.close());\n }\n\n onTriggerClick(event: MouseEvent): void {\n if (this.disabled()) return;\n event.stopPropagation();\n this.toggle();\n }\n\n onTriggerKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.toggle();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.open();\n }\n }\n\n toggle(): void {\n if (this.isOpen()) this.close();\n else this.open();\n }\n\n open(): void {\n if (this.disabled() || this._overlayRef || !this._panel) return;\n\n const triggerEl = this._getTriggerEl();\n if (!triggerEl) return;\n const positions = this.position() === 'above' ? POSITIONS_ABOVE : POSITIONS_BELOW;\n\n const positionStrategy = this._overlay\n .position()\n .flexibleConnectedTo(triggerEl)\n .withPositions(positions)\n .withPush(false)\n .withFlexibleDimensions(true)\n .withViewportMargin(this.viewportMargin());\n\n const triggerWidth = triggerEl.getBoundingClientRect().width;\n const minW = this.minWidth();\n const effectiveMinWidth = this.matchWidth() && minW !== null\n ? Math.max(triggerWidth, minW)\n : minW;\n\n const config: OverlayConfig = {\n positionStrategy,\n scrollStrategy: this._overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: ['sui-dropdown-menu__overlay-pane', this.panelClass()].filter(Boolean),\n disposeOnNavigation: true,\n };\n\n if (this.matchWidth() && minW === null) {\n config.width = `${triggerWidth}px`;\n }\n if (effectiveMinWidth !== null) {\n config.minWidth = effectiveMinWidth;\n }\n\n this._overlayRef = this._overlay.create(config);\n const portal = new TemplatePortal(this._panel.template, this._vcr);\n this._overlayRef.attach(portal);\n\n /* Width sync mientras el viewport cambia (canon sui-select). Solo aplica\n cuando matchWidth fija width o minWidth — para que el panel siga el trigger. */\n if (this.matchWidth() && typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(() => {\n if (!this._overlayRef) return;\n const w = triggerEl.getBoundingClientRect().width;\n if (minW === null) {\n this._overlayRef.updateSize({ width: `${w}px` });\n } else {\n this._overlayRef.updateSize({ minWidth: Math.max(w, minW) });\n }\n this._overlayRef.updatePosition();\n });\n this._resizeObserver.observe(triggerEl);\n }\n\n this._overlaySubs = new Subscription();\n this._overlaySubs.add(this._overlayRef.backdropClick().subscribe(() => this.close()));\n this._overlaySubs.add(this._overlayRef.keydownEvents().subscribe((e) => {\n if (e.key === 'Escape') this.close();\n }));\n this._overlaySubs.add(this._overlayRef.detachments().subscribe(() => {\n this.isOpen.set(false);\n }));\n\n this.isOpen.set(true);\n this.openedChange.emit(true);\n }\n\n close(): void {\n if (!this._overlayRef) return;\n\n this._overlaySubs?.unsubscribe();\n this._overlaySubs = null;\n this._resizeObserver?.disconnect();\n this._resizeObserver = null;\n this._overlayRef.dispose();\n this._overlayRef = null;\n\n this.isOpen.set(false);\n this.openedChange.emit(false);\n }\n}\n","<!-- Trigger wrapper — captura click y keydown del trigger child. Solo se\n renderea cuando NO se pasa [origin] (modo content-projection canon).\n Cuando se pasa [origin], el parent maneja el trigger y llama\n menu.toggle() desde su propio click handler. -->\n@if (!origin()) {\n <span\n #triggerWrap\n class=\"sui-dropdown-menu__trigger\"\n [attr.aria-haspopup]=\"popupRole()\"\n [attr.aria-expanded]=\"isOpen()\"\n (click)=\"onTriggerClick($event)\"\n (keydown)=\"onTriggerKeydown($event)\"\n >\n <ng-content select=\"[trigger]\" />\n </span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFlag, type SuiFlagName } from '../sui-flag/sui-flag';\nimport { SuiDropdownItem } from '../sui-dropdown-item/sui-dropdown-item';\nimport { SuiDropdownMenu } from '../sui-dropdown-menu/sui-dropdown-menu';\nimport { SuiDropdownPanel } from '../sui-dropdown-menu/sui-dropdown-panel';\n\n/**\n * SUI Compact Select For Input — SUI 2.0 (Figma 307:16883)\n *\n * Variante del compact-select pensada para vivir DENTRO de un sui-input.\n * Delega el overlay menu a `sui-dropdown-menu` internamente.\n *\n * Diferencias vs `sui-compact-select` standalone:\n * - SIN border (el input padre tiene su propio border)\n * - SIN focus ring (el input padre maneja el focus state)\n * - SIN error state (heredado del input padre)\n * - X-Small usa flag 16×16 (vs 24×24 del compact-select normal)\n * - Menu matchea trigger width con minWidth=200\n *\n * `ControlValueAccessor` implementado — funciona con `formControlName`.\n *\n * Uso:\n * <sui-input>\n * <sui-compact-select-for-input\n * slot=\"prefix\"\n * size=\"medium\"\n * [items]=\"countries\"\n * formControlName=\"country\"\n * />\n * </sui-input>\n *\n * **⚠️ NO mezclar `[(selected)]` con `formControlName`/`[formControl]`.**\n * Si el consumer escribe `[(selected)]` desde código, el FormControl NO se entera\n * (split-brain). Usar UNA fuente de verdad: formControl O selected, no las dos.\n */\n\nexport type SuiCompactSelectForInputSize = 'medium' | 'small' | 'xsmall';\n\nexport interface SuiCompactSelectForInputItem<T = string> {\n value: T;\n label: string;\n sublabel?: string;\n flag?: SuiFlagName;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'sui-compact-select-for-input',\n standalone: true,\n templateUrl: './sui-compact-select-for-input.html',\n styleUrl: './sui-compact-select-for-input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiFlag, SuiDropdownItem, SuiDropdownMenu, SuiDropdownPanel],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCompactSelectForInput),\n multi: true,\n },\n ],\n host: {\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-disabled]': 'mergedDisabled() ? \"\" : null',\n '[attr.data-sui-open]': 'isOpen() ? \"\" : null',\n '[attr.data-sui-country]': 'country() ? \"\" : null',\n '[attr.aria-disabled]': 'mergedDisabled() ? \"true\" : null',\n '[attr.aria-expanded]': 'isOpen() ? \"true\" : \"false\"',\n '[attr.aria-haspopup]': 'items().length > 0 ? \"listbox\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'mergedDisabled() ? -1 : 0',\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n '(click)': 'onHostClick($event)',\n '(keydown.enter)': 'onHostClick($event)',\n '(keydown.space)': 'onHostClick($event); $event.preventDefault()',\n },\n})\nexport class SuiCompactSelectForInput<T = string> implements ControlValueAccessor {\n readonly size = input<SuiCompactSelectForInputSize>('medium');\n\n readonly value = input<string>('');\n readonly country = input<boolean>(true);\n readonly flag = input<SuiFlagName | null>(null);\n\n readonly items = input<readonly SuiCompactSelectForInputItem<T>[]>([]);\n readonly selected = model<SuiCompactSelectForInputItem<T> | null>(null);\n\n readonly disabled = input<boolean>(false);\n\n readonly clicked = output<Event>();\n readonly selectedChange = output<SuiCompactSelectForInputItem<T>>();\n\n private readonly _formDisabled = signal(false);\n readonly mergedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n private readonly _menu = viewChild<SuiDropdownMenu>(SuiDropdownMenu);\n readonly isOpen = signal(false);\n\n readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly _pendingValue = signal<T | null>(null);\n\n private _onChange: (v: T | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n effect(() => {\n const pending = this._pendingValue();\n const items = this.items();\n if (pending !== null && items.length > 0) {\n const match = items.find((i) => i.value === pending);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n }\n }\n });\n effect(() => {\n if (this.mergedDisabled() && this.isOpen()) this._menu()?.close();\n });\n }\n\n readonly arrowIcon = computed(() => this.isOpen() ? 'arrow-up-s-line' : 'arrow-down-s-line');\n\n readonly displayValue = computed(() => this.selected()?.label ?? this.value());\n readonly displayFlag = computed(() => this.selected()?.flag ?? this.flag());\n\n readonly flagSizePx = computed(() => this.size() === 'xsmall' ? 16 : 20);\n\n onHostClick(event: Event): void {\n if (this.mergedDisabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.clicked.emit(event);\n if (this.items().length > 0) {\n this._menu()?.toggle();\n }\n }\n\n protected onMenuOpenedChange(open: boolean): void {\n this.isOpen.set(open);\n if (open) this._onTouched();\n }\n\n protected selectItem(item: SuiCompactSelectForInputItem<T>): void {\n if (item.disabled) return;\n this.selected.set(item);\n this._onChange(item.value);\n this._onTouched();\n this.selectedChange.emit(item);\n this._menu()?.close();\n }\n\n /* ── ControlValueAccessor ─────────────────────────────────────────── */\n writeValue(value: T | null): void {\n if (value === null || value === undefined) {\n this.selected.set(null);\n this._pendingValue.set(null);\n return;\n }\n const match = this.items().find((i) => i.value === value);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n } else {\n this._pendingValue.set(value);\n }\n }\n\n registerOnChange(fn: (v: T | null) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this._formDisabled.set(isDisabled); }\n}\n","@if (country() && displayFlag()) {\n <sui-flag\n class=\"sui-compact-select-for-input__flag\"\n [name]=\"displayFlag()!\"\n [size]=\"flagSizePx() === 16 ? 'xs' : 'sm'\"\n />\n}\n\n<div class=\"sui-compact-select-for-input__inner\">\n <span class=\"sui-compact-select-for-input__value\">{{ displayValue() }}</span>\n <sui-icon class=\"sui-compact-select-for-input__arrow\" [name]=\"arrowIcon()\" [size]=\"20\" />\n</div>\n\n@if (items().length > 0) {\n <sui-dropdown-menu\n [origin]=\"hostEl\"\n [disabled]=\"mergedDisabled()\"\n [matchWidth]=\"true\"\n [minWidth]=\"200\"\n panelClass=\"sui-compact-select__overlay-pane\"\n (openedChange)=\"onMenuOpenedChange($event)\"\n >\n <ng-template suiDropdownPanel>\n <div class=\"sui-compact-select-for-input__menu\">\n @for (item of items(); track item.value) {\n <sui-dropdown-item\n mode=\"option\"\n [label]=\"item.label\"\n [sublabel]=\"item.sublabel ?? ''\"\n [selected]=\"item.value === selected()?.value\"\n [disabled]=\"item.disabled ?? false\"\n (click)=\"selectItem(item)\"\n >\n @if (item.flag) {\n <sui-flag slot=\"leading\" [name]=\"item.flag\" size=\"sm\" />\n }\n </sui-dropdown-item>\n }\n </div>\n </ng-template>\n </sui-dropdown-menu>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFlag, type SuiFlagName } from '../sui-flag/sui-flag';\nimport { SuiDropdownItem } from '../sui-dropdown-item/sui-dropdown-item';\nimport { SuiDropdownMenu } from '../sui-dropdown-menu/sui-dropdown-menu';\nimport { SuiDropdownPanel } from '../sui-dropdown-menu/sui-dropdown-panel';\n\n/**\n * SUI Compact Select — SUI 2.0 (Figma 377:5083)\n *\n * Trigger compacto de select-like. 3 types × 3 sizes × 6 states.\n *\n * **Modes de uso**:\n *\n * 1. **Trigger-only** (sin items) — el consumer envuelve manualmente:\n * ```html\n * <sui-compact-select type=\"country\" flag=\"peru\" value=\"+51\" (clicked)=\"...\" />\n * ```\n *\n * 2. **Self-managed con items** (recommended) — el componente delega el overlay\n * a `sui-dropdown-menu` internamente + CVA para formControl:\n * ```html\n * <sui-compact-select\n * type=\"country\"\n * [items]=\"countries\"\n * formControlName=\"country\"\n * />\n * ```\n *\n * `ControlValueAccessor` implementado — drop-in en `[(ngModel)]` y `formControl`.\n *\n * **Arquitectura interna**: el host del componente ES el trigger visual (con su\n * propio click handler), y `sui-dropdown-menu` recibe `[origin]=hostEl` para\n * anclarse al host sin renderear un trigger wrapper duplicado. El menu maneja\n * positioning, backdrop, keyboard nav y close-on-detach.\n *\n * Specs Figma (sin cambios vs versión anterior):\n * Sizes: medium 40 (p=10 r=10) / small 36 (p=8 r=8) / xsmall 32 (p=6 r=8)\n * States: placeholder / filled / hover / focused / disabled / error\n * Types: basic / icon (RemixIcon 20×20) / country (sui-flag 24×24)\n *\n * Eventos:\n * - `(clicked)`: Event — siempre emite cuando el host se clickea (mode 1 + 2)\n * - `(selectedChange)`: SuiCompactSelectItem — solo en mode 2 cuando user\n * selecciona un item\n * - CVA `_onChange(value)` — solo en mode 2 (FormControl integration)\n *\n * **⚠️ NO mezclar `[(selected)]` con `formControlName`/`[formControl]`.**\n * Son dos fuentes de verdad distintas:\n * - `formControl` → CVA → `selected` se sincroniza vía `writeValue`\n * - `[(selected)]` → escribe directo al `model<>` sin pasar por `_onChange`\n * Si el consumer escribe `[(selected)]=\"signal\"` desde código, el FormControl NO\n * se entera del cambio (split-brain). Usar UNA u OTRA, no las dos juntas.\n */\n\nexport type SuiCompactSelectType = 'basic' | 'icon' | 'country';\nexport type SuiCompactSelectSize = 'medium' | 'small' | 'xsmall';\n\n/**\n * Shape del item dentro del menu. El consumer pasa array de estos en `[items]`.\n * Compatible con generics (T = tipo del value que se guarda en formControl).\n */\nexport interface SuiCompactSelectItem<T = string> {\n value: T;\n label: string;\n sublabel?: string;\n icon?: string;\n flag?: SuiFlagName;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'sui-compact-select',\n standalone: true,\n templateUrl: './sui-compact-select.html',\n styleUrl: './sui-compact-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiFlag, SuiDropdownItem, SuiDropdownMenu, SuiDropdownPanel],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCompactSelect),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n /* SOLO data-attrs de styling. La interacción (click/keyboard/role/aria/\n tabindex) vive en el div .sui-compact-select__trigger interno — patrón\n canon sui-select. El host NO cuelga (click)+(touchend→blur) porque el\n blur() síncrono en touchend cancela el click sintético de iOS WebKit y\n el menu no abre. sui-select no sufre esto porque su click vive en un div\n interno sin touch handlers — homologamos a ese patrón. */\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n '[attr.data-sui-disabled]': 'mergedDisabled() ? \"\" : null',\n '[attr.data-sui-open]': 'isOpen() ? \"\" : null',\n },\n})\nexport class SuiCompactSelect<T = string> implements ControlValueAccessor {\n readonly type = input<SuiCompactSelectType>('basic');\n readonly size = input<SuiCompactSelectSize>('medium');\n\n readonly value = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly icon = input<string | null>(null);\n readonly flag = input<SuiFlagName | null>(null);\n\n readonly items = input<readonly SuiCompactSelectItem<T>[]>([]);\n readonly selected = model<SuiCompactSelectItem<T> | null>(null);\n\n readonly error = input<boolean>(false);\n readonly disabled = input<boolean>(false);\n\n readonly clicked = output<Event>();\n readonly selectedChange = output<SuiCompactSelectItem<T>>();\n\n /* ── Internal state ──────────────────────────────────────────────────── */\n /** Disabled state desde FormControl (vía setDisabledState del CVA). */\n private readonly _formDisabled = signal(false);\n /** Disabled combinado: input `[disabled]` OR form-disabled. */\n readonly mergedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n /** Ref al sui-dropdown-menu interno — para invocar toggle/close. */\n private readonly _menu = viewChild<SuiDropdownMenu>(SuiDropdownMenu);\n\n /** Mirror del isOpen del menu interno — expuesto para el visual state del host. */\n readonly isOpen = signal(false);\n\n /** Trigger DIV interno — pasado al sui-dropdown-menu como [origin]. */\n protected readonly triggerEl = viewChild.required<ElementRef<HTMLElement>>('triggerEl');\n\n /** Pending value from writeValue() cuando items() todavía no llegó (FormControl async). */\n private readonly _pendingValue = signal<T | null>(null);\n\n /* ── CVA callbacks ───────────────────────────────────────────────────── */\n private _onChange: (v: T | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n /* Effect — re-resolve pending value cuando items() llega async. */\n effect(() => {\n const pending = this._pendingValue();\n const items = this.items();\n if (pending !== null && items.length > 0) {\n const match = items.find((i) => i.value === pending);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n }\n }\n });\n\n /* Effect — cerrar menu si el componente se deshabilita mientras está open. */\n effect(() => {\n if (this.mergedDisabled() && this.isOpen()) {\n this._menu()?.close();\n }\n });\n }\n\n /** Icon del arrow trailing: down (closed) / up (open). */\n readonly arrowIcon = computed(() => this.isOpen() ? 'arrow-up-s-line' : 'arrow-down-s-line');\n\n /**\n * Tamaño del sui-flag del trigger según size (Figma 377:5083 verificado):\n * medium/small → sm (20px), xsmall → xs (16px).\n * Mismo patrón que flagSizePx de sui-compact-select-for-input.\n */\n readonly flagSize = computed<'xs' | 'sm'>(() => this.size() === 'xsmall' ? 'xs' : 'sm');\n\n readonly displayValue = computed(() => this.selected()?.label ?? this.value());\n readonly displayIcon = computed(() => this.selected()?.icon ?? this.icon());\n readonly displayFlag = computed(() => this.selected()?.flag ?? this.flag());\n readonly hasValue = computed(() => !!this.displayValue());\n\n /* ── Trigger click ───────────────────────────────────────────────────── */\n /**\n * Click/Enter/Space del div trigger interno. Misma lógica que el viejo\n * onHostClick: si disabled corta; emite `clicked`; si hay items togglea el\n * menu. Al vivir en un div interno sin touch handlers ni blur (patrón canon\n * sui-select), el click sintético de iOS WebKit ya no se cancela y el menu\n * abre. No hace falta el fix de :active stuck con touchstart/touchend acá.\n */\n onTriggerClick(event: Event): void {\n if (this.mergedDisabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.clicked.emit(event);\n if (this.items().length > 0) {\n this._menu()?.toggle();\n }\n }\n\n /** Sincroniza isOpen y dispara _onTouched cuando el menu se abre. */\n protected onMenuOpenedChange(open: boolean): void {\n this.isOpen.set(open);\n if (open) this._onTouched();\n }\n\n /* ── Item selection ──────────────────────────────────────────────────── */\n protected selectItem(item: SuiCompactSelectItem<T>): void {\n if (item.disabled) return;\n this.selected.set(item);\n this._onChange(item.value);\n this._onTouched();\n this.selectedChange.emit(item);\n this._menu()?.close();\n }\n\n /* ── ControlValueAccessor ────────────────────────────────────────────── */\n writeValue(value: T | null): void {\n if (value === null || value === undefined) {\n this.selected.set(null);\n this._pendingValue.set(null);\n return;\n }\n const match = this.items().find((i) => i.value === value);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n } else {\n this._pendingValue.set(value);\n }\n }\n\n registerOnChange(fn: (v: T | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._formDisabled.set(isDisabled);\n }\n}\n","<!--\n Trigger DIV interno — patrón canon sui-select. La interacción\n (click/keyboard/role/aria/tabindex) y el anclaje del overlay viven acá, NO\n en el host. El host custom-element NO debe colgar (click)+(touchend→blur)\n porque el blur() síncrono en touchend cancela el click sintético de iOS\n WebKit y el menu no abre. Moverlo a un div interno sin touch handlers\n elimina la causa raíz por equivalencia con sui-select (probado en iOS real).\n-->\n<div\n #triggerEl\n class=\"sui-compact-select__trigger\"\n role=\"button\"\n [attr.tabindex]=\"mergedDisabled() ? null : 0\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-disabled]=\"mergedDisabled() ? '' : null\"\n [class.sui-compact-select__trigger--open]=\"isOpen()\"\n [class.sui-compact-select__trigger--error]=\"error()\"\n [class.sui-compact-select__trigger--disabled]=\"mergedDisabled()\"\n (click)=\"onTriggerClick($event)\"\n (keydown.enter)=\"onTriggerClick($event)\"\n (keydown.space)=\"onTriggerClick($event); $event.preventDefault()\"\n>\n <!-- Leading slot según type. Prioriza el selected item; sino usa el input estático. -->\n @switch (type()) {\n @case ('icon') {\n @if (displayIcon()) {\n <sui-icon class=\"sui-compact-select__leading\" [name]=\"displayIcon()!\" [size]=\"20\" />\n }\n }\n @case ('country') {\n @if (displayFlag()) {\n <sui-flag class=\"sui-compact-select__leading\" [name]=\"displayFlag()!\" [size]=\"flagSize()\" />\n }\n }\n }\n\n <!-- Value / placeholder text (basic + country muestran texto; icon usualmente sin). -->\n @if (type() !== 'icon') {\n <span class=\"sui-compact-select__value\" [attr.data-sui-placeholder]=\"hasValue() ? null : ''\">\n {{ hasValue() ? displayValue() : placeholder() }}\n </span>\n }\n\n <!-- Trailing arrow. -->\n <sui-icon class=\"sui-compact-select__arrow\" [name]=\"arrowIcon()\" [size]=\"20\" />\n</div>\n\n<!-- Overlay menu — delegado a sui-dropdown-menu. El trigger DIV interno es el\n [origin]=triggerEl; el menu solo gestiona el panel.\n Solo se renderea cuando hay items (mode 2). -->\n@if (items().length > 0) {\n <sui-dropdown-menu\n [origin]=\"triggerEl\"\n [disabled]=\"mergedDisabled()\"\n [minWidth]=\"200\"\n panelClass=\"sui-compact-select__overlay-pane\"\n (openedChange)=\"onMenuOpenedChange($event)\"\n >\n <ng-template suiDropdownPanel>\n <div class=\"sui-compact-select__menu\">\n @for (item of items(); track item.value) {\n <sui-dropdown-item\n mode=\"option\"\n [label]=\"item.label\"\n [sublabel]=\"item.sublabel ?? ''\"\n [selected]=\"item.value === selected()?.value\"\n [disabled]=\"item.disabled ?? false\"\n (click)=\"selectItem(item)\"\n >\n @if (item.flag) {\n <sui-flag slot=\"leading\" [name]=\"item.flag\" size=\"sm\" />\n } @else if (item.icon) {\n <sui-icon slot=\"leading\" [name]=\"item.icon\" [size]=\"20\" />\n }\n </sui-dropdown-item>\n }\n </div>\n </ng-template>\n </sui-dropdown-menu>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiBadge, SuiBadgeColor } from '../sui-badge/sui-badge';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\nimport { SuiBrandLogo, SuiBrandLogoCompany } from '../sui-brand-logo/sui-brand-logo';\n\n/**\n * 6 tipos de leading visual del Content Card (SUI 2.0).\n * basic — sin leading; sólo text block.\n * left-icon — icono RemixIcon en cuadro redondeado 40×40 (stroke + bg-white).\n * avatar — sui-avatar (foto / iniciales) tamaño md (40px).\n * card-provider — visual de tarjeta de pago (brand logo sobre fondo de marca).\n * brand — sui-brand-logo (logo de marca conocida) en cuadro 40×40.\n * company — sui-avatar con companyLogoSrc (silueta de empresa) 40px.\n */\nexport type SuiContentCardType =\n | 'basic'\n | 'left-icon'\n | 'avatar'\n | 'card-provider'\n | 'brand'\n | 'company';\n\n/**\n * SUI Content Card — SUI Design System 2.0\n *\n * ⚠️ REFERENCIA FIGMA NO VERIFICADA (corregido 2026-05-29):\n * El header anterior afirmaba que el nodo de referencia era `266:2814`. ESO ES\n * FALSO: `266:2814` es el componente form `Label [1.1]` (confirmado por el\n * sui-form-label.ts, que lista explícitamente 263:1850 / 266:2814, y por el\n * screenshot \"Label * (Optional)\"). NO es el ContentCard.\n *\n * El fileKey `8p1k72aKKvzJV4XcvPS4VO` que se usaba en todo el DS es el archivo\n * de ASSETS DE MARCA de SUI (sus únicas páginas son \"Cover\" y \"Brand\";\n * contiene Visa/Mastercard/Stripe/PayPal logos, NO la librería de componentes).\n * El nodo real del ContentCard / ContentLabel vive en OTRO archivo de SUI\n * (la librería \"Base Components\") al que esta conexión MCP no tiene acceso.\n * Por lo tanto NINGUNA medida de layout, gap, leading o card-provider de este\n * componente está confirmada pixel-exacta contra Figma — son inferencias del\n * patrón SUI ContentLabel estándar + la descripción del SUI-FIGMA-CHECKLIST.\n * Ver PENDING VERIFY al final y la entrada en PENDIENTES.md.\n *\n * Componente NUEVO de la auditoría (descrito en SUI-FIGMA-CHECKLIST.md:86): es el\n * `ContentLabel` (fila de contenido con leading visual + título/subtítulo + badge\n * inline) ENVUELTO en una card:\n * bg-white-0, border 1px stroke-soft-200, radius 12px, padding 16px,\n * drop-shadow x-small.\n * Trailing: en lugar del badge/switch del ContentLabel original, una card lleva\n * un botón X de dismiss (close-line 20px via sui-icon) a la derecha.\n *\n * Anatomía (flex row, gap 12, items-center):\n * [ leading 40×40 ] [ text block (flex-1) ] [ X dismiss 20px ]\n * text block = Title row (title + sui-badge inline) + Subtitle.\n *\n * 6 tipos de leading (input `type`):\n * basic → sin leading\n * left-icon → cuadro 40×40 radius-10 border stroke-soft-200 bg-white-0,\n * sui-icon `icon` 20px color icon-sub-600\n * avatar → sui-avatar size=md (40px) src/initials\n * card-provider → cuadro 40×28 (ratio tarjeta) radius-6 con brand logo centrado\n * brand → cuadro 40×40 radius-10 border + sui-brand-logo `brand`\n * company → sui-avatar size=md con companyLogoSrc / iniciales\n *\n * Badge (input `badge` + `badgeColor`): vive DENTRO del Title row (al lado del\n * título), usando <sui-badge size=\"small\" [color]=\"badgeColor()\" variant=\"lighter\">.\n * El DS de Figma especifica AZUL (state/information/light #c0d5ff → sui-badge\n * color=\"blue\"). El proyecto Master Pedidos prefiere NARANJA por branding, así que\n * `badgeColor` default = 'orange', PERO es un input configurable: cualquier consumer\n * que necesite el color del DS u otro semántico pasa `[badgeColor]=\"'blue'\"` sin\n * forkear el template. La tipografía del badge small es Subheading/2X Small 11/12\n * UPPERCASE tracking 0.22px (0.02em), provista por el propio sui-badge.\n *\n * Token map (Figma → sui-tokens):\n * bg/white-0 → --sui-bg-white-0 (#ffffff, card bg + leading bg)\n * stroke/soft-200 → --sui-stroke-soft-200 (#ebebeb, card border + leading border)\n * text/strong-950 → --sui-text-strong-950 (#171717, title)\n * text/sub-600 → --sui-text-sub-600 (#5c5c5c, subtitle)\n * icon/sub-600 → --sui-icon-sub-600 (#5c5c5c, leading icon + X idle)\n * text/strong-950 → --sui-text-strong-950 (#171717, X icon on hover)\n * bg/weak-50 → --sui-bg-weak-50 (#f7f7f7, X hover bg)\n * text/disabled-300 → --sui-text-disabled-300 (#d1d1d1, title cuando disabled)\n * icon/disabled-300 → --sui-icon-disabled-300 (#d1d1d1, leading/X cuando disabled)\n * radius-12 → --sui-radius-12 (card)\n * radius-10 → --sui-radius-10 (leading box icon/brand)\n * radius-6 → --sui-radius-6 (card-provider box)\n * shadow x-small → --sui-shadow-x-small (0 1px 2px 0 #0a0d1408)\n *\n * Typography:\n * title → Label/Small 14/20 weight 500 ls -0.006em (--sui-type-label-sm-*)\n * subtitle → Paragraph/Small 14/20 weight 400 ls -0.006em (--sui-type-paragraph-sm-*)\n *\n * iOS :active — el botón X es clickeable custom: lleva (touchstart)/(touchend)\n * para liberar el estado active en WKWebView (regla del proyecto).\n *\n * DEPENDENCIA / DEVIACIÓN: la spec pedía componer `sui-content-label`. Ese\n * componente NO existe aún en el repo (verificado por `find` 2026-05-29, sigue\n * marcado \"[no existe como SUI]\" en SUI-FIGMA-CHECKLIST.md:85). Para no bloquear,\n * la estructura del ContentLabel se implementa INLINE acá (text block + leading),\n * siguiendo la misma anatomía y tokens. Si más adelante se crea `sui-content-label`,\n * extraer el bloque `.sui-content-card__row` a ese componente y componerlo.\n * Tracking en PENDIENTES.md (sección \"SUI · ContentCard / ContentLabel\").\n *\n * Disabled: el ContentCard deriva del ContentLabel, que en Figma define un estado\n * `Disabled` (text/disabled-300, icono atenuado, pointer-events none). Se expone\n * via input `disabled`: atenúa title/subtitle/leading/X a tokens disabled-300,\n * pone el badge en su propio estado disabled, bloquea el botón X y setea\n * aria-disabled en el host. Usar para método de pago bloqueado/vencido o\n * integración inactiva.\n *\n * PENDING VERIFY (NO confirmado pixel-exacto contra Figma — el nodo real del\n * ContentCard vive en la librería de componentes SUI, archivo distinto del\n * fileKey de assets de marca 8p1k72aKKvzJV4XcvPS4VO; ver ⚠️ del header):\n * - leading box 40×40 / card-provider 40×28 / radios (10/6) / gap 12: inferidos\n * del patrón SUI ContentLabel estándar (avatar md = 40 ancla el row height).\n * Pueden coincidir por convención DS, pero sin confirmación pixel-exacta.\n * - card-provider visual: brand logo sobre bg-white + border. El \"chip\" EMV y el\n * degradado de tarjeta real del DS no se reproducen (no hay asset). Ver\n * assetsPending.\n * - X dismiss hover/active: hover → bg-weak-50 + icon strong-950, active →\n * scale(0.96). INFERIDO, el set no publica estados del botón. PRESERVAR.\n * - disabled visual (opacidad/tokens exactos del leading y badge): el patrón\n * Disabled del ContentLabel no se pudo medir; se aplican los tokens disabled-300\n * del DS por consistencia con sui-badge/sui-form-label.\n *\n * Usage:\n * <sui-content-card type=\"left-icon\" icon=\"bank-card-line\"\n * title=\"Visa **** 4242\" subtitle=\"Expira 09/27\"\n * badge=\"Principal\" (dismiss)=\"onRemove()\" />\n * <sui-content-card type=\"avatar\" [avatarSrc]=\"user.photo\"\n * title=\"Ana Torres\" subtitle=\"ana@correo.com\" />\n * <sui-content-card type=\"brand\" brand=\"stripe\"\n * title=\"Stripe\" subtitle=\"Conectado\" badge=\"Activo\" />\n */\n@Component({\n selector: 'sui-content-card',\n standalone: true,\n templateUrl: './sui-content-card.html',\n styleUrl: './sui-content-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiBadge, SuiAvatar, SuiBrandLogo],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). El input\n `title` sigue accesible como property; sólo se borra del DOM para evitar\n el tooltip nativo gris del browser. */\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"group\"',\n '[attr.aria-label]': 'title() || null',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n },\n})\nexport class SuiContentCard {\n /** Tipo de leading visual. */\n readonly type = input<SuiContentCardType>('basic');\n\n /** Título — Label/Small, text-strong-950. */\n readonly title = input<string>('');\n\n /** Subtítulo — Paragraph/Small, text-sub-600. */\n readonly subtitle = input<string>('');\n\n /** Texto del badge inline (Title row). Vacío → no se renderiza el badge. */\n readonly badge = input<string>('');\n\n /**\n * Color del badge inline. Default 'orange' (branding Master Pedidos). El DS de\n * Figma especifica 'blue' (state/information/light); pasar [badgeColor]=\"'blue'\"\n * para alinearse al DS, o cualquier otro SuiBadgeColor semántico.\n */\n readonly badgeColor = input<SuiBadgeColor>('orange');\n\n /** RemixIcon name (sin 'ri-') para type=left-icon. */\n readonly icon = input<string | null>(null);\n\n /** Foto del avatar para type=avatar / company. */\n readonly avatarSrc = input<string | null>(null);\n\n /** Iniciales fallback del avatar (type=avatar / company). */\n readonly avatarInitials = input<string>('');\n\n /** Logo de empresa para type=company (mini-avatar bottom-right del sui-avatar). */\n readonly companyLogoSrc = input<string | null>(null);\n\n /** Marca para type=brand / card-provider. */\n readonly brand = input<SuiBrandLogoCompany | null>(null);\n\n /** Mostrar el botón X de dismiss. Default true. */\n readonly dismissible = input(true);\n\n /** aria-label del botón X. */\n readonly dismissAriaLabel = input<string>('Descartar');\n\n /**\n * Estado deshabilitado: atenúa contenido a tokens disabled-300, deshabilita el\n * badge y el botón X (sin pointer-events), y setea aria-disabled en el host.\n */\n readonly disabled = input(false);\n\n /** Emite al hacer click en el botón X. No emite si disabled. */\n readonly dismiss = output<MouseEvent>();\n\n /** True si hay leading visual (todo menos basic). */\n readonly hasLeading = computed(() => this.type() !== 'basic');\n\n onDismiss(event: MouseEvent): void {\n if (this.disabled()) return;\n this.dismiss.emit(event);\n }\n}\n","<div class=\"sui-content-card__row\">\n @if (hasLeading()) {\n <div class=\"sui-content-card__leading\">\n @switch (type()) {\n @case ('left-icon') {\n <div class=\"sui-content-card__icon-box\">\n @if (icon(); as i) {\n <sui-icon [name]=\"i\" [size]=\"20\" />\n }\n </div>\n }\n\n @case ('avatar') {\n <sui-avatar size=\"md\" [src]=\"avatarSrc()\" [initials]=\"avatarInitials()\" [alt]=\"title()\" />\n }\n\n @case ('company') {\n <sui-avatar\n size=\"md\"\n [src]=\"avatarSrc()\"\n [initials]=\"avatarInitials()\"\n [alt]=\"title()\"\n [companyLogoSrc]=\"companyLogoSrc()\"\n [status]=\"companyLogoSrc() ? 'company' : null\"\n />\n }\n\n @case ('brand') {\n <div class=\"sui-content-card__icon-box\">\n @if (brand(); as b) {\n <sui-brand-logo [company]=\"b\" size=\"md\" />\n }\n </div>\n }\n\n @case ('card-provider') {\n <div class=\"sui-content-card__card-box\">\n @if (brand(); as b) {\n <sui-brand-logo [company]=\"b\" size=\"sm\" />\n }\n </div>\n }\n }\n </div>\n }\n\n <div class=\"sui-content-card__text\">\n <div class=\"sui-content-card__title-row\">\n <span class=\"sui-content-card__title\">{{ title() }}</span>\n @if (badge()) {\n <sui-badge\n class=\"sui-content-card__badge\"\n [color]=\"badgeColor()\"\n variant=\"lighter\"\n size=\"small\"\n [disabled]=\"disabled()\"\n >\n {{ badge() }}\n </sui-badge>\n }\n </div>\n @if (subtitle()) {\n <span class=\"sui-content-card__subtitle\">{{ subtitle() }}</span>\n }\n </div>\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"sui-content-card__dismiss\"\n [attr.aria-label]=\"dismissAriaLabel()\"\n [disabled]=\"disabled()\"\n (click)=\"onDismiss($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"close-line\" [size]=\"20\" />\n </button>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiContentDividerType =\n | 'line'\n | 'line-spacing'\n | 'text-line'\n | 'text'\n | 'solid-text'\n | 'icon-button'\n | 'icon-button-group'\n | 'text-button'\n | 'text-button-group';\n\n/** Item para los variants `icon-button-group` / `text-button-group`. */\nexport interface SuiContentDividerItem {\n /** Identificador opcional emitido por (itemClick). */\n value?: string;\n /** RemixIcon name (sin prefijo 'ri-'). Usado en icon-button-group. */\n icon?: string;\n /** Label para text-button-group. */\n text?: string;\n /** aria-label override. Default = text o `Acción ${value}`. */\n ariaLabel?: string;\n disabled?: boolean;\n}\n\n/**\n * SUI Content Divider — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 414:4401 (\"Content Divider [1.1]\") — 9 types\n *\n * Componente monolítico que renderea 9 patrones de divider via discriminated\n * `type`. Diferente de `sui-divider` (línea pura horizontal/vertical) — éste\n * agrega contenido centrado (texto / iconos / botones) entre líneas.\n *\n * Types (Figma EXACT — verificado contra nodos 2950:6096..3085:17902):\n * line — línea horizontal pura, 1px stroke-soft-200 (nodo 2950:6096)\n * line-spacing — línea con py-1.5 (4px total) para \"respiro\" (414:4400)\n * text-line — línea–texto–línea SIMÉTRICO, gap-10 a ambos lados (2972:34917)\n * Subheading/2X Small 11/12 medium, ls 0.02em, UPPERCASE, soft-400\n * text — texto UPPERCASE SIN líneas, px-8 py-4 (2937:10447)\n * El <p> es flex-1 pero NO se centra — Figma 2937:10458\n * no aplica text-align, queda alineado a la izquierda.\n * Subheading/X Small 12/16 medium, ls 0.04em, soft-400\n * solid-text — texto UPPERCASE con bg-weak-50 px-20 py-6 (3085:17788)\n * Idem: flex-1 sin text-align (3085:17789, left-aligned).\n * icon-button — botón ícono centrado entre 2 líneas, gap-10 (3085:17794)\n * Button: bg-white border stroke-soft-200 p-6 rounded-8 shadow-xs, icono 20px\n * icon-button-group — grupo de iconos pegados entre 2 líneas, gap-10 (3085:17829)\n * Container (3085:17831) SIN shadow — solo border + radius\n * + overflow:hidden. La shadow-xs es del botón SINGLE.\n * text-button — botón texto centrado entre 2 líneas, gap-10 (3085:17877)\n * Button: p-6 gap-2 rounded-8 shadow-xs; label wrap Text px-4\n * text-button-group — grupo de text buttons pegados entre 2 líneas (3085:17902)\n *\n * Token map (Figma → sui-tokens):\n * stroke/soft-200 → --sui-stroke-soft-200 (#ebebeb)\n * bg/weak-50 → --sui-bg-weak-50 (#f7f7f7, solid-text bg + hover)\n * bg/white-0 → --sui-bg-white-0 (#ffffff, button bg)\n * text/soft-400 → --sui-text-soft-400 (#a3a3a3, text variants)\n * text/sub-600 → --sui-text-sub-600 (#5c5c5c, button labels)\n * icon/sub-600 → --sui-text-sub-600 (#5c5c5c, button icon color)\n * radius-8 → 8px\n * regular-shadow/x-small → 0 1px 2px 0 rgba(10,13,20,0.03)\n *\n * Typography (pixel-perfect, mapeada a tokens del DS — los valores \"2\"/\"4\"/\"-0.6\"\n * que Figma muestra NO son px: son el tracking convertido, el export React los\n * renderiza como 0.22px/0.48px/-0.084px = 0.02em/0.04em/-0.006em):\n * text-line text subheading-2xs → 11/12, ls 0.02em (Figma 0.22px), UPPERCASE\n * text / solid subheading-xs → 12/16, ls 0.04em (Figma 0.48px), UPPERCASE\n * button label label-sm → 14/20, ls -0.006em (Figma -0.084px)\n *\n * PENDING VERIFY (inferido, NO confirmado en Figma):\n * - Hover / active / focus de los botones: el component set 414:4401 NO publica\n * variants de estado interactivo. Inferido: hover → bg-weak-50,\n * active → scale(0.97), focus-visible → outline primary. PRESERVAR.\n * - Disabled per-item de los grupos: no en Figma. Asumido opacity 0.4 +\n * cursor not-allowed. API Angular extra, PRESERVAR.\n * - button-group: Figma da border completo por item (overlap de bordes con el\n * container). Se implementa con border-right entre items (último sin él) +\n * contorno del container vía ::after overlay (NO `border` del container, que\n * sin width fija sumaba 2px al footprint → 98×34 en vez de 96×32). El\n * contorno overlay va INSIDE del footprint exacto: visualmente idéntico (1px\n * entre celdas + 1px alrededor) y mide 96×32 exacto (verificado px-a-px\n * contra 3085:17831). Si un refactor cambia esto, revisar el render contra\n * el nodo 3085:17829.\n *\n * FOOTPRINT (verificado VISUAL px-a-px 2026-06-21, falla-patrón #9 corregida):\n * - icon-button (single) = 32×32 (box-sizing:border-box + width/height:32)\n * - icon-button-group = 96×32 (3 items 32 + contorno ::after inside)\n * - text-button (single) = h32, ancho por label (height:32, width:auto)\n * - text-button-group = h32, ancho por labels\n * ANTES del fix medían 34×34 / 98×34 (el border 1px×2 se sumaba sin box-sizing\n * con dimensión fija, repo SIN reset global → content-box efectivo).\n *\n * Usage:\n * <sui-content-divider type=\"line\" />\n * <sui-content-divider type=\"text-line\" text=\"OR\" />\n * <sui-content-divider type=\"solid-text\" text=\"Amount & Account\" />\n * <sui-content-divider type=\"icon-button\" icon=\"add-line\"\n * ariaLabel=\"Agregar item\" (buttonClick)=\"onAdd()\" />\n * <sui-content-divider type=\"text-button\" text=\"Add\" (buttonClick)=\"onAdd()\" />\n * <sui-content-divider type=\"icon-button-group\"\n * [items]=\"[{value:'prev',icon:'arrow-left-s-line'},\n * {value:'add', icon:'add-line'},\n * {value:'next',icon:'arrow-right-s-line'}]\"\n * (itemClick)=\"onNav($event)\" />\n */\n@Component({\n selector: 'sui-content-divider',\n standalone: true,\n templateUrl: './sui-content-divider.html',\n styleUrl: './sui-content-divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.role]': '\"separator\"',\n '[attr.aria-orientation]': '\"horizontal\"',\n '[attr.data-sui-type]': 'type()',\n },\n})\nexport class SuiContentDivider {\n readonly type = input<SuiContentDividerType>('line');\n\n /** Texto para los variants text-line / text / solid-text / text-button. */\n readonly text = input<string>('');\n\n /** RemixIcon name (sin 'ri-') para variant icon-button. */\n readonly icon = input<string | null>(null);\n\n /** ARIA label para el botón single (icon-button / text-button). */\n readonly ariaLabel = input<string | null>(null);\n\n /** Disabled state del button (icon-button / text-button). */\n readonly disabled = input(false);\n\n /** Items para los variants -group. Mínimo 2, recomendado 3. */\n readonly items = input<readonly SuiContentDividerItem[]>([]);\n\n /** Click en el botón single. */\n readonly buttonClick = output<MouseEvent>();\n\n /** Click en un item del group. */\n readonly itemClick = output<{ item: SuiContentDividerItem; index: number; event: MouseEvent }>();\n\n onButton(event: MouseEvent): void {\n if (this.disabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.buttonClick.emit(event);\n }\n\n onItem(item: SuiContentDividerItem, index: number, event: MouseEvent): void {\n if (item.disabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.itemClick.emit({ item, index, event });\n }\n}\n","@switch (type()) {\n @case ('line') {\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('line-spacing') {\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('text-line') {\n <span class=\"sui-content-divider__line\"></span>\n <span class=\"sui-content-divider__text sui-content-divider__text--xs\">{{ text() }}</span>\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('text') {\n <span class=\"sui-content-divider__text sui-content-divider__text--block\">{{ text() }}</span>\n }\n\n @case ('solid-text') {\n <span class=\"sui-content-divider__text sui-content-divider__text--block\">{{ text() }}</span>\n }\n\n @case ('icon-button') {\n <span class=\"sui-content-divider__line\"></span>\n <button\n type=\"button\"\n class=\"sui-content-divider__btn\"\n [attr.aria-label]=\"ariaLabel() ?? 'Acción'\"\n [disabled]=\"disabled()\"\n (click)=\"onButton($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (icon(); as i) {\n <sui-icon [name]=\"i\" [size]=\"20\" />\n }\n </button>\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('text-button') {\n <span class=\"sui-content-divider__line\"></span>\n <button\n type=\"button\"\n class=\"sui-content-divider__btn sui-content-divider__btn--text\"\n [attr.aria-label]=\"ariaLabel() ?? text()\"\n [disabled]=\"disabled()\"\n (click)=\"onButton($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-content-divider__btn-label\">{{ text() }}</span>\n </button>\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('icon-button-group') {\n <span class=\"sui-content-divider__line\"></span>\n <div class=\"sui-content-divider__group\" role=\"group\">\n @for (item of items(); track $index) {\n <button\n type=\"button\"\n class=\"sui-content-divider__group-item\"\n [attr.aria-label]=\"item.ariaLabel ?? ('Acción ' + (item.value ?? $index))\"\n [disabled]=\"item.disabled\"\n (click)=\"onItem(item, $index, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (item.icon; as i) {\n <sui-icon [name]=\"i\" [size]=\"20\" />\n }\n </button>\n }\n </div>\n <span class=\"sui-content-divider__line\"></span>\n }\n\n @case ('text-button-group') {\n <span class=\"sui-content-divider__line\"></span>\n <div class=\"sui-content-divider__group\" role=\"group\">\n @for (item of items(); track $index) {\n <button\n type=\"button\"\n class=\"sui-content-divider__group-item sui-content-divider__group-item--text\"\n [attr.aria-label]=\"item.ariaLabel ?? item.text ?? ('Acción ' + $index)\"\n [disabled]=\"item.disabled\"\n (click)=\"onItem(item, $index, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-content-divider__btn-label\">{{ item.text }}</span>\n </button>\n }\n </div>\n <span class=\"sui-content-divider__line\"></span>\n }\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\nimport type { SuiTooltipPosition, SuiTooltipSize, SuiTooltipTheme } from './sui-tooltip';\n\n/**\n * SUI Tooltip Panel — Visual del tooltip (renderizado dentro del CDK Overlay).\n *\n * Este componente NO se usa directamente — la directiva `[suiTooltip]` lo\n * monta dinámicamente vía `ComponentPortal` cuando se hace hover/focus en\n * un elemento. Vive en `cdk-overlay-container` (sibling de body).\n *\n * `encapsulation: None` porque el componente renderea dentro del overlay\n * container (fuera del shadow del componente). Los selectors están\n * namespaced (`.sui-tooltip*`) para no contaminar otros estilos.\n *\n * Specs: Figma 2604:269 — ver sui-tooltip.ts (directiva) para detalles.\n *\n * PENDING VERIFY:\n * - El Large dismissible (Figma 2604:2114) muestra descripción de 3 líneas y un\n * dismiss button — se trató como popover rico interactivo (box con\n * `pointer-events: auto` cuando `dismissible`). Figma no expone el modo\n * \"persistent en mouseleave\" como estado visual; se infiere del rol popover.\n *\n * WRAPPING (fix 2026-05-29):\n * - El `<p>` de small/medium se exporta de Figma como `whitespace-nowrap`\n * porque el diseño solo usa labels cortos de una línea (Figma hugs-content).\n * Con `nowrap` real, un texto largo IGNORA el `max-width` del box y se\n * desborda fuera del tooltip. Fix: `white-space: normal` + `overflow-wrap`/\n * `word-break: break-word` en el .scss — corto sigue en una línea, largo\n * envuelve dentro de `max-width` (200px small / 280px medium).\n */\n@Component({\n selector: 'sui-tooltip-panel',\n standalone: true,\n imports: [SuiIcon, SuiCompactButton],\n templateUrl: './sui-tooltip-panel.html',\n styleUrl: './sui-tooltip-panel.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'sui-tooltip',\n '[attr.data-sui-position]': 'position()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-theme]': 'theme()',\n /* Refleja el input `dismissible` al DOM para que el SCSS habilite\n `pointer-events: auto` en el box (modo popover persistente, Figma Large).\n Solo atributo reflejado — la API pública (selector/inputs/outputs) no\n cambia. */\n '[attr.data-sui-dismissible]': 'dismissible() ? \"\" : null',\n '[attr.role]': '\"tooltip\"',\n },\n})\nexport class SuiTooltipPanel {\n /** Text-only (size small/medium). En size=large se ignora — usar title/description. */\n readonly text = input<string>('');\n readonly position = input<SuiTooltipPosition>('top');\n readonly size = input<SuiTooltipSize>('medium');\n readonly theme = input<SuiTooltipTheme>('light');\n readonly showArrow = input<boolean>(true);\n\n /* ── Large variant inputs (Figma 2604:269 Large) ─────────────────────── */\n /** Title (Label/Small Medium 14/20 -0.006em). Solo se renderea en size=large. */\n readonly title = input<string | null>(null);\n /** Description (Paragraph/X Small Regular 12/16). Solo en size=large. */\n readonly description = input<string | null>(null);\n /** RemixIcon name del leading icon (20×20). Solo en size=large. */\n readonly icon = input<string | null>(null);\n /** Si true, renderea el dismiss button (X) a la derecha. Solo en size=large. */\n readonly dismissible = input<boolean>(false);\n\n /** Emitido cuando el user clickea el dismiss button. */\n readonly dismissed = output<void>();\n}\n","@if (size() === 'large' || size() === 'xlarge') {\n <!-- Large/XLarge variant: icon + (title + description) + dismiss button -->\n <div class=\"sui-tooltip__box sui-tooltip__box--large\">\n @if (icon()) {\n <sui-icon class=\"sui-tooltip__icon\" [name]=\"icon()!\" [size]=\"size() === 'xlarge' ? 24 : 20\" />\n }\n <div class=\"sui-tooltip__content\">\n @if (title()) {\n <p class=\"sui-tooltip__title\">{{ title() }}</p>\n }\n @if (description()) {\n <p class=\"sui-tooltip__description\">{{ description() }}</p>\n }\n </div>\n @if (dismissible()) {\n <sui-compact-button\n class=\"sui-tooltip__dismiss\"\n icon=\"close-line\"\n variantStyle=\"ghost\"\n size=\"medium\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"dismissed.emit()\"\n />\n }\n @if (showArrow()) {\n <div class=\"sui-tooltip__arrow\" aria-hidden=\"true\"></div>\n }\n </div>\n} @else {\n <!-- Small/Medium variant: text-only -->\n <div class=\"sui-tooltip__box\">\n <span class=\"sui-tooltip__text\">{{ text() }}</span>\n @if (showArrow()) {\n <div class=\"sui-tooltip__arrow\" aria-hidden=\"true\"></div>\n }\n </div>\n}\n","import {\n ComponentRef,\n DestroyRef,\n Directive,\n ElementRef,\n Renderer2,\n effect,\n inject,\n input,\n signal,\n DOCUMENT,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n ConnectedPosition,\n Overlay,\n OverlayConfig,\n OverlayPositionBuilder,\n OverlayRef,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { SuiTooltipPanel } from './sui-tooltip-panel';\n\n/* ═══ SUI Tooltip — SUI 2.0 ════════════════════════════════════════════\n * Figma 8p1k72aKKvzJV4XcvPS4VO\n * Component-set: 2604:269 \"Tooltip [1.1]\"\n *\n * Arquitectura (refactor 2026-05-16):\n * - **Directiva** `[suiTooltip]` aplicable a cualquier elemento\n * - Usa **Angular CDK Overlay** (`@angular/cdk/overlay`) para mountar el\n * tooltip en `cdk-overlay-container`. No más `document.createElement`\n * manual — CDK handlea positioning, viewport flipping, z-index stacking,\n * scroll strategy, ARIA y cleanup automático.\n * - **Panel component** (`SuiTooltipPanel`) tiene su propio .ts/.html/.scss\n * colocalizado — `encapsulation: None` para que los estilos lleguen al\n * overlay container (selectores namespaced `.sui-tooltip*`).\n *\n * EXACT specs (Figma 2604:269 — valores confirmados via MCP get_design_context\n * sobre nodos 2604:282 small, 2604:1554 medium, 2604:2114 large, 2604:1330 dark):\n * Sizes (box):\n * small = Figma \"2X-Small\" (24px alto): padding 2/6, radius-4, text 12/400/16 ls 0\n * medium = Figma \"X-Small\" (34px alto): padding 4/10, radius-6, text 14/400/20 ls -0.084px (-0.006em)\n * large = Figma \"Large\" (280px wide): padding 12 + gap 12, radius-12,\n * title 14/500/20 ls -0.084px (text-strong-950),\n * desc 12/400/16 (text-sub-600 light / text-soft-400 dark),\n * leading icon 20×20, dismiss = compact-button p2 radius-6 close-line 20\n * Themes (confirmado en TODAS las sizes, incl. 2X-Small/X-Small dark):\n * light: bg-white-0 + border 1px stroke-soft-200 + text strong-950\n * dark : bg-strong-950 + SIN border + text white-0\n * Gap host→tooltip: 8px (offsetX/Y en la position strategy CDK)\n * Shadow: 0 12px 24px rgba(14,18,27,.06), 0 1px 2px rgba(14,18,27,.03) (todos los sizes/themes)\n * Arrow/tail: triángulo vector limpio (NO cuadrado rotado). Ratio 2:1 w:h:\n * small 8×4px · medium 12×6px · large 12×6px.\n * Implementado con clip-path polygon en pseudo-elementos — fill triangle\n * (::after) + border-hairline triangle (::before, +1px) — ver sui-tooltip-panel.scss.\n * En Large Top-Left el tail se offset 16px del borde (Figma pl-16); per-size scaling.\n *\n * Ventajas vs implementación manual previa:\n * - Auto-flip cuando el tooltip se sale del viewport (CDK fallback positions)\n * - Z-index automático del overlay stack (no hardcoded 9999)\n * - Auto-cleanup on directive destroy\n * - Scroll strategy = close (cierra el tooltip on scroll, sin custom listener)\n * - Performance: CDK usa requestAnimationFrame internamente para positioning\n *\n * Features preservados (NO presentes en el spec base de Figma — extras del SUI):\n * - [suiTooltipLarge] popover rico (icon+title+description+dismiss) como API\n * - Show on mouseenter/focus, hide on mouseleave/blur\n * - Hover delay configurable (default 200ms)\n * - input `disabled` reactivo, input `showArrow`\n * - Escape key cierra el tooltip; capture-phase scroll fallback\n * - aria-describedby automático en el host\n * - prefers-reduced-motion (desactiva transition)\n * - Remove `title` attr del host (evita tooltip nativo gris del browser)\n *\n * PENDING VERIFY (inferido, no confirmable 100% en Figma):\n * - Tail SVG asset vs clip-path: Figma exporta el tail como vector (imgTail).\n * Se eligió clip-path CSS (mismo triángulo 8×4 / 12×6, sin asset HTTP ni\n * dependencia de iconset) en vez de embeber el SVG. Visualmente equivalente;\n * confirmar render real on-device.\n * - Border-hairline del tail (::before +1px): asoma 1px de stroke-soft-200 en\n * light para continuar el borde del box. Verificar que no se vea grueso ni\n * desalineado en HiDPI; en dark no aplica (sin border).\n * - Offset lateral del tail en top-start/end y bottom-start/end: 16px (med/large)\n * / 12px (small). Figma confirma 16px solo en Large Top-Left; el resto es\n * scaling por convención. Verificar centrado de la punta visualmente.\n * - Gap efectivo host→punta: box a 8px (CDK) + tail protruye ~6px (med/large) /\n * 4px (small) con 1px overlap → punta a ~2-3px del host. Aceptable; Figma no\n * expone el gap como token.\n * - Dark mode: expuesto como input `theme='dark'` (no media query). Figma lo\n * modela como eje de variante, no como prefers-color-scheme — el input es la\n * traducción correcta de ese eje. El proyecto no usa prefers-color-scheme global.\n *\n * ══════════════════════════════════════════════════════════════════════════ */\n\nexport type SuiTooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left';\n\n// large/xlarge: large es el popover rico (Figma); xlarge es project extension\n// (no-Figma) — mismo layout rico, box +40px ancho y padding/gap +2px.\nexport type SuiTooltipSize = 'small' | 'medium' | 'large' | 'xlarge';\nexport type SuiTooltipTheme = 'light' | 'dark';\n\n/**\n * Datos del Large variant (Figma 2604:269 Large). Si `[suiTooltipLarge]`\n * está presente con un objeto, la directiva renderea el variant rico\n * (icon + title + description + opt dismiss) en lugar del text-only.\n *\n * Si `dismissible: true`, el tooltip se vuelve PERSISTENT: no auto-hide\n * en mouseleave, solo cierra via X click o Escape (UX tipo popover).\n */\nexport interface SuiTooltipLargeData {\n title: string;\n description?: string;\n /** RemixIcon name (ej. 'global-line'). */\n icon?: string;\n /** Si true: persistent (no auto-hide). Renderea botón X clickeable. */\n dismissible?: boolean;\n}\n\n/**\n * Map de SuiTooltipPosition → array de ConnectedPosition (primary + fallbacks).\n * CDK probará en orden hasta encontrar una que entre en el viewport — auto-flip.\n *\n * `offsetX`/`offsetY` definen el gap entre el host y el tooltip (8px canon).\n */\nconst GAP = 8;\n\nconst POSITION_MAP: Record<SuiTooltipPosition, ConnectedPosition[]> = {\n 'top': [\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -GAP },\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: GAP },\n ],\n 'top-start': [\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -GAP },\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: GAP },\n ],\n 'top-end': [\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -GAP },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: GAP },\n ],\n 'bottom': [\n { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetY: GAP },\n { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetY: -GAP },\n ],\n 'bottom-start': [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: GAP },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -GAP },\n ],\n 'bottom-end': [\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: GAP },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -GAP },\n ],\n 'right': [\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: GAP },\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -GAP },\n ],\n 'left': [\n { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: -GAP },\n { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: GAP },\n ],\n};\n\n/**\n * Reverse map: dado un ConnectedPosition.originY/originX/overlayX/overlayY,\n * inferir qué SuiTooltipPosition representa (para actualizar el arrow dirección\n * post flip).\n */\nfunction inferPosition(connected: ConnectedPosition): SuiTooltipPosition {\n // Horizontal-priority cases (right/left)\n if (connected.originY === 'center' && connected.overlayY === 'center') {\n return connected.originX === 'end' ? 'right' : 'left';\n }\n // Vertical cases (top* / bottom*)\n const isTop = connected.overlayY === 'bottom';\n if (connected.originX === 'start' && connected.overlayX === 'start') {\n return isTop ? 'top-start' : 'bottom-start';\n }\n if (connected.originX === 'end' && connected.overlayX === 'end') {\n return isTop ? 'top-end' : 'bottom-end';\n }\n return isTop ? 'top' : 'bottom';\n}\n\n@Directive({\n /* Selector múltiple — la directiva matchea con cualquiera de los inputs:\n `[suiTooltip]` para text-only o `[suiTooltipLarge]` para popover rico. */\n selector: '[suiTooltip], [suiTooltipLarge]',\n standalone: true,\n})\nexport class SuiTooltip {\n /* ── Inputs ── */\n\n /** Tooltip text content (default — text-only en size small/medium). */\n readonly suiTooltip = input<string>('');\n\n /**\n * Large variant (Figma 2604:269 Large): si se provee, la directiva renderea\n * el popover rico con icon/title/description/dismiss en vez del text simple.\n * Override automático: size pasa a 'large' cuando este input está presente.\n */\n readonly suiTooltipLarge = input<SuiTooltipLargeData | null>(null);\n\n /** Placement relative to the host element */\n readonly position = input<SuiTooltipPosition>('top');\n\n /** Visual size — alias `suiTooltipSize` evita colisión con `size` de host components (ej. sui-button). */\n readonly size = input<SuiTooltipSize>('medium', { alias: 'suiTooltipSize' });\n\n /** Color theme */\n readonly theme = input<SuiTooltipTheme>('light');\n\n /** Delay in ms antes de mostrar (mouseenter/focus) */\n readonly delay = input(200);\n\n /** Disable tooltip entirely */\n readonly disabled = input(false);\n\n /** Show arrow indicator */\n readonly showArrow = input(true);\n\n /* ── Internal state ── */\n readonly isVisible = signal(false);\n private _overlayRef: OverlayRef | null = null;\n private _panelRef: ComponentRef<SuiTooltipPanel> | null = null;\n private _showTimer: ReturnType<typeof setTimeout> | null = null;\n private _currentPosition = signal<SuiTooltipPosition>('top');\n /** True mientras el overlay está montado — para gate el scroll-listener. */\n private _scrollListenerActive = false;\n\n private readonly _host = inject(ElementRef<HTMLElement>);\n private readonly _renderer = inject(Renderer2);\n private readonly _document = inject(DOCUMENT);\n private readonly _destroyRef = inject(DestroyRef);\n private readonly _overlay = inject(Overlay);\n private readonly _positions = inject(OverlayPositionBuilder);\n\n /* ── Lifecycle ── */\n\n constructor() {\n const el = this._host.nativeElement as HTMLElement;\n\n // Remove native `title` attr para evitar tooltip nativo gris del browser\n // tras ~1.5s de hover. Patrón canon Ontop (ver CLAUDE.md).\n if (el.hasAttribute('title')) {\n this._renderer.removeAttribute(el, 'title');\n }\n\n el.addEventListener('mouseenter', this._onMouseEnter);\n el.addEventListener('mouseleave', this._onMouseLeave);\n el.addEventListener('focus', this._onFocus);\n el.addEventListener('blur', this._onBlur);\n this._document.addEventListener('keydown', this._onKeydown);\n\n this._destroyRef.onDestroy(() => {\n el.removeEventListener('mouseenter', this._onMouseEnter);\n el.removeEventListener('mouseleave', this._onMouseLeave);\n el.removeEventListener('focus', this._onFocus);\n el.removeEventListener('blur', this._onBlur);\n this._document.removeEventListener('keydown', this._onKeydown);\n // _destroyOverlay también remueve el scroll listener si está activo.\n this._clearTimers();\n this._destroyOverlay();\n });\n }\n\n /* When disabled flips to true while visible, hide immediately */\n private readonly _disabledEffect = effect(() => {\n if (this.disabled() && this.isVisible()) {\n this._hide();\n }\n });\n\n /* ── Event handlers ── */\n private readonly _onMouseEnter = () => this._scheduleShow();\n /** En Large + dismissible NO se cierra on mouseleave (persistent). */\n private readonly _onMouseLeave = () => { if (!this._isPersistent()) this._hide(); };\n private readonly _onFocus = () => this._scheduleShow();\n private readonly _onBlur = () => { if (!this._isPersistent()) this._hide(); };\n private readonly _onKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isVisible()) this._hide();\n };\n\n /**\n * Fallback scroll listener — CDK's `CloseScrollStrategy` solo detecta scroll\n * en containers registrados con `CdkScrollable` (via ScrollDispatcher).\n * En este proyecto los layouts usan `overflow: auto` nativo SIN `CdkScrollable`,\n * así que el strategy nunca dispara. Este listener cap-phase captura scroll\n * desde cualquier profundidad del DOM tree.\n */\n private readonly _onAnyScroll = () => {\n if (this.isVisible()) this._hide();\n };\n\n /* ── Show / Hide ── */\n\n private _scheduleShow(): void {\n if (this.disabled() || !this._hasContent()) return;\n this._clearTimers();\n this._showTimer = setTimeout(() => this._show(), this.delay());\n }\n\n /** True si hay contenido para renderear (text simple O datos Large). */\n private _hasContent(): boolean {\n return !!this.suiTooltip() || !!this.suiTooltipLarge();\n }\n\n /** Renderear como Large variant cuando hay `suiTooltipLarge` o size large/xlarge. */\n private _isLarge(): boolean {\n return !!this.suiTooltipLarge() || this.size() === 'large' || this.size() === 'xlarge';\n }\n\n /** True si Large con dismissible — persistent, no auto-hide on mouseleave. */\n private _isPersistent(): boolean {\n return this._isLarge() && !!this.suiTooltipLarge()?.dismissible;\n }\n\n private _show(): void {\n if (this._overlayRef) return;\n\n const userPosition = this.position();\n this._currentPosition.set(userPosition);\n\n // Build position strategy with auto-flip fallbacks.\n const positionStrategy = this._positions\n .flexibleConnectedTo(this._host)\n .withPositions(POSITION_MAP[userPosition])\n .withPush(false) // no push — usar flip directamente\n .withFlexibleDimensions(false);\n\n // Update arrow direction when position flips.\n positionStrategy.positionChanges\n .pipe(takeUntilDestroyed(this._destroyRef))\n .subscribe((change) => {\n const newPos = inferPosition(change.connectionPair);\n if (newPos !== this._currentPosition()) {\n this._currentPosition.set(newPos);\n if (this._panelRef) {\n this._panelRef.setInput('position', newPos);\n }\n }\n });\n\n const config: OverlayConfig = {\n positionStrategy,\n scrollStrategy: this._overlay.scrollStrategies.close(),\n disposeOnNavigation: true,\n hasBackdrop: false,\n };\n\n this._overlayRef = this._overlay.create(config);\n\n const portal = new ComponentPortal(SuiTooltipPanel);\n this._panelRef = this._overlayRef.attach(portal);\n\n const large = this.suiTooltipLarge();\n // Si hay datos Large, el size efectivo es large/xlarge (el rico). Respeta\n // xlarge si el consumer lo pidió explícito; sino cae al large canónico.\n const effectiveSize: SuiTooltipSize = large\n ? (this.size() === 'xlarge' ? 'xlarge' : 'large')\n : this.size();\n\n this._panelRef.setInput('text', this.suiTooltip());\n this._panelRef.setInput('position', userPosition);\n this._panelRef.setInput('size', effectiveSize);\n this._panelRef.setInput('theme', this.theme());\n this._panelRef.setInput('showArrow', this.showArrow());\n\n if (large) {\n this._panelRef.setInput('title', large.title);\n this._panelRef.setInput('description', large.description ?? null);\n this._panelRef.setInput('icon', large.icon ?? null);\n this._panelRef.setInput('dismissible', !!large.dismissible);\n\n // Subscribe al dismiss button del panel.\n this._panelRef.instance.dismissed\n .subscribe(() => this._hide());\n }\n\n this.isVisible.set(true);\n\n // Capture-phase scroll listener (fallback al CDK CloseScrollStrategy que\n // solo funciona con `CdkScrollable`). Catchea scroll en cualquier nivel.\n if (!this._scrollListenerActive) {\n window.addEventListener('scroll', this._onAnyScroll, { passive: true, capture: true });\n this._scrollListenerActive = true;\n }\n\n // Set aria-describedby on host (a11y).\n const panelEl = this._panelRef.location.nativeElement as HTMLElement;\n const id = `sui-tooltip-${Math.random().toString(36).slice(2, 8)}`;\n panelEl.id = id;\n this._renderer.setAttribute(this._host.nativeElement, 'aria-describedby', id);\n\n // Trigger enter animation on next frame (post-attach).\n requestAnimationFrame(() => {\n panelEl.classList.add('sui-tooltip--visible');\n });\n }\n\n private _hide(): void {\n this._clearTimers();\n this._destroyOverlay();\n }\n\n private _clearTimers(): void {\n if (this._showTimer !== null) {\n clearTimeout(this._showTimer);\n this._showTimer = null;\n }\n }\n\n private _destroyOverlay(): void {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n this._panelRef = null;\n }\n if (this._scrollListenerActive) {\n window.removeEventListener('scroll', this._onAnyScroll, { capture: true } as any);\n this._scrollListenerActive = false;\n }\n this.isVisible.set(false);\n this._renderer.removeAttribute(this._host.nativeElement, 'aria-describedby');\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiTooltip } from '../sui-tooltip/sui-tooltip';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiFormLabelSize = 'xsmall' | 'small' | 'medium';\n\n/**\n * SUI Form Label — SUI DS 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Figma group: \"Key Components\" → Label [1.1]\n * (nodos auditados: 263:1850 / 266:2814 — frame Label)\n *\n * Matriz Figma decodificada (audit reports.json \"Key Components\"):\n * Label(Normal/Disabled) × Required × Sublabel × Info × Button (~16 combinaciones)\n * - Normal/Disabled → input `disabled`\n * - Required → input `required` (asterisco)\n * - Sublabel → input `sublabel` (texto secundario)\n * - Info → input `tooltip` (icono ℹ + tooltip)\n * - Button → input `linkText` + output `linkClick` (link tipo \"Help?\" a la derecha)\n *\n * @input label: string (required) — Texto principal del label\n * @input sublabel: string | null — Texto secundario pequeño (ej. \"Optional\", \"Required\")\n * @input required: boolean — Muestra asterisco al final del label principal\n * @input tooltip: string | null — Tooltip sobre icono info (ℹ) al final del label\n * @input linkText: string | null — Texto del link de acción a la derecha (variante \"Button\"\n * de Figma, ej. \"Help?\"). Si null, no se renderiza el link.\n * @input size: 'xsmall' | 'small' | 'medium' — Tamaño visual, default 'medium'\n * @input disabled: boolean — Atenúa todo el label (text/sublabel/asterisco/icono/link)\n * @input for: string | null — Attr `for` del <label> para accesibilidad\n * @output linkClick: void — Emite cuando se clickea el link de acción (\"Button\" variant)\n *\n * Variantes (todas verificadas contra el variantMatrix de la auditoría;\n * los valores cromáticos exactos quedan PENDING VERIFY hasta re-correr MCP Figma):\n * - required: asterisco (*) en --sui-state-error-base.\n * NOTA token: SUI 2.0 base pinta el asterisco con --primary-base (#335cff azul).\n * En ESTE proyecto --primary-base fue rebrandeado a naranja (#fa7319), y el asterisco\n * de \"requerido\" es semánticamente un error/alerta → se usa --sui-state-error-base\n * (#fb3748). Decisión consciente, NO copia ciega del token azul de SUI.\n * - sublabel: texto en --sui-text-sub-600, weight 400 (override del 500 del label).\n * - tooltip: botón info, icono custom `info-custom-fill` (node 125:279) vía sui-icon\n * (registrado en SUI_CUSTOM_ICONS) — círculo relleno con \"i\" serif, NO el\n * ri-information-fill de RemixIcon (i recta). Color --sui-icon-disabled-300 (#d1d1d1)\n * via currentColor; el vector queda ~12.5px centrado en slot 20px (padding 18.75%).\n * - linkText: link --sui-primary-base alineado a la derecha (margin-left: auto).\n * - disabled: --sui-text-disabled-300 / --sui-icon-disabled-300 en todo, sin cursor pointer.\n * - sizes: xsmall/small/medium — tipografía escala con el field que acompaña.\n *\n * extraFeatures preservadas (audit): variante `size` (xsmall/small/medium) derivada del\n * contexto de sui-input/sui-select — NO está en los nodos Figma auditados pero se mantiene.\n */\n@Component({\n selector: 'sui-form-label',\n templateUrl: './sui-form-label.html',\n styleUrl: './sui-form-label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiTooltip],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiFormLabel {\n /** Texto principal del label (imperativo) */\n readonly label = input.required<string>();\n\n /** Sublabel opcional (texto secundario pequeño después del label principal) */\n readonly sublabel = input<string | null>(null);\n\n /** Marca como requerido — muestra asterisco al final del label principal */\n readonly required = input(false);\n\n /** Tooltip opcional sobre un icono info (ℹ) al final del label */\n readonly tooltip = input<string | null>(null);\n\n /**\n * Texto del link de acción a la derecha (variante \"Button\" de Figma, ej. \"Help?\").\n * Si null/vacío, no se renderiza el link.\n */\n readonly linkText = input<string | null>(null);\n\n /** Tamaño visual — matchea al field que acompaña */\n readonly size = input<SuiFormLabelSize>('medium');\n\n /** Atenúa todo el label (estado Disabled de Figma) */\n readonly disabled = input(false);\n\n /** ID del field controlado (para accesibilidad `for` attribute) */\n readonly for = input<string | null>(null);\n\n /** Emite cuando se clickea el link de acción (variante \"Button\" de Figma) */\n readonly linkClick = output<void>();\n}\n","<label [attr.for]=\"for()\" class=\"sui-form-label__main\">\n <span class=\"sui-form-label__text\">{{ label() }}</span>\n @if (required()) {\n <span class=\"sui-form-label__required\" aria-hidden=\"true\">*</span>\n }\n @if (sublabel()) {\n <span class=\"sui-form-label__sublabel\">{{ sublabel() }}</span>\n }\n @if (tooltip()) {\n <button\n type=\"button\"\n class=\"sui-form-label__info\"\n [suiTooltip]=\"tooltip()!\"\n position=\"top\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"tooltip()!\"\n [attr.disabled]=\"disabled() ? '' : null\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <!-- info-custom-fill: icono custom de SUI registrado en sui-icon\n (SUI_CUSTOM_ICONS). Regla del proyecto: iconos SIEMPRE vía sui-icon,\n incluso los custom del DS. Color hereda de .sui-form-label__info. -->\n <sui-icon name=\"info-custom-fill\" [size]=\"20\" />\n </button>\n }\n @if (linkText()) {\n <button\n type=\"button\"\n class=\"sui-form-label__link\"\n [disabled]=\"disabled()\"\n (click)=\"linkClick.emit()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n {{ linkText() }}\n </button>\n }\n</label>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiFormHintVariant = 'neutral' | 'error' | 'success' | 'warning' | 'disabled';\nexport type SuiFormHintSize = 'xsmall' | 'small' | 'medium';\n\n/**\n * SUI Form Hint — SUI DS 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Figma group: \"Key Components\" → Hint Text [1.1]\n * (nodos auditados 263:1850 / 266:2814 — frame Hint Text).\n * Specs cruzados con Input Field nodeId 266:5251: Paragraph/X-Small =\n * 12px/400/16px/0 (verificado en sui-input). Valores cromáticos exactos del\n * frame Hint Text quedan PENDING VERIFY (MCP Figma offline esta sesión).\n *\n * Matriz Figma decodificada (audit): Hint Text State(3: Default/Error/Disabled).\n * - Default → variant 'neutral'\n * - Error → variant 'error'\n * - Disabled → variant 'disabled' (cerrado en esta capa)\n *\n * @input message: string | null — Mensaje del hint. Nada se renderiza si es null/vacío\n * @input variant: 'neutral' | 'error' | 'success' | 'warning' | 'disabled' — Variante visual, default 'neutral'\n * @input icon: string | null | undefined — Icono Remix personalizado.\n * - undefined (default): usa el icono default por variant\n * - null: fuerza sin icono\n * - string: usa ese nombre de icono Remix\n * @input size: 'xsmall' | 'small' | 'medium' — Tamaño, default 'medium'\n *\n * Default icons por variant:\n * - neutral → null (sin icono por defecto)\n * - error → 'error-warning-line'\n * - success → 'checkbox-circle-line'\n * - warning → 'alert-line'\n * - disabled → 'information-fill' (VERIFICADO Figma 266:5284: el estado\n * Disabled SÍ muestra el icono info, coloreado --text/disabled-300)\n *\n * Color tokens por variant:\n * - neutral → text-sub-600 (mismo que sui-input __message--hint)\n * - error → state-error-base (#fb3748)\n * - success → state-success-base\n * - warning → state-warning-base\n * - disabled → text-disabled-300 (estado Disabled de Figma; mismo token que el field)\n *\n * extraFeatures preservadas (audit): variantes `success` y `warning` + override de icon\n * no aparecen en el frame Hint Text de Figma (solo Default/Error/Disabled) — se mantienen.\n * El input `size` (xsmall/small/medium) tampoco está auditado — se preserva.\n */\n@Component({\n selector: 'sui-form-hint',\n templateUrl: './sui-form-hint.html',\n styleUrl: './sui-form-hint.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-variant]': 'variant()',\n /* Marca si el host tiene mensaje para que el CSS pueda ocultarlo\n cuando está vacío. Sin esto, el `:host { display: block }` ocupaba\n espacio reservado abajo del consumer (sui-input/sui-select/etc)\n aunque el template interno (@if message()) no rendereara nada. */\n '[attr.data-sui-has-message]': 'message() ? \"\" : null',\n },\n})\nexport class SuiFormHint {\n /** Mensaje del hint. Si null, no renderiza nada */\n readonly message = input<string | null>(null);\n\n /** Variante visual (color + icono default) */\n readonly variant = input<SuiFormHintVariant>('neutral');\n\n /**\n * Icono Remix personalizado.\n * - undefined (default): usa el default de la variant\n * - null: fuerza sin icono\n * - string: usa ese icono\n */\n readonly icon = input<string | null | undefined>(undefined);\n\n /** Tamaño visual */\n readonly size = input<SuiFormHintSize>('medium');\n\n /** Default icons per variant */\n private static readonly _defaultIcons: Record<SuiFormHintVariant, string | null> = {\n neutral: null,\n error: 'error-warning-line',\n success: 'checkbox-circle-line',\n warning: 'alert-line',\n // Figma node 266:5284 (Hint Text State=Disabled) SÍ renderiza el icono\n // `information-fill` (mismo que Default), solo coloreado --text/disabled-300.\n // Se usa `information-fill` (variante rellena) para matchear Figma y ser\n // consistente con sui-banner/sui-alert/sui-notification (todos info-fill).\n disabled: 'information-fill',\n };\n\n /** Resolved icon: undefined → default by variant, null → no icon, string → that icon */\n readonly resolvedIcon = computed<string | null>(() => {\n const customIcon = this.icon();\n if (customIcon === null) return null; // explicit null → no icon\n if (typeof customIcon === 'string') return customIcon; // explicit string → use it\n // undefined → use variant default\n return SuiFormHint._defaultIcons[this.variant()];\n });\n}\n","@if (message()) {\n <span class=\"sui-form-hint\">\n @if (resolvedIcon()) {\n <sui-icon [name]=\"resolvedIcon()!\" [size]=\"16\" class=\"sui-form-hint__icon\" />\n }\n <span class=\"sui-form-hint__text\">{{ message() }}</span>\n </span>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\n\nexport type SuiCounterInputSize = 'xsmall' | 'small' | 'medium';\n\n/**\n * SUI Counter Input — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 428:5656 (\"Counter Input [1.1]\") — 18 variants\n * 6 states (default/hover/focus/filled/disabled/error) × 3 sizes.\n *\n * Input numérico con steppers −/+ a los lados. El valor va centrado entre los\n * dos botones (subtract-line a la izquierda, add-line a la derecha). Es un\n * componente NUEVO y separado del `sui-input` (que NO se toca): aunque el\n * Figma del Text Input vive en otro set, el Counter Input es un frame propio.\n *\n * EXACT specs — PULLED del Figma (nodeIds: 428:5657 medium-default, 428:6734\n * small, 428:7022 xsmall, 428:6243 hover, 428:6291 focus, 428:6387 disabled,\n * 428:6443 error):\n *\n * Container (\"Basic\"):\n * - medium (Medium 40): padding 8px, gap 8px, radius 10px\n * - small (Small 36): padding 6px, gap 6px, radius 8px\n * - xsmall (X-Small 32):padding 4px, gap 4px, radius 8px\n * - bg-white-0 + 1px solid stroke-soft-200 + regular-shadow x-small (default)\n *\n * Steppers (Compact Button [1.1], style ghost):\n * - padding 2px, radius 6px, icono 20×20 (subtract-line / add-line) en TODOS\n * los sizes → caja del stepper = 24×24. color icon-sub-600.\n *\n * Valor (Paragraph/Small — Inter 14/20, -0.084px), text-center, flex 1:\n * - default: text-soft-400 (placeholder gris, valor \"vacío\"/sin foco)\n * - hover: text-sub-600\n * - focus / filled / error: text-strong-950\n * - disabled: text-disabled-300\n *\n * Estados del container:\n * - default: border soft-200 + shadow x-small\n * - hover: bg-weak-50 (border desaparece)\n * - focus: border strong-950 + ring (0 0 0 2px white, 0 0 0 4px slate-alpha-16)\n * - filled: border soft-200 (igual que default, valor strong-950)\n * - disabled: bg-weak-50, sin border ni shadow, icon + valor disabled-300\n * - error: border error-base + shadow x-small, valor strong-950, hint error\n *\n * Label → delegado a sui-form-label (gap 6px arriba del field).\n * Hint → delegado a sui-form-hint (gap 6px debajo del field).\n *\n * **Patrón \"controlled\" (igual que sui-switch):** el componente NO muta su\n * `value` internamente al click. Solo emite `valueChange` con el valor\n * resultante (clamp a min/max). El padre decide si lo aplica vía `[(value)]`.\n * También funciona con Reactive Forms (CVA): en form mode usa un buffer interno\n * `_cvaValue` porque los reactive forms no llaman `writeValue` tras un cambio\n * del usuario.\n *\n * Los botones se deshabilitan al tocar el límite: − en min, + en max.\n *\n * Usage:\n * <sui-counter-input [(value)]=\"qty\" [min]=\"1\" [max]=\"99\" label=\"Cantidad\" />\n * <sui-counter-input [value]=\"2\" [step]=\"2\" size=\"small\" (valueChange)=\"set($event)\" />\n * <sui-counter-input formControlName=\"cantidad\" [min]=\"0\" />\n */\n@Component({\n selector: 'sui-counter-input',\n templateUrl: './sui-counter-input.html',\n styleUrl: './sui-counter-input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiFormLabel, SuiFormHint],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiCounterInput),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n },\n})\nexport class SuiCounterInput implements ControlValueAccessor {\n // ── Layout / labels ────────────────────────────────────────────────────────\n readonly size = input<SuiCounterInputSize>('medium');\n readonly label = input<string | null>(null);\n readonly sublabel = input<string | null>(null);\n readonly required = input(false);\n readonly tooltip = input<string | null>(null);\n readonly hint = input<string | null>(null);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n\n // ── Numeric model ───────────────────────────────────────────────────────────\n readonly value = input(0);\n readonly valueChange = output<number>();\n readonly min = input(Number.NEGATIVE_INFINITY);\n readonly max = input(Number.POSITIVE_INFINITY);\n readonly step = input(1);\n readonly disabled = input(false);\n\n // ── a11y ─────────────────────────────────────────────────────────────────────\n readonly ariaLabel = input<string | null>(null);\n readonly decrementLabel = input('Disminuir');\n readonly incrementLabel = input('Aumentar');\n\n // ── Disabled (input + form) ───────────────────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n // ── CVA buffer — solo activo en form mode (formControlName/formControl) ────────\n private readonly _cvaValue = signal(0);\n private readonly _useCvaValue = signal(false);\n\n /** Valor VISIBLE — input del parent en uso normal, _cvaValue en form mode. */\n readonly effectiveValue = computed(() => {\n if (this._useCvaValue()) return this._cvaValue();\n return this.value();\n });\n\n readonly canDecrement = computed(\n () => !this.isDisabled() && this.effectiveValue() > this.min(),\n );\n readonly canIncrement = computed(\n () => !this.isDisabled() && this.effectiveValue() < this.max(),\n );\n\n /** aria-valuemin/max solo si el límite es finito (sino el AT lee \"Infinity\"). */\n readonly ariaMin = computed(() => (Number.isFinite(this.min()) ? this.min() : null));\n readonly ariaMax = computed(() => (Number.isFinite(this.max()) ? this.max() : null));\n\n /** El texto vacío (placeholder gris) vs valor real: en Figma `default` el valor\n * va en text-soft-400 (aspecto \"sin foco\"); a partir de hover/focus/filled\n * pasa a strong-950. Resolvemos vía CSS (:hover / :focus-within / data-attrs).\n * Acá solo exponemos el número a renderizar. */\n readonly displayValue = computed(() => this.effectiveValue());\n\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n private clamp(v: number): number {\n return Math.min(this.max(), Math.max(this.min(), v));\n }\n\n private commit(next: number): void {\n const clamped = this.clamp(next);\n if (clamped === this.effectiveValue()) return;\n if (this._useCvaValue()) {\n this._cvaValue.set(clamped);\n }\n this.valueChange.emit(clamped);\n this._onChange(clamped);\n this._onTouched();\n }\n\n decrement(): void {\n if (!this.canDecrement()) return;\n this.commit(this.effectiveValue() - this.step());\n }\n\n increment(): void {\n if (!this.canIncrement()) return;\n this.commit(this.effectiveValue() + this.step());\n }\n\n // ── ControlValueAccessor ──────────────────────────────────────────────────────\n writeValue(v: number): void {\n this._cvaValue.set(typeof v === 'number' && !Number.isNaN(v) ? v : 0);\n this._useCvaValue.set(true);\n }\n\n registerOnChange(fn: (v: number) => void): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n [size]=\"size()\"\n class=\"sui-counter-input__label-host\"\n />\n}\n\n<div\n class=\"sui-counter-input__field\"\n [class.sui-counter-input__field--error]=\"error()\"\n [class.sui-counter-input__field--disabled]=\"isDisabled()\"\n>\n <!-- Stepper − (decrement) -->\n <button\n type=\"button\"\n class=\"sui-counter-input__stepper\"\n [attr.aria-label]=\"decrementLabel()\"\n [disabled]=\"!canDecrement() || null\"\n (click)=\"decrement()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"subtract-line\" [size]=\"20\" />\n </button>\n\n <!-- Valor centrado (spinbutton) -->\n <span\n class=\"sui-counter-input__value\"\n role=\"spinbutton\"\n [attr.aria-valuenow]=\"effectiveValue()\"\n [attr.aria-valuemin]=\"ariaMin()\"\n [attr.aria-valuemax]=\"ariaMax()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.aria-invalid]=\"error() ? 'true' : null\"\n >\n {{ displayValue() }}\n </span>\n\n <!-- Stepper + (increment) -->\n <button\n type=\"button\"\n class=\"sui-counter-input__stepper\"\n [attr.aria-label]=\"incrementLabel()\"\n [disabled]=\"!canIncrement() || null\"\n (click)=\"increment()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"add-line\" [size]=\"20\" />\n </button>\n</div>\n\n@if (error() ? errorMessage() : hint()) {\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [size]=\"size()\"\n class=\"sui-counter-input__hint-host\"\n />\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\n/**\n * SUI Date Selector — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 442:192 (\"Date Selector [1.1]\") — 4 variants (left icon on/off × right icon on/off)\n *\n * Header del calendar — muestra el mes/año actual y opcionalmente arrows\n * prev/next a los lados. Los arrows están implementados como\n * <sui-compact-button variantStyle=\"white\"> (composición canon).\n *\n * EXACT (pulled from Figma 442:241 — both icons on):\n * Container:\n * bg weak-50, p-6, gap-6, radius-8\n * w-288 (default), height-36\n * items-center, justify-center, overflow-clip\n *\n * Label:\n * Inter Medium 14/20/-0.6%, color text-sub-600, center\n * flex-[1_0_0] (expande el space disponible)\n * font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Arrows: <sui-compact-button variantStyle=\"white\" size=\"large\">\n * Icon: arrow-left-s-line / arrow-right-s-line (20×20)\n * Compact button: bg white-0, p-2, radius-6, shadow x-small\n *\n * Usage:\n * <sui-date-selector label=\"Enero 2025\" (prev)=\"goPrev()\" (next)=\"goNext()\" />\n * <sui-date-selector label=\"Enero 2025\" [leftIcon]=\"false\" (next)=\"goNext()\" />\n * <sui-date-selector label=\"Enero 2025\" [rightIcon]=\"false\" (prev)=\"goPrev()\" />\n * <sui-date-selector label=\"Enero 2025\" [leftIcon]=\"false\" [rightIcon]=\"false\" />\n */\n@Component({\n selector: 'sui-date-selector',\n templateUrl: './sui-date-selector.html',\n styleUrl: './sui-date-selector.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiCompactButton],\n host: {\n '[attr.data-sui-left-icon]': 'leftIcon() ? \"\" : null',\n '[attr.data-sui-right-icon]': 'rightIcon() ? \"\" : null',\n },\n})\nexport class SuiDateSelector {\n /** Texto del label (ej. \"Enero 2025\", \"January 2024\"). */\n readonly label = input.required<string>();\n /** Mostrar arrow izquierdo (prev). Default true. */\n readonly leftIcon = input(true);\n /** Mostrar arrow derecho (next). Default true. */\n readonly rightIcon = input(true);\n /** Disabled global — deshabilita ambos arrows. */\n readonly disabled = input(false);\n\n readonly prev = output<void>();\n readonly next = output<void>();\n\n onPrev(): void {\n if (this.disabled()) return;\n this.prev.emit();\n }\n\n onNext(): void {\n if (this.disabled()) return;\n this.next.emit();\n }\n}\n","@if (leftIcon()) {\n <sui-compact-button\n icon=\"arrow-left-s-line\"\n variantStyle=\"white\"\n size=\"large\"\n ariaLabel=\"Mes anterior\"\n [disabled]=\"disabled()\"\n (clicked)=\"onPrev()\"\n />\n} @else {\n <span class=\"sui-date-selector__placeholder\" aria-hidden=\"true\"></span>\n}\n\n<span class=\"sui-date-selector__label\">{{ label() }}</span>\n\n@if (rightIcon()) {\n <sui-compact-button\n icon=\"arrow-right-s-line\"\n variantStyle=\"white\"\n size=\"large\"\n ariaLabel=\"Mes siguiente\"\n [disabled]=\"disabled()\"\n (clicked)=\"onNext()\"\n />\n} @else {\n <span class=\"sui-date-selector__placeholder\" aria-hidden=\"true\"></span>\n}\n","import {\n addMonths,\n endOfMonth,\n endOfWeek,\n endOfYear,\n format,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n isWithinInterval,\n startOfDay,\n startOfMonth,\n startOfWeek,\n startOfYear,\n subDays,\n subMonths,\n subYears,\n} from 'date-fns';\nimport { es } from 'date-fns/locale';\n\n/* ═══ SUI Datepicker — utilities ═════════════════════════════════════════\n * Calendar grid generation, range math, preset resolvers.\n * Usa date-fns (4.1) con locale 'es' (Lunes-Domingo, \"Ene/Feb/...\").\n * ══════════════════════════════════════════════════════════════════════ */\n\nexport type DatepickerPresetId =\n | 'today'\n | 'last-7'\n | 'last-30'\n | 'last-3-months'\n | 'last-12-months'\n | 'month-to-date'\n | 'year-to-date'\n | 'all-time';\n\nexport interface DatepickerPreset {\n id: DatepickerPresetId;\n label: string;\n /** Resolves to a [start, end] range. `null` for all-time. */\n resolve: (today: Date) => [Date, Date] | [null, null];\n}\n\nexport const DEFAULT_PRESETS: DatepickerPreset[] = [\n { id: 'today', label: 'Hoy', resolve: (t) => [startOfDay(t), startOfDay(t)] },\n { id: 'last-7', label: 'Últimos 7 días', resolve: (t) => [startOfDay(subDays(t, 6)), startOfDay(t)] },\n { id: 'last-30', label: 'Últimos 30 días', resolve: (t) => [startOfDay(subDays(t, 29)), startOfDay(t)] },\n { id: 'last-3-months', label: 'Últimos 3 meses', resolve: (t) => [startOfDay(subMonths(t, 3)), startOfDay(t)] },\n { id: 'last-12-months', label: 'Últimos 12 meses', resolve: (t) => [startOfDay(subYears(t, 1)), startOfDay(t)] },\n { id: 'month-to-date', label: 'Mes en curso', resolve: (t) => [startOfMonth(t), startOfDay(t)] },\n { id: 'year-to-date', label: 'Año en curso', resolve: (t) => [startOfYear(t), startOfDay(t)] },\n { id: 'all-time', label: 'Todo el tiempo', resolve: () => [null, null] },\n];\n\nexport interface CalendarCell {\n date: Date;\n /** Día del mes (1-31) */\n day: number;\n /** True si pertenece al mes que se está mostrando (no overflow week) */\n inCurrentMonth: boolean;\n /** True si es la fecha de hoy */\n isToday: boolean;\n /** True si está fuera del min/max range */\n disabled: boolean;\n /** Ya seleccionado individualmente (mode date) o extremo del range */\n selected: boolean;\n /** En modo range: dentro del rango [start..end] (inclusive) */\n inRange: boolean;\n /** Inicio del range (para apply rounded-left) */\n isRangeStart: boolean;\n /** Final del range (para apply rounded-right) */\n isRangeEnd: boolean;\n /** Tiene marker dot (Figma 442:1473 etc.) — fecha con evento/pedido/disponibilidad */\n marked: boolean;\n}\n\n/**\n * Genera el grid de 6 semanas × 7 días (42 celdas) para el mes.\n * Incluye días del mes anterior/siguiente para llenar la primera/última semana\n * (estilo calendario tradicional). Locale ES → semana empieza Lunes.\n */\nexport function buildCalendarGrid(\n monthAnchor: Date,\n options: {\n today: Date;\n selected?: Date | null;\n rangeStart?: Date | null;\n rangeEnd?: Date | null;\n min?: Date | null;\n max?: Date | null;\n /** Fechas con marker dot (Figma 442:1473) — eventos / pedidos / disponibilidad */\n marked?: readonly Date[];\n },\n): CalendarCell[] {\n const { today, selected, rangeStart, rangeEnd, min, max, marked = [] } = options;\n const startOfMonthDate = startOfMonth(monthAnchor);\n const endOfMonthDate = endOfMonth(monthAnchor);\n // Locale ES: semana empieza lunes (weekStartsOn = 1)\n const gridStart = startOfWeek(startOfMonthDate, { locale: es });\n const gridEnd = endOfWeek(endOfMonthDate, { locale: es });\n\n const cells: CalendarCell[] = [];\n const cursor = new Date(gridStart);\n\n /* Generamos SIEMPRE 42 cells (6 weeks × 7 days). Si el mes cabe en 5 semanas\n (ej. junio 2026 que arranca lunes y termina martes — gridEnd da solo\n 35 cells), agregamos una semana más para mantener height constante\n entre meses. Sin esto, el right calendar en mode=range tendría menos\n altura que el left, dejando un \"empty card\" visible al final. */\n while (cursor <= gridEnd || cells.length < 42) {\n const date = startOfDay(new Date(cursor));\n const inCurrentMonth = isSameMonth(date, monthAnchor);\n const isTodayCell = isSameDay(date, today);\n const isOutOfBounds =\n (!!min && isBefore(date, startOfDay(min))) ||\n (!!max && isAfter(date, startOfDay(max)));\n\n /* Decisión: out-of-month cells quedan disabled y SIN highlight de range/\n selected. Sino aparecen los mismos días en 2 calendars (ej. Feb 1-4\n grises en Enero + Feb 1-4 highlighted en Febrero) y confunde al user.\n Quedan visibles como ghost gris para preservar la grilla 6×7. */\n const isDisabled = isOutOfBounds || !inCurrentMonth;\n\n let isSelected = false;\n let inRange = false;\n let isRangeStart = false;\n let isRangeEnd = false;\n\n if (inCurrentMonth) {\n if (selected) {\n isSelected = isSameDay(date, selected);\n }\n if (rangeStart && rangeEnd) {\n const a = isBefore(rangeStart, rangeEnd) ? rangeStart : rangeEnd;\n const b = isBefore(rangeStart, rangeEnd) ? rangeEnd : rangeStart;\n isRangeStart = isSameDay(date, a);\n isRangeEnd = isSameDay(date, b);\n inRange = isWithinInterval(date, { start: startOfDay(a), end: startOfDay(b) });\n isSelected = isRangeStart || isRangeEnd;\n } else if (rangeStart) {\n isRangeStart = isSameDay(date, rangeStart);\n isSelected = isRangeStart;\n }\n }\n\n /* Marker dot: solo aplica a celdas del mes actual; out-of-month no muestra\n marker aunque la fecha matchee (preserva limpieza visual de la grilla). */\n const isMarked = inCurrentMonth && marked.some((m) => isSameDay(date, m));\n\n cells.push({\n date,\n day: date.getDate(),\n inCurrentMonth,\n isToday: isTodayCell,\n disabled: isDisabled,\n selected: isSelected,\n inRange,\n isRangeStart,\n isRangeEnd,\n marked: isMarked,\n });\n cursor.setDate(cursor.getDate() + 1);\n }\n return cells;\n}\n\n/** Etiquetas de días para el header del grid — locale ES (lunes-domingo). */\nexport const DAY_LABELS_ES: readonly string[] = ['LU', 'MA', 'MI', 'JU', 'VI', 'SÁ', 'DO'];\n\nexport function formatMonthYear(date: Date): string {\n return format(date, 'LLLL yyyy', { locale: es });\n}\n\nexport function formatDateShort(date: Date): string {\n return format(date, \"d 'de' MMM yyyy\", { locale: es });\n}\n\nexport function formatDateInput(date: Date): string {\n // Formato corto para input: \"12/05/2026\"\n return format(date, 'dd/MM/yyyy');\n}\n\nexport { addMonths, subMonths, isSameDay };\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * SUI Day Label — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 3118:24556 (\"Day Labels [1.1]\") — 1 variant (State=Default)\n *\n * Header column label del calendar grid — renderiza la inicial del día de la\n * semana (LU / MA / MI / JU / VI / SÁ / DO) arriba de cada columna de cells.\n *\n * EXACT (pulled from Figma 437:169):\n * Container: 40×40 frame, bg white-0, py-10, radius-10\n * Text: Inter Medium 14/20/-0.6%, color text-soft-400 (#a3a3a3), center\n * font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n * Width: w-40 (text wrapper)\n *\n * Usage:\n * <sui-day-label label=\"LU\" />\n * <sui-day-label label=\"LUN\" /> (acepta cualquier longitud)\n */\n@Component({\n selector: 'sui-day-label',\n templateUrl: './sui-day-label.html',\n styleUrl: './sui-day-label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[attr.role]': '\"columnheader\"' },\n})\nexport class SuiDayLabel {\n readonly label = input.required<string>();\n}\n","<span class=\"sui-day-label__text\">{{ label() }}</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\n\nexport type SuiDayCellType = 'basic' | 'range';\n\n/**\n * SUI Day Cell — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 437:175 (\"Day Cells [1.1]\") — 12 variants total\n * 2 types (Basic / Range) × 4 states × 2 marked\n *\n * Cada celda individual del calendar grid. Renderiza el número del día y\n * opcionalmente un marker dot (Figma 442:1473). Soporta los 4 estados +\n * 4 variantes de range (start / end / between / single-day range).\n *\n * EXACT (pulled from Figma):\n * Container:\n * 40×40 frame\n * py-10, radius-8\n * bg white-0 (default) / primary-base (active/selected)\n * text 14/20/-0.6% medium center w-40\n *\n * Marker dot:\n * absolute bottom-6, left-1/2, -translate-x-1/2\n * 3×3px, radius-50%\n * color: primary-base (default), white (active/selected), disabled-300 (disabled)\n *\n * Today indicator (project extension, no en Figma 437:175):\n * dot 4×4 abajo del número — gana sobre marker si misma fecha\n *\n * Type=Range cells (Figma 442:2279 type=Range — VERIFIED via MCP):\n * start: bg primary-base, text white, radius solo izquierda\n * end: bg primary-base, text white, radius solo derecha\n * in: bg primary-alpha-10 (token), text primary-base, sin radius\n * start+end (single-day range): bg primary-base, radius completo\n *\n * Estados (data-sui-state) — VERIFIED via MCP:\n * default → bg white-0, text sub-600 (437:174)\n * hover → bg weak-50, text strong-950 (437:176)\n * active → bg primary-base, text static-white (437:284)\n * disabled → text disabled-300, cursor not-allowed (437:290)\n *\n * NOTA hover: Figma 437:176 superpone un Cursor/Pointer (437:292, 24×24) que es\n * solo documentación de UX en el archivo — NO se renderea en el DOM.\n *\n * Usage:\n * <sui-day-cell day=\"14\" />\n * <sui-day-cell day=\"14\" [selected]=\"true\" />\n * <sui-day-cell day=\"14\" [marked]=\"true\" />\n * <sui-day-cell day=\"14\" type=\"range\" rangePosition=\"start\" />\n * <sui-day-cell day=\"14\" [disabled]=\"true\" />\n */\n@Component({\n selector: 'sui-day-cell',\n templateUrl: './sui-day-cell.html',\n styleUrl: './sui-day-cell.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-selected]': 'selected() ? \"\" : null',\n '[attr.data-sui-marked]': 'marked() ? \"\" : null',\n '[attr.data-sui-today]': 'today() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.data-sui-out-of-month]': 'outOfMonth() ? \"\" : null',\n '[attr.data-sui-range-position]': 'rangePosition() || null',\n },\n})\nexport class SuiDayCell {\n /** Número del día (1-31). Se acepta string para flexibilidad. */\n readonly day = input.required<number | string>();\n /** Type=Basic (default) o Range (entre extremos / extremo del range). */\n readonly type = input<SuiDayCellType>('basic');\n /** Position dentro del range — solo aplica si type=range. */\n readonly rangePosition = input<'start' | 'end' | 'in' | null>(null);\n /** Selected (mode date) o range extremo (start/end con bg primary). */\n readonly selected = input(false);\n /** Marker dot (evento / pedido / disponibilidad). */\n readonly marked = input(false);\n /** Today indicator (dot grande debajo del número). */\n readonly today = input(false);\n /** Disabled — fuera de min/max o no clickeable. */\n readonly disabled = input(false);\n /** Out of current month — días del mes anterior/siguiente para llenar grid. */\n readonly outOfMonth = input(false);\n /** aria-label personalizado para el button (default \"Día {N}\"). */\n readonly ariaLabel = input<string | null>(null);\n\n readonly clicked = output<MouseEvent>();\n\n readonly resolvedAriaLabel = computed<string>(() =>\n this.ariaLabel() ?? `Día ${this.day()}`\n );\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<button\n type=\"button\"\n class=\"sui-day-cell__btn\"\n [disabled]=\"disabled() || null\"\n [attr.aria-selected]=\"selected() || null\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n role=\"gridcell\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n>\n <span class=\"sui-day-cell__num\">{{ day() }}</span>\n @if (marked() && !today()) {\n <span class=\"sui-day-cell__marker\" aria-hidden=\"true\"></span>\n }\n @if (today()) {\n <span class=\"sui-day-cell__today-dot\" aria-hidden=\"true\"></span>\n }\n</button>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\n\n/**\n * SUI Period Range — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 443:336 (\"Period Range [1.1]\") — 3 states (Default / Hover / Active)\n *\n * Preset chip usado en el sidebar del Range Picker (Today / Last 7 days / etc).\n * Renderiza un label clickeable que cuando se hace active aplica el preset.\n *\n * EXACT (pulled from Figma 443:341 — Active state):\n * Container:\n * w-168 (default), height-36\n * padding: py-8, pl-12, pr-8 (asimétrico — más espacio post-label)\n * radius-8\n * bg weak-50 (active) — Default/Hover ver PENDING VERIFY\n * items-center, justify-center\n *\n * Label:\n * Inter Medium 14/20/-0.6%, color text-strong-950\n * flex-[1_0_0] (expande)\n * font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Estados (VERIFIED via MCP — set 443:336):\n * - Default (443:335): bg white-0, text sub-600\n * - Hover (443:337): bg weak-50, text sub-600 (NO sube a strong-950)\n * - Active (443:341): bg weak-50, text strong-950\n * (El SUI usa `transparent` en Default en vez de white-0 — visualmente idéntico\n * sobre el panel blanco; se mantiene transparent para no tapar el panel.)\n *\n * Usage:\n * <sui-period-range label=\"Hoy\" [active]=\"false\" (clicked)=\"apply('today')\" />\n * <sui-period-range label=\"Últimos 7 días\" [active]=\"true\" />\n */\n@Component({\n selector: 'sui-period-range',\n templateUrl: './sui-period-range.html',\n styleUrl: './sui-period-range.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-active]': 'active() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiPeriodRange {\n /** Label visible del preset (ej. \"Hoy\", \"Último mes\"). */\n readonly label = input.required<string>();\n /** Estado active — bg weak-50 visible, indica preset seleccionado. */\n readonly active = input(false);\n /** Disabled — no clickeable. */\n readonly disabled = input(false);\n\n readonly clicked = output<void>();\n\n onClick(): void {\n if (this.disabled()) return;\n this.clicked.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"sui-period-range__btn\"\n [disabled]=\"disabled() || null\"\n [attr.aria-pressed]=\"active()\"\n (click)=\"onClick()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n>\n <span class=\"sui-period-range__label\">{{ label() }}</span>\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiDayLabel } from '../sui-day-label/sui-day-label';\nimport { SuiDayCell } from '../sui-day-cell/sui-day-cell';\nimport { SuiDateSelector } from '../sui-date-selector/sui-date-selector';\nimport { SuiPeriodRange } from '../sui-period-range/sui-period-range';\nimport {\n CalendarCell,\n DAY_LABELS_ES,\n DEFAULT_PRESETS,\n DatepickerPreset,\n DatepickerPresetId,\n addMonths,\n buildCalendarGrid,\n formatDateInput,\n formatDateShort,\n formatMonthYear,\n isSameDay,\n subMonths,\n} from './datepicker-utils';\n\nexport type SuiDatepickerMode = 'date' | 'range';\nexport type SuiDatepickerCalendars = 1 | 2;\n\nexport interface SuiDateRange {\n start: Date | null;\n end: Date | null;\n}\n\n/**\n * Fila de 7 celdas + metadata de la banda de rango continua.\n *\n * Figma (446:7412 / nodos 442:745/753/...): cuando una fila contiene celdas\n * dentro del rango, el bg primary-alpha-10 se pinta como UNA franja continua a\n * nivel de fila (cubriendo los gap-8 entre celdas), con esquinas redondeadas en\n * los extremos reales del rango. El SUI replica esto pintando la banda en el\n * wrapper `.sui-datepicker__day-row` (NO en cada celda) — así no quedan huecos\n * de 8px entre las celdas in-range adyacentes.\n */\nexport interface CalendarRow {\n cells: CalendarCell[];\n /** Hay al menos una celda inRange en esta fila → renderiza banda. */\n hasBand: boolean;\n /** Índice (0-6) de la primera celda inRange de la fila. */\n bandStart: number;\n /** Índice (0-6) de la última celda inRange de la fila. */\n bandEnd: number;\n /** La banda arranca en el start real del rango (esquina izq redondeada). */\n bandRoundLeft: boolean;\n /** La banda termina en el end real del rango (esquina der redondeada). */\n bandRoundRight: boolean;\n}\n\n/**\n * SUI Datepicker — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component_set: 446:7414 (Date & Range Picker [1.1]) — VERIFIED via MCP\n * Sub-piezas pulled:\n * - 437:174 Day Cell Default\n * - 437:284 Day Cell Active\n * - 437:157 Date Selector header\n * - 443:341 Period Range chip Active\n *\n * EXACT (pulled from Figma — VERIFIED via MCP 2026-05-29):\n * - Date Picker container (446:7413): 368×432, radius-20, border soft-200,\n * shadow-medium. Items wrapper (442:1858): p-20, gap-8, border-b.\n * - Range Picker container (446:7412): 936×432, radius-20. Sidebar\n * Time Filter (442:2362): w-200, pt-20 px-16 pb-2, gap-8, border-r.\n * - Day Cell: py-10, radius-8, w-40 button text (flex-[1_0_0] en Figma).\n * - Day Cell Default: bg white-0, text sub-600 / Active: primary-base + white.\n * - Day Cell Range \"in\": row con bg primary-alpha-10, cells text primary-base.\n * - Date Selector: w-288, p-6, gap-6, radius-8, bg weak-50, text sub-600.\n * - Period Range chip: w-168, py-8 pl-12 pr-8, radius-8; Active bg weak-50.\n * - Day labels (442:1861): py-10, radius-10, bg white-0, text soft-400, w-40.\n * - Footer single (442:1908): gap-16 p-16, botones flex-[1_0_0] 50/50 sin hint.\n * - Footer range (442:2316): gap-16 pl-24 pr-16 py-16, hint + Cancel/Apply w-108.\n *\n * COLOR MAPPING (Figma → tokens):\n * bg/white-0 → --sui-bg-white-0\n * bg/weak-50 → --sui-bg-weak-50\n * text/sub-600 → --sui-text-sub-600\n * text/strong-950 → --sui-text-strong-950\n * text/soft-400 → --sui-text-soft-400\n * text/disabled-300→ --sui-text-disabled-300\n * primary-base (#335cff) → --sui-primary-base (BRAND OVERRIDE: #fa7319 orange)\n * alpha/primary-alpha-10 (#476cff1a) → --sui-primary-alpha-10 (#fa73191a override)\n * static-white → #fff\n * radius-8/10/20 → --sui-radius-8 / -10 / -20\n * shadow/medium → --sui-shadow-medium\n *\n * PROJECT EXTENSIONS (no en Figma — preservadas):\n * - Trigger input + popover (Figma solo muestra el panel del calendar).\n * - [inline], [calendars]=1|2, [markedDates], [min]/[max], today-dot.\n * - Mobile (<768px): fuerza 1 calendar + presets en fila scrollable horizontal.\n * - Layout interno usa width fijo 280px (7×40) en vez de flex-[1_0_0] de\n * Figma — adaptación para flex-wrap consistente con custom elements Angular.\n *\n * Form integration:\n * - mode='date' → ControlValueAccessor de tipo Date | null\n * - mode='range' → ControlValueAccessor de tipo SuiDateRange ({start, end} | null)\n *\n * Trigger UX:\n * - Default: input + icono calendario que abre popover (desktop) o sheet (mobile)\n * - Inline: pasar [inline]=\"true\" para renderear el calendar SIN trigger\n */\n@Component({\n selector: 'sui-datepicker',\n standalone: true,\n templateUrl: './sui-datepicker.html',\n styleUrl: './sui-datepicker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiButton, SuiDayLabel, SuiDayCell, SuiDateSelector, SuiPeriodRange],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiDatepicker),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-mode]': 'mode()',\n '[attr.data-sui-open]': 'open() ? \"\" : null',\n '[attr.data-sui-calendars]': 'effectiveCalendars()',\n },\n})\nexport class SuiDatepicker implements ControlValueAccessor {\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly mode = input<SuiDatepickerMode>('date');\n /**\n * Cantidad de calendarios visibles en mode='range'.\n * - `2` (default): dos meses lado a lado (ej. May + Jun) — Figma 936×432\n * - `1`: un solo calendario; user navega prev/next para cambiar mes\n * En mobile (≤767px) se fuerza `1` independiente del prop (no cabe lado a lado).\n * Para mode='date' siempre es 1 (este prop solo afecta range).\n */\n readonly calendars = input<SuiDatepickerCalendars>(2);\n /** Renderiza el calendar inline (sin trigger ni popover). */\n readonly inline = input(false);\n /** Placeholder del input cuando no hay valor seleccionado. */\n readonly placeholder = input('Seleccionar fecha');\n /** Si true, muestra Cancel/Apply en el footer. Range siempre lo muestra. */\n readonly showFooter = input(true);\n readonly disabled = input(false);\n /** Min y max permitidos. */\n readonly min = input<Date | null>(null);\n readonly max = input<Date | null>(null);\n /** Lista de presets para mode=range. Por default los 8 estándar. */\n readonly presets = input<DatepickerPreset[]>(DEFAULT_PRESETS);\n /**\n * Fechas a marcar con un dot indicador (Figma 442:1473 — variantes Marked\n * de Day Cell). Útil para mostrar fechas con eventos, pedidos, disponibilidad.\n * El matching es por mismo día (ignora time-of-day). Solo las fechas que caen\n * en el mes visible se renderizan con marker.\n */\n readonly markedDates = input<readonly Date[]>([]);\n\n // ── Internal state ─────────────────────────────────────────────────\n /** Valor actual — Date para mode=date, SuiDateRange para mode=range. */\n readonly value = model<Date | SuiDateRange | null>(null);\n\n /** Mes ancla para el calendar grid. Mode=range usa este como mes izquierdo;\n el derecho es +1 mes. */\n readonly anchorMonth = signal<Date>(new Date());\n\n /** Selected date (mode=date) — staged hasta Apply. */\n readonly stagedDate = signal<Date | null>(null);\n\n /** Range staged (mode=range) — empieza vacío, se setea al click 1 (start),\n se completa al click 2 (end). */\n readonly stagedRange = signal<SuiDateRange>({ start: null, end: null });\n\n /** Preset activo (mode=range) — `null` significa custom range. */\n readonly activePreset = signal<DatepickerPresetId | null>(null);\n\n /** Popover/sheet abierto. */\n readonly open = signal(false);\n\n /** Disable from FormControl.disable() */\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** Mobile detection (≤767px) — forzamos 1 calendario en mobile aunque calendars=2. */\n private readonly _isMobile = signal(this._detectMobile());\n\n /**\n * Cantidad de calendarios EFECTIVA (después de aplicar mobile override).\n * - mode='date' siempre 1 (el prop solo aplica a range)\n * - mode='range' + mobile → 1\n * - mode='range' + desktop → respeta el prop\n */\n readonly effectiveCalendars = computed<SuiDatepickerCalendars>(() => {\n if (this.mode() === 'date') return 1;\n if (this._isMobile()) return 1;\n return this.calendars();\n });\n\n // ── Form callbacks ─────────────────────────────────────────────────\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n // Mantener anchorMonth sincronizado con el valor (al abrir, navegar al mes del valor)\n effect(() => {\n const v = this.value();\n if (!v) return;\n if (v instanceof Date) this.anchorMonth.set(new Date(v.getFullYear(), v.getMonth(), 1));\n else if (v.start) this.anchorMonth.set(new Date(v.start.getFullYear(), v.start.getMonth(), 1));\n });\n\n // Listener de viewport para mobile/desktop switch (≤767px = mobile).\n if (typeof window !== 'undefined' && typeof window.matchMedia === 'function') {\n const mql = window.matchMedia('(max-width: 767px)');\n const handler = (ev: MediaQueryListEvent) => this._isMobile.set(ev.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n }\n\n private _detectMobile(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(max-width: 767px)').matches;\n }\n\n // ── Derived state ──────────────────────────────────────────────────\n readonly today = signal(new Date());\n\n readonly leftMonthLabel = computed(() => formatMonthYear(this.anchorMonth()));\n readonly rightMonthLabel = computed(() => formatMonthYear(addMonths(this.anchorMonth(), 1)));\n\n readonly leftCells = computed<CalendarCell[]>(() => {\n return buildCalendarGrid(this.anchorMonth(), {\n today: this.today(),\n selected: this.mode() === 'date' ? this.stagedDate() : null,\n rangeStart: this.mode() === 'range' ? this.stagedRange().start : null,\n rangeEnd: this.mode() === 'range' ? this.stagedRange().end : null,\n min: this.min(),\n max: this.max(),\n marked: this.markedDates(),\n });\n });\n\n readonly rightCells = computed<CalendarCell[]>(() => {\n if (this.mode() !== 'range') return [];\n if (this.effectiveCalendars() === 1) return []; // No segundo calendario en 1-cal layout\n return buildCalendarGrid(addMonths(this.anchorMonth(), 1), {\n today: this.today(),\n selected: null,\n rangeStart: this.stagedRange().start,\n rangeEnd: this.stagedRange().end,\n min: this.min(),\n max: this.max(),\n marked: this.markedDates(),\n });\n });\n\n /** Filas (6×7) del calendar izquierdo con metadata de banda de rango. */\n readonly leftRows = computed<CalendarRow[]>(() => this._toRows(this.leftCells()));\n\n /** Filas del calendar derecho (mode=range, 2 calendarios). */\n readonly rightRows = computed<CalendarRow[]>(() => this._toRows(this.rightCells()));\n\n /**\n * Agrupa las 42 celdas en 6 filas de 7 y deriva la banda de rango continua\n * por fila (Figma 446:7412 — franja alpha-10 a nivel de fila, ver CalendarRow).\n * Solo aplica en mode=range; en mode=date las bandas quedan inertes (hasBand=false).\n */\n private _toRows(cells: CalendarCell[]): CalendarRow[] {\n const rows: CalendarRow[] = [];\n const isRange = this.mode() === 'range';\n for (let i = 0; i < cells.length; i += 7) {\n const slice = cells.slice(i, i + 7);\n let bandStart = -1;\n let bandEnd = -1;\n if (isRange) {\n for (let j = 0; j < slice.length; j++) {\n if (slice[j].inRange) {\n if (bandStart === -1) bandStart = j;\n bandEnd = j;\n }\n }\n }\n const hasBand = bandStart !== -1;\n rows.push({\n cells: slice,\n hasBand,\n bandStart,\n bandEnd,\n // Esquina izq redondeada solo si la banda arranca en el start real del rango.\n bandRoundLeft: hasBand && slice[bandStart].isRangeStart,\n // Esquina der redondeada solo si la banda termina en el end real del rango.\n bandRoundRight: hasBand && slice[bandEnd].isRangeEnd,\n });\n }\n return rows;\n }\n\n readonly dayLabels = DAY_LABELS_ES;\n\n /** Texto del trigger input. */\n readonly triggerText = computed(() => {\n const v = this.value();\n if (!v) return this.placeholder();\n if (v instanceof Date) return formatDateInput(v);\n if (v.start && v.end) return `${formatDateShort(v.start)} – ${formatDateShort(v.end)}`;\n if (v.start) return formatDateShort(v.start);\n return this.placeholder();\n });\n\n /** Texto del Range hint del footer. */\n readonly rangeHint = computed(() => {\n const r = this.stagedRange();\n if (!r.start) return null;\n if (!r.end) return `Range: ${formatDateShort(r.start)} – …`;\n return `Range: ${formatDateShort(r.start)} – ${formatDateShort(r.end)}`;\n });\n\n // ── Actions ────────────────────────────────────────────────────────\n toggle(): void {\n if (this.isDisabled()) return;\n if (this.open()) {\n this.cancel();\n } else {\n this.openPopover();\n }\n }\n\n openPopover(): void {\n if (this.isDisabled()) return;\n // Hidratar staged desde value() actual\n const v = this.value();\n if (this.mode() === 'date') {\n this.stagedDate.set(v instanceof Date ? v : null);\n } else if (v && !(v instanceof Date)) {\n this.stagedRange.set({ start: v.start, end: v.end });\n } else {\n this.stagedRange.set({ start: null, end: null });\n }\n this.activePreset.set(null);\n this.open.set(true);\n }\n\n cancel(): void {\n this.open.set(false);\n this.activePreset.set(null);\n }\n\n apply(): void {\n if (this.mode() === 'date') {\n const d = this.stagedDate();\n this.value.set(d);\n this._onChange(d);\n } else {\n const r = this.stagedRange();\n this.value.set({ start: r.start, end: r.end });\n this._onChange({ start: r.start, end: r.end });\n }\n this._onTouched();\n this.open.set(false);\n }\n\n selectCell(cell: CalendarCell): void {\n if (cell.disabled) return;\n if (this.mode() === 'date') {\n this.stagedDate.set(cell.date);\n // Si !showFooter, apply inmediato (UX más rápido para single date)\n if (!this.showFooter()) {\n this.value.set(cell.date);\n this._onChange(cell.date);\n this._onTouched();\n this.open.set(false);\n }\n return;\n }\n\n // Range mode\n const r = this.stagedRange();\n if (!r.start || (r.start && r.end)) {\n // Iniciar nuevo range\n this.stagedRange.set({ start: cell.date, end: null });\n this.activePreset.set(null);\n } else {\n // Cerrar range — ordenar si end < start\n const start = r.start;\n const end = cell.date;\n if (end < start) {\n this.stagedRange.set({ start: end, end: start });\n } else {\n this.stagedRange.set({ start, end });\n }\n this.activePreset.set(null);\n }\n }\n\n prevMonth(): void {\n this.anchorMonth.update(m => subMonths(m, 1));\n }\n\n nextMonth(): void {\n this.anchorMonth.update(m => addMonths(m, 1));\n }\n\n selectPreset(p: DatepickerPreset): void {\n const [start, end] = p.resolve(new Date());\n // Clamp contra min/max — si el consumer setea [min] o [max], los presets\n // deben respetarlos (sino el resolver podría devolver fechas fuera del\n // rango permitido y luego selectCell las bloquearía igual).\n const min = this.min();\n const max = this.max();\n const clampedStart = start && min && start < min ? min : start;\n const clampedEnd = end && max && end > max ? max : end;\n this.stagedRange.set({ start: clampedStart, end: clampedEnd });\n this.activePreset.set(p.id);\n if (clampedStart) this.anchorMonth.set(new Date(clampedStart.getFullYear(), clampedStart.getMonth(), 1));\n }\n\n // ── Outside click closes popover ───────────────────────────────────\n @HostListener('document:pointerdown', ['$event'])\n onDocPointerDown(ev: Event): void {\n if (!this.open()) return;\n const target = ev.target as Node | null;\n if (target && this.hostEl.nativeElement.contains(target)) return;\n this.cancel();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.open()) this.cancel();\n }\n\n // ── ControlValueAccessor ───────────────────────────────────────────\n writeValue(v: Date | SuiDateRange | null): void {\n if (v === null || v === undefined) {\n this.value.set(null);\n return;\n }\n this.value.set(v);\n }\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n\n // ── Helpers para template ─────────────────────────────────────────\n trackCell(_idx: number, cell: CalendarCell): string {\n return cell.date.toISOString();\n }\n\n trackRow(idx: number, row: CalendarRow): string {\n return row.cells[0]?.date.toISOString() ?? String(idx);\n }\n\n trackPreset(_idx: number, p: DatepickerPreset): string {\n return p.id;\n }\n\n isPresetActive(id: DatepickerPresetId): boolean {\n return this.activePreset() === id;\n }\n\n /** Deriva la rangePosition de un cell para pasar a <sui-day-cell>.\n * - 'start' → extremo izquierdo del rango\n * - 'end' → extremo derecho del rango\n * - 'in' → entre extremos (no inclusive)\n * - null → fuera de range o mode=date */\n cellRangePosition(cell: CalendarCell): 'start' | 'end' | 'in' | null {\n if (this.mode() !== 'range') return null;\n if (cell.isRangeStart) return 'start';\n if (cell.isRangeEnd) return 'end';\n if (cell.inRange && !cell.selected) return 'in';\n return null;\n }\n}\n","<!-- Trigger (input + icono calendario) — solo si no es inline -->\n@if (!inline()) {\n <button\n type=\"button\"\n class=\"sui-datepicker__trigger\"\n [disabled]=\"isDisabled()\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-haspopup]=\"true\"\n (click)=\"toggle()\"\n >\n <sui-icon class=\"sui-datepicker__trigger-icon\" name=\"calendar-line\" [size]=\"20\" />\n <span class=\"sui-datepicker__trigger-text\" [class.sui-datepicker__trigger-text--placeholder]=\"!value()\">\n {{ triggerText() }}\n </span>\n <sui-icon class=\"sui-datepicker__trigger-chevron\" name=\"arrow-down-s-line\" [size]=\"20\" />\n </button>\n}\n\n<!-- Popover panel — visible cuando open() o inline() -->\n@if (inline() || open()) {\n <div class=\"sui-datepicker__panel\"\n [class.sui-datepicker__panel--inline]=\"inline()\"\n [class.sui-datepicker__panel--range]=\"mode() === 'range'\"\n role=\"dialog\">\n <!-- Sidebar de presets — solo en mode=range (usa <sui-period-range>) -->\n @if (mode() === 'range') {\n <aside class=\"sui-datepicker__presets\" aria-label=\"Rangos predefinidos\">\n @for (p of presets(); track trackPreset($index, p)) {\n <sui-period-range\n [label]=\"p.label\"\n [active]=\"isPresetActive(p.id)\"\n (clicked)=\"selectPreset(p)\"\n />\n }\n </aside>\n }\n\n <!-- Contenido principal: 1 o 2 calendarios + footer -->\n <div class=\"sui-datepicker__content\">\n <div class=\"sui-datepicker__calendars\">\n <!-- Calendario izquierdo (siempre visible) -->\n <div class=\"sui-datepicker__calendar\">\n <sui-date-selector\n [label]=\"leftMonthLabel()\"\n [leftIcon]=\"true\"\n [rightIcon]=\"effectiveCalendars() === 1\"\n (prev)=\"prevMonth()\"\n (next)=\"nextMonth()\"\n />\n\n <div class=\"sui-datepicker__day-labels\" role=\"row\">\n @for (label of dayLabels; track label) {\n <sui-day-label [label]=\"label\" />\n }\n </div>\n\n <div class=\"sui-datepicker__day-grid\" role=\"grid\">\n @for (row of leftRows(); track trackRow($index, row)) {\n <div class=\"sui-datepicker__day-row\" role=\"row\">\n @if (row.hasBand) {\n <span\n class=\"sui-datepicker__range-band\"\n [class.sui-datepicker__range-band--round-left]=\"row.bandRoundLeft\"\n [class.sui-datepicker__range-band--round-right]=\"row.bandRoundRight\"\n [style.--sui-band-start]=\"row.bandStart\"\n [style.--sui-band-end]=\"row.bandEnd\"\n aria-hidden=\"true\"\n ></span>\n }\n @for (cell of row.cells; track trackCell($index, cell)) {\n <sui-day-cell\n [day]=\"cell.day\"\n [type]=\"mode() === 'range' ? 'range' : 'basic'\"\n [selected]=\"mode() === 'date' && cell.selected\"\n [rangePosition]=\"cellRangePosition(cell)\"\n [marked]=\"cell.marked\"\n [today]=\"cell.isToday\"\n [disabled]=\"cell.disabled\"\n [outOfMonth]=\"!cell.inCurrentMonth\"\n (clicked)=\"selectCell(cell)\"\n />\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Calendario derecho — solo en mode=range con effectiveCalendars=2 (desktop) -->\n @if (mode() === 'range' && effectiveCalendars() === 2) {\n <div class=\"sui-datepicker__calendar sui-datepicker__calendar--right\">\n <sui-date-selector\n [label]=\"rightMonthLabel()\"\n [leftIcon]=\"false\"\n [rightIcon]=\"true\"\n (next)=\"nextMonth()\"\n />\n\n <div class=\"sui-datepicker__day-labels\" role=\"row\">\n @for (label of dayLabels; track label) {\n <sui-day-label [label]=\"label\" />\n }\n </div>\n\n <div class=\"sui-datepicker__day-grid\" role=\"grid\">\n @for (row of rightRows(); track trackRow($index, row)) {\n <div class=\"sui-datepicker__day-row\" role=\"row\">\n @if (row.hasBand) {\n <span\n class=\"sui-datepicker__range-band\"\n [class.sui-datepicker__range-band--round-left]=\"row.bandRoundLeft\"\n [class.sui-datepicker__range-band--round-right]=\"row.bandRoundRight\"\n [style.--sui-band-start]=\"row.bandStart\"\n [style.--sui-band-end]=\"row.bandEnd\"\n aria-hidden=\"true\"\n ></span>\n }\n @for (cell of row.cells; track trackCell($index, cell)) {\n <sui-day-cell\n [day]=\"cell.day\"\n [type]=\"mode() === 'range' ? 'range' : 'basic'\"\n [selected]=\"false\"\n [rangePosition]=\"cellRangePosition(cell)\"\n [marked]=\"cell.marked\"\n [today]=\"cell.isToday\"\n [disabled]=\"cell.disabled\"\n [outOfMonth]=\"!cell.inCurrentMonth\"\n (clicked)=\"selectCell(cell)\"\n />\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Footer con Cancel + Apply (Range siempre lo muestra) -->\n @if (showFooter() || mode() === 'range') {\n <footer class=\"sui-datepicker__footer\">\n @if (mode() === 'range' && rangeHint(); as hint) {\n <span class=\"sui-datepicker__range-hint\">{{ hint }}</span>\n }\n <div class=\"sui-datepicker__footer-actions\">\n <sui-button variant=\"stroke\" color=\"neutral\" size=\"small\" type=\"button\" (click)=\"cancel()\">\n Cancel\n </sui-button>\n <sui-button variant=\"filled\" color=\"primary\" size=\"small\" type=\"button\" (click)=\"apply()\">\n Apply\n </sui-button>\n </div>\n </footer>\n }\n </div>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\nexport type SuiDividerOrientation = 'horizontal' | 'vertical';\n\n@Component({\n selector: 'sui-divider',\n standalone: true,\n templateUrl: './sui-divider.html',\n styleUrl: './sui-divider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': '\"separator\"',\n '[attr.aria-orientation]': 'orientation()',\n '[class.sui-divider--vertical]': 'orientation() === \"vertical\"',\n },\n})\nexport class SuiDivider {\n readonly orientation = input<SuiDividerOrientation>('horizontal');\n}\n","","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * SUI Switch — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * **Patrón \"controlled\" (post 2026-05-17):**\n *\n * Antes usaba `model(false)` que hacía two-way binding automático. El problema:\n * cuando el user togglea (child → parent → child via two-way) Y el parent\n * quiere revertir el cambio en el mismo tick (ej. mostrar un priming modal),\n * Angular `model` tiene anti-loop protection que ignora el set del parent.\n * Resultado: el DOM queda en true aunque el signal del parent diga false.\n *\n * Ahora usa `input + output` separados. El componente es **controlled** —\n * NO muta su state internamente al click. Solo emite `checkedChange` con la\n * intención. El parent decide si setea el signal vía el binding `[(checked)]`\n * o si lo ignora. Cero anti-loop protection. Cero state desincronizado.\n *\n * Compatibilidad: `[(checked)]=\"signal\"` sigue funcionando porque Angular\n * permite two-way sintax con `input + output` separados.\n *\n * CVA: cuando se usa con Reactive Forms (formControlName / formControl), el\n * form setea el value via `writeValue(v)`. Acá usamos un signal interno\n * `_cvaValue` como fallback display cuando NO hay binding `[checked]` activo.\n */\nexport type SuiSwitchSize = 'medium' | 'large' | 'xlarge';\n@Component({\n selector: 'sui-switch',\n templateUrl: './sui-switch.html',\n styleUrl: './sui-switch.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiSwitch),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-checked]': 'effectiveChecked() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.role]': '\"switch\"',\n '[attr.aria-checked]': 'effectiveChecked() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'isDisabled() ? \"true\" : null',\n '[attr.tabindex]': 'isDisabled() ? \"-1\" : \"0\"',\n '(click)': 'onToggle($event)',\n '(keydown.space)': 'onToggle($event)',\n '(keydown.enter)': 'onToggle($event)',\n /* iOS WKWebView fix — ver CLAUDE.md \"iOS :active stuck en custom buttons\". */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiSwitch implements ControlValueAccessor {\n readonly size = input<SuiSwitchSize>('medium');\n readonly checked = input(false);\n readonly checkedChange = output<boolean>();\n readonly disabled = input(false);\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** CVA buffer — usado SOLO en form mode (formControlName/formControl).\n * Activado cuando `registerOnChange` se llama (Angular Forms lo hace). */\n private readonly _cvaValue = signal(false);\n private readonly _useCvaValue = signal(false);\n\n /** Estado VISIBLE — input del parent en uso normal, _cvaValue en form mode. */\n readonly effectiveChecked = computed(() => {\n if (this._useCvaValue()) return this._cvaValue();\n return this.checked();\n });\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n onToggle(e: Event): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n const next = !this.effectiveChecked();\n /* Patrón controlled: SOLO emitir intent. NO mutamos el input directamente\n (es input, no model). En form mode, actualizamos el buffer CVA porque\n los reactive forms no llaman writeValue después de un user change. */\n if (this._useCvaValue()) {\n this._cvaValue.set(next);\n }\n this.checkedChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n writeValue(v: boolean): void {\n this._cvaValue.set(!!v);\n this._useCvaValue.set(true);\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<span class=\"sui-switch__track\"></span>\n<span class=\"sui-switch__thumb\">\n <span class=\"sui-switch__dot\" aria-hidden=\"true\"></span>\n</span>\n","import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiCheckbox } from '../sui-checkbox/sui-checkbox';\nimport { SuiSwitch } from '../sui-switch/sui-switch';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\n\nexport type SuiDrawerFooterType =\n | 'stretch'\n | 'basic'\n | 'checkbox'\n | 'toggle'\n | 'stepper'\n | 'link-button';\n\n/**\n * SUI Drawer Footer — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 4096:21416 (\"Drawer Footer [1.1]\") — 6 variants\n * Type: stretch / basic / checkbox / toggle / stepper / link-button\n *\n * Anatomy EXACT (pulled from Figma):\n * Container bg-white-0 padding 20, flex items-center, border-top 1px stroke-soft-200\n * width 100%, height 80\n * Gap base 0 (stretch/basic), 16 (checkbox/toggle/stepper/link)\n *\n * stretch 2 buttons, cada uno flex-1 (50% del width), gap 16\n * basic 2 buttons, alineados a la derecha (justify-end), gap 16\n * checkbox Checkbox label + actions (2 buttons) a la derecha\n * toggle Switch + label + actions a la derecha\n * stepper 3 dot stepper (8×8 cada uno) + actions a la derecha\n * link-button Underlined link button gray/medium (14/20/-0.6%, text/sub-600)\n * + actions a la derecha\n *\n * Buttons primary (filled primary-base) + secondary (stroke + bg-white)\n * Padding 10, gap 4, radius 10, shadow x-small (secondary)\n *\n * Token map:\n * bg/white-0 → --sui-bg-white-0\n * stroke/soft-200 → --sui-stroke-soft-200\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * primary-base → --sui-primary-base\n *\n * Token map (radius):\n * radius-full → --sui-radius-full (stepper dots)\n *\n * Decisiones de homologación (vs reporte Drawer):\n * - primaryDisabled / secondaryDisabled: NO existen como variant en Figma,\n * pero se PRESERVAN — necesarios para flujos con validación. extraFeature.\n * - stepperCurrent / stepperTotal: Figma es decorativo (3 dots fijos); el SUI\n * los hace dinámicos/multi-step real. Se PRESERVAN (mejora funcional).\n * - type='link-button' con linkLabel vacío ('') ahora NO renderiza el link\n * (antes renderizaba un sui-link-button vacío). Corrige openQuestion del\n * reporte sin tocar API pública (mismo input/output/type).\n *\n * Confirmado contra Figma live (2026-05-29):\n * - Stepper Dot [1.1] (479:14399): gap inter-dot = 10px exacto, dots 8×8,\n * activo = primary-base, inactivo = bg/soft-200. El SUI ya matchea.\n *\n * PENDING VERIFY (re-confirmar contra Figma live cuando MCP recupere):\n * - Hover/focus de los buttons: heredan de sui-button (no se tocan).\n *\n * Usage:\n * <sui-drawer-footer\n * type=\"stretch\"\n * primaryLabel=\"Continuar\"\n * secondaryLabel=\"Cancelar\"\n * (primaryClick)=\"save()\"\n * (secondaryClick)=\"cancel()\"\n * />\n *\n * <sui-drawer-footer\n * type=\"checkbox\"\n * checkboxLabel=\"No mostrar de nuevo\"\n * [(checkboxActive)]=\"dontShowAgain\"\n * primaryLabel=\"Continuar\"\n * (primaryClick)=\"save()\"\n * />\n *\n * <sui-drawer-footer\n * type=\"stepper\"\n * [stepperCurrent]=\"2\"\n * [stepperTotal]=\"5\"\n * primaryLabel=\"Siguiente\"\n * secondaryLabel=\"Atrás\"\n * />\n */\n@Component({\n selector: 'sui-drawer-footer',\n standalone: true,\n templateUrl: './sui-drawer-footer.html',\n styleUrl: './sui-drawer-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiButton, SuiCheckbox, SuiSwitch, SuiLinkButton],\n host: {\n '[attr.data-sui-type]': 'type()',\n },\n})\nexport class SuiDrawerFooter {\n readonly type = input<SuiDrawerFooterType>('stretch');\n\n /** Label del botón primario (filled primary-base). */\n readonly primaryLabel = input<string>('Continue');\n /** Label del botón secundario (stroke neutral). null = ocultar. */\n readonly secondaryLabel = input<string | null>('Cancel');\n\n /** Disabled state del botón primario. */\n readonly primaryDisabled = input(false);\n /** Disabled state del botón secundario. */\n readonly secondaryDisabled = input(false);\n\n // ── Type-specific inputs ────────────────────────────────────────────\n\n /** Label del checkbox (type='checkbox'). */\n readonly checkboxLabel = input<string>('');\n /** Two-way del checkbox state. */\n readonly checkboxActive = model(false);\n\n /** Label del switch (type='toggle'). */\n readonly toggleLabel = input<string>('');\n /** Two-way del switch state. */\n readonly toggleActive = model(false);\n\n /** Stepper actual (0-indexed, type='stepper'). */\n readonly stepperCurrent = input<number>(0);\n /** Total de steps (type='stepper'). Default 3. */\n readonly stepperTotal = input<number>(3);\n\n /** Label del link button (type='link-button'). */\n readonly linkLabel = input<string>('');\n\n // ── Outputs ─────────────────────────────────────────────────────────\n\n readonly primaryClick = output<Event>();\n readonly secondaryClick = output<Event>();\n readonly linkClick = output<MouseEvent>();\n\n /** Array de índices para el ngFor del stepper. */\n get stepperIndexes(): number[] {\n return Array.from({ length: Math.max(1, this.stepperTotal()) }, (_, i) => i);\n }\n\n onPrimary(event: Event): void {\n if (this.primaryDisabled()) return;\n this.primaryClick.emit(event);\n }\n\n onSecondary(event: Event): void {\n if (this.secondaryDisabled()) return;\n this.secondaryClick.emit(event);\n }\n\n onLink(event: MouseEvent): void {\n this.linkClick.emit(event);\n }\n}\n","<!-- Slot izquierdo (lo que va antes de los buttons) — varía por type -->\n@switch (type()) {\n @case ('checkbox') {\n <label class=\"sui-drawer-footer__inline\">\n <sui-checkbox\n [checked]=\"checkboxActive()\"\n (checkedChange)=\"checkboxActive.set($event)\"\n />\n <span class=\"sui-drawer-footer__inline-label\">{{ checkboxLabel() }}</span>\n </label>\n }\n\n @case ('toggle') {\n <label class=\"sui-drawer-footer__inline\">\n <sui-switch\n [checked]=\"toggleActive()\"\n (checkedChange)=\"toggleActive.set($event)\"\n />\n <span class=\"sui-drawer-footer__inline-label\">{{ toggleLabel() }}</span>\n </label>\n }\n\n @case ('stepper') {\n <div class=\"sui-drawer-footer__stepper\" role=\"progressbar\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"stepperTotal()\"\n [attr.aria-valuenow]=\"stepperCurrent() + 1\">\n @for (i of stepperIndexes; track i) {\n <span\n class=\"sui-drawer-footer__dot\"\n [class.sui-drawer-footer__dot--active]=\"i === stepperCurrent()\"\n aria-hidden=\"true\"\n ></span>\n }\n </div>\n }\n\n @case ('link-button') {\n @if (linkLabel()) {\n <sui-link-button\n variant=\"gray\"\n size=\"medium\"\n [underline]=\"true\"\n (clicked)=\"onLink($any($event))\"\n >{{ linkLabel() }}</sui-link-button>\n }\n }\n}\n\n<!-- Actions block (buttons) — siempre presente. En stretch/basic ocupa todo el\n row (con primary y secondary), en otros types va alineado a la derecha\n con flex-1. -->\n<div class=\"sui-drawer-footer__actions\">\n @if (secondaryLabel()) {\n <sui-button\n class=\"sui-drawer-footer__btn sui-drawer-footer__btn--secondary\"\n variant=\"stroke\"\n color=\"neutral\"\n [disabled]=\"secondaryDisabled()\"\n (clicked)=\"onSecondary($event)\"\n >{{ secondaryLabel() }}</sui-button>\n }\n <sui-button\n class=\"sui-drawer-footer__btn sui-drawer-footer__btn--primary\"\n variant=\"filled\"\n color=\"primary\"\n [disabled]=\"primaryDisabled()\"\n (clicked)=\"onPrimary($event)\"\n >{{ primaryLabel() }}</sui-button>\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\nexport type SuiDrawerHeaderType = 'basic' | 'left-icon';\nexport type SuiDrawerHeaderSize = 'small' | 'large' | 'xlarge';\n\n/**\n * SUI Drawer Header — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 3187:2897 (\"Drawer Header [1.1]\") — 4 variants\n * Type (basic / left-icon) × Size (small / large)\n *\n * Anatomy EXACT (pulled from Figma):\n * Container bg-white-0 padding 20, flex\n * Small (64px) items-center, gap-12\n * Large (88px) items-start, gap-16\n *\n * Title 18/24 medium strong-950, letter-spacing -1.5% (-0.27px @ 18px)\n * Description (L) 14/20 regular sub-600, letter-spacing -0.6%\n * Badge bg state/error/base, text white, 12/16 medium, p-2 rounded-full\n * Close button Figma 3187:5680 = Compact Button [1.1] (close-line 20px,\n * ghost). Homologado con <sui-compact-button variantStyle=\"ghost\"\n * size=\"large\"> — NO un <button> maqueta (canon CLAUDE.md).\n *\n * left-icon Small icon 24×24 (raw, no badge wrap)\n * left-icon Large icon-badge 48×48 con border-stroke-soft-200 + shadow x-small\n * + padding 12 + rounded-full (icon 24×24 dentro)\n *\n * Link Button (opcional, input `button=true` en Figma) — un Link Button\n * gray/medium/underlined (14/20/-0.6%, text/sub-600) entre el\n * content y el dismiss icon. Solo aparece en Basic+Small y\n * LeftIcon+Small en Figma. Homologado vía `linkLabel` +\n * `linkClick` (usa sui-link-button size=medium).\n *\n * Divider (opcional, posición=absolute bottom) — 1px stroke-soft-200\n *\n * Token map:\n * bg/white-0 → --sui-bg-white-0\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * stroke/soft-200 → --sui-stroke-soft-200\n * state/error/base → --sui-state-error-base\n * radius-6 → --sui-radius-6 (close button)\n * radius-full → --sui-radius-full (badge + icon-badge)\n * shadow x-small → --sui-regular-shadow-x-small (icon-badge frame)\n *\n * Badge: círculo 20×20 fijo en Figma (siempre muestra \"2\"). El SUI usa\n * min-width:20px + height:20px → para 1 dígito es un círculo 20×20 exacto;\n * para 2+ dígitos crece en width manteniendo height 20 (pill), comportamiento\n * DS estándar de un number-badge. NO se fuerza width:20px fijo para no recortar\n * números >= 10 (ver openQuestion del reporte).\n *\n * Confirmado contra Figma live (2026-05-29):\n * - Link Button SOLO existe en variants Small. El prop `button` solo está\n * en Basic+Small (3187:5673) y LeftIcon+Small; las variants Large\n * (3187:4549) NO lo tienen. El template gatea `linkLabel() && size()==='small'`.\n * - Link Button color = text/sub-600 (gray variant del sui-link-button).\n * - Posición: entre content y dismiss icon (orden de capas Figma confirmado).\n *\n * Close button hover/active/focus: los aporta sui-compact-button (ghost →\n * hover bg-weak-50, active bg-surface-800, focus-visible ring). Ya no se\n * replican a mano en este SCSS.\n *\n * Usage:\n * <sui-drawer-header title=\"Configuración\" (dismiss)=\"close()\" />\n *\n * <sui-drawer-header\n * type=\"left-icon\"\n * size=\"large\"\n * icon=\"history-line\"\n * title=\"Historial de pedidos\"\n * description=\"Últimos 30 días\"\n * [showDivider]=\"true\"\n * (dismiss)=\"close()\"\n * />\n */\n@Component({\n selector: 'sui-drawer-header',\n standalone: true,\n templateUrl: './sui-drawer-header.html',\n styleUrl: './sui-drawer-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiLinkButton, SuiCompactButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-divider]': 'showDivider() ? \"\" : null',\n },\n})\nexport class SuiDrawerHeader {\n readonly type = input<SuiDrawerHeaderType>('basic');\n readonly size = input<SuiDrawerHeaderSize>('small');\n\n readonly title = input<string>('');\n\n /** Descripción opcional (renderiza cuando size='large' o 'xlarge'). */\n readonly description = input<string | null>(null);\n\n /** RemixIcon name (sin 'ri-') para variant left-icon. */\n readonly icon = input<string | null>(null);\n\n /** Número del badge built-in al lado del title (style.error.base). null = no badge. */\n readonly badgeNumber = input<number | null>(null);\n\n /**\n * Label del Link Button inline del header (Figma input `button=true`).\n * Cuando es '' (default) NO se renderiza el link. Cualquier string lo muestra\n * entre el content y el dismiss icon — PERO solo cuando size='small', porque\n * Figma define el Link Button únicamente en Basic+Small / LeftIcon+Small\n * (las variants Large no tienen el prop `button`). Pasar linkLabel con\n * size='large' no renderiza nada (se gatea en el template).\n */\n readonly linkLabel = input<string>('');\n\n /** Muestra el close button trailing. Default true. */\n readonly showDismiss = input(true);\n\n /** Muestra divider 1px al fondo del header. Default false. */\n readonly showDivider = input(false);\n\n /** aria-label del close button. */\n readonly dismissAriaLabel = input<string>('Cerrar');\n\n /** Click en el close button. */\n readonly dismiss = output<MouseEvent>();\n\n /** Click en el Link Button inline (solo cuando linkLabel !== ''). */\n readonly linkClick = output<MouseEvent>();\n\n onDismiss(event: MouseEvent): void {\n event.stopPropagation();\n this.dismiss.emit(event);\n }\n\n onLink(event: MouseEvent): void {\n event.stopPropagation();\n this.linkClick.emit(event);\n }\n}\n","<!-- Leading icon (size=small: raw 24×24 · size=large: icon-badge 48×48) -->\n@if (type() === 'left-icon' && icon(); as i) {\n <div\n class=\"sui-drawer-header__leading\"\n [class.sui-drawer-header__leading--badge]=\"size() === 'large' || size() === 'xlarge'\"\n aria-hidden=\"true\"\n >\n <sui-icon [name]=\"i\" [size]=\"24\" />\n </div>\n}\n\n<!-- Title + (optional) description -->\n<div class=\"sui-drawer-header__content\">\n <div class=\"sui-drawer-header__title-row\">\n <h2 class=\"sui-drawer-header__title\">{{ title() }}</h2>\n @if (badgeNumber() !== null) {\n <span class=\"sui-drawer-header__badge\" aria-label=\"Badge\">{{ badgeNumber() }}</span>\n }\n </div>\n @if ((size() === 'large' || size() === 'xlarge') && description(); as desc) {\n <p class=\"sui-drawer-header__description\">{{ desc }}</p>\n }\n</div>\n\n<!-- Link Button inline (Figma input button=true · gray/small/underlined).\n Solo existe en Basic+Small / LeftIcon+Small en Figma (3187:5673 tiene\n prop `button`; 3187:4549 Large NO la tiene). Por eso se gatea a size=small. -->\n@if (linkLabel() && size() === 'small') {\n <sui-link-button\n class=\"sui-drawer-header__link\"\n variant=\"gray\"\n size=\"medium\"\n [underline]=\"true\"\n (clicked)=\"onLink($event)\"\n >{{ linkLabel() }}</sui-link-button>\n}\n\n<!-- Close button trailing — Figma 3187:5680 lo modela como Compact Button [1.1]\n (close-line 20px, ghost). Canon: sui-compact-button (ver CLAUDE.md \"close X\n en modales/headers\"), no un <button> maqueta. -->\n@if (showDismiss()) {\n <sui-compact-button\n class=\"sui-drawer-header__dismiss\"\n [attr.aria-label]=\"dismissAriaLabel()\"\n icon=\"close-line\"\n variantStyle=\"ghost\"\n size=\"large\"\n [ariaLabel]=\"dismissAriaLabel()\"\n (clicked)=\"onDismiss($event)\"\n />\n}\n\n<!-- Divider (absolute bottom) -->\n@if (showDivider()) {\n <span class=\"sui-drawer-header__divider\" aria-hidden=\"true\"></span>\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * SUI Dropdown Caption — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 414:8031 (\"Dropdown Misc Items [1.1]\") — variant Caption\n *\n * Texto pequeño (gray, soft-400) usado en el footer del dropdown menu o\n * entre groups como divider semántico. Casos típicos:\n * - \"v.1.5.69 · Terms & Conditions\"\n * - \"Last updated 5m ago\"\n * - \"Press Enter to add new\" como hint\n *\n * EXACT (pulled from Figma 414:8146):\n * Container:\n * bg white-0, p-8, w-320 (Figma — consumer override)\n * flex items-center, overflow-clip\n *\n * Text:\n * Inter Regular 14/20/-0.6%, text-soft-400\n * flex-[1_0_0] (toma el ancho disponible)\n * font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Usage:\n * <sui-dropdown-caption>v.1.5.69 · Terms & Conditions</sui-dropdown-caption>\n * <sui-dropdown-caption>Press ↵ to add new</sui-dropdown-caption>\n */\n@Component({\n selector: 'sui-dropdown-caption',\n templateUrl: './sui-dropdown-caption.html',\n styleUrl: './sui-dropdown-caption.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuiDropdownCaption {}\n","<span class=\"sui-dropdown-caption__text\"><ng-content /></span>\n","import { ChangeDetectionStrategy, Component, computed, input, model, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/**\n * SUI Dropdown Search — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 414:8031 (\"Dropdown Misc Items [1.1]\") — variants Search × 4 states\n * Default / Hover / Active / Active Hover\n *\n * Search input minimal usado en el TOP de un dropdown menu para filtrar items\n * (country picker, command palette, large select). NO es sui-input — tiene\n * anatomy diferente: sin border, sin radius prominente, integrado al menu.\n *\n * EXACT (pulled from Figma 414:8030 Default, 414:8048 Active):\n * Container:\n * bg white-0, p-8, gap-8, flex items-center, w-320 (Figma — el consumer\n * puede override con width 100% si lo usa en menu más ancho)\n * overflow-clip, sin border, sin radius (es parte del menu)\n *\n * Default:\n * search icon 20×20 leading, color text-soft-400\n * placeholder text \"Search...\" color text-soft-400\n *\n * Active (con valor escrito):\n * search icon: text-soft-400 (no cambia)\n * text input: color text-strong-950 (el valor escrito en negro)\n * close icon 20×20 trailing para clear (text-soft-400)\n *\n * Typography: Inter Regular 14/20/-0.6%\n *\n * Usage:\n * <sui-dropdown-search [(value)]=\"query\" placeholder=\"Buscar país...\" (cleared)=\"onClear()\" />\n */\n@Component({\n selector: 'sui-dropdown-search',\n templateUrl: './sui-dropdown-search.html',\n styleUrl: './sui-dropdown-search.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-has-value]': 'hasValue() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiDropdownSearch {\n readonly value = model<string>('');\n readonly placeholder = input<string>('Search...');\n readonly disabled = input(false);\n\n /** Fired cuando el user clickea el icono de clear (X). */\n readonly cleared = output<void>();\n /** Fired en cada input change (igual que value() pero con event). */\n readonly valueChanged = output<string>();\n\n readonly hasValue = computed(() => this.value().length > 0);\n\n onInput(event: Event): void {\n const v = (event.target as HTMLInputElement).value;\n this.value.set(v);\n this.valueChanged.emit(v);\n }\n\n onClear(event: MouseEvent): void {\n event.stopPropagation();\n this.value.set('');\n this.cleared.emit();\n }\n}\n","<sui-icon class=\"sui-dropdown-search__icon\" name=\"search-2-line\" [size]=\"20\" />\n\n<input\n class=\"sui-dropdown-search__input\"\n type=\"text\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n (input)=\"onInput($event)\"\n/>\n\n@if (hasValue()) {\n <button\n type=\"button\"\n class=\"sui-dropdown-search__clear\"\n aria-label=\"Limpiar búsqueda\"\n (click)=\"onClear($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"close-line\" [size]=\"20\" />\n </button>\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiEmoji } from '../sui-emoji/sui-emoji';\n\n/**\n * SUI Empty State — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * Placeholder visual cuando una colección no tiene datos. Renderiza un\n * **Fluent Emoji animado** (PNG 3D del set de Microsoft) + título + subtítulo\n * + opcional CTA.\n *\n * Refactor 2026-05: la asset resolution se delega a `<sui-emoji>` (catálogo\n * compartido `SUI_EMOJI_MAP`). Este componente solo se ocupa del layout/copy/\n * CTA y el override visual del tamaño (120×120 vs el max xl=48 del catálogo).\n *\n * EXACT (pulled from Figma, verified):\n * - NINGUNO. Este componente NO se construyó pulleando Figma — usa Fluent\n * Emoji animados externos como decisión consciente del proyecto (ver\n * \"MEMORY: Emojis animados en empty states\" en CLAUDE.md global). SUI\n * SÍ tiene un Empty State component pero usa SVG illustrations propias.\n *\n * PENDING VERIFY (inferred, not pulled from Figma):\n * - Layout (max-width 460, padding 48/24, illustration 120×120, gap title→\n * subtitle 8, gap illustration→title 24): convención, NO verificado.\n * - Title typography (18/24 600 -0.015em strong-950): conjeturado.\n * - Subtitle typography (14/20 400 -0.006em sub-600 max-w 320): conjeturado.\n * - Illustration size (120×120): aleatorio. Figma puede usar 96 o 128.\n *\n * Inputs:\n * - emoji: URL directo a un Fluent Emoji animado. Si no se pasa, la\n * ilustración default es el zorro (mascota canon de los empty states).\n * - title (required): heading\n * - subtitle: descripción\n * - actionLabel + actionRoute: botón con routerLink\n * - actionLabel solo: botón emite (actionClicked)\n */\n@Component({\n selector: 'sui-empty-state',\n standalone: true,\n imports: [RouterLink, SuiButton, SuiEmoji],\n templateUrl: './sui-empty-state.html',\n styleUrl: './sui-empty-state.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n})\nexport class SuiEmptyState {\n /** URL de Fluent Emoji (3D o animado) — override del zorro default. */\n emoji = input('');\n title = input.required<string>();\n subtitle = input('');\n actionLabel = input('');\n actionRoute = input('');\n actionClicked = output<void>();\n\n /** URL del emoji. Default = zorro (mascota canon de empty states del proyecto):\n todo empty muestra el zorro salvo que pase un `emoji` URL distinto explícito.\n Centralizar el default acá garantiza consistencia en TODOS los empty —\n incluidas las secciones reutilizables — sin tocar cada uso. */\n protected readonly resolvedEmojiSrc = computed<string>(() => {\n const override = this.emoji().trim();\n return override.length > 0 ? override : EMPTY_STATE_FOX_EMOJI;\n });\n}\n\n/** Zorro animado (Fluent Emoji) — emoji default canon de los empty states. */\nexport const EMPTY_STATE_FOX_EMOJI =\n 'https://raw.githubusercontent.com/Tarikul-Islam-Anik/Animated-Fluent-Emojis/master/Emojis/Animals/Fox.png';\n","<div class=\"sui-empty-state__illustration\">\n <sui-emoji\n class=\"sui-empty-state__emoji\"\n size=\"full\"\n [src]=\"resolvedEmojiSrc()\"\n [ariaLabel]=\"title()\"\n />\n</div>\n\n<h3 class=\"sui-empty-state__title\">{{ title() }}</h3>\n\n@if (subtitle()) {\n <p class=\"sui-empty-state__subtitle\">{{ subtitle() }}</p>\n}\n\n@if (actionLabel()) {\n @if (actionRoute()) {\n <sui-button variant=\"filled\" color=\"primary\" size=\"medium\" [routerLink]=\"actionRoute()\">\n {{ actionLabel() }}\n </sui-button>\n } @else {\n <sui-button variant=\"filled\" color=\"primary\" size=\"medium\" type=\"button\" (click)=\"actionClicked.emit()\">\n {{ actionLabel() }}\n </sui-button>\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiFancyButtonType = 'primary' | 'neutral' | 'basic' | 'destructive';\nexport type SuiFancyButtonSize = 'medium' | 'small' | 'xsmall';\n\n/**\n * SUI Fancy Button — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 181:5291 (\"Fancy Buttons [1.1]\") — 36 variants total\n * 4 types × 3 sizes × 3 states\n *\n * Diferencia vs sui-button regular: el \"fancy\" trae un look elevado con:\n * 1. Gradient gloss overlay (linear-gradient 180deg de white 16% → 0)\n * 2. Inset highlight border (1px rgba(255,255,255,0.12) — interna)\n * 3. Colored 1px ring shadow (`0 0 0 1px <brand-color>` — el contorno fancy)\n * 4. Drop shadow (`0 1px 2px <brand-shadow-color>`)\n *\n * Es la versión \"hero CTA\" — más visual presence que sui-button regular. Úsalo\n * para acciones primarias críticas: \"Crear cuenta\", \"Empezar prueba gratis\",\n * \"Confirmar compra\". Para botones normales seguir usando sui-button.\n *\n * Nodes pulled for verification:\n * 181:6788 — Primary / Default / Medium (40)\n * 181:5322 — Neutral / Default / Medium (40)\n * 182:1884 — Basic / Default / Medium (40)\n *\n * EXACT (pulled from Figma):\n * Container (Medium 40):\n * padding: 10px (uniform)\n * gap (icon ↔ text-wrap): 4px outer + 4px text-wrap px = 8 effective\n * border-radius: 10px (var --sui-radius-10)\n * height: 40px (Medium)\n * items-center, justify-center\n * overflow: hidden (clip)\n *\n * Typography: Inter Medium 14/20/-0.6%, font-feature 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Type=Primary (#335cff bg):\n * bg: linear-gradient(180deg, rgba(255,255,255,.16), rgba(255,255,255,0)) + #335cff base\n * text: static-white\n * border-inset: 1px solid rgba(255,255,255,.12)\n * shadow: 0 0 0 1px var(--sui-primary-base), 0 1px 2px rgba(14,18,27,.24)\n *\n * Type=Neutral (#171717 bg / black):\n * bg: linear-gradient(180deg, rgba(255,255,255,.16), rgba(255,255,255,0)) + #171717 base\n * text: text-white-0\n * border-inset: 1px solid rgba(255,255,255,.12)\n * shadow: 0 0 0 1px #242628, 0 1px 2px rgba(27,28,29,.48)\n *\n * Type=Basic (white bg, sin gloss):\n * bg: var(--sui-bg-white-0)\n * text: text-sub-600\n * border-inset: NONE (no white overlay)\n * shadow: 0 0 0 1px var(--sui-stroke-soft-200), 0 1px 3px rgba(14,18,27,.12)\n *\n * Type=Destructive (#fb3748 bg — INFERRED, mismo patrón que Primary):\n * bg: linear-gradient(180deg, rgba(255,255,255,.16), rgba(255,255,255,0)) + #fb3748 base\n * text: static-white\n * border-inset: 1px solid rgba(255,255,255,.12)\n * shadow: 0 0 0 1px var(--sui-state-error-base), 0 1px 2px rgba(14,18,27,.24)\n *\n * Sizes (alineado con sui-button — mismo Medium/Small/X-Small):\n * Medium (40): p=10, gap=4, h=40\n * Small (36): p=8, gap=4, h=36\n * X-Small (32): p=6, gap=4, h=32\n *\n * HOVER state PULLED from Figma (2026-05-29) — NO darken, sino el gloss SE ACLARA:\n * El frame Fancy solo tiene 3 estados: Default / Hover / Disabled (no Active ni Focus).\n * Primary hover 181:6793 → gloss 16%→24%, base #335cff, ring primary-base (igual)\n * Neutral hover 181:5412 → gloss 16%→24%, base #171717, ring #242628 (igual)\n * Destructive hover 181:6860 → gloss 16%→24%, base #fb3748, ring error-base (igual)\n * Basic hover 182:1889 → bg-weak-50 plano, text strong-950, SIN ring/shadow\n *\n * DISABLED PULLED (181:6803): bg-weak-25 (#f7f7f7) plano, text-disabled-300,\n * SIN gloss, SIN ring, SIN shadow ni border. Igual para los 4 types.\n *\n * FOCUS/ACTIVE HALO — per-type (Figma components/buttons/{*}-focus, node 129:1422):\n * El frame Fancy no define estado Focus propio, así que se homologa el halo de\n * sui-button regular: `0 0 0 2px white, 0 0 0 4px <ring>`. El COLOR del ring es\n * per-type, NO uniforme:\n * primary → primary-alpha-10 (override naranja del brand del proyecto)\n * destructive → red-alpha-10 (Figma error-focus #fb37481a)\n * neutral/basic → slate-alpha-16 (Figma important-focus #99a0ae29)\n * Se controla con la var --sui-fancy-focus-ring (default primary, overrides en\n * los bloques :host([data-sui-type='neutral'|'basic'|'destructive'])).\n *\n * PENDING VERIFY (no pulled from Figma):\n * - Destructive Default Medium: inferred from Primary pattern + variable_defs (fancy/error/default)\n * - Small (36) / X-Small (32) specs: inferred from sui-button pattern (mismas paddings)\n *\n * PENDING TOKEN (reportado a missingTokens):\n * - Neutral ring #242628 (181:5412) queda como hex crudo: no existe token equivalente\n * en sui-tokens.scss. --sui-bg-strong-950 = #171717 ≠ #242628. Cuando se cree el\n * token (p.ej. --sui-bg-surface-900 o --sui-neutral-ring), reemplazar el hex.\n *\n * Usage:\n * <sui-fancy-button type=\"primary\" leftIcon=\"rocket-2-line\">Empezar prueba</sui-fancy-button>\n * <sui-fancy-button type=\"destructive\" rightIcon=\"arrow-right-s-line\">Eliminar cuenta</sui-fancy-button>\n * <sui-fancy-button type=\"basic\" size=\"small\">Cancelar</sui-fancy-button>\n */\n@Component({\n selector: 'sui-fancy-button',\n templateUrl: './sui-fancy-button.html',\n styleUrl: './sui-fancy-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n },\n})\nexport class SuiFancyButton {\n readonly type = input<SuiFancyButtonType>('primary');\n readonly size = input<SuiFancyButtonSize>('medium');\n readonly leftIcon = input<string | null>(null);\n readonly rightIcon = input<string | null>(null);\n readonly disabled = input(false);\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>('noopener noreferrer');\n readonly htmlType = input<'button' | 'submit' | 'reset'>('button');\n readonly ariaLabel = input<string | null>(null);\n\n readonly clicked = output<MouseEvent>();\n\n readonly iconSize = computed<number>(() => 20);\n readonly isAnchor = computed<boolean>(() => !!this.href() && !this.disabled());\n\n onClick(event: MouseEvent): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-fancy-button__el\"\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"rel()\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (leftIcon()) {\n <sui-icon class=\"sui-fancy-button__icon\" [name]=\"leftIcon()!\" [size]=\"iconSize()\" />\n }\n <span class=\"sui-fancy-button__text-wrap\"><ng-content /></span>\n @if (rightIcon()) {\n <sui-icon class=\"sui-fancy-button__icon\" [name]=\"rightIcon()!\" [size]=\"iconSize()\" />\n }\n </a>\n} @else {\n <button\n class=\"sui-fancy-button__el\"\n [type]=\"htmlType()\"\n [disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (leftIcon()) {\n <sui-icon class=\"sui-fancy-button__icon\" [name]=\"leftIcon()!\" [size]=\"iconSize()\" />\n }\n <span class=\"sui-fancy-button__text-wrap\"><ng-content /></span>\n @if (rightIcon()) {\n <sui-icon class=\"sui-fancy-button__icon\" [name]=\"rightIcon()!\" [size]=\"iconSize()\" />\n }\n </button>\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport type SuiFileIconSize = 'xsmall' | 'medium';\nexport type SuiFileIconColor =\n | 'red'\n | 'orange'\n | 'yellow'\n | 'green'\n | 'teal'\n | 'blue'\n | 'purple'\n | 'pink'\n | 'gray';\n\n/**\n * SUI File Icon — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 450:17234 (\"File Format Icons [1.1]\") — VERIFIED via MCP get_design_context\n *\n * Variants pulled and verified:\n * - 450:17235 (Red, Medium 40)\n * - 450:17275 (Gray, Medium 40)\n * - 450:17280 (Red, X-Small 32)\n *\n * Visual: gray file-page icon with corner peeled (folded) + colored badge\n * with white uppercase text in bottom-left showing the file extension.\n *\n * EXACT (pulled from Figma, verified):\n * - Container Medium: 40×40 (node 450:17235)\n * - Container X-Small: 32×32 (node 450:17280)\n * - Body Vector Medium: 32×40 at x=4, y=0 inside 40×40 container (node 450:17276 metadata)\n * - Body Vector X-Small: 26×32 centered (node 450:17281 → w=26, top=0, bottom=0)\n * - Peel Vector Medium: 12×12 at x=23, y=1 (node 450:17277 metadata)\n * - Peel Vector X-Small: 10×10 at right=4, top=1 (node 450:17282)\n * - Format badge Medium: bottom=6px, padding=2px 3px, border-radius=4px, left=0 (node 450:17238)\n * - Format badge X-Small: bottom=4px, padding=2px 3px, border-radius=3px, left=0 (node 450:17283)\n * - Format text Medium: Inter SemiBold 11px / line-height 12px / letter-spacing 0.22px (=2% em),\n * uppercase, color static-white (node 450:17239)\n * - Format text X-Small: Inter SemiBold 8.8px / line-height 9.6px / letter-spacing 0.176px\n * (=2% em), uppercase, color static-white (node 450:17284)\n * - 9 colors: Red, Orange, Yellow, Green, Teal, Blue, Purple, Pink, Gray\n * - Color tokens (verified via get_variable_defs):\n * Red state/error/base #fb3748 → --sui-state-error-base\n * Orange state/warning/base #fa7319 → --sui-state-warning-base\n * Yellow state/away/base #f6b51e → --sui-state-away-base\n * Green state/success/base #1fc16b → --sui-state-success-base\n * Teal state/verified/base #47c2ff → --sui-state-verified-base\n * Blue state/information/base #335cff → --sui-state-information-base\n * Purple state/feature/base #7d52f4 → --sui-state-feature-base\n * Pink state/highlighted/base #fb4ba3 → --sui-state-highlighted-base\n * Gray state/faded/base #7b7b7b → --sui-state-faded-base\n * - Body fill is WHITE across all colors (not tinted) — only the format badge changes.\n *\n * BODY / PEEL GEOMETRY — VERIFIED EXACT (pulled from Figma vector assets via MCP):\n * The MCP asset endpoint returns the body and peel as real SVG <path> vectors\n * (not opaque PNG bitmaps as previously assumed), so the inline paths below are\n * pixel-faithful, not approximations.\n * - Body Medium (node 450:17236, vector viewBox 32×40, inset 4px each side):\n * rounded-rect page, r=6 corners, diagonal-cut top-right (small r≈1.5 corner),\n * fill bg/white-0, stroke stroke/sub-300 (#d1d1d1) @1.5px.\n * - Body X-Small (node 450:17281, vector viewBox 26×32, centered): same shape,\n * r≈4.8 corners, stroke @1.2px.\n * - Peel Medium (node 450:17237): L-shaped fold edge \"M.. V8 C.. r=4 H..\" drawn\n * as a STROKE only (no fill), stroke/sub-300 @1.5px, at x=23,y=1.\n * - Peel X-Small (node 450:17282): same, r≈3.2 inner corner, @1.2px, at x=18,y=1.\n * Tokens (get_variable_defs on 450:17235): bg/white-0=#ffffff → --sui-bg-white-0,\n * stroke/sub-300=#d1d1d1 → --sui-stroke-sub-300.\n *\n * KNOWN SHORTCUT VIOLATIONS:\n * - 1.7 (component library check): the previous version of this component existed but\n * was structurally wrong — it tinted the entire body with currentColor. This rewrite\n * drops that interpretation in favor of the Figma-verified pattern (gray body +\n * colored format badge). API-breaking changes:\n * - sizes: 'small' | 'medium' | 'large' → 'xsmall' | 'medium' (no 'large')\n * - colors: 'sky' renamed to 'teal' to match Figma label\n * - colors: 'orange' now uses --sui-state-warning-base (was --sui-primary-base)\n *\n * Inputs:\n * - filename: source for auto-extension extraction\n * - extension: explicit override for the displayed extension text\n * - size: 'xsmall' (32×32) | 'medium' (40×40)\n * - color: explicit override for the format badge color. Empty string =\n * auto-detect from extension. Defaults to gray for unknown types.\n */\n@Component({\n selector: 'sui-file-icon',\n standalone: true,\n templateUrl: './sui-file-icon.html',\n styleUrl: './sui-file-icon.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-color]': 'resolvedColor()',\n role: 'img',\n '[attr.aria-label]': 'resolvedExt() ? \"File: \" + resolvedExt() : \"File\"',\n },\n})\nexport class SuiFileIcon {\n readonly filename = input('');\n readonly extension = input('');\n readonly size = input<SuiFileIconSize>('medium');\n /** Explicit color override. Empty = auto-detect from extension. */\n readonly color = input<SuiFileIconColor | ''>('');\n\n /** Normalised extension (uppercase, no leading dot, max 4 chars). */\n protected readonly resolvedExt = computed(() => {\n const explicit = this.extension().trim().replace(/^\\./, '').toUpperCase();\n if (explicit) return explicit.slice(0, 4);\n const fname = this.filename().trim();\n const dot = fname.lastIndexOf('.');\n if (dot < 0 || dot === fname.length - 1) return '';\n return fname.slice(dot + 1).toUpperCase().slice(0, 4);\n });\n\n /** Final colour: explicit override > extension auto-detect > 'gray'. */\n protected readonly resolvedColor = computed<SuiFileIconColor>(() => {\n const override = this.color();\n if (override) return override;\n const ext = this.resolvedExt();\n if (!ext) return 'gray';\n if (ext === 'PDF') return 'red';\n if (['DOC', 'DOCX', 'TXT', 'RTF', 'PAGES', 'ODT'].includes(ext)) return 'blue';\n if (['XLS', 'XLSX', 'CSV', 'NUMB'].includes(ext) || ext.startsWith('XLS')) return 'green';\n if (['PPT', 'PPTX', 'KEY', 'ODP'].includes(ext)) return 'orange';\n if (['JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG', 'HEIC', 'BMP', 'TIFF'].includes(ext))\n return 'pink';\n if (['MP4', 'MOV', 'AVI', 'WEBM', 'MKV', 'M4V', 'WMV'].includes(ext)) return 'purple';\n if (['MP3', 'WAV', 'OGG', 'AAC', 'FLAC', 'M4A'].includes(ext)) return 'teal';\n if (['ZIP', 'RAR', '7Z', 'TAR', 'GZ', 'BZ2'].includes(ext)) return 'yellow';\n return 'gray';\n });\n}\n","@switch (size()) {\n @case ('xsmall') {\n <!-- 32×32 container. Body vector 26 wide, centered (x=3..29), full height.\n Peel vector 10×10 at x=18..28, y=1..11. Geometry pulled EXACT from\n Figma assets 450:17281 (body) + 450:17282 (peel). -->\n <svg\n class=\"sui-file-icon__svg\"\n viewBox=\"0 0 32 32\"\n width=\"32\"\n height=\"32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <!-- Body: rounded-rect page (r≈4.8) with diagonal-cut top-right corner.\n White fill + sub-300 stroke @1.2px (Figma node 450:17281). -->\n <path\n class=\"sui-file-icon__body\"\n d=\"M7.7998 0.5996H16.4707C17.5733 0.5996 18.6323 1.034 19.418 1.8076L27.1465 9.417C27.9483 10.2064 28.4004 11.285 28.4004 12.4102V27.2002C28.4003 29.5196 26.5196 31.4003 24.2002 31.4004H7.7998C5.4804 31.4003 3.5997 29.5196 3.5996 27.2002V4.7998C3.5997 2.4804 5.4804 0.5997 7.7998 0.5996Z\"\n />\n <!-- Peel: L-shaped fold edge (stroke only, no fill), r≈3.2 inner corner\n (Figma node 450:17282). -->\n <path\n class=\"sui-file-icon__peel\"\n d=\"M18.6 1V7.8C18.6 9.5673 20.0327 11 21.8 11H28.6\"\n />\n </svg>\n }\n @default {\n <!-- 40×40 container. Body vector 32 wide, inset 4px each side (x=4..36),\n full height. Peel vector 12.75×12.75 at x=23, y=1. Geometry pulled\n EXACT from Figma assets 450:17236 (body) + 450:17237 (peel). -->\n <svg\n class=\"sui-file-icon__svg\"\n viewBox=\"0 0 40 40\"\n width=\"40\"\n height=\"40\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <!-- Body: rounded-rect page (r=6) with diagonal-cut top-right corner.\n White fill + sub-300 stroke @1.5px (Figma node 450:17236). -->\n <path\n class=\"sui-file-icon__body\"\n d=\"M10 0.75H20.5146C21.907 0.75 23.242 1.3035 24.2266 2.2881L33.7119 11.7734C34.6965 12.758 35.25 14.093 35.25 15.4854V34C35.25 36.8995 32.8995 39.25 30 39.25H10C7.1005 39.25 4.75 36.8995 4.75 34V6C4.75 3.1005 7.1005 0.75 10 0.75Z\"\n />\n <!-- Peel: L-shaped fold edge (stroke only, no fill), r=4 inner corner\n (Figma node 450:17237). -->\n <path\n class=\"sui-file-icon__peel\"\n d=\"M23.75 1V9C23.75 11.2091 25.5409 13 27.75 13H35.75\"\n />\n </svg>\n }\n}\n\n@if (resolvedExt()) {\n <span class=\"sui-file-icon__format\" aria-hidden=\"true\">\n <span class=\"sui-file-icon__format-text\">{{ resolvedExt() }}</span>\n </span>\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\n\nexport type SuiProgressBarColor = 'blue' | 'green' | 'orange' | 'red' | 'purple';\nexport type SuiProgressBarSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/**\n * sui-progress-bar — SUI Design System 2.0 · Progress Bar (Line)\n *\n * Figma: 8p1k72aKKvzJV4XcvPS4VO\n * - Frame \"Progress Bar [1.1]\" node 450:17821 (eje Percentage 0–100 step 10)\n * - Frame \"Progress Bar Line [1.1]\" node 450:17810 (eje Color: Empty/Blue/Red/Orange/Green)\n * VERIFIED via MCP (`get_metadata` + `get_design_context` + `get_variable_defs`).\n *\n * EXACT (pulled from Figma 2026-05-29, verified):\n * - Container: w=320 (Figma fija; en uso real el host es `width:100%`),\n * h=6, bg=`bg/soft-200` (#ebebeb), radius=`radius-full` (999), overflow=clip.\n * - Fill height=100%, radius inherits.\n * - Color axis del DS (node 450:17810) confirma 4 colores activos + track vacío:\n * Blue = state/information/base #335cff\n * Red = state/error/base #fb3748\n * Orange = state/warning/base #fa7319\n * Green = state/success/base #1fc16b\n * OJO: en este proyecto `--sui-primary-base` = #fa7319 (naranja brand),\n * distinto al `primary-base` azul del Figma del DS. El azul del DS mapea a\n * `--sui-state-information-base`, NO a `--sui-primary-base`.\n *\n * PENDING VERIFY (inferido — no confirmable en el Figma publicado):\n * 1. [STATE] color='purple' (state/feature-base #7d52f4) NO existe en el eje\n * de color del Figma (node 450:17810 sólo expone Blue/Red/Orange/Green).\n * Es una extensión del proyecto — PRESERVADA porque hay uso real\n * (master-preview demo). Si el DS nunca la adopta, queda como extra propio.\n * 2. [STATE] Size variants — el Figma publicado SÓLO expone h=6px (medium).\n * Las clases `small` (4px) y `large` (8px) son convención del proyecto, NO\n * verificadas en Figma. PRESERVADAS (la API `size` ya es consumida por\n * sui-file-upload-card y master-preview).\n * 3. [MOTION] La transición `width 300ms ease-out` no está en el frame estático\n * de Figma — convención de progress animado del proyecto. PRESERVADA.\n * Se desactiva bajo `prefers-reduced-motion`.\n * 4. [TOKEN] Tokens confirmados en sui-tokens.scss: bg-soft-200 (#ebebeb, l.211),\n * state-information-base (#335cff, l.251), state-warning-base (#fa7319, l.256),\n * state-error-base (#fb3748, l.261), state-success-base (#1fc16b, l.266),\n * state-feature-base (#7d52f4, l.276), radius-full (999px, l.316).\n *\n * Rationale: usado dentro de `sui-file-upload-card`, `overview-visitors` y el\n * wrapper compuesto `sui-progress-bar-label`. Disponible para flujos de\n * carga/progreso (form steps, onboarding, importes, etc).\n *\n * Inputs:\n * - value: number 0–100 (clamp interno).\n * - color: 'blue' (default) | 'green' | 'orange' | 'red' | 'purple'.\n * - size: 'small' (4px) | 'medium' (6px, default) | 'large' (8px) | 'xlarge' (10px).\n * - ariaLabel: string opcional para `aria-label` del role=progressbar.\n */\n@Component({\n selector: 'sui-progress-bar',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sui-progress-bar.html',\n styleUrl: './sui-progress-bar.scss',\n host: {\n role: 'progressbar',\n '[attr.aria-valuemin]': '0',\n '[attr.aria-valuemax]': '100',\n '[attr.aria-valuenow]': 'clampedValue()',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.data-color]': 'color()',\n '[attr.data-size]': 'size()',\n },\n})\nexport class SuiProgressBar {\n readonly value = input<number>(0);\n readonly color = input<SuiProgressBarColor>('blue');\n readonly size = input<SuiProgressBarSize>('medium');\n readonly ariaLabel = input<string | null>(null);\n\n readonly clampedValue = computed(() => {\n const v = this.value();\n if (Number.isNaN(v)) return 0;\n return Math.max(0, Math.min(100, v));\n });\n}\n","<div class=\"sui-progress-bar__fill\" [style.width.%]=\"clampedValue()\"></div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\nimport { SuiFileIcon } from '../sui-file-icon/sui-file-icon';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\nimport { SuiProgressBar } from '../sui-progress-bar/sui-progress-bar';\n\nexport type SuiFileUploadCardState = 'in-progress' | 'success' | 'error';\n\n/**\n * SUI File Upload Card — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 451:409 (\"File Upload Cards [1.1]\") — VERIFIED via MCP get_design_context\n * Variants pulled and verified:\n * - In Progress (node 451:408)\n * - Success (node 452:145)\n * - Error (node 452:189)\n *\n * Card de status de un archivo siendo subido / ya subido / fallido. NO confundir\n * con `sui-file-upload` (dropzone) ni con `sui-file-icon` (badge de tipo). Este\n * componente compone ambos: muestra el file-icon a la izquierda + nombre +\n * peso/progress + acción a la derecha (cerrar / borrar).\n *\n * Layout:\n * [file-icon 40px] [label + (size · status) + (try-again si error)] [compact-btn 24px]\n * ────────── progress-bar (solo in-progress) ──────────\n *\n * EXACT (pulled from Figma, verified):\n * - Container: w=400px (responsive, ver responsive abajo), pl=14 pr=16 py=16,\n * border=1px solid, radius=12px (node 451:408)\n * - Border default/in-progress/success: --sui-stroke-soft-200 (#ebebeb)\n * - Border error: --sui-state-error-base (#fb3748) (node 452:189)\n * - Background: --sui-bg-white-0 (#fff)\n * - Card gap: 16px (in-progress only — entre content row y progress bar)\n * - Content row gap: 12px (node 451:275 / 452:146 / 452:190)\n * - Text wrap gap: 4px (in-progress + success)\n * - Text wrap gap: 8px (error — para separar Text&Status del link Try Again)\n * - Description row gap: 4px, items-center (node 451:278 / 452:150 / 452:194)\n * - Status row gap: 4px, items-start\n * - Label: Label/Small 14/20 weight 500 letter-spacing -0.6% (-0.006em)\n * color --sui-text-strong-950 (node 451:272 / 452:149 / 452:193)\n * - Description / bullet / status-text: Paragraph/X Small 12/16 weight 400\n * letter-spacing 0 — description+bullet color --sui-text-sub-600,\n * status-text color --sui-text-strong-950 (node 451:277/281, 452:151/155, 452:195/199)\n * - Try Again link: Label/Small 14/20 weight 500 underlined,\n * color --sui-state-error-base (node I452:322;169:1385)\n * - Status icons: 16×16 (node 451:279, 452:154, 452:198)\n * - Compact Button: p=2 radius=6 — icon 20×20 inside (node 451:346)\n * - Compact Button icons:\n * in-progress → close-line (gray, icon-sub-600)\n * success → delete-bin-line (gray, icon-sub-600)\n * error → delete-bin-line (RED, state-error-base) — verificado\n * visualmente en el screenshot del frame (delete-bin tinted red).\n * - Progress bar (in-progress only): h=6 w=full radius=full,\n * bg=--sui-bg-soft-200 (#ebebeb), fill=--sui-state-information-base (#335cff)\n * (nodes 450:17813 / 450:17823)\n * - Progress percentage default in Figma: 10% — exposed as `progress` input 0–100\n * - File icon size: medium (40×48 en sui-file-icon) — Figma usa 40×40 pero\n * el existing sui-file-icon mantiene la proporción 40×48 (pre-existente).\n *\n * ACCIONES — HOMOLOGADAS a componentes SUI (2026-06-21):\n * - Compact action button (node 451:346 / 452:156 / 452:200 \"Compact Button [1.1]\"):\n * Figma = p=2 + icon 20×20 = 24×24 total. Mapea EXACTO a\n * <sui-compact-button size=\"large\"> (container 24×24, icon 20×20). Se usa\n * variantStyle=\"modifiable\" (currentColor) para que el host pinte el ícono\n * gris (in-progress/success) o rojo (error). El <button> custom previo se\n * justificaba porque sui-button onlyIcon solo da 28/32/36/40 — pero\n * sui-compact-button (que NO existía cuando se escribió esto) sí cubre el 24px.\n * - \"Try Again\" link (node I452:322;169:1385 \"Link Buttons [1.1]\"): texto\n * Label/Small SUBRAYADO color error-base, sin padding ni bg. Mapea EXACTO a\n * <sui-link-button variant=\"error\" [underline]=\"true\"> (medium = 14/20, underline\n * solo bajo el texto). El <button> link custom previo era anterior a sui-link-button.\n *\n * PENDING VERIFY (inferred, not pulled from Figma):\n * - Compact button hover bg: inferido como --sui-bg-weak-50 (patrón ghost\n * button del DS — Figma no expone state del compact button en este frame).\n * - Try Again link hover: inferido como state-error-dark (--sui-state-error-dark\n * #681219) — Figma no expone hover del link en este frame.\n * - Spinner animation: 1s linear infinite — convención de loader (Figma ilustra\n * el frame estático).\n * - Responsive: el Figma fija w=400px. En mobile (≤480px) extendemos a 100%\n * sin cambiar paddings — decisión de proyecto, no spec del DS.\n * - Status iconColor mapping:\n * loader-2-fill (in-progress) → currentColor; renderizamos como\n * --sui-state-information-base (azul) por convención (NO en spec MCP,\n * pero el screenshot del frame muestra el spinner azul).\n * checkbox-circle-fill (success) → --sui-state-success-base (verde) —\n * del screenshot, no del MCP code (que solo expone el SVG genérico).\n * error-warning-fill (error) → --sui-state-error-base (rojo) — íd.\n *\n * Inputs:\n * - filename: string visible (default \"file.pdf\")\n * - extension: override del FileIcon (extrae de filename si vacío)\n * - description: texto secundario izquierdo (ej. \"0 KB of 120 KB\")\n * - state: 'in-progress' | 'success' | 'error'\n * - progress: 0–100 — solo se muestra si state==='in-progress'\n * - statusText: override del label de status (sino default por state:\n * \"Uploading...\" / \"Completed\" / \"Failed\")\n * - showStatus: muestra/oculta el bloque de status (default true)\n * - retryLabel: texto del link de error (default \"Try Again\")\n *\n * Outputs:\n * - actionClicked: click en el botón compacto (close en in-progress,\n * delete en success/error)\n * - retryClicked: click en \"Try Again\" (solo state==='error')\n */\n@Component({\n selector: 'sui-file-upload-card',\n standalone: true,\n imports: [SuiFileIcon, SuiIcon, SuiProgressBar, SuiCompactButton, SuiLinkButton],\n templateUrl: './sui-file-upload-card.html',\n styleUrl: './sui-file-upload-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-state]': 'state()',\n },\n})\nexport class SuiFileUploadCard {\n readonly filename = input<string>('file.pdf');\n readonly extension = input<string>('');\n readonly description = input<string>('0 KB of 120 KB');\n readonly state = input<SuiFileUploadCardState>('in-progress');\n readonly progress = input<number>(10);\n readonly statusText = input<string | null>(null);\n readonly showStatus = input<boolean>(true);\n readonly retryLabel = input<string>('Try Again');\n\n readonly actionClicked = output<void>();\n readonly retryClicked = output<void>();\n\n /** Default status text por state — override-able vía input. */\n protected readonly resolvedStatusText = computed(() => {\n const override = this.statusText();\n if (override) return override;\n switch (this.state()) {\n case 'in-progress': return 'Uploading...';\n case 'success': return 'Completed';\n case 'error': return 'Failed';\n }\n });\n\n /** Status icon name por state (Remix Icons). */\n protected readonly statusIconName = computed(() => {\n switch (this.state()) {\n case 'in-progress': return 'loader-2-fill';\n case 'success': return 'checkbox-circle-fill';\n case 'error': return 'error-warning-fill';\n }\n });\n\n /** Compact button (right-side) icon name por state. */\n protected readonly actionIconName = computed(() => {\n return this.state() === 'in-progress' ? 'close-line' : 'delete-bin-line';\n });\n\n /** Progress 0–100 clamped. */\n protected readonly progressPct = computed(() => {\n const v = this.progress();\n if (Number.isNaN(v)) return 0;\n return Math.max(0, Math.min(100, v));\n });\n\n protected onAction(): void {\n this.actionClicked.emit();\n }\n\n protected onRetry(): void {\n this.retryClicked.emit();\n }\n}\n","<div class=\"sui-file-upload-card__row\">\n <sui-file-icon\n class=\"sui-file-upload-card__file-icon\"\n size=\"medium\"\n [filename]=\"filename()\"\n [extension]=\"extension()\"\n />\n\n <div class=\"sui-file-upload-card__text\">\n @if (state() === 'error') {\n <!-- Error: Text & Status sub-wrap (gap=4) + Try Again link (gap=8 outer) -->\n <div class=\"sui-file-upload-card__text-status\">\n <p class=\"sui-file-upload-card__label\">{{ filename() }}</p>\n <div class=\"sui-file-upload-card__desc\">\n <span class=\"sui-file-upload-card__desc-text\">{{ description() }}</span>\n @if (showStatus()) {\n <span class=\"sui-file-upload-card__bullet\" aria-hidden=\"true\">∙</span>\n <span class=\"sui-file-upload-card__status\">\n <sui-icon\n class=\"sui-file-upload-card__status-icon\"\n [name]=\"statusIconName()\"\n [size]=\"16\"\n />\n <span class=\"sui-file-upload-card__status-text\">{{ resolvedStatusText() }}</span>\n </span>\n }\n </div>\n </div>\n\n <!-- Try Again (Figma node I452:322;169:1385 \"Link Buttons [1.1]\") =\n sui-link-button variant=error + underline. -->\n <sui-link-button\n class=\"sui-file-upload-card__retry\"\n variant=\"error\"\n size=\"medium\"\n [underline]=\"true\"\n (clicked)=\"onRetry()\"\n >\n {{ retryLabel() }}\n </sui-link-button>\n } @else {\n <!-- In-progress / Success: label + (description · status) -->\n <p class=\"sui-file-upload-card__label\">{{ filename() }}</p>\n <div class=\"sui-file-upload-card__desc\">\n <span class=\"sui-file-upload-card__desc-text\">{{ description() }}</span>\n @if (showStatus()) {\n <span class=\"sui-file-upload-card__bullet\" aria-hidden=\"true\">∙</span>\n <span class=\"sui-file-upload-card__status\">\n <sui-icon\n class=\"sui-file-upload-card__status-icon\"\n [name]=\"statusIconName()\"\n [size]=\"16\"\n />\n <span class=\"sui-file-upload-card__status-text\">{{ resolvedStatusText() }}</span>\n </span>\n }\n </div>\n }\n </div>\n\n <!-- Compact action (Figma node 451:346 / 452:156 / 452:200 \"Compact Button [1.1]\")\n = p=2 + icon 20×20 = 24×24 → sui-compact-button size=large. variantStyle=modifiable\n (currentColor) para que el host pinte gris (in-progress/success) o rojo (error). -->\n <sui-compact-button\n class=\"sui-file-upload-card__action\"\n [icon]=\"actionIconName()\"\n variantStyle=\"modifiable\"\n size=\"large\"\n [ariaLabel]=\"state() === 'in-progress' ? 'Cancel upload' : 'Remove file'\"\n (clicked)=\"onAction()\"\n />\n</div>\n\n@if (state() === 'in-progress') {\n <sui-progress-bar\n class=\"sui-file-upload-card__progress\"\n [value]=\"progressPct()\"\n color=\"blue\"\n size=\"medium\"\n ariaLabel=\"Upload progress\"\n />\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, computed, input, output, signal, viewChild } from '@angular/core';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiFileUploadSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/**\n * SUI File Upload — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 450:9413 (\"File Upload Area [1.1]\") — VERIFIED via MCP get_design_context (2026-05-29)\n * Variants pulled and verified:\n * - State=Default (node 450:9410)\n * - State=Hover (node 450:9429)\n *\n * Área de drag-and-drop + click-to-browse. Border dashed con estados\n * default / hover / dragover / disabled / error. Soporta single o multi.\n *\n * EXACT (pulled from Figma, verified — node 450:9410 / 450:9429):\n * - Container: w=400px (responsive 100% en consumer), padding=32px, gap=20px,\n * border=1px dashed --sui-stroke-sub-300 (#d1d1d1), radius=12px,\n * bg=--sui-bg-white-0. Flex column, items+justify center.\n * - Icon: upload-cloud-2-line (Remix) 24×24, color --sui-icon-sub-600 (#5c5c5c),\n * SIN contenedor circular (Figma renderiza el ícono suelto, no en círculo bg).\n * - Text block (node 450:9367): flex column, gap=6px, text-center, w-full.\n * - Title (node 450:9365): Label/Small — Inter Medium 14/20 weight 500\n * letter-spacing -0.084px (-0.6%), color --sui-text-strong-950.\n * - Subtitle (node 450:9366): Paragraph/X-Small — Inter Regular 12/16 weight 400\n * letter-spacing 0, color --sui-text-sub-600.\n * - Browse File button (node 450:9384, \"Buttons [1.1]\"): stroke/neutral —\n * bg-white, border 1px --sui-stroke-soft-200, radius-8, px=8 py=6, gap=2,\n * shadow regular-shadow/x-small, text --sui-text-sub-600 14/20 weight 500.\n * metadata del nodo: w=100 h=32 → size xsmall (h=32). PERO el padding del\n * nodo es ASIMÉTRICO px=8 py=6, NO el p=6 uniforme del xsmall estándar.\n * Homologado a <sui-button variant=\"stroke\" color=\"neutral\" size=\"xsmall\">\n * con override SCSS `padding: 6px 8px` en .sui-file-upload__browse para\n * igualar el horizontal exacto del DS (fix HIGH 2026-05-29).\n * - Hover (node 450:9429): bg → --sui-bg-weak-50 (#f7f7f7), border SE MANTIENE\n * --sui-stroke-sub-300 (NO cambia a otro stroke). Icono y textos sin cambio.\n *\n * PENDING VERIFY (inferred, not pulled from Figma):\n * - Per-size padding (small/large): Figma SOLO expone un size (32px padding,\n * 20px gap, w=400). small (24px / gap 16) y large (40px / gap 24) son\n * extensión de proyecto — sin respaldo en Figma. Ver newQuestions.\n * - dragover / error / disabled / focus-visible: estados funcionales del SUI,\n * NO presentes en Figma (solo Default + Hover). Ver extraFeatures.\n * - Error text typography (12/16 weight 400): convención (Figma no muestra error).\n *\n * COLOR MAPPING:\n * #d1d1d1 → --sui-stroke-sub-300 (border default + hover) — VERIFIED Figma\n * #f7f7f7 → --sui-bg-weak-50 (hover bg) — VERIFIED Figma\n * #ebebeb → --sui-stroke-soft-200 (Browse btn border) — VERIFIED Figma\n * #5c5c5c → --sui-icon-sub-600 / --sui-text-sub-600 — VERIFIED Figma\n * #fa7319 → --sui-primary-base (dragover — extraFeature) — convention OK\n * #fb3748 → --sui-state-error-base (error — extraFeature) — convention OK\n * #ffebec → --sui-state-error-lighter — token verified\n *\n * Inputs:\n * - accept: MIME types separados por coma (ej. \"image/*,.pdf,.docx\"). Default: vacío = todos.\n * - multiple: permite seleccionar varios archivos. Default: false.\n * - maxSize: bytes máximo por archivo. 0 = sin límite.\n * - title: label primario.\n * - subtitle: texto secundario.\n * - browseLabel: texto del botón Browse File (default \"Browse File\").\n * - disabled: bloquea interacción.\n * - error: estado de error (border rojo).\n * - errorMessage: texto del error mostrado debajo.\n * - size: small | medium (default) | large | xlarge — controla padding interno.\n *\n * Outputs:\n * - filesSelected: emite File[] cuando el usuario selecciona o dropea archivos válidos.\n * - errorEvent: emite string con el motivo del rechazo si falla validación.\n */\n@Component({\n selector: 'sui-file-upload',\n standalone: true,\n imports: [SuiButton, SuiIcon],\n templateUrl: './sui-file-upload.html',\n styleUrl: './sui-file-upload.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '(click)': 'onClick()',\n '(keydown.enter)': 'onClick()',\n '(keydown.space)': 'onClick(); $event.preventDefault()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class SuiFileUpload {\n readonly accept = input('');\n readonly multiple = input(false);\n readonly maxSize = input(0);\n readonly title = input<string | null>(null);\n readonly subtitle = input<string | null>(null);\n readonly browseLabel = input<string>('Browse File');\n readonly disabled = input(false);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n readonly size = input<SuiFileUploadSize>('medium');\n\n readonly filesSelected = output<File[]>();\n readonly errorEvent = output<string>();\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n protected readonly dragging = signal(false);\n protected readonly internalError = signal<string | null>(null);\n\n protected readonly state = computed<'default' | 'dragover' | 'error' | 'disabled'>(() => {\n if (this.disabled()) return 'disabled';\n if (this.error() || this.internalError()) return 'error';\n if (this.dragging()) return 'dragover';\n return 'default';\n });\n\n protected readonly resolvedTitle = computed(() => {\n if (this.title()) return this.title()!;\n return this.multiple() ? 'Arrastra y suelta los archivos aquí' : 'Arrastra y suelta el archivo aquí';\n });\n\n protected readonly resolvedSubtitle = computed(() => {\n if (this.subtitle()) return this.subtitle()!;\n return 'o haz clic para seleccionar';\n });\n\n protected readonly resolvedErrorMessage = computed(() => {\n return this.errorMessage() ?? this.internalError();\n });\n\n /** Icon size px. Figma verified = 24 (medium). small/large/xlarge escalan +4\n * (small 20 → medium 24 → large 28 → xlarge 32) — extensión de proyecto. */\n protected readonly iconSize = computed(() => {\n switch (this.size()) {\n case 'small': return 20;\n case 'large': return 28;\n case 'xlarge': return 32;\n default: return 24;\n }\n });\n\n onClick(): void {\n if (this.disabled()) return;\n this.inputRef()?.nativeElement.click();\n }\n\n /** Browse File button — abre el picker. stopPropagation evita doble-open\n * (el host también es clickeable). */\n protected onBrowseClick(e: Event): void {\n e.stopPropagation();\n this.onClick();\n }\n\n onDragOver(e: DragEvent): void {\n if (this.disabled()) return;\n e.preventDefault();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n if (this.disabled()) return;\n const files = Array.from(e.dataTransfer?.files ?? []);\n this.processFiles(files);\n }\n\n protected onInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n this.processFiles(files);\n /* Reset para que seleccionar el mismo archivo dos veces dispare el change */\n input.value = '';\n }\n\n private processFiles(files: File[]): void {\n if (!files.length) return;\n\n const accept = this.accept().trim();\n const max = this.maxSize();\n const valid: File[] = [];\n let rejectedReason: string | null = null;\n\n for (const f of files) {\n if (max > 0 && f.size > max) {\n rejectedReason = `\"${f.name}\" supera el tamaño máximo (${this.formatBytes(max)})`;\n continue;\n }\n if (accept && !this.matchesAccept(f, accept)) {\n rejectedReason = `\"${f.name}\" no es un tipo permitido`;\n continue;\n }\n valid.push(f);\n }\n\n if (rejectedReason) {\n this.internalError.set(rejectedReason);\n this.errorEvent.emit(rejectedReason);\n } else {\n this.internalError.set(null);\n }\n\n if (valid.length) {\n const out = this.multiple() ? valid : valid.slice(0, 1);\n this.filesSelected.emit(out);\n }\n }\n\n private matchesAccept(file: File, accept: string): boolean {\n const tokens = accept.split(',').map(t => t.trim().toLowerCase()).filter(Boolean);\n const fileName = file.name.toLowerCase();\n const fileType = file.type.toLowerCase();\n return tokens.some(token => {\n if (token.startsWith('.')) return fileName.endsWith(token);\n if (token.endsWith('/*')) return fileType.startsWith(token.slice(0, -1));\n return fileType === token;\n });\n }\n\n private formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n}\n","<!-- Icon: upload-cloud-2-line 24px, sin contenedor circular (Figma node 450:9404). -->\n<sui-icon class=\"sui-file-upload__icon\" name=\"upload-cloud-2-line\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n\n<div class=\"sui-file-upload__text\">\n <p class=\"sui-file-upload__title\">{{ resolvedTitle() }}</p>\n <p class=\"sui-file-upload__subtitle\">{{ resolvedSubtitle() }}</p>\n</div>\n\n<!-- Browse File button (Figma node 450:9384) — stroke/neutral. -->\n<sui-button\n class=\"sui-file-upload__browse\"\n variant=\"stroke\"\n color=\"neutral\"\n size=\"xsmall\"\n [disabled]=\"disabled()\"\n (click)=\"onBrowseClick($event)\">\n {{ browseLabel() }}\n</sui-button>\n\n@if (resolvedErrorMessage()) {\n <p class=\"sui-file-upload__error\">{{ resolvedErrorMessage() }}</p>\n}\n\n<input\n #fileInput\n type=\"file\"\n class=\"sui-file-upload__input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange($event)\" />\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * SUI Filter Bar — SUI Design System 2.0 (\"Filters\" / HorizontalFilter)\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Sub-component: HorizontalFilter\n * Type(Calendar | Table) × button × prop2ndButton × search × shortBy = 32 combos\n *\n * Toolbar horizontal de filtros con layout Left/Right split. Es un CONTENEDOR\n * de composición: el consumer proyecta los controles ya homologados —\n * Segmented Control (`<sui-tabs variant=\"segment\">`), Text Input\n * (`<sui-input type=\"search\">` con kbd badge), Select (`<sui-select>`),\n * Button Group (`<sui-button-group>`) y Buttons (`<sui-button>`)— en dos slots\n * nombrados.\n *\n * Por qué contenedor + slots y NO un componente monolítico con 32 props:\n * El audit (openQuestions) confirma que la composición exacta varía por\n * variante (Calendar lleva botón \"Today\" + date-range ButtonGroup; Table\n * lleva \"Sort by\" Select), y que cada control ya existe homologado en SUI.\n * Un monolito duplicaría 5 componentes y multiplicaría la matriz a 32 combos\n * internos. El contenedor solo aporta el LAYOUT (split, gap, wrap responsive)\n * y deja el wiring al consumer.\n *\n * EXACT (verificado vía Figma MCP — node 4370:6018 HorizontalFilter):\n * Layout Left/Right split (justify-between)\n * gap entre lados 12px (outer container gap-[12px])\n * gap interno 12px entre controles de un mismo lado (nodo Right 4370:6023\n * gap-[12px]; el valor 8px del audit era incorrecto)\n * Calendar variant left: Today button + date-range ButtonGroup; right: search\n * Table variant right: search + \"Sort by\" Select (shortBy boolean)\n * Search kbd badge ⌘1 → usar <sui-kbd> dentro del slot del input (ver demo)\n *\n * Slots (named ng-content):\n * [slot=start] → controles del lado izquierdo (segmented, today, date-range)\n * [slot=end] → controles del lado derecho (search, sort-by select)\n * (default) → fallback: todo en una fila si no se usan los slots\n *\n * PENDING VERIFY (inferred — no presente en el nodo Figma):\n * - Wrap responsive: en ≤640px apila start/end en columna (decisión project,\n * no especificada en Figma).\n * - El badge ⌘1 dentro del search: el audit lo marca como feature de Figma sin\n * handler claro (¿focus search?). Aquí se deja como slot decorativo dentro\n * del input; el consumer decide si cablea un keydown global. Ver newQuestions.\n *\n * Usage (Table variant):\n * <sui-filter-bar>\n * <sui-tabs slot=\"start\" variant=\"segment\" [tabs]=\"views\" [(active)]=\"view\" />\n * <div slot=\"end\" class=\"row\">\n * <sui-input type=\"search\" placeholder=\"Search…\" [(value)]=\"q\">\n * <sui-kbd input-suffix>⌘1</sui-kbd>\n * </sui-input>\n * <sui-select [options]=\"sortOpts\" leadingIcon=\"sort-desc\" placeholder=\"Sort by\" />\n * </div>\n * </sui-filter-bar>\n */\n@Component({\n selector: 'sui-filter-bar',\n templateUrl: './sui-filter-bar.html',\n styleUrl: './sui-filter-bar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-variant]': 'variant()',\n },\n})\nexport class SuiFilterBar {\n /** Variante de la toolbar. Solo afecta hints de layout/responsive, no el wiring. */\n readonly variant = input<'calendar' | 'table'>('table');\n}\n","<div class=\"sui-filter-bar__side sui-filter-bar__side--start\">\n <ng-content select=\"[slot=start]\" />\n</div>\n<div class=\"sui-filter-bar__side sui-filter-bar__side--end\">\n <ng-content select=\"[slot=end]\" />\n</div>\n<!-- Fallback: contenido sin slot fluye en una fila única -->\n<ng-content />\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiFilterItemState = 'default' | 'active';\n\n/**\n * SUI Filter Item — SUI Design System 2.0 (\"Filters\" / VerticalFilterItems)\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Sub-component: VerticalFilterItems\n * State(Default | Hover | Active) × leftIcon(on | off) = 6 combos\n *\n * Es la fila individual de un panel de filtros vertical (popover/drawer de\n * opciones). El consumer lista varios `<sui-filter-item>` dentro del cuerpo de\n * un panel (cuyo header/footer son `sui-filter-panel-header` /\n * `sui-filter-panel-footer`).\n *\n * EXACT (verificado vía Figma MCP — node 4379:1183, get_design_context +\n * get_variable_defs por estado: 4379:1182 default, 4379:1184 hover, 4379:1189 active):\n * Container w-200px (en Figma; aquí fluido al 100% del panel), p-8px,\n * gap-8px, radius-8, overflow-clip, items-center\n * Left icon slot opcional, 20×20\n * Label Inter Medium 14/20, -0.6%\n * Active chevron arrow-right-s-line (20×20) a la derecha, solo en active\n * States (colores por estado, verificados):\n * Default → bg/white-0 + label text/sub-600 + leftIcon icon/soft-400\n * Hover → bg/weak-50 + label text/sub-600 + leftIcon icon/sub-600 (CSS :hover)\n * Active → bg/weak-50 + label text/strong-950 + leftIcon primary-base\n * + chevron icon/soft-400\n *\n * Token map (Figma → sui-tokens.scss):\n * bg/white-0 → --sui-bg-white-0\n * bg/weak-50 → --sui-bg-weak-50\n * text/sub-600 → --sui-text-sub-600\n * text/strong-950 → --sui-text-strong-950\n * icon/soft-400 → --sui-icon-soft-400 (leftIcon default + chevron active)\n * icon/sub-600 → --sui-icon-sub-600 (leftIcon hover)\n * primary-base → --sui-primary-base (leftIcon active)\n *\n * PENDING VERIFY (inferred — no presente en el nodo Figma):\n * - Disabled: no está en Figma; opacity 0.4 + pointer-events none por convención.\n * - Focus ring: 2px outline primary-base (convención project).\n * - Anchura: Figma fija w-200px; aquí fluido (100%) para soportar paneles de\n * distintos tamaños. Ver newQuestions.\n *\n * Usage:\n * <sui-filter-item leftIcon=\"user-line\" [active]=\"sel()==='users'\"\n * (selected)=\"sel.set('users')\">Users</sui-filter-item>\n */\n@Component({\n selector: 'sui-filter-item',\n templateUrl: './sui-filter-item.html',\n styleUrl: './sui-filter-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"option\"',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '[attr.aria-selected]': 'active()',\n /* iOS WKWebView fix — sin estos, el :active queda stuck 300-500ms\n en pages standalone. Ver feedback_ios_active_stuck.md */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event); $event.preventDefault()',\n },\n})\nexport class SuiFilterItem {\n readonly active = input(false);\n readonly disabled = input(false);\n /** Icono opcional a la izquierda del label (20×20). */\n readonly leftIcon = input<string | null>(null);\n /** Icono que aparece a la derecha cuando está active. Override del default. */\n readonly activeIcon = input<string>('arrow-right-s-line');\n\n readonly selected = output<Event>();\n\n readonly state = computed<SuiFilterItemState>(() => (this.active() ? 'active' : 'default'));\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.selected.emit(event);\n }\n}\n","@if (leftIcon(); as li) {\n <sui-icon [name]=\"li\" [size]=\"20\" class=\"sui-filter-item__icon sui-filter-item__icon--left\" />\n}\n<span class=\"sui-filter-item__label\"><ng-content /></span>\n@if (active()) {\n <sui-icon [name]=\"activeIcon()\" [size]=\"20\" class=\"sui-filter-item__icon sui-filter-item__icon--active\" />\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\n\n/**\n * SUI Filter Panel Header — SUI Design System 2.0 (\"Filters\" / VerticalFilterHeader)\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Sub-component: VerticalFilterHeader\n * leftIcon(on | off) × linkButton(on | off) = 4 combos\n *\n * Header del panel de filtros vertical. Slot izquierdo opcional (icono), label\n * en negrita al centro/izquierda, y un link \"Clear\" opcional a la derecha.\n *\n * EXACT (pulled from audit reports.json → name=\"Filters\"):\n * Container px-20 py-16, border-bottom stroke/soft-200, w-400px\n * (aquí fluido al 100%)\n * Left icon slot opcional, 20×20 (icon/sub-600)\n * Label text/strong-950, Inter Medium 14/20\n * Clear link text/sub-600, underlined → usa sui-link-button variant=\"gray\"\n * [underline]\n *\n * Token map (Figma → sui-tokens.scss):\n * px-20 py-16 → 16px 20px\n * border-bottom → 1px solid --sui-stroke-soft-200\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600 (link)\n *\n * PENDING VERIFY (inferred — Figma MCP no disponible, valores de audit):\n * - Anchura w-400px fija en Figma → fluida (100%) en implementación.\n * - Posición del icono: a la izquierda del label (asumido por nombre del slot).\n *\n * Usage:\n * <sui-filter-panel-header label=\"Filters\" leftIcon=\"equalizer-line\"\n * [clearable]=\"true\" (clear)=\"onClear()\" />\n */\n@Component({\n selector: 'sui-filter-panel-header',\n templateUrl: './sui-filter-panel-header.html',\n styleUrl: './sui-filter-panel-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiLinkButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n})\nexport class SuiFilterPanelHeader {\n readonly label = input<string>('');\n /** Icono opcional a la izquierda del label (20×20). */\n readonly leftIcon = input<string | null>(null);\n /** Muestra el link \"Clear\" a la derecha. */\n readonly clearable = input(false);\n /** Texto del link de limpieza. */\n readonly clearLabel = input<string>('Clear');\n\n readonly clear = output<void>();\n}\n","@if (leftIcon(); as li) {\n <sui-icon [name]=\"li\" [size]=\"20\" class=\"sui-filter-panel-header__icon\" />\n}\n<span class=\"sui-filter-panel-header__label\">{{ label() }}</span>\n@if (clearable()) {\n <sui-link-button\n class=\"sui-filter-panel-header__clear\"\n variant=\"gray\"\n size=\"small\"\n [underline]=\"true\"\n (clicked)=\"clear.emit()\"\n >{{ clearLabel() }}</sui-link-button>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiButton } from '../sui-button/sui-button';\n\n/**\n * SUI Filter Panel Footer — SUI Design System 2.0 (\"Filters\" / VerticalFilterFooter)\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Sub-component: VerticalFilterFooter\n * Type(Buttons) = 1 combo\n *\n * Footer del panel de filtros vertical: dos botones full-width lado a lado —\n * \"Clear\" (stroke, bg/white-0 + border) y \"Apply\" (filled primary).\n *\n * EXACT (verificado vía Figma MCP — node 4415:863 / outer 4415:858,\n * Actions wrapper 4415:857):\n * Container px-20 py-16, border-top stroke/soft-200, overflow-clip,\n * w-472px (aquí fluido al 100%), gap 16px entre botones\n * Clear button bg-white + border stroke/soft-200, p-8px, radius-8,\n * text/sub-600 → sui-button variant=\"stroke\" color=\"neutral\" size=\"small\"\n * Apply button bg primary-base, text static-white, p-8px, radius-8\n * → sui-button variant=\"filled\" color=\"primary\" size=\"small\"\n * Ambos botones flex:1 (full-width compartido)\n *\n * Token map (Figma → sui-tokens.scss):\n * px-20 py-16 → 16px 20px\n * border-top → 1px solid --sui-stroke-soft-200\n * gap (Actions) → 16px\n * primary-base → --sui-primary-base (via sui-button filled primary)\n * button p-8/r-8 → sui-button size=\"small\" (height 36, padding 8, radius 8)\n *\n * PENDING VERIFY (inferred — no presente en el nodo Figma):\n * - Anchura w-472px fija en Figma → fluida (100%).\n *\n * Usage:\n * <sui-filter-panel-footer (clear)=\"onClear()\" (apply)=\"onApply()\" />\n * <sui-filter-panel-footer clearLabel=\"Reset\" applyLabel=\"Aplicar filtros\"\n * [applyDisabled]=\"!dirty()\" (apply)=\"onApply()\" />\n */\n@Component({\n selector: 'sui-filter-panel-footer',\n templateUrl: './sui-filter-panel-footer.html',\n styleUrl: './sui-filter-panel-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiButton],\n})\nexport class SuiFilterPanelFooter {\n readonly clearLabel = input<string>('Clear');\n readonly applyLabel = input<string>('Apply');\n readonly clearDisabled = input(false);\n readonly applyDisabled = input(false);\n /** Tamaño de los botones. Default 'small' (Figma: p-8px/radius-8 = size small). */\n readonly size = input<'small' | 'medium'>('small');\n\n readonly clear = output<void>();\n readonly apply = output<void>();\n}\n","<sui-button\n class=\"sui-filter-panel-footer__btn\"\n variant=\"stroke\"\n color=\"neutral\"\n [size]=\"size()\"\n [disabled]=\"clearDisabled()\"\n (click)=\"!clearDisabled() && clear.emit()\"\n>{{ clearLabel() }}</sui-button>\n<sui-button\n class=\"sui-filter-panel-footer__btn\"\n variant=\"filled\"\n color=\"primary\"\n [size]=\"size()\"\n [disabled]=\"applyDisabled()\"\n (click)=\"!applyDisabled() && apply.emit()\"\n>{{ applyLabel() }}</sui-button>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiAvatar, SuiAvatarSize } from '../sui-avatar/sui-avatar';\nimport { SuiButton } from '../sui-button/sui-button';\n\nexport type SuiImageUploadProfileAlignment = 'vertical' | 'horizontal';\nexport type SuiImageUploadProfileType = 'avatar' | 'company';\n\n/**\n * SUI Image Upload Profile — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 452:653 (\"Image Upload [1.1]\")\n * 8 variants = Type(Avatar|Company) × State(Empty|Uploaded) × Alignment(Vertical|Horizontal)\n * Nodos verificados via MCP get_design_context 2026-05-29:\n * 452:645 Avatar / Empty / Vertical → Text(title+subtitle) + Upload\n * 452:693 Avatar / Uploaded / Vertical → Text + (Remove + Change)\n * 452:785 Company / Empty / Vertical → Text + Upload\n * 452:792 Company / Uploaded / Vertical → Text + (Remove + Change), avatar = `pickCompany` slot (fallback Apex logo)\n * 452:983 Avatar / Empty / Horizontal → SOLO Upload (sin Text)\n * 452:990 Avatar / Uploaded / Horizontal → SOLO (Remove + Change) (sin Text)\n * 452:999 Company / Empty / Horizontal → SOLO Upload (sin Text)\n * 452:1006 Company / Uploaded / Horizontal → SOLO (Remove + Change) (sin Text)\n *\n * REGLA DE TEXTO (verificada node-by-node 2026-05-29):\n * El bloque \"Text\" (title + subtitle) SOLO existe cuando alignment=Vertical.\n * En Horizontal el frame \"Profile Content\" contiene ÚNICAMENTE los botones —\n * tanto en Empty como en Uploaded. (El `data-name=\"Text\"` que aparece anidado\n * en los nodos Horizontal es la LABEL interna del botón, no un title/subtitle.)\n * → `showText() === (alignment === 'vertical')`. NO depende del state.\n *\n * Layout \"Profile Content\" (distinto del square-preview `sui-image-upload`):\n * [Avatar/Company circle | gap 20 | (Text: title + subtitle)? + Action buttons]\n *\n * EXACT (pulled from Figma, verified per-variant):\n * Vertical (452:645):\n * root: flex, gap 20px, items-start\n * avatar: 64px circle → <sui-avatar size=\"3xl\">\n * Profile Content: flex-col, gap 12px, items-start\n * Text block: flex-col, gap 4px\n * title → Label/Medium 16/24/-1.1% 500 text-strong-950\n * subtitle → Paragraph/Small 14/20/-0.6% 400 text-sub-600\n * Actions: flex-row, gap 12px\n * Horizontal (452:983):\n * root: flex, gap 20px, items-center\n * avatar: 56px circle → <sui-avatar size=\"2xl\">\n * Profile Content: SOLO los botones (sin Text block) — items-start\n *\n * Action buttons (\"Buttons [1.1]\"):\n * Empty → un botón \"Upload\" (stroke neutral) — node I452:590;130:4265\n * Uploaded → fila \"Remove\" (stroke ERROR) — node 452:699\n * + \"Change\" (stroke neutral) — node 452:847\n * Geometría Figma: p-6 uniforme, radius-8, inner text-wrap px-4,\n * Label/Small 14/20/-0.6% 500. Mapea EXACTO a <sui-button size=\"xsmall\">.\n * Labels configurables via inputs (uploadLabel/removeLabel/changeLabel) —\n * en Figma están hardcodeadas en inglés; acá el default va en español\n * (tuteo peruano) y el consumer puede overridear para i18n.\n *\n * Type=Company (452:792 / 452:1006): el avatar es un SLOT `pickCompany` —\n * el consumer pasa el logo real de la empresa. Acá se expone como\n * `companyLogoSrc` (URL de imagen). Si no se pasa, el fallback Empty es la\n * silueta de edificios (icono custom `building-skyline`). El recorte es\n * circular (`overflow-clip rounded-full` en Figma) — coincide con sui-avatar.\n * Type=Avatar placeholder (Empty): silueta humana — fallback default de sui-avatar.\n *\n * Company empty placeholder (node 253:6939): silueta compuesta de 2 edificios +\n * ventanas sobre bg-soft-200. Se reproduce con el icono custom DS\n * `building-skyline` (registrado en SUI_CUSTOM_ICONS) — más fiel que el\n * RemixIcon `building-2-fill` de una sola línea. Ver PENDING VERIFY.\n *\n * PENDING VERIFY (inferido, no pixel-pulled):\n * - Company empty placeholder glyph: SUI usa un SVG raster de 13 nodos\n * (2 buildings + ~10 window squares, node 253:6939). El icono custom\n * `building-skyline` es una APROXIMACIÓN vectorial de esa silueta (2 torres\n * con ventanas), no el asset raster exacto del DS. Pixel-match 1:1 requeriría\n * exportar el SVG compuesto del DS — pendiente para Anthony si se necesita.\n * - Textos default (\"Upload Image\" / \"Min 400x400px, PNG or JPEG\"): en Figma\n * están en inglés; acá se exponen como inputs y el default va en español.\n * - Estados hover/active de los botones: heredados de sui-button.\n *\n * Inputs:\n * - imageUrl: URL/dataURL de la imagen actual. null/'' → estado Empty.\n * También es el VALUE del CVA (form control).\n * - companyLogoSrc: URL del logo de empresa (Type=Company, slot `pickCompany`).\n * Si se pasa, fuerza el estado Uploaded en Company.\n * - title: título (Label/Medium). Default \"Subir imagen\".\n * - subtitle: subtítulo (Paragraph/Small). Default hint de dimensiones.\n * - alignment: 'vertical' (texto + avatar 64) | 'horizontal' (avatar 56, sin texto).\n * - type: 'avatar' (silueta humana) | 'company' (silueta edificios).\n * - uploadLabel / removeLabel / changeLabel: copy de los botones (i18n).\n * - disabled: deshabilita los botones (no se puede interactuar).\n * - loading: estado de carga (botones deshabilitados mientras sube).\n *\n * Outputs:\n * - upload: click en \"Upload\" (estado Empty).\n * - remove: click en \"Remove\" (estado Uploaded).\n * - change: click en \"Change\" (estado Uploaded).\n *\n * CVA: implementa ControlValueAccessor sobre `imageUrl` (string|null). Permite\n * `<sui-image-upload-profile formControlName=\"avatar\">`. `writeValue` setea el\n * value interno; `(remove)` lo limpia a null y `(upload)/(change)` marcan\n * touched. El consumer sigue cableando el file picker a (upload)/(change) y,\n * tras subir, escribe la URL al FormControl (writeValue la refleja como\n * estado Uploaded).\n *\n * Nota: este componente es PRESENTACIONAL. No abre file pickers ni valida MIME;\n * el consumer cablea (upload)/(change) a su propio <input type=file> o flujo.\n */\n@Component({\n selector: 'sui-image-upload-profile',\n standalone: true,\n imports: [SuiAvatar, SuiButton],\n templateUrl: './sui-image-upload-profile.html',\n styleUrl: './sui-image-upload-profile.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiImageUploadProfile),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). El input\n `title` sigue accesible como property; solo se borra del DOM para que el\n browser no muestre el tooltip nativo gris. */\n '[attr.title]': 'null',\n '[attr.data-sui-alignment]': 'alignment()',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-loading]': 'loading() ? \"\" : null',\n },\n})\nexport class SuiImageUploadProfile implements ControlValueAccessor {\n readonly imageUrl = input<string | null>(null);\n readonly companyLogoSrc = input<string | null>(null);\n readonly title = input<string>('Subir imagen');\n readonly subtitle = input<string>('Mín. 400x400px, PNG o JPEG');\n readonly alignment = input<SuiImageUploadProfileAlignment>('vertical');\n readonly type = input<SuiImageUploadProfileType>('avatar');\n\n readonly uploadLabel = input<string>('Subir');\n readonly removeLabel = input<string>('Eliminar');\n readonly changeLabel = input<string>('Cambiar');\n\n readonly disabled = input(false);\n readonly loading = input(false);\n\n readonly upload = output<void>();\n readonly remove = output<void>();\n readonly change = output<void>();\n\n /** Value interno del CVA (espeja `imageUrl`, escribible via writeValue). */\n private readonly _formValue = signal<string | null>(null);\n /** Disabled forzado por el FormControl (setDisabledState). */\n private readonly _disabledByForm = signal(false);\n\n private _onChange: (v: string | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Imagen efectiva: input `imageUrl` o el value del FormControl (CVA). */\n protected readonly resolvedImage = computed<string | null>(\n () => this.imageUrl() || this._formValue() || null,\n );\n\n /** Disabled efectivo: input `disabled`, value del form, o `loading`. */\n readonly isDisabled = computed(\n () => this.disabled() || this._disabledByForm() || this.loading(),\n );\n\n /**\n * Empty cuando no hay imagen ni logo de empresa; Uploaded cuando hay alguno.\n * (Company puede estar Uploaded por `companyLogoSrc` aunque `imageUrl` sea null.)\n */\n protected readonly state = computed<'empty' | 'uploaded'>(() =>\n this.resolvedImage() || this.companyLogoSrc() ? 'uploaded' : 'empty',\n );\n\n /** Src que se pasa al avatar: logo de empresa (Company) o imagen (Avatar). */\n protected readonly avatarSrc = computed<string | null>(() =>\n this.type() === 'company'\n ? this.companyLogoSrc() || this.resolvedImage()\n : this.resolvedImage(),\n );\n\n /** Vertical → avatar 64px (3xl); Horizontal → 56px (2xl). */\n protected readonly avatarSize = computed<SuiAvatarSize>(() =>\n this.alignment() === 'horizontal' ? '2xl' : '3xl',\n );\n\n /**\n * Company empty → silueta de edificios (icono custom DS `building-skyline`);\n * Avatar empty → silueta humana (null → fallback default del avatar).\n */\n protected readonly placeholderIcon = computed<string | null>(() =>\n this.type() === 'company' ? 'building-skyline' : null,\n );\n\n /** El bloque de texto solo se muestra en Vertical (Horizontal es solo botones). */\n protected readonly showText = computed(() => this.alignment() === 'vertical');\n\n onUpload(): void {\n if (this.isDisabled()) return;\n this._onTouched();\n this.upload.emit();\n }\n\n onRemove(): void {\n if (this.isDisabled()) return;\n this._onTouched();\n /* Limpia el value del CVA: tras remove el control queda en estado Empty. */\n this._formValue.set(null);\n this._onChange(null);\n this.remove.emit();\n }\n\n onChange(): void {\n if (this.isDisabled()) return;\n this._onTouched();\n this.change.emit();\n }\n\n // ── CVA ────────────────────────────────────────────────────────────────────\n\n writeValue(v: string | null): void {\n this._formValue.set(v ?? null);\n }\n\n registerOnChange(fn: (v: string | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!--\n Image Upload Profile — SUI 2.0 (Figma 452:653).\n Avatar/Company circle + Profile Content (texto + acciones).\n Avatar size: 3xl(64) vertical / 2xl(56) horizontal — vía avatarSize().\n Company → src = companyLogoSrc (slot `pickCompany`); empty → glyph edificios.\n Avatar → src = imageUrl/form value; empty → silueta humana default.\n Texto SOLO en Vertical (showText()) — Horizontal es solo botones, en ambos states.\n-->\n<sui-avatar\n class=\"sui-iup__avatar\"\n [size]=\"avatarSize()\"\n color=\"gray\"\n [src]=\"avatarSrc()\"\n [icon]=\"placeholderIcon()\"\n [alt]=\"title()\"\n/>\n\n<div class=\"sui-iup__content\">\n @if (showText()) {\n <div class=\"sui-iup__text\">\n <span class=\"sui-iup__title\">{{ title() }}</span>\n <span class=\"sui-iup__subtitle\">{{ subtitle() }}</span>\n </div>\n }\n\n @if (state() === 'empty') {\n <div class=\"sui-iup__actions\">\n <sui-button\n variant=\"stroke\"\n color=\"neutral\"\n size=\"xsmall\"\n [disabled]=\"isDisabled()\"\n (click)=\"onUpload()\"\n >\n {{ uploadLabel() }}\n </sui-button>\n </div>\n } @else {\n <div class=\"sui-iup__actions\">\n <sui-button\n variant=\"stroke\"\n color=\"error\"\n size=\"xsmall\"\n [disabled]=\"isDisabled()\"\n (click)=\"onRemove()\"\n >\n {{ removeLabel() }}\n </sui-button>\n <sui-button\n variant=\"stroke\"\n color=\"neutral\"\n size=\"xsmall\"\n [disabled]=\"isDisabled()\"\n (click)=\"onChange()\"\n >\n {{ changeLabel() }}\n </sui-button>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiImageUploadShape = 'circle' | 'rect';\nexport type SuiImageUploadSize = 'sm' | 'md' | 'lg' | 'xl';\n\n/** px values per size token */\nconst SIZE_PX: Record<SuiImageUploadSize, number> = {\n sm: 80,\n md: 120,\n lg: 160,\n xl: 200,\n};\n\nconst ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];\n\n/**\n * SUI Image Upload — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO (\"Image Upload\" — node 452:653)\n *\n * ⚠️ DIVERGENCIA ESTRUCTURAL CONOCIDA vs Figma (verificada via MCP 2026-05-29):\n * El componente SUI \"Image Upload [1.1]\" (node 452:653) NO es un widget de\n * crop-preview self-contained como este. Es un layout de \"Profile Content\":\n * [Avatar 64px circle | gap-20 | (Text: title Label/Medium 16/24/-1.1% +\n * subtitle Paragraph/Small 14/20/-0.6%) gap-12 + Action buttons]\n * con variants Type=Avatar/Company, State=Empty/Uploaded, Alignment=Vertical/\n * Horizontal. Empty → un botón \"Upload\" (stroke neutral); Uploaded → fila\n * \"Remove\" (stroke ERROR) + \"Change\" (stroke neutral).\n *\n * Este `sui-image-upload` es un patrón UX DISTINTO (square clickable con preview\n * inline + overlay) que YA consumen 6 ubicaciones de producción (mi-negocio,\n * promociones, add-product-modal, plan-change-modal) vía [(src)]/[shape]/[size]/\n * (imageSelected)/(removed). Homologar a 452:653 rompería los 6 consumers y les\n * quitaría el preview inline que necesitan. La paridad exacta con 452:653\n * requiere un componente NUEVO (ej. sui-image-upload-profile) — ver newQuestions.\n *\n * Upload + preview de UNA imagen (avatar de usuario o logo de empresa).\n * Shapes: circle (avatar) | rect (banner/logo).\n * Estados: empty / filled / dragover / disabled.\n *\n * EXACT (pulled from Figma, verified):\n * - NINGUNO de este layout. El node 452:653 describe OTRA estructura (ver arriba).\n * Los valores de abajo son convención de proyecto.\n *\n * PENDING VERIFY (inferred, not pulled from Figma):\n * - Sizes (4 variants square px): sm=80, md=120, lg=160, xl=200 — escalera\n * uniforme arbitraria. SUI puede publicar dims fijas por shape\n * (avatar circle: 64/96/128 vs rect: 120/200/320).\n * - Shape circle vs rect distinción solo via border-radius (999px vs\n * radius-12). SUI puede tener Shape variants con padding/proportions\n * diferentes (rect aspect 4:3 vs square circle).\n * - Empty state: dashed border + icon container 32px + title 12/16 500 +\n * subtitle 11/15 400 + (xl override 40px / 13/18 + 12/16): TODOS los\n * valores inferidos. Shortcut 1.27 — per-size padding flattened.\n * - Hover/dragover treatment inferido (shortcut 1.26):\n * hover empty: border sub-300 + bg weak-50\n * hover filled: overlay rgba(0,0,0,0.4) + pencil icon white\n * dragover: border primary-base + bg primary-alpha-10\n * - Filled overlay z-index/animation (opacity 0→1 200ms): convención.\n * - Error text typography (10/14 sin font-weight): shortcut 1.5 + 1.12.\n *\n * RESUELTO 2026-05-29:\n * - 1.7 (component library): el botón \"Quitar\" pasó de <button> custom a\n * <sui-button variant=\"stroke\" color=\"error\" size=\"2xsmall\">. Los iconos\n * cámara/lápiz pasaron de SVG inline a <sui-icon name=\"image-add-line\" /> y\n * <sui-icon name=\"pencil-line\" />.\n *\n * KNOWN SHORTCUT VIOLATIONS:\n * - 1.26 (hover/active inferido): overlay rgba(0,0,0,0.4) + pencil icon\n * son convención visual — SUI puede usar bg-blur backdrop o gradient.\n * - 1.27 (per-size flattened): xl override hardcoded en SCSS, sm/md/lg\n * comparten todo (subtitle hidden en sm es la única diferencia).\n * - 1.14 (opacity values): rgba(0,0,0,0.4) y rgba(255,255,255,0.2) NO\n * mapeados a tokens (--sui-overlay-dark / --sui-overlay-light si\n * existieran).\n *\n * COLOR MAPPING:\n * rgba(0,0,0,0.4) → hover overlay — NO TOKEN (raw value)\n * rgba(255,255,255,0.2) → pencil bg — NO TOKEN (raw value)\n * #ebebeb → --sui-stroke-soft-200 — convention OK\n * #fa7319 → --sui-primary-base — convention OK\n * #fb3748 → --sui-state-error-base — convention OK\n *\n * Inputs:\n * - shape: 'circle' | 'rect' — visual del preview\n * - size: 'sm'(80) | 'md'(120) | 'lg'(160) | 'xl'(200) px\n * - src (model): URL de la imagen actual — bidireccional\n * - maxSize: bytes; 0 = sin límite\n * - title / subtitle: override de textos\n * - disabled: bloquea interacción\n *\n * Outputs:\n * - imageSelected: File seleccionado/dropeado\n * - removed: usuario hizo click en \"Quitar\"\n * - errorEvent: mensaje de error de validación\n */\n@Component({\n selector: 'sui-image-upload',\n standalone: true,\n imports: [SuiButton, SuiIcon],\n templateUrl: './sui-image-upload.html',\n styleUrl: './sui-image-upload.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-shape]': 'shape()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-state]': 'state()',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'disabled() ? -1 : 0',\n '[style.width.px]': 'sizePx()',\n '[style.height.px]': 'sizePx()',\n /* iOS WKWebView :active fix — CRITICO para pages standalone */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n '(click)': 'onHostClick()',\n '(keydown.enter)': 'onHostClick()',\n '(keydown.space)': 'onHostClick(); $event.preventDefault()',\n '(dragover)': 'onDragOver($event)',\n '(dragleave)': 'onDragLeave($event)',\n '(drop)': 'onDrop($event)',\n },\n})\nexport class SuiImageUpload {\n readonly shape = input<SuiImageUploadShape>('circle');\n readonly size = input<SuiImageUploadSize>('lg');\n readonly src = model<string | null>(null);\n readonly maxSize = input<number>(0);\n readonly title = input<string | null>(null);\n readonly subtitle = input<string | null>(null);\n readonly disabled = input<boolean>(false);\n /** Opt-in: en estado filled muestra controles de ÍCONO (editar + tacho) en vez\n * del overlay de re-subir + botón \"Quitar\". El click en editar emite\n * `editRequested` (el consumer abre su editor/recortador). No afecta a los\n * consumers que no lo activan. */\n readonly editable = input<boolean>(false);\n\n readonly imageSelected = output<File>();\n readonly removed = output<void>();\n readonly editRequested = output<void>();\n readonly errorEvent = output<string>();\n\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('imgInput');\n protected readonly dragging = signal(false);\n protected readonly internalError = signal<string | null>(null);\n\n protected readonly sizePx = computed(() => SIZE_PX[this.size()]);\n\n /** Camera icon px en el empty state. xl escala a 20, resto 16\n * (matchea el escalado del contenedor 32→40 en SCSS). */\n protected readonly iconSize = computed(() => (this.size() === 'xl' ? 20 : 16));\n\n protected readonly hasSrc = computed(() => !!this.src());\n\n protected readonly state = computed<'empty' | 'filled' | 'dragover' | 'disabled'>(() => {\n if (this.disabled()) return 'disabled';\n if (this.dragging()) return 'dragover';\n if (this.hasSrc()) return 'filled';\n return 'empty';\n });\n\n protected readonly resolvedTitle = computed(() => {\n if (this.title()) return this.title()!;\n return this.shape() === 'circle' ? 'Subir foto' : 'Subir logo';\n });\n\n protected readonly resolvedSubtitle = computed(() => {\n if (this.subtitle()) return this.subtitle()!;\n const max = this.maxSize();\n const base = 'JPG, PNG o WEBP';\n return max > 0 ? `${base} — máx ${this.formatBytes(max)}` : base;\n });\n\n onHostClick(): void {\n if (this.disabled() || this.hasSrc()) return;\n this.inputRef()?.nativeElement.click();\n }\n\n onChangeClick(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled()) return;\n this.inputRef()?.nativeElement.click();\n }\n\n /** Modo editable: pide al consumer que abra su editor (recortador). */\n onEditClick(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled()) return;\n this.editRequested.emit();\n }\n\n onRemoveClick(e: MouseEvent): void {\n e.stopPropagation();\n if (this.disabled()) return;\n this.src.set(null);\n this.internalError.set(null);\n this.removed.emit();\n }\n\n onDragOver(e: DragEvent): void {\n if (this.disabled()) return;\n e.preventDefault();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n if (this.disabled()) return;\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length) this.processFile(files[0]);\n }\n\n protected onInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n private processFile(file: File): void {\n if (!ALLOWED_TYPES.includes(file.type)) {\n const msg = 'Tipo no soportado. Usá JPG, PNG, WEBP o GIF.';\n this.internalError.set(msg);\n this.errorEvent.emit(msg);\n return;\n }\n const max = this.maxSize();\n if (max > 0 && file.size > max) {\n const msg = `Imagen supera el tamaño máximo (${this.formatBytes(max)})`;\n this.internalError.set(msg);\n this.errorEvent.emit(msg);\n return;\n }\n this.internalError.set(null);\n const reader = new FileReader();\n reader.onload = (ev) => {\n this.src.set(ev.target?.result as string);\n };\n reader.readAsDataURL(file);\n this.imageSelected.emit(file);\n }\n\n private formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n}\n","<!-- Estado: sin imagen (empty / dragover) -->\n@if (!hasSrc()) {\n <div class=\"sui-image-upload__empty\">\n <!-- Icono cámara — sui-icon (DS), no SVG inline -->\n <div class=\"sui-image-upload__icon\">\n <sui-icon name=\"image-add-line\" [size]=\"iconSize()\" aria-hidden=\"true\" />\n </div>\n\n <div class=\"sui-image-upload__text\">\n <p class=\"sui-image-upload__title\">{{ resolvedTitle() }}</p>\n <p class=\"sui-image-upload__subtitle\">{{ resolvedSubtitle() }}</p>\n </div>\n\n @if (internalError()) {\n <p class=\"sui-image-upload__error\">{{ internalError() }}</p>\n }\n </div>\n}\n\n<!-- Estado: con imagen (filled) -->\n@if (hasSrc()) {\n <div class=\"sui-image-upload__preview\" [class.sui-image-upload__preview--editable]=\"editable()\">\n <img\n class=\"sui-image-upload__img\"\n [src]=\"src()\"\n alt=\"Preview\"\n draggable=\"false\" />\n\n @if (editable()) {\n <!-- Modo editable: controles de ícono en esquina (editar + tacho). -->\n <div class=\"sui-image-upload__controls\">\n <button\n type=\"button\"\n class=\"sui-image-upload__ctrl\"\n aria-label=\"Editar imagen\"\n [disabled]=\"disabled()\"\n (click)=\"onEditClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <sui-icon name=\"pencil-line\" [size]=\"16\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n class=\"sui-image-upload__ctrl sui-image-upload__ctrl--danger\"\n aria-label=\"Quitar imagen\"\n [disabled]=\"disabled()\"\n (click)=\"onRemoveClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <sui-icon name=\"delete-bin-line\" [size]=\"16\" aria-hidden=\"true\" />\n </button>\n </div>\n } @else {\n <!-- Overlay hover con icono lapiz (re-subir) -->\n <div class=\"sui-image-upload__overlay\" (click)=\"onChangeClick($event)\">\n <div class=\"sui-image-upload__overlay-icon\">\n <sui-icon name=\"pencil-line\" [size]=\"16\" aria-hidden=\"true\" />\n </div>\n </div>\n }\n </div>\n\n @if (!editable()) {\n <!-- Botón Quitar debajo del preview — sui-button stroke (DS), no <button> custom.\n Figma node 452:699 \"Remove\" = stroke error; aquí usamos color=error para\n que el affordance de borrado sea consistente con el DS. -->\n <sui-button\n class=\"sui-image-upload__remove\"\n variant=\"stroke\"\n color=\"error\"\n size=\"2xsmall\"\n [disabled]=\"disabled()\"\n (click)=\"onRemoveClick($event)\">\n Quitar\n </sui-button>\n }\n}\n\n<!-- Input file oculto (siempre presente para el click) -->\n<input\n #imgInput\n type=\"file\"\n class=\"sui-image-upload__input\"\n accept=\"image/jpeg,image/png,image/webp,image/gif\"\n [disabled]=\"disabled()\"\n (change)=\"onInputChange($event)\" />\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/**\n * SUI Inline Input — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: \"Inline Input [1.1]\" (frame 429:5195) — 6 states\n * Default (429:5196), Hover (429:5726), Focus (429:5740),\n * Filled (429:5770), Disabled (429:5784), Error (429:5805)\n *\n * Input borderless que vive inline dentro de texto/tablas/cards. En reposo\n * (default/hover) muestra el texto + un botón lápiz (edit). Al entrar en modo\n * edición (focus/error) el texto se vuelve editable y aparecen dos botones:\n * check (confirmar) y close (cancelar). NO tiene el border de un field estándar.\n *\n * EXACT specs — VERIFIED from Figma nodeIds (429:5196, 429:5726, 429:5740,\n * 429:5770, 429:5784, 429:5805):\n *\n * Layout (común):\n * display: flex, gap: 8px, align-items: center\n * padding: 8px (py) / 10px (pl) — pr depende de # de botones:\n * reposo (1 botón pencil): pr = 36px\n * edición (2 botones): pr = 64px\n * border-radius: 8px (--sui-radius-8)\n * leading-icon: 20px (default user-3-line, overridable vía [leftIcon])\n * Typography: Paragraph/Small 14px / 400 / 20px / -0.006em (letterSpacing\n * -0.6 ≈ -0.043em del DS pero el token canon es -0.006em; ver inline-select),\n * font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n * Action button: Compact Button [1.1] — p 2px, radius 6px (--sui-radius-6),\n * icon 20px. Posicionado absolute a la derecha.\n * reposo: pencil right 6px\n * edición: check right 5px + close right 33px\n *\n * State colors (PULLED per-state from Figma):\n * Default (429:5196): bg transparent · sin border · text text-soft-400\n * (#a3a3a3) · icon icon-soft-400 · botón pencil-line\n * Hover (429:5726): bg bg-weak-50 (#f7f7f7) · sin border ·\n * text text-sub-600 (#5c5c5c) · botón pencil-line\n * Focus (429:5740): bg bg-white-0 · border 1px stroke-strong-950 (#171717) ·\n * text text-strong-950 · shadow components/buttons/important-focus\n * (0 0 0 2px white, 0 0 0 4px slate-alpha-16 #99a0ae29) ·\n * botones check-line + close-line\n * Filled (429:5770): mismo layout que Default pero con texto real\n * (text-strong-950) en reposo — es Default con value.\n * Disabled (429:5784): bg transparent · sin border · text text-disabled-300\n * (#d1d1d1) · icon icon-disabled-300 · botón pencil (disabled)\n * Error (429:5805): bg bg-white-0 · border 1px state-error-base (#fb3748) ·\n * text text-strong-950 · shadow regular-shadow-x-small\n * (0 1px 2px rgba(10,13,20,.03)) · botones check + close\n *\n * NOTA Figma width=300px es fijo del símbolo; acá el host es width:100% para\n * que el consumer controle el ancho (es un átomo inline reusable).\n *\n * `ControlValueAccessor` implementado — funciona con `formControlName`.\n *\n * Uso:\n * <sui-inline-input [(value)]=\"name\" (confirm)=\"save($event)\" />\n * <sui-inline-input formControlName=\"alias\" leftIcon=\"at-line\" />\n * <sui-inline-input [(value)]=\"x\" placeholder=\"Sin nombre\" [error]=\"hasError()\" />\n *\n * **⚠️ NO mezclar `[(value)]` con `formControlName`/`[formControl]`** (split-brain;\n * usar UNA sola fuente de verdad).\n *\n * iOS :active — los botones de acción usan touchstart/touchend (vía sui-compact-button\n * no, acá son botones plain) para liberar el `:active` stuck del WKWebView.\n *\n * PENDING VERIFY:\n * - letterSpacing: Figma reporta -0.6px absoluto (≈ -0.043em a 14px). El token\n * canon del DS para Paragraph/Small es -0.006em (igual que sui-inline-select).\n * Se usa -0.006em por consistencia con el resto de los SUI; confirmar con\n * diseño si debe ser -0.043em (literal Figma).\n * - \"Filled\" no es un estado interactivo separado — es Default con value no vacío.\n * No se modeló como prop; el render lo cubre el value().\n */\n@Component({\n selector: 'sui-inline-input',\n standalone: true,\n templateUrl: './sui-inline-input.html',\n styleUrl: './sui-inline-input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiInlineInput),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-editing]': 'editing() ? \"\" : null',\n '[attr.data-sui-error]': 'error() && editing() ? \"\" : null',\n '[attr.data-sui-disabled]': 'mergedDisabled() ? \"\" : null',\n '[attr.data-sui-empty]': 'value() ? null : \"\"',\n '[attr.aria-disabled]': 'mergedDisabled() ? \"true\" : null',\n },\n})\nexport class SuiInlineInput implements ControlValueAccessor {\n /** Valor del input (two-way bindable + CVA). */\n readonly value = model<string>('');\n\n /** Placeholder mostrado cuando value está vacío. */\n readonly placeholder = input<string>('Placeholder text...');\n\n /**\n * Leading icon (RemixIcon name). `false` lo oculta. Default 'user-3-line'\n * (espeja el símbolo Figma).\n */\n readonly leftIcon = input<string | false>('user-3-line');\n\n /** Estado de error: borde rojo en modo edición. */\n readonly error = input<boolean>(false);\n\n /** Deshabilita la interacción. */\n readonly disabled = input<boolean>(false);\n\n /** Texto del botón \"editar\" para a11y (aria-label). */\n readonly editLabel = input<string>('Editar');\n\n /** Emite el valor confirmado (botón check / Enter). */\n readonly confirm = output<string>();\n /** Emite cuando se cancela la edición (botón close / Escape). */\n readonly cancel = output<void>();\n /** Emite al entrar en modo edición. */\n readonly edit = output<void>();\n\n /** Modo edición activo (focus/edit state de Figma). */\n readonly editing = signal(false);\n\n private readonly _formDisabled = signal(false);\n readonly mergedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n private readonly _fieldRef = viewChild<ElementRef<HTMLInputElement>>('field');\n readonly hostEl = inject(ElementRef<HTMLElement>);\n\n /** Snapshot del valor al entrar en edición — para restaurar en cancel. */\n private _draft = '';\n\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n /* Si se deshabilita estando en edición, salir del modo edición. */\n effect(() => {\n if (this.mergedDisabled() && this.editing()) {\n this.editing.set(false);\n }\n });\n }\n\n /** Texto a mostrar en reposo (value o placeholder). */\n readonly displayText = computed(() => this.value() || this.placeholder());\n\n /** Ícono del leading slot (null si leftIcon === false). */\n readonly leadingIcon = computed<string | null>(() => {\n const i = this.leftIcon();\n return i === false ? null : i;\n });\n\n /** Entra en modo edición (botón lápiz / click en el texto). */\n enterEdit(event?: Event): void {\n if (this.mergedDisabled() || this.editing()) return;\n event?.stopPropagation();\n this._draft = this.value();\n this.editing.set(true);\n this._onTouched();\n this.edit.emit();\n /* Foco al input nativo en el próximo tick (tras render del template). */\n queueMicrotask(() => {\n const el = this._fieldRef()?.nativeElement;\n el?.focus();\n el?.select();\n });\n }\n\n /** Sincroniza el value con el input nativo durante el typing. */\n onInput(event: Event): void {\n const v = (event.target as HTMLInputElement).value;\n this.value.set(v);\n this._onChange(v);\n }\n\n /** Confirma la edición (check / Enter). */\n confirmEdit(event?: Event): void {\n if (this.mergedDisabled()) return;\n event?.stopPropagation();\n this.editing.set(false);\n this._onChange(this.value());\n this._onTouched();\n this.confirm.emit(this.value());\n }\n\n /** Cancela la edición (close / Escape) — restaura el draft. */\n cancelEdit(event?: Event): void {\n if (this.mergedDisabled()) return;\n event?.stopPropagation();\n this.value.set(this._draft);\n this._onChange(this._draft);\n this.editing.set(false);\n this._onTouched();\n this.cancel.emit();\n }\n\n /** Enter confirma, Escape cancela (en el input nativo). */\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.confirmEdit(event);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.cancelEdit(event);\n }\n }\n\n /* ── ControlValueAccessor ─────────────────────────────────────────── */\n writeValue(v: string | null): void {\n this.value.set(v ?? '');\n }\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._formDisabled.set(isDisabled);\n }\n}\n","@if (leadingIcon(); as icon) {\n <sui-icon class=\"sui-inline-input__leading\" [name]=\"icon\" [size]=\"20\" />\n}\n\n@if (editing()) {\n <!-- ── Edit mode (Focus / Error state) ──────────────────────────────── -->\n <input\n #field\n class=\"sui-inline-input__field\"\n type=\"text\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"mergedDisabled()\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n />\n\n <button\n type=\"button\"\n class=\"sui-inline-input__action sui-inline-input__action--cancel\"\n [attr.aria-label]=\"'Cancelar'\"\n [disabled]=\"mergedDisabled()\"\n (click)=\"cancelEdit($event)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"close-line\" [size]=\"20\" />\n </button>\n\n <button\n type=\"button\"\n class=\"sui-inline-input__action sui-inline-input__action--confirm\"\n [attr.aria-label]=\"'Confirmar'\"\n [disabled]=\"mergedDisabled()\"\n (click)=\"confirmEdit($event)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"check-line\" [size]=\"20\" />\n </button>\n} @else {\n <!-- ── Resting mode (Default / Hover / Filled / Disabled state) ─────── -->\n <p class=\"sui-inline-input__text\">{{ displayText() }}</p>\n\n <button\n type=\"button\"\n class=\"sui-inline-input__action sui-inline-input__action--edit\"\n [attr.aria-label]=\"editLabel()\"\n [disabled]=\"mergedDisabled()\"\n (click)=\"enterEdit($event)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"pencil-line\" [size]=\"20\" />\n </button>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFlag, type SuiFlagName } from '../sui-flag/sui-flag';\nimport { SuiDropdownItem } from '../sui-dropdown-item/sui-dropdown-item';\nimport { SuiDropdownMenu } from '../sui-dropdown-menu/sui-dropdown-menu';\nimport { SuiDropdownPanel } from '../sui-dropdown-menu/sui-dropdown-panel';\n\n/**\n * SUI Inline Select — SUI 2.0 (Figma 332:4537)\n *\n * Selector inline sin padding/border/bg — vive dentro de texto u otros\n * componentes. Delega el overlay menu a `sui-dropdown-menu` internamente.\n *\n * `ControlValueAccessor` implementado — funciona con `formControlName`.\n *\n * Uso:\n * <sui-inline-select type=\"country\" [items]=\"countries\" formControlName=\"country\" />\n *\n * <p>Tu cuenta es <sui-inline-select type=\"country\" [items]=\"...\" [(selected)]=\"c\" /></p>\n *\n * **⚠️ NO mezclar `[(selected)]` con `formControlName`/`[formControl]`.**\n * Si el consumer escribe `[(selected)]` desde código, el FormControl NO se entera\n * (split-brain). Usar UNA fuente de verdad: formControl O selected, no las dos.\n */\n\nexport type SuiInlineSelectType = 'icon' | 'country';\n\nexport interface SuiInlineSelectItem<T = string> {\n value: T;\n label: string;\n sublabel?: string;\n icon?: string;\n flag?: SuiFlagName;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'sui-inline-select',\n standalone: true,\n templateUrl: './sui-inline-select.html',\n styleUrl: './sui-inline-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiFlag, SuiDropdownItem, SuiDropdownMenu, SuiDropdownPanel],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiInlineSelect),\n multi: true,\n },\n ],\n host: {\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-disabled]': 'mergedDisabled() ? \"\" : null',\n '[attr.data-sui-open]': 'isOpen() ? \"\" : null',\n '[attr.aria-disabled]': 'mergedDisabled() ? \"true\" : null',\n '[attr.aria-expanded]': 'isOpen() ? \"true\" : \"false\"',\n '[attr.aria-haspopup]': 'items().length > 0 ? \"listbox\" : null',\n '[attr.role]': '\"button\"',\n '[attr.tabindex]': 'mergedDisabled() ? -1 : 0',\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n '(click)': 'onHostClick($event)',\n '(keydown.enter)': 'onHostClick($event)',\n '(keydown.space)': 'onHostClick($event); $event.preventDefault()',\n },\n})\nexport class SuiInlineSelect<T = string> implements ControlValueAccessor {\n readonly type = input<SuiInlineSelectType>('icon');\n\n readonly value = input<string>('');\n readonly icon = input<string | null>(null);\n readonly flag = input<SuiFlagName | null>(null);\n\n readonly items = input<readonly SuiInlineSelectItem<T>[]>([]);\n readonly selected = model<SuiInlineSelectItem<T> | null>(null);\n\n readonly disabled = input<boolean>(false);\n\n readonly clicked = output<Event>();\n readonly selectedChange = output<SuiInlineSelectItem<T>>();\n\n private readonly _formDisabled = signal(false);\n readonly mergedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n private readonly _menu = viewChild<SuiDropdownMenu>(SuiDropdownMenu);\n readonly isOpen = signal(false);\n\n readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly _pendingValue = signal<T | null>(null);\n\n private _onChange: (v: T | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n effect(() => {\n const pending = this._pendingValue();\n const items = this.items();\n if (pending !== null && items.length > 0) {\n const match = items.find((i) => i.value === pending);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n }\n }\n });\n effect(() => {\n if (this.mergedDisabled() && this.isOpen()) this._menu()?.close();\n });\n }\n\n readonly arrowIcon = computed(() => this.isOpen() ? 'arrow-up-s-line' : 'arrow-down-s-line');\n\n readonly displayValue = computed(() => this.selected()?.label ?? this.value());\n readonly displayIcon = computed(() => this.selected()?.icon ?? this.icon());\n readonly displayFlag = computed(() => this.selected()?.flag ?? this.flag());\n\n onHostClick(event: Event): void {\n if (this.mergedDisabled()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n this.clicked.emit(event);\n if (this.items().length > 0) {\n this._menu()?.toggle();\n }\n }\n\n protected onMenuOpenedChange(open: boolean): void {\n this.isOpen.set(open);\n if (open) this._onTouched();\n }\n\n protected selectItem(item: SuiInlineSelectItem<T>): void {\n if (item.disabled) return;\n this.selected.set(item);\n this._onChange(item.value);\n this._onTouched();\n this.selectedChange.emit(item);\n this._menu()?.close();\n }\n\n /* ── ControlValueAccessor ─────────────────────────────────────────── */\n writeValue(value: T | null): void {\n if (value === null || value === undefined) {\n this.selected.set(null);\n this._pendingValue.set(null);\n return;\n }\n const match = this.items().find((i) => i.value === value);\n if (match) {\n this.selected.set(match);\n this._pendingValue.set(null);\n } else {\n this._pendingValue.set(value);\n }\n }\n\n registerOnChange(fn: (v: T | null) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this._formDisabled.set(isDisabled); }\n}\n","@if (type() === 'country' && displayFlag()) {\n <sui-flag class=\"sui-inline-select__flag\" [name]=\"displayFlag()!\" size=\"xs\" />\n}\n@if (type() === 'icon' && displayIcon()) {\n <sui-icon class=\"sui-inline-select__icon\" [name]=\"displayIcon()!\" [size]=\"20\" />\n}\n\n<!--\n Figma 332:4537 — el value + arrow viven en un grupo \"Text\" interno con gap-2\n (2px), separado del leading icon/flag por el gap del host (icon 4 / country 6).\n NO aplanar a un solo nivel: el chevron debe quedar a 2px del texto, no al gap\n del host.\n-->\n<span class=\"sui-inline-select__text\">\n <span class=\"sui-inline-select__value\">{{ displayValue() }}</span>\n <sui-icon class=\"sui-inline-select__arrow\" [name]=\"arrowIcon()\" [size]=\"20\" />\n</span>\n\n@if (items().length > 0) {\n <sui-dropdown-menu\n [origin]=\"hostEl\"\n [disabled]=\"mergedDisabled()\"\n [minWidth]=\"200\"\n panelClass=\"sui-compact-select__overlay-pane\"\n (openedChange)=\"onMenuOpenedChange($event)\"\n >\n <ng-template suiDropdownPanel>\n <div class=\"sui-inline-select__menu\">\n @for (item of items(); track item.value) {\n <sui-dropdown-item\n mode=\"option\"\n [label]=\"item.label\"\n [sublabel]=\"item.sublabel ?? ''\"\n [selected]=\"item.value === selected()?.value\"\n [disabled]=\"item.disabled ?? false\"\n (click)=\"selectItem(item)\"\n >\n @if (item.flag) {\n <sui-flag slot=\"leading\" [name]=\"item.flag\" size=\"sm\" />\n } @else if (item.icon) {\n <sui-icon slot=\"leading\" [name]=\"item.icon\" [size]=\"20\" />\n }\n </sui-dropdown-item>\n }\n </div>\n </ng-template>\n </sui-dropdown-menu>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n ViewChild,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\n\nexport type SuiInputSize = 'xsmall' | 'small' | 'medium';\nexport type SuiInputType =\n | 'text'\n | 'email'\n | 'password'\n | 'number'\n | 'tel'\n | 'url'\n | 'search'\n | 'amount'\n | 'card'\n | 'password-toggle'\n | 'date'\n | 'datetime-local'\n | 'time'\n /**\n * Split-field con divisor vertical: zona de input a la izquierda + acción a\n * la derecha (ej. copiar link). Figma \"Type=🔘 Button\" (node 332:1667). El\n * consumer proyecta el botón de acción vía `[data-slot=end]` (típicamente un\n * `<sui-button variant=\"ghost\">` con un ícono). sui-input dibuja el divisor y\n * el layout flush del slot; la acción la maneja el consumer.\n */\n | 'button';\n\n/**\n * SUI Input — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: \"Input Field\" (componentKey c28150b04d333d34ed9d2b77abd9f2f54e1a878a)\n *\n * EXACT specs — VERIFIED from Figma nodeIds (266:5245, 417:6793, 417:9933, 267:1063, 267:1279, 267:1235):\n *\n * Sizes (Figma naming):\n * - xsmall (X-Small 32): py=6px, pl=8px, pr=6px, gap=6px, radius=8px\n * - small (Small 36): py=8px, pl=10px, pr=8px, gap=8px, radius=8px\n * - medium (Medium 40): py=10px, pl=12px, pr=10px, gap=8px, radius=10px\n *\n * NOTE: padding produces the height via line-height(20) + 2×py. No explicit height needed.\n *\n * - Border default: 1px solid stroke-soft-200 (#ebebeb) + drop-shadow regular-x-small\n * - Border hover: 1px solid stroke-sub-300 (#d1d1d1)\n * - Border focus: 1px solid stroke-strong-950 (#171717)\n * + box-shadow: 0 0 0 2px white, 0 0 0 4px slate-alpha-16\n * - Border error: 1px solid state-error-base (#fb3748)\n * focus-within: + box-shadow 0 0 0 3px red-alpha-10\n * - Disabled: bg-weak-50, NO border, text-disabled-300, cursor: not-allowed\n * - Readonly: bg-weak-50, border stroke-soft-200, text-sub-600\n * - Placeholder: text-soft-400 (#a3a3a3)\n * - Icon slots: 20px (--sui-icon-size-md), color text-sub-600\n * - Label: delegated to sui-form-label (Label/Small 14px/500/20px/-0.006em)\n * - Hint/Error msg: delegated to sui-form-hint (Paragraph/X-Small 12px/400/16px/0)\n * - Label-to-field gap: 6px (margin-bottom on sui-form-label host)\n * - Field-to-hint gap: 6px (margin-top on sui-form-hint host)\n * - Transition: border-color + box-shadow 100ms ease-out\n *\n * @input label: string | null — Texto del label\n * @input sublabel: string | null — Texto secundario del label (ej. \"Optional\")\n * @input required: boolean — Muestra asterisco rojo en el label\n * @input tooltip: string | null — Tooltip en ícono info del label\n * @input hint: string | null — Mensaje de ayuda debajo del field\n * @input error: boolean — Activa borde rojo + muestra errorMessage\n * @input errorMessage: string | null — Mensaje de error\n *\n * ── Homologación 2026-05-29 (auditoría \"Text Input\") ─────────────────────────\n * Closed gap: type='card' — máscara de tarjeta de crédito (grupos de 4 dígitos\n * separados por espacio, maxlength efectivo 19 → \"1234 5678 9012 3456\").\n * Mismo patrón que type='amount': display formateado en el DOM, value model\n * emite los dígitos crudos (sin espacios). inputmode='numeric'.\n *\n * ── Homologación 2026-05-29 (2da pasada — gaps low/medium) ───────────────────\n * Closed (low): font-feature-settings 'ss11' 1, 'calt' 0, 'liga' 0 en\n * .sui-input__control y .sui-input__prefix — Figma setea estos OpenType\n * features en cada text node del field. Valor canon SUI 2.0 (mismo que el\n * resto de los SUI).\n * Closed (medium): type='button' — split-field con divisor vertical (Figma node\n * 332:1667). La zona de input lleva el padding del size + un border-right\n * (divisor stroke-soft-200); el `[data-slot=end]` queda flush a la derecha\n * como zona de acción cuadrada con padding del size (10/8/6 por tamaño) y\n * pointer-events activos. El consumer proyecta el botón de acción (ej. copiar\n * link con file-copy-line) vía `[data-slot=end]`. nativeType='text'.\n *\n * PENDING VERIFY (Figma MCP no disponible en esta sesión — bloqueado por health\n * check hasta 2026-05-29T08:57Z; valores tomados del header existente ya\n * verificado contra nodeIds + del reporte de auditoría .claude/sui-audit):\n * - card: ancho de grupo (4) y maxlength (19) confirmados por reporte; falta\n * confirmar si Figma muestra leading-icon de marca (visa/mastercard) en\n * Type=Card node 316:11323. No implementado (sería affordance decorativa que\n * el consumer compone vía [data-slot=start]).\n *\n * GAPS NO CERRADOS aquí (requieren componente nuevo o son composición de otros\n * SUI — fuera de scope de este barrido low/medium):\n * - Tag Input (sui-tag-input), Digit/OTP Input (sui-otp-input), Inline Input:\n * componentes nuevos separados (severity HIGH).\n * - Type=Dropdown (node 352:3122): el trailing affordance de Figma es un\n * `sui-inline-select` funcional embebido (ícono + label + chevron), NO un\n * chevron estático. Se compone proyectando `<sui-inline-select>` en\n * `[data-slot=end]` — no se fabricó un type='dropdown' pseudo-visual porque\n * sería un fake no-funcional que no espeja el Figma.\n * - Type=Emoji (node 352:3416): en placeholder es solo un field con leading\n * `emotion-line` — ya se logra con [icon]=\"'emotion-line'\". El picker es\n * overlay externo (componente nuevo), fuera de scope.\n * - Type=Phone country-picker (node 313:10101): el prefix interactivo con\n * selector de país es una feature nueva (selector de país); SUI tiene\n * [prefix] como string estático.\n */\n@Component({\n selector: 'sui-input',\n templateUrl: './sui-input.html',\n styleUrl: './sui-input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiFormLabel, SuiFormHint],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiInput),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-readonly]': 'readonly() ? \"\" : null',\n /* Divisores genéricos por lado — dibujan el border vertical entre el slot\n afijo y la zona de input (Figma Phone node 313:10271 = border-left).\n `type='button'` activa el trailing automáticamente (back-compat). */\n '[attr.data-sui-leading-divider]': '_hasLeadingDivider() ? \"\" : null',\n '[attr.data-sui-trailing-divider]': '_hasTrailingDivider() ? \"\" : null',\n /* Marca un afijo como interactivo (control proyectado, ej. country select)\n para soltarle el lockdown de 20×20 + pointer-events:none del slot\n decorativo. */\n '[attr.data-sui-leading-control]': 'leadingControl() ? \"\" : null',\n '[attr.data-sui-trailing-control]': 'trailingControl() ? \"\" : null',\n },\n})\nexport class SuiInput implements ControlValueAccessor {\n // ── Core inputs (existing API — DO NOT BREAK) ────────────────────────────\n readonly size = input<SuiInputSize>('medium');\n readonly type = input<SuiInputType>('text');\n readonly placeholder = input('');\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n readonly label = input<string | null>(null);\n readonly hint = input<string | null>(null);\n readonly autocomplete = input<string | null>(null);\n\n // ── New label inputs (additive — does NOT break existing API) ────────────\n /** Texto secundario del label (ej. \"Optional\", \"Required\") */\n readonly sublabel = input<string | null>(null);\n /** Muestra asterisco rojo en el label */\n readonly required = input(false);\n /** Tooltip en ícono info del label */\n readonly tooltip = input<string | null>(null);\n\n readonly value = model<string>('');\n\n // ── New inputs (additive — does NOT break existing API) ──────────────────\n readonly maxlength = input<number | null>(null);\n readonly min = input<number | null>(null);\n readonly max = input<number | null>(null);\n /** If false and type=number/amount, blocks paste */\n readonly paste = input(true);\n /** Inline prefix label, e.g. \"S/\", \"$\", \"%\" */\n readonly prefix = input<string | null>(null);\n /** Show X button that clears value */\n readonly showClear = input(false);\n /** Remix icon name for built-in icon slot */\n readonly icon = input<string | null>(null);\n readonly iconPosition = input<'left' | 'right'>('left');\n\n /**\n * Cuando un pointerdown ocurre fuera del host del componente, hace blur en\n * el input — cierra el teclado iOS al tocar zonas no-interactivas. Default\n * `true` porque es el comportamiento natural esperado en mobile (Apple/Google\n * lo hacen así nativamente). Pasá `false` solo si el consumer maneja el blur\n * manualmente o necesita preservar focus en flows complejos.\n */\n readonly closeOnOutsideClick = input(true);\n\n // ── Affijos interactivos + divisores (additive — Figma Phone node 313:10267) ─\n //\n // El slot system soporta afijos INTERACTIVOS con divisor por lado. El caso\n // canon es el Phone Input (Figma 313:10267): un `sui-compact-select-for-input`\n // de país a la izquierda + divisor vertical + input. El divisor del Phone es\n // un `border-left` en la zona del input (node 313:10271) — el espejo exacto\n // del divisor `border-right` del `type='button'` (node 332:1667).\n //\n // - `leadingDivider` / `trailingDivider`: dibujan el divisor del lado\n // indicado (stroke-soft-200), reusando la lógica del `--button` pero\n // parametrizada por lado.\n // - `leadingControl` / `trailingControl`: marcan el afijo de ese lado como\n // interactivo → el slot pierde el `width:20px; pointer-events:none` del\n // ícono decorativo y se vuelve un contenedor flush flex que aloja el\n // control proyectado (ej. el country select). El control trae su propio\n // padding (es el del compact-select), así que el slot no agrega ninguno.\n //\n // Back-compat: `type='button'` sigue activando el trailing divider + slot\n // interactivo trailing por sí solo, sin que el consumer pase ningún flag.\n\n /** Dibuja el divisor vertical a la izquierda de la zona de input (border-left\n * en el lado del control). Para el Phone Input + cualquier afijo leading. */\n readonly leadingDivider = input(false);\n /** Dibuja el divisor vertical a la derecha de la zona de input (border-right).\n * `type='button'` lo activa solo. */\n readonly trailingDivider = input(false);\n /** Marca el `[data-slot=start]` como interactivo (control proyectado): le\n * quita el lockdown de ícono decorativo (20×20 + pointer-events:none). */\n readonly leadingControl = input(false);\n /** Marca el `[data-slot=end]` como interactivo (control proyectado). */\n readonly trailingControl = input(false);\n\n /** Divisor leading efectivo (input explícito; activado también por un control\n * leading, que siempre lleva divisor en Figma). */\n protected readonly _hasLeadingDivider = computed(\n () => this.leadingDivider() || this.leadingControl(),\n );\n /** Divisor trailing efectivo (`type='button'` lo activa por back-compat). */\n protected readonly _hasTrailingDivider = computed(\n () => this.trailingDivider() || this.trailingControl() || this.type() === 'button',\n );\n\n // ── Internal state ───────────────────────────────────────────────────────\n @ViewChild('inputEl') inputEl?: ElementRef<HTMLInputElement>;\n private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);\n\n /**\n * Tap fuera del host → blur del input para cerrar el teclado iOS.\n *\n * iOS WKWebView no siempre propaga `pointerdown` con confiabilidad cuando\n * hay teclado abierto, por eso escuchamos también `touchstart` (nativo iOS)\n * y `mousedown` (web fallback). Cualquiera de los tres dispara el blur.\n *\n * Usamos `document.activeElement.blur()` cuando ese elemento está dentro\n * del host — eso garantiza que blur surta efecto en el input que realmente\n * tiene el focus, no en una referencia stale. Fallback a inputEl por si\n * activeElement no está dentro del host (edge case).\n */\n @HostListener('document:pointerdown', ['$event'])\n @HostListener('document:touchstart', ['$event'])\n @HostListener('document:mousedown', ['$event'])\n onDocumentTap(event: Event): void {\n if (!this.closeOnOutsideClick()) return;\n const host = this.hostEl.nativeElement as HTMLElement;\n const target = event.target as Node | null;\n if (!target || host.contains(target)) return;\n const active = document.activeElement as HTMLElement | null;\n if (active && host.contains(active)) {\n active.blur();\n } else {\n this.inputEl?.nativeElement.blur();\n }\n }\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** For password-toggle: tracks whether to show plain text */\n readonly showPassword = signal(false);\n\n /** Resolved native [type] attribute for the <input> element */\n readonly nativeType = computed<string>(() => {\n const t = this.type();\n if (t === 'amount') return 'text';\n if (t === 'card') return 'text'; // we manage card formatting manually\n if (t === 'password-toggle') return this.showPassword() ? 'text' : 'password';\n if (t === 'number') return 'text'; // we manage numeric filtering manually\n if (t === 'tel') return 'text'; // we manage tel filtering manually\n if (t === 'button') return 'text'; // split-field: control es un text input normal\n return t;\n });\n\n /** Resolved inputmode attribute for mobile keyboards */\n readonly inputMode = computed<string | null>(() => {\n const t = this.type();\n if (t === 'number') return 'numeric';\n if (t === 'amount') return 'decimal';\n if (t === 'card') return 'numeric';\n if (t === 'tel') return 'tel';\n if (t === 'email') return 'email';\n if (t === 'url') return 'url';\n if (t === 'search') return 'search';\n return null;\n });\n\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n // ── Event handlers ───────────────────────────────────────────────────────\n\n onInput(e: Event): void {\n if (this.isDisabled()) return;\n const t = this.type();\n if (t === 'amount') {\n this._formatAmountOnInput(e as InputEvent);\n return;\n }\n if (t === 'card') {\n this._formatCardOnInput(e as InputEvent);\n return;\n }\n const v = (e.target as HTMLInputElement).value;\n this.value.set(v);\n this._onChange(v);\n }\n\n onBlur(): void {\n const t = this.type();\n if (t === 'amount') {\n this._formatAmountOnBlur();\n }\n this._onTouched();\n }\n\n onFocus(): void {\n const t = this.type();\n if (t === 'amount') {\n this._stripCommasForEdit();\n }\n }\n\n onKeydown(e: KeyboardEvent): void {\n const t = this.type();\n if (t === 'number') {\n this.onlyNumbers(e);\n } else if (t === 'amount') {\n this.onlyNumbersAndPoints(e);\n } else if (t === 'card') {\n this.onlyNumbers(e);\n } else if (t === 'tel') {\n this.onlyTel(e);\n }\n }\n\n onPaste(e: ClipboardEvent): void {\n const t = this.type();\n if ((t === 'number' || t === 'amount') && !this.paste()) {\n e.preventDefault();\n return;\n }\n if (t === 'number') {\n const text = e.clipboardData?.getData('text') ?? '';\n if (isNaN(+text)) e.preventDefault();\n }\n if (t === 'amount') {\n e.preventDefault();\n const text = e.clipboardData?.getData('text') ?? '';\n const sanitized = this._sanitizeAmountPaste(text);\n const el = e.target as HTMLInputElement;\n el.value = sanitized;\n this.value.set(sanitized.replace(/,/g, ''));\n this._onChange(this.value());\n }\n if (t === 'card') {\n e.preventDefault();\n const text = e.clipboardData?.getData('text') ?? '';\n const digits = text.replace(/\\D/g, '').slice(0, SuiInput.CARD_MAX_DIGITS);\n const formatted = SuiInput.formatCardDigits(digits);\n const el = e.target as HTMLInputElement;\n el.value = formatted;\n this._displayCard.set(formatted);\n this.value.set(digits);\n this._onChange(digits);\n }\n }\n\n clearValue(): void {\n this.value.set('');\n this._onChange('');\n if (this.inputEl) {\n this.inputEl.nativeElement.value = '';\n this.inputEl.nativeElement.focus();\n }\n }\n\n togglePassword(): void {\n this.showPassword.update((v) => !v);\n }\n\n // ── Ontop-derived key filter helpers ────────────────────────────────────\n\n /** Allows only digit keys (for type='number') */\n onlyNumbers(event: KeyboardEvent): void {\n const key = event.key;\n // Allow control keys: Backspace, Delete, Tab, ArrowLeft, ArrowRight, Home, End\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key)) return;\n // Allow Ctrl/Cmd combos (copy/paste/select all)\n if (event.ctrlKey || event.metaKey) return;\n if (!/^\\d$/.test(key)) {\n event.preventDefault();\n }\n }\n\n /** Allows digits, +, space, - for type='tel' */\n onlyTel(event: KeyboardEvent): void {\n const key = event.key;\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key)) return;\n if (event.ctrlKey || event.metaKey) return;\n // Allow + only at position 0\n if (key === '+') {\n const el = event.target as HTMLInputElement;\n if (el.selectionStart === 0) return;\n event.preventDefault();\n return;\n }\n // Allow space and hyphen as separators\n if (key === ' ' || key === '-') return;\n if (!/^\\d$/.test(key)) {\n event.preventDefault();\n }\n }\n\n /** Allows digits + single decimal point (for type='amount'). El user puede\n * escribir punto manual; el _formatAmountOnInput valida que solo haya uno. */\n onlyNumbersAndPoints(event: KeyboardEvent): void {\n const key = event.key;\n if (['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(key)) return;\n if (event.ctrlKey || event.metaKey) return;\n if (key === '.') {\n const el = event.target as HTMLInputElement;\n if (el.value.includes('.')) event.preventDefault();\n return;\n }\n if (!/\\d/.test(key)) event.preventDefault();\n }\n\n // ── Amount mask internals ────────────────────────────────────────────────\n //\n // Patrón canon (Ontop v3 — confirmado con tests en\n // `ontop-library-webcomponents/.../input.integration.spec.ts`):\n //\n // - Durante el typing (input event): `_formatAmountOnInput`\n // - Agrega thousands separators a la parte entera EN VIVO.\n // - NO toca la parte decimal (la deja como el user la escribió).\n // - Recorta el decimal a máximo 2 chars.\n // - Ajusta el cursor para no saltar al insertar comas.\n // - Al perder foco (blur event): `_formatAmountOnBlur`\n // - Pad decimal a 2 chars: \"1,234\" → \"1,234.00\", \"1,234.5\" → \"1,234.50\".\n // - Si está vacío o solo \".\" o solo \".5\" (sin parte entera) → limpia.\n // - El focus event NO hace nada (no strip comas — Ontop las mantiene).\n //\n // Flow visual:\n // input vacío → escribe \"1234567\" → DOM = \"1,234,567\" (live thousands)\n // blur → DOM = \"1,234,567.00\"\n // focus de nuevo → DOM = \"1,234,567.00\" (sin cambios)\n // escribe \".5\" → DOM = \"1,234,567.5\"\n // blur → DOM = \"1,234,567.50\"\n //\n // El consumer recibe via (valueChange) el string SIN comas: \"1234567.50\".\n\n /** Calcula la nueva posición del cursor compensando las comas agregadas\n * o removidas por el formato. Algoritmo Ontop v3. */\n private _calcAmountCursorPos(original: string, pos: number, formatted: string): number {\n const commasBefore = (s: string, p: number) => (s.slice(0, p).match(/,/g) ?? []).length;\n const diff = commasBefore(formatted, pos) - commasBefore(original, pos);\n let newPos = pos + diff;\n if (diff < 0 && formatted[newPos] === ',') newPos -= 1;\n else if (diff > 0 && formatted[newPos - 1] === ',') newPos += 1;\n if (newPos > 0 && formatted[newPos - 1] === ',') newPos -= 1;\n return newPos;\n }\n\n private _formatAmountOnInput(e: InputEvent): void {\n const el = e.target as HTMLInputElement;\n const originalValue = el.value;\n const originalCursor = el.selectionStart ?? originalValue.length;\n\n /* Sanitize: solo dígitos y puntos. */\n const sanitized = originalValue.replace(/[^0-9.]/g, '');\n const dotIdx = sanitized.indexOf('.');\n let integerPart = dotIdx === -1 ? sanitized : sanitized.slice(0, dotIdx);\n let decimalPart = dotIdx === -1 ? '' : sanitized.slice(dotIdx + 1).replace(/\\./g, '');\n\n /* Aplica thousands a la parte entera. */\n integerPart = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n /* Construye formatted:\n - Si hay punto pero sin decimales todavía (\"1234.\" mid-typing), mantiene \"1,234.\"\n - Si hay decimales, los recorta a 2 chars máx (\"1234.999\" → \"1,234.99\") */\n const formatted =\n decimalPart === '' && sanitized.includes('.')\n ? `${integerPart}.`\n : `${integerPart}${decimalPart ? '.' + decimalPart.slice(0, 2) : ''}`;\n\n el.value = formatted;\n const newCursor = this._calcAmountCursorPos(originalValue, originalCursor, formatted);\n el.setSelectionRange(newCursor, newCursor);\n\n /* `_displayAmount` mantiene el FORMATEADO (con comas) para el template.\n `value` model emite el CLEAN (sin comas, sin pad) al consumer.\n `_onChange` emite el clean al FormControl. */\n const clean = formatted.replace(/,/g, '');\n this._displayAmount.set(formatted);\n this.value.set(clean);\n this._onChange(clean);\n }\n\n private _formatAmountOnBlur(): void {\n const el = this.inputEl?.nativeElement;\n if (!el) return;\n const raw = el.value.trim();\n\n /* Vacío, solo \".\" o \".<algo>\" (sin parte entera) → limpia. */\n if (!raw || raw === '.' || /^\\.\\d*$/.test(raw)) {\n el.value = '';\n this._displayAmount.set('');\n this.value.set('');\n this._onChange('');\n return;\n }\n\n const parts = raw.replace(/,/g, '').split('.');\n const intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n /* Pad decimal a EXACTAMENTE 2 chars (parts[1] puede ser \"\", \"5\", \"55\"). */\n const decPart = (parts[1] ?? '').padEnd(2, '0').slice(0, 2);\n const formatted = `${intPart}.${decPart}`;\n\n el.value = formatted;\n const clean = formatted.replace(/,/g, '');\n this._displayAmount.set(formatted);\n this.value.set(clean);\n this._onChange(clean);\n }\n\n /** Ontop v3 NO hace strip comas en focus — el campo se queda con su\n * formato. Mantenemos el método como no-op para no romper la API. */\n private _stripCommasForEdit(): void {\n return;\n }\n\n /** Sanitize de paste para type=amount. Patrón Ontop v3 `handlePastedValue`:\n * - Strip chars no-numéricos (deja dígitos y puntos)\n * - Si hay múltiples puntos, asume thousands separators (los junta)\n * - El último punto es el decimal; pad a 2 chars\n * - Aplica thousands a la parte entera */\n private _sanitizeAmountPaste(raw: string): string {\n let sanitized = raw.replace(/[^0-9.]/g, '');\n if (!sanitized) return '';\n const parts = sanitized.split('.');\n if (parts.length > 2) sanitized = parts.join('');\n const lastDot = sanitized.lastIndexOf('.');\n const intPart = lastDot > -1 ? sanitized.slice(0, lastDot) : sanitized;\n let decPart = lastDot > -1 ? sanitized.slice(lastDot + 1) : '';\n if (decPart.length > 2) {\n decPart = parseFloat(`${intPart}.${decPart}`).toFixed(2).split('.')[1];\n } else {\n decPart = (decPart + '00').slice(0, 2);\n }\n const intFormatted = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return `${intFormatted}.${decPart}`;\n }\n\n // ── Card mask internals ──────────────────────────────────────────────────\n //\n // Type='card' formatea un número de tarjeta de crédito en grupos de 4 dígitos\n // separados por un espacio: \"1234 5678 9012 3456\". Máx 16 dígitos → 19 chars\n // visibles (16 dígitos + 3 espacios). Mismo patrón split que type='amount':\n //\n // - `_displayCard` mantiene el FORMATEADO (con espacios) para el template.\n // - El `value` model emite los dígitos CRUDOS (sin espacios): \"1234567890123456\".\n // - El consumer recibe via (valueChange) los dígitos sin espacios.\n //\n // Patrón análogo a la máscara amount: display interno separado del value model,\n // sincronizado por effect cuando el value cambia desde fuera.\n\n /** Máximo de dígitos numéricos en una tarjeta (16 → \"#### #### #### ####\"). */\n private static readonly CARD_MAX_DIGITS = 16;\n\n /** Agrupa una secuencia de dígitos crudos en grupos de 4 separados por espacio.\n * \"1234567890\" → \"1234 5678 90\". No agrega espacio trailing. */\n static formatCardDigits(digits: string): string {\n return (digits.match(/.{1,4}/g) ?? []).join(' ');\n }\n\n /** Signal interno con el value FORMATEADO (con espacios) para el DOM cuando\n * `type=\"card\"`. Separado del `value` model (dígitos crudos). */\n private readonly _displayCard = signal<string>('');\n\n /** Formatea durante el typing: sanitiza a dígitos, recorta a 16, agrupa de 4.\n * Ajusta el cursor compensando los espacios agregados (mismo algoritmo de\n * conteo de separadores que el amount mask, pero contando espacios). */\n private _formatCardOnInput(e: InputEvent): void {\n const el = e.target as HTMLInputElement;\n const originalValue = el.value;\n const originalCursor = el.selectionStart ?? originalValue.length;\n\n const digits = originalValue.replace(/\\D/g, '').slice(0, SuiInput.CARD_MAX_DIGITS);\n const formatted = SuiInput.formatCardDigits(digits);\n\n el.value = formatted;\n const newCursor = this._calcCardCursorPos(originalValue, originalCursor, formatted);\n el.setSelectionRange(newCursor, newCursor);\n\n this._displayCard.set(formatted);\n this.value.set(digits);\n this._onChange(digits);\n }\n\n /** Posición del cursor compensando los espacios (separadores) agregados o\n * removidos por el formato. Cuenta espacios antes del cursor en original vs\n * formatted. Misma lógica que `_calcAmountCursorPos` pero con espacios. */\n private _calcCardCursorPos(original: string, pos: number, formatted: string): number {\n const spacesBefore = (s: string, p: number) => (s.slice(0, p).match(/ /g) ?? []).length;\n const diff = spacesBefore(formatted, pos) - spacesBefore(original, pos);\n let newPos = pos + diff;\n if (newPos > 0 && formatted[newPos - 1] === ' ' && diff > 0) {\n // si justo cae después de un espacio recién insertado, salta el espacio\n // (espeja la rama `newPos += 1` de _calcAmountCursorPos para las comas).\n newPos += 1;\n }\n return Math.max(0, Math.min(newPos, formatted.length));\n }\n\n /**\n * Sincroniza `_displayCard` cuando `value` cambia desde fuera (initial value\n * via `[value]`, programmatic set, FormControl.setValue). Skip cuando el\n * cambio vino de los handlers internos (display ya refleja los dígitos).\n */\n private readonly _cardSyncEffect = effect(() => {\n if (this.type() !== 'card') return;\n const v = this.value();\n\n const currentDisplay = untracked(() => this._displayCard());\n const currentDigits = currentDisplay.replace(/\\D/g, '');\n const incomingDigits = (v ?? '').replace(/\\D/g, '').slice(0, SuiInput.CARD_MAX_DIGITS);\n\n if (currentDigits === incomingDigits) return;\n\n const formatted = SuiInput.formatCardDigits(incomingDigits);\n untracked(() => this._displayCard.set(formatted));\n });\n\n /** Display value que el template lee para `<input [value]>` cuando\n * `type=\"card\"`. Para otros types lo maneja el template directamente. */\n readonly displayCardValue = computed(() => this._displayCard());\n\n /**\n * Signal interno que contiene el value FORMATEADO para mostrar en el DOM\n * cuando `type=\"amount\"`. Está separado del `value` model (que contiene el\n * clean value sin comas) — patrón análogo al `valueAmount` vs `value` de\n * Ontop v3.\n *\n * Sincronización:\n * - Handlers internos (`_formatAmountOnInput`, `_formatAmountOnBlur`) lo\n * actualizan junto con `value` cuando el user typea.\n * - El `_amountSyncEffect` lo actualiza cuando `value` cambia desde\n * fuera (initial value, programmatic set, [value] binding).\n */\n private readonly _displayAmount = signal<string>('');\n\n /** Display value que el template lee para `<input [value]>` cuando\n * `type=\"amount\"`. Para otros types, devuelve `value()` directo. */\n readonly displayAmountValue = computed(() => {\n if (this.type() === 'amount') return this._displayAmount();\n return this.value();\n });\n\n /**\n * Sincroniza `_displayAmount` cuando `value` cambia desde fuera (initial\n * value via `[value]` binding, programmatic set, FormControl.setValue).\n * Skip cuando el cambio vino de los handlers internos (detectado comparando\n * el clean derivado de `_displayAmount` contra el current `value`).\n */\n private readonly _amountSyncEffect = effect(() => {\n if (this.type() !== 'amount') return;\n const v = this.value();\n\n const currentDisplay = untracked(() => this._displayAmount());\n const currentClean = currentDisplay.replace(/,/g, '');\n\n /* Skip si display y value YA son numéricamente el mismo monto. Cubre 2 casos:\n 1. Cambio interno: handler acaba de setear ambos (currentClean === v).\n 2. Round-trip del consumer durante typing: user escribe \"1\" → handler\n emite valueChange=\"1\" → consumer hace `minOrder.set(1)` → computed\n devuelve `(1).toFixed(2) = \"1.00\"` → effect dispararía y formatearía\n a \"1.00\", moviendo el cursor. Comparando parseFloat evita re-pintar\n cuando el value cambió de \"1\" a \"1.00\" durante el typing. */\n const sameAmount =\n parseFloat(currentClean) === parseFloat(v) &&\n !(currentDisplay === '' && v !== '');\n if (sameAmount) return;\n\n /* Cambio externo real (init value, programmatic set distinto). */\n if (!v) {\n untracked(() => this._displayAmount.set(''));\n return;\n }\n const formatted = this._sanitizeAmountPaste(v);\n untracked(() => this._displayAmount.set(formatted));\n });\n\n // ── CVA ──────────────────────────────────────────────────────────────────\n\n writeValue(v: string | null): void {\n /* Para type=amount, aplica formato Ontop v3 `formatValueSetter`:\n integerPart con thousands + decimalPart padded a 2 chars. */\n if (this.type() === 'amount' && v !== null && v !== undefined && v !== '') {\n const el = this.inputEl?.nativeElement;\n /* Si el user está typeando, NO sobreescribir (mismo flag _isUserTyping\n del Ontop v3, acá lo derivamos via document.activeElement). */\n if (el && document.activeElement === el) return;\n const formatted = this._sanitizeAmountPaste(String(v));\n this._displayAmount.set(formatted);\n this.value.set(formatted.replace(/,/g, ''));\n if (el) el.value = formatted;\n return;\n }\n /* Para type=card, formatea los dígitos crudos en grupos de 4. */\n if (this.type() === 'card' && v !== null && v !== undefined && v !== '') {\n const el = this.inputEl?.nativeElement;\n if (el && document.activeElement === el) return;\n const digits = String(v).replace(/\\D/g, '').slice(0, SuiInput.CARD_MAX_DIGITS);\n const formatted = SuiInput.formatCardDigits(digits);\n this._displayCard.set(formatted);\n this.value.set(digits);\n if (el) el.value = formatted;\n return;\n }\n this.value.set(v ?? '');\n if (this.type() === 'amount') this._displayAmount.set('');\n if (this.type() === 'card') this._displayCard.set('');\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n [size]=\"size()\"\n class=\"sui-input__label-host\"\n />\n}\n\n<div\n class=\"sui-input__field\"\n [class.sui-input__field--error]=\"error()\"\n [class.sui-input__field--disabled]=\"isDisabled()\"\n [class.sui-input__field--readonly]=\"readonly()\"\n [class.sui-input__field--split]=\"_hasLeadingDivider() || _hasTrailingDivider()\"\n [class.sui-input__field--split-leading]=\"_hasLeadingDivider()\"\n [class.sui-input__field--split-trailing]=\"_hasTrailingDivider()\"\n [class.sui-input__field--button]=\"type() === 'button'\"\n>\n <!--\n Split-field con divisor vertical (genérico por lado):\n - trailing (Figma node 332:1667 \"Button\"): acción a la derecha + divisor\n border-right. `type='button'` lo activa solo.\n - leading (Figma node 313:10267 \"Phone\"): afijo interactivo a la izquierda\n (ej. country select) + divisor border-left.\n El input + íconos van en la zona interna `.sui-input__inner`, que lleva el\n padding y el/los border(s) de divisor. Los `[data-slot=start/end]` quedan\n flush a su lado como zonas de afijo. Para los types sin divisor,\n `.sui-input__inner` es transparente (display: contents) y el layout es el de\n siempre.\n -->\n\n <!-- ng-content start slot — afijo leading (flush cuando es control/divisor) -->\n <ng-content select=\"[data-slot=start]\" />\n\n <div class=\"sui-input__inner\">\n <!-- Built-in icon slot (left) -->\n @if (icon() && iconPosition() === 'left') {\n <span class=\"sui-input__icon sui-input__icon--left\">\n <sui-icon [name]=\"icon()!\" [size]=\"20\" />\n </span>\n }\n\n <!-- Prefix label (S/, $, %) -->\n @if (prefix()) {\n <span class=\"sui-input__prefix\">{{ prefix() }}</span>\n }\n\n <input\n #inputEl\n class=\"sui-input__control\"\n [type]=\"nativeType()\"\n [attr.inputmode]=\"inputMode()\"\n [value]=\"\n type() === 'amount'\n ? displayAmountValue()\n : type() === 'card'\n ? displayCardValue()\n : value()\n \"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.maxlength]=\"type() === 'card' ? (maxlength() ?? 19) : maxlength()\"\n [attr.min]=\"type() === 'number' ? min() : null\"\n [attr.max]=\"type() === 'number' ? max() : null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n (focus)=\"onFocus()\"\n (keydown)=\"onKeydown($event)\"\n (paste)=\"onPaste($event)\"\n />\n </div>\n\n <!-- ng-content end slot (backward compat) -->\n <ng-content select=\"[data-slot=end]\" />\n\n <!-- Clear button -->\n @if (showClear() && value() && !isDisabled() && !readonly()) {\n <button\n type=\"button\"\n class=\"sui-input__clear\"\n aria-label=\"Limpiar\"\n (click)=\"clearValue()\"\n >\n <sui-icon name=\"close-circle-line\" [size]=\"16\" />\n </button>\n }\n\n <!-- Password toggle button -->\n @if (type() === 'password-toggle' && !isDisabled()) {\n <button\n type=\"button\"\n class=\"sui-input__eye\"\n [attr.aria-label]=\"showPassword() ? 'Ocultar contraseña' : 'Mostrar contraseña'\"\n (click)=\"togglePassword()\"\n >\n <sui-icon [name]=\"showPassword() ? 'eye-off-line' : 'eye-line'\" [size]=\"16\" />\n </button>\n }\n\n <!-- Built-in icon slot (right) -->\n @if (icon() && iconPosition() === 'right') {\n <span class=\"sui-input__icon sui-input__icon--right\">\n <sui-icon [name]=\"icon()!\" [size]=\"20\" />\n </span>\n }\n</div>\n\n@if (error() ? errorMessage() : hint()) {\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [size]=\"size()\"\n class=\"sui-input__hint-host\"\n />\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiSwitch } from '../sui-switch/sui-switch';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiBadge } from '../sui-badge/sui-badge';\n\nexport type SuiIntegrationSwitchType = 'horizontal' | 'vertical';\nexport type SuiIntegrationSwitchAppearance = 'card' | 'list';\n\n/**\n * SUI Integration Switch — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 3678:14609 (\"Integration Switch [1.1]\") — 4 variants\n * Type (horizontal / vertical) × Style (card / list)\n *\n * Patrón típico: row de integración (ej. settings → integrations) con brand\n * logo + título + descripción + manage button + switch toggle.\n *\n * EXACT (pulled from Figma):\n * Container\n * card style bg-white-0, border 1px stroke-soft-200, padding 16, radius 12, shadow x-small\n * list style sin border, sin padding contenedor, drop-shadow x-small (logo y manage\n * sí tienen background propio)\n * Brand circle Card: 40×40 (icon 24×24 dentro) · List: 48×48 (icon 32×32 dentro)\n * Padding 8, border 1px stroke-soft-200, rounded-full, shadow x-small\n * Manage button bg-white border + shadow, padding 8, gap 4, radius 8\n * icon settings-2-line 20×20 + label \"Manage\" 14/20 medium sub-600\n * Switch 32×20 medium (sui-switch interno)\n *\n * Vertical Card Switch position-absolute top-right (19,19)\n * Vertical List Switch position-absolute top-right (12,12)\n * Horizontal Switch inline a la derecha (después del manage button)\n *\n * Typography:\n * Card title 14/20 medium strong-950, ls -0.6%\n * Card description 12/16 regular sub-600\n * List title 16/24 medium strong-950, ls -1.1%\n * List description 14/20 regular sub-600, ls -0.6%\n * Badge \"NEW\" bg state/information/light, text state/information/dark,\n * 11/12 medium UPPERCASE tracking 2\n *\n * Token map (Figma → sui-tokens):\n * bg/white-0 → --sui-bg-white-0\n * stroke/soft-200 → --sui-stroke-soft-200\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * NEW badge → sui-badge color=\"orange\" (accent de MARCA naranja, NO\n * el azul state/information de SUI — DECISIONES.md §1)\n * radius-8 → 8px\n * radius-12 → 12px\n * radius-full → 999px\n * shadow x-small → --sui-shadow-x-small\n *\n * PENDING VERIFY:\n * - Hover state del manage button: inferido bg-weak-50 (project convention).\n * - Active state del card outer: inferido scale(0.997) sutil.\n * - Disabled state: inferido opacity 0.5 + pointer-events: none.\n *\n * Brand logo: aceptamos custom via slot `[brand]` (ng-content por proyección).\n * Alternativa: pasar `brandIconSrc` (URL a un PNG/SVG) para casos simples.\n *\n * Custom sizes (no en Figma): proyecto puede expandir vía CSS overrides en el\n * consumer. Default queda en los 4 frame sizes canónicos.\n *\n * Usage:\n * <sui-integration-switch\n * title=\"Microsoft Office 365\"\n * description=\"Seamless collaboration and document management.\"\n * brandIconSrc=\"/assets/brand/microsoft.svg\"\n * [(active)]=\"integrations.microsoft\"\n * [badge]=\"true\"\n * (manage)=\"openSettings('microsoft')\"\n * />\n */\n@Component({\n selector: 'sui-integration-switch',\n standalone: true,\n templateUrl: './sui-integration-switch.html',\n styleUrl: './sui-integration-switch.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiSwitch, SuiIcon, SuiBadge],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiIntegrationSwitch),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). El input\n `title` se renderea como texto visible en `.sui-integration-switch__title`,\n así que no se expone como aria-label (sería doble-anuncio). */\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-appearance]': 'appearance()',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n },\n})\nexport class SuiIntegrationSwitch implements ControlValueAccessor {\n readonly type = input<SuiIntegrationSwitchType>('horizontal');\n readonly appearance = input<SuiIntegrationSwitchAppearance>('card');\n\n readonly title = input<string>('');\n readonly description = input<string | null>(null);\n\n /** URL al logo de la marca (SVG/PNG). Renderizado como <img> dentro del circle. */\n readonly brandIconSrc = input<string | null>(null);\n\n /** RemixIcon fallback si no hay brandIconSrc (ej. 'plug-line' como genérico). */\n readonly brandIcon = input<string | null>(null);\n\n readonly badge = input(false);\n readonly badgeLabel = input('NEW');\n\n /** Mostrar el manage button. Default true. */\n readonly showManage = input(true);\n readonly manageLabel = input('Manage');\n readonly manageIcon = input<string>('settings-2-line');\n\n /** Mostrar el switch toggle. Default true. */\n readonly showToggle = input(true);\n\n readonly disabled = input(false);\n\n /** Estado del switch — controlled pattern (input + output, no model).\n * Ver `sui-switch.ts` para la justificación (anti-loop protection bug).\n * El binding `[(active)]=\"signal\"` sigue funcionando porque Angular permite\n * two-way con `input + output` separados (input `active` + output `activeChange`). */\n readonly active = input(false);\n readonly activeChange = output<boolean>();\n\n /** Click en el manage button. */\n readonly manage = output<MouseEvent>();\n\n // ── ControlValueAccessor ──────────────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** CVA buffer — usado SOLO en form mode (formControlName/formControl). */\n private readonly _cvaValue = signal(false);\n private readonly _useCvaValue = signal(false);\n\n /** Estado VISIBLE — input del parent en uso normal, _cvaValue en form mode. */\n readonly effectiveActive = computed(() => {\n if (this._useCvaValue()) return this._cvaValue();\n return this.active();\n });\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Reacciona al event del switch hijo — re-emite hacia el parent. NO muta el\n * state internamente (input es one-way). En form mode, actualiza el buffer CVA. */\n onSwitchChange(next: boolean): void {\n if (this.isDisabled()) return;\n if (next === this.effectiveActive()) return;\n if (this._useCvaValue()) this._cvaValue.set(next);\n this.activeChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n onManageClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) {\n event.preventDefault();\n return;\n }\n this.manage.emit(event);\n }\n\n writeValue(v: boolean): void {\n this._cvaValue.set(!!v);\n this._useCvaValue.set(true);\n }\n registerOnChange(fn: (v: boolean) => void): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!-- Brand logo (circle 40 / 48 según appearance) -->\n<div class=\"sui-integration-switch__brand\" aria-hidden=\"true\">\n <ng-content select=\"[sui-integration-brand]\">\n @if (brandIconSrc(); as src) {\n <img [src]=\"src\" alt=\"\" class=\"sui-integration-switch__brand-img\" />\n } @else if (brandIcon(); as icon) {\n <sui-icon [name]=\"icon\" [size]=\"appearance() === 'list' ? 32 : 24\" />\n }\n </ng-content>\n</div>\n\n<!-- Title + description block -->\n<div class=\"sui-integration-switch__text\">\n <div class=\"sui-integration-switch__title-row\">\n <span class=\"sui-integration-switch__title\">{{ title() }}</span>\n @if (badge()) {\n <sui-badge\n class=\"sui-integration-switch__badge\"\n color=\"orange\"\n variant=\"light\"\n size=\"small\"\n >{{ badgeLabel() }}</sui-badge>\n }\n </div>\n @if (description(); as desc) {\n <p class=\"sui-integration-switch__description\">{{ desc }}</p>\n }\n</div>\n\n<!-- Manage button (trailing en horizontal, full-width en vertical) -->\n@if (showManage()) {\n <button\n type=\"button\"\n class=\"sui-integration-switch__manage\"\n [attr.aria-label]=\"manageLabel()\"\n [disabled]=\"isDisabled()\"\n (click)=\"onManageClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon [name]=\"manageIcon()\" [size]=\"20\" />\n <span class=\"sui-integration-switch__manage-label\">{{ manageLabel() }}</span>\n </button>\n}\n\n<!-- Switch (inline en horizontal · absolute top-right en vertical) -->\n@if (showToggle()) {\n <sui-switch\n class=\"sui-integration-switch__toggle\"\n [checked]=\"effectiveActive()\"\n [disabled]=\"isDisabled()\"\n (checkedChange)=\"onSwitchChange($event)\"\n />\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiKeyIconStyle = 'stroke' | 'lighter';\n\nexport type SuiKeyIconColor =\n | 'gray'\n | 'blue'\n | 'orange'\n | 'red'\n | 'green'\n | 'yellow'\n | 'purple'\n | 'pink'\n | 'teal';\n\n/** Los 5 tamaños canon del contenedor (px). El icono interno = size / 2. */\nexport type SuiKeyIconSize = 32 | 40 | 48 | 56 | 64;\n\n/** Set de los 9 colores SUI 2.0 para iterar desde el consumer (previews, demos). */\nexport const SUI_KEY_ICON_COLORS: readonly SuiKeyIconColor[] = [\n 'gray', 'blue', 'orange', 'red', 'green', 'yellow', 'purple', 'pink', 'teal',\n] as const;\n\n/** Set de los 5 tamaños canon, para iterar desde el consumer. */\nexport const SUI_KEY_ICON_SIZES: readonly SuiKeyIconSize[] = [32, 40, 48, 56, 64] as const;\n\n/**\n * SUI Key Icon — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO — grupo \"Key Components\" → \"KeyIcons [1.1]\".\n * Componente NUEVO (no existía como SUI). Contenedor circular de icono usado como\n * leading element en list rows, content-labels, empty-states, notificaciones, etc.\n *\n * 90 combinaciones = Style(2: stroke|lighter) × Color(9) × Size(5: 32/40/48/56/64).\n *\n * ── Style ──────────────────────────────────────────────────────────────────\n * stroke → bg `--sui-bg-white-0` + border 1px `--sui-stroke-soft-200`\n * + drop-shadow `--sui-shadow-x-small` + radius-full.\n * El icono interior toma el `*-base` del color.\n * lighter → bg del `*-lighter` del color (sin borde, sin sombra) + radius-full.\n * El icono interior toma el `*-base` del color.\n *\n * ── Color → token map (Figma exacto; ver SUI-FIGMA-CHECKLIST.md) ──────────────\n * gray → faded base #7b7b7b / lighter #f5f5f5\n * blue → information base #335cff / lighter #ebf1ff\n * orange → warning base #fa7319 / lighter #fff3eb\n * red → error base #fb3748 / lighter #ffebec\n * green → success base #1fc16b / lighter #e3f7ec\n * yellow → away base #f6b51e / lighter #fffaeb\n * purple → feature base #7d52f4 / lighter #efebff\n * pink → highlighted base #fb4ba3 / lighter #ffebf4\n * teal → verified base #47c2ff / lighter #ebf8ff\n *\n * ── Icono ────────────────────────────────────────────────────────────────────\n * Render SIEMPRE vía <sui-icon name=\"...\"> (regla del proyecto — nunca SVG\n * inline). Tamaño = size / 2 (Figma: el icono ocupa el 50% del contenedor).\n * El <sui-icon> recibe su tamaño DIRECTO vía [size]=\"iconSize()\" (su @Input),\n * NO vía custom prop CSS — sui-icon lee solo su @Input `size`, no una variable.\n * El color del icono = `*-base` del color, vía la custom prop `--sui-key-icon-fg`.\n *\n * Display-only: NO es un control de formulario (sin CVA) y NO es clickeable\n * (sin touchstart/touchend ni role=button). Si en el futuro se vuelve interactivo\n * habría que envolverlo en un <button> con el fix iOS :active (ver CLAUDE.md).\n *\n * ── Dark mode ─────────────────────────────────────────────────────────────────\n * El style `stroke` usa bg `--sui-bg-white-0` (igual que los otros 104 usos del\n * token en SUI). El proyecto NO tiene color-scheme dark hoy (no hay bloque\n * prefers-color-scheme / .dark / [data-theme] en sui-tokens.scss). Si se agrega,\n * `--sui-bg-white-0` se redefine UNA vez a nivel token y todo SUI —incluido este\n * stroke bg— adapta. NO hardcodear un bg distinto acá: divergiría de Figma (la\n * spec del KeyIcon stroke ES bg-white-0) y del resto del DS.\n *\n * PENDING VERIFY (Figma — NO verificado pixel-perfect):\n * - El component set \"KeyIcons\" NO está en el file 8p1k72aKKvzJV4XcvPS4VO.\n * Verificado 2026-05-29 vía MCP: get_metadata(file) lista solo 2 páginas\n * (`0:1 Cover`, `2771:1469 Brand`); la página Brand son brand-logos / crypto /\n * app-store badges, sin ningún nodo KeyIcon. El node 266:2814 (del prompt\n * original) resuelve a \"Label [1.1]\", NO a KeyIcons. KeyIcons vive en OTRO file\n * de SUI no accesible con este fileKey.\n * - Los valores actuales (color/lighter/base, size, icon=size/2, stroke=bg-white-0\n * + border stroke-soft-200 + shadow-x-small) provienen de la auditoría previa\n * (.claude/sui-audit/reaudit-reports.json + SUI-FIGMA-CHECKLIST.md líneas 84/105),\n * NO de un render en vivo de KeyIcons. Todos los tokens matchean 1:1 con\n * sui-tokens.scss, pero NO se hizo comparación visual contra el nodo real.\n * - Pendiente: identificar el fileKey/nodeId real del set KeyIcons y hacer un\n * get_screenshot para validar radius (¿círculo full vs radio fijo grande?),\n * border width, y el size del icono interno antes de marcar Figma-verified.\n */\n@Component({\n selector: 'sui-key-icon',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-key-icon.html',\n styleUrl: './sui-key-icon.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* data-sui-style + data-sui-color son los DRIVERS del styling per-variante en\n el SCSS. `size` NO se expone como data-attr: el SCSS dimensiona vía la custom\n prop --sui-key-icon-size, y el icono interno vía [size]=\"iconSize()\". */\n '[attr.data-sui-style]': 'styleVariant()',\n '[attr.data-sui-color]': 'color()',\n '[style.--sui-key-icon-size.px]': 'size()',\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n})\nexport class SuiKeyIcon {\n /** RemixIcon name (sin prefijo), e.g. 'mail-line', 'home-5-fill'. Se pasa a <sui-icon>. */\n readonly name = input.required<string>();\n\n /**\n * Estilo del contenedor. `style` choca con la property `style` del HTMLElement,\n * así que el input se llama `styleVariant` (host binding `data-sui-style`).\n */\n readonly styleVariant = input<SuiKeyIconStyle>('stroke');\n\n /** Color del set canon (9). */\n readonly color = input<SuiKeyIconColor>('gray');\n\n /** Tamaño del contenedor en px. Uno de 32/40/48/56/64. */\n readonly size = input<SuiKeyIconSize>(40);\n\n /** Tamaño del icono interno = 50% del contenedor (Figma). */\n readonly iconSize = computed<number>(() => this.size() / 2);\n}\n","<sui-icon\n class=\"sui-key-icon__icon\"\n [name]=\"name()\"\n [size]=\"iconSize()\"\n/>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { SUI_NAVBAR_VISIBILITY } from '../core/tokens';\n\n/**\n * SUI Modal Sheet — bottom sheet con breakpoints (estilo Apple Maps / Ionic ion-modal sheet).\n *\n * Diferencias con `<sui-modal>` estándar:\n * - Anclado al bottom de la pantalla, no centrado\n * - Drag handle (pill) arriba para arrastrar entre breakpoints\n * - Backdrop con fade dependiente del breakpoint actual (opcional)\n * - Cuando current ≤ backdropBreakpoint, el backdrop NO captura clicks → contenido\n * debajo (ej. mapa) sigue interactivo\n *\n * Inspirado en ion-modal sheet de Ionic.\n *\n * Uso típico para tracking de pedido con mapa abajo:\n * ```html\n * <sui-modal-sheet\n * [(open)]=\"trackingOpen\"\n * [breakpoints]=\"[0, 0.25, 0.6, 1]\"\n * [initialBreakpoint]=\"0.25\"\n * [backdropBreakpoint]=\"0.6\"\n * >\n * <h2>Tu pedido va en camino</h2>\n * <p>ETA: 15 minutos</p>\n * </sui-modal-sheet>\n * ```\n */\n@Component({\n selector: 'sui-modal-sheet',\n templateUrl: './sui-modal-sheet.html',\n styleUrl: './sui-modal-sheet.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n '[attr.data-sui-sheet-open]': 'open() ? \"\" : null',\n },\n})\nexport class SuiModalSheet implements OnDestroy {\n private readonly doc = inject(DOCUMENT);\n private readonly navbarVisibility = inject(SUI_NAVBAR_VISIBILITY, { optional: true });\n\n /** ID único por instancia para el counter centralizado del navbar. */\n private readonly _sheetId = `sui-modal-sheet-${Math.random().toString(36).slice(2, 11)}`;\n\n // ── Inputs ────────────────────────────────────────────────────────────────\n\n readonly open = model(false);\n\n /** Snap points del 0 al 1. 0 = cerrado, 1 = pleno. Debe incluir 0 para que el\n gesture pueda dismissar. Si NO incluye 0, el sheet no se cierra por swipe\n (igual que Ionic) — solo se cierra programáticamente o por backdrop. */\n readonly breakpoints = input<number[]>([0, 1]);\n\n /** Breakpoint donde arranca al abrir. Debe estar en `breakpoints`. */\n readonly initialBreakpoint = input<number>(1);\n\n /** A partir de qué breakpoint el backdrop empieza a aparecer (0-1).\n `0` (default) = backdrop fade lineal con el sheet desde el inicio.\n `0.5` = backdrop invisible hasta que sheet > 50%, después fade lineal.\n `1` = backdrop nunca aparece (mapa interactivo siempre). */\n readonly backdropBreakpoint = input<number>(0);\n\n /** Pill visible arriba del sheet como indicador de drag. */\n readonly showHandle = input(true);\n\n /** Cierra al hacer click en backdrop. Solo aplica si el backdrop está\n capturando pointer events (current > backdropBreakpoint). */\n readonly closeOnBackdrop = input(true);\n\n /** Cierra al presionar Escape (web). */\n readonly closeOnEscape = input(true);\n\n /** Quita el padding del body para contenido full-bleed. */\n readonly fullBody = input(false);\n\n // ── Outputs ───────────────────────────────────────────────────────────────\n\n readonly closed = output<void>();\n readonly breakpointChange = output<number>();\n\n // ── Refs ──────────────────────────────────────────────────────────────────\n\n @ViewChild('container') containerRef?: ElementRef<HTMLElement>;\n @ViewChild('handle') handleRef?: ElementRef<HTMLElement>;\n @ViewChild('body') bodyRef?: ElementRef<HTMLElement>;\n\n // ── State ─────────────────────────────────────────────────────────────────\n\n /** Breakpoint actual (0-1). Cambia al snap, no durante el drag. */\n readonly currentBreakpoint = signal<number>(0);\n\n /** Progress en vivo durante el drag (0-1). Expuesto como readonly al\n template (binding `--sheet-progress`) y al public para que el consumer\n pueda leerlo si quiere reaccionar. */\n protected readonly liveProgress = signal<number>(0);\n readonly progress = this.liveProgress.asReadonly();\n\n /** True mientras el usuario está arrastrando. Desactiva CSS transition. */\n readonly dragging = signal(false);\n\n /** Opacity del backdrop calculada según el progress vivo. */\n readonly backdropOpacity = computed(() =>\n this.computeBackdropOpacity(this.liveProgress()),\n );\n\n /** True si el backdrop debe capturar pointer events (current > backdropBreakpoint). */\n readonly backdropInteractive = computed(\n () => this.liveProgress() > this.backdropBreakpoint(),\n );\n\n /** Altura del sheet en dvh — `progress * 100`. Cuando progress=0.25 el\n sheet ocupa 25dvh y los otros 75dvh quedan VACÍOS → contenido detrás\n (mapa) totalmente interactivo sin necesidad de truquitos de\n pointer-events. */\n readonly heightCss = computed(() => `${this.liveProgress() * 100}dvh`);\n\n /** True cuando el sheet está al breakpoint máximo del array. En ese punto\n habilitamos scroll del body (touch-action: pan-y) — el user ya no puede\n expandir más, así que se prioriza ver el contenido sobre el drag. En el\n resto de breakpoints el body actúa como handle gigante (touch-action:\n none) y solo el drag controla la altura del sheet. */\n readonly atMaxBreakpoint = computed(() => {\n const bps = this.breakpoints();\n if (bps.length === 0) return false;\n const maxBp = Math.max(...bps);\n return this.currentBreakpoint() >= maxBp;\n });\n\n // ── Drag state (no signals, se manejan imperativamente) ───────────────────\n\n private dragStartY = 0;\n private dragStartProgress = 0;\n private wrapperHeight = 0;\n private pointerId: number | null = null;\n /** Para calcular velocity al final */\n private lastMoveTime = 0;\n private lastMoveY = 0;\n private velocityY = 0;\n\n /** Flag para distinguir drag iniciado en body (scroll-then-drag) vs en handle.\n En body, el drag NO arranca con pointerdown — sólo si pointermove\n excede un threshold y la condición de scroll lo permite. Sirve para no\n robar tap/click a buttons internos. */\n private bodyDragArmed = false;\n /** Threshold de movimiento (px) para decidir que un pointermove en body es\n drag (no tap). Patrón iOS estándar ~6-10px. */\n /* 5px = más sensible que el iOS canon de 8px. El user pidió \"como nativo\"\n pero el threshold default del 8px sentía que tardaba en activar.\n Trade-off: 5px puede activar drag con micro-movements al hacer tap, pero\n la heurística shouldIgnoreBodyDrag protege inputs/select/option. */\n private static readonly BODY_DRAG_THRESHOLD_PX = 5;\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n private wasOpen = false;\n private escapeHandler?: (e: KeyboardEvent) => void;\n\n constructor() {\n effect(() => {\n const isOpen = this.open();\n if (isOpen && !this.wasOpen) {\n this.onOpen();\n } else if (!isOpen && this.wasOpen) {\n this.onClose();\n }\n this.wasOpen = isOpen;\n });\n }\n\n ngOnDestroy(): void {\n this.removeEscapeHandler();\n this.unlockBodyScroll();\n if (this.wasOpen) {\n this.navbarVisibility?.release(this._sheetId);\n }\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n /** Mueve el sheet a un breakpoint específico programáticamente.\n Si `breakpoint` no está en el array de breakpoints, no hace nada. */\n setCurrentBreakpoint(breakpoint: number, animated = true): void {\n if (!this.breakpoints().includes(breakpoint)) {\n console.warn(`[sui-modal-sheet] Breakpoint ${breakpoint} no está en el array`);\n return;\n }\n this.snapTo(breakpoint, animated);\n }\n\n close(): void {\n this.open.set(false);\n }\n\n // ── Handlers de open/close ────────────────────────────────────────────────\n\n private onOpen(): void {\n this.lockBodyScroll();\n this.navbarVisibility?.requestHide(this._sheetId);\n this.attachEscapeHandler();\n\n /* Setear initial breakpoint en el siguiente tick (después del render para\n que el container ya tenga clientHeight). */\n setTimeout(() => {\n const initial = this.initialBreakpoint();\n this.snapTo(initial, false);\n }, 0);\n }\n\n private onClose(): void {\n this.removeEscapeHandler();\n this.unlockBodyScroll();\n this.navbarVisibility?.release(this._sheetId);\n this.liveProgress.set(0);\n this.currentBreakpoint.set(0);\n this.closed.emit();\n }\n\n // ── Drag gesture ──────────────────────────────────────────────────────────\n\n protected onPointerDown(event: PointerEvent): void {\n /* Solo eventos primarios (un dedo, click izquierdo). Multi-touch zoom etc.\n no inicia drag. */\n if (!event.isPrimary) return;\n\n this.wrapperHeight = this.containerRef?.nativeElement?.clientHeight ?? 0;\n if (this.wrapperHeight === 0) return;\n\n this.pointerId = event.pointerId;\n this.dragStartY = event.clientY;\n this.dragStartProgress = this.currentBreakpoint();\n this.lastMoveY = event.clientY;\n this.lastMoveTime = performance.now();\n this.velocityY = 0;\n\n this.dragging.set(true);\n\n /* setPointerCapture en el handle hace que pointermove/pointerup sigan\n llegando aunque el dedo salga del elemento original. Sin esto, swipes\n largos pierden eventos. */\n const handle = this.handleRef?.nativeElement;\n handle?.setPointerCapture(event.pointerId);\n event.preventDefault();\n }\n\n protected onPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId || !this.dragging()) return;\n\n const deltaY = event.clientY - this.dragStartY;\n /* Convertir deltaY a delta de progress: arrastrar hacia abajo (deltaY+)\n reduce el progress (sheet baja). */\n const deltaProgress = -deltaY / this.wrapperHeight;\n const next = this.dragStartProgress + deltaProgress;\n /* Clamp al rango del array de breakpoints. Min = primer breakpoint del\n array — si el array no incluye 0, el sheet NUNCA puede cerrarse por\n gesture (Apple Maps style). Max acotado a 1. */\n const minBp = this.breakpoints()[0] ?? 0;\n const clamped = Math.max(minBp, Math.min(1, next));\n this.liveProgress.set(clamped);\n\n /* Velocity tracking para boost del snap */\n const now = performance.now();\n const dt = now - this.lastMoveTime;\n if (dt > 0) {\n /* px/ms; positivo = bajando, negativo = subiendo */\n this.velocityY = (event.clientY - this.lastMoveY) / dt;\n }\n this.lastMoveY = event.clientY;\n this.lastMoveTime = now;\n }\n\n protected onPointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) return;\n\n /* Si el drag nunca llegó a activarse (bodyDragArmed pero sin movement),\n fue un tap — limpiar y dejar que el click siga su curso normal. */\n const wasDragging = this.dragging();\n this.pointerId = null;\n this.bodyDragArmed = false;\n this.dragging.set(false);\n\n const handle = this.handleRef?.nativeElement;\n const body = this.bodyRef?.nativeElement;\n try { handle?.releasePointerCapture(event.pointerId); } catch { /* noop */ }\n try { body?.releasePointerCapture(event.pointerId); } catch { /* noop */ }\n\n if (!wasDragging) return;\n\n /* Aplicar boost de velocity al progress final antes de snappear. Velocity\n en px/ms × (1/wrapperHeight) = progress/ms. Multiplicamos por una\n constante \"lookahead\" que predice ~80ms en el futuro — esto permite\n swipes rápidos brincar breakpoints SIN saltarse breakpoints intermedios\n (ej. 0.7 entre 0.5 y 1.0). 80ms es el sweet spot validado: a 150ms se\n saltaba el 0.7 con cualquier swipe medio-rápido; a 0ms el sheet se\n sentía pesado y nunca brincaba breakpoints. */\n const lookaheadMs = 80;\n const velocityProgress = -(this.velocityY * lookaheadMs) / this.wrapperHeight;\n const projected = Math.max(0, Math.min(1, this.liveProgress() + velocityProgress));\n\n const snapBp = this.findClosestBreakpoint(projected);\n this.snapTo(snapBp, true);\n }\n\n protected onPointerCancel(event: PointerEvent): void {\n /* Si el browser cancela el pointer (ej. scroll fight, otra app), volvemos\n al currentBreakpoint sin animar agresivo. */\n if (this.pointerId !== event.pointerId) return;\n this.pointerId = null;\n this.bodyDragArmed = false;\n this.dragging.set(false);\n this.snapTo(this.currentBreakpoint(), true);\n }\n\n // ── Body drag (scroll-then-drag canon iOS) ───────────────────────────────\n //\n // Patrón nativo iOS:\n // - Si el body está scrolleado al medio (scrollTop > 0) y user toca: scroll\n // normal del body, no drag del sheet.\n // - Si el body está en top (scrollTop === 0) y user arrastra hacia abajo:\n // drag del sheet hacia abajo (reduce su altura / cierra).\n // - Si el sheet NO está en max breakpoint y user arrastra hacia arriba:\n // drag del sheet hacia arriba (lo expande).\n // - Si el sheet está en max breakpoint y body con scroll y user arrastra\n // hacia arriba: scroll body.\n //\n // Importante: el drag NO arranca en pointerdown — lo armamos pero esperamos\n // a que pointermove supere un threshold (8px) antes de marcar `dragging`.\n // Esto evita robarle el click/tap a buttons del body.\n\n protected onBodyPointerDown(event: PointerEvent): void {\n if (!event.isPrimary) return;\n /* No interferir con interacciones de form: el user puede estar abriendo\n un dropdown nativo, seleccionando texto, etc. */\n const target = event.target as HTMLElement | null;\n if (this.shouldIgnoreBodyDrag(target)) return;\n\n this.wrapperHeight = this.containerRef?.nativeElement?.clientHeight ?? 0;\n if (this.wrapperHeight === 0) return;\n\n /* Solo armamos — el drag real arranca cuando pointermove supere threshold. */\n this.bodyDragArmed = true;\n this.pointerId = event.pointerId;\n this.dragStartY = event.clientY;\n this.dragStartProgress = this.currentBreakpoint();\n this.lastMoveY = event.clientY;\n this.lastMoveTime = performance.now();\n this.velocityY = 0;\n /* NO seteamos dragging() aún; eso pasa en move si supera threshold y la\n condición scroll-then-drag lo permite. */\n }\n\n protected onBodyPointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) return;\n\n /* Si ya estamos en drag activo, reusar la lógica común. */\n if (this.dragging()) {\n this.onPointerMove(event);\n return;\n }\n\n if (!this.bodyDragArmed) return;\n\n const deltaY = event.clientY - this.dragStartY;\n if (Math.abs(deltaY) < SuiModalSheet.BODY_DRAG_THRESHOLD_PX) return;\n\n /* Track velocity instantánea para detectar \"fling down\" — patrón canon\n iOS / Apple Maps / Twitter X: un swipe rápido hacia abajo colapsa el\n sheet incluso si el body está scrolleado en medio del contenido. */\n const now = performance.now();\n const dt = now - this.lastMoveTime;\n if (dt > 0) {\n this.velocityY = (event.clientY - this.lastMoveY) / dt; // px/ms\n }\n this.lastMoveY = event.clientY;\n this.lastMoveTime = now;\n\n /* Patrón scroll-then-drag canon iOS / X / Apple Maps. Importante: NO\n desarmamos `bodyDragArmed` cuando el body está scrolleando — re-evaluamos\n la velocity en cada move para detectar fling tardío. Si el user empieza\n scrolleando lento y luego \"flicka\" rápido abajo, igual debe colapsar. */\n const body = this.bodyRef?.nativeElement;\n if (this.atMaxBreakpoint() && body) {\n const hasOverflow = body.scrollHeight > body.clientHeight;\n if (hasOverflow) {\n const scrollTop = body.scrollTop;\n const draggingDown = deltaY > 0;\n const FLING_DOWN_THRESHOLD = 0.6; // px/ms ≈ 600 px/s — swipe medio-rápido\n const flingingDown = this.velocityY > FLING_DOWN_THRESHOLD;\n if (scrollTop > 0 && !flingingDown) {\n /* Body scrolleando suave — dejamos al scroll nativo, mantenemos\n armed para re-evaluar fling en próximos moves. */\n return;\n }\n if (scrollTop === 0 && !draggingDown) {\n /* Top del body + drag arriba → no hay donde expandir, no\n desarmamos por si el user cambia dirección. */\n return;\n }\n /* Casos: scrollTop=0 + down, o cualquier scroll + fling rápido →\n tomar control del sheet. Si fue fling desde scroll mid, resetear\n scrollTop para que el drag arranque limpio sin \"salto\". */\n if (scrollTop > 0 && flingingDown) {\n body.scrollTop = 0;\n /* Reset dragStartY al posición actual del fling para que el drag\n del sheet no interprete los pixels ya scrolleados como delta. */\n this.dragStartY = event.clientY;\n this.dragStartProgress = this.currentBreakpoint();\n }\n }\n }\n\n this.bodyDragArmed = false;\n this.dragging.set(true);\n try {\n body?.setPointerCapture(event.pointerId);\n } catch { /* noop */ }\n event.preventDefault();\n /* Forwardear este move ya en modo drag para no perder el delta. */\n this.onPointerMove(event);\n }\n\n /** Heurística: ignorar drag si el target es un input/textarea/select/button\n interactivo. El user está intentando interactuar, no arrastrar. */\n private shouldIgnoreBodyDrag(target: HTMLElement | null): boolean {\n if (!target) return false;\n const tag = target.tagName;\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || tag === 'OPTION') {\n return true;\n }\n /* Si el closest ancestor es un control que captura su propio pointer\n (range slider, color picker, etc.), no robamos el evento. */\n if (target.closest('[data-sui-no-sheet-drag]')) return true;\n return false;\n }\n\n // ── Snap ──────────────────────────────────────────────────────────────────\n\n private snapTo(breakpoint: number, animated: boolean): void {\n /* Si el snap es a 0, animamos pero después emitimos close. La animación de\n cierre la maneja el CSS transition (350ms). */\n this.liveProgress.set(breakpoint);\n\n if (breakpoint === 0) {\n /* Esperar la transición antes de emit close para que el sheet se vea\n deslizando hacia abajo. Si !animated saltamos directo. */\n const wait = animated ? 350 : 0;\n setTimeout(() => {\n this.currentBreakpoint.set(0);\n this.open.set(false);\n }, wait);\n return;\n }\n\n if (this.currentBreakpoint() !== breakpoint) {\n this.currentBreakpoint.set(breakpoint);\n this.breakpointChange.emit(breakpoint);\n }\n }\n\n private findClosestBreakpoint(progress: number): number {\n const bps = this.breakpoints();\n return bps.reduce((closest, bp) =>\n Math.abs(bp - progress) < Math.abs(closest - progress) ? bp : closest,\n );\n }\n\n // ── Backdrop ──────────────────────────────────────────────────────────────\n\n /** Fórmula linear entre (backdropBreakpoint, 0) y (1, 1). Igual que Ionic. */\n private computeBackdropOpacity(progress: number): number {\n const bp = this.backdropBreakpoint();\n if (bp >= 1) return 0;\n const slope = 1 / (1 - bp);\n return Math.max(0, Math.min(1, slope * (progress - bp)));\n }\n\n protected onBackdropClick(): void {\n if (this.closeOnBackdrop() && this.backdropInteractive()) {\n this.snapTo(0, true);\n }\n }\n\n // ── Body scroll lock ──────────────────────────────────────────────────────\n\n private lockBodyScroll(): void {\n this.doc.body.style.overflow = 'hidden';\n }\n\n private unlockBodyScroll(): void {\n setTimeout(() => {\n const openSheets = this.doc.querySelectorAll('[data-sui-sheet-open], [data-sui-modal-open]');\n if (openSheets.length === 0) {\n this.doc.body.style.overflow = '';\n }\n }, 0);\n }\n\n // ── Escape key ────────────────────────────────────────────────────────────\n\n private attachEscapeHandler(): void {\n this.escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.open() && this.closeOnEscape()) {\n this.snapTo(0, true);\n }\n };\n this.doc.addEventListener('keydown', this.escapeHandler);\n }\n\n private removeEscapeHandler(): void {\n if (this.escapeHandler) {\n this.doc.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = undefined;\n }\n }\n}\n","@if (open()) {\n <!-- Backdrop con opacity dinámica.\n pointer-events: none cuando current ≤ backdropBreakpoint para dejar\n interactivo el contenido debajo (ej. mapa). -->\n <div\n class=\"sui-sheet__backdrop\"\n [style.opacity]=\"backdropOpacity()\"\n [style.pointer-events]=\"backdropInteractive() ? 'auto' : 'none'\"\n (click)=\"onBackdropClick()\"\n aria-hidden=\"true\"\n ></div>\n\n <!-- Sheet container — anclado al bottom, altura dinámica.\n Usar `height` en vez de transform para que el área \"no cubierta\" del\n viewport (donde se ve el mapa) NO sea parte del DOM del sheet —\n contenido de fondo automáticamente interactivo, scroll del body\n respeta la altura visible (no fantasma). -->\n <div\n #container\n class=\"sui-sheet\"\n role=\"dialog\"\n aria-modal=\"true\"\n [class.sui-sheet--dragging]=\"dragging()\"\n [style.height]=\"heightCss()\"\n [style.--sheet-progress]=\"liveProgress()\"\n >\n @if (showHandle()) {\n <!-- Drag handle (pill). Solo este elemento captura los pointer events\n del drag — el resto del sheet permite scroll/clicks normales. -->\n <div\n #handle\n class=\"sui-sheet__handle\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel($event)\"\n >\n <div class=\"sui-sheet__handle-pill\"></div>\n </div>\n }\n\n <!-- Body con scroll interno. Consumer proyecta su contenido aquí.\n Acepta drag con patrón scroll-then-drag (iOS canon):\n - Si el body está scrolleado (scrollTop > 0), el drag se ignora y\n el touch hace scroll normal.\n - Si está en top (scrollTop === 0) y el user arrastra hacia abajo,\n se inicia drag del sheet.\n - Si está en max breakpoint y user arrastra hacia abajo, se inicia\n drag (incluso con scrollTop === 0 ya cubre eso).\n - Drag hacia arriba siempre permite scroll del body (no roba el gesto). -->\n <div\n #body\n class=\"sui-sheet__body\"\n [class.sui-sheet__body--full]=\"fullBody()\"\n [class.sui-sheet__body--scrollable]=\"atMaxBreakpoint()\"\n (pointerdown)=\"onBodyPointerDown($event)\"\n (pointermove)=\"onBodyPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerCancel($event)\"\n >\n <ng-content />\n </div>\n </div>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\nimport { SUI_NAVBAR_VISIBILITY } from '../core/tokens';\n\nexport type SuiModalSize = 'small' | 'medium' | 'large' | 'xlarge';\nexport type SuiModalIconVariant = 'info' | 'success' | 'warning' | 'error';\n/** Layout del bloque icono+título+descripción cuando hay `iconVariant`/`headerIcon`.\n * - `horizontal` (default, canon Figma \"Modal Header\"): icono a la izquierda del\n * bloque de texto, dentro del header de 80px.\n * - `vertical` (canon Figma \"Status Modals\" node 480:1372): icono centrado arriba,\n * título y descripción centrados en columna, tipografía escalada (Label/Medium\n * 16px + Paragraph/Small 14px). El bloque vive en el body, sin border-bottom. */\nexport type SuiModalStatusAlignment = 'horizontal' | 'vertical';\n\n/**\n * SUI Modal — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * Nodes pulled:\n * 3319:16461 — Modals [Overview] (root documentation frame)\n * 466:4778 — Modal Header [1.1] (component set: Basic/Small·Medium, Error, Warning, Success, Info)\n * 472:566 — Modal Footer [1.1] (component set: Basic, Checkbox, Info, Toggle, Stepper, Link, Stretch)\n * 480:1372 — Status Modals [1.1] (Error, Warning, Success, Info × Horizontal/Vertical)\n * 480:2474 — Modal Overlay [1.1] (bg rgba(51,51,51,0.24))\n * 3320:17876 — Modals [Examples] (real-world Communication Preferences modal)\n *\n * EXACT specs extracted from Figma:\n * Container:\n * bg: --sui-bg-white-0 (#fff)\n * border: 1px solid --sui-stroke-soft-200 (#ebebeb)\n * border-radius: --sui-radius-20 (20px)\n * shadow: regular-shadow/medium (0 16px 32px -12px rgba(14,18,27,0.10))\n *\n * Sizes (max-width, maps to data-sui-size):\n * small: 400px — no-description header (Small 56 — title only, no desc)\n * medium: 440px — full header (Medium 80 — title + description)\n * large: 560px — form modals\n * xlarge: 720px — wide content\n *\n * Overlay backdrop: bg rgba(51,51,51,0.24) from Figma overlay token\n *\n * Header (Medium 80):\n * padding: 16px 16px 16px 20px (pl=20, pr=16, py=16)\n * gap: 16px\n * border-bottom: 1px solid --sui-stroke-soft-200\n * Title: Label/Small — 14px/500/20px/−0.006em — text-strong-950\n * Description: Paragraph/X-Small — 12px/400/16px/0 — text-sub-600\n * Close button: 24px target, p=2px, radius=6px, icon=20px\n *\n * Header (Small 56 — no description):\n * padding: 16px 16px 16px 20px, gap: 12px\n * Only title, no description row\n *\n * Header icon variants (Error/Warning/Success/Info):\n * Left icon: circle bg (lighter variant) + 20px icon, p=10px, radius=full\n * gap between icon and text: 14px\n *\n * Body:\n * padding: 20px\n * gap: 20px (flex-col)\n *\n * Footer (Basic):\n * padding: 16px 20px (py=16, px=20)\n * border-top: 1px solid --sui-stroke-soft-200\n * justify-content: flex-end\n * gap: 12px\n *\n * Animation: fade + scale (opacity 0→1, scale 0.95→1) — per Figma DS\n * Overlay: fade (opacity 0→1), bg rgba(51,51,51,0.24). Blur(10px) por DEFAULT\n * (extra-feature \"glass\" del proyecto, encima del overlay plano del DS;\n * opt-out con [backdropBlur]=\"false\")\n *\n * Status Modals (Figma node 480:1372 — alignment=\"vertical\"):\n * Layout vertical: icono circular centrado arriba, texto centrado en columna.\n * Bloque en el body (p=20, gap=20 con footer), SIN border-bottom de header.\n * Title: Label/Medium — 16px/500/24px/−0.011em — text-strong-950\n * Description: Paragraph/Small — 14px/400/20px/−0.006em — text-sub-600\n *\n * ── HOMOLOGACIÓN 2026-05-29 (vs Figma SUI 2.0) ─────────────────────────\n * Cerrados:\n * - Backdrop blur(10px) por DEFAULT (extra-feature \"glass\" del proyecto).\n * Opt-out con `[backdropBlur]=\"false\"` para overlay plano DS-puro.\n * (Nota: una pasada previa lo movió a opt-in default false; revertido\n * 2026-05-29 por pedido — el blur es el comportamiento canon del proyecto.)\n * - Status Modal vertical (`[statusAlignment]=\"'vertical'\"`) con tipografía\n * escalada (Label/Medium + Paragraph/Small), centrado, body layout.\n * - Header Small (sin description) colapsa a 56px (antes min-height 80 fijo).\n * - Left Icon en Small se renderiza flat 24px sin círculo (Figma Small).\n * - Animación de entrada a scale puro 0.95→1 (sin translateY no-spec).\n * PENDING VERIFY (no se pudo abrir MCP Figma en esta pasada — valores tomados\n * del header inline previo + reports.json; confirmar contra el pixel cuando\n * el MCP esté sano):\n * - Status vertical: gap exacto icono↔título y padding del wrapper.\n * - Footer tipado (Checkbox/Info/Toggle/Stepper/Link/Stretch): sigue como\n * slot abierto — el consumer replica el layout (no se tipó, ver newQuestions).\n *\n * @input open — model<boolean> — two-way binding to open/close\n * @input size — SuiModalSize — container max-width (default: 'medium')\n * @input title — string | null — modal title text\n * @input description — string | null — subtitle below title (shown only on Medium+)\n * @input closeOnBackdrop — boolean — close when clicking overlay (default: true)\n * @input closeOnEscape — boolean — close on Escape key (default: true)\n * @input showClose — boolean — show X button (default: true)\n * @input iconVariant — SuiModalIconVariant | null — circular icon in header\n * @input statusAlignment — 'horizontal' | 'vertical' — layout del icono+texto.\n * 'vertical' = patrón Status Modal de Figma (default: 'horizontal')\n * @input backdropBlur — boolean — blur(10px) del fondo. default true (look\n * glass del proyecto); opt-out con [backdropBlur]=\"false\"\n * para overlay plano DS-puro (sin clase → blur del base rule;\n * false → clase --no-blur que lo quita)\n *\n * @output closed — emitted after modal closes\n *\n * Template slots:\n * Default (ng-content): modal body content\n * [slot=\"footer\"]: action buttons row\n */\n@Component({\n selector: 'sui-modal',\n templateUrl: './sui-modal.html',\n styleUrl: './sui-modal.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SuiIcon, SuiCompactButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-modal-open]': 'open() ? \"\" : null',\n '[attr.data-sui-modal-fullscreen]': 'fullscreen() ? \"\" : null',\n },\n})\nexport class SuiModal implements AfterViewInit, OnDestroy {\n private readonly doc = inject(DOCUMENT);\n\n // ── Inputs ────────────────────────────────────────────────────────────────\n readonly open = model(false);\n readonly size = input<SuiModalSize>('medium');\n readonly title = input<string | null>(null);\n readonly description = input<string | null>(null);\n readonly closeOnBackdrop = input(true);\n readonly closeOnEscape = input(true);\n readonly showClose = input(true);\n readonly iconVariant = input<SuiModalIconVariant | null>(null);\n /** Icono contextual del header (RemixIcon, ej. 'add-circle-line').\n Mutuamente excluyente con `iconVariant`: si se pasa, se usa con un\n contenedor circular bg `neutral-lighter` + color `sub-600`. Si NO se\n pasa y hay `iconVariant`, fallback al variant semántico. */\n readonly headerIcon = input<string | null>(null);\n\n /** Layout del header con icono. `vertical` = patrón Status Modal de Figma\n (node 480:1372): icono centrado arriba, texto centrado en columna,\n tipografía escalada. Requiere `iconVariant` o `headerIcon` para tener\n efecto visible. */\n readonly statusAlignment = input<SuiModalStatusAlignment>('horizontal');\n\n /** Aplica `backdrop-filter: blur(10px)` al overlay. Por defecto `true` —\n extra-feature \"glass\" del proyecto encima del overlay-gray plano del DS\n (rgba(51,51,51,0.24)). Pasar `[backdropBlur]=\"false\"` lo quita y deja el\n overlay plano DS-puro. */\n readonly backdropBlur = input(true);\n\n /** Solo afecta en mobile (≤768px): el modal toma todo el ancho desde safe-area-top\n hasta safe-area-bottom, deja el área superior visible (status bar respetado),\n y se eleva con el teclado. En desktop el modal funciona como `size` indica. */\n readonly fullscreen = input(false);\n\n /** Quita el padding del body para contenido full-bleed (mapas, imágenes\n grandes). El consumer es responsable de su propio spacing interno. */\n readonly fullBody = input(false);\n\n // ── Outputs ───────────────────────────────────────────────────────────────\n readonly closed = output<void>();\n\n // ── Template refs ─────────────────────────────────────────────────────────\n @ViewChild('container') containerRef?: ElementRef<HTMLElement>;\n @ViewChild('bodyEl') bodyRef?: ElementRef<HTMLElement>;\n\n // ── Scroll state: true si el body tiene content overflow (permite scroll) ─\n readonly scrollActive = signal(false);\n\n private _bodyScrollListener?: () => void;\n private _bodyResizeObserver?: ResizeObserver;\n\n // ── Unique IDs for ARIA ───────────────────────────────────────────────────\n private static _nextId = 0;\n protected readonly titleId = `sui-modal-title-${++SuiModal._nextId}`;\n protected readonly descId = `sui-modal-desc-${SuiModal._nextId}`;\n\n // ── React to open signal changes ──────────────────────────────────────────\n private _wasOpen = false;\n private readonly navbarVisibility = inject(SUI_NAVBAR_VISIBILITY, { optional: true });\n\n /** ID único por instancia para el counter del NavbarVisibilityService.\n Random suffix evita colisión entre modales de la misma página. */\n private readonly _modalId = `sui-modal-${Math.random().toString(36).slice(2, 11)}`;\n\n /** Listeners Keyboard del Capacitor — solo se atan en fullscreen+open */\n private _keyboardShowHandle?: { remove: () => Promise<void> };\n private _keyboardHideHandle?: { remove: () => Promise<void> };\n\n /* Sync reactivo del navbar liquid glass con el estado open. El servicio\n centraliza el counter por id, así que modales anidados no se pisan: el\n hijo solo libera su propio id y el padre sigue manteniendo el navbar\n oculto. */\n private readonly _navbarSync = effect(() => {\n if (this.open()) {\n this.navbarVisibility?.requestHide(this._modalId);\n } else {\n this.navbarVisibility?.release(this._modalId);\n }\n });\n\n constructor() {\n effect(() => {\n const isOpen = this.open();\n if (isOpen && !this._wasOpen) {\n // Opening\n this._previousFocus = this.doc.activeElement;\n this._lockScroll();\n /* Atar el listener de teclado en AMBOS (normal y fullscreen). En el modal\n normal habilita el `scrollIntoView` del input enfocado (sino el campo\n bajo del form queda fuera del scroll del body al abrir el teclado). NO\n afecta la geometría del normal: `_setKeyboardVar` sigue gateado a iOS y\n `--sui-keyboard-h` solo lo lee el calc del fullscreen. */\n this._bindKeyboard();\n setTimeout(() => {\n this._focusFirst();\n this._bindScrollDetection();\n }, 50);\n } else if (!isOpen && this._wasOpen) {\n this._unbindScrollDetection();\n // Closing\n this._unlockScroll();\n this._unbindKeyboard();\n this.closed.emit();\n if (this._previousFocus && (this._previousFocus as HTMLElement).focus) {\n (this._previousFocus as HTMLElement).focus();\n }\n }\n this._wasOpen = isOpen;\n });\n }\n\n /** Compensación del teclado — se aplica en AMBAS plataformas seteando\n `--sui-keyboard-h` (el SCSS lo resta del `100dvh` del modal fullscreen para\n elevarlo sobre el teclado).\n\n Por qué ambas (corregido — antes solo iOS, y Android quedaba con un espacio\n en blanco gigante debajo del modal al enfocar un input):\n\n Con `Keyboard.resize:'none'` (ver capacitor.config) el WebView NO hace\n shrink en ninguna plataforma, y el `dvh` tampoco se achica solo:\n - **iOS (WebKit):** no implementa el meta `interactive-widget` → el viewport\n se comporta como `resizes-visual`, el `dvh` no cambia con el teclado.\n - **Android (Chromium):** aunque el `index.html` declara\n `interactive-widget=resizes-content`, eso SOLO achica el layout viewport\n si el WebView recibe el inset del teclado — y `resize:'none'` se traduce\n a `adjustNothing`, así que Chromium nunca recibe el inset y el `dvh` NO se\n reduce. (La suposición previa de que Android \"achicaba el dvh solo\" era\n falsa con `resize:'none'`.)\n\n Conclusión: como en ninguna plataforma el `dvh` se achica solo, compensamos\n a mano en las dos. No hay doble descuento porque el `dvh` queda completo. */\n private async _bindKeyboard(): Promise<void> {\n try {\n const { Capacitor } = await import('@capacitor/core');\n if (!Capacitor.isNativePlatform()) return;\n /* La compensación manual del teclado (`--sui-keyboard-h`) SOLO aplica a\n iOS. En Android, `interactive-widget=resizes-content` (index.html) hace\n que Chromium achique el Layout Viewport al abrir el teclado, así que\n `100dvh` ya se reduce solo ~keyboardHeight px (ver el calc en\n sui-modal.scss, override `.platform-android`). Restar `--sui-keyboard-h`\n ADEMÁS sería DOBLE descuento → el modal se elevaba el doble y dejaba una\n franja gris ≈ altura del teclado sobre él. iOS/WebKit NO implementa\n interactive-widget: el dvh queda completo, así que ahí `--sui-keyboard-h`\n es la única compensación que eleva el modal sobre el teclado.\n El `scrollIntoView` del input enfocado corre en AMBAS plataformas. */\n const isIOS = Capacitor.getPlatform() === 'ios';\n const { Keyboard } = await import('@capacitor/keyboard');\n this._keyboardShowHandle = await Keyboard.addListener('keyboardWillShow', (info: { keyboardHeight?: number }) => {\n const h = (info as any)?.keyboardHeight ?? 0;\n if (isIOS) this._setKeyboardVar(h);\n /* Marca \"teclado abierto\" en el positioner. SOLO la usa el CSS de Android\n para que el modal NORMAL use el alto completo del dvh (que en Android ya\n está reducido por SystemBars) en vez del cap 50dvh — sino el modal queda\n apretado a ~¼ de pantalla (doble recorte: dvh achicado × 50%). iOS NO la\n usa (ahí el dvh queda completo y 50dvh ya da media pantalla = amplio). */\n this._setKeyboardOpenClass(true);\n /* Scroll smooth del input enfocado al centro del body, después de la\n transition del container (sui-modal.scss: `transition: height 0.22s`).\n Esperar al shrink completo deja el \"centro\" del body estable cuando\n arranca el scroll, así el input queda centrado sobre el teclado. */\n setTimeout(() => {\n const active = this.doc.activeElement as HTMLElement | null;\n if (active && this.bodyRef?.nativeElement.contains(active)) {\n active.scrollIntoView({ block: 'center', behavior: 'smooth' });\n }\n }, 220);\n });\n this._keyboardHideHandle = await Keyboard.addListener('keyboardWillHide', () => {\n if (isIOS) this._setKeyboardVar(0);\n this._setKeyboardOpenClass(false);\n });\n } catch {\n /* Capacitor o plugin no disponible — modo web puro, dvh + interactive-widget hace el trabajo */\n }\n }\n\n private async _unbindKeyboard(): Promise<void> {\n this._setKeyboardVar(0);\n this._setKeyboardOpenClass(false);\n try {\n await this._keyboardShowHandle?.remove();\n await this._keyboardHideHandle?.remove();\n } catch { /* noop */ }\n this._keyboardShowHandle = undefined;\n this._keyboardHideHandle = undefined;\n }\n\n private _setKeyboardVar(heightPx: number): void {\n const host = (this.containerRef?.nativeElement?.closest('.sui-modal') ?? this.doc.documentElement) as HTMLElement;\n if (heightPx > 0) {\n host.style.setProperty('--sui-keyboard-h', `${heightPx}px`);\n } else {\n host.style.removeProperty('--sui-keyboard-h');\n }\n }\n\n /** Togglea `sui-modal--kb-open` en el positioner. SOLO la consume el CSS de\n Android (sui-modal.scss) para expandir el modal NORMAL al alto completo del\n `dvh` con el teclado (el `dvh` en Android ya viene reducido por SystemBars,\n así que el cap `50dvh` lo dejaba a ~¼ de pantalla). iOS no la usa. */\n private _setKeyboardOpenClass(open: boolean): void {\n const positioner = this.containerRef?.nativeElement?.closest('.sui-modal') as HTMLElement | null;\n positioner?.classList.toggle('sui-modal--kb-open', open);\n }\n\n // ── Computed helpers ──────────────────────────────────────────────────────\n\n /** Returns the RemixIcon name to render in the header circle. Prefiere\n * `headerIcon` custom; si no, deriva del `iconVariant` semántico. */\n protected readonly iconName = computed<string>(() => {\n const custom = this.headerIcon();\n if (custom) return custom;\n switch (this.iconVariant()) {\n case 'error': return 'error-warning-fill';\n case 'warning': return 'alert-fill';\n case 'success': return 'checkbox-circle-fill';\n case 'info': return 'information-fill';\n default: return 'information-fill';\n }\n });\n\n /** Indica si se debe renderizar el círculo del icono (cualquiera de los\n * dos inputs activa el render). */\n protected readonly hasHeaderIcon = computed<boolean>(() =>\n !!this.headerIcon() || !!this.iconVariant(),\n );\n\n /** data-variant del círculo: si hay variant semántico lo usa; si solo hay\n * headerIcon custom, retorna 'neutral'. */\n protected readonly resolvedIconVariant = computed<string>(() =>\n this.iconVariant() ?? (this.headerIcon() ? 'neutral' : 'info'),\n );\n\n /** True cuando el modal está en modo Status vertical Y hay un icono que\n * mostrar. En este modo el icono+texto se renderizan centrados en el body,\n * no en el header horizontal. */\n readonly isStatusVertical = computed<boolean>(\n () => this.statusAlignment() === 'vertical' && this.hasHeaderIcon(),\n );\n\n /** True cuando el header con icono debe renderizar el icono \"flat\" (24px sin\n * círculo): patrón Figma \"Modal Header / Small\" (size sin description). Solo\n * aplica en modo horizontal con icono y SIN description. */\n readonly isCompactHeader = computed<boolean>(\n () => !this.isStatusVertical() && !this.description(),\n );\n\n // ── Element that had focus before opening (for restore) ───────────────────\n private _previousFocus: Element | null = null;\n private _escapeHandler?: (e: KeyboardEvent) => void;\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n ngAfterViewInit(): void {\n this._escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.open() && this.closeOnEscape()) {\n this.close();\n }\n };\n this.doc.addEventListener('keydown', this._escapeHandler);\n }\n\n ngOnDestroy(): void {\n if (this._escapeHandler) {\n this.doc.removeEventListener('keydown', this._escapeHandler);\n }\n this._unlockScroll();\n this._unbindScrollDetection();\n this._unbindKeyboard();\n /* Safety: si se destruye abierto sin pasar por el branch de cierre, el\n effect del navbar tampoco corre el release. Forzamos el release directo\n acá para que el id no quede colgado en el set y el navbar vuelva a\n aparecer correctamente cuando solo este modal estaba activo. */\n if (this._wasOpen) {\n this.navbarVisibility?.release(this._modalId);\n }\n }\n\n // ── Scroll detection — scroll-active cuando el body tiene overflow pendiente ─\n private _bindScrollDetection(): void {\n const el = this.bodyRef?.nativeElement;\n if (!el) return;\n const check = () => {\n const hasOverflow = el.scrollHeight > el.clientHeight;\n const notAtBottom = el.scrollTop + el.clientHeight < el.scrollHeight - 1;\n this.scrollActive.set(hasOverflow && notAtBottom);\n };\n this._bodyScrollListener = check;\n el.addEventListener('scroll', check, { passive: true });\n // Initial check + observe resize (content cambia altura dinámico: inputs focus, form expand, etc.)\n if (typeof ResizeObserver !== 'undefined') {\n this._bodyResizeObserver = new ResizeObserver(check);\n this._bodyResizeObserver.observe(el);\n }\n check();\n }\n\n private _unbindScrollDetection(): void {\n const el = this.bodyRef?.nativeElement;\n if (el && this._bodyScrollListener) {\n el.removeEventListener('scroll', this._bodyScrollListener);\n }\n this._bodyScrollListener = undefined;\n this._bodyResizeObserver?.disconnect();\n this._bodyResizeObserver = undefined;\n this.scrollActive.set(false);\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n /** Close the modal. The effect handles closed emit, scroll unlock + focus restore. */\n close(): void {\n this.open.set(false);\n }\n\n // ── Event handlers ────────────────────────────────────────────────────────\n\n protected onBackdropClick(): void {\n if (this.closeOnBackdrop()) {\n this.close();\n }\n }\n\n /** Prevent clicks inside container from bubbling to backdrop */\n protected onContainerClick(event: MouseEvent): void {\n event.stopPropagation();\n }\n\n private _lockScroll(): void {\n this.doc.body.style.overflow = 'hidden';\n }\n\n private _unlockScroll(): void {\n // Only unlock if no other modals are open (check on next tick)\n setTimeout(() => {\n const openModals = this.doc.querySelectorAll('[data-sui-modal-open]');\n if (openModals.length === 0) {\n this.doc.body.style.overflow = '';\n }\n }, 0);\n }\n\n private _focusFirst(): void {\n /* Focusamos el container (tabindex=-1) en vez del primer button — así\n screen readers leen el contexto del modal pero no destacamos un\n elemento concreto (evita el ring naranja en el X al abrir). El\n Tab/Shift+Tab del usuario sigue navegando dentro del modal normal. */\n const container = this.containerRef?.nativeElement;\n container?.focus({ preventScroll: true });\n }\n}\n","@if (open()) {\n <!-- Overlay backdrop -->\n <div\n class=\"sui-modal__backdrop\"\n [class.sui-modal__backdrop--no-blur]=\"!backdropBlur()\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\"\n aria-hidden=\"true\"\n ></div>\n\n <!-- Dialog wrapper (also acts as click-outside target when backdrop is disabled) -->\n <div\n class=\"sui-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n [attr.aria-describedby]=\"description() ? descId : null\"\n >\n <!-- Container — click stops propagation so it doesn't close.\n tabindex=-1 hace que el container sea focusable programáticamente\n (para a11y al abrir el modal) pero NO entra en el tab order. */ -->\n <div\n #container\n class=\"sui-modal__container\"\n [class.sui-modal__container--scroll-active]=\"scrollActive()\"\n [class.sui-modal__container--fullscreen]=\"fullscreen()\"\n [class.sui-modal__container--status-vertical]=\"isStatusVertical()\"\n [attr.data-sui-size]=\"size()\"\n tabindex=\"-1\"\n (click)=\"onContainerClick($event)\"\n >\n <!-- Header — modo HORIZONTAL (canon Figma \"Modal Header\").\n En modo Status vertical el icono+texto se mueven al body, así que el\n header solo conserva el close button (si aplica). -->\n @if (title() || showClose()) {\n <header\n class=\"sui-modal__header\"\n [class.sui-modal__header--with-icon]=\"hasHeaderIcon() && !isStatusVertical()\"\n [class.sui-modal__header--compact]=\"isCompactHeader()\"\n [class.sui-modal__header--close-only]=\"isStatusVertical()\"\n >\n\n <!-- Icon badge (horizontal): círculo bg lighter + 20px icono.\n En Small (sin description) Figma lo muestra flat 24px sin círculo\n → la clase --compact del header lo controla vía SCSS. -->\n @if (hasHeaderIcon() && !isStatusVertical()) {\n <div class=\"sui-modal__icon\" [attr.data-variant]=\"resolvedIconVariant()\">\n <sui-icon [name]=\"iconName()\" [size]=\"isCompactHeader() ? 24 : 20\" />\n </div>\n }\n\n <!-- Title + Description (horizontal) -->\n @if (!isStatusVertical()) {\n <div class=\"sui-modal__titles\">\n @if (title()) {\n <h2 [id]=\"titleId\" class=\"sui-modal__title\">{{ title() }}</h2>\n }\n @if (description()) {\n <p [id]=\"descId\" class=\"sui-modal__description\">{{ description() }}</p>\n }\n </div>\n }\n\n <!-- Close button — Figma 466:4778 lo modela como Compact Button [1.1]\n (close-line 20px, ghost). Canon: sui-compact-button (ver CLAUDE.md\n \"close X en modales\"), no un <button> maqueta. -->\n @if (showClose()) {\n <sui-compact-button\n class=\"sui-modal__close\"\n icon=\"close-line\"\n variantStyle=\"ghost\"\n size=\"large\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"close()\"\n />\n }\n </header>\n }\n\n <!-- Body — default slot (ng-content). El consumer proyecta cualquier markup aquí. -->\n <div #bodyEl\n class=\"sui-modal__body\"\n [class.sui-modal__body--full]=\"fullBody()\"\n [class.sui-modal__body--status]=\"isStatusVertical()\">\n\n <!-- Status vertical: icono centrado arriba + texto centrado (Figma 480:1372).\n Tipografía escalada (Label/Medium 16 + Paragraph/Small 14). -->\n @if (isStatusVertical()) {\n <div class=\"sui-modal__status\">\n <div class=\"sui-modal__icon\" [attr.data-variant]=\"resolvedIconVariant()\">\n <sui-icon [name]=\"iconName()\" [size]=\"24\" />\n </div>\n @if (title() || description()) {\n <div class=\"sui-modal__status-text\">\n @if (title()) {\n <h2 [id]=\"titleId\" class=\"sui-modal__status-title\">{{ title() }}</h2>\n }\n @if (description()) {\n <p [id]=\"descId\" class=\"sui-modal__status-description\">{{ description() }}</p>\n }\n </div>\n }\n </div>\n }\n\n <ng-content />\n </div>\n\n <!-- Footer — named slot via attribute selector -->\n <ng-content select=\"[slot=footer]\" />\n </div>\n </div>\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiKbd } from '../sui-kbd/sui-kbd';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\n\n/**\n * SUI Notification Footer — SUI Design System 2.0\n *\n * Footer del panel de notificaciones (campana). Barra inferior con un hint de\n * navegación por teclado a la izquierda y un link \"Manage Notification\" a la\n * derecha. Componente NUEVO de la homologación vs Figma 2.0.\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 4308:5526 (Notifications Footer [1.1])\n *\n * EXACT specs (de get_design_context + get_variable_defs):\n * Container:\n * background: var(--bg/white-0) #ffffff\n * display: flex, gap 16px, align-items center, justify-content center\n * padding: 14px 20px\n * overflow: clip\n * width: 100% (Figma frame 540px)\n * Navigate group (izq, flex 1 0 0, min-width 0):\n * gap 8px, align-items center\n * \"Use\" + kbd(arrow-up-line) + kbd(arrow-down-line) + \"to navigate\"\n * labels: Paragraph/X Small → Inter Regular 12/16, color text/sub-600 #5c5c5c\n * kbds: sui-kbd variant=\"subtle\" (bg weak-50, border soft-200, radius-4,\n * padding 2px) conteniendo sui-icon 16×16\n * Link button (der, gap 4px, shrink 0):\n * sui-icon settings-2-line 16×16 (icon/sub-600 #5c5c5c)\n * \"Manage Notification\" → Label/X Small → Inter Medium 12/16, text/sub-600\n *\n * NOTA: el link de Figma es muted (sub-600), NO primary-coloreado. Se compone con\n * el COMPONENTE real `sui-link-button` usando `variant=\"gray\"` (tokens text/sub-600\n * base + text/strong-950 en focus = exactamente el muted del spec) + `size=\"small\"`\n * (Inter Medium 12/16 + icono 16) + `leftIcon=\"settings-2-line\"`. Antes era un\n * `<button>` maqueta con styling propio; el variant `gray` cubre el caso 1:1, así\n * que se reusa el componente (canon: ningún `<button>` custom donde un SUI sirve).\n *\n * API:\n * - usePrefix: string ('Use') — texto antes de las teclas\n * - useSuffix: string ('to navigate') — texto después de las teclas\n * - manageLabel: string ('Manage Notification')\n * - showManage: boolean (true) — toggle del link (Figma prop `button`)\n * - (manageClick): output<MouseEvent> — click en \"Manage Notification\"\n *\n * Uso:\n * <sui-notification-footer (manageClick)=\"abrirAjustes()\" />\n *\n * PENDING VERIFY:\n * - El frame Figma es 540px fijo; acá el host es width 100% para encajar en el\n * panel de campana real. Validar contra el ancho real del dropdown en uso.\n * - settings-2-line resuelve via RemixIcon font (ri-settings-2-line). Confirmado\n * que existe en RemixIcon; si el panel real usa otro glyph, ajustar el name.\n */\n@Component({\n selector: 'sui-notification-footer',\n standalone: true,\n templateUrl: './sui-notification-footer.html',\n styleUrl: './sui-notification-footer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiKbd, SuiLinkButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n})\nexport class SuiNotificationFooter {\n readonly usePrefix = input<string>('Use');\n readonly useSuffix = input<string>('to navigate');\n readonly manageLabel = input<string>('Manage Notification');\n readonly showManage = input<boolean>(true);\n\n readonly manageClick = output<MouseEvent>();\n}\n","<div class=\"sui-notif-footer__navigate\">\n <span class=\"sui-notif-footer__label\">{{ usePrefix() }}</span>\n <sui-kbd variant=\"subtle\">\n <sui-icon name=\"arrow-up-line\" [size]=\"16\" />\n </sui-kbd>\n <sui-kbd variant=\"subtle\">\n <sui-icon name=\"arrow-down-line\" [size]=\"16\" />\n </sui-kbd>\n <span class=\"sui-notif-footer__label\">{{ useSuffix() }}</span>\n</div>\n\n@if (showManage()) {\n <!-- Link \"Manage Notification\" = COMPONENTE sui-link-button real (variant `gray`\n → tokens text/sub-600 base + strong-950 focus = el muted del spec Figma),\n NO un <button> maqueta. size `small` da Inter Medium 12/16 + icono 16. -->\n <sui-link-button\n class=\"sui-notif-footer__manage\"\n variant=\"gray\"\n size=\"small\"\n leftIcon=\"settings-2-line\"\n (clicked)=\"manageClick.emit($event)\"\n >{{ manageLabel() }}</sui-link-button>\n}\n","import { ChangeDetectionStrategy, Component, input, model, output } from '@angular/core';\nimport { SuiBadge } from '../sui-badge/sui-badge';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\n/**\n * Un ítem del Notification Tab Menu. Modela un tab del header del panel de\n * notificaciones (campana). El eje \"Quantity\" del Figma (02/03/04) se reduce a\n * la longitud del array `tabs[]` — el componente NO hardcodea 2/3/4 tabs.\n */\nexport interface SuiNotificationTab<T = string> {\n /** Valor único usado para selección/identidad. */\n value: T;\n /** Etiqueta visible del tab (All, Inbox, Following, Archived…). */\n label: string;\n /**\n * Contador del badge rojo (state/error/base). `> 0` lo renderiza; `0`/\n * `undefined` lo oculta. En el Figma solo \"Inbox\" lo lleva (Badge [1.1]\n * Number), pero se modela per-tab para flexibilidad.\n */\n badge?: number;\n /**\n * Renderiza un divider vertical INMEDIATAMENTE ANTES de este tab. En el\n * Figma 4308:1091 hay un divider entre \"Following\" y \"Archived\"; se modela\n * como propiedad del tab que va después del divider (ej. `Archived`).\n */\n dividerBefore?: boolean;\n}\n\n/**\n * SUI Notification Tab Menu — SUI Design System 2.0\n *\n * Componente NUEVO (no existía en SUI). Es el HEADER del panel de\n * notificaciones (el dropdown de la campana): fila de tabs con underline activo,\n * badge rojo de conteo, divider vertical de agrupación y botón de filtro\n * absoluto a la derecha.\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodo homologado (2026-05-29):\n * 4349:46656 — \"Notifications Tab Menu [1.1]\" (frame con 3 variantes Quantity)\n * 4308:1091 — Quantity=04 (All · Inbox(2) · Following | Archived + filtro)\n * 4349:46657 — Quantity=03 (All · Inbox(2) · Following + filtro)\n * 4349:46704 — Quantity=02 (All · Inbox(2) + filtro)\n *\n * EXACT specs (pulled del design_context + variable_defs):\n * Container (4308:1091):\n * bg: bg/white-0 (--sui-bg-white-0)\n * border-bottom: 1px solid stroke/soft-200 (--sui-stroke-soft-200) ← SOLO bottom\n * padding: 14px 20px (py-14 px-20)\n * gap entre tabs: 20px · align-items: center · position: relative\n * (relative = ancla del botón de filtro absoluto)\n * Tab (Tab Menu Horizontal Items [1.1] reusado, I4308:1061;3511:9899):\n * \"Text\" wrapper: flex, gap 4px (label ↔ badge)\n * font: Label/Small — Inter Medium 14px / line 20px / tracking -0.6% (-0.084px)\n * font-feature: 'ss11' 1, 'calt' 0, 'liga' 0\n * Default/Off: text sub-600 (#5c5c5c)\n * Active/On: text strong-950 (#171717) + underline 2px primary\n * posicionada bottom -14px (al ras del border-bottom del\n * container, que tiene py-14)\n * Underline color: el Figma muestra primary-base = #335cff (azul SUI). En\n * este proyecto --sui-primary-base está re-themed a naranja (#fa7319, marca\n * Master Pedidos). Se usa el TOKEN (--sui-primary-base) → naranja. Es el\n * comportamiento homologado correcto: no se hardcodea el azul de la demo.\n * Badge (Inbox, I4308:1062;3511:9749 → Badge [1.1] Number):\n * se COMPONE <sui-badge color=\"red\" variant=\"filled\" type=\"number\"> →\n * bg state/error/base (#fb3748), text static-white, p-2px, radius-full,\n * Subheading/2XSmall 11/12/+2% uppercase, min-width 12px. 1:1 con el Figma.\n * Divider vertical (4308:1064):\n * línea 1px stroke/soft-200, self-stretch (alto = alto del contenido del row)\n * Filter button (Compact Button [1.1], 4308:1066):\n * se COMPONE <sui-compact-button> ghost size=large fullRadius=true → p-2px,\n * transparent, icon sub-600, icon 20px (filter-3-fill), shape circular\n * (radius-full, como el nodo Figma 4308:1066). Posición: absolute, right 12px,\n * centrado vertical (top 50% / translateY -50%).\n *\n * Eje \"button\" del Figma (4308:1091 prop `button=true`) → input `showFilter`.\n * Eje \"Quantity\" (02/03/04) → longitud de `tabs[]` (configurable, sin tope).\n *\n * API:\n * [tabs] SuiNotificationTab<T>[] (required)\n * [(active)] T (model, two-way)\n * [showFilter] boolean = true (renderiza el botón de filtro)\n * [filterLabel] string = 'Filtrar' (aria-label del botón de filtro)\n * (tabChange) EventEmitter<T> (al seleccionar un tab)\n * (filterClick) EventEmitter<MouseEvent> (al click del botón de filtro)\n *\n * PENDING VERIFY:\n * - Underline color: ver nota arriba. El Figma usa primary azul; el proyecto\n * usa el token (naranja). Si el diseño exige azul fijo aquí, se requiere un\n * token dedicado — no se hardcodea hex.\n * - El Figma no expone estado Hover de los tabs en este componente puntual;\n * se reusa el comportamiento del Tab Menu Horizontal (hover → strong-950).\n * - \"All\" aparece como <button> y los demás como <div> en el design_context\n * (artefacto del export). Se homologa: TODOS los tabs son <button> (correcto\n * semánticamente y para a11y/teclado).\n * - El Figma no muestra estado disabled por tab en este header; no se modela.\n *\n * iOS :active: cada tab es un <button> con (touchstart)/(touchend) para liberar\n * el `:active` stuck del WKWebView (regla del proyecto). El botón de filtro ya\n * trae el fix dentro de <sui-compact-button>.\n */\n@Component({\n selector: 'sui-notification-tab-menu',\n templateUrl: './sui-notification-tab-menu.html',\n styleUrl: './sui-notification-tab-menu.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiBadge, SuiCompactButton],\n host: {\n '[attr.role]': '\"tablist\"',\n },\n})\nexport class SuiNotificationTabMenu<T = string> {\n readonly tabs = input.required<SuiNotificationTab<T>[]>();\n readonly active = model<T>();\n /** Renderiza el botón de filtro absoluto a la derecha (Figma prop `button`). */\n readonly showFilter = input(true);\n /** aria-label del botón de filtro. */\n readonly filterLabel = input<string>('Filtrar');\n\n readonly tabChange = output<T>();\n readonly filterClick = output<MouseEvent>();\n\n isActive(tab: SuiNotificationTab<T>): boolean {\n return this.active() === tab.value;\n }\n\n select(tab: SuiNotificationTab<T>): void {\n this.active.set(tab.value);\n this.tabChange.emit(tab.value);\n }\n\n onFilter(event: MouseEvent): void {\n this.filterClick.emit(event);\n }\n}\n","<!--\n Notification Tab Menu [1.1] — SUI 2.0 (Figma 4308:1091)\n Header del panel de notificaciones: tabs con underline + badge + divider + filtro.\n-->\n@for (tab of tabs(); track tab.value) {\n @if (tab.dividerBefore) {\n <span class=\"sui-ntm__divider\" aria-hidden=\"true\"></span>\n }\n <button\n type=\"button\"\n class=\"sui-ntm__tab\"\n [class.sui-ntm__tab--active]=\"isActive(tab)\"\n role=\"tab\"\n [attr.aria-selected]=\"isActive(tab)\"\n (click)=\"select(tab)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-ntm__text\">\n <span class=\"sui-ntm__label\">{{ tab.label }}</span>\n @if (tab.badge) {\n <sui-badge color=\"red\" variant=\"filled\" type=\"number\" size=\"small\">{{ tab.badge }}</sui-badge>\n }\n </span>\n </button>\n}\n\n@if (showFilter()) {\n <sui-compact-button\n class=\"sui-ntm__filter\"\n icon=\"filter-3-fill\"\n variantStyle=\"ghost\"\n size=\"large\"\n [fullRadius]=\"true\"\n [ariaLabel]=\"filterLabel()\"\n (clicked)=\"onFilter($event)\"\n />\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\n\nexport type SuiNotificationVariant =\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'feature'\n | 'default';\nexport type SuiNotificationStyle = 'filled' | 'light' | 'lighter' | 'stroke';\n\n/**\n * SUI Notification — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Audited nodes: 4349:46656 (Items), 4308:731 (Tab Menu header), 4308:5526 (Footer).\n * Item component set — Type(4: Basic|File|Button|Message) × State(2: Default|Hover)\n * × Company(2: false|true).\n *\n * ─── DOS MODELOS EN UN COMPONENTE ──────────────────────────────────────────\n * Este componente cubre DOS usos que comparten el contenedor visual base:\n *\n * 1. STATUS ALERT inline (variant info/success/warning/error/feature + style\n * filled/light/lighter/stroke). Coincide con sui-alert / sui-toast (Figma\n * set 169:2399). NO aparece en los nodos \"Notifications\" auditados pero se\n * PRESERVA como uso alternativo del producto (notificaciones de sistema\n * inline fuera del panel). NO TOCAR sus ejes de variación.\n *\n * 2. NOTIFICATION ITEM (panel campana). Item de actividad social con avatar\n * 40px, descripción compuesta (timestamp ∙ company-logo ∙ texto), y un\n * `type` que cambia el cuerpo proyectado:\n * - basic → solo descripción\n * - file → bloque card adjunto (slot=file) bajo la descripción\n * - button → par de botones acción Deny/Approve (slot=actions)\n * - message → burbuja de respuesta (slot=message)\n * El estado Hover pinta bg-weak-50 y revela un botón more-2-line a la\n * derecha (input `showMore` → output `moreClicked`).\n * ────────────────────────────────────────────────────────────────────────────\n *\n * PENDING VERIFY (MCP Figma caído en la homologación 2026-05-29; specs tomados\n * de .claude/sui-audit/reports.json que SÍ tuvo acceso a Figma):\n * - File card: bg-white, border stroke/soft-200, radius-8, shadow xs.\n * - Button-type: Deny stroke + Approve filled, px-10 py-6 radius-8.\n * - Company logo: 16×16 circle, antes del texto de descripción.\n * - Hover: bg --sui-bg-weak-50 (#f7f7f7) + more-2-line 20px compact radius-6.\n * - Tab Menu header (All/Inbox/Following/Archived + badge + filtro) y Footer\n * (kbd shortcuts + Manage Notification) NO se implementan aquí — requieren\n * componentes contenedor propios (ver newQuestions del reporte).\n *\n * VERIFIED 2026-05-29 (corrección post-review, contra audit con acceso Figma):\n * - Item padding 12px / gap avatar↔contenido 15px — aplica a LOS 4 tipos\n * (Basic|File|Button|Message). El discriminante real es el AVATAR 40px\n * (clase `--has-avatar`), no el `type`: el modelo alert-inline (sin avatar,\n * icono 20px) conserva 14/12. Antes solo file/button/message lo recibían y\n * type=basic-panel quedaba con spacing de alerta (mal).\n * - Message bubble border-radius: tl=4 tr=8 br=10 bl=8 → CSS shorthand\n * `4px 8px 10px 8px`. Antes estaba `4px 8px 8px 10px` (br/bl invertidos).\n * - Filled style time/close: --sui-static-white + opacity .72 (patrón canon\n * sui-alert), no rgba(255,255,255,.72) crudo. No existe token white-alpha-72.\n * - Root role: `article` para panel rows (avatar), `status` + aria-live=polite\n * solo para el modelo alert-inline. Antes role=\"status\" fijo hacía que el\n * lector de pantalla anunciara cada item del panel como status de sistema.\n *\n * Extra features preservadas (no Figma, producto):\n * - status variant×style (alert inline)\n * - unread dot (8px primary-base — Figma node 4308:731)\n * - avatarInitials fallback\n * - dismissible (X close)\n * - showIcon/iconName status icons\n */\n@Component({\n selector: 'sui-notification',\n templateUrl: './sui-notification.html',\n styleUrl: './sui-notification.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiCompactButton],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n})\nexport class SuiNotification {\n // ── Status-alert model (preserved) ──────────────────────────────────────\n readonly variant = input<SuiNotificationVariant>('default');\n readonly variantStyle = input<SuiNotificationStyle>('stroke');\n readonly title = input<string | null>(null);\n readonly description = input<string | null>(null);\n readonly timestamp = input<string | null>(null);\n readonly avatarSrc = input<string | null>(null);\n readonly avatarInitials = input<string | null>(null);\n readonly showIcon = input(true);\n readonly dismissible = input(false);\n readonly unread = input(false);\n\n // ── Notification-item model (Figma \"Notifications\" panel) ────────────────\n /** Item body type. 'basic' keeps the legacy/alert layout (no body slot). */\n readonly type = input<'basic' | 'file' | 'button' | 'message'>('basic');\n /** When true, item paints the Figma hover bg + reveals the more-2-line button. */\n readonly showMore = input(false);\n /** Forces the hover affordance visible (e.g. keyboard-focused row). */\n readonly active = input(false);\n\n readonly dismissed = output<void>();\n readonly moreClicked = output<MouseEvent>();\n\n readonly iconName = computed((): string => {\n const map: Record<SuiNotificationVariant, string> = {\n info: 'information-fill',\n success: 'checkbox-circle-fill',\n warning: 'alert-fill',\n error: 'error-warning-fill',\n feature: 'sparkling-fill',\n default: 'notification-3-line',\n };\n return map[this.variant()];\n });\n\n readonly hasAvatar = computed(() =>\n !!(this.avatarSrc() || this.avatarInitials()),\n );\n\n readonly showLeadingIcon = computed(() =>\n !this.hasAvatar() && this.showIcon() && this.variant() !== 'default',\n );\n\n /**\n * ARIA role of the root.\n *\n * Panel notification rows (avatar-led, static activity items in a list) are\n * NOT live regions — `role=\"status\"` would make screen readers re-announce\n * every rendered row as a system status update (disruptive + misleading).\n * They render as `article` (self-contained content) and rely on the parent\n * to provide `role=\"list\"` if listitem semantics are wanted.\n *\n * The alert-inline status model (no avatar — info/success/warning/error\n * transient system message) keeps `role=\"status\"` + `aria-live=\"polite\"`,\n * which is the correct announcement semantics for that use.\n */\n readonly role = computed<string>(() =>\n this.hasAvatar() ? 'article' : 'status',\n );\n\n /** Only the alert-inline model announces; panel rows stay silent. */\n readonly ariaLive = computed<string | null>(() =>\n this.hasAvatar() ? null : 'polite',\n );\n\n onDismiss(): void {\n this.dismissed.emit();\n }\n\n onMore(event: MouseEvent): void {\n event.stopPropagation();\n this.moreClicked.emit(event);\n }\n}\n","<div\n class=\"sui-notification\"\n [class.sui-notification--hoverable]=\"showMore()\"\n [class.sui-notification--active]=\"active()\"\n [class.sui-notification--has-avatar]=\"hasAvatar()\"\n [attr.data-sui-variant]=\"variant()\"\n [attr.data-sui-style]=\"variantStyle()\"\n [attr.data-sui-type]=\"type()\"\n [attr.role]=\"role()\"\n [attr.aria-live]=\"ariaLive()\"\n>\n <!-- Leading: avatar OR status icon -->\n @if (hasAvatar()) {\n <div class=\"sui-notification__avatar\" aria-hidden=\"true\">\n @if (avatarSrc()) {\n <img [src]=\"avatarSrc()\" alt=\"\" />\n } @else {\n <span class=\"sui-notification__avatar-initials\">{{ avatarInitials() }}</span>\n }\n </div>\n } @else if (showLeadingIcon()) {\n <div class=\"sui-notification__icon\" aria-hidden=\"true\">\n <sui-icon [name]=\"iconName()\" [size]=\"20\" />\n </div>\n }\n\n <div class=\"sui-notification__content\">\n <!-- Header: title + unread dot + timestamp -->\n <div class=\"sui-notification__header\">\n @if (title()) {\n <p class=\"sui-notification__title\">{{ title() }}</p>\n }\n @if (unread()) {\n <span class=\"sui-notification__dot\" aria-label=\"No leído\"></span>\n }\n @if (timestamp() && type() === 'basic') {\n <span class=\"sui-notification__time\">{{ timestamp() }}</span>\n }\n </div>\n\n <!-- Compound description: timestamp ∙ company-logo ∙ text.\n For type=basic the timestamp lives in the header (not here), so the\n description block must only render on real content — otherwise an\n empty <p> occupies a phantom 4px gap below the title. -->\n @if (description() || (timestamp() && type() !== 'basic') || type() !== 'basic') {\n <p class=\"sui-notification__description\">\n @if (timestamp() && type() !== 'basic') {\n <span class=\"sui-notification__meta-time\">{{ timestamp() }}</span>\n <span class=\"sui-notification__sep\" aria-hidden=\"true\">∙</span>\n }\n <span class=\"sui-notification__company-logo\">\n <ng-content select=\"[slot=company-logo]\" />\n </span>\n @if (description()) {\n <span class=\"sui-notification__desc-text\">{{ description() }}</span>\n }\n </p>\n }\n\n <!-- Type=file: attachment card -->\n @if (type() === 'file') {\n <div class=\"sui-notification__file\">\n <ng-content select=\"[slot=file]\" />\n </div>\n }\n\n <!-- Type=message: response bubble -->\n @if (type() === 'message') {\n <div class=\"sui-notification__bubble\">\n <ng-content select=\"[slot=message]\" />\n </div>\n }\n\n <!-- Free custom content -->\n <ng-content />\n\n <!-- Actions slot (also hosts type=button Deny/Approve pair) -->\n <div class=\"sui-notification__actions\">\n <ng-content select=\"[slot=actions]\" />\n </div>\n </div>\n\n <!-- Hover affordance: more-2-line (notification item) = COMPONENTE\n sui-compact-button (variantStyle ghost: transparent + hover bg-weak-50,\n radius-6, icon 20 = size large), NO un <button> maqueta. El posicionamiento\n absoluto y el reveal on-hover (opacity 0→1) los aporta `.sui-notification__more`. -->\n @if (showMore()) {\n <sui-compact-button\n class=\"sui-notification__more\"\n icon=\"more-2-line\"\n variantStyle=\"ghost\"\n size=\"large\"\n ariaLabel=\"Más opciones\"\n (clicked)=\"onMore($event)\"\n />\n }\n\n @if (dismissible()) {\n <!-- Cierre = COMPONENTE sui-compact-button (variantStyle modifiable → el icono\n hereda el currentColor del per-style `.sui-notification__close`), NO un\n <button> maqueta. icon 16 = size medium (patrón canon sui-alert). -->\n <sui-compact-button\n class=\"sui-notification__close\"\n icon=\"close-line\"\n variantStyle=\"modifiable\"\n size=\"medium\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"onDismiss()\"\n />\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n input,\n model,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport type SuiOtpInputType = 'number' | 'text';\n\n/**\n * SUI OTP / Digit Input — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component \"Digit Input\" — node 429:5172 (component set con 6 estados).\n * Estados verificados (nodeIds): Default 429:5171, Hover 429:5177, Focus 429:5181,\n * Filled 429:5185, Disabled 429:5189, Error 429:5193.\n *\n * EXACT specs — VERIFIED desde Figma (variable_defs node 429:5172):\n * - Celda: 80×64px (w 80, padding 16px vertical / 8px horizontal → height 64).\n * - radius: radius-10 (10px).\n * - Tipografía dígito: Title/H5 → Inter Display Medium, 24px / lineHeight 32 /\n * letterSpacing 0 / weight 500. font-feature-settings 'ss11' 1, 'calt' 0,\n * 'liga' 0 (canon SUI, mismo que el resto de los SUI).\n * - Default: bg-white-0, border 1px stroke-soft-200 (#ebebeb), shadow\n * regular-shadow/x-small (0 1px 2px 0 #0a0d1408). Texto vacío (opacity 0).\n * - Hover (celda vacía): bg-weak-50 (#f7f7f7), SIN border visible.\n * - Focus: bg-white-0, border 1px stroke-strong-950 (#171717), shadow\n * components/buttons/important-focus (0 0 0 2px white, 0 0 0 4px slate-alpha-16).\n * Muestra el caret (celda activa).\n * - Filled: bg-white-0, border 1px stroke-soft-200, shadow x-small, texto\n * strong-950.\n * - Disabled: bg-weak-50, SIN border, texto disabled-300 (#d1d1d1).\n * - Error: bg-white-0, border 1px state-error-base (#fb3748), shadow x-small,\n * texto strong-950.\n *\n * NOTA spec ↔ Figma: el brief pedía \"focus border primary\", pero el Figma canon\n * (node 429:5181) usa stroke-strong-950 (#171717) en focus, NO primary. Se\n * implementa lo que dice Figma (strong-950) por consistencia con el DS; el error\n * sí usa state-error-base como pide el brief y Figma. Ver PENDING VERIFY.\n *\n * Comportamiento:\n * - N celdas individuales (default 6).\n * - Auto-avance: al escribir un dígito, el foco salta a la siguiente celda.\n * - Backspace: borra el dígito actual o, si está vacío, retrocede a la\n * anterior y la borra.\n * - ArrowLeft / ArrowRight: navegan entre celdas.\n * - Paste: distribuye los caracteres pegados a partir de la celda enfocada.\n * - CVA: el value expuesto es el string concatenado de todas las celdas.\n *\n * @input length Cantidad de celdas (default 6).\n * @input type 'number' | 'text' — 'number' restringe a [0-9] e\n * inputmode='numeric'; 'text' acepta cualquier char e\n * inputmode='text'.\n * @input disabled Deshabilita todas las celdas.\n * @input error Pinta todas las celdas con borde de error.\n * @input ariaLabel aria-label del grupo (default 'Código de verificación').\n *\n * @model value String concatenado (two-way + CVA).\n * @output completed Emite el value cuando todas las celdas están llenas.\n *\n * PENDING VERIFY (Figma MCP consultado 2026-05-29, valores exactos confirmados):\n * - Confirmado: focus border = stroke-strong-950 (NO primary). Brief decía\n * \"primary\" — divergencia resuelta a favor de Figma.\n * - No hay separadores/grupos (ej. 3-3) en el component set base; si el\n * diseño los pide en una pantalla concreta, se compone con 2 sui-otp-input.\n */\n@Component({\n selector: 'sui-otp-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sui-otp-input.html',\n styleUrl: './sui-otp-input.scss',\n host: {\n class: 'sui-otp-input',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiOtpInput),\n multi: true,\n },\n ],\n})\nexport class SuiOtpInput implements ControlValueAccessor {\n // ── Inputs ─────────────────────────────────────────────────────────────────\n readonly length = input<number>(6);\n readonly type = input<SuiOtpInputType>('number');\n readonly disabled = model<boolean>(false);\n readonly error = input<boolean>(false);\n readonly ariaLabel = input<string>('Código de verificación');\n\n // ── Two-way value (string concatenado) + CVA ────────────────────────────────\n readonly value = model<string>('');\n readonly completed = output<string>();\n\n // ── Estado interno: un signal por celda ─────────────────────────────────────\n /** Array de caracteres, length === this.length(). */\n readonly cells = signal<string[]>([]);\n\n /** Índice de las celdas (para *ngFor / @for trackBy). */\n readonly indices = computed(() => Array.from({ length: this.length() }, (_, i) => i));\n\n /** inputmode según type. */\n readonly inputMode = computed<'numeric' | 'text'>(() =>\n this.type() === 'number' ? 'numeric' : 'text',\n );\n\n private readonly inputs = viewChildren<ElementRef<HTMLInputElement>>('cellInput');\n\n // ── CVA callbacks ────────────────────────────────────────────────────────────\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n // Inicializa / reajusta el array de celdas cuando cambia length o value externo.\n effect(() => {\n const len = this.length();\n const incoming = this.value() ?? '';\n const next = this.normalize(incoming, len);\n const current = this.cells();\n if (current.length !== len || current.join('') !== next.join('')) {\n this.cells.set(next);\n }\n });\n }\n\n // ── Normalización ─────────────────────────────────────────────────────────────\n /** Convierte un string a array de length celdas, filtrando por type. */\n private normalize(raw: string, len: number): string[] {\n const filtered = this.filterChars(raw).slice(0, len);\n const arr = new Array<string>(len).fill('');\n for (let i = 0; i < filtered.length; i++) arr[i] = filtered[i];\n return arr;\n }\n\n /** Filtra caracteres según type. number → solo [0-9]; text → todo sin espacios. */\n private filterChars(raw: string): string {\n if (this.type() === 'number') return raw.replace(/\\D/g, '');\n return raw.replace(/\\s/g, '');\n }\n\n /** Emite el string concatenado por todos los canales (model + CVA). */\n private emit(): void {\n const joined = this.cells().join('');\n this.value.set(joined);\n this.onChange(joined);\n const allFilled = joined.length === this.length() && !this.cells().includes('');\n if (allFilled) this.completed.emit(joined);\n }\n\n // ── Handlers ──────────────────────────────────────────────────────────────────\n /** input event de una celda — toma el último char válido y auto-avanza. */\n onCellInput(index: number, event: Event): void {\n const target = event.target as HTMLInputElement;\n const valid = this.filterChars(target.value);\n // Último carácter válido tipeado (cubre el caso de sobrescribir una celda llena).\n const char = valid.length > 0 ? valid[valid.length - 1] : '';\n\n const next = [...this.cells()];\n next[index] = char;\n this.cells.set(next);\n // Reflejar exactamente el char en el DOM (descarta multi-char y caracteres inválidos).\n target.value = char;\n this.emit();\n\n if (char && index < this.length() - 1) this.focusCell(index + 1);\n }\n\n /** keydown — backspace, flechas, y bloqueo de no-dígitos en type='number'. */\n onCellKeydown(index: number, event: KeyboardEvent): void {\n const key = event.key;\n\n if (key === 'Backspace') {\n const cells = this.cells();\n if (cells[index]) {\n // Hay char en la celda actual: bórralo, no retrocedas.\n const next = [...cells];\n next[index] = '';\n this.cells.set(next);\n this.emit();\n } else if (index > 0) {\n // Celda vacía: retrocede y borra la anterior.\n const next = [...cells];\n next[index - 1] = '';\n this.cells.set(next);\n this.emit();\n this.focusCell(index - 1);\n }\n event.preventDefault();\n return;\n }\n\n if (key === 'ArrowLeft' && index > 0) {\n event.preventDefault();\n this.focusCell(index - 1);\n return;\n }\n if (key === 'ArrowRight' && index < this.length() - 1) {\n event.preventDefault();\n this.focusCell(index + 1);\n return;\n }\n\n // Bloquea caracteres no numéricos en type='number' (deja teclas de control).\n if (\n this.type() === 'number' &&\n key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !/\\d/.test(key)\n ) {\n event.preventDefault();\n }\n }\n\n /** paste — distribuye los chars pegados desde la celda enfocada. */\n onCellPaste(index: number, event: ClipboardEvent): void {\n event.preventDefault();\n const pasted = this.filterChars(event.clipboardData?.getData('text') ?? '');\n if (!pasted) return;\n\n const next = [...this.cells()];\n let cursor = index;\n for (const ch of pasted) {\n if (cursor >= this.length()) break;\n next[cursor] = ch;\n cursor++;\n }\n this.cells.set(next);\n this.emit();\n\n // Enfoca la siguiente celda vacía (o la última si se llenó todo).\n const target = Math.min(cursor, this.length() - 1);\n this.focusCell(target);\n }\n\n /** focus de una celda — selecciona el contenido para sobrescribir fácil. */\n onCellFocus(event: FocusEvent): void {\n (event.target as HTMLInputElement).select();\n }\n\n onBlur(): void {\n this.onTouched();\n }\n\n private focusCell(index: number): void {\n const el = this.inputs()[index]?.nativeElement;\n if (el) {\n el.focus();\n el.select();\n }\n }\n\n // ── ControlValueAccessor ──────────────────────────────────────────────────────\n writeValue(value: string | null): void {\n this.value.set(value ?? '');\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.disabled.set(isDisabled);\n }\n}\n","@for (i of indices(); track i) {\n <input\n #cellInput\n class=\"sui-otp-input__cell\"\n [class.sui-otp-input__cell--error]=\"error()\"\n type=\"text\"\n [attr.inputmode]=\"inputMode()\"\n [attr.autocomplete]=\"i === 0 ? 'one-time-code' : 'off'\"\n [attr.maxlength]=\"1\"\n [attr.aria-label]=\"'Dígito ' + (i + 1)\"\n [value]=\"cells()[i]\"\n [disabled]=\"disabled()\"\n (input)=\"onCellInput(i, $event)\"\n (keydown)=\"onCellKeydown(i, $event)\"\n (paste)=\"onCellPaste(i, $event)\"\n (focus)=\"onCellFocus($event)\"\n (blur)=\"onBlur()\"\n />\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n/**\n * SUI Page Header — header reutilizable para cada page del empresa.\n *\n * Reemplaza al topbar contextual en mobile. Cada page lo coloca arriba del\n * todo (antes de cualquier contenido). Absorbe el safe-area-inset-top y\n * deja un espacio visual coherente entre pages.\n *\n * Slots:\n * - default → contenido principal (cards, listas, etc.)\n * - [slot=actions] → botones a la derecha (siempre visibles, no scrollean\n * con la página). Útil para \"Guardar\", \"Agregar\", filtros.\n *\n * Inputs:\n * - title: string visible (h1)\n * - subtitle: string secundario opcional\n * - sticky: si true, el header queda fixed top mientras se scrollea\n * (default false: scrollea con el contenido)\n */\n@Component({\n selector: 'sui-page-header',\n templateUrl: './sui-page-header.html',\n styleUrl: './sui-page-header.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-sticky]': 'sticky() ? \"\" : null',\n },\n})\nexport class SuiPageHeader {\n readonly title = input.required<string>();\n readonly subtitle = input<string | null>(null);\n readonly sticky = input(false);\n}\n","<header class=\"sui-page-header\">\n <div class=\"sui-page-header__text\">\n <h1 class=\"sui-page-header__title\">{{ title() }}</h1>\n @if (subtitle()) {\n <p class=\"sui-page-header__subtitle\">{{ subtitle() }}</p>\n }\n </div>\n <div class=\"sui-page-header__actions\">\n <ng-content select=\"[slot=actions]\" />\n </div>\n</header>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n} from '@angular/core';\nimport {\n SuiCompactSelect,\n type SuiCompactSelectItem,\n} from '../sui-compact-select/sui-compact-select';\n\nexport type SuiPaginationSize = 'small' | 'medium';\n\n/**\n * Visual variant — homologado contra Figma SUI 2.0.\n * - `basic` → celdas individuales con border-radius (radius-8 / radius-full por size)\n * y gap entre ellas. (default — preserva el look previo del SUI)\n * - `full-radius` → idéntico a basic pero cada celda y nav button es circular\n * (border-radius: radius-full). Figma Type=Full Radius.\n * - `group` → todas las celdas comparten un único contenedor con border\n * exterior y dividers interiores (sin gap, overflow:clip +\n * overlap de borders vía margin negativo). Figma Type=Group.\n */\nexport type SuiPaginationType = 'basic' | 'full-radius' | 'group';\n\n/** Formato del texto informativo. */\nexport type SuiPaginationInfoFormat = 'items' | 'pages';\n\n/**\n * SUI Pagination — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodos: 513:3681 (PaginationCells — 8 estados), 513:3892 (PaginationGroup — 3 types)\n *\n * SPECS homologados (verificados contra Figma 2026-05-29):\n * - Celda: padding 6px, contenido 20px → celda efectiva 32px, radius-8 (basic/group)\n * o radius-full (full-radius). Font Label/Small 14px/500.\n * - Estado Default: celda de número bg/white-0 + border stroke/soft-200, text/sub-600.\n * Los nav buttons (first/prev/next/last) NO llevan border at-rest (solo el icono).\n * - Estado Hover: bg/weak-50, sin border, text/sub-600 (solo cambia el fill).\n * - Página activa/selected: bg/weak-50, text/sub-600 (igual que Hover) — uso real del\n * Group de Figma (nodes 513:3767 Basic / 513:4128 Group). En basic/full-radius sin\n * border; en group conserva el border compartido del divider. (El set de Cells\n * aislado 513:3691 mostraba bg/white-0 + strong-950, pero el Group lo desmiente.)\n * - Estado Disabled (por celda): text/disabled-300, sin bg\n * - Elipsis: celda con MISMO border + padding que los números (no es un span suelto)\n * - Nav buttons: prev (arrow-left-s-line) / next (arrow-right-s-line),\n * first (arrow-left-double-line) / last (arrow-right-double-line)\n * - Panel advanced: sui-compact-select \"N / page\" a la derecha para cambiar pageSize\n * - Info text: Figma usa \"Page X of Y\"; el SUI default sigue siendo \"Mostrando X-Y de Z\"\n * (infoFormat controla cuál). Paragraph/Small 14px/400 text/sub-600.\n *\n * @input total Total de items\n * @input pageSize Items por página (default: 10) — two-way model\n * @model currentPage Página actual (1-indexed), two-way binding\n * @input siblingCount Cuántas páginas a cada lado del actual (default: 1) — EXTRA SUI\n * @input showInfo Muestra el texto informativo (default: true)\n * @input size 'small' | 'medium' (default: 'medium') — EXTRA SUI\n * @input type 'basic' | 'full-radius' | 'group' (default: 'basic')\n * @input firstLast Muestra los botones ir-a-primera / ir-a-última (default: false)\n * @input nextPrevious Muestra los chevrons prev / next (default: true)\n * @input infoFormat 'items' | 'pages' (default: 'items')\n * @input pageSizeOptions Opciones del compact-select de page size. Si vacío, no se\n * renderiza el panel. (default: [])\n * @output pageChange Emite el nuevo número de página\n * @output pageSizeChange Emite el nuevo page size cuando el user lo cambia\n */\n@Component({\n selector: 'sui-pagination',\n templateUrl: './sui-pagination.html',\n styleUrl: './sui-pagination.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SuiCompactSelect],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-type]': 'type()',\n },\n})\nexport class SuiPagination {\n readonly total = input.required<number>();\n readonly pageSize = model(10);\n readonly siblingCount = input(1);\n readonly showInfo = input(true);\n readonly size = input<SuiPaginationSize>('medium');\n\n // ── Homologación Figma ──────────────────────────────────────────────────\n readonly type = input<SuiPaginationType>('basic');\n readonly firstLast = input(false);\n readonly nextPrevious = input(true);\n readonly infoFormat = input<SuiPaginationInfoFormat>('items');\n readonly pageSizeOptions = input<readonly number[]>([]);\n\n readonly currentPage = model(1);\n\n readonly pageChange = output<number>();\n readonly pageSizeChange = output<number>();\n\n // ── Computed ──────────────────────────────────────────────────────────\n\n readonly totalPages = computed(() => Math.max(1, Math.ceil(this.total() / this.pageSize())));\n\n readonly rangeStart = computed(() => (this.currentPage() - 1) * this.pageSize() + 1);\n\n readonly rangeEnd = computed(() => Math.min(this.currentPage() * this.pageSize(), this.total()));\n\n /** Items del compact-select de page size, derivados de `pageSizeOptions`. */\n readonly pageSizeItems = computed<SuiCompactSelectItem<number>[]>(() =>\n this.pageSizeOptions().map((n) => ({ value: n, label: `${n} / page` })),\n );\n\n /** Item actualmente seleccionado en el compact-select (matchea pageSize). */\n readonly selectedPageSizeItem = computed<SuiCompactSelectItem<number> | null>(() => {\n const ps = this.pageSize();\n return this.pageSizeItems().find((i) => i.value === ps) ?? null;\n });\n\n /**\n * Algoritmo de elipsis dinámicas.\n * Retorna array de números o null (elipsis).\n * Ejemplos:\n * [1, 2, 3, 4, 5] (cuando totalPages <= 7)\n * [1, null, 4, 5, 6, null, 20] (con elipsis en ambos lados)\n * [1, 2, 3, 4, 5, null, 20] (con elipsis solo a la derecha)\n * [1, null, 16, 17, 18, 19, 20] (con elipsis solo a la izquierda)\n */\n readonly displayPages = computed<(number | null)[]>(() => {\n const total = this.totalPages();\n const current = this.currentPage();\n const siblings = this.siblingCount();\n\n // Si hay pocas páginas, mostrar todas\n const maxVisible = siblings * 2 + 5; // 2 extremos + elipsis × 2 + siblings × 2 + current\n if (total <= maxVisible) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const leftSibling = Math.max(current - siblings, 1);\n const rightSibling = Math.min(current + siblings, total);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < total - 1;\n\n const firstPage = 1;\n const lastPage = total;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n // Mostrar inicio expandido\n const leftRange = Array.from({ length: 3 + 2 * siblings }, (_, i) => i + 1);\n return [...leftRange, null, lastPage];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n // Mostrar fin expandido\n const rightRange = Array.from(\n { length: 3 + 2 * siblings },\n (_, i) => total - (3 + 2 * siblings) + 1 + i,\n );\n return [firstPage, null, ...rightRange];\n }\n\n // Elipsis en ambos lados\n const middleRange = Array.from(\n { length: rightSibling - leftSibling + 1 },\n (_, i) => leftSibling + i,\n );\n return [firstPage, null, ...middleRange, null, lastPage];\n });\n\n // ── Actions ───────────────────────────────────────────────────────────\n\n goTo(page: number): void {\n const total = this.totalPages();\n if (page < 1 || page > total || page === this.currentPage()) return;\n this.currentPage.set(page);\n this.pageChange.emit(page);\n }\n\n prev(): void {\n this.goTo(this.currentPage() - 1);\n }\n\n next(): void {\n this.goTo(this.currentPage() + 1);\n }\n\n first(): void {\n this.goTo(1);\n }\n\n last(): void {\n this.goTo(this.totalPages());\n }\n\n get hasPrev(): boolean {\n return this.currentPage() > 1;\n }\n\n get hasNext(): boolean {\n return this.currentPage() < this.totalPages();\n }\n\n /** Cambio de page size desde el compact-select del panel advanced. */\n onPageSizeSelected(item: SuiCompactSelectItem<number> | null): void {\n if (!item) return;\n const next = item.value;\n if (next === this.pageSize()) return;\n this.pageSize.set(next);\n this.pageSizeChange.emit(next);\n // Reclampar la página actual al nuevo rango.\n const total = Math.max(1, Math.ceil(this.total() / next));\n if (this.currentPage() > total) {\n this.currentPage.set(total);\n this.pageChange.emit(total);\n }\n }\n\n /** Keyboard navigation entre botones de página */\n onKeydown(event: KeyboardEvent, page: number | null): void {\n if (page === null) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.goTo(page);\n }\n }\n}\n","<!-- ══ SUI Pagination — SUI 2.0 (Figma 513:3681 / 513:3892) ═════════════ -->\n<div class=\"sui-pagination\">\n\n <!-- ── Info text ── -->\n @if (showInfo() && total() > 0) {\n <p class=\"sui-pagination__info\">\n @if (infoFormat() === 'pages') {\n Page <strong>{{ currentPage() }}</strong> of <strong>{{ totalPages() }}</strong>\n } @else {\n Mostrando <strong>{{ rangeStart() }}-{{ rangeEnd() }}</strong> de <strong>{{ total() }}</strong>\n }\n </p>\n }\n\n <!-- ── Page buttons ── -->\n <nav class=\"sui-pagination__nav\" aria-label=\"Paginación\">\n\n <!-- First page (firstLast) -->\n @if (firstLast()) {\n <button\n type=\"button\"\n class=\"sui-pagination__btn sui-pagination__btn--nav\"\n [class.sui-pagination__btn--disabled]=\"!hasPrev\"\n [disabled]=\"!hasPrev\"\n (click)=\"first()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n aria-label=\"Primera página\"\n >\n <i class=\"ri-arrow-left-double-line\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Prev page (nextPrevious) -->\n @if (nextPrevious()) {\n <button\n type=\"button\"\n class=\"sui-pagination__btn sui-pagination__btn--nav\"\n [class.sui-pagination__btn--disabled]=\"!hasPrev\"\n [disabled]=\"!hasPrev\"\n (click)=\"prev()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n aria-label=\"Página anterior\"\n >\n <i class=\"ri-arrow-left-s-line\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Page numbers with ellipsis -->\n @for (page of displayPages(); track $index) {\n @if (page === null) {\n <!-- Ellipsis: celda idéntica a los números (bg/white-0 + border + padding) -->\n <span class=\"sui-pagination__btn sui-pagination__btn--ellipsis\" aria-hidden=\"true\">…</span>\n } @else {\n <button\n type=\"button\"\n class=\"sui-pagination__btn sui-pagination__btn--page\"\n [class.sui-pagination__btn--active]=\"page === currentPage()\"\n (click)=\"goTo(page)\"\n (keydown)=\"onKeydown($event, page)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n [attr.aria-current]=\"page === currentPage() ? 'page' : null\"\n [attr.aria-label]=\"'Página ' + page\"\n >\n {{ page }}\n </button>\n }\n }\n\n <!-- Next page (nextPrevious) -->\n @if (nextPrevious()) {\n <button\n type=\"button\"\n class=\"sui-pagination__btn sui-pagination__btn--nav\"\n [class.sui-pagination__btn--disabled]=\"!hasNext\"\n [disabled]=\"!hasNext\"\n (click)=\"next()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n aria-label=\"Página siguiente\"\n >\n <i class=\"ri-arrow-right-s-line\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <!-- Last page (firstLast) -->\n @if (firstLast()) {\n <button\n type=\"button\"\n class=\"sui-pagination__btn sui-pagination__btn--nav\"\n [class.sui-pagination__btn--disabled]=\"!hasNext\"\n [disabled]=\"!hasNext\"\n (click)=\"last()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n aria-label=\"Última página\"\n >\n <i class=\"ri-arrow-right-double-line\" aria-hidden=\"true\"></i>\n </button>\n }\n\n </nav>\n\n <!-- ── Advanced panel: page-size compact-select ── -->\n @if (pageSizeItems().length > 0) {\n <div class=\"sui-pagination__advanced\">\n <sui-compact-select\n size=\"xsmall\"\n [items]=\"pageSizeItems()\"\n [selected]=\"selectedPageSizeItem()\"\n (selectedChange)=\"onPageSizeSelected($event)\"\n />\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/* ═══ SUI Popover — SUI Design System 2.0 ═══════════════════════════════\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component-set: 4431:81573 \"Popover [1.1]\" (12 position variants)\n * Component-set: 4456:83048 \"Popover Footer [1.1]\" (3 footer types)\n * Stepper dot: 479:14399 \"Stepper Dot [1.1]\"\n *\n * Componente NUEVO — no existía en SUI. Arquitectura: panel PRESENTACIONAL\n * standalone. El consumer lo monta donde necesite (CDK Overlay propio, dentro\n * de un dropdown, inline para onboarding tours, etc.). NO incluye lógica de\n * trigger/hover propia — eso queda a cargo del consumer, para no acoplar la\n * presentación a una sola estrategia de disparo (ver newQuestions del reporte).\n *\n * EXACT specs (pulled via MCP get_design_context — nodos confirmados 2026-05-29):\n * Panel (4431:81314):\n * - width 320px, bg-white-0, border 1px stroke-soft-200, radius-16,\n * overflow:clip (clip), shadow = regular-shadow/medium\n * (0 16px 32px -12px rgba(14,18,27,.10) = --sui-regular-shadow-medium)\n * Content (4431:81315):\n * - padding 20px (all sides), gap 16px column, border-bottom 1px stroke-soft-200\n * (el border-bottom solo se pinta cuando hay footer — separador del footer)\n * Header icon (4431:81316 \"Key Icons [1.1]\"):\n * - wrapper p-12 + icon 24×24 → círculo 48×48, bg-white-0, border 1px\n * stroke-soft-200, radius-full (999), shadow = regular-shadow/x-small\n * (0 1px 2px rgba(10,13,20,.03))\n * Title (4431:81318): Label/Medium 16/500/24 ls -0.011em text-strong-950\n * Desc (4431:81319): Paragraph/Small 14/400/20 ls -0.006em text-sub-600\n * Dismiss (4431:81320 \"Compact Button [1.1]\"):\n * - absolute top 16 right 16, p-2, radius-6, close-line icon 20×20\n * Footer (4456:83048): padding px-20 py-16, gap 12, bg-white-0\n * - Stretch: actions flex:1, ambos buttons flex:1 (full-width), gap 12. Sin indicator.\n * - Text Stepper: \"Step X of N\" (Paragraph/Small text-sub-600) + actions justify-end,\n * buttons fijos 80px.\n * - Stepper: dot indicator (N dots 8×8 radius-full, gap 10, activo=primary-base,\n * resto=bg-soft-200) + actions justify-end, buttons fijos 80px.\n * Footer buttons (Label/Small 14/500/20 ls -0.006em, p-8, radius-8):\n * - Back (secondary): bg-white-0 + border 1px stroke-soft-200 + shadow x-small + text-sub-600\n * - Next (primary): bg primary-base + text static-white\n * Tail (4431:81386): triángulo isósceles 16×8 (fill bg-white-0, border soft-200),\n * 8px alto efectivo. Renderizado con el MISMO mecanismo seamless que sui-tooltip:\n * dos triángulos clip-path superpuestos (`.sui-popover__tail-arrow::before` =\n * hairline del borde en los 2 lados exteriores; `::after` = fill que solapa 1px\n * sobre el panel y funde la base sin línea). Posicionado per-position (12\n * variantes) vía CSS (rotación + offset lateral). Top:32px de inset lateral del\n * tail en los extremos (Figma px-32 del Tail wrapper en Top/Bottom Left/Right).\n *\n * Tail position axis (12 variantes Figma):\n * top-left / top-center / top-right\n * bottom-left / bottom-center / bottom-right\n * right-top / right-center / right-bottom\n * left-top / left-center / left-bottom\n * (NOTA: Figma nombra \"Right\" = right-center, \"Left\" = left-center; aquí se\n * explicitan los 3 puntos de cada eje para claridad de API.)\n *\n * EXTRA FEATURES preservados (del reporte — pertenecen a sui-tooltip, NO al\n * popover; este componente NO los re-implementa, pero se documentan para no\n * confundir su ausencia con un gap):\n * - sui-tooltip size=small/medium, theme=dark, dismissible persistente,\n * CDK Overlay auto-flip → siguen viviendo en sui-tooltip.\n *\n * PENDING VERIFY (inferido, no confirmable 100% pixel-exacto en Figma):\n * - Tail offset lateral en los 8 extremos: CONFIRMADO en Figma 2026-05-29.\n * Top/Bottom Left/Right usan px-32 del wrapper Tail; Right/Left Top/Bottom\n * usan py-32 (node 4431:54698 del variant Right Top = `py-[32px]` +\n * `items-start` → tail a 32px del top, simétrico al bottom). 32px en ambos ejes.\n * - Posición del tail en right-center / left-center: centrado vertical sobre\n * el lateral del panel (Figma \"Right\"/\"Left\" base) — confirmar centrado real.\n * - El border-bottom del content: en Figma (4431:81315 confirmado 2026-05-29)\n * el `border-b border-solid stroke-soft-200` es propiedad del frame Content\n * SIEMPRE — Figma nunca muestra una variante footer='none'. Aquí se hace\n * condicional a footer != 'none' como decisión deliberada de UX (un borde\n * colgando sin footer debajo se ve roto). DESVIACIÓN documentada del spec:\n * el estado footer='none' es una extrapolación, no existe en Figma.\n * - Stepper con N != 3 dots: Figma muestra 3 dots. La generación dinámica de N\n * dots (totalSteps) es extrapolación consistente con el patrón.\n * - Disabled state de los footer buttons: Figma no lo muestra en el popover;\n * se delega al consumer (puede deshabilitar via el output, no hay input\n * disabled en los botones del footer en este v1).\n * - Dismiss button :active = bg-soft-200: heredado del Compact Button [1.1]\n * (4431:81320). El active color exacto en contexto popover no se pudo\n * confirmar pixel-by-pixel (Figma muestra solo el estado default del\n * Compact Button dentro del popover). Si el DS Compact Button difiere en\n * :active, ajustar aquí.\n *\n * API ergonomics (no es un Figma violation, pero es decisión consciente):\n * - icon default = 'user-6-line' (mirror exacto del sample de Figma, donde el\n * icon prop default es visible). Consecuencia: TODO sui-popover sin [icon]\n * explícito renderea el icono user. Un consumer que NO quiere icono debe\n * pasar [icon]=\"null\". Se mantiene el default para no desviar del spec.\n *\n * iOS :active fix: el dismiss button y los footer buttons son clickeables custom\n * en una page potencialmente standalone → llevan (touchstart)/(touchend) en el\n * template (ver CLAUDE.md \"iOS WKWebView :active stuck\").\n * ══════════════════════════════════════════════════════════════════════════ */\n\nexport type SuiPopoverPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'right-top'\n | 'right-center'\n | 'right-bottom'\n | 'left-top'\n | 'left-center'\n | 'left-bottom';\n\n/** Tipo de footer del popover (Figma 4456:83048). `none` = sin footer. */\nexport type SuiPopoverFooter = 'none' | 'stretch' | 'text-stepper' | 'stepper';\n\n@Component({\n selector: 'sui-popover',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-popover.html',\n styleUrl: './sui-popover.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). El input\n `title` sigue accesible internamente; solo se borra del DOM para evitar el\n tooltip nativo gris del browser. */\n '[attr.title]': 'null',\n '[attr.aria-label]': 'title() || null',\n '[attr.role]': '\"dialog\"',\n /* data-sui-* reflejan el estado del componente en el DOM como state-hooks\n públicos (mismo patrón que data-sui-position / data-sui-footer). El SCSS\n interno NO los usa como selector — son contrato de styling externo para el\n consumer. data-sui-tail no es dead code: es el state-hook de visibilidad del\n tail, cubierto por sui-popover.spec.ts. */\n '[attr.data-sui-position]': 'position()',\n '[attr.data-sui-footer]': 'footer()',\n '[attr.data-sui-tail]': 'tail() ? \"\" : null',\n },\n})\nexport class SuiPopover {\n /* ── Tail / position ── */\n\n /** Placement axis del tail relativo al trigger (12 variantes Figma). */\n readonly position = input<SuiPopoverPosition>('top-left');\n\n /** Mostrar la cola/flecha (tail SVG). */\n readonly tail = input(true);\n\n /* ── Header / content ── */\n\n /** RemixIcon name del header icon (ej. 'user-6-line'). null/'' = sin icono. */\n readonly icon = input<string | null>('user-6-line');\n\n /** Título del popover (Label/Medium). */\n readonly title = input<string>('');\n\n /** Descripción (Paragraph/Small). null/'' = sin descripción. */\n readonly description = input<string | null>(null);\n\n /** Mostrar el botón X de dismiss (top-right). */\n readonly dismissIcon = input(true);\n\n /* ── Footer ── */\n\n /** Tipo de footer. `none` oculta el footer y el separador. */\n readonly footer = input<SuiPopoverFooter>('stretch');\n\n /** Texto del botón secundario (izquierda). */\n readonly backLabel = input<string>('Back');\n\n /** Texto del botón primario (derecha). */\n readonly nextLabel = input<string>('Next');\n\n /** Renderear el botón secundario (Back). Si false, solo se muestra el primario. */\n readonly doubleButton = input(true);\n\n /** Paso actual (1-based) — usado en text-stepper y stepper. */\n readonly currentStep = input<number>(1);\n\n /** Total de pasos — usado en text-stepper y stepper. */\n readonly totalSteps = input<number>(4);\n\n /* ── Outputs ── */\n\n /** Click en el botón X de dismiss. */\n readonly dismissed = output<void>();\n\n /** Click en el botón secundario (Back). */\n readonly back = output<void>();\n\n /** Click en el botón primario (Next). */\n readonly next = output<void>();\n\n /* ── Derived ── */\n\n /** True cuando hay icono que renderear. */\n readonly hasIcon = computed(() => !!this.icon());\n\n /** True cuando hay descripción. */\n readonly hasDescription = computed(() => !!this.description());\n\n /** True cuando el footer está visible (≠ none). */\n readonly hasFooter = computed(() => this.footer() !== 'none');\n\n /** True para footer con texto \"Step X of N\". */\n readonly isTextStepper = computed(() => this.footer() === 'text-stepper');\n\n /** True para footer con dot indicator. */\n readonly isDotStepper = computed(() => this.footer() === 'stepper');\n\n /** Texto \"Step X of N\" del text-stepper. */\n readonly stepperText = computed(() => `Step ${this.currentStep()} of ${this.totalSteps()}`);\n\n /** Array de dots para el stepper. Cada item: índice activo => primary. */\n readonly dots = computed(() => {\n const total = Math.max(1, this.totalSteps());\n const active = this.currentStep();\n return Array.from({ length: total }, (_v, i) => i + 1 === active);\n });\n}\n","@if (tail()) {\n <!-- Tail / flecha. Triángulo isósceles 16×8 (Figma node 4431:81386 / 4431:81222:\n box `h-[8px] w-[16px]`). Mismo mecanismo seamless que sui-tooltip: dos\n triángulos clip-path superpuestos en `.sui-popover__tail-arrow` —\n `::before` (color de borde, 1px más grande hacia los lados + base) asoma\n como hairline = continuación del stroke del panel SOLO en los dos lados\n exteriores; `::after` (fill bg-white-0, tamaño exacto) tapa el interior y\n solapa 1px sobre el borde del panel en la base → la unión se funde SIN\n línea. El wrapper `.sui-popover__tail` posiciona/centra (12 variantes); el\n `.sui-popover__tail-arrow` se centra+rota sobre su propio centro. -->\n <span class=\"sui-popover__tail\" aria-hidden=\"true\">\n <span class=\"sui-popover__tail-arrow\"></span>\n </span>\n}\n\n<div class=\"sui-popover__panel\">\n <div class=\"sui-popover__content\">\n @if (hasIcon()) {\n <span class=\"sui-popover__icon-wrap\">\n <sui-icon [name]=\"icon()!\" [size]=\"24\" />\n </span>\n }\n\n <div class=\"sui-popover__text\">\n <!-- Body proyectado custom: si el consumer pasa [data-slot=body], se usa\n en lugar de title/description. Útil para contenido rico. -->\n <ng-content select=\"[data-slot=body]\">\n <p class=\"sui-popover__title\">{{ title() }}</p>\n @if (hasDescription()) {\n <p class=\"sui-popover__description\">{{ description() }}</p>\n }\n </ng-content>\n </div>\n\n @if (dismissIcon()) {\n <button\n type=\"button\"\n class=\"sui-popover__dismiss\"\n aria-label=\"Cerrar\"\n (click)=\"dismissed.emit()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"close-line\" [size]=\"20\" />\n </button>\n }\n </div>\n\n @if (hasFooter()) {\n <div class=\"sui-popover__footer\">\n @if (isTextStepper()) {\n <span class=\"sui-popover__step-text\">{{ stepperText() }}</span>\n }\n\n @if (isDotStepper()) {\n <span class=\"sui-popover__dots\" aria-hidden=\"true\">\n @for (active of dots(); track $index) {\n <span class=\"sui-popover__dot\" [class.sui-popover__dot--active]=\"active\"></span>\n }\n </span>\n }\n\n <div class=\"sui-popover__actions\">\n @if (doubleButton()) {\n <button\n type=\"button\"\n class=\"sui-popover__btn sui-popover__btn--back\"\n (click)=\"back.emit()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <!-- Text-wrapper px-4 (Figma Buttons [1.1] node 4456:83185 > Text):\n 8px del botón + 4px del wrapper = 12px efectivos a cada lado. -->\n <span class=\"sui-popover__btn-text\">{{ backLabel() }}</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"sui-popover__btn sui-popover__btn--next\"\n (click)=\"next.emit()\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-popover__btn-text\">{{ nextLabel() }}</span>\n </button>\n </div>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiProgressBar, SuiProgressBarColor, SuiProgressBarSize } from '../sui-progress-bar/sui-progress-bar';\n\nexport type SuiProgressBarLabelType = 'on-top' | 'on-right';\n\n/**\n * sui-progress-bar-label — SUI Design System 2.0 · Progress Bar with Label\n *\n * Figma: 8p1k72aKKvzJV4XcvPS4VO — frame \"Progress Bar Label [1.1]\" node 515:3758.\n * VERIFIED via MCP (`get_metadata` + `get_design_context` + `get_variable_defs`).\n *\n * Wrapper compuesto que envuelve `sui-progress-bar` y le agrega título, %,\n * descripción y un link opcional. Tres layouts (variantes del frame):\n *\n * ┌ Type=On Top, Show Bottom=On (node 515:3755) ────────────────────────┐\n * │ [ título ............................. %% ] ← fila gap-6, items-start\n * │ [ ▰▰▰▰▰▰▰▰▱▱ barra 100% ] │\n * │ [ link descripción ................... ] ← fila gap-4, items-start │\n * └──────────────────────────────────────────────────────────────────────┘\n * Type=On Top, Show Bottom=Off (node 515:3819): igual sin la fila inferior.\n * Type=On Right, Show Bottom=Off (node 515:3859): fila única gap-8,\n * items-center → barra(flex:1) + %% a la derecha. Sin título ni descripción.\n *\n * EXACT (pulled from Figma 2026-05-29, verified):\n * - Contenedor on-top: flex-col, gap 6px, width 100% (Figma fija 320).\n * - Contenedor on-right: flex-row, gap 8px, align-items center.\n * - Fila título \"Title & Detail\": flex gap 6px, align-items start.\n * - Fila descripción \"Description\": flex gap 4px, align-items start.\n * - Título: text/strong-950 #171717, Inter Medium 14/lh20/tracking-0.084px\n * (Label/Small), flex:1.\n * - Porcentaje: text/sub-600 #5c5c5c, Inter Regular 12/lh16 (Paragraph/XSmall),\n * whitespace-nowrap.\n * - Descripción: text/sub-600 #5c5c5c, Inter Regular 12/lh16, flex:1.\n * - Link: primary-base #335cff, Inter Medium 12/lh16, underline.\n * OJO: el `primary-base` del Figma del DS es azul #335cff; en\n * este proyecto `--sui-primary-base` es naranja, así que el link\n * se pinta con `--sui-state-information-base` (= el azul del DS).\n * Esto es una DESVIACIÓN PERMANENTE de mapping de token (no un\n * pending-verify): el primary de este proyecto nunca será azul.\n *\n * Decisiones (responde openQuestions del audit):\n * - #2: el texto del link NO es hardcoded \"Upgrade\" → input `linkLabel`\n * (default 'Upgrade'). La acción se expone vía output `linkClick`.\n * - #3: es componente SUI nuevo (`sui-progress-bar-label`) que COMPONE\n * `sui-progress-bar` internamente (no proyección de contenido), para\n * mantener la barra como única fuente de verdad del fill.\n *\n * PENDING VERIFY:\n * - El frame del DS publica los textos en inglés (\"Data Storage\", \"Upgrade\",\n * \"to unlock unlimited date storage.\") como placeholders editables — acá\n * todos son inputs, sin copy hardcodeado.\n * - No hay estados hover/focus/disabled definidos para el link en el frame\n * estático; el hover (más oscuro) es convención de link y se deja como\n * decoración con :hover (no especificado en Figma).\n *\n * Inputs:\n * - value: number 0–100 (delegado a sui-progress-bar).\n * - type: 'on-top' (default) | 'on-right'.\n * - title: string — título (sólo on-top). Se espera no-vacío en\n * on-top (la fila head se omite si title='' y showPercentage\n * es false, para no dejar una fila invisible ocupando alto).\n * - showPercentage: boolean (default true) — muestra el % textual.\n * - percentageText: string opcional — override del texto del % (default `${value}%`).\n * - showBottom: boolean (default false) — fila inferior link+descripción (sólo on-top).\n * - description: string — texto descriptivo (fila inferior).\n * - showLink: boolean (default false) — muestra el link.\n * - linkLabel: string (default 'Upgrade') — texto del link.\n * - color / size: delegados a sui-progress-bar.\n * - ariaLabel: delegado a sui-progress-bar.\n *\n * Output:\n * - linkClick: void — emitido al click del link.\n */\n@Component({\n selector: 'sui-progress-bar-label',\n standalone: true,\n imports: [SuiProgressBar],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './sui-progress-bar-label.html',\n styleUrl: './sui-progress-bar-label.scss',\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-type]': 'type()',\n },\n})\nexport class SuiProgressBarLabel {\n readonly value = input<number>(0);\n readonly type = input<SuiProgressBarLabelType>('on-top');\n readonly title = input<string>('');\n readonly showPercentage = input<boolean>(true);\n readonly percentageText = input<string | null>(null);\n readonly showBottom = input<boolean>(false);\n readonly description = input<string>('');\n readonly showLink = input<boolean>(false);\n readonly linkLabel = input<string>('Upgrade');\n readonly color = input<SuiProgressBarColor>('blue');\n readonly size = input<SuiProgressBarSize>('medium');\n readonly ariaLabel = input<string | null>(null);\n\n readonly linkClick = output<void>();\n\n readonly clampedValue = computed(() => {\n const v = this.value();\n if (Number.isNaN(v)) return 0;\n return Math.max(0, Math.min(100, v));\n });\n\n /** Texto del % mostrado: override explícito o `${value}%`. */\n readonly percentLabel = computed(() => {\n const override = this.percentageText();\n if (override != null && override !== '') return override;\n return `${Math.round(this.clampedValue())}%`;\n });\n\n onLinkClick(event: Event): void {\n event.preventDefault();\n this.linkClick.emit();\n }\n}\n","@if (type() === 'on-right') {\n <!-- Type=On Right: barra (flex:1) + % a la derecha, gap 8, items-center -->\n <sui-progress-bar\n class=\"sui-progress-bar-label__bar\"\n [value]=\"value()\"\n [color]=\"color()\"\n [size]=\"size()\"\n [ariaLabel]=\"ariaLabel()\"\n />\n @if (showPercentage()) {\n <span class=\"sui-progress-bar-label__percent\">{{ percentLabel() }}</span>\n }\n} @else {\n <!-- Type=On Top: título+% / barra / (link+descripción).\n La fila head sólo se renderiza si hay título o % que mostrar — sin esto un\n consumer con type='on-top' sin title dejaba una fila vacía de 20px+6px. -->\n @if (title() || showPercentage()) {\n <div class=\"sui-progress-bar-label__head\">\n @if (title()) {\n <span class=\"sui-progress-bar-label__title\">{{ title() }}</span>\n }\n @if (showPercentage()) {\n <span class=\"sui-progress-bar-label__percent\">{{ percentLabel() }}</span>\n }\n </div>\n }\n\n <sui-progress-bar\n class=\"sui-progress-bar-label__bar\"\n [value]=\"value()\"\n [color]=\"color()\"\n [size]=\"size()\"\n [ariaLabel]=\"ariaLabel()\"\n />\n\n @if (showBottom()) {\n <div class=\"sui-progress-bar-label__bottom\">\n @if (showLink()) {\n <a\n class=\"sui-progress-bar-label__link\"\n href=\"#\"\n (click)=\"onLinkClick($event)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >{{ linkLabel() }}</a\n >\n }\n <span class=\"sui-progress-bar-label__desc\">{{ description() }}</span>\n </div>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n forwardRef,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'sui-radio-group',\n template: '<ng-content />',\n styles: ':host { display: inline-flex; gap: 16px; align-items: center; }',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[attr.role]': '\"radiogroup\"' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiRadioGroup),\n multi: true,\n },\n ],\n})\nexport class SuiRadioGroup implements ControlValueAccessor {\n readonly value = signal<any>(null);\n\n private _onChange: (v: any) => void = () => {};\n private _onTouched: () => void = () => {};\n\n select(v: any): void {\n this.value.set(v);\n this._onChange(v);\n this._onTouched();\n }\n\n writeValue(v: any): void {\n this.value.set(v ?? null);\n }\n\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n setDisabledState(_isDisabled: boolean): void {\n // Propagation to children via injection is handled by SuiRadio\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiRadioGroup } from '../sui-radio/sui-radio-group';\nimport type { SuiRadioSize } from '../sui-radio/sui-radio';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiEmoji, type SuiEmojiName } from '../sui-emoji/sui-emoji';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\n\nexport type SuiRadioCardType =\n | 'basic'\n | 'left-icon'\n | 'avatar';\n\n/**\n * SUI Radio Card — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 515:4347 (Radio Card [1.1]) — VERIFIED via MCP\n *\n * EXACT (pulled from Figma, verified per type × state):\n * - Container (all types): w 360, padding 16, gap 14, radius 12,\n * border 1px stroke-soft-200, shadow regular-x-small (0 1px 2px 0 #0a0d1408),\n * bg white-0\n * - Active border: 1px primary-base (NO shadow — el Figma 515:4454 lo confirma)\n * - Text column: flex-col gap 4, flex 1 0 0 (min-width 0 — flex shrink-friendly)\n * - Title row: flex gap 4 items-center\n * - Label: 14/20 medium strong-950 letter-spacing -0.6% (-0.084px @ 14px)\n * - Sublabel: 12/16 regular sub-600\n * - Description: 12/16 regular sub-600\n * - NEW Badge (515:4353): color INFORMATION azul, fiel a Figma (NO el naranja de\n * marca — ver DECISIONES.md §1: para este badge \"se cambió a azul (fiel Figma)\").\n * bg state/information/light (#c0d5ff), text state/information/dark (#122368),\n * 11/12 medium uppercase, letterSpacing=2 en Figma = 2% = 0.22px @ 11px (MCP:\n * tracking-[0.22px] — NO 2px), padding py-2 px-8, radius-full\n * - Radio: 20×20, bg-circle inset 10% (soft-200), box inset 17.5% (white-0)\n * + shadow 0px 2px 4px -2px rgba(27,28,29,0.12)\n * - Active radio: bg-circle stays at inset 10% but uses primary-base,\n * inner box inset 30% (smaller dot) sin shadow\n *\n * EXACT per-type leading (pulled from Figma):\n * - basic: no leading slot\n * - left-icon (515:4357): 40×40 circle, 1px stroke-soft-200, shadow x-small,\n * padding 10, icon 20×20 inside\n * - avatar (515:4365 → 246:12371): 40×40 image, radius-full, no border\n * - card-provider (515:4374 → 214:1327): 32×24 rect, radius 4, no border\n * - brand (515:4383 → 214:394): 40×40 logo container (consumer-provided),\n * no border/bg (logo trae su propio look)\n * - company (515:4392 → 254:95): 40×40 circle radius-full with bg color,\n * consumer provides bg via CSS or [companyBg] input\n *\n * COLOR MAPPING (Figma → project token):\n * bg/white-0 → --sui-bg-white-0\n * bg/soft-200 → --sui-bg-soft-200\n * stroke/soft-200 → --sui-stroke-soft-200\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * primary-base (#335cff) → --sui-primary-base (BRAND OVERRIDE: este proyecto\n * usa orange #fa7319, no azul — active border + radio\n * dot quedan naranja, intencional identidad Master Pedidos)\n * state/information/light → --sui-state-information-light (#c0d5ff) [NEW badge bg, fiel Figma]\n * state/information/dark → --sui-state-information-dark (#122368) [NEW badge text, fiel Figma]\n * text/sub-600 → --sui-text-sub-600 (label en disabled)\n * text/soft-400 → --sui-text-soft-400 (sublabel + desc en disabled)\n * radius-12 → --sui-radius-12 (12px)\n * radius-full → --sui-radius-full (999px)\n * regular-shadow/x-small → --sui-shadow-x-small (0 1px 2px 0 #0a0d1408)\n *\n * VERIFIED (homologación 2026-05-29, pulled exact via MCP):\n * - Hover (515:4401): card bg-weak-50, sin border, sin shadow; radio dot\n * interno bg-soft-200 → bg-sub-300 (Radio11 state=\"Hover\"). Gated a\n * (hover: hover) and (pointer: fine) por iOS sticky-hover.\n * - Disabled (515:4507): card bg-white-0 + 1px stroke-soft-200 sin shadow.\n * Label → text-sub-600. Sublabel + Description → text-soft-400. Badge sin\n * fill, 1px stroke-soft-200, texto disabled-300. Radio dot bg-soft-200.\n * Disabled + unchecked (Radio11 515:4270): inner box blanco oculto\n * (display:none) — Figma renderiza solo el bg-circle, igual que sui-radio.scss.\n * - Badge NEW → azul INFORMATION, fiel a Figma (state/information/light #c0d5ff\n * bg + state/information/dark #122368 text), NO el naranja de marca. DECISIONES.md\n * §1 lo confirma: para este badge \"se cambió a azul (fiel Figma)\" — el naranja\n * de marca aplica solo a active border / dot / focus ring. Ver SCSS y JSDoc arriba.\n *\n * PENDING VERIFY (inferred, not pulled from Figma):\n * - Hover sobre Active (card ya checked): no hay variant separado en el set;\n * asumido = mantiene border primary + bg-weak-50 leve. Ship as approximation.\n * - Focus-visible ring: 3px primary-base @ 16% alpha + border primary, inferido\n * (el component_set no publica variant Focus distinto del Hover/Active). Es\n * extensión de a11y del proyecto, no rompe fidelidad visual con Figma.\n *\n * NOT IMPLEMENTED (Figma types sin uso real en el proyecto — over-engineering NOW):\n * - type='card-provider' (515:4374): slot 32×24 radius-4 para logo de tarjeta.\n * - type='brand' (515:4383): slot 40×40 logo externo sin frame.\n * - type='company' (515:4392): slot 40×40 circle con bg color del consumer.\n * Cero consumers en el repo (los type=brand/company existentes son de\n * sui-command-menu-item, no de este card). Agregarlos implica content\n * projection + assets de marca. Diferido — agregar cuando surja el caso.\n *\n * Form integration:\n * - Implementa ControlValueAccessor: usable con [(ngModel)] / [formControl].\n * - Si está dentro de <sui-radio-group>, el group toma precedencia\n * (group.value() determina checked, group.select() en click).\n * - El click en cualquier parte del card togglea / selecciona.\n *\n * iOS WKWebView fix: touch listeners en host (CLAUDE.md).\n */\n@Component({\n selector: 'sui-radio-card',\n standalone: true,\n templateUrl: './sui-radio-card.html',\n styleUrl: './sui-radio-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiEmoji, SuiAvatar],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiRadioCard),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-checked]': 'isChecked() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n /* Cuando el leading viene como iconSrc (URL de emoji externa), el slot\n cambia a modo \"fill\": padding 0 + overflow hidden, para que el emoji\n ocupe los 40×40 completos del círculo. Con padding 10 quedaba 20×20\n visualmente \"perdido\" dentro del círculo. */\n '[attr.data-sui-leading-fill]': 'iconSrc() ? \"\" : null',\n '[attr.role]': '\"radio\"',\n '[attr.aria-checked]': 'isChecked() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'isDisabled() ? \"true\" : null',\n '[attr.aria-label]': 'label() || null',\n '[attr.tabindex]': 'isDisabled() ? \"-1\" : \"0\"',\n '(click)': 'onToggle($event)',\n '(keydown.space)': 'onToggle($event)',\n '(keydown.enter)': 'onToggle($event)',\n /* iOS WKWebView fix — sin esto :active stickea 300-500ms en standalone pages */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiRadioCard implements ControlValueAccessor {\n private readonly group = inject(SuiRadioGroup, { optional: true });\n\n /** Tipo del leading slot — gobierna qué se renderiza a la izquierda. */\n readonly type = input<SuiRadioCardType>('basic');\n /** Tamaño del radio interno (custom) — lo decide el padre (componente dumb). */\n readonly size = input<SuiRadioSize>('medium');\n /** Lado en px del radio según size: medium 20 · large 24 · xlarge 28. Los\n * insets internos (bg/box) son % → escalan solos. */\n readonly radioPx = computed(() => (this.size() === 'xlarge' ? 28 : this.size() === 'large' ? 24 : 20));\n\n /** Valor del radio (requerido para uso en grupo). */\n readonly value = input.required<string>();\n\n /** Título principal del card (label de la fila Title). */\n readonly label = input<string>('');\n\n /** Sublabel opcional (12/16 regular sub-600 al lado del label). */\n readonly sublabel = input<string | null>(null);\n\n /** Descripción secundaria opcional (12/16 regular sub-600 debajo del Title). */\n readonly description = input<string | null>(null);\n\n /**\n * RemixIcon name (sin prefijo \"ri-\") para type='left-icon'. Si está, se usa.\n * Si no, puedes proyectar via slot `[sui-radio-card-leading]` (no implementado\n * aquí — se podría agregar si surge la necesidad).\n */\n readonly icon = input<string | null>(null);\n\n /**\n * Emoji del catálogo SUI_EMOJI_MAP — alternativa a icon para type='left-icon'.\n * Si ambos están, icon tiene precedencia.\n */\n readonly emoji = input<SuiEmojiName | null>(null);\n\n /**\n * URL directa al emoji para type='left-icon'. Útil cuando el consumer ya tiene\n * la URL (ej. FLUENT_EMOJI map del proyecto) y no quiere registrar el emoji\n * en SUI_EMOJI_MAP. Precedencia: icon > emoji > iconSrc.\n */\n readonly iconSrc = input<string | null>(null);\n\n /**\n * URL de imagen para type='avatar' — se renderiza con sui-avatar size=lg\n * (40×40 redonda). Si la imagen falla, fallback automático a iniciales del\n * label. Para los otros types se ignora.\n */\n readonly imageUrl = input<string | null>(null);\n\n /** Si true, muestra el badge built-in al lado del sublabel (default 'NEW'). */\n readonly badge = input(false);\n\n /** Custom label para el badge (default 'NEW'). Solo aplica si badge=true. */\n readonly badgeLabel = input('NEW');\n\n readonly disabled = input(false);\n\n /** Standalone mode (no group): two-way binding del estado checked. */\n readonly checked = model(false);\n\n /** Emite el value cuando se selecciona (útil sin sui-radio-group). */\n readonly selected = output<string>();\n\n // ── ControlValueAccessor state ──────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** Estado checked resuelto: group-driven > form/standalone. */\n readonly isChecked = computed(() => {\n if (this.group) return this.group.value() === this.value();\n return this.checked();\n });\n\n /** True si type requiere render del slot leading. */\n readonly hasLeading = computed(() => this.type() !== 'basic');\n\n /** Iniciales para el fallback de sui-avatar cuando la imagen no carga.\n Toma la primera letra de cada palabra (max 2). Si label está vacío, vacío. */\n readonly initialsFromLabel = computed(() => {\n const l = this.label().trim();\n if (!l) return '';\n return l.split(/\\s+/).slice(0, 2).map(w => w[0]?.toUpperCase() ?? '').join('');\n });\n\n private _onChange: (v: unknown) => void = () => {};\n private _onTouched: () => void = () => {};\n\n onToggle(e: Event): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n if (this.group) {\n this.group.select(this.value());\n } else {\n this.checked.set(true);\n }\n this._onChange(this.value());\n this._onTouched();\n this.selected.emit(this.value());\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────\n /** writeValue: con FormControl que guarda el value seleccionado, marcamos\n checked si el value del FormControl matchea nuestro value. */\n writeValue(v: unknown): void {\n this.checked.set(v === this.value());\n }\n registerOnChange(fn: (v: unknown) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!-- Leading slot — solo basic / left-icon / avatar (Figma 515:4356/4365) -->\n@if (type() === 'left-icon') {\n <div class=\"sui-radio-card__leading sui-radio-card__leading--icon\" aria-hidden=\"true\">\n @if (icon()) {\n <sui-icon [name]=\"icon()!\" [size]=\"20\" />\n } @else if (emoji()) {\n <sui-emoji [name]=\"emoji()\" size=\"md\" />\n } @else if (iconSrc()) {\n <sui-emoji [src]=\"iconSrc()\" size=\"full\" />\n }\n </div>\n} @else if (type() === 'avatar') {\n <!-- sui-avatar maneja fallback automático a iniciales si la imagen falla. -->\n <sui-avatar\n class=\"sui-radio-card__leading sui-radio-card__leading--avatar\"\n size=\"lg\"\n [src]=\"imageUrl()\"\n [initials]=\"initialsFromLabel()\" />\n}\n\n<!-- Texto: Title row + description -->\n<div class=\"sui-radio-card__text\">\n <div class=\"sui-radio-card__title\">\n @if (label()) {\n <span class=\"sui-radio-card__label\">{{ label() }}</span>\n }\n @if (sublabel()) {\n <span class=\"sui-radio-card__sublabel\">{{ sublabel() }}</span>\n }\n @if (badge()) {\n <span class=\"sui-radio-card__badge\">{{ badgeLabel() }}</span>\n }\n </div>\n @if (description()) {\n <p class=\"sui-radio-card__description\">{{ description() }}</p>\n }\n</div>\n\n<!-- Radio dot 20×20 (Figma 515:4243 → 515:4244 bg + 515:4245 box) -->\n<span class=\"sui-radio-card__radio\" aria-hidden=\"true\" [style.width.px]=\"radioPx()\" [style.height.px]=\"radioPx()\">\n <span class=\"sui-radio-card__radio-bg\"></span>\n <span class=\"sui-radio-card__radio-box\"></span>\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { SuiRadioGroup } from './sui-radio-group';\n\nexport type SuiRadioValue = string | number | null;\nexport type SuiRadioSize = 'medium' | 'large' | 'xlarge';\n// large/xlarge: project extension (no-Figma)\n\n/**\n * SUI Radio — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 515:4242\n *\n * Structure:\n * - Container outer: 20×20 (medium/default Figma size)\n * - bg (outer circle): 16×16 radius 999px\n * - box (inner white surface): 13×13 circle unchecked, 8×8 dot checked\n * - No SVG icon — the \"check\" is the dot shrinking on the solid bg\n *\n * States × Active value:\n * - Default unchecked: bg-soft-200 (#ebebeb)\n * - Default checked: primary-base (#335cff)\n * - Hover unchecked: bg-sub-300 (#d1d1d1)\n * - Hover checked: primary-dark (#2547d0)\n * - Focus unchecked: primary-base (#335cff) — bg turns blue\n * - Focus checked: primary-darkest (#1f3bad)\n * - Disabled unchecked: bg-soft-200, box hidden\n * - Disabled checked: bg-soft-200, dot 8×8 white visible\n *\n * Sizes:\n * - medium: Figma spec (515:4242)\n * - large / xlarge: project extension (no-Figma), scale follows Δ4px increments\n *\n * Group mode: wrap radios inside <sui-radio-group> to get exclusive selection\n * with ControlValueAccessor support. Each radio declares a [value] input.\n * Standalone mode: [(standaloneChecked)] two-way binding (legacy toggle behaviour).\n */\n@Component({\n selector: 'sui-radio',\n templateUrl: './sui-radio.html',\n styleUrl: './sui-radio.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-checked]': 'checked() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.role]': '\"radio\"',\n '[attr.aria-checked]': 'checked() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '(click)': 'onToggle($event)',\n '(keydown.space)': 'onToggle($event)',\n '(keydown.enter)': 'onToggle($event)',\n /* iOS WKWebView fix — ver CLAUDE.md \"iOS :active stuck en custom buttons\".\n Sin estos listeners, :active stickea 300-500ms en pages standalone. */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiRadio {\n private readonly group = inject(SuiRadioGroup, { optional: true });\n\n readonly size = input<SuiRadioSize>('medium');\n readonly value = input<SuiRadioValue>(null);\n readonly disabled = input(false);\n\n /** Standalone mode (no group): keeps legacy toggle behaviour */\n readonly standaloneChecked = model(false);\n\n /** Resolved checked state: group-driven or standalone */\n readonly checked = computed(() => {\n if (this.group) {\n return this.group.value() === this.value();\n }\n return this.standaloneChecked();\n });\n\n onToggle(e: Event): void {\n if (this.disabled()) return;\n e.preventDefault();\n if (this.group) {\n this.group.select(this.value());\n } else {\n this.standaloneChecked.update(v => !v);\n }\n }\n}\n","<span class=\"sui-radio__bg\">\n <span class=\"sui-radio__box\"></span>\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiEmoji } from '../sui-emoji/sui-emoji';\n\nexport type SuiRatingAppearance = 'inline' | 'cell' | 'bar' | 'bar-area';\nexport type SuiRatingType = 'star' | 'heart' | 'emoji' | 'number';\n// large/xlarge: project extension (no-Figma), escala con incremento Δ4px (16→20→24→28)\nexport type SuiRatingSize = 'small' | 'medium' | 'large' | 'xlarge';\nexport type SuiRatingAlignment = 'inline' | 'vertical' | 'horizontal';\n\nexport interface SuiRatingReviewLink {\n label: string;\n href?: string;\n}\n\n/**\n * Estado visual por celda (appearance='bar' | 'bar-area'). Figma define 3 estados\n * distintos por celda — el SUI los colapsaba antes y perdía el intermedio:\n * - 'default' → ícono empty-line gris (star/heart) | texto sub-600 (number) | emoji desaturado\n * - 'hover' → ícono EMPTY FILLED gris (star/heart, relleno sólido pero neutro)\n * | texto strong-950 (number) | emoji desaturado (sin cambio)\n * - 'selected' → ícono FULL dorado/rojo (star/heart) | texto strong-950 + bg weak-50 (number)\n * | emoji full color + bg weak-50\n */\ntype SuiRatingCellState = 'default' | 'hover' | 'selected';\n\ninterface SuiRatingCellView {\n index: number; // 1..max (1-based, NOT 0-based)\n fill: 'empty' | 'half' | 'full';\n /** Estado visual derivado de hoverIndex + value. Solo relevante en bar/bar-area. */\n cellState: SuiRatingCellState;\n emoji?: string;\n}\n\n/**\n * SUI Rating — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodes verificados:\n * 532:4137 — Rating Items [1.0] (atom: empty-line / empty-filled / half / full × star/heart)\n * 532:4160 — Rating Cell [1.1] (cell wrapper card: 32px icon, padding 12px, radius 10px;\n * default/selected → bg white + border soft-200 + shadow x-small;\n * hover → bg weak-50 sin border ni shadow)\n * 532:4340 — Rating Review [1.0] (inline display: stars + value text + review link)\n * 535:4535 — Rating Bar Items (cell of bar: emoji/number/star/heart × default/hover/selected)\n * 535:4658 — Rating Bar [1.1] (5 cells horizontal segmented bar)\n * 535:4994 — Rating Bar Area [1.1] (variant set: emoji/number/star/heart, cada uno 320×132)\n * 535:5057 — Rating Bar Area [1.1] Star (instance medida: card rounded-12 132px alto =\n * Rating Bar 36px arriba + Input 96px abajo;\n * Input padding 12px, text node y=12 → arranca ARRIBA)\n *\n * Cuatro appearances:\n * - 'inline' → 5 íconos inline bare, gap 2px (matches Rating Items 532:4137 +\n * Rating Review 532:4340). Usado para display read-only de rating promedio\n * (driver-ratings, empresa/reviews) o input compacto (rate-order). Soporta\n * half-step si readonly. NO lleva card styling — es la fila de glyphs pelados.\n * - 'cell' → 5 íconos envueltos en card individual (matches Rating Cell 532:4160).\n * Cada celda: padding 12px, radius 10px, icon 32px. default/selected → bg white-0\n * + border stroke/soft-200 + regular-shadow x-small (0 1px 2px rgba(10,13,20,.03));\n * hover → bg weak-50 sin border ni shadow. Es la versión \"tarjeta\" del input de\n * estrellas/corazones (distinta del bare 'inline' y del segmented 'bar').\n * - 'bar' → 5 cells horizontales con border + padding (matches Rating Bar).\n * Usado para input formulario (modal review en order-tracking, rate-order\n * CSAT survey). Permite type='emoji'|'number' además de star/heart.\n * - 'bar-area' → PIEZA ÚNICA: card rounded-12 que integra la Rating Bar arriba\n * (estrellas/emoji/number/heart) + el textarea \"Tell us why!\" abajo, como un\n * solo componente cohesivo (matches Rating Bar Area 535:5057). El textarea NO\n * es externo ni proyectado por content-projection — vive dentro del card y se\n * enlaza al model `reason`. Las 5 cells crecen flex (no 64px fijo) para llenar\n * el ancho. El Input inferior es alto fijo (72px de contenido + 12px padding,\n * = 96px), texto arranca arriba-izquierda → el card es un envelope ≈132px que\n * se ve como una sola tarjeta. Captura value + reason de una sola interacción.\n *\n * Estados por celda (bar / bar-area) — homologados a Figma Rating Bar Items 535:4535:\n * default → empty-line gris | hover → EMPTY FILLED gris (relleno neutro) |\n * selected → full dorado/rojo. number: hover Y selected usan text/strong-950;\n * selected agrega bg weak-50. emoji: solo selected sale de grayscale.\n *\n * PENDING VERIFY (revisar en device / master-preview tras deploy):\n * - 'cell' appearance: confirmar visual contra Figma 532:4160 con MCP sano\n * (padding 12 / radius 10 / icon 32 / shadow x-small). Pendiente: el screenshot\n * no se pudo verificar al implementar (Figma MCP caído por timeout).\n * - 'bar-area' homologado a Figma 535:5057: card 132px = bar 36px + input 96px;\n * textarea resize:none, min-height 72px, top-aligned (text node y=12 en Figma)\n * - hover 'Empty Filled' star/heart: glyph relleno sólido en stroke/sub-300\n * (#d1d1d1, valor exacto de Figma 535:4546/4556/4597/4599 — mismo color que el\n * default Empty Line; la distinción es solo outline → relleno sólido)\n * - re-click en celda seleccionada sigue siendo no-op (Figma no especifica deselect)\n *\n * Cuatro tipos visuales:\n * - 'star' → Remix icon star-fill / star-half-fill / star-line\n * - 'heart' → Remix icon heart-fill / heart-line\n * - 'emoji' → Fluent Emoji animado (homologado iOS/Android). Default 5 caras\n * CSAT (pensive/confused/neutral/slightly-smiling/grinning). Solo bar.\n * - 'number' → 1..max como texto. Solo bar.\n *\n * Tamaños (icon size):\n * - small: 16px\n * - medium: 20px (default)\n * - large: 24px\n * - xlarge: 28px (project extension, no-Figma — sigue el incremento Δ4px medium→large→xlarge)\n * En appearance='bar' los íconos son siempre 20px (cell width 64px fijo).\n *\n * @input appearance 'inline' | 'cell' | 'bar' | 'bar-area' (default: 'inline')\n * @input type 'star' | 'heart' | 'emoji' | 'number' (default: 'star')\n * @input value model<number> — current value 0..max\n * @input max número de cells (default: 5)\n * @input size 'small' | 'medium' | 'large' | 'xlarge' (default: 'medium')\n * @input readonly deshabilita clicks (display only)\n * @input halfStep inline + readonly: renderiza half-fill basado en value decimal\n * @input showValue inline: muestra \"4.5\" al lado de los íconos\n * @input reviewCount inline: muestra \"5.2K Ratings\" al lado (formato corto)\n * @input reviewLink inline: link \"18 reviews\" al lado\n * @input alignment inline: 'inline' (only) | 'vertical' | 'horizontal'\n * @input emojis array de chars Unicode para type='emoji' (default 😞😕😐🙂😄)\n * @input ariaLabel a11y label del grupo\n *\n * @output valueChange index 1..max (NO 0-based) cuando el user selecciona.\n * 0 emitido cuando el user re-clickea el seleccionado para deseleccionar.\n *\n * ── ControlValueAccessor ──────────────────────────────────────────────\n * Implementa CVA sobre `value` (number) para que funcione con reactive forms:\n * <sui-rating formControlName=\"rating\"> | <sui-rating [formControl]=\"ctrl\">\n * El CVA convive con el two-way `[(value)]` existente SIN romperlo (patrón canon\n * sui-time-picker): `value` sigue siendo `model<number>`, y los callbacks del form\n * (`_onChange`/`_onTouched`) se invocan a mano en la interacción (onCellClick) /\n * blur, en paralelo al model. Son canales independientes — el model alimenta\n * `[(value)]`/`(valueChange)`, los callbacks alimentan el FormControl. `writeValue`\n * escribe el model interno (el form pisa el value programáticamente).\n *\n * El `reason` del appearance 'bar-area' (comentario del textarea) NO entra al CVA:\n * el CVA primario es el número de estrellas. `reason` queda como `model<string>`\n * two-way SEPARADO para que el consumer lo bindee o lo agregue a su form aparte\n * (ej. otro FormControl 'comentario'). Si se quisiera un value compuesto\n * {value, reason} habría que romper la API number de todos los consumers actuales\n * (driver-ratings, reviews, rate-order pasan/leen number), así que NO se hizo.\n *\n * setDisabledState integra con el mismo gate que `readonly`: un FormControl\n * disabled deshabilita clicks/hover igual que readonly=true (ver isInteractive).\n */\n@Component({\n selector: 'sui-rating',\n standalone: true,\n templateUrl: './sui-rating.html',\n styleUrl: './sui-rating.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon, SuiEmoji, NgTemplateOutlet],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiRating),\n multi: true,\n },\n ],\n host: {\n '[attr.data-appearance]': 'appearance()',\n '[attr.data-type]': 'type()',\n '[attr.data-size]': 'size()',\n '[attr.data-alignment]': 'alignment()',\n '[attr.role]': '\"radiogroup\"',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-readonly]': '!isInteractive() ? \"true\" : null',\n '[attr.data-disabled]': 'disabledByForm() ? \"\" : null',\n },\n})\nexport class SuiRating implements ControlValueAccessor {\n readonly appearance = input<SuiRatingAppearance>('inline');\n readonly type = input<SuiRatingType>('star');\n readonly value = model<number>(0);\n readonly max = input<number>(5);\n readonly size = input<SuiRatingSize>('medium');\n readonly readonly = input<boolean>(false);\n readonly halfStep = input<boolean>(false);\n readonly showValue = input<boolean>(false);\n readonly reviewCount = input<number | null>(null);\n readonly reviewLink = input<SuiRatingReviewLink | null>(null);\n readonly alignment = input<SuiRatingAlignment>('inline');\n /**\n * Lista de emojis para type='emoji'. Default: 5 caras de Fluent Emoji animado\n * (homologado iOS/Android — mismos PNG en todos los devices, no native font).\n * Cada string es un `name` válido de SUI_EMOJI_MAP (ver sui-emoji.ts).\n * Si pasás un string que NO está en el map, sui-emoji renderea broken image.\n */\n readonly emojis = input<string[]>([\n 'pensive-face',\n 'confused-face',\n 'neutral-face',\n 'slightly-smiling-face',\n 'grinning-face-smiling-eyes',\n ]);\n readonly ariaLabel = input<string>('Calificación');\n\n /**\n * appearance='bar-area' — texto del reason (textarea \"Tell us why!\").\n * model<string> para two-way binding. Ignorado en inline/bar.\n */\n readonly reason = model<string>('');\n /** Placeholder del textarea en bar-area. Figma: \"Tell us why!\". */\n readonly reasonPlaceholder = input<string>('Tell us why!');\n /** Filas del textarea en bar-area. El alto mínimo del área de comentario lo\n * fija el CSS (min-height 72px = Figma) para preservar el envelope del card;\n * `rows` solo importa si se quiere un área inicial MÁS alta que ese piso. */\n readonly reasonRows = input<number>(3);\n\n readonly valueChange = output<number>();\n\n /** Hover preview para appearance='inline' interactive (desktop). En mobile\n no se setea — touch va directo al click handler. */\n protected readonly hoverIndex = signal<number | null>(null);\n\n /** Deshabilitado por el form (setDisabledState). Se combina con `readonly`\n * en `isInteractive`: un FormControl disabled bloquea clicks/hover igual que\n * readonly=true, sin perder la distinción semántica (readonly = display\n * intencional; disabled = el form lo apagó). */\n readonly disabledByForm = signal(false);\n\n /** True cuando el rating acepta interacción: NO readonly Y NO disabled por el\n * form. Es el único gate de clicks/hover — reemplaza los checks sueltos de\n * `readonly()` en los handlers para cubrir también el caso del form disabled. */\n readonly isInteractive = computed(() => !this.readonly() && !this.disabledByForm());\n\n // ── Form callbacks (ControlValueAccessor) ──────────────────────────\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Vista pre-computada de cells. Una sola pasada por cambio de inputs:\n * - resuelve fill por index considerando hoverIndex (preview), value y halfStep\n * - asigna emoji por slot si type='emoji'\n * El template itera esto con @for. Sin métodos en template. */\n readonly cells = computed<SuiRatingCellView[]>(() => {\n const length = this.max();\n const interactive = this.isInteractive();\n const hover = this.hoverIndex();\n const value = this.value();\n const appearance = this.appearance();\n /* En interactive, el hover sobrescribe el valor pintado pero NO el real.\n En readonly o sin hover, usamos el value real. */\n const target = interactive && hover !== null ? hover : value;\n const half = this.halfStep() && this.readonly() && appearance === 'inline';\n /* bar/bar-area pintan estados por celda independiente (no fill acumulado).\n inline / cell mantienen el fill acumulado (glyphs que se llenan en cadena).\n En 'cell' el cellState se usa SOLO para el bg-weak-50 del hover (Figma:\n selected NO cambia el chrome de la tarjeta, queda igual que default). */\n const isBar = appearance === 'bar' || appearance === 'bar-area';\n const isCell = appearance === 'cell';\n const emojis = this.emojis();\n return Array.from({ length }, (_, i) => {\n const idx = i + 1; // 1..max\n let fill: 'empty' | 'half' | 'full';\n if (target >= idx) {\n fill = 'full';\n } else if (half && target >= idx - 0.5) {\n fill = 'half';\n } else {\n fill = 'empty';\n }\n /* Estado visual por celda. En bar el hover SOLO afecta la celda bajo el\n cursor (cada celda es su propio item en Figma); selected solo la celda\n cuyo index === value real. En inline no se usa cellState. */\n let cellState: SuiRatingCellState = 'default';\n if (isBar) {\n if (value === idx) {\n cellState = 'selected';\n } else if (interactive && hover === idx) {\n cellState = 'hover';\n }\n } else if (isCell) {\n /* En 'cell' selected NO cambia el chrome (queda como default). Solo el\n hover individual aplica bg weak-50 → solo marcamos 'hover'. */\n if (interactive && hover === idx) {\n cellState = 'hover';\n }\n }\n return {\n index: idx,\n fill,\n cellState,\n emoji: emojis[i] ?? emojis[emojis.length - 1] ?? '🙂',\n };\n });\n });\n\n /** Tamaño del icon en px.\n * - appearance='cell' → SIEMPRE 32px (Figma Rating Cell 532:4160, independiente de size).\n * - appearance='inline' → según size input (small 16 / medium 20 / large 24 / xlarge 28).\n * bar/bar-area usan 20px hardcoded en el template (no pasan por aquí). */\n readonly iconPx = computed<number>(() => {\n if (this.appearance() === 'cell') return 32;\n switch (this.size()) {\n case 'small': return 16;\n case 'large': return 24;\n case 'xlarge': return 28;\n default: return 20;\n }\n });\n\n /** Formato user-facing del rating value: \"4.5\" sin trailing zeros. */\n readonly valueLabel = computed(() => {\n const v = this.value();\n if (Number.isInteger(v)) return String(v);\n return v.toFixed(1).replace(/\\.0$/, '');\n });\n\n /** Formato corto del review count: 1234 → \"1.2K\", 5200 → \"5.2K\", 950 → \"950\". */\n readonly reviewCountLabel = computed(() => {\n const n = this.reviewCount();\n if (n === null || n === undefined) return null;\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(1).replace(/\\.0$/, '')}K`;\n return `${(n / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`;\n });\n\n onCellClick(index: number): void {\n if (!this.isInteractive()) return;\n /* No-op si ya estaba seleccionado — re-click NO debe limpiar a 0\n (era contra-intuitivo y el doble-click accidental disparaba reset). */\n if (this.value() === index) return;\n this.value.set(index);\n this.valueChange.emit(index);\n /* CVA: alimentar el FormControl en paralelo al model. Canal independiente —\n el model emite via [(value)]/(valueChange), _onChange via formControl. */\n this._onChange(index);\n this._onTouched();\n }\n\n onCellEnter(index: number): void {\n if (!this.isInteractive()) return;\n this.hoverIndex.set(index);\n }\n\n onCellLeave(): void {\n if (!this.isInteractive()) return;\n this.hoverIndex.set(null);\n }\n\n // ── ControlValueAccessor ───────────────────────────────────────────\n /** El form pisa el value programáticamente → escribe el model interno.\n * Coerciona a number; null/undefined/NaN → 0 (sin selección). */\n writeValue(v: number | null | undefined): void {\n const n = typeof v === 'number' && !Number.isNaN(v) ? v : 0;\n this.value.set(n);\n }\n\n registerOnChange(fn: (v: number) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByForm.set(isDisabled);\n }\n\n /** Map del fill al icon name de Remix. */\n iconName(type: SuiRatingType, fill: 'empty' | 'half' | 'full'): string {\n /* Consistencia de familia de glyph: el heart outline y el relleno deben ser\n el MISMO corazón. heart-3-line (outline) ↔ heart-3-fill (relleno) — antes el\n empty usaba heart-line (corazón distinto), que rompía la silueta al pasar a\n hover/selected.\n half del heart: Figma (Rating Items 532:4150) dibuja un MEDIO corazón (mitad\n izquierda rellena, derecha contorno), igual que la media estrella. RemixIcon\n NO tiene heart-half, así que se usa el custom 'heart-half-fill' (SVG del path\n exacto de Figma, registrado en SUI_CUSTOM_ICONS). Antes caía a heart-3-line\n (corazón vacío completo) → no se veía el medio corazón en halfStep. */\n const map: Record<'star' | 'heart', { empty: string; half: string; full: string }> = {\n star: { empty: 'star-line', half: 'star-half-fill', full: 'star-fill' },\n heart: { empty: 'heart-3-line', half: 'heart-half-fill', full: 'heart-3-fill' },\n };\n if (type === 'emoji' || type === 'number') return '';\n return map[type][fill];\n }\n\n /**\n * Icon name para una celda de bar/bar-area según su estado visual (Figma 535:4535).\n * El glyph de HOVER (\"Empty Filled\") y SELECTED (\"Full\") es el mismo relleno sólido\n * (star-fill / heart-3-fill); la diferencia es SOLO de color, que la maneja el SCSS\n * (data-cell-state). DEFAULT usa el outline (star-line / heart-3-line).\n */\n barIconName(type: SuiRatingType, cellState: SuiRatingCellState): string {\n if (type === 'emoji' || type === 'number') return '';\n // hover y selected → relleno sólido; default → outline.\n const fill: 'empty' | 'full' = cellState === 'default' ? 'empty' : 'full';\n return this.iconName(type, fill);\n }\n\n onReasonInput(event: Event): void {\n const value = (event.target as HTMLTextAreaElement | null)?.value ?? '';\n this.reason.set(value);\n }\n\n /** Marca el control como touched (blur del textarea en bar-area). `reason` no\n * entra al CVA, pero el blur del área sí cuenta como interacción del control. */\n onTouched(): void {\n this._onTouched();\n }\n}\n","@switch (appearance()) {\n\n @case ('inline') {\n @if (alignment() === 'vertical') {\n <div class=\"sui-rating__icons\">\n @for (cell of cells(); track cell.index) {\n <ng-container *ngTemplateOutlet=\"iconCell; context: { $implicit: cell }\" />\n }\n </div>\n @if (showValue() || reviewCount() !== null || reviewLink()) {\n <div class=\"sui-rating__meta sui-rating__meta--vertical\">\n <ng-container *ngTemplateOutlet=\"metaContent\" />\n </div>\n }\n } @else if (alignment() === 'horizontal') {\n <div class=\"sui-rating__icons\">\n @for (cell of cells(); track cell.index) {\n <ng-container *ngTemplateOutlet=\"iconCell; context: { $implicit: cell }\" />\n }\n </div>\n @if (showValue() || reviewCount() !== null || reviewLink()) {\n <div class=\"sui-rating__meta sui-rating__meta--horizontal\">\n <ng-container *ngTemplateOutlet=\"metaContent\" />\n </div>\n }\n } @else {\n @for (cell of cells(); track cell.index) {\n <ng-container *ngTemplateOutlet=\"iconCell; context: { $implicit: cell }\" />\n }\n }\n }\n\n @case ('cell') {\n <div class=\"sui-rating__cells\" (mouseleave)=\"onCellLeave()\">\n @for (cell of cells(); track cell.index) {\n <ng-container *ngTemplateOutlet=\"iconCell; context: { $implicit: cell }\" />\n }\n </div>\n }\n\n @case ('bar') {\n <ng-container *ngTemplateOutlet=\"barRow\" />\n }\n\n @case ('bar-area') {\n <div class=\"sui-rating__area\">\n <ng-container *ngTemplateOutlet=\"barRow\" />\n <div class=\"sui-rating__area-input\">\n @if (readonly()) {\n <p class=\"sui-rating__area-text\" [class.sui-rating__area-text--placeholder]=\"!reason()\">\n {{ reason() || reasonPlaceholder() }}\n </p>\n } @else {\n <textarea\n class=\"sui-rating__area-textarea\"\n [rows]=\"reasonRows()\"\n [value]=\"reason()\"\n [placeholder]=\"reasonPlaceholder()\"\n [disabled]=\"disabledByForm()\"\n [attr.aria-label]=\"reasonPlaceholder()\"\n (input)=\"onReasonInput($event)\"\n (blur)=\"onTouched()\"></textarea>\n }\n </div>\n </div>\n }\n}\n\n<!-- Bar row (5 cells horizontal). Reusada por appearance='bar' y 'bar-area'. -->\n<ng-template #barRow>\n <div class=\"sui-rating__bar\" (mouseleave)=\"onCellLeave()\">\n @for (cell of cells(); track cell.index) {\n @if (readonly()) {\n <div\n class=\"sui-rating__bar-cell\"\n [attr.data-fill]=\"cell.fill\"\n [attr.data-cell-state]=\"cell.cellState\"\n role=\"radio\"\n [attr.aria-checked]=\"value() === cell.index\"\n [attr.aria-label]=\"cell.index + ' de ' + max()\">\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: cell }\" />\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"sui-rating__bar-cell\"\n [attr.data-fill]=\"cell.fill\"\n [attr.data-cell-state]=\"cell.cellState\"\n [attr.data-selected]=\"value() === cell.index\"\n [disabled]=\"disabledByForm()\"\n role=\"radio\"\n [attr.aria-checked]=\"value() === cell.index\"\n [attr.aria-label]=\"cell.index + ' de ' + max()\"\n (click)=\"onCellClick(cell.index)\"\n (mouseenter)=\"onCellEnter(cell.index)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <ng-container *ngTemplateOutlet=\"cellContent; context: { $implicit: cell }\" />\n </button>\n }\n }\n </div>\n</ng-template>\n\n<!-- Single icon (inline appearance). -->\n<ng-template #iconCell let-cell>\n @if (readonly()) {\n <span\n class=\"sui-rating__icon\"\n [attr.data-fill]=\"cell.fill\"\n [attr.data-cell-state]=\"cell.cellState\"\n role=\"radio\"\n [attr.aria-checked]=\"value() === cell.index\"\n [attr.aria-label]=\"cell.index + ' de ' + max()\">\n <sui-icon [name]=\"iconName(type(), cell.fill)\" [size]=\"iconPx()\" />\n </span>\n } @else {\n <button\n type=\"button\"\n class=\"sui-rating__icon\"\n [attr.data-fill]=\"cell.fill\"\n [attr.data-cell-state]=\"cell.cellState\"\n [attr.data-selected]=\"value() === cell.index\"\n [disabled]=\"disabledByForm()\"\n role=\"radio\"\n [attr.aria-checked]=\"value() === cell.index\"\n [attr.aria-label]=\"cell.index + ' de ' + max()\"\n (click)=\"onCellClick(cell.index)\"\n (mouseenter)=\"onCellEnter(cell.index)\"\n (mouseleave)=\"onCellLeave()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <sui-icon [name]=\"iconName(type(), cell.fill === 'empty' ? 'empty' : 'full')\" [size]=\"iconPx()\" />\n </button>\n }\n</ng-template>\n\n<!-- Cell content (bar / bar-area appearance): según type.\n star/heart usan barIconName(cellState) para distinguir:\n default → outline | hover → relleno gris (Empty Filled) | selected → relleno color. -->\n<ng-template #cellContent let-cell>\n @switch (type()) {\n @case ('star') {\n <sui-icon [name]=\"barIconName('star', cell.cellState)\" [size]=\"20\" />\n }\n @case ('heart') {\n <sui-icon [name]=\"barIconName('heart', cell.cellState)\" [size]=\"20\" />\n }\n @case ('emoji') {\n <sui-emoji class=\"sui-rating__emoji\" [name]=\"cell.emoji\" size=\"sm\" />\n }\n @case ('number') {\n <span class=\"sui-rating__number\">{{ cell.index }}</span>\n }\n }\n</ng-template>\n\n<!-- Meta (value + reviewCount + link), inline appearance only -->\n<ng-template #metaContent>\n @if (showValue()) {\n <span class=\"sui-rating__value\">{{ valueLabel() }}</span>\n }\n @if (showValue() && reviewCount() !== null) {\n <span class=\"sui-rating__sep\" aria-hidden=\"true\">∙</span>\n }\n @if (reviewCount() !== null) {\n <span class=\"sui-rating__count\">{{ reviewCountLabel() }} Ratings</span>\n }\n @if (reviewLink(); as link) {\n @if (link.href) {\n <a class=\"sui-rating__link\" [href]=\"link.href\">{{ link.label }}</a>\n } @else {\n <button type=\"button\" class=\"sui-rating__link\">{{ link.label }}</button>\n }\n }\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport type { SuiColorDotColor } from '../sui-color-dot/sui-color-dot';\n\n/**\n * Tipos de item del Rich Editor toolbar.\n * Figma 166251:2701 \"Rich Editor Items [1.1]\" — 4 tipos × 3 estados = 12 variants.\n * - `text` → label (Label/Small, sub-600 / strong-950 active) + flecha. Ej \"Header\", \"14px\".\n * - `dropdown` → icono (20×20) + flecha. Ej formato con menú (B con caret).\n * - `icon` → solo icono 20×20. Ej B / I / U / S / chat / link / @.\n * - `color` → color dot (16×16) + flecha. Selector de color de texto.\n */\nexport type SuiRichEditorItemType = 'text' | 'dropdown' | 'icon' | 'color';\n\n/**\n * Estado visual del item (eje de interacción de Figma 166251:2701):\n * - `default` → bg blanco, flecha down, texto sub-600.\n * - `hover` → bg/weak-50, flecha down (sin cambio de flecha vs default).\n * - `active` → bg/weak-50, flecha UP (text/color), icono primary (icon/dropdown),\n * texto strong-950.\n */\nexport type SuiRichEditorItemState = 'default' | 'hover' | 'active';\n\n/* ═══ SUI Rich Editor Item — SUI Design System 2.0 ══════════════════════\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component-set: 166251:2701 \"Rich Editor Items [1.1]\" — VERIFIED via MCP 2026-05-29\n *\n * Sub-componente presentacional: un solo botón clickeable del toolbar.\n * El padre `sui-rich-editor` lo orquesta (renderiza N items por layout) y\n * controla el estado active según la selección del editor.\n *\n * EXACT specs (pulled via MCP get_design_context — node 166251:2701):\n * Container (todos los tipos): rounded 6px, overflow:clip, flex items-center.\n * Padding por tipo:\n * - text → pl-10 pr-4 py-4, gap 2px\n * - dropdown → p-4, gap 2px\n * - icon → p-4 (sin gap)\n * - color → pl-8 pr-4 py-4, gap 2px\n * Background:\n * - default → bg/white-0 (#fff)\n * - hover / active → bg/weak-50 (#f7f7f7)\n * Label (tipo text): Label/Small 14/500/20 ls -0.084px (Figma -0.6 / 14·... → tracking exacto)\n * - default / hover → text/sub-600 (#5c5c5c)\n * - active → text/strong-950 (#171717)\n * Caret:\n * - text / color → arrow-down-s-fill (default/hover) / arrow-up-s-fill (active)\n * - dropdown → arrow-down-s-fill (default/hover) / arrow-up-s-fill (active)\n * - icon → SIN caret\n * Icono (tipo icon / dropdown): 20×20, icon/sub-600 (#5c5c5c) default/hover.\n * En active el icono pasa a primary (Figma muestra el glyph en azul — node\n * 166261:22221 / 166261:22218). Ver `iconColorActive`.\n * Color dot (tipo color): se delega a `<sui-color-dot>` (ya homologado,\n * node 3365:22464) — dot 16×16, mismos 10 colores canon.\n *\n * iOS :active fix: host es clickeable custom (page standalone) → touchstart/touchend.\n * ══════════════════════════════════════════════════════════════════════════ */\n@Component({\n selector: 'sui-rich-editor-item',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-rich-editor-item.html',\n styleUrl: './sui-rich-editor-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.role]': '\"button\"',\n '[attr.aria-label]': 'ariaLabel() || label() || icon() || null',\n '[attr.aria-pressed]': 'state() === \"active\" ? \"true\" : null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-state]': 'state()',\n /* La PRESENCIA del binding touchstart engage el touch pipeline iOS;\n touchend.blur() fuerza la deselección inmediata (CLAUDE.md). */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiRichEditorItem {\n /** Tipo de item. Default `icon` (caso más común en el toolbar). */\n readonly type = input<SuiRichEditorItemType>('icon');\n\n /** Estado visual. El padre lo setea según la selección activa del editor. */\n readonly state = input<SuiRichEditorItemState>('default');\n\n /** Label del item tipo `text` (ej. \"Header\", \"14px\"). */\n readonly label = input<string>('');\n\n /**\n * Nombre RemixIcon del icono (tipos `icon` y `dropdown`).\n * Ej. 'bold', 'italic', 'underline', 'strikethrough', 'align-left',\n * 'chat-1-line', 'link', 'at-line', 'more-2-line'.\n */\n readonly icon = input<string>('');\n\n /** Color preset del dot (tipo `color`). */\n readonly color = input<SuiColorDotColor>('gray');\n\n /** Hex custom del dot (tipo `color`) — override del preset. */\n readonly colorHex = input<string | null>(null);\n\n /** aria-label override (útil para items icon-only). */\n readonly ariaLabel = input<string>('');\n\n /** Deshabilita el item (sin pointer events, sin emit). */\n readonly disabled = input(false);\n\n /** Click del item (no emite si disabled). */\n readonly clicked = output<void>();\n\n /** True cuando el caret debe apuntar hacia arriba (active en text/dropdown/color). */\n readonly caretUp = computed(() => this.state() === 'active');\n\n /** Nombre del icono del caret según el estado. */\n readonly caretIcon = computed(() =>\n this.caretUp() ? 'arrow-up-s-fill' : 'arrow-down-s-fill',\n );\n\n /** True para tipos que muestran caret (text, dropdown, color — NO icon). */\n readonly hasCaret = computed(() => this.type() !== 'icon');\n\n /** True para mostrar el glyph principal (icon, dropdown). */\n readonly hasIcon = computed(\n () => this.type() === 'icon' || this.type() === 'dropdown',\n );\n\n protected onClick(): void {\n if (this.disabled()) return;\n this.clicked.emit();\n }\n}\n","<button\n type=\"button\"\n class=\"sui-rich-editor-item__btn\"\n [disabled]=\"disabled() || null\"\n (click)=\"onClick()\"\n>\n <!-- Color dot (tipo color) — dot plano 16×16 (Figma 166331:4099).\n NOTA: el sui-color-dot canon es 24×24 con ring de selección; aquí el\n Rich Editor muestra solo el dot 16×16 sin ring, por eso se pinta inline\n con el mismo set de 10 colores canon (data-sui-color → token). -->\n @if (type() === 'color') {\n <span\n class=\"sui-rich-editor-item__dot\"\n [attr.data-sui-color]=\"colorHex() ? null : color()\"\n [style.background]=\"colorHex() || null\"\n ></span>\n }\n\n <!-- Glyph principal (tipo icon / dropdown) -->\n @if (hasIcon() && icon()) {\n <sui-icon class=\"sui-rich-editor-item__icon\" [name]=\"icon()\" [size]=\"20\" />\n }\n\n <!-- Label (tipo text) -->\n @if (type() === 'text') {\n <span class=\"sui-rich-editor-item__label\">{{ label() }}</span>\n }\n\n <!-- Caret (text / dropdown / color — nunca icon) -->\n @if (hasCaret()) {\n <sui-icon class=\"sui-rich-editor-item__caret\" [name]=\"caretIcon()\" [size]=\"20\" />\n }\n</button>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport {\n SuiRichEditorItem,\n type SuiRichEditorItemType,\n} from './sui-rich-editor-item';\n\n/**\n * Layout del toolbar (Figma 166926:17605 \"Rich Editor [1.1]\" — eje\n * \"Toolbar Layout\" con 4 variantes):\n * - `full` (01) → Header ▾ | 14px ▾ | B I U S | align ▾ | chat link @ | ⋮\n * - `compact` (02) → Header ▾ | 14px ▾ | ⋮\n * - `formatting` (03) → B I U S | align ▾ | ⋮\n * - `social` (04) → chat link @ | ⋮\n */\nexport type SuiRichEditorLayout = 'full' | 'compact' | 'formatting' | 'social';\n\n/**\n * Comando de formato emitido al hacer click en un item del toolbar.\n *\n * Cubre EXACTAMENTE los items que renderizan los 4 layouts de Figma\n * (166926:17605). No incluye `color`: aunque el sub-componente\n * `sui-rich-editor-item` tiene un `type='color'` documentado (166251:2701),\n * ningún layout del toolbar lo usa, así que el padre nunca emite ese comando.\n */\nexport type SuiRichEditorCommand =\n | 'heading'\n | 'fontSize'\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strikeThrough'\n | 'align'\n | 'comment'\n | 'link'\n | 'mention'\n | 'more';\n\n/** Evento emitido por la toolbar cuando se acciona un comando. */\nexport interface SuiRichEditorAction {\n command: SuiRichEditorCommand;\n /** True si el comando dejó el estado activo tras el toggle. */\n active: boolean;\n}\n\n/* ═══ SUI Rich Editor — SUI Design System 2.0 ═══════════════════════════\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component-set: 166926:17605 \"Rich Editor [1.1]\" — VERIFIED via MCP 2026-05-29\n * · Toolbar Layout: 01 Full / 02 Compact / 03 Icon-formatting / 04 Icon-social\n * · ShowMore: boolean (divider + more-2-line al final)\n * Sub-componente: 166251:2701 \"Rich Editor Items [1.1]\" → sui-rich-editor-item\n * Color dots: 166331:4100 \"Rich Editor Colors [1.1]\" → dot inline 16×16\n *\n * Componente NUEVO y COMPLEJO (WYSIWYG). Compone Dropdown/Popover/Tooltip/Color\n * Picker (homologados) para la toolbar, + un área editable nativa (contenteditable).\n *\n * ── ARQUITECTURA ──\n * :host\n * ├── .sui-rich-editor__toolbar (pill flotante, Figma shell)\n * │ └── N × <sui-rich-editor-item> + dividers, por layout\n * └── .sui-rich-editor__editable (contenteditable, opcional)\n *\n * EXACT specs del toolbar shell (Figma 166926:17605):\n * - bg/white-0, border 1px stroke/soft-200, radius 8px, overflow:clip\n * - padding 2px, gap 2px entre items\n * - shadow = regular-shadow/x-small (0 1px 2px rgba(10,13,20,.03))\n * - Divider vertical entre grupos: 4px ancho × 16px alto, stroke/soft-200\n * - showMore (default true): divider + item icon `more-2-line` al final\n *\n * ── EDICIÓN RICA (contenteditable nativo) — PENDING VERIFY ──\n * Se usa `contenteditable` + `document.execCommand` (deprecated pero aún el\n * camino más liviano sin lib externa). Cubre bold/italic/underline/strike/\n * align básicos. Limitaciones conocidas:\n * - execCommand está deprecado; el estado active se lee con queryCommandState\n * que NO es 100% fiable cross-browser.\n * - heading / fontSize / link / color / mention quedan como hooks que emiten\n * el comando hacia el consumer (output `action`) — la UI de selección\n * (dropdown de headings, panel de color, modal de link) NO está incluida\n * en este v1 del componente; el consumer la provee.\n * Para PRODUCCIÓN seria conviene Tiptap/ProseMirror (ver newQuestions del reporte).\n * El foco de este componente es la TOOLBAR pixel-fiel; la lógica rica es parcial.\n *\n * iOS :active fix: los items son clickeables custom → el sui-rich-editor-item ya\n * incluye touchstart/touchend en su host.\n * ══════════════════════════════════════════════════════════════════════════ */\n@Component({\n selector: 'sui-rich-editor',\n standalone: true,\n imports: [SuiRichEditorItem],\n templateUrl: './sui-rich-editor.html',\n styleUrl: './sui-rich-editor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-layout]': 'layout()',\n '[attr.data-sui-show-more]': 'showMore() ? \"\" : null',\n '[attr.data-sui-editable]': 'editable() ? \"\" : null',\n },\n})\nexport class SuiRichEditor {\n /** Layout del toolbar (4 variantes Figma). Default `full`. */\n readonly layout = input<SuiRichEditorLayout>('full');\n\n /** Muestra el divider + botón `more-2-line` (overflow) al final. Default true. */\n readonly showMore = input(true);\n\n /**\n * Renderiza el área editable (contenteditable) bajo la toolbar.\n * - false (default): solo la toolbar flotante (matchea Figma, que solo\n * muestra la formatting bar). Útil cuando el editable lo provee el consumer.\n * - true: incluye un `<div contenteditable>` con placeholder.\n */\n readonly editable = input(false);\n\n /** Placeholder del área editable. */\n readonly placeholder = input<string>('Escribe algo…');\n\n /** Contenido HTML del editable. Two-way `[(value)]`. */\n readonly value = model<string>('');\n\n /** Label de heading mostrado en el item tipo text (layout full/compact). */\n readonly headingLabel = input<string>('Header');\n\n /** Label de tamaño de fuente mostrado en el item tipo text. */\n readonly fontSizeLabel = input<string>('14px');\n\n /** Emitido cada vez que se acciona un comando del toolbar. */\n readonly action = output<SuiRichEditorAction>();\n\n /** Emitido cuando cambia el contenido del editable. */\n readonly valueChange = output<string>();\n\n /** Ref al área editable (cuando editable=true). */\n private readonly editableRef =\n viewChild<ElementRef<HTMLElement>>('editableEl');\n\n /**\n * Set de comandos actualmente activos (bold/italic/etc.).\n * Lo refleja el sui-rich-editor-item via `state='active'`.\n */\n private readonly _active = signal<ReadonlySet<SuiRichEditorCommand>>(\n new Set(),\n );\n readonly activeCommands = computed(() => this._active());\n\n /** Layout helpers — qué grupos de items mostrar. */\n readonly showTextGroup = computed(\n () => this.layout() === 'full' || this.layout() === 'compact',\n );\n readonly showFormatGroup = computed(\n () => this.layout() === 'full' || this.layout() === 'formatting',\n );\n readonly showAlignGroup = computed(\n () => this.layout() === 'full' || this.layout() === 'formatting',\n );\n readonly showSocialGroup = computed(\n () => this.layout() === 'full' || this.layout() === 'social',\n );\n\n /** True cuando el editable está vacío (para mostrar placeholder via CSS). */\n readonly isEmpty = signal(true);\n\n constructor() {\n /* Sincroniza el value externo → innerHTML del editable (sin pisar el\n cursor del usuario: solo escribe si difiere del DOM actual). */\n effect(() => {\n const el = this.editableRef()?.nativeElement;\n if (!el) return;\n const next = this.value();\n if (el.innerHTML !== next) {\n el.innerHTML = next;\n }\n this.isEmpty.set(this.stripHtml(next).length === 0);\n });\n }\n\n /** Devuelve el estado del item para un comando dado. */\n itemState(command: SuiRichEditorCommand): 'default' | 'active' {\n return this._active().has(command) ? 'active' : 'default';\n }\n\n /**\n * Maneja el click de un item del toolbar.\n * - Comandos de formato inline (bold/italic/underline/strikeThrough) →\n * togglean via execCommand y reflejan el estado active.\n * - Comandos con UI propia (heading/fontSize/align/link/color/mention/more) →\n * solo emiten `action` para que el consumer abra su selector.\n */\n onCommand(command: SuiRichEditorCommand): void {\n const inlineMap: Partial<Record<SuiRichEditorCommand, string>> = {\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n strikeThrough: 'strikeThrough',\n };\n\n const execName = inlineMap[command];\n if (execName && this.editable() && typeof document !== 'undefined') {\n this.focusEditable();\n try {\n // eslint-disable-next-line deprecation/deprecation\n document.execCommand(execName, false);\n } catch {\n /* execCommand puede no estar disponible — degradar silenciosamente. */\n }\n this.syncActiveFromSelection();\n this.emitValue();\n } else {\n // Toggle local del estado active (para comandos con UI propia, así el\n // item muestra feedback visual aunque la UI la provea el consumer).\n this.toggleActive(command);\n }\n\n this.action.emit({ command, active: this._active().has(command) });\n }\n\n /** Toggle del estado active de un comando (uso interno). */\n private toggleActive(command: SuiRichEditorCommand): void {\n const next = new Set(this._active());\n if (next.has(command)) next.delete(command);\n else next.add(command);\n this._active.set(next);\n }\n\n /** Relee el estado de formato desde la selección actual del editable. */\n private syncActiveFromSelection(): void {\n if (typeof document === 'undefined') return;\n const next = new Set<SuiRichEditorCommand>();\n const probes: [SuiRichEditorCommand, string][] = [\n ['bold', 'bold'],\n ['italic', 'italic'],\n ['underline', 'underline'],\n ['strikeThrough', 'strikeThrough'],\n ];\n for (const [cmd, q] of probes) {\n try {\n // eslint-disable-next-line deprecation/deprecation\n if (document.queryCommandState(q)) next.add(cmd);\n } catch {\n /* queryCommandState no soportado — ignorar. */\n }\n }\n this._active.set(next);\n }\n\n /** Input del editable → propaga value. */\n protected onEditableInput(): void {\n this.emitValue();\n this.syncActiveFromSelection();\n }\n\n /** Selección cambia dentro del editable → refresca estado active. */\n protected onEditableSelect(): void {\n this.syncActiveFromSelection();\n }\n\n private emitValue(): void {\n const el = this.editableRef()?.nativeElement;\n if (!el) return;\n const html = el.innerHTML;\n this.value.set(html);\n this.valueChange.emit(html);\n this.isEmpty.set(this.stripHtml(html).length === 0);\n }\n\n private focusEditable(): void {\n this.editableRef()?.nativeElement?.focus();\n }\n\n private stripHtml(html: string): string {\n return html\n .replace(/<br\\s*\\/?>/gi, '')\n .replace(/<[^>]*>/g, '')\n .replace(/ /gi, '')\n .trim();\n }\n\n /** Tipo del item de un comando (para el template). */\n readonly itemType: Record<SuiRichEditorCommand, SuiRichEditorItemType> = {\n heading: 'text',\n fontSize: 'text',\n bold: 'icon',\n italic: 'icon',\n underline: 'icon',\n strikeThrough: 'icon',\n align: 'dropdown',\n comment: 'icon',\n link: 'icon',\n mention: 'icon',\n more: 'icon',\n };\n}\n","<!-- ═══ Toolbar (pill flotante) — Figma 166926:17605 ═══════════════════════ -->\n<div class=\"sui-rich-editor__toolbar\" role=\"toolbar\" aria-label=\"Formato de texto\">\n\n <!-- ── Grupo TEXT: Header + 14px (layouts full / compact) ── -->\n @if (showTextGroup()) {\n <sui-rich-editor-item\n type=\"text\"\n [label]=\"headingLabel()\"\n [state]=\"itemState('heading')\"\n ariaLabel=\"Estilo de encabezado\"\n (clicked)=\"onCommand('heading')\"\n />\n <sui-rich-editor-item\n type=\"text\"\n [label]=\"fontSizeLabel()\"\n [state]=\"itemState('fontSize')\"\n ariaLabel=\"Tamaño de fuente\"\n (clicked)=\"onCommand('fontSize')\"\n />\n }\n\n <!-- divider entre TEXT y FORMAT (solo si ambos grupos presentes: layout full) -->\n @if (showTextGroup() && showFormatGroup()) {\n <span class=\"sui-rich-editor__divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- ── Grupo FORMAT: B I U S (layouts full / formatting) ── -->\n @if (showFormatGroup()) {\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"bold\"\n [state]=\"itemState('bold')\"\n ariaLabel=\"Negrita\"\n (clicked)=\"onCommand('bold')\"\n />\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"italic\"\n [state]=\"itemState('italic')\"\n ariaLabel=\"Cursiva\"\n (clicked)=\"onCommand('italic')\"\n />\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"underline\"\n [state]=\"itemState('underline')\"\n ariaLabel=\"Subrayado\"\n (clicked)=\"onCommand('underline')\"\n />\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"strikethrough\"\n [state]=\"itemState('strikeThrough')\"\n ariaLabel=\"Tachado\"\n (clicked)=\"onCommand('strikeThrough')\"\n />\n }\n\n <!-- divider entre FORMAT y ALIGN (layout full / formatting) -->\n @if (showAlignGroup() && (showFormatGroup())) {\n <span class=\"sui-rich-editor__divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- ── Grupo ALIGN: align dropdown (layouts full / formatting) ── -->\n @if (showAlignGroup()) {\n <sui-rich-editor-item\n type=\"dropdown\"\n icon=\"align-left\"\n [state]=\"itemState('align')\"\n ariaLabel=\"Alineación\"\n (clicked)=\"onCommand('align')\"\n />\n }\n\n <!-- divider antes de SOCIAL (layout full) -->\n @if (showSocialGroup() && (showTextGroup() || showFormatGroup() || showAlignGroup())) {\n <span class=\"sui-rich-editor__divider\" aria-hidden=\"true\"></span>\n }\n\n <!-- ── Grupo SOCIAL: chat + link + @ (layouts full / social) ── -->\n @if (showSocialGroup()) {\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"chat-1-line\"\n [state]=\"itemState('comment')\"\n ariaLabel=\"Comentario\"\n (clicked)=\"onCommand('comment')\"\n />\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"link\"\n [state]=\"itemState('link')\"\n ariaLabel=\"Insertar enlace\"\n (clicked)=\"onCommand('link')\"\n />\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"at-line\"\n [state]=\"itemState('mention')\"\n ariaLabel=\"Mencionar\"\n (clicked)=\"onCommand('mention')\"\n />\n }\n\n <!-- ── More (overflow) — divider + more-2-line ── -->\n @if (showMore()) {\n <span class=\"sui-rich-editor__divider sui-rich-editor__divider--more\" aria-hidden=\"true\"></span>\n <sui-rich-editor-item\n type=\"icon\"\n icon=\"more-2-line\"\n [state]=\"itemState('more')\"\n ariaLabel=\"Más opciones\"\n (clicked)=\"onCommand('more')\"\n />\n }\n</div>\n\n<!-- ═══ Área editable (opcional) ═══════════════════════════════════════════\n Figma solo muestra la toolbar; el contenteditable es un EXTRA del componente\n para uso real. PENDING VERIFY: edición rica parcial via execCommand. -->\n@if (editable()) {\n <div\n #editableEl\n class=\"sui-rich-editor__editable\"\n contenteditable=\"true\"\n role=\"textbox\"\n aria-multiline=\"true\"\n [attr.aria-label]=\"placeholder()\"\n [attr.data-placeholder]=\"placeholder()\"\n [attr.data-empty]=\"isEmpty() ? '' : null\"\n (input)=\"onEditableInput()\"\n (keyup)=\"onEditableSelect()\"\n (mouseup)=\"onEditableSelect()\"\n ></div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\nimport { SuiDropdownMenu } from '../sui-dropdown-menu/sui-dropdown-menu';\nimport { SuiDropdownPanel } from '../sui-dropdown-menu/sui-dropdown-panel';\nimport { SuiDropdownItem } from '../sui-dropdown-item/sui-dropdown-item';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFlag, type SuiFlagName } from '../sui-flag/sui-flag';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\n\nexport type SuiSelectSize = 'xsmall' | 'small' | 'medium';\n\n/**\n * Tipo de left-decoration del trigger (Figma Select[1.1] · Type variant).\n * - basic → 📂 ícono RemixIcon genérico (placeholder: flashlight-line)\n * - country → 🌍 sui-flag (placeholder: global-line)\n * - avatar → 👨🏻 sui-avatar / imageUrl (placeholder: user-line)\n * - provider → 💳 logo/thumbnail (placeholder: bank-card-line)\n * - brand → 🎗️ logo/thumbnail (placeholder: award-line)\n * - company → 🏢 logo/thumbnail (placeholder: building-line)\n *\n * El default `'basic'` NO renderea left-icon a menos que `leftIcon` esté\n * activado o se proyecte `[slot=leading]` — preserva la API previa.\n */\nexport type SuiSelectType =\n | 'basic'\n | 'country'\n | 'avatar'\n | 'provider'\n | 'brand'\n | 'company';\n\nexport interface SuiSelectOption<T = any> {\n value: T;\n label: string;\n disabled?: boolean;\n}\n\n/**\n * SUI Select — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 270:1085 (\"Select [1.1]\") — VERIFIED via MCP get_design_context\n *\n * Sizes:\n * - xsmall (32): py=6 pl=8 pr=6 gap=6 radius=8\n * - small (36): py=8 pl=10 pr=8 gap=8 radius=8\n * - medium (40): py=10 pl=12 pr=10 gap=8 radius=10\n *\n * **Arquitectura interna**: delega el overlay menu a `sui-dropdown-menu` vía\n * `[origin]=\"triggerEl\"`. El sui-dropdown-menu encapsula CDK Overlay,\n * positioning, backdrop, ResizeObserver y detachments. El sui-select solo\n * gestiona el trigger visual, label/hint, keyboard nav y CVA.\n *\n * Trade-off del refactor: se perdió el panelClass `--above` que invertía la\n * animation slide cuando el panel se renderea encima del trigger. La\n * animation es ahora siempre top-to-bottom (no hay assertion en specs sobre\n * esto, y es un caso edge — solo aplica cuando no hay espacio abajo).\n *\n * @input label / sublabel / required / tooltip — label slot\n * @input hint / errorMessage — hint slot\n * @input error — borde rojo + muestra errorMessage en vez de hint\n * @input disabled / size / placeholder\n * @input options: SuiSelectOption<T>[]\n *\n * @input type — left-decoration kind (basic/country/avatar/provider/brand/company)\n * @input leftIcon — activa el slot de left-decoration (default false: opt-in)\n * @input leadingIcon — RemixIcon name custom para el left slot (override del default por type)\n * @input imageUrl — imagen del left slot cuando hay value (avatar/brand/provider/company logo)\n * @input badge — texto del badge inline entre value y chevron (null = sin badge)\n * Slot proyectado: `[slot=leading]` → left-decoration totalmente custom (gana sobre todo)\n *\n * @model value: T | null — two-way con FormControl via CVA\n *\n * PENDING VERIFY (Figma 8p1k72aKKvzJV4XcvPS4VO · node 270:1085):\n * - Avatar/Provider/Brand/Company \"filled\": Figma muestra el logo/thumbnail\n * real como left-decoration 20×20. SUI lo cubre vía `imageUrl` o `[slot=leading]`\n * proyectado. Los placeholder-icons por type están confirmados vía screenshot\n * (basic=flashlight, country=global, avatar=user, provider=bank-card-rect).\n * - badge: confirmado decorativo en el DS (px-8 py-2, radius-full,\n * bg state/information/lighter, text state/information/base 12/16 medium).\n * Alimentado por el input `badge` (string) — no hay signal interno.\n */\n@Component({\n selector: 'sui-select',\n templateUrl: './sui-select.html',\n styleUrl: './sui-select.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n SuiFormLabel,\n SuiFormHint,\n SuiDropdownMenu,\n SuiDropdownPanel,\n SuiDropdownItem,\n SuiIcon,\n SuiFlag,\n SuiAvatar,\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiSelect),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-open]': 'isOpen() ? \"\" : null',\n },\n})\nexport class SuiSelect<T = any> implements ControlValueAccessor {\n readonly size = input<SuiSelectSize>('medium');\n readonly placeholder = input('Seleccionar...');\n readonly options = input<SuiSelectOption<T>[]>([]);\n readonly disabled = input(false);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n readonly label = input<string | null>(null);\n readonly hint = input<string | null>(null);\n\n /** Tipo de left-decoration del trigger (Figma Select[1.1] Type variant). */\n readonly type = input<SuiSelectType>('basic');\n /** Activa el slot de left-decoration. Default false (opt-in, preserva API previa). */\n readonly leftIcon = input(false);\n /** RemixIcon name custom para el left slot (override del default-por-type). */\n readonly leadingIcon = input<string | null>(null);\n /** sui-flag name para `type=\"country\"` (override; sino el option selected puede traerla). */\n readonly flag = input<SuiFlagName | null>(null);\n /** Imagen del left slot cuando hay value (avatar/brand/provider/company logo). */\n readonly imageUrl = input<string | null>(null);\n /** Texto del badge inline entre value y chevron (null = sin badge). */\n readonly badge = input<string | null>(null);\n\n /** Texto secundario del label (ej. \"Optional\", \"Required\") */\n readonly sublabel = input<string | null>(null);\n /** Muestra asterisco rojo en el label */\n readonly required = input(false);\n /** Tooltip en ícono info del label */\n readonly tooltip = input<string | null>(null);\n\n readonly value = model<T | null>(null);\n readonly isOpen = signal(false);\n\n /** Index of the keyboard-highlighted option inside the open dropdown */\n readonly highlightedIndex = signal(-1);\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** Label of the currently selected option (shown in trigger) */\n readonly selectedLabel = computed(() => {\n const v = this.value();\n if (v === null || v === undefined) return null;\n return this.options().find((o) => o.value === v)?.label ?? null;\n });\n\n /**\n * RemixIcon de placeholder por type — Figma confirma uno distinto por type\n * en el state Default/empty (basic=flashlight, country=global, avatar=user,\n * provider=bank-card, brand=award, company=building).\n */\n private readonly _defaultIconByType: Record<SuiSelectType, string> = {\n basic: 'flashlight-line',\n country: 'global-line',\n avatar: 'user-line',\n provider: 'bank-card-line',\n brand: 'award-line',\n company: 'building-line',\n };\n\n /** Icono efectivo del left slot: custom > default-por-type. */\n readonly leadingIconName = computed(\n () => this.leadingIcon() ?? this._defaultIconByType[this.type()],\n );\n\n /** Muestra la imagen (avatar/logo) en vez del ícono cuando hay imageUrl. */\n readonly showLeadingImage = computed(() => !!this.imageUrl());\n\n /** Trigger element — pasado al sui-dropdown-menu como [origin]. */\n protected readonly triggerEl = viewChild.required<ElementRef<HTMLElement>>('triggerEl');\n\n /** Ref al sui-dropdown-menu interno — para invocar open/close/toggle. */\n private readonly _menu = viewChild<SuiDropdownMenu>(SuiDropdownMenu);\n\n private _onChange: (v: T | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n // ── Toggle ──────────────────────────────────────────────────────────────\n toggleOpen(): void {\n if (this.isDisabled()) return;\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n open(): void {\n if (this.isDisabled()) return;\n if (this.isOpen()) return;\n /* Pre-highlight current selection ANTES de abrir el menu — el effect del\n sui-dropdown-menu sincroniza isOpen vía openedChange después del attach. */\n const idx = this.options().findIndex((o) => o.value === this.value());\n this.highlightedIndex.set(idx >= 0 ? idx : 0);\n this._menu()?.open();\n }\n\n close(): void {\n if (!this.isOpen()) return;\n this._menu()?.close();\n /* isOpen, highlightedIndex y _onTouched se sincronizan en onMenuOpenedChange(false)\n — single point of truth para TODOS los closes (programático, backdrop, Esc, detach). */\n }\n\n /**\n * Sincroniza state interno con el sui-dropdown-menu. Cubre los 4 paths de\n * close: programmatic close(), backdrop click, Escape key, detachments\n * (disposeOnNavigation, destroy externo).\n */\n protected onMenuOpenedChange(open: boolean): void {\n this.isOpen.set(open);\n if (!open) {\n this.highlightedIndex.set(-1);\n this._onTouched();\n }\n }\n\n // ── Select option ────────────────────────────────────────────────────────\n select(option: SuiSelectOption<T>): void {\n if (option.disabled) return;\n this.value.set(option.value);\n this._onChange(option.value);\n this._onTouched();\n this.close();\n }\n\n // ── Keyboard navigation ──────────────────────────────────────────────────\n @HostListener('keydown', ['$event'])\n onKeydown(e: KeyboardEvent): void {\n if (this.isDisabled()) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!this.isOpen()) {\n this.open();\n } else {\n const idx = this.highlightedIndex();\n const opt = this.options()[idx];\n if (opt) this.select(opt);\n }\n break;\n\n case 'ArrowDown':\n e.preventDefault();\n if (!this.isOpen()) {\n this.open();\n } else {\n this._moveHighlight(1);\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!this.isOpen()) {\n this.open();\n } else {\n this._moveHighlight(-1);\n }\n break;\n\n case 'Escape':\n if (this.isOpen()) {\n e.preventDefault();\n this.close();\n }\n break;\n\n case 'Tab':\n if (this.isOpen()) this.close();\n break;\n }\n }\n\n // ── CVA ──────────────────────────────────────────────────────────────────\n writeValue(v: T | null): void {\n this.value.set(v ?? null);\n }\n\n registerOnChange(fn: (v: T | null) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n private _moveHighlight(delta: number): void {\n const opts = this.options();\n if (!opts.length) return;\n let next = this.highlightedIndex() + delta;\n // Skip disabled options\n let attempts = opts.length;\n while (attempts-- > 0) {\n if (next < 0) next = opts.length - 1;\n if (next >= opts.length) next = 0;\n if (!opts[next].disabled) break;\n next += delta;\n }\n this.highlightedIndex.set(next);\n }\n}\n","@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n [size]=\"size()\"\n class=\"sui-select__label-host\"\n (click)=\"toggleOpen()\"\n />\n}\n\n<div\n #triggerEl\n class=\"sui-select__trigger\"\n [class.sui-select__trigger--error]=\"error()\"\n [class.sui-select__trigger--disabled]=\"isDisabled()\"\n [class.sui-select__trigger--open]=\"isOpen()\"\n [class.sui-select__trigger--filled]=\"selectedLabel() !== null\"\n role=\"combobox\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.tabindex]=\"isDisabled() ? '-1' : '0'\"\n (click)=\"toggleOpen()\"\n>\n <!--\n Left decoration (Figma Select[1.1] Type variant). Prioridad:\n 1. slot proyectado [slot=leading] (custom total)\n 2. imageUrl (avatar/logo del filled state)\n 3. flag (type=country)\n 4. RemixIcon por type (placeholder / basic)\n Solo se renderea si leftIcon=true O hay proyección/imageUrl/flag.\n -->\n @if (leftIcon() || imageUrl() || flag()) {\n <span class=\"sui-select__leading\">\n <ng-content select=\"[slot=leading]\" />\n @if (showLeadingImage()) {\n @if (type() === 'avatar') {\n <sui-avatar size=\"xs\" [src]=\"imageUrl()\" />\n } @else {\n <img class=\"sui-select__leading-img\" [src]=\"imageUrl()\" alt=\"\" />\n }\n } @else if (type() === 'country' && flag()) {\n <sui-flag class=\"sui-select__leading-flag\" [name]=\"flag()!\" size=\"md\" />\n } @else {\n <sui-icon class=\"sui-select__leading-icon\" [name]=\"leadingIconName()\" [size]=\"20\" />\n }\n </span>\n }\n\n <span class=\"sui-select__value\">\n @if (selectedLabel()) {\n {{ selectedLabel() }}\n } @else {\n <span class=\"sui-select__placeholder\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Badge inline opcional (Figma: entre value y chevron, radius-full). -->\n @if (badge()) {\n <span class=\"sui-select__badge\">{{ badge() }}</span>\n }\n\n <!-- Figma: arrow-down-s-line at 20×20 (size-[20px]) — verified nodeId 270:1091 -->\n <sui-icon\n class=\"sui-select__chevron\"\n name=\"arrow-down-s-line\"\n [size]=\"20\"\n aria-hidden=\"true\"\n />\n</div>\n\n@if (error() ? errorMessage() : hint()) {\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [size]=\"size()\"\n class=\"sui-select__hint-host\"\n />\n}\n\n<!--\n Overlay menu — delegado a sui-dropdown-menu via [origin]=triggerEl.\n El sui-dropdown-menu encapsula CDK Overlay, positioning, backdrop,\n ResizeObserver y detachments. El trigger lo maneja este componente.\n-->\n<sui-dropdown-menu\n [origin]=\"triggerEl\"\n [disabled]=\"isDisabled()\"\n [matchWidth]=\"true\"\n panelClass=\"sui-select__overlay-pane\"\n (openedChange)=\"onMenuOpenedChange($event)\"\n>\n <ng-template suiDropdownPanel>\n <div\n class=\"sui-select__panel\"\n [class.sui-select__panel--xsmall]=\"size() === 'xsmall'\"\n [class.sui-select__panel--small]=\"size() === 'small'\"\n [class.sui-select__panel--medium]=\"size() === 'medium'\"\n role=\"listbox\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n @for (option of options(); track option.value; let i = $index) {\n <sui-dropdown-item\n mode=\"option\"\n [label]=\"option.label\"\n [selected]=\"option.value === value()\"\n [highlighted]=\"highlightedIndex() === i\"\n [disabled]=\"!!option.disabled\"\n (clicked)=\"select(option)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n />\n }\n </div>\n </ng-template>\n</sui-dropdown-menu>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n model,\n output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiAvatar, type SuiAvatarStatus } from '../sui-avatar/sui-avatar';\nimport { SuiBadge } from '../sui-badge/sui-badge';\n\n/* ═══ SUI Sidebar — SUI Design System 2.0 ═══════════════════════════\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component: Sidebar [Navigation] [1.1] — node 3802:11759\n * - Collapsed=Off → 3802:11758 (base, 272px)\n * - Collapsed=On → 3802:11757 (icon-only, 80px)\n * - FeatureCard=On → 3802:11755 (promo card slot anclado al fondo del content)\n *\n * EXACT (pulled from Figma, verified — node 3802:11758):\n * - Header outer pad 12, inner card pad 12, gap 12, radius 10\n * - Brand logo 40×40 rounded-full\n * - Brand name 14/20 medium strong-950, letter-spacing -0.084px (= -0.006em)\n * - Brand subtitle 12/16 regular sub-600\n * - Header Compact Button: expand-up-down-line (workspace switcher), pad 2,\n * radius 6, border stroke-soft-200, shadow regular-shadow-x-small\n * - Header bottom divider inset 20px L/R\n * - Content padding 20 top / 16 bottom / 20 sides, gap 20 between sections\n * - Section label (\"Text Divider\"): pad 4, 12/16 medium UPPERCASE,\n * letter-spacing 0.48px (= 0.04em), color text-soft-400\n * - Main Content section gap 8; Side/Supporting Content section gap 6\n * - Nav item: pad 8/12, gap 8, radius 8, icon 20×20, label 14/20 medium sub-600\n * - Active item: bg weak-50 + label strong-950 + indicator bar 4×20\n * rounded-right at left:-20px + arrow-right-s-line (chevron) a la derecha.\n * Color del indicator en Figma = primary-base #335cff (azul).\n * - Shortcut pill: border stroke-soft-200, pad 6/2, radius 4, 12/16 medium\n * UPPERCASE soft-400 (ej. ⌘1)\n * - Color-dot icon (Side Content \"FAVS\"): Chart Legend Dots — círculo de\n * color 20×20 como icono en vez de RemixIcon.\n * - Supporting Content: flex:1 + justify-end → ancla items al fondo (Settings/\n * Support). En SUI lo expone supportingItems + supportingAnchorBottom.\n * - Footer pad 12, optional top divider inset 20 L/R\n * - Profile card: pad 12, gap 12, radius 10, avatar 40, name 14/20, email 12/16,\n * verified-fill badge (state-verified-base #47c2ff) + Compact Button dropdown\n * (arrow-right-s-line) opcional.\n *\n * DEVIATIONS (conscientes, master-pedidos brand — requieren sign-off del user):\n * - DEVIATION 1.20: container width = 240px (Figma original = 272px). Decisión\n * consciente de compactar para más content area. SIN sign-off de design.\n * - DEVIATION color: indicator bar default = --sui-primary-base (naranja brand —\n * el accent del DS es la marca Master Pedidos, ver DECISIONES.md §1). El consumer\n * puede pasar indicatorColor='information' para el azul Figma canon de SUI.\n * - Mobile drawer (transform translateX + radius 0 24 24 0 + shadow): NO existe\n * en Figma (desktop only). Inferido para Capacitor — convención mobile-app.\n * - Backdrop opacity 0.4 + fade-in 200ms: convención.\n *\n * COLLAPSED=On (80px icon-only — Figma 3802:11756, homologado):\n * - Section labels (MAIN/OTHERS) SIGUEN visibles, centrados (text-align:center,\n * padding 4px 0). NO se ocultan — Figma los renderea dentro del bar de 80px.\n * - Content padding-inline reducido a 12px (vs 20px expandido): zona interna\n * de 56px (80 − 2×12) que matchea Figma.\n * - Indicator bar del item activo: left:-12px → flush contra el border izquierdo\n * del sidebar (x=0→4). El content (overflow-y:auto) fuerza overflow-x clip en\n * el padding box (x=0), así que la barra queda pegada al borde, no flotando.\n *\n * PENDING VERIFY:\n * - Collapsed=On (80px icon-only): tooltip en hover sobre cada item usa el\n * atributo title nativo del <a>/<button> interno (NO el del host, que sigue\n * strip). Verificar transición width contra Figma.\n *\n * BEHAVIOR:\n * - Mobile (≤767px / @include bp.medium): drawer fixed, transform translateX\n * - Desktop: siempre visible, w=240px (collapsed → 80px)\n *\n * iOS WKWebView fix: cada nav item tiene (touchstart)+(touchend) blur().\n *\n * API:\n * - items / secondaryItems / supportingItems separados por divider/ancla\n * - searchable + searchPlaceholder + searchValue (slot de búsqueda Figma)\n * - profile footer (con sui-avatar), profileVerified + profileDropdown\n * - feature card slot via <ng-content select=\"[feature-card]\">\n * - logout shortcut: si un item tiene action='logout', emite logoutClicked\n * ═════════════════════════════════════════════════════════════════════════ */\n\nexport interface SuiSidebarItem {\n /** Identificador único, también lo emite (itemClicked) */\n value: string;\n label: string;\n /** RemixIcon name (ej. 'home-line', 'settings-3-line') */\n icon?: string;\n /** Ruta Angular (routerLink). Si se omite → solo emite (itemClicked) */\n route?: string;\n /** External link (open in new tab) */\n external?: boolean;\n /** 'danger' tiñe el item rojo (típico para logout / destructive actions) */\n variant?: 'default' | 'danger';\n /**\n * Action genérica. Si pasa 'logout' emite (logoutClicked) además de\n * (itemClicked). Cualquier valor bypassa el route (no navega).\n */\n action?: 'logout' | string;\n /** Badge opcional (ej. unread count) */\n badge?: string | number;\n /**\n * Shortcut pill alineado a la derecha (Figma \"Shortcut\", ej. '⌘1').\n * Border stroke-soft-200, radius 4, 12/16 medium uppercase soft-400.\n */\n shortcut?: string;\n /**\n * Reemplaza el icono RemixIcon por un Chart Legend Dot — un círculo de color\n * (Figma Side Content \"FAVS\"). Acepta cualquier CSS color o token\n * (ej. '#7d52f4', 'var(--sui-state-feature-base)'). Tiene prioridad sobre `icon`.\n */\n colorDot?: string;\n /**\n * Tooltip nativo en estado collapsed (icon-only). Si se omite, cae al `label`.\n * Solo se renderiza cuando el sidebar está collapsed.\n */\n tooltip?: string;\n}\n\nexport type SuiSidebarMobileMode = 'drawer' | 'sheet';\n\nexport interface SuiSidebarProfile {\n name: string;\n avatarUrl?: string;\n initials?: string;\n status?: SuiAvatarStatus;\n /** Subtítulo opcional (ej. email del usuario) */\n email?: string;\n /**\n * Muestra el verified-fill badge (state-verified-base #47c2ff) junto al nombre\n * — patrón Figma \"Sophia Williams ✓\". Default false.\n */\n verified?: boolean;\n}\n\n/** Color del indicator bar / icon activo. */\nexport type SuiSidebarIndicatorColor = 'information' | 'brand';\n\n@Component({\n selector: 'sui-sidebar',\n standalone: true,\n templateUrl: './sui-sidebar.html',\n styleUrl: './sui-sidebar.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterLink, RouterLinkActive, SuiIcon, SuiAvatar, SuiBadge],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-open]': 'open() ? \"\" : null',\n '[attr.data-sui-mobile-mode]': 'mobileMode()',\n '[attr.data-sui-collapsed]': 'collapsed() ? \"\" : null',\n '[attr.data-sui-indicator]': 'indicatorColor()',\n },\n})\nexport class SuiSidebar {\n // ── Layout ──────────────────────────────────────────────────────────────\n /**\n * Estado colapsado (icon-only, 80px). Oculta labels/subtítulos/shortcuts/\n * badges y centra los iconos. Figma variant Collapsed=On. Default false.\n */\n readonly collapsed = input(false);\n /**\n * Color del indicator bar + icon del item activo:\n * - 'brand' (default): naranja --sui-primary-base — el accent del DS es naranja\n * Master Pedidos, la selección refleja la marca (ver .claude/sui-audit/DECISIONES.md §1)\n * - 'information': azul --sui-state-information-base (Figma canon SUI, opt-in)\n */\n readonly indicatorColor = input<SuiSidebarIndicatorColor>('brand');\n\n // ── Brand header ────────────────────────────────────────────────────────\n readonly brandName = input<string>('');\n /** Texto secundario debajo del nombre (ej. \"HR Management\" o \"SUPERADMIN\") */\n readonly brandSubtitle = input<string | null>(null);\n /**\n * Cuando true, el subtitle se renderiza como <sui-badge variant=\"filled\"\n * color=\"orange\" size=\"small\"> (typical para roles tipo \"SUPERADMIN\").\n * Cuando false (default) → texto plano sub-600.\n */\n readonly brandSubtitleAsBadge = input(false);\n /** URL de imagen del brand logo (40×40 rounded-full) */\n readonly brandLogo = input<string | null>(null);\n /** Fallback (emoji o texto corto) cuando no hay logo */\n readonly brandFallback = input<string | null>(null);\n /**\n * Muestra el Compact Button del header (expand-up-down-line) — workspace\n * switcher de Figma. Emite (headerButtonClicked) al click. Default false.\n */\n readonly showHeaderButton = input(false);\n\n // ── Search slot (Figma prop search=true) ──────────────────────────────────\n /** Renderiza el Text Input de búsqueda encima de las secciones. Default false. */\n readonly searchable = input(false);\n readonly searchPlaceholder = input<string>('Search...');\n /** Shortcut pill dentro del search (ej. '⌘1'). null → sin pill. */\n readonly searchShortcut = input<string | null>(null);\n /** Valor del input de búsqueda (2-way). */\n readonly searchValue = model<string>('');\n\n // ── Nav items ───────────────────────────────────────────────────────────\n readonly items = input<SuiSidebarItem[]>([]);\n /** Sección secundaria, separada por divider */\n readonly secondaryItems = input<SuiSidebarItem[]>([]);\n /**\n * Tercera sección \"Supporting Content\" (Figma supContent=true). Cuando\n * supportingAnchorBottom=true se ancla al fondo del content area (flex:1 +\n * justify-end) — típico para Settings/Support.\n */\n readonly supportingItems = input<SuiSidebarItem[]>([]);\n /** Ancla supportingItems al fondo del content (Figma justify-end). Default true. */\n readonly supportingAnchorBottom = input(true);\n /** Label opcional encima de items (Default: \"MAIN\") */\n readonly itemsLabel = input<string | null>(null);\n /** Label opcional encima de secondaryItems */\n readonly secondaryItemsLabel = input<string | null>(null);\n /** Label opcional encima de supportingItems */\n readonly supportingItemsLabel = input<string | null>(null);\n /**\n * Active route — solo se usa si NO hay routerLink (items sin route).\n * Cuando hay route, RouterLinkActive resuelve el active state.\n */\n readonly activeRoute = input<string | null>(null);\n\n // ── Profile footer ──────────────────────────────────────────────────────\n readonly profile = input<SuiSidebarProfile | null>(null);\n /**\n * Muestra el Compact Button dropdown (arrow-right-s-line) en el footer del\n * perfil — Figma \"UserProfileCard dropdown=true\". Emite (profileClicked).\n * Default false.\n */\n readonly profileDropdown = input(false);\n\n // ── Mobile drawer ───────────────────────────────────────────────────────\n /** Estado open/closed (en mobile = drawer visible o no). 2-way binding. */\n readonly open = model(false);\n /** Cerrar el drawer al click en un nav item. Default true. */\n readonly closeOnNavigate = input(true);\n /** Mostrar el backdrop overlay (mobile drawer). Default true. */\n readonly showBackdrop = input(true);\n /**\n * Comportamiento mobile:\n * - `drawer` (default): width min(86vw, 360px), entra desde la izquierda,\n * backdrop oscuro al costado. Compacto, estilo Material/SUI.\n * - `sheet`: width calc(100vw - 40px) para que quede solo un slice de\n * backdrop visible a la derecha. Mantiene shadow + border-radius del\n * drawer pero se siente más fullscreen (matchea el patrón actual del\n * MasterLayout pre-migración).\n * Solo aplica a mobile (≤767px). En desktop el sidebar es fijo siempre.\n */\n readonly mobileMode = input<SuiSidebarMobileMode>('drawer');\n\n // ── Outputs ─────────────────────────────────────────────────────────────\n readonly itemClicked = output<SuiSidebarItem>();\n readonly logoutClicked = output<void>();\n readonly backdropClicked = output<void>();\n /** Click en el Compact Button del header (workspace switcher). */\n readonly headerButtonClicked = output<void>();\n /** Click en el Compact Button dropdown del footer del perfil. */\n readonly profileClicked = output<void>();\n /** Submit del search input (Enter). Emite el valor actual. */\n readonly searchSubmitted = output<string>();\n\n /**\n * Resuelve cuándo un item sin route está \"activo\" via activeRoute.\n * Match por prefijo: '/master/inicio' activa también '/master/inicio/sub'.\n */\n protected readonly resolvedActiveValue = computed(() => {\n const route = this.activeRoute();\n if (!route) return null;\n const all = [...this.items(), ...this.secondaryItems(), ...this.supportingItems()];\n const match = all.find((it) => {\n if (it.route && (route === it.route || route.startsWith(it.route + '/'))) {\n return true;\n }\n return false;\n });\n return match?.value ?? null;\n });\n\n protected onItemClick(item: SuiSidebarItem, ev: Event): void {\n if (item.action === 'logout') {\n ev.preventDefault();\n this.logoutClicked.emit();\n }\n this.itemClicked.emit(item);\n if (this.closeOnNavigate()) {\n this.open.set(false);\n }\n }\n\n protected onBackdropClick(): void {\n this.open.set(false);\n this.backdropClicked.emit();\n }\n\n /** Helper para template — class binding del item activo cuando NO hay route */\n protected isItemActive(item: SuiSidebarItem): boolean {\n if (item.route) return false; // RouterLinkActive resuelve via host class\n return this.resolvedActiveValue() === item.value;\n }\n\n protected onHeaderButtonClick(ev: Event): void {\n ev.stopPropagation();\n this.headerButtonClicked.emit();\n }\n\n protected onProfileButtonClick(ev: Event): void {\n ev.stopPropagation();\n this.profileClicked.emit();\n }\n\n protected onSearchInput(value: string): void {\n this.searchValue.set(value);\n }\n\n protected onSearchSubmit(): void {\n this.searchSubmitted.emit(this.searchValue());\n }\n}\n","@if (showBackdrop() && open()) {\n <div class=\"sui-sidebar-backdrop\" (click)=\"onBackdropClick()\" aria-hidden=\"true\"></div>\n}\n\n<aside\n class=\"sui-sidebar\"\n [class.sui-sidebar--open]=\"open()\"\n [class.sui-sidebar--collapsed]=\"collapsed()\"\n role=\"navigation\"\n [attr.aria-hidden]=\"!open() ? 'true' : null\"\n>\n <!-- ── Header ──────────────────────────────────────────────────────── -->\n <header class=\"sui-sidebar__header\">\n <div class=\"sui-sidebar__header-card\">\n <div class=\"sui-sidebar__brand-logo\">\n @if (brandLogo()) {\n <img [src]=\"brandLogo()\" [alt]=\"brandName()\" referrerpolicy=\"no-referrer\" />\n } @else if (brandFallback()) {\n <span class=\"sui-sidebar__brand-fallback\">{{ brandFallback() }}</span>\n } @else {\n <sui-icon name=\"building-line\" [size]=\"20\" />\n }\n </div>\n @if (!collapsed()) {\n <div class=\"sui-sidebar__header-info\">\n <span class=\"sui-sidebar__header-name\">{{ brandName() }}</span>\n @if (brandSubtitle()) {\n @if (brandSubtitleAsBadge()) {\n <sui-badge variant=\"filled\" color=\"orange\" size=\"small\">{{ brandSubtitle() }}</sui-badge>\n } @else {\n <span class=\"sui-sidebar__header-subtitle\">{{ brandSubtitle() }}</span>\n }\n }\n </div>\n @if (showHeaderButton()) {\n <button\n type=\"button\"\n class=\"sui-sidebar__compact-btn\"\n aria-label=\"Cambiar workspace\"\n (click)=\"onHeaderButtonClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"expand-up-down-line\" [size]=\"20\" />\n </button>\n }\n }\n </div>\n <div class=\"sui-sidebar__divider\" role=\"separator\"></div>\n </header>\n\n <!-- ── Content ─────────────────────────────────────────────────────── -->\n <div class=\"sui-sidebar__content\">\n <!-- Search slot (Figma prop search=true) -->\n @if (searchable() && !collapsed()) {\n <div class=\"sui-sidebar__search\">\n <sui-icon class=\"sui-sidebar__search-icon\" name=\"search-2-line\" [size]=\"20\" />\n <input\n class=\"sui-sidebar__search-input\"\n type=\"text\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchValue()\"\n (input)=\"onSearchInput($any($event.target).value)\"\n (keydown.enter)=\"onSearchSubmit()\"\n />\n @if (searchShortcut()) {\n <span class=\"sui-sidebar__shortcut\">{{ searchShortcut() }}</span>\n }\n </div>\n }\n\n @if (items().length > 0) {\n <div class=\"sui-sidebar__section\">\n @if (itemsLabel()) {\n <div class=\"sui-sidebar__section-label\" [class.sui-sidebar__section-label--collapsed]=\"collapsed()\">{{ itemsLabel() }}</div>\n }\n <nav class=\"sui-sidebar__nav\">\n @for (item of items(); track item.value) {\n <ng-container *ngTemplateOutlet=\"itemTpl; context: { $implicit: item }\"></ng-container>\n }\n </nav>\n </div>\n }\n\n @if (secondaryItems().length > 0) {\n <div class=\"sui-sidebar__section sui-sidebar__section--secondary\">\n @if (secondaryItemsLabel()) {\n <div class=\"sui-sidebar__section-label\" [class.sui-sidebar__section-label--collapsed]=\"collapsed()\">{{ secondaryItemsLabel() }}</div>\n }\n <nav class=\"sui-sidebar__nav\">\n @for (item of secondaryItems(); track item.value) {\n <ng-container *ngTemplateOutlet=\"itemTpl; context: { $implicit: item }\"></ng-container>\n }\n </nav>\n </div>\n }\n\n <!-- Supporting Content (Figma supContent) — ancla al fondo cuando aplica -->\n @if (supportingItems().length > 0) {\n <div\n class=\"sui-sidebar__section sui-sidebar__section--supporting\"\n [class.sui-sidebar__section--anchor-bottom]=\"supportingAnchorBottom()\"\n >\n @if (supportingItemsLabel()) {\n <div class=\"sui-sidebar__section-label\" [class.sui-sidebar__section-label--collapsed]=\"collapsed()\">{{ supportingItemsLabel() }}</div>\n }\n <nav class=\"sui-sidebar__nav\">\n @for (item of supportingItems(); track item.value) {\n <ng-container *ngTemplateOutlet=\"itemTpl; context: { $implicit: item }\"></ng-container>\n }\n </nav>\n </div>\n }\n\n <!-- Feature Card slot (Figma FeatureCard=On) — promo opcional, oculto en collapsed -->\n @if (!collapsed()) {\n <div class=\"sui-sidebar__feature-card\">\n <ng-content select=\"[feature-card]\"></ng-content>\n </div>\n }\n </div>\n\n <!-- ── Footer (profile) ────────────────────────────────────────────── -->\n @if (profile(); as p) {\n <footer class=\"sui-sidebar__footer\">\n <div class=\"sui-sidebar__divider sui-sidebar__divider--top\" role=\"separator\"></div>\n <div class=\"sui-sidebar__profile\">\n <sui-avatar\n size=\"lg\"\n [src]=\"p.avatarUrl ?? null\"\n [alt]=\"p.name\"\n [initials]=\"p.initials ?? ''\"\n [status]=\"p.status ?? null\"\n color=\"slate\"\n />\n @if (!collapsed()) {\n <div class=\"sui-sidebar__profile-info\">\n <div class=\"sui-sidebar__profile-name-row\">\n <span class=\"sui-sidebar__profile-name\">{{ p.name }}</span>\n @if (p.verified) {\n <!-- Figma usa verified-fill (glyph propio SUI); el match más\n cercano en RemixIcon es verified-badge-fill. -->\n <sui-icon\n class=\"sui-sidebar__profile-verified\"\n name=\"verified-badge-fill\"\n [size]=\"20\"\n aria-label=\"Verificado\"\n />\n }\n </div>\n @if (p.email) {\n <span class=\"sui-sidebar__profile-email\">{{ p.email }}</span>\n }\n </div>\n @if (profileDropdown()) {\n <button\n type=\"button\"\n class=\"sui-sidebar__compact-btn sui-sidebar__compact-btn--ghost\"\n aria-label=\"Opciones de perfil\"\n (click)=\"onProfileButtonClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"arrow-right-s-line\" [size]=\"20\" />\n </button>\n }\n }\n </div>\n </footer>\n }\n</aside>\n\n<!-- ── Item template (compartido entre todas las secciones) ───────────── -->\n<ng-template #itemTpl let-item>\n @if (item.route && !item.action) {\n <a\n class=\"sui-sidebar__item\"\n [class.sui-sidebar__item--danger]=\"item.variant === 'danger'\"\n [routerLink]=\"item.route\"\n routerLinkActive=\"sui-sidebar__item--active\"\n [attr.target]=\"item.external ? '_blank' : null\"\n [attr.rel]=\"item.external ? 'noopener noreferrer' : null\"\n [attr.title]=\"collapsed() ? (item.tooltip ?? item.label) : null\"\n [attr.aria-label]=\"collapsed() ? item.label : null\"\n (click)=\"onItemClick(item, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"sui-sidebar__item\"\n [class.sui-sidebar__item--active]=\"isItemActive(item)\"\n [class.sui-sidebar__item--danger]=\"item.variant === 'danger'\"\n [attr.title]=\"collapsed() ? (item.tooltip ?? item.label) : null\"\n [attr.aria-label]=\"collapsed() ? item.label : null\"\n (click)=\"onItemClick(item, $event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <ng-container *ngTemplateOutlet=\"itemBody; context: { $implicit: item }\"></ng-container>\n </button>\n }\n</ng-template>\n\n<ng-template #itemBody let-item>\n @if (item.colorDot) {\n <span\n class=\"sui-sidebar__item-dot\"\n [style.background-color]=\"item.colorDot\"\n aria-hidden=\"true\"\n ></span>\n } @else if (item.icon) {\n <sui-icon class=\"sui-sidebar__item-icon\" [name]=\"item.icon\" [size]=\"20\" />\n }\n @if (!collapsed()) {\n <span class=\"sui-sidebar__item-label\">{{ item.label }}</span>\n @if (item.badge !== undefined && item.badge !== null && item.badge !== '') {\n <sui-badge\n class=\"sui-sidebar__item-badge\"\n variant=\"filled\"\n [color]=\"item.variant === 'danger' ? 'red' : 'orange'\"\n size=\"small\"\n type=\"number\"\n >{{ item.badge }}</sui-badge>\n }\n @if (item.shortcut) {\n <span class=\"sui-sidebar__shortcut\">{{ item.shortcut }}</span>\n }\n <!-- Chevron del item activo (Figma): visibilidad controlada por CSS via\n .sui-sidebar__item--active (cubre tanto isItemActive como RouterLinkActive). -->\n <sui-icon class=\"sui-sidebar__item-chevron\" name=\"arrow-right-s-line\" [size]=\"20\" />\n }\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n forwardRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * SUI Slider — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodos auditados:\n * - 2617:1169 Slider [1.1] (single, Percentage 0/25/50/75/100)\n * - 2617:1588 Range Slider [1.1] (dual-handle, leftRange × rightRange)\n *\n * Componente NUEVO (no existía en el DS). Replica visualmente lo que en Figma\n * está renderizado como assets PNG (thumb + inner dot) usando CSS puro\n * (border-radius 50% + box-shadow + inner dot). El tooltip tail también es\n * CSS (clip-path triangle) en vez de SVG asset.\n *\n * ── Geometría exacta (Figma) ───────────────────────────────────────────────\n * - Track (BG): 6px alto, radius-full, bg-soft-200 (#ebebeb)\n * - Progress line: 6px alto, radius-full, primary-base (#fa7319 en este\n * proyecto; el Figma usa #335cff azul)\n * - Thumb / dot: 16×16 círculo blanco\n * box-shadow 0px 6px 5px rgba(14,18,27,0.06),\n * 0px 2px 2px rgba(14,18,27,0.03)\n * - Inner dot: 6×6 círculo; primary-base cuando hay progreso,\n * bg-soft-200 (#ebebeb) cuando value=0 (estado \"zero\")\n * - Tooltip: bg-strong-950, texto white 12px/16px Inter Regular,\n * padding 2px 6px, radius-4, tail 8×4 hacia abajo,\n * posicionado top -28px; se muestra al hover/drag\n * - Label row: 12px; label text-sub-600, sublabel text-soft-400,\n * amount alineado derecha text-sub-600, gap 2px\n *\n * ── Props (mapeo Figma → Angular) ──────────────────────────────────────────\n * Figma → Angular\n * percentage → [(value)] (single, 0–100 continuo + step)\n * leftRange → [(minValue)] (range, handle izquierdo)\n * rightRange → [(maxValue)] (range, handle derecho)\n * label (bool) → [label] (string|'') — vacío oculta toda la fila\n * sublabel (bool) → [sublabel](string|'') — vacío oculta el subtexto\n * tooltip (bool) → [tooltip] (bool) — muestra tooltip flotante\n * editAmount → [amount] (string) — texto a la derecha del label\n *\n * Soporta CVA ([(ngModel)] / formControlName) en modo single (un solo número).\n * En modo range se usa [(minValue)]/[(maxValue)] (no hay CVA estándar para par).\n *\n * ── PENDING VERIFY (openQuestions del reporte de auditoría) ─────────────────\n * 1. Estado `disabled` NO aparece en los nodos auditados (2617:1169 /\n * 2617:1588). La implementación aquí lo agrega como input técnico con un\n * look razonable (opacidad + gris), PENDIENTE confirmar contra un nodo\n * Figma específico si existe.\n * 2. Tooltip: Figma lo trae como prop estática (tooltip=true/false). Aquí se\n * asume comportamiento interactivo (hover/drag muestra, idle oculta) salvo\n * que se fuerce con [tooltipAlways]. PENDIENTE confirmar el comportamiento.\n * 3. Range collision avoidance (min ≤ max): NO documentado en Figma. Aquí se\n * implementa el clamp estándar (min nunca supera max). PENDIENTE confirmar.\n * 4. Step discreto: NO indicado en Figma. Se agrega [step] (default 1) como\n * input técnico necesario. PENDIENTE confirmar si el DS quiere step.\n * 5. Inner dot zero-state: se infiere bg-soft-200 cuando value=0 y primary\n * cuando >0 — confirmado visualmente en el screenshot, PENDIENTE verificar\n * el untouched del range slider.\n */\nexport type SuiSliderType = 'single' | 'range';\n\n@Component({\n selector: 'sui-slider',\n templateUrl: './sui-slider.html',\n styleUrl: './sui-slider.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiSlider),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-dragging]': 'dragging() ? \"\" : null',\n },\n})\nexport class SuiSlider implements ControlValueAccessor {\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n // ── API pública ────────────────────────────────────────────────────────\n readonly type = input<SuiSliderType>('single');\n\n /** Rango numérico de la escala. */\n readonly min = input(0);\n readonly max = input(100);\n readonly step = input(1);\n\n /** Label row (Figma `editLabel`/`label` bool). Vacío => fila oculta. */\n readonly label = input<string>('');\n /** Sublabel opcional (Figma `editSublabel`/`sublabel` bool). */\n readonly sublabel = input<string>('');\n /**\n * Texto a la derecha (Figma `editAmount`). Si no se pasa, se usa el valor\n * numérico actual del slider (value en single; \"min–max\" en range).\n */\n readonly amount = input<string | null>(null);\n\n /** Muestra tooltip flotante sobre el thumb activo (hover/drag). */\n readonly tooltip = input(false);\n /** Fuerza el tooltip siempre visible (no solo en hover/drag). */\n readonly tooltipAlways = input(false);\n\n readonly disabled = input(false);\n\n // ── single value ─────────────────────────────────────────────────────────\n readonly value = input(0);\n readonly valueChange = output<number>();\n\n // ── range values ──────────────────────────────────────────────────────────\n readonly minValue = input(0);\n readonly minValueChange = output<number>();\n readonly maxValue = input(0);\n readonly maxValueChange = output<number>();\n\n // ── estado interno ─────────────────────────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** CVA buffer — solo en modo single con formControlName / ngModel. */\n private readonly _cvaValue = signal<number | null>(null);\n private readonly _useCvaValue = signal(false);\n\n /** Handle siendo arrastrado: null | 'single' | 'min' | 'max'. */\n readonly dragging = signal<null | 'single' | 'min' | 'max'>(null);\n /** Handle bajo hover (para tooltip): igual dominio que dragging. */\n readonly hovering = signal<null | 'single' | 'min' | 'max'>(null);\n\n // ── valores efectivos (clamped al rango) ─────────────────────────────────\n private clamp(v: number): number {\n const lo = this.min();\n const hi = this.max();\n if (Number.isNaN(v)) return lo;\n return Math.min(hi, Math.max(lo, v));\n }\n\n readonly effectiveValue = computed(() => {\n const raw = this._useCvaValue() ? (this._cvaValue() ?? 0) : this.value();\n return this.clamp(raw);\n });\n\n readonly effectiveMin = computed(() => this.clamp(this.minValue()));\n readonly effectiveMax = computed(() => {\n // collision avoidance: max nunca por debajo de min\n const max = this.clamp(this.maxValue());\n return Math.max(max, this.effectiveMin());\n });\n\n // ── porcentajes para posicionar (0–100) ──────────────────────────────────\n private pct(v: number): number {\n const lo = this.min();\n const hi = this.max();\n const span = hi - lo;\n if (span <= 0) return 0;\n return ((v - lo) / span) * 100;\n }\n\n readonly valuePct = computed(() => this.pct(this.effectiveValue()));\n readonly minPct = computed(() => this.pct(this.effectiveMin()));\n readonly maxPct = computed(() => this.pct(this.effectiveMax()));\n\n /** Inner dot coloreado cuando hay progreso; gris en zero-state. */\n readonly singleHasProgress = computed(() => this.effectiveValue() > this.min());\n readonly rangeMinColored = computed(\n () => this.effectiveMin() > this.min() || this.effectiveMax() > this.min(),\n );\n readonly rangeMaxColored = computed(() => this.effectiveMax() > this.min());\n\n /** Texto del label de la derecha. */\n readonly amountText = computed(() => {\n const explicit = this.amount();\n if (explicit !== null) return explicit;\n if (this.type() === 'range') {\n return `${this.effectiveMin()}–${this.effectiveMax()}`;\n }\n return `${this.effectiveValue()}`;\n });\n\n // ── tooltip visibility por handle ─────────────────────────────────────────\n private showTooltipFor(handle: 'single' | 'min' | 'max'): boolean {\n if (!this.tooltip()) return false;\n if (this.tooltipAlways()) return true;\n return this.dragging() === handle || this.hovering() === handle;\n }\n readonly showSingleTooltip = computed(() => this.showTooltipFor('single'));\n readonly showMinTooltip = computed(() => this.showTooltipFor('min'));\n readonly showMaxTooltip = computed(() => this.showTooltipFor('max'));\n\n // ── CVA ────────────────────────────────────────────────────────────────────\n private _onChange: (v: number) => void = () => {};\n private _onTouched: () => void = () => {};\n\n writeValue(v: number): void {\n this._cvaValue.set(typeof v === 'number' ? v : Number(v) || 0);\n this._useCvaValue.set(true);\n }\n registerOnChange(fn: (v: number) => void): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n\n // ── emisión de valor ────────────────────────────────────────────────────\n private snap(raw: number): number {\n const lo = this.min();\n const st = this.step();\n if (st <= 0) return this.clamp(raw);\n const snapped = lo + Math.round((raw - lo) / st) * st;\n return this.clamp(snapped);\n }\n\n private emitSingle(raw: number): void {\n const next = this.snap(raw);\n if (this._useCvaValue()) this._cvaValue.set(next);\n this.valueChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n private emitMin(raw: number): void {\n let next = this.snap(raw);\n next = Math.min(next, this.effectiveMax()); // no rebasar el handle derecho\n this.minValueChange.emit(next);\n this._onTouched();\n }\n\n private emitMax(raw: number): void {\n let next = this.snap(raw);\n next = Math.max(next, this.effectiveMin()); // no rebasar el handle izquierdo\n this.maxValueChange.emit(next);\n this._onTouched();\n }\n\n // ── geometría del puntero → valor ─────────────────────────────────────────\n private trackEl(): HTMLElement | null {\n return this.hostRef.nativeElement.querySelector('.sui-slider__track');\n }\n\n private valueFromClientX(clientX: number): number {\n const track = this.trackEl();\n if (!track) return this.min();\n const rect = track.getBoundingClientRect();\n if (rect.width <= 0) return this.min();\n const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width));\n return this.min() + ratio * (this.max() - this.min());\n }\n\n // ── eventos de pointer (mouse + touch unificados) ─────────────────────────\n onTrackPointerDown(e: PointerEvent): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n const raw = this.valueFromClientX(e.clientX);\n\n let handle: 'single' | 'min' | 'max';\n if (this.type() === 'single') {\n handle = 'single';\n this.emitSingle(raw);\n } else {\n // elegir el handle más cercano al click\n const dMin = Math.abs(raw - this.effectiveMin());\n const dMax = Math.abs(raw - this.effectiveMax());\n handle = dMin <= dMax ? 'min' : 'max';\n if (handle === 'min') this.emitMin(raw);\n else this.emitMax(raw);\n }\n\n this.dragging.set(handle);\n const target = e.target as HTMLElement;\n try {\n target.setPointerCapture?.(e.pointerId);\n } catch {\n /* noop */\n }\n }\n\n onPointerMove(e: PointerEvent): void {\n const handle = this.dragging();\n if (!handle || this.isDisabled()) return;\n e.preventDefault();\n const raw = this.valueFromClientX(e.clientX);\n if (handle === 'single') this.emitSingle(raw);\n else if (handle === 'min') this.emitMin(raw);\n else this.emitMax(raw);\n }\n\n onPointerUp(): void {\n if (this.dragging()) this.dragging.set(null);\n }\n\n // ── teclado (accesibilidad) ────────────────────────────────────────────────\n onThumbKeydown(e: KeyboardEvent, handle: 'single' | 'min' | 'max'): void {\n if (this.isDisabled()) return;\n const st = this.step() || 1;\n let delta = 0;\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = st;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = -st;\n break;\n case 'Home':\n delta = -Infinity;\n break;\n case 'End':\n delta = Infinity;\n break;\n default:\n return;\n }\n e.preventDefault();\n if (handle === 'single') {\n const base = delta === Infinity ? this.max() : delta === -Infinity ? this.min() : this.effectiveValue() + delta;\n this.emitSingle(base);\n } else if (handle === 'min') {\n const base = delta === Infinity ? this.max() : delta === -Infinity ? this.min() : this.effectiveMin() + delta;\n this.emitMin(base);\n } else {\n const base = delta === Infinity ? this.max() : delta === -Infinity ? this.min() : this.effectiveMax() + delta;\n this.emitMax(base);\n }\n }\n\n onThumbEnter(handle: 'single' | 'min' | 'max'): void {\n if (this.isDisabled()) return;\n this.hovering.set(handle);\n }\n onThumbLeave(): void {\n this.hovering.set(null);\n }\n}\n","@if (label()) {\n <div class=\"sui-slider__label-row\">\n <span class=\"sui-slider__label\">{{ label() }}</span>\n @if (sublabel()) {\n <span class=\"sui-slider__sublabel\">{{ sublabel() }}</span>\n }\n <span class=\"sui-slider__amount\">{{ amountText() }}</span>\n </div>\n}\n\n<div\n class=\"sui-slider__track\"\n (pointerdown)=\"onTrackPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp()\"\n (pointercancel)=\"onPointerUp()\"\n>\n <!-- BG track -->\n <div class=\"sui-slider__bg\"></div>\n\n @if (type() === 'single') {\n <!-- Progress fill 0 → value -->\n <div class=\"sui-slider__progress\" [style.width.%]=\"valuePct()\"></div>\n\n <!-- Thumb único -->\n <div\n class=\"sui-slider__thumb\"\n [class.sui-slider__thumb--zero]=\"!singleHasProgress()\"\n [style.left.%]=\"valuePct()\"\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"effectiveValue()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.tabindex]=\"isDisabled() ? '-1' : '0'\"\n (keydown)=\"onThumbKeydown($event, 'single')\"\n (pointerenter)=\"onThumbEnter('single')\"\n (pointerleave)=\"onThumbLeave()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-slider__dot\"></span>\n @if (showSingleTooltip()) {\n <div class=\"sui-slider__tooltip\">\n <span class=\"sui-slider__tooltip-text\">{{ effectiveValue() }}</span>\n <span class=\"sui-slider__tooltip-tail\"></span>\n </div>\n }\n </div>\n } @else {\n <!-- Progress fill min → max -->\n <div\n class=\"sui-slider__progress\"\n [style.left.%]=\"minPct()\"\n [style.width.%]=\"maxPct() - minPct()\"\n ></div>\n\n <!-- Thumb min (izquierdo) -->\n <div\n class=\"sui-slider__thumb sui-slider__thumb--range-min\"\n [class.sui-slider__thumb--zero]=\"!rangeMinColored()\"\n [style.left.%]=\"minPct()\"\n role=\"slider\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"effectiveMax()\"\n [attr.aria-valuenow]=\"effectiveMin()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.tabindex]=\"isDisabled() ? '-1' : '0'\"\n (keydown)=\"onThumbKeydown($event, 'min')\"\n (pointerenter)=\"onThumbEnter('min')\"\n (pointerleave)=\"onThumbLeave()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-slider__dot\"></span>\n @if (showMinTooltip()) {\n <div class=\"sui-slider__tooltip\">\n <span class=\"sui-slider__tooltip-text\">{{ effectiveMin() }}</span>\n <span class=\"sui-slider__tooltip-tail\"></span>\n </div>\n }\n </div>\n\n <!-- Thumb max (derecho) -->\n <div\n class=\"sui-slider__thumb\"\n [class.sui-slider__thumb--zero]=\"!rangeMaxColored()\"\n [style.left.%]=\"maxPct()\"\n role=\"slider\"\n [attr.aria-valuemin]=\"effectiveMin()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"effectiveMax()\"\n [attr.aria-disabled]=\"isDisabled() ? 'true' : null\"\n [attr.tabindex]=\"isDisabled() ? '-1' : '0'\"\n (keydown)=\"onThumbKeydown($event, 'max')\"\n (pointerenter)=\"onThumbEnter('max')\"\n (pointerleave)=\"onThumbLeave()\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <span class=\"sui-slider__dot\"></span>\n @if (showMaxTooltip()) {\n <div class=\"sui-slider__tooltip\">\n <span class=\"sui-slider__tooltip-text\">{{ effectiveMax() }}</span>\n <span class=\"sui-slider__tooltip-tail\"></span>\n </div>\n }\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiBrandLogo } from '../sui-brand-logo/sui-brand-logo';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiSocialButtonBrand =\n | 'apple'\n | 'x-twitter'\n | 'google'\n | 'facebook'\n | 'linkedin'\n | 'github'\n | 'dropbox';\n\nexport type SuiSocialButtonStyle = 'filled' | 'stroke';\n\n/** Brand color map — exact bg-color por brand cuando style=filled. */\nconst BRAND_FILLED_BG: Record<SuiSocialButtonBrand, string> = {\n apple: '#000000', // var social/apple (verificado 2026-05-29)\n 'x-twitter': '#010101', // var social/twitter #010101 (PULLED 2026-05-29, antes asumido #000000)\n google: '#f14336', // node 181:4546 (Google red, verificado)\n facebook: '#1977f3', // node 181:4786 (Facebook blue)\n linkedin: '#0077b5', // node 181:4918 (LinkedIn blue)\n github: '#24292f', // node 181:5098 (GitHub dark gray)\n dropbox: '#3984ff', // node 181:5209 (Dropbox blue)\n};\n\n/** Default copy per brand. Override via `label` input. */\nconst BRAND_LABEL: Record<SuiSocialButtonBrand, string> = {\n apple: 'Continuar con Apple',\n 'x-twitter': 'Continuar con X',\n google: 'Continuar con Google',\n facebook: 'Continuar con Facebook',\n linkedin: 'Continuar con LinkedIn',\n github: 'Continuar con GitHub',\n dropbox: 'Continuar con Dropbox',\n};\n\n/**\n * SUI Social Button — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Frame: 180:4264 (\"Social Buttons [1.1]\") — 84 variants total\n * 7 brands × 2 styles (filled / stroke) × 3 states (default/hover/focus) × 2 onlyIcon\n *\n * EXACT (pulled from Figma):\n * Container:\n * padding (with-text): pl=10, pr=16, py=10 (asimétrico — más espacio post-text)\n * padding (only-icon): 10px all-around (square 40×40)\n * gap: 8px\n * radius: 10px (var --sui-radius-10)\n * height: 40px (Medium)\n * items-center justify-center\n *\n * Filled style (bg-color por brand — los logos usan style=white):\n * Apple: #000000 (var social/apple)\n * X-Twitter: #010101 (var social/twitter — PULLED 2026-05-29)\n * Google: #f14336 (node 181:4546)\n * Facebook: #1977f3 (node 181:4786)\n * LinkedIn: #0077b5 (node 181:4918)\n * GitHub: #24292f (node 181:5098)\n * Dropbox: #3984ff (node 181:5209)\n * Text color: var(--sui-static-white)\n *\n * Stroke style (universal — los logos usan style=original):\n * bg: var(--sui-bg-white-0)\n * border: 1px solid var(--sui-stroke-soft-200)\n * shadow: 0 1px 2px rgba(10,13,20,.03) (regular-shadow x-small)\n * text: var(--sui-text-strong-950)\n *\n * Typography (ambos styles):\n * Inter Medium 14/20/-0.6%, font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Brand logo: <sui-brand-logo> size=sm (20px). Style del logo:\n * filled → 'white' (logo blanco sobre bg colored)\n * stroke → 'original' (logo full color sobre bg blanco)\n *\n * Container PULLED (node 181:4546 Google filled): pl-10 pr-16 py-10, gap 8,\n * radius-10, text static-white, font-feature 'ss11' 1 'calt' 0 'liga' 0. ✓\n * X-Twitter color RESUELTO: var social/twitter = #010101 (antes asumido #000000).\n *\n * STATE values:\n * - Hover (filled): VERIFIED Figma 2026-05-29 (node 181:4552 Google Hover) →\n * overlay linear-gradient(rgba(0,0,0,0.16)) sobre brand base. (Antes asumido 0.10 — corregido.)\n * - Active (filled): extraFeature — Figma NO define Active para social (solo default/hover/focus).\n * Overlay rgba(0,0,0,0.24), un step más oscuro que el hover.\n * - Hover/active (stroke): bg-weak-50 hover / bg-soft-200 active (convención project).\n * - Focus state: Figma usa halo important-focus (alpha/slate spread4 + white spread2);\n * SUI usa halo primary-alpha-10 (extraFeature canon, homologado con sui-button).\n * - Disabled state: NO está en Figma. Convención project: opacity 0.5 + pointer-events:none.\n * - Loading state: extraFeature del proyecto (NO está en Figma). Cuando `loading=true`\n * el logo de marca se reemplaza por un spinner (sui-icon name='loader-4-line' con\n * animación spin) y el botón queda disabled (no emite clicked). El color del spinner\n * hereda del texto del botón (filled→white, stroke→text-strong). Homologa el patrón\n * que login.html implementaba inline con auth-page__spinner.\n *\n * Usage:\n * <sui-social-button brand=\"google\" (clicked)=\"signInWith('google')\" />\n * <sui-social-button brand=\"apple\" variantStyle=\"stroke\" [onlyIcon]=\"true\" />\n * <sui-social-button\n * brand=\"github\"\n * label=\"Continuar con GitHub para empresas\"\n * href=\"https://oauth.example.com/github\"\n * target=\"_blank\" />\n */\n@Component({\n selector: 'sui-social-button',\n templateUrl: './sui-social-button.html',\n styleUrl: './sui-social-button.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiBrandLogo, SuiIcon],\n host: {\n '[attr.data-sui-brand]': 'brand()',\n '[attr.data-sui-style]': 'variantStyle()',\n '[attr.data-sui-only-icon]': 'onlyIcon() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-loading]': 'loading() ? \"\" : null',\n '[style.--sui-social-bg]': 'filledBg()',\n },\n})\nexport class SuiSocialButton {\n readonly brand = input.required<SuiSocialButtonBrand>();\n readonly variantStyle = input<SuiSocialButtonStyle>('filled');\n readonly onlyIcon = input(false);\n readonly label = input<string | null>(null);\n readonly disabled = input(false);\n /** Loading state — reemplaza el logo por un spinner y deshabilita el botón. ExtraFeature. */\n readonly loading = input(false);\n readonly href = input<string | null>(null);\n readonly target = input<string | null>(null);\n readonly rel = input<string | null>('noopener noreferrer');\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n readonly ariaLabel = input<string | null>(null);\n\n readonly clicked = output<MouseEvent>();\n\n /** Disabled efectivo: el input disabled O el estado loading. */\n readonly isDisabled = computed<boolean>(() => this.disabled() || this.loading());\n\n readonly isAnchor = computed<boolean>(() => !!this.href() && !this.isDisabled());\n\n /** Logo style derivado del button style. */\n readonly logoStyle = computed<'white' | 'original'>(() =>\n this.variantStyle() === 'filled' ? 'white' : 'original'\n );\n\n /** Color de fondo brand-specific (solo aplica si style=filled). */\n readonly filledBg = computed<string | null>(() =>\n this.variantStyle() === 'filled' ? BRAND_FILLED_BG[this.brand()] : null\n );\n\n /** Label final: input.label > default por brand. */\n readonly resolvedLabel = computed<string>(() =>\n this.label() ?? BRAND_LABEL[this.brand()]\n );\n\n /** aria-label: si only-icon usar resolvedLabel (no hay texto visible). */\n readonly resolvedAriaLabel = computed<string | null>(() => {\n const custom = this.ariaLabel();\n if (custom) return custom;\n return this.onlyIcon() ? this.resolvedLabel() : null;\n });\n\n onClick(event: MouseEvent): void {\n if (this.isDisabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","@if (isAnchor()) {\n <a\n class=\"sui-social-button__el\"\n [href]=\"href()\"\n [attr.target]=\"target()\"\n [attr.rel]=\"rel()\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (loading()) {\n <sui-icon class=\"sui-social-button__spinner\" name=\"loader-4-line\" [size]=\"20\" />\n } @else {\n <sui-brand-logo [company]=\"brand()\" [variant]=\"logoStyle()\" size=\"sm\" />\n }\n @if (!onlyIcon()) {\n <span class=\"sui-social-button__text\">{{ resolvedLabel() }}</span>\n }\n </a>\n} @else {\n <button\n class=\"sui-social-button__el\"\n [type]=\"type()\"\n [disabled]=\"isDisabled() || null\"\n [attr.aria-label]=\"resolvedAriaLabel()\"\n (click)=\"onClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (loading()) {\n <sui-icon class=\"sui-social-button__spinner\" name=\"loader-4-line\" [size]=\"20\" />\n } @else {\n <sui-brand-logo [company]=\"brand()\" [variant]=\"logoStyle()\" size=\"sm\" />\n }\n @if (!onlyIcon()) {\n <span class=\"sui-social-button__text\">{{ resolvedLabel() }}</span>\n }\n </button>\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiStatusBadgeStatus =\n | 'completed'\n | 'pending'\n | 'failed'\n | 'information'\n | 'disabled';\n\nexport type SuiStatusBadgeAppearance = 'stroke' | 'light';\n\n/**\n * SUI Status Badge — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 171:5100 (Status Badge 11) — VERIFIED via MCP\n *\n * Componente separado del `sui-badge` regular. A diferencia del Badge:\n * - radius 6 (NO full)\n * - solo medium size (font Label/X Small 12/16/0)\n * - solo 2 styles: stroke + light (NO filled/lighter/dark)\n * - status enum cerrado (5 valores) — cada uno con su icono semántico fijo\n * - withDot reemplaza el icono por un dot de 6×6 (diámetro 6px) con el color del status\n *\n * EXACT (pulled from Figma 171:5100):\n * - Container: altura FIJA 24px (símbolo 171:5099 height=24), padding 4px\n * (top/bottom) + 4px (left) + 8px (right) = `4px 8px 4px 4px`. El height\n * explícito es necesario: sin él la altura auto da 26px (content 16 + pad 8 +\n * border 2), porque Figma renderiza el stroke inside y NO lo suma al alto.\n * - Radius: --sui-radius-6 (6px)\n * - Gap: 4px (con icono) · 2px (con dot)\n * - Typography Label/X Small: Inter Medium 12/16, letter-spacing 0, ss11/calt 0/liga 0\n * - Iconos: container 16×16 — el SVG vive en inset[12.5%] (= ocupa 12px reales)\n * - Dot: container 16×16, círculo interno DIÁMETRO 6px\n * (asset SVG node 171:5156: `<circle cx=8 cy=8 r=3>` en viewBox 16×16\n * → r=3 = 6px. Cualquier nota previa de \"4×4\" era stale.)\n *\n * Color rules:\n * Style STROKE (siempre):\n * - bg: --sui-bg-white-0 (#ffffff)\n * - border: 1px solid --sui-stroke-soft-200 (#ebebeb)\n * - icon/dot color: --sui-state-{status}-base\n * - text: --sui-text-sub-600 (#5c5c5c — gris neutro siempre)\n *\n * Style LIGHT:\n * - bg: --sui-state-{status}-lighter\n * - border: ninguno\n * - icon/dot color: --sui-state-{status}-base\n * - text:\n * · status != 'disabled' → --sui-state-{status}-base (color)\n * · status === 'disabled' → --sui-text-sub-600 (gris)\n *\n * Mapeo status → state token + icono Remix:\n * - 'completed' → state-success + ri-checkbox-circle-fill\n * - 'pending' → state-warning + ri-alert-fill\n * - 'failed' → state-error + ri-error-warning-fill\n * - 'information' → state-information + ri-information-fill\n * - 'disabled' → state-faded + ri-forbid-fill\n *\n * PENDING VERIFY (no críticos):\n * - Small size del Status Badge: CONFIRMADO que NO existe — el frame 171:5100\n * contiene 20 símbolos (5 status × 2 styles × 2 withDot), TODOS Medium (24px\n * de alto). No hay eje Size en este componente. Si el DS agrega Small más\n * adelante, recién ahí se introduce el input `size`.\n * - Hover/focus states: CONFIRMADO display-only — el frame no expone ningún\n * eje de interacción (ni Disabled como estado, salvo el status semántico\n * 'disabled' que es un valor de contenido, no un state CSS).\n *\n * Behavior:\n * - El texto del badge se proyecta via `<ng-content>` default. Si vacío,\n * el componente queda como pastilla compacta con solo el icono.\n * - role=\"status\" para accesibilidad.\n * - Sin :host gating de pointer-events — es un status indicator, no botón.\n */\n@Component({\n selector: 'sui-status-badge',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-status-badge.html',\n styleUrl: './sui-status-badge.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-sui-status]': 'status()',\n '[attr.data-sui-appearance]': 'appearance()',\n '[attr.data-sui-with-dot]': 'withDot() ? \"\" : null',\n '[attr.role]': '\"status\"',\n },\n})\nexport class SuiStatusBadge {\n readonly status = input<SuiStatusBadgeStatus>('completed');\n\n /**\n * Variante visual del badge (`stroke` vs `light`). Se llama `appearance`\n * para no colisionar con el atributo HTML nativo `style=\"...\"` (que el\n * linter trata de parsear como CSS y rompe con valores como \"light\").\n */\n readonly appearance = input<SuiStatusBadgeAppearance>('stroke');\n\n /**\n * Si `true`, reemplaza el icono semántico por un dot 6×6 (diámetro 6px,\n * radio 3px — confirmado en Figma 171:5156) del color del status.\n * En appearance=\"stroke\", el texto también pasa a gris neutro.\n * En appearance=\"light\", el texto mantiene state-base salvo para status=\"disabled\".\n */\n readonly withDot = input(false);\n\n /** Icono Remix mapeado al status. Solo se usa cuando withDot=false. */\n readonly iconName = computed(() => {\n switch (this.status()) {\n case 'completed': return 'checkbox-circle-fill';\n case 'pending': return 'alert-fill';\n case 'failed': return 'error-warning-fill';\n case 'information': return 'information-fill';\n case 'disabled': return 'forbid-fill';\n }\n });\n}\n","@if (withDot()) {\n <span class=\"sui-status-badge__dot\" aria-hidden=\"true\"></span>\n} @else {\n <span class=\"sui-status-badge__icon\" aria-hidden=\"true\">\n <sui-icon [name]=\"iconName()\" [size]=\"12\" />\n </span>\n}\n<span class=\"sui-status-badge__label\"><ng-content></ng-content></span>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiStepperVariant = 'dot' | 'horizontal' | 'vertical';\nexport type SuiStepperSize = 'small' | 'xsmall';\nexport type SuiStepperState = 'default' | 'active' | 'completed' | 'error';\n\nexport interface SuiStepperItem {\n /** Etiqueta del step. Ignorada en variant='dot'. */\n label?: string;\n}\n\ninterface SuiStepperItemView {\n index: number;\n state: SuiStepperState;\n label: string;\n number: string;\n isLast: boolean;\n}\n\n/**\n * SUI Stepper — SUI Design System 2.0\n *\n * Process / step indicator. NO confundir con quantity stepper (+/-).\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodes verificados:\n * 479:14398 — Stepper Dot [1.1] (sizes: small=8px, xsmall=4px)\n * 3505:3498 — Step Indicator Horizontal Items (single item: circle 20px + label)\n * 3507:28 — Step Indicator Horizontal [1.1] (full horizontal con chevron separator)\n * 3507:227 — Step Indicator Vertical [1.1] (cards apilados con bg + shadow active)\n * 3507:560 — Step Indicator Sidebar [1.1] (vertical embebido en sidebar — patrón, no variant)\n *\n * Variantes:\n * - 'dot' → Dots simples (carousel/multi-page indicator).\n * - 'horizontal' → Numbered + chevron separator (multi-step form header).\n * - 'vertical' → Numbered + cards apilados (sidebar / wizard sidebar).\n *\n * Estados (auto-derivados desde currentStep):\n * - 'default' → index > currentStep\n * - 'active' → index === currentStep\n * - 'completed' → index < currentStep\n *\n * @input variant 'dot' | 'horizontal' | 'vertical' (default: 'horizontal')\n * @input steps Array de items con label (horizontal/vertical)\n * @input count Cantidad de dots (variant='dot' only). Si se pasan steps,\n * tiene precedencia el length de steps.\n * @input currentStep 0-indexed; index < cur = completed, === cur = active, > cur = default\n * @input size 'small' | 'xsmall' — solo aplica a variant='dot'\n * @input interactive Si true, los steps son clickeables y emiten stepClick\n *\n * @output stepClick Index del step clickeado (solo si interactive=true)\n *\n * Patrón sidebar: usar variant='vertical' dentro de un container con bg-weak-50,\n * radius-16, padding 16px + eyebrow uppercase encima + footer de contacto debajo.\n * Ver master-preview para ejemplo (node 3507:560 — composición, no variant del componente).\n *\n * ── Valores Figma verificados (2026-05-29, nodes 3505:3498 / 3507:27 / 3507:227) ──\n * • indicator : 20×20, radius-full, número en caja 16px centrada.\n * • horizontal default : border 1px solid stroke/soft-200 (impl: box-shadow inset 1px).\n * • vertical default : indicator bg-white-0 + regular-shadow/x-small SIN border.\n * • active indicator : bg primary-base + número static-white.\n * • completed indicator : icon select/checkbox-circle-fill verde (state/success-base), size 20.\n * • número : Label/X Small (12px / 500 / lh16 / ls 0). font-feature-settings ss11/calt/liga.\n * • label : Paragraph/Small (14px / 400 / lh20 / ls -0.6% = -0.084px). font-feature-settings ss11/calt/liga.\n * • font-feature-settings: 'ss11' 1, 'calt' 0, 'liga' 0 en TODOS los text nodes (número + label).\n * • indicator wrapper : overflow: clip (Figma node 3507:192/3507:196) para recortar números 2 dígitos.\n * • label color : default/completed-vertical = text/sub-600; active/completed-horizontal = text/strong-950.\n * • horizontal : container gap 16px, item gap 8px, separador arrow-right-s-line size20 (icon/soft-400).\n * • vertical : container gap 8px, item gap 10px, padding 8px, radius-10.\n * • vertical card active: bg-white-0 + regular-shadow/x-small; default/completed bg-weak-50.\n * • vertical chevron : solo en active, arrow-right-s-line size20 icon/sub-600.\n *\n * ── PENDING VERIFY (inferido, NO confirmado 1:1 en Figma) ──\n * • COLOR PRIMARIO: Figma marca el active indicator con primary-base=#335cff (AZUL del DS SUI).\n * El proyecto sobreescribe --sui-primary-base a #fa7319 (NARANJA brand). Se mantiene\n * --sui-primary-base (consistente con todos los demás SUI del proyecto). El stepper se\n * renderiza naranja, no azul → divergencia visual deliberada vs Figma genérico. Confirmar\n * con diseño si el stepper debe forzar azul (usar --sui-state-information-base) o seguir el brand.\n * • Transiciones 100/120ms ease-out en bg/box-shadow/color: NO especificadas en Figma (UX add).\n * (Separador horizontal CONFIRMADO 2026-05-29: node 3507:28 variable_defs expone icon/soft-400 → --sui-icon-soft-400.)\n * • Estados 'error' + variant 'dot' + input errorStep/interactive/ariaLabel: extra features del\n * proyecto, NO existen en los nodos Figma auditados — preservados intactos.\n */\n@Component({\n selector: 'sui-stepper',\n standalone: true,\n templateUrl: './sui-stepper.html',\n styleUrl: './sui-stepper.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-variant]': 'variant()',\n '[attr.data-size]': 'size()',\n '[attr.role]': '\"list\"',\n '[attr.aria-label]': 'ariaLabel()',\n },\n})\nexport class SuiStepper {\n readonly variant = input<SuiStepperVariant>('horizontal');\n readonly steps = input<SuiStepperItem[]>([]);\n readonly count = input<number>(0);\n readonly currentStep = input<number>(0);\n /** Index 0-based del step que debe marcarse como 'error' (estado rojo).\n Si está set, los steps anteriores quedan 'completed', este queda 'error'\n y los posteriores quedan 'default'. Útil para flows abortados (cancelled, failed). */\n readonly errorStep = input<number | null>(null);\n readonly size = input<SuiStepperSize>('small');\n readonly interactive = input<boolean>(false);\n readonly ariaLabel = input<string>('Progreso');\n\n readonly stepClick = output<number>();\n\n /**\n * Vista pre-computada de items. Una sola pasada por cambio de inputs:\n * - resuelve length: steps.length || count (para variant=dot sin labels)\n * - clamp currentStep al rango [0, length-1]\n * - asigna state según índice\n *\n * El template itera esto con @for. Sin métodos en template (anti-pattern CD).\n */\n readonly items = computed<SuiStepperItemView[]>(() => {\n const list = this.steps();\n const length = list.length > 0 ? list.length : Math.max(0, this.count());\n if (length === 0) return [];\n /* Permitimos cur en [0, length]. Cuando cur === length todos los items\n quedan 'completed' (flow finalizado: ej. orden entregada). */\n const cur = Math.max(0, Math.min(this.currentStep(), length));\n const err = this.errorStep();\n const hasError = err !== null && err >= 0 && err < length;\n return Array.from({ length }, (_, i) => {\n let state: SuiStepperState;\n if (hasError) {\n if (i < (err as number)) state = 'completed';\n else if (i === err) state = 'error';\n else state = 'default';\n } else {\n state = i < cur ? 'completed' : i === cur ? 'active' : 'default';\n }\n return {\n index: i,\n state,\n label: list[i]?.label ?? `Step ${i + 1}`,\n number: String(i + 1),\n isLast: i === length - 1,\n };\n });\n });\n\n onItemClick(index: number): void {\n if (this.interactive()) {\n this.stepClick.emit(index);\n }\n }\n}\n","@switch (variant()) {\n\n @case ('dot') {\n @for (item of items(); track item.index) {\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"sui-stepper__dot\"\n [attr.data-state]=\"item.state\"\n [attr.aria-label]=\"item.label\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n (click)=\"onItemClick(item.index)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n </button>\n } @else {\n <span\n class=\"sui-stepper__dot\"\n [attr.data-state]=\"item.state\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n role=\"listitem\">\n </span>\n }\n }\n }\n\n @case ('horizontal') {\n @for (item of items(); track item.index) {\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"sui-stepper__h-item\"\n [attr.data-state]=\"item.state\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n (click)=\"onItemClick(item.index)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <span class=\"sui-stepper__indicator\">\n @if (item.state === 'completed') {\n <sui-icon name=\"checkbox-circle-fill\" [size]=\"20\" />\n } @else if (item.state === 'error') {\n <sui-icon name=\"close-circle-fill\" [size]=\"20\" />\n } @else {\n <span class=\"sui-stepper__indicator-num\">{{ item.number }}</span>\n }\n </span>\n <span class=\"sui-stepper__label\">{{ item.label }}</span>\n </button>\n } @else {\n <div\n class=\"sui-stepper__h-item\"\n [attr.data-state]=\"item.state\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n role=\"listitem\">\n <span class=\"sui-stepper__indicator\">\n @if (item.state === 'completed') {\n <sui-icon name=\"checkbox-circle-fill\" [size]=\"20\" />\n } @else if (item.state === 'error') {\n <sui-icon name=\"close-circle-fill\" [size]=\"20\" />\n } @else {\n <span class=\"sui-stepper__indicator-num\">{{ item.number }}</span>\n }\n </span>\n <span class=\"sui-stepper__label\">{{ item.label }}</span>\n </div>\n }\n @if (!item.isLast) {\n <span class=\"sui-stepper__separator\" aria-hidden=\"true\">\n <sui-icon name=\"arrow-right-s-line\" [size]=\"20\" />\n </span>\n }\n }\n }\n\n @case ('vertical') {\n @for (item of items(); track item.index) {\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"sui-stepper__v-item\"\n [attr.data-state]=\"item.state\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n (click)=\"onItemClick(item.index)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\">\n <span class=\"sui-stepper__indicator\">\n @if (item.state === 'completed') {\n <sui-icon name=\"checkbox-circle-fill\" [size]=\"20\" />\n } @else if (item.state === 'error') {\n <sui-icon name=\"close-circle-fill\" [size]=\"20\" />\n } @else {\n <span class=\"sui-stepper__indicator-num\">{{ item.number }}</span>\n }\n </span>\n <span class=\"sui-stepper__label\">{{ item.label }}</span>\n @if (item.state === 'active') {\n <span class=\"sui-stepper__chevron\" aria-hidden=\"true\">\n <sui-icon name=\"arrow-right-s-line\" [size]=\"20\" />\n </span>\n }\n </button>\n } @else {\n <div\n class=\"sui-stepper__v-item\"\n [attr.data-state]=\"item.state\"\n [attr.aria-current]=\"item.state === 'active' ? 'step' : null\"\n role=\"listitem\">\n <span class=\"sui-stepper__indicator\">\n @if (item.state === 'completed') {\n <sui-icon name=\"checkbox-circle-fill\" [size]=\"20\" />\n } @else if (item.state === 'error') {\n <sui-icon name=\"close-circle-fill\" [size]=\"20\" />\n } @else {\n <span class=\"sui-stepper__indicator-num\">{{ item.number }}</span>\n }\n </span>\n <span class=\"sui-stepper__label\">{{ item.label }}</span>\n @if (item.state === 'active') {\n <span class=\"sui-stepper__chevron\" aria-hidden=\"true\">\n <sui-icon name=\"arrow-right-s-line\" [size]=\"20\" />\n </span>\n }\n </div>\n }\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport interface SuiStoreCardData {\n id: string;\n name: string;\n businessType?: string;\n district?: string;\n rating?: number | null;\n distanceKm?: number | null;\n deliveryFee?: number;\n deliveryType?: 'free' | 'pickup' | 'courier' | 'auto' | string;\n /** Recojo en tienda (independiente del deliveryType en el modelo nuevo). */\n offersPickup?: boolean;\n isOpen?: boolean;\n isSuspended?: boolean;\n /** Solo true cuando el dueño del local está viendo su propio local\n en preview (status draft/pending_approval/rejected) o cuando el\n super-admin lo está revisando en la cola de aprobación. */\n isOwnerPreview?: boolean;\n /** Status real cuando isOwnerPreview=true. Permite mostrar copy específico\n de cada caso (Borrador, En revisión, Rechazado). */\n ownerPreviewStatus?: 'draft' | 'pending_approval' | 'rejected' | null;\n /** Motivo del rechazo del superadmin (solo cuando ownerPreviewStatus='rejected'). */\n ownerRejectionReason?: string | null;\n /** True cuando el dueño está viendo su propio local YA aprobado y operativo\n (active/trial/grace). Sirve para mostrarle un alert verde de \"ya estás\n público\" sin afectar la card en sí. */\n isOwnerApproved?: boolean;\n logoUrl?: string | null;\n coverUrl?: string | null;\n}\n\ninterface PreviewBadge {\n label: string;\n variant: 'draft' | 'pending' | 'rejected';\n}\n\n@Component({\n selector: 'sui-store-card',\n templateUrl: './sui-store-card.html',\n styleUrl: './sui-store-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterLink, SuiIcon],\n})\nexport class SuiStoreCard {\n readonly store = input.required<SuiStoreCardData>();\n readonly isFavorite = input(false);\n /** Si true, no se navega al detalle (caso suspendido). El padre puede sobreescribir. */\n readonly disableLink = input(false);\n\n readonly toggleFavorite = output<Event>();\n /** Emite cuando el usuario tapea la sección de calificación. El padre debe\n * abrir `StoreRatingsModalService.open(id, name, logoUrl)` para mostrar\n * el detalle de reviews en un modal fullscreen. */\n readonly ratingClicked = output<{ id: string; name: string; logoUrl: string | null }>();\n\n readonly link = computed(() => {\n const s = this.store();\n if (this.disableLink() || s.isSuspended) return null;\n return ['/cliente/restaurante', s.id];\n });\n\n readonly initial = computed(() => this.store().name?.charAt(0) ?? '');\n\n readonly ratingLabel = computed(() => {\n const r = this.store().rating;\n return r != null && r > 0 ? r.toFixed(1) : 'Nuevo';\n });\n\n readonly distanceLabel = computed(() => {\n const km = this.store().distanceKm;\n if (km == null) return '—';\n return km < 1 ? Math.round(km * 1000) + ' m' : km.toFixed(1) + ' km';\n });\n\n /** En owner-preview hay un badge custom (Borrador/En revisión/Rechazado).\n Devuelve null cuando no aplica (modo cliente normal). */\n readonly previewBadge = computed<PreviewBadge | null>(() => {\n const s = this.store();\n if (!s.isOwnerPreview) return null;\n switch (s.ownerPreviewStatus) {\n case 'draft': return { label: 'Borrador', variant: 'draft' };\n case 'pending_approval': return { label: 'En revisión', variant: 'pending' };\n case 'rejected': return { label: 'Rechazado', variant: 'rejected' };\n default: return { label: 'En revisión', variant: 'pending' };\n }\n });\n\n /** Etiqueta corta de envío (Gratis/Recojo/Courier/S/X). */\n readonly deliveryLabel = computed(() => {\n const s = this.store();\n switch (s.deliveryType) {\n case 'free': return 'Gratis';\n case 'pickup': return 'Recojo';\n case 'courier': return 'Courier';\n default: return s.deliveryFee != null ? `S/ ${s.deliveryFee}` : '—';\n }\n });\n\n onFavClick(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.toggleFavorite.emit(event);\n }\n\n onCardClick(event: Event): void {\n if (this.store().isSuspended) event.preventDefault();\n }\n\n onRatingClick(event: Event): void {\n /* Stop propagation para no disparar el routerLink de la card.\n PreventDefault para que el `<a>` no navegue. Solo emitimos al padre. */\n event.preventDefault();\n event.stopPropagation();\n const s = this.store();\n this.ratingClicked.emit({ id: s.id, name: s.name, logoUrl: s.logoUrl ?? null });\n }\n}\n","<a class=\"store\"\n [class.store--suspended]=\"store().isSuspended\"\n [class.store--closed]=\"!store().isOpen && !store().isSuspended && !store().isOwnerPreview\"\n [class.store--preview]=\"store().isOwnerPreview\"\n [routerLink]=\"link()\"\n (click)=\"onCardClick($event)\">\n\n <div class=\"store__cover\"\n [style.background-image]=\"store().coverUrl ? 'url(' + store().coverUrl + ')' : null\"\n [class.store__cover--fallback]=\"!store().coverUrl\">\n <div class=\"store__cover-grad\"></div>\n\n @if (!store().isOwnerPreview) {\n <button type=\"button\"\n class=\"store__fav\"\n [class.store__fav--active]=\"isFavorite()\"\n (click)=\"onFavClick($event)\"\n aria-label=\"Favorito\">\n <sui-icon\n [name]=\"isFavorite() ? 'heart-fill' : 'heart-line'\"\n [size]=\"18\"\n color=\"#fa7319\"\n ></sui-icon>\n </button>\n }\n\n @if (store().isSuspended) {\n <span class=\"store__status store__status--suspended\">No disponible</span>\n } @else if (previewBadge(); as pb) {\n <span class=\"store__status\"\n [class.store__status--draft]=\"pb.variant === 'draft'\"\n [class.store__status--pending]=\"pb.variant === 'pending'\"\n [class.store__status--rejected]=\"pb.variant === 'rejected'\">\n {{ pb.label }}\n </span>\n } @else {\n <span class=\"store__status\"\n [class.store__status--open]=\"store().isOpen\"\n [class.store__status--closed]=\"!store().isOpen\">\n {{ store().isOpen ? 'Abierto' : 'Cerrado' }}\n </span>\n }\n </div>\n\n <div class=\"store__body\">\n <div class=\"store__logo\">\n @if (store().logoUrl) {\n <img [src]=\"store().logoUrl\" [alt]=\"store().name\" (error)=\"$any($event).target.style.display='none'\" />\n } @else {\n {{ initial() }}\n }\n </div>\n <div class=\"store__info\">\n <h3 class=\"store__name\">{{ store().name }}</h3>\n <p class=\"store__type\">{{ store().businessType }}</p>\n\n @if (store().isOwnerPreview) {\n <!-- Modo preview (owner viendo borrador/revisión, super-admin revisando):\n solo Ubicación + Envío. Rating + Distancia no aplican antes de aprobar. -->\n <div class=\"store__meta store__meta--preview\">\n <div class=\"store__stat\">\n <span class=\"store__stat-label\">Ubicación</span>\n <span class=\"store__stat-value\">\n <sui-icon name=\"map-pin-line\" [size]=\"13\" color=\"var(--brand-500, #fa7319)\"></sui-icon>\n {{ store().district || '—' }}\n </span>\n </div>\n <div class=\"store__stat\">\n <span class=\"store__stat-label\">Envío</span>\n <span class=\"store__stat-value\">{{ deliveryLabel() }}</span>\n </div>\n </div>\n } @else {\n <div class=\"store__meta\">\n <button\n type=\"button\"\n class=\"store__stat store__stat--clickable\"\n (click)=\"onRatingClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n [attr.aria-label]=\"'Ver calificaciones del local'\"\n >\n <span class=\"store__stat-label\">Calificación</span>\n <span class=\"store__stat-value\">\n <sui-icon name=\"star-fill\" [size]=\"13\" color=\"var(--brand-500, #fa7319)\"></sui-icon>\n {{ ratingLabel() }}\n </span>\n </button>\n <div class=\"store__stat\">\n <span class=\"store__stat-label\">Ubicación</span>\n <span class=\"store__stat-value\">\n <sui-icon name=\"map-pin-line\" [size]=\"13\" color=\"var(--brand-500, #fa7319)\"></sui-icon>\n {{ store().district || '—' }}\n </span>\n </div>\n <div class=\"store__stat\">\n <span class=\"store__stat-label\">Envío</span>\n <span class=\"store__stat-value\">{{ deliveryLabel() }}</span>\n </div>\n <div class=\"store__stat\">\n <span class=\"store__stat-label\">Distancia</span>\n <span class=\"store__stat-value\">{{ distanceLabel() }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</a>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiSwitch, type SuiSwitchSize } from '../sui-switch/sui-switch';\nimport { SuiEmoji, type SuiEmojiName } from '../sui-emoji/sui-emoji';\nimport { SuiAvatar } from '../sui-avatar/sui-avatar';\n\nexport type SuiSwitchCardType =\n | 'basic'\n | 'left-icon'\n | 'avatar'\n | 'card-provider'\n | 'brand'\n | 'company';\n\n/**\n * SUI Switch Card — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 385:4733 (Switch Card [1.1])\n *\n * Card seleccionable con un toggle switch a la derecha.\n *\n * EXACT (pulled from Figma, verified during build):\n * - Component_set 385:4733 verified (named \"Switch Card [1.1]\")\n * - Container: padding 16, gap 14, radius 12, items-start, w 360 (default frame)\n * - Default: bg-white-0 + 1px stroke-soft-200 + shadow-x-small\n * - Hover: bg-weak-50 (sin border)\n * - Active: bg-white-0 + 1px primary-base (border) [aplica con [data-sui-checked]]\n * - Disabled: bg-white-0 + 1px stroke-soft-200 (sin shadow) + textos sub/soft\n * - Label: 14/20 medium strong-950 (-0.084px letter-spacing)\n * - Sublabel: 12/16 regular sub-600\n * - Description: 12/16 regular sub-600\n * - Title row gap: 4px, Body gap: 4px\n * - Built-in NEW badge: padding 2/8, radius 999, bg state/information/light, text\n * state/information/dark, 11/12 500 0.22px uppercase. Color INFORMATION azul,\n * fiel a Figma (DECISIONES.md §1: para este badge \"se cambió a azul (fiel Figma)\";\n * el naranja de marca aplica solo al active border / focus ring).\n *\n * LEADING SLOTS (verified vs Figma 2026-05-29, pull per-type design-context):\n * - basic → sin leading.\n * - left-icon → container 40px circle white-0 + 1px stroke-soft-200 +\n * shadow-x-small + padding 10 (icon 20×20 dentro). [convención\n * proyecto; Figma usa icon genérico, geometría coherente].\n * - avatar → sui-avatar size=lg 40×40 redondo (385:4751).\n * - card-provider → logo de tarjeta 32×24 bare, radius 4, overflow hidden.\n * El bg oscuro (#252525 en el placeholder Mastercard) es\n * PARTE DEL LOGO, no del contenedor. (385:4760).\n * - brand → logo 40×40 bare (sin circle/border), overflow hidden.\n * Placeholder Figma: Spotify 40×40. (385:4769).\n * - company → circle 40×40 rounded-full + overflow hidden. El bg\n * (purple/500 #7d52f4 en placeholder Synergy) es parte del\n * logo de la empresa, no un token del contenedor. (385:4778).\n * Los 3 tipos nuevos (card-provider/brand/company) reciben su logo vía el\n * slot de proyección [sui-switch-card-leading] (img/svg/sui-icon arbitrario),\n * consistente con left-icon. No se añadió prop dedicado para evitar API rígida.\n *\n * VERIFIED STATES (design-context per state, 2026-05-29):\n * - Hover (385:4787): bg-weak-50, SIN border, SIN shadow, overflow hidden.\n * - Active/checked (385:4840): bg-white-0 + 1px primary-base + sin shadow.\n * - Disabled (385:4893): bg-white-0 + 1px stroke-soft-200 sin shadow.\n * - Container: overflow hidden (overflow-clip) en TODAS las variantes.\n *\n * SHORTCUT (informativo):\n * - Letter-spacing label: -0.006em (= -0.084px @14px). Em escala con font-size.\n * - Focus-visible ring 0+2px white-0 + 0+4px primary-base: convención proyecto\n * (Figma no documenta focus state explícito).\n * - Switch internal margin-top 2px para baseline align: convención visual.\n *\n * COLOR MAPPING:\n * #c0d5ff → --sui-state-information-light (NEW badge bg, fiel Figma)\n * #122368 → --sui-state-information-dark (NEW badge text, fiel Figma)\n * No hex hardcoded fuera de los fallbacks de los tokens.\n *\n * Form integration:\n * - Implementa ControlValueAccessor: usable con [(ngModel)] / [formControl].\n * - El click en cualquier parte del card togglea el switch.\n *\n * iOS WKWebView fix: touch listeners en host (CLAUDE.md).\n */\n@Component({\n selector: 'sui-switch-card',\n standalone: true,\n templateUrl: './sui-switch-card.html',\n styleUrl: './sui-switch-card.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiSwitch, SuiEmoji, SuiAvatar],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiSwitchCard),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-checked]': 'effectiveChecked() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.role]': '\"group\"',\n '[attr.aria-disabled]': 'isDisabled() ? \"true\" : null',\n '(click)': 'onCardClick($event)',\n '(keydown.space)': 'onCardKey($event)',\n '(keydown.enter)': 'onCardKey($event)',\n /* iOS WKWebView fix — ver CLAUDE.md \"iOS :active stuck en custom buttons\". */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiSwitchCard implements ControlValueAccessor {\n readonly type = input<SuiSwitchCardType>('basic');\n /** Tamaño del switch interno — lo decide el padre (componente dumb). */\n readonly size = input<SuiSwitchSize>('medium');\n readonly label = input('');\n readonly sublabel = input<string | null>(null);\n readonly description = input<string | null>(null);\n\n /**\n * Emoji animado del catálogo `SUI_EMOJI_MAP` para el slot leading.\n * Solo aplica cuando `type='left-icon'`. Si está presente, reemplaza al\n * `<sui-icon>` proyectado vía `[sui-switch-card-leading]` y se renderiza\n * con las MISMAS dimensiones (20×20 dentro del círculo de 40px).\n */\n readonly emoji = input<SuiEmojiName | null>(null);\n\n /**\n * URL de imagen para type='avatar' — se renderiza con sui-avatar size=lg\n * (40×40 redonda). Si la imagen falla, fallback automático a iniciales del\n * label. Para los otros types se ignora.\n */\n readonly imageUrl = input<string | null>(null);\n\n /** Si true, muestra el badge NEW built-in al lado del sublabel. */\n readonly badge = input(false);\n\n /** Custom label para el badge (default 'NEW'). Solo aplica si badge=true. */\n readonly badgeLabel = input('NEW');\n\n /** Estado del switch — controlled pattern (input + output, no model).\n * Ver `sui-switch.ts` para la justificación (anti-loop protection bug). */\n readonly checked = input(false);\n readonly checkedChange = output<boolean>();\n\n readonly disabled = input(false);\n\n /** CVA buffer — usado SOLO en form mode (formControlName/formControl). */\n private readonly _cvaValue = signal(false);\n private readonly _useCvaValue = signal(false);\n\n /** Estado VISIBLE — input del parent en uso normal, _cvaValue en form mode. */\n readonly effectiveChecked = computed(() => {\n if (this._useCvaValue()) return this._cvaValue();\n return this.checked();\n });\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** True si type requiere render del slot leading. */\n readonly hasLeading = computed(() => this.type() !== 'basic');\n\n /** Iniciales para fallback de sui-avatar cuando la imagen no carga. */\n readonly initialsFromLabel = computed(() => {\n const l = this.label().trim();\n if (!l) return '';\n return l.split(/\\s+/).slice(0, 2).map(w => w[0]?.toUpperCase() ?? '').join('');\n });\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n // ── Click handling ──────────────────────────────────────────────────\n // Click en cualquier parte del card togglea, EXCEPTO si el target es el\n // propio switch (el switch maneja su click internamente y dispatchea\n // checked.set() vía two-way binding — evitamos doble-toggle).\n\n onCardClick(e: MouseEvent): void {\n if (this.isDisabled()) return;\n const target = e.target as HTMLElement | null;\n if (target?.closest('sui-switch')) return;\n this.emitToggle();\n }\n\n onCardKey(e: Event): void {\n if (this.isDisabled()) return;\n e.preventDefault();\n this.emitToggle();\n }\n\n /** Reacciona al event del switch hijo — re-emite hacia el parent. */\n onSwitchChange(value: boolean): void {\n if (this.isDisabled()) return;\n if (this._useCvaValue()) this._cvaValue.set(value);\n this.checkedChange.emit(value);\n this._onChange(value);\n this._onTouched();\n }\n\n /** Emite intent hacia el parent. NO muta el state internamente (input es\n * one-way). En form mode, actualiza el buffer CVA. */\n private emitToggle(): void {\n const next = !this.effectiveChecked();\n if (this._useCvaValue()) this._cvaValue.set(next);\n this.checkedChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n // ── ControlValueAccessor ────────────────────────────────────────────\n writeValue(v: boolean): void {\n this._cvaValue.set(!!v);\n this._useCvaValue.set(true);\n }\n registerOnChange(fn: (v: boolean) => void): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","@if (hasLeading()) {\n <div class=\"sui-switch-card__leading\">\n @switch (type()) {\n @case ('left-icon') {\n <div class=\"sui-switch-card__leading-icon\">\n @if (emoji(); as e) {\n <sui-emoji class=\"sui-switch-card__leading-emoji\" [name]=\"e\" size=\"sm\" />\n } @else {\n <ng-content select=\"[sui-switch-card-leading]\" />\n }\n </div>\n }\n @case ('avatar') {\n <sui-avatar\n class=\"sui-switch-card__leading-avatar\"\n size=\"lg\"\n [src]=\"imageUrl()\"\n [initials]=\"initialsFromLabel()\" />\n }\n @case ('card-provider') {\n <!-- Logo de tarjeta 32×24 (Visa/Mastercard). El bg es parte del logo. -->\n <div class=\"sui-switch-card__leading-card-provider\">\n @if (imageUrl(); as src) {\n <img [src]=\"src\" alt=\"\" class=\"sui-switch-card__leading-img\" />\n } @else {\n <ng-content select=\"[sui-switch-card-leading]\" />\n }\n </div>\n }\n @case ('brand') {\n <!-- Logo de marca 40×40 bare (sin circle/border). -->\n <div class=\"sui-switch-card__leading-brand\">\n @if (imageUrl(); as src) {\n <img [src]=\"src\" alt=\"\" class=\"sui-switch-card__leading-img\" />\n } @else {\n <ng-content select=\"[sui-switch-card-leading]\" />\n }\n </div>\n }\n @case ('company') {\n <!-- Logo de empresa 40×40 circle (el bg es parte del logo). -->\n <div class=\"sui-switch-card__leading-company\">\n @if (imageUrl(); as src) {\n <img [src]=\"src\" alt=\"\" class=\"sui-switch-card__leading-img\" />\n } @else {\n <ng-content select=\"[sui-switch-card-leading]\" />\n }\n </div>\n }\n @default {\n <ng-content select=\"[sui-switch-card-leading]\" />\n }\n }\n </div>\n}\n\n<div class=\"sui-switch-card__body\">\n <div class=\"sui-switch-card__title\">\n <span class=\"sui-switch-card__label\">{{ label() }}</span>\n @if (sublabel(); as sub) {\n <span class=\"sui-switch-card__sublabel\">{{ sub }}</span>\n }\n @if (badge()) {\n <span class=\"sui-switch-card__badge\">{{ badgeLabel() }}</span>\n }\n </div>\n @if (description(); as desc) {\n <p class=\"sui-switch-card__description\">{{ desc }}</p>\n }\n</div>\n\n<sui-switch\n class=\"sui-switch-card__switch\"\n [size]=\"size()\"\n [checked]=\"effectiveChecked()\"\n [disabled]=\"isDisabled()\"\n (checkedChange)=\"onSwitchChange($event)\"\n/>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiSwitch, type SuiSwitchSize } from '../sui-switch/sui-switch';\nimport { SuiBadge } from '../sui-badge/sui-badge';\n\n/**\n * SUI Switch Label — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: 385:4580 (\"Switch Label [1.1]\") — 8 variants\n * Active(off/on) × Description(off/on) × Flip(off/on)\n *\n * Espejo de `sui-checkbox-label` pero con `sui-switch` interno.\n *\n * EXACT (pulled from Figma):\n * Container flex gap-8 items-start\n * Switch slot 32×20 (medium), shrink-0\n * Content column\n * description=off → flex gap-4 items-center: Label + Sublabel + Badge\n * description=on → flex flex-col gap-10:\n * Title row: Label + Sublabel + Badge\n * Description (12/16 sub-600)\n * Link Button (12/16 primary-base, opcional)\n * Flip swap order switch ↔ content (label a la izquierda)\n *\n * Typography (idéntica a sui-checkbox-label):\n * Label sin description Inter Regular 14/20, ls -0.6%, text/strong-950\n * Label con description Inter Medium 14/20, ls -0.6%, text/strong-950\n * Sublabel Inter Regular 12/16, ls 0, text/sub-600\n * Description Inter Regular 12/16, ls 0, text/sub-600\n * Badge \"NEW\" Inter Medium 11/12, tracking 2 UPPERCASE, accent de\n * MARCA naranja (NO azul SUI — DECISIONES.md §1):\n * sui-badge color=\"orange\" variant=\"light\"\n * Link Button Inter Medium 12/16, primary-base\n *\n * Token map (Figma → sui-tokens):\n * text/strong-950 → --sui-text-strong-950\n * text/sub-600 → --sui-text-sub-600\n * text/disabled-300 → --sui-text-disabled-300\n * state/warning/light → --sui-state-warning-light (NEW badge bg via sui-badge orange)\n * state/warning/dark → --sui-state-warning-dark (NEW badge text via sui-badge orange)\n * primary-base → --sui-primary-base (project remaps to #fa7319)\n *\n * PENDING VERIFY:\n * - Hover state: el switch interno maneja su propio hover. El wrapper no\n * agrega estado propio salvo opacity en disabled (project convention).\n * - Disabled visual: hereda del sui-switch + opacity 0.5 del wrapper.\n *\n * Form integration:\n * - ControlValueAccessor con value boolean.\n * - Two-way `active` model.\n *\n * Usage:\n * <sui-switch-label label=\"Recibir push\" [(active)]=\"pushEnabled\" />\n *\n * <sui-switch-label\n * label=\"Modo oscuro\"\n * description=\"Activa el tema oscuro en toda la app.\"\n * linkLabel=\"Saber más\"\n * [(active)]=\"darkMode\"\n * />\n */\n@Component({\n selector: 'sui-switch-label',\n standalone: true,\n templateUrl: './sui-switch-label.html',\n styleUrl: './sui-switch-label.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiSwitch, SuiBadge],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiSwitchLabel),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-flip]': 'flip() ? \"\" : null',\n '[attr.data-sui-with-description]': 'description() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '(click)': 'onLabelClick($event)',\n },\n})\nexport class SuiSwitchLabel implements ControlValueAccessor {\n readonly label = input<string>('');\n readonly sublabel = input<string | null>(null);\n readonly description = input<string | null>(null);\n /** Tamaño del switch interno — lo decide el padre (componente dumb). */\n readonly size = input<SuiSwitchSize>('medium');\n\n readonly badge = input(false);\n readonly badgeLabel = input('NEW');\n\n readonly linkLabel = input<string | null>(null);\n\n /** Si true, invierte orden: [content] [switch] (label a la izquierda). */\n readonly flip = input(false);\n\n readonly disabled = input(false);\n\n /** Estado del switch — controlled pattern (input + output, NO model).\n * Espeja a `sui-switch` y `sui-switch-card`: el componente NO muta su state\n * internamente; solo emite intent via `activeChange`. El parent decide vía el\n * binding `[(active)]`. Justificación (anti-loop protection bug de model) en\n * `sui-switch.ts` líneas 17-36. */\n readonly active = input(false);\n readonly activeChange = output<boolean>();\n\n readonly linkClick = output<MouseEvent>();\n\n // ── ControlValueAccessor ──────────────────────────────────────────────\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** CVA buffer — usado SOLO en form mode (formControlName/formControl). */\n private readonly _cvaValue = signal(false);\n private readonly _useCvaValue = signal(false);\n\n /** Estado VISIBLE — input del parent en uso normal, _cvaValue en form mode. */\n readonly effectiveActive = computed(() => {\n if (this._useCvaValue()) return this._cvaValue();\n return this.active();\n });\n\n private _onChange: (v: boolean) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Click en cualquier parte del label emite el toggle del switch interno. */\n onLabelClick(event: MouseEvent): void {\n if (this.isDisabled()) return;\n const target = event.target as HTMLElement;\n if (target.closest('sui-switch')) return;\n if (target.closest('.sui-switch-label__link')) return;\n this.emitToggle();\n }\n\n onSwitchChange(next: boolean): void {\n if (this.isDisabled()) return;\n if (next === this.effectiveActive()) return;\n if (this._useCvaValue()) this._cvaValue.set(next);\n this.activeChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n /** Emite intent hacia el parent. NO muta el input (one-way). En form mode,\n * actualiza el buffer CVA. */\n private emitToggle(): void {\n const next = !this.effectiveActive();\n if (this._useCvaValue()) this._cvaValue.set(next);\n this.activeChange.emit(next);\n this._onChange(next);\n this._onTouched();\n }\n\n onLinkClick(event: MouseEvent): void {\n event.stopPropagation();\n if (this.isDisabled()) {\n event.preventDefault();\n return;\n }\n this.linkClick.emit(event);\n }\n\n writeValue(v: boolean): void {\n this._cvaValue.set(!!v);\n this._useCvaValue.set(true);\n }\n registerOnChange(fn: (v: boolean) => void): void {\n this._onChange = fn;\n this._useCvaValue.set(true);\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<sui-switch\n class=\"sui-switch-label__switch\"\n [size]=\"size()\"\n [checked]=\"effectiveActive()\"\n [disabled]=\"isDisabled()\"\n (checkedChange)=\"onSwitchChange($event)\"\n/>\n\n<div class=\"sui-switch-label__content\">\n <div class=\"sui-switch-label__title\">\n <span class=\"sui-switch-label__label\">{{ label() }}</span>\n @if (sublabel(); as sl) {\n <span class=\"sui-switch-label__sublabel\">{{ sl }}</span>\n }\n @if (badge()) {\n <sui-badge\n class=\"sui-switch-label__badge\"\n color=\"orange\"\n variant=\"light\"\n size=\"small\"\n >{{ badgeLabel() }}</sui-badge>\n }\n </div>\n\n @if (description(); as desc) {\n <p class=\"sui-switch-label__description\">{{ desc }}</p>\n\n @if (linkLabel(); as link) {\n <button\n type=\"button\"\n class=\"sui-switch-label__link\"\n [disabled]=\"isDisabled()\"\n (click)=\"onLinkClick($event)\"\n (touchstart)=\"$event.currentTarget\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >{{ link }}</button>\n }\n }\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewChild,\n computed,\n effect,\n input,\n model,\n signal,\n} from '@angular/core';\n\nexport interface SuiTabChipItem {\n /** Valor único del chip (lo que devuelve `value`). */\n value: string;\n /** Texto visible del chip. */\n label: string;\n /**\n * Count opcional renderizado como pill pequeña al lado del label.\n * Útil para filtros con cantidades (ej. \"Pendientes (5)\"). Si es `0` o\n * `undefined`, no se renderiza la pill. Útil cuando el conteo está vacío\n * y no quieres mostrar un \"(0)\" feo.\n */\n count?: number;\n}\n\n/**\n * SUI Tab Chips — chips horizontales scrollables (estilo \"category nav\" de\n * apps de food/delivery). Útil cuando hay 5+ secciones que no caben en un\n * tabs tradicional.\n *\n * Variantes:\n * - `sticky=false` (default) → comportamiento normal, scroll horizontal.\n * - `sticky=true` → se pega al top del scroll container. En modo stuck\n * extiende padding-top con safe-area-inset-top y aplica bg opaco.\n *\n * API:\n * <sui-tab-chips\n * [chips]=\"['Hamburguesas', 'Pizzas', 'Bebidas']\"\n * [(value)]=\"selected\"\n * [sticky]=\"true\"\n * />\n *\n * También acepta objetos:\n * <sui-tab-chips\n * [chips]=\"[{value:'h', label:'Hamburguesas'}, {value:'p', label:'Pizzas'}]\"\n * [(value)]=\"selected\"\n * />\n */\n@Component({\n selector: 'sui-tab-chips',\n templateUrl: './sui-tab-chips.html',\n styleUrl: './sui-tab-chips.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class SuiTabChips implements AfterViewInit, OnDestroy {\n /** Lista de chips. Acepta array de strings (label = value) o array de objetos. */\n readonly chips = input.required<readonly (string | SuiTabChipItem)[]>();\n\n /** Valor seleccionado (model two-way). */\n readonly value = model<string>('');\n\n /** Si true, el componente queda sticky al top del scroll container. */\n readonly sticky = input(false);\n\n /** Auto-scroll horizontal del chip activo al cambiar `value`. */\n readonly autoScroll = input(true);\n\n @ViewChild('sentinel') sentinelRef?: ElementRef<HTMLDivElement>;\n @ViewChild('nav') navRef?: ElementRef<HTMLElement>;\n\n /** Estado interno: chip pegado al top del viewport (solo si sticky=true). */\n protected readonly stuck = signal(false);\n\n /** Normaliza el input a SuiTabChipItem[] para iteración uniforme. */\n protected readonly normalizedChips = computed<SuiTabChipItem[]>(() =>\n this.chips().map(c => typeof c === 'string' ? { value: c, label: c } : c)\n );\n\n private _intersectionObserver?: IntersectionObserver;\n\n constructor() {\n /* Default al PRIMER chip: si el `value` está vacío o no corresponde a ningún\n chip (ej. quedó uno viejo tras cambiar la lista), se selecciona el primero\n y se emite. Garantiza que en todos los flujos el componente arranque en el\n primer chip por defecto. */\n effect(() => {\n const chips = this.normalizedChips();\n if (!chips.length) return;\n if (!chips.some(c => c.value === this.value())) {\n this.value.set(chips[0].value);\n }\n });\n\n /* Auto-scroll al chip activo cuando cambia value (UX típica de catnavs). */\n effect(() => {\n const v = this.value();\n if (!v || !this.autoScroll()) return;\n queueMicrotask(() => this.scrollToChip(v));\n });\n }\n\n ngAfterViewInit(): void {\n if (this.sticky() && typeof IntersectionObserver !== 'undefined' && this.sentinelRef) {\n this._intersectionObserver = new IntersectionObserver(\n ([entry]) => this.stuck.set(!entry.isIntersecting),\n { rootMargin: '0px', threshold: 0 },\n );\n this._intersectionObserver.observe(this.sentinelRef.nativeElement);\n }\n }\n\n ngOnDestroy(): void {\n this._intersectionObserver?.disconnect();\n }\n\n protected select(value: string): void {\n this.value.set(value);\n }\n\n private scrollToChip(value: string): void {\n const nav = this.navRef?.nativeElement;\n if (!nav) return;\n const target = nav.querySelector<HTMLElement>(`[data-sui-chip-value=\"${CSS.escape(value)}\"]`);\n if (!target) return;\n const navRect = nav.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const offset = targetRect.left - navRect.left + nav.scrollLeft - (navRect.width - targetRect.width) / 2;\n nav.scrollTo({ left: Math.max(0, offset), behavior: 'smooth' });\n }\n}\n","@if (sticky()) {\n <div #sentinel class=\"sui-tab-chips__sentinel\" aria-hidden=\"true\"></div>\n}\n<nav\n #nav\n class=\"sui-tab-chips\"\n [class.sui-tab-chips--sticky]=\"sticky()\"\n [class.sui-tab-chips--stuck]=\"sticky() && stuck()\"\n role=\"tablist\"\n>\n @for (chip of normalizedChips(); track chip.value) {\n <button\n type=\"button\"\n class=\"sui-tab-chips__chip\"\n [class.sui-tab-chips__chip--active]=\"value() === chip.value\"\n [attr.data-sui-chip-value]=\"chip.value\"\n [attr.aria-selected]=\"value() === chip.value\"\n [attr.tabindex]=\"value() === chip.value ? 0 : -1\"\n role=\"tab\"\n (click)=\"select(chip.value)\"\n >\n <span class=\"sui-tab-chips__chip-label\">{{ chip.label }}</span>\n @if (chip.count) {\n <span class=\"sui-tab-chips__chip-count\" aria-hidden=\"true\">{{ chip.count }}</span>\n }\n </button>\n }\n</nav>\n","import { Directive, input, TemplateRef } from '@angular/core';\n\n/**\n * SUI Table Cell Directive\n *\n * Permite definir una plantilla custom para una columna específica usando\n * ng-template con [suiTableCell]=\"'key'\". El contexto del template es la\n * fila completa: let-row.\n *\n * Uso:\n * <ng-template suiTableCell=\"status\" let-row>\n * <sui-badge>{{ row.status }}</sui-badge>\n * </ng-template>\n */\n@Directive({\n selector: '[suiTableCell]',\n standalone: true,\n})\nexport class SuiTableCellDirective {\n readonly suiTableCell = input.required<string>();\n\n constructor(readonly templateRef: TemplateRef<{ $implicit: any }>) {}\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n DestroyRef,\n ElementRef,\n QueryList,\n afterNextRender,\n computed,\n inject,\n input,\n model,\n output,\n viewChild,\n} from '@angular/core';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport { SuiTableCellDirective } from './sui-table-cell.directive';\nimport { SuiCheckbox } from '../sui-checkbox/sui-checkbox';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiTooltip } from '../sui-tooltip/sui-tooltip';\n\n/**\n * Eje \"Priority\" de Figma (SUI 2.0, Table Row Cell). Los 4 valores del eje:\n * - 'regular' (default): Paragraph/Small 14/400, color --text/strong-950.\n * - 'leading': Label/Small 14/500 + slot de icono circular 40×40 (Key Icon frame).\n * - 'passive': texto atenuado (color --text/sub-600) para datos secundarios.\n * - 'none': celda sin texto (solo Misc — botones de acción, avatar-group, etc.).\n * CSS no-op: la tipografía la dueña el sub-componente proyectado, no la celda.\n */\nexport type SuiTableCellPriority = 'regular' | 'leading' | 'passive' | 'none';\n\n/**\n * Eje \"Misc\" de Figma — las 8 composiciones de sub-componente que una celda\n * puede contener. SUI las resuelve vía `SuiTableCellDirective` (ng-template),\n * pero este tipo documenta los patrones canónicos para que el consumer sepa\n * qué SUI componer en cada caso:\n * - 'button' → <sui-button onlyIcon ...>\n * - 'button-group' → <sui-button-group>\n * - 'toggle' → <sui-switch>\n * - 'rating' → <sui-rating readonly>\n * - 'progress' → <sui-progress-bar>\n * - 'status-badge' → <sui-status-badge> | <sui-badge>\n * - 'badge-group' → varios <sui-badge>\n * - 'avatar-group' → <sui-avatar-group> | <sui-compact-avatar-group>\n */\nexport type SuiTableCellMisc =\n | 'none'\n | 'button'\n | 'button-group'\n | 'toggle'\n | 'rating'\n | 'progress'\n | 'status-badge'\n | 'badge-group'\n | 'avatar-group';\n\nexport interface SuiTableColumn<T = any> {\n /** Clave del campo en la fila. Debe ser único. */\n key: string;\n /** Texto del header. Vacío para columnas de acción sin etiqueta. */\n label: string;\n /** Ancho CSS: '120px' | '20%' | '1fr'. Si omitido el flex grow es 1. */\n width?: string;\n /** Ancho mínimo CSS — útil con scroll horizontal en mobile. */\n minWidth?: string;\n /** Ancho máximo CSS — fuerza truncado de texto largo. */\n maxWidth?: string;\n /** Alineación del contenido de la celda. Default: 'left'. */\n align?: 'left' | 'center' | 'right';\n /** Habilita el icono de sorting en el header. */\n sortable?: boolean;\n /** Header deshabilitado (label + sort icon en --text/disabled-300). */\n disabled?: boolean;\n /**\n * Eje \"Priority\" de Figma para el texto plano de la celda (sin template).\n * 'regular' (default) | 'leading' | 'passive' | 'none'. Ver SuiTableCellPriority.\n * 'none' es no-op a nivel CSS — para celdas misc-only donde el sub-componente\n * proyectado dueña su propia tipografía.\n */\n priority?: SuiTableCellPriority;\n /**\n * Clave del campo de la fila usado como segunda línea (sub-texto) de la celda.\n * Figma (Priority=Leading) muestra un segundo párrafo bajo el título:\n * Paragraph/XSmall 12px/400, color --text/sub-600. Solo se renderiza en el\n * render de texto plano (sin template custom) y cuando el valor existe.\n * Aunque pensado para Priority=Leading, funciona con cualquier priority.\n */\n descriptionKey?: string;\n /**\n * Trunca el texto plano con ellipsis y muestra el valor completo en tooltip\n * (vía [suiTooltip]). Default false. Solo aplica al render de texto por defecto.\n */\n truncate?: boolean;\n /**\n * Documenta el patrón \"Misc\" de Figma que esta columna contiene cuando se\n * proyecta un template. No altera el render — es guía para el consumer.\n */\n misc?: SuiTableCellMisc;\n /**\n * Fija la columna a la izquierda al hacer scroll horizontal (mobile).\n * Solo tiene efecto en la primera columna sticky soportada.\n */\n sticky?: boolean;\n}\n\n/**\n * Nomenclatura de tamaño. La API pública usa small | medium | large\n * (consumida por orders / drivers / master-preview — NO cambiar).\n * Mapeo a los nombres de Figma:\n * small → \"Large\" (48px) — Figma node Table Row Cell size=Large\n * medium → \"X-Large\" (64px) — Figma node Table Row Cell size=X-Large\n * large → (sin ref Figma, 80px) — extraFeature para tablas muy espaciadas.\n * xlarge → (sin ref Figma, 96px) — extraFeature; sigue el Δ16px/Δ4px de small→medium→large.\n */\nexport type SuiTableSize = 'small' | 'medium' | 'large' | 'xlarge';\n\n/**\n * SUI Table — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * Nodes verificados:\n * 553:22175 — Table [Overview/component set] (eje Priority × State × Misc × Size)\n * 3525:7648 — Table [Overview] (container / overview page)\n * 3525:7656 — Table Row Cell section (cell variants en el overview)\n * 587:5793 — Table Header Cell [1.1] (component set: Default / Disabled / Empty)\n * 581:2327 — Sorting Icons [1.1] (Default / Up / Down)\n * 3539:8015 — Table [Examples] (tabla real de 7 filas, Light + Dark)\n *\n * VERIFICADO 2026-06-21 (Figma MCP sano — fileKey 8p1k72aKKvzJV4XcvPS4VO):\n * - Priority=Passive (node 558:4302): título+desc color --sui-text-sub-600 (#5c5c5c),\n * weight 400. CONFIRMADO.\n * - Row State=Hover (node 558:3981): bg --sui-bg-weak-50 (#f7f7f7). CONFIRMADO.\n * - Leading Key-Icon frame (nodes 581:1866 / 558:4146): circular (radius-full),\n * bg white-0, border --stroke/soft-200, shadow regular-shadow/x-small. El padding\n * ESCALA con el tamaño: Large/48 → p=6 (32×32); X-Large/64 → p=10 (40×40).\n *\n * RESUELTO 2026-06-21 (re-verificación VISUAL pixel-perfect — skill sui-figma-pixel-perfect):\n * - Row State=Active: muestreo de pixel del set 553:22175 → fila Active mide\n * #ffffff (igual que Default); solo Hover cambia a weak-50. Corregido en\n * sui-table.scss el :active de soft-200 → weak-50 (soft-200 era suposición,\n * no aparece en ningún nodo Figma).\n * - Leading key-icon DESNUDO (sin frame circular) en el render real: la regla\n * `.sui-table__leading-icon` del SCSS encapsulado (Emulated) NO matchea el\n * <span> que el consumer proyecta vía <ng-template suiTableCell> (no lleva el\n * _ngcontent del componente). Fix: `:host ::ng-deep .sui-table__leading-icon`.\n * PENDING VERIFY (no concluyente):\n * - Comportamiento MOBILE: Figma no especifica stacking vs scroll. Implementado\n * scroll horizontal + primera columna sticky opcional (col.sticky). Ver\n * newQuestions.\n *\n * EJES de Figma (Table Row Cell, node 553:22175):\n * Priority (4): Leading / Regular / Passive / None → SuiTableCellPriority\n * State (3): Default / Hover / Active → :hover / :active del row\n * Misc (9): None / Button / ButtonGroup / Toggle / Rating / ProgressBar /\n * StatusBadge / BadgeGroup / AvatarGroup → SuiTableCellMisc (slots)\n * Size (2): X-Large 64px / Large 48px → medium / small\n * Header Cell: State(Default/Disabled/Empty) × checkbox × sorting\n *\n * SPECS EXACTOS extraídos de Figma:\n * Container:\n * overflow: hidden\n * (no border/radius en el container — las rows tienen radius-12 propias)\n *\n * Header row:\n * bg: --sui-bg-weak-50 (#f7f7f7)\n * height: 36px\n * padding cell: py=8px px=12px\n * gap label: 2px (entre texto e icono sort)\n * border-radius del row: 8px\n * text: Paragraph/Small 14px/400/20px/-0.084px, color --sui-text-sub-600 (#5c5c5c)\n * font-feature: 'ss11' 1, 'calt' 0, 'liga' 0\n *\n * Body row:\n * bg: --sui-bg-white-0 (#fff)\n * height: 64px (medium)\n * padding cell: py=12px pl=12px pr=20px\n * gap: 12px (entre contenidos de la celda)\n * border-radius: 12px (overflow-clip en el row)\n * divider: 1px --sui-stroke-soft-200 entre filas (py=1.5px wrapper)\n * hover: bg --sui-bg-weak-50 (VERIFICADO node 558:3981)\n * text primary: Label/Small 14px/500/20px/-0.084px, color --sui-text-strong-950\n * text sub: Paragraph/XSmall 12px/400/16px/0, color --sui-text-sub-600\n *\n * Size variants (INFERRED — Figma solo muestra medium 64px):\n * small: height 48px, py=8px\n * medium: height 64px, py=12px\n * large: height 80px, py=16px\n *\n * Sort icon: 20px Remix Icon chevron-up-down-line (default neutral)\n * sort-asc → arrow-up-s-line; sort-desc → arrow-down-s-line\n * color: --sui-text-soft-400 (default), --sui-text-strong-950 (active)\n *\n * @input columns Definición de columnas (key, label, width, align, sortable)\n * @input rows Array de datos a mostrar\n * @input size 'small' | 'medium' | 'large' (default: 'medium')\n * @input loading Muestra skeleton loader\n * @input emptyMessage Mensaje cuando rows está vacío y loading=false\n * @input striped Filas alternadas con fondo levemente grisado\n * @input selectable Activa columna de checkbox de selección\n * @input rowKey Key o función para identificar filas en selección\n * @output rowClicked Emite la fila al hacer clic en ella\n * @output sortChanged Emite { key, dir } cuando se cambia el sort\n *\n * Content projection: usa SuiTableCellDirective para custom renders por columna.\n * Si no hay template para una columna, renderiza row[column.key] directo.\n */\n@Component({\n selector: 'sui-table',\n templateUrl: './sui-table.html',\n styleUrl: './sui-table.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet, SuiCheckbox, SuiIcon, SuiTooltip],\n host: {\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-striped]': 'striped() ? \"\" : null',\n '[attr.data-sui-selectable]': 'selectable() ? \"\" : null',\n '[attr.data-sui-loading]': 'loading() ? \"\" : null',\n '[attr.data-sui-sticky]': 'hasStickyColumn() ? \"\" : null',\n },\n})\nexport class SuiTable<T = any> {\n readonly columns = input.required<SuiTableColumn<T>[]>();\n readonly rows = input.required<T[]>();\n readonly size = input<SuiTableSize>('medium');\n readonly loading = input(false);\n readonly emptyMessage = input('No hay datos');\n readonly striped = input(false);\n readonly selectable = input(false);\n readonly rowKey = input<keyof T | ((row: T) => any)>();\n\n readonly selectedRows = model<Set<any>>(new Set());\n readonly sortKey = model<string | null>(null);\n readonly sortDir = model<'asc' | 'desc' | null>(null);\n\n readonly rowClicked = output<T>();\n readonly sortChanged = output<{ key: string; dir: 'asc' | 'desc' | null }>();\n\n // ── Touch scroll passthrough (fix Android) ────────────────────────────────\n private readonly scrollEl = viewChild<ElementRef<HTMLElement>>('scrollEl');\n private readonly destroyRef = inject(DestroyRef);\n private readonly doc = inject(DOCUMENT);\n\n constructor() {\n /* En Android/Chromium un container con `overflow-x: auto` ABSORBE el touch\n vertical y NO lo delega al scroll de la página (verificado en device:\n ningún `touch-action` — pan-x/pan-y/auto — lo arregla; solo quitar el\n overflow-x, que rompería el scroll horizontal de tablas anchas). Por eso\n manejamos el touch por JS: detectamos la dirección del dedo y movemos la\n tabla (horizontal) o el scroll container padre (vertical). Solo afecta\n touch; mouse/wheel siguen nativos. iOS no lo necesita (delega solo). */\n afterNextRender(() => {\n const el = this.scrollEl()?.nativeElement;\n if (el) this.bindTouchScroll(el);\n });\n }\n\n private bindTouchScroll(el: HTMLElement): void {\n let sx = 0, sy = 0, lx = 0, ly = 0;\n let axis: 'x' | 'y' | null = null;\n let pageScroller: HTMLElement | null = null;\n /* Velocidad vertical (px/ms) + timestamp del último move, para el fling. */\n let vy = 0, lastT = 0, momentumRaf = 0, momentumTs = 0;\n\n const findPageScroller = (): HTMLElement | null => {\n let n: HTMLElement | null = el.parentElement;\n while (n && n !== this.doc.body) {\n const oy = getComputedStyle(n).overflowY;\n if ((oy === 'auto' || oy === 'scroll') && n.scrollHeight > n.clientHeight) return n;\n n = n.parentElement;\n }\n return (this.doc.scrollingElement as HTMLElement) ?? null;\n };\n\n const stopMomentum = (): void => {\n if (momentumRaf) cancelAnimationFrame(momentumRaf);\n momentumRaf = 0;\n };\n\n const onStart = (e: TouchEvent): void => {\n stopMomentum();\n if (e.touches.length !== 1) { axis = null; return; }\n const t = e.touches[0];\n sx = lx = t.clientX; sy = ly = t.clientY;\n axis = null;\n vy = 0;\n lastT = e.timeStamp;\n pageScroller = findPageScroller();\n };\n\n const onMove = (e: TouchEvent): void => {\n if (e.touches.length !== 1) return;\n /* Si la tabla ENTRA (no desborda en X), no hay scroll horizontal que\n manejar ni trap que evitar → dejamos el scroll NATIVO de la página\n (momentum nativo, idéntico al resto). El handler solo engancha cuando la\n tabla es genuinamente ancha (modo h-scroll). Esto hace que el componente\n funcione tanto en modo fit/wrap como en modo h-scroll sin tocar el TS. */\n if (el.scrollWidth <= el.clientWidth + 1) return;\n const t = e.touches[0];\n if (axis === null) {\n const dx = Math.abs(t.clientX - sx);\n const dy = Math.abs(t.clientY - sy);\n if (dx < 5 && dy < 5) return; // umbral para decidir dirección\n const canScrollX = el.scrollWidth > el.clientWidth;\n axis = canScrollX && dx > dy ? 'x' : 'y';\n }\n if (axis === 'x') {\n el.scrollLeft -= t.clientX - lx;\n } else if (pageScroller) {\n const dy = t.clientY - ly;\n pageScroller.scrollTop -= dy;\n const dt = e.timeStamp - lastT;\n if (dt > 0) vy = dy / dt; // px/ms (positivo = dedo bajando)\n }\n e.preventDefault();\n lx = t.clientX;\n ly = t.clientY;\n lastT = e.timeStamp;\n };\n\n const onEnd = (): void => {\n /* Fling: continúa el scroll de la página con la velocidad de salida y\n fricción exponencial frame-rate-independent (para que en 120Hz no vuele).\n Replica el momentum nativo que el manejo manual del touch pierde. */\n if (axis !== 'y' || !pageScroller || Math.abs(vy) < 0.05) return;\n const scroller = pageScroller;\n momentumTs = 0;\n const step = (ts: number): void => {\n if (!momentumTs) momentumTs = ts;\n const dt = Math.min(ts - momentumTs, 32);\n momentumTs = ts;\n scroller.scrollTop -= vy * dt;\n vy *= Math.pow(0.95, dt / 16); // ~0.95 por frame de 16ms, normalizado\n momentumRaf = Math.abs(vy) > 0.02 ? requestAnimationFrame(step) : 0;\n };\n momentumRaf = requestAnimationFrame(step);\n };\n\n el.addEventListener('touchstart', onStart, { passive: true });\n el.addEventListener('touchmove', onMove, { passive: false });\n el.addEventListener('touchend', onEnd, { passive: true });\n el.addEventListener('touchcancel', stopMomentum, { passive: true });\n this.destroyRef.onDestroy(() => {\n stopMomentum();\n el.removeEventListener('touchstart', onStart);\n el.removeEventListener('touchmove', onMove);\n el.removeEventListener('touchend', onEnd);\n el.removeEventListener('touchcancel', stopMomentum);\n });\n }\n\n @ContentChildren(SuiTableCellDirective)\n cellTemplates!: QueryList<SuiTableCellDirective>;\n\n /** Computed: índice de templates por key de columna */\n readonly cellTemplateMap = computed<Map<string, SuiTableCellDirective>>(() => {\n const map = new Map<string, SuiTableCellDirective>();\n // Se llena en ngAfterContentInit via QueryList, pero computed accede a it\n // de forma reactiva cuando las señales de los templates cambian.\n // En la práctica el map se construye en el template directamente.\n return map;\n });\n\n /** Devuelve el template para una columna dada su key */\n getTemplate(key: string): SuiTableCellDirective | undefined {\n return this.cellTemplates?.find((d) => d.suiTableCell() === key);\n }\n\n /** Lógica de sorting */\n onSort(col: SuiTableColumn<T>): void {\n if (!col.sortable) return;\n const currentKey = this.sortKey();\n const currentDir = this.sortDir();\n\n if (currentKey !== col.key) {\n this.sortKey.set(col.key);\n this.sortDir.set('asc');\n this.sortChanged.emit({ key: col.key, dir: 'asc' });\n } else if (currentDir === 'asc') {\n this.sortDir.set('desc');\n this.sortChanged.emit({ key: col.key, dir: 'desc' });\n } else {\n this.sortKey.set(null);\n this.sortDir.set(null);\n this.sortChanged.emit({ key: col.key, dir: null });\n }\n }\n\n /** Si la columna tiene sort activo */\n isSortActive(key: string): boolean {\n return this.sortKey() === key;\n }\n\n /** Obtiene el rowKey de una fila */\n getRowKey(row: T, index: number): any {\n const rk = this.rowKey();\n if (!rk) return index;\n if (typeof rk === 'function') return rk(row);\n return (row as any)[rk];\n }\n\n /** Toggle selección de fila */\n toggleRow(row: T, index: number): void {\n const k = this.getRowKey(row, index);\n const current = new Set(this.selectedRows());\n if (current.has(k)) {\n current.delete(k);\n } else {\n current.add(k);\n }\n this.selectedRows.set(current);\n }\n\n /** Toggle all rows */\n toggleAll(): void {\n const all = this.rows();\n const sel = this.selectedRows();\n if (sel.size === all.length) {\n this.selectedRows.set(new Set());\n } else {\n this.selectedRows.set(new Set(all.map((r, i) => this.getRowKey(r, i))));\n }\n }\n\n /** Check si todos los rows están seleccionados */\n get allSelected(): boolean {\n return this.rows().length > 0 && this.selectedRows().size === this.rows().length;\n }\n\n /** Check si hay selección parcial */\n get partialSelected(): boolean {\n return this.selectedRows().size > 0 && this.selectedRows().size < this.rows().length;\n }\n\n /** Obtiene el valor de celda como string */\n getCellValue(row: T, key: string): string {\n const val = (row as any)[key];\n if (val === null || val === undefined) return '';\n return String(val);\n }\n\n /** Texto del tooltip para celdas truncadas (valor completo). */\n getCellTooltip(row: T, col: SuiTableColumn<T>): string {\n return col.truncate ? this.getCellValue(row, col.key) : '';\n }\n\n /**\n * Sub-texto (segunda línea) de una celda — Figma Priority=Leading muestra un\n * Paragraph/XSmall bajo el título. Devuelve '' si la columna no define\n * `descriptionKey` o el valor es vacío (en cuyo caso no se renderiza la línea).\n */\n getCellDescription(row: T, col: SuiTableColumn<T>): string {\n return col.descriptionKey ? this.getCellValue(row, col.descriptionKey) : '';\n }\n\n /** Prioridad de la celda (default 'regular'). */\n cellPriority(col: SuiTableColumn<T>): SuiTableCellPriority {\n return col.priority ?? 'regular';\n }\n\n /**\n * min-width inline de una columna para el modo scroll horizontal (mobile).\n * Precedencia: `minWidth` explícito > `width` explícito > null.\n *\n * Bloquear el min-width al `width` en columnas de ancho fijo evita que el\n * default de scroll-mode del SCSS (120px) ensanche columnas angostas (ej. la\n * de acciones width:64px). Las columnas flexibles devuelven null para que el\n * stylesheet aplique su mínimo y el texto no colapse al hacer scroll en X.\n * En desktop es no-op visual: el min-width espeja el flex-basis ya fijado.\n */\n colMinWidth(col: SuiTableColumn<T>): string | null {\n return col.minWidth ?? col.width ?? null;\n }\n\n /** True si alguna columna pide sticky (activa el modo scroll-sticky). */\n readonly hasStickyColumn = computed(() =>\n this.columns().some((c) => c.sticky === true),\n );\n\n /** Genera skeleton rows para el loading state */\n get skeletonRows(): number[] {\n return [0, 1, 2, 3, 4];\n }\n\n /** Genera skeleton cells basado en columnas */\n get skeletonCells(): number[] {\n return this.columns().map((_, i) => i);\n }\n}\n","<!-- ══ SUI Table ══════════════════════════════════════════════════════ -->\n<div class=\"sui-table\" #scrollEl>\n\n <!-- Header -->\n <div class=\"sui-table__header\">\n <!-- Checkbox header (selectable mode) — compone sui-checkbox (canon) -->\n @if (selectable()) {\n <div class=\"sui-table__header-cell sui-table__header-cell--checkbox\">\n <sui-checkbox\n [checked]=\"allSelected\"\n [indeterminate]=\"partialSelected\"\n (checkedChange)=\"toggleAll()\"\n (click)=\"$event.stopPropagation()\"\n aria-label=\"Seleccionar todas las filas\"\n />\n </div>\n }\n\n @for (col of columns(); track col.key) {\n <div\n class=\"sui-table__header-cell\"\n [class.sui-table__header-cell--sortable]=\"col.sortable && !col.disabled\"\n [class.sui-table__header-cell--sorted]=\"isSortActive(col.key)\"\n [class.sui-table__header-cell--disabled]=\"col.disabled\"\n [class.sui-table__header-cell--center]=\"col.align === 'center'\"\n [class.sui-table__header-cell--right]=\"col.align === 'right'\"\n [class.sui-table__header-cell--empty]=\"!col.label\"\n [class.sui-table__header-cell--sticky]=\"col.sticky\"\n [style.width]=\"col.width ?? null\"\n [style.min-width]=\"colMinWidth(col)\"\n [style.max-width]=\"col.maxWidth ?? null\"\n [style.flex]=\"col.width ? '0 0 ' + col.width : '1'\"\n (click)=\"!col.disabled && onSort(col)\"\n [attr.tabindex]=\"col.sortable && !col.disabled ? '0' : null\"\n [attr.role]=\"col.sortable ? 'columnheader' : null\"\n [attr.aria-disabled]=\"col.disabled ? 'true' : null\"\n [attr.aria-sort]=\"col.sortable ? (isSortActive(col.key) ? (sortDir() === 'asc' ? 'ascending' : 'descending') : 'none') : null\"\n (keydown.enter)=\"!col.disabled && onSort(col)\"\n (keydown.space)=\"$event.preventDefault(); !col.disabled && onSort(col)\"\n >\n @if (col.label) {\n <span class=\"sui-table__header-label\">{{ col.label }}</span>\n }\n @if (col.sortable) {\n <span class=\"sui-table__sort-icon\" [class.sui-table__sort-icon--active]=\"isSortActive(col.key)\">\n @if (!isSortActive(col.key)) {\n <sui-icon name=\"expand-up-down-line\" [size]=\"20\" />\n } @else if (sortDir() === 'asc') {\n <sui-icon name=\"arrow-up-s-fill\" [size]=\"20\" />\n } @else {\n <sui-icon name=\"arrow-down-s-fill\" [size]=\"20\" />\n }\n </span>\n }\n </div>\n }\n </div>\n\n <!-- Body: Loading skeleton -->\n @if (loading()) {\n <div class=\"sui-table__body\">\n @for (sk of skeletonRows; track sk) {\n <div class=\"sui-table__row sui-table__row--skeleton\">\n @if (selectable()) {\n <div class=\"sui-table__cell sui-table__cell--checkbox\">\n <span class=\"sui-table__skeleton-box sui-table__skeleton-box--sm\"></span>\n </div>\n }\n @for (col of columns(); track col.key) {\n <div\n class=\"sui-table__cell\"\n [class.sui-table__cell--sticky]=\"col.sticky\"\n [style.width]=\"col.width ?? null\"\n [style.min-width]=\"colMinWidth(col)\"\n [style.max-width]=\"col.maxWidth ?? null\"\n [style.flex]=\"col.width ? '0 0 ' + col.width : '1'\"\n >\n <span class=\"sui-table__skeleton-box\"></span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Body: Empty state -->\n @else if (rows().length === 0) {\n <div class=\"sui-table__empty\">\n <sui-icon name=\"inbox-line\" [size]=\"40\" class=\"sui-table__empty-icon\" />\n <p class=\"sui-table__empty-msg\">{{ emptyMessage() }}</p>\n </div>\n }\n\n <!-- Body: Data rows -->\n @else {\n <div class=\"sui-table__body\">\n @for (row of rows(); track getRowKey(row, $index); let i = $index) {\n <div\n class=\"sui-table__row\"\n [class.sui-table__row--selected]=\"selectedRows().has(getRowKey(row, i))\"\n [class.sui-table__row--striped]=\"striped() && i % 2 === 1\"\n (click)=\"rowClicked.emit(row)\"\n >\n <!-- Checkbox column — compone sui-checkbox (canon) -->\n @if (selectable()) {\n <div class=\"sui-table__cell sui-table__cell--checkbox\" (click)=\"$event.stopPropagation()\">\n <sui-checkbox\n [checked]=\"selectedRows().has(getRowKey(row, i))\"\n (checkedChange)=\"toggleRow(row, i)\"\n aria-label=\"Seleccionar fila\"\n />\n </div>\n }\n\n <!-- Data columns -->\n @for (col of columns(); track col.key) {\n <div\n class=\"sui-table__cell\"\n [class.sui-table__cell--center]=\"col.align === 'center'\"\n [class.sui-table__cell--right]=\"col.align === 'right'\"\n [class.sui-table__cell--sticky]=\"col.sticky\"\n [class.sui-table__cell--leading]=\"cellPriority(col) === 'leading'\"\n [class.sui-table__cell--passive]=\"cellPriority(col) === 'passive'\"\n [class.sui-table__cell--none]=\"cellPriority(col) === 'none'\"\n [style.width]=\"col.width ?? null\"\n [style.min-width]=\"colMinWidth(col)\"\n [style.max-width]=\"col.maxWidth ?? null\"\n [style.flex]=\"col.width ? '0 0 ' + col.width : '1'\"\n >\n <!-- Custom template via SuiTableCellDirective -->\n @if (getTemplate(col.key); as tmpl) {\n <ng-container *ngTemplateOutlet=\"tmpl.templateRef; context: { $implicit: row }\"></ng-container>\n } @else if (getCellDescription(row, col); as desc) {\n <!-- Texto + sub-texto (Figma Priority=Leading, 2da línea XSmall) -->\n <span class=\"sui-table__cell-block\">\n <span\n class=\"sui-table__cell-text\"\n [class.sui-table__cell-text--truncate]=\"col.truncate\"\n [suiTooltip]=\"getCellTooltip(row, col)\"\n >{{ getCellValue(row, col.key) }}</span>\n <span class=\"sui-table__cell-desc\">{{ desc }}</span>\n </span>\n } @else if (col.truncate) {\n <!-- Texto truncado + tooltip con el valor completo -->\n <span\n class=\"sui-table__cell-text sui-table__cell-text--truncate\"\n [suiTooltip]=\"getCellTooltip(row, col)\"\n >{{ getCellValue(row, col.key) }}</span>\n } @else {\n <!-- Default text rendering -->\n <span class=\"sui-table__cell-text\">{{ getCellValue(row, col.key) }}</span>\n }\n </div>\n }\n </div>\n\n <!-- Row divider (not after last row) -->\n @if (i < rows().length - 1) {\n <div class=\"sui-table__divider\"></div>\n }\n }\n </div>\n }\n\n</div>\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n QueryList,\n ViewChild,\n ViewChildren,\n effect,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiTabsVariant = 'line' | 'segment' | 'vertical';\nexport type SuiTabsSize = 'small' | 'medium' | 'large' | 'xlarge';\n/** Estilo del contenedor del variant `vertical` (Tab Menu Vertical de Figma). */\nexport type SuiTabsVerticalStyle = 'card' | 'list';\n\nexport interface SuiTab<T = string> {\n value: T;\n label: string;\n icon?: string;\n disabled?: boolean;\n /**\n * Renderiza el ítem solo con icono (sin label visible) — mapea al\n * Type=Only Icon del Figma Segmented Control. Requiere que `icon` esté\n * presente. El `label` se usa entonces como `aria-label` para accesibilidad.\n * Solo aplica al variant='segment'.\n */\n iconOnly?: boolean;\n /**\n * Badge numérico rojo (state/error/base) renderizado a la derecha del label.\n * Mapea al prop `number` del Tab Menu de Figma (Horizontal/Vertical Items).\n * Si es `0`/`undefined` no se renderiza. Solo aplica a variants `line`/`vertical`.\n */\n badge?: number;\n /**\n * Muestra el chevron de navegación (pill `arrow-right-s-line` 18px) a la\n * derecha del ítem — prop `rightIcon` del Tab Menu de Figma. Aplica a\n * `vertical` y `line`. En ambos el chevron va dentro de un pill bg-white-0\n * p-px radius-full overflow-clip; el pill vertical lleva shadow-x-small y el\n * horizontal NO (Figma 3515:10332 vs 3511:9882).\n */\n chevron?: boolean;\n}\n\n/**\n * SUI Tabs — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n *\n * Cubre tres componentes de Figma bajo un solo `sui-tabs`:\n * - variant='segment' → \"Segmented Control [1.1]\" (pill iOS, indicador animado)\n * - variant='line' → \"Tab Menu Horizontal [1.1]\" (underline tabs)\n * - variant='vertical' → \"Tab Menu Vertical [1.1]\" (sidebar nav, Card|List)\n *\n * Nodos homologados (2026-05-29 · Tab Menu pass):\n * 3511:9958 — Tab Menu Horizontal [1.1] (container: border-t/b, py-14px, gap-24px)\n * 3511:9832 — Tab Menu Horizontal Items [1.1] (State × Active; leftIcon/rightIcon/number)\n * 3511:9897 — Horizontal Item Active/On (label strong-950 + línea primary)\n * 3511:9877 — Horizontal Item Hover/Off (text strong-950, icon sub-600)\n * 3516:10411 — Tab Menu Vertical [1.1] (Style=Card|List × Quantity 02–08 × divider)\n * 3516:10412 — Vertical Card Quantity=03 con divider 'SELECT MENU'\n * 3515:10326 — Tab Menu Vertical Items [1.1] (State × Active; leftIcon/rightIcon/number)\n * 3515:10341 — Vertical Item Active/On (bg-weak-50)\n *\n * EXACT specs (Tab Menu pass):\n * Horizontal container (3511:9958):\n * border-top + border-bottom: 1px solid stroke-soft-200\n * padding: 14px 0 (py-14px) · gap entre items: 24px\n * align-items: flex-start (items-start) · background: bg-white-0\n * Horizontal item (3511:9830/9897):\n * gap icon↔label: 6px · gap label↔badge: 4px\n * Default/Off: text/icon sub-600 (#5c5c5c)\n * Hover/Off: text strong-950 (#171717), icon sub-600 (#5c5c5c)\n * Active/On: text strong-950 + indicator line primary-base 2px (bottom -14px,\n * al ras del border-bottom del container)\n * leftIcon: 20px · rightIcon: chevron arrow-right-s-line 18px en pill 'Arrow'\n * (3511:9882/9902/9844): bg-white-0, p-px, radius-full, overflow-clip,\n * SIN shadow (el vertical sí lleva shadow-x-small)\n * number: badge state/error/base, p-2px, radius-full, text static-white\n * Subheading/2XSmall (11px/12px line, +2% / 0.22px, uppercase)\n * Vertical item (3515:10327/10341/10334):\n * gap: 6px · padding: 8px · radius: radius-8 · w-full · label flex-1 text-left\n * overflow-clip en el item (y en el container Card 3516:10412)\n * Active/On: bg-weak-50 + text strong-950 / icon strong-950\n * Hover/Off: bg-weak-50 (igual fill que el active) + text strong-950 (3515:10334)\n * Default/Off (Card): bg-white-0 + text/icon sub-600\n * Default/Off (List): transparent + text/icon sub-600\n * number: mismo badge que horizontal\n * rightIcon (chevron): pill bg-white-0, p-1px, radius-full, shadow-x-small,\n * arrow-right-s-line 18px\n * Vertical container Card (3516:10412):\n * bg-white-0, border 1px stroke-soft-200, p-10px, radius-16, shadow-x-small,\n * flex-col gap-8px\n * Vertical container List: flat (sin border/bg/shadow/padding), gap-8px\n * Divider label (Content Divider [1.1], reusado): px-8px py-4px, text-soft-400,\n * Subheading/XSmall (12px/16px line, +4% / 0.48px, uppercase)\n *\n * VERIFICADO (2026-06-21, re-verificación visual pixel-perfect):\n * - Horizontal Active leftIcon = STRONG-950 (oscuro). Confirmado: variable_defs\n * de 3511:9897 expone primary-base SOLO para la línea underline (NO para el\n * icono); icon/sub-600 es el chevron; el screenshot del item activo muestra el\n * leftIcon oscuro. → icono activo horizontal = strong-950 (queda como estaba).\n * - Vertical Active leftIcon = PRIMARY-BASE (azul en Figma → naranja brand acá).\n * Confirmado: variable_defs de 3515:10341 expone primary-base (texto=strong-950,\n * bg=weak-50) → ese primary es el icono; screenshot del item activo lo muestra\n * AZUL. El componente lo tenía en strong-950 → FIX aplicado (.sui-tabs__vertical-\n * item--active .sui-tabs__vertical-leading { color: var(--sui-primary-base) }).\n * OJO: horizontal y vertical DIFIEREN en el color del icono activo (a propósito).\n *\n * PENDING VERIFY:\n * - line/segment size (small/medium/large): el Tab Menu Horizontal de Figma no\n * expone eje `size`. Los 3 sizes son extensión SUI; solo medium está 1:1.\n * - Vertical no expone eje `size`; usa un único tamaño (item p-8px / icon 20px).\n *\n * EXTRA FEATURES preservadas (no están en el Figma 'Tab Menu', se mantienen):\n * - variant='segment' completo (indicador animado ResizeObserver + translateX).\n * - prop `size` (small/medium/large) del line/segment.\n * - prop `disabled` por ítem (Figma no muestra estado Disabled del Tab Menu).\n */\n@Component({\n selector: 'sui-tabs',\n templateUrl: './sui-tabs.html',\n styleUrl: './sui-tabs.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n '[attr.data-sui-variant]': 'variant()',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-vstyle]': \"variant() === 'vertical' ? verticalStyle() : null\",\n },\n})\nexport class SuiTabs<T = string> implements AfterViewInit {\n readonly tabs = input.required<SuiTab<T>[]>();\n readonly active = model<T>();\n readonly variant = input<SuiTabsVariant>('line');\n readonly size = input<SuiTabsSize>('medium');\n /** Estilo del contenedor cuando variant='vertical' (Card|List). */\n readonly verticalStyle = input<SuiTabsVerticalStyle>('card');\n /**\n * Label de sección renderizado sobre el menú vertical (prop `divider` del\n * Figma — ej. 'SELECT MENU'). Vacío = sin divider. Solo variant='vertical'.\n */\n readonly dividerLabel = input<string>('');\n readonly tabChange = output<T>();\n\n @ViewChildren('segmentItem', { read: ElementRef })\n segmentItems?: QueryList<ElementRef<HTMLElement>>;\n\n @ViewChild('segmentTrack')\n segmentTrack?: ElementRef<HTMLElement>;\n\n readonly indicatorStyle = signal<{ transform: string; width: string }>({\n transform: 'translateX(0)',\n width: '0',\n });\n\n private resizeObserver?: ResizeObserver;\n\n constructor() {\n effect(() => {\n const active = this.active();\n const tabs = this.tabs();\n const idx = tabs.findIndex(t => t.value === active);\n if (idx === -1) return;\n setTimeout(() => this.updateIndicator(idx), 0);\n });\n }\n\n ngAfterViewInit(): void {\n const active = this.active();\n const tabs = this.tabs();\n const idx = tabs.findIndex(t => t.value === active);\n setTimeout(() => this.updateIndicator(idx >= 0 ? idx : 0), 0);\n\n const track = this.segmentTrack?.nativeElement;\n if (track) {\n this.resizeObserver = new ResizeObserver(() => {\n const currentActive = this.active();\n const currentTabs = this.tabs();\n const currentIdx = currentTabs.findIndex(t => t.value === currentActive);\n this.updateIndicator(currentIdx >= 0 ? currentIdx : 0);\n });\n this.resizeObserver.observe(track);\n }\n }\n\n private updateIndicator(idx: number): void {\n const items = this.segmentItems?.toArray();\n const track = this.segmentTrack?.nativeElement;\n if (!items || !track || !items[idx]) return;\n const item = items[idx].nativeElement;\n const trackRect = track.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n this.indicatorStyle.set({\n transform: `translateX(${itemRect.left - trackRect.left}px)`,\n width: `${itemRect.width}px`,\n });\n }\n\n isActive(tab: SuiTab<T>): boolean {\n return this.active() === tab.value;\n }\n\n select(tab: SuiTab<T>): void {\n if (tab.disabled) return;\n this.active.set(tab.value);\n this.tabChange.emit(tab.value);\n }\n}\n","@if (variant() === 'segment') {\n <!-- Segment variant: pill/segmented control (iOS-like) — SUI Segmented Control [1.1] -->\n <div #segmentTrack class=\"sui-tabs__segment-track\" role=\"tablist\">\n <div\n class=\"sui-tabs__segment-indicator\"\n [style.transform]=\"indicatorStyle().transform\"\n [style.width]=\"indicatorStyle().width\"\n ></div>\n @for (tab of tabs(); track tab.value) {\n <button\n #segmentItem\n type=\"button\"\n class=\"sui-tabs__segment-item\"\n [class.sui-tabs__segment-item--active]=\"isActive(tab)\"\n [class.sui-tabs__segment-item--icon-only]=\"tab.iconOnly && tab.icon\"\n [disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-disabled]=\"tab.disabled ? true : null\"\n [attr.aria-label]=\"tab.iconOnly && tab.icon ? tab.label : null\"\n role=\"tab\"\n (click)=\"select(tab)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (tab.icon) {\n <sui-icon [name]=\"tab.icon\" [size]=\"20\" />\n }\n @if (!tab.iconOnly) {\n <span>{{ tab.label }}</span>\n }\n </button>\n }\n </div>\n\n} @else if (variant() === 'vertical') {\n <!-- Vertical variant: sidebar nav — SUI Tab Menu Vertical [1.1] (Card|List) -->\n <div class=\"sui-tabs__vertical-track\" role=\"tablist\">\n @if (dividerLabel()) {\n <div class=\"sui-tabs__vertical-divider\">{{ dividerLabel() }}</div>\n }\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"sui-tabs__vertical-item\"\n [class.sui-tabs__vertical-item--active]=\"isActive(tab)\"\n [disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-disabled]=\"tab.disabled ? true : null\"\n role=\"tab\"\n (click)=\"select(tab)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (tab.icon) {\n <sui-icon class=\"sui-tabs__vertical-leading\" [name]=\"tab.icon\" [size]=\"20\" />\n }\n <span class=\"sui-tabs__vertical-label\">{{ tab.label }}</span>\n @if (tab.badge) {\n <span class=\"sui-tabs__badge\">{{ tab.badge }}</span>\n }\n @if (tab.chevron) {\n <span class=\"sui-tabs__chevron\">\n <sui-icon name=\"arrow-right-s-line\" [size]=\"18\" />\n </span>\n }\n </button>\n }\n </div>\n\n} @else {\n <!-- Line variant: underline tabs — SUI Tab Menu Horizontal [1.1] -->\n <div class=\"sui-tabs__line-track\" role=\"tablist\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"sui-tabs__line-item\"\n [class.sui-tabs__line-item--active]=\"isActive(tab)\"\n [disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-disabled]=\"tab.disabled ? true : null\"\n role=\"tab\"\n (click)=\"select(tab)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n @if (tab.icon) {\n <sui-icon class=\"sui-tabs__line-leading\" [name]=\"tab.icon\" [size]=\"20\" />\n }\n <span class=\"sui-tabs__line-text\">\n <span class=\"sui-tabs__line-label\">{{ tab.label }}</span>\n @if (tab.badge) {\n <span class=\"sui-tabs__badge\">{{ tab.badge }}</span>\n }\n </span>\n @if (tab.chevron) {\n <span class=\"sui-tabs__line-chevron\">\n <sui-icon name=\"arrow-right-s-line\" [size]=\"18\" />\n </span>\n }\n </button>\n }\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n output,\n} from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiTagStyle = 'stroke' | 'gray';\n\n/**\n * SUI Tag — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: Tag [1.1] (frame 431:16147)\n * Matrix: Type(6) × Style(2: Stroke, Gray) × State(4) × Dismiss(2) = 96 variants.\n *\n * Variants pulled for verification (get_design_context + get_variable_defs):\n * - 431:16543 Basic / Stroke / Default / Dismiss=On\n * - 431:18054 Basic / Gray / Default / Dismiss=On\n * - 431:16548 LeftIcon/ Stroke / Default / Dismiss=On (pushpin-fill leading 16×16)\n * - 431:17022 Basic / Stroke / Hover / Dismiss=On\n * - 431:17141 Basic / Stroke / Active / Dismiss=On\n * - 431:18049 Basic / Gray / Hover / Dismiss=On\n * - 431:18064 Basic / Gray / Active / Dismiss=On\n * - 431:17379 Basic / Stroke / Disabled/ Dismiss=On\n * - 431:18059 Basic / Gray / Disabled/ Dismiss=On\n *\n * EXACT (pulled, verified pixel/token):\n * - Container: border-radius 6px (--sui-radius-6), height 24px (py=4px + 16px line).\n * NOTE: distinto del badge (radius-full 999px) — NO confundir.\n * - Typography: Label/X Small (Inter Medium, 12px / line 16 / tracking 0, NO uppercase),\n * font-feature 'ss11' 1, 'calt' 0, 'liga' 0. Label color text-sub-600 (#5c5c5c).\n * - Sublabel: Inter Regular 12/16, color text-soft-400 (#a3a3a3), gap 2px al label.\n * - Padding básico (Basic, no leading): pl=8 pr=8 py=4. Con dismiss: pl=8 pr=4 py=4\n * (la X 16×16 come el espacio derecho). Con leading element: padding 4px all-around\n * (pl=4) + gap 4px entre leading y el bloque de texto.\n * - Leading element + dismiss icon: ambos son slots 16×16. gap leading↔texto = 4px;\n * gap label↔sublabel↔close = 2px (bloque \"Text\" interno).\n * - close-fill dismiss: glyph X (asset 41:8907, ≈ RemixIcon close); renderizado con\n * <sui-icon name=\"close-line\"> 16px (canon RemixIcon, sin dependencia de asset).\n * Color del glyph por estado (verificado node-by-node, NO hereda del label):\n * Default (Stroke y Gray) → icon-soft-400 (#a3a3a3) — 431:16547 / 431:18058\n * Active → icon-strong-950 (#171717) — 431:17141 / 431:18064\n * Disabled → icon-disabled-300 (#d1d1d1) — 431:17379 / 431:18059\n * Hover del PROPIO botón close (affordance) → strong-950 (decisión local, no en Figma).\n * NO usa sui-compact-button: en Figma el close es un glyph 16×16 plano (sin bg/border/\n * shadow/padding), mientras sui-compact-button es un container 20×20 con padding 2px y\n * estilos de botón — metería un cuadro 20px en un tag de 24px y rompería el layout.\n *\n * - State tokens (verified node-by-node):\n * Stroke Default → bg white-0 / border soft-200 / text+icon sub-600\n * Stroke Hover → bg weak-50 / border soft-200 / text+icon sub-600 (431:17022)\n * Stroke Active → bg white-0 / border strong-950 / text+icon strong-950 (431:17141)\n * Stroke Disabled → bg weak-50 / NO border / text+icon disabled-300 (431:17379)\n * Gray Default → bg weak-50 / NO border / text sub-600 / icon soft-400\n * Gray Hover → bg white-0 / border soft-200 / text sub-600 / icon soft-400 (431:18049)\n * Gray Active → bg white-0 / border strong-950 / text+icon strong-950 (431:18064)\n * Gray Disabled → bg weak-50 / NO border / text+icon disabled-300 (431:18059)\n *\n * ARQUITECTURA — Type via proyección (NO 6 enums rígidos con assets baked):\n * Los 6 \"Type\" de Figma (Basic, Left Icon, Avatar, Country, Brand, Company)\n * colapsan a dos casos: SIN leading element vs CON leading element 16×16 + gap-4.\n * El leading se proyecta vía `[data-slot=start]`, así el consumer pasa:\n * - Left Icon → <sui-icon name=\"...\" data-slot=\"start\" size=\"16\">\n * - Avatar → <sui-avatar size=\"xs\" data-slot=\"start\" ...> (xs=20, escalado por CSS a 16)\n * - Country → <sui-flag name=\"peru\" size=\"xs\" data-slot=\"start\"> (xs=16)\n * - Brand/Company → <img data-slot=\"start\" ... 16×16>\n * Esto evita baked-in flags/brands/avatars (que requerirían descargar 262 flags +\n * logos de marca arbitrarios) y mantiene el componente agnóstico al contenido.\n * El input `leading` (boolean) ajusta padding/gap cuando hay leading element.\n *\n * INTERACTIVITY:\n * Figma documenta Hover/Active states → el tag PUEDE ser interactivo (clickeable).\n * `interactive` input habilita los estilos :hover/:active del host. Si el tag no es\n * clickeable (solo display), `interactive=false` (default) los suprime. El dismiss\n * button SIEMPRE tiene su propio hover/active independiente del host.\n *\n * PENDING VERIFY (inferido, sin confirmar pixel-exacto en Figma):\n * - Avatar leading a 16×16: sui-avatar size más chico es xs=20 (no hay 16). Se\n * escala vía CSS (width/height 16) en el slot. Figma muestra el avatar a 16×16\n * exacto — el escalado CSS de un avatar 20 podría diferir ~sub-pixel del asset.\n * - Hover/Active como estados :hover/:active CSS reales (no data-attr forzados):\n * Figma los modela como variantes State separadas. Se mapean a pseudo-clases\n * cuando `interactive=true`. Si un consumer necesita forzar el estado visual\n * (ej. en un storybook/preview), no hay input `state` explícito — se asume que\n * el pseudo-estado real del DOM basta.\n * - Disabled icon color: Figma Disabled solo se pulló en Basic (sin leading). Se\n * asume disabled-300 también para el leading icon/avatar/flag proyectado, pero el\n * contenido proyectado (avatar/flag con color propio) NO se puede forzar a gris\n * desde el host — el consumer debe atenuar su propio leading si lo requiere.\n *\n * CUSTOM (no en Figma — add-on local): ninguno por ahora. extraFeatures del\n * reporte de auditoría estaba vacío.\n */\n@Component({\n selector: 'sui-tag',\n standalone: true,\n templateUrl: './sui-tag.html',\n styleUrl: './sui-tag.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiIcon],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-style]': 'tagStyle()',\n '[attr.data-sui-leading]': 'leading() ? \"\" : null',\n '[attr.data-sui-dismissible]': 'dismissible() ? \"\" : null',\n '[attr.data-sui-interactive]': 'interactive() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n /* Sin role: un tag es display estático. role=\"status\" creaba un ARIA live\n region que hacía que los lectores de pantalla anunciaran cada cambio de\n contenido proyectado. Se omite el role para que renderee como genérico. */\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n },\n})\nexport class SuiTag {\n /** Visual style. `stroke` = white bg + soft border; `gray` = weak-50 bg, no border. Default stroke. */\n readonly tagStyle = input<SuiTagStyle>('stroke');\n\n /**\n * True cuando hay un leading element proyectado (icon/avatar/flag/brand/company)\n * en `[data-slot=start]`. Ajusta el padding (pl=4) y agrega gap=4 leading↔texto.\n * El consumer DEBE setearlo cuando proyecta un start slot.\n */\n readonly leading = input(false);\n\n /** Texto secundario opcional (ej. '(4)'), render en text-soft-400, gap 2px tras el label. */\n readonly sublabel = input<string>('');\n\n /** Muestra el botón de cierre (X 16×16) al final del tag. Emite `(dismiss)`. */\n readonly dismissible = input(false);\n\n /**\n * Habilita los estilos :hover / :active del host (Figma States Hover/Active).\n * Solo cuando el tag entero es clickeable. Default false (tag de display puro).\n */\n readonly interactive = input(false);\n\n /** Estado deshabilitado: override de tokens a disabled-300, pointer-events none. */\n readonly disabled = input(false);\n\n /** aria-label opcional para el botón de cierre. Default 'Quitar'. */\n readonly dismissLabel = input<string>('Quitar');\n\n /** Emitido al clickear el botón de cierre (solo si dismissible y no disabled). */\n readonly dismiss = output<void>();\n\n /** True cuando hay sublabel no vacío para renderizar el span secundario. */\n readonly showsSublabel = computed(() => this.sublabel().trim().length > 0);\n\n protected onDismiss(event: MouseEvent): void {\n event.stopPropagation();\n if (this.disabled()) return;\n this.dismiss.emit();\n }\n}\n","<!-- Leading element (icon / avatar / flag / brand / company logo) — 16×16, gap-4 al texto.\n Proyectado por el consumer; `leading` input ajusta padding/gap del host. -->\n<ng-content select=\"[data-slot=start]\"></ng-content>\n\n<!-- Bloque \"Text\" interno (Figma node \"Text\"): label + sublabel + close, gap-2. -->\n<span class=\"sui-tag__text\">\n <span class=\"sui-tag__label\"><ng-content></ng-content></span>\n\n @if (showsSublabel()) {\n <span class=\"sui-tag__sublabel\">{{ sublabel() }}</span>\n }\n\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"sui-tag__dismiss\"\n [attr.aria-label]=\"dismissLabel()\"\n [disabled]=\"disabled()\"\n (click)=\"onDismiss($event)\"\n (touchstart)=\"$any($event.currentTarget)\"\n (touchend)=\"$any($event.currentTarget).blur()\"\n >\n <sui-icon name=\"close-line\" [size]=\"16\" aria-hidden=\"true\" />\n </button>\n }\n</span>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewChild,\n computed,\n forwardRef,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiTag } from '../sui-tag/sui-tag';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\n\nexport type SuiTagInputSize = 'xsmall' | 'small' | 'medium';\n\n/**\n * SUI Tag Input — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: \"Tag Input [1.1]\" (frame 428:4860)\n * Matriz Figma: State(6: Default/Hover/Focus/Filled/Disabled/Error) × Size(3: Medium 40 / Small 36 / X-Small 32).\n *\n * Variantes pulled (get_design_context + get_variable_defs):\n * - 428:5020 Filled / Medium (estructura tags Berlin/London/Paris + close-fill)\n * - 428:4920 Hover / Medium (bg weak-50, SIN border, SIN shadow; placeholder sub-600)\n * - 428:4956 Focus / Medium (border strong-950 + focus ring 2px white / 4px slate-alpha-16)\n * - 428:5107 Error / Medium (border error-base; hint variant error)\n * - 428:5242 Default / Small (py=8 pl=10 pr=8 gap=8 radius-8)\n * - 428:5506 Default / X-Small (py=6 pl=10 pr=6 gap=6 radius-8)\n *\n * EXACT (verificado pixel/token vs Figma):\n *\n * Sizes (input box \"Basic\"):\n * - xsmall (X-Small 32): py=6px, pl=10px, pr=6px, gap=6px, radius=8px\n * - small (Small 36): py=8px, pl=10px, pr=8px, gap=8px, radius=8px\n * - medium (Medium 40): py=10px, pl=12px, pr=10px, gap=8px, radius=10px (default)\n *\n * El alto se deriva del line-height(20) del texto + 2×py. No height explícito.\n *\n * - Texto input/placeholder: Paragraph/Small (Inter 14 / 20 / -0.084px ≈ -0.006em),\n * font-feature 'ss11' 1 'calt' 0 'liga' 0.\n * - Placeholder color: text-soft-400 (#a3a3a3) en default; text-sub-600 (#5c5c5c) en hover.\n * Filled (texto escrito) → text-strong-950 (#171717).\n *\n * State tokens (verified node-by-node):\n * Default → bg white-0 / border soft-200 / shadow regular-x-small / placeholder soft-400\n * Hover → bg weak-50 / SIN border / SIN shadow / placeholder sub-600\n * Focus → bg white-0 / border strong-950 / ring: 0 0 0 2px white, 0 0 0 4px slate-alpha-16\n * Filled → bg white-0 / border soft-200 / shadow regular-x-small / texto strong-950\n * Disabled → bg weak-50 / SIN border / texto disabled-300 / cursor not-allowed\n * Error → bg white-0 / border error-base / shadow / hint en error-base\n *\n * NOTA CRÍTICA (distinción vs Input Basic): el hover del Tag Input mueve el bg a\n * weak-50 y QUITA el border (igual que disabled), mientras que el Input Basic solo\n * cambia border-color (soft-200 → sub-300) y conserva bg blanco. No confundir.\n *\n * Tags row (frame \"Tags\"): fila aparte debajo del input box, pt=4px gap=8px,\n * wrap a múltiples líneas. Cada pill es un <sui-tag tagStyle=\"stroke\" dismissible>\n * (radius 6, pl=8 pr=4 py=4 — definido en sui-tag, NO se redefine acá).\n *\n * Trailing icon (Figma TagInput11Props.rightIcon / pickRight, node 428:4819):\n * cuando rightIcon=true, el frame \"Basic\" renderiza en su posición trailing un\n * icono 20×20 `info-custom-fill` coloreado text-soft-400 (#a3a3a3 — heredado del\n * color de texto del frame). El consumer puede sustituir ese contenido proyectando\n * markup en el slot `[slot=right]` (equivalente a `pickRight?: ReactNode`).\n *\n * Hint icon (Figma Hint Text node 428:4900 / I428:4900;266:5272): el hint neutral\n * (Default/Hover) renderiza un icono 16×16 `information-fill` (RemixIcon, NO el custom\n * info-custom-fill) coloreado text-sub-600, alineado al texto del hint. Se logra\n * pasando [icon]=\"'information-fill'\" a sui-form-hint en la variante neutral; el error\n * conserva su icono default (error-warning-line).\n *\n * INTERACTIVIDAD (comportamiento del control):\n * - Enter (o coma, configurable) en el input → agrega el texto como tag nuevo.\n * - Backspace con el input VACÍO → quita el último tag.\n * - Click en la × de un pill → quita ese tag.\n * - addOnBlur (opcional, default false): el texto pendiente se commitea como tag al blur.\n * - Click en cualquier parte del field → focusea el input (UX nativa de tag inputs).\n * - Cada add/remove dispara (tagAdded)/(tagRemoved) y actualiza el value model (string[]).\n *\n * CVA: expone `string[]` (la lista de tags) al FormControl/ngModel. El texto pendiente\n * del input NO forma parte del value hasta que se commitea como tag.\n *\n * PENDING VERIFY (inferido, sin confirmar pixel-exacto en Figma):\n * - Multi-línea wrap del tags row: Figma muestra una sola fila (Berlin/London/Paris).\n * Se asume flex-wrap con row-gap igual al column-gap (8px). Figma no documenta el\n * comportamiento con N tags que superen el ancho.\n * - El input box de Figma NO contiene los tags adentro (los modela como fila separada\n * debajo). Se respeta esa arquitectura: input box arriba, tags row debajo. Un layout\n * alternativo \"tags inline dentro del box\" NO está en Figma → no se implementa.\n * - normalize/dedupe de tags (trim + lowercase compare) es decisión local: se trimea y\n * se evita duplicado exacto (case-sensitive por default). Figma no especifica.\n * - maxTags: cap opcional local, no documentado en Figma.\n *\n * CUSTOM (no en Figma — add-on local):\n * - separators (Enter por default; opción coma).\n * - allowDuplicates / maxTags / addOnBlur.\n */\n@Component({\n selector: 'sui-tag-input',\n standalone: true,\n templateUrl: './sui-tag-input.html',\n styleUrl: './sui-tag-input.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiTag, SuiIcon, SuiFormLabel, SuiFormHint],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiTagInput),\n multi: true,\n },\n ],\n host: {\n /* Strip native `title` attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-size]': 'size()',\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n },\n})\nexport class SuiTagInput implements ControlValueAccessor {\n // ── Core inputs ────────────────────────────────────────────────────────────\n readonly size = input<SuiTagInputSize>('medium');\n readonly placeholder = input('Add tags...');\n readonly disabled = input(false);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n\n /**\n * Renderiza el icono trailing del frame \"Basic\" (Figma `rightIcon`, node 428:4819).\n * Default: `info-custom-fill` 20×20 coloreado text-soft-400. Para sustituir el\n * contenido del slot proyectá markup en `[slot=right]` (equivalente `pickRight`).\n */\n readonly rightIcon = input(false);\n /** Nombre del icono trailing cuando rightIcon=true y no se proyecta `[slot=right]`. */\n readonly rightIconName = input('info-custom-fill');\n\n // ── Label inputs (delegated to sui-form-label) ──────────────────────────────\n readonly label = input<string | null>(null);\n readonly sublabel = input<string | null>(null);\n readonly required = input(false);\n readonly tooltip = input<string | null>(null);\n\n // ── Hint (delegated to sui-form-hint) ───────────────────────────────────────\n readonly hint = input<string | null>(null);\n\n // ── Behavior inputs (custom — no en Figma) ──────────────────────────────────\n /** Permite que coma además de Enter agregue un tag. Default false (solo Enter). */\n readonly commaSeparator = input(false);\n /** Permite tags duplicados. Default false (dedupe case-sensitive). */\n readonly allowDuplicates = input(false);\n /** Máximo de tags. null = sin tope. */\n readonly maxTags = input<number | null>(null);\n /** Commitea el texto pendiente como tag al perder el foco. Default false. */\n readonly addOnBlur = input(false);\n\n /** Lista de tags — el value model expuesto al FormControl/ngModel. */\n readonly value = model<string[]>([]);\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n readonly tagAdded = output<string>();\n readonly tagRemoved = output<string>();\n\n // ── Internal state ───────────────────────────────────────────────────────────\n @ViewChild('inputEl') inputEl?: ElementRef<HTMLInputElement>;\n private readonly hostEl: ElementRef<HTMLElement> = inject(ElementRef);\n\n /** Texto pendiente en el input (no forma parte del value hasta commitearse). */\n readonly draft = signal<string>('');\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** True cuando hay al menos un tag (para renderizar la fila de tags). */\n readonly hasTags = computed(() => this.value().length > 0);\n\n private _onChange: (v: string[]) => void = () => {};\n private _onTouched: () => void = () => {};\n\n // ── Event handlers ─────────────────────────────────────────────────────────\n\n onInput(e: Event): void {\n if (this.isDisabled()) return;\n this.draft.set((e.target as HTMLInputElement).value);\n }\n\n onKeydown(e: KeyboardEvent): void {\n if (this.isDisabled()) return;\n\n if (e.key === 'Enter' || (this.commaSeparator() && e.key === ',')) {\n e.preventDefault();\n this.commitDraft();\n return;\n }\n\n // Backspace con el input vacío → quita el último tag.\n if (e.key === 'Backspace' && this.draft().length === 0 && this.value().length > 0) {\n e.preventDefault();\n this.removeLast();\n }\n }\n\n onBlur(): void {\n if (this.addOnBlur() && !this.isDisabled()) {\n this.commitDraft();\n }\n this._onTouched();\n }\n\n /**\n * Click en el field → focusea el input. UX nativa de tag inputs: tocar\n * cualquier zona del campo (incluido el padding) lleva el caret al input.\n */\n onFieldPointerDown(e: MouseEvent): void {\n if (this.isDisabled()) return;\n // Solo redirige si el target no es ya un control interactivo (input/botón close).\n const target = e.target as HTMLElement;\n if (target.closest('.sui-tag-input__control') || target.closest('sui-tag')) return;\n e.preventDefault();\n this.inputEl?.nativeElement.focus();\n }\n\n // ── Core mutations ───────────────────────────────────────────────────────────\n\n /** Commitea el draft actual como tag (trim, dedupe, cap). Limpia el input. */\n commitDraft(): void {\n const raw = this.draft().trim();\n if (!raw) {\n this.draft.set('');\n return;\n }\n this.addTag(raw);\n this.draft.set('');\n if (this.inputEl) this.inputEl.nativeElement.value = '';\n }\n\n /** Agrega un tag respetando dedupe y maxTags. Devuelve true si se agregó. */\n addTag(tag: string): boolean {\n const value = tag.trim();\n if (!value) return false;\n\n const current = this.value();\n\n const cap = this.maxTags();\n if (cap !== null && current.length >= cap) return false;\n\n if (!this.allowDuplicates() && current.includes(value)) return false;\n\n const next = [...current, value];\n this.value.set(next);\n this._onChange(next);\n this.tagAdded.emit(value);\n return true;\n }\n\n /** Quita el tag en `index`. */\n removeAt(index: number): void {\n if (this.isDisabled()) return;\n const current = this.value();\n if (index < 0 || index >= current.length) return;\n const removed = current[index];\n const next = current.filter((_, i) => i !== index);\n this.value.set(next);\n this._onChange(next);\n this.tagRemoved.emit(removed);\n }\n\n /** Quita el último tag (usado por Backspace en input vacío). */\n removeLast(): void {\n this.removeAt(this.value().length - 1);\n }\n\n // ── CVA ──────────────────────────────────────────────────────────────────────\n\n writeValue(v: string[] | null): void {\n this.value.set(Array.isArray(v) ? [...v] : []);\n }\n\n registerOnChange(fn: (v: string[]) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","<!-- Label (Figma \"Label [1.1]\" arriba del field) — delegado a sui-form-label. -->\n@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n [size]=\"size()\"\n class=\"sui-tag-input__label-host\"\n />\n}\n\n<!-- Input box \"Basic\" — texto libre. Click en cualquier zona enfoca el input. -->\n<div\n class=\"sui-tag-input__field\"\n [class.sui-tag-input__field--error]=\"error()\"\n [class.sui-tag-input__field--disabled]=\"isDisabled()\"\n (mousedown)=\"onFieldPointerDown($event)\"\n>\n <input\n #inputEl\n class=\"sui-tag-input__control\"\n type=\"text\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [value]=\"draft()\"\n autocomplete=\"off\"\n (input)=\"onInput($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Trailing icon (Figma rightIcon / pickRight, node 428:4819) — 20×20 info-custom-fill,\n o el contenido que proyecte el consumer en [slot=right]. -->\n @if (rightIcon()) {\n <span class=\"sui-tag-input__right\">\n <ng-content select=\"[slot=right]\">\n <sui-icon [name]=\"rightIconName()\" [size]=\"20\" />\n </ng-content>\n </span>\n }\n</div>\n\n<!-- Tags row (Figma frame \"Tags\") — fila aparte debajo del input, pt=4 gap=8, wrap. -->\n@if (hasTags()) {\n <div class=\"sui-tag-input__tags\" role=\"list\">\n @for (tag of value(); track $index) {\n <sui-tag\n role=\"listitem\"\n tagStyle=\"stroke\"\n [dismissible]=\"true\"\n [disabled]=\"isDisabled()\"\n [dismissLabel]=\"'Quitar ' + tag\"\n (dismiss)=\"removeAt($index)\"\n >\n {{ tag }}\n </sui-tag>\n }\n </div>\n}\n\n<!-- Hint / error message — delegado a sui-form-hint.\n El hint neutral muestra el icono 16×16 `information-fill` (Figma node\n I428:4900;266:5272); el error conserva su icono default (error-warning-line). -->\n@if (error() ? errorMessage() : hint()) {\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [icon]=\"error() ? undefined : 'information-fill'\"\n [size]=\"size()\"\n class=\"sui-tag-input__hint-host\"\n />\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n forwardRef,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\n\n/**\n * SUI Textarea — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Component set: \"Text Area [1.1]\" (nodeId 435:5725) — 6 states verified via MCP\n * Default 435:5726 · Hover 435:7023 · Focus 435:7066 · Filled 435:7107 ·\n * Disabled 435:7148 · Error 435:7195\n * Sub-component: \"Character Counter [1.1]\" (nodeId 435:5712) — Default/Error/Disabled\n *\n * EXACT specs (read straight from Figma MCP per state):\n * - border-radius: var(--sui-radius-12) (12px) — radius-12\n * - padding: 10px 10px 10px 12px (pl-12 pr-10 py-10, asymmetric, exact)\n * - inner layout: flex column, gap 8px, justify-center (textarea + counter row)\n * - shadow: regular-shadow/x-small (0 1px 2px 0 #0a0d1408) — only DEFAULT state\n * - Font (text): Paragraph/Small (14px / 400 / 20px / -0.6px == -0.006em)\n *\n * State bg border counter color\n * ─────────────── ──────────── ─────────────────── ─────────────────\n * Default bg-white-0 stroke-soft-200 text-soft-400\n * Hover bg-weak-50 (none — no border) text-soft-400\n * Focus bg-white-0 stroke-strong-950 text-soft-400\n * Disabled bg-weak-50 (none) text-disabled-300\n * Error bg-white-0 state-error-base state-error-base\n *\n * Focus shadow: 0 0 0 2px bg-white-0, 0 0 0 4px slate-alpha-16\n * (components/buttons/important-focus effect)\n * Text color: Default=soft-400(placeholder) · Hover=sub-600 · Focus=strong-950 ·\n * Disabled=disabled-300 · Error=strong-950\n * Hover placeholder override IS applied in SCSS:\n * `.sui-textarea__field:hover .sui-textarea__control::placeholder\n * { color: var(--sui-text-sub-600) }` — verified vs node 435:7023,\n * which renders the placeholder copy at text/sub-600 (#5c5c5c).\n *\n * Character Counter row:\n * - layout: flex, gap 6px, justify-end, items-center, full width\n * - \"<n>/<max>\" Subheading/2X-Small (11px / 500 / 12px / 0.02em == 0.22px),\n * uppercase, text-right — rendered ONLY when [maxLength] is set\n * - resize handle: inline SVG 12×12, TWO diagonal strokes\n * (path M9.11111 2L2 9.11111M10 6.44444L6.44444 10), stroke=currentColor —\n * rendered whenever [resizable] is true, INDEPENDENT of [maxLength]. In\n * Figma every textarea state shows the handle in the bottom-right corner\n * (component set 435:5725, all 6 states) regardless of the counter, so the\n * handle's visibility is tied to resizability, not to the char limit. The\n * counter row container renders when EITHER the counter text OR the handle\n * is present; both share the same flex row (counter left, handle right).\n * Verified vs Figma SVG export: the handle has exactly 2 lines, NOT 3 —\n * the Default (435:5715 #A4A4A4), Error (435:5719 #FB3748) and Disabled\n * (435:5723 #D1D1D1) handles all ship the identical 2-segment path; only\n * the stroke color changes per state.\n * The browser's native resizer grip is suppressed via `::-webkit-resizer\n * { display: none }` so ONLY this custom handle is visible (the textarea\n * stays draggable via native `resize: vertical`).\n * Figma export (node 435:5715) ships the path with stroke=#A4A4A4 and NO\n * explicit stroke-width/linecap → browser default (width 1, butt caps).\n * SUI declares stroke-width=\"1\" explicitly (== Figma default, not the 1.33\n * guessed by the audit) + linecap/linejoin=\"round\" so the two short\n * diagonals anti-alias cleanly without thickening the stroke. Color comes\n * from currentColor inheriting text-soft-400 (#a3a3a3 — the SUI token; the\n * #A4A4A4 in the raw export is Figma's flattened hex, 1-bit diff, ignored).\n * - colors per state: Default/Hover/Focus=soft-400 · Disabled=disabled-300 ·\n * Error=error-base (handled via field-state classes in SCSS)\n *\n * PENDING VERIFY:\n * - Figma fixes the whole field to height 156px; SUI keeps the flexible\n * [rows] input (more idiomatic in Angular). The 156px is NOT enforced — the\n * textarea grows with [rows]/resize. Confirm with design whether a fixed\n * min-height is desired for parity.\n * - Figma renders the hint with an `information-fill` 16×16 icon even in the\n * NEUTRAL hint (not just error). sui-form-hint defaults neutral → no icon.\n * Left as-is to avoid changing sui-form-hint's public default; consumers can\n * pass icon explicitly. See newQuestions in the audit report.\n * - \"Filled\" state (435:7107) not separately styled — same visuals as Default\n * but with strong-950 text once value is present (native behaviour covers it).\n * - Resize handle stroke-width: Figma node 435:5715 exports as a vector but\n * WITHOUT an explicit stroke-width (browser default 1). The audit guessed\n * 1.33/round to match sibling SUI icons, but the actual Figma export does\n * NOT thicken it. Kept stroke-width=\"1\" (= the literal Figma value). If\n * design later confirms the handle should visually match the 1.33 icon\n * convention, bump it then — flagged here so it isn't silently changed.\n *\n * @input rows: number — Filas iniciales del textarea (default 4)\n * @input label: string | null — Texto del label\n * @input sublabel: string | null — Texto secundario del label (ej. \"Optional\")\n * @input required: boolean — Muestra asterisco rojo en el label\n * @input tooltip: string | null — Tooltip en ícono info del label\n * @input hint: string | null — Mensaje de ayuda debajo del field\n * @input error: boolean — Activa borde rojo + muestra errorMessage + counter rojo\n * @input errorMessage: string | null — Mensaje de error\n * @input maxLength: number | null — Si se setea, limita chars y muestra el contador\n * \"<n>/<max>\" dentro del field (bottom-right). null = sin contador de texto.\n * NO controla el resize handle (eso lo decide [resizable]).\n * @input resizable: boolean — resize vertical (default true) / none (false). Cuando\n * true, muestra el resize handle de Figma en la esquina inferior derecha del field\n * SIEMPRE (haya o no contador de texto); cuando false, no hay handle ni drag.\n */\n@Component({\n selector: 'sui-textarea',\n templateUrl: './sui-textarea.html',\n styleUrl: './sui-textarea.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiFormLabel, SuiFormHint],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiTextarea),\n multi: true,\n },\n ],\n host: {\n '[attr.data-sui-error]': 'error() ? \"\" : null',\n '[attr.data-sui-disabled]': 'isDisabled() ? \"\" : null',\n '[attr.data-sui-readonly]': 'readonly() ? \"\" : null',\n '[attr.data-sui-resizable]': 'resizable() ? \"\" : null',\n },\n})\nexport class SuiTextarea implements ControlValueAccessor {\n readonly rows = input<number>(4);\n readonly placeholder = input('');\n readonly disabled = input(false);\n readonly readonly = input(false);\n readonly error = input(false);\n readonly errorMessage = input<string | null>(null);\n readonly label = input<string | null>(null);\n readonly hint = input<string | null>(null);\n readonly autocomplete = input<string | null>(null);\n readonly resizable = input<boolean>(true);\n\n /**\n * Si se setea, limita la cantidad de caracteres y renderiza el contador\n * \"<n>/<max>\" + resize handle dentro del field (SUI Character Counter).\n * null (default) = sin contador ni límite.\n */\n readonly maxLength = input<number | null>(null);\n\n // ── New label inputs (additive) ──────────────────────────────────────────\n /** Texto secundario del label (ej. \"Optional\", \"Required\") */\n readonly sublabel = input<string | null>(null);\n /** Muestra asterisco rojo en el label */\n readonly required = input(false);\n /** Tooltip en ícono info del label */\n readonly tooltip = input<string | null>(null);\n\n readonly value = model<string>('');\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** True cuando hay que renderizar el contador (maxLength seteado y > 0). */\n readonly showCounter = computed(() => {\n const max = this.maxLength();\n return typeof max === 'number' && max > 0;\n });\n\n /** Cantidad de caracteres actuales del valor. */\n readonly charCount = computed(() => this.value().length);\n\n /** Texto del contador \"<n>/<max>\". Vacío si no hay maxLength. */\n readonly counterText = computed(() => {\n const max = this.maxLength();\n if (typeof max !== 'number' || max <= 0) return '';\n return `${this.charCount()}/${max}`;\n });\n\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n onInput(e: Event): void {\n if (this.isDisabled()) return;\n const el = e.target as HTMLTextAreaElement;\n let v = el.value;\n // Enforce hard limit cuando maxLength está seteado (defensa además del\n // [attr.maxlength] nativo, que un paste podría bypassear en algunos UAs).\n const max = this.maxLength();\n if (typeof max === 'number' && max > 0 && v.length > max) {\n v = v.slice(0, max);\n el.value = v;\n }\n this.value.set(v);\n this._onChange(v);\n }\n\n onBlur(): void {\n this._onTouched();\n }\n\n writeValue(v: string | null): void {\n let next = v ?? '';\n const max = this.maxLength();\n if (typeof max === 'number' && max > 0 && next.length > max) {\n next = next.slice(0, max);\n }\n this.value.set(next);\n }\n\n registerOnChange(fn: (v: string) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n}\n","@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n size=\"medium\"\n class=\"sui-textarea__label-host\"\n />\n}\n\n<div\n class=\"sui-textarea__field\"\n [class.sui-textarea__field--error]=\"error()\"\n [class.sui-textarea__field--disabled]=\"isDisabled()\"\n [class.sui-textarea__field--readonly]=\"readonly()\"\n>\n <textarea\n class=\"sui-textarea__control\"\n [rows]=\"rows()\"\n [value]=\"value()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.autocomplete]=\"autocomplete()\"\n [attr.maxlength]=\"maxLength() && maxLength()! > 0 ? maxLength() : null\"\n (input)=\"onInput($event)\"\n (blur)=\"onBlur()\"\n ></textarea>\n\n @if (showCounter() || resizable()) {\n <!-- Character Counter row [1.1] — Figma 435:5712.\n In Figma the \"<n>/<max>\" text and the resize handle live together in a\n single bottom row (flex, gap 6px, justify-end). The text only renders\n when [maxLength] is set; the handle renders whenever the textarea is\n resizable — independent of maxLength (matches Figma, where every state\n shows the handle in the bottom-right corner while resizable). -->\n <div class=\"sui-textarea__counter\" aria-hidden=\"true\">\n @if (showCounter()) {\n <span class=\"sui-textarea__counter-text\">{{ counterText() }}</span>\n }\n @if (resizable()) {\n <!-- Resize handle — Figma 435:5715 (12×12, currentColor).\n Two diagonal strokes — SUI v1.2 oficial (doc /ui/textarea + Figma\n 435:5715, mismo path en Default/Error/Disabled, solo cambia el stroke\n color). El \"M ... M ...\" son las 2 diagonales. -->\n <svg\n class=\"sui-textarea__resize-icon\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.11111 2L2 9.11111M10 6.44444L6.44444 10\"\n stroke=\"currentColor\"\n stroke-width=\"1\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n }\n </div>\n }\n</div>\n\n@if (error() ? errorMessage() : hint()) {\n <!-- Hint Text [1.1] — Figma 435:5731 (neutral) / 435:7200 (error).\n Ambos estados usan `information-fill` 16×16 como ícono del hint\n (nodos I435:5731;266:5272 y I435:7200;266:5286 — verificado MCP).\n El override [icon] fuerza information-fill en los dos casos: neutral\n (que por default no tiene ícono) y error (que por default resuelve a\n error-warning-line). El color sigue del variant (sub-600 / error-base). -->\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [icon]=\"'information-fill'\"\n size=\"medium\"\n class=\"sui-textarea__hint-host\"\n />\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\n/**\n * SUI Time Picker Duration — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 165483:6046 (\"TimePickerSelectDuration\") — VERIFIED via MCP\n * Variant matrix: State(4: Default/Hover/Active/Disabled) = 4 combos.\n *\n * Pill de duración rápida (ej. \"30 min\") que vive en la sección de presets del\n * panel del time picker. Al activarse muestra un check 12px + texto primary.\n *\n * EXACT (pulled from Figma 165483:6044 Default + 165483:6042 Active):\n * Container: px-10 py-4, radius-8, overflow-clip. Inline-flex centrado.\n * Typography: Inter Medium 14/20, letter-spacing -0.6% (= -0.084px),\n * font-feature-settings 'ss11' 1, 'calt' 0, 'liga' 0.\n * Default: bg white-0 · border stroke-soft-200 · shadow x-small · text sub-600\n * Hover: bg weak-50 · border stroke-soft-200 · (sin shadow) · text sub-600\n * Active: bg primary-alpha-10 · gap-6 · check 12px + text primary-base · sin border\n * Disabled: bg weak-50 · (sin border) · text disabled-300\n *\n * NOTA brand-override: Active usa primary-alpha-10 (#476cff1a Figma → #fa73191a)\n * y primary-base (#335cff → #fa7319). Igual que el resto del DS.\n *\n * @input label — texto del pill (ej. \"30 min\")\n * @input active — estado seleccionado (check + estilo primary)\n * @input disabled\n */\n@Component({\n selector: 'sui-time-picker-duration',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-time-picker-duration.html',\n styleUrl: './sui-time-picker-duration.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': '\"button\"',\n '[attr.data-sui-active]': 'active() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-pressed]': 'active() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)',\n /* iOS WKWebView :active stuck fix — patrón canon (ver CLAUDE.md). */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiTimePickerDuration {\n readonly label = input.required<string>();\n readonly active = input(false);\n readonly disabled = input(false);\n\n readonly clicked = output<Event>();\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<!-- TimePickerSelectDuration — Figma 165483:6046. Check 12px solo en Active. -->\n@if (active() && !disabled()) {\n <sui-icon class=\"sui-time-picker-duration__check\" name=\"checkbox-circle-fill\" [size]=\"12\" />\n}\n<span class=\"sui-time-picker-duration__label\">{{ label() }}</span>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { SuiIcon } from '../sui-icon/sui-icon';\n\nexport type SuiTimePickerItemDirection = 'right' | 'center';\n\n/**\n * SUI Time Picker Item — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 165483:5687 (\"TimePickerItems\") — VERIFIED via MCP get_design_context\n * Variant matrix: State(4: Default/Hover/Active/Disabled)\n * × Direction(2: Right/Center)\n * × RightText(2: true/false) = 16 combos.\n *\n * Fila individual de las listas scrollables de hora/minuto del time picker.\n * Compone el \"Left\" group (hora + AM/PM) y opcionalmente un \"Right\" group\n * (segundo bloque hora — usado en pickers de rango start/end). El check 14px\n * marca el item activo (seleccionado en la columna).\n *\n * EXACT (pulled from Figma 165596:40475 Default Right + 165596:40489 Active):\n * Container: h-36, px-12 py-8, gap-10, radius-8, overflow-clip.\n * width: 292 en Figma (default) — el consumer puede override (flex-1 en lista).\n * Left / Right groups: flex-1, gap-3, items-center.\n * Right group: justify-end.\n * Typography (todos los textos): Inter Medium 14/20, letter-spacing -0.6%\n * (= -0.084px), font-feature-settings 'ss11' 1, 'calt' 0, 'liga' 0.\n * Check (Active): 14×14, filled-circle check (RemixIcon checkbox-circle-fill),\n * color primary-base. En Direction=Center va ENTRE Left y Right; en\n * Direction=Right va al final (después del Right group).\n *\n * COLOR MAPPING por estado (Figma → tokens):\n * Default: bg white-0 · time text-sub-600 · meridiem text-soft-400\n * Hover: bg weak-50 · time text-sub-600 · meridiem text-soft-400\n * Active: bg weak-50 · time text-strong-950 · meridiem text-soft-400 · + check\n * Disabled: bg white-0 · TODO el texto text-disabled-300\n *\n * NOTA brand-override: Active check usa --sui-primary-base (#335cff en Figma →\n * #fa7319 naranja en este proyecto, igual que el resto del DS). Es intencional.\n *\n * Asset: el checkmark de Figma es un SVG externo (filled circle). Se reemplaza\n * por <sui-icon name=\"checkbox-circle-fill\"> para consistencia con el DS\n * (mismo criterio que sui-dropdown-item usa check-line). Ver assetsPending.\n *\n * @input time — texto principal de la izquierda (ej. \"09:30\")\n * @input meridiem — sufijo AM/PM de la izquierda (null = sin meridiem, formato 24h)\n * @input rightTime / rightMeridiem — segundo bloque (Direction implica rightText=true)\n * @input direction — 'right' (check al final) | 'center' (check entre bloques)\n * @input active — estado seleccionado (muestra check + texto strong)\n * @input highlighted — keyboard-hover (mouse hover se maneja por CSS :hover)\n * @input disabled\n */\n@Component({\n selector: 'sui-time-picker-item',\n standalone: true,\n imports: [SuiIcon],\n templateUrl: './sui-time-picker-item.html',\n styleUrl: './sui-time-picker-item.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': '\"option\"',\n '[attr.data-sui-direction]': 'direction()',\n '[attr.data-sui-active]': 'active() ? \"\" : null',\n '[attr.data-sui-highlighted]': 'highlighted() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-selected]': 'active() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)',\n /* iOS WKWebView :active stuck fix — patrón canon (ver CLAUDE.md). */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiTimePickerItem {\n readonly time = input.required<string>();\n readonly meridiem = input<string | null>(null);\n readonly rightTime = input<string | null>(null);\n readonly rightMeridiem = input<string | null>(null);\n readonly direction = input<SuiTimePickerItemDirection>('right');\n readonly active = input(false);\n readonly highlighted = input(false);\n readonly disabled = input(false);\n\n readonly clicked = output<Event>();\n\n /** El bloque \"Right\" solo se renderiza cuando hay rightTime (RightText=true). */\n readonly hasRight = computed(() => this.rightTime() !== null);\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<!--\n TimePickerItems — Figma 165483:5687.\n Direction=Right: [Left] [Right?] [Check?]\n Direction=Center: [Left] [Check?] [Right?]\n En Right (sin rightText) el check queda al final tras el Left group.\n-->\n<span class=\"sui-time-picker-item__left\">\n <span class=\"sui-time-picker-item__time\">{{ time() }}</span>\n @if (meridiem()) {\n <span class=\"sui-time-picker-item__meridiem\">{{ meridiem() }}</span>\n }\n</span>\n\n@if (direction() === 'center' && active()) {\n <sui-icon class=\"sui-time-picker-item__check\" name=\"checkbox-circle-fill\" [size]=\"14\" />\n}\n\n@if (hasRight()) {\n <span class=\"sui-time-picker-item__right\">\n <span class=\"sui-time-picker-item__time\">{{ rightTime() }}</span>\n @if (rightMeridiem()) {\n <span class=\"sui-time-picker-item__meridiem\">{{ rightMeridiem() }}</span>\n }\n </span>\n}\n\n@if (direction() === 'right' && active()) {\n <sui-icon class=\"sui-time-picker-item__check\" name=\"checkbox-circle-fill\" [size]=\"14\" />\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\n\nexport type SuiTimePickerStatusType = 'available' | 'busy' | 'in-meeting' | 'offline';\n\n/** Texto por defecto de cada type (matchea el copy del Figma). */\nconst STATUS_LABELS: Record<SuiTimePickerStatusType, string> = {\n available: 'Available',\n busy: 'Busy',\n 'in-meeting': 'In-meeting',\n offline: 'Offline',\n};\n\n/**\n * SUI Time Picker Select Status — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 165596:41348 (\"TimePickerSelectStatus\") — VERIFIED via MCP get_design_context\n * Variant matrix: Type(4: 🟢 Available / 🔴 Busy / 🟠 In-meeting / ⚪️ Offline)\n * × State(4: Default / Hover / Selected / Disabled) = 16 combos.\n *\n * Pill de estado de disponibilidad que vive junto a los presets/columnas del\n * time picker (ej. marcar un slot como \"Busy\"/\"Available\" en un scheduler).\n * Es un componente standalone del MISMO set de Figma — antes estaba sin\n * implementar (el comentario viejo del time-picker lo daba por \"no relacionado\",\n * lo cual era incorrecto: es un nodo real dentro del scope de auditoría).\n *\n * EXACT (pulled from Figma 165596:41349 Default Available + variantes):\n * Container: inline-flex centrado, gap-4, pl-6 pr-10 py-4, radius-8,\n * overflow-clip. box-sizing border-box.\n * Dot: box 16×16, círculo r=3 (6px diámetro) centrado, color = base del type.\n * Typography (label): Inter Medium 14/20, letter-spacing -0.6% (= -0.084px),\n * font-feature-settings 'ss11' 1, 'calt' 0, 'liga' 0.\n *\n * COLOR MAPPING por State (Figma → tokens):\n * Default: bg white-0 · border stroke-soft-200 · shadow x-small · text sub-600\n * Hover: bg weak-50 · border stroke-soft-200 · (sin shadow) · text sub-600\n * Selected: bg <type>-lighter · sin border/shadow · text <type>-dark\n * Disabled: bg weak-50 · sin border/shadow · text disabled-300 · dot disabled-300\n *\n * Selected backgrounds + text por type (semánticos, NO brand-override):\n * Available → bg success-lighter (#e3f7ec) · text success-dark (#0b4627)\n * Busy → bg error-lighter (#ffebec) · text error-dark (#681219)\n * In-meeting → bg warning-lighter (#fff3eb) · text warning-dark (#71330a)\n * Offline → bg faded-lighter (#f5f5f5) · text faded-dark (#262626)\n *\n * Dot color por type (base, NO brand-override — son semánticos de estado):\n * Available → success-base (#1fc16b) · Busy → error-base (#fb3748)\n * In-meeting → warning-base (#fa7319) · Offline → faded-base (#7b7b7b)\n * Disabled (cualquier type) → disabled-300 (#d1d1d1)\n *\n * NOTA: a diferencia del check del item/duration (que sí es brand-override azul→\n * naranja), aquí los colores de estado se respetan tal cual el Figma porque son\n * SEMÁNTICOS (success/error/warning/faded), no decorativos. In-meeting cae en\n * warning, que en este proyecto coincide con el naranja de marca por diseño.\n *\n * Asset: el Dot de Figma es un SVG externo (círculo r=3). Se replica con un\n * radial-gradient sobre el box 16×16 (mismo patrón que sui-badge__dot, ver\n * assetsPending) para no depender de un asset remoto.\n *\n * @input type — 'available' | 'busy' | 'in-meeting' | 'offline'\n * @input label — override del texto (default = label canon del type)\n * @input selected — estado seleccionado (bg + texto semántico del type)\n * @input disabled\n */\n@Component({\n selector: 'sui-time-picker-status',\n standalone: true,\n imports: [],\n templateUrl: './sui-time-picker-status.html',\n styleUrl: './sui-time-picker-status.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': '\"button\"',\n '[attr.data-sui-type]': 'type()',\n '[attr.data-sui-selected]': 'selected() ? \"\" : null',\n '[attr.data-sui-disabled]': 'disabled() ? \"\" : null',\n '[attr.aria-pressed]': 'selected() ? \"true\" : \"false\"',\n '[attr.aria-disabled]': 'disabled() ? \"true\" : null',\n '[attr.tabindex]': 'disabled() ? \"-1\" : \"0\"',\n '(click)': 'onClick($event)',\n '(keydown.enter)': 'onClick($event)',\n '(keydown.space)': 'onClick($event)',\n /* iOS WKWebView :active stuck fix — patrón canon (ver CLAUDE.md). */\n '(touchstart)': '$event.currentTarget',\n '(touchend)': '$any($event.currentTarget).blur()',\n },\n})\nexport class SuiTimePickerStatus {\n readonly type = input<SuiTimePickerStatusType>('available');\n readonly label = input<string | null>(null);\n readonly selected = input(false);\n readonly disabled = input(false);\n\n readonly clicked = output<Event>();\n\n /** Texto a mostrar: override del consumer o el copy canon del type. */\n readonly displayLabel = computed(() => this.label() ?? STATUS_LABELS[this.type()]);\n\n onClick(event: Event): void {\n if (this.disabled()) {\n event.stopPropagation();\n event.preventDefault();\n return;\n }\n this.clicked.emit(event);\n }\n}\n","<!--\n TimePickerSelectStatus — Figma 165596:41348.\n [Dot 16×16] [Label]. Dot color = base semántico del type (o disabled-300).\n El círculo de 6px (r=3) se pinta centrado en el box 16×16 vía radial-gradient\n en SCSS (mismo patrón que sui-badge__dot). Ver assetsPending.\n-->\n<span class=\"sui-time-picker-status__dot\" aria-hidden=\"true\"></span>\n<span class=\"sui-time-picker-status__label\">{{ displayLabel() }}</span>\n","/* ═══ SUI Time Picker — utilidades de formato/parsing ════════════════════\n * Helpers puros (sin Angular) para construir las listas de hora/minuto, parsear\n * y formatear el valor del time picker. Testeable de forma aislada.\n * ════════════════════════════════════════════════════════════════════════ */\n\nexport type SuiTimeFormat = '12h' | '24h';\nexport type SuiTimePeriod = 'AM' | 'PM';\n\n/** Valor canónico del time picker — siempre se guarda en formato 24h interno. */\nexport interface SuiTimeValue {\n /** Hora 0–23 (formato 24h interno, independiente del display 12h/24h). */\n hours: number;\n /** Minuto 0–59. */\n minutes: number;\n}\n\n/** Pad a 2 dígitos: 9 → \"09\". */\nexport function pad2(n: number): string {\n return n < 10 ? `0${n}` : `${n}`;\n}\n\n/**\n * Convierte una hora 24h (0–23) a su par display (hora 12h 1–12 + periodo).\n * 0 → { hour12: 12, period: 'AM' }\n * 13 → { hour12: 1, period: 'PM' }\n */\nexport function to12h(hours24: number): { hour12: number; period: SuiTimePeriod } {\n const period: SuiTimePeriod = hours24 >= 12 ? 'PM' : 'AM';\n let hour12 = hours24 % 12;\n if (hour12 === 0) hour12 = 12;\n return { hour12, period };\n}\n\n/**\n * Convierte una hora 12h (1–12) + periodo a hora 24h (0–23).\n * (12, 'AM') → 0\n * (1, 'PM') → 13\n */\nexport function to24h(hour12: number, period: SuiTimePeriod): number {\n const base = hour12 % 12; // 12 → 0\n return period === 'PM' ? base + 12 : base;\n}\n\n/**\n * Formatea un SuiTimeValue para mostrarlo en el trigger / item.\n * - 12h → \"09:30 AM\"\n * - 24h → \"21:30\"\n */\nexport function formatTime(value: SuiTimeValue, format: SuiTimeFormat): string {\n if (format === '24h') {\n return `${pad2(value.hours)}:${pad2(value.minutes)}`;\n }\n const { hour12, period } = to12h(value.hours);\n return `${pad2(hour12)}:${pad2(value.minutes)} ${period}`;\n}\n\n/**\n * Parsea un string de hora hacia SuiTimeValue. Acepta:\n * \"9:30 AM\", \"09:30 am\", \"21:30\", \"9:5\" → tolerante.\n * Devuelve null si no se puede interpretar.\n */\nexport function parseTime(input: string | null | undefined): SuiTimeValue | null {\n if (!input) return null;\n const trimmed = input.trim();\n const match = trimmed.match(/^(\\d{1,2})\\s*[:.\\s]\\s*(\\d{1,2})\\s*(am|pm|AM|PM)?$/);\n if (!match) return null;\n\n let h = parseInt(match[1], 10);\n const m = parseInt(match[2], 10);\n const period = match[3]?.toUpperCase() as SuiTimePeriod | undefined;\n\n if (Number.isNaN(h) || Number.isNaN(m)) return null;\n if (m < 0 || m > 59) return null;\n\n if (period) {\n if (h < 1 || h > 12) return null;\n h = to24h(h, period);\n } else {\n if (h < 0 || h > 23) return null;\n }\n\n return { hours: h, minutes: m };\n}\n\n/** Devuelve true si dos valores representan el mismo instante de hora/minuto. */\nexport function isSameTime(a: SuiTimeValue | null, b: SuiTimeValue | null): boolean {\n if (a === null || b === null) return a === b;\n return a.hours === b.hours && a.minutes === b.minutes;\n}\n\n/**\n * Genera la lista de horas a mostrar en la columna scrollable.\n * - 12h → [1..12]\n * - 24h → [0..23]\n */\nexport function buildHourList(format: SuiTimeFormat): number[] {\n if (format === '24h') {\n return Array.from({ length: 24 }, (_, i) => i);\n }\n return Array.from({ length: 12 }, (_, i) => i + 1); // 1..12\n}\n\n/**\n * Genera la lista de minutos según el step (1, 5, 15, etc.).\n * step=5 → [0,5,10,...,55].\n */\nexport function buildMinuteList(step: number): number[] {\n const safeStep = step > 0 && step <= 60 ? step : 1;\n const out: number[] = [];\n for (let m = 0; m < 60; m += safeStep) out.push(m);\n return out;\n}\n\n/** Preset de duración rápida (pill TimePickerSelectDuration). */\nexport interface SuiTimeDurationPreset {\n /** Texto visible — ej. \"30 min\", \"1 h\". */\n label: string;\n /** Minutos que representa (para resolver el valor relativo a una base). */\n minutes: number;\n}\n\nexport const DEFAULT_DURATION_PRESETS: readonly SuiTimeDurationPreset[] = [\n { label: '15 min', minutes: 15 },\n { label: '30 min', minutes: 30 },\n { label: '45 min', minutes: 45 },\n { label: '1 h', minutes: 60 },\n];\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n forwardRef,\n input,\n model,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { SuiIcon } from '../sui-icon/sui-icon';\nimport { SuiButton } from '../sui-button/sui-button';\nimport { SuiFormLabel } from '../sui-form-label/sui-form-label';\nimport { SuiFormHint } from '../sui-form-hint/sui-form-hint';\nimport { SuiDropdownMenu } from '../sui-dropdown-menu/sui-dropdown-menu';\nimport { SuiDropdownPanel } from '../sui-dropdown-menu/sui-dropdown-panel';\nimport { SuiTimePickerItem } from './sui-time-picker-item';\nimport { SuiTimePickerDuration } from './sui-time-picker-duration';\nimport {\n DEFAULT_DURATION_PRESETS,\n SuiTimeDurationPreset,\n SuiTimeFormat,\n SuiTimePeriod,\n SuiTimeValue,\n buildHourList,\n buildMinuteList,\n formatTime,\n isSameTime,\n pad2,\n parseTime,\n to12h,\n to24h,\n} from './time-picker-utils';\n\nexport type { SuiTimeValue, SuiTimeFormat } from './time-picker-utils';\n\n/** Item de una columna scrollable (hora / minuto / periodo). */\ninterface ColumnItem {\n /** Valor numérico subyacente (hora 1–12 o 0–23, minuto 0–59). */\n raw: number;\n /** Texto a mostrar (con pad). */\n label: string;\n}\n\n/**\n * SUI Time Picker — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Nodos VERIFIED via MCP get_design_context:\n * - 165483:5687 TimePickerItems (fila de lista — sub-componente)\n * - 165483:6046 TimePickerSelectDuration (pill de duración — sub-componente)\n * - 165596:41348 TimePickerSelectStatus (pill de estado — sub-componente)\n * El nodo 165596:41348 SÍ pertenece a este set (TimePickerSelectStatus): es un\n * pill de disponibilidad standalone (Available/Busy/In-meeting/Offline × 4\n * estados = 16 variantes). Vive en sui-time-picker-status.* — un comentario\n * anterior lo daba erróneamente por \"no relacionado\". El panel contenedor no\n * tiene nodo dedicado en Figma; se compone aquí a partir de los sub-componentes\n * + el chrome de popover canon del DS (sui-datepicker). El status pill NO se\n * monta en este popover por default (es para schedulers/disponibilidad); el\n * consumer lo usa suelto, igual que <sui-time-picker-item> fuera del picker.\n *\n * **Arquitectura**: trigger (input field) que abre un panel con columnas\n * scrollables de hora / minuto / (periodo AM-PM en 12h) usando\n * <sui-time-picker-item>, más una fila opcional de presets de duración usando\n * <sui-time-picker-duration>. Patrón staged-value + Cancel/Apply.\n *\n * El panel del popover se delega a `sui-dropdown-menu` vía `[origin]=triggerEl`\n * (mismo stack que sui-select): CDK Overlay con FlexibleConnectedPositionStrategy\n * (flip arriba/abajo según espacio disponible), reposición en scroll, backdrop\n * transparent (outside-click close), Escape y disposeOnNavigation. Así el panel\n * NO se corta abajo y abre donde hay más espacio. El modo `inline` NO usa overlay\n * — renderiza el panel inline (sin trigger ni flotación).\n *\n * COMPONE (dependencias ya homologadas):\n * - sui-time-picker-item / sui-time-picker-duration (sub-piezas de este set)\n * - sui-form-label / sui-form-hint (label + hint, como sui-input/sui-select)\n * - sui-button (footer Cancel/Apply)\n * - sui-icon (trigger icon + chevron)\n * - sui-dropdown-menu / sui-dropdown-panel (overlay del popover, como sui-select)\n *\n * PROJECT EXTENSIONS (no en los nodos Figma — el set solo define las piezas):\n * - Trigger input + popover (Figma solo da las filas y pills sueltas).\n * - Formato 12h (default, AM/PM como en los items) y 24h.\n * - [step] de minutos, [durationPresets], [inline], [showFooter].\n * - CVA: writeValue/registerOnChange para FormControl.\n *\n * @input label / sublabel / required / tooltip / hint / errorMessage / error\n * @input placeholder / disabled / size\n * @input format — '12h' (default, AM/PM) | '24h'\n * @input step — incremento de minutos en la lista (default 5)\n * @input durationPresets — pills de duración rápida (default 15/30/45/60 min)\n * @input inline — renderiza el panel sin trigger ni popover\n * @input showFooter — muestra Cancel/Apply (default true)\n * @model value — SuiTimeValue | null (two-way + CVA)\n */\n@Component({\n selector: 'sui-time-picker',\n standalone: true,\n imports: [\n NgTemplateOutlet,\n SuiIcon,\n SuiButton,\n SuiFormLabel,\n SuiFormHint,\n SuiDropdownMenu,\n SuiDropdownPanel,\n SuiTimePickerItem,\n SuiTimePickerDuration,\n ],\n templateUrl: './sui-time-picker.html',\n styleUrl: './sui-time-picker.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SuiTimePicker),\n multi: true,\n },\n ],\n host: {\n /* Strip native title attr — patrón canon Ontop (ver CLAUDE.md). */\n '[attr.title]': 'null',\n '[attr.data-sui-open]': 'open() ? \"\" : null',\n '[attr.data-sui-format]': 'format()',\n '[attr.data-sui-size]': 'size()',\n },\n})\nexport class SuiTimePicker implements ControlValueAccessor {\n // ── Inputs ───────────────────────────────────────────────────────────\n readonly label = input<string | null>(null);\n readonly sublabel = input<string | null>(null);\n readonly required = input(false);\n readonly tooltip = input<string | null>(null);\n readonly hint = input<string | null>(null);\n readonly errorMessage = input<string | null>(null);\n readonly error = input(false);\n readonly placeholder = input('Seleccionar hora');\n readonly disabled = input(false);\n readonly size = input<'small' | 'medium'>('medium');\n /** Formato de display: '12h' (AM/PM) o '24h'. */\n readonly format = input<SuiTimeFormat>('12h');\n /** Incremento de minutos de la lista (1, 5, 15, ...). Default 5. */\n readonly step = input(5);\n /** Pills de duración rápida bajo las columnas. [] para ocultarlas. */\n readonly durationPresets = input<readonly SuiTimeDurationPreset[]>(DEFAULT_DURATION_PRESETS);\n /** Renderiza el panel inline (sin trigger ni popover). */\n readonly inline = input(false);\n /** Muestra Cancel/Apply. Si false, el click en un item aplica directo. */\n readonly showFooter = input(true);\n\n // ── Estado ─────────────────────────────────────────────────────────\n readonly value = model<SuiTimeValue | null>(null);\n /** Valor staged (editable en el panel hasta Apply). */\n readonly staged = signal<SuiTimeValue | null>(null);\n /** Preset de duración activo (índice) — null = ninguno. */\n readonly activePresetIndex = signal<number | null>(null);\n readonly open = signal(false);\n\n private readonly _disabledByForm = signal(false);\n readonly isDisabled = computed(() => this.disabled() || this._disabledByForm());\n\n /** Trigger element — pasado al sui-dropdown-menu como [origin]. */\n protected readonly triggerEl = viewChild<ElementRef<HTMLElement>>('triggerEl');\n\n /** Ref al sui-dropdown-menu interno — para invocar open/close (modo popover). */\n private readonly _menu = viewChild<SuiDropdownMenu>(SuiDropdownMenu);\n\n // ── Form callbacks ─────────────────────────────────────────────────\n private _onChange: (v: SuiTimeValue | null) => void = () => {};\n private _onTouched: () => void = () => {};\n\n constructor() {\n // Mantener staged sincronizado cuando cambia value desde fuera (estando cerrado).\n effect(() => {\n const v = this.value();\n if (!this.open() && !this.inline()) this.staged.set(v);\n });\n }\n\n // ── Listas de columnas ─────────────────────────────────────────────\n readonly hourItems = computed<ColumnItem[]>(() =>\n buildHourList(this.format()).map(h => ({ raw: h, label: pad2(h) })),\n );\n\n readonly minuteItems = computed<ColumnItem[]>(() =>\n buildMinuteList(this.step()).map(m => ({ raw: m, label: pad2(m) })),\n );\n\n readonly periods: readonly SuiTimePeriod[] = ['AM', 'PM'];\n\n /** En 12h se muestra la columna de periodo. */\n readonly showPeriod = computed(() => this.format() === '12h');\n\n /** Display 12h de la staged (hora 1–12 + periodo). */\n private readonly staged12h = computed(() => {\n const s = this.staged();\n if (!s) return null;\n return to12h(s.hours);\n });\n\n // ── Estados de selección por columna ───────────────────────────────\n isHourActive(item: ColumnItem): boolean {\n const s = this.staged();\n if (!s) return false;\n if (this.format() === '24h') return s.hours === item.raw;\n return this.staged12h()?.hour12 === item.raw;\n }\n\n isMinuteActive(item: ColumnItem): boolean {\n return this.staged()?.minutes === item.raw;\n }\n\n isPeriodActive(p: SuiTimePeriod): boolean {\n return this.staged12h()?.period === p;\n }\n\n // ── Texto del trigger ──────────────────────────────────────────────\n readonly triggerText = computed(() => {\n const v = this.value();\n if (!v) return this.placeholder();\n return formatTime(v, this.format());\n });\n\n /** Para los items: separa el \"HH:MM\" del meridiem (12h). */\n hourLabelOf(item: ColumnItem): string {\n return item.label;\n }\n\n // ── Acciones ───────────────────────────────────────────────────────\n toggle(): void {\n if (this.isDisabled()) return;\n this.open() ? this.cancel() : this.openPopover();\n }\n\n openPopover(): void {\n if (this.isDisabled()) return;\n // Hidratar staged desde value() — si no hay, default a 09:00 para tener anclaje.\n this.staged.set(this.value() ?? { hours: 9, minutes: 0 });\n this.activePresetIndex.set(null);\n /* open() es la single source of truth del visual state. El overlay\n (sui-dropdown-menu) se abre en paralelo; su (openedChange) re-sincroniza\n open() en todos los closes (backdrop, Escape, detach). Set optimista acá\n para que inline-less popover y tests reflejen el estado de inmediato. */\n this.open.set(true);\n this._menu()?.open();\n }\n\n cancel(): void {\n this.activePresetIndex.set(null);\n this.staged.set(this.value());\n /* Cerrar el overlay si está montado — onMenuOpenedChange(false) pone\n open() en false. En modo sin overlay (tests / inline) lo bajamos acá. */\n this._menu()?.close();\n this.open.set(false);\n }\n\n apply(): void {\n const s = this.staged();\n this.value.set(s);\n this._onChange(s);\n this._onTouched();\n this._menu()?.close();\n this.open.set(false);\n }\n\n /**\n * Sincroniza el visual state con el sui-dropdown-menu. Cubre los closes que\n * NO pasan por cancel()/apply(): backdrop click, Escape key y detachments\n * (disposeOnNavigation). Tratar el close del overlay como un cancel — descarta\n * staged y restaura value (mismo contrato que el outside-click previo).\n */\n protected onMenuOpenedChange(opened: boolean): void {\n if (opened) {\n this.open.set(true);\n return;\n }\n if (this.open()) {\n // Close iniciado por el overlay (backdrop / Escape / detach) → cancel.\n this.activePresetIndex.set(null);\n this.staged.set(this.value());\n this._onTouched();\n }\n this.open.set(false);\n }\n\n selectHour(item: ColumnItem): void {\n const cur = this.staged() ?? { hours: 0, minutes: 0 };\n let hours: number;\n if (this.format() === '24h') {\n hours = item.raw;\n } else {\n const period = this.staged12h()?.period ?? 'AM';\n hours = to24h(item.raw, period);\n }\n this._setStaged({ hours, minutes: cur.minutes });\n }\n\n selectMinute(item: ColumnItem): void {\n const cur = this.staged() ?? { hours: 0, minutes: 0 };\n this._setStaged({ hours: cur.hours, minutes: item.raw });\n }\n\n selectPeriod(p: SuiTimePeriod): void {\n const cur = this.staged() ?? { hours: 0, minutes: 0 };\n const { hour12 } = to12h(cur.hours);\n this._setStaged({ hours: to24h(hour12, p), minutes: cur.minutes });\n }\n\n /**\n * Aplica un preset de duración. Lo interpreta como \"hora del día = duración\n * desde medianoche\" (ej. 30 min → 00:30, 1 h → 01:00). Es la lectura más\n * directa de un selector de duración sin una base externa. El consumer que\n * necesite duración relativa puede leer value.minutes/hours como total.\n */\n selectPreset(p: SuiTimeDurationPreset, index: number): void {\n const total = p.minutes;\n this._setStaged({ hours: Math.floor(total / 60) % 24, minutes: total % 60 });\n this.activePresetIndex.set(index);\n }\n\n isPresetActive(index: number): boolean {\n return this.activePresetIndex() === index;\n }\n\n /** Setea staged y, si no hay footer, aplica directo (UX rápido). */\n private _setStaged(v: SuiTimeValue): void {\n this.staged.set(v);\n if (!this.showFooter()) {\n this.value.set(v);\n this._onChange(v);\n this._onTouched();\n }\n }\n\n /* Outside-click / Escape ahora los maneja el sui-dropdown-menu del overlay\n (backdrop transparent + keydownEvents → close() → onMenuOpenedChange(false)).\n Ya no se necesitan HostListeners document:* — el popover flota fuera del host. */\n\n // ── ControlValueAccessor ───────────────────────────────────────────\n writeValue(v: SuiTimeValue | string | null): void {\n if (v === null || v === undefined) {\n this.value.set(null);\n this.staged.set(null);\n return;\n }\n const parsed = typeof v === 'string' ? parseTime(v) : v;\n this.value.set(parsed);\n this.staged.set(parsed);\n }\n registerOnChange(fn: (v: SuiTimeValue | null) => void): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this._disabledByForm.set(isDisabled);\n }\n\n // ── Helpers template ───────────────────────────────────────────────\n trackColumn(_i: number, item: ColumnItem): number {\n return item.raw;\n }\n trackPreset(_i: number, p: SuiTimeDurationPreset): string {\n return p.label;\n }\n\n protected readonly isSameTime = isSameTime;\n}\n","<!-- Label (slot superior) — mismo patrón que sui-input/sui-select. -->\n@if (label()) {\n <sui-form-label\n [label]=\"label()!\"\n [sublabel]=\"sublabel()\"\n [required]=\"required()\"\n [tooltip]=\"tooltip()\"\n [size]=\"size()\"\n class=\"sui-time-picker__label-host\"\n (click)=\"toggle()\"\n />\n}\n\n<!-- Trigger (input + icono reloj) — solo si no es inline. -->\n@if (!inline()) {\n <button\n #triggerEl\n type=\"button\"\n class=\"sui-time-picker__trigger\"\n [class.sui-time-picker__trigger--error]=\"error()\"\n [class.sui-time-picker__trigger--open]=\"open()\"\n [class.sui-time-picker__trigger--filled]=\"value() !== null\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"toggle()\"\n >\n <sui-icon class=\"sui-time-picker__trigger-icon\" name=\"time-line\" [size]=\"20\" />\n <span\n class=\"sui-time-picker__trigger-text\"\n [class.sui-time-picker__trigger-text--placeholder]=\"!value()\"\n >\n {{ triggerText() }}\n </span>\n <sui-icon class=\"sui-time-picker__trigger-chevron\" name=\"arrow-down-s-line\" [size]=\"20\" />\n </button>\n}\n\n<!-- Hint / error message — mismo slot que sui-input/sui-select. -->\n@if (!inline() && (error() ? errorMessage() : hint())) {\n <sui-form-hint\n [message]=\"error() ? errorMessage() : hint()\"\n [variant]=\"error() ? 'error' : 'neutral'\"\n [size]=\"size()\"\n class=\"sui-time-picker__hint-host\"\n />\n}\n\n<!--\n Panel (popover) — el contenido vive en un ng-template reutilizado por:\n · inline() → render directo (sin overlay, sin trigger)\n · !inline() → proyectado al sui-dropdown-menu (CDK Overlay con flip\n arriba/abajo, reposición en scroll, backdrop, Escape, disposeOnNavigation).\n Así el panel NO se corta abajo y abre donde hay más espacio (igual que sui-select).\n-->\n<ng-template #panelTpl>\n <div\n class=\"sui-time-picker__panel\"\n [class.sui-time-picker__panel--inline]=\"inline()\"\n role=\"dialog\"\n [attr.aria-label]=\"label() || placeholder()\"\n >\n <!-- Columnas scrollables: hora / minuto / (periodo en 12h). -->\n <div class=\"sui-time-picker__columns\">\n <!-- Columna HORA -->\n <div\n class=\"sui-time-picker__column\"\n role=\"listbox\"\n aria-label=\"Hora\"\n >\n @for (item of hourItems(); track trackColumn($index, item)) {\n <sui-time-picker-item\n class=\"sui-time-picker__option\"\n [time]=\"hourLabelOf(item)\"\n [active]=\"isHourActive(item)\"\n (clicked)=\"selectHour(item)\"\n />\n }\n </div>\n\n <!-- Columna MINUTO -->\n <div\n class=\"sui-time-picker__column\"\n role=\"listbox\"\n aria-label=\"Minuto\"\n >\n @for (item of minuteItems(); track trackColumn($index, item)) {\n <sui-time-picker-item\n class=\"sui-time-picker__option\"\n [time]=\"item.label\"\n [active]=\"isMinuteActive(item)\"\n (clicked)=\"selectMinute(item)\"\n />\n }\n </div>\n\n <!-- Columna PERIODO (solo 12h) -->\n @if (showPeriod()) {\n <div\n class=\"sui-time-picker__column sui-time-picker__column--period\"\n role=\"listbox\"\n aria-label=\"AM/PM\"\n >\n @for (p of periods; track p) {\n <sui-time-picker-item\n class=\"sui-time-picker__option\"\n [time]=\"p\"\n [active]=\"isPeriodActive(p)\"\n (clicked)=\"selectPeriod(p)\"\n />\n }\n </div>\n }\n </div>\n\n <!-- Presets de duración (pills) — Figma TimePickerSelectDuration. -->\n @if (durationPresets().length) {\n <div class=\"sui-time-picker__presets\" role=\"group\" aria-label=\"Duración rápida\">\n @for (p of durationPresets(); track trackPreset($index, p)) {\n <sui-time-picker-duration\n [label]=\"p.label\"\n [active]=\"isPresetActive($index)\"\n (clicked)=\"selectPreset(p, $index)\"\n />\n }\n </div>\n }\n\n <!-- Footer Cancel/Apply. -->\n @if (showFooter()) {\n <footer class=\"sui-time-picker__footer\">\n <sui-button\n variant=\"stroke\"\n color=\"neutral\"\n size=\"small\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n Cancelar\n </sui-button>\n <sui-button\n variant=\"filled\"\n color=\"primary\"\n size=\"small\"\n type=\"button\"\n (click)=\"apply()\"\n >\n Aplicar\n </sui-button>\n </footer>\n }\n </div>\n</ng-template>\n\n<!-- Inline mode — render directo del panel (sin overlay ni trigger). -->\n@if (inline()) {\n <ng-container [ngTemplateOutlet]=\"panelTpl\" />\n}\n\n<!--\n Popover mode — el panel flota vía sui-dropdown-menu anclado al trigger\n (igual que sui-select). Hereda flip arriba/abajo, reposición en scroll,\n backdrop transparent (outside-click), Escape y disposeOnNavigation.\n El componente abre/cierra el menu desde openPopover()/cancel()/apply();\n (openedChange) re-sincroniza open() en los closes del overlay.\n-->\n@if (!inline()) {\n <sui-dropdown-menu\n [origin]=\"triggerEl() ?? null\"\n [disabled]=\"isDisabled()\"\n [matchWidth]=\"false\"\n [minWidth]=\"240\"\n panelClass=\"sui-time-picker__overlay-pane\"\n (openedChange)=\"onMenuOpenedChange($event)\"\n >\n <ng-template suiDropdownPanel>\n <ng-container [ngTemplateOutlet]=\"panelTpl\" />\n </ng-template>\n </sui-dropdown-menu>\n}\n","import { Injectable, signal, computed } from '@angular/core';\n\nexport type SuiToastVariant = 'info' | 'success' | 'warning' | 'error' | 'feature';\nexport type SuiToastPosition =\n | 'top-left' | 'top-center' | 'top-right'\n | 'bottom-left' | 'bottom-center' | 'bottom-right';\nexport type SuiToastStyle = 'filled' | 'light' | 'lighter' | 'stroke' | 'stroke-dark';\n\nexport interface SuiToastAction {\n /** Texto del botón de acción (ej. \"Actualizar\", \"Reintentar\"). */\n label: string;\n /** Callback al presionar. El toast se cierra automáticamente después\n a menos que `keepOpen=true`. */\n onClick: () => void;\n /** No cerrar el toast tras el click. Default false. */\n keepOpen?: boolean;\n}\n\nexport interface SuiToastData {\n id?: string;\n variant?: SuiToastVariant;\n title: string;\n description?: string;\n duration?: number; // ms, Infinity = permanent\n dismissible?: boolean;\n position?: SuiToastPosition;\n style?: SuiToastStyle; // default 'stroke' — no rompe API actual\n /** Botón de acción opcional al lado del close. */\n action?: SuiToastAction;\n}\n\nexport interface SuiToastItem extends Required<Pick<SuiToastData, 'id' | 'variant' | 'title' | 'dismissible' | 'position' | 'style'>> {\n description?: string;\n duration: number;\n createdAt: number;\n action?: SuiToastAction;\n}\n\n/**\n * SUI Toast Service — SUI Design System 2.0\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 169:2399 (Alert & Notification & Toast overview)\n *\n * Singleton service. Manages a stack of ephemeral toast notifications.\n * Toasts auto-dismiss after `duration` ms (default 4000).\n * Use `duration: Infinity` for persistent toasts.\n *\n * API:\n * show(config) → string (id)\n * success(title, opts?) → string\n * error(title, opts?) → string\n * info(title, opts?) → string\n * warning(title, opts?) → string\n * dismiss(id) → void\n */\n@Injectable({ providedIn: 'root' })\nexport class SuiToastService {\n readonly toasts = signal<SuiToastItem[]>([]);\n\n /** Position default global. Mutable via setDefaultPosition(). */\n private defaultPosition: SuiToastPosition = 'bottom-right';\n\n setDefaultPosition(position: SuiToastPosition): void {\n this.defaultPosition = position;\n }\n\n /** Toasts agrupados por position (usado por el outlet para renderizar stacks).\n * Order canon Sonner: newest first (index 0 = más reciente = frontmost\n * visualmente). Esto hace que `$index` en el template represente el\n * \"stack depth\" correctamente para CSS variable `--toast-index`. */\n readonly toastsByPosition = computed<Record<SuiToastPosition, SuiToastItem[]>>(() => {\n const grouped: Record<SuiToastPosition, SuiToastItem[]> = {\n 'top-left': [], 'top-center': [], 'top-right': [],\n 'bottom-left': [], 'bottom-center': [], 'bottom-right': [],\n };\n /* unshift para que el más reciente quede al inicio de cada grupo */\n for (const t of this.toasts()) grouped[t.position].unshift(t);\n return grouped;\n });\n\n show(config: SuiToastData): string {\n const id = config.id ?? crypto.randomUUID();\n const item: SuiToastItem = {\n id,\n variant: config.variant ?? 'info',\n title: config.title,\n description: config.description,\n duration: config.duration ?? 4000,\n dismissible: config.dismissible ?? true,\n position: config.position ?? this.defaultPosition,\n style: config.style ?? 'stroke-dark',\n action: config.action,\n createdAt: Date.now(),\n };\n this.toasts.update(list => [...list, item]);\n /* Auto-dismiss timer NO se maneja acá — lo maneja el outlet via effect\n que observa nuevos toasts. Razón: el outlet maneja Angular Animations\n :leave para exit animation suave. Si el timer viviera acá y llamara\n directo `this.dismiss(id)`, se saltaba el flow del outlet y el toast\n desaparecía sin animación. */\n return id;\n }\n\n success(title: string, opts?: Partial<SuiToastData>): string {\n return this.show({ ...opts, title, variant: 'success' });\n }\n\n error(title: string, opts?: Partial<SuiToastData>): string {\n return this.show({ ...opts, title, variant: 'error' });\n }\n\n info(title: string, opts?: Partial<SuiToastData>): string {\n return this.show({ ...opts, title, variant: 'info' });\n }\n\n warning(title: string, opts?: Partial<SuiToastData>): string {\n return this.show({ ...opts, title, variant: 'warning' });\n }\n\n feature(title: string, opts?: Partial<SuiToastData>): string {\n return this.show({ ...opts, title, variant: 'feature' });\n }\n\n dismiss(id: string): void {\n this.toasts.update(list => list.filter(t => t.id !== id));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n computed,\n effect,\n inject,\n signal,\n viewChildren,\n} from '@angular/core';\nimport { SuiToastService, SuiToastItem, SuiToastPosition } from './sui-toast.service';\nimport { SuiAlert } from '../sui-alert/sui-alert';\nimport { SuiLinkButton } from '../sui-link-button/sui-link-button';\nimport { SuiCompactButton } from '../sui-compact-button/sui-compact-button';\nimport { SUI_TAB_BAR } from '../core/tokens';\n\n/**\n * SUI Toast Outlet — SUI Design System 2.0 + Sonner-style stacking\n *\n * Figma file: 8p1k72aKKvzJV4XcvPS4VO\n * Node: 169:2399 (Alert & Notification & Toast — Toast section)\n *\n * Renderiza la stack de toasts en position:fixed, delegando el visual a\n * <sui-alert size=\"large\">. El outlet maneja:\n *\n * - Stack positioning (6 esquinas, mobile full-width)\n * - Liquid-glass-tab-bar offset override (iOS 26+)\n * - **ResizeObserver per-slot**: mide la altura real de cada toast para\n * que el expand-on-hover tenga gap preciso\n * - **Expand state persistence**: tras dismiss, el stack queda expanded\n * 1.2s para que el user pueda seguir interactuando\n * - **Smooth exit con Angular Animations `:leave`**: cuando el toast se\n * remueve del array, Angular retiene el element en DOM durante la\n * animation de salida (470ms). Los OTROS toasts ya ven el nuevo\n * array y se reacomodan vía CSS transition simultáneamente — todo\n * en paralelo y smooth. Sin esto el remove era instantáneo + visual\n * \"tosca\"\n *\n * Mount once en root template:\n * <sui-toast-outlet />\n */\n@Component({\n selector: 'sui-toast-outlet',\n templateUrl: './sui-toast-outlet.html',\n styleUrl: './sui-toast-outlet.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SuiAlert, SuiLinkButton, SuiCompactButton],\n /* Approach Sonner-style (CSS-only) — Angular Animations no funcionaba\n reliable en iOS WKWebView Capacitor (WAAPI + lazy load engine + signals\n + OnPush no jugaban bien). Reemplazo: signal `leavingIds` aplica una\n clase CSS al slot, transition CSS hace la animation, setTimeout\n remove real del array tras que termine. Mismo enfoque que Sonner usa. */\n host: {\n '[style.--sui-toast-bottom-offset.px]': 'liquidTabOffset()',\n '[class.sui-toast-outlet--native-tab]': 'tabBarActive()',\n },\n})\nexport class SuiToastOutlet implements OnDestroy {\n private readonly svc = inject(SuiToastService);\n /* Opcional: la app la provee con su LiquidGlassService (tab bar nativo). Sin\n ella → 0 (la lib no depende de Capacitor). */\n private readonly tabBar = inject(SUI_TAB_BAR, { optional: true });\n readonly toastsByPosition = this.svc.toastsByPosition;\n\n readonly liquidTabOffset = computed(() => {\n const h = this.tabBar?.tabBarHeight() ?? 0;\n return h > 0 ? h + 8 : 0;\n });\n\n readonly tabBarActive = computed(() => (this.tabBar?.tabBarHeight() ?? 0) > 0);\n\n readonly positions: SuiToastPosition[] = [\n 'top-left', 'top-center', 'top-right',\n 'bottom-left', 'bottom-center', 'bottom-right',\n ];\n\n /* ─── Altura real per slot (ResizeObserver) ───────────────────────────── */\n\n private readonly slotHeights = signal<Map<string, number>>(new Map());\n private readonly slotRefs = viewChildren<ElementRef<HTMLElement>>('slot');\n\n private readonly resizeObserver = typeof ResizeObserver !== 'undefined'\n ? new ResizeObserver(entries => {\n const updates = new Map(this.slotHeights());\n let changed = false;\n for (const entry of entries) {\n const el = entry.target as HTMLElement;\n const id = el.dataset['toastId'];\n if (!id) continue;\n const h = entry.contentRect.height;\n if (updates.get(id) !== h) {\n updates.set(id, h);\n changed = true;\n }\n }\n if (changed) this.slotHeights.set(updates);\n })\n : undefined;\n\n private readonly observedSlots = new Map<string, HTMLElement>();\n\n private readonly syncObserver = effect(() => {\n const slots = this.slotRefs();\n if (!this.resizeObserver) return;\n\n const currentIds = new Set<string>();\n for (const ref of slots) {\n const el = ref.nativeElement;\n const id = el.dataset['toastId'];\n if (!id) continue;\n currentIds.add(id);\n if (!this.observedSlots.has(id)) {\n this.observedSlots.set(id, el);\n this.resizeObserver.observe(el);\n }\n }\n for (const [id, el] of this.observedSlots.entries()) {\n if (!currentIds.has(id)) {\n this.resizeObserver.unobserve(el);\n this.observedSlots.delete(id);\n this.slotHeights.update(m => {\n const nm = new Map(m);\n nm.delete(id);\n return nm;\n });\n }\n }\n });\n\n /* ─── Auto-dismiss timers per toast (manejados desde acá, no del service) ─\n *\n * Cada toast tiene su propio timer. El effect abajo observa cambios en\n * `toasts()` y schedule un setTimeout que invoca `this.dismiss(toast)` —\n * el método del OUTLET, no del service. Eso garantiza que cuando el\n * timer expira, el dismiss pasa por el flow con Angular Animations\n * `:leave` y exit animation suave. Antes el setTimeout vivía en el\n * service y llamaba `svc.dismiss(id)` directo, saltándose el outlet\n * → el toast desaparecía SIN animación al expirar el tiempo. */\n private readonly dismissTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n private readonly scheduleAutoDismiss = effect(() => {\n const currentIds = new Set<string>();\n for (const toast of this.svc.toasts()) {\n currentIds.add(toast.id);\n if (this.dismissTimers.has(toast.id)) continue;\n if (toast.duration === Infinity) continue;\n const remaining = Math.max(0, toast.duration - (Date.now() - toast.createdAt));\n const timer = setTimeout(() => {\n this.dismissTimers.delete(toast.id);\n this.dismiss(toast);\n }, remaining);\n this.dismissTimers.set(toast.id, timer);\n }\n /* Cleanup timers de toasts que ya no están (cerrados manualmente). */\n for (const [id, t] of this.dismissTimers.entries()) {\n if (!currentIds.has(id)) {\n clearTimeout(t);\n this.dismissTimers.delete(id);\n }\n }\n });\n\n /* ─── Expand state per position (con persistence tras dismiss) ────────── */\n\n private readonly expandedPositions = signal<Set<SuiToastPosition>>(new Set());\n private readonly collapseTimers = new Map<SuiToastPosition, ReturnType<typeof setTimeout>>();\n\n isExpanded(position: SuiToastPosition): boolean {\n return this.expandedPositions().has(position);\n }\n\n readonly toastGap = 10;\n\n /** Cache del offset/index cuando un toast entra en leaving — así no\n * recalculan durante la salida y mantienen su posición visual última. */\n private readonly storedLeavingOffset = new Map<string, number>();\n private readonly storedLeavingIndex = new Map<string, number>();\n\n /** Index \"visual\" del toast: ignora los leaving para que los otros\n * reacomoden EN PARALELO con el fade-out, no en serie. */\n computeVisualIndex(toast: SuiToastItem): number {\n if (this.isLeaving(toast.id)) {\n return this.storedLeavingIndex.get(toast.id) ?? 0;\n }\n const list = this.toastsByPosition()[toast.position];\n const leaving = this.leavingIds();\n const visibles = list.filter(t => !leaving.has(t.id));\n return visibles.indexOf(toast);\n }\n\n computeExpandOffset(toast: SuiToastItem): number {\n /* Si el toast está saliendo, devolver su offset stored para que no\n se mueva durante el fade-out. Sino la transition simultánea de\n offset + opacity da feel raro. */\n if (this.isLeaving(toast.id)) {\n return this.storedLeavingOffset.get(toast.id) ?? 0;\n }\n\n /* Para los visibles, calcular offset IGNORANDO los leaving — así\n cuando un toast empieza su exit, los demás recalculan inmediato y\n reacomodan en PARALELO con el fade-out (no en serie). */\n const list = this.toastsByPosition()[toast.position];\n const leaving = this.leavingIds();\n const visibles = list.filter(t => !leaving.has(t.id));\n const idx = visibles.indexOf(toast);\n if (idx <= 0) return 0;\n const heights = this.slotHeights();\n let offset = 0;\n for (let i = 0; i < idx; i++) {\n offset += heights.get(visibles[i].id) ?? 90;\n }\n offset += idx * this.toastGap;\n return offset;\n }\n\n onStackEnter(position: SuiToastPosition): void {\n const existing = this.collapseTimers.get(position);\n if (existing) clearTimeout(existing);\n this.collapseTimers.delete(position);\n if (!this.expandedPositions().has(position)) {\n this.expandedPositions.update(s => {\n const ns = new Set(s);\n ns.add(position);\n return ns;\n });\n }\n }\n\n onStackLeave(position: SuiToastPosition): void {\n const existing = this.collapseTimers.get(position);\n if (existing) clearTimeout(existing);\n const timer = setTimeout(() => {\n this.expandedPositions.update(s => {\n const ns = new Set(s);\n ns.delete(position);\n return ns;\n });\n this.collapseTimers.delete(position);\n }, 400);\n this.collapseTimers.set(position, timer);\n }\n\n /* ─── Leaving state (Sonner-style fade-out via CSS class) ──────────── */\n\n /** Ids de toasts en proceso de fade-out. CSS aplica la transition; tras\n * EXIT_DURATION_MS el remove real del array sucede. */\n readonly leavingIds = signal<Set<string>>(new Set());\n\n /** Match con `TIME_BEFORE_UNMOUNT` de Sonner (src/index.tsx:200).\n * La transition CSS tiene opacity 200ms + transform 500ms. A los 200ms\n * el opacity ya llegó a 0 (toast invisible) → remove del DOM en este\n * momento. La transform restante (300ms) corre en frames donde el\n * element ya no existe en DOM pero el animator visual del browser\n * retiene el rendering hasta que termina. Resultado: snappy + smooth. */\n private readonly EXIT_DURATION_MS = 200;\n\n isLeaving(id: string): boolean {\n return this.leavingIds().has(id);\n }\n\n /** Ids de toasts que se cerraron MANUALMENTE (click X). Distinto del\n * leaving general porque queremos que el manual SIEMPRE haga slide-out\n * completo (100%), no importa si es front o back en el stack —\n * consistencia para el user que clickea. El auto-dismiss diferencia\n * front (100%) vs back (40%). */\n private readonly manuallyDismissedIds = signal<Set<string>>(new Set());\n\n isManuallyDismissed(id: string): boolean {\n return this.manuallyDismissedIds().has(id);\n }\n\n /** Variante de dismiss disparada por click X manual. Marca el toast\n * como \"manually dismissed\" para CSS y luego llama al dismiss normal. */\n dismissManual(toast: SuiToastItem): void {\n this.manuallyDismissedIds.update(s => {\n const ns = new Set(s);\n ns.add(toast.id);\n return ns;\n });\n this.dismiss(toast);\n }\n\n /** Dismiss un toast.\n *\n * Flow CSS-only (Sonner-style):\n * 1) Cancelar el auto-dismiss timer si existe (en caso de close manual)\n * 2) Agregar id a `leavingIds` → CSS aplica `.sui-toast-slot--leaving`\n * con `opacity:0, transform: translateY+scale` → la transition CSS\n * del slot (500ms) anima a esos valores\n * 3) Pin expanded 1.2s si quedan más toasts (para seguir interactuando)\n * 4) Tras EXIT_DURATION_MS, remove real del array (svc.dismiss) — los\n * otros toasts reacomodan smooth via su propia CSS transition\n *\n * Crítico: el timer del fade-out (500ms) DEBE matchear o ser mayor que\n * la duración de la transition CSS. Sino el remove sucede mientras la\n * transition aún corre y el element desaparece sin animation. */\n dismiss(toast: SuiToastItem): void {\n const position = toast.position;\n const id = toast.id;\n\n /* Cancelar auto-dismiss timer (si dismiss vino por close manual). */\n const autoTimer = this.dismissTimers.get(id);\n if (autoTimer) {\n clearTimeout(autoTimer);\n this.dismissTimers.delete(id);\n }\n\n /* Si ya está leaving, no re-disparar. */\n if (this.leavingIds().has(id)) return;\n\n /* Cachear offset e index actuales ANTES de marcar leaving — sino al\n recalcular los perdería (porque ya no estaría en la lista visibles).\n El leaving slot usa estos values stored para mantener su posición\n durante el fade-out mientras los otros reacomodan. */\n this.storedLeavingOffset.set(id, this.computeExpandOffset(toast));\n this.storedLeavingIndex.set(id, this.computeVisualIndex(toast));\n\n /* Marcar leaving → CSS arranca fade-out */\n this.leavingIds.update(s => {\n const ns = new Set(s);\n ns.add(id);\n return ns;\n });\n\n /* Pin expanded si quedan más toasts en esa position */\n const remaining = this.toastsByPosition()[position].length - 1;\n if (remaining > 0) {\n const existing = this.collapseTimers.get(position);\n if (existing) clearTimeout(existing);\n this.expandedPositions.update(s => {\n const ns = new Set(s);\n ns.add(position);\n return ns;\n });\n const timer = setTimeout(() => {\n this.expandedPositions.update(s => {\n const ns = new Set(s);\n ns.delete(position);\n return ns;\n });\n this.collapseTimers.delete(position);\n }, 1200);\n this.collapseTimers.set(position, timer);\n }\n\n /* Después del fade-out, remove real del array */\n setTimeout(() => {\n this.leavingIds.update(s => {\n const ns = new Set(s);\n ns.delete(id);\n return ns;\n });\n this.storedLeavingOffset.delete(id);\n this.storedLeavingIndex.delete(id);\n this.manuallyDismissedIds.update(s => {\n const ns = new Set(s);\n ns.delete(id);\n return ns;\n });\n this.svc.dismiss(id);\n }, this.EXIT_DURATION_MS);\n }\n\n onAction(toast: SuiToastItem): void {\n toast.action?.onClick();\n if (!toast.action?.keepOpen) this.dismiss(toast);\n }\n\n trackById(_i: number, item: SuiToastItem): string {\n return item.id;\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n for (const t of this.collapseTimers.values()) clearTimeout(t);\n for (const t of this.dismissTimers.values()) clearTimeout(t);\n this.collapseTimers.clear();\n this.dismissTimers.clear();\n this.observedSlots.clear();\n }\n}\n","@for (pos of positions; track pos) {\n @if (toastsByPosition()[pos].length > 0) {\n <div\n class=\"sui-toast-stack\"\n [attr.data-sui-position]=\"pos\"\n [attr.data-expanded]=\"isExpanded(pos) ? 'true' : 'false'\"\n [style.--sui-toast-count]=\"toastsByPosition()[pos].length\"\n (mouseenter)=\"onStackEnter(pos)\"\n (mouseleave)=\"onStackLeave(pos)\"\n (touchstart)=\"onStackEnter(pos)\"\n aria-live=\"polite\"\n aria-label=\"Notificaciones\"\n >\n @for (toast of toastsByPosition()[pos]; track trackById($index, toast)) {\n <div\n #slot\n class=\"sui-toast-slot\"\n [class.sui-toast-slot--leaving]=\"isLeaving(toast.id)\"\n [class.sui-toast-slot--manual-dismiss]=\"isManuallyDismissed(toast.id)\"\n role=\"status\"\n [attr.data-toast-id]=\"toast.id\"\n [attr.data-toast-style]=\"toast.style\"\n [style.--toast-index]=\"computeVisualIndex(toast)\"\n [style.--toast-offset.px]=\"computeExpandOffset(toast)\"\n [attr.data-front]=\"computeVisualIndex(toast) === 0 ? 'true' : 'false'\"\n >\n <sui-alert\n [variant]=\"toast.variant\"\n [variantStyle]=\"toast.style\"\n size=\"large\"\n [title]=\"toast.title\"\n [description]=\"toast.description ?? null\"\n [dismissible]=\"false\"\n >\n @if (toast.action; as act) {\n <sui-link-button\n slot=\"action\"\n variant=\"modifiable\"\n size=\"medium\"\n [underline]=\"true\"\n (clicked)=\"onAction(toast)\"\n >{{ act.label }}</sui-link-button>\n }\n </sui-alert>\n @if (toast.dismissible) {\n <!-- Cierre = COMPONENTE sui-compact-button (variantStyle modifiable →\n el icono hereda el currentColor que el slot wrapper setea según\n [data-toast-style]), NO un <button> maqueta. El outlet SIGUE\n siendo dueño del X (dispara dismissManual con su flow de\n fade-out CSS) — solo cambia el markup del botón, no el\n comportamiento (timers/stacking/animación intactos). -->\n <sui-compact-button\n class=\"sui-toast-slot__close\"\n icon=\"close-line\"\n variantStyle=\"modifiable\"\n size=\"medium\"\n ariaLabel=\"Cerrar\"\n (clicked)=\"dismissManual(toast)\"\n />\n }\n </div>\n }\n </div>\n }\n}\n","/* Public API Surface of sui-design-system — generado del catálogo SUI. */\nexport * from './lib/core/tokens';\nexport * from './lib/sui-accordion/sui-accordion';\nexport * from './lib/sui-activity-feed/sui-activity-feed';\nexport * from './lib/sui-activity-filter/sui-activity-filter';\nexport * from './lib/sui-alert/sui-alert';\nexport * from './lib/sui-app-store-badge/sui-app-store-badge';\nexport * from './lib/sui-avatar-group/sui-avatar-group';\nexport * from './lib/sui-avatar/sui-avatar';\nexport * from './lib/sui-badge/sui-badge';\nexport * from './lib/sui-banner/sui-banner';\nexport * from './lib/sui-brand-logo/sui-brand-logo';\nexport * from './lib/sui-breadcrumb-item/sui-breadcrumb-item';\nexport * from './lib/sui-breadcrumbs/sui-breadcrumbs';\nexport * from './lib/sui-button-group-item/sui-button-group-item';\nexport * from './lib/sui-button-group/sui-button-group';\nexport * from './lib/sui-button/sui-button';\nexport * from './lib/sui-card/sui-card';\nexport * from './lib/sui-checkbox-card/sui-checkbox-card';\nexport * from './lib/sui-checkbox-label/sui-checkbox-label';\nexport * from './lib/sui-checkbox/sui-checkbox';\nexport * from './lib/sui-circular-progress-bar/sui-circular-progress-bar';\nexport * from './lib/sui-color-dot/sui-color-dot';\nexport * from './lib/sui-color-picker/sui-color-picker';\nexport * from './lib/sui-command-menu-footer/sui-command-menu-footer';\nexport * from './lib/sui-command-menu-item/sui-command-menu-item';\nexport * from './lib/sui-command-menu-search/sui-command-menu-search';\nexport * from './lib/sui-compact-avatar-group/sui-compact-avatar-group';\nexport * from './lib/sui-compact-button/sui-compact-button';\nexport * from './lib/sui-compact-select-for-input/sui-compact-select-for-input';\nexport * from './lib/sui-compact-select/sui-compact-select';\nexport * from './lib/sui-content-card/index';\nexport * from './lib/sui-content-card/sui-content-card';\nexport * from './lib/sui-content-divider/sui-content-divider';\nexport * from './lib/sui-counter-input/sui-counter-input';\nexport * from './lib/sui-date-selector/sui-date-selector';\nexport * from './lib/sui-datepicker/datepicker-utils';\nexport * from './lib/sui-datepicker/sui-datepicker';\nexport * from './lib/sui-day-cell/sui-day-cell';\nexport * from './lib/sui-day-label/sui-day-label';\nexport * from './lib/sui-divider/sui-divider';\nexport * from './lib/sui-drawer-footer/sui-drawer-footer';\nexport * from './lib/sui-drawer-header/sui-drawer-header';\nexport * from './lib/sui-dropdown-caption/sui-dropdown-caption';\nexport * from './lib/sui-dropdown-item/sui-dropdown-item';\nexport * from './lib/sui-dropdown-menu/sui-dropdown-menu';\nexport * from './lib/sui-dropdown-menu/sui-dropdown-panel';\nexport * from './lib/sui-dropdown-search/sui-dropdown-search';\nexport * from './lib/sui-emoji/sui-emoji';\nexport * from './lib/sui-empty-state/sui-empty-state';\nexport * from './lib/sui-fancy-button/sui-fancy-button';\nexport * from './lib/sui-file-icon/sui-file-icon';\nexport * from './lib/sui-file-upload-card/sui-file-upload-card';\nexport * from './lib/sui-file-upload/sui-file-upload';\nexport * from './lib/sui-filter/index';\nexport * from './lib/sui-filter/sui-filter-bar';\nexport * from './lib/sui-filter/sui-filter-item';\nexport * from './lib/sui-filter/sui-filter-panel-footer';\nexport * from './lib/sui-filter/sui-filter-panel-header';\nexport * from './lib/sui-flag/sui-flag';\nexport * from './lib/sui-form-hint/sui-form-hint';\nexport * from './lib/sui-form-label/sui-form-label';\nexport * from './lib/sui-icon/sui-icon';\nexport * from './lib/sui-image-upload-profile/sui-image-upload-profile';\nexport * from './lib/sui-image-upload/sui-image-upload';\nexport * from './lib/sui-inline-input/sui-inline-input';\nexport * from './lib/sui-inline-select/sui-inline-select';\nexport * from './lib/sui-input/sui-input';\nexport * from './lib/sui-integration-switch/sui-integration-switch';\nexport * from './lib/sui-kbd/sui-kbd';\nexport * from './lib/sui-key-icon/sui-key-icon';\nexport * from './lib/sui-link-button/sui-link-button';\nexport * from './lib/sui-modal-sheet/sui-modal-sheet';\nexport * from './lib/sui-modal/index';\nexport * from './lib/sui-modal/sui-modal';\nexport * from './lib/sui-notification-footer/sui-notification-footer';\nexport * from './lib/sui-notification-tab-menu/sui-notification-tab-menu';\nexport * from './lib/sui-notification/sui-notification';\nexport * from './lib/sui-otp-input/index';\nexport * from './lib/sui-otp-input/sui-otp-input';\nexport * from './lib/sui-page-header/sui-page-header';\nexport * from './lib/sui-pagination/index';\nexport * from './lib/sui-pagination/sui-pagination';\nexport * from './lib/sui-period-range/sui-period-range';\nexport * from './lib/sui-popover/sui-popover';\nexport * from './lib/sui-progress-bar-label/sui-progress-bar-label';\nexport * from './lib/sui-progress-bar/sui-progress-bar';\nexport * from './lib/sui-radio-card/sui-radio-card';\nexport * from './lib/sui-radio/sui-radio-group';\nexport * from './lib/sui-radio/sui-radio';\nexport * from './lib/sui-rating/index';\nexport * from './lib/sui-rating/sui-rating';\nexport * from './lib/sui-rich-editor/sui-rich-editor-item';\nexport * from './lib/sui-rich-editor/sui-rich-editor';\nexport * from './lib/sui-select/sui-select';\nexport * from './lib/sui-sidebar/sui-sidebar';\nexport * from './lib/sui-slider/sui-slider';\nexport * from './lib/sui-social-button/sui-social-button';\nexport * from './lib/sui-status-badge/sui-status-badge';\nexport * from './lib/sui-stepper/index';\nexport * from './lib/sui-stepper/sui-stepper';\nexport * from './lib/sui-store-card/sui-store-card';\nexport * from './lib/sui-switch-card/sui-switch-card';\nexport * from './lib/sui-switch-label/sui-switch-label';\nexport * from './lib/sui-switch/sui-switch';\nexport * from './lib/sui-tab-chips/sui-tab-chips';\nexport * from './lib/sui-table/index';\nexport * from './lib/sui-table/sui-table-cell.directive';\nexport * from './lib/sui-table/sui-table';\nexport * from './lib/sui-tabs/sui-tabs';\nexport * from './lib/sui-tag-input/sui-tag-input';\nexport * from './lib/sui-tag/sui-tag';\nexport * from './lib/sui-textarea/sui-textarea';\nexport * from './lib/sui-time-picker/sui-time-picker-duration';\nexport * from './lib/sui-time-picker/sui-time-picker-item';\nexport * from './lib/sui-time-picker/sui-time-picker-status';\nexport * from './lib/sui-time-picker/sui-time-picker';\nexport * from './lib/sui-time-picker/time-picker-utils';\nexport * from './lib/sui-toast/sui-toast-outlet';\nexport * from './lib/sui-toast/sui-toast.service';\nexport * from './lib/sui-tooltip/sui-tooltip-panel';\nexport * from './lib/sui-tooltip/sui-tooltip';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SIZE_PX","SuiBreadcrumbItemComponent","DOCUMENT"],"mappings":"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"}
|