@kaufmann-lab/ui 0.1.24 → 0.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -12
- package/fesm2022/kaufmann-lab-ui-business.mjs +2 -2
- package/fesm2022/kaufmann-lab-ui-business.mjs.map +1 -1
- package/fesm2022/kaufmann-lab-ui-core.mjs +289 -18
- package/fesm2022/kaufmann-lab-ui-core.mjs.map +1 -1
- package/package.json +6 -1
- package/src/tokens/base.css +15 -0
- package/types/kaufmann-lab-ui-core.d.ts +178 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kaufmann-lab-ui-core.mjs","sources":["../../../projects/ui/core/src/lib/icon/icons/activity.ts","../../../projects/ui/core/src/lib/icon/icons/alert-circle.ts","../../../projects/ui/core/src/lib/icon/icons/alert-octagon.ts","../../../projects/ui/core/src/lib/icon/icons/alert-triangle.ts","../../../projects/ui/core/src/lib/icon/icons/award.ts","../../../projects/ui/core/src/lib/icon/icons/bar-chart.ts","../../../projects/ui/core/src/lib/icon/icons/bell.ts","../../../projects/ui/core/src/lib/icon/icons/bus.ts","../../../projects/ui/core/src/lib/icon/icons/calculator.ts","../../../projects/ui/core/src/lib/icon/icons/calendar.ts","../../../projects/ui/core/src/lib/icon/icons/car.ts","../../../projects/ui/core/src/lib/icon/icons/cart.ts","../../../projects/ui/core/src/lib/icon/icons/check.ts","../../../projects/ui/core/src/lib/icon/icons/check-circle.ts","../../../projects/ui/core/src/lib/icon/icons/check-square.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-down.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-left.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-left-bar.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-right.ts","../../../projects/ui/core/src/lib/icon/icons/clipboard.ts","../../../projects/ui/core/src/lib/icon/icons/clock.ts","../../../projects/ui/core/src/lib/icon/icons/credit-card.ts","../../../projects/ui/core/src/lib/icon/icons/crosshair.ts","../../../projects/ui/core/src/lib/icon/icons/download.ts","../../../projects/ui/core/src/lib/icon/icons/edit.ts","../../../projects/ui/core/src/lib/icon/icons/external-link.ts","../../../projects/ui/core/src/lib/icon/icons/eye.ts","../../../projects/ui/core/src/lib/icon/icons/eye-off.ts","../../../projects/ui/core/src/lib/icon/icons/file.ts","../../../projects/ui/core/src/lib/icon/icons/filter.ts","../../../projects/ui/core/src/lib/icon/icons/gauge.ts","../../../projects/ui/core/src/lib/icon/icons/gift.ts","../../../projects/ui/core/src/lib/icon/icons/grid.ts","../../../projects/ui/core/src/lib/icon/icons/history.ts","../../../projects/ui/core/src/lib/icon/icons/home.ts","../../../projects/ui/core/src/lib/icon/icons/inbox.ts","../../../projects/ui/core/src/lib/icon/icons/info.ts","../../../projects/ui/core/src/lib/icon/icons/layers.ts","../../../projects/ui/core/src/lib/icon/icons/layout-grid.ts","../../../projects/ui/core/src/lib/icon/icons/list.ts","../../../projects/ui/core/src/lib/icon/icons/log-out.ts","../../../projects/ui/core/src/lib/icon/icons/mail.ts","../../../projects/ui/core/src/lib/icon/icons/map.ts","../../../projects/ui/core/src/lib/icon/icons/map-pin.ts","../../../projects/ui/core/src/lib/icon/icons/maximize.ts","../../../projects/ui/core/src/lib/icon/icons/menu.ts","../../../projects/ui/core/src/lib/icon/icons/message-circle.ts","../../../projects/ui/core/src/lib/icon/icons/mic.ts","../../../projects/ui/core/src/lib/icon/icons/mic-off.ts","../../../projects/ui/core/src/lib/icon/icons/minimize.ts","../../../projects/ui/core/src/lib/icon/icons/minus.ts","../../../projects/ui/core/src/lib/icon/icons/monitor.ts","../../../projects/ui/core/src/lib/icon/icons/more-vertical.ts","../../../projects/ui/core/src/lib/icon/icons/navigation.ts","../../../projects/ui/core/src/lib/icon/icons/pause.ts","../../../projects/ui/core/src/lib/icon/icons/phone.ts","../../../projects/ui/core/src/lib/icon/icons/pin.ts","../../../projects/ui/core/src/lib/icon/icons/play.ts","../../../projects/ui/core/src/lib/icon/icons/plus.ts","../../../projects/ui/core/src/lib/icon/icons/refresh.ts","../../../projects/ui/core/src/lib/icon/icons/search.ts","../../../projects/ui/core/src/lib/icon/icons/settings.ts","../../../projects/ui/core/src/lib/icon/icons/shield-check.ts","../../../projects/ui/core/src/lib/icon/icons/sort.ts","../../../projects/ui/core/src/lib/icon/icons/star.ts","../../../projects/ui/core/src/lib/icon/icons/ticket.ts","../../../projects/ui/core/src/lib/icon/icons/tool.ts","../../../projects/ui/core/src/lib/icon/icons/trash.ts","../../../projects/ui/core/src/lib/icon/icons/truck.ts","../../../projects/ui/core/src/lib/icon/icons/upload-cloud.ts","../../../projects/ui/core/src/lib/icon/icons/user.ts","../../../projects/ui/core/src/lib/icon/icons/user-search.ts","../../../projects/ui/core/src/lib/icon/icons/video.ts","../../../projects/ui/core/src/lib/icon/icons/x.ts","../../../projects/ui/core/src/lib/icon/icons/zap.ts","../../../projects/ui/core/src/lib/icon/icons/index.ts","../../../projects/ui/core/src/lib/icon/icon-sprite.ts","../../../projects/ui/core/src/lib/icon/Icon.ts","../../../projects/ui/core/src/lib/icon/Icon.html","../../../projects/ui/core/src/lib/action-tile/ActionTile.ts","../../../projects/ui/core/src/lib/action-tile/ActionTile.html","../../../projects/ui/core/src/lib/text/Text.ts","../../../projects/ui/core/src/lib/text/Text.html","../../../projects/ui/core/src/lib/admin-badge/AdminBadge.ts","../../../projects/ui/core/src/lib/admin-badge/AdminBadge.html","../../../projects/ui/core/src/lib/spinner/Spinner.ts","../../../projects/ui/core/src/lib/spinner/Spinner.html","../../../projects/ui/core/src/lib/button/button.ts","../../../projects/ui/core/src/lib/button/button.html","../../../projects/ui/core/src/lib/alert/Alert.ts","../../../projects/ui/core/src/lib/alert/Alert.html","../../../projects/ui/core/src/lib/alert-row/AlertRow.ts","../../../projects/ui/core/src/lib/alert-row/AlertRow.html","../../../projects/ui/core/src/lib/avatar/Avatar.ts","../../../projects/ui/core/src/lib/avatar/Avatar.html","../../../projects/ui/core/src/lib/badge/Badge.ts","../../../projects/ui/core/src/lib/badge/Badge.html","../../../projects/ui/core/src/lib/breadcrumb/Breadcrumb.ts","../../../projects/ui/core/src/lib/breadcrumb/Breadcrumb.html","../../../projects/ui/core/src/lib/bucket-progress/BucketProgress.ts","../../../projects/ui/core/src/lib/bucket-progress/BucketProgress.html","../../../projects/ui/core/src/lib/calendar/Calendar.ts","../../../projects/ui/core/src/lib/calendar/Calendar.html","../../../projects/ui/core/src/lib/card/Card.ts","../../../projects/ui/core/src/lib/card/Card.html","../../../projects/ui/core/src/lib/carousel/CarouselSlide.ts","../../../projects/ui/core/src/lib/carousel/Carousel.ts","../../../projects/ui/core/src/lib/carousel/Carousel.html","../../../projects/ui/core/src/lib/checkbox/Checkbox.ts","../../../projects/ui/core/src/lib/checkbox/Checkbox.html","../../../projects/ui/core/src/lib/chip/Chip.ts","../../../projects/ui/core/src/lib/chip/Chip.html","../../../projects/ui/core/src/lib/collapsible/Collapsible.ts","../../../projects/ui/core/src/lib/collapsible/Collapsible.html","../../../projects/ui/core/src/lib/shared/escape-capture.ts","../../../projects/ui/core/src/lib/dropdown/DropdownPanel.ts","../../../projects/ui/core/src/lib/dropdown/DropdownPanel.html","../../../projects/ui/core/src/lib/dropdown/Dropdown.ts","../../../projects/ui/core/src/lib/contact-popover/ContactPopover.ts","../../../projects/ui/core/src/lib/contact-popover/ContactPopover.html","../../../projects/ui/core/src/lib/content-slot/ContentSlot.ts","../../../projects/ui/core/src/lib/content-slot/ContentSlot.html","../../../projects/ui/core/src/lib/empty-state/EmptyState.ts","../../../projects/ui/core/src/lib/empty-state/EmptyState.html","../../../projects/ui/core/src/lib/skeleton/Skeleton.ts","../../../projects/ui/core/src/lib/skeleton/Skeleton.html","../../../projects/ui/core/src/lib/field-label/FieldLabel.ts","../../../projects/ui/core/src/lib/field-label/FieldLabel.html","../../../projects/ui/core/src/lib/shared/select-overlay.ts","../../../projects/ui/core/src/lib/select/Select.ts","../../../projects/ui/core/src/lib/select/Select.html","../../../projects/ui/core/src/lib/pagination/Pagination.ts","../../../projects/ui/core/src/lib/pagination/Pagination.html","../../../projects/ui/core/src/lib/view-toggle/ViewToggle.ts","../../../projects/ui/core/src/lib/view-toggle/ViewToggle.html","../../../projects/ui/core/src/lib/data-table/DataTable.ts","../../../projects/ui/core/src/lib/data-table/DataTable.html","../../../projects/ui/core/src/lib/link/Link.ts","../../../projects/ui/core/src/lib/link/Link.html","../../../projects/ui/core/src/lib/document-row/DocumentRow.ts","../../../projects/ui/core/src/lib/document-row/DocumentRow.html","../../../projects/ui/core/src/lib/progress/Progress.ts","../../../projects/ui/core/src/lib/progress/Progress.html","../../../projects/ui/core/src/lib/stat-card/StatCard.ts","../../../projects/ui/core/src/lib/stat-card/StatCard.html","../../../projects/ui/core/src/lib/skeleton/SkeletonPreset.ts","../../../projects/ui/core/src/lib/skeleton/SkeletonPreset.html","../../../projects/ui/core/src/lib/content-state/ContentState.ts","../../../projects/ui/core/src/lib/content-state/ContentState.html","../../../projects/ui/core/src/lib/content-viewer/ContentViewer.ts","../../../projects/ui/core/src/lib/content-viewer/ContentViewer.html","../../../projects/ui/core/src/lib/cursor-pager/CursorPager.ts","../../../projects/ui/core/src/lib/cursor-pager/CursorPager.html","../../../projects/ui/core/src/lib/data-table/responsive-view.ts","../../../projects/ui/core/src/lib/divider/Divider.ts","../../../projects/ui/core/src/lib/modal/modal-overlay-container.ts","../../../projects/ui/core/src/lib/drawer/Drawer.ts","../../../projects/ui/core/src/lib/drawer/Drawer.html","../../../projects/ui/core/src/lib/dropdown/DropdownItem.ts","../../../projects/ui/core/src/lib/dropdown/DropdownItem.html","../../../projects/ui/core/src/lib/event-timeline/EventTimeline.ts","../../../projects/ui/core/src/lib/event-timeline/EventTimeline.html","../../../projects/ui/core/src/lib/feature-card/FeatureCard.ts","../../../projects/ui/core/src/lib/feature-card/FeatureCard.html","../../../projects/ui/core/src/lib/field/Field.ts","../../../projects/ui/core/src/lib/field/Field.html","../../../projects/ui/core/src/lib/file-input/FileInput.ts","../../../projects/ui/core/src/lib/file-input/FileInput.html","../../../projects/ui/core/src/lib/input/Input.ts","../../../projects/ui/core/src/lib/input/Input.html","../../../projects/ui/core/src/lib/multi-select/MultiSelect.ts","../../../projects/ui/core/src/lib/multi-select/MultiSelect.html","../../../projects/ui/core/src/lib/filter/Filter.ts","../../../projects/ui/core/src/lib/filter/Filter.html","../../../projects/ui/core/src/lib/filter-chips/FilterChips.ts","../../../projects/ui/core/src/lib/filter-chips/FilterChips.html","../../../projects/ui/core/src/lib/footer/Footer.ts","../../../projects/ui/core/src/lib/footer/Footer.html","../../../projects/ui/core/src/lib/journey-stepper/JourneyStepper.ts","../../../projects/ui/core/src/lib/journey-stepper/JourneyStepper.html","../../../projects/ui/core/src/lib/list-toolbar/list-toolbar-mode.ts","../../../projects/ui/core/src/lib/list-toolbar/ListToolbar.ts","../../../projects/ui/core/src/lib/list-toolbar/ListToolbar.html","../../../projects/ui/core/src/lib/metric-card/MetricCard.ts","../../../projects/ui/core/src/lib/metric-card/MetricCard.html","../../../projects/ui/core/src/lib/status-indicators/ProgressStatus.ts","../../../projects/ui/core/src/lib/status-indicators/StatusMark.ts","../../../projects/ui/core/src/lib/status-indicators/StatusNode.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.types.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.html","../../../projects/ui/core/src/lib/modal/Modal.ts","../../../projects/ui/core/src/lib/modal/Modal.html","../../../projects/ui/core/src/lib/note-block/NoteBlock.ts","../../../projects/ui/core/src/lib/note-block/NoteBlock.html","../../../projects/ui/core/src/lib/option-list/OptionList.ts","../../../projects/ui/core/src/lib/option-list/OptionList.html","../../../projects/ui/core/src/lib/page-header/PageHeader.ts","../../../projects/ui/core/src/lib/page-header/PageHeader.html","../../../projects/ui/core/src/lib/panel/Panel.ts","../../../projects/ui/core/src/lib/panel/Panel.html","../../../projects/ui/core/src/lib/popover/Popover.ts","../../../projects/ui/core/src/lib/portal-header/PortalHeader.ts","../../../projects/ui/core/src/lib/portal-header/PortalHeader.html","../../../projects/ui/core/src/lib/pulse-dot/PulseDot.ts","../../../projects/ui/core/src/lib/pulse-dot/PulseDot.html","../../../projects/ui/core/src/lib/tooltip/Tooltip.ts","../../../projects/ui/core/src/lib/row-actions/RowActions.ts","../../../projects/ui/core/src/lib/row-actions/RowActions.html","../../../projects/ui/core/src/lib/section-header/SectionHeader.ts","../../../projects/ui/core/src/lib/section-header/SectionHeader.html","../../../projects/ui/core/src/lib/section-nav/SectionNav.ts","../../../projects/ui/core/src/lib/section-nav/SectionNav.html","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavItem.ts","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavItem.html","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavSubsection.ts","../../../projects/ui/core/src/lib/segmented/Segmented.ts","../../../projects/ui/core/src/lib/segmented/Segmented.html","../../../projects/ui/core/src/lib/selectable-card-group/SelectableCardGroup.ts","../../../projects/ui/core/src/lib/selectable-card-group/SelectableCardGroup.html","../../../projects/ui/core/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.ts","../../../projects/ui/core/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.html","../../../projects/ui/core/src/lib/sidebar-shell/SidebarShell.ts","../../../projects/ui/core/src/lib/sidebar-shell/SidebarShell.html","../../../projects/ui/core/src/lib/stat-tile/StatTile.ts","../../../projects/ui/core/src/lib/stat-tile/StatTile.html","../../../projects/ui/core/src/lib/status-pill/StatusPill.ts","../../../projects/ui/core/src/lib/status-pill/StatusPill.html","../../../projects/ui/core/src/lib/tabs/Tabs.ts","../../../projects/ui/core/src/lib/tabs/Tabs.html","../../../projects/ui/core/src/lib/tabs/folder-tabs/FolderTabs.ts","../../../projects/ui/core/src/lib/tabs/folder-tabs/FolderTabs.html","../../../projects/ui/core/src/lib/textarea/Textarea.ts","../../../projects/ui/core/src/lib/textarea/Textarea.html","../../../projects/ui/core/src/lib/shared/format-input.directive.ts","../../../projects/ui/core/src/lib/tile-grid/TileGrid.ts","../../../projects/ui/core/src/lib/tile-grid/TileGrid.html","../../../projects/ui/core/src/lib/time-slot-picker/TimeSlotPicker.ts","../../../projects/ui/core/src/lib/time-slot-picker/TimeSlotPicker.html","../../../projects/ui/core/src/lib/toast/Toast.ts","../../../projects/ui/core/src/lib/toast/ToastHost.html","../../../projects/ui/core/src/public-api.ts","../../../projects/ui/core/src/kaufmann-lab-ui-core.ts"],"sourcesContent":["import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"activity\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const activity: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-octagon\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertOctagon: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 16h.01\" />\n <path d=\"M12 8v4\" />\n <path d=\"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-triangle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertTriangle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"award\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const award: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\" />\n <circle cx=\"12\" cy=\"8\" r=\"6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bar-chart\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const barChart: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 21v-6\" />\n <path d=\"M12 21V9\" />\n <path d=\"M19 21V3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bell\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const bell: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10.268 21a2 2 0 0 0 3.464 0\" />\n <path d=\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const bus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 6v6\" />\n <path d=\"M15 6v6\" />\n <path d=\"M2 12h19.6\" />\n <path d=\"M18 18h3s.5-1.7.8-2.8c.1-.4.2-.8.2-1.2 0-.4-.1-.8-.2-1.2l-1.4-5C20.1 6.8 19.1 6 18 6H4a2 2 0 0 0-2 2v10h3\" />\n <circle cx=\"7\" cy=\"18\" r=\"2\" />\n <path d=\"M9 18h5\" />\n <circle cx=\"16\" cy=\"18\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"calculator\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const calculator: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" />\n <line x1=\"8\" x2=\"16\" y1=\"6\" y2=\"6\" />\n <line x1=\"16\" x2=\"16\" y1=\"14\" y2=\"18\" />\n <path d=\"M16 10h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M12 14h.01\" />\n <path d=\"M8 14h.01\" />\n <path d=\"M12 18h.01\" />\n <path d=\"M8 18h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"calendar\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const calendar: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 2v3\" />\n <path d=\"M16 2v3\" />\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"car\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const car: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\" />\n <circle cx=\"7\" cy=\"17\" r=\"2\" />\n <path d=\"M9 17h6\" />\n <circle cx=\"17\" cy=\"17\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"cart\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const cart: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"8\" cy=\"21\" r=\"1\" />\n <circle cx=\"19\" cy=\"21\" r=\"1\" />\n <path d=\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const check: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 6 9 17l-5-5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const checkCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M21.801 10A10 10 0 1 1 17 3.335\" />\n <path d=\"m9 11 3 3L22 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check-square\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const checkSquare: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"m9 12 2 2 4-4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-down\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronDown: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m6 9 6 6 6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-left\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronLeft: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m15 18-6-6 6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-left-bar\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronLeftBar: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-right\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronRight: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m9 18 6-6-6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"clipboard\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const clipboard: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"clock\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const clock: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"credit-card\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const creditCard: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\" />\n <line x1=\"2\" x2=\"22\" y1=\"10\" y2=\"10\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"crosshair\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const crosshair: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"22\" x2=\"18\" y1=\"12\" y2=\"12\" />\n <line x1=\"6\" x2=\"2\" y1=\"12\" y2=\"12\" />\n <line x1=\"12\" x2=\"12\" y1=\"6\" y2=\"2\" />\n <line x1=\"12\" x2=\"12\" y1=\"22\" y2=\"18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"download\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const download: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 15V3\" />\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <path d=\"m7 10 5 5 5-5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"edit\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const edit: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"external-link\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const externalLink: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"eye\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const eye: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"eye-off\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const eyeOff: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"file\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const file: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" />\n <path d=\"M14 2v5a1 1 0 0 0 1 1h5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"filter\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const filter: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"gauge\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const gauge: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m12 14 4-4\" />\n <path d=\"M3.34 19a10 10 0 1 1 17.32 0\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"gift\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const gift: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 7v14\" />\n <path d=\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\" />\n <path d=\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\" />\n <rect x=\"3\" y=\"7\" width=\"18\" height=\"4\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"grid\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const grid: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"history\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const history: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"home\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const home: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 10.5 12 3l9 7.5\" />\n <path d=\"M5 9.5V20a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1V9.5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"inbox\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const inbox: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" />\n <path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"info\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const info: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"layers\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const layers: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"layout-grid\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const layoutGrid: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"list\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const list: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 5h.01\" />\n <path d=\"M3 12h.01\" />\n <path d=\"M3 19h.01\" />\n <path d=\"M8 5h13\" />\n <path d=\"M8 12h13\" />\n <path d=\"M8 19h13\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"log-out\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const logOut: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"M16 17l5-5-5-5\" />\n <path d=\"M21 12H9\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mail\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mail: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m3 6 9 6 9-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"map\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const map: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\" />\n <path d=\"M15 5.764v15\" />\n <path d=\"M9 3.236v15\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"map-pin\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mapPin: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"maximize\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const maximize: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"menu\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const menu: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M4 5h16\" />\n <path d=\"M4 12h16\" />\n <path d=\"M4 19h16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"message-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const messageCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mic\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mic: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 19v3\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <rect x=\"9\" y=\"2\" width=\"6\" height=\"13\" rx=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mic-off\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const micOff: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 19v3\" />\n <path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\" />\n <path d=\"M16.95 16.95A7 7 0 0 1 5 12v-2\" />\n <path d=\"M18.89 13.23A7 7 0 0 0 19 12v-2\" />\n <path d=\"m2 2 20 20\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"minimize\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const minimize: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"minus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const minus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 12h14\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"monitor\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const monitor: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\" />\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\" />\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"more-vertical\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const moreVertical: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"navigation\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const navigation: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <polygon points=\"3 11 22 2 13 21 11 13 3 11\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"pause\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const pause: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect x=\"14\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\" />\n <rect x=\"5\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"phone\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const phone: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"pin\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const pin: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"play\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const play: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"plus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const plus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"refresh\" (grilla 24×24; `refresh-cw` de Lucide) — ver `icons/index.ts` para el registro completo. */\nexport const refresh: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"search\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const search: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21 21-4.34-4.34\" />\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"settings\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const settings: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"shield-check\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const shieldCheck: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"sort\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const sort: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"star\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const star: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"ticket\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const ticket: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\" />\n <path d=\"M13 5v2\" />\n <path d=\"M13 17v2\" />\n <path d=\"M13 11v2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"tool\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const tool: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"trash\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const trash: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"truck\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const truck: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\" />\n <path d=\"M15 18H9\" />\n <path d=\"M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\" />\n <circle cx=\"17\" cy=\"18\" r=\"2\" />\n <circle cx=\"7\" cy=\"18\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"upload-cloud\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const uploadCloud: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"user\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const user: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"user-search\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const userSearch: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"10\" cy=\"7\" r=\"4\" />\n <path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\" />\n <circle cx=\"17\" cy=\"17\" r=\"3\" />\n <path d=\"m21 21-1.9-1.9\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"video\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const video: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\" />\n <rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"x\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const x: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"zap\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const zap: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M15.914 4a1.5 1.5 0 0 0-2.474-1.561l-9 9A1.5 1.5 0 0 0 5.5 14h4.002a.5.5 0 0 1 .471.666L8.086 20a1.5 1.5 0 0 0 2.475 1.56l9-9A1.5 1.5 0 0 0 18.5 10h-3.997a.5.5 0 0 1-.472-.667z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\nimport type { IconName } from '../icon-name';\nimport { activity } from './activity';\nimport { alertCircle } from './alert-circle';\nimport { alertOctagon } from './alert-octagon';\nimport { alertTriangle } from './alert-triangle';\nimport { award } from './award';\nimport { barChart } from './bar-chart';\nimport { bell } from './bell';\nimport { bus } from './bus';\nimport { calculator } from './calculator';\nimport { calendar } from './calendar';\nimport { car } from './car';\nimport { cart } from './cart';\nimport { check } from './check';\nimport { checkCircle } from './check-circle';\nimport { checkSquare } from './check-square';\nimport { chevronDown } from './chevron-down';\nimport { chevronLeft } from './chevron-left';\nimport { chevronLeftBar } from './chevron-left-bar';\nimport { chevronRight } from './chevron-right';\nimport { clipboard } from './clipboard';\nimport { clock } from './clock';\nimport { creditCard } from './credit-card';\nimport { crosshair } from './crosshair';\nimport { download } from './download';\nimport { edit } from './edit';\nimport { externalLink } from './external-link';\nimport { eye } from './eye';\nimport { eyeOff } from './eye-off';\nimport { file } from './file';\nimport { filter } from './filter';\nimport { gauge } from './gauge';\nimport { gift } from './gift';\nimport { grid } from './grid';\nimport { history } from './history';\nimport { home } from './home';\nimport { inbox } from './inbox';\nimport { info } from './info';\nimport { layers } from './layers';\nimport { layoutGrid } from './layout-grid';\nimport { list } from './list';\nimport { logOut } from './log-out';\nimport { mail } from './mail';\nimport { map } from './map';\nimport { mapPin } from './map-pin';\nimport { maximize } from './maximize';\nimport { menu } from './menu';\nimport { messageCircle } from './message-circle';\nimport { mic } from './mic';\nimport { micOff } from './mic-off';\nimport { minimize } from './minimize';\nimport { minus } from './minus';\nimport { monitor } from './monitor';\nimport { moreVertical } from './more-vertical';\nimport { navigation } from './navigation';\nimport { pause } from './pause';\nimport { phone } from './phone';\nimport { pin } from './pin';\nimport { play } from './play';\nimport { plus } from './plus';\nimport { refresh } from './refresh';\nimport { search } from './search';\nimport { settings } from './settings';\nimport { shieldCheck } from './shield-check';\nimport { sort } from './sort';\nimport { star } from './star';\nimport { ticket } from './ticket';\nimport { tool } from './tool';\nimport { trash } from './trash';\nimport { truck } from './truck';\nimport { uploadCloud } from './upload-cloud';\nimport { user } from './user';\nimport { userSearch } from './user-search';\nimport { video } from './video';\nimport { x } from './x';\nimport { zap } from './zap';\n\n/**\n * Registro tipado de todos los símbolos de ícono. `Record<IconName,\n * IconDefinition>` obliga al compilador a exigir una entrada por cada\n * nombre de `IconName` — agregar un nombre acá sin su archivo en\n * `icons/`, o viceversa, es un error de TypeScript, no un ícono roto\n * en runtime (que era el riesgo real del sprite como string único).\n *\n * Agregar un ícono nuevo es: crear `icons/nombre-del-icono.ts` (copiar\n * el patrón de cualquier archivo vecino), agregarlo a `IconName` en\n * `icon-name.ts`, e importarlo/registrarlo acá.\n */\nexport const ICON_DEFINITIONS: Record<IconName, IconDefinition> = {\n activity: activity,\n 'alert-circle': alertCircle,\n 'alert-octagon': alertOctagon,\n 'alert-triangle': alertTriangle,\n award: award,\n 'bar-chart': barChart,\n bell: bell,\n bus: bus,\n calculator: calculator,\n calendar: calendar,\n car: car,\n cart: cart,\n check: check,\n 'check-circle': checkCircle,\n 'check-square': checkSquare,\n 'chevron-down': chevronDown,\n 'chevron-left': chevronLeft,\n 'chevron-left-bar': chevronLeftBar,\n 'chevron-right': chevronRight,\n clipboard: clipboard,\n clock: clock,\n 'credit-card': creditCard,\n crosshair: crosshair,\n download: download,\n edit: edit,\n 'external-link': externalLink,\n eye: eye,\n 'eye-off': eyeOff,\n file: file,\n filter: filter,\n gauge: gauge,\n gift: gift,\n grid: grid,\n history: history,\n home: home,\n inbox: inbox,\n info: info,\n layers: layers,\n 'layout-grid': layoutGrid,\n list: list,\n 'log-out': logOut,\n mail: mail,\n map: map,\n 'map-pin': mapPin,\n maximize: maximize,\n menu: menu,\n 'message-circle': messageCircle,\n mic: mic,\n 'mic-off': micOff,\n minimize: minimize,\n minus: minus,\n monitor: monitor,\n 'more-vertical': moreVertical,\n navigation: navigation,\n pause: pause,\n phone: phone,\n pin: pin,\n play: play,\n plus: plus,\n refresh: refresh,\n search: search,\n settings: settings,\n 'shield-check': shieldCheck,\n sort: sort,\n star: star,\n ticket: ticket,\n tool: tool,\n trash: trash,\n truck: truck,\n 'upload-cloud': uploadCloud,\n user: user,\n 'user-search': userSearch,\n video: video,\n x: x,\n zap: zap,\n};\n","import { ICON_DEFINITIONS } from './icons';\n\n/**\n * Sprite SVG con los 74 íconos de trazo del design system (página 5:\n * \"Set de 59 iconos de trazo (1.9px, grilla 24×24)\", más las extensiones\n * propias documentadas en `icon-name.ts` — `eye-off`, `log-out`, los 5 de\n * `kf-map` y los 4 del selector de canal/fijar de `apps/operations`).\n * Cada ícono es un `<symbol>` con su nombre real de la spec como id\n * (`kf-icon-check`, `kf-icon-alert-triangle`, etc.) — `Icon` lo referencia\n * con `<use>`.\n *\n * Los paths vienen de Lucide (https://lucide.dev, licencia ISC), la\n * librería de iconos de trazo cuyo set de nombres coincide exactamente con\n * el que pide el design system (chevron-right, alert-triangle, bar-chart…).\n * Se embeben acá en vez de agregar `lucide` como dependencia del paquete\n * para no sumar peso/versión externa a algo que consumen todos los\n * frontends del ecosistema — son símbolos estáticos, no lógica que\n * necesite actualizarse seguido.\n *\n * Mapeo de 4 nombres de la spec que no existen tal cual en Lucide (renombres\n * entre versiones de esa librería, o conceptos vecinos):\n * tool -> wrench\n * sort -> arrow-up-down (control de orden bidireccional simple)\n * cart -> shopping-cart\n * chevron-left-bar -> panel-left (icono de \"colapsar panel lateral\")\n *\n * El sprite ya no es un string único de mano: se construye acá a partir de\n * `ICON_DEFINITIONS` (ver `icons/index.ts`), el registro tipado donde cada\n * ícono vive en su propio archivo bajo `icons/`. Esto es responsabilidad de\n * ensamblado pura — los datos de cada glyph viven en otro lado.\n *\n * Se inyecta UNA sola vez en el DOM (ver `Icon`), sin importar cuántos\n * `<kf-icon>` distintos haya en la página — todos referencian el mismo\n * sprite vía `<use href=\"#kf-icon-...\">`.\n */\nexport const KF_ICON_SPRITE = buildIconSprite();\n\nfunction buildIconSprite(): string {\n const symbols = Object.entries(ICON_DEFINITIONS)\n .map(\n ([name, { viewBox, markup }]) =>\n `<symbol id=\"kf-icon-${name}\" viewBox=\"${viewBox}\">${markup}</symbol>`,\n )\n .join('\\n ');\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n ${symbols}\n</svg>`;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, booleanAttribute, computed, effect, inject, input } from '@angular/core';\nimport { KF_ICON_SPRITE } from './icon-sprite';\nimport type { IconName } from './icon-name';\n\nexport type { IconName };\n\nexport type IconSize = 'sm' | 'md' | 'lg';\n\n/** Ángulos de rotación soportados por `rotate` — cubre los casos reales del\n * design system (un chevron que apunta en 4 direcciones posibles según\n * estado, ej. orden ascendente/descendente o un panel abierto/cerrado);\n * no un `number` libre, para no habilitar ángulos arbitrarios sin caso de\n * uso ni animación pensada. */\nexport type IconRotation = 0 | 90 | 180 | 270;\n\n/** Marca el sprite ya inyectado, para no depender de una bandera de módulo\n * — una bandera compartida entre instancias de test (o entre múltiples\n * `TestBed` en la misma suite) daría falsos negativos: el primer test que\n * corre \"gasta\" la bandera y todos los siguientes creerían que el sprite\n * nunca se inyecta. Comprobar el propio DOM es la fuente de verdad real. */\nconst SPRITE_ROOT_ID = 'kf-icon-sprite-root';\n\n/**\n * Ícono de trazo del design system — 71 glyphs (59 de la página 5 + extensiones\n * propias documentadas en `icon-name.ts`), grilla 24×24,\n * grosor de trazo 1.9px. Referencia un sprite SVG embebido (ver\n * `icon-sprite.ts`) vía `<use>`, así que no hay peso de red adicional por\n * cada instancia: el sprite se inyecta al DOM una única vez, la primera\n * vez que se renderiza cualquier `<kf-icon>` de toda la aplicación.\n *\n * El tamaño se controla con `size` (página 6: \"el tamaño se controla con la\n * prop size\"): `sm` (16px), `md` (20px, default) o `lg` (24px). El color\n * sigue siempre `currentColor` — se hereda del texto del elemento\n * contenedor, nunca se fija en el propio ícono.\n *\n * `rotate` gira el mismo glyph en vez de requerir un ícono aparte por\n * dirección — útil para un chevron que representa un estado con más de una\n * orientación (ej. orden ascendente/descendente de una columna, un panel\n * abierto/cerrado). La rotación transiciona con la misma duración que el\n * resto de las transiciones cortas del design system.\n *\n * <kf-icon name=\"alert-triangle\" size=\"sm\" />\n * <kf-icon name=\"chevron-down\" [rotate]=\"isOpen() ? 180 : 0\" />\n * <kf-button icon=\"calendar\">Reservar hora</kf-button> <!-- ver Button -->\n */\n@Component({\n selector: 'kf-icon',\n templateUrl: './Icon.html',\n styleUrl: './Icon.css',\n host: {\n '[style.--kf-icon-size]': 'pixelSize()',\n '[style.--kf-icon-rotate]': \"rotate() + 'deg'\",\n '[class.kf-icon--filled]': 'filled()',\n },\n})\nexport class Icon {\n readonly name = input.required<IconName>();\n readonly size = input<IconSize>('md');\n readonly rotate = input<IconRotation>(0);\n /**\n * Rellena el glyph (`fill: currentColor`) en vez de dejarlo solo de trazo.\n * Pensado para un estado activo/marcado de un ícono usado como toggle (ej.\n * \"fijar\" un panel) — un cambio de COLOR únicamente puede no distinguirse\n * lo suficiente en marcas cuyo `--kf-color-secondary` queda cerca del color\n * de texto por default; rellenar el área cambia más píxeles y se percibe\n * con más contraste aunque el tono sea similar. No es el default del\n * design system (sigue siendo de trazo, página 6 del PDF) — es opt-in por\n * componente para ese caso puntual.\n */\n readonly filled = input(false, { transform: booleanAttribute });\n\n private readonly document = inject(DOCUMENT);\n\n protected readonly pixelSize = computed(() => {\n const bySize: Record<IconSize, string> = { sm: '16px', md: '20px', lg: '24px' };\n return bySize[this.size()];\n });\n\n constructor() {\n effect(() => {\n if (this.document.getElementById(SPRITE_ROOT_ID)) {\n return;\n }\n const container = this.document.createElement('div');\n container.innerHTML = KF_ICON_SPRITE;\n const sprite = container.firstElementChild;\n if (sprite) {\n sprite.id = SPRITE_ROOT_ID;\n this.document.body.prepend(sprite);\n }\n });\n }\n}\n","<svg [attr.aria-hidden]=\"true\" focusable=\"false\">\n <use [attr.href]=\"'#kf-icon-' + name()\" />\n</svg>\n","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Dos variantes del mismo concepto — acceso rápido a una sección (página\n * 35): \"Tile de acceso destacado\" (`variant=\"tile\"`, default) es un bloque\n * centrado con ícono grande arriba y título abajo, pensado para una\n * cuadrícula de accesos (ej. \"Todos los certificados\"). \"Fila de documento\"\n * (`variant=\"row\"`) es horizontal, con ícono a la izquierda y\n * título+descripción a la derecha, pensada para listas verticales dentro de\n * un `kf-panel` (ej. \"Pagos\" / \"Revisa tu estado de cuenta y realiza pagos.\").\n *\n * <kf-action-tile icon=\"shield-check\" title=\"Todos los certificados\" />\n * <kf-action-tile variant=\"row\" icon=\"download\" title=\"Pagos\"\n * description=\"Revisa tu estado de cuenta y realiza pagos.\" />\n */\n@Component({\n selector: 'kf-action-tile',\n imports: [Icon],\n templateUrl: './ActionTile.html',\n styleUrl: './ActionTile.css',\n host: {\n '[class.kf-action-tile--tile]': \"variant() === 'tile'\",\n '[class.kf-action-tile--row]': \"variant() === 'row'\",\n },\n})\nexport class ActionTile {\n readonly variant = input<'tile' | 'row'>('tile');\n readonly icon = input.required<IconName>();\n readonly title = input.required<string>();\n readonly description = input<string>();\n}\n","<span class=\"kf-action-tile__icon\">\n <kf-icon [name]=\"icon()\" [size]=\"variant() === 'row' ? 'md' : 'lg'\" />\n</span>\n<span class=\"kf-action-tile__text\">\n <span class=\"kf-action-tile__title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-action-tile__description\">{{ description() }}</span>\n }\n</span>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\n\nexport type TextAs = 'h1' | 'h2' | 'h3' | 'p' | 'span';\nexport type TextVariant =\n | 'title-xxl'\n | 'title-xl'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body'\n | 'body-muted'\n | 'caption'\n | 'overline'\n | 'overline-strong';\nexport type TextTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Tipografía unificada — separa la etiqueta semántica (`as`, qué es el\n * texto para el DOM/accesibilidad) del estilo visual (`variant`, cómo se\n * ve). Antes de este componente, cada pantalla que consume la librería\n * definía su propio `h1`/`p` con `font-size` suelto para el mismo rol\n * (título de página, subtítulo, texto secundario) — auditoría sobre\n * `web-portal-latam-frontend` encontró 9 tamaños distintos entre login y\n * home sin ningún paso de escala en común. `variant` resuelve eso contra\n * la escala de `tokens/base.css` (`--kf-font-size-*`).\n *\n * `tone` sigue la misma convención cerrada que `Alert`/`Badge`/`Chip`: sin\n * escape hatch de color libre. Si un caso necesita un color que `tone` no\n * cubre, es una discusión de design system, no una prop nueva acá.\n *\n * `title-xl`/`title-xxl` son un tier aparte de `title-lg|md|sm`: no vienen\n * de la auditoría de contenido de página (esa cerró en 2.125rem), son para\n * títulos protagonistas de pantalla completa (ej. bienvenida del home vía\n * `kf-page-header[size=xl|xxl]`) — ver tokens/base.css.\n *\n * `overline`/`overline-strong` son para el patrón \"texto chico en mayúsculas\n * junto a un dato\" (ej. el label \"RUC\" de `kf-company-selector`, el badge de\n * `kf-admin-badge`) — antes de estas variantes, ese patrón se reimplementaba\n * suelto en al menos 7 componentes con tamaños/pesos ligeramente distintos\n * entre sí. `overline` (peso 600) es para labels sin chrome propio;\n * `overline-strong` (peso 700) es para el texto de un badge/pill que ya trae\n * su propio fondo. Ninguna de las dos fija color — como el resto de los\n * variants, el color se resuelve con `tone`.\n *\n * <kf-text as=\"h1\" variant=\"title-lg\">Bienvenido de nuevo</kf-text>\n * <kf-text as=\"p\" variant=\"body-muted\">Ingresá con tu cuenta corporativa.</kf-text>\n * <kf-text as=\"span\" variant=\"caption\" tone=\"error\">Campo obligatorio</kf-text>\n * <kf-text as=\"span\" variant=\"overline\">RUC</kf-text>\n * <kf-text as=\"span\" variant=\"overline-strong\" tone=\"warn\">Vista administrador</kf-text>\n */\n@Component({\n selector: 'kf-text',\n imports: [NgTemplateOutlet],\n templateUrl: './Text.html',\n styleUrl: './Text.css',\n})\nexport class Text {\n /** Etiqueta semántica real que se renderiza — nunca es solo un `div`. */\n readonly as = input<TextAs>('p');\n readonly variant = input<TextVariant>('body');\n readonly tone = input<TextTone>('neutral');\n\n /**\n * Copia de `as` para uso dentro del template: `as` es palabra reservada\n * en las expresiones de Angular (`@if (x; as y)`), así que `@switch (as())`\n * no parsea — NG5002. La prop pública sigue llamándose `as` (es solo un\n * atributo HTML ahí, `<kf-text as=\"h1\">`, no una expresión).\n */\n protected readonly tag = computed(() => this.as());\n\n protected hostClass(): string {\n const classes = [`kf-text--${this.variant()}`];\n // Geometría de \"overline\"/\"caption\" compartida con cualquier otro\n // consumidor de esos patrones (ver `shared/overline-text.css`,\n // `shared/caption-text.css`).\n if (this.variant() === 'overline') {\n classes.push('kf-overline-text');\n }\n if (this.variant() === 'caption') {\n classes.push('kf-caption-text');\n }\n if (this.tone() !== 'neutral') {\n classes.push(`kf-text--${this.tone()}`);\n }\n return classes.join(' ');\n }\n}\n","<!--\n Una sola proyección compartida (ng-template + ngTemplateOutlet) en vez\n de un <ng-content> por cada rama del @switch: Angular solo conecta la\n proyección real del consumidor a la PRIMERA instancia de <ng-content>\n que encuentra en el árbol de compilación — con un <ng-content> por\n rama, todas menos una quedan vacías en runtime (bug detectado por\n Text.spec.ts, no algo documentado a simple vista en los docs de Angular).\n-->\n<ng-template #projected><ng-content /></ng-template>\n@switch (tag()) {\n @case ('h1') {\n <h1 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h1>\n }\n @case ('h2') {\n <h2 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h2>\n }\n @case ('h3') {\n <h3 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h3>\n }\n @case ('span') {\n <span [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></span>\n }\n @default {\n <p [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></p>\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Marca la barra superior como chrome exclusivo de administradores (página\n * 18) — acento ámbar para diferenciar contexto privilegiado del resto del\n * portal. Dos variantes: etiqueta aislada (pill), o `inline` para usarse\n * dentro de la franja de `kf-portal-header` (fondo oscuro, texto ámbar).\n *\n * <kf-admin-badge />\n * <kf-admin-badge inline />\n */\n@Component({\n selector: 'kf-admin-badge',\n imports: [Icon, Text],\n templateUrl: './AdminBadge.html',\n styleUrl: './AdminBadge.css',\n host: {\n '[class.kf-admin-badge--inline]': 'inline()',\n },\n})\nexport class AdminBadge {\n /** Para usarse dentro de una superficie oscura (ej. la franja de `kf-portal-header`). */\n readonly inline = input(false, { transform: booleanAttribute });\n}\n","<kf-icon name=\"shield-check\" size=\"sm\" />\n<kf-text as=\"span\" variant=\"overline-strong\" tone=\"warn\">Vista administrador</kf-text>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg';\n\n/**\n * Indicador de carga indeterminado: inline, dentro de un botón, o como único\n * contenido de una sección mientras llega la data.\n *\n * Cuando se conoce la forma del contenido que viene, preferir `kf-skeleton`\n * (dibuja la silueta). El spinner es para \"algo está pasando\" sin forma\n * conocida — guardar, enviar, reintentar.\n *\n * Lleva `role=\"status\"`, así que el lector de pantalla anuncia el `label`\n * cuando aparece. Sin `label` cae en un texto accesible por defecto.\n *\n * <kf-spinner />\n * <kf-spinner size=\"sm\" label=\"Cargando…\" />\n * <kf-spinner onDark />\n */\n@Component({\n selector: 'kf-spinner',\n templateUrl: './Spinner.html',\n styleUrl: './Spinner.css',\n})\nexport class Spinner {\n readonly size = input<SpinnerSize>('md');\n /** Texto al lado del anillo. Vacío deja solo el anillo (y el texto para lectores). */\n readonly label = input('');\n /** Invierte los colores para fondos oscuros. */\n readonly onDark = input(false, { transform: booleanAttribute });\n}\n","<span class=\"kf-spinner\" [class.kf-spinner--on-dark]=\"onDark()\" role=\"status\">\n <span class=\"kf-spinner__ring\" [class]=\"'kf-spinner__ring--' + size()\"></span>\n @if (label()) {\n <span class=\"kf-spinner__label\">{{ label() }}</span>\n } @else {\n <span class=\"kf-spinner__sr\">Cargando</span>\n }\n</span>\n","import { booleanAttribute, Component, computed, ElementRef, input, viewChild } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Spinner } from '../spinner/Spinner';\n\n/**\n * Envuelve un `<button>` nativo: mantiene teclado, foco y submit de formulario.\n * Como es un elemento personalizado, ningún atributo ARIA puesto en el host\n * llega al `<button>` interno — por eso `disabled`, `type`, `ariaLabel`,\n * `ariaExpanded`, `ariaPressed` y `ariaHaspopup` se reenvían a mano.\n *\n * Seis variantes: `primary`, `secondary`, `ghost`, `outline`, `danger`,\n * `surface`. Tres tamaños (`sm`/`md`/`lg`). `icon` agrega un glifo antes del\n * label proyectado; `block` estira el botón a todo el ancho de su contenedor.\n *\n * `surface` es la variante neutra pensada para flotar SOBRE contenido\n * variable (ej. los controles de `kf-map` sobre un mapa que cambia de tema:\n * calles, satélite, oscuro) — fondo sólido de `--kf-color-surface` con\n * sombra, en vez de depender de contraste contra lo que haya debajo (que\n * `ghost`/`outline`, transparentes, no pueden garantizar ahí).\n *\n * `shape=\"circle\"` vuelve el botón cuadrado con esquina `pill` (mismo ancho\n * y alto, sin padding horizontal extra) — pensado para uso solo-ícono\n * (`icon` sin contenido proyectado): combinarlo con un label visible\n * descentra el ícono, no es el caso de uso.\n *\n * `(click)` no se reenvía: burbujea del botón interno al host solo.\n *\n * Objetivo táctil: el alto y el ancho mínimos del `<button>` interno salen\n * de `--kf-button-min-height` y `--kf-button-min-width` (default `auto`,\n * sin cambio). Un contenedor los sube (ej. a 44px en pantallas táctiles,\n * sobre todo para un botón solo-ícono) declarando las variables en su\n * propio CSS — heredan a través del límite de encapsulación.\n *\n * `focus()` enfoca el `<button>` interno: el consumidor no necesita\n * buscarlo con `querySelector` en el DOM del componente.\n *\n * `loading` reemplaza el contenido proyectado por `kf-spinner` y fuerza\n * `disabled`.\n *\n * Botón solo-ícono (sin label visible): pasar `ariaLabel` en vez de dejar el\n * botón sin nombre accesible.\n *\n * <kf-button (click)=\"save()\">Guardar</kf-button>\n * <kf-button variant=\"danger\" (click)=\"remove()\">Eliminar</kf-button>\n * <kf-button size=\"sm\" icon=\"external-link\" ariaLabel=\"Expandir\" (click)=\"expand()\" />\n * <kf-button type=\"submit\" [loading]=\"submitting()\">Ingresar</kf-button>\n * <kf-button variant=\"surface\" shape=\"circle\" icon=\"plus\" ariaLabel=\"Acercar\" [ariaPressed]=\"false\" />\n */\n@Component({\n selector: 'kf-button',\n imports: [Icon, Spinner],\n templateUrl: './button.html',\n styleUrl: './button.css',\n host: {\n '[attr.block]': \"block() ? '' : null\",\n },\n})\nexport class Button {\n readonly variant = input<'primary' | 'secondary' | 'ghost' | 'outline' | 'danger' | 'surface'>(\n 'primary',\n );\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly shape = input<'rect' | 'circle'>('rect');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Igual al default nativo: hace submit dentro de un `<form>`. */\n readonly type = input<'button' | 'submit' | 'reset'>('submit');\n /** Ícono líder, renderizado con `kf-icon` antes del label proyectado. */\n readonly icon = input<IconName>();\n /** Estira el botón a todo el ancho de su contenedor. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Reemplaza el contenido proyectado por `kf-spinner` y fuerza `disabled`. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Nombre accesible del botón interno — obligatorio quien no proyecta\n * ningún texto visible (botón solo-ícono), porque el host no lo reenvía. */\n readonly ariaLabel = input<string>();\n /** Estado expandido/colapsado para un botón toggle — mismo motivo que\n * `ariaLabel`, el host no reenvía atributos ARIA al `<button>` interno. */\n readonly ariaExpanded = input<boolean>();\n /** Estado presionado/no presionado para un botón toggle real (ej. \"seguir\n * vehículo\" activo/inactivo) — distinto semánticamente de `ariaExpanded`\n * (que es para mostrar/ocultar un panel), mismo motivo de reenvío manual.\n * Con `icon`, presionado (`true`) rellena el glyph (`kf-icon[filled]`) en\n * vez de solo cambiar de color — un toggle solo-ícono necesita esa señal\n * más fuerte para leerse activo, y así ningún consumidor tiene que\n * acordarse de pedirlo aparte. */\n readonly ariaPressed = input<boolean>();\n /** Tipo de elemento emergente que abre el botón (ej. `'dialog'` para un\n * panel de filtros, `'listbox'`) — mismo motivo de reenvío manual. */\n readonly ariaHaspopup = input<'dialog' | 'menu' | 'listbox' | 'true'>();\n\n private readonly nativeButton = viewChild.required<ElementRef<HTMLButtonElement>>('nativeButton');\n\n /** Enfoca el `<button>` interno (mismas opciones que `HTMLElement.focus`). */\n focus(options?: FocusOptions): void {\n this.nativeButton().nativeElement.focus(options);\n }\n\n /** `ghost`/`outline`/`surface` no tienen fondo oscuro sólido — el anillo\n * del spinner por defecto ya se lee bien ahí sin variante propia\n * (`surface` es fondo claro con texto oscuro, mismo motivo que `outline`). */\n protected readonly hasSolidFill = computed(() => {\n const variant = this.variant();\n return variant !== 'ghost' && variant !== 'outline' && variant !== 'surface';\n });\n}\n","<button\n #nativeButton\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-expanded]=\"ariaExpanded() === undefined ? null : ariaExpanded()\"\n [attr.aria-pressed]=\"ariaPressed() === undefined ? null : ariaPressed()\"\n [attr.aria-haspopup]=\"ariaHaspopup() ?? null\"\n [class.kf-button--secondary]=\"variant() === 'secondary'\"\n [class.kf-button--ghost]=\"variant() === 'ghost'\"\n [class.kf-button--outline]=\"variant() === 'outline'\"\n [class.kf-button--danger]=\"variant() === 'danger'\"\n [class.kf-button--surface]=\"variant() === 'surface'\"\n [class.kf-button--circle]=\"shape() === 'circle'\"\n [class.kf-button--sm]=\"size() === 'sm'\"\n [class.kf-button--lg]=\"size() === 'lg'\"\n>\n @if (loading()) {\n <kf-spinner size=\"sm\" [onDark]=\"hasSolidFill()\" />\n } @else {\n @if (icon(); as iconName) {\n <kf-icon\n class=\"kf-button__icon\"\n [name]=\"iconName\"\n [size]=\"size() === 'lg' ? 'md' : 'sm'\"\n [filled]=\"ariaPressed() === true\"\n />\n }\n <ng-content />\n }\n</button>\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type AlertTone = 'info' | 'ok' | 'warn' | 'error';\n\n/** Forma del aviso: `card` (default, con borde y esquinas) o `bar` (franja compacta de ancho completo). */\nexport type AlertVariant = 'card' | 'bar';\n\nconst TONE_ICON: Record<AlertTone, IconName> = {\n info: 'alert-circle',\n ok: 'check-circle',\n warn: 'alert-triangle',\n error: 'alert-octagon',\n};\n\n/**\n * Banner contextual que vive dentro del flujo: validaciones, avisos de\n * vencimiento, confirmaciones. Persiste hasta que se descarta o hasta que la\n * condición que lo causó desaparece — para feedback efímero está el toast.\n *\n * `open` es two-way: el botón de cerrar lo pone en `false` y el componente\n * deja de renderizar. El consumidor puede volver a abrirlo poniéndolo en\n * `true` (ej. cuando la validación falla otra vez).\n *\n * <kf-alert tone=\"warn\" title=\"SOAT por vencer\">Vence el 15/08.</kf-alert>\n * <kf-alert tone=\"ok\" [(open)]=\"saved\" dismissible>Pago registrado.</kf-alert>\n *\n * `variant=\"bar\"` es una franja compacta de ancho completo, sin tarjeta: sin\n * esquinas ni bordes laterales (solo la línea superior e inferior del tono),\n * ícono, título y mensaje en una sola línea que envuelve si no entra. Mismos\n * tonos y mismo `role` (`alert` para `error`/`warn`, `status` para el resto)\n * que la variante `card`. Pensada para el borde de una página o de un panel\n * (ej. \"Estás viendo datos de otro cliente\"), donde una tarjeta con margen\n * sobra.\n *\n * <kf-alert variant=\"bar\" tone=\"warn\" title=\"Modo suplantación\">Viendo como Ana Pérez.</kf-alert>\n */\n@Component({\n selector: 'kf-alert',\n imports: [Icon],\n templateUrl: './Alert.html',\n styleUrl: './Alert.css',\n})\nexport class Alert {\n readonly tone = input<AlertTone>('info');\n /** `card` (default) o `bar` (franja compacta de ancho completo). */\n readonly variant = input<AlertVariant>('card');\n /** Línea en negrita arriba del mensaje. Vacío deja solo el contenido proyectado. */\n readonly title = input('');\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Visibilidad, two-way: `[(open)]=\"hasError\"`. */\n readonly open = model(true);\n\n /**\n * `alert` interrumpe al lector de pantalla; se reserva para error/warn.\n * Los avisos informativos se anuncian sin cortar lo que se esté leyendo.\n */\n protected readonly ariaRole = computed(() =>\n this.tone() === 'error' || this.tone() === 'warn' ? 'alert' : 'status',\n );\n\n protected readonly toneIcon = computed(() => TONE_ICON[this.tone()]);\n}\n","@if (open()) {\n <div\n class=\"kf-alert\"\n [class]=\"'kf-alert--' + tone()\"\n [class.kf-alert--bar]=\"variant() === 'bar'\"\n [attr.role]=\"ariaRole()\"\n >\n <kf-icon class=\"kf-alert__icon\" [name]=\"toneIcon()\" size=\"sm\" />\n <div class=\"kf-alert__body\">\n @if (title()) {\n <p class=\"kf-alert__title\">{{ title() }}</p>\n }\n <div class=\"kf-alert__message\"><ng-content /></div>\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-alert__close\"\n aria-label=\"Cerrar aviso\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type AlertRowTone = 'warn' | 'error' | 'neutral';\n\n/**\n * Fila clickeable de una lista de pendientes/alertas: ícono circular con\n * tono semántico, texto de una línea, chevron al final. Pensada para\n * agrupar varias dentro de un `kf-card` (ej. \"Tus pendientes\" del\n * dashboard) — no incluye el contenedor en sí.\n *\n * <kf-alert-row icon=\"file\" tone=\"warn\" text=\"2 cotizaciones esperan tu aprobación\" (rowClick)=\"onNavigate('cotizaciones')\" />\n *\n * Extensiones opcionales (la fila sin ellas se ve y se comporta como siempre):\n * - `tone=\"neutral\"`: ícono gris, para una fila sin urgencia ni alerta.\n * - `value`: cifra alineada a la derecha, antes del chevron (ej. el conteo de\n * pendientes). Admite `'—'` cuando no hay dato; en ese caso conviene pasar\n * `valueLabel` con el texto que debe leer un lector de pantalla\n * («Sin datos»), porque la raya sola no dice nada.\n * - `valueLabel`: texto solo para lectores de pantalla que reemplaza a `value`\n * en el árbol de accesibilidad; visualmente se sigue viendo `value`.\n * - `tag`: etiqueta neutra pequeña junto al texto (ej. «Próximamente»).\n * - `disabled`: la fila no es accionable — no emite `rowClick`, no entra en el\n * orden de tabulación, no cambia al pasar el mouse, su chevron se oculta (conserva el\n * espacio para alinear las cifras con las filas activas) y el\n * texto y la cifra se atenúan (sin bajar el contraste de lectura). Expone\n * `disabled` y `aria-disabled=\"true\"`, así que un lector de pantalla la\n * anuncia como no disponible en vez de omitirla.\n *\n * <kf-alert-row icon=\"file\" tone=\"neutral\" text=\"Documentos por firmar\" tag=\"Próximamente\" value=\"—\" valueLabel=\"Sin datos todavía\" disabled />\n */\n@Component({\n selector: 'kf-alert-row',\n imports: [Icon, NgTemplateOutlet],\n templateUrl: './AlertRow.html',\n styleUrl: './AlertRow.css',\n})\nexport class AlertRow {\n readonly icon = input.required<IconName>();\n readonly tone = input<AlertRowTone>('warn');\n readonly text = input.required<string>();\n /** Cifra o texto corto alineado a la derecha (ej. `3`, `'—'`). */\n readonly value = input<string | number>();\n /** Texto solo para lectores de pantalla que reemplaza a `value` en el árbol de accesibilidad. */\n readonly valueLabel = input<string>();\n /** Etiqueta neutra junto al texto (ej. «Próximamente»). */\n readonly tag = input<string>();\n /** La fila no es accionable: sin clic, sin foco ni hover. */\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly rowClick = output<void>();\n\n /** Emite `rowClick` salvo que la fila esté deshabilitada (también ante clics sintéticos). */\n protected activate(): void {\n if (!this.disabled()) {\n this.rowClick.emit();\n }\n }\n\n protected hasValue(): boolean {\n const value = this.value();\n return value !== undefined && value !== null && value !== '';\n }\n}\n","<button\n type=\"button\"\n class=\"kf-alert-row\"\n [class.kf-alert-row--disabled]=\"disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n (click)=\"activate()\"\n>\n <span class=\"kf-alert-row__icon\" [class]=\"'kf-alert-row__icon--' + tone()\">\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n </span>\n @if (tag()) {\n <span class=\"kf-alert-row__main\">\n <ng-container *ngTemplateOutlet=\"rowText\" />\n <span class=\"kf-alert-row__tag\">{{ tag() }}</span>\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowText\" />\n }\n @if (hasValue()) {\n @if (valueLabel()) {\n <span class=\"kf-alert-row__value\" aria-hidden=\"true\">{{ value() }}</span>\n <span class=\"kf-sr-only\">{{ valueLabel() }}</span>\n } @else {\n <span class=\"kf-alert-row__value\">{{ value() }}</span>\n }\n }\n <kf-icon class=\"kf-alert-row__chevron\" name=\"chevron-right\" size=\"sm\" />\n</button>\n\n<ng-template #rowText>\n <span class=\"kf-alert-row__text\">{{ text() }}</span>\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, computed, input } from '@angular/core';\n\n/**\n * Avatar de usuario: muestra una foto (`src`) o, si no hay foto, las\n * iniciales (`initials`) sobre un fondo con gradiente de marca. `round`\n * controla la forma: circular (por defecto) o cuadrada con radio.\n *\n * Con `pill`, el avatar se envuelve en una pastilla azul con un chevron a la\n * derecha — la \"pill de usuario (header)\" de la página 18 del design system,\n * usada en la barra de sesión del Portal Header.\n *\n * <kf-avatar initials=\"JD\" />\n * <kf-avatar src=\"https://…/foto.jpg\" [round]=\"false\" />\n * <kf-avatar initials=\"TS\" pill />\n */\n@Component({\n selector: 'kf-avatar',\n imports: [NgTemplateOutlet],\n templateUrl: './Avatar.html',\n styleUrl: './Avatar.css',\n})\nexport class Avatar {\n readonly initials = input<string>();\n readonly src = input<string>();\n readonly round = input(true);\n /** Envuelve el avatar en la pastilla de sesión del header, con chevron. */\n readonly pill = input(false, { transform: booleanAttribute });\n\n /** Limita a 2 caracteres para que quepan cómodos dentro del círculo. */\n readonly displayInitials = computed(() => (this.initials() ?? '').slice(0, 2));\n}\n","<ng-template #avatarCircle>\n <span class=\"kf-avatar\" [class.kf-avatar--square]=\"!round()\">\n @if (src()) {\n <img class=\"kf-avatar__image\" [src]=\"src()\" [alt]=\"initials() || ''\" />\n } @else {\n <span class=\"kf-avatar__initials\">{{ displayInitials() }}</span>\n }\n </span>\n</ng-template>\n\n@if (pill()) {\n <span class=\"kf-avatar-pill\">\n <ng-container [ngTemplateOutlet]=\"avatarCircle\" />\n <span class=\"kf-avatar-pill__caret\" aria-hidden=\"true\"></span>\n </span>\n} @else {\n <ng-container [ngTemplateOutlet]=\"avatarCircle\" />\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Pill chica de fondo suave para un conteo, tag o estado liviano puntual —\n * no un proceso en vivo (para eso, `kf-status-pill`, con borde en vez de\n * relleno). Fondo soft y texto del tono fuerte según `tone`; `service` usa\n * el color base porque `secondary` todavía no tiene variante `-strong`.\n * `variant` es un eje ortogonal a `tone` (mismo patrón que `kf-button`):\n * `soft` (default) es el fondo de color sólido de siempre; `glass` es\n * translúcido con desenfoque, pensado para un badge sobre una superficie\n * de marca (ej. un header navy), no para un banner suelto. En `glass` el\n * punto (`dot`) usa el color BASE de cada tono, no `-strong` — ese último\n * está pensado para texto legible sobre el fondo pastel de `soft` y se ve\n * apagado sobre una superficie translúcida/oscura.\n *\n * `truncate` corta un texto largo con elipsis (ej. un estado de SAP como\n * \"WF Aprobación Política descuento\") en vez de ensanchar la fila que lo\n * contiene: el badge se limita al ancho de su contenedor (`max-width: 100%`,\n * `min-width: 0`) y el punto no se recorta. El texto completo lo pone el\n * consumidor en `title` (el badge no puede leer su propio contenido\n * proyectado para generarlo):\n *\n * <kf-badge tone=\"warn\" dot truncate [title]=\"q.statusLabel\">{{ q.statusLabel }}</kf-badge>\n */\n@Component({\n selector: 'kf-badge',\n templateUrl: './Badge.html',\n styleUrl: './Badge.css',\n host: {\n '[class.kf-badge-host--truncate]': 'truncate()',\n },\n})\nexport class Badge {\n readonly tone = input<'neutral' | 'ok' | 'warn' | 'error' | 'info' | 'service'>('neutral');\n readonly variant = input<'soft' | 'glass'>('soft');\n readonly dot = input(false, { transform: booleanAttribute });\n /** Corta el texto con elipsis al ancho del contenedor. Ver JSDoc de la clase. */\n readonly truncate = input(false, { transform: booleanAttribute });\n}\n","<span\n class=\"kf-badge\"\n [class]=\"'kf-badge--' + tone()\"\n [class.kf-badge--glass]=\"variant() === 'glass'\"\n>\n @if (dot()) {\n <span class=\"kf-badge__dot\"></span>\n }\n <!-- `display: contents` salvo con `truncate`: sin truncar, el contenido\n proyectado sigue siendo hijo directo del flex (mismo `gap` de siempre). -->\n <span class=\"kf-badge__label\"><ng-content /></span>\n</span>\n","import { Component, computed, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport interface BreadcrumbItem {\n label: string;\n /** Destino del link. Sin `href` el nivel se rinde como texto plano. */\n href?: string;\n}\n\n/**\n * Ruta de navegación de las vistas internas. El último nivel es la página\n * actual: nunca es link y lleva `aria-current=\"page\"`, aunque traiga `href`.\n *\n * Se rinde como `<nav><ol>` — es una lista ordenada de ancestros, y eso es lo\n * que los lectores de pantalla anuncian (\"navegación, lista de 3 elementos\").\n *\n * Para apps con router: escuchar `itemClick` y llamar\n * `event.preventDefault()` antes de `router.navigate(...)`. El `href` se\n * mantiene igual para que click-medio, \"abrir en pestaña nueva\" y el hover\n * de la barra de estado sigan funcionando.\n *\n * <kf-breadcrumb [items]=\"[{ label: 'Inicio', href: '/' }, { label: 'Mis vehículos' }]\" />\n */\n@Component({\n selector: 'kf-breadcrumb',\n imports: [Icon],\n templateUrl: './Breadcrumb.html',\n styleUrl: './Breadcrumb.css',\n})\nexport class Breadcrumb {\n readonly items = input.required<BreadcrumbItem[]>();\n\n /**\n * Click en un nivel con `href`. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa. No se depende\n * de `@angular/router` acá — sería un peer dep nuevo en la librería para\n * lo que el consumidor resuelve en una línea.\n */\n readonly itemClick = output<{ item: BreadcrumbItem; index: number; event: MouseEvent }>();\n\n protected readonly lastIndex = computed(() => this.items().length - 1);\n}\n","<nav class=\"kf-breadcrumb\" aria-label=\"Ruta de navegación\">\n <ol class=\"kf-breadcrumb__list\">\n @for (item of items(); track $index; let i = $index) {\n <li class=\"kf-breadcrumb__item\">\n @if (i > 0) {\n <kf-icon class=\"kf-breadcrumb__separator\" name=\"chevron-right\" size=\"sm\" />\n }\n @if (item.href && i !== lastIndex()) {\n <a\n class=\"kf-breadcrumb__link\"\n [href]=\"item.href\"\n (click)=\"itemClick.emit({ item, index: i, event: $event })\"\n >\n {{ item.label }}\n </a>\n } @else {\n <span\n class=\"kf-breadcrumb__current\"\n [attr.aria-current]=\"i === lastIndex() ? 'page' : null\"\n >\n {{ item.label }}\n </span>\n }\n </li>\n }\n </ol>\n</nav>\n","import { Component, computed, input } from '@angular/core';\n\n/**\n * Una categoría de la barra — el componente no sabe qué significa \"pagada\"\n * o \"vencida\", solo dibuja proporciones: `count` decide el ancho relativo\n * del segmento (`flex-grow`) y de la fila de leyenda que lo acompaña.\n * `color` es cualquier valor CSS válido (pensado para tokens `var(--kf-*)`,\n * nunca hex suelto desde el consumidor).\n */\nexport interface BucketProgressItem {\n key: string;\n label: string;\n count: number;\n color: string;\n}\n\n/**\n * Barra de progreso segmentada en categorías proporcionales — generaliza\n * el resumen de \"Progreso del plan de pagos\" de Pagos y Facturas de OTD\n * (cuotas pagadas/vencidas/próximas/pendientes) sin acoplarse a esas 4\n * categorías puntuales: el consumidor pasa sus propios `items` con\n * `{key, label, count, color}`.\n *\n * Los segmentos son proporcionales por CANTIDAD (`flex-grow: count`), no\n * uno por unidad — con 36 cuotas y 6 pagadas, la barra dibuja 2 anchos\n * distintos (pagado ~17% / resto ~83%), nunca 36 rectángulos idénticos\n * (hallazgo real de UX: con volumen alto, un segmento por unidad se vuelve\n * ilegible). Los `items` con `count: 0` no se dibujan (ni segmento ni\n * fila de leyenda) — no tiene sentido mostrar una categoría vacía.\n *\n * La leyenda debajo reproduce el mismo orden y color que la barra, para\n * que una categoría se pueda mapear a su cantidad de un vistazo (pedido\n * explícito de UX: \"posicionar correctamente los labels\").\n *\n * <kf-bucket-progress\n * title=\"Progreso del plan de pagos\"\n * [summary]=\"'6 de 30 cuotas pagadas'\"\n * [items]=\"[\n * { key: 'paid', label: 'pagadas', count: 6, color: 'var(--kf-color-success)' },\n * { key: 'overdue', label: 'vencidas', count: 2, color: 'var(--kf-color-error)' },\n * { key: 'upcoming', label: 'próxima', count: 1, color: 'var(--kf-color-warning)' },\n * { key: 'pending', label: 'pendientes', count: 21, color: 'var(--kf-color-gray-200)' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-bucket-progress',\n templateUrl: './BucketProgress.html',\n styleUrl: './BucketProgress.css',\n})\nexport class BucketProgress {\n readonly title = input.required<string>();\n /** Texto libre a la derecha del título (ej. \"6 de 30 cuotas pagadas\") —\n * el componente no sabe calcular ese resumen, lo recibe hecho. */\n readonly summary = input<string>('');\n readonly items = input.required<BucketProgressItem[]>();\n\n protected readonly visibleItems = computed(() => this.items().filter((item) => item.count > 0));\n\n protected readonly total = computed(() =>\n this.items().reduce((sum, item) => sum + item.count, 0),\n );\n\n /** Descripción accesible de la barra completa — un solo `role=\"img\"`\n * con el desglose en texto, en vez de que cada segmento individual\n * compita por foco/lectura de screen reader. */\n protected readonly ariaLabel = computed(() =>\n this.visibleItems()\n .map((item) => `${item.count} ${item.label}`)\n .concat(`de ${this.total()} en total`)\n .join(', '),\n );\n}\n","<div class=\"kf-bucket-progress__head\">\n <span class=\"kf-bucket-progress__title\">{{ title() }}</span>\n @if (summary()) {\n <span class=\"kf-bucket-progress__summary\">{{ summary() }}</span>\n }\n</div>\n\n<div class=\"kf-bucket-progress__bar\" role=\"img\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of visibleItems(); track item.key) {\n <span\n class=\"kf-bucket-progress__segment\"\n [style.flex-grow]=\"item.count\"\n [style.background]=\"item.color\"\n ></span>\n }\n</div>\n\n<div class=\"kf-bucket-progress__legend\">\n @for (item of visibleItems(); track item.key) {\n <span class=\"kf-bucket-progress__legend-item\">\n <span class=\"kf-bucket-progress__dot\" [style.background]=\"item.color\"></span>\n {{ item.count }} {{ item.label }}\n </span>\n }\n</div>\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { Button } from '../button/button';\nimport { Text } from '../text/Text';\n\n/** Una celda ya resuelta de la grilla del mes. */\nexport interface CalendarDay {\n /** ISO date, `YYYY-MM-DD`. */\n iso: string;\n day: number;\n inMonth: boolean;\n selectable: boolean;\n selected: boolean;\n marked: boolean;\n today: boolean;\n ariaLabel: string;\n}\n\nconst DEFAULT_MONTH_NAMES: readonly string[] = [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n];\nconst DEFAULT_WEEKDAY_LABELS: readonly string[] = ['L', 'M', 'M', 'J', 'V', 'S', 'D'];\nconst DEFAULT_WEEKDAY_NAMES: readonly string[] = [\n 'lunes',\n 'martes',\n 'miércoles',\n 'jueves',\n 'viernes',\n 'sábado',\n 'domingo',\n];\n\n/**\n * Selector de fecha de un solo mes, con grilla semanal que parte en lunes.\n *\n * Las fechas viajan como strings ISO (`YYYY-MM-DD`, y `YYYY-MM` para el mes\n * visible) y se calculan en UTC, así la zona horaria del navegador nunca\n * corre una fecha un día.\n *\n * `availableDates` en `null` deja seleccionable toda fecha dentro de\n * `min`/`max`; un arreglo deja seleccionables SOLO esas fechas (el resto se\n * rinde deshabilitado). `markedDates` es independiente: agrega un punto\n * marcador sin afectar si la fecha se puede elegir.\n *\n * Patrón WAI-ARIA `grid` con roving tabindex: las flechas mueven por\n * día/semana, Home/End van al inicio/fin de la semana y PageUp/PageDown\n * cambian de mes; el foco cruza los límites del mes.\n *\n * <kf-calendar\n * [(value)]=\"date\"\n * [(month)]=\"month\"\n * [min]=\"today\"\n * [availableDates]=\"freeDates()\"\n * [markedDates]=\"eventDates()\"\n * [loading]=\"loadingAvailability()\"\n * >\n * <p footer>Leyenda</p>\n * </kf-calendar>\n */\n@Component({\n selector: 'kf-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Button, Text],\n templateUrl: './Calendar.html',\n styleUrl: './Calendar.css',\n})\nexport class Calendar {\n private static nextId = 0;\n\n /** Fecha seleccionada, ISO `YYYY-MM-DD`. */\n readonly value = model<string | null>(null);\n /** Mes visible, `YYYY-MM`. En `null` se deriva de `value` y, si no hay, de hoy. */\n readonly month = model<string | null>(null);\n /** Fecha mínima seleccionable (inclusive), ISO. */\n readonly min = input<string | null>(null);\n /** Fecha máxima seleccionable (inclusive), ISO. */\n readonly max = input<string | null>(null);\n /** `null`: toda fecha dentro de `min`/`max` es seleccionable. Arreglo: solo esas fechas. */\n readonly availableDates = input<readonly string[] | null>(null);\n /** Fechas con punto marcador, independiente de si son seleccionables. */\n readonly markedDates = input<readonly string[]>([]);\n /** Reemplaza el \"hoy\" local (tests/SSR), ISO. */\n readonly today = input<string | null>(null);\n /** Atenúa la grilla y bloquea la selección mientras carga la disponibilidad. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('Calendario');\n /** Los 12 nombres de mes, partiendo en enero. */\n readonly monthNames = input<readonly string[]>(DEFAULT_MONTH_NAMES);\n /** Las 7 iniciales visibles de los días, partiendo en lunes. */\n readonly weekdayLabels = input<readonly string[]>(DEFAULT_WEEKDAY_LABELS);\n /** Los 7 nombres completos de los días, partiendo en lunes — se usan en los nombres accesibles. */\n readonly weekdayNames = input<readonly string[]>(DEFAULT_WEEKDAY_NAMES);\n /** Se agrega al nombre accesible de una fecha marcada. */\n readonly markedLabel = input<string>('marcado');\n readonly previousMonthLabel = input<string>('Mes anterior');\n readonly nextMonthLabel = input<string>('Mes siguiente');\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly injector = inject(Injector);\n private readonly focusedDate = signal<string | null>(null);\n\n protected readonly titleId = `kf-calendar-title-${Calendar.nextId++}`;\n\n protected readonly todayIso = computed(() => this.today() ?? localTodayIso());\n\n protected readonly displayedMonth = computed(\n () => this.month() ?? this.value()?.slice(0, 7) ?? this.todayIso().slice(0, 7),\n );\n\n protected readonly title = computed(() => {\n const [year, month] = parseParts(this.displayedMonth());\n return `${this.monthNames()[month - 1]} ${year}`;\n });\n\n private readonly minMonth = computed(() => this.min()?.slice(0, 7) ?? null);\n private readonly maxMonth = computed(() => this.max()?.slice(0, 7) ?? null);\n\n protected readonly canGoPrevious = computed(() =>\n this.isMonthNavigable(shiftMonth(this.displayedMonth(), -1)),\n );\n protected readonly canGoNext = computed(() =>\n this.isMonthNavigable(shiftMonth(this.displayedMonth(), 1)),\n );\n\n private readonly availableSet = computed(() => {\n const dates = this.availableDates();\n return dates ? new Set(dates) : null;\n });\n private readonly markedSet = computed(() => new Set(this.markedDates()));\n\n protected readonly weeks = computed<CalendarDay[][]>(() => {\n const month = this.displayedMonth();\n const firstDay = `${month}-01`;\n const lastDay = addDays(`${shiftMonth(month, 1)}-01`, -1);\n const start = addDays(firstDay, -weekdayIndex(firstDay));\n const end = addDays(lastDay, 6 - weekdayIndex(lastDay));\n\n const weeks: CalendarDay[][] = [];\n let week: CalendarDay[] = [];\n for (let iso = start; iso <= end; iso = addDays(iso, 1)) {\n week.push(this.buildDay(iso, month));\n if (week.length === 7) {\n weeks.push(week);\n week = [];\n }\n }\n return weeks;\n });\n\n /** La única celda con `tabindex=\"0\"` (roving tabindex). */\n protected readonly activeDate = computed(() => {\n const month = this.displayedMonth();\n const inMonth = (iso: string | null): iso is string => iso?.slice(0, 7) === month;\n const focused = this.focusedDate();\n if (inMonth(focused)) {\n return focused;\n }\n const value = this.value();\n if (inMonth(value)) {\n return value;\n }\n const today = this.todayIso();\n if (inMonth(today)) {\n return today;\n }\n const firstSelectable = this.weeks()\n .flat()\n .find((day) => day.selectable);\n return firstSelectable?.iso ?? `${month}-01`;\n });\n\n previousMonth(): void {\n if (this.canGoPrevious()) {\n this.month.set(shiftMonth(this.displayedMonth(), -1));\n }\n }\n\n nextMonth(): void {\n if (this.canGoNext()) {\n this.month.set(shiftMonth(this.displayedMonth(), 1));\n }\n }\n\n protected selectDay(day: CalendarDay): void {\n if (!day.selectable || this.loading()) {\n return;\n }\n this.focusedDate.set(day.iso);\n if (day.iso !== this.value()) {\n this.value.set(day.iso);\n }\n }\n\n protected onDayFocus(iso: string): void {\n this.focusedDate.set(iso);\n }\n\n protected onDayKeydown(event: KeyboardEvent, iso: string): void {\n const target = keyboardTarget(event.key, iso);\n if (target === null) {\n return;\n }\n event.preventDefault();\n\n const targetMonth = target.slice(0, 7);\n if (!this.isMonthNavigable(targetMonth)) {\n return;\n }\n this.focusedDate.set(target);\n if (targetMonth !== this.displayedMonth()) {\n this.month.set(targetMonth);\n }\n // Si cambió el mes, la celda destino todavía no existe en el DOM.\n afterNextRender(() => this.focusDay(target), { injector: this.injector });\n }\n\n private focusDay(iso: string): void {\n this.host.nativeElement.querySelector<HTMLElement>(`[data-date=\"${iso}\"]`)?.focus();\n }\n\n private isMonthNavigable(month: string): boolean {\n const min = this.minMonth();\n const max = this.maxMonth();\n return (min === null || month >= min) && (max === null || month <= max);\n }\n\n private buildDay(iso: string, displayedMonth: string): CalendarDay {\n const [year, month, day] = parseParts(iso);\n const inMonth = iso.slice(0, 7) === displayedMonth;\n const min = this.min();\n const max = this.max();\n const available = this.availableSet();\n const marked = this.markedSet().has(iso);\n\n const weekdayName = this.weekdayNames()[weekdayIndex(iso)];\n const monthName = this.monthNames()[month - 1].toLowerCase();\n const baseLabel = `${weekdayName} ${day} de ${monthName} de ${year}`;\n\n return {\n iso,\n day,\n inMonth,\n selectable:\n inMonth &&\n (min === null || iso >= min) &&\n (max === null || iso <= max) &&\n (available === null || available.has(iso)),\n selected: iso === this.value(),\n marked,\n today: iso === this.todayIso(),\n ariaLabel: marked ? `${baseLabel}, ${this.markedLabel()}` : baseLabel,\n };\n }\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction parseParts(iso: string): number[] {\n return iso.split('-').map(Number);\n}\n\nfunction fromUtc(date: Date): string {\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction localTodayIso(): string {\n const now = new Date();\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n}\n\nfunction addDays(iso: string, days: number): string {\n const [year, month, day] = parseParts(iso);\n return fromUtc(new Date(Date.UTC(year, month - 1, day + days)));\n}\n\n/** 0 = lunes … 6 = domingo. */\nfunction weekdayIndex(iso: string): number {\n const [year, month, day] = parseParts(iso);\n return (new Date(Date.UTC(year, month - 1, day)).getUTCDay() + 6) % 7;\n}\n\nfunction shiftMonth(yearMonth: string, delta: number): string {\n const [year, month] = parseParts(yearMonth);\n const date = new Date(Date.UTC(year, month - 1 + delta, 1));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}`;\n}\n\n/** Mismo día en otro mes, acotado al último día de ese mes. */\nfunction shiftDateByMonths(iso: string, delta: number): string {\n const targetMonth = shiftMonth(iso.slice(0, 7), delta);\n const lastDay = parseParts(addDays(`${shiftMonth(targetMonth, 1)}-01`, -1))[2];\n const day = Math.min(parseParts(iso)[2], lastDay);\n return `${targetMonth}-${pad(day)}`;\n}\n\nfunction keyboardTarget(key: string, iso: string): string | null {\n switch (key) {\n case 'ArrowLeft':\n return addDays(iso, -1);\n case 'ArrowRight':\n return addDays(iso, 1);\n case 'ArrowUp':\n return addDays(iso, -7);\n case 'ArrowDown':\n return addDays(iso, 7);\n case 'Home':\n return addDays(iso, -weekdayIndex(iso));\n case 'End':\n return addDays(iso, 6 - weekdayIndex(iso));\n case 'PageUp':\n return shiftDateByMonths(iso, -1);\n case 'PageDown':\n return shiftDateByMonths(iso, 1);\n default:\n return null;\n }\n}\n","<div class=\"kf-calendar\" role=\"group\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"kf-calendar__header\">\n <kf-button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"lg\"\n type=\"button\"\n icon=\"chevron-left\"\n [ariaLabel]=\"previousMonthLabel()\"\n [disabled]=\"!canGoPrevious()\"\n (click)=\"previousMonth()\"\n />\n <kf-text\n class=\"kf-calendar__title\"\n as=\"span\"\n variant=\"title-sm\"\n aria-live=\"polite\"\n [attr.id]=\"titleId\"\n >{{ title() }}</kf-text\n >\n <kf-button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"lg\"\n type=\"button\"\n icon=\"chevron-right\"\n [ariaLabel]=\"nextMonthLabel()\"\n [disabled]=\"!canGoNext()\"\n (click)=\"nextMonth()\"\n />\n </div>\n\n <div\n class=\"kf-calendar__grid\"\n role=\"grid\"\n [class.kf-calendar__grid--loading]=\"loading()\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-busy]=\"loading() || null\"\n >\n <div class=\"kf-calendar__row\" role=\"row\">\n @for (label of weekdayLabels(); track $index) {\n <span\n class=\"kf-calendar__weekday kf-overline-text\"\n role=\"columnheader\"\n [attr.aria-label]=\"weekdayNames()[$index]\"\n >{{ label }}</span\n >\n }\n </div>\n\n @for (week of weeks(); track week[0].iso) {\n <div class=\"kf-calendar__row\" role=\"row\">\n @for (day of week; track day.iso) {\n @if (day.inMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"kf-calendar__day\"\n [class.kf-calendar__day--selectable]=\"day.selectable\"\n [class.kf-calendar__day--selected]=\"day.selected\"\n [class.kf-calendar__day--today]=\"day.today\"\n [class.kf-calendar__day--marked]=\"day.marked\"\n [attr.data-date]=\"day.iso\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"!day.selectable\"\n [attr.aria-current]=\"day.today ? 'date' : null\"\n [attr.tabindex]=\"day.iso === activeDate() ? 0 : -1\"\n (click)=\"selectDay(day)\"\n (focus)=\"onDayFocus(day.iso)\"\n (keydown)=\"onDayKeydown($event, day.iso)\"\n >\n {{ day.day }}\n </button>\n } @else {\n <span role=\"gridcell\" class=\"kf-calendar__day kf-calendar__day--outside\">\n <span aria-hidden=\"true\">{{ day.day }}</span>\n </span>\n }\n }\n </div>\n }\n </div>\n\n <ng-content select=\"[footer]\" />\n</div>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Contenedor base con esquinas redondeadas y sombra sutil — la base visual\n * de paneles, tarjetas de métrica, tablas y bloques de contenido de todo el\n * portal (ver página 14 del design system).\n *\n * Piensa este componente como el \"cimiento\": no impone estructura interna\n * más allá de dos slots opcionales alrededor del contenido libre —\n * `[media]` para una imagen/ícono destacado arriba, y `[actions]` para una\n * fila de botones al pie, separada por una línea. El contenido por defecto\n * (sin selector) queda en el medio, sin ningún layout forzado, para que\n * cualquier composición (una métrica, una lista, un formulario) pueda vivir\n * dentro sin pelear con estilos propios del `Card`.\n *\n * `gap` controla el espacio entre los hijos directos del cuerpo — `md`\n * (default) separa bloques con peso propio (un `kf-section-header`\n * seguido de datos, por ejemplo); `xs`/`sm` para texto corrido o bloques\n * más compactos, `lg`/`xl` para composiciones con más aire entre secciones.\n *\n * <kf-card>\n * <kf-section-header title=\"Cliente\" />\n * <dl>…</dl>\n * </kf-card>\n * <kf-card gap=\"xs\">Texto corrido, sin bloques que separar</kf-card>\n * <kf-card flush>Sin sombra — para superficies ya delimitadas por otra card</kf-card>\n * <kf-card>\n * <img kf-card-media src=\"...\" alt=\"\" />\n * <h3>Título</h3>\n * <p>Descripción</p>\n * <div kf-card-actions>\n * <kf-button variant=\"ghost\">Cancelar</kf-button>\n * <kf-button>Guardar</kf-button>\n * </div>\n * </kf-card>\n *\n * `loading` (default `false`): cubre el cuerpo con un bloque de carga animado\n * sin sacar el contenido del layout (queda invisible y fuera del foco y de\n * lectores de pantalla), así la card conserva exactamente sus dimensiones. Los\n * slots `[kf-card-media]` y `[kf-card-actions]` también se ocultan. Marca el\n * host con `aria-busy=\"true\"`. Para una forma más fiel (líneas separadas) usa\n * `kf-skeleton` dentro de la card, o la card propia del dominio con su\n * `loading` (`kf-stat-card`, `kf-metric-card`).\n *\n * <kf-card [loading]=\"isLoading()\"><h3>{{ title() }}</h3><p>{{ text() }}</p></kf-card>\n */\n@Component({\n selector: 'kf-card',\n templateUrl: './Card.html',\n styleUrl: './Card.css',\n host: {\n '[class.kf-card--flush]': 'flush()',\n '[class.kf-card--loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n '[class.kf-card--gap-xs]': \"gap() === 'xs'\",\n '[class.kf-card--gap-sm]': \"gap() === 'sm'\",\n '[class.kf-card--gap-md]': \"gap() === 'md'\",\n '[class.kf-card--gap-lg]': \"gap() === 'lg'\",\n '[class.kf-card--gap-xl]': \"gap() === 'xl'\",\n },\n})\nexport class Card {\n /** Quita la sombra — para cards anidadas dentro de otra superficie ya elevada. */\n readonly flush = input(false, { transform: booleanAttribute });\n /** Espacio entre los hijos directos del cuerpo. `md` es el default. */\n readonly gap = input<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md');\n /** Cubre el cuerpo con un bloque de carga conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","<ng-content select=\"[kf-card-media]\" />\n<div\n class=\"kf-card__body\"\n [class.kf-card__body--loading]=\"loading()\"\n [class.kf-bone-overlay]=\"loading()\"\n>\n <ng-content />\n</div>\n<ng-content select=\"[kf-card-actions]\" />\n","import { Component } from '@angular/core';\n\n/**\n * Slide individual de un `kf-carousel`. Es un contenedor mínimo: solo existe\n * para que el carrusel pueda detectar, vía `contentChildren`, cuántos slides\n * se proyectaron y en qué orden — el contenido real es responsabilidad total\n * de quien lo consume.\n *\n * <kf-carousel-slide>...</kf-carousel-slide>\n */\n@Component({\n selector: 'kf-carousel-slide',\n template: `<ng-content />`,\n styleUrl: './CarouselSlide.css',\n})\nexport class CarouselSlide {}\n","import {\n AfterContentInit,\n Component,\n DestroyRef,\n contentChildren,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { CarouselSlide } from './CarouselSlide';\n\n/**\n * Carrusel de slides con flechas, dots y autoplay opcional.\n *\n * La spec original de React recibe `slides` como un array de nodos React.\n * En Angular eso no tiene equivalente directo: en vez de forzar un array de\n * datos crudos, cada slide se proyecta como contenido declarativo mediante\n * un `kf-carousel-slide` hijo, y el carrusel los detecta con\n * `contentChildren(CarouselSlide)`. Esto evita depender de un renderer de\n * nodos y deja que cada slide use plantillas Angular normales (bindings,\n * `@if`, `@for`, etc.) tal como se espera en este ecosistema.\n *\n * <kf-carousel [autoplay]=\"true\" [interval]=\"4000\" (indexChange)=\"onIndex($event)\">\n * <kf-carousel-slide>...</kf-carousel-slide>\n * <kf-carousel-slide>...</kf-carousel-slide>\n * </kf-carousel>\n */\n@Component({\n selector: 'kf-carousel',\n imports: [Icon],\n templateUrl: './Carousel.html',\n styleUrl: './Carousel.css',\n})\nexport class Carousel implements AfterContentInit {\n readonly autoplay = input(false);\n readonly interval = input(5000, { transform: numberAttribute });\n readonly indexChange = output<number>();\n\n readonly slides = contentChildren(CarouselSlide);\n\n private readonly activeIndexSignal = signal(0);\n readonly activeIndex = this.activeIndexSignal.asReadonly();\n\n private readonly destroyRef = inject(DestroyRef);\n private timer: ReturnType<typeof setInterval> | null = null;\n private autoplayPaused = false;\n\n ngAfterContentInit(): void {\n this.startAutoplay();\n this.destroyRef.onDestroy(() => this.stopAutoplay());\n }\n\n next(): void {\n const total = this.slides().length;\n if (total === 0) {\n return;\n }\n this.goTo((this.activeIndexSignal() + 1) % total);\n }\n\n previous(): void {\n const total = this.slides().length;\n if (total === 0) {\n return;\n }\n this.goTo((this.activeIndexSignal() - 1 + total) % total);\n }\n\n goTo(index: number): void {\n if (index === this.activeIndexSignal()) {\n return;\n }\n this.activeIndexSignal.set(index);\n this.indexChange.emit(index);\n }\n\n pauseAutoplay(): void {\n this.autoplayPaused = true;\n }\n\n resumeAutoplay(): void {\n this.autoplayPaused = false;\n }\n\n private startAutoplay(): void {\n if (!this.autoplay() || this.slides().length <= 1) {\n return;\n }\n this.timer = setInterval(() => {\n if (!this.autoplayPaused) {\n this.next();\n }\n }, this.interval());\n }\n\n private stopAutoplay(): void {\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","<div\n class=\"kf-carousel\"\n (mouseenter)=\"pauseAutoplay()\"\n (mouseleave)=\"resumeAutoplay()\"\n (focusin)=\"pauseAutoplay()\"\n (focusout)=\"resumeAutoplay()\"\n>\n <div class=\"kf-carousel__viewport\">\n <div class=\"kf-carousel__track\" [style.transform]=\"'translateX(-' + activeIndex() * 100 + '%)'\">\n <ng-content />\n </div>\n </div>\n\n @if (slides().length > 1) {\n <div class=\"kf-carousel__controls\">\n <div class=\"kf-carousel__dots\" role=\"tablist\">\n @for (slide of slides(); track slide; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-carousel__dot\"\n [class.kf-carousel__dot--active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"i === activeIndex()\"\n [attr.aria-label]=\"'Ir al slide ' + (i + 1)\"\n (click)=\"goTo(i)\"\n ></button>\n }\n </div>\n <button\n type=\"button\"\n class=\"kf-carousel__arrow\"\n aria-label=\"Slide anterior\"\n (click)=\"previous()\"\n >\n <kf-icon name=\"chevron-left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"kf-carousel__arrow\"\n aria-label=\"Slide siguiente\"\n (click)=\"next()\"\n >\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </button>\n </div>\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n effect,\n ElementRef,\n forwardRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Checkbox accesible con soporte de estado \"indeterminate\".\n *\n * `indeterminate` no existe como atributo HTML: el navegador solo lo expone\n * como propiedad del elemento nativo, así que se aplica a mano sobre el\n * `<input>` interno vía `viewChild` + `effect` cada vez que cambia el input.\n *\n * Implementa `ControlValueAccessor` para poder usarse con `formControlName` /\n * `ngModel` igual que un checkbox nativo. En ese modo, `writeValue` controla\n * el DOM directamente y el input `checked` (pensado para binding manual sin\n * forms) queda en su valor por defecto — igual que `disabled` combina el\n * input signal con `setDisabledState` en el resto de la librería.\n *\n * `invalid` pinta el recuadro en rojo y setea `aria-invalid` en el `<input>`\n * nativo — mismo mecanismo que `Input.invalid`, para el caso típico de un\n * checkbox obligatorio (ej. \"Acepto términos y condiciones\") sin marcar.\n *\n * <kf-checkbox label=\"Aceptar términos\" [(checked)]=\"accepted\" />\n * <kf-checkbox label=\"Seleccionar todo\" [indeterminate]=\"isPartial()\" />\n * <kf-checkbox label=\"Notificaciones\" formControlName=\"notifications\" />\n * <kf-checkbox label=\"Acepto los términos y condiciones\" [invalid]=\"submitted() && !accepted()\" />\n */\n@Component({\n selector: 'kf-checkbox',\n templateUrl: './Checkbox.html',\n styleUrl: './Checkbox.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Checkbox),\n multi: true,\n },\n ],\n})\nexport class Checkbox implements ControlValueAccessor {\n readonly label = input<string>();\n readonly checked = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Recuadro en rojo + aria-invalid — ej. checkbox obligatorio sin marcar. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n readonly checkedChange = output<boolean>();\n\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inputRef');\n\n /** Callbacks registrados por Forms; no-op hasta que registerOnChange/Touched las reemplacen. */\n private onChangeFn: (value: boolean) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n constructor() {\n // El estado \"indeterminate\" no tiene atributo HTML: hay que empujarlo\n // como propiedad DOM cada vez que cambia el input, incluyendo el\n // valor inicial del primer render.\n effect(() => {\n this.inputRef().nativeElement.indeterminate = this.indeterminate();\n });\n }\n\n onChange(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checkedChange.emit(value);\n this.onChangeFn(value);\n }\n\n onTouched(): void {\n this.onTouchedFn();\n }\n\n writeValue(value: boolean): void {\n this.inputRef().nativeElement.checked = !!value;\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.inputRef().nativeElement.disabled = isDisabled;\n }\n}\n","<label class=\"kf-checkbox\" [class.kf-checkbox--disabled]=\"disabled()\">\n <input\n #inputRef\n type=\"checkbox\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n (change)=\"onChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"kf-checkbox__box kf-checkbox-box\"\n [class.kf-checkbox__box--invalid]=\"invalid()\"\n ></span>\n @if (label()) {\n <span class=\"kf-checkbox__label\">{{ label() }}</span>\n }\n</label>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Chip de fondo suave con un punto líder que indica estado. Pensado\n * principalmente para celdas de tabla (estado de fila), pero utilizable\n * en cualquier lugar donde se necesite una etiqueta de estado compacta.\n *\n * <kf-chip tone=\"warn\">Pendiente</kf-chip>\n * <kf-chip tone=\"ok\">Aprobado</kf-chip>\n * <kf-chip [dot]=\"false\">4 Unidades</kf-chip>\n *\n * `dot` (default `true`) oculta el punto cuando el chip muestra un DATO\n * (ej. una cantidad — \"4 Unidades\") y no un ESTADO — antes forzaba a cada\n * portal a reimplementar el mismo patrón \"pill con ícono + texto sin punto\n * de estado\" a mano (visto 2-3 veces idéntico en `web-otd-frontend`:\n * `quotes-grid.html`/`quote-detail.html` para el conteo de unidades).\n *\n * Nota: la spec original define la unión de tonos como \"ok\" | \"warn\" |\n * \"error\" | \"neutral\". Internamente se mapean a los tokens semánticos de\n * projects/ui/src/tokens/base.css: ok -> success, warn -> warning,\n * error -> error, neutral -> surface/border/text-muted (no existe un\n * token \"neutral\" dedicado en base.css, así que se arma con los tokens\n * de superficie/borde/texto-muted más cercanos).\n */\n@Component({\n selector: 'kf-chip',\n templateUrl: './Chip.html',\n styleUrl: './Chip.css',\n host: {\n '[class.kf-chip--ok]': \"tone() === 'ok'\",\n '[class.kf-chip--warn]': \"tone() === 'warn'\",\n '[class.kf-chip--error]': \"tone() === 'error'\",\n '[class.kf-chip--neutral]': \"tone() === 'neutral'\",\n },\n})\nexport class Chip {\n readonly tone = input<'ok' | 'warn' | 'error' | 'neutral'>('neutral');\n readonly dot = input(true, { transform: booleanAttribute });\n}\n","@if (dot()) {\n <span\n class=\"kf-chip__dot\"\n [class.kf-chip__dot--ok]=\"tone() === 'ok'\"\n [class.kf-chip__dot--warn]=\"tone() === 'warn'\"\n [class.kf-chip__dot--error]=\"tone() === 'error'\"\n [class.kf-chip__dot--neutral]=\"tone() === 'neutral'\"\n ></span>\n}\n<span class=\"kf-chip__label\"><ng-content /></span>\n","import { Component, input, model } from '@angular/core';\n\nlet nextId = 0;\n\n/**\n * Bloque colapsable genérico: un header clickeable (título + chevron) que\n * expande/colapsa contenido proyectado libre, sin saber nada de lo que hay\n * adentro. Building block para layouts responsive donde un bloque se\n * muestra inline en desktop pero se colapsa en mobile/tablet para ahorrar\n * espacio vertical — el primer caso de uso real es un panel de filtros de\n * tabla que en desktop queda siempre abierto y en mobile arranca cerrado.\n *\n * `expanded` es two-way, mismo patrón que `Drawer.open`: el consumidor\n * decide el estado inicial y puede reaccionar a los cambios, pero el propio\n * click en el header ya alterna el estado sin que el consumidor tenga que\n * cablear un `(click)` manual.\n *\n * <kf-collapsible title=\"Filtros\" [(expanded)]=\"filtersOpen\">\n * ...\n * </kf-collapsible>\n *\n * El ícono chevron es un SVG inline fijo (no una prop `icon` configurable)\n * porque esta librería todavía no tiene un componente `Icon`/sprite\n * compartido — un solo ícono fijo no amerita esperar esa abstracción.\n */\n@Component({\n selector: 'kf-collapsible',\n templateUrl: './Collapsible.html',\n styleUrl: './Collapsible.scss',\n})\nexport class Collapsible {\n readonly title = input.required<string>();\n readonly expanded = model(false);\n\n private readonly instanceId = `kf-collapsible-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly panelId = `${this.instanceId}-panel`;\n}\n","<button\n type=\"button\"\n class=\"kf-collapsible__trigger\"\n [id]=\"triggerId\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"expanded.update((value) => !value)\"\n>\n <span class=\"kf-collapsible__title\">{{ title() }}</span>\n <svg\n class=\"kf-collapsible__chevron\"\n [class.kf-collapsible__chevron--expanded]=\"expanded()\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</button>\n<div\n class=\"kf-collapsible__panel\"\n [class.kf-collapsible__panel--expanded]=\"expanded()\"\n [id]=\"panelId\"\n role=\"region\"\n [attr.aria-labelledby]=\"triggerId\"\n>\n <div class=\"kf-collapsible__body\">\n <ng-content />\n </div>\n</div>\n","/**\n * Escucha `Escape` en fase de captura sobre `document`, antes que cualquier\n * listener de burbuja de un contenedor (`kf-drawer`, `kf-modal`).\n *\n * Un panel flotante (`kf-select`, `kf-multi-select`, `kf-dropdown`) debe\n * cerrarse primero y dejar su contenedor abierto. Un listener de burbuja no\n * basta: el orden entre dos `@HostListener('document:keydown.escape')` es el\n * de creación de los componentes — el contenedor se crea antes que su\n * contenido — así que el contenedor vería la tecla sin consumir y también se\n * cerraría. En captura el panel va siempre primero y marca la tecla con\n * `preventDefault()`, que es lo que el contenedor revisa.\n *\n * `onEscape` debe devolver `true` solo si había algo que cerrar: únicamente\n * entonces se consume la tecla. Devuelve la función que retira el listener.\n */\nexport function listenEscapeCapture(doc: Document, onEscape: () => boolean): () => void {\n const handler = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || event.defaultPrevented) {\n return;\n }\n if (onEscape()) {\n event.preventDefault();\n }\n };\n doc.addEventListener('keydown', handler, true);\n return () => doc.removeEventListener('keydown', handler, true);\n}\n","import { Component, TemplateRef, input, viewChild } from '@angular/core';\n\nexport type DropdownPanelVariant = 'solid' | 'dark';\n\n/** Rol del contenedor del panel: `menu` (ítems de acción) o `dialog` (contenido de formulario o informativo). */\nexport type DropdownPanelRole = 'menu' | 'dialog';\n\nlet nextPanelId = 0;\n\n/**\n * Contenido del panel flotante de un `kf-dropdown`. Es solo una plantilla\n * (`<ng-template>`, capturada vía `TemplateRef`) — `Dropdown` la conecta al\n * overlay real cuando `open` pasa a `true`, no la renderiza en su propio\n * lugar del DOM. Esto permite que el panel aparezca pegado al host de\n * `Dropdown` sin importar dónde esté ese host en la página.\n *\n * `variant`: `'solid'` (default, fondo blanco) o `'dark'` (fondo sólido\n * oscuro, mismo tono que `[kf-drawer-header]`) para cuando el trigger vive\n * sobre una superficie oscura de marca.\n *\n * `dark` es sólida a propósito, no semitransparente: el CDK Overlay\n * reposiciona el panel según dónde entra en el viewport y puede terminar\n * cayendo sobre fondo blanco en vez de sobre el rail oscuro — un color\n * sólido se ve intencional sin importar dónde lo posicione el CDK.\n *\n * `role`: `'menu'` (default) cuando el contenido son `kf-dropdown-item`;\n * `'dialog'` cuando lleva campos de formulario, selects, casillas o texto\n * libre — un `role=\"menu\"` solo admite ítems de menú como hijos. Un panel\n * `dialog` necesita nombre: pasar `ariaLabel`.\n *\n * <kf-dropdown-panel role=\"dialog\" ariaLabel=\"Filtros\">…</kf-dropdown-panel>\n */\n@Component({\n selector: 'kf-dropdown-panel',\n templateUrl: './DropdownPanel.html',\n styleUrl: './DropdownPanel.css',\n // `role` es también un atributo nativo: escrito estático, Angular lo dejaría\n // además en el host (un diálogo vacío para los lectores de pantalla).\n host: { '[attr.role]': 'null' },\n})\nexport class DropdownPanel {\n readonly variant = input<DropdownPanelVariant>('solid');\n readonly role = input<DropdownPanelRole>('menu');\n /** Nombre accesible del panel (obligatorio en la práctica con `role=\"dialog\"`). */\n readonly ariaLabel = input<string>();\n /** `id` del contenedor con el rol; el disparador lo referencia con `aria-controls`. */\n readonly panelId = `kf-dropdown-panel-${nextPanelId++}`;\n readonly templateRef = viewChild.required(TemplateRef);\n}\n","<ng-template>\n <div class=\"kf-dropdown-panel\" [class.kf-dropdown-panel--dark]=\"variant() === 'dark'\">\n <div\n class=\"kf-dropdown-panel__inner\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.role]=\"role()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n >\n <ng-content />\n </div>\n </div>\n</ng-template>\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n booleanAttribute,\n contentChild,\n effect,\n inject,\n input,\n model,\n untracked,\n ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { DropdownPanel } from './DropdownPanel';\n\nconst FOCUSABLE_SELECTOR =\n 'button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Menú de acciones flotante, conectado a un elemento disparador vía\n * `@angular/cdk/overlay` — la misma pieza que usa Angular Material para\n * `mat-menu`/`mat-select`. El disparador real puede vivir en OTRO\n * componente por completo (ej. el avatar dentro de `kf-portal-header`), y\n * el panel aparece pegado a ESE elemento sin importar dónde el consumidor\n * ubique al `Dropdown` en su HTML.\n *\n * `open` es two-way: el consumidor decide qué dispara la apertura —\n * `Dropdown` en sí no renderiza ningún trigger, su propio host es el punto\n * de anclaje visual del panel.\n *\n * <kf-dropdown [(open)]=\"menuOpen\"><kf-dropdown-panel>...</kf-dropdown-panel></kf-dropdown>\n *\n * Accesibilidad. Disparador: el primer control enfocable del `anchor` (o del\n * propio host) recibe `aria-haspopup` (`menu` o `dialog`, según el `role` del\n * panel), `aria-expanded` y, con el panel abierto, `aria-controls`; un atributo\n * que el consumidor ya declaró nunca se pisa. Foco: el panel vive en un overlay\n * al final del `body`, así que al abrir el foco pasa al primer elemento\n * enfocable del panel (`autoFocus`, default `true`; solo si el foco estaba en\n * el disparador, para no robarlo cuando algo abre el panel por código), y al\n * cerrar vuelve al disparador si estaba dentro del panel (Escape, elegir una\n * acción, aplicar). Un clic afuera no devuelve el foco: ya se fue a donde se\n * hizo clic. Con `role=\"menu\"` las flechas, Home y End recorren los ítems. Tab\n * desde el último (o Shift+Tab desde el primero) cierra el panel y continúa la\n * tabulación desde el disparador.\n */\n@Component({\n selector: 'kf-dropdown',\n template: `<ng-content />`,\n styleUrl: './Dropdown.css',\n})\nexport class Dropdown {\n /** Visibilidad del panel, two-way: `[(open)]=\"menuOpen\"`. */\n readonly open = model(false);\n\n /**\n * Elemento al que se conecta el overlay, si es distinto del propio host\n * de `Dropdown`. Sin esto, `Dropdown` asume que ÉL MISMO es el\n * disparador. Útil cuando el disparador real vive dentro de OTRO\n * componente que no se puede envolver sin ensanchar el área de click\n * (ej. el avatar de sesión dentro de `PortalHeader`).\n */\n readonly anchor = input<ElementRef<HTMLElement>>();\n\n /**\n * Mueve el foco al primer elemento enfocable del panel al abrirlo. Poner\n * `false` si el contenido ya gestiona su propio foco inicial.\n */\n readonly autoFocus = input(true, { transform: booleanAttribute });\n\n private readonly panel = contentChild(DropdownPanel);\n\n private readonly overlayService = inject(Overlay);\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n\n /** Atributos ARIA que este componente puso en el disparador (y por tanto retira él). */\n private readonly ownedTriggerAttributes = new Map<HTMLElement, Set<string>>();\n\n private overlayRef: OverlayRef | null = null;\n\n /**\n * Suscripciones a `outsidePointerEvents()`/`keydownEvents()` del overlay\n * ACTUALMENTE adjunto. `getOrCreateOverlayRef()` reutiliza el mismo\n * `overlayRef` entre aperturas (no lo recrea cada vez), así que se\n * cancelan explícitamente en `detach()` antes de la siguiente `attach()`\n * — de lo contrario se acumularían N suscripciones activas sobre el\n * mismo overlay persistente.\n */\n private overlaySubscription: Subscription | null = null;\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.attach();\n } else {\n this.detach();\n }\n });\n\n effect(() => {\n const open = this.open();\n const panel = this.panel();\n untracked(() => this.syncTriggerAria(open, panel));\n });\n\n const stopEscape = listenEscapeCapture(this.document, () => this.onDocumentEscape());\n this.destroyRef.onDestroy(() => {\n stopEscape();\n this.overlaySubscription?.unsubscribe();\n this.overlayRef?.dispose();\n this.releaseTriggerAria();\n });\n }\n\n /**\n * Respaldo de `overlayRef.keydownEvents()`: ese observable del CDK solo\n * ve teclas con el foco DENTRO del panel. Si el foco queda en el botón\n * disparador (caso común), `keydownEvents()` nunca dispara — este\n * listener a nivel de documento cubre ese caso. Va en fase de captura\n * (ver `listenEscapeCapture`) y consume la tecla solo si había un menú\n * abierto, así un `kf-drawer`/`kf-modal` contenedor no se cierra con el\n * mismo Escape. Devuelve si cerró algo.\n */\n onDocumentEscape(): boolean {\n if (!this.open()) {\n return false;\n }\n this.open.set(false);\n return true;\n }\n\n private attach(): void {\n const panel = this.panel();\n if (!panel || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreateOverlayRef();\n const portal = new TemplatePortal(panel.templateRef(), this.viewContainerRef);\n overlayRef.attach(portal);\n\n this.overlaySubscription = new Subscription();\n this.overlaySubscription.add(\n overlayRef.outsidePointerEvents().subscribe((event) => {\n if (this.isEventOnTrigger(event)) {\n return;\n }\n this.open.set(false);\n }),\n );\n this.overlaySubscription.add(\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.open.set(false);\n return;\n }\n this.onPanelKeydown(event, overlayRef.overlayElement);\n }),\n );\n\n if (this.autoFocus() && this.isFocusOnTrigger()) {\n afterNextRender(() => this.focusFirstInPanel(overlayRef.overlayElement), {\n injector: this.injector,\n });\n }\n }\n\n /** Flechas/Home/End entre ítems (solo `role=\"menu\"`) y salida con Tab en los extremos. */\n private onPanelKeydown(event: KeyboardEvent, pane: HTMLElement): void {\n const focusables = this.focusableIn(pane);\n const active = this.document.activeElement as HTMLElement | null;\n const index = active ? focusables.indexOf(active) : -1;\n\n if (event.key === 'Tab') {\n const leaving = event.shiftKey ? index <= 0 : index === focusables.length - 1;\n if (leaving) {\n // Sin preventDefault: la tabulación nativa sigue desde el disparador.\n this.triggerElement()?.focus();\n this.open.set(false);\n }\n return;\n }\n\n if (this.panel()?.role() !== 'menu' || focusables.length === 0) {\n return;\n }\n const last = focusables.length - 1;\n let target = -1;\n switch (event.key) {\n case 'ArrowDown':\n target = index >= last ? 0 : index + 1;\n break;\n case 'ArrowUp':\n target = index <= 0 ? last : index - 1;\n break;\n case 'Home':\n target = 0;\n break;\n case 'End':\n target = last;\n break;\n }\n if (target >= 0) {\n event.preventDefault();\n focusables[target].focus();\n }\n }\n\n private focusFirstInPanel(pane: HTMLElement): void {\n const first = this.focusableIn(pane)[0];\n (first ?? pane.querySelector<HTMLElement>('.kf-dropdown-panel__inner'))?.focus();\n }\n\n private focusableIn(pane: HTMLElement): HTMLElement[] {\n return Array.from(pane.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (element) => element.checkVisibility?.() ?? true,\n );\n }\n\n private isFocusOnTrigger(): boolean {\n const active = this.document.activeElement;\n const trigger = this.anchor()?.nativeElement ?? this.host.nativeElement;\n return !!active && trigger.contains(active);\n }\n\n /**\n * Control que abre el panel: el propio `anchor`/host si ya es enfocable, o\n * su primer descendiente enfocable (ej. el `<button>` dentro de `kf-button`).\n */\n private triggerElement(): HTMLElement | null {\n const root: HTMLElement = this.anchor()?.nativeElement ?? this.host.nativeElement;\n if (root.matches(FOCUSABLE_SELECTOR)) {\n return root;\n }\n return root.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n }\n\n private syncTriggerAria(open: boolean, panel: DropdownPanel | undefined): void {\n const trigger = this.triggerElement();\n if (!trigger || !panel) {\n return;\n }\n this.setOwnedAttribute(trigger, 'aria-haspopup', panel.role());\n this.setOwnedAttribute(trigger, 'aria-expanded', String(open));\n if (open) {\n this.setOwnedAttribute(trigger, 'aria-controls', panel.panelId);\n } else {\n this.removeOwnedAttribute(trigger, 'aria-controls');\n }\n }\n\n /** Escribe el atributo solo si no es del consumidor (ausente, o ya puesto por este componente). */\n private setOwnedAttribute(element: HTMLElement, name: string, value: string): void {\n const owned = this.ownedTriggerAttributes.get(element) ?? new Set<string>();\n if (element.hasAttribute(name) && !owned.has(name)) {\n return;\n }\n element.setAttribute(name, value);\n owned.add(name);\n this.ownedTriggerAttributes.set(element, owned);\n }\n\n private removeOwnedAttribute(element: HTMLElement, name: string): void {\n if (this.ownedTriggerAttributes.get(element)?.delete(name)) {\n element.removeAttribute(name);\n }\n }\n\n private releaseTriggerAria(): void {\n for (const [element, names] of this.ownedTriggerAttributes) {\n names.forEach((name) => element.removeAttribute(name));\n }\n this.ownedTriggerAttributes.clear();\n }\n\n /**\n * El trigger real (el `anchor`, o el propio host si no se pasó ninguno —\n * ver comentario de la clase) vive FUERA del overlay a propósito: el\n * overlay recién se crea/adjunta cuando `open` pasa a `true`, así que el\n * CDK no tiene forma de saber que ese elemento externo \"es parte\" de su\n * disparador. Sin este filtro, el mismo `pointerdown` que abre el menú\n * también llega a `outsidePointerEvents()`, cerrando el panel en el\n * mismo gesto que lo abrió.\n */\n private isEventOnTrigger(event: MouseEvent | TouchEvent): boolean {\n const trigger = this.anchor()?.nativeElement ?? this.host.nativeElement;\n const target = event.target;\n return target instanceof Node && trigger.contains(target);\n }\n\n private detach(): void {\n this.overlaySubscription?.unsubscribe();\n this.overlaySubscription = null;\n if (this.overlayRef?.hasAttached()) {\n // Antes de desmontar el panel: si no, el elemento enfocado desaparece y el foco cae al `body`.\n const pane = this.overlayRef.overlayElement;\n const active = this.document.activeElement;\n if (active && pane.contains(active)) {\n this.triggerElement()?.focus();\n }\n }\n this.overlayRef?.detach();\n }\n\n private getOrCreateOverlayRef(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.anchor() ?? this.host)\n // 4 posiciones, no 2: además del par alineado al borde derecho del\n // anchor, agrega el mismo par alineado al borde IZQUIERDO — sin esto,\n // un trigger cerca del borde derecho de pantalla no tenía fallback\n // horizontal y el panel se salía del viewport.\n .withPositions([\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', 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: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n ])\n .withViewportMargin(8)\n // Si ninguna de las 4 posiciones entra completa, la última se ajusta\n // con push en vez de desbordarse fuera de pantalla.\n .withPush(true);\n\n this.overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { Dropdown } from '../dropdown/Dropdown';\nimport { DropdownPanel } from '../dropdown/DropdownPanel';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Popover de \"Datos de contacto\" de una persona (asesor, ejecutivo — nombre\n * genérico a propósito, sin lógica de negocio de ninguna pantalla concreta\n * adentro). Cada canal (`whatsapp`/`phone`/`email`) se muestra SOLO si\n * viene con dato — nunca los 3 fijos — y si ninguno viene, un estado vacío\n * explícito en vez de un panel a medio llenar. Mismo criterio que ya\n * resolvía `sitio-privado-one-way-frontend` (repo hermano de Chile) para\n * el asesor de taller, ahora como pieza compartida del design system.\n *\n * <kf-contact-popover\n * [name]=\"advisor.name\"\n * [whatsapp]=\"advisor.whatsapp\"\n * [phone]=\"advisor.phone\"\n * [email]=\"advisor.email\"\n * />\n */\n@Component({\n selector: 'kf-contact-popover',\n imports: [Dropdown, DropdownPanel, Icon],\n templateUrl: './ContactPopover.html',\n styleUrl: './ContactPopover.css',\n})\nexport class ContactPopover {\n readonly name = input.required<string>();\n readonly title = input('Datos de contacto');\n readonly whatsapp = input<string | null>(null);\n readonly phone = input<string | null>(null);\n readonly email = input<string | null>(null);\n\n protected readonly open = signal(false);\n\n protected readonly whatsappHref = computed(() => {\n const digits = (this.whatsapp() ?? '').replace(/[^\\d]/g, '');\n return digits.length > 0 ? `https://wa.me/${digits}` : null;\n });\n\n protected readonly phoneHref = computed(() => {\n const trimmed = (this.phone() ?? '').trim();\n return trimmed.length > 0 ? `tel:${trimmed}` : null;\n });\n\n protected readonly emailHref = computed(() => {\n const trimmed = (this.email() ?? '').trim();\n return trimmed.length > 0 ? `mailto:${trimmed}` : null;\n });\n\n protected readonly hasContactMethods = computed(\n () => this.whatsappHref() !== null || this.phoneHref() !== null || this.emailHref() !== null,\n );\n\n protected onToggle(): void {\n this.open.update((value) => !value);\n }\n\n protected onClose(): void {\n this.open.set(false);\n }\n}\n","<kf-dropdown class=\"kf-contact-popover\" [(open)]=\"open\">\n <button\n type=\"button\"\n class=\"kf-contact-popover__trigger\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"onToggle()\"\n >\n {{ name() }}\n <kf-icon name=\"chevron-down\" size=\"sm\" [rotate]=\"open() ? 180 : 0\" />\n </button>\n <kf-dropdown-panel role=\"dialog\" [ariaLabel]=\"title()\">\n <div class=\"kf-contact-popover__header\">\n <span class=\"kf-contact-popover__title\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"kf-contact-popover__close\"\n aria-label=\"Cerrar\"\n (click)=\"onClose()\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n </div>\n <hr class=\"kf-contact-popover__hr\" />\n @if (hasContactMethods()) {\n @if (whatsappHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"whatsappHref()!\">\n <kf-icon name=\"message-circle\" size=\"sm\" />\n WhatsApp\n </a>\n }\n @if (phoneHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"phoneHref()!\">\n <kf-icon name=\"phone\" size=\"sm\" />\n Teléfono\n </a>\n }\n @if (emailHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"emailHref()!\">\n <kf-icon name=\"mail\" size=\"sm\" />\n Correo\n </a>\n }\n } @else {\n <div class=\"kf-contact-popover__empty\">\n <kf-icon name=\"alert-circle\" size=\"sm\" />\n No registra datos de contacto\n </div>\n }\n </kf-dropdown-panel>\n</kf-dropdown>\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Marcador genérico para contenido aún por definir (página 38) — comunica\n * \"contenido disponible para uso\" sin parecer un error, a diferencia de\n * `kf-empty-state` (que comunica ausencia real de datos del usuario).\n * Pensado para secciones del portal que un negocio todavía no completó.\n *\n * `compact` reduce el tamaño de la imagen placeholder y omite el badge de\n * pie (segunda variante de la página 38, sin la etiqueta \"Contenido\n * disponible para uso\" al final).\n *\n * <kf-content-slot title=\"Contenido disponible\"\n * description=\"Espacio reservado para contenido de Divemotor Perú. Disponible para uso.\" />\n * <kf-content-slot compact icon=\"star\" title=\"Contenido disponible\"\n * description=\"Espacio reservado para contenido de Divemotor Perú.\" />\n */\n@Component({\n selector: 'kf-content-slot',\n imports: [Icon, Text],\n templateUrl: './ContentSlot.html',\n styleUrl: './ContentSlot.css',\n host: {\n '[class.kf-content-slot--compact]': 'compact()',\n },\n})\nexport class ContentSlot {\n readonly title = input('Contenido disponible');\n readonly description = input<string>();\n readonly icon = input<IconName>('layers');\n readonly compact = input(false, { transform: booleanAttribute });\n}\n","<div class=\"kf-content-slot__media\">\n <kf-icon [name]=\"icon()\" [size]=\"compact() ? 'md' : 'lg'\" />\n</div>\n<span class=\"kf-content-slot__title\">{{ title() }}</span>\n@if (description()) {\n <p class=\"kf-content-slot__description\">{{ description() }}</p>\n}\n@if (!compact()) {\n <span class=\"kf-content-slot__footer\">\n <kf-text as=\"span\" variant=\"overline\">Contenido disponible para uso</kf-text>\n </span>\n}\n","import { Component, computed, input } from '@angular/core';\nimport { Icon, IconName, IconSize } from '../icon/Icon';\n\n/** Tono del estado. `warn`/`info` solo cambian el chip del ícono. */\nexport type EmptyStateTone = 'neutral' | 'error' | 'warn' | 'info';\n\n/**\n * Placeholder para una sección sin contenido. Dos tonos, con anatomía\n * distinta (páginas 27-28 del design system, que los trata como piezas\n * separadas — \"Error State\" no es una variante de color de \"Empty State\",\n * es un estado semánticamente distinto):\n *\n * - `neutral` (default): \"cero resultados\" — cuadro con borde punteado\n * discreto, para listas vacías o búsquedas sin coincidencias. No es un\n * error, es la ausencia normal de datos.\n * - `error`: fallo real de carga — sin borde punteado, con un ícono de\n * alerta más prominente y texto en el tono de error. Pensado para usarse\n * junto a un botón \"Reintentar\" en el slot por defecto.\n *\n * <kf-empty-state>No se encontraron resultados.</kf-empty-state>\n * <kf-empty-state icon=\"search\">Sin coincidencias para tu búsqueda.</kf-empty-state>\n * <kf-empty-state tone=\"error\" icon=\"alert-triangle\">\n * No pudimos cargar tus vehículos\n * <kf-button (click)=\"retry()\">Reintentar</kf-button>\n * </kf-empty-state>\n *\n * ## Variante `card`\n * Tarjeta centrada (fondo blanco, borde, sombra, ancho máximo 480px) para\n * un estado que REEMPLAZA a un contenido grande — ej. un iframe que no\n * cargó o un documento que aún no existe. Ícono en un círculo tonal de\n * 56px según `tone` (`warn`, `info`, `error` o `neutral`), `title` como\n * título, el contenido proyectado como texto (puede incluir una lista de\n * pasos) y `[kf-empty-state-actions]` para los botones. Los roles\n * (`role=\"alert\"` para un error) los pone el consumidor en el host: no\n * todo estado de esta forma debe interrumpir al lector de pantalla.\n *\n * <kf-empty-state variant=\"card\" tone=\"warn\" icon=\"alert-triangle\"\n * title=\"No pudimos cargar la propuesta\" role=\"alert\">\n * <p>Este contenido solo está disponible dentro de la red de la empresa.</p>\n * <ol>…pasos…</ol>\n * <div kf-empty-state-actions>\n * <kf-button (click)=\"retry()\">Reintentar</kf-button>\n * </div>\n * </kf-empty-state>\n *\n * `[kf-empty-state-footer]` va DESPUÉS de las acciones, para pistas y\n * metadatos debajo de los botones (\"¿Ya estás conectado? …\", \"Intento 2 ·\n * 10:42\"). Vacío, no ocupa lugar.\n *\n * `title` se dibuja como texto destacado, no como encabezado (`<h*>`): el\n * nivel de encabezado depende de la página que lo contiene, y un estado\n * vacío no debe alterar su estructura.\n */\n@Component({\n selector: 'kf-empty-state',\n imports: [Icon],\n templateUrl: './EmptyState.html',\n styleUrl: './EmptyState.css',\n host: {\n '[class.kf-empty-state--error]': \"tone() === 'error'\",\n '[class.kf-empty-state--warn]': \"tone() === 'warn'\",\n '[class.kf-empty-state--info]': \"tone() === 'info'\",\n '[class.kf-empty-state--card]': \"variant() === 'card'\",\n // `title` es un input con nombre de atributo nativo: escrito estático,\n // Angular también lo dejaría en el host como tooltip sobre todo el bloque.\n '[attr.title]': 'null',\n },\n})\nexport class EmptyState {\n readonly icon = input<IconName | undefined>(undefined);\n /** `neutral` (default): cero resultados. `error`: fallo real de carga. `warn`/`info`: tiñen el chip del ícono. */\n readonly tone = input<EmptyStateTone>('neutral');\n /** `inline` (default, histórico) o `card` (tarjeta centrada). Ver JSDoc de la clase. */\n readonly variant = input<'inline' | 'card'>('inline');\n /** Título destacado sobre el contenido. Opcional en ambas variantes. */\n readonly title = input<string>();\n\n protected readonly iconSize = computed<IconSize>(() =>\n this.variant() === 'card' || this.tone() === 'error' ? 'lg' : 'md',\n );\n}\n","@if (icon(); as iconName) {\n <span class=\"kf-empty-state__icon\">\n <kf-icon [name]=\"iconName\" [size]=\"iconSize()\" />\n </span>\n}\n@if (title(); as titleText) {\n <p class=\"kf-empty-state__title\">{{ titleText }}</p>\n}\n<div class=\"kf-empty-state__content\">\n <ng-content />\n</div>\n<div class=\"kf-empty-state__actions\"><ng-content select=\"[kf-empty-state-actions]\" /></div>\n<div class=\"kf-empty-state__footer\"><ng-content select=\"[kf-empty-state-footer]\" /></div>\n","import { Component, input } from '@angular/core';\n\n/** Forma del placeholder. */\nexport type SkeletonVariant = 'text' | 'circle' | 'rect';\n\n/**\n * Bloque placeholder con shimmer para contenido que todavía carga: una línea\n * de texto, un avatar o un área de card/imagen, según `variant`.\n *\n * Es decorativo (`aria-hidden`): quien lo usa debería marcar el contenedor con\n * `aria-busy=\"true\"` mientras carga, así el lector de pantalla anuncia el\n * estado una vez en vez de leer N placeholders vacíos.\n *\n * `circle` usa `aspect-ratio`, así que alcanza con darle `width`.\n *\n * <kf-skeleton />\n * <kf-skeleton variant=\"circle\" width=\"40px\" />\n * <kf-skeleton variant=\"rect\" width=\"100%\" height=\"120px\" />\n */\n@Component({\n selector: 'kf-skeleton',\n templateUrl: './Skeleton.html',\n styleUrl: './Skeleton.css',\n})\nexport class Skeleton {\n readonly variant = input<SkeletonVariant>('text');\n /** Ancho CSS. Default `'100%'`. */\n readonly width = input('100%');\n /** Alto CSS. Vacío deja el alto/aspect-ratio propio de la variante. */\n readonly height = input('');\n}\n","<span\n class=\"kf-skeleton\"\n [class]=\"'kf-skeleton--' + variant()\"\n aria-hidden=\"true\"\n [style.width]=\"width()\"\n [style.height]=\"height() || null\"\n></span>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Label superior compartido por todos los campos de formulario del design\n * system (páginas 11-12: Text Field, Select, Multiselect) — uppercase,\n * chico, gris, con letter-spacing amplio. El PDF fija un único tratamiento\n * (\"PATENTE O VIN\", \"SUCURSAL\", \"SUCURSALES\" usan exactamente el mismo\n * estilo), así que este componente es la única fuente de verdad: antes vivía\n * copiado por separado en `Input`, `Select`, `SelectMenu` y `MultiSelect`,\n * y dos de esas copias ya habían divergido del estilo real del PDF.\n *\n * No reemplaza al `<label>` nativo — lo envuelve, para no perder la\n * asociación de accesibilidad `for`/`id` con el control real.\n *\n * `required` agrega un asterisco visual en el tono de error, separado del\n * texto por un espacio y marcado `aria-hidden` — el estado obligatorio real\n * para lectores de pantalla lo comunica el propio control (`aria-required`\n * / `required` en el `<input>`/`<select>` asociado), no este label.\n *\n * <kf-field-label [for]=\"inputId\">Patente o VIN</kf-field-label>\n * <kf-field-label [for]=\"inputId\" required>Correo electrónico</kf-field-label>\n *\n * `visuallyHidden` deja el texto solo para lectores de pantalla: el `<label\n * for>` sigue nombrando el control sin ocupar espacio.\n */\n@Component({\n selector: 'kf-field-label',\n templateUrl: './FieldLabel.html',\n styleUrl: './FieldLabel.css',\n})\nexport class FieldLabel {\n /** `id` del control asociado — se refleja como `for` en el `<label>` interno. */\n readonly for = input<string>();\n /** Muestra un asterisco visual indicando que el campo es obligatorio. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Oculta el texto a la vista pero lo conserva como nombre accesible del control. */\n readonly visuallyHidden = input(false, { transform: booleanAttribute });\n}\n","<label class=\"kf-field-label\" [class.kf-field-label--sr-only]=\"visuallyHidden()\" [for]=\"for()\">\n <ng-content />\n @if (required()) {\n <span class=\"kf-field-label__required\" aria-hidden=\"true\">*</span>\n }\n</label>\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport type { ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';\n\n/**\n * Overlay flotante conectado a un trigger de ancho variable — usado por\n * `kf-select`, `kf-multi-select` (y con lógica equivalente propia,\n * `kf-dropdown`, cuyo trigger puede vivir fuera del propio host).\n *\n * Encapsula: 4 posiciones con fallback (abajo/arriba × izquierda/derecha),\n * el overlay se remide al ancho del trigger en cada apertura (no solo la\n * creación, para no desincronizarse si el trigger cambia de tamaño), y el\n * filtro de `outsidePointerEvents()` que evita que un click en el trigger\n * para CERRAR el panel lo vuelva a abrir en el mismo gesto (ese pointerdown\n * llega a `outsidePointerEvents()` en fase de captura, antes que al\n * `(click)` del propio trigger).\n */\nexport class SelectOverlay {\n private overlayRef: OverlayRef | null = null;\n\n constructor(\n private readonly overlayService: Overlay,\n private readonly viewContainerRef: ViewContainerRef,\n private readonly triggerRef: () => ElementRef<HTMLElement>,\n /**\n * Ancho mínimo del panel, independiente del trigger — necesario para\n * un trigger angosto por diseño (ej. `kf-select` en `variant=\"compact\"`,\n * \"10\" + caret ≈ 45px): sin esto, el panel hereda ESE mismo ancho\n * microscópico y cada opción queda apretada contra el borde. Un\n * trigger normal (240px fijo) ya es más ancho que cualquier\n * `minWidth` razonable, así que este parámetro no le cambia nada.\n */\n private readonly minWidth: () => number = () => 0,\n /**\n * `'match'` (default): el panel mide exactamente el ancho del trigger.\n * `'content'`: el trigger es solo el piso y el panel crece hasta el\n * ancho natural de sus opciones (con techo `maxWidth: 90vw`) — para un\n * trigger compacto de barra de herramientas (\"Más recientes\") cuyas\n * opciones son más largas (\"Más recientes primero\") y no deben\n * truncarse.\n */\n private readonly sizing: () => 'match' | 'content' = () => 'match',\n ) {}\n\n attach(panelTemplate: TemplateRef<unknown>, onClose: () => void): void {\n if (this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreate();\n overlayRef.updateSize(this.resolveSize());\n\n const portal = new TemplatePortal(panelTemplate, this.viewContainerRef);\n overlayRef.attach(portal);\n\n overlayRef.outsidePointerEvents().subscribe((event) => {\n const target = event.target as Node | null;\n if (target && this.triggerRef().nativeElement.contains(target)) {\n return;\n }\n onClose();\n });\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n onClose();\n }\n });\n }\n\n detach(): void {\n this.overlayRef?.detach();\n }\n\n dispose(): void {\n this.overlayRef?.dispose();\n }\n\n private getOrCreate(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.triggerRef())\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withViewportMargin(8)\n .withPush(true);\n\n this.overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n ...this.resolveSize(),\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n\n private resolveSize(): { width?: number; minWidth?: number } {\n const width = this.resolveWidth();\n // `undefined` (no omitir la clave): `updateSize` mezcla con la config\n // previa, y solo una clave presente con `undefined` limpia el estilo.\n return this.sizing() === 'content'\n ? { width: undefined, minWidth: width }\n : { width, minWidth: undefined };\n }\n\n private resolveWidth(): number {\n return Math.max(this.triggerRef().nativeElement.getBoundingClientRect().width, this.minWidth());\n }\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { normalizeForSearch } from '@kaufmann-lab/ui/shared';\nimport { Badge } from '../badge/Badge';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon, IconName } from '../icon/Icon';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { SelectOverlay } from '../shared/select-overlay';\n\n/**\n * Opción en forma de objeto. `tag` se muestra como `kf-badge` a la derecha\n * del label (en el panel y en el trigger) y `detail` como línea secundaria\n * atenuada debajo, solo en el panel. Ambos entran en la búsqueda.\n * `shortLabel` reemplaza al label SOLO en el trigger (ej. panel \"Más\n * recientes primero\", trigger \"Más recientes\") — para triggers compactos\n * donde el label completo se truncaría.\n */\nexport interface SelectOption {\n value: string;\n label: string;\n tag?: string;\n detail?: string;\n shortLabel?: string;\n}\n\nlet nextId = 0;\n\n/** Ancho mínimo del panel flotante en `variant=\"compact\"` — el trigger de\n * ese modo puede medir menos de 45px (ej. \"10\" + caret), y sin este piso\n * la opción quedaría apretada contra ese mismo ancho angosto. 72px es lo\n * que necesita una opción de 2-3 dígitos con el padding compacto del\n * panel (ver `.kf-select--compact .kf-select__option` en Select.css) —\n * no 120px, pensado para el trigger normal (`variant=\"field\"`), que\n * dejaba el panel de \"Filas\" visiblemente más ancho que el propio\n * trigger que lo abre. */\nconst COMPACT_PANEL_MIN_WIDTH = 72;\n\n/** Pausa tras la cual lo tecleado deja de acumularse para la búsqueda por prefijo. */\nconst TYPEAHEAD_RESET_MS = 500;\n\n/**\n * Dropdown de selección simple con panel propio — NUNCA usa el `<select>`\n * nativo del navegador. Un `<select>` real siempre delega el popup de\n * opciones al sistema operativo, y ningún CSS puede controlar cómo se ve\n * ese popup.\n *\n * El panel flotante se conecta al trigger vía `@angular/cdk/overlay` — el\n * mismo mecanismo que `Dropdown` (ver `../dropdown/Dropdown.ts`).\n *\n * <kf-select label=\"Sede\" [options]=\"['Lima', 'Arequipa', 'Trujillo']\" placeholder=\"Selecciona…\" />\n * <kf-select [options]=\"[{ value: 'pe', label: 'Perú' }]\" (valueChange)=\"onCountry($event)\" />\n * <kf-select [options]=\"[{ value: '1002099', label: 'BBVA', tag: 'Empresa', detail: 'RUC 20100130204' }]\" />\n *\n * `variant=\"compact\"` cambia el ancho de `240px` fijo a intrínseco con un\n * techo de `160px` (se ajusta al contenido de la opción seleccionada hasta\n * ese máximo, truncando con ellipsis si no entra) y reduce padding/tamaño de\n * fuente — pensado para selectores cortos embebidos en una barra (ej. \"Filas\n * por página\" en el footer de `kf-data-table`), nunca para un campo de\n * formulario largo, que sigue usando el `variant=\"field\"` por defecto. El\n * panel flotante siempre mide el ancho real del trigger en cada apertura\n * (`SelectOverlay.attach`), así que se angosta solo sin cambios adicionales.\n *\n * <kf-select variant=\"compact\" [options]=\"['5', '10', '25']\" [value]=\"pageSize()\" (valueChange)=\"...\" />\n *\n * `width=\"full\"` ocupa el 100% del contenedor — para selects dentro de\n * layouts flex/grid donde el ancho fijo de `md` no encaja.\n *\n * <kf-select width=\"full\" [options]=\"branches\" [value]=\"branch()\" (valueChange)=\"...\" />\n *\n * Control de orden de una barra de herramientas (ícono + valor + caret, sin\n * label visible): `icon` agrega un glifo `sm` a la izquierda del valor,\n * `ariaLabel` da el nombre accesible (el trigger se anuncia como\n * `\"<ariaLabel>: <valor actual>\"`), `panelTitle` agrega un título chico en\n * mayúsculas dentro del panel (decorativo, `aria-hidden`) y\n * `panelWidth=\"content\"` deja que el panel crezca hasta el ancho de sus\n * opciones en vez de truncarlas al ancho del trigger compacto.\n *\n * <kf-select variant=\"compact\" icon=\"sort\" ariaLabel=\"Ordenar por\"\n * panelTitle=\"Ordenar por\" panelWidth=\"content\"\n * [options]=\"sortOptions\" [value]=\"sort()\" (valueChange)=\"sort.set($event)\" />\n *\n * Teclado (patrón listbox de WAI-ARIA): ArrowDown/ArrowUp sobre el trigger\n * cerrado lo abren; al abrir, el foco pasa a la opción seleccionada (o al\n * buscador, si está visible). En el panel, flechas y Home/End mueven el\n * foco, Enter/Espacio eligen, Escape cierra y devuelve el foco al trigger,\n * y Tab cierra el panel y continúa la tabulación desde el trigger. Las\n * opciones nunca son paradas de Tab (`tabindex=\"-1\"`). Home/End sobre el\n * trigger cerrado lo abren en la primera/última opción, y teclear letras\n * (con el panel abierto o cerrado, sin buscador) salta a la opción cuyo\n * label empieza con lo tecleado; repetir la misma letra recorre las que\n * empiezan igual.\n */\n@Component({\n selector: 'kf-select',\n imports: [Badge, FieldLabel, Icon],\n templateUrl: './Select.html',\n styleUrl: './Select.css',\n host: {\n '[class.kf-select--compact]': \"variant() === 'compact'\",\n '[class.kf-select--width-sm]': \"width() === 'sm'\",\n '[class.kf-select--width-lg]': \"width() === 'lg'\",\n '[class.kf-select--width-full]': \"width() === 'full'\",\n },\n})\nexport class Select {\n readonly label = input<string>();\n /**\n * Oculta el `label` a la vista y lo deja como nombre accesible (`<label\n * for>`): para un control cuyo valor se explica solo (ej. un rango de\n * fechas), sin tener que ocultar la etiqueta con CSS desde afuera.\n */\n readonly hideLabel = input(false, { transform: booleanAttribute });\n /**\n * Texto corto visible dentro del trigger, antes del valor (ej. `Rango:\n * Últimos 30 días`), para un select compacto que no lleva etiqueta\n * encima. Forma parte del nombre accesible del botón: no combinarlo con\n * `label`/`ariaLabel`, que reemplazarían ese nombre.\n */\n readonly prefix = input<string>();\n readonly options = input.required<readonly (string | SelectOption)[]>();\n readonly value = input<string>();\n readonly placeholder = input<string>('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Borde en rojo y `aria-invalid` en el trigger. Ver `errorMessage` para el mensaje asociado — mismo contrato que `kf-input`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"`, debajo del trigger. */\n readonly errorMessage = input<string>();\n readonly variant = input<'field' | 'compact'>('field');\n /**\n * Ancho del control. 'md' (240px) es el default histórico y preserva el\n * comportamiento actual sin cambios para consumidores existentes.\n * 'full' ocupa el 100% del contenedor — para selects dentro de layouts\n * flex/grid donde el ancho fijo no encaja (ej. un footer de sidebar).\n */\n readonly width = input<'sm' | 'md' | 'lg' | 'full'>('md');\n /**\n * Tri-state: si el consumidor no lo especifica (`undefined`), el buscador\n * se activa solo cuando `options().length` supera `searchThreshold()`. Si\n * el consumidor define `true`/`false` explícitamente, ese valor manda por\n * sobre el umbral automático.\n */\n readonly searchable = input<boolean | undefined>(undefined);\n readonly searchThreshold = input<number>(7);\n /**\n * Nombre accesible del control cuando no hay `label` visible (ej. \"Ordenar\n * por\"). El trigger se anuncia como `\"<ariaLabel>: <valor visible>\"` (el\n * mismo texto que muestra el trigger, `shortLabel` si la opción lo trae),\n * así el nombre contiene el texto visible (WCAG 2.5.3) y además dice qué se\n * está eligiendo. Ignorado si hay `label`: un `aria-label` pisaría al\n * `<label for>` visible.\n */\n readonly ariaLabel = input<string>();\n /** Ícono `sm` a la izquierda del valor en el trigger (ej. `'sort'`). */\n readonly icon = input<IconName>();\n /** Título chico en mayúsculas dentro del panel, sobre las opciones. Decorativo (`aria-hidden`): el nombre del listbox ya lo da `ariaLabel`/`label`. */\n readonly panelTitle = input<string>();\n /**\n * `'trigger'` (default): el panel mide lo mismo que el trigger.\n * `'content'`: el trigger es el ancho mínimo y el panel crece hasta el\n * ancho de la opción más larga — para triggers compactos cuyas opciones\n * son más largas que el valor resumido.\n */\n readonly panelWidth = input<'trigger' | 'content'>('trigger');\n\n readonly valueChange = output<string>();\n\n private readonly instanceId = `kf-select-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly listboxId = `${this.instanceId}-listbox`;\n readonly errorId = `${this.instanceId}-error`;\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeIndex = signal(0);\n\n /** Resolves `string | SelectOption` entries into a single shape for the template. */\n readonly normalizedOptions = computed<SelectOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n readonly selectedOption = computed(() =>\n this.normalizedOptions().find((option) => option.value === this.value()),\n );\n\n /** Texto que muestra el trigger: `shortLabel` o `label` de la opción elegida, o el placeholder. */\n readonly triggerText = computed(() => {\n const option = this.selectedOption();\n return option?.shortLabel ?? option?.label ?? this.placeholder();\n });\n\n /**\n * `aria-label` del trigger: solo con `ariaLabel` y SIN `label` visible. Un\n * `aria-label` tiene prioridad sobre el `<label for>` en el cálculo del\n * nombre accesible, así que con label visible no se emite.\n */\n readonly triggerAriaLabel = computed(() => {\n const name = this.ariaLabel();\n if (!name || this.label()) {\n return null;\n }\n return `${name}: ${this.triggerText()}`;\n });\n\n readonly showSearch = computed(\n () => this.searchable() ?? this.normalizedOptions().length > this.searchThreshold(),\n );\n\n /** Opciones visibles tras aplicar el filtro de búsqueda (case/acento-insensitive). */\n readonly filteredOptions = computed<SelectOption[]>(() => {\n const query = normalizeForSearch(this.searchQuery().trim());\n if (!query) {\n return this.normalizedOptions();\n }\n return this.normalizedOptions().filter((option) =>\n [option.label, option.tag, option.detail].some(\n (text) => !!text && normalizeForSearch(text).includes(query),\n ),\n );\n });\n\n private readonly triggerRef = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly panelTemplate = viewChild.required<TemplateRef<unknown>>('panelTemplate');\n private readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly document = inject(DOCUMENT);\n\n private typeaheadBuffer = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | undefined;\n\n private readonly overlay = new SelectOverlay(\n inject(Overlay),\n inject(ViewContainerRef),\n () => this.triggerRef(),\n () => (this.variant() === 'compact' ? COMPACT_PANEL_MIN_WIDTH : 0),\n () => (this.panelWidth() === 'content' ? 'content' : 'match'),\n );\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.overlay.attach(this.panelTemplate(), () => this.close());\n } else {\n this.overlay.detach();\n this.searchQuery.set('');\n this.activeIndex.set(0);\n }\n });\n\n // Autofocus del buscador al abrir. afterNextRender() NO puede invocarse\n // dentro de un effect() (NG0203: pierde el contexto de inyección) — hay\n // que usar afterRenderEffect(), que sí es reactivo a signals y corre\n // después de que Angular actualizó el DOM del panel recién adjuntado.\n //\n // Sin buscador, el foco pasa a la opción activa (la seleccionada, ver\n // `open()`): `activeIndex` se lee `untracked` para que mover el índice\n // con el mouse (`mouseenter`) no robe el foco en cada render.\n afterRenderEffect(() => {\n if (!this.isOpen()) {\n return;\n }\n if (this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n return;\n }\n if (this.panelRef()) {\n untracked(() => this.focusOption(this.activeIndex()));\n }\n });\n\n const stopEscape = listenEscapeCapture(this.document, () => this.onDocumentEscape());\n inject(DestroyRef).onDestroy(() => {\n stopEscape();\n clearTimeout(this.typeaheadTimer);\n this.overlay.dispose();\n });\n }\n\n /**\n * Escape con el panel abierto, escuchado en fase de captura sobre\n * `document` (ver `listenEscapeCapture`). Respaldo de\n * `overlayRef.keydownEvents()`: ese observable del CDK solo ve teclas\n * presionadas con el foco DENTRO del pane del overlay; si el foco sigue en\n * el trigger (o en cualquier otro lado) mientras el panel está abierto,\n * nunca dispara. Consume la tecla (`preventDefault`) solo si había un\n * panel que cerrar, así un `kf-drawer`/`kf-modal` que contenga al select\n * no se cierra con el mismo Escape. Devuelve si cerró algo.\n */\n onDocumentEscape(): boolean {\n if (!this.isOpen()) {\n return false;\n }\n this.close();\n return true;\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Abre el panel con la opción seleccionada como activa (o la primera). */\n open(): void {\n if (this.disabled() || this.isOpen()) {\n return;\n }\n const selectedIndex = this.filteredOptions().findIndex(\n (option) => option.value === this.value(),\n );\n this.activeIndex.set(Math.max(selectedIndex, 0));\n this.isOpen.set(true);\n }\n\n /**\n * Cierra el panel. `restoreFocus` (default: solo si el foco está dentro\n * del panel) devuelve el foco al trigger ANTES de desmontar el panel —\n * si no, el elemento enfocado desaparece y el foco cae al `<body>`. Un\n * click afuera no lo restaura: el foco ya se fue a donde se hizo click.\n */\n close(restoreFocus = this.isFocusInPanel()): void {\n if (!this.isOpen()) {\n return;\n }\n if (restoreFocus) {\n this.triggerRef().nativeElement.focus();\n }\n this.isOpen.set(false);\n }\n\n /**\n * Con el panel cerrado: ArrowDown/ArrowUp lo abren en la opción activa,\n * Home/End en la primera/última, y una letra lo abre en la opción que\n * empieza con ella (patrón listbox).\n */\n onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isOpen() || this.disabled()) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n this.open();\n return;\n case 'Home':\n event.preventDefault();\n this.open();\n this.activeIndex.set(0);\n return;\n case 'End':\n event.preventDefault();\n this.open();\n this.activeIndex.set(this.filteredOptions().length - 1);\n return;\n }\n if (this.isTypeaheadKey(event)) {\n const selectedIndex = this.filteredOptions().findIndex(\n (option) => option.value === this.value(),\n );\n const match = this.findTypeaheadMatch(event.key, selectedIndex);\n if (match >= 0) {\n event.preventDefault();\n this.open();\n this.activeIndex.set(match);\n }\n }\n }\n\n /**\n * Teclado con el foco en una opción del panel. Las flechas parten SIEMPRE\n * de la opción que recibió el evento (`index`), no de `activeIndex`: el\n * `mouseenter` mueve `activeIndex` sin mover el foco, y sin esto, con el\n * foco en la opción 1 y el mouse sobre la 4, ArrowDown saltaría a la 5.\n */\n onOptionKeydown(event: KeyboardEvent, option: SelectOption, index: number): void {\n this.activeIndex.set(index);\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n this.focusOption(this.activeIndex());\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n this.focusOption(this.activeIndex());\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n this.focusOption(0);\n this.scrollActiveIntoView();\n break;\n case 'End': {\n event.preventDefault();\n const last = this.filteredOptions().length - 1;\n this.activeIndex.set(last);\n this.focusOption(last);\n this.scrollActiveIntoView();\n break;\n }\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.select(option);\n break;\n default:\n if (this.isTypeaheadKey(event)) {\n const match = this.findTypeaheadMatch(event.key, index);\n if (match >= 0) {\n event.preventDefault();\n this.activeIndex.set(match);\n this.focusOption(match);\n this.scrollActiveIntoView();\n }\n return;\n }\n this.handleExitKeys(event);\n }\n }\n\n /** Un carácter imprimible sin modificadores, y solo cuando no hay buscador (ahí la tecla filtra). */\n private isTypeaheadKey(event: KeyboardEvent): boolean {\n return (\n !this.showSearch() &&\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n );\n }\n\n /**\n * Índice de la opción cuyo label empieza con lo tecleado, o -1. Una sola\n * letra (o la misma repetida) busca desde la opción SIGUIENTE a `from`, para\n * recorrer las que empiezan igual; un prefijo más largo busca desde `from`\n * inclusive, para que la opción actual se conserve mientras siga coincidiendo.\n */\n private findTypeaheadMatch(char: string, from: number): number {\n this.typeaheadBuffer += normalizeForSearch(char);\n clearTimeout(this.typeaheadTimer);\n this.typeaheadTimer = setTimeout(() => (this.typeaheadBuffer = ''), TYPEAHEAD_RESET_MS);\n\n const options = this.filteredOptions();\n const buffer = this.typeaheadBuffer;\n const repeated = [...buffer].every((letter) => letter === buffer[0]);\n const prefix = repeated ? buffer[0] : buffer;\n const start = repeated ? from + 1 : Math.max(from, 0);\n for (let offset = 0; offset < options.length; offset++) {\n const index = (start + offset) % options.length;\n if (normalizeForSearch(options[index].label).startsWith(prefix)) {\n return index;\n }\n }\n return -1;\n }\n\n /** Teclas de salida del buscador: Escape y Tab, igual que desde una opción. */\n onSearchKeydown(event: KeyboardEvent): void {\n this.handleExitKeys(event);\n }\n\n /**\n * Escape cierra y devuelve el foco al trigger; `preventDefault` le avisa a\n * un contenedor que también escucha Escape (ej. `kf-drawer`) que la tecla\n * ya se consumió. Tab cierra y mueve el foco al trigger SIN\n * `preventDefault`: la tabulación nativa continúa desde el trigger, así\n * Tab/Shift+Tab salen del panel hacia el control siguiente/anterior.\n */\n private handleExitKeys(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close(true);\n } else if (event.key === 'Tab') {\n this.close(true);\n }\n }\n\n private focusOption(index: number): void {\n const options =\n this.panelRef()?.nativeElement.querySelectorAll<HTMLElement>('.kf-select__option');\n options?.[index]?.focus();\n }\n\n private isFocusInPanel(): boolean {\n const active = this.document.activeElement;\n const panel = this.panelRef()?.nativeElement;\n return !!active && !!panel && panel.contains(active);\n }\n\n /** Id de cada opción, para `aria-activedescendant` del buscador. */\n optionId(index: number): string {\n return `${this.listboxId}-option-${index}`;\n }\n\n /** Nombre accesible explícito solo para opciones con `tag`/`detail`, para separar las partes al leerlas. */\n optionAriaLabel(option: SelectOption): string | null {\n if (!option.tag && !option.detail) {\n return null;\n }\n return [option.label, option.tag, option.detail].filter(Boolean).join(', ');\n }\n\n select(option: SelectOption): void {\n this.close(true);\n if (option.value !== this.value()) {\n this.valueChange.emit(option.value);\n }\n }\n\n onSearchInput(event: Event): void {\n this.searchQuery.set((event.target as HTMLInputElement).value);\n // Cada cambio de filtro vuelve a arrancar la navegación desde arriba.\n this.activeIndex.set(0);\n }\n\n /**\n * Mueve `activeIndex` sobre las opciones YA FILTRADAS visibles. Clamp\n * simple (sin wraparound): llegar al final o al principio de la lista se\n * queda ahí en vez de dar la vuelta — es el comportamiento más predecible\n * cuando se combina con un buscador que puede reducir la lista a 1 opción.\n */\n moveActive(delta: number): void {\n const count = this.filteredOptions().length;\n if (count === 0) {\n return;\n }\n this.activeIndex.update((current) => Math.min(Math.max(current + delta, 0), count - 1));\n this.scrollActiveIntoView();\n }\n\n /**\n * Con el foco en el buscador, la opción activa se marca con\n * `aria-activedescendant` pero no recibe foco, así que el navegador no la\n * desplaza a la vista: se hace a mano. (`scrollIntoView` puede no existir\n * en entornos sin layout.)\n */\n private scrollActiveIntoView(): void {\n const option =\n this.panelRef()?.nativeElement.querySelectorAll<HTMLElement>('.kf-select__option')[\n this.activeIndex()\n ];\n option?.scrollIntoView?.({ block: 'nearest' });\n }\n\n selectActive(): void {\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.select(option);\n }\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"triggerId\" [visuallyHidden]=\"hideLabel()\">{{ label() }}</kf-field-label>\n}\n<button\n #trigger\n type=\"button\"\n [id]=\"triggerId\"\n class=\"kf-select__trigger\"\n [class.kf-select__trigger--disabled]=\"disabled()\"\n [class.kf-select__trigger--invalid]=\"invalid()\"\n [class.kf-select__trigger--with-icon]=\"!!icon()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? listboxId : null\"\n [attr.aria-label]=\"triggerAriaLabel()\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [class.kf-select__trigger--tagged]=\"!!selectedOption()?.tag\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-select__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n @if (prefix(); as prefixText) {\n <span class=\"kf-select__prefix\">{{ prefixText }}</span>\n }\n <span class=\"kf-select__value\" [class.kf-select__value--placeholder]=\"!selectedOption()\">\n {{ triggerText() }}\n </span>\n @if (selectedOption()?.tag; as tag) {\n <kf-badge class=\"kf-select__tag\">{{ tag }}</kf-badge>\n }\n <span\n class=\"kf-select__caret kf-caret\"\n [class.kf-select__caret--open]=\"isOpen()\"\n [class.kf-caret--open]=\"isOpen()\"\n aria-hidden=\"true\"\n ></span>\n</button>\n@if (errorMessage(); as message) {\n <span class=\"kf-select__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n}\n<ng-template #panelTemplate>\n <div #panel class=\"kf-select__panel\" [class.kf-select__panel--compact]=\"variant() === 'compact'\">\n @if (panelTitle(); as title) {\n <div class=\"kf-select__panel-title kf-overline-text\" aria-hidden=\"true\">{{ title }}</div>\n }\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-select__search\"\n placeholder=\"Buscar…\"\n aria-label=\"Buscar opción\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"filteredOptions().length ? optionId(activeIndex()) : null\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n (keydown.enter)=\"$event.preventDefault(); selectActive()\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n }\n <ul\n class=\"kf-select__list\"\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabel() ? null : triggerId\"\n >\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-select__option\"\n [id]=\"optionId(i)\"\n [class.kf-select__option--selected]=\"option.value === value()\"\n [class.kf-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"-1\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.aria-label]=\"optionAriaLabel(option)\"\n [class.kf-select__option--rich]=\"!!(option.tag || option.detail)\"\n (click)=\"select(option)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown)=\"onOptionKeydown($event, option, i)\"\n >\n @if (option.tag || option.detail) {\n <span class=\"kf-select__option-main\">\n <span class=\"kf-select__option-label\">{{ option.label }}</span>\n @if (option.tag) {\n <kf-badge class=\"kf-select__tag\">{{ option.tag }}</kf-badge>\n }\n </span>\n @if (option.detail) {\n <span class=\"kf-select__option-detail\">{{ option.detail }}</span>\n }\n } @else {\n {{ option.label }}\n }\n </li>\n } @empty {\n <li class=\"kf-select__empty\">\n {{ searchQuery() ? 'Sin resultados' : 'Sin opciones disponibles' }}\n </li>\n }\n </ul>\n </div>\n</ng-template>\n","import { Component, computed, input, model, output } from '@angular/core';\nimport { Select } from '../select/Select';\n\n/** Un número de página clickeable o un separador \"…\" no interactivo. */\nexport type PaginationItem = { type: 'page'; page: number } | { type: 'ellipsis' };\n\nconst SIBLINGS = 1;\n\n/**\n * Paginador numerado con elipsis + prev/next.\n *\n * Algoritmo de elipsis estándar: siempre se muestran la primera página, la\n * última, la página actual y un par de vecinas alrededor de la actual; el\n * resto de los huecos se colapsa en un separador \"…\". Cuando el hueco entre\n * dos números visibles es de exactamente una página, se muestra ese número\n * en vez de un \"…\" (no tiene sentido colapsar un solo elemento).\n *\n * El contenido proyectado (`<ng-content>`) es para el texto informativo\n * opcional (ej. \"21–40 de 273\"), a la izquierda de los controles.\n *\n * <kf-pagination [page]=\"page\" [pages]=\"totalPages\" (pageChange)=\"page = $event\">\n * 21–40 de 273\n * </kf-pagination>\n *\n * Con `pageSizeOptions`, agrega un select de \"N por página\" entre el texto\n * informativo y los controles de navegación — el consumidor decide el\n * tamaño real vía `pageSize`/`pageSizeChange` (two-way opcional, ninguno de\n * los dos es requerido si no se usa el selector):\n *\n * <kf-pagination [page]=\"page\" [pages]=\"totalPages\" (pageChange)=\"page = $event\"\n * [pageSizeOptions]=\"[10, 25, 50]\" [(pageSize)]=\"pageSize\">\n * 21–40 de 273\n * </kf-pagination>\n */\n@Component({\n selector: 'kf-pagination',\n imports: [Select],\n templateUrl: './Pagination.html',\n styleUrl: './Pagination.css',\n})\nexport class Pagination {\n readonly page = input(1);\n readonly pages = input(1);\n readonly pageChange = output<number>();\n\n /** Opciones del selector \"N por página\" — sin esto, el selector no se\n * renderiza (mismo criterio que `[footer]`/`[actions]` de otros\n * componentes: ausente por default, nunca forzado). `kf-select` en\n * `variant=\"compact\"` no impone un máximo de opciones, a diferencia de\n * `kf-segmented` (pensado solo para 2-3). */\n readonly pageSizeOptions = input<number[]>([]);\n readonly pageSize = model<number | null>(null);\n\n /** Lista de números de página y separadores a renderizar, ya resuelta por el algoritmo de elipsis. */\n readonly items = computed<PaginationItem[]>(() =>\n buildPaginationItems(this.page(), this.pages()),\n );\n\n /** Con una sola página (o ninguna), el `<nav>` de prev/next+números no\n * aporta nada navegable — antes se dejaba en el DOM igual (oculto solo\n * por un hack `::ng-deep` del consumidor, ver `route-assistance-monorepo`)\n * y el footer quedaba con el selector \"Filas\" descoordinado, como si le\n * faltara una pieza. Sacar el `<nav>` del DOM (no `display:none`) resuelve\n * esto para cualquier consumidor de `kf-pagination`, no solo para quien ya\n * tenía el hack. El `divider` reusa el mismo criterio: sin `nav` no hay\n * nada del otro lado que separar, así que tampoco corresponde dejarlo. */\n protected readonly hasNav = computed(() => this.pages() > 1);\n\n /** `kf-select` trabaja con `value: string` — cada tamaño numérico se\n * mapea a su representación en texto, ida y vuelta. */\n protected readonly pageSizeSelectOptions = computed<string[]>(() =>\n this.pageSizeOptions().map(String),\n );\n protected readonly pageSizeValue = computed(() => String(this.pageSize() ?? ''));\n\n protected setPageSize(value: string): void {\n this.pageSize.set(Number(value));\n }\n\n goTo(target: number): void {\n const clamped = Math.min(Math.max(target, 1), this.pages());\n if (clamped === this.page()) {\n return;\n }\n this.pageChange.emit(clamped);\n }\n}\n\n/**\n * Construye la lista de items visibles con el algoritmo de elipsis estándar:\n * primera página, última página, actual ± `SIBLINGS`, y un \"…\" por cada hueco\n * mayor a una página entre esos bloques.\n */\nfunction buildPaginationItems(current: number, total: number): PaginationItem[] {\n const totalPages = Math.max(total, 1);\n const safeCurrent = Math.min(Math.max(current, 1), totalPages);\n\n const visible = new Set<number>([1, totalPages, safeCurrent]);\n for (let offset = 1; offset <= SIBLINGS; offset++) {\n visible.add(safeCurrent - offset);\n visible.add(safeCurrent + offset);\n }\n\n const sortedPages = [...visible].filter((p) => p >= 1 && p <= totalPages).sort((a, b) => a - b);\n\n const items: PaginationItem[] = [];\n for (let i = 0; i < sortedPages.length; i++) {\n const pageNumber = sortedPages[i];\n if (i > 0) {\n const gap = pageNumber - sortedPages[i - 1];\n if (gap === 2) {\n // Hueco de una sola página: mostrarla en vez de colapsarla en \"…\".\n items.push({ type: 'page', page: pageNumber - 1 });\n } else if (gap > 2) {\n items.push({ type: 'ellipsis' });\n }\n }\n items.push({ type: 'page', page: pageNumber });\n }\n\n return items;\n}\n","<div class=\"kf-pagination\">\n <div class=\"kf-pagination__info kf-caption-text\" aria-live=\"polite\">\n <ng-content />\n </div>\n\n <div class=\"kf-pagination__controls\">\n @if (pageSizeOptions().length > 0) {\n <div class=\"kf-pagination__size\">\n <span class=\"kf-pagination__size-label kf-caption-text\">Filas</span>\n <kf-select\n variant=\"compact\"\n ariaLabel=\"Filas por página\"\n [options]=\"pageSizeSelectOptions()\"\n [value]=\"pageSizeValue()\"\n (valueChange)=\"setPageSize($event)\"\n />\n </div>\n @if (hasNav()) {\n <div class=\"kf-pagination__divider\" aria-hidden=\"true\"></div>\n }\n }\n\n @if (hasNav()) {\n <nav class=\"kf-pagination__nav\" aria-label=\"Paginación\">\n <button\n type=\"button\"\n class=\"kf-pagination__control\"\n [disabled]=\"page() <= 1\"\n aria-label=\"Página anterior\"\n (click)=\"goTo(page() - 1)\"\n >\n ‹\n </button>\n\n @for (item of items(); track $index) {\n @if (item.type === 'page') {\n <button\n type=\"button\"\n class=\"kf-pagination__page\"\n [class.kf-pagination__page--active]=\"item.page === page()\"\n [attr.aria-current]=\"item.page === page() ? 'page' : null\"\n [attr.aria-label]=\"'Ir a la página ' + item.page\"\n (click)=\"goTo(item.page)\"\n >\n {{ item.page }}\n </button>\n } @else {\n <span class=\"kf-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n }\n }\n\n <button\n type=\"button\"\n class=\"kf-pagination__control\"\n [disabled]=\"page() >= pages()\"\n aria-label=\"Página siguiente\"\n (click)=\"goTo(page() + 1)\"\n >\n ›\n </button>\n </nav>\n }\n </div>\n</div>\n","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport type ViewToggleOption = 'table' | 'cards';\n\n/**\n * Switch de dos posiciones para alternar entre vista de tabla y vista de\n * tarjetas. Pensado para usarse dentro de DataTable, pero es standalone e\n * independiente: no asume nada sobre el componente que lo contiene.\n *\n * Se implementa como un grupo de radio (role=\"radiogroup\") en vez de dos\n * botones sueltos: semánticamente es una única selección excluyente entre\n * dos estados, no dos acciones independientes. Esto también habilita\n * navegación con flechas izquierda/derecha, igual que un <input type=\"radio\">\n * nativo agrupado.\n *\n * Con `iconOnly` cada opción muestra solo su ícono (`list` / `grid`); el\n * nombre accesible y el tooltip salen de `tableLabel` / `cardsLabel`. El\n * objetivo táctil mide 32px en escritorio y 44px en pantallas táctiles o de\n * hasta 640px.\n *\n * <kf-view-toggle [view]=\"view\" (viewChange)=\"view = $event\" />\n * <kf-view-toggle iconOnly [view]=\"view\" (viewChange)=\"view = $event\" />\n */\n@Component({\n selector: 'kf-view-toggle',\n imports: [Icon],\n templateUrl: './ViewToggle.html',\n styleUrl: './ViewToggle.css',\n})\nexport class ViewToggle {\n readonly view = input.required<ViewToggleOption>();\n /** Solo íconos (el rótulo queda como nombre accesible y `title`). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n /** Rótulo de la opción de tabla. */\n readonly tableLabel = input('Tabla');\n /** Rótulo de la opción de tarjetas. */\n readonly cardsLabel = input('Tarjetas');\n /** Nombre accesible del grupo. */\n readonly ariaLabel = input('Alternar tipo de vista');\n readonly viewChange = output<ViewToggleOption>();\n\n select(next: ViewToggleOption): void {\n if (next === this.view()) {\n return;\n }\n this.viewChange.emit(next);\n }\n\n /** Navegación estándar de ARIA radiogroup: flechas mueven foco y seleccionan. */\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\n return;\n }\n\n event.preventDefault();\n const next: ViewToggleOption = this.view() === 'table' ? 'cards' : 'table';\n this.select(next);\n\n const current = event.currentTarget as HTMLElement;\n const buttons =\n current.parentElement?.querySelectorAll<HTMLButtonElement>('.kf-view-toggle__option');\n const nextButton = Array.from(buttons ?? []).find((button) => button !== current);\n nextButton?.focus();\n }\n}\n","<div class=\"kf-view-toggle\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--icon]=\"iconOnly()\"\n [class.kf-view-toggle__option--active]=\"view() === 'table'\"\n [attr.aria-checked]=\"view() === 'table'\"\n [attr.aria-label]=\"iconOnly() ? tableLabel() : null\"\n [attr.title]=\"iconOnly() ? tableLabel() : null\"\n [attr.tabindex]=\"view() === 'table' ? 0 : -1\"\n (click)=\"select('table')\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (iconOnly()) {\n <kf-icon name=\"list\" size=\"md\" />\n } @else {\n {{ tableLabel() }}\n }\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--icon]=\"iconOnly()\"\n [class.kf-view-toggle__option--active]=\"view() === 'cards'\"\n [attr.aria-checked]=\"view() === 'cards'\"\n [attr.aria-label]=\"iconOnly() ? cardsLabel() : null\"\n [attr.title]=\"iconOnly() ? cardsLabel() : null\"\n [attr.tabindex]=\"view() === 'cards' ? 0 : -1\"\n (click)=\"select('cards')\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (iconOnly()) {\n <kf-icon name=\"layout-grid\" size=\"md\" />\n } @else {\n {{ cardsLabel() }}\n }\n </button>\n</div>\n","import {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Icon } from '../icon/Icon';\nimport { Pagination } from '../pagination/Pagination';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { ViewToggle } from '../view-toggle/ViewToggle';\n\n/**\n * Zona que ocupa la columna en la vista de cards. La vista de tabla ignora\n * esto (salvo `media`, que igual se rinde como thumbnail en vez de imprimir\n * la URL):\n * - `media`: thumbnail a la izquierda del encabezado; el valor de la celda se\n * usa como `src` salvo que la columna traiga su `cellTemplates`.\n * - `title`: título del encabezado (ej. la patente/unidad).\n * - `status`: chip/estado al lado del título.\n * - `field` (default): par label/valor en el cuerpo. Con `cardClamp`, el\n * valor ocupa el ancho completo (sin label visible) recortado a N líneas.\n * - `meta`: dato secundario corto (fecha, monto) en una fila inferior de la\n * tarjeta, rótulo chico arriba y valor abajo; con `emphasis` se destaca\n * (ej. el precio) y se alinea al final.\n * - `action`: va al pie, separado del cuerpo por una línea.\n */\nexport type DataTableCardRole = 'media' | 'title' | 'status' | 'field' | 'meta' | 'action';\n\nexport interface DataTableColumn {\n key: string;\n label: string;\n right?: boolean;\n className?: string;\n cardRole?: DataTableCardRole;\n /** Habilita ordenar por esta columna clickeando su header (solo vista\n * tabla — en cards no hay header clickeable). Ciclo asc → desc → sin\n * orden, un click a la vez. */\n sortable?: boolean;\n /** Fija la columna a un borde del scroll horizontal — típicamente la\n * primera (identificador) y/o la última (acciones). Columnas `sticky`\n * del mismo lado deben ser consecutivas y estar en ese extremo del\n * array `columns`; el offset de cada una se calcula sumando el ancho\n * real de las que ya quedaron fijas antes, medido en runtime (no hay\n * forma de conocer el ancho de antemano, las columnas son de ancho\n * variable según su contenido). */\n sticky?: 'left' | 'right';\n /** Ancho mínimo forzado — evita que una columna angosta (ej. un chip\n * corto) se comprima más de la cuenta cuando hay poco espacio y otras\n * columnas compiten por él. */\n minWidth?: string;\n /** Ancho fijo de la columna (ej. `'56px'` para una columna de acciones\n * solo ícono, `'9rem'` para una fecha). En la tabla va como `width` de la\n * celda; en `kf-quote-picker` (`modalLayout=\"list\"`), como el ancho de su\n * pista en la grilla. */\n width?: string;\n /** Techo de ancho. En la tabla, junto con `truncate`, reemplaza al\n * techo automático (ver `truncate`). En una tabla con `grow` admite\n * unidades de contenedor relativas al ancho de la tabla, ej.\n * `'min(14rem, 22cqw)'`: el techo baja solo cuando la tabla es angosta. */\n maxWidth?: string;\n /** Peso con el que la columna se reparte TODO el espacio sobrante de la\n * tabla (ej. `1`; con dos columnas `grow: 2` y `grow: 1`, la primera\n * recibe el doble). Con al menos una columna `grow` la tabla pasa a\n * reparto de anchos: las columnas con `width` mantienen ese ancho, las que\n * no traen `width` ni `grow` se ajustan a su contenido (con `maxWidth` como\n * techo) y las `grow` absorben el resto. Se combina con `truncate` para\n * que el texto largo ocupe el espacio sin empujar a las demás. Sin ninguna\n * columna `grow`, el reparto es el de siempre. */\n grow?: number;\n /** Texto largo en UNA línea con elipsis y el valor completo en `title`\n * (ej. el modelo de un vehículo). La columna deja de imponer su ancho\n * mínimo: cede espacio para que las demás (y la de acciones) entren en\n * pantalla sin scroll horizontal. Con `maxWidth`, se corta en ese ancho. */\n truncate?: boolean;\n /** Alineación horizontal. `'end'` equivale a `right: true` (que se\n * mantiene por compatibilidad). */\n align?: 'start' | 'center' | 'end';\n /** Oculta el rótulo del encabezado a la vista (queda para lectores de\n * pantalla) — ej. una columna de acciones solo ícono. */\n hideLabel?: boolean;\n /** Valor en tipografía monoespaciada (ej. un identificador \"COT-2026-0042\"),\n * en la celda de la tabla y como título de la tarjeta. */\n mono?: boolean;\n /** Vista tarjetas, columna `field`: el valor va a ancho completo (rótulo\n * solo para lectores de pantalla), recortado a este número de líneas con\n * el texto completo en `title` — ej. el modelo del vehículo con `2`. */\n cardClamp?: number;\n /** Destaca el valor (peso y color de tinta) — ej. el monto. En la vista\n * tarjetas, una columna `meta` con `emphasis` va al final de su fila. */\n emphasis?: boolean;\n /** Celda interactiva: su contenido (texto, `cellTemplates` o `render`) se\n * renderiza dentro de un `<button type=\"button\">` real —enfocable con Tab,\n * con foco visible y activable con Enter o Espacio—, tanto en la vista de\n * tabla como en la de tarjetas. Al activarla emite `cellClick`\n * (`{ row, column, index }`) y NO emite `rowClick`. El contenido de un\n * `cellTemplates` en una columna interactiva debe ser fraseo no interactivo\n * (texto, íconos, indicadores): un enlace o botón dentro de otro botón es\n * HTML inválido. El nombre accesible sale del contenido o, si no alcanza\n * (un indicador sin texto), de `cellAriaLabel`. */\n interactive?: boolean;\n}\n\n/** Payload de `cellClick`: la fila, la columna interactiva y el índice de la fila renderizada. */\nexport interface DataTableCellClick<T = unknown> {\n row: T;\n column: DataTableColumn;\n index: number;\n}\n\n/** Controles cuyo clic/Enter NO debe activar además la fila o tarjeta que los contiene. */\nconst INTERACTIVE_CONTROL_SELECTOR =\n 'a[href], button, input, select, textarea, summary, label, [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"tab\"], [contenteditable=\"true\"]';\n\n/** Piso de ancho de una columna `grow` que no declara `minWidth` ni `width`. */\nconst GROW_MIN_WIDTH = '8rem';\n\n/** Tope de filas (o tarjetas) esqueleto: con `loading`, una página de 50 no pinta 50. */\nexport const DATA_TABLE_MAX_SKELETON_ROWS = 12;\n\n/** Vistas disponibles cuando `cardable` está activo. */\nexport type DataTableView = 'table' | 'cards';\n\n/** Opciones de \"filas por página\" estándar del portal — 10 como default\n * cubre bien tanto un dataset chico (ej. Beneficios) como uno con volumen\n * real (ej. 30+ cuotas en Billing), sin sentirse vacío ni insuficiente; 25\n * y 50 escalan ~2.5x cada paso, evitando un salto brusco donde la opción\n * del medio no aporta nada. Cualquier consumidor puede pisar este default\n * con su propio `pageSizeOptions` si su caso lo justifica — pasar `[]`\n * explícitamente desactiva el selector aunque `pageSize` esté activo. */\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n/** Densidad de fila: `comfortable` (default, el padding actual) o\n * `compact` (menos padding vertical, para tablas con muchas filas donde\n * priorizar cantidad visible sobre aire entre filas). */\nexport type DataTableDensity = 'comfortable' | 'compact';\n\n/** `key:direction` — mismo formato que `sort` de `kf-quote-picker`, para\n * que un consumidor que ya conoce ese patrón no aprenda uno nuevo acá. */\nexport type DataTableSort = `${string}:${'asc' | 'desc'}`;\n\n/**\n * Tabla estandarizada con soporte opcional de toggle tabla/cards.\n *\n * El \"render\" custom por columna de la spec original (una función que\n * devuelve JSX) se resuelve acá de dos formas, de la más simple a la más\n * flexible:\n * - `render`: función `(row) => string` para el caso típico de mostrar un\n * valor derivado/formateado de la fila como texto plano.\n * - `cellTemplates`: mapa `key -> TemplateRef` para cuando un consumidor\n * necesita marcado real dentro de una celda (badges, links, botones). Se\n * proyecta con `ngTemplateOutlet` y recibe `{ $implicit: row, index }`.\n * Se eligió esta combinación en vez de content-projection por columna\n * (ng-content con selector) porque las columnas son dinámicas (vienen de\n * `columns()`), y `ngTemplateOutlet` es el mecanismo estándar de Angular\n * para \"insertar esta plantilla por cada fila de este array\".\n *\n * En la vista de cards, `cardRole` por columna reparte el contenido en zonas\n * — encabezado (thumbnail + título + estado), cuerpo (pares label/valor) y\n * pie separado por una línea para las acciones. Sin `cardRole`, todas las\n * columnas caen en el cuerpo, igual que antes.\n *\n * El toggle tabla/cards es `kf-view-toggle`, componente standalone propio.\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" (rowClick)=\"onRowClick($event)\">\n * <kf-empty-state empty>No hay resultados para mostrar.</kf-empty-state>\n * </kf-data-table>\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [cardable]=\"true\" defaultView=\"cards\" />\n *\n * Loading nativo: con `loading` en `true`, la tabla se reemplaza por un\n * placeholder (`kf-skeleton` por celda/card) — `skeletonRows` filas si se\n * pasa; si no, las de `pageSize`, o 5 si no hay paginación activa. Nunca más\n * de 12 (`DATA_TABLE_MAX_SKELETON_ROWS`): con una página de 50 no se pintan\n * 50 placeholders. Ignora `rows()`/el slot\n * `[empty]` mientras dura (no sabemos aún si el resultado real estará\n * vacío), y respeta la vista activa (tabla o cards) para no cambiar el\n * layout de golpe cuando los datos reales lleguen. El toggle tabla/cards y\n * el header de columnas siguen visibles — solo el cuerpo se reemplaza.\n *\n * El placeholder respeta la columna: en la tabla cada celda conserva su\n * `align`, `width`, `minWidth` y `maxWidth` (una columna numérica lleva una\n * barra corta alineada al final, una de acciones un cuadrado chico, el resto\n * barras de anchos distintos) y la fila reserva el alto de una línea de texto.\n * En tarjetas reproduce la estructura según `cardRole`: encabezado (miniatura,\n * título y estado), campos con su rótulo, fila de `meta` y pie de acciones:\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows()\" [loading]=\"isLoading()\">\n * <kf-empty-state empty>No hay resultados para mostrar.</kf-empty-state>\n * </kf-data-table>\n *\n * El slot `[footer]` (página 15: \"slot de pie para paginación\") va siempre\n * al final, en ambas vistas, separado por una línea — pensado para proyectar\n * `<kf-pagination>`, que sigue siendo un componente independiente.\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\">\n * <kf-pagination footer [page]=\"page()\" [total]=\"total()\" (pageChange)=\"page.set($event)\" />\n * </kf-data-table>\n *\n * Paginación interna opcional: con `pageSize`, la tabla pagina sola y\n * agrega su propio `kf-pagination` en el footer nativo (el slot\n * `[footer]` proyectado sigue disponible en paralelo). El selector de \"N\n * por página\" viene activo por defecto con `DEFAULT_PAGE_SIZE_OPTIONS`\n * ([10, 25, 50], estándar del portal) — pasar `pageSizeOptions` propio lo\n * pisa, y pasar `[]` lo desactiva (paginación sin selector). `itemLabel`\n * completa el texto informativo (\"1–10 de 42 beneficios\").\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [pageSize]=\"25\" itemLabel=\"beneficios\" />\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [pageSize]=\"25\" [pageSizeOptions]=\"[]\" />\n *\n * La página es `[(page)]` (el consumidor puede llevarla a la URL) y se\n * corrige sola si queda fuera de rango. Por defecto un cambio de `rows` la\n * devuelve a 1; con `keepPageOnRowsChange` la conserva (el consumidor decide\n * cuándo volver a 1). Un `pageSize` nuevo del consumidor pisa el elegido en\n * el selector, y `pageSizeChange` avisa cuando el usuario lo cambia.\n *\n * Ordenamiento por columna: cada `DataTableColumn` con `sortable: true`\n * vuelve su header un botón (Tab, Enter y Espacio) que expone el estado con\n * `aria-sort` (`ascending`/`descending`/`none`), con el mismo formato `key:direction` que\n * usa `sort` de `kf-quote-picker` (two-way manual, no `model()` — el\n * consumidor decide si persiste el valor o lo descarta al desmontar):\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [sort]=\"sort()\" (sortChange)=\"sort.set($event)\" />\n *\n * Columnas fijas: `sticky: 'left' | 'right'` en la columna ancla esa\n * columna a un borde del scroll horizontal — típicamente el identificador\n * (izquierda) y/o las acciones (derecha) en una tabla con muchas columnas.\n *\n * Densidad: `density=\"compact\"` reduce el padding vertical de cada fila,\n * para priorizar cantidad de filas visibles sobre aire entre ellas.\n *\n * Listados largos con textos largos (ej. cotizaciones con el modelo del\n * vehículo): la columna de texto largo lleva `truncate` (elipsis + `title`),\n * las de dato corto `width`/`align: 'end'`, y la de acciones solo ícono\n * `width` angosto + `hideLabel` + `sticky: 'right'`. Así la acción queda\n * siempre a la vista sin scroll horizontal:\n *\n * columns = [\n * { key: 'id', label: 'Cotización', width: '9rem' },\n * { key: 'model', label: 'Vehículo', truncate: true, minWidth: '10rem' },\n * { key: 'amount', label: 'Monto', align: 'end', width: '8rem' },\n * { key: 'open', label: 'Abrir', hideLabel: true, width: '56px', sticky: 'right' },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"quotes\" [rowClickable]=\"true\"\n * (rowClick)=\"open($event.row)\" [cellTemplates]=\"{ open: openCell }\" />\n *\n * Reparto de anchos: con `grow` en alguna columna, esa(s) se reparten TODO el\n * espacio sobrante según su peso, las de `width` lo mantienen y las que no\n * traen `width` ni `grow` se ajustan a su contenido (con `maxWidth` como\n * techo). Así una columna de dato corto (estado, precio, fecha) no acapara\n * espacio y el texto largo (el vehículo) lo aprovecha:\n *\n * columns = [\n * { key: 'id', label: 'Cotización', width: '8.5rem', mono: true },\n * { key: 'model', label: 'Vehículo', grow: 1, truncate: true },\n * { key: 'issuedAt', label: 'Emisión' },\n * { key: 'price', label: 'Precio', align: 'end', emphasis: true },\n * { key: 'status', label: 'Estado', truncate: true, maxWidth: '14rem' },\n * ];\n *\n * Listado completo con vista tarjetas (ej. cotizaciones): la vista es\n * two-way (`[(view)]`) y el toggle interno se oculta con\n * `[showViewToggle]=\"false\"` cuando el consumidor lo pone en su barra. En\n * tarjetas: título (`mono`) y estado en una fila, el campo principal a\n * ancho completo en 2 líneas (`cardClamp: 2`), y fecha/monto en una fila\n * inferior (`cardRole: 'meta'`, el monto con `emphasis`). Las tarjetas de\n * una fila miden lo mismo; `cardMinWidth` fija el ancho mínimo. Con\n * `rowClickable` la tarjeta entera es un botón (Enter/Espacio):\n *\n * columns = [\n * { key: 'id', label: 'Cotización', cardRole: 'title', mono: true },\n * { key: 'status', label: 'Estado', cardRole: 'status' },\n * { key: 'model', label: 'Vehículo', truncate: true, cardClamp: 2 },\n * { key: 'date', label: 'Fecha', cardRole: 'meta', width: '7rem' },\n * { key: 'amount', label: 'Monto', cardRole: 'meta', align: 'end', emphasis: true },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"quotes\" cardable [(view)]=\"view\"\n * [showViewToggle]=\"false\" cardMinWidth=\"300px\" [rowClickable]=\"true\"\n * (rowClick)=\"open($event.row)\" />\n *\n * Celdas interactivas (modo aditivo, ej. una matriz unidad × etapa donde cada\n * celda de etapa es un indicador de estado): una columna con\n * `interactive: true` renderiza su contenido dentro de un `<button>` real\n * —focusable, con foco visible y activación con Enter o Espacio— en la vista\n * de tabla y en la de tarjetas, y emite `cellClick` con `{ row, column, index }`.\n * `cellAriaLabel` da el nombre accesible de cada celda cuando el contenido no\n * lo aporta por sí solo (un indicador sin texto); en tarjetas conviene incluir\n * el contexto de la fila, porque no hay encabezado de columna que lo dé:\n *\n * columns = [\n * { key: 'unit', label: 'Unidad', cardRole: 'title', sticky: 'left' },\n * { key: 'stage1', label: 'Recepción', interactive: true, align: 'center' },\n * { key: 'stage2', label: 'Entrega', interactive: true, align: 'center' },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"units\" cardable [rowKey]=\"unitId\"\n * [cellTemplates]=\"{ stage1: stageCell, stage2: stageCell }\"\n * [cellAriaLabel]=\"stageLabel\" (cellClick)=\"openStage($event.row, $event.column)\" />\n *\n * Convive con `rowClick`: la fila sigue emitiéndolo desde cualquier punto que\n * no sea una celda interactiva. En tarjetas, la tarjeta deja de ser un botón\n * (un botón dentro de un `role=\"button\"` es inválido) salvo que se fuerce con\n * `[rowClickable]=\"true\"`. `sticky`, `cellTemplates`, `currentRowKey`, la\n * ordenación y la paginación no cambian.\n */\n@Component({\n selector: 'kf-data-table',\n imports: [Icon, NgTemplateOutlet, Pagination, Skeleton, ViewToggle],\n templateUrl: './DataTable.html',\n styleUrl: './DataTable.css',\n})\nexport class DataTable<T = unknown> {\n readonly columns = input.required<DataTableColumn[]>();\n readonly rows = input.required<T[]>();\n /** Placeholder nativo (`kf-skeleton`) mientras los datos reales cargan —\n * ver el doc-comment de la clase para el detalle. */\n readonly loading = input(false);\n /** Filas (o tarjetas) esqueleto mientras `loading` es `true`. Sin valor: el\n * `pageSize` con paginación activa, o 5. Máximo\n * {@link DATA_TABLE_MAX_SKELETON_ROWS}. */\n readonly skeletonRows = input<number | undefined>(undefined);\n private readonly scrollEl = viewChild<ElementRef<HTMLElement>>('scroll');\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * `.kf-data-table__scroll` tiene `overflow-x: auto` sin ningún indicador\n * visual — con varias columnas y poco ancho disponible, la tabla se corta\n * en el borde y nada le avisa al usuario que hay más contenido\n * scrolleando. `canScrollLeft`/`canScrollRight` alimentan un fade en cada\n * borde — visible solo cuando de verdad hay algo que revelar de ese lado,\n * así una tabla que entra completa no muestra fades falsos.\n */\n protected readonly canScrollLeft = signal(false);\n protected readonly canScrollRight = signal(false);\n /**\n * Hay contenido oculto por scroll horizontal. Solo entonces el contenedor\n * es una región nombrada y enfocable (`tabindex=\"0\"`, `role=\"region\"`):\n * sin foco, quien navega con teclado no puede desplazarlo (WCAG 2.1.1).\n * Una tabla que entra completa no suma una parada de Tab vacía.\n */\n protected readonly hasOverflow = signal(false);\n\n constructor() {\n afterNextRender(() => {\n const el = this.scrollEl()?.nativeElement;\n if (!el) {\n return;\n }\n const update = () => this.updateScrollState(el);\n update();\n\n el.addEventListener('scroll', update, { passive: true });\n const observer = new ResizeObserver(update);\n observer.observe(el);\n\n this.destroyRef.onDestroy(() => {\n el.removeEventListener('scroll', update);\n observer.disconnect();\n });\n });\n\n // El ancho de una columna `sticky` depende de su contenido — re-medir\n // cada vez que cambian las columnas o las filas mostradas (no solo una\n // vez, a diferencia del fade de scroll que solo depende del contenedor).\n afterRenderEffect(() => {\n this.columns();\n this.displayedRows();\n this.measureStickyOffsets();\n });\n\n // `rows()` cambia de identidad cuando el consumidor filtra el dataset\n // base (ej. cambiar de tab): la página vuelve a 1, salvo con\n // `keepPageOnRowsChange`, donde el consumidor lleva la página (ej. en la\n // URL) y solo se corrige si queda fuera de rango (ver abajo). La primera\n // ejecución no cuenta: respeta la página inicial de `[(page)]`. Reacciona\n // solo a `rows()` y a la bandera, no a `page()`/`sort()`.\n let firstRowsRun = true;\n effect(() => {\n this.rows();\n const keep = this.keepPageOnRowsChange();\n if (firstRowsRun) {\n firstRowsRun = false;\n return;\n }\n if (!keep) {\n this.page.set(1);\n }\n });\n\n // Una página fuera de rango (ej. `?page=9` con 3 páginas, o un filtro que\n // deja menos filas) se corrige a la más cercana válida y se notifica por\n // `pageChange`. Sin filas o cargando no se corrige: el total aún no es\n // real y se perdería la página pedida.\n effect(() => {\n if (this.loading() || this.rows().length === 0 || !this.effectivePageSize()) {\n return;\n }\n const total = this.totalPages();\n const current = this.page();\n if (current > total) {\n this.page.set(total);\n } else if (current < 1) {\n this.page.set(1);\n }\n });\n\n // Un `pageSize` nuevo desde el consumidor (ej. leído de la URL) manda\n // sobre el tamaño que el usuario eligió antes en el selector.\n effect(() => {\n this.pageSize();\n untracked(() => this.internalPageSize.set(null));\n });\n }\n\n private updateScrollState(el: HTMLElement): void {\n // 1px de margen: scrollWidth/scrollLeft pueden traer subpíxeles que\n // dejarían el fade \"prendido\" en una tabla que en los hechos ya llegó\n // al final (o nunca tuvo overflow real).\n this.canScrollLeft.set(el.scrollLeft > 1);\n this.canScrollRight.set(el.scrollWidth - el.clientWidth - el.scrollLeft > 1);\n this.hasOverflow.set(el.scrollWidth - el.clientWidth > 1);\n }\n /** Default: índice de la fila dentro de `rows`. */\n readonly rowKey = input<(row: T, index: number) => string | number>();\n /** Sin borde/sombra de card — para tablas anidadas dentro de otra card. */\n readonly flush = input(false);\n /** Habilita el toggle de vista tabla/cards. */\n readonly cardable = input(false, { transform: booleanAttribute });\n readonly defaultView = input<DataTableView>('table');\n /** Muestra el toggle tabla/tarjetas interno (con `cardable`). En `false`,\n * el consumidor controla la vista con `[(view)]` desde su propio control. */\n readonly showViewToggle = input(true, { transform: booleanAttribute });\n /** Ancho mínimo de cada tarjeta en la grilla (default `220px`, histórico).\n * Nunca supera el ancho disponible: en pantallas angostas, una columna. */\n readonly cardMinWidth = input('220px');\n /**\n * Formateo simple de celda como texto: `(row) => string`. Para marcado\n * real (badges, links, botones) usar `cellTemplates`.\n */\n readonly render = input<(row: T) => string>();\n /** Mapa `columnKey -> TemplateRef` para celdas con contenido custom. El\n * contexto trae `$implicit` (la fila), `index` y `column` (la columna), así\n * que un mismo template puede servir a varias columnas. */\n readonly cellTemplates = input<\n | Record<string, TemplateRef<{ $implicit: T; index: number; column?: DataTableColumn }>>\n | undefined\n >();\n\n /** Densidad de fila — ver `DataTableDensity`. */\n readonly density = input<DataTableDensity>('comfortable');\n\n /** Fuerza si la fila entera dispara `rowClick` en la vista de tabla —\n * ver `rowInteractive` para el cálculo automático cuando no se define. */\n readonly rowClickable = input<boolean | null>(null);\n\n /**\n * Con `false`, las filas interactivas de la vista de tabla dejan de ser\n * paradas de Tab (sin `tabindex`): útil cuando la fila es clickeable con el\n * mouse pero la acción accesible por teclado es un enlace o botón real\n * dentro de una celda — así una página de N filas no suma N paradas de Tab\n * sin rol. El clic con mouse sigue emitiendo `rowClick`. Default `true`\n * (comportamiento histórico). No afecta a las tarjetas, que son\n * `role=\"button\"`.\n */\n readonly rowFocusable = input(true);\n\n readonly rowClick = output<{ row: T; index: number }>();\n\n /**\n * Se emite al activar (clic, Enter o Espacio) una celda de una columna\n * `interactive`. `index` es el de la fila dentro de las filas mostradas\n * (misma convención que `rowClick`). No emite `rowClick`.\n */\n readonly cellClick = output<DataTableCellClick<T>>();\n\n /**\n * Nombre accesible (`aria-label`) del botón de cada celda interactiva:\n * `(row, column, index) => string`. Sin esta función, el botón se nombra\n * por su contenido. Se usa solo en columnas `interactive`.\n */\n readonly cellAriaLabel = input<\n ((row: T, column: DataTableColumn, index: number) => string) | undefined\n >();\n\n /** Nombre accesible del contenedor con scroll horizontal (solo se aplica cuando hay overflow). */\n readonly ariaLabel = input('Tabla de datos');\n /**\n * Clave (la misma que devuelve `rowKey`, o el índice sin él) de la fila\n * \"actual\" — ej. el registro que se está viendo en un selector. Esa fila\n * o card lleva `aria-current=\"true\"` y la clase `--current` (fondo\n * `primary-soft`). `null` (default): ninguna.\n */\n readonly currentRowKey = input<string | number | null>(null);\n\n /**\n * Paginación interna opcional — sin `pageSize`, cero cambio de\n * comportamiento (el consumidor sigue paginando afuera si quiere, vía el\n * slot `[footer]` con su propio `kf-pagination`, como ya hace Billing).\n * Con `pageSize`, la tabla pagina `rows()` sola y agrega su propio\n * `kf-pagination` en el footer nativo — el slot `[footer]` proyectado\n * sigue disponible para cualquier otra cosa que el consumidor quiera\n * agregar ahí (no son mutuamente excluyentes).\n */\n readonly pageSize = input<number | null>(null);\n /** Default `DEFAULT_PAGE_SIZE_OPTIONS` ([10, 25, 50], estándar del\n * portal) — pasar `[]` explícitamente desactiva el selector de tamaño\n * aunque `pageSize` esté activo (paginación sin selector). */\n readonly pageSizeOptions = input<number[]>(DEFAULT_PAGE_SIZE_OPTIONS);\n /** Página actual (desde 1), bidireccional: `[(page)]=\"page\"`. El consumidor\n * puede llevarla fuera de la tabla (ej. en la URL) y la tabla la corrige\n * si queda fuera de rango. `pageChange` emite en cada cambio, también los\n * automáticos (volver a 1 al cambiar de tamaño de página). */\n readonly page = model(1);\n /** Con `true`, un cambio de `rows` NO devuelve la página a 1: el\n * consumidor decide cuándo (ej. al filtrar) y la tabla solo la corrige si\n * queda fuera de rango. Default `false`: vuelve a 1, como siempre. */\n readonly keepPageOnRowsChange = input(false, { transform: booleanAttribute });\n /** Emite el tamaño elegido en el selector de la paginación interna. */\n readonly pageSizeChange = output<number>();\n\n /** Nombre de la entidad listada (ej. \"beneficios\", \"facturas\"), en\n * plural — se agrega al final del texto informativo de la paginación\n * interna (\"1–5 de 7 beneficios\"). Sin esto, el texto queda solo con\n * números (\"1–5 de 7\"): la librería no impone un idioma ni un nombre\n * fijo, cada consumidor decide el suyo. */\n readonly itemLabel = input<string>('');\n\n private readonly internalPageSize = signal<number | null>(null);\n\n /** Tamaño de página efectivo: el que el usuario elija en el selector\n * (si `pageSizeOptions` está activo), o el `pageSize` del consumidor. */\n protected readonly effectivePageSize = computed(() => this.internalPageSize() ?? this.pageSize());\n\n /** Cantidad de filas/cards placeholder mientras `loading` es true — el\n * `skeletonRows` explícito; si no hay, el `pageSize` efectivo con\n * paginación activa (así el placeholder ya \"adivina\" cuántas filas reales\n * van a aparecer, sin salto de layout) o 5 sin paginación. Siempre entre 1 y\n * {@link DATA_TABLE_MAX_SKELETON_ROWS}: con una página de 50 filas no se\n * pintan 50 placeholders. */\n protected readonly skeletonRowIndexes = computed(() => {\n const wanted = this.skeletonRows() ?? this.effectivePageSize() ?? 5;\n const total = Math.min(Math.max(Math.floor(wanted) || 0, 1), DATA_TABLE_MAX_SKELETON_ROWS);\n return Array.from({ length: total }, (_, i) => i);\n });\n\n /** Las tarjetas esqueleto llevan encabezado cuando la real lo tendría. */\n protected readonly skeletonCardHeader = computed(\n () =>\n !!this.cardMediaColumn() || !!this.cardTitleColumn() || this.cardStatusColumns().length > 0,\n );\n\n /**\n * Ancho (%) de la barra de una celda esqueleto: no todas iguales — una\n * columna numérica (alineada al final) es corta, un identificador\n * (`mono`) mediano, una de acciones (`hideLabel`) un cuadrado chico, y el\n * resto alterna entre tres anchos según su posición para que la tabla no\n * parezca un patrón repetido.\n */\n protected skeletonBarWidth(column: DataTableColumn, row: number, index: number): string {\n if (column.hideLabel) {\n return '2rem';\n }\n if (this.isEndAligned(column)) {\n return ['55%', '45%', '60%'][(row + index) % 3];\n }\n if (column.mono) {\n return '70%';\n }\n if (column.truncate) {\n return '90%';\n }\n return ['85%', '65%', '75%'][(row + index) % 3];\n }\n\n protected readonly totalPages = computed(() => {\n const size = this.effectivePageSize();\n if (!size) {\n return 1;\n }\n return Math.max(Math.ceil(this.sortedRows().length / size), 1);\n });\n\n /** Texto informativo del footer de paginación interna (\"1–5 de 7\n * beneficios\") — se recalcula con cada cambio de página/tamaño/dataset,\n * nunca queda desactualizado tras filtrar o pasar de página. */\n protected readonly paginationSummary = computed(() => {\n const size = this.effectivePageSize();\n const total = this.sortedRows().length;\n if (!size || total === 0) {\n return '';\n }\n const start = (this.page() - 1) * size + 1;\n const end = Math.min(start + size - 1, total);\n const label = this.itemLabel();\n return label ? `${start}–${end} de ${total} ${label}` : `${start}–${end} de ${total}`;\n });\n\n /**\n * Ordenamiento por columna — mismo formato `key:direction` que `sort` de\n * `kf-quote-picker`, para que un consumidor que ya conoce ese patrón no\n * aprenda uno nuevo. Un click en un header `sortable` avanza el ciclo\n * asc → desc → sin orden; clickear otra columna reinicia el ciclo en esa\n * columna nueva.\n */\n readonly sort = input<DataTableSort | null>(null);\n readonly sortChange = output<DataTableSort | null>();\n\n protected readonly sortedRows = computed<T[]>(() => {\n const sortValue = this.sort();\n const rows = this.rows();\n if (!sortValue) {\n return rows;\n }\n const [key, direction] = sortValue.split(':') as [string, 'asc' | 'desc'];\n const sorted = [...rows].sort((a, b) => {\n const va = (a as Record<string, unknown>)[key];\n const vb = (b as Record<string, unknown>)[key];\n if (va === vb) {\n return 0;\n }\n if (va === null || va === undefined) {\n return 1;\n }\n if (vb === null || vb === undefined) {\n return -1;\n }\n return va > vb ? 1 : -1;\n });\n return direction === 'desc' ? sorted.reverse() : sorted;\n });\n\n /** Filas realmente renderizadas: ordenadas y, si `pageSize` está activo,\n * recortadas a la página actual. */\n protected readonly displayedRows = computed<T[]>(() => {\n const sorted = this.sortedRows();\n const size = this.effectivePageSize();\n if (!size) {\n return sorted;\n }\n const start = (this.page() - 1) * size;\n return sorted.slice(start, start + size);\n });\n\n protected sortDirectionFor(column: DataTableColumn): 'asc' | 'desc' | null {\n const sortValue = this.sort();\n if (!sortValue) {\n return null;\n }\n const [key, direction] = sortValue.split(':') as [string, 'asc' | 'desc'];\n return key === column.key ? direction : null;\n }\n\n /** Valor de `aria-sort` del header de una columna ordenable. */\n protected ariaSortFor(column: DataTableColumn): 'ascending' | 'descending' | 'none' {\n const direction = this.sortDirectionFor(column);\n return direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none';\n }\n\n /** Ciclo asc → desc → sin orden, disparado al clickear un header `sortable`. */\n protected toggleSort(column: DataTableColumn): void {\n if (!column.sortable) {\n return;\n }\n const current = this.sortDirectionFor(column);\n const next: DataTableSort | null =\n current === 'asc' ? `${column.key}:desc` : current === 'desc' ? null : `${column.key}:asc`;\n this.sortChange.emit(next);\n }\n\n protected goToPage(target: number): void {\n const clamped = Math.min(Math.max(target, 1), this.totalPages());\n if (clamped === this.page()) {\n return;\n }\n this.page.set(clamped);\n }\n\n protected setPageSize(size: number | null): void {\n if (size === null) {\n return;\n }\n this.internalPageSize.set(size);\n // Primero el tamaño y después la página: un consumidor que lleva ambos en\n // la URL los escribe en una sola navegación.\n this.pageSizeChange.emit(size);\n this.page.set(1);\n }\n\n /**\n * Reparto de anchos activo: hay al menos una columna `grow`. Sin ella, los\n * anchos son los de siempre (`width`/`minWidth`/`maxWidth` tal cual).\n */\n protected readonly weighted = computed(() =>\n this.columns().some((column) => this.growWeight(column) > 0),\n );\n\n /** Porción (%) del espacio sobrante de cada columna `grow`, según su peso. */\n private readonly growShares = computed(() => {\n const weights = this.columns()\n .map((column) => [column.key, this.growWeight(column)] as const)\n .filter(([, weight]) => weight > 0);\n const total = weights.reduce((sum, [, weight]) => sum + weight, 0);\n return new Map(\n weights.map(([key, weight]) => [key, Math.round((weight / total) * 10000) / 100]),\n );\n });\n\n private growWeight(column: DataTableColumn): number {\n const weight = column.grow ?? 0;\n return Number.isFinite(weight) && weight > 0 ? weight : 0;\n }\n\n /**\n * `width` de la celda. En reparto de anchos: la columna `grow` toma su\n * porción en porcentaje (las porciones suman 100% y el navegador las escala\n * al espacio que dejan las demás), la de `width` conserva su ancho y la que\n * no trae ni `width` ni `grow` pide 1% — con `nowrap` queda en el ancho de\n * su contenido.\n */\n protected widthFor(column: DataTableColumn): string | null {\n if (!this.weighted()) {\n return column.width ?? null;\n }\n const share = this.growShares().get(column.key);\n if (share !== undefined) {\n return `${share}%`;\n }\n return column.width ?? '1%';\n }\n\n /**\n * `min-width` de la celda. En reparto de anchos, el `width` de una columna\n * (también de una `grow`) funciona como piso: ni las porciones en\n * porcentaje ni el contenido de las demás pueden comprimirla.\n */\n protected minWidthFor(column: DataTableColumn): string | null {\n if (!this.weighted()) {\n return column.minWidth ?? null;\n }\n // Una columna `grow` sin piso propio nunca baja de `GROW_MIN_WIDTH`: con\n // poco espacio la tabla desplaza en horizontal en vez de dejar sin ancho\n // a la columna principal.\n const fallback = this.growShares().has(column.key) ? GROW_MIN_WIDTH : null;\n return column.minWidth ?? column.width ?? fallback;\n }\n\n /**\n * `max-width` de la celda. En reparto de anchos, una columna que se ajusta\n * a su contenido y es `truncate` SIN `maxWidth` no debe heredar el techo de\n * 0 de `truncate` (quedaría sin ancho): se libera con `none`.\n */\n protected maxWidthFor(column: DataTableColumn): string | null {\n if (\n this.weighted() &&\n column.truncate &&\n !column.maxWidth &&\n !column.width &&\n !this.growShares().has(column.key)\n ) {\n return 'none';\n }\n return column.maxWidth ?? null;\n }\n\n /** Columnas fijas del lado izquierdo/derecho, con el offset acumulado\n * (medido en runtime, ver `measureStickyOffsets`) para `position: sticky`. */\n protected readonly stickyLeftColumns = computed(() =>\n this.columns().filter((c) => c.sticky === 'left'),\n );\n protected readonly stickyRightColumns = computed(() =>\n this.columns().filter((c) => c.sticky === 'right'),\n );\n protected readonly stickyOffsets = signal<Map<string, number>>(new Map());\n\n protected stickyStyle(column: DataTableColumn): Record<string, string> | null {\n if (!column.sticky) {\n return null;\n }\n const offset = this.stickyOffsets().get(column.key) ?? 0;\n return {\n position: 'sticky',\n [column.sticky]: `${offset}px`,\n zIndex: '1',\n };\n }\n\n /**\n * Vista elegida, two-way: `[(view)]=\"view\"`. Sin valor (default) manda\n * `defaultView`; el toggle interno la escribe. Para controlarla desde\n * afuera (ej. con el toggle en `kf-list-toolbar` y el estado en la URL),\n * enlazar `[(view)]` y ocultar el interno con `[showViewToggle]=\"false\"`.\n * La vista efectivamente renderizada es `activeView()`.\n */\n readonly view = model<DataTableView | undefined>(undefined);\n\n /** Vista activa: `view` si está definida, si no `defaultView`. */\n readonly activeView = computed<DataTableView>(() => this.view() ?? this.defaultView());\n\n /** Primera columna de cada rol único; el resto se ignora en el encabezado. */\n readonly cardMediaColumn = computed(() => this.columns().find((c) => c.cardRole === 'media'));\n readonly cardTitleColumn = computed(() => this.columns().find((c) => c.cardRole === 'title'));\n readonly cardStatusColumns = computed(() =>\n this.columns().filter((c) => c.cardRole === 'status'),\n );\n readonly cardActionColumns = computed(() =>\n this.columns().filter((c) => c.cardRole === 'action'),\n );\n readonly cardFieldColumns = computed(() =>\n this.columns().filter((c) => (!c.cardRole || c.cardRole === 'field') && !c.cardClamp),\n );\n /** Campos a ancho completo y recortados (`cardClamp`), antes del resto. */\n readonly cardLeadColumns = computed(() =>\n this.columns().filter((c) => (!c.cardRole || c.cardRole === 'field') && !!c.cardClamp),\n );\n /** Fila inferior de datos secundarios (`cardRole: 'meta'`). */\n readonly cardMetaColumns = computed(() => this.columns().filter((c) => c.cardRole === 'meta'));\n\n /**\n * La card entera es clickeable solo si no tiene acciones propias: un\n * `role=\"button\"` con botones adentro es inválido y deja el foco ambiguo.\n * Con columnas `action`, la interacción la manejan esos botones.\n */\n readonly cardInteractive = computed(\n () =>\n this.rowClickable() ??\n (this.cardActionColumns().length === 0 && !this.hasInteractiveColumns()),\n );\n\n /** Hay al menos una columna `interactive` (celdas con botón propio). */\n protected readonly hasInteractiveColumns = computed(() =>\n this.columns().some((column) => column.interactive),\n );\n\n /**\n * Mismo criterio que `cardInteractive`, para la vista de tabla: la fila\n * entera dispara `rowClick` solo si no hay una columna `action` que ya\n * resuelva la interacción con su propio botón — sin esto, un click en\n * \"Ver detalle\" dispararía TAMBIÉN el click de la fila por burbujeo.\n * `rowClickable` fuerza el comportamiento en cualquier sentido si el\n * consumidor lo necesita.\n */\n readonly rowInteractive = computed(\n () => this.rowClickable() ?? this.cardActionColumns().length === 0,\n );\n\n /**\n * La fila de la vista de tabla es parada de Tab solo si es interactiva,\n * `rowFocusable` lo permite y NO hay columnas `interactive`: con botones\n * propios por celda, la fila además de ellos duplicaría las paradas de Tab\n * (el clic de la fila sigue emitiendo `rowClick` con el mouse).\n */\n protected readonly rowTabStop = computed(\n () => this.rowInteractive() && this.rowFocusable() && !this.hasInteractiveColumns(),\n );\n\n setView(next: DataTableView): void {\n this.view.set(next);\n }\n\n trackRow(row: T, index: number): string | number {\n const keyFn = this.rowKey();\n return keyFn ? keyFn(row, index) : index;\n }\n\n /** Alineada al final: `align: 'end'` o el histórico `right: true`. */\n protected isEndAligned(column: DataTableColumn): boolean {\n return column.align === 'end' || !!column.right;\n }\n\n /** `title` de una celda `truncate`: el valor completo como texto. */\n protected truncateTitle(row: T, column: DataTableColumn): string | null {\n if (!column.truncate) {\n return null;\n }\n return this.cellValue(row, column) || null;\n }\n\n cellValue(row: T, column: DataTableColumn): string {\n const renderFn = this.render();\n if (renderFn) {\n return renderFn(row);\n }\n const value = (row as Record<string, unknown>)[column.key];\n return value === null || value === undefined ? '' : String(value);\n }\n\n protected isCurrentRow(row: T, index: number): boolean {\n const current = this.currentRowKey();\n return current !== null && this.trackRow(row, index) === current;\n }\n\n /**\n * Espacio activa la fila/card igual que Enter, como un botón. Solo si el\n * foco está en la fila misma (no en un control dentro de ella): ahí\n * `preventDefault` evita el scroll de página; en cualquier otro caso\n * Espacio conserva su comportamiento nativo.\n */\n protected onRowSpace(event: Event, row: T, index: number): void {\n if (event.target !== event.currentTarget || !this.rowInteractive()) {\n return;\n }\n event.preventDefault();\n this.onRowClick(row, index);\n }\n\n /**\n * Emite `rowClick` salvo que el evento nazca dentro de un control\n * interactivo de la celda (enlace, botón, campo…): ese control ya resuelve\n * su propia acción. Así una celda con un `<a href>` real (clic derecho →\n * \"abrir en nueva pestaña\", Ctrl/Cmd+clic) no navega dos veces. El parámetro\n * `event` es opcional para no romper llamadas programáticas existentes.\n */\n onRowClick(row: T, index: number, event?: Event): void {\n if (!this.rowInteractive() || this.originatesInInteractiveControl(event)) {\n return;\n }\n this.rowClick.emit({ row, index });\n }\n\n /** Activación de una celda interactiva (clic, o Enter/Espacio sobre su botón). */\n protected onCellClick(row: T, column: DataTableColumn, index: number): void {\n this.cellClick.emit({ row, column, index });\n }\n\n /** `aria-label` del botón de una celda interactiva, o `null` si lo da su contenido. */\n protected cellLabel(row: T, column: DataTableColumn, index: number): string | null {\n return this.cellAriaLabel()?.(row, column, index) || null;\n }\n\n private originatesInInteractiveControl(event?: Event): boolean {\n const target = event?.target;\n const host = event?.currentTarget;\n if (!(target instanceof Element) || !(host instanceof Element) || target === host) {\n return false;\n }\n const control = target.closest(INTERACTIVE_CONTROL_SELECTOR);\n return control !== null && control !== host && host.contains(control);\n }\n\n /**\n * Ancho real de cada columna `sticky` — se mide después de cada render\n * porque el ancho de una columna depende de su contenido, no hay forma\n * de conocerlo de antemano. Cada columna fija toma como offset la suma\n * de anchos de las columnas fijas del MISMO lado que ya quedaron antes\n * que ella (así \"left\" apila de izquierda a derecha, \"right\" de derecha\n * a izquierda).\n */\n protected measureStickyOffsets(): void {\n const table = this.scrollEl()?.nativeElement.querySelector('table');\n if (!table) {\n return;\n }\n const offsets = new Map<string, number>();\n let leftAcc = 0;\n for (const column of this.stickyLeftColumns()) {\n offsets.set(column.key, leftAcc);\n const cell = table.querySelector<HTMLElement>(`[data-column-key=\"${column.key}\"]`);\n leftAcc += cell?.offsetWidth ?? 0;\n }\n let rightAcc = 0;\n for (const column of [...this.stickyRightColumns()].reverse()) {\n offsets.set(column.key, rightAcc);\n const cell = table.querySelector<HTMLElement>(`[data-column-key=\"${column.key}\"]`);\n rightAcc += cell?.offsetWidth ?? 0;\n }\n this.stickyOffsets.set(offsets);\n }\n}\n","<div\n class=\"kf-data-table\"\n [class.kf-data-table--flush]=\"flush()\"\n [class.kf-data-table--compact]=\"density() === 'compact'\"\n>\n @if (cardable() && showViewToggle()) {\n <div class=\"kf-data-table__toolbar\">\n <kf-view-toggle [view]=\"activeView()\" (viewChange)=\"setView($event)\" />\n </div>\n }\n\n @if (loading()) {\n @if (cardable() && activeView() === 'cards') {\n <div\n class=\"kf-data-table__cards\"\n aria-busy=\"true\"\n [style.--kf-data-table-card-min]=\"cardMinWidth()\"\n >\n @for (i of skeletonRowIndexes(); track i) {\n <div class=\"kf-data-table__card\" aria-hidden=\"true\">\n @if (cardMediaColumn() || cardTitleColumn() || cardStatusColumns().length) {\n <div class=\"kf-data-table__card-header\">\n @if (cardMediaColumn()) {\n <div class=\"kf-data-table__card-media\">\n <span class=\"kf-data-table__sk-media kf-bone-fill\"></span>\n </div>\n }\n <div class=\"kf-data-table__card-heading\">\n <span\n class=\"kf-data-table__card-title kf-bone\"\n [class.kf-data-table__card-title--mono]=\"cardTitleColumn()?.mono\"\n style=\"--kf-bone-width: 8rem\"\n >COT-2026-0000</span\n >\n @if (cardStatusColumns().length) {\n <span class=\"kf-data-table__card-statuses\">\n <span class=\"kf-data-table__sk-pill kf-bone-fill\"></span>\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardLeadColumns().length || cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\n @for (column of cardLeadColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-lead\"\n [style.--kf-data-table-card-clamp]=\"column.cardClamp\"\n >\n <span class=\"kf-data-table__sk-lead kf-bone\" style=\"--kf-bone-width: 90%\"\n >Texto</span\n >\n </div>\n }\n @for (column of cardFieldColumns(); track column.key; let first = $first) {\n <div class=\"kf-data-table__card-field\">\n <span\n class=\"kf-data-table__card-label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 5rem\"\n >{{ column.label }}</span\n >\n @if (first && !skeletonCardHeader()) {\n <kf-skeleton class=\"kf-data-table__sk-value\" width=\"100%\" />\n } @else {\n <span class=\"kf-data-table__sk-value kf-bone\" style=\"--kf-bone-width: 40%\"\n >Valor</span\n >\n }\n </div>\n }\n </div>\n }\n\n @if (cardMetaColumns().length) {\n <div class=\"kf-data-table__card-meta\">\n @for (column of cardMetaColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-meta-item\"\n [class.kf-data-table__card-meta-item--end]=\"\n isEndAligned(column) || column.emphasis\n \"\n [class.kf-data-table__card-meta-item--emphasis]=\"column.emphasis\"\n [style.flex-basis]=\"column.width\"\n >\n <span\n class=\"kf-data-table__card-label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 4rem\"\n >{{ column.label }}</span\n >\n <span\n class=\"kf-data-table__card-meta-value kf-bone\"\n style=\"--kf-bone-width: 5rem\"\n >Valor</span\n >\n </div>\n }\n </div>\n }\n\n @if (cardActionColumns().length) {\n <div class=\"kf-data-table__card-actions\">\n <span class=\"kf-data-table__sk-action kf-bone-fill\"></span>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <div\n class=\"kf-data-table__scroll\"\n [class.kf-data-table__scroll--weighted]=\"weighted()\"\n aria-busy=\"true\"\n >\n <table class=\"kf-data-table__table\" [class.kf-data-table__table--weighted]=\"weighted()\">\n <thead>\n <tr>\n @for (column of columns(); track column.key) {\n <th\n class=\"kf-overline-text\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n @if (column.hideLabel) {\n <span class=\"kf-data-table__sr-only\">{{ column.label }}</span>\n } @else {\n {{ column.label }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (i of skeletonRowIndexes(); track i) {\n <tr class=\"kf-data-table__row\">\n @for (column of columns(); track column.key; let c = $index) {\n <td\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n <div\n class=\"kf-data-table__sk-cell\"\n [class.kf-data-table__sk-cell--end]=\"isEndAligned(column)\"\n [class.kf-data-table__sk-cell--center]=\"column.align === 'center'\"\n >\n <kf-skeleton\n class=\"kf-data-table__sk-bar\"\n [style.width]=\"skeletonBarWidth(column, i, c)\"\n />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n } @else if (rows().length === 0) {\n <div class=\"kf-data-table__empty\">\n <ng-content select=\"[empty]\" />\n </div>\n } @else if (activeView() === 'table') {\n <div\n #scroll\n class=\"kf-data-table__scroll\"\n [class.kf-data-table__scroll--fade-left]=\"canScrollLeft()\"\n [class.kf-data-table__scroll--fade-right]=\"canScrollRight()\"\n [class.kf-data-table__scroll--weighted]=\"weighted()\"\n [attr.tabindex]=\"hasOverflow() ? 0 : null\"\n [attr.role]=\"hasOverflow() ? 'region' : null\"\n [attr.aria-label]=\"hasOverflow() ? ariaLabel() : null\"\n >\n <table class=\"kf-data-table__table\" [class.kf-data-table__table--weighted]=\"weighted()\">\n <thead>\n <tr>\n @for (column of columns(); track column.key) {\n <th\n class=\"kf-overline-text\"\n [attr.data-column-key]=\"column.key\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [class.kf-data-table__cell--truncate]=\"column.truncate\"\n [class.kf-data-table__cell--sortable]=\"column.sortable\"\n [class.kf-data-table__cell--sticky]=\"column.sticky\"\n [class.kf-data-table__cell--sort-active]=\"sortDirectionFor(column) !== null\"\n [style]=\"stickyStyle(column)\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n [attr.aria-sort]=\"column.sortable ? ariaSortFor(column) : null\"\n (click)=\"toggleSort(column)\"\n >\n @if (column.sortable) {\n <!-- El clic del botón burbujea al `th`, que ya ordena: un solo manejador para mouse y teclado. -->\n <button type=\"button\" class=\"kf-data-table__sort-button\">\n <span class=\"kf-data-table__th-content\">\n <ng-container\n [ngTemplateOutlet]=\"headerLabel\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\"\n />\n <kf-icon\n name=\"chevron-down\"\n size=\"sm\"\n [rotate]=\"sortDirectionFor(column) === 'asc' ? 180 : 0\"\n class=\"kf-data-table__sort-icon\"\n [class.kf-data-table__sort-icon--active]=\"sortDirectionFor(column) !== null\"\n />\n </span>\n </button>\n } @else {\n <span class=\"kf-data-table__th-content\">\n <ng-container\n [ngTemplateOutlet]=\"headerLabel\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\"\n />\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of displayedRows(); track trackRow(row, $index); let i = $index) {\n <tr\n class=\"kf-data-table__row\"\n [class.kf-data-table__row--interactive]=\"rowInteractive()\"\n [class.kf-data-table__row--current]=\"isCurrentRow(row, i)\"\n [attr.aria-current]=\"isCurrentRow(row, i) ? 'true' : null\"\n [attr.tabindex]=\"rowTabStop() ? 0 : null\"\n (click)=\"onRowClick(row, i, $event)\"\n (keydown.enter)=\"onRowClick(row, i, $event)\"\n (keydown.space)=\"onRowSpace($event, row, i)\"\n >\n @for (column of columns(); track column.key) {\n <td\n [attr.data-column-key]=\"column.key\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [class.kf-data-table__cell--truncate]=\"column.truncate\"\n [class.kf-data-table__cell--mono]=\"column.mono\"\n [class.kf-data-table__cell--emphasis]=\"column.emphasis\"\n [class.kf-data-table__cell--sticky]=\"column.sticky\"\n [style]=\"stickyStyle(column)\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n @if (column.truncate) {\n <span class=\"kf-data-table__truncate\" [attr.title]=\"truncateTitle(row, column)\">\n <ng-container\n [ngTemplateOutlet]=\"tableCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"tableCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"kf-data-table__cards\" [style.--kf-data-table-card-min]=\"cardMinWidth()\">\n @for (row of displayedRows(); track trackRow(row, $index); let i = $index) {\n <div\n class=\"kf-data-table__card\"\n [class.kf-data-table__card--interactive]=\"cardInteractive()\"\n [class.kf-data-table__card--current]=\"isCurrentRow(row, i)\"\n [attr.aria-current]=\"isCurrentRow(row, i) ? 'true' : null\"\n [attr.role]=\"cardInteractive() ? 'button' : null\"\n [attr.tabindex]=\"cardInteractive() ? 0 : null\"\n (click)=\"cardInteractive() ? onRowClick(row, i, $event) : undefined\"\n (keydown.enter)=\"cardInteractive() ? onRowClick(row, i, $event) : undefined\"\n (keydown.space)=\"cardInteractive() ? onRowSpace($event, row, i) : undefined\"\n >\n @if (cardMediaColumn() || cardTitleColumn() || cardStatusColumns().length) {\n <div class=\"kf-data-table__card-header\">\n @if (cardMediaColumn(); as media) {\n <div class=\"kf-data-table__card-media\">\n @if (cellTemplates()?.[media.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: media }\"\n />\n } @else {\n <img [src]=\"cellValue(row, media)\" alt=\"\" />\n }\n </div>\n }\n <div class=\"kf-data-table__card-heading\">\n @if (cardTitleColumn(); as title) {\n <span\n class=\"kf-data-table__card-title\"\n [class.kf-data-table__card-title--mono]=\"title.mono\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: title, index: i }\"\n />\n </span>\n }\n @if (cardStatusColumns().length) {\n <span class=\"kf-data-table__card-statuses\">\n @for (column of cardStatusColumns(); track column.key) {\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardLeadColumns().length || cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\n @for (column of cardLeadColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-lead\"\n [style.--kf-data-table-card-clamp]=\"column.cardClamp\"\n [attr.title]=\"cellValue(row, column) || null\"\n >\n <span class=\"kf-data-table__sr-only\">{{ column.label }}: </span>\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </div>\n }\n @for (column of cardFieldColumns(); track column.key) {\n <div class=\"kf-data-table__card-field\">\n <span class=\"kf-data-table__card-label kf-overline-text\">{{ column.label }}</span>\n <span\n class=\"kf-data-table__card-value\"\n [class.kf-data-table__card-value--emphasis]=\"column.emphasis\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n </div>\n }\n </div>\n }\n\n @if (cardMetaColumns().length) {\n <div class=\"kf-data-table__card-meta\">\n @for (column of cardMetaColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-meta-item\"\n [class.kf-data-table__card-meta-item--end]=\"\n isEndAligned(column) || column.emphasis\n \"\n [class.kf-data-table__card-meta-item--emphasis]=\"column.emphasis\"\n [style.flex-basis]=\"column.width\"\n >\n <span class=\"kf-data-table__card-label kf-overline-text\">{{ column.label }}</span>\n <span class=\"kf-data-table__card-meta-value\">\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n </div>\n }\n </div>\n }\n\n @if (cardActionColumns().length) {\n <div class=\"kf-data-table__card-actions\">\n @for (column of cardActionColumns(); track column.key) {\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n @if (!loading() && rows().length > 0) {\n <div class=\"kf-data-table__footer\">\n @if (effectivePageSize()) {\n <kf-pagination\n [page]=\"page()\"\n [pages]=\"totalPages()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [pageSize]=\"effectivePageSize()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"setPageSize($event)\"\n >\n {{ paginationSummary() }}\n </kf-pagination>\n }\n <ng-content select=\"[footer]\" />\n </div>\n }\n</div>\n\n<!-- Rótulo de una columna: texto visible o solo para lectores con `hideLabel`. -->\n<ng-template #headerLabel let-column>\n @if (column.hideLabel) {\n <span class=\"kf-data-table__sr-only\">{{ column.label }}</span>\n } @else {\n {{ column.label }}\n }\n</ng-template>\n\n<!-- Celda de la vista tabla — compartida por la celda normal y la `truncate`.\n Una columna `interactive` envuelve su contenido en un botón real. -->\n<ng-template #tableCell let-row let-column=\"column\" let-i=\"index\">\n @if (column.interactive) {\n <button\n type=\"button\"\n class=\"kf-data-table__cell-button\"\n [attr.aria-label]=\"cellLabel(row, column, i)\"\n (click)=\"onCellClick(row, column, i)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"tableCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </button>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"tableCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n</ng-template>\n\n<!-- Contenido de una celda de la vista tabla (template del consumidor,\n thumbnail o texto). -->\n<ng-template #tableCellContent let-row let-column=\"column\" let-i=\"index\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: column }\"\n />\n } @else if (column.cardRole === 'media') {\n <img class=\"kf-data-table__thumb\" [src]=\"cellValue(row, column)\" alt=\"\" />\n } @else {\n {{ cellValue(row, column) }}\n }\n</ng-template>\n\n<!-- Zona de la tarjeta: igual que la celda de tabla, con botón si la columna es `interactive`. -->\n<ng-template #cardCell let-row let-column=\"column\" let-i=\"index\">\n @if (column.interactive) {\n <button\n type=\"button\"\n class=\"kf-data-table__cell-button\"\n [attr.aria-label]=\"cellLabel(row, column, i)\"\n (click)=\"onCellClick(row, column, i)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </button>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cardCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n</ng-template>\n\n<!-- Contenido de una zona de la tarjeta: template del consumidor o el valor como texto. -->\n<ng-template #cardCellContent let-row let-column=\"column\" let-i=\"index\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: column }\"\n />\n } @else {\n {{ cellValue(row, column) }}\n }\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport type LinkVariant = 'default' | 'muted';\n\n/**\n * Acción de bajo énfasis con apariencia de texto — \"¿Olvidaste tu\n * contraseña?\", \"Volver a iniciar sesión\", o un link real de navegación\n * como \"Ir a pagos →\".\n *\n * Sin `href` (default) es un `<button type=\"button\">`: dispara una acción\n * en la misma pantalla, vía `(click)`. Con `href`, es un `<a>` real: navega\n * a otra URL. `showArrow` agrega un ícono `chevron-right` al final — para\n * el patrón \"texto + flecha\" de un link que lleva a otro lado.\n *\n * `variant=\"default\"` (color primario, subrayado en hover) es para la\n * acción de mayor jerarquía relativa de la pantalla; `variant=\"muted\"`\n * (gris que pasa a primario en hover) es para acciones de retroceso/salida.\n *\n * <kf-link (click)=\"onForgotPassword()\">¿Olvidaste tu contraseña?</kf-link>\n * <kf-link variant=\"muted\" (click)=\"onBack()\">← Volver a iniciar sesión</kf-link>\n * <kf-link href=\"/pagos\" showArrow>Ir a pagos</kf-link>\n */\n@Component({\n selector: 'kf-link',\n imports: [Icon, NgTemplateOutlet],\n templateUrl: './Link.html',\n styleUrl: './Link.css',\n})\nexport class Link {\n readonly variant = input<LinkVariant>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Si se pasa, renderiza un `<a>` real en vez de `<button>` — navega en vez de disparar `(click)`. */\n readonly href = input<string>();\n /** Ícono `chevron-right` al final — para el patrón \"texto + flecha\" de un link que lleva a otro lado. */\n readonly showArrow = input(false, { transform: booleanAttribute });\n}\n","<!--\n Una sola proyección compartida (ng-template + ngTemplateOutlet), no un\n <ng-content> por rama: Angular solo conecta la proyección real del\n consumidor a la PRIMERA instancia de <ng-content> que encuentra en el\n árbol de compilación — con un <ng-content> en cada rama del @if, la\n que no se activa en runtime igual \"roba\" la proyección (mismo bug ya\n resuelto en Text.ts).\n-->\n<ng-template #content>\n <ng-content />\n @if (showArrow()) {\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n }\n</ng-template>\n@if (href(); as url) {\n <a class=\"kf-link\" [class.kf-link--muted]=\"variant() === 'muted'\" [href]=\"url\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"kf-link\"\n [class.kf-link--muted]=\"variant() === 'muted'\"\n [disabled]=\"disabled()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport { Link } from '../link/Link';\n\n/** Color del chip de ícono. Identifica la CLASE de documento de un vistazo\n * en una lista de nombres de archivo parecidos entre sí. */\nexport type DocumentRowTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Fila de un documento descargable: chip de ícono coloreado por tipo,\n * título, metadata y la acción de descarga al final. Sin `href` rinde\n * `pendingLabel` en vez de un link roto. El contenido proyectado cae entre\n * la metadata y la acción, como slot para un `kf-badge` de estado.\n *\n * `loading` (default `false`): dibuja el esqueleto de la fila — chip, título,\n * metadata y acción como bloques del alto real de cada texto — con el mismo\n * cascarón, así que al llegar los datos no hay salto de layout. Pasa los\n * mismos inputs que usarás cargada (`meta` incluido, para reservar su línea).\n * Marca el host con `aria-busy=\"true\"` y oculta el contenido proyectado.\n *\n * <kf-document-row title=\"Factura\" meta=\"PDF · 120 KB\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-document-row',\n imports: [Icon, Link],\n templateUrl: './DocumentRow.html',\n styleUrl: './DocumentRow.css',\n host: {\n '[class]': '\"kf-document-row--\" + tone()',\n '[class.kf-document-row--loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class DocumentRow {\n readonly icon = input<IconName>('file');\n readonly tone = input<DocumentRowTone>('neutral');\n\n /** Qué documento es. El nombre humano del tipo, no el del archivo. */\n readonly title = input.required<string>();\n\n /** Línea secundaria — archivo, fecha, tamaño. El consumidor la arma ya\n * formateada: la librería no decide en qué unidad se lee un tamaño ni en\n * qué formato una fecha. */\n readonly meta = input<string>();\n\n /** Ausente rinde `pendingLabel` en vez del link de descarga. */\n readonly href = input<string>();\n\n readonly downloadLabel = input('Descargar');\n\n /** Qué se dice cuando no hay `href`. */\n readonly pendingLabel = input('En generación');\n\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","@if (loading()) {\n <span class=\"kf-document-row__icon kf-bone-fill\" aria-hidden=\"true\"></span>\n\n <span class=\"kf-document-row__body\" aria-hidden=\"true\">\n <span class=\"kf-document-row__title kf-bone\" style=\"--kf-bone-width: 55%\">{{ title() }}</span>\n @if (meta(); as line) {\n <span class=\"kf-document-row__meta kf-caption-text kf-bone\" style=\"--kf-bone-width: 35%\">{{\n line\n }}</span>\n }\n </span>\n\n <span class=\"kf-document-row__actions kf-document-row__actions--loading\" aria-hidden=\"true\">\n <ng-content />\n <span class=\"kf-document-row__pending kf-caption-text kf-bone\" style=\"--kf-bone-width: 5rem\">{{\n href() ? downloadLabel() : pendingLabel()\n }}</span>\n </span>\n} @else {\n <span class=\"kf-document-row__icon\" aria-hidden=\"true\">\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n </span>\n\n <span class=\"kf-document-row__body\">\n <span class=\"kf-document-row__title\">{{ title() }}</span>\n @if (meta(); as line) {\n <span class=\"kf-document-row__meta kf-caption-text\">{{ line }}</span>\n }\n </span>\n\n <span class=\"kf-document-row__actions\">\n <ng-content />\n @if (href(); as url) {\n <kf-link [href]=\"url\">{{ downloadLabel() }}</kf-link>\n } @else {\n <span class=\"kf-document-row__pending kf-caption-text\">{{ pendingLabel() }}</span>\n }\n </span>\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Mismo vocabulario que `Badge.tone`/`TextTone` (menos `info`/`service`,\n * que no aplican a un valor de progreso): `neutral` es el color de marca\n * por defecto (sin implicar buen/mal estado), `primary` es el color\n * primario para un avance de proceso (ej. una carga), y `ok`/`warn`/`error`\n * sí comunican severidad. `purple` es el acento morado de marca, igual al tono\n * `purple` de `kf-stat-card`. La librería no conoce el dominio que produce ese\n * valor (SLA, storage, lo que sea) — el consumidor decide qué tone usar. */\nexport type ProgressTone = 'neutral' | 'primary' | 'ok' | 'warn' | 'error' | 'purple';\n\n/** Grosor de la pista: `sm` 4px (el histórico), `md` 8px, `lg` 12px. */\nexport type ProgressSize = 'sm' | 'md' | 'lg';\n\n/**\n * Barra de progreso de un solo valor (0-100%) con color por severidad —\n * para un porcentaje simple, a diferencia de `kf-bucket-progress`, que\n * dibuja varias categorías proporcionales en la misma barra.\n *\n * <kf-progress [value]=\"80\" tone=\"ok\" label=\"80%\" />\n * <kf-progress [value]=\"ratio()\" [tone]=\"severityTone()\" />\n *\n * `value` se clampea a [0, 100] — un consumidor que calcule un ratio fuera\n * de rango (ej. tiempo transcurrido sobre un SLA ya vencido) no rompe el\n * ancho de la barra. `size` cambia el grosor de la pista (`sm` 4px, `md` 8px,\n * `lg` 12px; sin él, 4px como siempre); el `role=\"progressbar\"` y sus valores\n * accesibles no cambian. `label` es texto libre opcional sobre la barra (ej.\n * \"80%\"); sin él, no se renderiza ningún texto, solo la barra.\n */\n@Component({\n selector: 'kf-progress',\n templateUrl: './Progress.html',\n styleUrl: './Progress.css',\n})\nexport class Progress {\n readonly value = input.required<number>();\n readonly tone = input<ProgressTone>('neutral');\n /** Grosor de la pista. Default `sm` (4px). */\n readonly size = input<ProgressSize>('sm');\n readonly label = input<string>();\n /** Nombre accesible de la barra (`aria-label`). Sin él, el `progressbar`\n * queda sin nombre: dalo siempre que el contexto no lo nombre ya (por\n * ejemplo con un `label` visible asociado). */\n readonly ariaLabel = input<string>();\n\n protected readonly clampedValue = computed(() => Math.min(Math.max(this.value(), 0), 100));\n}\n","<div class=\"kf-progress\">\n @if (label(); as text) {\n <div class=\"kf-progress__top\">\n <span class=\"kf-progress__label kf-progress--{{ tone() }}\">{{ text }}</span>\n </div>\n }\n <div\n class=\"kf-progress__track kf-progress__track--{{ size() }}\"\n role=\"progressbar\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-valuenow]=\"clampedValue()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"kf-progress__fill kf-progress--{{ tone() }}\" [style.width.%]=\"clampedValue()\"></div>\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport { Progress, type ProgressTone } from '../progress/Progress';\n\nexport type StatCardTone = 'primary' | 'success' | 'error' | 'purple' | 'warn' | 'info' | 'neutral';\n\n/** Densidad de la card: `'compact'` reduce el padding, el ícono y el valor. */\nexport type StatCardDensity = 'default' | 'compact';\n\n/** Tono de `kf-progress` que acompaña a cada tono de la card. */\nconst BAR_TONE: Record<StatCardTone, ProgressTone> = {\n primary: 'primary',\n success: 'ok',\n error: 'error',\n warn: 'warn',\n purple: 'primary',\n info: 'primary',\n neutral: 'primary',\n};\n\n/**\n * Card de estadística horizontal: ícono circular grande a la izquierda,\n * valor + label + nota apilados al centro, chevron opcional al final si es\n * clickeable. Distinta de `kf-metric-card` (layout vertical, label arriba +\n * ícono a la derecha) — este es el patrón real del dashboard de OTD (\"Bonos\n * otorgados\", \"Cortesías otorgadas\"), no una variante de la misma card.\n *\n * <kf-stat-card icon=\"gift\" tone=\"purple\" value=\"4\" label=\"Bonos otorgados\" note=\"$15,000.00 en beneficios\" (cardClick)=\"onNavigate('beneficios')\" />\n *\n * Extensiones opcionales (la card sin ellas se ve y se comporta como siempre):\n * - `tone`: además de `primary|success|error|purple`, `warn`, `info` y `neutral`.\n * - `bar` (0-100): barra de progreso accesible (`kf-progress`, `role=\"progressbar\"`\n * con `aria-valuenow`/`min`/`max` y el `label` como nombre) bajo la nota. Se\n * acota a [0, 100]; `null`/`undefined` no la dibuja. Es un refuerzo visual:\n * el valor exacto conviene darlo también en texto (`hint`), porque el relleno\n * de algunos tonos de `kf-progress` tiene poco contraste con su pista.\n * - `hint`: texto secundario bajo la barra (ej. \"12 de 20 completadas\").\n * - `pressed` (`boolean | null`): con `clickable`, la card es un botón de\n * alternancia (`aria-pressed`), útil como filtro. `null` (default) = no\n * aplica y no emite el atributo. Sin `clickable` no tiene efecto.\n *\n * <kf-stat-card icon=\"clock\" tone=\"warn\" value=\"7\" label=\"Por vencer\" [bar]=\"35\" hint=\"7 de 20\"\n * clickable [pressed]=\"filter() === 'due'\" (cardClick)=\"toggle('due')\" />\n *\n * `density` (`'default'` | `'compact'`): `'compact'` es la variante para\n * pantallas angostas — padding de `--kf-space-md`, ícono de 40px y valor de\n * `--kf-font-size-title-sm`, con el mismo contenido. Si la card mide 210px de\n * ancho o menos (ej. una grilla 2x2 en teléfono), pasa además a dos filas:\n * ícono y valor en la primera, y label, nota, barra y `hint` debajo a todo el\n * ancho; el chevron se oculta. Solo la variante compacta convierte el host en\n * contenedor de tamaño (`container-type: inline-size`), así que debe tener un\n * ancho que no dependa de su contenido (celda de grilla, `width` explícito o\n * hijo de un contenedor en bloque). `'default'` no cambia nada.\n *\n * <kf-stat-card density=\"compact\" icon=\"clock\" value=\"7\" label=\"Por vencer\" />\n *\n * `loading` (default `false`): mientras es `true` la card dibuja su esqueleto\n * en vez del contenido, con el MISMO cascarón (borde, padding, ícono de 50px)\n * y líneas del alto real de cada texto — valor, etiqueta y, si se pasaron,\n * nota, barra y `hint` —, así que al llegar los datos no hay salto de\n * layout. Pasa los mismos inputs que usarás cargada para que el esqueleto\n * reserve las mismas líneas. Marca la card con `aria-busy=\"true\"`, no es\n * clicable ni expone su texto a lectores de pantalla mientras carga.\n *\n * <kf-stat-card icon=\"clock\" value=\"7\" label=\"Por vencer\" note=\"Esta semana\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-stat-card',\n imports: [Icon, NgTemplateOutlet, Progress],\n templateUrl: './StatCard.html',\n styleUrl: './StatCard.css',\n host: {\n '[class.kf-stat-card-host--compact]': \"density() === 'compact'\",\n },\n})\nexport class StatCard {\n readonly icon = input.required<IconName>();\n readonly tone = input<StatCardTone>('primary');\n readonly value = input.required<string | number>();\n readonly label = input.required<string>();\n readonly note = input<string>();\n /** Avance 0-100 (barra de progreso accesible); `null`/`undefined` = sin barra. */\n readonly bar = input<number | null | undefined>(undefined);\n /** Texto secundario bajo la barra (o bajo la nota si no hay barra). */\n readonly hint = input<string>();\n /**\n * Estado de alternancia (`aria-pressed`) cuando la card es `clickable`.\n * `null` (default) = no aplica: el atributo no se emite.\n */\n readonly pressed = input<boolean | null>(null);\n /** `'compact'`: variante para pantallas angostas; `'default'` no cambia la card. */\n readonly density = input<StatCardDensity>('default');\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Si se escucha `cardClick`, la card se renderiza como botón clickeable con chevron. */\n readonly clickable = input(false, { transform: booleanAttribute });\n readonly cardClick = output<void>();\n\n protected readonly barTone = computed(() => BAR_TONE[this.tone()]);\n protected readonly hasBar = computed(() => {\n const value = this.bar();\n return value !== null && value !== undefined && Number.isFinite(value);\n });\n}\n","@if (loading()) {\n <div\n class=\"kf-stat-card\"\n [class.kf-stat-card--compact]=\"density() === 'compact'\"\n aria-busy=\"true\"\n >\n <span\n class=\"kf-stat-card__icon kf-stat-card__icon--bone kf-bone-fill\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"kf-stat-card__body\" aria-hidden=\"true\">\n <span class=\"kf-stat-card__value kf-bone\" style=\"--kf-bone-width: 40%\">{{ value() }}</span>\n <span class=\"kf-stat-card__label kf-bone\" style=\"--kf-bone-width: 70%\">{{ label() }}</span>\n @if (note()) {\n <span class=\"kf-stat-card__note kf-bone\" style=\"--kf-bone-width: 55%\">{{ note() }}</span>\n }\n @if (hasBar()) {\n <span class=\"kf-stat-card__bar\">\n <span class=\"kf-stat-card__bar-bone kf-bone-fill\"></span>\n </span>\n }\n @if (hint()) {\n <span class=\"kf-stat-card__hint kf-bone\" style=\"--kf-bone-width: 45%\">{{ hint() }}</span>\n }\n </span>\n </div>\n} @else if (clickable()) {\n <button\n type=\"button\"\n class=\"kf-stat-card kf-stat-card--clickable\"\n [class.kf-stat-card--compact]=\"density() === 'compact'\"\n [class.kf-stat-card--pressed]=\"pressed() === true\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"cardClick.emit()\"\n >\n <ng-container *ngTemplateOutlet=\"content\" />\n <kf-icon class=\"kf-stat-card__chevron\" name=\"chevron-right\" size=\"sm\" />\n </button>\n} @else {\n <div class=\"kf-stat-card\" [class.kf-stat-card--compact]=\"density() === 'compact'\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </div>\n}\n\n<ng-template #content>\n <span class=\"kf-stat-card__icon\" [class]=\"'kf-stat-card__icon--' + tone()\">\n <kf-icon [name]=\"icon()\" size=\"md\" />\n </span>\n <span class=\"kf-stat-card__body\">\n <span class=\"kf-stat-card__value\">{{ value() }}</span>\n <span class=\"kf-stat-card__label\">{{ label() }}</span>\n @if (note()) {\n <span class=\"kf-stat-card__note\">{{ note() }}</span>\n }\n @if (hasBar()) {\n <kf-progress\n class=\"kf-stat-card__bar\"\n [value]=\"bar()!\"\n [tone]=\"barTone()\"\n [ariaLabel]=\"label()\"\n />\n }\n @if (hint()) {\n <span class=\"kf-stat-card__hint\">{{ hint() }}</span>\n }\n </span>\n</ng-template>\n","import { Component, computed, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { DataTable, type DataTableColumn } from '../data-table/DataTable';\nimport { DocumentRow } from '../document-row/DocumentRow';\nimport { StatCard } from '../stat-card/StatCard';\nimport { Skeleton } from './Skeleton';\n\n/** Forma de contenido que reproduce el preset. */\nexport type SkeletonPresetVariant =\n 'kpi-grid' | 'card-grid' | 'form' | 'list' | 'table' | 'timeline' | 'detail-header';\n\n/** Cantidad de elementos por defecto de cada variante (`count` sin valor). */\nconst DEFAULT_COUNT: Record<SkeletonPresetVariant, number> = {\n 'kpi-grid': 4,\n 'card-grid': 6,\n form: 4,\n list: 4,\n table: 5,\n timeline: 4,\n 'detail-header': 1,\n};\n\n/** Tope de elementos: un `count` mayor se acota, no tiene sentido pintar más. */\nexport const SKELETON_PRESET_MAX_COUNT = 12;\n\n/**\n * Esqueletos listos para usar que reproducen la FORMA del contenido real, para\n * que al llegar los datos nada se mueva. Cada variante se arma con la misma\n * geometría que su equivalente cargado (mismos cascarones, alturas, radios y\n * gaps, todo por tokens):\n *\n * | `variant` | Equivalente cargado | `count` | `columns` |\n * | ---------------- | ---------------------------- | -------------- | ------------------ |\n * | `kpi-grid` | `kf-stat-card` | tarjetas (4) | columnas de la grilla |\n * | `card-grid` | `kf-card` | tarjetas (6) | columnas de la grilla |\n * | `form` | `kf-input` con label | campos (4) | `1` o `2` |\n * | `list` | `kf-document-row` | filas (4) | — |\n * | `table` | `kf-data-table` | filas (5) | columnas (4) |\n * | `timeline` | `kf-milestone-timeline` | etapas (4) | — |\n * | `detail-header` | `kf-page-header` con ícono | — | — |\n *\n * Sin `columns`, las grillas (`kpi-grid`, `card-grid`) se reparten solas con un\n * ancho mínimo por tarjeta. `count` se acota a 12.\n *\n * El preset es decorativo (`aria-hidden` por dentro) y marca su contenedor con\n * `aria-busy=\"true\"`. Con `label` agrega un texto visualmente oculto con\n * `role=\"status\"` que lo anuncia a lectores de pantalla; dentro de\n * `kf-content-state` no hace falta (ya lo anuncia él).\n *\n * <kf-skeleton-preset variant=\"kpi-grid\" [count]=\"4\" />\n * <kf-skeleton-preset variant=\"form\" [count]=\"3\" [columns]=\"2\" label=\"Cargando formulario\" />\n * <kf-content-state [state]=\"state()\" loadingPreset=\"table\">…</kf-content-state>\n */\n@Component({\n selector: 'kf-skeleton-preset',\n imports: [Card, DataTable, DocumentRow, Skeleton, StatCard],\n templateUrl: './SkeletonPreset.html',\n styleUrl: './SkeletonPreset.css',\n})\nexport class SkeletonPreset {\n readonly variant = input<SkeletonPresetVariant>('list');\n /** Cantidad de elementos. Sin valor, el de la variante. Máximo 12. */\n readonly count = input<number | undefined>(undefined);\n /** Columnas: de la grilla (`kpi-grid`, `card-grid`), del formulario (`1`|`2`) o de la tabla. */\n readonly columns = input<number | undefined>(undefined);\n /** Texto accesible (visualmente oculto, `role=\"status\"`). Vacío, no se emite. */\n readonly label = input('');\n\n protected readonly total = computed(() => {\n const requested = this.count() ?? DEFAULT_COUNT[this.variant()];\n return Math.min(Math.max(Math.floor(requested) || 0, 1), SKELETON_PRESET_MAX_COUNT);\n });\n protected readonly items = computed(() => Array.from({ length: this.total() }, (_, i) => i));\n\n /** Columnas de la tabla sintética (encabezados en blanco: lo real aún no llegó). */\n protected readonly tableColumns = computed<DataTableColumn[]>(() =>\n Array.from({ length: Math.min(Math.max(this.columns() ?? 4, 1), 8) }, (_, i) => ({\n key: `c${i}`,\n label: ' ',\n })),\n );\n protected readonly formColumns = computed(() => (this.columns() === 2 ? 2 : 1));\n}\n","<div\n [class]=\"'kf-skeleton-preset kf-skeleton-preset--' + variant()\"\n aria-busy=\"true\"\n [style.--kf-skeleton-preset-columns]=\"columns() ?? null\"\n>\n @if (label()) {\n <span class=\"kf-sr-only\" role=\"status\">{{ label() }}</span>\n }\n @switch (variant()) {\n @case ('kpi-grid') {\n <div class=\"kf-skeleton-preset__grid\" [class.kf-skeleton-preset__grid--fixed]=\"!!columns()\">\n @for (i of items(); track i) {\n <kf-stat-card [loading]=\"true\" icon=\"bell\" value=\"0\" label=\"Etiqueta\" note=\"Nota\" />\n }\n </div>\n }\n @case ('card-grid') {\n <div class=\"kf-skeleton-preset__grid\" [class.kf-skeleton-preset__grid--fixed]=\"!!columns()\">\n @for (i of items(); track i) {\n <kf-card gap=\"sm\" aria-hidden=\"true\">\n <kf-skeleton variant=\"rect\" height=\"7.5rem\" />\n <kf-skeleton width=\"60%\" height=\"1.25rem\" />\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n </kf-card>\n }\n </div>\n }\n @case ('form') {\n <div\n class=\"kf-skeleton-preset__form\"\n [class.kf-skeleton-preset__form--two]=\"formColumns() === 2\"\n aria-hidden=\"true\"\n >\n @for (i of items(); track i) {\n <div class=\"kf-skeleton-preset__field\">\n <span\n class=\"kf-skeleton-preset__label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 30%\"\n >\n Etiqueta\n </span>\n <span class=\"kf-skeleton-preset__control\">\n <span class=\"kf-skeleton-preset__value kf-bone\" style=\"--kf-bone-width: 55%\"\n >Valor</span\n >\n </span>\n </div>\n }\n </div>\n }\n @case ('list') {\n <div class=\"kf-skeleton-preset__stack\">\n @for (i of items(); track i) {\n <kf-document-row [loading]=\"true\" title=\"Documento\" meta=\"Archivo · 120 KB\" />\n }\n </div>\n }\n @case ('table') {\n <kf-data-table\n [columns]=\"tableColumns()\"\n [rows]=\"[]\"\n [loading]=\"true\"\n [skeletonRows]=\"total()\"\n />\n }\n @case ('timeline') {\n <div class=\"kf-skeleton-preset__timeline\" aria-hidden=\"true\">\n <div class=\"kf-skeleton-preset__timeline-toolbar\">\n <span class=\"kf-skeleton-preset__timeline-heading kf-bone\" style=\"--kf-bone-width: 30%\">\n Etapas\n </span>\n <span class=\"kf-skeleton-preset__timeline-toggle kf-bone\" style=\"--kf-bone-width: 7rem\">\n Expandir todo\n </span>\n </div>\n <ol class=\"kf-skeleton-preset__timeline-list\">\n @for (i of items(); track i) {\n <li class=\"kf-skeleton-preset__timeline-group\">\n <span class=\"kf-skeleton-preset__timeline-node kf-bone-fill\"></span>\n <span class=\"kf-skeleton-preset__timeline-text\">\n <span\n class=\"kf-skeleton-preset__timeline-title kf-bone\"\n style=\"--kf-bone-width: 45%\"\n >\n Etapa\n </span>\n <span\n class=\"kf-skeleton-preset__timeline-meta kf-bone\"\n style=\"--kf-bone-width: 30%\"\n >\n Detalle\n </span>\n </span>\n </li>\n }\n </ol>\n </div>\n }\n @case ('detail-header') {\n <div class=\"kf-skeleton-preset__header\" aria-hidden=\"true\">\n <span class=\"kf-skeleton-preset__header-icon kf-bone-fill\"></span>\n <span class=\"kf-skeleton-preset__header-heading\">\n <span class=\"kf-skeleton-preset__header-title kf-bone\" style=\"--kf-bone-width: 40%\">\n Título\n </span>\n <span class=\"kf-skeleton-preset__header-subtitle kf-bone\" style=\"--kf-bone-width: 60%\">\n Subtítulo\n </span>\n </span>\n </div>\n }\n }\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { EmptyState } from '../empty-state/EmptyState';\nimport type { IconName } from '../icon/icon-name';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { SkeletonPreset, type SkeletonPresetVariant } from '../skeleton/SkeletonPreset';\nimport { Spinner } from '../spinner/Spinner';\n\n/** En qué estado está la sección. */\nexport type ContentStateKind = 'ready' | 'loading' | 'empty' | 'error';\n\n/** Cómo se dibuja `loading`. Default `'skeleton'`. */\nexport type ContentStateLoad = 'skeleton' | 'spinner';\n\n/**\n * Marca el `ng-template` que reemplaza el esqueleto genérico de\n * `kf-content-state` mientras carga (`state=\"loading\"`, `load=\"skeleton\"`).\n *\n * <kf-content-state [state]=\"state()\">\n * <ng-template kfContentStateLoading><kf-skeleton-preset variant=\"kpi-grid\" /></ng-template>\n * …\n * </kf-content-state>\n */\n@Directive({ selector: 'ng-template[kfContentStateLoading]' })\nexport class ContentStateLoading {}\n\n/**\n * Wrapper de los cuatro estados que toda sección tiene: cargando, con datos,\n * vacía y con error. Un componente en vez de tres `@if` sueltos, porque es\n * siempre el mismo slot el que va rotando entre los cuatro.\n *\n * Con `state=\"ready\"` proyecta el contenido real y desaparece; en los otros\n * tres dibuja el placeholder correspondiente y el contenido no se instancia.\n * No inventa visuales propios: `loading` usa `kf-skeleton` (o `kf-spinner` con\n * `load=\"spinner\"`), y `empty`/`error` usan `kf-empty-state`.\n *\n * Las acciones (reintentar, crear) van en el slot `actions` — se ignoran\n * mientras carga, porque no hay nada que reintentar todavía.\n *\n * Anuncios para lectores de pantalla: al cargar con silueta, `loadingLabel`\n * se anuncia en una región `status` (con `load=\"spinner\"` ya lo anuncia el\n * propio `kf-spinner`); un error entra como `role=\"alert\"` (interrumpe) y el\n * estado vacío como `role=\"status\"` (cortés). `icon` dibuja el glifo de\n * `kf-empty-state` en esos dos estados.\n *\n * <kf-content-state [state]=\"state()\" title=\"No pudimos cargar tus vehículos\"\n * subtitle=\"Revisá tu conexión e intentá de nuevo.\">\n * <kf-button actions (click)=\"retry()\">Reintentar</kf-button>\n * <kf-data-table [columns]=\"cols\" [rows]=\"rows()\" />\n * </kf-content-state>\n *\n * Esqueleto de carga: por defecto son tres líneas genéricas. Para que la\n * carga se parezca a lo que va a aparecer, hay tres vías (de la más corta a la\n * más libre): `loadingPreset` (una variante de `kf-skeleton-preset`), el input\n * `loadingTemplate` (un `TemplateRef`) o un `ng-template` marcado con\n * `kfContentStateLoading` dentro del contenido. Si hay más de una, gana la\n * plantilla proyectada, luego `loadingTemplate` y por último `loadingPreset`.\n *\n * <kf-content-state [state]=\"state()\" loadingPreset=\"kpi-grid\">…</kf-content-state>\n *\n * Accesibilidad: en modo skeleton el contenedor lleva `aria-busy=\"true\"` y un\n * texto visualmente oculto con `role=\"status\"` (`loadingLabel`, \"Cargando…\" por\n * defecto) que anuncia el estado una vez. Con `load=\"spinner\"` el texto es el\n * del propio `kf-spinner`. El contenedor reserva un ancho mínimo, así que el\n * esqueleto no colapsa a 0 dentro de un padre que se ajusta a su contenido.\n */\n@Component({\n selector: 'kf-content-state',\n imports: [EmptyState, NgTemplateOutlet, Skeleton, SkeletonPreset, Spinner],\n templateUrl: './ContentState.html',\n styleUrl: './ContentState.css',\n})\nexport class ContentState {\n readonly state = input.required<ContentStateKind>();\n /** Forma del estado de carga: silueta (default) o spinner. */\n readonly load = input<ContentStateLoad>('skeleton');\n /** Título de `empty`/`error`. Ignorado mientras carga. */\n readonly title = input('');\n readonly subtitle = input('');\n /** Glifo de `empty`/`error` (el mismo input de `kf-empty-state`). Sin valor, no se dibuja ícono. */\n readonly icon = input<IconName>();\n /** Texto de carga: visible al lado del spinner con `load=\"spinner\"` y, en modo\n * skeleton, texto visualmente oculto con `role=\"status\"` para lectores de pantalla. */\n readonly loadingLabel = input('Cargando…');\n /** Plantilla propia del esqueleto (reemplaza las tres líneas genéricas). */\n readonly loadingTemplate = input<TemplateRef<unknown> | null>(null);\n /** Variante de `kf-skeleton-preset` como esqueleto de carga. */\n readonly loadingPreset = input<SkeletonPresetVariant | null>(null);\n\n /** `ng-template[kfContentStateLoading]` proyectado como contenido. */\n protected readonly projectedLoading = contentChild(ContentStateLoading, {\n read: TemplateRef,\n });\n protected readonly customLoading = computed(\n () => this.projectedLoading() ?? this.loadingTemplate(),\n );\n}\n","@switch (state()) {\n @case ('ready') {\n <ng-content />\n }\n @case ('loading') {\n @if (load() === 'skeleton') {\n <!-- Fuera del contenedor `aria-busy`: una región viva ocupada no anuncia nada. -->\n <span class=\"kf-sr-only\" role=\"status\">{{ loadingLabel() }}</span>\n }\n <div class=\"kf-content-state__loading\" aria-busy=\"true\">\n @if (load() === 'spinner') {\n <kf-spinner [label]=\"loadingLabel()\" />\n } @else {\n @if (customLoading(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" />\n } @else if (loadingPreset(); as preset) {\n <kf-skeleton-preset [variant]=\"preset\" />\n } @else {\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n <kf-skeleton width=\"60%\" />\n }\n }\n </div>\n }\n @default {\n <kf-empty-state\n [tone]=\"state() === 'error' ? 'error' : 'neutral'\"\n [icon]=\"icon()\"\n [attr.role]=\"state() === 'error' ? 'alert' : 'status'\"\n >\n @if (title()) {\n <p class=\"kf-content-state__title\">{{ title() }}</p>\n }\n @if (subtitle()) {\n <p class=\"kf-content-state__subtitle\">{{ subtitle() }}</p>\n }\n <div class=\"kf-content-state__actions\"><ng-content select=\"[actions]\" /></div>\n </kf-empty-state>\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { Icon } from '../icon/Icon';\n\nexport type ContentViewerType = 'image' | 'video' | 'pdf';\n\nconst RAW_BASE64_MIME: Record<ContentViewerType, string> = {\n image: 'image/jpeg',\n video: 'video/mp4',\n pdf: 'application/pdf',\n};\n\n/** Solo contenido ya en memoria: un `<iframe>` con una URL remota arbitraria podría cargar cualquier página. */\nconst LOCAL_PDF_SRC = /^(blob:|data:application\\/pdf[;,])/i;\n\nlet contentViewerId = 0;\n\n/**\n * Visor a pantalla completa para ampliar una pieza de contenido: imagen,\n * video o PDF (`type=\"pdf\"`, renderizado por el visor nativo del navegador).\n * Mismo mecanismo que `kf-modal` (el `<dialog>` nativo resuelve backdrop,\n * atrapado de foco, top-layer y `Escape`), pero sin panel/título/footer:\n * el contenido ocupa toda la pantalla sobre un backdrop oscuro.\n *\n * `src` acepta lo que venga del backend sin que el consumidor tenga que\n * normalizarlo primero: una URL (`http(s)://`), un data URI ya armado\n * (`data:...`), o base64 crudo (se le antepone el prefijo `data:` según\n * `type`, asumiendo JPEG para imagen, MP4 para video y PDF para pdf). Un PDF\n * solo acepta contenido local (`blob:`, data URI o base64), nunca una URL remota.\n *\n * Lo proyectado con el atributo `actions` (p. ej. un botón de descarga) va en\n * la barra superior, junto al título.\n *\n * <kf-content-viewer [(open)]=\"viewerOpen\" [src]=\"viewerSrc()\" alt=\"Foto del vehículo\" />\n * <kf-content-viewer [(open)]=\"viewerOpen\" type=\"video\" [src]=\"viewerSrc()\" title=\"Inspección\" />\n * <kf-content-viewer [(open)]=\"viewerOpen\" type=\"pdf\" [src]=\"blobUrl()\" title=\"Contrato\">\n * <kf-button actions variant=\"surface\" icon=\"download\" (click)=\"save()\">Descargar</kf-button>\n * </kf-content-viewer>\n */\n@Component({\n selector: 'kf-content-viewer',\n imports: [Icon],\n templateUrl: './ContentViewer.html',\n styleUrl: './ContentViewer.css',\n})\nexport class ContentViewer {\n readonly type = input<ContentViewerType>('image');\n /** URL, data URI, o base64 crudo — ver JSDoc de la clase. */\n readonly src = input<string | null>(null);\n /** Texto alternativo cuando `type=\"image\"`. */\n readonly alt = input('');\n readonly title = input('');\n /** Visibilidad, two-way: `[(open)]=\"viewerOpen\"`. */\n readonly open = model(false);\n /** Permite cerrar con el botón, `Escape` o clic en el backdrop. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n\n protected readonly titleId = `kf-content-viewer-title-${contentViewerId++}`;\n\n /** Detecta si `src` ya es una URL o un data URI armado; si no, asume\n * base64 crudo y le antepone el prefijo `data:` correspondiente a `type`\n * — el backend a veces manda una cosa, a veces la otra. */\n protected readonly resolvedSrc = computed(() => {\n const raw = this.src();\n if (!raw) return null;\n if (/^(https?:|data:|blob:)/i.test(raw)) return raw;\n return `data:${RAW_BASE64_MIME[this.type()]};base64,${raw}`;\n });\n\n protected readonly pdfSrc = computed<SafeResourceUrl | null>(() => {\n const src = this.resolvedSrc();\n if (this.type() !== 'pdf' || !src || !LOCAL_PDF_SRC.test(src)) return null;\n return this.sanitizer.bypassSecurityTrustResourceUrl(src);\n });\n\n protected readonly fallbackLabel = computed(\n () =>\n ({ image: 'Visor de imagen', video: 'Visor de video', pdf: 'Visor de documento' })[\n this.type()\n ],\n );\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly document = inject(DOCUMENT);\n private readonly sanitizer = inject(DomSanitizer);\n\n constructor() {\n afterRenderEffect(() => {\n const el = this.dialog()?.nativeElement;\n if (!el) {\n return;\n }\n if (this.open() && !el.open) {\n // `showModal` no existe en jsdom (tests) ni en entornos sin\n // top-layer; el atributo `open` lo deja visible, aunque no modal.\n if (typeof el.showModal === 'function') {\n el.showModal();\n } else {\n el.open = true;\n }\n } else if (!this.open() && el.open) {\n if (typeof el.close === 'function') {\n el.close();\n } else {\n el.open = false;\n }\n }\n // `<dialog>` inertiza el resto de la página pero no frena su scroll.\n this.document.body.style.overflow = this.open() ? 'hidden' : '';\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n });\n }\n\n /** `Escape` dispara `cancel`; cancelarlo lo deja abierto. */\n protected onCancel(event: Event): void {\n if (!this.dismissible()) {\n event.preventDefault();\n }\n }\n\n /**\n * Clic en el backdrop. Un clic en la zona del backdrop tiene como `target` al\n * propio `<dialog>` (el contenido vive en el panel de adentro), así que basta\n * comparar contra él — no hace falta cortar la propagación en el panel.\n */\n @HostListener('click', ['$event'])\n protected onHostClick(event: MouseEvent): void {\n if (this.dismissible() && event.target === this.dialog()?.nativeElement) {\n this.open.set(false);\n }\n }\n}\n","<dialog\n #dialog\n class=\"kf-content-viewer\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n [attr.aria-label]=\"title() ? null : fallbackLabel()\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n>\n @if (open()) {\n <div class=\"kf-content-viewer__panel\">\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-content-viewer__close\"\n aria-label=\"Cerrar visor\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"md\" />\n </button>\n }\n <div class=\"kf-content-viewer__bar\">\n @if (title()) {\n <span class=\"kf-content-viewer__title\" [id]=\"titleId\">{{ title() }}</span>\n }\n <div class=\"kf-content-viewer__actions\"><ng-content select=\"[actions]\" /></div>\n </div>\n <div class=\"kf-content-viewer__stage\">\n @if (type() === 'pdf') {\n @if (pdfSrc(); as src) {\n <iframe\n class=\"kf-content-viewer__document\"\n [src]=\"src\"\n [title]=\"title() || fallbackLabel()\"\n ></iframe>\n }\n } @else if (resolvedSrc(); as src) {\n @if (type() === 'video') {\n <video class=\"kf-content-viewer__media\" [src]=\"src\" controls autoplay></video>\n } @else {\n <img class=\"kf-content-viewer__media\" [src]=\"src\" [alt]=\"alt()\" />\n }\n }\n </div>\n </div>\n }\n</dialog>\n","import { Component, computed, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { Select } from '../select/Select';\n\n/**\n * Paginador «Anterior / Siguiente» para listas con cursor: no conoce el\n * número de página, solo si hay una anterior o una siguiente y un resumen ya\n * armado. Complementa a `kf-pagination`, que exige número de página y total.\n *\n * `summary` (\"Mostrando 25 de 96\") se anuncia en una región `status`. Los\n * botones usan `aria-disabled` y no `disabled`, para que el foco no se pierda\n * al llegar a un extremo (un botón `disabled` deja de ser enfocable y el foco\n * cae al `body`); pulsarlos en ese estado no emite nada.\n *\n * Con `pageSizeOptions` agrega el selector \"Filas por página\"; vacío lo oculta.\n *\n * <kf-cursor-pager summary=\"Mostrando 25 de 96\" [hasPrevious]=\"!!prev()\" [hasNext]=\"!!next()\"\n * [pageSizeOptions]=\"[25, 50, 100]\" [pageSize]=\"size()\"\n * (previous)=\"load(prev())\" (next)=\"load(next())\" (pageSizeChange)=\"size.set($event)\" />\n */\n@Component({\n selector: 'kf-cursor-pager',\n imports: [Icon, Select],\n templateUrl: './CursorPager.html',\n styleUrl: './CursorPager.css',\n})\nexport class CursorPager {\n /** Texto anunciado y mostrado a la izquierda, p. ej. «Mostrando 25 de 96». */\n readonly summary = input('');\n readonly hasPrevious = input(false);\n readonly hasNext = input(false);\n /** Opciones del selector de filas por página. Vacío oculta el selector. */\n readonly pageSizeOptions = input<readonly number[]>([]);\n readonly pageSize = input<number | undefined>();\n /** Nombre accesible de la navegación. */\n readonly ariaLabel = input('Paginación');\n\n readonly previous = output<void>();\n readonly next = output<void>();\n readonly pageSizeChange = output<number>();\n\n protected readonly sizeOptions = computed(() =>\n this.pageSizeOptions().map((size) => ({ value: String(size), label: String(size) })),\n );\n protected readonly sizeValue = computed(() => String(this.pageSize() ?? ''));\n\n protected onPrevious(): void {\n if (this.hasPrevious()) {\n this.previous.emit();\n }\n }\n\n protected onNext(): void {\n if (this.hasNext()) {\n this.next.emit();\n }\n }\n\n protected onPageSize(value: string): void {\n const size = Number(value);\n if (Number.isFinite(size) && size !== this.pageSize()) {\n this.pageSizeChange.emit(size);\n }\n }\n}\n","<div class=\"kf-cursor-pager\">\n <div class=\"kf-cursor-pager__summary\" role=\"status\" aria-live=\"polite\">{{ summary() }}</div>\n\n <div class=\"kf-cursor-pager__controls\">\n @if (sizeOptions().length > 0) {\n <div class=\"kf-cursor-pager__size\">\n <span class=\"kf-cursor-pager__size-label\" aria-hidden=\"true\">Filas</span>\n <kf-select\n variant=\"compact\"\n label=\"Filas por página\"\n hideLabel\n [options]=\"sizeOptions()\"\n [value]=\"sizeValue()\"\n (valueChange)=\"onPageSize($event)\"\n />\n </div>\n <span class=\"kf-cursor-pager__divider\" aria-hidden=\"true\"></span>\n }\n\n <nav class=\"kf-cursor-pager__nav\" [attr.aria-label]=\"ariaLabel()\">\n <button\n type=\"button\"\n class=\"kf-cursor-pager__button\"\n [attr.aria-disabled]=\"!hasPrevious()\"\n (click)=\"onPrevious()\"\n >\n <kf-icon name=\"chevron-left\" size=\"sm\" />\n Anterior\n </button>\n <button\n type=\"button\"\n class=\"kf-cursor-pager__button kf-cursor-pager__button--next\"\n [attr.aria-disabled]=\"!hasNext()\"\n (click)=\"onNext()\"\n >\n Siguiente\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </button>\n </nav>\n </div>\n</div>\n","import { computed, Signal } from '@angular/core';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport type { DataTableView } from './DataTable';\n\n/**\n * Signal con la vista de `kf-data-table` ('table' | 'cards') derivada de un\n * breakpoint — mismo criterio que cualquier tabla con muchas columnas: bajo\n * el ancho dado, la vista de tabla no entra sin scroll horizontal, así que\n * se fuerza `cards`. Centraliza el patrón `matchMediaSignal` +\n * `computed<DataTableView>` que cada tabla del portal repetía igual.\n *\n * protected readonly tableView = dataTableViewSignal();\n * // con un breakpoint distinto al default de 900px:\n * protected readonly tableView = dataTableViewSignal('(max-width: 768px)');\n */\nexport function dataTableViewSignal(query = '(max-width: 900px)'): Signal<DataTableView> {\n const isMobile = matchMediaSignal(query);\n return computed(() => (isMobile() ? 'cards' : 'table'));\n}\n","import { Component, input } from '@angular/core';\n\nexport type DividerOrientation = 'horizontal' | 'vertical';\n\n/**\n * Separador visual simple entre bloques de contenido. `orientation`\n * controla si es una línea horizontal (para separar secciones apiladas) o\n * vertical (para separar elementos en una fila, ej. acciones en una toolbar,\n * o las columnas de metadata en `kf-company-selector`).\n *\n * En `vertical`, el divisor necesita una altura del contexto donde vive —\n * `:host { align-self: stretch }` lo hace ocupar la altura del contenedor\n * flex/grid padre sin que el consumidor tenga que fijarla a mano. `flex:\n * none` evita que el propio divisor se achique a 0 dentro de ese contenedor\n * flex cuando hay contenido hermano compitiendo por espacio.\n *\n * <kf-divider />\n * <kf-divider orientation=\"vertical\" />\n */\n@Component({\n selector: 'kf-divider',\n template: '',\n styleUrl: './Divider.css',\n host: {\n role: 'separator',\n '[attr.orientation]': 'orientation()',\n '[attr.aria-orientation]': 'orientation()',\n },\n})\nexport class Divider {\n readonly orientation = input<DividerOrientation>('horizontal');\n}\n","import type { OverlayContainer } from '@angular/cdk/overlay';\n\n/**\n * Forma mínima que necesita este módulo — angosta el parámetro al único\n * miembro que usa en vez de exigir la clase concreta completa. Además de\n * desacoplar del CDK, evita que los specs necesiten un `as unknown as\n * OverlayContainer` para pasar un mock: un objeto literal con solo este\n * método ya satisface el tipo por estructura.\n */\nexport type OverlayContainerLike = Pick<OverlayContainer, 'getContainerElement'>;\n\n/**\n * Contenedores modales abiertos actualmente: un `<dialog>` abierto vía\n * `showModal()` (`kf-modal`) o el panel de un `kf-drawer` con\n * `role=\"dialog\"` (`aria-modal=\"true\"`), en orden de apertura. Con diálogos\n * anidados el navegador apila el top layer: el más reciente queda arriba e\n * inertiza a los anteriores (incluidos otros `<dialog>` ya abiertos), así\n * que el ÚLTIMO de esta lista es el único candidato válido para recibir el\n * overlay container — nunca \"cualquier `dialog[open]` de la página\", que\n * rompería con dos `kf-modal` anidados o con dos independientes donde solo\n * uno está abierto.\n */\nconst openModalDialogs: HTMLElement[] = [];\n\n/**\n * Reubicadores de los `OverlayContainer` parchados. Cada cambio en el\n * registro los ejecuta, así el contenedor vuelve a `<body>` (o pasa al\n * siguiente contenedor modal) al cerrar, sin esperar a que otro overlay\n * llame a `getContainerElement()`: un panel con el `overlayRef` ya creado\n * que se vuelve a abrir no pasa por esa llamada, y si el contenedor seguía\n * dentro de un diálogo cerrado quedaba invisible.\n */\nconst relocators = new Set<() => boolean>();\n\nfunction relocateContainers(): void {\n for (const relocate of [...relocators]) {\n if (!relocate()) {\n relocators.delete(relocate);\n }\n }\n}\n\n/** Llamado por `Modal` cuando su `<dialog>` pasa a estar abierto, y por `Drawer` (`role=\"dialog\"`) con su panel. */\nexport function registerOpenModalDialog(dialog: HTMLElement): void {\n if (!openModalDialogs.includes(dialog)) {\n openModalDialogs.push(dialog);\n relocateContainers();\n }\n}\n\n/** Llamado por `Modal`/`Drawer` cuando su contenedor se cierra o el componente se destruye. */\nexport function unregisterOpenModalDialog(dialog: HTMLElement): void {\n const index = openModalDialogs.indexOf(dialog);\n if (index !== -1) {\n openModalDialogs.splice(index, 1);\n relocateContainers();\n }\n}\n\nfunction topmostOpenModalDialog(): HTMLElement | undefined {\n return openModalDialogs.at(-1);\n}\n\n/**\n * Instancias de `OverlayContainer` ya parchadas — evita parchar dos veces\n * el mismo objeto (varios `kf-modal` en el árbol llaman a esta función) y,\n * a la vez, no interfiere con instancias nuevas que arma un `TestBed` fresco\n * en cada spec (root providers se recrean por test).\n */\nconst patchedContainers = new WeakSet<OverlayContainerLike>();\n\n/**\n * `showModal()` promueve el `<dialog>` al top layer del navegador y vuelve\n * `inert` todo lo que quede fuera de su subárbol — pero Angular CDK\n * (`Overlay`/`OverlayContainer`, usado por `kf-select`, `kf-multi-select`,\n * `kf-dropdown`, `kf-tooltip` y el selector de tamaño de `kf-pagination`)\n * siempre appendea `.cdk-overlay-container` como hijo de `<body>`, que\n * queda fuera del `<dialog>` y por lo tanto inerte: el overlay se ve pero\n * no recibe clicks.\n *\n * No existe una forma de reemplazar, sin que el consumidor configure nada,\n * QUÉ IMPLEMENTACIÓN resuelve Angular DI para el token `OverlayContainer`:\n * es `providedIn: 'root'`, y la instancia se crea una sola vez contra el\n * inyector RAÍZ de la app la primera vez que algo la necesita — incluida\n * la propia `Overlay`, que la inyecta puertas adentro de SU construcción,\n * no en el inyector del componente que gatilló esa construcción. Un\n * `providers` a nivel de componente (`kf-modal`, o incluso `kf-select`)\n * nunca llega a interceptar esa creación; solo un `providers` explícito en\n * el bootstrap de cada app lo haría, y eso es justo la configuración manual\n * que se quiere evitar.\n *\n * Por eso el fix no reemplaza la clase vía DI: parcha, una sola vez, el\n * MISMO objeto singleton que ya usa toda la app (la instancia real que\n * `Modal` recibe con un `inject(OverlayContainer)` normal — automático\n * apenas se usa `kf-modal`, sin tocar ningún `providers`). `getContainerElement`\n * sigue delegando en el original para crear/cachear el div la primera vez;\n * lo único que se agrega es reubicarlo, en cada llamada, dentro del\n * `<dialog>` abierto más reciente (o de vuelta en `<body>` si no hay\n * ninguno) antes de devolverlo — mover el div se lleva puestos a sus hijos,\n * así que overlays ya adjuntos antes de abrir el modal quedan igual de\n * bien ubicados que los que se abren después.\n *\n * Un `kf-drawer` con `role=\"dialog\"` no usa el top layer, pero declara\n * `aria-modal=\"true\"`: un overlay fuera de su subárbol queda, para un lector\n * de pantalla, fuera del diálogo. Por eso también registra su panel acá y\n * el contenedor se reubica dentro de él mientras está abierto.\n */\nexport function installModalAwareOverlayContainer(container: OverlayContainerLike): void {\n if (patchedContainers.has(container)) {\n return;\n }\n patchedContainers.add(container);\n\n const originalGetContainerElement = container.getContainerElement.bind(container);\n let knownElement: HTMLElement | null = null;\n\n container.getContainerElement = (): HTMLElement => {\n const element = originalGetContainerElement();\n knownElement = element;\n const targetParent = topmostOpenModalDialog() ?? element.ownerDocument.body;\n if (element.parentElement !== targetParent) {\n targetParent.appendChild(element);\n }\n return element;\n };\n\n // Devuelve `false` cuando el contenedor ya no existe (la app se destruyó):\n // se descarta del conjunto en vez de recrearlo. Mientras nadie lo haya\n // pedido todavía no hay nada que reubicar.\n relocators.add(() => {\n if (!knownElement) {\n return true;\n }\n if (!knownElement.isConnected) {\n return false;\n }\n container.getContainerElement();\n return true;\n });\n}\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { OverlayContainer } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n effect,\n inject,\n isDevMode,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { Button } from '../button/button';\nimport {\n installModalAwareOverlayContainer,\n registerOpenModalDialog,\n unregisterOpenModalDialog,\n} from '../modal/modal-overlay-container';\n\n/** Borde de anclaje del panel. `bottom` es una hoja inferior (bottom sheet). */\nexport type DrawerSide = 'left' | 'right' | 'bottom';\n\n/**\n * Rol del panel. `navigation` (default) es el menú lateral histórico;\n * `dialog` es un panel modal de tarea (filtros, resumen) con\n * `aria-modal=\"true\"`.\n */\nexport type DrawerRole = 'navigation' | 'dialog';\n\nlet nextId = 0;\n\n/**\n * Panel lateral genérico, agnóstico de contenido — no sabe qué es navegación\n * ni qué es sesión, solo da tres lugares para proyectar contenido\n * (`[kf-drawer-header]`, default, `[kf-drawer-footer]`) y resuelve lo que\n * cualquier drawer necesita resolver igual sin importar qué haya adentro:\n * overlay con blur que cierra al click, `Escape`, atrapado de foco real y\n * devolución de foco al cerrar.\n *\n * `open` es two-way, mismo patrón que `Dropdown`/`Modal`: el consumidor\n * decide qué dispara la apertura (un botón de hamburguesa, por ejemplo) y\n * qué hace con el cierre.\n *\n * Foco: al abrir, se crea un `FocusTrap` del CDK sobre el panel (la misma\n * pieza que usa Angular Material para `mat-sidenav`/`mat-dialog`) — Tab y\n * Shift+Tab ciclan solo entre los elementos focuseables del drawer, sin\n * escapar al contenido de fondo. Al cerrar, el foco vuelve al elemento que\n * tenía el foco antes de abrir (guardado en `document.activeElement`), no\n * se pierde en el `<body>`.\n *\n * `[kf-drawer-header]` tiene fondo oscuro propio (`--kf-color-tertiary-deep`),\n * distinto del body (`--kf-color-white`) — pensado para contener\n * `kf-drawer-session`, que asume ese fondo y no lo trae él mismo (ver\n * `DrawerSession.ts`). Si el slot queda vacío, el contenedor colapsa\n * (`display: none`) y no deja una franja oscura sin contenido.\n *\n * <kf-drawer [(open)]=\"menuOpen\" ariaLabel=\"Menú de navegación\">\n * <div kf-drawer-header>\n * <kf-drawer-session name=\"Tomás Soto\" email=\"tomas@kaufmann.com\" (logoutClick)=\"onLogout()\" />\n * </div>\n * <a href=\"/\">Home</a>\n * <a href=\"/vehiculos\">Vehículos</a>\n * </kf-drawer>\n *\n * ## Panel de tarea (`role=\"dialog\"`)\n *\n * Para un panel modal que no es navegación (filtros de un listado, resumen\n * de un registro): `role=\"dialog\"` expone `role=\"dialog\"` + `aria-modal`,\n * `title` dibuja una barra clara con el título (que nombra el diálogo vía\n * `aria-labelledby`) y un botón de cierre con `closeLabel`. En pantallas de\n * hasta 640px el panel ocupa el ancho completo; arriba de eso mide\n * `--kf-drawer-width` (default 480px). El pie (`[kf-drawer-footer]`) queda\n * fijo abajo mientras el cuerpo hace scroll.\n *\n * <kf-drawer [(open)]=\"filtersOpen\" role=\"dialog\" side=\"right\"\n * title=\"Filtros\" closeLabel=\"Cerrar filtros\">\n * <kf-option-list label=\"Estado\" ... />\n * <div kf-drawer-footer> ...Limpiar / Ver 12 resultados... </div>\n * </kf-drawer>\n *\n * `side=\"bottom\"` lo convierte en hoja inferior (grip, esquinas superiores\n * redondeadas, alto máximo 80vh) — pensado para un resumen en mobile.\n *\n * Escape cierra el panel salvo que un control interno ya haya consumido la\n * tecla (`event.defaultPrevented`): un `kf-select`, `kf-multi-select` o\n * `kf-dropdown` abierto dentro del drawer cierra primero su propio panel y\n * un segundo Escape cierra el drawer.\n *\n * Nombres por defecto: con `role=\"navigation\"` el panel se llama \"Menú\" y\n * el cierre \"Cerrar menú\" (comportamiento histórico). Con `role=\"dialog\"`\n * los defaults son neutros (\"Diálogo\" / \"Cerrar\") y en modo desarrollo se\n * avisa por consola si no hay `title` ni `ariaLabel`: un diálogo sin nombre\n * propio no le dice nada al lector de pantalla.\n *\n * ## Selectores y otros paneles flotantes dentro del drawer\n *\n * `kf-select`, `kf-multi-select` y `kf-dropdown` funcionan\n * dentro de un drawer (incluido el pie `[kf-drawer-footer]`): sus paneles\n * quedan por encima del drawer, se abren hacia arriba si abajo no hay lugar\n * y no se cortan con el borde del panel ni con el scroll del cuerpo. Con\n * `role=\"dialog\"` el contenedor de overlays de CDK se reubica dentro del\n * panel mientras está abierto: el listbox queda dentro del diálogo\n * `aria-modal`, no fuera de él, y el atrapado de foco lo incluye. Al cerrar\n * el drawer vuelve a `<body>`. Escape cierra primero el panel flotante\n * (devolviendo el foco a su disparador) y el siguiente cierra el drawer.\n *\n * <kf-drawer [(open)]=\"open\" role=\"dialog\" side=\"right\" title=\"Unidad VIN-1003\">\n * ...\n * <div kf-drawer-footer>\n * <kf-select label=\"Saltar a otra unidad\" width=\"full\"\n * [options]=\"units\" [value]=\"unit()\" (valueChange)=\"unit.set($event)\" />\n * </div>\n * </kf-drawer>\n *\n * Al cerrar, el foco vuelve al elemento que lo tenía al abrir solo si sigue\n * en el documento (`isConnected`); si fue desmontado mientras el drawer\n * estaba abierto, no se fuerza ningún destino.\n */\n@Component({\n selector: 'kf-drawer',\n imports: [Button],\n templateUrl: './Drawer.html',\n styleUrl: './Drawer.css',\n host: {\n // `role` y `title` son inputs con nombre de atributo nativo: escritos\n // como atributo estático (`role=\"dialog\"`, `title=\"Filtros\"`) Angular\n // también los deja en el host, lo que anidaría dos diálogos y mostraría\n // un tooltip nativo sobre todo el panel. El rol real vive en el panel.\n '[attr.role]': 'null',\n '[attr.title]': 'null',\n },\n})\nexport class Drawer {\n /** Visibilidad del panel, two-way: `[(open)]=\"menuOpen\"`. */\n readonly open = model(false);\n /** Borde de anclaje del panel. `left` (default) es la convención dominante\n * (Material/iOS/Android): el botón que abre el drawer y el propio panel\n * quedan del mismo lado. `bottom` lo convierte en hoja inferior. */\n readonly side = input<DrawerSide>('left');\n /** `navigation` (default, menú) o `dialog` (panel modal de tarea). Ver JSDoc de la clase. */\n readonly role = input<DrawerRole>('navigation');\n /** `aria-label` del panel — describe su propósito para lectores de\n * pantalla (ej. \"Menú de navegación\"). Ignorado cuando hay `title`, que\n * nombra el panel con su texto visible. Default: \"Menú\" (`navigation`) o\n * \"Diálogo\" (`dialog`). */\n readonly ariaLabel = input<string>();\n /** Título visible en una barra clara arriba del panel, con botón de cierre. Sin él no hay barra (comportamiento histórico). */\n readonly title = input<string>();\n /** Nombre accesible del botón de cierre de la barra de título y del\n * overlay. Default: \"Cerrar menú\" (`navigation`) o \"Cerrar\" (`dialog`). */\n readonly closeLabel = input<string>();\n\n /** `ariaLabel` o, sin él, el default según el rol. */\n protected readonly resolvedAriaLabel = computed(\n () => this.ariaLabel() ?? (this.role() === 'dialog' ? 'Diálogo' : 'Menú'),\n );\n /** `closeLabel` o, sin él, el default según el rol. */\n protected readonly resolvedCloseLabel = computed(\n () => this.closeLabel() ?? (this.role() === 'dialog' ? 'Cerrar' : 'Cerrar menú'),\n );\n\n protected readonly titleId = `kf-drawer-title-${nextId++}`;\n\n private readonly panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly document = inject(DOCUMENT);\n private readonly overlayContainer = inject(OverlayContainer);\n\n private registeredPanel: HTMLElement | null = null;\n private focusTrap: FocusTrap | null = null;\n private lastFocusedElement: HTMLElement | null = null;\n\n constructor() {\n // Ver `modal-overlay-container.ts`: con `role=\"dialog\"` los paneles\n // flotantes (select, dropdown) deben vivir dentro del diálogo.\n installModalAwareOverlayContainer(this.overlayContainer);\n\n afterRenderEffect(() => {\n const panel = this.panelRef().nativeElement;\n this.registeredPanel = panel;\n if (this.open() && this.role() === 'dialog') {\n registerOpenModalDialog(panel);\n } else {\n unregisterOpenModalDialog(panel);\n }\n });\n\n afterRenderEffect(() => {\n if (this.open()) {\n this.lastFocusedElement = this.document.activeElement as HTMLElement | null;\n const trap = this.getOrCreateFocusTrap();\n void trap.focusInitialElement();\n } else {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n if (this.lastFocusedElement?.isConnected) {\n this.lastFocusedElement.focus();\n }\n this.lastFocusedElement = null;\n }\n });\n\n if (isDevMode()) {\n effect(() => {\n if (this.role() === 'dialog' && !this.title() && !this.ariaLabel()) {\n console.warn(\n '[kf-drawer] role=\"dialog\" sin `title` ni `ariaLabel`: el diálogo se anuncia con el nombre genérico \"Diálogo\".',\n );\n }\n });\n }\n\n inject(DestroyRef).onDestroy(() => {\n if (this.registeredPanel) {\n unregisterOpenModalDialog(this.registeredPanel);\n }\n this.focusTrap?.destroy();\n });\n }\n\n /** Cierra el drawer con Escape — mismo patrón que `Dropdown`/`Modal`. */\n @HostListener('document:keydown.escape', ['$event'])\n protected onEscape(event: Event): void {\n if (!this.open() || event.defaultPrevented) {\n return;\n }\n this.open.set(false);\n }\n\n private getOrCreateFocusTrap(): FocusTrap {\n if (!this.focusTrap) {\n this.focusTrap = this.focusTrapFactory.create(this.panelRef().nativeElement);\n }\n return this.focusTrap;\n }\n}\n","@if (open()) {\n <button\n type=\"button\"\n class=\"kf-drawer__overlay\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n [attr.tabindex]=\"role() === 'dialog' ? -1 : null\"\n (click)=\"open.set(false)\"\n ></button>\n}\n\n<!-- Un <div> con rol explícito (no <nav>): un mismo panel puede ser\n navegación o diálogo, y <nav> no admite role=\"dialog\". -->\n<div\n #panel\n class=\"kf-drawer__panel\"\n [class.kf-drawer__panel--open]=\"open()\"\n [class.kf-drawer__panel--right]=\"side() === 'right'\"\n [class.kf-drawer__panel--bottom]=\"side() === 'bottom'\"\n [class.kf-drawer__panel--dialog]=\"role() === 'dialog'\"\n [attr.role]=\"role()\"\n [attr.aria-modal]=\"role() === 'dialog' ? 'true' : null\"\n [attr.aria-label]=\"title() ? null : resolvedAriaLabel()\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n [attr.aria-hidden]=\"!open()\"\n>\n @if (side() === 'bottom') {\n <div class=\"kf-drawer__grip\" aria-hidden=\"true\"></div>\n }\n @if (title(); as titleText) {\n <div class=\"kf-drawer__titlebar\">\n <h2 class=\"kf-drawer__title\" [id]=\"titleId\">{{ titleText }}</h2>\n <kf-button\n class=\"kf-drawer__close\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n icon=\"x\"\n [ariaLabel]=\"resolvedCloseLabel()\"\n (click)=\"open.set(false)\"\n />\n </div>\n }\n <div class=\"kf-drawer__header\"><ng-content select=\"[kf-drawer-header]\" /></div>\n <div class=\"kf-drawer__body\"><ng-content /></div>\n <div class=\"kf-drawer__footer\"><ng-content select=\"[kf-drawer-footer]\" /></div>\n</div>\n","import { Component, booleanAttribute, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\n\nexport type DropdownItemTone = 'neutral' | 'error';\n\n/**\n * Ítem de acción dentro de un `kf-dropdown-panel`. Es un `<button>` nativo\n * (no un `<a>`): dispara comportamiento en la pantalla actual, no navega.\n *\n * `icon` es opcional — sin él, el ítem es solo texto.\n *\n * <kf-dropdown-item icon=\"log-out\" (click)=\"onLogout()\" tone=\"error\">Cerrar sesión</kf-dropdown-item>\n */\n@Component({\n selector: 'kf-dropdown-item',\n imports: [Icon],\n templateUrl: './DropdownItem.html',\n styleUrl: './DropdownItem.css',\n})\nexport class DropdownItem {\n readonly tone = input<DropdownItemTone>('neutral');\n /** Ícono opcional al inicio de la fila. */\n readonly icon = input<IconName>();\n /**\n * Deshabilita el ítem (ej. una acción cuyo endpoint todavía no existe,\n * caso real de \"Factura\" en `kf-row-actions` de Taller). Default `false`\n * a propósito — ningún consumidor existente (ej. el menú de sesión del\n * Shell) pasa esta prop hoy, así que no cambia su comportamiento.\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<button\n type=\"button\"\n class=\"kf-dropdown-item\"\n [class.kf-dropdown-item--error]=\"tone() === 'error'\"\n [disabled]=\"disabled()\"\n role=\"menuitem\"\n>\n @if (icon()) {\n <kf-icon [name]=\"icon()!\" size=\"sm\" />\n }\n <span class=\"kf-dropdown-item__label\"><ng-content /></span>\n</button>\n","import { Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\n/** Color del marcador. Distingue la CLASE de evento de un vistazo en un log\n * largo — no es un estado de progreso. */\nexport type EventTimelineTone = 'neutral' | 'primary' | 'ok' | 'warn' | 'error' | 'info';\n\n/** Un evento ya ocurrido. Los tres campos de texto son los tres niveles de\n * lectura: qué pasó, por qué, y cuándo/quién. */\nexport interface EventTimelineItem {\n /** Clave de `track`. */\n readonly id: string;\n readonly title: string;\n readonly detail?: string | null;\n /** Hora y autor, ya formateados por el consumidor. */\n readonly meta?: string | null;\n readonly icon?: IconName;\n readonly tone?: EventTimelineTone;\n}\n\n/**\n * Línea de tiempo de AUDITORÍA: eventos ya ocurridos, en orden, cada uno con\n * marcador coloreado por CLASE y tres niveles de texto (titular, detalle,\n * hora + autor). Distinto de `kf-journey-stepper` (de PROGRESO, con pasos\n * futuros conocidos de antemano): acá todo ya pasó.\n */\n@Component({\n selector: 'kf-event-timeline',\n imports: [Icon],\n templateUrl: './EventTimeline.html',\n styleUrl: './EventTimeline.css',\n})\nexport class EventTimeline {\n readonly items = input.required<readonly EventTimelineItem[]>();\n}\n","<ol class=\"kf-event-timeline\">\n @for (item of items(); track item.id) {\n <li\n class=\"kf-event-timeline__event\"\n [class]=\"'kf-event-timeline__event--' + (item.tone ?? 'neutral')\"\n >\n <span class=\"kf-event-timeline__marker\" aria-hidden=\"true\">\n <kf-icon [name]=\"item.icon ?? 'activity'\" size=\"sm\" />\n </span>\n\n <span class=\"kf-event-timeline__body\">\n <span class=\"kf-event-timeline__title\">{{ item.title }}</span>\n @if (item.detail) {\n <span class=\"kf-event-timeline__detail\">{{ item.detail }}</span>\n }\n @if (item.meta) {\n <span class=\"kf-event-timeline__meta kf-caption-text\">{{ item.meta }}</span>\n }\n </span>\n </li>\n }\n</ol>\n","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Bloque promocional sobre fondo oscuro de marca (página 37) — campañas,\n * accesos directos o el portal de autoatención. Usa `--kf-color-tertiary-deep`\n * como base del degradado, el mismo azul profundo que el slide destacado de\n * `kf-carousel` y la barra de `kf-portal-header`.\n *\n * <kf-feature-card badge=\"Autoatención\" badgeIcon=\"tool\" title=\"Portal de Autoatención\"\n * description=\"Con tu patente o VIN accede a soluciones para tu vehículo: mantenciones, repuestos y conectividad en un solo lugar.\"\n * actionLabel=\"Ir al portal\" actionHref=\"/autoatencion\" />\n */\n@Component({\n selector: 'kf-feature-card',\n imports: [Icon, Text],\n templateUrl: './FeatureCard.html',\n styleUrl: './FeatureCard.css',\n})\nexport class FeatureCard {\n readonly badge = input<string>();\n readonly badgeIcon = input<IconName>();\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n}\n","@if (badge()) {\n <span class=\"kf-feature-card__badge\">\n @if (badgeIcon(); as iconName) {\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n }\n <kf-text as=\"span\" variant=\"overline-strong\" class=\"kf-feature-card__badge-text\">{{\n badge()\n }}</kf-text>\n </span>\n}\n<span class=\"kf-feature-card__title\">{{ title() }}</span>\n@if (description()) {\n <p class=\"kf-feature-card__description\">{{ description() }}</p>\n}\n@if (actionLabel()) {\n <a class=\"kf-feature-card__action\" [href]=\"actionHref() || '#'\">\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n {{ actionLabel() }}\n </a>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Chip de solo-lectura inline (label/valor) dentro de una caja bordeada.\n * Se usa en barras de filtro y filas de resumen para mostrar información,\n * NO para entrada de datos — para eso existe `Input`.\n *\n * El valor admite dos formas, igual que en el design system de referencia:\n * - `value` (string): caso simple, ej. `[value]=\"'Jul 2026'\"`.\n * - contenido proyectado (`<ng-content>`): cuando se necesita algo más rico\n * que un string (un badge, texto con formato, etc.).\n * `value` tiene prioridad cuando está definido; si no se pasa `value`, se\n * renderiza el contenido proyectado y, si tampoco hay contenido, `placeholder`.\n *\n * <kf-field icon=\"calendar\" label=\"Periodo\" value=\"Jul 2026\" [select]=\"true\" />\n * <kf-field label=\"Sucursal\"><strong>Casa Central</strong></kf-field>\n */\n@Component({\n selector: 'kf-field',\n imports: [Icon],\n templateUrl: './Field.html',\n styleUrl: './Field.css',\n host: {\n '[class.kf-field--select]': 'select()',\n '[attr.style]': 'style() || null',\n },\n})\nexport class Field {\n readonly label = input<string>();\n readonly value = input<string>();\n readonly icon = input<IconName>();\n readonly placeholder = input<string>();\n readonly select = input(false, { transform: booleanAttribute });\n /** Estilos inline opcionales aplicados directamente al host. */\n readonly style = input<string>();\n\n /**\n * El placeholder solo tiene sentido cuando no hay `value` ni contenido\n * proyectado. Angular no expone de forma simple si `<ng-content>` recibió\n * hijos reales, así que la regla adoptada es puramente declarativa: se\n * muestra el placeholder cuando hay texto de placeholder y no hay `value`\n * (ver comentario de clase sobre la prioridad value > proyectado > placeholder).\n */\n protected isPlaceholderVisible(): boolean {\n return !this.value() && !!this.placeholder();\n }\n}\n","@if (icon(); as iconName) {\n <kf-icon class=\"kf-field__icon\" [name]=\"iconName\" size=\"sm\" />\n}\n@if (label()) {\n <span class=\"kf-field__label\">{{ label() }}</span>\n}\n<span class=\"kf-field__value\">\n @if (value()) {\n {{ value() }}\n } @else {\n <ng-content></ng-content>\n @if (isPlaceholderVisible()) {\n <span class=\"kf-field__placeholder\">{{ placeholder() }}</span>\n }\n }\n</span>\n@if (select()) {\n <kf-icon class=\"kf-field__chevron\" name=\"chevron-down\" size=\"sm\" />\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon } from '../icon/Icon';\n\n/** Por qué se descartó un archivo: formato fuera de `accept` o más grande que `maxSize`. */\nexport type FileRejectionReason = 'type' | 'size';\n\n/** Un archivo descartado y el motivo. */\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nlet nextId = 0;\n\n/** Nombre legible de un token de `accept`: `.pdf` → `PDF`, `image/png` → `PNG`, `image/*` → `Imágenes`. */\nfunction describeAcceptToken(token: string): string {\n const generic: Record<string, string> = {\n 'image/*': 'Imágenes',\n 'video/*': 'Videos',\n 'audio/*': 'Audio',\n 'text/*': 'Texto',\n };\n if (generic[token]) {\n return generic[token];\n }\n if (token.startsWith('.')) {\n return token.slice(1).toUpperCase();\n }\n return (token.split('/')[1] ?? token).toUpperCase();\n}\n\n/** Tamaño en bytes como texto (`5 MB`, `120 KB`), base 1024. */\nexport function formatFileSize(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${Number((bytes / (1024 * 1024)).toFixed(1))} MB`;\n }\n if (bytes >= 1024) {\n return `${Math.round(bytes / 1024)} KB`;\n }\n return `${bytes} B`;\n}\n\n/**\n * Selector de archivo accesible, con la misma apariencia y contrato de campo\n * que `kf-input`: label arriba, ayuda y error debajo, `invalid`.\n *\n * El control real es un `<input type=\"file\">` nativo, visualmente oculto pero\n * enfocable: se llega con Tab, se abre con Enter o Espacio y el anillo de foco\n * se dibuja sobre el botón visible. Su nombre accesible es el `label` (o\n * `ariaLabel`); la ayuda, el archivo elegido y el error lo describen\n * (`aria-describedby`).\n *\n * **Ayuda antes de elegir.** `hint` es texto libre; si no se pasa, se arma sola\n * con los formatos de `accept` y el tamaño de `maxSize` (`PDF, JPG · máx. 5 MB`),\n * para que el usuario sepa qué sirve ANTES de abrir el selector.\n *\n * **Validación.** Cada archivo se revisa contra `accept` (extensiones `.pdf`,\n * tipos `image/png` o comodines `image/*`) y `maxSize` (bytes). Los válidos\n * quedan elegidos y se emiten en `fileChange` (siempre `File[]`, vacío al\n * quitar); los descartados se emiten uno a uno en `fileRejected` con su\n * motivo (`'type'` o `'size'`) y se muestran como error bajo el campo\n * (`rejectedTypeText` / `rejectedSizeText`); la ayuda sigue visible bajo ese\n * mensaje, para que se vea qué sí sirve. Un `error` del consumidor tiene\n * prioridad sobre ese mensaje y reemplaza a la ayuda, igual que `errorMessage`\n * sobre `hint` en `kf-input`. La validación del navegador no reemplaza la del servidor.\n *\n * **Archivo elegido.** Su nombre y tamaño aparecen UNA vez, con un botón para\n * quitarlo (`removeLabel`, con el nombre del archivo en su `aria-label`); el\n * nombre del `<input>` nativo queda oculto. Con `multiple` se listan todos y\n * cada uno se quita por separado. Elegir de nuevo reemplaza la selección.\n *\n * `dropzone` agrega arrastrar y soltar sobre el área; el botón y el teclado\n * siguen siendo la vía principal.\n *\n * Es un `ControlValueAccessor`: con `[(ngModel)]`/`formControl` el valor es\n * `File | null` (o `File[]` con `multiple`); `writeValue(null)` limpia.\n *\n * <kf-file-input label=\"Comprobante\" accept=\".pdf,.jpg,.png\" [maxSize]=\"5242880\"\n * (fileChange)=\"onFiles($event)\" (fileRejected)=\"onRejected($event)\" />\n * <kf-file-input label=\"Fotos\" accept=\"image/*\" multiple dropzone formControlName=\"photos\" />\n * <kf-file-input label=\"Contrato\" error=\"Adjunta el contrato firmado.\" formControlName=\"contract\" />\n */\n@Component({\n selector: 'kf-file-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldLabel, Icon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileInput),\n multi: true,\n },\n ],\n templateUrl: './FileInput.html',\n styleUrl: './FileInput.css',\n})\nexport class FileInput implements ControlValueAccessor {\n private readonly nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n\n readonly label = input<string>();\n readonly required = input(false, { transform: booleanAttribute });\n /** Texto de ayuda. Sin valor, se arma con `accept` y `maxSize`. */\n readonly hint = input<string>();\n /** Formatos admitidos, como el `accept` nativo: `.pdf,.jpg`, `image/png`, `image/*`. */\n readonly accept = input<string>();\n /** Tamaño máximo por archivo, en bytes. Sin valor, sin límite. */\n readonly maxSize = input<number | undefined>(undefined);\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Agrega arrastrar y soltar sobre el área del control. */\n readonly dropzone = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Borde rojo y `aria-invalid`. Se activa solo con `error`; úsalo para marcar un error sin mensaje. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error del consumidor (`role=\"alert\"`); reemplaza a la ayuda y al motivo de rechazo, como `errorMessage` en `kf-input`. */\n readonly error = input<string>();\n /** Nombre accesible cuando no hay `label` visible. */\n readonly ariaLabel = input<string>();\n /** Texto del botón cuando no hay archivo elegido. */\n readonly buttonLabel = input('Elegir archivo');\n /** Texto del botón con `multiple` o cuando ya hay un archivo (cambiar). */\n readonly changeLabel = input('Cambiar archivo');\n /** Nombre accesible del botón de quitar; se le agrega el nombre del archivo. */\n readonly removeLabel = input('Quitar');\n /** Texto de arrastrar y soltar (solo con `dropzone`). */\n readonly dropzoneText = input('o arrástralo aquí');\n readonly rejectedTypeText = input('Formato no permitido.');\n readonly rejectedSizeText = input('El archivo supera el tamaño máximo.');\n\n /** Selección vigente (`File[]`, vacío al quitar todo). */\n readonly fileChange = output<File[]>();\n /** Un archivo descartado y su motivo. */\n readonly fileRejected = output<FileRejection>();\n\n protected readonly inputId = `kf-file-input-${nextId++}`;\n protected readonly hintId = `${this.inputId}-hint`;\n protected readonly errorId = `${this.inputId}-error`;\n protected readonly filesId = `${this.inputId}-files`;\n\n protected readonly files = signal<File[]>([]);\n protected readonly rejection = signal<FileRejectionReason | null>(null);\n protected readonly dragging = signal(false);\n private readonly disabledByForm = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n private onChange: (value: File | File[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n /** Mensaje visible: el del consumidor, o el motivo del último rechazo. */\n protected readonly message = computed(() => {\n const own = this.error();\n if (own) {\n return own;\n }\n const reason = this.rejection();\n if (reason === 'type') {\n return this.rejectedTypeText();\n }\n return reason === 'size' ? this.rejectedSizeText() : null;\n });\n\n /** Ayuda efectiva: la del consumidor o la armada con formatos y tamaño. */\n protected readonly effectiveHint = computed(() => {\n const own = this.hint();\n if (own) {\n return own;\n }\n const parts: string[] = [];\n const tokens = (this.accept() ?? '')\n .split(',')\n .map((token) => token.trim())\n .filter(Boolean);\n if (tokens.length) {\n parts.push([...new Set(tokens.map(describeAcceptToken))].join(', '));\n }\n const max = this.maxSize();\n if (max) {\n parts.push(`máx. ${formatFileSize(max)}`);\n }\n return parts.join(' · ');\n });\n\n protected readonly isInvalid = computed(() => this.invalid() || !!this.message());\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.message()) {\n ids.push(this.errorId);\n }\n if (this.effectiveHint() && !this.error()) {\n ids.push(this.hintId);\n }\n if (this.files().length) {\n ids.push(this.filesId);\n }\n return ids.join(' ') || null;\n });\n\n protected readonly triggerText = computed(() =>\n this.files().length && !this.multiple() ? this.changeLabel() : this.buttonLabel(),\n );\n\n /** Enfoca el `<input>` nativo. */\n focus(options?: FocusOptions): void {\n this.nativeInput().nativeElement.focus(options);\n }\n\n writeValue(value: File | File[] | null): void {\n const list = Array.isArray(value) ? value : value ? [value] : [];\n this.files.set(list);\n this.rejection.set(null);\n }\n\n registerOnChange(fn: (value: File | File[] | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByForm.set(isDisabled);\n }\n\n protected onPick(event: Event): void {\n const native = event.target as HTMLInputElement;\n const picked = Array.from(native.files ?? []);\n // Se limpia el valor nativo: el nombre ya se muestra en la lista y así se\n // puede volver a elegir el mismo archivo después de quitarlo.\n native.value = '';\n this.receive(picked);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.isDisabled()) {\n return;\n }\n event.preventDefault();\n this.dragging.set(true);\n }\n\n protected onDragLeave(): void {\n this.dragging.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragging.set(false);\n if (this.isDisabled()) {\n return;\n }\n this.receive(Array.from(event.dataTransfer?.files ?? []));\n }\n\n protected remove(index: number): void {\n const next = this.files().filter((_, i) => i !== index);\n this.rejection.set(null);\n this.commit(next);\n this.nativeInput().nativeElement.focus();\n }\n\n protected formatSize(file: File): string {\n return formatFileSize(file.size);\n }\n\n /** Valida lo recibido, emite los rechazos y reemplaza la selección si hay algo válido. */\n private receive(incoming: File[]): void {\n if (!incoming.length) {\n return;\n }\n const candidates = this.multiple() ? incoming : incoming.slice(0, 1);\n const accepted: File[] = [];\n let lastReason: FileRejectionReason | null = null;\n for (const file of candidates) {\n const reason = this.reject(file);\n if (reason) {\n lastReason = reason;\n this.fileRejected.emit({ file, reason });\n } else {\n accepted.push(file);\n }\n }\n this.rejection.set(lastReason);\n if (accepted.length) {\n this.commit(accepted);\n }\n this.onTouched();\n }\n\n private reject(file: File): FileRejectionReason | null {\n if (!this.matchesAccept(file)) {\n return 'type';\n }\n const max = this.maxSize();\n return max !== undefined && file.size > max ? 'size' : null;\n }\n\n private matchesAccept(file: File): boolean {\n const tokens = (this.accept() ?? '')\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (!tokens.length) {\n return true;\n }\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n return type === token;\n });\n }\n\n private commit(files: File[]): void {\n this.files.set(files);\n this.fileChange.emit(files);\n this.onChange(this.multiple() ? files : (files[0] ?? null));\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"inputId\" [required]=\"required()\">{{ label() }}</kf-field-label>\n}\n<div\n class=\"kf-file-input__area\"\n [class.kf-file-input__area--dropzone]=\"dropzone()\"\n [class.kf-file-input__area--dragging]=\"dragging()\"\n [class.kf-file-input__area--invalid]=\"isInvalid()\"\n [class.kf-file-input__area--disabled]=\"isDisabled()\"\n (dragover)=\"dropzone() ? onDragOver($event) : null\"\n (dragleave)=\"dropzone() ? onDragLeave() : null\"\n (drop)=\"dropzone() ? onDrop($event) : null\"\n>\n <input\n #nativeInput\n type=\"file\"\n class=\"kf-file-input__native\"\n [id]=\"inputId\"\n [attr.accept]=\"accept() || null\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required() && !files().length\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() ? true : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n (change)=\"onPick($event)\"\n />\n <label class=\"kf-file-input__button\" [for]=\"inputId\" aria-hidden=\"true\">\n <kf-icon name=\"upload-cloud\" size=\"sm\" />\n {{ triggerText() }}\n </label>\n @if (dropzone()) {\n <span class=\"kf-file-input__drop-text\" aria-hidden=\"true\">{{ dropzoneText() }}</span>\n }\n</div>\n@if (files().length) {\n <ul class=\"kf-file-input__files\" [id]=\"filesId\">\n @for (file of files(); track $index) {\n <li class=\"kf-file-input__file\">\n <kf-icon class=\"kf-file-input__file-icon\" name=\"file\" size=\"sm\" />\n <span class=\"kf-file-input__file-name\">{{ file.name }}</span>\n <span class=\"kf-file-input__file-size\">{{ formatSize(file) }}</span>\n <button\n type=\"button\"\n class=\"kf-file-input__remove\"\n [attr.aria-label]=\"removeLabel() + ' ' + file.name\"\n [disabled]=\"isDisabled()\"\n (click)=\"remove($index)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n </li>\n }\n </ul>\n}\n@if (message(); as text) {\n <span class=\"kf-file-input__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ text }}</span>\n}\n@if (effectiveHint() && !error()) {\n <span class=\"kf-file-input__hint kf-field-hint\" [id]=\"hintId\">{{ effectiveHint() }}</span>\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon, IconName } from '../icon/Icon';\n\n/** Valor de `min`/`max`/`step`: número, o texto cuando el tipo lo pide (una fecha `'2026-01-31'`, un mes, una hora). */\nexport type InputBound = string | number | null | undefined;\n\n/** Vacío o `undefined` no emiten el atributo; `0` sí es un límite válido. */\nfunction normalizeBound(value: InputBound): string | number | null {\n return value === undefined || value === '' ? null : value;\n}\n\n/** `maxlength` como entero positivo; cualquier otra cosa (vacío, NaN, 0, negativo) no se emite. */\nfunction toMaxLength(value: number | string | null | undefined): number | null {\n const parsed = typeof value === 'string' ? Number.parseInt(value, 10) : value;\n return typeof parsed === 'number' && Number.isInteger(parsed) && parsed > 0 ? parsed : null;\n}\n\n/**\n * Input de formulario apilado: label arriba (en mayúsculas vía CSS), campo con\n * fondo gris que pasa a blanco con anillo de foco azul al enfocar.\n *\n * Implementa ControlValueAccessor, así que funciona con [(ngModel)] y con\n * Reactive Forms (formControl / formControlName), no es solo un wrapper visual.\n *\n * <kf-input label=\"Placa\" icon=\"car\" placeholder=\"ABC-123\" hint=\"Formato: 3 letras + 3 números\" />\n * <input kf-input formControlName=\"email\" type=\"email\" />\n *\n * `invalid` + `errorMessage` cubren el estado de error: con `invalid` el\n * borde pasa a rojo (`--kf-color-error`) y se setea `aria-invalid=\"true\"` en\n * el `<input>` nativo; `errorMessage` reemplaza el `hint` neutro por un\n * mensaje en rojo con `role=\"alert\"`, para que un lector de pantalla lo\n * anuncie apenas aparece (a diferencia de `hint`, que es solo informativo y\n * nunca interrumpe). Si se pasan ambos, `errorMessage` tiene prioridad\n * visual sobre `hint` — no tiene sentido mostrar los dos a la vez.\n *\n * <kf-input label=\"Correo\" formControlName=\"email\"\n * [invalid]=\"email.invalid && email.touched\"\n * [errorMessage]=\"email.touched && email.hasError('required') ? 'Ingresa tu correo.' : undefined\" />\n *\n * `toggleable` solo tiene efecto cuando `type=\"password\"`: agrega un botón\n * de ojo al final del campo que alterna la visibilidad del valor tipeado\n * (cambia el `type` real del `<input>` nativo entre `password` y `text`,\n * nunca expone el valor en el DOM de otra forma). El botón es `type=\"button\"`\n * — nunca dispara submit del form contenedor — y anuncia su acción con\n * `aria-label` dinámico y `aria-pressed`, ya que es un toggle, no un botón\n * de una sola acción.\n *\n * <kf-input type=\"password\" label=\"Contraseña\" toggleable formControlName=\"password\" />\n *\n * `readonly` es distinto de `disabled`: un campo `disabled` no recibe foco\n * por teclado ni se puede seleccionar/copiar su texto (y se lee como\n * \"deshabilitado\" en un lector de pantalla); un campo `readonly` sí — el\n * valor se puede ver, enfocar y copiar, solo no se puede editar. Usar\n * `readonly` para mostrar un dato existente que el usuario puede querer\n * copiar (ej. un documento de identidad en un formulario de perfil), y\n * `disabled` para un campo genuinamente inactivo (ej. mientras un guardado\n * está en vuelo).\n *\n * <kf-input label=\"DNI\" readonly formControlName=\"documentId\" />\n *\n * Buscador sin label visible: `ariaLabel` da el nombre accesible del\n * `<input>` (el placeholder no lo reemplaza: desaparece al escribir) y\n * `clearable` agrega un botón \"×\" mientras haya texto. Borrar limpia el\n * valor, notifica al formulario (`ngModel`/`formControl`), dispara un\n * evento `input` nativo (para quien escucha `(input)`), emite `cleared` y\n * devuelve el foco al campo.\n *\n * <kf-input type=\"search\" icon=\"search\" ariaLabel=\"Buscar cotizaciones\"\n * placeholder=\"Buscar cotización\" clearable [(ngModel)]=\"query\" />\n *\n * `focus()` enfoca el `<input>` nativo, sin que el consumidor busque el\n * control interno con `querySelector`.\n *\n * `autocomplete`, `name` e `inputmode` se reenvían al `<input>` nativo (un\n * atributo en el host no llega adentro) para que el navegador y los gestores\n * de contraseñas identifiquen el campo; sin valor no se renderiza ningún\n * atributo. Funcionan igual con `type=\"password\"` y `toggleable`.\n *\n * <kf-input label=\"RUT\" autocomplete=\"username\" name=\"rut\" inputmode=\"text\" formControlName=\"rut\" />\n * <kf-input type=\"password\" label=\"Contraseña\" toggleable autocomplete=\"current-password\" name=\"password\" formControlName=\"password\" />\n *\n * `min`, `max`, `step` y `maxlength` se reenvían al `<input>` nativo (mismo\n * motivo: un atributo en el host no llega adentro) y sin valor no se\n * renderiza ningún atributo. `min`/`max`/`step` aceptan número o texto según\n * el `type` (`number`, `range`, `date`, `time`, `month`…): con `type=\"date\"` el\n * límite es una fecha ISO. `maxlength` es un entero positivo y aplica a los\n * tipos de texto (`text`, `search`, `email`, `tel`, `url`, `password`). El\n * navegador usa los límites para la validación nativa (`:invalid`,\n * `validity.rangeUnderflow`) y para el selector de fechas; no reemplazan la\n * validación del formulario ni el `errorMessage`.\n *\n * <kf-input type=\"date\" label=\"Fecha de entrega\" min=\"2026-01-01\" max=\"2026-12-31\" />\n * <kf-input type=\"number\" label=\"Cantidad\" [min]=\"1\" [max]=\"20\" [step]=\"1\" />\n * <kf-input label=\"Placa\" [maxlength]=\"7\" />\n */\n@Component({\n selector: 'kf-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, FieldLabel, Icon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Input),\n multi: true,\n },\n ],\n templateUrl: './Input.html',\n styleUrl: './Input.css',\n})\nexport class Input implements ControlValueAccessor, AfterViewInit {\n private static nextId = 0;\n\n private readonly nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n\n readonly label = input<string>();\n /** Oculta el `label` a la vista y lo deja como nombre accesible (`<label for>`), sin ocultarlo con CSS desde afuera. */\n readonly hideLabel = input(false, { transform: booleanAttribute });\n /** Marca el label con un asterisco visual y aplica `required` al `<input>`\n * nativo — el atributo HTML ya expone el estado obligatorio a lectores de\n * pantalla (mapeo implícito a `aria-required`), sin necesidad de un\n * `aria-required` explícito redundante. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Ícono líder, renderizado vía `kf-icon`. */\n readonly icon = input<IconName>();\n readonly suffix = input<string>();\n readonly hint = input<string>();\n /** Borde y aria-invalid en rojo. Ver `errorMessage` para el mensaje asociado. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"` — reemplaza a `hint` mientras esté presente. */\n readonly errorMessage = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Ver JSDoc de la clase para la diferencia con `disabled`. No pasa por\n * Reactive Forms (a diferencia de `disabled`, que también puede llegar\n * vía `FormControl.disable()`) — es siempre una decisión explícita del\n * consumidor del componente. */\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly type = input<string>('text');\n readonly placeholder = input<string>('');\n /** Token de autocompletado HTML (`username`, `email`, `current-password`,\n * `new-password`, `off`, etc.) que se reenvía al `<input>` nativo para que\n * el navegador y los gestores de contraseñas identifiquen el propósito del\n * campo (WCAG 1.3.5 y 3.3.8). Sin valor, el atributo no se renderiza. */\n readonly autocomplete = input<string | null>();\n /** `name` del `<input>` nativo; los gestores de contraseñas y el envío\n * nativo de formularios lo usan para identificar el campo. Sin valor, el\n * atributo no se renderiza. */\n readonly name = input<string | null>();\n /** Sugiere el teclado virtual (`numeric`, `email`, `tel`, etc.) sin cambiar\n * el `type`. Sin valor, el atributo no se renderiza. */\n readonly inputmode = input<string | null>();\n /** Límite inferior del control (`min` nativo): número, o texto para fechas/horas (`'2026-01-01'`). */\n readonly min = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Límite superior del control (`max` nativo). Ver `min`. */\n readonly max = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Paso del control (`step` nativo): número o `'any'`. */\n readonly step = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Largo máximo del texto (`maxlength` nativo), entero positivo. Solo aplica a tipos de texto. */\n readonly maxlength = input<number | null, number | string | null | undefined>(null, {\n transform: toMaxLength,\n });\n /** Agrega el botón de mostrar/ocultar — sin efecto si `type` no es `\"password\"`. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n /** Nombre accesible del `<input>` cuando no hay `label` visible. Ignorado\n * si hay `label`: un `aria-label` pisaría al `<label for>` visible. */\n readonly ariaLabel = input<string>();\n /** Agrega un botón \"×\" para borrar el valor mientras haya texto (sin efecto con `disabled`/`readonly`). */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Nombre accesible del botón de borrar. */\n readonly clearLabel = input('Borrar texto');\n\n /** Emitido después de borrar el valor con el botón \"×\". */\n readonly cleared = output<void>();\n\n protected readonly inputId = `kf-input-${Input.nextId++}`;\n protected readonly hintId = `${this.inputId}-hint`;\n protected readonly errorId = `${this.inputId}-error`;\n\n protected readonly value = signal('');\n protected readonly focused = signal(false);\n /** Deshabilitado por Reactive Forms (formControl.disable()). */\n private readonly disabledByForm = signal(false);\n /** Disabled real: por input() directo o por el FormControl asociado. */\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n /** Estado interno del toggle — irrelevante si `showPasswordToggle()` es false. */\n protected readonly passwordVisible = signal(false);\n /** El botón solo tiene sentido si el campo realmente es de contraseña. */\n protected readonly showPasswordToggle = computed(\n () => this.toggleable() && this.type() === 'password',\n );\n /** El botón de borrar solo aparece con texto y con el campo editable. */\n protected readonly showClear = computed(\n () => this.clearable() && !!this.value() && !this.isDisabled() && !this.readonly(),\n );\n /**\n * `type` real que recibe el `<input>` nativo: igual a `type()` salvo\n * cuando el toggle está activo y visible, donde pasa a `text` para\n * mostrar el valor en claro sin cambiar `type()` en sí (evita que un\n * consumidor que lee `type()` desde afuera vea un valor inconsistente).\n */\n protected readonly effectiveType = computed(() =>\n this.showPasswordToggle() && this.passwordVisible() ? 'text' : this.type(),\n );\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n // El binding declarativo [value]=\"value()\" no siempre re-sincroniza la\n // propiedad DOM del <input> cuando el valor llega por writeValue() antes\n // de que la vista termine de inicializarse — se refuerza escribiendo la\n // propiedad DOM directamente para que el primer valor de un formulario\n // ya cargado (ngModel/formControl con valor inicial) se refleje siempre.\n this.nativeInput().nativeElement.value = this.value();\n }\n\n /** Enfoca el `<input>` nativo (mismas opciones que `HTMLElement.focus`). */\n focus(options?: FocusOptions): void {\n this.nativeInput().nativeElement.focus(options);\n }\n\n writeValue(value: string): void {\n const nextValue = value ?? '';\n this.value.set(nextValue);\n // Mismo motivo que en ngAfterViewInit: escritura directa a la propiedad\n // DOM además del binding declarativo, para que cambios de valor\n // posteriores (ej. patchValue de un FormControl) siempre lleguen al\n // input nativo sin depender del timing de detección de cambios.\n const el = this.nativeInput?.();\n if (el) {\n el.nativeElement.value = nextValue;\n }\n }\n\n registerOnChange(fn: (value: 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 protected onInput(rawValue: string): void {\n this.value.set(rawValue);\n this.onChange(rawValue);\n }\n\n protected onBlur(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n /**\n * Borra el valor reutilizando el mismo camino que el tipeo: un evento\n * `input` nativo pasa por `onInput` (notifica al formulario) y además\n * llega a cualquier `(input)` del consumidor. Con el mouse no hay blur:\n * el `mousedown` del botón hace `preventDefault` (ver Input.html), así el\n * campo no se marca `touched` por usar su propio \"×\".\n */\n protected onClear(): void {\n const native = this.nativeInput().nativeElement;\n native.value = '';\n native.dispatchEvent(new Event('input', { bubbles: true }));\n native.focus();\n this.cleared.emit();\n }\n\n /**\n * Alterna la visibilidad del valor. No dispara `onBlur`/pierde el foco:\n * el botón vive dentro del mismo `.kf-input__field`, así que un click acá\n * no debe tratarse como si el usuario hubiese abandonado el campo.\n */\n protected onTogglePasswordVisibility(): void {\n this.passwordVisible.update((visible) => !visible);\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"inputId\" [required]=\"required()\" [visuallyHidden]=\"hideLabel()\">{{\n label()\n }}</kf-field-label>\n}\n<div\n class=\"kf-input__field\"\n [class.kf-input__field--disabled]=\"isDisabled()\"\n [class.kf-input__field--readonly]=\"readonly()\"\n [class.kf-input__field--focused]=\"focused()\"\n [class.kf-input__field--invalid]=\"invalid()\"\n>\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-input__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <input\n #nativeInput\n [id]=\"inputId\"\n class=\"kf-input__control\"\n [type]=\"effectiveType()\"\n [placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.name]=\"name() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"step()\"\n [attr.maxlength]=\"maxlength()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [attr.readonly]=\"readonly() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : hint() ? hintId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [value]=\"value()\"\n (input)=\"onInput(nativeInput.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\n />\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"kf-input__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onClear()\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n @if (showPasswordToggle()) {\n <button\n type=\"button\"\n class=\"kf-input__toggle\"\n [attr.aria-label]=\"passwordVisible() ? 'Ocultar contraseña' : 'Mostrar contraseña'\"\n [attr.aria-pressed]=\"passwordVisible()\"\n (click)=\"onTogglePasswordVisibility()\"\n >\n <kf-icon [name]=\"passwordVisible() ? 'eye-off' : 'eye'\" size=\"sm\" />\n </button>\n } @else if (suffix()) {\n <span class=\"kf-input__suffix\">{{ suffix() }}</span>\n }\n</div>\n@if (errorMessage(); as message) {\n <span class=\"kf-input__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n} @else if (hint()) {\n <span class=\"kf-input__hint kf-field-hint\" [id]=\"hintId\">{{ hint() }}</span>\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { normalizeForSearch } from '@kaufmann-lab/ui/shared';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { SelectOverlay } from '../shared/select-overlay';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nlet nextId = 0;\n\n/**\n * Dropdown de selección múltiple con checkboxes internos. El panel flotante\n * se conecta al trigger vía `@angular/cdk/overlay` — el mismo mecanismo que\n * `Select` (ver `../select/Select.ts`) y `Dropdown` (`../dropdown/Dropdown.ts`).\n *\n * A diferencia de `Select`, el disparador no muestra un único valor sino los\n * nombres seleccionados junto a un badge circular con el conteo, y cada\n * opción del panel se marca/desmarca con un checkbox sin cerrar el panel.\n * Incluye una opción \"Todas\" al inicio de la lista, con estado\n * `indeterminate` cuando hay selección parcial — el mismo patrón de\n * \"seleccionar todos\" de `Checkbox`. \"Todas\" nunca se filtra por el buscador:\n * queda siempre visible y sigue actuando sobre el universo COMPLETO de\n * `options()`, no sobre el subconjunto filtrado (ver JSDoc de `toggleAll()`).\n *\n * <kf-multi-select\n * label=\"Sucursales\"\n * [options]=\"branches\"\n * [values]=\"selectedBranches()\"\n * (valuesChange)=\"selectedBranches.set($event)\"\n * />\n *\n * `width=\"full\"` ocupa el 100% del contenedor — para multi-selects dentro\n * de layouts flex/grid donde el ancho fijo de `md` no encaja.\n *\n * <kf-multi-select width=\"full\" [options]=\"branches\" [values]=\"selectedBranches()\" (valuesChange)=\"...\" />\n */\n@Component({\n selector: 'kf-multi-select',\n imports: [FieldLabel],\n templateUrl: './MultiSelect.html',\n styleUrl: './MultiSelect.css',\n host: {\n '[class.kf-multi-select--width-sm]': \"width() === 'sm'\",\n '[class.kf-multi-select--width-lg]': \"width() === 'lg'\",\n '[class.kf-multi-select--width-full]': \"width() === 'full'\",\n },\n})\nexport class MultiSelect {\n readonly label = input<string>();\n readonly options = input<MultiSelectOption[]>([]);\n readonly values = input<string[]>([]);\n readonly placeholder = input<string>('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Ancho del control. 'md' (240px) es el default histórico y preserva el\n * comportamiento actual sin cambios para consumidores existentes.\n * 'full' ocupa el 100% del contenedor — para multi-selects dentro de\n * layouts flex/grid donde el ancho fijo no encaja (ej. un footer de\n * sidebar).\n */\n readonly width = input<'sm' | 'md' | 'lg' | 'full'>('md');\n /**\n * Tri-state: si el consumidor no lo especifica (`undefined`), el buscador\n * se activa solo cuando `options().length` supera `searchThreshold()`. Si\n * el consumidor define `true`/`false` explícitamente, ese valor manda por\n * sobre el umbral automático. Mismo criterio que `Select`.\n */\n readonly searchable = input<boolean | undefined>(undefined);\n readonly searchThreshold = input<number>(7);\n\n readonly valuesChange = output<string[]>();\n\n private readonly instanceId = `kf-multi-select-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly listboxId = `${this.instanceId}-listbox`;\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeIndex = signal(0);\n\n readonly selectedCount = computed(() => this.values().length);\n\n readonly allSelected = computed(\n () => this.options().length > 0 && this.values().length === this.options().length,\n );\n\n readonly isPartiallySelected = computed(() => this.values().length > 0 && !this.allSelected());\n\n readonly showSearch = computed(\n () => this.searchable() ?? this.options().length > this.searchThreshold(),\n );\n\n /** Opciones visibles tras aplicar el filtro de búsqueda (\"Todas\" nunca se filtra). */\n readonly filteredOptions = computed<MultiSelectOption[]>(() => {\n const query = normalizeForSearch(this.searchQuery().trim());\n if (!query) {\n return this.options();\n }\n return this.options().filter((option) => normalizeForSearch(option.label).includes(query));\n });\n\n /**\n * Texto del disparador: placeholder si no hay selección, o los nombres\n * seleccionados unidos por coma (el conteo va aparte, en el badge). Con\n * muchas opciones el `text-overflow: ellipsis` del `.kf-multi-select__value`\n * corta el texto — el badge de conteo siempre queda visible al lado.\n */\n readonly summaryText = computed(() => {\n const count = this.selectedCount();\n if (count === 0) {\n return this.placeholder();\n }\n const selectedLabels = this.values()\n .map((value) => this.options().find((option) => option.value === value)?.label)\n .filter((label): label is string => Boolean(label));\n return selectedLabels.join(', ');\n });\n\n private readonly triggerRef = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly panelTemplate = viewChild.required<TemplateRef<unknown>>('panelTemplate');\n private readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n private readonly overlay = new SelectOverlay(inject(Overlay), inject(ViewContainerRef), () =>\n this.triggerRef(),\n );\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.overlay.attach(this.panelTemplate(), () => this.isOpen.set(false));\n } else {\n this.overlay.detach();\n this.searchQuery.set('');\n this.activeIndex.set(0);\n }\n });\n\n // Autofocus del buscador al abrir — mismo patrón que Select. afterNextRender()\n // no puede invocarse dentro de un effect() (NG0203); afterRenderEffect() sí\n // es reactivo a signals y corre tras la actualización del DOM del panel.\n afterRenderEffect(() => {\n if (this.isOpen() && this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n }\n });\n\n const stopEscape = listenEscapeCapture(inject(DOCUMENT), () => this.onEscape());\n inject(DestroyRef).onDestroy(() => {\n stopEscape();\n this.overlay.dispose();\n });\n }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n this.isOpen.update((open) => !open);\n }\n\n toggleOption(value: string): void {\n const current = this.values();\n const next = current.includes(value)\n ? current.filter((selectedValue) => selectedValue !== value)\n : [...current, value];\n this.valuesChange.emit(next);\n }\n\n /**\n * Alterna entre \"todas seleccionadas\" y \"ninguna seleccionada\". Actúa\n * siempre sobre el universo COMPLETO de `options()`, no sobre\n * `filteredOptions()` — con un buscador activo, \"Todas\" no se filtra ni\n * cambia de significado: seguir marcando/desmarcando únicamente lo visible\n * sería sorprendente para quien ya tenía otras opciones (no visibles en el\n * filtro actual) seleccionadas de antes.\n */\n toggleAll(): void {\n this.valuesChange.emit(this.allSelected() ? [] : this.options().map((option) => option.value));\n }\n\n onSearchInput(event: Event): void {\n this.searchQuery.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n /** Mueve `activeIndex` sobre las opciones YA FILTRADAS visibles. Clamp simple, sin wraparound. */\n moveActive(delta: number): void {\n const count = this.filteredOptions().length;\n if (count === 0) {\n return;\n }\n this.activeIndex.update((current) => Math.min(Math.max(current + delta, 0), count - 1));\n }\n\n toggleActive(): void {\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.toggleOption(option.value);\n }\n }\n\n /**\n * Escape con el panel abierto, en fase de captura sobre `document` (ver\n * `listenEscapeCapture`): consume la tecla solo si había un panel que\n * cerrar, así un `kf-drawer`/`kf-modal` contenedor no se cierra con el\n * mismo Escape. Devuelve si cerró algo.\n */\n onEscape(): boolean {\n if (!this.isOpen()) {\n return false;\n }\n this.isOpen.set(false);\n return true;\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"triggerId\">{{ label() }}</kf-field-label>\n}\n<button\n #trigger\n type=\"button\"\n [id]=\"triggerId\"\n class=\"kf-multi-select__trigger\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? listboxId : null\"\n (click)=\"toggle()\"\n>\n <span\n class=\"kf-multi-select__value\"\n [class.kf-multi-select__value--placeholder]=\"selectedCount() === 0\"\n >\n {{ summaryText() }}\n </span>\n @if (selectedCount() > 0) {\n <span class=\"kf-multi-select__count\">{{ selectedCount() }}</span>\n }\n <span\n class=\"kf-multi-select__caret kf-caret\"\n [class.kf-multi-select__caret--open]=\"isOpen()\"\n [class.kf-caret--open]=\"isOpen()\"\n aria-hidden=\"true\"\n ></span>\n</button>\n<ng-template #panelTemplate>\n <div class=\"kf-multi-select__panel\">\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-multi-select__search\"\n placeholder=\"Buscar…\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n (keydown.enter)=\"$event.preventDefault(); toggleActive()\"\n />\n }\n <ul\n class=\"kf-multi-select__list\"\n [id]=\"listboxId\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"triggerId\"\n >\n @if (options().length > 0) {\n <li\n class=\"kf-multi-select__option\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"allSelected()\"\n (click)=\"toggleAll()\"\n (keydown.enter)=\"toggleAll()\"\n (keydown.space)=\"$event.preventDefault(); toggleAll()\"\n >\n <span\n class=\"kf-multi-select__checkbox kf-checkbox-box\"\n [class.kf-multi-select__checkbox--checked]=\"allSelected()\"\n [class.kf-multi-select__checkbox--indeterminate]=\"isPartiallySelected()\"\n ></span>\n <span class=\"kf-multi-select__option-label\">Todas</span>\n </li>\n }\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-multi-select__option\"\n [class.kf-multi-select__option--selected]=\"isSelected(option.value)\"\n [class.kf-multi-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n (click)=\"toggleOption(option.value)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown.enter)=\"toggleOption(option.value)\"\n (keydown.space)=\"$event.preventDefault(); toggleOption(option.value)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n >\n <span\n class=\"kf-multi-select__checkbox kf-checkbox-box\"\n [class.kf-multi-select__checkbox--checked]=\"isSelected(option.value)\"\n ></span>\n <span class=\"kf-multi-select__option-label\">{{ option.label }}</span>\n </li>\n } @empty {\n @if (options().length > 0) {\n <li class=\"kf-multi-select__empty\">Sin resultados</li>\n } @else {\n <li class=\"kf-multi-select__empty\">Sin opciones disponibles</li>\n }\n }\n </ul>\n </div>\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Collapsible } from '../collapsible/Collapsible';\nimport { Divider } from '../divider/Divider';\nimport type { IconName } from '../icon/icon-name';\nimport { Input } from '../input/Input';\nimport { MultiSelect, type MultiSelectOption } from '../multi-select/MultiSelect';\nimport { Select } from '../select/Select';\n\nexport type FilterFieldType = 'select' | 'multi-select' | 'search';\n\nexport interface FilterFieldConfig {\n key: string;\n type: FilterFieldType;\n label?: string;\n placeholder?: string;\n width?: string;\n icon?: IconName;\n showDivider?: boolean;\n}\n\nconst DEFAULT_FIELD_WIDTH = '240px';\n\nexport type FilterValue = string | string[];\n\nexport interface FilterFieldChange {\n key: string;\n value: FilterValue;\n}\n\n/**\n * Fila de filtros config-driven (select / multi-select / búsqueda) para el\n * header de una tabla, compuesta con piezas YA existentes de la librería\n * (`kf-select`, `kf-multi-select`, `kf-input`, `kf-divider`, `kf-collapsible`).\n *\n * No tiene lógica de filtrado propia: solo renderiza los controles descritos\n * por `fields()` y emite `fieldChange` cuando alguno cambia — filtrar filas\n * sigue siendo responsabilidad de quien lo consume.\n *\n * En escritorio los campos se muestran en una fila; en mobile/tablet\n * (≤768px, mismo breakpoint que `kf-portal-header`) se colapsan dentro de un\n * `kf-collapsible`.\n *\n * <kf-filter\n * [fields]=\"[\n * { key: 'model', type: 'multi-select', label: 'Modelo', placeholder: 'Todos los modelos', showDivider: true },\n * { key: 'search', type: 'search', label: 'Buscar vehículo', placeholder: 'Ingresa N° de orden o placa', width: '280px' },\n * ]\"\n * [values]=\"{ model: selectedModels(), search: searchTerm() }\"\n * [options]=\"{ model: modelOptions() }\"\n * (fieldChange)=\"onFieldChange($event)\"\n * />\n */\n@Component({\n selector: 'kf-filter',\n imports: [Collapsible, Divider, FormsModule, Input, MultiSelect, NgTemplateOutlet, Select],\n templateUrl: './Filter.html',\n styleUrl: './Filter.scss',\n})\nexport class Filter {\n readonly fields = input.required<FilterFieldConfig[]>();\n readonly values = input<Record<string, FilterValue>>({});\n readonly options = input<Record<string, string[]>>({});\n readonly mobileTitle = input('Filtros');\n\n readonly fieldChange = output<FilterFieldChange>();\n\n protected readonly multiOptionsByKey = computed<Record<string, MultiSelectOption[]>>(() => {\n const options = this.options();\n return Object.fromEntries(\n Object.keys(options).map((key) => [\n key,\n options[key].map((value) => ({ value, label: value })),\n ]),\n );\n });\n\n protected singleValueFor(key: string): string {\n const value = this.values()[key];\n return typeof value === 'string' ? value : '';\n }\n\n protected multiValueFor(key: string): string[] {\n const value = this.values()[key];\n return Array.isArray(value) ? value : [];\n }\n\n protected fieldWidth(field: FilterFieldConfig): string {\n return field.width ?? DEFAULT_FIELD_WIDTH;\n }\n\n protected optionsFor(key: string): string[] {\n return this.options()[key] ?? [];\n }\n\n protected multiOptionsFor(key: string): MultiSelectOption[] {\n return this.multiOptionsByKey()[key] ?? [];\n }\n\n protected onFieldChange(key: string, value: FilterValue): void {\n this.fieldChange.emit({ key, value });\n }\n}\n","<ng-template #fieldsTpl let-stacked=\"stacked\">\n @for (field of fields(); track field.key) {\n @switch (field.type) {\n @case ('select') {\n <kf-select\n [label]=\"field.label ?? ''\"\n [options]=\"optionsFor(field.key)\"\n [value]=\"singleValueFor(field.key)\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n (valueChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n @case ('multi-select') {\n <kf-multi-select\n [label]=\"field.label ?? ''\"\n [options]=\"multiOptionsFor(field.key)\"\n [values]=\"multiValueFor(field.key)\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n (valuesChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n @case ('search') {\n <kf-input\n [label]=\"field.label ?? ''\"\n [icon]=\"field.icon ?? 'search'\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n [ngModel]=\"singleValueFor(field.key)\"\n (ngModelChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n }\n @if (!stacked && field.showDivider) {\n <kf-divider orientation=\"vertical\" />\n }\n }\n</ng-template>\n\n<div class=\"kf-filter kf-filter--row\">\n <ng-container [ngTemplateOutlet]=\"fieldsTpl\" [ngTemplateOutletContext]=\"{ stacked: false }\" />\n</div>\n\n<kf-collapsible class=\"kf-filter__collapsible\" [title]=\"mobileTitle()\">\n <div class=\"kf-filter kf-filter--stack\">\n <ng-container [ngTemplateOutlet]=\"fieldsTpl\" [ngTemplateOutletContext]=\"{ stacked: true }\" />\n </div>\n</kf-collapsible>\n","import { booleanAttribute, Component, computed, input, output } from '@angular/core';\n\n/**\n * Opción en forma de objeto. `count` es opcional: cuando está presente se\n * muestra a la derecha del label (ej. \"Pendientes 3\"), con cifras tabulares\n * para que el ancho del chip no salte al cambiar el número.\n */\nexport interface FilterChipOption {\n value: string;\n label: string;\n count?: number;\n}\n\n/**\n * Fila de chips tipo \"pill\" para filtros de una sola selección.\n *\n * Cada opción puede pasarse como string simple (se usa como value y label\n * a la vez) o como objeto `{ value, label, count? }` cuando el texto\n * mostrado difiere del valor interno o cuando cada chip lleva un contador.\n *\n * El chip activo se resalta con `--kf-color-primary` — mismo color de marca\n * que `kf-tabs`/`kf-select` para su propio estado activo, así el filtro\n * seleccionado se lee con el color del tema activo, no un negro fijo que\n * no cambia entre marcas.\n *\n * Densidad: el padding horizontal de cada chip sale de\n * `--kf-filter-chips-padding-inline` (default `--kf-space-md`). Un\n * contenedor puede reducirlo sin tocar este componente — `kf-list-toolbar`\n * lo baja a 12px en su modo compacto.\n *\n * <kf-filter-chips [options]=\"['Todos', 'Activos', 'Archivados']\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n *\n * `layout=\"scroll\"` deja todos los chips en UNA línea con desplazamiento\n * horizontal (para mobile: los filtros no ocupan más alto que una fila); el\n * default `wrap` los reparte en varias líneas. `deselectable` permite\n * quitar el filtro volviendo a tocar el chip activo (emite `''`), para el\n * caso \"ningún chip = sin filtro\".\n *\n * <kf-filter-chips ariaLabel=\"Filtrar por estado\"\n * [options]=\"[{ value: '', label: 'Todas', count: 12 }]\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n */\n@Component({\n selector: 'kf-filter-chips',\n templateUrl: './FilterChips.html',\n styleUrl: './FilterChips.css',\n})\nexport class FilterChips {\n readonly options = input.required<(string | FilterChipOption)[]>();\n readonly value = input<string>('');\n /** Nombre accesible del grupo (ej. \"Filtrar por estado\"). Sin él, el grupo se anuncia sin nombre. */\n readonly ariaLabel = input<string>();\n /** `wrap` (default): varias líneas. `scroll`: una sola línea con desplazamiento horizontal. */\n readonly layout = input<'wrap' | 'scroll'>('wrap');\n /** Tocar el chip activo lo desactiva y emite `''`. Default `false` (comportamiento histórico). */\n readonly deselectable = input(false, { transform: booleanAttribute });\n\n readonly valueChange = output<string>();\n\n /** Normaliza cada opción string/objeto a la forma `{ value, label, count? }`. */\n readonly normalizedOptions = computed<FilterChipOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n select(value: string): void {\n if (value === this.value()) {\n if (this.deselectable() && value !== '') {\n this.valueChange.emit('');\n }\n return;\n }\n this.valueChange.emit(value);\n }\n}\n","<div\n class=\"kf-filter-chips\"\n [class.kf-filter-chips--scroll]=\"layout() === 'scroll'\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel() || null\"\n>\n @for (option of normalizedOptions(); track option.value) {\n <button\n type=\"button\"\n class=\"kf-filter-chips__chip\"\n [class.kf-filter-chips__chip--active]=\"option.value === value()\"\n [attr.aria-pressed]=\"option.value === value()\"\n (click)=\"select(option.value)\"\n >\n {{ option.label }}\n @if (option.count !== undefined) {\n <span class=\"kf-filter-chips__count\">{{ option.count }}</span>\n }\n </button>\n }\n</div>\n","import { Component, input } from '@angular/core';\n\n/** Un link del pie — legales, contacto, soporte. */\nexport interface FooterLink {\n label: string;\n href?: string;\n}\n\n/**\n * Pie de página general del portal (página 38): logo + copyright a la\n * izquierda, links legales/soporte empujados a la derecha. Logo y copyright\n * son inputs (cada portal del ecosistema — LATAM, OTD, Star — trae su\n * propia marca y texto legal); `links` es la lista de accesos, típicamente\n * placeholders hasta que existan destinos reales.\n *\n * <kf-footer\n * logoSrc=\"images/logo-kaufmann-dark.png\"\n * logoAlt=\"Grupo Kaufmann\"\n * copyright=\"© 2026 Kaufmann LATAM · Todos los derechos reservados\"\n * [links]=\"[\n * { label: 'Políticas de privacidad' },\n * { label: 'Contacto' },\n * { label: 'Sugerencias y reclamos' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-footer',\n templateUrl: './Footer.html',\n styleUrl: './Footer.css',\n})\nexport class Footer {\n readonly logoSrc = input<string>();\n readonly logoAlt = input('');\n readonly copyright = input.required<string>();\n readonly links = input<FooterLink[]>([]);\n}\n","<div class=\"kf-footer__wrap\">\n @if (logoSrc()) {\n <img class=\"kf-footer__logo\" [src]=\"logoSrc()\" [alt]=\"logoAlt()\" />\n }\n <span class=\"kf-footer__copyright\">{{ copyright() }}</span>\n @if (links().length) {\n <nav class=\"kf-footer__links\">\n @for (link of links(); track link.label) {\n <a [href]=\"link.href || '#'\">{{ link.label }}</a>\n }\n </nav>\n }\n</div>\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\ntype ResolvedJourneyStep = JourneyStep & {\n status: JourneyStepStatus;\n progressValue: number | null;\n};\n\n/** Ancho por defecto desde el cual `orientation=\"auto\"` elige horizontal. */\nconst AUTO_BREAKPOINT_PX = 820;\n\nexport type JourneyStepStatus = 'done' | 'current' | 'delayed' | 'pending';\n\nexport type JourneyStepperSurface = 'dark' | 'card';\n\n/**\n * Paleta de color de los estados, independiente de `orientation`:\n *\n * - `'brand'` (default): azul de marca para completado/actual, sin\n * semántica de semáforo. Para cuando horizontal y vertical representan\n * el mismo journey en distintos tamaños de pantalla.\n * - `'semantic'`: verde/amarillo/rojo real por paso (solo con\n * `orientation=\"vertical\"`, la única con 4 estados incluido `delayed`).\n * Para cuando cada paso comunica su propio estado puntual.\n */\nexport type JourneyStepperColorScheme = 'brand' | 'semantic';\n\n/** `'auto'` elige horizontal o vertical según el ancho del propio componente. */\nexport type JourneyStepperOrientation = 'horizontal' | 'vertical' | 'auto';\n\nexport interface JourneyStep {\n key: string;\n label: string;\n icon: IconName;\n /**\n * Estado explícito del paso. Si AL MENOS un paso lo define, todos los\n * estados salen de acá (un paso sin `status` queda `pending`), también en\n * horizontal y permitiendo varios pasos `current` o estados no\n * consecutivos. Si ningún paso lo define, horizontal lo deriva de\n * `currentStep`. Con `orientation=\"vertical\"` siempre se usa el explícito.\n */\n status?: JourneyStepStatus;\n /** Texto bajo el label, junto al label en horizontal sin `caption` (compatibilidad). */\n date?: string;\n /**\n * Texto secundario del paso, distinto de `date` (ej. «16 de 18 completaron»).\n * Se muestra bajo el label en ambas orientaciones.\n */\n caption?: string;\n /**\n * Avance 0-100 del paso, como barra fina bajo el texto. Se acota a [0, 100];\n * un valor no finito no dibuja la barra. Si el paso tiene `caption`, la\n * barra es decorativa (`aria-hidden`) y el `caption` debe comunicar el avance;\n * sin `caption` expone `role=\"progressbar\"` con el `label` como nombre.\n */\n progress?: number;\n /**\n * Texto visible del estado (ej. «Completado», «En curso», «Pendiente»), para\n * que el estado no dependa solo del color y la forma del punto.\n */\n statusLabel?: string;\n}\n\n/**\n * Progreso de un flujo de N pasos.\n *\n * - `orientation` (`'horizontal'` default | `'vertical'` | `'auto'`): horizontal\n * deriva done/current/pending de `currentStep` (salvo que algún paso defina\n * `status`); vertical usa `steps[].status` explícito, con `delayed` como\n * cuarto estado. `'auto'` es horizontal cuando el propio componente mide al\n * menos `autoBreakpoint` px (820 por defecto) y vertical si no; en vertical,\n * con `caption`/`progress`/`statusLabel` y desde 520 px de ancho, el texto de\n * cada paso pasa a filas «etiqueta | estado y conteo | barra». En `'auto'`\n * los puntos son clickeables solo mientras el layout es horizontal.\n * - `surface` (`'dark'` default | `'card'`): fondo sólido oscuro de marca,\n * o superficie clara con borde+sombra.\n * - `colorScheme` (`'brand'` default | `'semantic'`): ver `JourneyStepperColorScheme`.\n * - `ariaLabel`: nombre de la lista de pasos (lectores de pantalla).\n *\n * Los pasos se exponen como lista (`role=\"list\"`/`listitem`) y el paso con\n * `status === 'current'` lleva `aria-current=\"step\"`.\n *\n * <kf-journey-stepper surface=\"card\" [steps]=\"steps\" [currentStep]=\"4\" (stepClick)=\"onNavigate($event)\" />\n * <kf-journey-stepper orientation=\"vertical\" [steps]=\"unitSteps\" />\n * <kf-journey-stepper orientation=\"vertical\" colorScheme=\"semantic\" [steps]=\"unitStepsWithDelays\" />\n * <kf-journey-stepper orientation=\"auto\" surface=\"card\" ariaLabel=\"Avance por etapa\" [steps]=\"stages\" />\n */\n@Component({\n selector: 'kf-journey-stepper',\n imports: [Icon],\n templateUrl: './JourneyStepper.html',\n styleUrl: './JourneyStepper.css',\n})\nexport class JourneyStepper {\n readonly steps = input.required<JourneyStep[]>();\n readonly orientation = input<JourneyStepperOrientation>('horizontal');\n /** Ancho mínimo (px) del componente para ser horizontal con `orientation=\"auto\"`. */\n readonly autoBreakpoint = input<number>(AUTO_BREAKPOINT_PX);\n /** Nombre accesible de la lista de pasos. */\n readonly ariaLabel = input<string>();\n readonly surface = input<JourneyStepperSurface>('dark');\n readonly colorScheme = input<JourneyStepperColorScheme>('brand');\n\n /** Índice del paso actual — solo con `orientation=\"horizontal\"`. */\n readonly currentStep = input<number>(0);\n\n /** Se emite con `step.key` al clickear un paso — solo activo con `orientation=\"horizontal\"`. */\n readonly stepClick = output<string>();\n\n private readonly track = viewChild.required<ElementRef<HTMLElement>>('track');\n private readonly destroyRef = inject(DestroyRef);\n\n /** `true` cuando el contenido desborda el ancho visible — controla el fade de los bordes. */\n protected readonly hasOverflow = signal(false);\n\n /** Ancho medido del componente; `null` hasta la primera medición. */\n private readonly trackWidth = signal<number | null>(null);\n\n /**\n * Orientación efectiva: la de `orientation`, o —con `'auto'`— horizontal si el\n * componente mide al menos `autoBreakpoint` px. Antes de medir (o con ancho\n * 0) es vertical, que siempre cabe.\n */\n protected readonly effectiveOrientation = computed<'horizontal' | 'vertical'>(() => {\n const orientation = this.orientation();\n if (orientation !== 'auto') {\n return orientation;\n }\n const width = this.trackWidth();\n return width !== null && width >= this.autoBreakpoint() ? 'horizontal' : 'vertical';\n });\n\n protected readonly vertical = computed(() => this.effectiveOrientation() === 'vertical');\n protected readonly clickable = computed(() => this.effectiveOrientation() === 'horizontal');\n\n /** `true` si algún paso usa `caption`, `progress` o `statusLabel` (layout enriquecido). */\n protected readonly rich = computed(() =>\n this.steps().some(\n (step) =>\n !!step.caption || !!step.statusLabel || JourneyStepper.progressOf(step.progress) !== null,\n ),\n );\n\n constructor() {\n afterRenderEffect(() => {\n this.steps();\n this.effectiveOrientation();\n this.measureOverflow();\n });\n\n afterNextRender(() => {\n const observer = new ResizeObserver(() => this.measureOverflow());\n observer.observe(this.track().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n private measureOverflow(): void {\n const el = this.track().nativeElement;\n this.hasOverflow.set(el.scrollWidth > el.clientWidth);\n this.trackWidth.set(el.clientWidth);\n }\n\n /** Progreso acotado a [0, 100]; `null` si no hay valor finito. */\n private static progressOf(value: number | undefined): number | null {\n return value === undefined || !Number.isFinite(value)\n ? null\n : Math.min(100, Math.max(0, value));\n }\n\n protected readonly resolvedSteps = computed<ResolvedJourneyStep[]>(() => {\n const steps = this.steps();\n const explicit = this.orientation() === 'vertical' || steps.some((step) => step.status);\n const current = this.currentStep();\n\n return steps.map((step, index) => ({\n ...step,\n status: explicit\n ? (step.status ?? 'pending')\n : index < current\n ? 'done'\n : index === current\n ? 'current'\n : 'pending',\n progressValue: JourneyStepper.progressOf(step.progress),\n }));\n });\n\n protected dotIcon(status: JourneyStepStatus, stepIcon: IconName): IconName {\n if (status === 'done') {\n return 'check';\n }\n if (status === 'delayed') {\n return 'alert-circle';\n }\n return stepIcon;\n }\n}\n","<div\n #track\n class=\"kf-journey-stepper\"\n role=\"list\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [class.kf-journey-stepper--vertical]=\"vertical()\"\n [class.kf-journey-stepper--auto]=\"orientation() === 'auto'\"\n [class.kf-journey-stepper--rich]=\"rich()\"\n [class.kf-journey-stepper--card]=\"surface() === 'card'\"\n [class.kf-journey-stepper--semantic]=\"colorScheme() === 'semantic'\"\n [class.kf-journey-stepper--overflowing]=\"hasOverflow()\"\n>\n @for (step of resolvedSteps(); track step.key; let last = $last) {\n <div\n class=\"kf-journey-stepper__step\"\n role=\"listitem\"\n [class]=\"'kf-journey-stepper__step--' + step.status\"\n [attr.aria-current]=\"step.status === 'current' ? 'step' : null\"\n >\n @if (clickable()) {\n <button\n type=\"button\"\n class=\"kf-journey-stepper__dot\"\n [attr.aria-label]=\"step.label\"\n (click)=\"stepClick.emit(step.key)\"\n >\n <kf-icon [name]=\"dotIcon(step.status, step.icon)\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"kf-journey-stepper__dot\">\n <kf-icon [name]=\"dotIcon(step.status, step.icon)\" size=\"sm\" />\n </span>\n }\n\n <div class=\"kf-journey-stepper__text\">\n <span class=\"kf-journey-stepper__label\">{{ step.label }}</span>\n @if (step.date) {\n <span class=\"kf-journey-stepper__date\">{{ step.date }}</span>\n }\n @if (step.statusLabel || step.caption) {\n <span class=\"kf-journey-stepper__meta\">\n @if (step.statusLabel) {\n <span class=\"kf-journey-stepper__status\">{{ step.statusLabel }}</span>\n }\n @if (step.statusLabel && step.caption) {\n <span class=\"kf-journey-stepper__sep\" aria-hidden=\"true\">·</span>\n }\n @if (step.caption) {\n <span class=\"kf-journey-stepper__caption\">{{ step.caption }}</span>\n }\n </span>\n }\n @if (step.progressValue !== null) {\n @if (step.caption) {\n <span class=\"kf-journey-stepper__progress\" aria-hidden=\"true\">\n <span [style.width.%]=\"step.progressValue\"></span>\n </span>\n } @else {\n <span\n class=\"kf-journey-stepper__progress\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"step.progressValue\"\n [attr.aria-label]=\"step.label\"\n >\n <span [style.width.%]=\"step.progressValue\"></span>\n </span>\n }\n }\n </div>\n </div>\n\n @if (!last && !vertical()) {\n <span\n class=\"kf-journey-stepper__line\"\n aria-hidden=\"true\"\n [class.kf-journey-stepper__line--done]=\"step.status === 'done'\"\n ></span>\n }\n }\n</div>\n","/**\n * Modo de `kf-list-toolbar` según el ancho REAL disponible:\n * - `full`: todo en una fila con la densidad normal.\n * - `compact`: todo en una fila, con los chips más angostos (`data-density=\"compact\"`).\n * - `panel`: solo el buscador y un botón \"Filtros\"; filtros y acciones finales se ocultan.\n */\nexport type ListToolbarMode = 'full' | 'compact' | 'panel';\n\n/** Anchos medidos (px): disponible en la barra y requerido por cada densidad. */\nexport interface ListToolbarWidths {\n available: number;\n full: number;\n compact: number;\n}\n\n/**\n * Margen de histéresis (px) para SUBIR de modo. Bajar es inmediato (si no\n * cabe, no cabe); subir exige este margen extra, así un ancho que oscila\n * justo en el umbral (scrollbar que aparece y desaparece, un contador que\n * pasa de 9 a 10) no hace parpadear la barra entre dos modos.\n */\nexport const LIST_TOOLBAR_HYSTERESIS = 24;\n\n/**\n * Decide el modo a partir del modo actual y los anchos medidos. Función pura\n * para poder probar la histéresis sin layout real.\n */\nexport function resolveListToolbarMode(\n widths: ListToolbarWidths,\n current: ListToolbarMode,\n hysteresis = LIST_TOOLBAR_HYSTERESIS,\n): ListToolbarMode {\n const { available, full, compact } = widths;\n const fullThreshold = current === 'full' ? full : full + hysteresis;\n if (available >= fullThreshold) {\n return 'full';\n }\n const compactThreshold = current === 'panel' ? compact + hysteresis : compact;\n if (available >= compactThreshold) {\n return 'compact';\n }\n return 'panel';\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Badge } from '../badge/Badge';\nimport { Button } from '../button/button';\nimport { ListToolbarMode, resolveListToolbarMode } from './list-toolbar-mode';\n\nexport type { ListToolbarMode } from './list-toolbar-mode';\nexport { resolveListToolbarMode, LIST_TOOLBAR_HYSTERESIS } from './list-toolbar-mode';\n\n/** Selector de elementos que pueden recibir foco por teclado dentro de un slot. */\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Barra de herramientas de un listado: buscador, filtros y acciones finales\n * (orden, cambio de vista) en UNA fila, que se adapta al ancho REAL que\n * tiene disponible — no al del viewport. El mismo listado puede renderizarse\n * con el menú lateral abierto o cerrado, dentro de un panel o a pantalla\n * completa, y una `@media` no distingue esos casos; la barra mide su propio\n * ancho con `ResizeObserver`.\n *\n * ## Cuándo usarla y cuándo `kf-filter`\n * - `kf-list-toolbar`: chips con contador (`kf-filter-chips`) + orden + cambio\n * de vista + panel de filtros en modo estrecho, fija al hacer scroll y\n * guiada por el ancho del contenedor.\n * - `kf-filter`: selects, multi-select y buscador de texto en una fila de\n * formulario, que se pliega en un `kf-collapsible` a ≤768px de viewport.\n * Si el listado se filtra con campos, usar `kf-filter`; no se combinan ni\n * se reimplementan entre sí.\n *\n * ## Slots\n * - `[kf-toolbar-search]`: el buscador (ej. `kf-input icon=\"search\"`). Siempre visible; ocupa el espacio libre.\n * - `[kf-toolbar-filters]`: filtros rápidos (ej. `kf-filter-chips`).\n * - `[kf-toolbar-end]`: acciones al final de la fila (ej. `kf-select` de orden, `kf-view-toggle`).\n *\n * Cada slot acepta VARIOS elementos con el mismo atributo y los ubica en\n * fila con `gap`; marcar cada control (no un `<div>` envoltorio sin\n * `display: flex`, que apilaría sus hijos en bloque).\n *\n * La barra ocupa el ancho de su contenedor (`display: block`). Dentro de un\n * contenedor flex que ajusta su ancho al contenido, darle un ancho\n * explícito: si el contenedor mide lo que la barra pide, la barra mide lo\n * que el contenedor le da y el modo nunca puede subir de `panel`.\n * - default: contenido no visual que debe quedar SIEMPRE presente, como una\n * región `aria-live` con el conteo de resultados (nunca dentro de un slot\n * que se oculta).\n *\n * ## Modos (`mode`, `modeChange`, atributo `data-mode`)\n * - `full`: todo cabe en una fila.\n * - `compact`: cabe en una fila solo con chips más angostos. El host expone\n * `data-density=\"compact\"` y redefine `--kf-filter-chips-padding-inline`\n * (12px), que `kf-filter-chips` adopta sin configuración extra.\n * - `panel`: no cabe. Se ocultan `filters` y `end` y aparece, junto al\n * buscador, un botón \"Filtros\" (`filtersLabel`) con un badge de\n * `activeCount` (filtros/orden distintos del valor por defecto) que emite\n * `filtersClick` — el consumidor abre su propio panel (típicamente\n * `kf-drawer role=\"dialog\"` con `kf-option-list`).\n *\n * Contrato con el panel de filtros: el consumidor DEBE pasar\n * `[filtersExpanded]` con el estado de su panel y DEBE cerrarlo al recibir\n * un `modeChange` distinto de `'panel'`. Al salir de `panel` con el panel\n * abierto, la barra mueve el foco al primer filtro visible (el botón\n * \"Filtros\" ya no existe para recibirlo); si el panel modal siguiera\n * abierto, ese foco quedaría fuera del diálogo.\n *\n * El modo sale de comparar el ancho disponible con el ancho natural de los\n * slots en cada densidad (más `searchMinWidth` para el buscador), con\n * histéresis al subir de modo (`LIST_TOOLBAR_HYSTERESIS`) para que no\n * parpadee en el umbral. Los slots ocultos en modo `panel` se siguen\n * midiendo (quedan fuera de vista con `visibility: hidden`, sin foco ni\n * árbol de accesibilidad), así un contador que crece se refleja igual.\n *\n * ## Fija (`sticky`)\n * Con `sticky`, la barra queda pegada arriba al hacer scroll (`stickyTop`\n * compensa una cabecera fija del shell). Cuando efectivamente queda pegada,\n * el host recibe la clase `kf-list-toolbar--stuck`: sombra más marcada y\n * menos alto. \"Pegada\" = el contenedor con scroll (el ancestro más cercano\n * con `overflow-y: auto|scroll`, o la ventana) ya se desplazó Y la barra\n * está en su posición fija. Sin centinela: un centinela por encima de la\n * barra quedaría recortado cuando la barra es el primer elemento del\n * contenedor, y la marcaría pegada en reposo. El fondo alrededor de\n * la barra fija sale de `--kf-list-toolbar-backdrop` (default\n * `--kf-color-surface`, el fondo habitual del área de contenido).\n *\n * Foco tapado (WCAG 2.4.11): una barra fija puede quedar encima del control\n * que recibe el foco al tabular hacia arriba. El consumidor debe aplicar\n * `scroll-padding-top` = `stickyTop` + alto de la barra al contenedor que\n * hace scroll (o a `html` si es la ventana), así el navegador deja ese\n * margen al llevar un elemento enfocado a la vista. El alto vigente se\n * publica como señal `height` (px), output `heightChange` y variable CSS\n * `--kf-list-toolbar-height` en el host (esta última solo la heredan los\n * descendientes; un ancestro debe usar la señal):\n *\n * <main class=\"content\" [style.scroll-padding-top.px]=\"56 + toolbar.height()\">\n * <kf-list-toolbar #toolbar sticky [stickyTop]=\"56\" ... />\n * </main>\n *\n * <kf-list-toolbar sticky ariaLabel=\"Filtrar cotizaciones\" [activeCount]=\"activeFilters()\"\n * (filtersClick)=\"filtersOpen.set(true)\" (modeChange)=\"mode.set($event)\">\n * <span class=\"sr-only\" aria-live=\"polite\">{{ resultsLabel() }}</span>\n * <kf-input kf-toolbar-search icon=\"search\" ... />\n * <kf-filter-chips kf-toolbar-filters ... />\n * <kf-select kf-toolbar-end variant=\"compact\" icon=\"sort\" ariaLabel=\"Ordenar por\" ... />\n * <kf-view-toggle kf-toolbar-end ... />\n * </kf-list-toolbar>\n */\n@Component({\n selector: 'kf-list-toolbar',\n imports: [Badge, Button],\n templateUrl: './ListToolbar.html',\n styleUrl: './ListToolbar.css',\n host: {\n '[attr.data-mode]': 'mode()',\n '[attr.data-density]': \"mode() === 'full' ? 'full' : 'compact'\",\n '[class.kf-list-toolbar--sticky]': 'sticky()',\n '[class.kf-list-toolbar--stuck]': 'sticky() && stuck()',\n '[style.--kf-list-toolbar-top]': 'stickyTopCss()',\n '[style.--kf-list-toolbar-search-min]': \"searchMinWidth() + 'px'\",\n '[style.--kf-list-toolbar-height]': \"height() + 'px'\",\n },\n})\nexport class ListToolbar {\n /** Nombre accesible del landmark de búsqueda (`role=\"search\"`). */\n readonly ariaLabel = input('Filtrar resultados');\n /** Fija la barra arriba al hacer scroll. */\n readonly sticky = input(false, { transform: booleanAttribute });\n /** Offset superior de la barra fija: número (px) o longitud CSS (ej. `'var(--shell-header-height)'`). */\n readonly stickyTop = input<number | string>(0);\n /** Ancho mínimo útil del buscador (px) — entra en el cálculo de si todo cabe en una fila. */\n readonly searchMinWidth = input(200);\n /** Texto del botón del modo `panel`. */\n readonly filtersLabel = input('Filtros');\n /** Cantidad de filtros/orden distintos del valor por defecto; se muestra como badge en el botón del modo `panel`. */\n readonly activeCount = input(0);\n /**\n * `aria-expanded` del botón del modo `panel`: el estado del panel que abre\n * el consumidor. Además, si es `true` al salir de `panel`, el foco pasa al\n * primer filtro visible — por eso el consumidor DEBE cerrar su panel en\n * ese mismo `modeChange` (ver \"Contrato con el panel de filtros\").\n */\n readonly filtersExpanded = input<boolean>();\n\n readonly filtersClick = output<void>();\n /**\n * Nuevo modo. Al recibir un valor distinto de `'panel'`, el consumidor\n * DEBE cerrar su panel de filtros (ver \"Contrato con el panel de filtros\").\n */\n readonly modeChange = output<ListToolbarMode>();\n /** Alto del host (px) cada vez que cambia — ver \"Foco tapado\" en el JSDoc de la clase. */\n readonly heightChange = output<number>();\n\n private readonly modeState = signal<ListToolbarMode>('full');\n /** Modo vigente (también disponible como `data-mode` en el host). */\n readonly mode = this.modeState.asReadonly();\n\n private readonly stuckState = signal(false);\n /** `true` mientras la barra fija está efectivamente pegada arriba. */\n readonly stuck = this.stuckState.asReadonly();\n\n private readonly heightState = signal(0);\n /** Alto vigente del host en px (barra + padding de la variante fija). */\n readonly height = this.heightState.asReadonly();\n\n protected readonly stickyTopCss = computed(() => {\n const top = this.stickyTop();\n return typeof top === 'number' ? `${top}px` : top;\n });\n\n protected readonly filtersAriaLabel = computed(() => {\n const count = this.activeCount();\n if (count <= 0) {\n return undefined;\n }\n return `${this.filtersLabel()}, ${count} ${count === 1 ? 'activo' : 'activos'}`;\n });\n\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly barRef = viewChild.required<ElementRef<HTMLElement>>('bar');\n private readonly filtersRef = viewChild.required<ElementRef<HTMLElement>>('filters');\n private readonly endRef = viewChild.required<ElementRef<HTMLElement>>('end');\n private readonly filtersButtonRef = viewChild<string, ElementRef<HTMLElement>>('filtersButton', {\n read: ElementRef,\n });\n\n /** A dónde mover el foco tras un cambio de modo que desmonta/oculta el elemento enfocado. */\n private pendingFocus: 'filters-button' | 'slots' | null = null;\n /** `requestAnimationFrame` pendiente de `measure()` (coalesce de notificaciones). */\n private measureFrame: number | null = null;\n private stuckFrame: number | null = null;\n private removeScrollListener: (() => void) | null = null;\n\n constructor() {\n afterNextRender(() => {\n // Primera medición síncrona: sin parpadeo del modo inicial.\n this.measure();\n this.observeSize();\n });\n\n // `stuck` solo se calcula con `sticky`; se (des)engancha si cambia en runtime.\n afterRenderEffect(() => {\n const sticky = this.sticky();\n untracked(() => this.watchScroll(sticky));\n });\n\n // Conserva el foco cuando el cambio de modo oculta lo que lo tenía.\n afterRenderEffect(() => {\n this.mode();\n untracked(() => this.restorePendingFocus());\n });\n\n this.destroyRef.onDestroy(() => {\n this.removeScrollListener?.();\n if (this.measureFrame !== null) {\n cancelFrame(this.measureFrame);\n }\n if (this.stuckFrame !== null) {\n cancelFrame(this.stuckFrame);\n }\n });\n }\n\n protected onFiltersClick(): void {\n this.filtersClick.emit();\n }\n\n /**\n * Mide el ancho disponible y el natural de cada slot en ambas\n * densidades, y actualiza el modo. La densidad de medición se fuerza con\n * `data-measure` (que gana sobre `data-density` en el CSS) y se retira en\n * el mismo frame: el navegador nunca pinta ese estado intermedio.\n */\n private measure(): void {\n const host = this.hostRef.nativeElement;\n this.updateHeight(host);\n const bar = this.barRef().nativeElement;\n const style = getComputedStyle(bar);\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n const available = bar.clientWidth - padding;\n if (available <= 0) {\n return;\n }\n const gap = parseFloat(style.columnGap) || 0;\n\n const required = (density: 'full' | 'compact'): number => {\n host.setAttribute('data-measure', density);\n const slots = [this.filtersRef(), this.endRef()].map(\n (ref) => ref.nativeElement.getBoundingClientRect().width,\n );\n return slots.reduce(\n (total, width) => (width > 0 ? total + gap + width : total),\n this.searchMinWidth(),\n );\n };\n const full = required('full');\n const compact = required('compact');\n host.removeAttribute('data-measure');\n\n this.applyMode(resolveListToolbarMode({ available, full, compact }, this.modeState()));\n }\n\n private updateHeight(host: HTMLElement): void {\n const height = Math.round(host.getBoundingClientRect().height);\n if (height !== this.heightState()) {\n this.heightState.set(height);\n this.heightChange.emit(height);\n }\n }\n\n private applyMode(next: ListToolbarMode): void {\n const current = this.modeState();\n if (next === current) {\n return;\n }\n const active = this.document.activeElement;\n if (next === 'panel' && this.slotsContain(active)) {\n this.pendingFocus = 'filters-button';\n } else if (\n current === 'panel' &&\n // El botón \"Filtros\" se desmonta al salir de `panel`. Si tenía el foco,\n // o si el panel que abrió sigue abierto (el drawer devolvería el foco\n // a ese botón ya desmontado y caería en <body>), el foco pasa al\n // primer filtro visible.\n ((active && this.filtersButtonRef()?.nativeElement.contains(active)) ||\n this.filtersExpanded() === true)\n ) {\n this.pendingFocus = 'slots';\n }\n this.modeState.set(next);\n this.modeChange.emit(next);\n }\n\n private slotsContain(element: Element | null): boolean {\n return (\n !!element &&\n (this.filtersRef().nativeElement.contains(element) ||\n this.endRef().nativeElement.contains(element))\n );\n }\n\n private restorePendingFocus(): void {\n const target = this.pendingFocus;\n this.pendingFocus = null;\n if (target === 'filters-button') {\n this.filtersButtonRef()?.nativeElement.querySelector<HTMLElement>('button')?.focus();\n } else if (target === 'slots') {\n const first =\n this.filtersRef().nativeElement.querySelector<HTMLElement>(FOCUSABLE) ??\n this.endRef().nativeElement.querySelector<HTMLElement>(FOCUSABLE);\n first?.focus();\n }\n }\n\n private observeSize(): void {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n // Varias notificaciones en el mismo frame (barra, slots, host durante la\n // transición de padding de `stuck`) se resuelven en UNA medición por\n // frame: `heightChange` no se emite en cada paso intermedio.\n const observer = new ResizeObserver(() => this.scheduleMeasure());\n // El host también: su alto cambia con `sticky` (padding) sin que cambie la barra.\n observer.observe(this.hostRef.nativeElement);\n observer.observe(this.barRef().nativeElement);\n observer.observe(this.filtersRef().nativeElement);\n observer.observe(this.endRef().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n private scheduleMeasure(): void {\n if (this.measureFrame !== null) {\n return;\n }\n this.measureFrame = requestFrame(() => {\n this.measureFrame = null;\n this.measure();\n });\n }\n\n /** Engancha (o suelta) el cálculo de `stuck` al scroll del contenedor. */\n private watchScroll(sticky: boolean): void {\n this.removeScrollListener?.();\n this.removeScrollListener = null;\n if (!sticky) {\n this.stuckState.set(false);\n return;\n }\n const container = scrollParent(this.hostRef.nativeElement);\n const target: HTMLElement | Window = container ?? this.document.defaultView ?? window;\n const onScroll = () => {\n if (this.stuckFrame === null) {\n this.stuckFrame = requestFrame(() => {\n this.stuckFrame = null;\n this.updateStuck(container);\n });\n }\n };\n target.addEventListener('scroll', onScroll, { passive: true });\n this.removeScrollListener = () => target.removeEventListener('scroll', onScroll);\n this.updateStuck(container);\n }\n\n /**\n * Pegada = el contenedor ya se desplazó Y la barra está en su posición\n * fija (`top` resuelto, con medio píxel de tolerancia por subpíxeles).\n * Sin la primera condición, una barra que es el primer elemento del\n * contenedor se leería pegada en reposo.\n */\n private updateStuck(container: HTMLElement | null): void {\n const host = this.hostRef.nativeElement;\n const view = this.document.defaultView;\n const scrolled = container ? container.scrollTop > 0 : (view?.scrollY ?? 0) > 0;\n const containerTop = container\n ? container.getBoundingClientRect().top + container.clientTop\n : 0;\n const stickyTop = parseFloat(getComputedStyle(host).top) || 0;\n const offset = host.getBoundingClientRect().top - containerTop;\n this.stuckState.set(scrolled && offset <= stickyTop + 0.5);\n }\n}\n\n/** Ancestro más cercano que hace scroll vertical, o `null` si es la ventana. */\nfunction scrollParent(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent && parent !== element.ownerDocument.documentElement) {\n const overflowY = getComputedStyle(parent).overflowY;\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\n/** `requestAnimationFrame` con respaldo para entornos sin él (SSR, algunos runners de test). */\nfunction requestFrame(callback: () => void): number {\n return typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame(callback)\n : (setTimeout(callback, 16) as unknown as number);\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(handle);\n } else {\n clearTimeout(handle);\n }\n}\n","<div #bar class=\"kf-list-toolbar__bar\" role=\"search\" [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n <div class=\"kf-list-toolbar__search\"><ng-content select=\"[kf-toolbar-search]\" /></div>\n @if (mode() === 'panel') {\n <kf-button\n #filtersButton\n class=\"kf-list-toolbar__filters-button\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n icon=\"filter\"\n ariaHaspopup=\"dialog\"\n [ariaExpanded]=\"filtersExpanded()\"\n [ariaLabel]=\"filtersAriaLabel()\"\n (click)=\"onFiltersClick()\"\n >\n {{ filtersLabel() }}\n @if (activeCount() > 0) {\n <kf-badge class=\"kf-list-toolbar__filters-count\" aria-hidden=\"true\">{{\n activeCount()\n }}</kf-badge>\n }\n </kf-button>\n }\n <!-- `display: contents` en full/compact (los slots son ítems de la fila);\n en panel, caja de 0x0 que recorta: los slots se siguen midiendo sin\n ensanchar la página ni ser alcanzables. -->\n <div class=\"kf-list-toolbar__collapsible\">\n <div #filters class=\"kf-list-toolbar__filters kf-list-toolbar__slot\">\n <ng-content select=\"[kf-toolbar-filters]\" />\n </div>\n <div #end class=\"kf-list-toolbar__end kf-list-toolbar__slot\">\n <ng-content select=\"[kf-toolbar-end]\" />\n </div>\n </div>\n</div>\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Card de estadística/KPI: label, valor grande, ícono opcional en la esquina\n * superior derecha, badge de esquina opcional (pegado al valor) y una nota\n * al pie. Pensada para tableros de resumen (ej. \"11 Tickets abiertos\").\n *\n * Compone sobre `kf-card` en vez de duplicar su estilo de contenedor — así\n * el look de \"card\" (radio, sombra, borde) tiene una única fuente de verdad\n * en toda la librería, tal como pide el design system (página 14: \"Card...\n * es la base de paneles, tarjetas de métrica, tablas...\").\n *\n * Slot `[actions]` opcional (proyectado al pie, después de `foot`) para un\n * CTA dentro de la card — ej. \"Saldo Pendiente\" con botón \"Pagar Ahora\" en\n * Fase 6 de OTD. Mismo mecanismo de proyección por selector que `[footer]`\n * en `kf-modal`, no un `<ng-content>` default: así una card sin acciones no\n * paga ningún espacio extra.\n *\n * <kf-metric-card label=\"Tickets abiertos\" value=\"11\" icon=\"ticket\" foot=\"+2 hoy\" />\n * <kf-metric-card label=\"Tasa de resolución\" value=\"94%\" badge=\"+2%\" value-color=\"var(--kf-color-success)\" />\n * <kf-metric-card label=\"Saldo Pendiente\" value=\"$45,000\">\n * <kf-button actions variant=\"primary\" size=\"sm\">Pagar Ahora</kf-button>\n * </kf-metric-card>\n *\n * `loading` (default `false`): dibuja el esqueleto de la card — etiqueta,\n * ícono, valor y `foot` como bloques del alto real de cada línea — dentro del\n * mismo `kf-card`, y reserva (sin mostrar) el espacio de las acciones, así que\n * al llegar los datos no hay salto de layout. Pasa los mismos inputs que\n * usarás cargada. Marca el host con `aria-busy=\"true\"`.\n *\n * <kf-metric-card label=\"Tickets abiertos\" value=\"11\" foot=\"+2 hoy\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-metric-card',\n imports: [Card, Icon, Text],\n templateUrl: './MetricCard.html',\n styleUrl: './MetricCard.css',\n host: {\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class MetricCard {\n readonly label = input.required<string>();\n readonly value = input.required<string | number>();\n readonly unit = input<string>();\n /** Ícono en la esquina superior derecha, renderizado vía `kf-icon`. */\n readonly icon = input<IconName>();\n readonly foot = input<string>();\n /** Tinte opcional para el valor grande (ej. un color semántico de estado). */\n readonly valueColor = input<string>();\n /** Badge de esquina opcional, pegado al valor (ej. \"+2%\"). */\n readonly badge = input<string>();\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","<kf-card>\n <div class=\"kf-metric-card__head\">\n @if (loading()) {\n <span\n class=\"kf-metric-card__label-bone kf-bone\"\n style=\"--kf-bone-width: 45%\"\n aria-hidden=\"true\"\n >\n <kf-text as=\"span\" variant=\"overline-strong\">{{ label() }}</kf-text>\n </span>\n @if (icon()) {\n <span class=\"kf-metric-card__icon kf-bone-fill\" aria-hidden=\"true\"></span>\n }\n } @else {\n <kf-text as=\"span\" variant=\"overline-strong\">{{ label() }}</kf-text>\n @if (icon(); as iconName) {\n <span class=\"kf-metric-card__icon\">\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n </span>\n }\n }\n </div>\n <div class=\"kf-metric-card__value-row\">\n @if (loading()) {\n <div class=\"kf-metric-card__value kf-bone\" style=\"--kf-bone-width: 50%\" aria-hidden=\"true\">\n {{ value() }}\n </div>\n } @else {\n <div class=\"kf-metric-card__value\" [style.color]=\"valueColor()\">\n {{ value() }}\n @if (unit()) {\n <span class=\"kf-metric-card__unit\">{{ unit() }}</span>\n }\n </div>\n @if (badge()) {\n <span class=\"kf-metric-card__badge\">\n <kf-text as=\"span\" variant=\"overline-strong\" tone=\"ok\">{{ badge() }}</kf-text>\n </span>\n }\n }\n </div>\n @if (foot()) {\n @if (loading()) {\n <div class=\"kf-metric-card__foot kf-bone\" style=\"--kf-bone-width: 60%\" aria-hidden=\"true\">\n {{ foot() }}\n </div>\n } @else {\n <div class=\"kf-metric-card__foot\">{{ foot() }}</div>\n }\n }\n <div class=\"kf-metric-card__actions\" [class.kf-metric-card__actions--loading]=\"loading()\">\n <ng-content select=\"[actions]\" />\n </div>\n</kf-card>\n","/** Estado de avance de una etapa o hito; nunca se comunica solo con color. */\nexport type ProgressStatus = 'done' | 'current' | 'pending';\n\nexport const PROGRESS_STATUS = {\n DONE: 'done',\n CURRENT: 'current',\n PENDING: 'pending',\n} as const satisfies Record<string, ProgressStatus>;\n\n/**\n * Texto por defecto (español) de cada estado: el estado nunca se comunica solo\n * con color. Los componentes que lo muestran aceptan sus propios textos.\n */\nexport const PROGRESS_STATUS_LABEL = {\n [PROGRESS_STATUS.DONE]: 'Completado',\n [PROGRESS_STATUS.CURRENT]: 'En curso',\n [PROGRESS_STATUS.PENDING]: 'Pendiente',\n} as const satisfies Record<ProgressStatus, string>;\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { ProgressStatus } from './ProgressStatus';\n\n/**\n * Marca pequeña de estado para leyendas y listas de hitos: círculo relleno\n * con check (completado), anillo con punto (en curso) o anillo vacío\n * (pendiente). La forma comunica el estado y el color solo lo refuerza.\n * `exception` la pinta con borde discontinuo y tono de aviso.\n *\n * Es decorativa por defecto (`aria-hidden`): el texto del estado va en el\n * contexto que la usa. Para usarla suelta (ej. una leyenda sin texto al lado),\n * `label` la expone como imagen con ese nombre.\n *\n * <kf-status-mark status=\"done\" small />\n * <kf-status-mark status=\"current\" label=\"En curso\" />\n *\n * Tamaño: variables CSS `--kf-status-mark-size` y `--kf-status-mark-size-sm`.\n */\n@Component({\n selector: 'kf-status-mark',\n template: `<span\n class=\"kf-status-mark\"\n [class]=\"'kf-status-mark--' + status()\"\n [class.kf-status-mark--exception]=\"exception()\"\n [attr.role]=\"label() ? 'img' : null\"\n [attr.aria-label]=\"label() || null\"\n [attr.aria-hidden]=\"label() ? null : 'true'\"\n ></span>`,\n styleUrl: './StatusMark.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.kf-status-mark-host--sm]': 'small()' },\n})\nexport class StatusMark {\n readonly status = input.required<ProgressStatus>();\n /** Versión reducida, para listas de hitos. */\n readonly small = input(false);\n /** Hito de excepción: borde discontinuo y tono de aviso. */\n readonly exception = input(false);\n /** Nombre accesible; sin él la marca es decorativa. */\n readonly label = input<string | null>(null);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport type { ProgressStatus } from './ProgressStatus';\n\n/**\n * Nodo circular de una etapa: ícono de la etapa más una insignia de estado.\n * La forma comunica el estado (relleno con check, anillo con punto, anillo\n * vacío) y el color solo lo refuerza.\n *\n * Es decorativo por defecto (`aria-hidden`): el texto del estado debe estar en\n * el contexto que lo usa. Para usarlo suelto, `label` lo expone como imagen\n * con ese nombre.\n *\n * <kf-status-node status=\"current\" icon=\"truck\" />\n * <kf-status-node status=\"done\" icon=\"check\" size=\"sm\" label=\"Entrega completada\" />\n *\n * Tamaño: variables CSS `--kf-status-node-size` y `--kf-status-node-size-sm`.\n */\n@Component({\n selector: 'kf-status-node',\n imports: [Icon],\n template: `\n <span\n class=\"kf-status-node\"\n [class]=\"'kf-status-node--' + status()\"\n [attr.role]=\"label() ? 'img' : null\"\n [attr.aria-label]=\"label() || null\"\n [attr.aria-hidden]=\"label() ? null : 'true'\"\n >\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n <span class=\"kf-status-node__badge\"></span>\n </span>\n `,\n styleUrl: './StatusNode.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.kf-status-node-host--sm]': \"size() === 'sm'\" },\n})\nexport class StatusNode {\n readonly status = input.required<ProgressStatus>();\n readonly icon = input.required<IconName>();\n readonly size = input<'md' | 'sm'>('md');\n /** Nombre accesible; sin él el nodo es decorativo. */\n readonly label = input<string | null>(null);\n}\n","import type { IconName } from '../icon/Icon';\nimport {\n PROGRESS_STATUS,\n PROGRESS_STATUS_LABEL,\n type ProgressStatus,\n} from '../status-indicators/ProgressStatus';\n\n/**\n * Hito de una etapa. `date` llega ya formateada; `exception` excluye el hito\n * del avance (se muestra en un bloque aparte y solo si ocurrió).\n */\nexport interface MilestoneItem {\n id: string;\n label: string;\n done: boolean;\n date?: string;\n exception?: boolean;\n}\n\n/**\n * Etapa expandible de la línea de tiempo. `date` llega ya formateada y solo\n * aplica si la etapa está completada. Una etapa sin `items` no es expandible.\n */\nexport interface MilestoneGroup {\n id: string;\n label: string;\n status: ProgressStatus;\n icon: IconName;\n date?: string;\n items: readonly MilestoneItem[];\n}\n\n/** Textos de `kf-milestone-timeline`; todos tienen valor por defecto en español. */\nexport interface MilestoneTimelineLabels {\n heading: string;\n expandAll: string;\n collapseAll: string;\n statusDone: string;\n statusPending: string;\n /** Texto de una etapa en curso; recibe los hitos completados y el total que cuenta en el avance. */\n currentMeta: (done: number, total: number) => string;\n /** Insignia del hito destacado como el siguiente a completar. */\n next: string;\n exceptionsTitle: string;\n noExceptions: string;\n /** Texto solo para lectores de pantalla tras un hito completado. */\n itemDone: string;\n /** Texto solo para lectores de pantalla tras un hito pendiente. */\n itemPending: string;\n}\n\nexport const DEFAULT_MILESTONE_TIMELINE_LABELS: MilestoneTimelineLabels = {\n heading: 'Avance por etapa',\n expandAll: 'Expandir todo',\n collapseAll: 'Contraer todo',\n statusDone: PROGRESS_STATUS_LABEL[PROGRESS_STATUS.DONE],\n statusPending: PROGRESS_STATUS_LABEL[PROGRESS_STATUS.PENDING],\n currentMeta: (done, total) =>\n `${PROGRESS_STATUS_LABEL[PROGRESS_STATUS.CURRENT]} · ${done} de ${total}`,\n next: 'Siguiente',\n exceptionsTitle: 'Observaciones · no cuentan en el avance',\n noExceptions: 'Sin observaciones registradas.',\n itemDone: 'completado',\n itemPending: 'pendiente',\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { Badge } from '../badge/Badge';\nimport { Button } from '../button/button';\nimport { Icon } from '../icon/Icon';\nimport { PROGRESS_STATUS } from '../status-indicators/ProgressStatus';\nimport { StatusMark } from '../status-indicators/StatusMark';\nimport { StatusNode } from '../status-indicators/StatusNode';\nimport {\n DEFAULT_MILESTONE_TIMELINE_LABELS,\n type MilestoneGroup,\n type MilestoneItem,\n type MilestoneTimelineLabels,\n} from './MilestoneTimeline.types';\n\nlet nextInstanceId = 0;\n\n/**\n * Línea de tiempo de etapas con hitos. Cada etapa es un encabezado expandible\n * (`aria-expanded`/`aria-controls`) con un panel de hitos y, si la etapa tiene\n * hitos de excepción, un bloque aparte que no cuenta en el avance. Una etapa\n * sin hitos es solo informativa (no es un botón).\n *\n * El estado nunca se comunica solo con color: cada etapa y cada hito llevan su\n * estado en texto (visible o solo para lectores de pantalla) y los nodos y\n * marcas lo dibujan también con la forma. Todos los textos salen de `labels`\n * (español por defecto) y las fechas llegan ya formateadas.\n *\n * El conector entre etapas se deriva del tamaño del nodo\n * (`--kf-status-node-size`, default `2.125rem`) y de la separación del\n * encabezado: cambiar el tamaño del nodo mueve la línea con él.\n *\n * <kf-milestone-timeline\n * [groups]=\"stages()\"\n * [(expandedIds)]=\"expanded\"\n * nextItemId=\"stage2-docs\"\n * ariaLabel=\"Avance de la entrega\"\n * [labels]=\"{ heading: 'Progress', expandAll: 'Expand all' }\"\n * />\n */\n@Component({\n selector: 'kf-milestone-timeline',\n imports: [Badge, Button, Icon, NgTemplateOutlet, StatusMark, StatusNode],\n templateUrl: './MilestoneTimeline.html',\n styleUrl: './MilestoneTimeline.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MilestoneTimeline {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instanceId = `kf-milestone-timeline-${nextInstanceId++}`;\n\n readonly groups = input.required<readonly MilestoneGroup[]>();\n /** Ids de las etapas expandidas, two-way: `[(expandedIds)]`. El padre controla el estado inicial. */\n readonly expandedIds = model<readonly string[]>([]);\n /** Id del hito que se destaca como el siguiente a completar. */\n readonly nextItemId = input<string | undefined>(undefined);\n /** Textos; los que no se pasen usan el español por defecto. */\n readonly labels = input<Partial<MilestoneTimelineLabels>>({});\n /** Nombre accesible de la lista de etapas. */\n readonly ariaLabel = input<string | undefined>(undefined);\n /** Nivel (2-6) del título \"Avance por etapa\", para respetar el esquema de títulos de la página. */\n readonly headingLevel = input<2 | 3 | 4 | 5 | 6>(3);\n\n protected readonly text = computed<MilestoneTimelineLabels>(() => ({\n ...DEFAULT_MILESTONE_TIMELINE_LABELS,\n ...this.labels(),\n }));\n\n protected readonly rows = computed(() =>\n this.groups().map((group) => {\n const main = group.items.filter((item) => !item.exception);\n const doneCount = main.filter((item) => item.done).length;\n const exceptions = group.items.filter((item) => item.exception);\n return {\n group,\n main,\n exceptions,\n happened: exceptions.filter((item) => item.done),\n expandable: group.items.length > 0,\n meta: this.metaOf(group, doneCount, main.length),\n };\n }),\n );\n\n private readonly expandableIds = computed(() =>\n this.groups()\n .filter((group) => group.items.length > 0)\n .map((group) => group.id),\n );\n\n protected readonly hasExpandable = computed(() => this.expandableIds().length > 0);\n protected readonly allExpanded = computed(\n () => this.hasExpandable() && this.expandableIds().every((id) => this.isExpanded(id)),\n );\n\n protected isExpanded(groupId: string): boolean {\n return this.expandedIds().includes(groupId);\n }\n\n protected headId(groupId: string): string {\n return `${this.instanceId}-head-${groupId}`;\n }\n\n protected panelId(groupId: string): string {\n return `${this.instanceId}-panel-${groupId}`;\n }\n\n protected itemStatus(item: MilestoneItem): 'done' | 'pending' {\n return item.done ? PROGRESS_STATUS.DONE : PROGRESS_STATUS.PENDING;\n }\n\n protected toggle(groupId: string): void {\n this.expandedIds.update((ids) =>\n ids.includes(groupId) ? ids.filter((id) => id !== groupId) : [...ids, groupId],\n );\n }\n\n protected toggleAll(): void {\n this.expandedIds.set(this.allExpanded() ? [] : this.expandableIds());\n }\n\n /** Lleva el foco al encabezado de una etapa expandible; devuelve el elemento, o `null` si no existe o no es expandible. */\n focusGroup(groupId: string): HTMLElement | null {\n // Solo las etapas expandibles tienen un encabezado enfocable (un botón).\n const head = this.host.nativeElement.querySelector<HTMLElement>(\n `button#${this.headId(groupId)}`,\n );\n head?.focus({ preventScroll: true });\n return head;\n }\n\n private metaOf(group: MilestoneGroup, done: number, total: number): string {\n const text = this.text();\n if (group.status === PROGRESS_STATUS.DONE) return group.date ?? text.statusDone;\n if (group.status === PROGRESS_STATUS.CURRENT) return text.currentMeta(done, total);\n return text.statusPending;\n }\n}\n","<div class=\"kf-milestone-timeline\">\n <div class=\"kf-milestone-timeline__toolbar\">\n <p class=\"kf-milestone-timeline__heading\" role=\"heading\" [attr.aria-level]=\"headingLevel()\">\n {{ text().heading }}\n </p>\n @if (hasExpandable()) {\n <kf-button\n class=\"kf-milestone-timeline__toggle-all\"\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"toggleAll()\"\n >\n {{ allExpanded() ? text().collapseAll : text().expandAll }}\n </kf-button>\n }\n </div>\n\n <ol class=\"kf-milestone-timeline__list\" [attr.aria-label]=\"ariaLabel() ?? null\">\n @for (row of rows(); track row.group.id) {\n <li\n class=\"kf-milestone-timeline__group\"\n [class]=\"'kf-milestone-timeline__group--' + row.group.status\"\n >\n @if (row.expandable) {\n <button\n type=\"button\"\n class=\"kf-milestone-timeline__head\"\n [id]=\"headId(row.group.id)\"\n [attr.aria-expanded]=\"isExpanded(row.group.id)\"\n [attr.aria-controls]=\"panelId(row.group.id)\"\n (click)=\"toggle(row.group.id)\"\n >\n <ng-container *ngTemplateOutlet=\"headContent; context: { $implicit: row }\" />\n <kf-icon class=\"kf-milestone-timeline__chevron\" name=\"chevron-down\" size=\"sm\" />\n </button>\n\n <div\n class=\"kf-milestone-timeline__panel\"\n role=\"group\"\n [id]=\"panelId(row.group.id)\"\n [attr.aria-labelledby]=\"headId(row.group.id)\"\n [hidden]=\"!isExpanded(row.group.id)\"\n >\n <ul class=\"kf-milestone-timeline__items\">\n @for (item of row.main; track item.id) {\n <li\n class=\"kf-milestone-timeline__item\"\n [class.kf-milestone-timeline__item--done]=\"item.done\"\n [class.kf-milestone-timeline__item--next]=\"item.id === nextItemId()\"\n >\n <kf-status-mark [status]=\"itemStatus(item)\" [small]=\"true\" />\n <span class=\"kf-milestone-timeline__item-body\">\n <span\n >{{ item.label\n }}<span class=\"kf-sr-only\"\n >: {{ item.done ? text().itemDone : text().itemPending }}</span\n ></span\n >\n @if (item.date) {\n <span class=\"kf-milestone-timeline__item-date\">{{ item.date }}</span>\n }\n </span>\n @if (item.id === nextItemId()) {\n <kf-badge tone=\"info\">{{ text().next }}</kf-badge>\n }\n </li>\n }\n </ul>\n\n @if (row.exceptions.length > 0) {\n <div class=\"kf-milestone-timeline__exceptions\">\n <p class=\"kf-milestone-timeline__exceptions-title\">{{ text().exceptionsTitle }}</p>\n @if (row.happened.length > 0) {\n <ul class=\"kf-milestone-timeline__items\">\n @for (item of row.happened; track item.id) {\n <li class=\"kf-milestone-timeline__item kf-milestone-timeline__item--done\">\n <kf-status-mark status=\"done\" [small]=\"true\" [exception]=\"true\" />\n <span class=\"kf-milestone-timeline__item-body\">\n <span\n >{{ item.label\n }}<span class=\"kf-sr-only\">: {{ text().itemDone }}</span></span\n >\n @if (item.date) {\n <span class=\"kf-milestone-timeline__item-date\">{{ item.date }}</span>\n }\n </span>\n </li>\n }\n </ul>\n } @else {\n <p class=\"kf-milestone-timeline__exceptions-empty\">{{ text().noExceptions }}</p>\n }\n </div>\n }\n </div>\n } @else {\n <div\n class=\"kf-milestone-timeline__head kf-milestone-timeline__head--static\"\n [id]=\"headId(row.group.id)\"\n >\n <ng-container *ngTemplateOutlet=\"headContent; context: { $implicit: row }\" />\n </div>\n }\n </li>\n }\n </ol>\n</div>\n\n<!-- Nodo + título + estado de una etapa, compartido por el encabezado botón y el estático. -->\n<ng-template #headContent let-row>\n <kf-status-node [status]=\"row.group.status\" [icon]=\"row.group.icon\" />\n <span class=\"kf-milestone-timeline__text\">\n <span class=\"kf-milestone-timeline__title\">{{ row.group.label }}</span>\n <span class=\"kf-milestone-timeline__meta\">\n @if (row.group.status === 'done') {\n <span class=\"kf-sr-only\">{{ text().statusDone }}. </span>\n }\n {{ row.meta }}\n </span>\n </span>\n</ng-template>\n","import { DOCUMENT } from '@angular/common';\nimport { OverlayContainer } from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport {\n installModalAwareOverlayContainer,\n registerOpenModalDialog,\n unregisterOpenModalDialog,\n} from './modal-overlay-container';\n\nlet modalId = 0;\n\n/** Controles que pueden recibir el foco inicial. */\nconst FOCUSABLE =\n 'input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Diálogo centrado sobre un backdrop: confirmaciones destructivas, formularios\n * cortos, decisiones que bloquean el flujo.\n *\n * Se apoya en el `<dialog>` nativo (`showModal()`), así que el atrapado de\n * foco, el backdrop, el orden en el top-layer y el cierre con `Escape` los\n * resuelve el navegador — no hay trampa de foco escrita a mano acá. Lo único\n * que se agrega es el lock de scroll del body, que `<dialog>` no hace.\n *\n * `open` es two-way. Con `dismissible` en `false` (ej. mientras una acción\n * destructiva está en vuelo) se cancelan `Escape` y el clic en el backdrop:\n * solo cierra el consumidor poniendo `open` en `false`.\n *\n * Las acciones van en el slot `footer` — el atributo `footer` se pone\n * DIRECTO en cada `kf-button`, sin envolverlos en un `<div footer>`:\n * `.kf-modal__footer` ya es `display:flex` con `gap` propio entre sus\n * hijos DIRECTOS. Envolver los botones en un `<div>` intermedio dejaría\n * ese `<div>` como único hijo del footer — el gap nunca llegaría a\n * separar los botones entre sí (bug real encontrado en `web-otd-frontend`:\n * los 2 botones quedaban pegados, con 0px de separación medida, pese a que\n * el CSS del footer declaraba `gap: var(--kf-space-md)`).\n *\n * <kf-modal [(open)]=\"confirmOpen\" title=\"Eliminar unidad\">\n * <p>Esta acción no se puede deshacer.</p>\n * <kf-button footer variant=\"ghost\" (click)=\"confirmOpen.set(false)\">Cancelar</kf-button>\n * <kf-button footer (click)=\"remove()\">Eliminar</kf-button>\n * </kf-modal>\n *\n * El footer agrupa todo a la derecha por defecto (`justify-content:\n * flex-end`) — para una acción secundaria/informativa que debe quedar\n * separada a la izquierda (ej. un link \"Ver documento\" junto a un botón\n * \"Cerrar\"), agregar la clase `kf-modal__footer-start` AL MISMO elemento\n * que ya lleva `footer`, no a un wrapper (mismo motivo que el `footer`\n * directo: un `<div>` intermedio rompe el `gap`):\n *\n * <kf-link footer class=\"kf-modal__footer-start\" disabled>Ver documento</kf-link>\n * <kf-button footer (click)=\"open.set(false)\">Cerrar</kf-button>\n *\n * ## Modal de listado (alto acotado, filtros fijos)\n * Para un diálogo con mucho contenido (ej. elegir un ítem entre cientos):\n * - `maxHeight` (ej. `\"85vh\"`) acota el panel; solo `.kf-modal__body` se\n * desplaza, el encabezado, la zona `[kf-modal-toolbar]` y el footer\n * quedan fijos.\n * - `[kf-modal-toolbar]`: zona FIJA entre el encabezado y el cuerpo, para\n * buscador y filtros.\n * - `[kf-modal-meta]`: dato corto junto al título (ej. \"12 de 86\").\n * - `fullscreenOnMobile`: hasta 640px de viewport ocupa toda la pantalla\n * (`100dvh`, sin radio).\n * - `initialFocus`: selector CSS del elemento que recibe el foco al abrir\n * (si apunta a un contenedor, se enfoca su primer control). Sin él, el\n * `<dialog>` nativo decide (`autofocus` o el primer control).\n *\n * <kf-modal [(open)]=\"open\" title=\"Cambiar cotización\" width=\"1040px\"\n * maxHeight=\"85vh\" fullscreenOnMobile initialFocus=\".search\">\n * <span kf-modal-meta aria-live=\"polite\">12 de 86</span>\n * <div kf-modal-toolbar><kf-input class=\"search\" … /></div>\n * <ul>…</ul>\n * </kf-modal>\n */\n@Component({\n selector: 'kf-modal',\n imports: [Icon],\n templateUrl: './Modal.html',\n styleUrl: './Modal.css',\n})\nexport class Modal {\n readonly title = input('');\n /** Visibilidad, two-way: `[(open)]=\"confirmOpen\"`. */\n readonly open = model(false);\n /** Permite cerrar con el botón, `Escape` o clic en el backdrop. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n /** Ancho por defecto: `480px` (sin pasar nada). Un modal con contenido\n * tabular/ancho (ej. una lista de varios campos por fila) puede pedir\n * más, ej. `width=\"720px\"` — sigue topeado por `100vw` en pantallas\n * angostas, mismo `min()` de siempre. */\n readonly width = input<string | null>(null);\n /** Alto máximo del panel (ej. `\"85vh\"`); con valor, solo el cuerpo se\n * desplaza. Sin valor (default) el panel crece con su contenido. */\n readonly maxHeight = input<string | null>(null);\n /** Hasta 640px de viewport, ocupa toda la pantalla (100dvh, sin radio). */\n readonly fullscreenOnMobile = input(false, { transform: booleanAttribute });\n /** Selector CSS (dentro del panel) del elemento a enfocar al abrir. */\n readonly initialFocus = input<string | null>(null);\n\n protected readonly titleId = `kf-modal-title-${modalId++}`;\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly panel = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly document = inject(DOCUMENT);\n private readonly overlayContainer = inject(OverlayContainer);\n\n constructor() {\n // Ver `modal-overlay-container.ts`: sin esto, cualquier overlay de CDK\n // (kf-select, kf-multi-select, kf-dropdown, tooltips, el selector de\n // kf-pagination) queda visible pero no clickeable dentro de este modal,\n // porque `showModal()` deja `.cdk-overlay-container` (siempre hijo de\n // `<body>`) fuera del top layer e inerte.\n installModalAwareOverlayContainer(this.overlayContainer);\n\n afterRenderEffect(() => {\n const el = this.dialog()?.nativeElement;\n if (!el) {\n return;\n }\n if (this.open() && !el.open) {\n // `showModal` no existe en jsdom (tests) ni en entornos sin\n // top-layer; el atributo `open` lo deja visible, aunque no modal.\n if (typeof el.showModal === 'function') {\n el.showModal();\n } else {\n el.open = true;\n }\n this.focusInitial();\n } else if (!this.open() && el.open) {\n if (typeof el.close === 'function') {\n el.close();\n } else {\n el.open = false;\n }\n }\n // Se reconcilia contra `el.open` (no contra la rama recién tomada)\n // porque el cierre puede venir del propio navegador — Escape sin\n // `event.preventDefault()` en `onCancel` cierra el `<dialog>` nativo\n // sin pasar por la rama de arriba — y el registro tiene que reflejar\n // el estado real para que el overlay container elija bien el destino.\n if (el.open) {\n registerOpenModalDialog(el);\n } else {\n unregisterOpenModalDialog(el);\n }\n // `<dialog>` inertiza el resto de la página pero no frena su scroll.\n this.document.body.style.overflow = this.open() ? 'hidden' : '';\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n const el = this.dialog()?.nativeElement;\n if (el) {\n unregisterOpenModalDialog(el);\n }\n });\n }\n\n /**\n * Enfoca `initialFocus` DESPUÉS de `showModal()` (que ya movió el foco al\n * primer control): un elemento dentro de un `<dialog>` cerrado no se puede\n * enfocar. Si el selector apunta a un host (ej. `kf-input`), se enfoca su\n * primer control interno.\n */\n private focusInitial(): void {\n const selector = this.initialFocus();\n const panel = this.panel()?.nativeElement;\n if (!selector || !panel) {\n return;\n }\n const target = panel.querySelector<HTMLElement>(selector);\n const focusable = target?.matches(FOCUSABLE)\n ? target\n : target?.querySelector<HTMLElement>(FOCUSABLE);\n focusable?.focus();\n }\n\n /** `Escape` dispara `cancel`; cancelarlo lo deja abierto. */\n protected onCancel(event: Event): void {\n if (!this.dismissible()) {\n event.preventDefault();\n }\n }\n\n /**\n * Clic en el backdrop. Un clic en la zona del backdrop tiene como `target` al\n * propio `<dialog>` (el contenido vive en el panel de adentro), así que basta\n * comparar contra él — no hace falta cortar la propagación en el panel.\n *\n * Va como HostListener y no como binding en el template porque un `(click)`\n * sobre el `<dialog>` dispara las reglas a11y de click-sin-teclado; acá el\n * equivalente de teclado es `Escape`, que el `<dialog>` nativo ya maneja.\n */\n @HostListener('click', ['$event'])\n protected onHostClick(event: MouseEvent): void {\n if (this.dismissible() && event.target === this.dialog()?.nativeElement) {\n this.open.set(false);\n }\n }\n}\n","<dialog\n #dialog\n class=\"kf-modal\"\n [class.kf-modal--bounded]=\"!!maxHeight()\"\n [class.kf-modal--fullscreen-mobile]=\"fullscreenOnMobile()\"\n [style.--kf-modal-width]=\"width()\"\n [style.--kf-modal-max-height]=\"maxHeight()\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n>\n @if (open()) {\n <div #panel class=\"kf-modal__panel\">\n <div class=\"kf-modal__head\">\n <div class=\"kf-modal__heading\">\n @if (title()) {\n <h2 class=\"kf-modal__title\" [id]=\"titleId\">{{ title() }}</h2>\n }\n <ng-content select=\"[kf-modal-meta]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-modal__close\"\n aria-label=\"Cerrar diálogo\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n </div>\n <div class=\"kf-modal__toolbar\"><ng-content select=\"[kf-modal-toolbar]\" /></div>\n <div class=\"kf-modal__body\"><ng-content /></div>\n <div class=\"kf-modal__footer\"><ng-content select=\"[footer]\" /></div>\n </div>\n }\n</dialog>\n","import { Component, input } from '@angular/core';\n\n/** Color de la franja izquierda y del fondo. */\nexport type NoteBlockTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Bloque de texto atribuido a una PERSONA: encabezado, prosa y firma al pie,\n * con fondo suave y franja de color — la anatomía de una cita, distinta de\n * `kf-alert` (que interrumpe el flujo con `role=\"alert\"`). El texto va como\n * contenido proyectado y respeta los saltos de línea del autor.\n */\n@Component({\n selector: 'kf-note-block',\n templateUrl: './NoteBlock.html',\n styleUrl: './NoteBlock.css',\n host: {\n '[class]': '\"kf-note-block--\" + tone()',\n },\n})\nexport class NoteBlock {\n readonly title = input<string>();\n\n /** Segunda pieza del encabezado, en la misma línea del `title`. */\n readonly subtitle = input<string>();\n\n /** Pie de atribución — quién escribió y cuándo, ya formateado. */\n readonly signature = input<string>();\n\n readonly tone = input<NoteBlockTone>('info');\n}\n","@if (title() || subtitle()) {\n <span class=\"kf-note-block__head\">\n @if (title(); as heading) {\n <span class=\"kf-note-block__title kf-overline-text\">{{ heading }}</span>\n }\n @if (subtitle(); as sub) {\n <span class=\"kf-note-block__subtitle kf-caption-text\">{{ sub }}</span>\n }\n </span>\n}\n\n<span class=\"kf-note-block__text\"><ng-content /></span>\n\n@if (signature(); as author) {\n <span class=\"kf-note-block__signature kf-caption-text\">{{ author }}</span>\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\nimport { Icon } from '../icon/Icon';\n\n/** Opción de `kf-option-list`. `count` se muestra alineado a la derecha. */\nexport interface OptionListOption {\n value: string;\n label: string;\n count?: number;\n}\n\nlet nextId = 0;\n\n/**\n * Lista vertical de opciones de UNA sola selección para paneles (ej. las\n * secciones \"Estado\", \"Ordenar por\" y \"Vista\" de un panel de filtros): una\n * fila de al menos 44px por opción, contador opcional a la derecha y la\n * opción elegida resaltada con `--kf-color-primary-soft`.\n *\n * Es la contraparte en panel de `kf-filter-chips`: misma función (filtrar u\n * ordenar lo que se muestra) cuando no hay ancho para una fila de chips. No\n * es `kf-selectable-card-group`: aquel responde una pregunta de un flujo\n * (\"¿con qué método pagas?\") con affordance de radio y cards grandes; esta\n * lista ajusta una vista, con filas densas y contador.\n *\n * Semántica: `role=\"radiogroup\"` + `role=\"radio\"` con `aria-checked`, no\n * botones con `aria-pressed`. Las opciones son mutuamente excluyentes (eso\n * es un radio; `aria-pressed` describe toggles independientes), el lector\n * de pantalla anuncia la posición (\"2 de 4\") y cada grupo es UNA sola\n * parada de Tab: un panel con tres secciones se recorre con 3 Tabs en vez\n * de uno por opción. Dentro del grupo, flechas arriba/abajo y Home/End\n * mueven el foco y seleccionan (`handleArrowKeyNavigation`, mismo helper que\n * `kf-tabs`/`kf-selectable-card-group`).\n *\n * La opción elegida lleva además un check (no solo color), para que el\n * estado no dependa de distinguir el tinte `primary-soft` (WCAG 1.4.1).\n *\n * El `@for` hace `track` por índice: cuando el padre re-renderiza (ej. los\n * contadores cambian al elegir), los botones existentes se reutilizan y el\n * foco no se pierde. Por índice y no por `value` para no fallar (NG0955)\n * si dos opciones repiten `value`; aun así los values deben ser únicos:\n * con repetidos, ambas filas se marcan elegidas.\n *\n * `label` dibuja el título de la sección (chico, en mayúsculas) y nombra el\n * grupo vía `aria-labelledby`; sin título visible, pasar `ariaLabel`.\n *\n * <kf-option-list label=\"Estado\"\n * [options]=\"[{ value: '', label: 'Todas', count: 12 },\n * { value: 'pending', label: 'Pendientes', count: 3 }]\"\n * [value]=\"status()\"\n * (valueChange)=\"status.set($event)\" />\n */\n@Component({\n selector: 'kf-option-list',\n imports: [Icon],\n templateUrl: './OptionList.html',\n styleUrl: './OptionList.css',\n})\nexport class OptionList {\n readonly options = input.required<(string | OptionListOption)[]>();\n readonly value = input<string>('');\n /** Título visible de la sección; nombra el grupo. */\n readonly label = input<string>();\n /** Nombre accesible del grupo cuando no hay `label` visible. */\n readonly ariaLabel = input<string>();\n\n readonly valueChange = output<string>();\n\n private readonly instanceId = `kf-option-list-${nextId++}`;\n protected readonly labelId = `${this.instanceId}-label`;\n /**\n * Prefijo de id de cada opción — único por instancia (dos listas con los\n * mismos values no colisionan). El id termina en el ÍNDICE, no en el\n * value: un value con espacios u otros caracteres daría un id inválido.\n */\n protected readonly optionIdPrefix = `${this.instanceId}-option-`;\n\n readonly normalizedOptions = computed<OptionListOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n /**\n * Opción que recibe `tabindex=\"0\"`: la seleccionada o, si ninguna lo\n * está, la primera — el grupo siempre debe ser alcanzable con Tab.\n */\n protected readonly tabStopValue = computed(() => {\n const options = this.normalizedOptions();\n const selected = options.find((option) => option.value === this.value());\n return (selected ?? options[0])?.value;\n });\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n /**\n * `handleArrowKeyNavigation` ubica el botón destino por `idPrefix + value`;\n * como los ids usan el índice, se le pasa la lista con el índice como\n * value y se traduce de vuelta al value real al seleccionar.\n */\n protected onKeydown(event: KeyboardEvent, index: number): void {\n const options = this.normalizedOptions();\n handleArrowKeyNavigation(\n event,\n options.map((_, i) => ({ value: String(i) })),\n String(index),\n this.optionIdPrefix,\n (next) => this.select(options[Number(next)].value),\n 'vertical',\n );\n }\n}\n","@if (label(); as labelText) {\n <span class=\"kf-option-list__title kf-overline-text\" [id]=\"labelId\">{{ labelText }}</span>\n}\n<div\n class=\"kf-option-list\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n>\n @for (option of normalizedOptions(); track $index; let i = $index) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-option-list__option\"\n [id]=\"optionIdPrefix + i\"\n [class.kf-option-list__option--selected]=\"option.value === value()\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === tabStopValue() ? 0 : -1\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, i)\"\n >\n <span class=\"kf-option-list__label\">{{ option.label }}</span>\n <span class=\"kf-option-list__end\">\n @if (option.count !== undefined) {\n <span class=\"kf-option-list__count\"> {{ option.count }}</span>\n }\n <span class=\"kf-option-list__check\">\n @if (option.value === value()) {\n <kf-icon name=\"check\" size=\"sm\" />\n }\n </span>\n </span>\n </button>\n }\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport { Text, TextVariant } from '../text/Text';\n\n/**\n * Tamaño del título. Cada valor mapea 1:1 a una variante `title-*` de\n * `kf-text`; `xl`/`xxl` son para títulos protagonistas (ej. bienvenida del\n * home). Bajo los 900px, el tamaño efectivo baja un escalón (ver\n * `MOBILE_STEP_DOWN`).\n */\nexport type PageHeaderTitleSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n\nconst MOBILE_STEP_DOWN: Record<PageHeaderTitleSize, PageHeaderTitleSize> = {\n xxl: 'xl',\n xl: 'lg',\n lg: 'md',\n md: 'sm',\n sm: 'sm',\n};\n\n/**\n * Bloque de título al tope de una página: chip de ícono opcional, título (h1),\n * subtítulo opcional y un área de acciones opcional proyectada vía\n * `<ng-content select=\"[actions]\">`.\n *\n * <kf-page-header title=\"Vehículos\" subtitle=\"Gestión de la flota activa\">\n * <button actions>Nuevo vehículo</button>\n * </kf-page-header>\n *\n * <kf-page-header icon=\"settings\" title=\"Configuración\" />\n *\n * <kf-page-header size=\"xl\" title=\"Bienvenido de nuevo\" />\n */\n@Component({\n selector: 'kf-page-header',\n imports: [Icon, Text],\n templateUrl: './PageHeader.html',\n styleUrl: './PageHeader.scss',\n})\nexport class PageHeader {\n readonly icon = input<IconName | undefined>(undefined);\n readonly title = input.required<string>();\n readonly subtitle = input<string | undefined>(undefined);\n readonly size = input<PageHeaderTitleSize>('md');\n\n private readonly isMobile = matchMediaSignal('(max-width: 900px)');\n\n protected readonly resolvedTitleVariant = computed<TextVariant>(() => {\n const size = this.isMobile() ? MOBILE_STEP_DOWN[this.size()] : this.size();\n return `title-${size}`;\n });\n}\n","<div class=\"kf-page-header__row\">\n @if (icon(); as iconName) {\n <span class=\"kf-page-header__icon\">\n <kf-icon [name]=\"iconName\" size=\"lg\" />\n </span>\n }\n\n <div class=\"kf-page-header__heading\">\n <kf-text as=\"h1\" class=\"kf-page-header__title\" [variant]=\"resolvedTitleVariant()\">\n {{ title() }}\n </kf-text>\n @if (subtitle()) {\n <p class=\"kf-page-header__subtitle\">{{ subtitle() }}</p>\n }\n </div>\n\n <div class=\"kf-page-header__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n</div>\n","import { Component, input, output } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Divider } from '../divider/Divider';\nimport { Link } from '../link/Link';\n\n/**\n * Tarjeta contenedora con título, enlace de acción opcional a la derecha, y\n * cuerpo con contenido libre — página 33: \"Base de la mayoría de bloques del\n * portal\". Compone sobre `kf-card` para compartir la misma superficie\n * (radio, sombra, borde) que el resto de la librería.\n *\n * <kf-panel title=\"Mis documentos por pagar\" actionLabel=\"Ir a pagos\" actionHref=\"/pagos\">\n * <kf-action-tile-row icon=\"download\" title=\"Pagos\" description=\"Revisa tu estado de cuenta y realiza pagos.\" />\n * </kf-panel>\n *\n * Para apps con router: escuchar `actionClick` y llamar\n * `event.preventDefault()` antes de `router.navigateByUrl(...)`. El\n * `actionHref` se mantiene igual para que click-medio, \"abrir en pestaña\n * nueva\" y el hover de la barra de estado sigan funcionando.\n *\n * <kf-panel title=\"Mis documentos por pagar\" actionLabel=\"Ir a pagos\" actionHref=\"/pagos\"\n * (actionClick)=\"$event.preventDefault(); router.navigateByUrl('/pagos')\">\n * …\n * </kf-panel>\n *\n * El host y el `kf-card` interno son flex column con `flex:1` de punta a\n * punta — si un grid/flex externo estira `kf-panel` a la altura de un\n * hermano más alto, el contenido proyectado hereda esa altura en vez de\n * dejar un hueco vacío bajo el `kf-card`. Sin esa presión externa (altura\n * \"auto\" del contenedor), `flex:1` no tiene espacio extra que repartir y el\n * panel se comporta igual que antes.\n */\n@Component({\n selector: 'kf-panel',\n imports: [Card, Divider, Link],\n templateUrl: './Panel.html',\n styleUrl: './Panel.css',\n})\nexport class Panel {\n readonly title = input.required<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n\n /**\n * Click en el link de acción. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa — mismo patrón\n * que `itemClick` de `kf-breadcrumb`, sin depender de `@angular/router`.\n */\n readonly actionClick = output<MouseEvent>();\n}\n","<kf-card>\n <div class=\"kf-panel__head\">\n <span class=\"kf-panel__title\">{{ title() }}</span>\n @if (actionLabel()) {\n <kf-link\n class=\"kf-panel__action\"\n [href]=\"actionHref() || '#'\"\n showArrow\n (click)=\"actionClick.emit($event)\"\n >\n {{ actionLabel() }}\n </kf-link>\n }\n </div>\n <kf-divider />\n <div class=\"kf-panel__body\">\n <ng-content />\n </div>\n</kf-card>\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport { Overlay, type ConnectedPosition, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nexport type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextPopoverId = 0;\n\n/** Separación (px) entre el anfitrión y el panel. */\nconst POPOVER_GAP = 8;\n/** Margen (px) mínimo entre el panel y el borde del viewport. */\nconst POPOVER_VIEWPORT_MARGIN = 8;\n/**\n * Ventana (ms) tras abrir en la que un `scroll` no cierra el panel: enfocar el\n * anfitrión puede desplazar su contenedor para dejarlo a la vista, y ese\n * `scroll` llega después del `focusin` que abrió el panel.\n */\nconst SCROLL_GRACE_MS = 150;\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Panel visual del popover — componente interno, no exportado en\n * `public-api.ts`. `PopoverDirective` es la única forma pública de usarlo.\n *\n * `role=\"tooltip\"` cuando es solo informativo (el patrón WAI-ARIA para\n * contenido que el lector anuncia vía `aria-describedby` del anfitrión) y\n * `role=\"dialog\"` no modal cuando es `interactive` (puede tener enlaces o\n * botones adentro, que un `tooltip` no admite).\n */\n@Component({\n selector: 'kf-popover-panel',\n imports: [NgTemplateOutlet],\n template: `<ng-container [ngTemplateOutlet]=\"template()\" />`,\n styleUrl: './Popover.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': \"interactive() ? 'dialog' : 'tooltip'\",\n '[attr.aria-label]': 'label()',\n '[class.kf-popover-panel--interactive]': 'interactive()',\n '(pointerenter)': 'onPointerEnter($event)',\n '(pointerleave)': 'onPointerLeave($event)',\n '(focusin)': 'focusEntered.emit()',\n '(focusout)': 'focusLeft.emit($event)',\n },\n})\nclass PopoverPanel {\n readonly template = input.required<TemplateRef<unknown> | null>();\n readonly interactive = input(false);\n readonly label = input<string | null>(null);\n\n readonly pointerEntered = output<void>();\n readonly pointerLeft = output<void>();\n readonly focusEntered = output<void>();\n readonly focusLeft = output<FocusEvent>();\n\n protected onPointerEnter(event: PointerEvent): void {\n if (event.pointerType !== 'touch') {\n this.pointerEntered.emit();\n }\n }\n\n protected onPointerLeave(event: PointerEvent): void {\n if (event.pointerType !== 'touch') {\n this.pointerLeft.emit();\n }\n }\n}\n\n/**\n * Popover de contenido enriquecido anclado a un elemento — la contraparte de\n * `kfTooltip` para cuando el texto plano no alcanza (varias líneas, énfasis,\n * un desglose, enlaces). Mismo mecanismo de `@angular/cdk/overlay`. El host\n * sigue siendo el elemento que recibe el foco: la directiva no lo hace\n * focusable, así que va sobre un `<button>`, un `<a>` o un elemento con\n * `tabindex=\"0\"`.\n *\n * <button [kfPopover]=\"detail\" kfPopoverPlacement=\"top\">Etapa</button>\n * <ng-template #detail><strong>Recepción</strong><p>Completada el 12/05.</p></ng-template>\n *\n * Apertura: puntero (hover, tras `kfPopoverShowDelay` ms; NO se abre con puntero\n * táctil) y foco de teclado (al instante, solo si el foco es visible: un\n * clic con el mouse no lo abre). Cierre: Escape (descarta el panel hasta que\n * el puntero y el foco salgan y vuelvan), salida del puntero tras\n * `kfPopoverHideDelay` ms, pérdida de foco, scroll de cualquier contenedor y\n * redimensionado de la ventana. El panel se reposiciona dentro del viewport\n * (invierte el lado si no cabe).\n *\n * Con `kfPopoverInteractive`, el puntero puede entrar al panel sin cerrarlo y\n * el panel es un `dialog` no modal: Tab desde el anfitrión entra al primer\n * control del panel y Mayús+Tab desde ese control vuelve al anfitrión. Sin\n * `kfPopoverInteractive` (default), el panel es un `tooltip` que no captura\n * el puntero y no debe contener controles.\n *\n * Si el anfitrión no es interactivo pero vive dentro de un control (un botón,\n * un enlace, un elemento con `tabindex`), los eventos de puntero, foco y\n * teclado se escuchan en ese control y el panel se ancla al anfitrión. Es el\n * caso de un indicador dentro de una celda interactiva de `kf-data-table`:\n *\n * <ng-template #stageCell let-row>\n * <span [kfPopover]=\"detail\"><kf-status-mark [status]=\"row.status\" /></span>\n * </ng-template>\n *\n * Accesibilidad: mientras está abierto, el elemento que recibe el foco\n * referencia el panel con `aria-describedby` (se conserva cualquier valor\n * previo).\n */\n@Directive({\n selector: '[kfPopover]',\n exportAs: 'kfPopover',\n})\nexport class PopoverDirective implements OnDestroy {\n /** Contenido del popover (un `ng-template`). `null`/`undefined` = no se abre. */\n readonly kfPopover = input.required<TemplateRef<unknown> | null | undefined>();\n /** Lado preferido; si no cabe en el viewport, se invierte. Default `bottom`. */\n readonly kfPopoverPlacement = input<PopoverPlacement>('bottom');\n /** Retardo (ms) antes de abrir con el puntero. El foco de teclado abre sin retardo. */\n readonly kfPopoverShowDelay = input(150, { transform: numberAttribute });\n /** Retardo (ms) antes de cerrar al salir el puntero. */\n readonly kfPopoverHideDelay = input(150, { transform: numberAttribute });\n /** Desactiva el popover (y lo cierra si estaba abierto). */\n readonly kfPopoverDisabled = input(false, { transform: booleanAttribute });\n /** Permite que el puntero entre al panel sin cerrarlo y que el teclado llegue a sus controles. */\n readonly kfPopoverInteractive = input(false, { transform: booleanAttribute });\n /** Nombre accesible del panel cuando es `interactive` (rol `dialog`). */\n readonly kfPopoverLabel = input<string | null>(null);\n\n /** Emite `true` al abrirse y `false` al cerrarse. */\n readonly kfPopoverOpenChange = output<boolean>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly panelId = `kf-popover-${nextPopoverId++}`;\n private readonly openState = signal(false);\n /** `true` mientras el panel está abierto. */\n readonly isOpen = this.openState.asReadonly();\n\n /**\n * Elemento que recibe los eventos de puntero, foco y teclado: el propio\n * anfitrión o, si este no es interactivo pero vive dentro de un control\n * (botón, enlace, `tabindex`), ese control. `aria-describedby` va en él.\n */\n private trigger: HTMLElement = this.host.nativeElement;\n private overlayRef: OverlayRef | null = null;\n private panelElement: HTMLElement | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n private openedAt = 0;\n private teardownGlobalListeners: (() => void) | null = null;\n private destroyed = false;\n\n private pointerOnHost = false;\n private pointerOnPanel = false;\n private focusOnHost = false;\n private focusOnPanel = false;\n /** Escape lo descartó: no reabre hasta que puntero y foco hayan salido. */\n private dismissed = false;\n\n constructor() {\n effect(() => {\n if (this.kfPopoverDisabled()) {\n untracked(() => this.close());\n }\n });\n\n // El elemento que recibe los eventos se resuelve tras el primer render: en\n // una vista embebida (ej. dentro de la celda de un `kf-data-table`) el\n // anfitrión aún no tiene a su ancestro interactivo en el DOM al construirse.\n afterNextRender(() => {\n if (this.destroyed) {\n return;\n }\n const target = this.resolveTrigger();\n this.trigger = target;\n const listeners: [string, (event: never) => void][] = [\n ['pointerenter', this.onHostPointerEnter],\n ['pointerleave', this.onHostPointerLeave],\n ['focusin', this.onHostFocusIn],\n ['focusout', this.onHostFocusOut],\n ['keydown', this.onHostKeydown],\n ];\n for (const [type, listener] of listeners) {\n target.addEventListener(type, listener as EventListener);\n }\n this.destroyRef.onDestroy(() => {\n for (const [type, listener] of listeners) {\n target.removeEventListener(type, listener as EventListener);\n }\n });\n });\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n this.clearTimers();\n this.dispose();\n }\n\n /** Cierra el panel de inmediato, sin retardo. */\n close(): void {\n this.clearTimers();\n this.dispose();\n }\n\n private readonly onHostPointerEnter = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n return;\n }\n this.pointerOnHost = true;\n this.reevaluate(this.kfPopoverShowDelay());\n };\n\n private readonly onHostPointerLeave = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n return;\n }\n this.pointerOnHost = false;\n this.reevaluate(this.kfPopoverHideDelay());\n };\n\n private readonly onHostFocusIn = (event: FocusEvent): void => {\n // Solo foco de teclado: un clic o un toque enfocan el botón pero no\n // deben abrir el panel (el clic tiene su propia acción).\n if (!this.isKeyboardFocus(event.target)) {\n return;\n }\n this.focusOnHost = true;\n this.reevaluate(0);\n };\n\n private readonly onHostFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Node | null;\n if (next && this.trigger.contains(next)) {\n return;\n }\n this.focusOnHost = false;\n if (next && this.kfPopoverInteractive() && this.panelElement?.contains(next)) {\n // El foco pasa al panel: su propio `focusin` lo registra.\n return;\n }\n this.reevaluate(0);\n };\n\n private readonly onHostKeydown = (event: KeyboardEvent): void => {\n if (\n event.key !== 'Tab' ||\n event.shiftKey ||\n event.defaultPrevented ||\n !this.panelElement ||\n !this.kfPopoverInteractive()\n ) {\n return;\n }\n const first = this.panelElement.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n if (first) {\n event.preventDefault();\n first.focus();\n }\n };\n\n private get wanted(): boolean {\n if (this.kfPopoverDisabled()) {\n return false;\n }\n const interactive = this.kfPopoverInteractive();\n return (\n this.pointerOnHost ||\n this.focusOnHost ||\n (interactive && (this.pointerOnPanel || this.focusOnPanel))\n );\n }\n\n /** Abre o cierra según los cuatro orígenes (puntero/foco × anfitrión/panel). */\n private reevaluate(delay: number): void {\n if (this.wanted) {\n this.clearHideTimer();\n if (!this.dismissed) {\n this.scheduleOpen(delay);\n }\n return;\n }\n this.dismissed = false;\n this.clearShowTimer();\n this.scheduleClose(delay);\n }\n\n private scheduleOpen(delay: number): void {\n if (this.overlayRef || this.showTimer !== null) {\n return;\n }\n if (delay <= 0) {\n this.open();\n return;\n }\n this.showTimer = setTimeout(() => {\n this.showTimer = null;\n if (this.wanted && !this.dismissed) {\n this.open();\n }\n }, delay);\n }\n\n private scheduleClose(delay: number): void {\n if (!this.overlayRef || this.hideTimer !== null) {\n return;\n }\n if (delay <= 0) {\n this.dispose();\n return;\n }\n this.hideTimer = setTimeout(() => {\n this.hideTimer = null;\n if (!this.wanted) {\n this.dispose();\n }\n }, delay);\n }\n\n private open(): void {\n const template = this.kfPopover();\n if (this.overlayRef || !template || this.kfPopoverDisabled()) {\n return;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(this.positionsFor(this.kfPopoverPlacement()))\n .withViewportMargin(POPOVER_VIEWPORT_MARGIN)\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const overlayRef = this.overlayService.create({\n positionStrategy,\n // El cierre por scroll lo resuelve `listenGlobal`: el scroll strategy de\n // CDK solo ve ancestros registrados como `cdkScrollable`.\n scrollStrategy: this.overlayService.scrollStrategies.noop(),\n });\n const portal = new ComponentPortal(PopoverPanel, this.viewContainerRef, this.injector);\n const panelRef = overlayRef.attach(portal);\n panelRef.setInput('template', template);\n panelRef.setInput('interactive', this.kfPopoverInteractive());\n panelRef.setInput('label', this.kfPopoverInteractive() ? this.kfPopoverLabel() : null);\n this.panelElement = panelRef.location.nativeElement as HTMLElement;\n this.panelElement.id = this.panelId;\n\n panelRef.instance.pointerEntered.subscribe(() => {\n this.pointerOnPanel = true;\n this.reevaluate(0);\n });\n panelRef.instance.pointerLeft.subscribe(() => {\n this.pointerOnPanel = false;\n this.reevaluate(this.kfPopoverHideDelay());\n });\n panelRef.instance.focusEntered.subscribe(() => {\n this.focusOnPanel = true;\n this.reevaluate(0);\n });\n panelRef.instance.focusLeft.subscribe((event) => this.onPanelFocusOut(event));\n this.panelElement.addEventListener('keydown', this.onPanelKeydown);\n\n // Renderiza el contenido antes de medir, para posicionar con el tamaño real.\n panelRef.changeDetectorRef.detectChanges();\n overlayRef.updatePosition();\n\n this.overlayRef = overlayRef;\n this.addDescribedBy();\n this.listenGlobal();\n this.openedAt = Date.now();\n this.openState.set(true);\n this.kfPopoverOpenChange.emit(true);\n }\n\n private dispose(): void {\n const overlayRef = this.overlayRef;\n const wasOpen = overlayRef !== null;\n // Primero se suelta el estado y después se destruye el panel: quitar del DOM\n // un elemento con foco dispara `focusout` de forma síncrona, y ese manejador\n // no debe volver a entrar a `dispose()` con el panel a medio destruir.\n this.overlayRef = null;\n this.teardownGlobalListeners?.();\n this.teardownGlobalListeners = null;\n this.panelElement?.removeEventListener('keydown', this.onPanelKeydown);\n this.panelElement = null;\n this.pointerOnPanel = false;\n this.focusOnPanel = false;\n overlayRef?.dispose();\n this.removeDescribedBy();\n if (wasOpen && !this.destroyed) {\n this.openState.set(false);\n this.kfPopoverOpenChange.emit(false);\n }\n }\n\n private onPanelFocusOut(event: FocusEvent): void {\n if (!this.overlayRef) {\n // `focusout` por quitar del DOM el panel que se está cerrando.\n return;\n }\n this.focusOnPanel = false;\n const next = event.relatedTarget as Node | null;\n if (next && (this.panelElement?.contains(next) || this.trigger.contains(next))) {\n return;\n }\n this.reevaluate(0);\n }\n\n /** Mayús+Tab desde el primer control del panel devuelve el foco al anfitrión. */\n private readonly onPanelKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab' || !event.shiftKey || !this.panelElement) {\n return;\n }\n const first = this.panelElement.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n if (first && this.document.activeElement === first) {\n event.preventDefault();\n this.focusHost();\n }\n };\n\n private focusHost(): void {\n const host = this.trigger;\n const focusable = host.matches(FOCUSABLE_SELECTOR)\n ? host\n : host.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n focusable?.focus({ preventScroll: true });\n }\n\n /**\n * Escape, scroll y resize mientras el panel está abierto. En fase de captura\n * y sobre `document`: `scroll` no burbujea (hay que capturarlo para ver el\n * de cualquier contenedor) y Escape debe cerrar primero el popover sin\n * llegar al modal o drawer que lo contenga.\n */\n private listenGlobal(): void {\n const view = this.document.defaultView;\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.stopPropagation();\n const focusInPanel = this.panelElement?.contains(this.document.activeElement) ?? false;\n this.dismissed = true;\n this.close();\n if (focusInPanel) {\n this.focusHost();\n }\n };\n const onScroll = (event: Event): void => {\n const target = event.target as Node | null;\n if (Date.now() - this.openedAt < SCROLL_GRACE_MS) {\n return;\n }\n if (target && this.panelElement?.contains(target)) {\n return;\n }\n this.close();\n };\n const onResize = (): void => this.close();\n\n this.document.addEventListener('keydown', onKeydown, true);\n this.document.addEventListener('scroll', onScroll, true);\n view?.addEventListener('resize', onResize);\n this.teardownGlobalListeners = () => {\n this.document.removeEventListener('keydown', onKeydown, true);\n this.document.removeEventListener('scroll', onScroll, true);\n view?.removeEventListener('resize', onResize);\n };\n }\n\n private resolveTrigger(): HTMLElement {\n const host = this.host.nativeElement;\n return host.closest<HTMLElement>(FOCUSABLE_SELECTOR) ?? host;\n }\n\n /** Foco de teclado (`:focus-visible`); sin soporte del selector, se asume teclado. */\n private isKeyboardFocus(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return true;\n }\n try {\n return target.matches(':focus-visible');\n } catch {\n return true;\n }\n }\n\n private addDescribedBy(): void {\n const tokens = this.describedByTokens();\n if (!tokens.includes(this.panelId)) {\n tokens.push(this.panelId);\n this.trigger.setAttribute('aria-describedby', tokens.join(' '));\n }\n }\n\n private removeDescribedBy(): void {\n const remaining = this.describedByTokens().filter((token) => token !== this.panelId);\n if (remaining.length > 0) {\n this.trigger.setAttribute('aria-describedby', remaining.join(' '));\n } else {\n this.trigger.removeAttribute('aria-describedby');\n }\n }\n\n private describedByTokens(): string[] {\n return (this.trigger.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\n }\n\n private clearShowTimer(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private clearTimers(): void {\n this.clearShowTimer();\n this.clearHideTimer();\n }\n\n /**\n * Posiciones en orden de preferencia: el lado pedido (centrado, luego\n * alineado al inicio y al final del anfitrión), el lado opuesto con las\n * mismas tres alineaciones y, por último, los dos lados perpendiculares.\n * Así un anfitrión pegado a una esquina encuentra una posición que cabe\n * entera en vez de depender solo del empuje al viewport.\n */\n private positionsFor(placement: PopoverPlacement): ConnectedPosition[] {\n const opposite: Record<PopoverPlacement, PopoverPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n const perpendicular: PopoverPlacement[] =\n placement === 'top' || placement === 'bottom' ? ['right', 'left'] : ['bottom', 'top'];\n return [placement, opposite[placement], ...perpendicular].flatMap((side) =>\n (['center', 'start', 'end'] as const).map((align) => this.positionFor(side, align)),\n );\n }\n\n private positionFor(\n side: PopoverPlacement,\n align: 'center' | 'start' | 'end',\n ): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n return {\n originX: align,\n originY: side === 'top' ? 'top' : 'bottom',\n overlayX: align,\n overlayY: side === 'top' ? 'bottom' : 'top',\n offsetY: side === 'top' ? -POPOVER_GAP : POPOVER_GAP,\n };\n }\n const vertical = align === 'center' ? 'center' : align === 'start' ? 'top' : 'bottom';\n return {\n originX: side === 'left' ? 'start' : 'end',\n originY: vertical,\n overlayX: side === 'left' ? 'end' : 'start',\n overlayY: vertical,\n offsetX: side === 'left' ? -POPOVER_GAP : POPOVER_GAP,\n };\n }\n}\n","import {\n Component,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n input,\n output,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { AdminBadge } from '../admin-badge/AdminBadge';\nimport { Avatar } from '../avatar/Avatar';\nimport { Drawer } from '../drawer/Drawer';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\n\n/** Un ítem de navegación de la barra de marca. `icon` es opcional y solo se\n * usa en el drawer mobile (columna, ver template) — el `<nav>` horizontal de\n * escritorio se mantiene solo texto, sin ícono ni chevron. */\nexport interface PortalHeaderNavItem {\n label: string;\n href: string;\n active?: boolean;\n icon?: IconName;\n}\n\n/** Una acción de la franja de administrador (ej. \"Consultar deuda clientes\"). */\nexport interface PortalHeaderAdminAction {\n label: string;\n href: string;\n}\n\n/**\n * Cabecera completa del portal (página 31) — franja de administrador\n * (acento ámbar, solo admins), barra de marca con logo, navegación y\n * pastilla de sesión. Compone `kf-admin-badge` para la franja y `kf-avatar\n * pill` para la sesión, en vez de reimplementar ambos.\n *\n * Es distinto de `kf-page-header`/`kf-page-head` (título de una vista\n * interna) — este es el chrome global del portal, se monta una sola vez.\n *\n * `:host` es `position: sticky; top: 0` — el header queda pegado arriba al\n * hacer scroll. No es `fixed`: como no se superpone al contenido en el\n * primer render, no hace falta que el consumidor compense con\n * `padding-top`.\n *\n * Bajo los 768px, el `<nav>` deja de mostrarse en línea junto al logo y\n * colapsa detrás de un botón de menú (ícono `menu`/`x`) que despliega un\n * `kf-drawer` (panel lateral genérico, ver `Drawer.ts`) anclado al borde\n * IZQUIERDO — mismo lado que el botón que lo abre, convención dominante\n * Material/iOS/Android — con los mismos `navItems` en columna dentro del\n * body (fondo claro) de ese drawer.\n *\n * `PortalHeader` expone dos slots propios pensados para que el consumidor\n * proyecte contenido que en escritorio vive en otro lugar:\n * - `<ng-content select=\"[kf-portal-header-extra]\">`: identidad de sesión\n * (ej. `kf-drawer-session`). Cae en `[kf-drawer-header]` de `kf-drawer` —\n * el único contenedor con fondo oscuro (`--kf-color-tertiary-deep`, ver\n * `Drawer.ts`) que `kf-drawer-session` espera como fondo (no trae uno\n * propio, ver `DrawerSession.ts`).\n * - `<ng-content select=\"[kf-portal-header-footer]\">`: acciones separadas del\n * resto (ej. `kf-drawer-logout`). Cae en `[kf-drawer-footer]` de `kf-drawer`.\n *\n * `PortalHeader` no sabe qué es ninguno de los dos contenidos, solo les da\n * el lugar correcto dentro del drawer ya desplegado (ver `Drawer.ts`).\n *\n * <kf-portal-header\n * [isAdmin]=\"true\"\n * [adminActions]=\"[{ label: 'Consultar deuda clientes', href: '/deuda' }, { label: 'Cambiar DNI', href: '/dni' }]\"\n * [navItems]=\"[{ label: 'Home', href: '/', active: true, icon: 'grid' }, { label: 'Vehículos', href: '/vehiculos', icon: 'truck' }]\"\n * tagline=\"Portal privado\"\n * userInitials=\"TS\"\n * userName=\"Tomás Soto\"\n * [showCart]=\"true\"\n * (cartClick)=\"onCartClick()\"\n * >\n * <kf-drawer-session\n * kf-portal-header-extra\n * brand=\"Portal Kaufmann LATAM\"\n * name=\"Tomás Soto\"\n * email=\"tomas.soto@kaufmann.com\"\n * />\n * <kf-drawer-logout kf-portal-header-footer (logoutClick)=\"onLogout()\" />\n * </kf-portal-header>\n */\n@Component({\n selector: 'kf-portal-header',\n imports: [AdminBadge, Avatar, Icon, Drawer],\n templateUrl: './PortalHeader.html',\n styleUrl: './PortalHeader.css',\n})\nexport class PortalHeader {\n readonly brand = input('DIVEMOTOR');\n /** URL del logo como imagen. Sin ella (default), se mantiene el texto de `brand`. */\n readonly logoSrc = input<string>();\n /** `alt` del logo cuando se usa `logoSrc`. Sin ella, cae en `brand()`. */\n readonly logoAlt = input<string>();\n readonly isAdmin = input(false, { transform: booleanAttribute });\n readonly adminActions = input<PortalHeaderAdminAction[]>([]);\n readonly navItems = input<PortalHeaderNavItem[]>([]);\n readonly userInitials = input.required<string>();\n /** Texto junto al logo (ej. \"Portal privado\"), con separador vertical. Sin\n * separador ni texto si queda vacío. */\n readonly tagline = input('');\n /** Nombre completo para el bloque \"HOLA / {nombre}\" dentro de la pastilla\n * de sesión. Vacío (default) mantiene la pastilla como hoy: solo avatar,\n * sin bloque de texto ni chevron — retrocompatible con cualquier\n * consumidor que no pase este input. */\n readonly userName = input('');\n readonly showCart = input(false, { transform: booleanAttribute });\n\n readonly sessionClick = output<void>();\n readonly cartClick = output<void>();\n\n /** Visibilidad del drawer de navegación mobile (bajo los 768px). Se pasa a\n * `kf-drawer` como `[(open)]` — `PortalHeader` ya no implementa overlay,\n * `Escape` ni atrapado de foco por su cuenta, eso vive en `Drawer`. */\n protected readonly mobileMenuOpen = signal(false);\n\n /**\n * `ElementRef` real del botón de sesión (el avatar en la esquina\n * derecha), no de todo el header. Pensado para anclar un `kf-dropdown`\n * externo — sin esto, el único `ElementRef` disponible desde afuera es el\n * del host de `PortalHeader`, que ocupa el ancho completo de la pantalla\n * (logo + nav + sesión), y el overlay del CDK termina \"pegado\" a la\n * esquina del header entero en vez de al botón que el usuario clickeó.\n *\n * <kf-dropdown [(open)]=\"menuOpen\" [anchor]=\"header().sessionButtonRef()\">\n */\n readonly sessionButtonRef = viewChild.required('sessionButton', { read: ElementRef });\n\n /**\n * Ancla real de cada `<a>` del `<nav>` horizontal (una por `navItems()`,\n * mismo orden — `@for` trackea por `item.label`, así que la lista no se\n * recrea en cada cambio de ruta, solo cambia qué índice trae\n * `active: true`). Sirve para medir dónde poner la cápsula deslizante\n * (`thumbStyle`, ver abajo) sin duplicar el layout del nav en JS.\n */\n private readonly navItemAnchors = viewChildren<ElementRef<HTMLAnchorElement>>('navItemAnchor');\n\n /** Fuerza recalcular `thumbStyle` en un resize — un resize de ventana no\n * cambia ningún signal de los que `thumbStyle` ya lee (`navItems`,\n * `navItemAnchors`), pero sí puede correr el layout de los `<a>` bajo un\n * ancho de columna distinto (texto largo pasando a otra línea, etc.). */\n private readonly resizeTick = signal(0);\n\n @HostListener('window:resize')\n protected onWindowResize(): void {\n this.resizeTick.update((tick) => tick + 1);\n }\n\n /**\n * Posición/ancho de la cápsula blanca del ítem activo del `<nav>`, como\n * un elemento propio (`.kf-portal-header__nav-thumb`) que se desliza con\n * `transition` en vez de que cada `<a>` traiga su propio fondo blanco\n * (eso hacía que el fondo \"saltara\" de un ítem a otro sin animación,\n * porque son elementos DOM distintos — no hay nada que Angular pueda\n * animar entre ellos).\n */\n protected readonly thumbStyle = computed<Record<string, string>>(() => {\n this.resizeTick();\n const items = this.navItems();\n const anchors = this.navItemAnchors();\n const activeIndex = items.findIndex((item) => item.active);\n const anchorEl = activeIndex >= 0 ? anchors[activeIndex]?.nativeElement : undefined;\n\n if (!anchorEl) {\n return { opacity: '0', transform: 'translateX(0)', width: '0px' };\n }\n\n return {\n opacity: '1',\n transform: `translateX(${anchorEl.offsetLeft}px)`,\n width: `${anchorEl.offsetWidth}px`,\n };\n });\n}\n","@if (isAdmin()) {\n <div class=\"kf-portal-header__admin-bar\">\n <div class=\"kf-portal-header__admin-inner\">\n <kf-admin-badge inline />\n <div class=\"kf-portal-header__admin-actions\">\n @for (action of adminActions(); track action.label) {\n <a class=\"kf-portal-header__admin-action\" [href]=\"action.href\">{{ action.label }}</a>\n }\n </div>\n </div>\n </div>\n}\n<div class=\"kf-portal-header__brand-bar\">\n <div class=\"kf-portal-header__brand-inner\">\n <div class=\"kf-portal-header__top-row\">\n <div class=\"kf-portal-header__logo-group\">\n @if (logoSrc()) {\n <img class=\"kf-portal-header__logo-img\" [src]=\"logoSrc()\" [alt]=\"logoAlt() || brand()\" />\n } @else {\n <span class=\"kf-portal-header__logo\">{{ brand() }}</span>\n }\n @if (tagline()) {\n <span class=\"kf-portal-header__logo-sep\" aria-hidden=\"true\"></span>\n <span class=\"kf-portal-header__logo-tag\">{{ tagline() }}</span>\n }\n </div>\n\n <div class=\"kf-portal-header__actions\">\n @if (showCart()) {\n <button\n type=\"button\"\n class=\"kf-portal-header__cart\"\n aria-label=\"Carrito de compras\"\n (click)=\"cartClick.emit()\"\n >\n <kf-icon name=\"cart\" size=\"md\" />\n </button>\n }\n\n <button\n #sessionButton\n type=\"button\"\n class=\"kf-portal-header__session\"\n [class.kf-portal-header__session--expanded]=\"userName()\"\n (click)=\"sessionClick.emit()\"\n >\n @if (userName()) {\n <kf-avatar [initials]=\"userInitials()\" />\n <span class=\"kf-portal-header__session-who\">\n <span class=\"kf-portal-header__session-greeting\">Hola</span>\n <span class=\"kf-portal-header__session-name\">{{ userName() }}</span>\n </span>\n <kf-icon name=\"chevron-down\" size=\"sm\" class=\"kf-portal-header__session-chevron\" />\n } @else {\n <kf-avatar [initials]=\"userInitials()\" pill />\n }\n </button>\n\n <button\n type=\"button\"\n class=\"kf-portal-header__menu-toggle\"\n [attr.aria-expanded]=\"mobileMenuOpen()\"\n aria-label=\"Abrir menú de navegación\"\n (click)=\"mobileMenuOpen.set(!mobileMenuOpen())\"\n >\n <kf-icon [name]=\"mobileMenuOpen() ? 'x' : 'menu'\" size=\"md\" />\n </button>\n </div>\n </div>\n\n <nav class=\"kf-portal-header__nav\">\n <span class=\"kf-portal-header__nav-thumb\" [style]=\"thumbStyle()\" aria-hidden=\"true\"></span>\n @for (item of navItems(); track item.label) {\n <a\n #navItemAnchor\n class=\"kf-portal-header__nav-item\"\n [class.kf-portal-header__nav-item--active]=\"item.active\"\n [href]=\"item.href\"\n >\n {{ item.label }}\n </a>\n }\n </nav>\n </div>\n</div>\n\n<kf-drawer [(open)]=\"mobileMenuOpen\" ariaLabel=\"Menú de navegación\">\n <div kf-drawer-header>\n <ng-content select=\"[kf-portal-header-extra]\" />\n </div>\n @for (item of navItems(); track item.label) {\n <a\n class=\"kf-portal-header__mobile-nav-item\"\n [class.kf-portal-header__mobile-nav-item--active]=\"item.active\"\n [href]=\"item.href\"\n (click)=\"mobileMenuOpen.set(false)\"\n >\n @if (item.icon) {\n <kf-icon [name]=\"item.icon\" size=\"sm\" />\n }\n <span class=\"kf-portal-header__mobile-nav-item-label\">{{ item.label }}</span>\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </a>\n }\n <div kf-drawer-footer>\n <ng-content select=\"[kf-portal-header-footer]\" />\n </div>\n</kf-drawer>\n","import { Component, input } from '@angular/core';\n\n/**\n * Punto que emite ondas concéntricas en bucle, para marcar un dato que\n * necesita atención inmediata sin depender de que el operador lo vea por\n * casualidad — el mismo rol que un punto rojo estático ya cumple en varios\n * lugares del producto (ver `.now__d`/`.board-alerts__dot` en\n * `operations-final.html`), llevado a movimiento porque el color solo\n * compite por atención con todo lo demás en pantalla; el movimiento no.\n *\n * Es una primitiva de énfasis, no un indicador de estado — para eso está\n * `kf-status-pill` (punto estático + texto). Este componente no tiene\n * texto ni tono semántico de \"ok/warn/error\": una sola apariencia (rojo,\n * el color reservado para lo urgente en el design system), porque emitir\n * ondas por algo que no es urgente banalizaría la señal la próxima vez que\n * sí lo sea.\n *\n * <kf-pulse-dot />\n * <kf-pulse-dot size=\"lg\" />\n *\n * Respeta `prefers-reduced-motion` (ver PulseDot.css): la onda deja de\n * animarse y el punto queda como un punto estático, sin perder la\n * información de \"esto es urgente\" que da el color.\n */\n@Component({\n selector: 'kf-pulse-dot',\n templateUrl: './PulseDot.html',\n styleUrl: './PulseDot.css',\n})\nexport class PulseDot {\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n}\n","<span class=\"kf-pulse-dot\" [class]=\"'kf-pulse-dot--' + size()\" aria-hidden=\"true\">\n <span class=\"kf-pulse-dot__core\"></span>\n <span class=\"kf-pulse-dot__ring\"></span>\n</span>\n","import { Overlay, type ConnectedPosition, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n Input,\n Type,\n ViewContainerRef,\n inject,\n} from '@angular/core';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextTooltipId = 0;\n\n/**\n * Contenido visual del tooltip — componente interno, no exportado en\n * `public-api.ts`. `TooltipDirective` es la única forma pública de usarlo.\n *\n * `role=\"tooltip\"` en el host: `TooltipDirective` asocia este elemento al\n * disparador vía `aria-describedby` (ver `show()`), el patrón WAI-ARIA\n * estándar para que un lector de pantalla anuncie el texto al enfocar el\n * disparador — sin esto, el tooltip es puramente visual, invisible para\n * quien no puede ver el hover.\n */\n@Component({\n selector: 'kf-tooltip-content',\n template: `{{ text }}`,\n styleUrl: './TooltipContent.css',\n host: { role: 'tooltip' },\n})\nclass TooltipContent {\n text = '';\n}\n\n/**\n * Tooltip de hover/focus — reemplaza el atributo `title` nativo del\n * navegador (lento en aparecer, sin estilo, inconsistente entre\n * navegadores/SO) por un panel propio, mismo mecanismo de\n * `@angular/cdk/overlay` que ya usa `Dropdown`.\n *\n * Pensado para el caso \"ícono sin label visible necesita comunicar qué\n * es\" (ej. `kf-sidebar-nav-item` colapsado). No es two-way: a diferencia\n * de `Dropdown`, esto se abre/cierra solo con hover/focus, nunca por click.\n *\n * <a [kfTooltip]=\"label()\" kfTooltipPosition=\"right\">…</a>\n */\n@Directive({\n selector: '[kfTooltip]',\n})\nexport class TooltipDirective {\n @Input('kfTooltip') text = '';\n @Input() kfTooltipPosition: TooltipPosition = 'right';\n\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n\n private readonly contentId = `kf-tooltip-${nextTooltipId++}`;\n private overlayRef: OverlayRef | null = null;\n\n /**\n * `focusin` (no `focus`) a propósito: `focus` no burbujea, así que un\n * disparador que ENVUELVE al elemento realmente enfocable (ej.\n * `<kf-button>`, cuyo `<button>` nativo vive en el template del hijo, fuera\n * de alcance de este host) nunca vería el evento — el tooltip quedaría\n * mudo por teclado justo en el caso de uso que más lo necesita (un botón\n * solo-ícono). `focusin` SÍ burbujea y sigue disparando igual para el caso\n * ya cubierto (un `<a>`/`<button>` nativo que es él mismo el host, ver\n * `Tooltip.spec.ts`) — sin regresión ahí.\n */\n @HostListener('mouseenter')\n @HostListener('focusin')\n protected show(): void {\n if (!this.text || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(this.positionsFor(this.kfTooltipPosition))\n .withViewportMargin(8)\n .withPush(true);\n\n const overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n });\n\n const portal = new ComponentPortal(\n TooltipContent as Type<TooltipContent>,\n this.viewContainerRef,\n this.injector,\n );\n const componentRef = overlayRef.attach(portal);\n componentRef.instance.text = this.text;\n componentRef.location.nativeElement.id = this.contentId;\n\n // Asocia el disparador con el contenido — sin esto, un lector de\n // pantalla no anuncia el texto al enfocar/hacer hover, solo lo ve quien\n // puede leer el overlay flotante a simple vista.\n this.host.nativeElement.setAttribute('aria-describedby', this.contentId);\n\n this.overlayRef = overlayRef;\n }\n\n @HostListener('mouseleave')\n @HostListener('document:keydown.escape')\n protected hide(): void {\n this.host.nativeElement.removeAttribute('aria-describedby');\n this.overlayRef?.dispose();\n this.overlayRef = null;\n }\n\n /**\n * `focusout` (no `blur`, mismo motivo que `show()` usa `focusin`): además,\n * a diferencia de `mouseleave`/Escape, acá SÍ hace falta revisar\n * `relatedTarget` — si el host envuelve más de un elemento enfocable, un\n * foco que se mueve de uno a otro DENTRO del mismo host no debería cerrar\n * el tooltip (no \"salió\" del disparador). `Node` en vez de `EventTarget`:\n * `Node.contains()` es lo que existe para chequear pertenencia al árbol.\n */\n @HostListener('focusout', ['$event'])\n protected onFocusOut(event: FocusEvent): void {\n const nextFocusTarget = event.relatedTarget as Node | null;\n if (nextFocusTarget && this.host.nativeElement.contains(nextFocusTarget)) {\n return;\n }\n this.hide();\n }\n\n private positionsFor(placement: TooltipPosition): ConnectedPosition[] {\n const gap = 12;\n switch (placement) {\n case 'right':\n return [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: gap,\n },\n ];\n case 'left':\n return [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -gap,\n },\n ];\n case 'top':\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -gap,\n },\n ];\n case 'bottom':\n default:\n return [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: gap,\n },\n ];\n }\n }\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { Dropdown } from '../dropdown/Dropdown';\nimport { DropdownItem } from '../dropdown/DropdownItem';\nimport { DropdownPanel } from '../dropdown/DropdownPanel';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\nexport type RowActionKind = 'link' | 'button';\n\n/**\n * Una acción de fila — mismo shape que ya usaba `WorkshopRowAction` en\n * `web-portal-latam-frontend` antes de este componente (Taller, tab\n * \"Trabajos terminados\"), ahora compartido: `kind: 'link'` navega (necesita\n * `href`, `onClick` se ignora), `kind: 'button'` dispara `onClick` en la\n * pantalla actual. `disabled` aplica a ambos — un link sin `href` (o\n * explícitamente `disabled`) se renderiza inerte en vez de clickeable, en\n * vez de omitirse del todo: el consumidor decide que la acción EXISTE pero\n * no está disponible todavía (ej. \"Factura\" mientras no exista el endpoint\n * de descarga).\n */\nexport interface RowAction {\n readonly kind: RowActionKind;\n readonly icon: IconName;\n readonly label: string;\n readonly href?: string | null;\n readonly disabled?: boolean;\n readonly onClick?: () => void;\n}\n\nexport type RowActionsMode = 'auto' | 'inline' | 'menu';\n\n/**\n * Columna \"Acciones\" de cualquier tabla del ecosistema. Decide su propia\n * forma según cuántas acciones recibe — no hace falta que cada tabla elija\n * a mano entre \"botones sueltos\" y \"menú\":\n *\n * - `inline` (`actions().length <= inlineLimit()`, default 2): un\n * ícono-botón de 32px por acción, sin texto — el `label` vive en un\n * `kfTooltip`. Todas las acciones quedan visibles sin clic extra.\n * - `menu` (más de `inlineLimit()`): un único botón \"kebab\" que abre un\n * `kf-dropdown-panel` con una fila por acción.\n *\n * `mode` fuerza uno de los dos modos sin importar cuántas acciones haya\n * (ej. una tabla que prefiere el kebab siempre, aunque tenga una sola\n * acción, por consistencia visual con otra columna).\n *\n * <kf-row-actions [actions]=\"rowActions(row)\" />\n * <kf-row-actions [actions]=\"rowActions(row)\" mode=\"menu\" />\n */\n@Component({\n selector: 'kf-row-actions',\n imports: [Dropdown, DropdownPanel, DropdownItem, Icon, TooltipDirective],\n templateUrl: './RowActions.html',\n styleUrl: './RowActions.css',\n})\nexport class RowActions {\n readonly actions = input.required<readonly RowAction[]>();\n readonly mode = input<RowActionsMode>('auto');\n /** Desde cuántas acciones el modo `auto` pasa de `inline` a `menu`. */\n readonly inlineLimit = input(2);\n\n protected readonly menuOpen = signal(false);\n\n protected readonly effectiveMode = computed<'inline' | 'menu'>(() => {\n const explicit = this.mode();\n if (explicit !== 'auto') {\n return explicit;\n }\n return this.actions().length <= this.inlineLimit() ? 'inline' : 'menu';\n });\n\n protected onToggleMenu(): void {\n this.menuOpen.update((open) => !open);\n }\n\n protected onButtonAction(action: RowAction): void {\n action.onClick?.();\n this.menuOpen.set(false);\n }\n\n protected onMenuLinkClick(): void {\n this.menuOpen.set(false);\n }\n}\n","@if (effectiveMode() === 'inline') {\n <div class=\"kf-row-actions kf-row-actions--inline\">\n @for (action of actions(); track action.label) {\n @if (action.kind === 'link') {\n @if (action.href && !action.disabled) {\n <a\n class=\"kf-row-actions__icon-btn\"\n [href]=\"action.href\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </a>\n } @else {\n <span\n class=\"kf-row-actions__icon-btn kf-row-actions__icon-btn--disabled\"\n role=\"link\"\n aria-disabled=\"true\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </span>\n }\n } @else {\n <button\n type=\"button\"\n class=\"kf-row-actions__icon-btn\"\n [disabled]=\"action.disabled ?? false\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n (click)=\"action.onClick?.()\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n} @else {\n <kf-dropdown class=\"kf-row-actions\" [(open)]=\"menuOpen\">\n <button\n type=\"button\"\n class=\"kf-row-actions__trigger\"\n [class.kf-row-actions__trigger--open]=\"menuOpen()\"\n [attr.aria-expanded]=\"menuOpen()\"\n aria-label=\"Más acciones\"\n (click)=\"onToggleMenu()\"\n >\n <kf-icon name=\"more-vertical\" size=\"md\" />\n </button>\n <kf-dropdown-panel>\n @for (action of actions(); track action.label) {\n @if (action.kind === 'link') {\n @if (action.href && !action.disabled) {\n <a\n class=\"kf-row-actions__menu-link\"\n role=\"menuitem\"\n [href]=\"action.href\"\n (click)=\"onMenuLinkClick()\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n <span class=\"kf-row-actions__menu-link-label\">{{ action.label }}</span>\n </a>\n } @else {\n <span\n class=\"kf-row-actions__menu-link kf-row-actions__menu-link--disabled\"\n role=\"menuitem\"\n aria-disabled=\"true\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n <span class=\"kf-row-actions__menu-link-label\">{{ action.label }}</span>\n </span>\n }\n } @else {\n <kf-dropdown-item\n [icon]=\"action.icon\"\n [disabled]=\"action.disabled ?? false\"\n (click)=\"onButtonAction(action)\"\n >\n {{ action.label }}\n </kf-dropdown-item>\n }\n }\n </kf-dropdown-panel>\n </kf-dropdown>\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Título de sub-sección con chip de ícono, pensado para anidarse dentro de\n * cards o paneles (a diferencia de `PageHeader`, que encabeza una página\n * completa). Un área de acciones opcional se proyecta vía\n * `<ng-content select=\"[actions]\">` para no acoplar el componente a un set\n * fijo de botones.\n *\n * `size` sigue la misma escala `'sm'|'md'|'lg'` que `Button`/`Icon`/`Spinner`\n * (`md` es el default): `sm` reduce tipografía y espaciado para usarse\n * dentro de cards ya compactas, `lg` los agranda para encabezar un bloque\n * más prominente. `solid` rellena el chip de ícono con el color primario\n * sólido en vez del tratamiento \"soft\" (fondo tenue) — pensado para\n * superficies que ya tienen un tinte de color propio, donde el chip \"soft\"\n * perdería contraste.\n *\n * <kf-section-header icon=\"settings\" title=\"Preferencias\"\n * subtitle=\"Configuración general de la cuenta\">\n * <button actions>Editar</button>\n * </kf-section-header>\n *\n * <kf-section-header title=\"Detalle\" size=\"sm\" [solid]=\"true\" />\n * <kf-section-header title=\"Resumen de flota\" size=\"lg\" />\n */\n@Component({\n selector: 'kf-section-header',\n imports: [Icon],\n templateUrl: './SectionHeader.html',\n styleUrl: './SectionHeader.css',\n host: {\n '[class.kf-section-header--sm]': \"size() === 'sm'\",\n '[class.kf-section-header--lg]': \"size() === 'lg'\",\n },\n})\nexport class SectionHeader {\n readonly icon = input<IconName>();\n readonly title = input.required<string>();\n readonly subtitle = input<string>();\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly solid = input(false, { transform: booleanAttribute });\n\n protected readonly iconSize = computed(() => {\n if (this.size() === 'sm') {\n return 'sm';\n }\n if (this.size() === 'lg') {\n return 'lg';\n }\n return 'md';\n });\n}\n","@if (icon(); as iconName) {\n <span class=\"kf-section-header__icon\" [class.kf-section-header__icon--solid]=\"solid()\">\n <kf-icon [name]=\"iconName\" [size]=\"iconSize()\" />\n </span>\n}\n\n<span class=\"kf-section-header__text\">\n <span class=\"kf-section-header__title\">{{ title() }}</span>\n @if (subtitle()) {\n <span class=\"kf-section-header__subtitle\">{{ subtitle() }}</span>\n }\n</span>\n\n<span class=\"kf-section-header__actions\">\n <ng-content select=\"[actions]\" />\n</span>\n","import { Component } from '@angular/core';\n\n/**\n * Contenedor de navegación por secciones dentro de una misma pantalla —\n * agrupa `kf-section-nav-item` y resuelve su layout fusionado según\n * viewport, con un breakpoint PROPIO de 1024px (no el $mobile:900px\n * compartido del resto de la librería — ver el comentario en\n * `SectionNav.scss`):\n *\n * - Desktop (≥1024px): columna de botones a la izquierda + panel de\n * contenido separado a la derecha, mostrando el contenido del ítem (o\n * sub-ítem) activo.\n * - Mobile y tablet (<1024px): acordeón — el contenido del ítem activo se\n * despliega inline, justo debajo de su propio botón.\n *\n * El cambio entre ambos layouts es solo CSS (`SectionNav.scss` +\n * `SectionNavItem.scss`, ver comentarios ahí): cada `kf-section-nav-item`\n * proyecta su contenido una única vez y es la grilla la que lo reposiciona\n * visualmente, sin recrearlo ni duplicarlo en el DOM.\n *\n * A diferencia de `kf-tabs` (selector de vista plano, sin contenido propio)\n * y de `kf-sidebar-shell` (rail persistente ENTRE rutas, colapsable, fondo\n * oscuro): esto es navegación DENTRO de una sola pantalla, con paneles de\n * contenido rico por sección.\n *\n * La exclusividad entre ítems (y entre sub-ítems, dentro de cada uno) la\n * decide quien consume el componente, igual que cada `kf-section-nav-item`\n * por separado — `kf-section-nav` no guarda ningún estado de selección.\n *\n * <kf-section-nav>\n * <kf-section-nav-item label=\"Mis datos personales\" icon=\"user\"\n * [active]=\"openSection() === 'datos'\" (toggled)=\"openSection.set('datos')\">\n * <app-personal-data />\n * </kf-section-nav-item>\n * <kf-section-nav-item label=\"Mis empresas\" icon=\"layers\"\n * [active]=\"openSection() === 'empresas'\" (toggled)=\"openSection.set('empresas')\">\n * <app-my-companies />\n * </kf-section-nav-item>\n * </kf-section-nav>\n */\n@Component({\n selector: 'kf-section-nav',\n templateUrl: './SectionNav.html',\n styleUrl: './SectionNav.scss',\n})\nexport class SectionNav {}\n","<div class=\"kf-section-nav\">\n <ng-content />\n</div>\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon } from '../../icon/Icon';\nimport type { IconName } from '../../icon/icon-name';\n\nexport interface SectionNavSubsectionData {\n key: string;\n label: string;\n icon: IconName;\n disabled?: boolean;\n}\n\n/**\n * Ítem de nivel superior de `kf-section-nav`: header clickeable (ícono\n * identificador opcional + label + chevron) que expande/colapsa contenido\n * proyectado. La exclusividad entre ítems la decide quien consume el\n * componente — cada click solo emite `toggled` y el padre resuelve qué\n * ítem queda `active`, igual que `kf-folder-tabs` con `value`.\n *\n * `subsections` agrega un segundo nivel de navegación DENTRO del ítem\n * (solo visible cuando el ítem está `active`), cada uno con su propio\n * estado activo (`activeSubsection`) independiente del padre. El contenido\n * de cada sub-ítem se proyecta envolviéndolo en `<kf-section-nav-subsection\n * key=\"...\">` dentro del mismo slot por defecto — ver esa clase.\n *\n * El contenido proyectado usa `[hidden]`, no `@if`: un ítem puede envolver\n * un formulario con estado que el usuario ya completó, y colapsar/expandir\n * (o cruzar el breakpoint propio de 1024px, ver `SectionNav.scss`) no debe\n * destruir ese subárbol.\n *\n * <kf-section-nav-item\n * label=\"Mis datos personales\"\n * icon=\"user\"\n * [active]=\"openSection() === 'datos'\"\n * (toggled)=\"openSection.set('datos')\"\n * >\n * ...\n * </kf-section-nav-item>\n */\n@Component({\n selector: 'kf-section-nav-item',\n imports: [Icon],\n templateUrl: './SectionNavItem.html',\n styleUrl: './SectionNavItem.scss',\n})\nexport class SectionNavItem {\n readonly label = input.required<string>();\n readonly icon = input<IconName>();\n readonly active = input(false, { transform: booleanAttribute });\n readonly toggled = output<void>();\n\n /** Sub-ítems navegables de este ítem, visibles solo mientras `active()`. */\n readonly subsections = input<SectionNavSubsectionData[]>([]);\n /** `key` del sub-ítem actualmente activo — ver `SectionNavSubsectionData`. */\n readonly activeSubsection = input<string>();\n readonly subsectionSelected = output<string>();\n\n protected readonly showSubsections = computed(\n () => this.subsections().length > 0 && this.active(),\n );\n\n protected onSubsectionClick(key: string, disabled: boolean | undefined, event: MouseEvent): void {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n this.subsectionSelected.emit(key);\n }\n}\n","<button\n type=\"button\"\n class=\"kf-section-nav-item__header\"\n [class.kf-section-nav-item__header--active]=\"active()\"\n [attr.aria-expanded]=\"active()\"\n (click)=\"toggled.emit()\"\n>\n <kf-icon\n class=\"kf-section-nav-item__chevron kf-section-nav-item__chevron--desktop\"\n name=\"chevron-right\"\n size=\"sm\"\n />\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-section-nav-item__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-section-nav-item__label\">{{ label() }}</span>\n <kf-icon\n class=\"kf-section-nav-item__chevron kf-section-nav-item__chevron--mobile\"\n name=\"chevron-down\"\n size=\"sm\"\n />\n</button>\n\n@if (showSubsections()) {\n <div class=\"kf-section-nav-item__subsections\" role=\"group\" [attr.aria-label]=\"label()\">\n @for (sub of subsections(); track sub.key) {\n <button\n type=\"button\"\n class=\"kf-section-nav-item__subsection\"\n [class.kf-section-nav-item__subsection--active]=\"activeSubsection() === sub.key\"\n [disabled]=\"!!sub.disabled\"\n [attr.aria-current]=\"activeSubsection() === sub.key ? 'true' : null\"\n (click)=\"onSubsectionClick(sub.key, sub.disabled, $event)\"\n >\n <kf-icon [name]=\"sub.icon\" size=\"sm\" />\n <span>{{ sub.label }}</span>\n </button>\n }\n </div>\n}\n\n<div class=\"kf-section-nav-item__content\" [hidden]=\"!active()\">\n <ng-content />\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { SectionNavItem } from './SectionNavItem';\n\n/**\n * Envoltorio de contenido para UN sub-ítem de `kf-section-nav-item`. Varios\n * pueden proyectarse juntos, uno por `key` de `subsections()` del padre —\n * cada uno queda montado siempre (mismo criterio `[hidden]` que el propio\n * `kf-section-nav-item`), y solo se muestra el que coincide con\n * `activeSubsection()` del padre.\n *\n * <kf-section-nav-item [subsections]=\"subs\" [activeSubsection]=\"active()\" ...>\n * <kf-section-nav-subsection key=\"general\"><app-general /></kf-section-nav-subsection>\n * <kf-section-nav-subsection key=\"seguridad\"><app-seguridad /></kf-section-nav-subsection>\n * </kf-section-nav-item>\n */\n@Component({\n selector: 'kf-section-nav-subsection',\n template: `<ng-content />`,\n host: {\n '[hidden]': '!isActive()',\n },\n})\nexport class SectionNavSubsection {\n readonly key = input.required<string>();\n\n private readonly parent = inject(SectionNavItem);\n\n protected readonly isActive = computed(() => this.parent.activeSubsection() === this.key());\n}\n","import { Component, computed, input, output } from '@angular/core';\n\nexport interface SegmentedOption {\n value: string;\n label: string;\n}\n\n/**\n * Control de segmentos relleno, tipo \"iOS segmented control\": 2-3 opciones\n * con un thumb que se desliza detrás de la opción activa.\n *\n * La posición del thumb se resuelve con una variable CSS (--kf-segmented-index)\n * y `transform: translateX()`, así la transición queda a cargo de CSS puro\n * (mismo criterio que Tabs), sin medir el DOM desde TypeScript.\n *\n * <kf-segmented [options]=\"options\" [value]=\"value\" (valueChange)=\"onChange($event)\" />\n */\n@Component({\n selector: 'kf-segmented',\n templateUrl: './Segmented.html',\n styleUrl: './Segmented.css',\n})\nexport class Segmented {\n readonly options = input.required<SegmentedOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n /** Índice de la opción activa; -1 si `value` no matchea ninguna opción. */\n readonly selectedIndex = computed(() =>\n this.options().findIndex((option) => option.value === this.value()),\n );\n\n select(nextValue: string): void {\n if (nextValue === this.value()) {\n return;\n }\n this.valueChange.emit(nextValue);\n }\n}\n","<div class=\"kf-segmented__track\" [style.--kf-segmented-count]=\"options().length\">\n <div\n class=\"kf-segmented__thumb\"\n [style.--kf-segmented-index]=\"selectedIndex()\"\n [style.visibility]=\"selectedIndex() === -1 ? 'hidden' : 'visible'\"\n ></div>\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n class=\"kf-segmented__option\"\n [class.kf-segmented__option--active]=\"option.value === value()\"\n [attr.aria-pressed]=\"option.value === value()\"\n (click)=\"select(option.value)\"\n >\n {{ option.label }}\n </button>\n }\n</div>\n","import { Component, input, output } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface SelectableCardOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Radio group real (`role=\"radiogroup\"` + `role=\"radio\"` + `aria-checked`),\n * con apariencia de cards apiladas verticalmente — para una decisión ÚNICA Y\n * EXCLUYENTE dentro de un flujo (ej. método de pago, tipo de documento a\n * subir), no para filtrar una lista.\n *\n * Distinto de `kf-filter-chips` a propósito: `FilterChips` es semántica y\n * visualmente un FILTRO (chips horizontales, se resaltan con `--kf-color-ink`\n * — pensado para \"Todos/Activos/Archivados\" sobre una lista, donde elegir\n * una opción cambia qué se MUESTRA). Acá la elección es la respuesta misma\n * a una pregunta del flujo (\"¿con qué método pagás?\"), no un filtro — por\n * eso necesita affordance de radio (círculo con punto, más peso visual por\n * opción) en vez de un pill de filtro reciclado.\n *\n * Réplica fiel del patrón ya resuelto en el Design System de referencia\n * (`otd-pagos.jsx` / `otd.css`: `.otd-pay-method` + `.radio`) — apilado\n * vertical con gap 10px, radio de 18px con punto interno vía `::after`,\n * borde+fondo+ícono cambian de color al seleccionar. Se agrega manejo de\n * teclado (flechas arriba/abajo, Home/End) y `:focus-visible` real, ninguno\n * de los dos presentes en el mockup original — mínimos de accesibilidad que\n * no dependen de fidelidad visual al mockup.\n *\n * <kf-selectable-card-group\n * [options]=\"[{ value: 'card', label: 'Tarjeta', icon: 'credit-card' }]\"\n * [value]=\"method()\"\n * (valueChange)=\"method.set($event)\"\n * />\n */\n@Component({\n selector: 'kf-selectable-card-group',\n imports: [Icon],\n templateUrl: './SelectableCardGroup.html',\n styleUrl: './SelectableCardGroup.css',\n})\nexport class SelectableCardGroup {\n readonly options = input.required<SelectableCardOption[]>();\n readonly value = input<string>('');\n /** Accesible: describe qué está eligiendo el usuario (ej. \"Método de pago\"). */\n readonly ariaLabel = input.required<string>();\n\n readonly valueChange = output<string>();\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(\n event,\n this.options(),\n currentValue,\n 'kf-selectable-card-',\n (value) => this.select(value),\n 'vertical',\n );\n }\n}\n","<div class=\"kf-selectable-card-group\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-selectable-card-group__option\"\n [class.kf-selectable-card-group__option--selected]=\"option.value === value()\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-selectable-card-' + option.value\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n <span class=\"kf-selectable-card-group__radio\" aria-hidden=\"true\"></span>\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-selectable-card-group__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-selectable-card-group__label\">{{ option.label }}</span>\n </button>\n }\n</div>\n","import { Component, booleanAttribute, input } from '@angular/core';\nimport { Icon } from '../../icon/Icon';\nimport type { IconName } from '../../icon/icon-name';\nimport { TooltipDirective } from '../../tooltip/Tooltip';\n\n/** Contrato de datos de `kf-sidebar-shell.navItems`. `icon` es requerido:\n * en el sidebar persistente el ícono es parte permanente del diseño.\n * `groupLabel` opcional agrupa ítems consecutivos bajo un separador con\n * título (ej. \"Beneficios\", \"Documentos\") — ver `SidebarShell` para cómo\n * decide cuándo pintar el separador. Ausente en items sin agrupar (el\n * caso de siempre, retrocompatible con cualquier consumidor existente). */\nexport interface SidebarNavItemData {\n icon: IconName;\n label: string;\n href: string;\n active?: boolean;\n groupLabel?: string;\n}\n\n/**\n * Ítem de navegación interno de `kf-sidebar-shell` — ícono + label en fila,\n * estado activo. `collapsed` oculta el label y centra el ícono, controlado\n * por el propio shell. No sabe nada de routing: emite `href` como\n * cualquier link, el consumidor intercepta el click.\n *\n * Colapsado, el link solo muestra el ícono: su nombre accesible sale de\n * `aria-label` = `label` (el tooltip es solo visual y no nombra el link).\n */\n@Component({\n selector: 'kf-sidebar-nav-item',\n imports: [Icon, TooltipDirective],\n templateUrl: './SidebarNavItem.html',\n styleUrl: './SidebarNavItem.css',\n})\nexport class SidebarNavItem {\n readonly icon = input.required<IconName>();\n readonly label = input.required<string>();\n readonly href = input.required<string>();\n readonly active = input(false, { transform: booleanAttribute });\n readonly collapsed = input(false, { transform: booleanAttribute });\n}\n","<a\n class=\"kf-sidebar-nav-item\"\n [class.kf-sidebar-nav-item--active]=\"active()\"\n [class.kf-sidebar-nav-item--collapsed]=\"collapsed()\"\n [href]=\"href()\"\n [attr.aria-current]=\"active() ? 'page' : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n [kfTooltip]=\"collapsed() ? label() : ''\"\n>\n <kf-icon [name]=\"icon()\" size=\"md\" />\n @if (!collapsed()) {\n <span class=\"kf-sidebar-nav-item__label\">{{ label() }}</span>\n }\n</a>\n","import { Component, HostListener, computed, input, model, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport { SidebarNavItem } from './sidebar-nav-item/SidebarNavItem';\nimport type { SidebarNavItemData } from './sidebar-nav-item/SidebarNavItem';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\nconst MOBILE_BREAKPOINT_QUERY = '(max-width: 900px)';\n\n/**\n * Shell de layout con navegación lateral persistente — el complemento\n * vertical de `kf-portal-header` (navbar horizontal). Pensado para\n * portales tipo \"aplicación interna\" (Portal OTD, Servicio Star).\n *\n * `navItems` se recibe como array de datos (no como contenido proyectado):\n * el componente no sabe nada de routing, emite `navItemClick` con el ítem\n * clickeado y deja que el consumidor decida cómo navegar.\n *\n * Slots: `[kf-sidebar-brand]` (logo del rail expandido, visible en desktop\n * y en el panel mobile — es el MISMO rail), `[kf-sidebar-brand-collapsed]`\n * (reemplazo opcional cuando el rail está colapsado en desktop),\n * `[kf-sidebar-brand-mobile]` (logo de la topbar angosta de mobile, fondo\n * claro) y `[kf-sidebar-footer]` (tarjeta de usuario / acciones al pie).\n *\n * Botón de colapso: vive como último ítem de la propia lista de\n * navegación, no flotando en el borde del rail — mismo criterio de\n * tap-target grande y predecible que el resto de los ítems.\n *\n * Responsive: bajo los 900px el sidebar NO se reemplaza por un panel\n * distinto — es el MISMO rail el que pasa a `position: fixed` fuera de la\n * pantalla (`translateX(-100%)`) y se desliza a la vista (`translateX(0)`)\n * sobre un backdrop cuando `mobileOpen` es `true`. Una topbar angosta con\n * botón de hamburguesa reemplaza al rail en el flujo del documento\n * mientras el panel está cerrado.\n *\n * A propósito NO reutiliza `kf-drawer` (el panel lateral genérico de la\n * librería): `kf-drawer` tiene su propio fondo claro fijo, incompatible\n * con el texto claro de `kf-sidebar-nav-item` (pensado para el gradiente\n * oscuro), y duplicaría el árbol de navegación en un segundo lugar del\n * DOM. Acá hay un solo rail, un solo árbol de nav, que cambia de posición\n * según el viewport.\n */\n@Component({\n selector: 'kf-sidebar-shell',\n imports: [Icon, SidebarNavItem, TooltipDirective],\n templateUrl: './SidebarShell.html',\n styleUrl: './SidebarShell.scss',\n})\nexport class SidebarShell {\n /** Ítems del menú del rail. */\n readonly navItems = input<SidebarNavItemData[]>([]);\n\n /**\n * `navItems()` con el separador de grupo resuelto: solo el PRIMER ítem\n * de cada tramo consecutivo con el mismo `groupLabel` lo pinta — así el\n * consumidor no tiene que calcular a mano \"es el primero de su grupo\"\n * ni repetir el label en cada ítem. Un ítem sin `groupLabel` nunca pinta\n * separador (retrocompatible: un `navItems` sin la propiedad se\n * comporta exactamente igual que antes).\n */\n protected readonly itemsWithGroupHeader = computed(() => {\n let previousGroupLabel: string | undefined;\n return this.navItems().map((item) => {\n const showGroupLabel = !!item.groupLabel && item.groupLabel !== previousGroupLabel;\n previousGroupLabel = item.groupLabel;\n return { item, showGroupLabel };\n });\n });\n\n /** Estado de colapso del rail en desktop, two-way. Sin efecto bajo los 900px (ver estilos). */\n readonly collapsed = model(false);\n\n /** Visibilidad del rail deslizado como panel en mobile, two-way. */\n readonly mobileOpen = model(false);\n\n /** Se emite al clickear un ítem — el consumidor decide cómo navegar (ej. `router.navigateByUrl`). */\n readonly navItemClick = output<SidebarNavItemData>();\n\n /** `true` bajo los 900px. */\n private readonly isMobileViewport = matchMediaSignal(MOBILE_BREAKPOINT_QUERY);\n\n /**\n * Estado de colapso EFECTIVO — el que ya considera el viewport, no el\n * `collapsed` crudo. Es lo que usa el propio rail para sus nav-items y\n * el botón de colapso; se expone público para que el consumidor le\n * pase el mismo valor a lo que proyecte en `[kf-sidebar-footer]` (ej.\n * `kf-drawer-session`) — así un footer proyectado no queda colapsado\n * dentro del panel deslizado de mobile mientras el resto del rail ya\n * muestra todo expandido.\n */\n readonly itemsCollapsed = computed(() => this.collapsed() && !this.isMobileViewport());\n\n /** Cierra el panel mobile con Escape — mismo criterio que `Dropdown`/`Modal`/`Drawer`. */\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.mobileOpen.set(false);\n }\n\n protected onNavItemClick(event: Event, item: SidebarNavItemData): void {\n event.preventDefault();\n this.mobileOpen.set(false);\n this.navItemClick.emit(item);\n }\n}\n","@if (mobileOpen()) {\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__backdrop\"\n aria-label=\"Cerrar menú\"\n (click)=\"mobileOpen.set(false)\"\n ></button>\n}\n\n<aside\n class=\"kf-sidebar-shell__rail\"\n [class.kf-sidebar-shell__rail--collapsed]=\"itemsCollapsed()\"\n [class.kf-sidebar-shell__rail--mobile-open]=\"mobileOpen()\"\n>\n <div class=\"kf-sidebar-shell__brand\">\n <div class=\"kf-sidebar-shell__brand-full\">\n <ng-content select=\"[kf-sidebar-brand]\" />\n </div>\n <div class=\"kf-sidebar-shell__brand-collapsed\">\n <ng-content select=\"[kf-sidebar-brand-collapsed]\" />\n </div>\n\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__mobile-close\"\n aria-label=\"Cerrar menú\"\n (click)=\"mobileOpen.set(false)\"\n >\n <kf-icon name=\"x\" size=\"md\" />\n </button>\n </div>\n\n <nav class=\"kf-sidebar-shell__nav\">\n @for (entry of itemsWithGroupHeader(); track entry.item.href) {\n @if (entry.showGroupLabel && !itemsCollapsed()) {\n <div class=\"kf-sidebar-shell__group-label\">{{ entry.item.groupLabel }}</div>\n }\n <kf-sidebar-nav-item\n [icon]=\"entry.item.icon\"\n [label]=\"entry.item.label\"\n [href]=\"entry.item.href\"\n [active]=\"!!entry.item.active\"\n [collapsed]=\"itemsCollapsed()\"\n (click)=\"onNavItemClick($event, entry.item)\"\n />\n }\n </nav>\n\n <div class=\"kf-sidebar-shell__bottom\">\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__collapse-toggle\"\n [class.kf-sidebar-shell__collapse-toggle--collapsed]=\"itemsCollapsed()\"\n [attr.aria-expanded]=\"!collapsed()\"\n [attr.aria-label]=\"collapsed() ? 'Expandir menú' : 'Colapsar menú'\"\n [kfTooltip]=\"itemsCollapsed() ? (collapsed() ? 'Expandir menú' : 'Colapsar menú') : ''\"\n (click)=\"collapsed.set(!collapsed())\"\n >\n <kf-icon [name]=\"collapsed() ? 'chevron-right' : 'chevron-left'\" size=\"sm\" />\n @if (!itemsCollapsed()) {\n <span class=\"kf-sidebar-shell__collapse-toggle-label\">\n {{ collapsed() ? 'Expandir menú' : 'Colapsar menú' }}\n </span>\n }\n </button>\n\n <div class=\"kf-sidebar-shell__footer\">\n <ng-content select=\"[kf-sidebar-footer]\" />\n </div>\n </div>\n</aside>\n\n<div class=\"kf-sidebar-shell__topbar\">\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__menu-toggle\"\n aria-label=\"Abrir menú de navegación\"\n (click)=\"mobileOpen.set(true)\"\n >\n <kf-icon name=\"menu\" size=\"md\" />\n </button>\n <div class=\"kf-sidebar-shell__topbar-brand\">\n <ng-content select=\"[kf-sidebar-brand-mobile]\" />\n </div>\n</div>\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Link } from '../link/Link';\n\n/** Vocabulario semántico único de tono, compartido con `TextTone`. */\nexport type StatTileTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\nexport type StatTileVariant = 'inline' | 'card';\n\n/**\n * Indicador numérico compacto: label + valor grande con ícono, para grillas\n * densas de KPIs. Con `cta` en vez de `value` se convierte en un bloque de\n * llamada a la acción (título, descripción y link, sin tono ni número).\n * `variant=\"inline\"` quita fondo/borde para una fila horizontal donde el\n * consumidor pone sus propios separadores.\n *\n * `hasProjectedValue` reemplaza el valor de texto por contenido proyectado\n * (`[valueContent]`) cuando el dato no es un número/string medido — el\n * caso típico es un estado con su propio `kf-badge`, que necesita su\n * tono/dot propios en vez del tono del tile:\n *\n * <kf-stat-tile label=\"Estado\" hasProjectedValue>\n * <kf-badge valueContent [tone]=\"stateTone()\">{{ stateLabel() }}</kf-badge>\n * </kf-stat-tile>\n */\n@Component({\n selector: 'kf-stat-tile',\n imports: [Icon, Link],\n templateUrl: './StatTile.html',\n styleUrl: './StatTile.css',\n host: {\n '[class.kf-stat-tile--cta]': 'cta()',\n '[class.kf-stat-tile--inline]': '!cta() && variant() === \"inline\"',\n },\n})\nexport class StatTile {\n readonly cta = input(false, { transform: booleanAttribute });\n // Variante numérica\n readonly label = input<string>();\n readonly value = input<string | number>();\n readonly icon = input<IconName>();\n readonly variant = input<StatTileVariant>('card');\n readonly tone = input<StatTileTone>('neutral');\n\n /** Tercera línea bajo el valor. Vacía cae en `notePlaceholder`. */\n readonly note = input<string | null>();\n\n /** Qué dice la tercera línea cuando no hay nota. Cada consumidor debería\n * pasar el motivo real de SU dato ausente, no un texto genérico. */\n readonly notePlaceholder = input<string>();\n\n /** Rinde el valor como ausencia, no como dato medido. */\n readonly valueMissing = input(false, { transform: booleanAttribute });\n\n /** El valor es contenido proyectado (`<ng-content select=\"[valueContent]\">`,\n * ej. un `kf-badge` de estado) en vez del texto de `value()` — para un\n * dato cuya representación natural no es un número/string medido. */\n readonly hasProjectedValue = input(false, { transform: booleanAttribute });\n\n // Variante CTA\n readonly title = input<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n\n /**\n * Click en el link de la variante CTA. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa — mismo patrón\n * que `actionClick` de `kf-panel`, sin depender de `@angular/router`.\n */\n readonly actionClick = output<MouseEvent>();\n\n /** Texto real de la nota. `null` significa \"no reservar la línea\": pasa\n * solo cuando el consumidor no declaró ni nota ni placeholder. */\n protected readonly noteText = computed(() => this.note() || this.notePlaceholder() || null);\n\n protected readonly noteIsPlaceholder = computed(() => !this.note() && !!this.notePlaceholder());\n}\n","@if (cta()) {\n <span class=\"kf-stat-tile__cta-title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-stat-tile__cta-description\">{{ description() }}</span>\n }\n @if (actionLabel()) {\n <kf-link\n class=\"kf-stat-tile__cta-action\"\n [href]=\"actionHref() || '#'\"\n showArrow\n (click)=\"actionClick.emit($event)\"\n >\n {{ actionLabel() }}\n </kf-link>\n }\n} @else {\n <div class=\"kf-stat-tile__head\">\n <!-- El label recibe la clase de tone además del value: juntos forman\n una sola unidad de lectura, y pintar solo el número la rompería. -->\n <span\n class=\"kf-stat-tile__label\"\n [class.kf-stat-tile__label--ok]=\"tone() === 'ok'\"\n [class.kf-stat-tile__label--warn]=\"tone() === 'warn'\"\n [class.kf-stat-tile__label--error]=\"tone() === 'error'\"\n [class.kf-stat-tile__label--info]=\"tone() === 'info'\"\n >{{ label() }}</span\n >\n @if (icon(); as iconName) {\n <span class=\"kf-stat-tile__icon\">\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n </span>\n }\n </div>\n @if (hasProjectedValue()) {\n <!-- Slot para un valor que no es texto medido (ej. un `kf-badge` de\n estado) — mismo bloque `__value`, sin las clases de tono, que en ese\n caso las resuelve el propio contenido proyectado (el badge trae su\n tono). -->\n <span class=\"kf-stat-tile__value kf-stat-tile__value--projected\">\n <ng-content select=\"[valueContent]\" />\n </span>\n } @else {\n <span\n class=\"kf-stat-tile__value\"\n [class.kf-stat-tile__value--ok]=\"tone() === 'ok'\"\n [class.kf-stat-tile__value--warn]=\"tone() === 'warn'\"\n [class.kf-stat-tile__value--error]=\"tone() === 'error'\"\n [class.kf-stat-tile__value--info]=\"tone() === 'info'\"\n [class.kf-stat-tile__value--missing]=\"valueMissing()\"\n >{{ value() }}</span\n >\n }\n\n <!-- La línea se reserva con o sin nota: un tile más corto desalinea la\n fila. El `title` deja disponible el texto completo, recortado a 2 líneas. -->\n @if (noteText(); as note) {\n <span\n class=\"kf-stat-tile__note\"\n [class.kf-stat-tile__note--empty]=\"noteIsPlaceholder()\"\n [title]=\"note\"\n >{{ note }}</span\n >\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Pill con borde, en mayúsculas y con letter-spacing, pensada para indicadores\n * de estado únicos y prominentes (ej. \"ESTADO TÉCNICO\"). El fondo es siempre\n * transparente; el color de borde/texto/punto depende de `tone`.\n *\n * <kf-status-pill tone=\"ok\">Operativo</kf-status-pill>\n * <kf-status-pill tone=\"error\" dot>Fuera de servicio</kf-status-pill>\n */\n@Component({\n selector: 'kf-status-pill',\n templateUrl: './StatusPill.html',\n styleUrl: './StatusPill.css',\n})\nexport class StatusPill {\n readonly tone = input<'blue' | 'ok' | 'warn' | 'error'>('blue');\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","<span class=\"kf-status-pill\" [class]=\"'kf-status-pill--' + tone()\">\n @if (dot()) {\n <span class=\"kf-status-pill__dot\"></span>\n }\n <ng-content />\n</span>\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface TabOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Barra de tabs subrayada: un indicador se desliza hasta la pestaña activa.\n * La posición se mide (`offsetLeft`/`offsetWidth`) después de cada render,\n * ya que las pestañas tienen ancho de contenido variable.\n *\n * <kf-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-tabs',\n imports: [Icon],\n templateUrl: './Tabs.html',\n styleUrl: './Tabs.css',\n})\nexport class Tabs {\n readonly options = input.required<TabOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n private readonly track = viewChild.required<ElementRef<HTMLElement>>('track');\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly activeRect = signal<{ x: number; width: number } | null>(null);\n\n protected readonly indicatorTransform = computed(\n () => `translateX(${this.activeRect()?.x ?? 0}px)`,\n );\n protected readonly indicatorWidth = computed(() => this.activeRect()?.width ?? 0);\n\n constructor() {\n afterRenderEffect(() => {\n this.value();\n this.options();\n this.measure();\n });\n\n afterNextRender(() => {\n const observer = new ResizeObserver(() => this.measure());\n observer.observe(this.track().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n private measure(): void {\n const active = this.track().nativeElement.querySelector<HTMLElement>('.kf-tabs__tab--active');\n this.activeRect.set(active ? { x: active.offsetLeft, width: active.offsetWidth } : null);\n }\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(event, this.options(), currentValue, 'kf-tab-', (value) =>\n this.select(value),\n );\n }\n}\n","<!--\n Sin aria-controls: a diferencia de kf-folder-tabs, este componente no\n renderiza ningún panel (ni propio ni proyectado) — es solo el selector\n visual, el WAI-ARIA Tabs Pattern exige que aria-controls apunte a un\n tabpanel real que exista en el DOM (ver la spec de tabs), y acá no hay\n ninguno que prometer.\n-->\n<div class=\"kf-tabs\" role=\"tablist\" #track>\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-tabs__tab\"\n [class.kf-tabs__tab--active]=\"option.value === value()\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-tab-' + option.value\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-tabs__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-tabs__label\">{{ option.label }}</span>\n </button>\n }\n <span\n class=\"kf-tabs__indicator\"\n aria-hidden=\"true\"\n [style.transform]=\"indicatorTransform()\"\n [style.width.px]=\"indicatorWidth()\"\n [style.opacity]=\"indicatorWidth() ? 1 : 0\"\n ></span>\n</div>\n","import { Component, Directive, computed, contentChild, input, output } from '@angular/core';\nimport { Icon, IconName } from '../../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface FolderTabOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Marca el contenido que `kf-folder-tabs` debe proyectar dentro de su panel.\n *\n * <div kfFolderTabsPanel>...</div>\n */\n@Directive({ selector: '[kfFolderTabsPanel]' })\nexport class FolderTabsPanel {}\n\nlet nextFolderTabsId = 0;\n\n/**\n * Tabs con forma de \"carpeta\": borde superior redondeado, la pestaña activa\n * se funde visualmente con el panel de contenido de abajo. El panel\n * (`kfFolderTabsPanel`) es opcional — sin él, se renderiza solo la fila de\n * pestañas.\n *\n * <kf-folder-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\">\n * <div kfFolderTabsPanel>contenido de la pestaña activa</div>\n * </kf-folder-tabs>\n *\n * <!-- o, sin contenido: -->\n * <kf-folder-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-folder-tabs',\n imports: [Icon],\n templateUrl: './FolderTabs.html',\n styleUrl: './FolderTabs.css',\n})\nexport class FolderTabs {\n readonly options = input.required<FolderTabOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n /** Id del panel único — todos los tabs lo referencian vía `aria-controls`. */\n protected readonly panelId = `kf-folder-tabs-panel-${nextFolderTabsId++}`;\n\n private readonly projectedPanel = contentChild(FolderTabsPanel);\n protected readonly hasPanel = computed(() => this.projectedPanel() !== undefined);\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(event, this.options(), currentValue, 'kf-folder-tab-', (value) =>\n this.select(value),\n );\n }\n}\n","<div class=\"kf-folder-tabs\" role=\"tablist\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-folder-tabs__tab\"\n [class.kf-folder-tabs__tab--active]=\"option.value === value()\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-folder-tab-' + option.value\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-folder-tabs__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-folder-tabs__label\">{{ option.label }}</span>\n </button>\n }\n</div>\n\n<!--\n Panel único que cambia de contenido según el tab activo (no un panel por\n tab) — WAI-ARIA Tabs Pattern: todos los tabs apuntan a este mismo id vía\n aria-controls, y el panel apunta de vuelta al tab activo (no a todos) vía\n aria-labelledby, ya que solo ese tab describe el contenido visible ahora.\n-->\n<div\n class=\"kf-folder-tabs__panel\"\n [class.kf-folder-tabs__panel--empty]=\"!hasPanel()\"\n role=\"tabpanel\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"'kf-folder-tab-' + value()\"\n>\n <ng-content select=\"[kfFolderTabsPanel]\" />\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\n\n/**\n * Textarea de formulario apilado: mismo patrón visual y de integración que\n * `kf-input` (label arriba, `ControlValueAccessor`, funciona con\n * `[(ngModel)]` y con Reactive Forms) para el caso de texto libre\n * multilínea (notas, comentarios, descripciones).\n *\n * <kf-textarea label=\"Notas\" formControlName=\"notes\" />\n * <kf-textarea label=\"Comentario\" [(ngModel)]=\"comment\" [minRows]=\"2\" [maxRows]=\"10\" />\n *\n * `minRows`/`maxRows` (3 y 6 por defecto) acotan el crecimiento: el campo\n * crece con el contenido pero nunca pasa de `maxRows` — superado ese tope el\n * contenido hace scroll interno (`overflow-y: auto`) en vez de seguir\n * empujando el layout. Reemplaza el `resize: vertical` nativo (deshabilitado\n * a propósito) porque un resize manual sin tope es exactamente el problema\n * que motivó este componente: un `<textarea>` a mano podía crecer hasta\n * tapar los botones del footer de un modal.\n *\n * <kf-textarea label=\"Detalle\" formControlName=\"detail\" [maxRows]=\"12\" />\n *\n * `invalid` + `errorMessage` y `readonly`/`disabled` siguen el mismo\n * contrato que `kf-input` — ver su JSDoc para la diferencia entre ambos\n * estados.\n */\n@Component({\n selector: 'kf-textarea',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, FieldLabel],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Textarea),\n multi: true,\n },\n ],\n templateUrl: './Textarea.html',\n styleUrl: './Textarea.css',\n})\nexport class Textarea implements ControlValueAccessor, AfterViewInit {\n private static nextId = 0;\n\n private readonly nativeTextarea =\n viewChild.required<ElementRef<HTMLTextAreaElement>>('nativeTextarea');\n\n readonly label = input<string>();\n /** Marca el label con un asterisco visual y aplica `required` al\n * `<textarea>` nativo — el atributo HTML ya expone el estado obligatorio a\n * lectores de pantalla (mapeo implícito a `aria-required`), sin necesidad\n * de un `aria-required` explícito redundante. */\n readonly required = input(false, { transform: booleanAttribute });\n readonly hint = input<string>();\n /** Borde y aria-invalid en rojo. Ver `errorMessage` para el mensaje asociado. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"` — reemplaza a `hint` mientras esté presente. */\n readonly errorMessage = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Ver JSDoc de `kf-input` para la diferencia con `disabled`. */\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly placeholder = input<string>('');\n /** Filas mínimas visibles en reposo — define la altura de arranque del campo. */\n readonly minRows = input(3);\n /** Filas máximas antes de que el contenido pase a scroll interno en vez de seguir creciendo. */\n readonly maxRows = input(6);\n\n protected readonly textareaId = `kf-textarea-${Textarea.nextId++}`;\n protected readonly hintId = `${this.textareaId}-hint`;\n protected readonly errorId = `${this.textareaId}-error`;\n\n protected readonly value = signal('');\n protected readonly focused = signal(false);\n /** Deshabilitado por Reactive Forms (formControl.disable()). */\n private readonly disabledByForm = signal(false);\n /** Disabled real: por input() directo o por el FormControl asociado. */\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n // Mismo motivo que Input: el binding declarativo no siempre re-sincroniza\n // la propiedad DOM cuando el valor llega por writeValue() antes de que la\n // vista termine de inicializarse.\n this.nativeTextarea().nativeElement.value = this.value();\n this.adjustHeight();\n }\n\n writeValue(value: string): void {\n const nextValue = value ?? '';\n this.value.set(nextValue);\n const el = this.nativeTextarea?.();\n if (el) {\n el.nativeElement.value = nextValue;\n this.adjustHeight();\n }\n }\n\n registerOnChange(fn: (value: 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 protected onInput(rawValue: string): void {\n this.value.set(rawValue);\n this.onChange(rawValue);\n this.adjustHeight();\n }\n\n protected onBlur(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n /**\n * Recalcula la altura según el contenido real (`scrollHeight`), acotada\n * entre `minRows` y `maxRows` medidos con el line-height ya calculado del\n * propio elemento — así el tope se mantiene correcto sin importar qué\n * font-size/line-height termine aplicando cada tema. Superado `maxRows`\n * el resto del contenido hace scroll interno en vez de seguir creciendo.\n */\n private adjustHeight(): void {\n const el = this.nativeTextarea?.()?.nativeElement;\n if (!el) {\n return;\n }\n const styles = getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 20;\n const verticalExtra =\n (parseFloat(styles.paddingTop) || 0) +\n (parseFloat(styles.paddingBottom) || 0) +\n (parseFloat(styles.borderTopWidth) || 0) +\n (parseFloat(styles.borderBottomWidth) || 0);\n const minHeight = lineHeight * this.minRows() + verticalExtra;\n const maxHeight = lineHeight * this.maxRows() + verticalExtra;\n\n el.style.height = 'auto';\n const nextHeight = Math.min(Math.max(el.scrollHeight, minHeight), maxHeight);\n el.style.height = `${nextHeight}px`;\n el.style.overflowY = el.scrollHeight > maxHeight ? 'auto' : 'hidden';\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"textareaId\" [required]=\"required()\">{{ label() }}</kf-field-label>\n}\n<textarea\n #nativeTextarea\n [id]=\"textareaId\"\n class=\"kf-textarea__control\"\n [class.kf-textarea__control--focused]=\"focused()\"\n [class.kf-textarea__control--invalid]=\"invalid()\"\n [class.kf-textarea__control--readonly]=\"readonly()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [attr.readonly]=\"readonly() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : hint() ? hintId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [value]=\"value()\"\n (input)=\"onInput(nativeTextarea.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\n></textarea>\n@if (errorMessage(); as message) {\n <span class=\"kf-textarea__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n} @else if (hint()) {\n <span class=\"kf-textarea__hint kf-field-hint\" [id]=\"hintId\">{{ hint() }}</span>\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n/**\n * Da forma al valor de un campo MIENTRAS el usuario escribe — ej.\n * inserta el guion de un RUT chileno automáticamente, sin que el\n * usuario tenga que tipearlo — reposicionando el cursor para que\n * seguir escribiendo se sienta natural (sin esto, cualquier inserción\n * de caracteres empuja el cursor al final del campo en cada tecla).\n *\n * Se aplica junto a `formControlName`/`[formControl]`/`[(ngModel)]`\n * sobre cualquier input que implemente `ControlValueAccessor` (incluye\n * `kf-input`, pero no depende de él — funciona igual sobre un\n * `<input>` nativo):\n *\n * <kf-input formControlName=\"documentId\" [kfFormatInput]=\"formatChileanRut\" />\n *\n * La función de formateo recibe el valor crudo tecleado y devuelve el\n * valor con forma — debe ser determinística e idempotente (aplicarla\n * dos veces seguidas da el mismo resultado), como `formatChileanRut`\n * en este mismo archivo (`./format.ts`).\n */\n@Directive({\n selector: '[kfFormatInput]',\n})\nexport class FormatInputDirective {\n private readonly ngControl = inject(NgControl, { self: true });\n\n /** La función de formateo a aplicar — sin valor, el directive no\n * hace nada (permite pasar `undefined` condicionalmente sin tener\n * que quitar el directive del template entero). */\n readonly kfFormatInput = input<((value: string) => string) | undefined>();\n\n @HostListener('input', ['$event'])\n protected onInput(event: Event): void {\n const format = this.kfFormatInput();\n if (!format) {\n return;\n }\n\n const target = event.target as HTMLInputElement | null;\n if (!target) {\n return;\n }\n\n const rawValue = target.value;\n const formatted = format(rawValue);\n if (formatted === rawValue) {\n return;\n }\n\n // Cuántos caracteres había ANTES del cursor en el valor crudo —\n // referencia para calcular dónde debería quedar el cursor después\n // de que el formateo cambie la longitud del string (ej. al\n // insertar el guion del RUT).\n const cursorFromStart = target.selectionStart ?? rawValue.length;\n const insertedLength = formatted.length - rawValue.length;\n const nextCursor = Math.max(0, cursorFromStart + insertedLength);\n\n this.ngControl.control?.setValue(formatted);\n target.value = formatted;\n target.setSelectionRange(nextCursor, nextCursor);\n }\n}\n","import { Component, input, numberAttribute } from '@angular/core';\n\n/**\n * Grilla de tiles que escalona columnas solo entre DIVISORES de `columns`\n * (4 → 2 → 1, nunca 3), para que ninguna fila quede huérfana. Mide el\n * contenedor (`container-type: inline-size`), no el viewport, porque el\n * mismo bloque se rinde tanto en un drawer angosto como en una página\n * completa bajo el mismo viewport.\n */\n@Component({\n selector: 'kf-tile-grid',\n templateUrl: './TileGrid.html',\n styleUrl: './TileGrid.css',\n host: {\n '[class]': '\"kf-tile-grid--\" + columns()',\n },\n})\nexport class TileGrid {\n /** Columnas en el ancho máximo. Se acota a 1-6: por encima de 6 un tile\n * deja de tener ancho para su propio label. */\n readonly columns = input(4, {\n transform: (value: unknown) => Math.min(6, Math.max(1, numberAttribute(value, 4))),\n });\n}\n","<!--\n El grid vive en un div interno y no en el `:host`: el host es el CONTENEDOR\n de consulta (`container-type: inline-size`), y una `@container` dentro de\n su propia hoja mediría el contenedor de más arriba, no a él mismo.\n-->\n<div class=\"kf-tile-grid\">\n <ng-content />\n</div>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { Text } from '../text/Text';\n\nexport interface TimeSlot {\n value: string;\n /** Texto visible; por defecto, `value`. */\n label?: string;\n disabled?: boolean;\n /** Los horarios con el mismo `group` se rinden juntos bajo esa etiqueta, en orden de aparición. */\n group?: string;\n}\n\nconst SKELETON_COUNT = 8;\n\n/**\n * Grilla de horarios seleccionables con semántica de radiogroup: un solo tab\n * stop, las flechas mueven y seleccionan (saltando los deshabilitados) y\n * Home/End van al primer/último horario habilitado.\n *\n * Si algún horario declara `group`, se rinde un subgrupo con etiqueta por\n * cada grupo distinto; si no, una sola grilla plana.\n *\n * <kf-time-slot-picker\n * ariaLabel=\"Horario\"\n * [slots]=\"[{ value: '09:00', group: 'Mañana' }, { value: '15:30', group: 'Tarde', disabled: true }]\"\n * [(value)]=\"time\"\n * [loading]=\"loadingSlots()\"\n * />\n */\n@Component({\n selector: 'kf-time-slot-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Skeleton, Text],\n templateUrl: './TimeSlotPicker.html',\n styleUrl: './TimeSlotPicker.css',\n})\nexport class TimeSlotPicker {\n private static nextId = 0;\n\n readonly slots = input.required<readonly TimeSlot[]>();\n readonly value = model<string | null>(null);\n readonly ariaLabel = input.required<string>();\n /** Muestra chips de carga en lugar de los horarios. */\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyLabel = input<string>('No hay horarios disponibles');\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly idPrefix = `kf-time-slot-picker-${TimeSlotPicker.nextId++}`;\n\n protected readonly skeletons = Array.from({ length: SKELETON_COUNT }, (_, index) => index);\n\n protected readonly groups = computed(() => {\n const slots = this.slots();\n if (!slots.some((slot) => slot.group)) {\n return [{ id: `${this.idPrefix}-group-0`, label: null, slots }];\n }\n const byGroup = new Map<string, TimeSlot[]>();\n for (const slot of slots) {\n const key = slot.group ?? '';\n byGroup.set(key, [...(byGroup.get(key) ?? []), slot]);\n }\n return [...byGroup].map(([label, groupSlots], index) => ({\n id: `${this.idPrefix}-group-${index}`,\n label: label || null,\n slots: groupSlots as readonly TimeSlot[],\n }));\n });\n\n /** Valores habilitados en orden visual — la secuencia de navegación por teclado. */\n private readonly enabledValues = computed(() =>\n this.groups()\n .flatMap((group) => group.slots)\n .filter((slot) => !slot.disabled)\n .map((slot) => slot.value),\n );\n\n /** El único chip con `tabindex=\"0\"` (roving tabindex). */\n protected readonly tabStop = computed(() => {\n const values = this.enabledValues();\n const value = this.value();\n return value !== null && values.includes(value) ? value : (values[0] ?? null);\n });\n\n protected select(slot: TimeSlot): void {\n if (slot.disabled || this.loading() || slot.value === this.value()) {\n return;\n }\n this.value.set(slot.value);\n }\n\n protected onKeydown(event: KeyboardEvent, current: string): void {\n const values = this.enabledValues();\n const index = values.indexOf(current);\n if (index === -1) {\n return;\n }\n\n let nextIndex: number;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n nextIndex = (index + 1) % values.length;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n nextIndex = (index - 1 + values.length) % values.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = values.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n\n const next = values[nextIndex];\n this.value.set(next);\n // Se busca por dataset, no por id ni selector: los valores de horario son strings arbitrarios.\n Array.from(this.host.nativeElement.querySelectorAll<HTMLElement>('[data-value]'))\n .find((element) => element.dataset['value'] === next)\n ?.focus();\n }\n}\n","<div class=\"kf-time-slot-picker\" [attr.aria-busy]=\"loading() || null\">\n @if (loading()) {\n <div class=\"kf-time-slot-picker__grid\" aria-hidden=\"true\">\n @for (item of skeletons; track item) {\n <kf-skeleton variant=\"rect\" height=\"44px\" />\n }\n </div>\n } @else if (slots().length === 0) {\n <kf-text as=\"p\" variant=\"body-muted\">{{ emptyLabel() }}</kf-text>\n } @else {\n <div class=\"kf-time-slot-picker__groups\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (group of groups(); track group.id) {\n <div\n class=\"kf-time-slot-picker__group\"\n [attr.role]=\"group.label ? 'group' : null\"\n [attr.aria-labelledby]=\"group.label ? group.id : null\"\n >\n @if (group.label) {\n <span class=\"kf-time-slot-picker__group-label kf-overline-text\" [id]=\"group.id\">{{\n group.label\n }}</span>\n }\n <div class=\"kf-time-slot-picker__grid\">\n @for (slot of group.slots; track slot.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-time-slot-picker__slot\"\n [class.kf-time-slot-picker__slot--selected]=\"slot.value === value()\"\n [disabled]=\"slot.disabled\"\n [attr.aria-checked]=\"slot.value === value()\"\n [attr.tabindex]=\"slot.value === tabStop() ? 0 : -1\"\n [attr.data-value]=\"slot.value\"\n (click)=\"select(slot)\"\n (keydown)=\"onKeydown($event, slot.value)\"\n >\n {{ slot.label ?? slot.value }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Visual tone of a toast. Maps to the state tokens in\n * projects/ui/src/tokens/base.css. `loading` has no auto-dismiss and shows an\n * indeterminate bar instead of a countdown — pair it with\n * {@link ToastService.promise}. It reuses the `info` tokens, the closest\n * semantic role to \"work in progress\".\n */\nexport type ToastTone = 'success' | 'error' | 'warning' | 'info' | 'loading';\n\n/** Fixed icon per tone (page 20 of the design system) — not configurable per call. */\nconst TOAST_ICON: Record<ToastTone, IconName> = {\n success: 'check-circle',\n error: 'alert-circle',\n warning: 'alert-triangle',\n info: 'bell',\n loading: 'bell',\n};\n\n/** Acción opcional (call-to-action) renderizada dentro del toast, junto al botón de cerrar. */\nexport interface ToastAction {\n /** Label corto, ej. \"Ver ticket\" — 1-3 palabras, el toast mide solo 360px de ancho. */\n label: string;\n /** Se invoca al hacer click; el toast se cierra solo después, sin que el llamador tenga que llamar `dismiss()`. */\n onClick: () => void;\n}\n\n/** Options for {@link ToastService.show}. */\nexport interface ToastOptions {\n /** Color tone. Defaults to `'info'`. */\n tone?: ToastTone;\n /**\n * Milliseconds before auto-dismiss. Ignored when `tone` is `'loading'`. When\n * omitted it depends on the tone (see {@link TOAST_DEFAULT_DURATION_MS}):\n * `2800` for `success`/`info`, `5000` for `warning`, `8000` for `error`. An\n * explicit value always wins over the per-tone default.\n */\n duration?: number;\n /** Botón de acción opcional, ej. ir al registro sobre el que avisa el toast. */\n action?: ToastAction;\n}\n\n/** Messages for each leg of {@link ToastService.promise}. */\nexport interface ToastPromiseMessages<T = unknown> {\n loading?: string;\n success?: string | ((value: T) => string);\n error?: string | ((error: unknown) => string);\n}\n\n/** The single active toast, as rendered by `kf-toast-host`. */\nexport interface ToastState {\n id: number;\n message: string;\n tone: ToastTone;\n duration: number;\n leaving: boolean;\n action?: ToastAction;\n}\n\nconst DEFAULT_DURATION_MS = 2800;\n\n/**\n * Auto-dismiss time per tone when the caller doesn't pass `duration`. Errors and\n * warnings stay longer than confirmations: they carry something to read and\n * act on, while a success only has to be noticed. `success`/`info` keep the\n * historical 2800ms. `loading` never auto-dismisses.\n */\nexport const TOAST_DEFAULT_DURATION_MS: Readonly<Record<Exclude<ToastTone, 'loading'>, number>> = {\n success: DEFAULT_DURATION_MS,\n info: DEFAULT_DURATION_MS,\n warning: 5000,\n error: 8000,\n};\nconst EXIT_ANIMATION_MS = 200;\n\n/** What's currently holding the auto-dismiss timer paused. Tracked as a set so hover and\n * focus can overlap (e.g. mouse leaves while focus is still on the action button) without\n * resuming the timer early. */\ntype ToastPauseSource = 'hover' | 'focus';\n\n/**\n * Shows one toast at a time — a new `show()` call replaces whatever is\n * currently up (this mirrors a global status line, not a notification stack).\n *\n * Duration by tone (when `duration` isn't passed): `success`/`info` 2800ms,\n * `warning` 5000ms, `error` 8000ms (`TOAST_DEFAULT_DURATION_MS`); an explicit\n * `duration` always wins. The countdown pauses while the pointer or focus is\n * on the toast. Error toasts also get a larger, always-opaque close button.\n *\n * Angular has no global function that can mount UI on its own, so the\n * imperative `showToast(...)` of the reference design system becomes a\n * root-provided service holding signal state: `ToastService.show(...)` sets\n * the active toast and `ToastHost` (standalone, mounted once in the app\n * shell) renders it.\n *\n * @example\n * ```ts\n * // app.ts\n * imports: [ToastHost]\n * template: `<kf-toast-host />`\n *\n * // anywhere else\n * private readonly toast = inject(ToastService);\n * this.toast.show('Vehículo guardado', { tone: 'success' });\n *\n * // chains a `loading` toast into the promise's outcome:\n * this.toast.promise(this.api.save(vehicle), {\n * loading: 'Guardando…',\n * success: 'Vehículo guardado',\n * error: 'No se pudo guardar',\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private readonly _current = signal<ToastState | null>(null);\n private nextId = 0;\n private dismissTimer?: ReturnType<typeof setTimeout>;\n private removeTimer?: ReturnType<typeof setTimeout>;\n /** Wall-clock time the running `dismissTimer` is due to fire; used to compute how much\n * time is left when {@link pause} interrupts it. */\n private dismissDueAt?: number;\n /** Time left on the auto-dismiss countdown while paused. `undefined` when no countdown\n * is currently paused. */\n private remainingMs?: number;\n private readonly pauseSources = new Set<ToastPauseSource>();\n\n /** The single active toast, or `null`. */\n readonly current = this._current.asReadonly();\n\n /** Shows a toast, replacing whatever is currently shown. Returns its id. */\n show(message: string, options: ToastOptions = {}): number {\n const id = this.nextId++;\n const tone = options.tone ?? 'info';\n const duration =\n options.duration ??\n (tone === 'loading' ? DEFAULT_DURATION_MS : TOAST_DEFAULT_DURATION_MS[tone]);\n clearTimeout(this.dismissTimer);\n clearTimeout(this.removeTimer);\n this.dismissTimer = undefined;\n this.remainingMs = undefined;\n this.pauseSources.clear();\n this._current.set({ id, message, tone, duration, leaving: false, action: options.action });\n if (tone !== 'loading') {\n this.scheduleDismiss(id, duration);\n }\n return id;\n }\n\n private scheduleDismiss(id: number, ms: number): void {\n this.dismissDueAt = Date.now() + ms;\n this.dismissTimer = setTimeout(() => this.dismiss(id), ms);\n }\n\n /**\n * Pauses the auto-dismiss countdown for `id` while `source` (pointer hover or focus) is\n * active on it, so a user reaching for the action/dismiss button never loses the toast\n * mid-interaction (WCAG 2.2.1). No-op when `id` isn't the active toast, it's leaving, or\n * it has no running countdown (persistent or `loading` toasts, or already paused by\n * another source).\n */\n pause(id: number, source: ToastPauseSource): void {\n const toast = this._current();\n if (!toast || toast.id !== id || toast.leaving) return;\n this.pauseSources.add(source);\n if (this.dismissTimer === undefined) return;\n clearTimeout(this.dismissTimer);\n this.dismissTimer = undefined;\n this.remainingMs = Math.max(0, (this.dismissDueAt ?? Date.now()) - Date.now());\n }\n\n /**\n * Resumes a countdown paused by {@link pause}, honoring the time already elapsed before\n * the pause. No-op while another pause `source` is still active, or nothing is paused.\n */\n resume(id: number, source: ToastPauseSource): void {\n const toast = this._current();\n if (!toast || toast.id !== id || toast.leaving) return;\n this.pauseSources.delete(source);\n if (this.pauseSources.size > 0 || this.remainingMs === undefined) return;\n const ms = this.remainingMs;\n this.remainingMs = undefined;\n this.scheduleDismiss(id, ms);\n }\n\n /**\n * Starts the exit animation, then removes the toast. No-op when `id` is no\n * longer the active toast, so a stale timer never kills a newer toast.\n */\n dismiss(id?: number): void {\n const toast = this._current();\n if (!toast || toast.leaving || (id !== undefined && toast.id !== id)) return;\n clearTimeout(this.dismissTimer);\n this._current.set({ ...toast, leaving: true });\n this.removeTimer = setTimeout(() => {\n if (this._current()?.id === toast.id) this._current.set(null);\n }, EXIT_ANIMATION_MS);\n }\n\n /**\n * Shows a `loading` toast, then swaps it for a `success`/`error` toast once\n * `work` settles. Re-throws `work`'s rejection so callers can still react to\n * the failure.\n */\n promise<T>(work: Promise<T>, messages: ToastPromiseMessages<T> = {}): Promise<T> {\n this.show(messages.loading ?? 'Procesando…', { tone: 'loading' });\n return work.then(\n (value) => {\n const msg = messages.success ?? 'Listo';\n this.show(typeof msg === 'function' ? msg(value) : msg, { tone: 'success' });\n return value;\n },\n (error) => {\n const msg = messages.error ?? 'Ocurrió un error';\n this.show(typeof msg === 'function' ? msg(error) : msg, { tone: 'error' });\n throw error;\n },\n );\n }\n}\n\n/**\n * Renders whatever `ToastService` currently holds, fixed bottom-right. Mount\n * one instance in the app shell (e.g. next to the router outlet); it takes no\n * inputs and re-renders itself from the service state.\n *\n * <kf-toast-host />\n */\n@Component({\n selector: 'kf-toast-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Icon],\n templateUrl: './ToastHost.html',\n styleUrl: './ToastHost.css',\n})\nexport class ToastHost {\n private readonly toastService = inject(ToastService);\n\n /** 0-or-1 wrapper so `@for track t.id` remounts the node on every new toast, restarting its animations. */\n protected readonly toastList = computed<ToastState[]>(() => {\n const toast = this.toastService.current();\n return toast ? [toast] : [];\n });\n\n protected toastIcon(tone: ToastTone): IconName {\n return TOAST_ICON[tone];\n }\n\n protected dismiss(id: number): void {\n this.toastService.dismiss(id);\n }\n\n /** Pauses the toast's auto-dismiss timer while the pointer or keyboard focus is on it. */\n protected pause(t: ToastState, source: ToastPauseSource): void {\n this.toastService.pause(t.id, source);\n }\n\n /** Resumes the toast's auto-dismiss timer once neither the pointer nor focus is on it. */\n protected resume(t: ToastState, source: ToastPauseSource): void {\n this.toastService.resume(t.id, source);\n }\n\n /** Ejecuta la acción del toast (ej. \"Ver ticket\") y lo cierra — el\n * llamador no tiene que acordarse de descartarlo desde su propio handler. */\n protected runAction(t: ToastState): void {\n t.action?.onClick();\n this.dismiss(t.id);\n }\n}\n","@for (t of toastList(); track t.id) {\n <div\n class=\"kf-toast kf-toast--{{ t.tone }}\"\n [class.kf-toast--leaving]=\"t.leaving\"\n role=\"status\"\n [attr.aria-live]=\"t.tone === 'error' ? 'assertive' : 'polite'\"\n (mouseenter)=\"pause(t, 'hover')\"\n (mouseleave)=\"resume(t, 'hover')\"\n (focusin)=\"pause(t, 'focus')\"\n (focusout)=\"resume(t, 'focus')\"\n >\n <kf-icon class=\"kf-toast__icon\" [name]=\"toastIcon(t.tone)\" size=\"sm\" />\n <span class=\"kf-toast__message\">{{ t.message }}</span>\n @if (t.action; as action) {\n <button type=\"button\" class=\"kf-toast__action\" (click)=\"runAction(t)\">\n {{ action.label }}\n </button>\n }\n <button\n type=\"button\"\n class=\"kf-toast__dismiss\"\n [class.kf-toast__dismiss--prominent]=\"t.tone === 'error'\"\n [attr.aria-label]=\"t.tone === 'error' ? 'Cerrar mensaje de error' : 'Cerrar'\"\n (click)=\"dismiss(t.id)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n <span class=\"kf-toast__bar\" [style.--kf-toast-dur]=\"t.duration + 'ms'\"></span>\n </div>\n}\n","/*\n * Public API Surface of ui/core — entry point secundario, `@kaufmann-lab/ui/core`.\n *\n * Primitivas de design system sin dueño temático ni dependencia pesada (ver\n * `ENTRY-POINTS.md` en la raíz del repo para el criterio de qué vive acá y\n * qué sale a otro entry point). Los demás entry points de la librería\n * (`/auth`, `/business`, `/mobile`, `/map`) importan sus piezas base desde\n * `'@kaufmann-lab/ui/core'`, nunca desde la raíz `'@kaufmann-lab/ui'` — la\n * raíz es un agregador que reexporta a todos, así que importarla desde uno\n * de ellos cerraría un ciclo que ng-packagr rechaza en build.\n *\n * Este entry point no importa nada de `/auth`, `/business`, `/mobile` ni\n * `/map`: solo depende de `/shared` (ver `ENTRY-POINTS.md`). Dentro de este\n * entry point los componentes se importan entre sí con rutas relativas\n * (`../icon/Icon`), igual que siempre — comparten `rootDir`.\n */\n\nexport * from './lib/action-tile/ActionTile';\n// `AdminBadge` vive acá y no en `/auth` aunque temáticamente encajaría:\n// `PortalHeader` (`/core`) lo compone, y un `AdminBadge` en `/auth` cerraría\n// el ciclo `/core` -> `/auth` -> `/core`, que ng-packagr rechaza en build.\nexport * from './lib/admin-badge/AdminBadge';\nexport * from './lib/button/button';\nexport * from './lib/alert/Alert';\nexport * from './lib/alert-row/AlertRow';\nexport * from './lib/avatar/Avatar';\nexport * from './lib/badge/Badge';\nexport * from './lib/breadcrumb/Breadcrumb';\nexport * from './lib/bucket-progress/BucketProgress';\nexport * from './lib/calendar/Calendar';\nexport * from './lib/card/Card';\nexport * from './lib/carousel/Carousel';\nexport * from './lib/carousel/CarouselSlide';\nexport * from './lib/checkbox/Checkbox';\nexport * from './lib/chip/Chip';\nexport * from './lib/collapsible/Collapsible';\nexport * from './lib/contact-popover/ContactPopover';\nexport * from './lib/content-slot/ContentSlot';\nexport * from './lib/content-state/ContentState';\nexport * from './lib/content-viewer/ContentViewer';\nexport * from './lib/cursor-pager/CursorPager';\nexport * from './lib/data-table/DataTable';\nexport * from './lib/data-table/responsive-view';\nexport * from './lib/divider/Divider';\nexport * from './lib/document-row/DocumentRow';\nexport * from './lib/drawer/Drawer';\nexport * from './lib/dropdown/Dropdown';\nexport * from './lib/dropdown/DropdownItem';\nexport * from './lib/dropdown/DropdownPanel';\nexport * from './lib/empty-state/EmptyState';\nexport * from './lib/event-timeline/EventTimeline';\nexport * from './lib/feature-card/FeatureCard';\nexport * from './lib/field/Field';\nexport * from './lib/field-label/FieldLabel';\nexport * from './lib/file-input/FileInput';\nexport * from './lib/filter/Filter';\nexport * from './lib/filter-chips/FilterChips';\nexport * from './lib/footer/Footer';\nexport * from './lib/icon/Icon';\nexport * from './lib/input/Input';\nexport * from './lib/journey-stepper/JourneyStepper';\nexport * from './lib/link/Link';\nexport * from './lib/list-toolbar/ListToolbar';\nexport * from './lib/metric-card/MetricCard';\nexport * from './lib/milestone-timeline/MilestoneTimeline';\nexport * from './lib/milestone-timeline/MilestoneTimeline.types';\nexport * from './lib/modal/Modal';\nexport * from './lib/multi-select/MultiSelect';\nexport * from './lib/note-block/NoteBlock';\nexport * from './lib/option-list/OptionList';\nexport * from './lib/page-header/PageHeader';\nexport * from './lib/pagination/Pagination';\nexport * from './lib/panel/Panel';\nexport * from './lib/popover/Popover';\nexport * from './lib/portal-header/PortalHeader';\nexport * from './lib/progress/Progress';\nexport * from './lib/pulse-dot/PulseDot';\nexport * from './lib/row-actions/RowActions';\nexport * from './lib/section-header/SectionHeader';\nexport * from './lib/section-nav/SectionNav';\nexport * from './lib/section-nav/section-nav-item/SectionNavItem';\nexport * from './lib/section-nav/section-nav-item/SectionNavSubsection';\nexport * from './lib/segmented/Segmented';\nexport * from './lib/select/Select';\nexport * from './lib/selectable-card-group/SelectableCardGroup';\n// SidebarNavItem y TooltipDirective son piezas internas de SidebarShell,\n// no componentes de catálogo — solo se exporta el contrato de datos que\n// sí es parte de la API pública (`kf-sidebar-shell.navItems`).\nexport type { SidebarNavItemData } from './lib/sidebar-shell/sidebar-nav-item/SidebarNavItem';\nexport * from './lib/sidebar-shell/SidebarShell';\nexport * from './lib/skeleton/Skeleton';\nexport * from './lib/skeleton/SkeletonPreset';\nexport * from './lib/spinner/Spinner';\nexport * from './lib/stat-card/StatCard';\nexport * from './lib/stat-tile/StatTile';\nexport * from './lib/status-indicators/ProgressStatus';\nexport * from './lib/status-indicators/StatusMark';\nexport * from './lib/status-indicators/StatusNode';\nexport * from './lib/status-pill/StatusPill';\nexport * from './lib/tabs/Tabs';\nexport * from './lib/tabs/folder-tabs/FolderTabs';\nexport * from './lib/text/Text';\nexport * from './lib/textarea/Textarea';\nexport * from './lib/shared/format-input.directive';\nexport * from './lib/tile-grid/TileGrid';\nexport * from './lib/time-slot-picker/TimeSlotPicker';\nexport * from './lib/toast/Toast';\nexport * from './lib/tooltip/Tooltip';\nexport * from './lib/view-toggle/ViewToggle';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId","FOCUSABLE_SELECTOR","FOCUSABLE","Input"],"mappings":"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MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,K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A,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,QAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAA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"}
|
|
1
|
+
{"version":3,"file":"kaufmann-lab-ui-core.mjs","sources":["../../../projects/ui/core/src/lib/icon/icons/activity.ts","../../../projects/ui/core/src/lib/icon/icons/alert-circle.ts","../../../projects/ui/core/src/lib/icon/icons/alert-octagon.ts","../../../projects/ui/core/src/lib/icon/icons/alert-triangle.ts","../../../projects/ui/core/src/lib/icon/icons/award.ts","../../../projects/ui/core/src/lib/icon/icons/bar-chart.ts","../../../projects/ui/core/src/lib/icon/icons/bell.ts","../../../projects/ui/core/src/lib/icon/icons/bus.ts","../../../projects/ui/core/src/lib/icon/icons/calculator.ts","../../../projects/ui/core/src/lib/icon/icons/calendar.ts","../../../projects/ui/core/src/lib/icon/icons/car.ts","../../../projects/ui/core/src/lib/icon/icons/cart.ts","../../../projects/ui/core/src/lib/icon/icons/check.ts","../../../projects/ui/core/src/lib/icon/icons/check-circle.ts","../../../projects/ui/core/src/lib/icon/icons/check-square.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-down.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-left.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-left-bar.ts","../../../projects/ui/core/src/lib/icon/icons/chevron-right.ts","../../../projects/ui/core/src/lib/icon/icons/clipboard.ts","../../../projects/ui/core/src/lib/icon/icons/clock.ts","../../../projects/ui/core/src/lib/icon/icons/credit-card.ts","../../../projects/ui/core/src/lib/icon/icons/crosshair.ts","../../../projects/ui/core/src/lib/icon/icons/download.ts","../../../projects/ui/core/src/lib/icon/icons/edit.ts","../../../projects/ui/core/src/lib/icon/icons/external-link.ts","../../../projects/ui/core/src/lib/icon/icons/eye.ts","../../../projects/ui/core/src/lib/icon/icons/eye-off.ts","../../../projects/ui/core/src/lib/icon/icons/file.ts","../../../projects/ui/core/src/lib/icon/icons/filter.ts","../../../projects/ui/core/src/lib/icon/icons/gauge.ts","../../../projects/ui/core/src/lib/icon/icons/gift.ts","../../../projects/ui/core/src/lib/icon/icons/grid.ts","../../../projects/ui/core/src/lib/icon/icons/history.ts","../../../projects/ui/core/src/lib/icon/icons/home.ts","../../../projects/ui/core/src/lib/icon/icons/inbox.ts","../../../projects/ui/core/src/lib/icon/icons/info.ts","../../../projects/ui/core/src/lib/icon/icons/layers.ts","../../../projects/ui/core/src/lib/icon/icons/layout-grid.ts","../../../projects/ui/core/src/lib/icon/icons/list.ts","../../../projects/ui/core/src/lib/icon/icons/log-out.ts","../../../projects/ui/core/src/lib/icon/icons/mail.ts","../../../projects/ui/core/src/lib/icon/icons/map.ts","../../../projects/ui/core/src/lib/icon/icons/map-pin.ts","../../../projects/ui/core/src/lib/icon/icons/maximize.ts","../../../projects/ui/core/src/lib/icon/icons/menu.ts","../../../projects/ui/core/src/lib/icon/icons/message-circle.ts","../../../projects/ui/core/src/lib/icon/icons/mic.ts","../../../projects/ui/core/src/lib/icon/icons/mic-off.ts","../../../projects/ui/core/src/lib/icon/icons/minimize.ts","../../../projects/ui/core/src/lib/icon/icons/minus.ts","../../../projects/ui/core/src/lib/icon/icons/monitor.ts","../../../projects/ui/core/src/lib/icon/icons/more-vertical.ts","../../../projects/ui/core/src/lib/icon/icons/navigation.ts","../../../projects/ui/core/src/lib/icon/icons/pause.ts","../../../projects/ui/core/src/lib/icon/icons/phone.ts","../../../projects/ui/core/src/lib/icon/icons/pin.ts","../../../projects/ui/core/src/lib/icon/icons/play.ts","../../../projects/ui/core/src/lib/icon/icons/plus.ts","../../../projects/ui/core/src/lib/icon/icons/refresh.ts","../../../projects/ui/core/src/lib/icon/icons/search.ts","../../../projects/ui/core/src/lib/icon/icons/settings.ts","../../../projects/ui/core/src/lib/icon/icons/shield-check.ts","../../../projects/ui/core/src/lib/icon/icons/sort.ts","../../../projects/ui/core/src/lib/icon/icons/star.ts","../../../projects/ui/core/src/lib/icon/icons/ticket.ts","../../../projects/ui/core/src/lib/icon/icons/tool.ts","../../../projects/ui/core/src/lib/icon/icons/trash.ts","../../../projects/ui/core/src/lib/icon/icons/truck.ts","../../../projects/ui/core/src/lib/icon/icons/upload-cloud.ts","../../../projects/ui/core/src/lib/icon/icons/user.ts","../../../projects/ui/core/src/lib/icon/icons/user-search.ts","../../../projects/ui/core/src/lib/icon/icons/video.ts","../../../projects/ui/core/src/lib/icon/icons/x.ts","../../../projects/ui/core/src/lib/icon/icons/zap.ts","../../../projects/ui/core/src/lib/icon/icons/index.ts","../../../projects/ui/core/src/lib/icon/icon-sprite.ts","../../../projects/ui/core/src/lib/icon/Icon.ts","../../../projects/ui/core/src/lib/icon/Icon.html","../../../projects/ui/core/src/lib/action-tile/ActionTile.ts","../../../projects/ui/core/src/lib/action-tile/ActionTile.html","../../../projects/ui/core/src/lib/text/Text.ts","../../../projects/ui/core/src/lib/text/Text.html","../../../projects/ui/core/src/lib/admin-badge/AdminBadge.ts","../../../projects/ui/core/src/lib/admin-badge/AdminBadge.html","../../../projects/ui/core/src/lib/spinner/Spinner.ts","../../../projects/ui/core/src/lib/spinner/Spinner.html","../../../projects/ui/core/src/lib/button/button.ts","../../../projects/ui/core/src/lib/button/button.html","../../../projects/ui/core/src/lib/alert/Alert.ts","../../../projects/ui/core/src/lib/alert/Alert.html","../../../projects/ui/core/src/lib/alert-row/AlertRow.ts","../../../projects/ui/core/src/lib/alert-row/AlertRow.html","../../../projects/ui/core/src/lib/avatar/Avatar.ts","../../../projects/ui/core/src/lib/avatar/Avatar.html","../../../projects/ui/core/src/lib/badge/Badge.ts","../../../projects/ui/core/src/lib/badge/Badge.html","../../../projects/ui/core/src/lib/breadcrumb/Breadcrumb.ts","../../../projects/ui/core/src/lib/breadcrumb/Breadcrumb.html","../../../projects/ui/core/src/lib/bucket-progress/BucketProgress.ts","../../../projects/ui/core/src/lib/bucket-progress/BucketProgress.html","../../../projects/ui/core/src/lib/calendar/Calendar.ts","../../../projects/ui/core/src/lib/calendar/Calendar.html","../../../projects/ui/core/src/lib/card/Card.ts","../../../projects/ui/core/src/lib/card/Card.html","../../../projects/ui/core/src/lib/carousel/CarouselSlide.ts","../../../projects/ui/core/src/lib/carousel/Carousel.ts","../../../projects/ui/core/src/lib/carousel/Carousel.html","../../../projects/ui/core/src/lib/checkbox/Checkbox.ts","../../../projects/ui/core/src/lib/checkbox/Checkbox.html","../../../projects/ui/core/src/lib/chip/Chip.ts","../../../projects/ui/core/src/lib/chip/Chip.html","../../../projects/ui/core/src/lib/collapsible/Collapsible.ts","../../../projects/ui/core/src/lib/collapsible/Collapsible.html","../../../projects/ui/core/src/lib/shared/escape-capture.ts","../../../projects/ui/core/src/lib/dropdown/DropdownPanel.ts","../../../projects/ui/core/src/lib/dropdown/DropdownPanel.html","../../../projects/ui/core/src/lib/dropdown/Dropdown.ts","../../../projects/ui/core/src/lib/contact-popover/ContactPopover.ts","../../../projects/ui/core/src/lib/contact-popover/ContactPopover.html","../../../projects/ui/core/src/lib/content-slot/ContentSlot.ts","../../../projects/ui/core/src/lib/content-slot/ContentSlot.html","../../../projects/ui/core/src/lib/empty-state/EmptyState.ts","../../../projects/ui/core/src/lib/empty-state/EmptyState.html","../../../projects/ui/core/src/lib/skeleton/Skeleton.ts","../../../projects/ui/core/src/lib/skeleton/Skeleton.html","../../../projects/ui/core/src/lib/field-label/FieldLabel.ts","../../../projects/ui/core/src/lib/field-label/FieldLabel.html","../../../projects/ui/core/src/lib/shared/select-overlay.ts","../../../projects/ui/core/src/lib/select/Select.ts","../../../projects/ui/core/src/lib/select/Select.html","../../../projects/ui/core/src/lib/pagination/Pagination.ts","../../../projects/ui/core/src/lib/pagination/Pagination.html","../../../projects/ui/core/src/lib/view-toggle/ViewToggle.ts","../../../projects/ui/core/src/lib/view-toggle/ViewToggle.html","../../../projects/ui/core/src/lib/data-table/DataTable.ts","../../../projects/ui/core/src/lib/data-table/DataTable.html","../../../projects/ui/core/src/lib/link/Link.ts","../../../projects/ui/core/src/lib/link/Link.html","../../../projects/ui/core/src/lib/document-row/DocumentRow.ts","../../../projects/ui/core/src/lib/document-row/DocumentRow.html","../../../projects/ui/core/src/lib/progress/Progress.ts","../../../projects/ui/core/src/lib/progress/Progress.html","../../../projects/ui/core/src/lib/stat-card/StatCard.ts","../../../projects/ui/core/src/lib/stat-card/StatCard.html","../../../projects/ui/core/src/lib/skeleton/SkeletonPreset.ts","../../../projects/ui/core/src/lib/skeleton/SkeletonPreset.html","../../../projects/ui/core/src/lib/content-state/ContentState.ts","../../../projects/ui/core/src/lib/content-state/ContentState.html","../../../projects/ui/core/src/lib/content-viewer/ContentViewer.ts","../../../projects/ui/core/src/lib/content-viewer/ContentViewer.html","../../../projects/ui/core/src/lib/cursor-pager/CursorPager.ts","../../../projects/ui/core/src/lib/cursor-pager/CursorPager.html","../../../projects/ui/core/src/lib/data-table/responsive-view.ts","../../../projects/ui/core/src/lib/divider/Divider.ts","../../../projects/ui/core/src/lib/modal/modal-overlay-container.ts","../../../projects/ui/core/src/lib/drawer/Drawer.ts","../../../projects/ui/core/src/lib/drawer/Drawer.html","../../../projects/ui/core/src/lib/dropdown/DropdownItem.ts","../../../projects/ui/core/src/lib/dropdown/DropdownItem.html","../../../projects/ui/core/src/lib/event-timeline/EventTimeline.ts","../../../projects/ui/core/src/lib/event-timeline/EventTimeline.html","../../../projects/ui/core/src/lib/feature-card/FeatureCard.ts","../../../projects/ui/core/src/lib/feature-card/FeatureCard.html","../../../projects/ui/core/src/lib/field/Field.ts","../../../projects/ui/core/src/lib/field/Field.html","../../../projects/ui/core/src/lib/file-input/FileInput.ts","../../../projects/ui/core/src/lib/file-input/FileInput.html","../../../projects/ui/core/src/lib/input/Input.ts","../../../projects/ui/core/src/lib/input/Input.html","../../../projects/ui/core/src/lib/multi-select/MultiSelect.ts","../../../projects/ui/core/src/lib/multi-select/MultiSelect.html","../../../projects/ui/core/src/lib/filter/Filter.ts","../../../projects/ui/core/src/lib/filter/Filter.html","../../../projects/ui/core/src/lib/filter-chips/FilterChips.ts","../../../projects/ui/core/src/lib/filter-chips/FilterChips.html","../../../projects/ui/core/src/lib/footer/Footer.ts","../../../projects/ui/core/src/lib/footer/Footer.html","../../../projects/ui/core/src/lib/journey-stepper/JourneyStepper.ts","../../../projects/ui/core/src/lib/journey-stepper/JourneyStepper.html","../../../projects/ui/core/src/lib/list-toolbar/list-toolbar-mode.ts","../../../projects/ui/core/src/lib/list-toolbar/ListToolbar.ts","../../../projects/ui/core/src/lib/list-toolbar/ListToolbar.html","../../../projects/ui/core/src/lib/metric-card/MetricCard.ts","../../../projects/ui/core/src/lib/metric-card/MetricCard.html","../../../projects/ui/core/src/lib/status-indicators/ProgressStatus.ts","../../../projects/ui/core/src/lib/status-indicators/StatusMark.ts","../../../projects/ui/core/src/lib/status-indicators/StatusNode.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.types.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.ts","../../../projects/ui/core/src/lib/milestone-timeline/MilestoneTimeline.html","../../../projects/ui/core/src/lib/modal/Modal.ts","../../../projects/ui/core/src/lib/modal/Modal.html","../../../projects/ui/core/src/lib/note-block/NoteBlock.ts","../../../projects/ui/core/src/lib/note-block/NoteBlock.html","../../../projects/ui/core/src/lib/option-list/OptionList.ts","../../../projects/ui/core/src/lib/option-list/OptionList.html","../../../projects/ui/core/src/lib/page-header/PageHeader.ts","../../../projects/ui/core/src/lib/page-header/PageHeader.html","../../../projects/ui/core/src/lib/panel/Panel.ts","../../../projects/ui/core/src/lib/panel/Panel.html","../../../projects/ui/core/src/lib/popover/Popover.ts","../../../projects/ui/core/src/lib/portal-header/PortalHeader.ts","../../../projects/ui/core/src/lib/portal-header/PortalHeader.html","../../../projects/ui/core/src/lib/pulse-dot/PulseDot.ts","../../../projects/ui/core/src/lib/pulse-dot/PulseDot.html","../../../projects/ui/core/src/lib/tooltip/Tooltip.ts","../../../projects/ui/core/src/lib/row-actions/RowActions.ts","../../../projects/ui/core/src/lib/row-actions/RowActions.html","../../../projects/ui/core/src/lib/section-header/SectionHeader.ts","../../../projects/ui/core/src/lib/section-header/SectionHeader.html","../../../projects/ui/core/src/lib/section-nav/SectionNav.ts","../../../projects/ui/core/src/lib/section-nav/SectionNav.html","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavItem.ts","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavItem.html","../../../projects/ui/core/src/lib/section-nav/section-nav-item/SectionNavSubsection.ts","../../../projects/ui/core/src/lib/segmented/Segmented.ts","../../../projects/ui/core/src/lib/segmented/Segmented.html","../../../projects/ui/core/src/lib/selectable-card-group/SelectableCardGroup.ts","../../../projects/ui/core/src/lib/selectable-card-group/SelectableCardGroup.html","../../../projects/ui/core/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.ts","../../../projects/ui/core/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.html","../../../projects/ui/core/src/lib/sidebar-shell/SidebarShell.ts","../../../projects/ui/core/src/lib/sidebar-shell/SidebarShell.html","../../../projects/ui/core/src/lib/stat-tile/StatTile.ts","../../../projects/ui/core/src/lib/stat-tile/StatTile.html","../../../projects/ui/core/src/lib/status-pill/StatusPill.ts","../../../projects/ui/core/src/lib/status-pill/StatusPill.html","../../../projects/ui/core/src/lib/switch/Switch.ts","../../../projects/ui/core/src/lib/switch/Switch.html","../../../projects/ui/core/src/lib/tabs/Tabs.ts","../../../projects/ui/core/src/lib/tabs/Tabs.html","../../../projects/ui/core/src/lib/tabs/folder-tabs/FolderTabs.ts","../../../projects/ui/core/src/lib/tabs/folder-tabs/FolderTabs.html","../../../projects/ui/core/src/lib/textarea/Textarea.ts","../../../projects/ui/core/src/lib/textarea/Textarea.html","../../../projects/ui/core/src/lib/shared/format-input.directive.ts","../../../projects/ui/core/src/lib/tile-grid/TileGrid.ts","../../../projects/ui/core/src/lib/tile-grid/TileGrid.html","../../../projects/ui/core/src/lib/time-slot-picker/TimeSlotPicker.ts","../../../projects/ui/core/src/lib/time-slot-picker/TimeSlotPicker.html","../../../projects/ui/core/src/lib/toast/Toast.ts","../../../projects/ui/core/src/lib/toast/ToastHost.html","../../../projects/ui/core/src/public-api.ts","../../../projects/ui/core/src/kaufmann-lab-ui-core.ts"],"sourcesContent":["import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"activity\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const activity: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-octagon\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertOctagon: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 16h.01\" />\n <path d=\"M12 8v4\" />\n <path d=\"M15.312 2a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586l-4.688-4.688A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"alert-triangle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const alertTriangle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"award\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const award: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526\" />\n <circle cx=\"12\" cy=\"8\" r=\"6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bar-chart\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const barChart: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 21v-6\" />\n <path d=\"M12 21V9\" />\n <path d=\"M19 21V3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bell\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const bell: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10.268 21a2 2 0 0 0 3.464 0\" />\n <path d=\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"bus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const bus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 6v6\" />\n <path d=\"M15 6v6\" />\n <path d=\"M2 12h19.6\" />\n <path d=\"M18 18h3s.5-1.7.8-2.8c.1-.4.2-.8.2-1.2 0-.4-.1-.8-.2-1.2l-1.4-5C20.1 6.8 19.1 6 18 6H4a2 2 0 0 0-2 2v10h3\" />\n <circle cx=\"7\" cy=\"18\" r=\"2\" />\n <path d=\"M9 18h5\" />\n <circle cx=\"16\" cy=\"18\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"calculator\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const calculator: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" />\n <line x1=\"8\" x2=\"16\" y1=\"6\" y2=\"6\" />\n <line x1=\"16\" x2=\"16\" y1=\"14\" y2=\"18\" />\n <path d=\"M16 10h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M12 14h.01\" />\n <path d=\"M8 14h.01\" />\n <path d=\"M12 18h.01\" />\n <path d=\"M8 18h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"calendar\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const calendar: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 2v3\" />\n <path d=\"M16 2v3\" />\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"car\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const car: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2\" />\n <circle cx=\"7\" cy=\"17\" r=\"2\" />\n <path d=\"M9 17h6\" />\n <circle cx=\"17\" cy=\"17\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"cart\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const cart: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"8\" cy=\"21\" r=\"1\" />\n <circle cx=\"19\" cy=\"21\" r=\"1\" />\n <path d=\"M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const check: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 6 9 17l-5-5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const checkCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M21.801 10A10 10 0 1 1 17 3.335\" />\n <path d=\"m9 11 3 3L22 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"check-square\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const checkSquare: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"m9 12 2 2 4-4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-down\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronDown: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m6 9 6 6 6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-left\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronLeft: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m15 18-6-6 6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-left-bar\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronLeftBar: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"chevron-right\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const chevronRight: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m9 18 6-6-6-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"clipboard\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const clipboard: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\" />\n <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"clock\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const clock: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"credit-card\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const creditCard: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\" />\n <line x1=\"2\" x2=\"22\" y1=\"10\" y2=\"10\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"crosshair\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const crosshair: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"22\" x2=\"18\" y1=\"12\" y2=\"12\" />\n <line x1=\"6\" x2=\"2\" y1=\"12\" y2=\"12\" />\n <line x1=\"12\" x2=\"12\" y1=\"6\" y2=\"2\" />\n <line x1=\"12\" x2=\"12\" y1=\"22\" y2=\"18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"download\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const download: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 15V3\" />\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <path d=\"m7 10 5 5 5-5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"edit\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const edit: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"external-link\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const externalLink: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"eye\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const eye: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"eye-off\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const eyeOff: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"file\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const file: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\" />\n <path d=\"M14 2v5a1 1 0 0 0 1 1h5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"filter\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const filter: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"gauge\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const gauge: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m12 14 4-4\" />\n <path d=\"M3.34 19a10 10 0 1 1 17.32 0\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"gift\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const gift: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 7v14\" />\n <path d=\"M20 11v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-8\" />\n <path d=\"M7.5 7a1 1 0 0 1 0-5A4.8 8 0 0 1 12 7a4.8 8 0 0 1 4.5-5 1 1 0 0 1 0 5\" />\n <rect x=\"3\" y=\"7\" width=\"18\" height=\"4\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"grid\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const grid: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"history\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const history: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n <path d=\"M12 7v5l4 2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"home\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const home: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 10.5 12 3l9 7.5\" />\n <path d=\"M5 9.5V20a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1V9.5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"inbox\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const inbox: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" />\n <path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"info\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const info: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"layers\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const layers: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"layout-grid\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const layoutGrid: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\" />\n <rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"list\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const list: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 5h.01\" />\n <path d=\"M3 12h.01\" />\n <path d=\"M3 19h.01\" />\n <path d=\"M8 5h13\" />\n <path d=\"M8 12h13\" />\n <path d=\"M8 19h13\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"log-out\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const logOut: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"M16 17l5-5-5-5\" />\n <path d=\"M21 12H9\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mail\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mail: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m3 6 9 6 9-6\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"map\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const map: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14.106 5.553a2 2 0 0 0 1.788 0l3.659-1.83A1 1 0 0 1 21 4.619v12.764a1 1 0 0 1-.553.894l-4.553 2.277a2 2 0 0 1-1.788 0l-4.212-2.106a2 2 0 0 0-1.788 0l-3.659 1.83A1 1 0 0 1 3 19.381V6.618a1 1 0 0 1 .553-.894l4.553-2.277a2 2 0 0 1 1.788 0z\" />\n <path d=\"M15 5.764v15\" />\n <path d=\"M9 3.236v15\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"map-pin\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mapPin: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"maximize\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const maximize: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3\" />\n <path d=\"M21 8V5a2 2 0 0 0-2-2h-3\" />\n <path d=\"M3 16v3a2 2 0 0 0 2 2h3\" />\n <path d=\"M16 21h3a2 2 0 0 0 2-2v-3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"menu\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const menu: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M4 5h16\" />\n <path d=\"M4 12h16\" />\n <path d=\"M4 19h16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"message-circle\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const messageCircle: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mic\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const mic: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 19v3\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <rect x=\"9\" y=\"2\" width=\"6\" height=\"13\" rx=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"mic-off\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const micOff: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 19v3\" />\n <path d=\"M15 9.34V5a3 3 0 0 0-5.68-1.33\" />\n <path d=\"M16.95 16.95A7 7 0 0 1 5 12v-2\" />\n <path d=\"M18.89 13.23A7 7 0 0 0 19 12v-2\" />\n <path d=\"m2 2 20 20\" />\n <path d=\"M9 9v3a3 3 0 0 0 5.12 2.12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"minimize\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const minimize: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3\" />\n <path d=\"M21 8h-3a2 2 0 0 1-2-2V3\" />\n <path d=\"M3 16h3a2 2 0 0 1 2 2v3\" />\n <path d=\"M16 21v-3a2 2 0 0 1 2-2h3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"minus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const minus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 12h14\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"monitor\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const monitor: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\" />\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\" />\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"more-vertical\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const moreVertical: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"12\" cy=\"5\" r=\"1\" />\n <circle cx=\"12\" cy=\"19\" r=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"navigation\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const navigation: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <polygon points=\"3 11 22 2 13 21 11 13 3 11\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"pause\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const pause: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <rect x=\"14\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\" />\n <rect x=\"5\" y=\"3\" width=\"5\" height=\"18\" rx=\"1\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"phone\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const phone: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"pin\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const pin: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 17v5\" />\n <path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"play\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const play: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"plus\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const plus: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"refresh\" (grilla 24×24; `refresh-cw` de Lucide) — ver `icons/index.ts` para el registro completo. */\nexport const refresh: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"search\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const search: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21 21-4.34-4.34\" />\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"settings\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const settings: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"shield-check\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const shieldCheck: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"sort\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const sort: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"star\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const star: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"ticket\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const ticket: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M2 9a3 3 0 0 1 0 6v2a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-2a3 3 0 0 1 0-6V7a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2Z\" />\n <path d=\"M13 5v2\" />\n <path d=\"M13 17v2\" />\n <path d=\"M13 11v2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"tool\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const tool: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"trash\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const trash: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"truck\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const truck: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M14 18V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v11a1 1 0 0 0 1 1h2\" />\n <path d=\"M15 18H9\" />\n <path d=\"M19 18h2a1 1 0 0 0 1-1v-3.65a1 1 0 0 0-.22-.624l-3.48-4.35A1 1 0 0 0 17.52 8H14\" />\n <circle cx=\"17\" cy=\"18\" r=\"2\" />\n <circle cx=\"7\" cy=\"18\" r=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"upload-cloud\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const uploadCloud: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"user\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const user: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"user-search\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const userSearch: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <circle cx=\"10\" cy=\"7\" r=\"4\" />\n <path d=\"M10.3 15H7a4 4 0 0 0-4 4v2\" />\n <circle cx=\"17\" cy=\"17\" r=\"3\" />\n <path d=\"m21 21-1.9-1.9\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"video\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const video: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\" />\n <rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"x\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const x: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\n\n/** Símbolo de trazo \"zap\" (grilla 24×24) — ver `icons/index.ts` para el registro completo. */\nexport const zap: IconDefinition = {\n viewBox: '0 0 24 24',\n markup: `\n <path d=\"M15.914 4a1.5 1.5 0 0 0-2.474-1.561l-9 9A1.5 1.5 0 0 0 5.5 14h4.002a.5.5 0 0 1 .471.666L8.086 20a1.5 1.5 0 0 0 2.475 1.56l9-9A1.5 1.5 0 0 0 18.5 10h-3.997a.5.5 0 0 1-.472-.667z\" />\n `,\n};\n","import type { IconDefinition } from '../icon-definition';\nimport type { IconName } from '../icon-name';\nimport { activity } from './activity';\nimport { alertCircle } from './alert-circle';\nimport { alertOctagon } from './alert-octagon';\nimport { alertTriangle } from './alert-triangle';\nimport { award } from './award';\nimport { barChart } from './bar-chart';\nimport { bell } from './bell';\nimport { bus } from './bus';\nimport { calculator } from './calculator';\nimport { calendar } from './calendar';\nimport { car } from './car';\nimport { cart } from './cart';\nimport { check } from './check';\nimport { checkCircle } from './check-circle';\nimport { checkSquare } from './check-square';\nimport { chevronDown } from './chevron-down';\nimport { chevronLeft } from './chevron-left';\nimport { chevronLeftBar } from './chevron-left-bar';\nimport { chevronRight } from './chevron-right';\nimport { clipboard } from './clipboard';\nimport { clock } from './clock';\nimport { creditCard } from './credit-card';\nimport { crosshair } from './crosshair';\nimport { download } from './download';\nimport { edit } from './edit';\nimport { externalLink } from './external-link';\nimport { eye } from './eye';\nimport { eyeOff } from './eye-off';\nimport { file } from './file';\nimport { filter } from './filter';\nimport { gauge } from './gauge';\nimport { gift } from './gift';\nimport { grid } from './grid';\nimport { history } from './history';\nimport { home } from './home';\nimport { inbox } from './inbox';\nimport { info } from './info';\nimport { layers } from './layers';\nimport { layoutGrid } from './layout-grid';\nimport { list } from './list';\nimport { logOut } from './log-out';\nimport { mail } from './mail';\nimport { map } from './map';\nimport { mapPin } from './map-pin';\nimport { maximize } from './maximize';\nimport { menu } from './menu';\nimport { messageCircle } from './message-circle';\nimport { mic } from './mic';\nimport { micOff } from './mic-off';\nimport { minimize } from './minimize';\nimport { minus } from './minus';\nimport { monitor } from './monitor';\nimport { moreVertical } from './more-vertical';\nimport { navigation } from './navigation';\nimport { pause } from './pause';\nimport { phone } from './phone';\nimport { pin } from './pin';\nimport { play } from './play';\nimport { plus } from './plus';\nimport { refresh } from './refresh';\nimport { search } from './search';\nimport { settings } from './settings';\nimport { shieldCheck } from './shield-check';\nimport { sort } from './sort';\nimport { star } from './star';\nimport { ticket } from './ticket';\nimport { tool } from './tool';\nimport { trash } from './trash';\nimport { truck } from './truck';\nimport { uploadCloud } from './upload-cloud';\nimport { user } from './user';\nimport { userSearch } from './user-search';\nimport { video } from './video';\nimport { x } from './x';\nimport { zap } from './zap';\n\n/**\n * Registro tipado de todos los símbolos de ícono. `Record<IconName,\n * IconDefinition>` obliga al compilador a exigir una entrada por cada\n * nombre de `IconName` — agregar un nombre acá sin su archivo en\n * `icons/`, o viceversa, es un error de TypeScript, no un ícono roto\n * en runtime (que era el riesgo real del sprite como string único).\n *\n * Agregar un ícono nuevo es: crear `icons/nombre-del-icono.ts` (copiar\n * el patrón de cualquier archivo vecino), agregarlo a `IconName` en\n * `icon-name.ts`, e importarlo/registrarlo acá.\n */\nexport const ICON_DEFINITIONS: Record<IconName, IconDefinition> = {\n activity: activity,\n 'alert-circle': alertCircle,\n 'alert-octagon': alertOctagon,\n 'alert-triangle': alertTriangle,\n award: award,\n 'bar-chart': barChart,\n bell: bell,\n bus: bus,\n calculator: calculator,\n calendar: calendar,\n car: car,\n cart: cart,\n check: check,\n 'check-circle': checkCircle,\n 'check-square': checkSquare,\n 'chevron-down': chevronDown,\n 'chevron-left': chevronLeft,\n 'chevron-left-bar': chevronLeftBar,\n 'chevron-right': chevronRight,\n clipboard: clipboard,\n clock: clock,\n 'credit-card': creditCard,\n crosshair: crosshair,\n download: download,\n edit: edit,\n 'external-link': externalLink,\n eye: eye,\n 'eye-off': eyeOff,\n file: file,\n filter: filter,\n gauge: gauge,\n gift: gift,\n grid: grid,\n history: history,\n home: home,\n inbox: inbox,\n info: info,\n layers: layers,\n 'layout-grid': layoutGrid,\n list: list,\n 'log-out': logOut,\n mail: mail,\n map: map,\n 'map-pin': mapPin,\n maximize: maximize,\n menu: menu,\n 'message-circle': messageCircle,\n mic: mic,\n 'mic-off': micOff,\n minimize: minimize,\n minus: minus,\n monitor: monitor,\n 'more-vertical': moreVertical,\n navigation: navigation,\n pause: pause,\n phone: phone,\n pin: pin,\n play: play,\n plus: plus,\n refresh: refresh,\n search: search,\n settings: settings,\n 'shield-check': shieldCheck,\n sort: sort,\n star: star,\n ticket: ticket,\n tool: tool,\n trash: trash,\n truck: truck,\n 'upload-cloud': uploadCloud,\n user: user,\n 'user-search': userSearch,\n video: video,\n x: x,\n zap: zap,\n};\n","import { ICON_DEFINITIONS } from './icons';\n\n/**\n * Sprite SVG con los 74 íconos de trazo del design system (página 5:\n * \"Set de 59 iconos de trazo (1.9px, grilla 24×24)\", más las extensiones\n * propias documentadas en `icon-name.ts` — `eye-off`, `log-out`, los 5 de\n * `kf-map` y los 4 del selector de canal/fijar de `apps/operations`).\n * Cada ícono es un `<symbol>` con su nombre real de la spec como id\n * (`kf-icon-check`, `kf-icon-alert-triangle`, etc.) — `Icon` lo referencia\n * con `<use>`.\n *\n * Los paths vienen de Lucide (https://lucide.dev, licencia ISC), la\n * librería de iconos de trazo cuyo set de nombres coincide exactamente con\n * el que pide el design system (chevron-right, alert-triangle, bar-chart…).\n * Se embeben acá en vez de agregar `lucide` como dependencia del paquete\n * para no sumar peso/versión externa a algo que consumen todos los\n * frontends del ecosistema — son símbolos estáticos, no lógica que\n * necesite actualizarse seguido.\n *\n * Mapeo de 4 nombres de la spec que no existen tal cual en Lucide (renombres\n * entre versiones de esa librería, o conceptos vecinos):\n * tool -> wrench\n * sort -> arrow-up-down (control de orden bidireccional simple)\n * cart -> shopping-cart\n * chevron-left-bar -> panel-left (icono de \"colapsar panel lateral\")\n *\n * El sprite ya no es un string único de mano: se construye acá a partir de\n * `ICON_DEFINITIONS` (ver `icons/index.ts`), el registro tipado donde cada\n * ícono vive en su propio archivo bajo `icons/`. Esto es responsabilidad de\n * ensamblado pura — los datos de cada glyph viven en otro lado.\n *\n * Se inyecta UNA sola vez en el DOM (ver `Icon`), sin importar cuántos\n * `<kf-icon>` distintos haya en la página — todos referencian el mismo\n * sprite vía `<use href=\"#kf-icon-...\">`.\n */\nexport const KF_ICON_SPRITE = buildIconSprite();\n\nfunction buildIconSprite(): string {\n const symbols = Object.entries(ICON_DEFINITIONS)\n .map(\n ([name, { viewBox, markup }]) =>\n `<symbol id=\"kf-icon-${name}\" viewBox=\"${viewBox}\">${markup}</symbol>`,\n )\n .join('\\n ');\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display: none\">\n ${symbols}\n</svg>`;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, booleanAttribute, computed, effect, inject, input } from '@angular/core';\nimport { KF_ICON_SPRITE } from './icon-sprite';\nimport type { IconName } from './icon-name';\n\nexport type { IconName };\n\nexport type IconSize = 'sm' | 'md' | 'lg';\n\n/** Ángulos de rotación soportados por `rotate` — cubre los casos reales del\n * design system (un chevron que apunta en 4 direcciones posibles según\n * estado, ej. orden ascendente/descendente o un panel abierto/cerrado);\n * no un `number` libre, para no habilitar ángulos arbitrarios sin caso de\n * uso ni animación pensada. */\nexport type IconRotation = 0 | 90 | 180 | 270;\n\n/** Marca el sprite ya inyectado, para no depender de una bandera de módulo\n * — una bandera compartida entre instancias de test (o entre múltiples\n * `TestBed` en la misma suite) daría falsos negativos: el primer test que\n * corre \"gasta\" la bandera y todos los siguientes creerían que el sprite\n * nunca se inyecta. Comprobar el propio DOM es la fuente de verdad real. */\nconst SPRITE_ROOT_ID = 'kf-icon-sprite-root';\n\n/**\n * Ícono de trazo del design system — 71 glyphs (59 de la página 5 + extensiones\n * propias documentadas en `icon-name.ts`), grilla 24×24,\n * grosor de trazo 1.9px. Referencia un sprite SVG embebido (ver\n * `icon-sprite.ts`) vía `<use>`, así que no hay peso de red adicional por\n * cada instancia: el sprite se inyecta al DOM una única vez, la primera\n * vez que se renderiza cualquier `<kf-icon>` de toda la aplicación.\n *\n * El tamaño se controla con `size` (página 6: \"el tamaño se controla con la\n * prop size\"): `sm` (16px), `md` (20px, default) o `lg` (24px). El color\n * sigue siempre `currentColor` — se hereda del texto del elemento\n * contenedor, nunca se fija en el propio ícono.\n *\n * `rotate` gira el mismo glyph en vez de requerir un ícono aparte por\n * dirección — útil para un chevron que representa un estado con más de una\n * orientación (ej. orden ascendente/descendente de una columna, un panel\n * abierto/cerrado). La rotación transiciona con la misma duración que el\n * resto de las transiciones cortas del design system.\n *\n * <kf-icon name=\"alert-triangle\" size=\"sm\" />\n * <kf-icon name=\"chevron-down\" [rotate]=\"isOpen() ? 180 : 0\" />\n * <kf-button icon=\"calendar\">Reservar hora</kf-button> <!-- ver Button -->\n */\n@Component({\n selector: 'kf-icon',\n templateUrl: './Icon.html',\n styleUrl: './Icon.css',\n host: {\n '[style.--kf-icon-size]': 'pixelSize()',\n '[style.--kf-icon-rotate]': \"rotate() + 'deg'\",\n '[class.kf-icon--filled]': 'filled()',\n },\n})\nexport class Icon {\n readonly name = input.required<IconName>();\n readonly size = input<IconSize>('md');\n readonly rotate = input<IconRotation>(0);\n /**\n * Rellena el glyph (`fill: currentColor`) en vez de dejarlo solo de trazo.\n * Pensado para un estado activo/marcado de un ícono usado como toggle (ej.\n * \"fijar\" un panel) — un cambio de COLOR únicamente puede no distinguirse\n * lo suficiente en marcas cuyo `--kf-color-secondary` queda cerca del color\n * de texto por default; rellenar el área cambia más píxeles y se percibe\n * con más contraste aunque el tono sea similar. No es el default del\n * design system (sigue siendo de trazo, página 6 del PDF) — es opt-in por\n * componente para ese caso puntual.\n */\n readonly filled = input(false, { transform: booleanAttribute });\n\n private readonly document = inject(DOCUMENT);\n\n protected readonly pixelSize = computed(() => {\n const bySize: Record<IconSize, string> = { sm: '16px', md: '20px', lg: '24px' };\n return bySize[this.size()];\n });\n\n constructor() {\n effect(() => {\n if (this.document.getElementById(SPRITE_ROOT_ID)) {\n return;\n }\n const container = this.document.createElement('div');\n container.innerHTML = KF_ICON_SPRITE;\n const sprite = container.firstElementChild;\n if (sprite) {\n sprite.id = SPRITE_ROOT_ID;\n this.document.body.prepend(sprite);\n }\n });\n }\n}\n","<svg [attr.aria-hidden]=\"true\" focusable=\"false\">\n <use [attr.href]=\"'#kf-icon-' + name()\" />\n</svg>\n","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Dos variantes del mismo concepto — acceso rápido a una sección (página\n * 35): \"Tile de acceso destacado\" (`variant=\"tile\"`, default) es un bloque\n * centrado con ícono grande arriba y título abajo, pensado para una\n * cuadrícula de accesos (ej. \"Todos los certificados\"). \"Fila de documento\"\n * (`variant=\"row\"`) es horizontal, con ícono a la izquierda y\n * título+descripción a la derecha, pensada para listas verticales dentro de\n * un `kf-panel` (ej. \"Pagos\" / \"Revisa tu estado de cuenta y realiza pagos.\").\n *\n * <kf-action-tile icon=\"shield-check\" title=\"Todos los certificados\" />\n * <kf-action-tile variant=\"row\" icon=\"download\" title=\"Pagos\"\n * description=\"Revisa tu estado de cuenta y realiza pagos.\" />\n */\n@Component({\n selector: 'kf-action-tile',\n imports: [Icon],\n templateUrl: './ActionTile.html',\n styleUrl: './ActionTile.css',\n host: {\n '[class.kf-action-tile--tile]': \"variant() === 'tile'\",\n '[class.kf-action-tile--row]': \"variant() === 'row'\",\n },\n})\nexport class ActionTile {\n readonly variant = input<'tile' | 'row'>('tile');\n readonly icon = input.required<IconName>();\n readonly title = input.required<string>();\n readonly description = input<string>();\n}\n","<span class=\"kf-action-tile__icon\">\n <kf-icon [name]=\"icon()\" [size]=\"variant() === 'row' ? 'md' : 'lg'\" />\n</span>\n<span class=\"kf-action-tile__text\">\n <span class=\"kf-action-tile__title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-action-tile__description\">{{ description() }}</span>\n }\n</span>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input } from '@angular/core';\n\nexport type TextAs = 'h1' | 'h2' | 'h3' | 'p' | 'span';\nexport type TextVariant =\n | 'title-xxl'\n | 'title-xl'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body'\n | 'body-muted'\n | 'body-sm'\n | 'body-sm-muted'\n | 'caption'\n | 'overline'\n | 'overline-strong';\nexport type TextTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Tipografía unificada — separa la etiqueta semántica (`as`, qué es el\n * texto para el DOM/accesibilidad) del estilo visual (`variant`, cómo se\n * ve). Antes de este componente, cada pantalla que consume la librería\n * definía su propio `h1`/`p` con `font-size` suelto para el mismo rol\n * (título de página, subtítulo, texto secundario) — auditoría sobre\n * `web-portal-latam-frontend` encontró 9 tamaños distintos entre login y\n * home sin ningún paso de escala en común. `variant` resuelve eso contra\n * la escala de `tokens/base.css` (`--kf-font-size-*`).\n *\n * `tone` sigue la misma convención cerrada que `Alert`/`Badge`/`Chip`: sin\n * escape hatch de color libre. Si un caso necesita un color que `tone` no\n * cubre, es una discusión de design system, no una prop nueva acá.\n *\n * `title-xl`/`title-xxl` son un tier aparte de `title-lg|md|sm`: no vienen\n * de la auditoría de contenido de página (esa cerró en 2.125rem), son para\n * títulos protagonistas de pantalla completa (ej. bienvenida del home vía\n * `kf-page-header[size=xl|xxl]`) — ver tokens/base.css.\n *\n * `body-sm`/`body-sm-muted` son el paso intermedio entre `body` (1rem) y\n * `caption` (0.75rem): 0.875rem (`--kf-font-size-body-sm`), para texto de\n * apoyo en filas y paneles densos. Mismo criterio de color que `body`/\n * `body-muted`: `body-sm` hereda el color de texto y `body-sm-muted` usa el\n * atenuado.\n *\n * `overline`/`overline-strong` son para el patrón \"texto chico en mayúsculas\n * junto a un dato\" (ej. el label \"RUC\" de `kf-company-selector`, el badge de\n * `kf-admin-badge`) — antes de estas variantes, ese patrón se reimplementaba\n * suelto en al menos 7 componentes con tamaños/pesos ligeramente distintos\n * entre sí. `overline` (peso 600) es para labels sin chrome propio;\n * `overline-strong` (peso 700) es para el texto de un badge/pill que ya trae\n * su propio fondo. Ninguna de las dos fija color — como el resto de los\n * variants, el color se resuelve con `tone`.\n *\n * <kf-text as=\"h1\" variant=\"title-lg\">Bienvenido de nuevo</kf-text>\n * <kf-text as=\"p\" variant=\"body-muted\">Ingresá con tu cuenta corporativa.</kf-text>\n * <kf-text as=\"span\" variant=\"body-sm\">Última actualización hace 5 min</kf-text>\n * <kf-text as=\"span\" variant=\"caption\" tone=\"error\">Campo obligatorio</kf-text>\n * <kf-text as=\"span\" variant=\"overline\">RUC</kf-text>\n * <kf-text as=\"span\" variant=\"overline-strong\" tone=\"warn\">Vista administrador</kf-text>\n */\n@Component({\n selector: 'kf-text',\n imports: [NgTemplateOutlet],\n templateUrl: './Text.html',\n styleUrl: './Text.css',\n})\nexport class Text {\n /** Etiqueta semántica real que se renderiza — nunca es solo un `div`. */\n readonly as = input<TextAs>('p');\n readonly variant = input<TextVariant>('body');\n readonly tone = input<TextTone>('neutral');\n\n /**\n * Copia de `as` para uso dentro del template: `as` es palabra reservada\n * en las expresiones de Angular (`@if (x; as y)`), así que `@switch (as())`\n * no parsea — NG5002. La prop pública sigue llamándose `as` (es solo un\n * atributo HTML ahí, `<kf-text as=\"h1\">`, no una expresión).\n */\n protected readonly tag = computed(() => this.as());\n\n protected hostClass(): string {\n const classes = [`kf-text--${this.variant()}`];\n // Geometría de \"overline\"/\"caption\" compartida con cualquier otro\n // consumidor de esos patrones (ver `shared/overline-text.css`,\n // `shared/caption-text.css`).\n if (this.variant() === 'overline') {\n classes.push('kf-overline-text');\n }\n if (this.variant() === 'caption') {\n classes.push('kf-caption-text');\n }\n if (this.tone() !== 'neutral') {\n classes.push(`kf-text--${this.tone()}`);\n }\n return classes.join(' ');\n }\n}\n","<!--\n Una sola proyección compartida (ng-template + ngTemplateOutlet) en vez\n de un <ng-content> por cada rama del @switch: Angular solo conecta la\n proyección real del consumidor a la PRIMERA instancia de <ng-content>\n que encuentra en el árbol de compilación — con un <ng-content> por\n rama, todas menos una quedan vacías en runtime (bug detectado por\n Text.spec.ts, no algo documentado a simple vista en los docs de Angular).\n-->\n<ng-template #projected><ng-content /></ng-template>\n@switch (tag()) {\n @case ('h1') {\n <h1 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h1>\n }\n @case ('h2') {\n <h2 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h2>\n }\n @case ('h3') {\n <h3 [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></h3>\n }\n @case ('span') {\n <span [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></span>\n }\n @default {\n <p [class]=\"hostClass()\"><ng-container [ngTemplateOutlet]=\"projected\" /></p>\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Marca la barra superior como chrome exclusivo de administradores (página\n * 18) — acento ámbar para diferenciar contexto privilegiado del resto del\n * portal. Dos variantes: etiqueta aislada (pill), o `inline` para usarse\n * dentro de la franja de `kf-portal-header` (fondo oscuro, texto ámbar).\n *\n * <kf-admin-badge />\n * <kf-admin-badge inline />\n */\n@Component({\n selector: 'kf-admin-badge',\n imports: [Icon, Text],\n templateUrl: './AdminBadge.html',\n styleUrl: './AdminBadge.css',\n host: {\n '[class.kf-admin-badge--inline]': 'inline()',\n },\n})\nexport class AdminBadge {\n /** Para usarse dentro de una superficie oscura (ej. la franja de `kf-portal-header`). */\n readonly inline = input(false, { transform: booleanAttribute });\n}\n","<kf-icon name=\"shield-check\" size=\"sm\" />\n<kf-text as=\"span\" variant=\"overline-strong\" tone=\"warn\">Vista administrador</kf-text>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg';\n\n/**\n * Indicador de carga indeterminado: inline, dentro de un botón, o como único\n * contenido de una sección mientras llega la data.\n *\n * Cuando se conoce la forma del contenido que viene, preferir `kf-skeleton`\n * (dibuja la silueta). El spinner es para \"algo está pasando\" sin forma\n * conocida — guardar, enviar, reintentar.\n *\n * Lleva `role=\"status\"`, así que el lector de pantalla anuncia el `label`\n * cuando aparece. Sin `label` cae en un texto accesible por defecto.\n *\n * <kf-spinner />\n * <kf-spinner size=\"sm\" label=\"Cargando…\" />\n * <kf-spinner onDark />\n */\n@Component({\n selector: 'kf-spinner',\n templateUrl: './Spinner.html',\n styleUrl: './Spinner.css',\n})\nexport class Spinner {\n readonly size = input<SpinnerSize>('md');\n /** Texto al lado del anillo. Vacío deja solo el anillo (y el texto para lectores). */\n readonly label = input('');\n /** Invierte los colores para fondos oscuros. */\n readonly onDark = input(false, { transform: booleanAttribute });\n}\n","<span class=\"kf-spinner\" [class.kf-spinner--on-dark]=\"onDark()\" role=\"status\">\n <span class=\"kf-spinner__ring\" [class]=\"'kf-spinner__ring--' + size()\"></span>\n @if (label()) {\n <span class=\"kf-spinner__label\">{{ label() }}</span>\n } @else {\n <span class=\"kf-spinner__sr\">Cargando</span>\n }\n</span>\n","import { booleanAttribute, Component, computed, ElementRef, input, viewChild } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Spinner } from '../spinner/Spinner';\n\n/**\n * Envuelve un `<button>` nativo: mantiene teclado, foco y submit de formulario.\n * Como es un elemento personalizado, ningún atributo ARIA puesto en el host\n * llega al `<button>` interno — por eso `disabled`, `type`, `ariaLabel`,\n * `ariaExpanded`, `ariaPressed` y `ariaHaspopup` se reenvían a mano.\n *\n * Seis variantes: `primary`, `secondary`, `ghost`, `outline`, `danger`,\n * `surface`. Tres tamaños (`sm`/`md`/`lg`). `icon` agrega un glifo antes del\n * label proyectado; `block` estira el botón a todo el ancho de su contenedor.\n *\n * `surface` es la variante neutra pensada para flotar SOBRE contenido\n * variable (ej. los controles de `kf-map` sobre un mapa que cambia de tema:\n * calles, satélite, oscuro) — fondo sólido de `--kf-color-surface` con\n * sombra, en vez de depender de contraste contra lo que haya debajo (que\n * `ghost`/`outline`, transparentes, no pueden garantizar ahí).\n *\n * `shape=\"circle\"` vuelve el botón cuadrado con esquina `pill` (mismo ancho\n * y alto, sin padding horizontal extra) — pensado para uso solo-ícono\n * (`icon` sin contenido proyectado): combinarlo con un label visible\n * descentra el ícono, no es el caso de uso.\n *\n * `(click)` no se reenvía: burbujea del botón interno al host solo.\n *\n * Objetivo táctil: el alto y el ancho mínimos del `<button>` interno salen\n * de `--kf-button-min-height` y `--kf-button-min-width` (default `auto`,\n * sin cambio). Un contenedor los sube (ej. a 44px en pantallas táctiles,\n * sobre todo para un botón solo-ícono) declarando las variables en su\n * propio CSS — heredan a través del límite de encapsulación.\n *\n * `focus()` enfoca el `<button>` interno: el consumidor no necesita\n * buscarlo con `querySelector` en el DOM del componente.\n *\n * `loading` reemplaza el contenido proyectado por `kf-spinner` y fuerza\n * `disabled`.\n *\n * Botón solo-ícono (sin label visible): pasar `ariaLabel` en vez de dejar el\n * botón sin nombre accesible.\n *\n * <kf-button (click)=\"save()\">Guardar</kf-button>\n * <kf-button variant=\"danger\" (click)=\"remove()\">Eliminar</kf-button>\n * <kf-button size=\"sm\" icon=\"external-link\" ariaLabel=\"Expandir\" (click)=\"expand()\" />\n * <kf-button type=\"submit\" [loading]=\"submitting()\">Ingresar</kf-button>\n * <kf-button variant=\"surface\" shape=\"circle\" icon=\"plus\" ariaLabel=\"Acercar\" [ariaPressed]=\"false\" />\n */\n@Component({\n selector: 'kf-button',\n imports: [Icon, Spinner],\n templateUrl: './button.html',\n styleUrl: './button.css',\n host: {\n '[attr.block]': \"block() ? '' : null\",\n },\n})\nexport class Button {\n readonly variant = input<'primary' | 'secondary' | 'ghost' | 'outline' | 'danger' | 'surface'>(\n 'primary',\n );\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly shape = input<'rect' | 'circle'>('rect');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Igual al default nativo: hace submit dentro de un `<form>`. */\n readonly type = input<'button' | 'submit' | 'reset'>('submit');\n /** Ícono líder, renderizado con `kf-icon` antes del label proyectado. */\n readonly icon = input<IconName>();\n /** Estira el botón a todo el ancho de su contenedor. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Reemplaza el contenido proyectado por `kf-spinner` y fuerza `disabled`. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Nombre accesible del botón interno — obligatorio quien no proyecta\n * ningún texto visible (botón solo-ícono), porque el host no lo reenvía. */\n readonly ariaLabel = input<string>();\n /** Estado expandido/colapsado para un botón toggle — mismo motivo que\n * `ariaLabel`, el host no reenvía atributos ARIA al `<button>` interno. */\n readonly ariaExpanded = input<boolean>();\n /** Estado presionado/no presionado para un botón toggle real (ej. \"seguir\n * vehículo\" activo/inactivo) — distinto semánticamente de `ariaExpanded`\n * (que es para mostrar/ocultar un panel), mismo motivo de reenvío manual.\n * Con `icon`, presionado (`true`) rellena el glyph (`kf-icon[filled]`) en\n * vez de solo cambiar de color — un toggle solo-ícono necesita esa señal\n * más fuerte para leerse activo, y así ningún consumidor tiene que\n * acordarse de pedirlo aparte. */\n readonly ariaPressed = input<boolean>();\n /** Tipo de elemento emergente que abre el botón (ej. `'dialog'` para un\n * panel de filtros, `'listbox'`) — mismo motivo de reenvío manual. */\n readonly ariaHaspopup = input<'dialog' | 'menu' | 'listbox' | 'true'>();\n\n private readonly nativeButton = viewChild.required<ElementRef<HTMLButtonElement>>('nativeButton');\n\n /** Enfoca el `<button>` interno (mismas opciones que `HTMLElement.focus`). */\n focus(options?: FocusOptions): void {\n this.nativeButton().nativeElement.focus(options);\n }\n\n /** `ghost`/`outline`/`surface` no tienen fondo oscuro sólido — el anillo\n * del spinner por defecto ya se lee bien ahí sin variante propia\n * (`surface` es fondo claro con texto oscuro, mismo motivo que `outline`). */\n protected readonly hasSolidFill = computed(() => {\n const variant = this.variant();\n return variant !== 'ghost' && variant !== 'outline' && variant !== 'surface';\n });\n}\n","<button\n #nativeButton\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-expanded]=\"ariaExpanded() === undefined ? null : ariaExpanded()\"\n [attr.aria-pressed]=\"ariaPressed() === undefined ? null : ariaPressed()\"\n [attr.aria-haspopup]=\"ariaHaspopup() ?? null\"\n [class.kf-button--secondary]=\"variant() === 'secondary'\"\n [class.kf-button--ghost]=\"variant() === 'ghost'\"\n [class.kf-button--outline]=\"variant() === 'outline'\"\n [class.kf-button--danger]=\"variant() === 'danger'\"\n [class.kf-button--surface]=\"variant() === 'surface'\"\n [class.kf-button--circle]=\"shape() === 'circle'\"\n [class.kf-button--sm]=\"size() === 'sm'\"\n [class.kf-button--lg]=\"size() === 'lg'\"\n>\n @if (loading()) {\n <kf-spinner size=\"sm\" [onDark]=\"hasSolidFill()\" />\n } @else {\n @if (icon(); as iconName) {\n <kf-icon\n class=\"kf-button__icon\"\n [name]=\"iconName\"\n [size]=\"size() === 'lg' ? 'md' : 'sm'\"\n [filled]=\"ariaPressed() === true\"\n />\n }\n <ng-content />\n }\n</button>\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type AlertTone = 'info' | 'ok' | 'warn' | 'error';\n\n/** Forma del aviso: `card` (default, con borde y esquinas) o `bar` (franja compacta de ancho completo). */\nexport type AlertVariant = 'card' | 'bar';\n\nconst TONE_ICON: Record<AlertTone, IconName> = {\n info: 'alert-circle',\n ok: 'check-circle',\n warn: 'alert-triangle',\n error: 'alert-octagon',\n};\n\n/**\n * Banner contextual que vive dentro del flujo: validaciones, avisos de\n * vencimiento, confirmaciones. Persiste hasta que se descarta o hasta que la\n * condición que lo causó desaparece — para feedback efímero está el toast.\n *\n * `open` es two-way: el botón de cerrar lo pone en `false` y el componente\n * deja de renderizar. El consumidor puede volver a abrirlo poniéndolo en\n * `true` (ej. cuando la validación falla otra vez).\n *\n * <kf-alert tone=\"warn\" title=\"SOAT por vencer\">Vence el 15/08.</kf-alert>\n * <kf-alert tone=\"ok\" [(open)]=\"saved\" dismissible>Pago registrado.</kf-alert>\n *\n * `variant=\"bar\"` es una franja compacta de ancho completo, sin tarjeta: sin\n * esquinas ni bordes laterales (solo la línea superior e inferior del tono),\n * ícono, título y mensaje en una sola línea que envuelve si no entra. Mismos\n * tonos y mismo `role` (`alert` para `error`/`warn`, `status` para el resto)\n * que la variante `card`. Pensada para el borde de una página o de un panel\n * (ej. \"Estás viendo datos de otro cliente\"), donde una tarjeta con margen\n * sobra.\n *\n * <kf-alert variant=\"bar\" tone=\"warn\" title=\"Modo suplantación\">Viendo como Ana Pérez.</kf-alert>\n */\n@Component({\n selector: 'kf-alert',\n imports: [Icon],\n templateUrl: './Alert.html',\n styleUrl: './Alert.css',\n})\nexport class Alert {\n readonly tone = input<AlertTone>('info');\n /** `card` (default) o `bar` (franja compacta de ancho completo). */\n readonly variant = input<AlertVariant>('card');\n /** Línea en negrita arriba del mensaje. Vacío deja solo el contenido proyectado. */\n readonly title = input('');\n readonly dismissible = input(false, { transform: booleanAttribute });\n /** Visibilidad, two-way: `[(open)]=\"hasError\"`. */\n readonly open = model(true);\n\n /**\n * `alert` interrumpe al lector de pantalla; se reserva para error/warn.\n * Los avisos informativos se anuncian sin cortar lo que se esté leyendo.\n */\n protected readonly ariaRole = computed(() =>\n this.tone() === 'error' || this.tone() === 'warn' ? 'alert' : 'status',\n );\n\n protected readonly toneIcon = computed(() => TONE_ICON[this.tone()]);\n}\n","@if (open()) {\n <div\n class=\"kf-alert\"\n [class]=\"'kf-alert--' + tone()\"\n [class.kf-alert--bar]=\"variant() === 'bar'\"\n [attr.role]=\"ariaRole()\"\n >\n <kf-icon class=\"kf-alert__icon\" [name]=\"toneIcon()\" size=\"sm\" />\n <div class=\"kf-alert__body\">\n @if (title()) {\n <p class=\"kf-alert__title\">{{ title() }}</p>\n }\n <div class=\"kf-alert__message\"><ng-content /></div>\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-alert__close\"\n aria-label=\"Cerrar aviso\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type AlertRowTone = 'warn' | 'error' | 'neutral';\n\n/**\n * Fila clickeable de una lista de pendientes/alertas: ícono circular con\n * tono semántico, texto de una línea, chevron al final. Pensada para\n * agrupar varias dentro de un `kf-card` (ej. \"Tus pendientes\" del\n * dashboard) — no incluye el contenedor en sí.\n *\n * <kf-alert-row icon=\"file\" tone=\"warn\" text=\"2 cotizaciones esperan tu aprobación\" (rowClick)=\"onNavigate('cotizaciones')\" />\n *\n * Extensiones opcionales (la fila sin ellas se ve y se comporta como siempre):\n * - `tone=\"neutral\"`: ícono gris, para una fila sin urgencia ni alerta.\n * - `value`: cifra alineada a la derecha, antes del chevron (ej. el conteo de\n * pendientes). Admite `'—'` cuando no hay dato; en ese caso conviene pasar\n * `valueLabel` con el texto que debe leer un lector de pantalla\n * («Sin datos»), porque la raya sola no dice nada.\n * - `valueLabel`: texto solo para lectores de pantalla que reemplaza a `value`\n * en el árbol de accesibilidad; visualmente se sigue viendo `value`.\n * - `tag`: etiqueta neutra pequeña junto al texto (ej. «Próximamente»).\n * - `disabled`: la fila no es accionable — no emite `rowClick`, no entra en el\n * orden de tabulación, no cambia al pasar el mouse, su chevron se oculta (conserva el\n * espacio para alinear las cifras con las filas activas) y el\n * texto y la cifra se atenúan (sin bajar el contraste de lectura). Expone\n * `disabled` y `aria-disabled=\"true\"`, así que un lector de pantalla la\n * anuncia como no disponible en vez de omitirla.\n *\n * <kf-alert-row icon=\"file\" tone=\"neutral\" text=\"Documentos por firmar\" tag=\"Próximamente\" value=\"—\" valueLabel=\"Sin datos todavía\" disabled />\n */\n@Component({\n selector: 'kf-alert-row',\n imports: [Icon, NgTemplateOutlet],\n templateUrl: './AlertRow.html',\n styleUrl: './AlertRow.css',\n})\nexport class AlertRow {\n readonly icon = input.required<IconName>();\n readonly tone = input<AlertRowTone>('warn');\n readonly text = input.required<string>();\n /** Cifra o texto corto alineado a la derecha (ej. `3`, `'—'`). */\n readonly value = input<string | number>();\n /** Texto solo para lectores de pantalla que reemplaza a `value` en el árbol de accesibilidad. */\n readonly valueLabel = input<string>();\n /** Etiqueta neutra junto al texto (ej. «Próximamente»). */\n readonly tag = input<string>();\n /** La fila no es accionable: sin clic, sin foco ni hover. */\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly rowClick = output<void>();\n\n /** Emite `rowClick` salvo que la fila esté deshabilitada (también ante clics sintéticos). */\n protected activate(): void {\n if (!this.disabled()) {\n this.rowClick.emit();\n }\n }\n\n protected hasValue(): boolean {\n const value = this.value();\n return value !== undefined && value !== null && value !== '';\n }\n}\n","<button\n type=\"button\"\n class=\"kf-alert-row\"\n [class.kf-alert-row--disabled]=\"disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\n (click)=\"activate()\"\n>\n <span class=\"kf-alert-row__icon\" [class]=\"'kf-alert-row__icon--' + tone()\">\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n </span>\n @if (tag()) {\n <span class=\"kf-alert-row__main\">\n <ng-container *ngTemplateOutlet=\"rowText\" />\n <span class=\"kf-alert-row__tag\">{{ tag() }}</span>\n </span>\n } @else {\n <ng-container *ngTemplateOutlet=\"rowText\" />\n }\n @if (hasValue()) {\n @if (valueLabel()) {\n <span class=\"kf-alert-row__value\" aria-hidden=\"true\">{{ value() }}</span>\n <span class=\"kf-sr-only\">{{ valueLabel() }}</span>\n } @else {\n <span class=\"kf-alert-row__value\">{{ value() }}</span>\n }\n }\n <kf-icon class=\"kf-alert-row__chevron\" name=\"chevron-right\" size=\"sm\" />\n</button>\n\n<ng-template #rowText>\n <span class=\"kf-alert-row__text\">{{ text() }}</span>\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, computed, input } from '@angular/core';\n\n/**\n * Avatar de usuario: muestra una foto (`src`) o, si no hay foto, las\n * iniciales (`initials`) sobre un fondo con gradiente de marca. `round`\n * controla la forma: circular (por defecto) o cuadrada con radio.\n *\n * Con `pill`, el avatar se envuelve en una pastilla azul con un chevron a la\n * derecha — la \"pill de usuario (header)\" de la página 18 del design system,\n * usada en la barra de sesión del Portal Header.\n *\n * <kf-avatar initials=\"JD\" />\n * <kf-avatar src=\"https://…/foto.jpg\" [round]=\"false\" />\n * <kf-avatar initials=\"TS\" pill />\n */\n@Component({\n selector: 'kf-avatar',\n imports: [NgTemplateOutlet],\n templateUrl: './Avatar.html',\n styleUrl: './Avatar.css',\n})\nexport class Avatar {\n readonly initials = input<string>();\n readonly src = input<string>();\n readonly round = input(true);\n /** Envuelve el avatar en la pastilla de sesión del header, con chevron. */\n readonly pill = input(false, { transform: booleanAttribute });\n\n /** Limita a 2 caracteres para que quepan cómodos dentro del círculo. */\n readonly displayInitials = computed(() => (this.initials() ?? '').slice(0, 2));\n}\n","<ng-template #avatarCircle>\n <span class=\"kf-avatar\" [class.kf-avatar--square]=\"!round()\">\n @if (src()) {\n <img class=\"kf-avatar__image\" [src]=\"src()\" [alt]=\"initials() || ''\" />\n } @else {\n <span class=\"kf-avatar__initials\">{{ displayInitials() }}</span>\n }\n </span>\n</ng-template>\n\n@if (pill()) {\n <span class=\"kf-avatar-pill\">\n <ng-container [ngTemplateOutlet]=\"avatarCircle\" />\n <span class=\"kf-avatar-pill__caret\" aria-hidden=\"true\"></span>\n </span>\n} @else {\n <ng-container [ngTemplateOutlet]=\"avatarCircle\" />\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Pill chica de fondo suave para un conteo, tag o estado liviano puntual —\n * no un proceso en vivo (para eso, `kf-status-pill`, con borde en vez de\n * relleno). Fondo soft y texto del tono fuerte según `tone`; `service` usa\n * el color base porque `secondary` todavía no tiene variante `-strong`.\n * `variant` es un eje ortogonal a `tone` (mismo patrón que `kf-button`):\n * `soft` (default) es el fondo de color sólido de siempre; `glass` es\n * translúcido con desenfoque, pensado para un badge sobre una superficie\n * de marca (ej. un header navy), no para un banner suelto. En `glass` el\n * punto (`dot`) usa el color BASE de cada tono, no `-strong` — ese último\n * está pensado para texto legible sobre el fondo pastel de `soft` y se ve\n * apagado sobre una superficie translúcida/oscura.\n *\n * `truncate` corta un texto largo con elipsis (ej. un estado de SAP como\n * \"WF Aprobación Política descuento\") en vez de ensanchar la fila que lo\n * contiene: el badge se limita al ancho de su contenedor (`max-width: 100%`,\n * `min-width: 0`) y el punto no se recorta. El texto completo lo pone el\n * consumidor en `title` (el badge no puede leer su propio contenido\n * proyectado para generarlo):\n *\n * <kf-badge tone=\"warn\" dot truncate [title]=\"q.statusLabel\">{{ q.statusLabel }}</kf-badge>\n */\n@Component({\n selector: 'kf-badge',\n templateUrl: './Badge.html',\n styleUrl: './Badge.css',\n host: {\n '[class.kf-badge-host--truncate]': 'truncate()',\n },\n})\nexport class Badge {\n readonly tone = input<'neutral' | 'ok' | 'warn' | 'error' | 'info' | 'service'>('neutral');\n readonly variant = input<'soft' | 'glass'>('soft');\n readonly dot = input(false, { transform: booleanAttribute });\n /** Corta el texto con elipsis al ancho del contenedor. Ver JSDoc de la clase. */\n readonly truncate = input(false, { transform: booleanAttribute });\n}\n","<span\n class=\"kf-badge\"\n [class]=\"'kf-badge--' + tone()\"\n [class.kf-badge--glass]=\"variant() === 'glass'\"\n>\n @if (dot()) {\n <span class=\"kf-badge__dot\"></span>\n }\n <!-- `display: contents` salvo con `truncate`: sin truncar, el contenido\n proyectado sigue siendo hijo directo del flex (mismo `gap` de siempre). -->\n <span class=\"kf-badge__label\"><ng-content /></span>\n</span>\n","import { Component, computed, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport interface BreadcrumbItem {\n label: string;\n /** Destino del link. Sin `href` el nivel se rinde como texto plano. */\n href?: string;\n}\n\n/**\n * Ruta de navegación de las vistas internas. El último nivel es la página\n * actual: nunca es link y lleva `aria-current=\"page\"`, aunque traiga `href`.\n *\n * Se rinde como `<nav><ol>` — es una lista ordenada de ancestros, y eso es lo\n * que los lectores de pantalla anuncian (\"navegación, lista de 3 elementos\").\n *\n * Para apps con router: escuchar `itemClick` y llamar\n * `event.preventDefault()` antes de `router.navigate(...)`. El `href` se\n * mantiene igual para que click-medio, \"abrir en pestaña nueva\" y el hover\n * de la barra de estado sigan funcionando.\n *\n * <kf-breadcrumb [items]=\"[{ label: 'Inicio', href: '/' }, { label: 'Mis vehículos' }]\" />\n */\n@Component({\n selector: 'kf-breadcrumb',\n imports: [Icon],\n templateUrl: './Breadcrumb.html',\n styleUrl: './Breadcrumb.css',\n})\nexport class Breadcrumb {\n readonly items = input.required<BreadcrumbItem[]>();\n\n /**\n * Click en un nivel con `href`. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa. No se depende\n * de `@angular/router` acá — sería un peer dep nuevo en la librería para\n * lo que el consumidor resuelve en una línea.\n */\n readonly itemClick = output<{ item: BreadcrumbItem; index: number; event: MouseEvent }>();\n\n protected readonly lastIndex = computed(() => this.items().length - 1);\n}\n","<nav class=\"kf-breadcrumb\" aria-label=\"Ruta de navegación\">\n <ol class=\"kf-breadcrumb__list\">\n @for (item of items(); track $index; let i = $index) {\n <li class=\"kf-breadcrumb__item\">\n @if (i > 0) {\n <kf-icon class=\"kf-breadcrumb__separator\" name=\"chevron-right\" size=\"sm\" />\n }\n @if (item.href && i !== lastIndex()) {\n <a\n class=\"kf-breadcrumb__link\"\n [href]=\"item.href\"\n (click)=\"itemClick.emit({ item, index: i, event: $event })\"\n >\n {{ item.label }}\n </a>\n } @else {\n <span\n class=\"kf-breadcrumb__current\"\n [attr.aria-current]=\"i === lastIndex() ? 'page' : null\"\n >\n {{ item.label }}\n </span>\n }\n </li>\n }\n </ol>\n</nav>\n","import { Component, computed, input } from '@angular/core';\n\n/**\n * Una categoría de la barra — el componente no sabe qué significa \"pagada\"\n * o \"vencida\", solo dibuja proporciones: `count` decide el ancho relativo\n * del segmento (`flex-grow`) y de la fila de leyenda que lo acompaña.\n * `color` es cualquier valor CSS válido (pensado para tokens `var(--kf-*)`,\n * nunca hex suelto desde el consumidor).\n */\nexport interface BucketProgressItem {\n key: string;\n label: string;\n count: number;\n color: string;\n}\n\n/**\n * Barra de progreso segmentada en categorías proporcionales — generaliza\n * el resumen de \"Progreso del plan de pagos\" de Pagos y Facturas de OTD\n * (cuotas pagadas/vencidas/próximas/pendientes) sin acoplarse a esas 4\n * categorías puntuales: el consumidor pasa sus propios `items` con\n * `{key, label, count, color}`.\n *\n * Los segmentos son proporcionales por CANTIDAD (`flex-grow: count`), no\n * uno por unidad — con 36 cuotas y 6 pagadas, la barra dibuja 2 anchos\n * distintos (pagado ~17% / resto ~83%), nunca 36 rectángulos idénticos\n * (hallazgo real de UX: con volumen alto, un segmento por unidad se vuelve\n * ilegible). Los `items` con `count: 0` no se dibujan (ni segmento ni\n * fila de leyenda) — no tiene sentido mostrar una categoría vacía.\n *\n * La leyenda debajo reproduce el mismo orden y color que la barra, para\n * que una categoría se pueda mapear a su cantidad de un vistazo (pedido\n * explícito de UX: \"posicionar correctamente los labels\").\n *\n * <kf-bucket-progress\n * title=\"Progreso del plan de pagos\"\n * [summary]=\"'6 de 30 cuotas pagadas'\"\n * [items]=\"[\n * { key: 'paid', label: 'pagadas', count: 6, color: 'var(--kf-color-success)' },\n * { key: 'overdue', label: 'vencidas', count: 2, color: 'var(--kf-color-error)' },\n * { key: 'upcoming', label: 'próxima', count: 1, color: 'var(--kf-color-warning)' },\n * { key: 'pending', label: 'pendientes', count: 21, color: 'var(--kf-color-gray-200)' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-bucket-progress',\n templateUrl: './BucketProgress.html',\n styleUrl: './BucketProgress.css',\n})\nexport class BucketProgress {\n readonly title = input.required<string>();\n /** Texto libre a la derecha del título (ej. \"6 de 30 cuotas pagadas\") —\n * el componente no sabe calcular ese resumen, lo recibe hecho. */\n readonly summary = input<string>('');\n readonly items = input.required<BucketProgressItem[]>();\n\n protected readonly visibleItems = computed(() => this.items().filter((item) => item.count > 0));\n\n protected readonly total = computed(() =>\n this.items().reduce((sum, item) => sum + item.count, 0),\n );\n\n /** Descripción accesible de la barra completa — un solo `role=\"img\"`\n * con el desglose en texto, en vez de que cada segmento individual\n * compita por foco/lectura de screen reader. */\n protected readonly ariaLabel = computed(() =>\n this.visibleItems()\n .map((item) => `${item.count} ${item.label}`)\n .concat(`de ${this.total()} en total`)\n .join(', '),\n );\n}\n","<div class=\"kf-bucket-progress__head\">\n <span class=\"kf-bucket-progress__title\">{{ title() }}</span>\n @if (summary()) {\n <span class=\"kf-bucket-progress__summary\">{{ summary() }}</span>\n }\n</div>\n\n<div class=\"kf-bucket-progress__bar\" role=\"img\" [attr.aria-label]=\"ariaLabel()\">\n @for (item of visibleItems(); track item.key) {\n <span\n class=\"kf-bucket-progress__segment\"\n [style.flex-grow]=\"item.count\"\n [style.background]=\"item.color\"\n ></span>\n }\n</div>\n\n<div class=\"kf-bucket-progress__legend\">\n @for (item of visibleItems(); track item.key) {\n <span class=\"kf-bucket-progress__legend-item\">\n <span class=\"kf-bucket-progress__dot\" [style.background]=\"item.color\"></span>\n {{ item.count }} {{ item.label }}\n </span>\n }\n</div>\n","import {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { Button } from '../button/button';\nimport { Text } from '../text/Text';\n\n/** Una celda ya resuelta de la grilla del mes. */\nexport interface CalendarDay {\n /** ISO date, `YYYY-MM-DD`. */\n iso: string;\n day: number;\n inMonth: boolean;\n selectable: boolean;\n selected: boolean;\n marked: boolean;\n today: boolean;\n ariaLabel: string;\n}\n\nconst DEFAULT_MONTH_NAMES: readonly string[] = [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n];\nconst DEFAULT_WEEKDAY_LABELS: readonly string[] = ['L', 'M', 'M', 'J', 'V', 'S', 'D'];\nconst DEFAULT_WEEKDAY_NAMES: readonly string[] = [\n 'lunes',\n 'martes',\n 'miércoles',\n 'jueves',\n 'viernes',\n 'sábado',\n 'domingo',\n];\n\n/**\n * Selector de fecha de un solo mes, con grilla semanal que parte en lunes.\n *\n * Las fechas viajan como strings ISO (`YYYY-MM-DD`, y `YYYY-MM` para el mes\n * visible) y se calculan en UTC, así la zona horaria del navegador nunca\n * corre una fecha un día.\n *\n * `availableDates` en `null` deja seleccionable toda fecha dentro de\n * `min`/`max`; un arreglo deja seleccionables SOLO esas fechas (el resto se\n * rinde deshabilitado). `markedDates` es independiente: agrega un punto\n * marcador sin afectar si la fecha se puede elegir.\n *\n * Patrón WAI-ARIA `grid` con roving tabindex: las flechas mueven por\n * día/semana, Home/End van al inicio/fin de la semana y PageUp/PageDown\n * cambian de mes; el foco cruza los límites del mes.\n *\n * <kf-calendar\n * [(value)]=\"date\"\n * [(month)]=\"month\"\n * [min]=\"today\"\n * [availableDates]=\"freeDates()\"\n * [markedDates]=\"eventDates()\"\n * [loading]=\"loadingAvailability()\"\n * >\n * <p footer>Leyenda</p>\n * </kf-calendar>\n */\n@Component({\n selector: 'kf-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Button, Text],\n templateUrl: './Calendar.html',\n styleUrl: './Calendar.css',\n})\nexport class Calendar {\n private static nextId = 0;\n\n /** Fecha seleccionada, ISO `YYYY-MM-DD`. */\n readonly value = model<string | null>(null);\n /** Mes visible, `YYYY-MM`. En `null` se deriva de `value` y, si no hay, de hoy. */\n readonly month = model<string | null>(null);\n /** Fecha mínima seleccionable (inclusive), ISO. */\n readonly min = input<string | null>(null);\n /** Fecha máxima seleccionable (inclusive), ISO. */\n readonly max = input<string | null>(null);\n /** `null`: toda fecha dentro de `min`/`max` es seleccionable. Arreglo: solo esas fechas. */\n readonly availableDates = input<readonly string[] | null>(null);\n /** Fechas con punto marcador, independiente de si son seleccionables. */\n readonly markedDates = input<readonly string[]>([]);\n /** Reemplaza el \"hoy\" local (tests/SSR), ISO. */\n readonly today = input<string | null>(null);\n /** Atenúa la grilla y bloquea la selección mientras carga la disponibilidad. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('Calendario');\n /** Los 12 nombres de mes, partiendo en enero. */\n readonly monthNames = input<readonly string[]>(DEFAULT_MONTH_NAMES);\n /** Las 7 iniciales visibles de los días, partiendo en lunes. */\n readonly weekdayLabels = input<readonly string[]>(DEFAULT_WEEKDAY_LABELS);\n /** Los 7 nombres completos de los días, partiendo en lunes — se usan en los nombres accesibles. */\n readonly weekdayNames = input<readonly string[]>(DEFAULT_WEEKDAY_NAMES);\n /** Se agrega al nombre accesible de una fecha marcada. */\n readonly markedLabel = input<string>('marcado');\n readonly previousMonthLabel = input<string>('Mes anterior');\n readonly nextMonthLabel = input<string>('Mes siguiente');\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly injector = inject(Injector);\n private readonly focusedDate = signal<string | null>(null);\n\n protected readonly titleId = `kf-calendar-title-${Calendar.nextId++}`;\n\n protected readonly todayIso = computed(() => this.today() ?? localTodayIso());\n\n protected readonly displayedMonth = computed(\n () => this.month() ?? this.value()?.slice(0, 7) ?? this.todayIso().slice(0, 7),\n );\n\n protected readonly title = computed(() => {\n const [year, month] = parseParts(this.displayedMonth());\n return `${this.monthNames()[month - 1]} ${year}`;\n });\n\n private readonly minMonth = computed(() => this.min()?.slice(0, 7) ?? null);\n private readonly maxMonth = computed(() => this.max()?.slice(0, 7) ?? null);\n\n protected readonly canGoPrevious = computed(() =>\n this.isMonthNavigable(shiftMonth(this.displayedMonth(), -1)),\n );\n protected readonly canGoNext = computed(() =>\n this.isMonthNavigable(shiftMonth(this.displayedMonth(), 1)),\n );\n\n private readonly availableSet = computed(() => {\n const dates = this.availableDates();\n return dates ? new Set(dates) : null;\n });\n private readonly markedSet = computed(() => new Set(this.markedDates()));\n\n protected readonly weeks = computed<CalendarDay[][]>(() => {\n const month = this.displayedMonth();\n const firstDay = `${month}-01`;\n const lastDay = addDays(`${shiftMonth(month, 1)}-01`, -1);\n const start = addDays(firstDay, -weekdayIndex(firstDay));\n const end = addDays(lastDay, 6 - weekdayIndex(lastDay));\n\n const weeks: CalendarDay[][] = [];\n let week: CalendarDay[] = [];\n for (let iso = start; iso <= end; iso = addDays(iso, 1)) {\n week.push(this.buildDay(iso, month));\n if (week.length === 7) {\n weeks.push(week);\n week = [];\n }\n }\n return weeks;\n });\n\n /** La única celda con `tabindex=\"0\"` (roving tabindex). */\n protected readonly activeDate = computed(() => {\n const month = this.displayedMonth();\n const inMonth = (iso: string | null): iso is string => iso?.slice(0, 7) === month;\n const focused = this.focusedDate();\n if (inMonth(focused)) {\n return focused;\n }\n const value = this.value();\n if (inMonth(value)) {\n return value;\n }\n const today = this.todayIso();\n if (inMonth(today)) {\n return today;\n }\n const firstSelectable = this.weeks()\n .flat()\n .find((day) => day.selectable);\n return firstSelectable?.iso ?? `${month}-01`;\n });\n\n previousMonth(): void {\n if (this.canGoPrevious()) {\n this.month.set(shiftMonth(this.displayedMonth(), -1));\n }\n }\n\n nextMonth(): void {\n if (this.canGoNext()) {\n this.month.set(shiftMonth(this.displayedMonth(), 1));\n }\n }\n\n protected selectDay(day: CalendarDay): void {\n if (!day.selectable || this.loading()) {\n return;\n }\n this.focusedDate.set(day.iso);\n if (day.iso !== this.value()) {\n this.value.set(day.iso);\n }\n }\n\n protected onDayFocus(iso: string): void {\n this.focusedDate.set(iso);\n }\n\n protected onDayKeydown(event: KeyboardEvent, iso: string): void {\n const target = keyboardTarget(event.key, iso);\n if (target === null) {\n return;\n }\n event.preventDefault();\n\n const targetMonth = target.slice(0, 7);\n if (!this.isMonthNavigable(targetMonth)) {\n return;\n }\n this.focusedDate.set(target);\n if (targetMonth !== this.displayedMonth()) {\n this.month.set(targetMonth);\n }\n // Si cambió el mes, la celda destino todavía no existe en el DOM.\n afterNextRender(() => this.focusDay(target), { injector: this.injector });\n }\n\n private focusDay(iso: string): void {\n this.host.nativeElement.querySelector<HTMLElement>(`[data-date=\"${iso}\"]`)?.focus();\n }\n\n private isMonthNavigable(month: string): boolean {\n const min = this.minMonth();\n const max = this.maxMonth();\n return (min === null || month >= min) && (max === null || month <= max);\n }\n\n private buildDay(iso: string, displayedMonth: string): CalendarDay {\n const [year, month, day] = parseParts(iso);\n const inMonth = iso.slice(0, 7) === displayedMonth;\n const min = this.min();\n const max = this.max();\n const available = this.availableSet();\n const marked = this.markedSet().has(iso);\n\n const weekdayName = this.weekdayNames()[weekdayIndex(iso)];\n const monthName = this.monthNames()[month - 1].toLowerCase();\n const baseLabel = `${weekdayName} ${day} de ${monthName} de ${year}`;\n\n return {\n iso,\n day,\n inMonth,\n selectable:\n inMonth &&\n (min === null || iso >= min) &&\n (max === null || iso <= max) &&\n (available === null || available.has(iso)),\n selected: iso === this.value(),\n marked,\n today: iso === this.todayIso(),\n ariaLabel: marked ? `${baseLabel}, ${this.markedLabel()}` : baseLabel,\n };\n }\n}\n\nfunction pad(value: number): string {\n return String(value).padStart(2, '0');\n}\n\nfunction parseParts(iso: string): number[] {\n return iso.split('-').map(Number);\n}\n\nfunction fromUtc(date: Date): string {\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nfunction localTodayIso(): string {\n const now = new Date();\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n}\n\nfunction addDays(iso: string, days: number): string {\n const [year, month, day] = parseParts(iso);\n return fromUtc(new Date(Date.UTC(year, month - 1, day + days)));\n}\n\n/** 0 = lunes … 6 = domingo. */\nfunction weekdayIndex(iso: string): number {\n const [year, month, day] = parseParts(iso);\n return (new Date(Date.UTC(year, month - 1, day)).getUTCDay() + 6) % 7;\n}\n\nfunction shiftMonth(yearMonth: string, delta: number): string {\n const [year, month] = parseParts(yearMonth);\n const date = new Date(Date.UTC(year, month - 1 + delta, 1));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}`;\n}\n\n/** Mismo día en otro mes, acotado al último día de ese mes. */\nfunction shiftDateByMonths(iso: string, delta: number): string {\n const targetMonth = shiftMonth(iso.slice(0, 7), delta);\n const lastDay = parseParts(addDays(`${shiftMonth(targetMonth, 1)}-01`, -1))[2];\n const day = Math.min(parseParts(iso)[2], lastDay);\n return `${targetMonth}-${pad(day)}`;\n}\n\nfunction keyboardTarget(key: string, iso: string): string | null {\n switch (key) {\n case 'ArrowLeft':\n return addDays(iso, -1);\n case 'ArrowRight':\n return addDays(iso, 1);\n case 'ArrowUp':\n return addDays(iso, -7);\n case 'ArrowDown':\n return addDays(iso, 7);\n case 'Home':\n return addDays(iso, -weekdayIndex(iso));\n case 'End':\n return addDays(iso, 6 - weekdayIndex(iso));\n case 'PageUp':\n return shiftDateByMonths(iso, -1);\n case 'PageDown':\n return shiftDateByMonths(iso, 1);\n default:\n return null;\n }\n}\n","<div class=\"kf-calendar\" role=\"group\" [attr.aria-label]=\"ariaLabel()\">\n <div class=\"kf-calendar__header\">\n <kf-button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"lg\"\n type=\"button\"\n icon=\"chevron-left\"\n [ariaLabel]=\"previousMonthLabel()\"\n [disabled]=\"!canGoPrevious()\"\n (click)=\"previousMonth()\"\n />\n <kf-text\n class=\"kf-calendar__title\"\n as=\"span\"\n variant=\"title-sm\"\n aria-live=\"polite\"\n [attr.id]=\"titleId\"\n >{{ title() }}</kf-text\n >\n <kf-button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"lg\"\n type=\"button\"\n icon=\"chevron-right\"\n [ariaLabel]=\"nextMonthLabel()\"\n [disabled]=\"!canGoNext()\"\n (click)=\"nextMonth()\"\n />\n </div>\n\n <div\n class=\"kf-calendar__grid\"\n role=\"grid\"\n [class.kf-calendar__grid--loading]=\"loading()\"\n [attr.aria-labelledby]=\"titleId\"\n [attr.aria-busy]=\"loading() || null\"\n >\n <div class=\"kf-calendar__row\" role=\"row\">\n @for (label of weekdayLabels(); track $index) {\n <span\n class=\"kf-calendar__weekday kf-overline-text\"\n role=\"columnheader\"\n [attr.aria-label]=\"weekdayNames()[$index]\"\n >{{ label }}</span\n >\n }\n </div>\n\n @for (week of weeks(); track week[0].iso) {\n <div class=\"kf-calendar__row\" role=\"row\">\n @for (day of week; track day.iso) {\n @if (day.inMonth) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"kf-calendar__day\"\n [class.kf-calendar__day--selectable]=\"day.selectable\"\n [class.kf-calendar__day--selected]=\"day.selected\"\n [class.kf-calendar__day--today]=\"day.today\"\n [class.kf-calendar__day--marked]=\"day.marked\"\n [attr.data-date]=\"day.iso\"\n [attr.aria-label]=\"day.ariaLabel\"\n [attr.aria-selected]=\"day.selected\"\n [attr.aria-disabled]=\"!day.selectable\"\n [attr.aria-current]=\"day.today ? 'date' : null\"\n [attr.tabindex]=\"day.iso === activeDate() ? 0 : -1\"\n (click)=\"selectDay(day)\"\n (focus)=\"onDayFocus(day.iso)\"\n (keydown)=\"onDayKeydown($event, day.iso)\"\n >\n {{ day.day }}\n </button>\n } @else {\n <span role=\"gridcell\" class=\"kf-calendar__day kf-calendar__day--outside\">\n <span aria-hidden=\"true\">{{ day.day }}</span>\n </span>\n }\n }\n </div>\n }\n </div>\n\n <ng-content select=\"[footer]\" />\n</div>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Contenedor base con esquinas redondeadas y sombra sutil — la base visual\n * de paneles, tarjetas de métrica, tablas y bloques de contenido de todo el\n * portal (ver página 14 del design system).\n *\n * Piensa este componente como el \"cimiento\": no impone estructura interna\n * más allá de dos slots opcionales alrededor del contenido libre —\n * `[media]` para una imagen/ícono destacado arriba, y `[actions]` para una\n * fila de botones al pie, separada por una línea. El contenido por defecto\n * (sin selector) queda en el medio, sin ningún layout forzado, para que\n * cualquier composición (una métrica, una lista, un formulario) pueda vivir\n * dentro sin pelear con estilos propios del `Card`.\n *\n * `gap` controla el espacio entre los hijos directos del cuerpo — `md`\n * (default) separa bloques con peso propio (un `kf-section-header`\n * seguido de datos, por ejemplo); `xs`/`sm` para texto corrido o bloques\n * más compactos, `lg`/`xl` para composiciones con más aire entre secciones.\n *\n * <kf-card>\n * <kf-section-header title=\"Cliente\" />\n * <dl>…</dl>\n * </kf-card>\n * <kf-card gap=\"xs\">Texto corrido, sin bloques que separar</kf-card>\n * <kf-card flush>Sin sombra — para superficies ya delimitadas por otra card</kf-card>\n * <kf-card>\n * <img kf-card-media src=\"...\" alt=\"\" />\n * <h3>Título</h3>\n * <p>Descripción</p>\n * <div kf-card-actions>\n * <kf-button variant=\"ghost\">Cancelar</kf-button>\n * <kf-button>Guardar</kf-button>\n * </div>\n * </kf-card>\n *\n * `loading` (default `false`): cubre el cuerpo con un bloque de carga animado\n * sin sacar el contenido del layout (queda invisible y fuera del foco y de\n * lectores de pantalla), así la card conserva exactamente sus dimensiones. Los\n * slots `[kf-card-media]` y `[kf-card-actions]` también se ocultan. Marca el\n * host con `aria-busy=\"true\"`. Para una forma más fiel (líneas separadas) usa\n * `kf-skeleton` dentro de la card, o la card propia del dominio con su\n * `loading` (`kf-stat-card`, `kf-metric-card`).\n *\n * <kf-card [loading]=\"isLoading()\"><h3>{{ title() }}</h3><p>{{ text() }}</p></kf-card>\n */\n@Component({\n selector: 'kf-card',\n templateUrl: './Card.html',\n styleUrl: './Card.css',\n host: {\n '[class.kf-card--flush]': 'flush()',\n '[class.kf-card--loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n '[class.kf-card--gap-xs]': \"gap() === 'xs'\",\n '[class.kf-card--gap-sm]': \"gap() === 'sm'\",\n '[class.kf-card--gap-md]': \"gap() === 'md'\",\n '[class.kf-card--gap-lg]': \"gap() === 'lg'\",\n '[class.kf-card--gap-xl]': \"gap() === 'xl'\",\n },\n})\nexport class Card {\n /** Quita la sombra — para cards anidadas dentro de otra superficie ya elevada. */\n readonly flush = input(false, { transform: booleanAttribute });\n /** Espacio entre los hijos directos del cuerpo. `md` es el default. */\n readonly gap = input<'xs' | 'sm' | 'md' | 'lg' | 'xl'>('md');\n /** Cubre el cuerpo con un bloque de carga conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","<ng-content select=\"[kf-card-media]\" />\n<div\n class=\"kf-card__body\"\n [class.kf-card__body--loading]=\"loading()\"\n [class.kf-bone-overlay]=\"loading()\"\n>\n <ng-content />\n</div>\n<ng-content select=\"[kf-card-actions]\" />\n","import { Component } from '@angular/core';\n\n/**\n * Slide individual de un `kf-carousel`. Es un contenedor mínimo: solo existe\n * para que el carrusel pueda detectar, vía `contentChildren`, cuántos slides\n * se proyectaron y en qué orden — el contenido real es responsabilidad total\n * de quien lo consume.\n *\n * <kf-carousel-slide>...</kf-carousel-slide>\n */\n@Component({\n selector: 'kf-carousel-slide',\n template: `<ng-content />`,\n styleUrl: './CarouselSlide.css',\n})\nexport class CarouselSlide {}\n","import {\n AfterContentInit,\n Component,\n DestroyRef,\n contentChildren,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n} from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { CarouselSlide } from './CarouselSlide';\n\n/**\n * Carrusel de slides con flechas, dots y autoplay opcional.\n *\n * La spec original de React recibe `slides` como un array de nodos React.\n * En Angular eso no tiene equivalente directo: en vez de forzar un array de\n * datos crudos, cada slide se proyecta como contenido declarativo mediante\n * un `kf-carousel-slide` hijo, y el carrusel los detecta con\n * `contentChildren(CarouselSlide)`. Esto evita depender de un renderer de\n * nodos y deja que cada slide use plantillas Angular normales (bindings,\n * `@if`, `@for`, etc.) tal como se espera en este ecosistema.\n *\n * <kf-carousel [autoplay]=\"true\" [interval]=\"4000\" (indexChange)=\"onIndex($event)\">\n * <kf-carousel-slide>...</kf-carousel-slide>\n * <kf-carousel-slide>...</kf-carousel-slide>\n * </kf-carousel>\n */\n@Component({\n selector: 'kf-carousel',\n imports: [Icon],\n templateUrl: './Carousel.html',\n styleUrl: './Carousel.css',\n})\nexport class Carousel implements AfterContentInit {\n readonly autoplay = input(false);\n readonly interval = input(5000, { transform: numberAttribute });\n readonly indexChange = output<number>();\n\n readonly slides = contentChildren(CarouselSlide);\n\n private readonly activeIndexSignal = signal(0);\n readonly activeIndex = this.activeIndexSignal.asReadonly();\n\n private readonly destroyRef = inject(DestroyRef);\n private timer: ReturnType<typeof setInterval> | null = null;\n private autoplayPaused = false;\n\n ngAfterContentInit(): void {\n this.startAutoplay();\n this.destroyRef.onDestroy(() => this.stopAutoplay());\n }\n\n next(): void {\n const total = this.slides().length;\n if (total === 0) {\n return;\n }\n this.goTo((this.activeIndexSignal() + 1) % total);\n }\n\n previous(): void {\n const total = this.slides().length;\n if (total === 0) {\n return;\n }\n this.goTo((this.activeIndexSignal() - 1 + total) % total);\n }\n\n goTo(index: number): void {\n if (index === this.activeIndexSignal()) {\n return;\n }\n this.activeIndexSignal.set(index);\n this.indexChange.emit(index);\n }\n\n pauseAutoplay(): void {\n this.autoplayPaused = true;\n }\n\n resumeAutoplay(): void {\n this.autoplayPaused = false;\n }\n\n private startAutoplay(): void {\n if (!this.autoplay() || this.slides().length <= 1) {\n return;\n }\n this.timer = setInterval(() => {\n if (!this.autoplayPaused) {\n this.next();\n }\n }, this.interval());\n }\n\n private stopAutoplay(): void {\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","<div\n class=\"kf-carousel\"\n (mouseenter)=\"pauseAutoplay()\"\n (mouseleave)=\"resumeAutoplay()\"\n (focusin)=\"pauseAutoplay()\"\n (focusout)=\"resumeAutoplay()\"\n>\n <div class=\"kf-carousel__viewport\">\n <div class=\"kf-carousel__track\" [style.transform]=\"'translateX(-' + activeIndex() * 100 + '%)'\">\n <ng-content />\n </div>\n </div>\n\n @if (slides().length > 1) {\n <div class=\"kf-carousel__controls\">\n <div class=\"kf-carousel__dots\" role=\"tablist\">\n @for (slide of slides(); track slide; let i = $index) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-carousel__dot\"\n [class.kf-carousel__dot--active]=\"i === activeIndex()\"\n [attr.aria-selected]=\"i === activeIndex()\"\n [attr.aria-label]=\"'Ir al slide ' + (i + 1)\"\n (click)=\"goTo(i)\"\n ></button>\n }\n </div>\n <button\n type=\"button\"\n class=\"kf-carousel__arrow\"\n aria-label=\"Slide anterior\"\n (click)=\"previous()\"\n >\n <kf-icon name=\"chevron-left\" size=\"sm\" />\n </button>\n <button\n type=\"button\"\n class=\"kf-carousel__arrow\"\n aria-label=\"Slide siguiente\"\n (click)=\"next()\"\n >\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </button>\n </div>\n }\n</div>\n","import {\n booleanAttribute,\n Component,\n effect,\n ElementRef,\n forwardRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/**\n * Checkbox accesible con soporte de estado \"indeterminate\".\n *\n * `indeterminate` no existe como atributo HTML: el navegador solo lo expone\n * como propiedad del elemento nativo, así que se aplica a mano sobre el\n * `<input>` interno vía `viewChild` + `effect` cada vez que cambia el input.\n *\n * Implementa `ControlValueAccessor` para poder usarse con `formControlName` /\n * `ngModel` igual que un checkbox nativo. En ese modo, `writeValue` controla\n * el DOM directamente y el input `checked` (pensado para binding manual sin\n * forms) queda en su valor por defecto — igual que `disabled` combina el\n * input signal con `setDisabledState` en el resto de la librería.\n *\n * `invalid` pinta el recuadro en rojo y setea `aria-invalid` en el `<input>`\n * nativo — mismo mecanismo que `Input.invalid`, para el caso típico de un\n * checkbox obligatorio (ej. \"Acepto términos y condiciones\") sin marcar.\n *\n * <kf-checkbox label=\"Aceptar términos\" [(checked)]=\"accepted\" />\n * <kf-checkbox label=\"Seleccionar todo\" [indeterminate]=\"isPartial()\" />\n * <kf-checkbox label=\"Notificaciones\" formControlName=\"notifications\" />\n * <kf-checkbox label=\"Acepto los términos y condiciones\" [invalid]=\"submitted() && !accepted()\" />\n */\n@Component({\n selector: 'kf-checkbox',\n templateUrl: './Checkbox.html',\n styleUrl: './Checkbox.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Checkbox),\n multi: true,\n },\n ],\n})\nexport class Checkbox implements ControlValueAccessor {\n readonly label = input<string>();\n readonly checked = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly indeterminate = input(false, { transform: booleanAttribute });\n /** Recuadro en rojo + aria-invalid — ej. checkbox obligatorio sin marcar. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n readonly checkedChange = output<boolean>();\n\n private readonly inputRef = viewChild.required<ElementRef<HTMLInputElement>>('inputRef');\n\n /** Callbacks registrados por Forms; no-op hasta que registerOnChange/Touched las reemplacen. */\n private onChangeFn: (value: boolean) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n constructor() {\n // El estado \"indeterminate\" no tiene atributo HTML: hay que empujarlo\n // como propiedad DOM cada vez que cambia el input, incluyendo el\n // valor inicial del primer render.\n effect(() => {\n this.inputRef().nativeElement.indeterminate = this.indeterminate();\n });\n }\n\n onChange(event: Event): void {\n const value = (event.target as HTMLInputElement).checked;\n this.checkedChange.emit(value);\n this.onChangeFn(value);\n }\n\n onTouched(): void {\n this.onTouchedFn();\n }\n\n writeValue(value: boolean): void {\n this.inputRef().nativeElement.checked = !!value;\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState?(isDisabled: boolean): void {\n this.inputRef().nativeElement.disabled = isDisabled;\n }\n}\n","<label class=\"kf-checkbox\" [class.kf-checkbox--disabled]=\"disabled()\">\n <input\n #inputRef\n type=\"checkbox\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n (change)=\"onChange($event)\"\n (blur)=\"onTouched()\"\n />\n <span\n class=\"kf-checkbox__box kf-checkbox-box\"\n [class.kf-checkbox__box--invalid]=\"invalid()\"\n ></span>\n @if (label()) {\n <span class=\"kf-checkbox__label\">{{ label() }}</span>\n }\n</label>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Chip de fondo suave con un punto líder que indica estado. Pensado\n * principalmente para celdas de tabla (estado de fila), pero utilizable\n * en cualquier lugar donde se necesite una etiqueta de estado compacta.\n *\n * <kf-chip tone=\"warn\">Pendiente</kf-chip>\n * <kf-chip tone=\"ok\">Aprobado</kf-chip>\n * <kf-chip [dot]=\"false\">4 Unidades</kf-chip>\n *\n * `dot` (default `true`) oculta el punto cuando el chip muestra un DATO\n * (ej. una cantidad — \"4 Unidades\") y no un ESTADO — antes forzaba a cada\n * portal a reimplementar el mismo patrón \"pill con ícono + texto sin punto\n * de estado\" a mano (visto 2-3 veces idéntico en `web-otd-frontend`:\n * `quotes-grid.html`/`quote-detail.html` para el conteo de unidades).\n *\n * Nota: la spec original define la unión de tonos como \"ok\" | \"warn\" |\n * \"error\" | \"neutral\". Internamente se mapean a los tokens semánticos de\n * projects/ui/src/tokens/base.css: ok -> success, warn -> warning,\n * error -> error, neutral -> surface/border/text-muted (no existe un\n * token \"neutral\" dedicado en base.css, así que se arma con los tokens\n * de superficie/borde/texto-muted más cercanos).\n */\n@Component({\n selector: 'kf-chip',\n templateUrl: './Chip.html',\n styleUrl: './Chip.css',\n host: {\n '[class.kf-chip--ok]': \"tone() === 'ok'\",\n '[class.kf-chip--warn]': \"tone() === 'warn'\",\n '[class.kf-chip--error]': \"tone() === 'error'\",\n '[class.kf-chip--neutral]': \"tone() === 'neutral'\",\n },\n})\nexport class Chip {\n readonly tone = input<'ok' | 'warn' | 'error' | 'neutral'>('neutral');\n readonly dot = input(true, { transform: booleanAttribute });\n}\n","@if (dot()) {\n <span\n class=\"kf-chip__dot\"\n [class.kf-chip__dot--ok]=\"tone() === 'ok'\"\n [class.kf-chip__dot--warn]=\"tone() === 'warn'\"\n [class.kf-chip__dot--error]=\"tone() === 'error'\"\n [class.kf-chip__dot--neutral]=\"tone() === 'neutral'\"\n ></span>\n}\n<span class=\"kf-chip__label\"><ng-content /></span>\n","import { Component, input, model } from '@angular/core';\n\nlet nextId = 0;\n\n/**\n * Bloque colapsable genérico: un header clickeable (título + chevron) que\n * expande/colapsa contenido proyectado libre, sin saber nada de lo que hay\n * adentro. Building block para layouts responsive donde un bloque se\n * muestra inline en desktop pero se colapsa en mobile/tablet para ahorrar\n * espacio vertical — el primer caso de uso real es un panel de filtros de\n * tabla que en desktop queda siempre abierto y en mobile arranca cerrado.\n *\n * `expanded` es two-way, mismo patrón que `Drawer.open`: el consumidor\n * decide el estado inicial y puede reaccionar a los cambios, pero el propio\n * click en el header ya alterna el estado sin que el consumidor tenga que\n * cablear un `(click)` manual.\n *\n * <kf-collapsible title=\"Filtros\" [(expanded)]=\"filtersOpen\">\n * ...\n * </kf-collapsible>\n *\n * El ícono chevron es un SVG inline fijo (no una prop `icon` configurable)\n * porque esta librería todavía no tiene un componente `Icon`/sprite\n * compartido — un solo ícono fijo no amerita esperar esa abstracción.\n */\n@Component({\n selector: 'kf-collapsible',\n templateUrl: './Collapsible.html',\n styleUrl: './Collapsible.scss',\n})\nexport class Collapsible {\n readonly title = input.required<string>();\n readonly expanded = model(false);\n\n private readonly instanceId = `kf-collapsible-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly panelId = `${this.instanceId}-panel`;\n}\n","<button\n type=\"button\"\n class=\"kf-collapsible__trigger\"\n [id]=\"triggerId\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"expanded.update((value) => !value)\"\n>\n <span class=\"kf-collapsible__title\">{{ title() }}</span>\n <svg\n class=\"kf-collapsible__chevron\"\n [class.kf-collapsible__chevron--expanded]=\"expanded()\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</button>\n<div\n class=\"kf-collapsible__panel\"\n [class.kf-collapsible__panel--expanded]=\"expanded()\"\n [id]=\"panelId\"\n role=\"region\"\n [attr.aria-labelledby]=\"triggerId\"\n>\n <div class=\"kf-collapsible__body\">\n <ng-content />\n </div>\n</div>\n","/**\n * Escucha `Escape` en fase de captura sobre `document`, antes que cualquier\n * listener de burbuja de un contenedor (`kf-drawer`, `kf-modal`).\n *\n * Un panel flotante (`kf-select`, `kf-multi-select`, `kf-dropdown`) debe\n * cerrarse primero y dejar su contenedor abierto. Un listener de burbuja no\n * basta: el orden entre dos `@HostListener('document:keydown.escape')` es el\n * de creación de los componentes — el contenedor se crea antes que su\n * contenido — así que el contenedor vería la tecla sin consumir y también se\n * cerraría. En captura el panel va siempre primero y marca la tecla con\n * `preventDefault()`, que es lo que el contenedor revisa.\n *\n * `onEscape` debe devolver `true` solo si había algo que cerrar: únicamente\n * entonces se consume la tecla. Devuelve la función que retira el listener.\n */\nexport function listenEscapeCapture(doc: Document, onEscape: () => boolean): () => void {\n const handler = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape' || event.defaultPrevented) {\n return;\n }\n if (onEscape()) {\n event.preventDefault();\n }\n };\n doc.addEventListener('keydown', handler, true);\n return () => doc.removeEventListener('keydown', handler, true);\n}\n","import { Component, TemplateRef, input, viewChild } from '@angular/core';\n\nexport type DropdownPanelVariant = 'solid' | 'dark';\n\n/** Rol del contenedor del panel: `menu` (ítems de acción) o `dialog` (contenido de formulario o informativo). */\nexport type DropdownPanelRole = 'menu' | 'dialog';\n\nlet nextPanelId = 0;\n\n/**\n * Contenido del panel flotante de un `kf-dropdown`. Es solo una plantilla\n * (`<ng-template>`, capturada vía `TemplateRef`) — `Dropdown` la conecta al\n * overlay real cuando `open` pasa a `true`, no la renderiza en su propio\n * lugar del DOM. Esto permite que el panel aparezca pegado al host de\n * `Dropdown` sin importar dónde esté ese host en la página.\n *\n * `variant`: `'solid'` (default, fondo blanco) o `'dark'` (fondo sólido\n * oscuro, mismo tono que `[kf-drawer-header]`) para cuando el trigger vive\n * sobre una superficie oscura de marca.\n *\n * `dark` es sólida a propósito, no semitransparente: el CDK Overlay\n * reposiciona el panel según dónde entra en el viewport y puede terminar\n * cayendo sobre fondo blanco en vez de sobre el rail oscuro — un color\n * sólido se ve intencional sin importar dónde lo posicione el CDK.\n *\n * `role`: `'menu'` (default) cuando el contenido son `kf-dropdown-item`;\n * `'dialog'` cuando lleva campos de formulario, selects, casillas o texto\n * libre — un `role=\"menu\"` solo admite ítems de menú como hijos. Un panel\n * `dialog` necesita nombre: pasar `ariaLabel`.\n *\n * <kf-dropdown-panel role=\"dialog\" ariaLabel=\"Filtros\">…</kf-dropdown-panel>\n */\n@Component({\n selector: 'kf-dropdown-panel',\n templateUrl: './DropdownPanel.html',\n styleUrl: './DropdownPanel.css',\n // `role` es también un atributo nativo: escrito estático, Angular lo dejaría\n // además en el host (un diálogo vacío para los lectores de pantalla).\n host: { '[attr.role]': 'null' },\n})\nexport class DropdownPanel {\n readonly variant = input<DropdownPanelVariant>('solid');\n readonly role = input<DropdownPanelRole>('menu');\n /** Nombre accesible del panel (obligatorio en la práctica con `role=\"dialog\"`). */\n readonly ariaLabel = input<string>();\n /** `id` del contenedor con el rol; el disparador lo referencia con `aria-controls`. */\n readonly panelId = `kf-dropdown-panel-${nextPanelId++}`;\n readonly templateRef = viewChild.required(TemplateRef);\n}\n","<ng-template>\n <div class=\"kf-dropdown-panel\" [class.kf-dropdown-panel--dark]=\"variant() === 'dark'\">\n <div\n class=\"kf-dropdown-panel__inner\"\n tabindex=\"-1\"\n [id]=\"panelId\"\n [attr.role]=\"role()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n >\n <ng-content />\n </div>\n </div>\n</ng-template>\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n booleanAttribute,\n contentChild,\n effect,\n inject,\n input,\n model,\n untracked,\n ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { DropdownPanel } from './DropdownPanel';\n\nconst FOCUSABLE_SELECTOR =\n 'button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Menú de acciones flotante, conectado a un elemento disparador vía\n * `@angular/cdk/overlay` — la misma pieza que usa Angular Material para\n * `mat-menu`/`mat-select`. El disparador real puede vivir en OTRO\n * componente por completo (ej. el avatar dentro de `kf-portal-header`), y\n * el panel aparece pegado a ESE elemento sin importar dónde el consumidor\n * ubique al `Dropdown` en su HTML.\n *\n * `open` es two-way: el consumidor decide qué dispara la apertura —\n * `Dropdown` en sí no renderiza ningún trigger, su propio host es el punto\n * de anclaje visual del panel.\n *\n * <kf-dropdown [(open)]=\"menuOpen\"><kf-dropdown-panel>...</kf-dropdown-panel></kf-dropdown>\n *\n * Accesibilidad. Disparador: el primer control enfocable del `anchor` (o del\n * propio host) recibe `aria-haspopup` (`menu` o `dialog`, según el `role` del\n * panel), `aria-expanded` y, con el panel abierto, `aria-controls`; un atributo\n * que el consumidor ya declaró nunca se pisa. Foco: el panel vive en un overlay\n * al final del `body`, así que al abrir el foco pasa al primer elemento\n * enfocable del panel (`autoFocus`, default `true`; solo si el foco estaba en\n * el disparador, para no robarlo cuando algo abre el panel por código), y al\n * cerrar vuelve al disparador si estaba dentro del panel (Escape, elegir una\n * acción, aplicar). Un clic afuera no devuelve el foco: ya se fue a donde se\n * hizo clic. Con `role=\"menu\"` las flechas, Home y End recorren los ítems. Tab\n * desde el último (o Shift+Tab desde el primero) cierra el panel y continúa la\n * tabulación desde el disparador.\n */\n@Component({\n selector: 'kf-dropdown',\n template: `<ng-content />`,\n styleUrl: './Dropdown.css',\n})\nexport class Dropdown {\n /** Visibilidad del panel, two-way: `[(open)]=\"menuOpen\"`. */\n readonly open = model(false);\n\n /**\n * Elemento al que se conecta el overlay, si es distinto del propio host\n * de `Dropdown`. Sin esto, `Dropdown` asume que ÉL MISMO es el\n * disparador. Útil cuando el disparador real vive dentro de OTRO\n * componente que no se puede envolver sin ensanchar el área de click\n * (ej. el avatar de sesión dentro de `PortalHeader`).\n */\n readonly anchor = input<ElementRef<HTMLElement>>();\n\n /**\n * Mueve el foco al primer elemento enfocable del panel al abrirlo. Poner\n * `false` si el contenido ya gestiona su propio foco inicial.\n */\n readonly autoFocus = input(true, { transform: booleanAttribute });\n\n private readonly panel = contentChild(DropdownPanel);\n\n private readonly overlayService = inject(Overlay);\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n\n /** Atributos ARIA que este componente puso en el disparador (y por tanto retira él). */\n private readonly ownedTriggerAttributes = new Map<HTMLElement, Set<string>>();\n\n private overlayRef: OverlayRef | null = null;\n\n /**\n * Suscripciones a `outsidePointerEvents()`/`keydownEvents()` del overlay\n * ACTUALMENTE adjunto. `getOrCreateOverlayRef()` reutiliza el mismo\n * `overlayRef` entre aperturas (no lo recrea cada vez), así que se\n * cancelan explícitamente en `detach()` antes de la siguiente `attach()`\n * — de lo contrario se acumularían N suscripciones activas sobre el\n * mismo overlay persistente.\n */\n private overlaySubscription: Subscription | null = null;\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.attach();\n } else {\n this.detach();\n }\n });\n\n effect(() => {\n const open = this.open();\n const panel = this.panel();\n untracked(() => this.syncTriggerAria(open, panel));\n });\n\n const stopEscape = listenEscapeCapture(this.document, () => this.onDocumentEscape());\n this.destroyRef.onDestroy(() => {\n stopEscape();\n this.overlaySubscription?.unsubscribe();\n this.overlayRef?.dispose();\n this.releaseTriggerAria();\n });\n }\n\n /**\n * Respaldo de `overlayRef.keydownEvents()`: ese observable del CDK solo\n * ve teclas con el foco DENTRO del panel. Si el foco queda en el botón\n * disparador (caso común), `keydownEvents()` nunca dispara — este\n * listener a nivel de documento cubre ese caso. Va en fase de captura\n * (ver `listenEscapeCapture`) y consume la tecla solo si había un menú\n * abierto, así un `kf-drawer`/`kf-modal` contenedor no se cierra con el\n * mismo Escape. Devuelve si cerró algo.\n */\n onDocumentEscape(): boolean {\n if (!this.open()) {\n return false;\n }\n this.open.set(false);\n return true;\n }\n\n private attach(): void {\n const panel = this.panel();\n if (!panel || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreateOverlayRef();\n const portal = new TemplatePortal(panel.templateRef(), this.viewContainerRef);\n overlayRef.attach(portal);\n\n this.overlaySubscription = new Subscription();\n this.overlaySubscription.add(\n overlayRef.outsidePointerEvents().subscribe((event) => {\n if (this.isEventOnTrigger(event)) {\n return;\n }\n this.open.set(false);\n }),\n );\n this.overlaySubscription.add(\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.open.set(false);\n return;\n }\n this.onPanelKeydown(event, overlayRef.overlayElement);\n }),\n );\n\n if (this.autoFocus() && this.isFocusOnTrigger()) {\n afterNextRender(() => this.focusFirstInPanel(overlayRef.overlayElement), {\n injector: this.injector,\n });\n }\n }\n\n /** Flechas/Home/End entre ítems (solo `role=\"menu\"`) y salida con Tab en los extremos. */\n private onPanelKeydown(event: KeyboardEvent, pane: HTMLElement): void {\n const focusables = this.focusableIn(pane);\n const active = this.document.activeElement as HTMLElement | null;\n const index = active ? focusables.indexOf(active) : -1;\n\n if (event.key === 'Tab') {\n const leaving = event.shiftKey ? index <= 0 : index === focusables.length - 1;\n if (leaving) {\n // Sin preventDefault: la tabulación nativa sigue desde el disparador.\n this.triggerElement()?.focus();\n this.open.set(false);\n }\n return;\n }\n\n if (this.panel()?.role() !== 'menu' || focusables.length === 0) {\n return;\n }\n const last = focusables.length - 1;\n let target = -1;\n switch (event.key) {\n case 'ArrowDown':\n target = index >= last ? 0 : index + 1;\n break;\n case 'ArrowUp':\n target = index <= 0 ? last : index - 1;\n break;\n case 'Home':\n target = 0;\n break;\n case 'End':\n target = last;\n break;\n }\n if (target >= 0) {\n event.preventDefault();\n focusables[target].focus();\n }\n }\n\n private focusFirstInPanel(pane: HTMLElement): void {\n const first = this.focusableIn(pane)[0];\n (first ?? pane.querySelector<HTMLElement>('.kf-dropdown-panel__inner'))?.focus();\n }\n\n private focusableIn(pane: HTMLElement): HTMLElement[] {\n return Array.from(pane.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (element) => element.checkVisibility?.() ?? true,\n );\n }\n\n private isFocusOnTrigger(): boolean {\n const active = this.document.activeElement;\n const trigger = this.anchor()?.nativeElement ?? this.host.nativeElement;\n return !!active && trigger.contains(active);\n }\n\n /**\n * Control que abre el panel: el propio `anchor`/host si ya es enfocable, o\n * su primer descendiente enfocable (ej. el `<button>` dentro de `kf-button`).\n */\n private triggerElement(): HTMLElement | null {\n const root: HTMLElement = this.anchor()?.nativeElement ?? this.host.nativeElement;\n if (root.matches(FOCUSABLE_SELECTOR)) {\n return root;\n }\n return root.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n }\n\n private syncTriggerAria(open: boolean, panel: DropdownPanel | undefined): void {\n const trigger = this.triggerElement();\n if (!trigger || !panel) {\n return;\n }\n this.setOwnedAttribute(trigger, 'aria-haspopup', panel.role());\n this.setOwnedAttribute(trigger, 'aria-expanded', String(open));\n if (open) {\n this.setOwnedAttribute(trigger, 'aria-controls', panel.panelId);\n } else {\n this.removeOwnedAttribute(trigger, 'aria-controls');\n }\n }\n\n /** Escribe el atributo solo si no es del consumidor (ausente, o ya puesto por este componente). */\n private setOwnedAttribute(element: HTMLElement, name: string, value: string): void {\n const owned = this.ownedTriggerAttributes.get(element) ?? new Set<string>();\n if (element.hasAttribute(name) && !owned.has(name)) {\n return;\n }\n element.setAttribute(name, value);\n owned.add(name);\n this.ownedTriggerAttributes.set(element, owned);\n }\n\n private removeOwnedAttribute(element: HTMLElement, name: string): void {\n if (this.ownedTriggerAttributes.get(element)?.delete(name)) {\n element.removeAttribute(name);\n }\n }\n\n private releaseTriggerAria(): void {\n for (const [element, names] of this.ownedTriggerAttributes) {\n names.forEach((name) => element.removeAttribute(name));\n }\n this.ownedTriggerAttributes.clear();\n }\n\n /**\n * El trigger real (el `anchor`, o el propio host si no se pasó ninguno —\n * ver comentario de la clase) vive FUERA del overlay a propósito: el\n * overlay recién se crea/adjunta cuando `open` pasa a `true`, así que el\n * CDK no tiene forma de saber que ese elemento externo \"es parte\" de su\n * disparador. Sin este filtro, el mismo `pointerdown` que abre el menú\n * también llega a `outsidePointerEvents()`, cerrando el panel en el\n * mismo gesto que lo abrió.\n */\n private isEventOnTrigger(event: MouseEvent | TouchEvent): boolean {\n const trigger = this.anchor()?.nativeElement ?? this.host.nativeElement;\n const target = event.target;\n return target instanceof Node && trigger.contains(target);\n }\n\n private detach(): void {\n this.overlaySubscription?.unsubscribe();\n this.overlaySubscription = null;\n if (this.overlayRef?.hasAttached()) {\n // Antes de desmontar el panel: si no, el elemento enfocado desaparece y el foco cae al `body`.\n const pane = this.overlayRef.overlayElement;\n const active = this.document.activeElement;\n if (active && pane.contains(active)) {\n this.triggerElement()?.focus();\n }\n }\n this.overlayRef?.detach();\n }\n\n private getOrCreateOverlayRef(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.anchor() ?? this.host)\n // 4 posiciones, no 2: además del par alineado al borde derecho del\n // anchor, agrega el mismo par alineado al borde IZQUIERDO — sin esto,\n // un trigger cerca del borde derecho de pantalla no tenía fallback\n // horizontal y el panel se salía del viewport.\n .withPositions([\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', 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: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n ])\n .withViewportMargin(8)\n // Si ninguna de las 4 posiciones entra completa, la última se ajusta\n // con push en vez de desbordarse fuera de pantalla.\n .withPush(true);\n\n this.overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { Dropdown } from '../dropdown/Dropdown';\nimport { DropdownPanel } from '../dropdown/DropdownPanel';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Popover de \"Datos de contacto\" de una persona (asesor, ejecutivo — nombre\n * genérico a propósito, sin lógica de negocio de ninguna pantalla concreta\n * adentro). Cada canal (`whatsapp`/`phone`/`email`) se muestra SOLO si\n * viene con dato — nunca los 3 fijos — y si ninguno viene, un estado vacío\n * explícito en vez de un panel a medio llenar. Mismo criterio que ya\n * resolvía `sitio-privado-one-way-frontend` (repo hermano de Chile) para\n * el asesor de taller, ahora como pieza compartida del design system.\n *\n * <kf-contact-popover\n * [name]=\"advisor.name\"\n * [whatsapp]=\"advisor.whatsapp\"\n * [phone]=\"advisor.phone\"\n * [email]=\"advisor.email\"\n * />\n */\n@Component({\n selector: 'kf-contact-popover',\n imports: [Dropdown, DropdownPanel, Icon],\n templateUrl: './ContactPopover.html',\n styleUrl: './ContactPopover.css',\n})\nexport class ContactPopover {\n readonly name = input.required<string>();\n readonly title = input('Datos de contacto');\n readonly whatsapp = input<string | null>(null);\n readonly phone = input<string | null>(null);\n readonly email = input<string | null>(null);\n\n protected readonly open = signal(false);\n\n protected readonly whatsappHref = computed(() => {\n const digits = (this.whatsapp() ?? '').replace(/[^\\d]/g, '');\n return digits.length > 0 ? `https://wa.me/${digits}` : null;\n });\n\n protected readonly phoneHref = computed(() => {\n const trimmed = (this.phone() ?? '').trim();\n return trimmed.length > 0 ? `tel:${trimmed}` : null;\n });\n\n protected readonly emailHref = computed(() => {\n const trimmed = (this.email() ?? '').trim();\n return trimmed.length > 0 ? `mailto:${trimmed}` : null;\n });\n\n protected readonly hasContactMethods = computed(\n () => this.whatsappHref() !== null || this.phoneHref() !== null || this.emailHref() !== null,\n );\n\n protected onToggle(): void {\n this.open.update((value) => !value);\n }\n\n protected onClose(): void {\n this.open.set(false);\n }\n}\n","<kf-dropdown class=\"kf-contact-popover\" [(open)]=\"open\">\n <button\n type=\"button\"\n class=\"kf-contact-popover__trigger\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"onToggle()\"\n >\n {{ name() }}\n <kf-icon name=\"chevron-down\" size=\"sm\" [rotate]=\"open() ? 180 : 0\" />\n </button>\n <kf-dropdown-panel role=\"dialog\" [ariaLabel]=\"title()\">\n <div class=\"kf-contact-popover__header\">\n <span class=\"kf-contact-popover__title\">{{ title() }}</span>\n <button\n type=\"button\"\n class=\"kf-contact-popover__close\"\n aria-label=\"Cerrar\"\n (click)=\"onClose()\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n </div>\n <hr class=\"kf-contact-popover__hr\" />\n @if (hasContactMethods()) {\n @if (whatsappHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"whatsappHref()!\">\n <kf-icon name=\"message-circle\" size=\"sm\" />\n WhatsApp\n </a>\n }\n @if (phoneHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"phoneHref()!\">\n <kf-icon name=\"phone\" size=\"sm\" />\n Teléfono\n </a>\n }\n @if (emailHref()) {\n <a class=\"kf-contact-popover__link\" [href]=\"emailHref()!\">\n <kf-icon name=\"mail\" size=\"sm\" />\n Correo\n </a>\n }\n } @else {\n <div class=\"kf-contact-popover__empty\">\n <kf-icon name=\"alert-circle\" size=\"sm\" />\n No registra datos de contacto\n </div>\n }\n </kf-dropdown-panel>\n</kf-dropdown>\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Marcador genérico para contenido aún por definir (página 38) — comunica\n * \"contenido disponible para uso\" sin parecer un error, a diferencia de\n * `kf-empty-state` (que comunica ausencia real de datos del usuario).\n * Pensado para secciones del portal que un negocio todavía no completó.\n *\n * `compact` reduce el tamaño de la imagen placeholder y omite el badge de\n * pie (segunda variante de la página 38, sin la etiqueta \"Contenido\n * disponible para uso\" al final).\n *\n * <kf-content-slot title=\"Contenido disponible\"\n * description=\"Espacio reservado para contenido de Divemotor Perú. Disponible para uso.\" />\n * <kf-content-slot compact icon=\"star\" title=\"Contenido disponible\"\n * description=\"Espacio reservado para contenido de Divemotor Perú.\" />\n */\n@Component({\n selector: 'kf-content-slot',\n imports: [Icon, Text],\n templateUrl: './ContentSlot.html',\n styleUrl: './ContentSlot.css',\n host: {\n '[class.kf-content-slot--compact]': 'compact()',\n },\n})\nexport class ContentSlot {\n readonly title = input('Contenido disponible');\n readonly description = input<string>();\n readonly icon = input<IconName>('layers');\n readonly compact = input(false, { transform: booleanAttribute });\n}\n","<div class=\"kf-content-slot__media\">\n <kf-icon [name]=\"icon()\" [size]=\"compact() ? 'md' : 'lg'\" />\n</div>\n<span class=\"kf-content-slot__title\">{{ title() }}</span>\n@if (description()) {\n <p class=\"kf-content-slot__description\">{{ description() }}</p>\n}\n@if (!compact()) {\n <span class=\"kf-content-slot__footer\">\n <kf-text as=\"span\" variant=\"overline\">Contenido disponible para uso</kf-text>\n </span>\n}\n","import { Component, computed, input } from '@angular/core';\nimport { Icon, IconName, IconSize } from '../icon/Icon';\n\n/** Tono del estado. `warn`/`info` solo cambian el chip del ícono. */\nexport type EmptyStateTone = 'neutral' | 'error' | 'warn' | 'info';\n\n/**\n * Placeholder para una sección sin contenido. Dos tonos, con anatomía\n * distinta (páginas 27-28 del design system, que los trata como piezas\n * separadas — \"Error State\" no es una variante de color de \"Empty State\",\n * es un estado semánticamente distinto):\n *\n * - `neutral` (default): \"cero resultados\" — cuadro con borde punteado\n * discreto, para listas vacías o búsquedas sin coincidencias. No es un\n * error, es la ausencia normal de datos.\n * - `error`: fallo real de carga — sin borde punteado, con un ícono de\n * alerta más prominente y texto en el tono de error. Pensado para usarse\n * junto a un botón \"Reintentar\" en el slot por defecto.\n *\n * <kf-empty-state>No se encontraron resultados.</kf-empty-state>\n * <kf-empty-state icon=\"search\">Sin coincidencias para tu búsqueda.</kf-empty-state>\n * <kf-empty-state tone=\"error\" icon=\"alert-triangle\">\n * No pudimos cargar tus vehículos\n * <kf-button (click)=\"retry()\">Reintentar</kf-button>\n * </kf-empty-state>\n *\n * ## Variante `card`\n * Tarjeta centrada (fondo blanco, borde, sombra, ancho máximo 480px) para\n * un estado que REEMPLAZA a un contenido grande — ej. un iframe que no\n * cargó o un documento que aún no existe. Ícono en un círculo tonal de\n * 56px según `tone` (`warn`, `info`, `error` o `neutral`), `title` como\n * título, el contenido proyectado como texto (puede incluir una lista de\n * pasos) y `[kf-empty-state-actions]` para los botones. Los roles\n * (`role=\"alert\"` para un error) los pone el consumidor en el host: no\n * todo estado de esta forma debe interrumpir al lector de pantalla.\n *\n * <kf-empty-state variant=\"card\" tone=\"warn\" icon=\"alert-triangle\"\n * title=\"No pudimos cargar la propuesta\" role=\"alert\">\n * <p>Este contenido solo está disponible dentro de la red de la empresa.</p>\n * <ol>…pasos…</ol>\n * <div kf-empty-state-actions>\n * <kf-button (click)=\"retry()\">Reintentar</kf-button>\n * </div>\n * </kf-empty-state>\n *\n * `[kf-empty-state-footer]` va DESPUÉS de las acciones, para pistas y\n * metadatos debajo de los botones (\"¿Ya estás conectado? …\", \"Intento 2 ·\n * 10:42\"). Vacío, no ocupa lugar.\n *\n * `title` se dibuja como texto destacado, no como encabezado (`<h*>`): el\n * nivel de encabezado depende de la página que lo contiene, y un estado\n * vacío no debe alterar su estructura.\n */\n@Component({\n selector: 'kf-empty-state',\n imports: [Icon],\n templateUrl: './EmptyState.html',\n styleUrl: './EmptyState.css',\n host: {\n '[class.kf-empty-state--error]': \"tone() === 'error'\",\n '[class.kf-empty-state--warn]': \"tone() === 'warn'\",\n '[class.kf-empty-state--info]': \"tone() === 'info'\",\n '[class.kf-empty-state--card]': \"variant() === 'card'\",\n // `title` es un input con nombre de atributo nativo: escrito estático,\n // Angular también lo dejaría en el host como tooltip sobre todo el bloque.\n '[attr.title]': 'null',\n },\n})\nexport class EmptyState {\n readonly icon = input<IconName | undefined>(undefined);\n /** `neutral` (default): cero resultados. `error`: fallo real de carga. `warn`/`info`: tiñen el chip del ícono. */\n readonly tone = input<EmptyStateTone>('neutral');\n /** `inline` (default, histórico) o `card` (tarjeta centrada). Ver JSDoc de la clase. */\n readonly variant = input<'inline' | 'card'>('inline');\n /** Título destacado sobre el contenido. Opcional en ambas variantes. */\n readonly title = input<string>();\n\n protected readonly iconSize = computed<IconSize>(() =>\n this.variant() === 'card' || this.tone() === 'error' ? 'lg' : 'md',\n );\n}\n","@if (icon(); as iconName) {\n <span class=\"kf-empty-state__icon\">\n <kf-icon [name]=\"iconName\" [size]=\"iconSize()\" />\n </span>\n}\n@if (title(); as titleText) {\n <p class=\"kf-empty-state__title\">{{ titleText }}</p>\n}\n<div class=\"kf-empty-state__content\">\n <ng-content />\n</div>\n<div class=\"kf-empty-state__actions\"><ng-content select=\"[kf-empty-state-actions]\" /></div>\n<div class=\"kf-empty-state__footer\"><ng-content select=\"[kf-empty-state-footer]\" /></div>\n","import { Component, input } from '@angular/core';\n\n/** Forma del placeholder. */\nexport type SkeletonVariant = 'text' | 'circle' | 'rect';\n\n/**\n * Bloque placeholder con shimmer para contenido que todavía carga: una línea\n * de texto, un avatar o un área de card/imagen, según `variant`.\n *\n * Es decorativo (`aria-hidden`): quien lo usa debería marcar el contenedor con\n * `aria-busy=\"true\"` mientras carga, así el lector de pantalla anuncia el\n * estado una vez en vez de leer N placeholders vacíos.\n *\n * `circle` usa `aspect-ratio`, así que alcanza con darle `width`.\n *\n * <kf-skeleton />\n * <kf-skeleton variant=\"circle\" width=\"40px\" />\n * <kf-skeleton variant=\"rect\" width=\"100%\" height=\"120px\" />\n */\n@Component({\n selector: 'kf-skeleton',\n templateUrl: './Skeleton.html',\n styleUrl: './Skeleton.css',\n})\nexport class Skeleton {\n readonly variant = input<SkeletonVariant>('text');\n /** Ancho CSS. Default `'100%'`. */\n readonly width = input('100%');\n /** Alto CSS. Vacío deja el alto/aspect-ratio propio de la variante. */\n readonly height = input('');\n}\n","<span\n class=\"kf-skeleton\"\n [class]=\"'kf-skeleton--' + variant()\"\n aria-hidden=\"true\"\n [style.width]=\"width()\"\n [style.height]=\"height() || null\"\n></span>\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Label superior compartido por todos los campos de formulario del design\n * system (páginas 11-12: Text Field, Select, Multiselect) — uppercase,\n * chico, gris, con letter-spacing amplio. El PDF fija un único tratamiento\n * (\"PATENTE O VIN\", \"SUCURSAL\", \"SUCURSALES\" usan exactamente el mismo\n * estilo), así que este componente es la única fuente de verdad: antes vivía\n * copiado por separado en `Input`, `Select`, `SelectMenu` y `MultiSelect`,\n * y dos de esas copias ya habían divergido del estilo real del PDF.\n *\n * No reemplaza al `<label>` nativo — lo envuelve, para no perder la\n * asociación de accesibilidad `for`/`id` con el control real.\n *\n * `required` agrega un asterisco visual en el tono de error, separado del\n * texto por un espacio y marcado `aria-hidden` — el estado obligatorio real\n * para lectores de pantalla lo comunica el propio control (`aria-required`\n * / `required` en el `<input>`/`<select>` asociado), no este label.\n *\n * <kf-field-label [for]=\"inputId\">Patente o VIN</kf-field-label>\n * <kf-field-label [for]=\"inputId\" required>Correo electrónico</kf-field-label>\n *\n * `visuallyHidden` deja el texto solo para lectores de pantalla: el `<label\n * for>` sigue nombrando el control sin ocupar espacio.\n */\n@Component({\n selector: 'kf-field-label',\n templateUrl: './FieldLabel.html',\n styleUrl: './FieldLabel.css',\n})\nexport class FieldLabel {\n /** `id` del control asociado — se refleja como `for` en el `<label>` interno. */\n readonly for = input<string>();\n /** Muestra un asterisco visual indicando que el campo es obligatorio. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Oculta el texto a la vista pero lo conserva como nombre accesible del control. */\n readonly visuallyHidden = input(false, { transform: booleanAttribute });\n}\n","<label class=\"kf-field-label\" [class.kf-field-label--sr-only]=\"visuallyHidden()\" [for]=\"for()\">\n <ng-content />\n @if (required()) {\n <span class=\"kf-field-label__required\" aria-hidden=\"true\">*</span>\n }\n</label>\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport type { ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';\n\n/**\n * Overlay flotante conectado a un trigger de ancho variable — usado por\n * `kf-select`, `kf-multi-select` (y con lógica equivalente propia,\n * `kf-dropdown`, cuyo trigger puede vivir fuera del propio host).\n *\n * Encapsula: 4 posiciones con fallback (abajo/arriba × izquierda/derecha),\n * el overlay se remide al ancho del trigger en cada apertura (no solo la\n * creación, para no desincronizarse si el trigger cambia de tamaño), y el\n * filtro de `outsidePointerEvents()` que evita que un click en el trigger\n * para CERRAR el panel lo vuelva a abrir en el mismo gesto (ese pointerdown\n * llega a `outsidePointerEvents()` en fase de captura, antes que al\n * `(click)` del propio trigger).\n */\nexport class SelectOverlay {\n private overlayRef: OverlayRef | null = null;\n\n constructor(\n private readonly overlayService: Overlay,\n private readonly viewContainerRef: ViewContainerRef,\n private readonly triggerRef: () => ElementRef<HTMLElement>,\n /**\n * Ancho mínimo del panel, independiente del trigger — necesario para\n * un trigger angosto por diseño (ej. `kf-select` en `variant=\"compact\"`,\n * \"10\" + caret ≈ 45px): sin esto, el panel hereda ESE mismo ancho\n * microscópico y cada opción queda apretada contra el borde. Un\n * trigger normal (240px fijo) ya es más ancho que cualquier\n * `minWidth` razonable, así que este parámetro no le cambia nada.\n */\n private readonly minWidth: () => number = () => 0,\n /**\n * `'match'` (default): el panel mide exactamente el ancho del trigger.\n * `'content'`: el trigger es solo el piso y el panel crece hasta el\n * ancho natural de sus opciones (con techo `maxWidth: 90vw`) — para un\n * trigger compacto de barra de herramientas (\"Más recientes\") cuyas\n * opciones son más largas (\"Más recientes primero\") y no deben\n * truncarse.\n */\n private readonly sizing: () => 'match' | 'content' = () => 'match',\n ) {}\n\n attach(panelTemplate: TemplateRef<unknown>, onClose: () => void): void {\n if (this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreate();\n overlayRef.updateSize(this.resolveSize());\n\n const portal = new TemplatePortal(panelTemplate, this.viewContainerRef);\n overlayRef.attach(portal);\n\n overlayRef.outsidePointerEvents().subscribe((event) => {\n const target = event.target as Node | null;\n if (target && this.triggerRef().nativeElement.contains(target)) {\n return;\n }\n onClose();\n });\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n onClose();\n }\n });\n }\n\n detach(): void {\n this.overlayRef?.detach();\n }\n\n dispose(): void {\n this.overlayRef?.dispose();\n }\n\n private getOrCreate(): OverlayRef {\n if (this.overlayRef) {\n return this.overlayRef;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.triggerRef())\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 4 },\n { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -4 },\n ])\n .withViewportMargin(8)\n .withPush(true);\n\n this.overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n ...this.resolveSize(),\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n\n private resolveSize(): { width?: number; minWidth?: number } {\n const width = this.resolveWidth();\n // `undefined` (no omitir la clave): `updateSize` mezcla con la config\n // previa, y solo una clave presente con `undefined` limpia el estilo.\n return this.sizing() === 'content'\n ? { width: undefined, minWidth: width }\n : { width, minWidth: undefined };\n }\n\n private resolveWidth(): number {\n return Math.max(this.triggerRef().nativeElement.getBoundingClientRect().width, this.minWidth());\n }\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { normalizeForSearch } from '@kaufmann-lab/ui/shared';\nimport { Badge } from '../badge/Badge';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon, IconName } from '../icon/Icon';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { SelectOverlay } from '../shared/select-overlay';\n\n/**\n * Opción en forma de objeto. `tag` se muestra como `kf-badge` a la derecha\n * del label (en el panel y en el trigger) y `detail` como línea secundaria\n * atenuada debajo, solo en el panel. Ambos entran en la búsqueda.\n * `shortLabel` reemplaza al label SOLO en el trigger (ej. panel \"Más\n * recientes primero\", trigger \"Más recientes\") — para triggers compactos\n * donde el label completo se truncaría.\n */\nexport interface SelectOption {\n value: string;\n label: string;\n tag?: string;\n detail?: string;\n shortLabel?: string;\n}\n\nlet nextId = 0;\n\n/** Ancho mínimo del panel flotante en `variant=\"compact\"` — el trigger de\n * ese modo puede medir menos de 45px (ej. \"10\" + caret), y sin este piso\n * la opción quedaría apretada contra ese mismo ancho angosto. 72px es lo\n * que necesita una opción de 2-3 dígitos con el padding compacto del\n * panel (ver `.kf-select--compact .kf-select__option` en Select.css) —\n * no 120px, pensado para el trigger normal (`variant=\"field\"`), que\n * dejaba el panel de \"Filas\" visiblemente más ancho que el propio\n * trigger que lo abre. */\nconst COMPACT_PANEL_MIN_WIDTH = 72;\n\n/** Pausa tras la cual lo tecleado deja de acumularse para la búsqueda por prefijo. */\nconst TYPEAHEAD_RESET_MS = 500;\n\n/**\n * Dropdown de selección simple con panel propio — NUNCA usa el `<select>`\n * nativo del navegador. Un `<select>` real siempre delega el popup de\n * opciones al sistema operativo, y ningún CSS puede controlar cómo se ve\n * ese popup.\n *\n * El panel flotante se conecta al trigger vía `@angular/cdk/overlay` — el\n * mismo mecanismo que `Dropdown` (ver `../dropdown/Dropdown.ts`).\n *\n * <kf-select label=\"Sede\" [options]=\"['Lima', 'Arequipa', 'Trujillo']\" placeholder=\"Selecciona…\" />\n * <kf-select [options]=\"[{ value: 'pe', label: 'Perú' }]\" (valueChange)=\"onCountry($event)\" />\n * <kf-select [options]=\"[{ value: '1002099', label: 'BBVA', tag: 'Empresa', detail: 'RUC 20100130204' }]\" />\n *\n * `variant=\"compact\"` cambia el ancho de `240px` fijo a intrínseco con un\n * techo de `160px` (se ajusta al contenido de la opción seleccionada hasta\n * ese máximo, truncando con ellipsis si no entra) y reduce padding/tamaño de\n * fuente — pensado para selectores cortos embebidos en una barra (ej. \"Filas\n * por página\" en el footer de `kf-data-table`), nunca para un campo de\n * formulario largo, que sigue usando el `variant=\"field\"` por defecto. El\n * panel flotante siempre mide el ancho real del trigger en cada apertura\n * (`SelectOverlay.attach`), así que se angosta solo sin cambios adicionales.\n *\n * <kf-select variant=\"compact\" [options]=\"['5', '10', '25']\" [value]=\"pageSize()\" (valueChange)=\"...\" />\n *\n * `width=\"full\"` ocupa el 100% del contenedor — para selects dentro de\n * layouts flex/grid donde el ancho fijo de `md` no encaja.\n *\n * <kf-select width=\"full\" [options]=\"branches\" [value]=\"branch()\" (valueChange)=\"...\" />\n *\n * Control de orden de una barra de herramientas (ícono + valor + caret, sin\n * label visible): `icon` agrega un glifo `sm` a la izquierda del valor,\n * `ariaLabel` da el nombre accesible (el trigger se anuncia como\n * `\"<ariaLabel>: <valor actual>\"`), `panelTitle` agrega un título chico en\n * mayúsculas dentro del panel (decorativo, `aria-hidden`) y\n * `panelWidth=\"content\"` deja que el panel crezca hasta el ancho de sus\n * opciones en vez de truncarlas al ancho del trigger compacto.\n *\n * <kf-select variant=\"compact\" icon=\"sort\" ariaLabel=\"Ordenar por\"\n * panelTitle=\"Ordenar por\" panelWidth=\"content\"\n * [options]=\"sortOptions\" [value]=\"sort()\" (valueChange)=\"sort.set($event)\" />\n *\n * `width=\"fit\"` ajusta el ancho al contenido: mide la opción más larga (y el\n * placeholder) con la tipografía real y no cambia al elegir otra, hasta un\n * tope de `--kf-select-fit-max-width` (20rem por defecto; lo que no entra se\n * trunca con elipsis). Pensado para selects en barras de herramientas o\n * encabezados donde un ancho fijo deja espacio vacío. La medición se hace\n * con una pasada invisible de todas las opciones, así que conviene para\n * listas cortas o medianas; con cientos de opciones usar un ancho fijo. Si\n * alguna opción trae `tag`, también se reserva el hueco del tag más ancho,\n * por lo que elegir una opción con tag tampoco cambia el ancho. Conviene\n * combinarlo con `panelWidth=\"content\"`: con el default (`\"trigger\"`) el panel\n * mide lo mismo que el trigger y las opciones, que suman su propio padding\n * (y su tag, si lo traen), pueden quedar truncadas.\n *\n * <kf-select width=\"fit\" label=\"División\" hideLabel [options]=\"divisions\" [value]=\"division()\" (valueChange)=\"...\" />\n *\n * `size=\"sm\"` fija la altura del trigger en 32px (`--kf-select-min-height`)\n * para filas de filtros densas, sin tocar el padding horizontal ni el\n * `variant`. El default (`'md'`) no cambia nada. Para otra altura puntual,\n * declarar `--kf-select-min-height` en el propio `kf-select`.\n *\n * <kf-select size=\"sm\" width=\"fit\" [options]=\"ranges\" [value]=\"range()\" (valueChange)=\"...\" />\n *\n * Teclado (patrón listbox de WAI-ARIA): ArrowDown/ArrowUp sobre el trigger\n * cerrado lo abren; al abrir, el foco pasa a la opción seleccionada (o al\n * buscador, si está visible). En el panel, flechas y Home/End mueven el\n * foco, Enter/Espacio eligen, Escape cierra y devuelve el foco al trigger,\n * y Tab cierra el panel y continúa la tabulación desde el trigger. Las\n * opciones nunca son paradas de Tab (`tabindex=\"-1\"`). Home/End sobre el\n * trigger cerrado lo abren en la primera/última opción, y teclear letras\n * (con el panel abierto o cerrado, sin buscador) salta a la opción cuyo\n * label empieza con lo tecleado; repetir la misma letra recorre las que\n * empiezan igual.\n */\n@Component({\n selector: 'kf-select',\n imports: [Badge, FieldLabel, Icon],\n templateUrl: './Select.html',\n styleUrl: './Select.css',\n host: {\n '[class.kf-select--compact]': \"variant() === 'compact'\",\n '[class.kf-select--width-sm]': \"width() === 'sm'\",\n '[class.kf-select--width-lg]': \"width() === 'lg'\",\n '[class.kf-select--width-full]': \"width() === 'full'\",\n '[class.kf-select--width-fit]': \"width() === 'fit'\",\n '[class.kf-select--size-sm]': \"size() === 'sm'\",\n },\n})\nexport class Select {\n readonly label = input<string>();\n /**\n * Oculta el `label` a la vista y lo deja como nombre accesible (`<label\n * for>`): para un control cuyo valor se explica solo (ej. un rango de\n * fechas), sin tener que ocultar la etiqueta con CSS desde afuera.\n */\n readonly hideLabel = input(false, { transform: booleanAttribute });\n /**\n * Texto corto visible dentro del trigger, antes del valor (ej. `Rango:\n * Últimos 30 días`), para un select compacto que no lleva etiqueta\n * encima. Forma parte del nombre accesible del botón: no combinarlo con\n * `label`/`ariaLabel`, que reemplazarían ese nombre.\n */\n readonly prefix = input<string>();\n readonly options = input.required<readonly (string | SelectOption)[]>();\n readonly value = input<string>();\n readonly placeholder = input<string>('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Borde en rojo y `aria-invalid` en el trigger. Ver `errorMessage` para el mensaje asociado — mismo contrato que `kf-input`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"`, debajo del trigger. */\n readonly errorMessage = input<string>();\n readonly variant = input<'field' | 'compact'>('field');\n /**\n * Ancho del control. 'md' (240px) es el default histórico y preserva el\n * comportamiento actual sin cambios para consumidores existentes.\n * 'full' ocupa el 100% del contenedor — para selects dentro de layouts\n * flex/grid donde el ancho fijo no encaja (ej. un footer de sidebar).\n * 'fit' mide el contenido (opción más larga) con un tope.\n */\n readonly width = input<'sm' | 'md' | 'lg' | 'full' | 'fit'>('md');\n /**\n * Altura del trigger. 'md' (default) conserva la altura histórica; 'sm'\n * la fija en 32px para barras de filtros densas.\n */\n readonly size = input<'md' | 'sm'>('md');\n /**\n * Tri-state: si el consumidor no lo especifica (`undefined`), el buscador\n * se activa solo cuando `options().length` supera `searchThreshold()`. Si\n * el consumidor define `true`/`false` explícitamente, ese valor manda por\n * sobre el umbral automático.\n */\n readonly searchable = input<boolean | undefined>(undefined);\n readonly searchThreshold = input<number>(7);\n /**\n * Nombre accesible del control cuando no hay `label` visible (ej. \"Ordenar\n * por\"). El trigger se anuncia como `\"<ariaLabel>: <valor visible>\"` (el\n * mismo texto que muestra el trigger, `shortLabel` si la opción lo trae),\n * así el nombre contiene el texto visible (WCAG 2.5.3) y además dice qué se\n * está eligiendo. Ignorado si hay `label`: un `aria-label` pisaría al\n * `<label for>` visible.\n */\n readonly ariaLabel = input<string>();\n /** Ícono `sm` a la izquierda del valor en el trigger (ej. `'sort'`). */\n readonly icon = input<IconName>();\n /** Título chico en mayúsculas dentro del panel, sobre las opciones. Decorativo (`aria-hidden`): el nombre del listbox ya lo da `ariaLabel`/`label`. */\n readonly panelTitle = input<string>();\n /**\n * `'trigger'` (default): el panel mide lo mismo que el trigger.\n * `'content'`: el trigger es el ancho mínimo y el panel crece hasta el\n * ancho de la opción más larga — para triggers compactos cuyas opciones\n * son más largas que el valor resumido.\n */\n readonly panelWidth = input<'trigger' | 'content'>('trigger');\n\n readonly valueChange = output<string>();\n\n private readonly instanceId = `kf-select-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly listboxId = `${this.instanceId}-listbox`;\n readonly errorId = `${this.instanceId}-error`;\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeIndex = signal(0);\n\n /** Resolves `string | SelectOption` entries into a single shape for the template. */\n readonly normalizedOptions = computed<SelectOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n readonly selectedOption = computed(() =>\n this.normalizedOptions().find((option) => option.value === this.value()),\n );\n\n /** Texto que muestra el trigger: `shortLabel` o `label` de la opción elegida, o el placeholder. */\n readonly triggerText = computed(() => {\n const option = this.selectedOption();\n return option?.shortLabel ?? option?.label ?? this.placeholder();\n });\n\n /**\n * `aria-label` del trigger: solo con `ariaLabel` y SIN `label` visible. Un\n * `aria-label` tiene prioridad sobre el `<label for>` en el cálculo del\n * nombre accesible, así que con label visible no se emite.\n */\n readonly triggerAriaLabel = computed(() => {\n const name = this.ariaLabel();\n if (!name || this.label()) {\n return null;\n }\n return `${name}: ${this.triggerText()}`;\n });\n\n /**\n * Textos que `width=\"fit\"` mide para dimensionar el trigger: el de cada\n * opción tal como se vería en el trigger (`shortLabel` o `label`) y el\n * placeholder. Sin repetidos.\n */\n protected readonly fitTexts = computed(() => {\n if (this.width() !== 'fit') {\n return [];\n }\n const texts = this.normalizedOptions().map((option) => option.shortLabel ?? option.label);\n return [...new Set([...texts, this.placeholder()])];\n });\n\n /** Tags distintos de las opciones, para reservar el hueco del más ancho con `width=\"fit\"`. */\n protected readonly fitTags = computed(() => {\n if (this.width() !== 'fit') {\n return [];\n }\n return [...new Set(this.normalizedOptions().flatMap((option) => option.tag ?? []))];\n });\n\n readonly showSearch = computed(\n () => this.searchable() ?? this.normalizedOptions().length > this.searchThreshold(),\n );\n\n /** Opciones visibles tras aplicar el filtro de búsqueda (case/acento-insensitive). */\n readonly filteredOptions = computed<SelectOption[]>(() => {\n const query = normalizeForSearch(this.searchQuery().trim());\n if (!query) {\n return this.normalizedOptions();\n }\n return this.normalizedOptions().filter((option) =>\n [option.label, option.tag, option.detail].some(\n (text) => !!text && normalizeForSearch(text).includes(query),\n ),\n );\n });\n\n private readonly triggerRef = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly panelTemplate = viewChild.required<TemplateRef<unknown>>('panelTemplate');\n private readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n private readonly panelRef = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly document = inject(DOCUMENT);\n\n private typeaheadBuffer = '';\n private typeaheadTimer: ReturnType<typeof setTimeout> | undefined;\n\n private readonly overlay = new SelectOverlay(\n inject(Overlay),\n inject(ViewContainerRef),\n () => this.triggerRef(),\n () => (this.variant() === 'compact' ? COMPACT_PANEL_MIN_WIDTH : 0),\n () => (this.panelWidth() === 'content' ? 'content' : 'match'),\n );\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.overlay.attach(this.panelTemplate(), () => this.close());\n } else {\n this.overlay.detach();\n this.searchQuery.set('');\n this.activeIndex.set(0);\n }\n });\n\n // Autofocus del buscador al abrir. afterNextRender() NO puede invocarse\n // dentro de un effect() (NG0203: pierde el contexto de inyección) — hay\n // que usar afterRenderEffect(), que sí es reactivo a signals y corre\n // después de que Angular actualizó el DOM del panel recién adjuntado.\n //\n // Sin buscador, el foco pasa a la opción activa (la seleccionada, ver\n // `open()`): `activeIndex` se lee `untracked` para que mover el índice\n // con el mouse (`mouseenter`) no robe el foco en cada render.\n afterRenderEffect(() => {\n if (!this.isOpen()) {\n return;\n }\n if (this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n return;\n }\n if (this.panelRef()) {\n untracked(() => this.focusOption(this.activeIndex()));\n }\n });\n\n const stopEscape = listenEscapeCapture(this.document, () => this.onDocumentEscape());\n inject(DestroyRef).onDestroy(() => {\n stopEscape();\n clearTimeout(this.typeaheadTimer);\n this.overlay.dispose();\n });\n }\n\n /**\n * Escape con el panel abierto, escuchado en fase de captura sobre\n * `document` (ver `listenEscapeCapture`). Respaldo de\n * `overlayRef.keydownEvents()`: ese observable del CDK solo ve teclas\n * presionadas con el foco DENTRO del pane del overlay; si el foco sigue en\n * el trigger (o en cualquier otro lado) mientras el panel está abierto,\n * nunca dispara. Consume la tecla (`preventDefault`) solo si había un\n * panel que cerrar, así un `kf-drawer`/`kf-modal` que contenga al select\n * no se cierra con el mismo Escape. Devuelve si cerró algo.\n */\n onDocumentEscape(): boolean {\n if (!this.isOpen()) {\n return false;\n }\n this.close();\n return true;\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n if (this.isOpen()) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /** Abre el panel con la opción seleccionada como activa (o la primera). */\n open(): void {\n if (this.disabled() || this.isOpen()) {\n return;\n }\n const selectedIndex = this.filteredOptions().findIndex(\n (option) => option.value === this.value(),\n );\n this.activeIndex.set(Math.max(selectedIndex, 0));\n this.isOpen.set(true);\n }\n\n /**\n * Cierra el panel. `restoreFocus` (default: solo si el foco está dentro\n * del panel) devuelve el foco al trigger ANTES de desmontar el panel —\n * si no, el elemento enfocado desaparece y el foco cae al `<body>`. Un\n * click afuera no lo restaura: el foco ya se fue a donde se hizo click.\n */\n close(restoreFocus = this.isFocusInPanel()): void {\n if (!this.isOpen()) {\n return;\n }\n if (restoreFocus) {\n this.triggerRef().nativeElement.focus();\n }\n this.isOpen.set(false);\n }\n\n /**\n * Con el panel cerrado: ArrowDown/ArrowUp lo abren en la opción activa,\n * Home/End en la primera/última, y una letra lo abre en la opción que\n * empieza con ella (patrón listbox).\n */\n onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isOpen() || this.disabled()) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n this.open();\n return;\n case 'Home':\n event.preventDefault();\n this.open();\n this.activeIndex.set(0);\n return;\n case 'End':\n event.preventDefault();\n this.open();\n this.activeIndex.set(this.filteredOptions().length - 1);\n return;\n }\n if (this.isTypeaheadKey(event)) {\n const selectedIndex = this.filteredOptions().findIndex(\n (option) => option.value === this.value(),\n );\n const match = this.findTypeaheadMatch(event.key, selectedIndex);\n if (match >= 0) {\n event.preventDefault();\n this.open();\n this.activeIndex.set(match);\n }\n }\n }\n\n /**\n * Teclado con el foco en una opción del panel. Las flechas parten SIEMPRE\n * de la opción que recibió el evento (`index`), no de `activeIndex`: el\n * `mouseenter` mueve `activeIndex` sin mover el foco, y sin esto, con el\n * foco en la opción 1 y el mouse sobre la 4, ArrowDown saltaría a la 5.\n */\n onOptionKeydown(event: KeyboardEvent, option: SelectOption, index: number): void {\n this.activeIndex.set(index);\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n this.focusOption(this.activeIndex());\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n this.focusOption(this.activeIndex());\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n this.focusOption(0);\n this.scrollActiveIntoView();\n break;\n case 'End': {\n event.preventDefault();\n const last = this.filteredOptions().length - 1;\n this.activeIndex.set(last);\n this.focusOption(last);\n this.scrollActiveIntoView();\n break;\n }\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.select(option);\n break;\n default:\n if (this.isTypeaheadKey(event)) {\n const match = this.findTypeaheadMatch(event.key, index);\n if (match >= 0) {\n event.preventDefault();\n this.activeIndex.set(match);\n this.focusOption(match);\n this.scrollActiveIntoView();\n }\n return;\n }\n this.handleExitKeys(event);\n }\n }\n\n /** Un carácter imprimible sin modificadores, y solo cuando no hay buscador (ahí la tecla filtra). */\n private isTypeaheadKey(event: KeyboardEvent): boolean {\n return (\n !this.showSearch() &&\n event.key.length === 1 &&\n event.key !== ' ' &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n );\n }\n\n /**\n * Índice de la opción cuyo label empieza con lo tecleado, o -1. Una sola\n * letra (o la misma repetida) busca desde la opción SIGUIENTE a `from`, para\n * recorrer las que empiezan igual; un prefijo más largo busca desde `from`\n * inclusive, para que la opción actual se conserve mientras siga coincidiendo.\n */\n private findTypeaheadMatch(char: string, from: number): number {\n this.typeaheadBuffer += normalizeForSearch(char);\n clearTimeout(this.typeaheadTimer);\n this.typeaheadTimer = setTimeout(() => (this.typeaheadBuffer = ''), TYPEAHEAD_RESET_MS);\n\n const options = this.filteredOptions();\n const buffer = this.typeaheadBuffer;\n const repeated = [...buffer].every((letter) => letter === buffer[0]);\n const prefix = repeated ? buffer[0] : buffer;\n const start = repeated ? from + 1 : Math.max(from, 0);\n for (let offset = 0; offset < options.length; offset++) {\n const index = (start + offset) % options.length;\n if (normalizeForSearch(options[index].label).startsWith(prefix)) {\n return index;\n }\n }\n return -1;\n }\n\n /** Teclas de salida del buscador: Escape y Tab, igual que desde una opción. */\n onSearchKeydown(event: KeyboardEvent): void {\n this.handleExitKeys(event);\n }\n\n /**\n * Escape cierra y devuelve el foco al trigger; `preventDefault` le avisa a\n * un contenedor que también escucha Escape (ej. `kf-drawer`) que la tecla\n * ya se consumió. Tab cierra y mueve el foco al trigger SIN\n * `preventDefault`: la tabulación nativa continúa desde el trigger, así\n * Tab/Shift+Tab salen del panel hacia el control siguiente/anterior.\n */\n private handleExitKeys(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.close(true);\n } else if (event.key === 'Tab') {\n this.close(true);\n }\n }\n\n private focusOption(index: number): void {\n const options =\n this.panelRef()?.nativeElement.querySelectorAll<HTMLElement>('.kf-select__option');\n options?.[index]?.focus();\n }\n\n private isFocusInPanel(): boolean {\n const active = this.document.activeElement;\n const panel = this.panelRef()?.nativeElement;\n return !!active && !!panel && panel.contains(active);\n }\n\n /** Id de cada opción, para `aria-activedescendant` del buscador. */\n optionId(index: number): string {\n return `${this.listboxId}-option-${index}`;\n }\n\n /** Nombre accesible explícito solo para opciones con `tag`/`detail`, para separar las partes al leerlas. */\n optionAriaLabel(option: SelectOption): string | null {\n if (!option.tag && !option.detail) {\n return null;\n }\n return [option.label, option.tag, option.detail].filter(Boolean).join(', ');\n }\n\n select(option: SelectOption): void {\n this.close(true);\n if (option.value !== this.value()) {\n this.valueChange.emit(option.value);\n }\n }\n\n onSearchInput(event: Event): void {\n this.searchQuery.set((event.target as HTMLInputElement).value);\n // Cada cambio de filtro vuelve a arrancar la navegación desde arriba.\n this.activeIndex.set(0);\n }\n\n /**\n * Mueve `activeIndex` sobre las opciones YA FILTRADAS visibles. Clamp\n * simple (sin wraparound): llegar al final o al principio de la lista se\n * queda ahí en vez de dar la vuelta — es el comportamiento más predecible\n * cuando se combina con un buscador que puede reducir la lista a 1 opción.\n */\n moveActive(delta: number): void {\n const count = this.filteredOptions().length;\n if (count === 0) {\n return;\n }\n this.activeIndex.update((current) => Math.min(Math.max(current + delta, 0), count - 1));\n this.scrollActiveIntoView();\n }\n\n /**\n * Con el foco en el buscador, la opción activa se marca con\n * `aria-activedescendant` pero no recibe foco, así que el navegador no la\n * desplaza a la vista: se hace a mano. (`scrollIntoView` puede no existir\n * en entornos sin layout.)\n */\n private scrollActiveIntoView(): void {\n const option =\n this.panelRef()?.nativeElement.querySelectorAll<HTMLElement>('.kf-select__option')[\n this.activeIndex()\n ];\n option?.scrollIntoView?.({ block: 'nearest' });\n }\n\n selectActive(): void {\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.select(option);\n }\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"triggerId\" [visuallyHidden]=\"hideLabel()\">{{ label() }}</kf-field-label>\n}\n<button\n #trigger\n type=\"button\"\n [id]=\"triggerId\"\n class=\"kf-select__trigger\"\n [class.kf-select__trigger--disabled]=\"disabled()\"\n [class.kf-select__trigger--invalid]=\"invalid()\"\n [class.kf-select__trigger--with-icon]=\"!!icon()\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? listboxId : null\"\n [attr.aria-label]=\"triggerAriaLabel()\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [class.kf-select__trigger--tagged]=\"!!selectedOption()?.tag\"\n (click)=\"toggle()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-select__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n @if (prefix(); as prefixText) {\n <span class=\"kf-select__prefix\">{{ prefixText }}</span>\n }\n <span\n class=\"kf-select__value\"\n [class.kf-select__value--placeholder]=\"!selectedOption()\"\n [class.kf-select__value--fit]=\"width() === 'fit'\"\n >\n @if (width() === 'fit') {\n <span class=\"kf-select__value-text\">{{ triggerText() }}</span>\n <!-- Reserva el ancho de la opción más larga: oculto a la vista y al\n árbol de accesibilidad, solo aporta tamaño. -->\n <span class=\"kf-select__sizer\" aria-hidden=\"true\">\n @for (text of fitTexts(); track text) {\n <span>{{ text }}</span>\n }\n </span>\n } @else {\n {{ triggerText() }}\n }\n </span>\n @if (width() === 'fit' && fitTags().length) {\n <!-- Con `fit` el hueco del tag se reserva siempre con el más ancho: los\n demás se apilan en la misma celda y solo el elegido se ve. -->\n <span class=\"kf-select__tag-slot\">\n @for (tag of fitTags(); track tag) {\n <kf-badge\n class=\"kf-select__tag\"\n [class.kf-select__tag--reserved]=\"tag !== selectedOption()?.tag\"\n [attr.aria-hidden]=\"tag !== selectedOption()?.tag ? 'true' : null\"\n >{{ tag }}</kf-badge\n >\n }\n </span>\n } @else if (selectedOption()?.tag; as tag) {\n <kf-badge class=\"kf-select__tag\">{{ tag }}</kf-badge>\n }\n <span\n class=\"kf-select__caret kf-caret\"\n [class.kf-select__caret--open]=\"isOpen()\"\n [class.kf-caret--open]=\"isOpen()\"\n aria-hidden=\"true\"\n ></span>\n</button>\n@if (errorMessage(); as message) {\n <span class=\"kf-select__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n}\n<ng-template #panelTemplate>\n <div #panel class=\"kf-select__panel\" [class.kf-select__panel--compact]=\"variant() === 'compact'\">\n @if (panelTitle(); as title) {\n <div class=\"kf-select__panel-title kf-overline-text\" aria-hidden=\"true\">{{ title }}</div>\n }\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-select__search\"\n placeholder=\"Buscar…\"\n aria-label=\"Buscar opción\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"true\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"filteredOptions().length ? optionId(activeIndex()) : null\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n (keydown.enter)=\"$event.preventDefault(); selectActive()\"\n (keydown)=\"onSearchKeydown($event)\"\n />\n }\n <ul\n class=\"kf-select__list\"\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabel() ? null : triggerId\"\n >\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-select__option\"\n [id]=\"optionId(i)\"\n [class.kf-select__option--selected]=\"option.value === value()\"\n [class.kf-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"-1\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.aria-label]=\"optionAriaLabel(option)\"\n [class.kf-select__option--rich]=\"!!(option.tag || option.detail)\"\n (click)=\"select(option)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown)=\"onOptionKeydown($event, option, i)\"\n >\n @if (option.tag || option.detail) {\n <span class=\"kf-select__option-main\">\n <span class=\"kf-select__option-label\">{{ option.label }}</span>\n @if (option.tag) {\n <kf-badge class=\"kf-select__tag\">{{ option.tag }}</kf-badge>\n }\n </span>\n @if (option.detail) {\n <span class=\"kf-select__option-detail\">{{ option.detail }}</span>\n }\n } @else {\n {{ option.label }}\n }\n </li>\n } @empty {\n <li class=\"kf-select__empty\">\n {{ searchQuery() ? 'Sin resultados' : 'Sin opciones disponibles' }}\n </li>\n }\n </ul>\n </div>\n</ng-template>\n","import { Component, computed, input, model, output } from '@angular/core';\nimport { Select } from '../select/Select';\n\n/** Un número de página clickeable o un separador \"…\" no interactivo. */\nexport type PaginationItem = { type: 'page'; page: number } | { type: 'ellipsis' };\n\nconst SIBLINGS = 1;\n\n/**\n * Paginador numerado con elipsis + prev/next.\n *\n * Algoritmo de elipsis estándar: siempre se muestran la primera página, la\n * última, la página actual y un par de vecinas alrededor de la actual; el\n * resto de los huecos se colapsa en un separador \"…\". Cuando el hueco entre\n * dos números visibles es de exactamente una página, se muestra ese número\n * en vez de un \"…\" (no tiene sentido colapsar un solo elemento).\n *\n * El contenido proyectado (`<ng-content>`) es para el texto informativo\n * opcional (ej. \"21–40 de 273\"), a la izquierda de los controles.\n *\n * <kf-pagination [page]=\"page\" [pages]=\"totalPages\" (pageChange)=\"page = $event\">\n * 21–40 de 273\n * </kf-pagination>\n *\n * Con `pageSizeOptions`, agrega un select de \"N por página\" entre el texto\n * informativo y los controles de navegación — el consumidor decide el\n * tamaño real vía `pageSize`/`pageSizeChange` (two-way opcional, ninguno de\n * los dos es requerido si no se usa el selector):\n *\n * <kf-pagination [page]=\"page\" [pages]=\"totalPages\" (pageChange)=\"page = $event\"\n * [pageSizeOptions]=\"[10, 25, 50]\" [(pageSize)]=\"pageSize\">\n * 21–40 de 273\n * </kf-pagination>\n */\n@Component({\n selector: 'kf-pagination',\n imports: [Select],\n templateUrl: './Pagination.html',\n styleUrl: './Pagination.css',\n})\nexport class Pagination {\n readonly page = input(1);\n readonly pages = input(1);\n readonly pageChange = output<number>();\n\n /** Opciones del selector \"N por página\" — sin esto, el selector no se\n * renderiza (mismo criterio que `[footer]`/`[actions]` de otros\n * componentes: ausente por default, nunca forzado). `kf-select` en\n * `variant=\"compact\"` no impone un máximo de opciones, a diferencia de\n * `kf-segmented` (pensado solo para 2-3). */\n readonly pageSizeOptions = input<number[]>([]);\n readonly pageSize = model<number | null>(null);\n\n /** Lista de números de página y separadores a renderizar, ya resuelta por el algoritmo de elipsis. */\n readonly items = computed<PaginationItem[]>(() =>\n buildPaginationItems(this.page(), this.pages()),\n );\n\n /** Con una sola página (o ninguna), el `<nav>` de prev/next+números no\n * aporta nada navegable — antes se dejaba en el DOM igual (oculto solo\n * por un hack `::ng-deep` del consumidor, ver `route-assistance-monorepo`)\n * y el footer quedaba con el selector \"Filas\" descoordinado, como si le\n * faltara una pieza. Sacar el `<nav>` del DOM (no `display:none`) resuelve\n * esto para cualquier consumidor de `kf-pagination`, no solo para quien ya\n * tenía el hack. El `divider` reusa el mismo criterio: sin `nav` no hay\n * nada del otro lado que separar, así que tampoco corresponde dejarlo. */\n protected readonly hasNav = computed(() => this.pages() > 1);\n\n /** `kf-select` trabaja con `value: string` — cada tamaño numérico se\n * mapea a su representación en texto, ida y vuelta. */\n protected readonly pageSizeSelectOptions = computed<string[]>(() =>\n this.pageSizeOptions().map(String),\n );\n protected readonly pageSizeValue = computed(() => String(this.pageSize() ?? ''));\n\n protected setPageSize(value: string): void {\n this.pageSize.set(Number(value));\n }\n\n goTo(target: number): void {\n const clamped = Math.min(Math.max(target, 1), this.pages());\n if (clamped === this.page()) {\n return;\n }\n this.pageChange.emit(clamped);\n }\n}\n\n/**\n * Construye la lista de items visibles con el algoritmo de elipsis estándar:\n * primera página, última página, actual ± `SIBLINGS`, y un \"…\" por cada hueco\n * mayor a una página entre esos bloques.\n */\nfunction buildPaginationItems(current: number, total: number): PaginationItem[] {\n const totalPages = Math.max(total, 1);\n const safeCurrent = Math.min(Math.max(current, 1), totalPages);\n\n const visible = new Set<number>([1, totalPages, safeCurrent]);\n for (let offset = 1; offset <= SIBLINGS; offset++) {\n visible.add(safeCurrent - offset);\n visible.add(safeCurrent + offset);\n }\n\n const sortedPages = [...visible].filter((p) => p >= 1 && p <= totalPages).sort((a, b) => a - b);\n\n const items: PaginationItem[] = [];\n for (let i = 0; i < sortedPages.length; i++) {\n const pageNumber = sortedPages[i];\n if (i > 0) {\n const gap = pageNumber - sortedPages[i - 1];\n if (gap === 2) {\n // Hueco de una sola página: mostrarla en vez de colapsarla en \"…\".\n items.push({ type: 'page', page: pageNumber - 1 });\n } else if (gap > 2) {\n items.push({ type: 'ellipsis' });\n }\n }\n items.push({ type: 'page', page: pageNumber });\n }\n\n return items;\n}\n","<div class=\"kf-pagination\">\n <div class=\"kf-pagination__info kf-caption-text\" aria-live=\"polite\">\n <ng-content />\n </div>\n\n <div class=\"kf-pagination__controls\">\n @if (pageSizeOptions().length > 0) {\n <div class=\"kf-pagination__size\">\n <span class=\"kf-pagination__size-label kf-caption-text\">Filas</span>\n <kf-select\n variant=\"compact\"\n ariaLabel=\"Filas por página\"\n [options]=\"pageSizeSelectOptions()\"\n [value]=\"pageSizeValue()\"\n (valueChange)=\"setPageSize($event)\"\n />\n </div>\n @if (hasNav()) {\n <div class=\"kf-pagination__divider\" aria-hidden=\"true\"></div>\n }\n }\n\n @if (hasNav()) {\n <nav class=\"kf-pagination__nav\" aria-label=\"Paginación\">\n <button\n type=\"button\"\n class=\"kf-pagination__control\"\n [disabled]=\"page() <= 1\"\n aria-label=\"Página anterior\"\n (click)=\"goTo(page() - 1)\"\n >\n ‹\n </button>\n\n @for (item of items(); track $index) {\n @if (item.type === 'page') {\n <button\n type=\"button\"\n class=\"kf-pagination__page\"\n [class.kf-pagination__page--active]=\"item.page === page()\"\n [attr.aria-current]=\"item.page === page() ? 'page' : null\"\n [attr.aria-label]=\"'Ir a la página ' + item.page\"\n (click)=\"goTo(item.page)\"\n >\n {{ item.page }}\n </button>\n } @else {\n <span class=\"kf-pagination__ellipsis\" aria-hidden=\"true\">…</span>\n }\n }\n\n <button\n type=\"button\"\n class=\"kf-pagination__control\"\n [disabled]=\"page() >= pages()\"\n aria-label=\"Página siguiente\"\n (click)=\"goTo(page() + 1)\"\n >\n ›\n </button>\n </nav>\n }\n </div>\n</div>\n","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport type ViewToggleOption = 'table' | 'cards';\n\n/**\n * Switch de dos posiciones para alternar entre vista de tabla y vista de\n * tarjetas. Pensado para usarse dentro de DataTable, pero es standalone e\n * independiente: no asume nada sobre el componente que lo contiene.\n *\n * Se implementa como un grupo de radio (role=\"radiogroup\") en vez de dos\n * botones sueltos: semánticamente es una única selección excluyente entre\n * dos estados, no dos acciones independientes. Esto también habilita\n * navegación con flechas izquierda/derecha, igual que un <input type=\"radio\">\n * nativo agrupado.\n *\n * Con `iconOnly` cada opción muestra solo su ícono (`list` / `grid`); el\n * nombre accesible y el tooltip salen de `tableLabel` / `cardsLabel`. El\n * objetivo táctil mide 32px en escritorio y 44px en pantallas táctiles o de\n * hasta 640px.\n *\n * <kf-view-toggle [view]=\"view\" (viewChange)=\"view = $event\" />\n * <kf-view-toggle iconOnly [view]=\"view\" (viewChange)=\"view = $event\" />\n */\n@Component({\n selector: 'kf-view-toggle',\n imports: [Icon],\n templateUrl: './ViewToggle.html',\n styleUrl: './ViewToggle.css',\n})\nexport class ViewToggle {\n readonly view = input.required<ViewToggleOption>();\n /** Solo íconos (el rótulo queda como nombre accesible y `title`). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n /** Rótulo de la opción de tabla. */\n readonly tableLabel = input('Tabla');\n /** Rótulo de la opción de tarjetas. */\n readonly cardsLabel = input('Tarjetas');\n /** Nombre accesible del grupo. */\n readonly ariaLabel = input('Alternar tipo de vista');\n readonly viewChange = output<ViewToggleOption>();\n\n select(next: ViewToggleOption): void {\n if (next === this.view()) {\n return;\n }\n this.viewChange.emit(next);\n }\n\n /** Navegación estándar de ARIA radiogroup: flechas mueven foco y seleccionan. */\n onKeydown(event: KeyboardEvent): void {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') {\n return;\n }\n\n event.preventDefault();\n const next: ViewToggleOption = this.view() === 'table' ? 'cards' : 'table';\n this.select(next);\n\n const current = event.currentTarget as HTMLElement;\n const buttons =\n current.parentElement?.querySelectorAll<HTMLButtonElement>('.kf-view-toggle__option');\n const nextButton = Array.from(buttons ?? []).find((button) => button !== current);\n nextButton?.focus();\n }\n}\n","<div class=\"kf-view-toggle\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--icon]=\"iconOnly()\"\n [class.kf-view-toggle__option--active]=\"view() === 'table'\"\n [attr.aria-checked]=\"view() === 'table'\"\n [attr.aria-label]=\"iconOnly() ? tableLabel() : null\"\n [attr.title]=\"iconOnly() ? tableLabel() : null\"\n [attr.tabindex]=\"view() === 'table' ? 0 : -1\"\n (click)=\"select('table')\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (iconOnly()) {\n <kf-icon name=\"list\" size=\"md\" />\n } @else {\n {{ tableLabel() }}\n }\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--icon]=\"iconOnly()\"\n [class.kf-view-toggle__option--active]=\"view() === 'cards'\"\n [attr.aria-checked]=\"view() === 'cards'\"\n [attr.aria-label]=\"iconOnly() ? cardsLabel() : null\"\n [attr.title]=\"iconOnly() ? cardsLabel() : null\"\n [attr.tabindex]=\"view() === 'cards' ? 0 : -1\"\n (click)=\"select('cards')\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (iconOnly()) {\n <kf-icon name=\"layout-grid\" size=\"md\" />\n } @else {\n {{ cardsLabel() }}\n }\n </button>\n</div>\n","import {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n untracked,\n viewChild,\n TemplateRef,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Icon } from '../icon/Icon';\nimport { Pagination } from '../pagination/Pagination';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { ViewToggle } from '../view-toggle/ViewToggle';\n\n/**\n * Zona que ocupa la columna en la vista de cards. La vista de tabla ignora\n * esto (salvo `media`, que igual se rinde como thumbnail en vez de imprimir\n * la URL):\n * - `media`: thumbnail a la izquierda del encabezado; el valor de la celda se\n * usa como `src` salvo que la columna traiga su `cellTemplates`.\n * - `title`: título del encabezado (ej. la patente/unidad).\n * - `status`: chip/estado al lado del título.\n * - `field` (default): par label/valor en el cuerpo. Con `cardClamp`, el\n * valor ocupa el ancho completo (sin label visible) recortado a N líneas.\n * - `meta`: dato secundario corto (fecha, monto) en una fila inferior de la\n * tarjeta, rótulo chico arriba y valor abajo; con `emphasis` se destaca\n * (ej. el precio) y se alinea al final.\n * - `action`: va al pie, separado del cuerpo por una línea.\n */\nexport type DataTableCardRole = 'media' | 'title' | 'status' | 'field' | 'meta' | 'action';\n\nexport interface DataTableColumn {\n key: string;\n label: string;\n right?: boolean;\n className?: string;\n cardRole?: DataTableCardRole;\n /** Habilita ordenar por esta columna clickeando su header (solo vista\n * tabla — en cards no hay header clickeable). Ciclo asc → desc → sin\n * orden, un click a la vez. */\n sortable?: boolean;\n /** Fija la columna a un borde del scroll horizontal — típicamente la\n * primera (identificador) y/o la última (acciones). Columnas `sticky`\n * del mismo lado deben ser consecutivas y estar en ese extremo del\n * array `columns`; el offset de cada una se calcula sumando el ancho\n * real de las que ya quedaron fijas antes, medido en runtime (no hay\n * forma de conocer el ancho de antemano, las columnas son de ancho\n * variable según su contenido). */\n sticky?: 'left' | 'right';\n /** Ancho mínimo forzado — evita que una columna angosta (ej. un chip\n * corto) se comprima más de la cuenta cuando hay poco espacio y otras\n * columnas compiten por él. */\n minWidth?: string;\n /** Ancho fijo de la columna (ej. `'56px'` para una columna de acciones\n * solo ícono, `'9rem'` para una fecha). En la tabla va como `width` de la\n * celda; en `kf-quote-picker` (`modalLayout=\"list\"`), como el ancho de su\n * pista en la grilla. */\n width?: string;\n /** Techo de ancho. En la tabla, junto con `truncate`, reemplaza al\n * techo automático (ver `truncate`). En una tabla con `grow` admite\n * unidades de contenedor relativas al ancho de la tabla, ej.\n * `'min(14rem, 22cqw)'`: el techo baja solo cuando la tabla es angosta. */\n maxWidth?: string;\n /** Peso con el que la columna se reparte TODO el espacio sobrante de la\n * tabla (ej. `1`; con dos columnas `grow: 2` y `grow: 1`, la primera\n * recibe el doble). Con al menos una columna `grow` la tabla pasa a\n * reparto de anchos: las columnas con `width` mantienen ese ancho, las que\n * no traen `width` ni `grow` se ajustan a su contenido (con `maxWidth` como\n * techo) y las `grow` absorben el resto. Se combina con `truncate` para\n * que el texto largo ocupe el espacio sin empujar a las demás. Sin ninguna\n * columna `grow`, el reparto es el de siempre. */\n grow?: number;\n /** Texto largo en UNA línea con elipsis y el valor completo en `title`\n * (ej. el modelo de un vehículo). La columna deja de imponer su ancho\n * mínimo: cede espacio para que las demás (y la de acciones) entren en\n * pantalla sin scroll horizontal. Con `maxWidth`, se corta en ese ancho. */\n truncate?: boolean;\n /** Alineación horizontal. `'end'` equivale a `right: true` (que se\n * mantiene por compatibilidad). */\n align?: 'start' | 'center' | 'end';\n /** Oculta el rótulo del encabezado a la vista (queda para lectores de\n * pantalla) — ej. una columna de acciones solo ícono. */\n hideLabel?: boolean;\n /** Valor en tipografía monoespaciada (ej. un identificador \"COT-2026-0042\"),\n * en la celda de la tabla y como título de la tarjeta. */\n mono?: boolean;\n /** Vista tarjetas, columna `field`: el valor va a ancho completo (rótulo\n * solo para lectores de pantalla), recortado a este número de líneas con\n * el texto completo en `title` — ej. el modelo del vehículo con `2`. */\n cardClamp?: number;\n /** Destaca el valor (peso y color de tinta) — ej. el monto. En la vista\n * tarjetas, una columna `meta` con `emphasis` va al final de su fila. */\n emphasis?: boolean;\n /** Celda interactiva: su contenido (texto, `cellTemplates` o `render`) se\n * renderiza dentro de un `<button type=\"button\">` real —enfocable con Tab,\n * con foco visible y activable con Enter o Espacio—, tanto en la vista de\n * tabla como en la de tarjetas. Al activarla emite `cellClick`\n * (`{ row, column, index }`) y NO emite `rowClick`. El contenido de un\n * `cellTemplates` en una columna interactiva debe ser fraseo no interactivo\n * (texto, íconos, indicadores): un enlace o botón dentro de otro botón es\n * HTML inválido. El nombre accesible sale del contenido o, si no alcanza\n * (un indicador sin texto), de `cellAriaLabel`. */\n interactive?: boolean;\n}\n\n/** Payload de `cellClick`: la fila, la columna interactiva y el índice de la fila renderizada. */\nexport interface DataTableCellClick<T = unknown> {\n row: T;\n column: DataTableColumn;\n index: number;\n}\n\n/** Controles cuyo clic/Enter NO debe activar además la fila o tarjeta que los contiene. */\nconst INTERACTIVE_CONTROL_SELECTOR =\n 'a[href], button, input, select, textarea, summary, label, [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"tab\"], [contenteditable=\"true\"]';\n\n/** Piso de ancho de una columna `grow` que no declara `minWidth` ni `width`. */\nconst GROW_MIN_WIDTH = '8rem';\n\n/** Tope de filas (o tarjetas) esqueleto: con `loading`, una página de 50 no pinta 50. */\nexport const DATA_TABLE_MAX_SKELETON_ROWS = 12;\n\n/** Vistas disponibles cuando `cardable` está activo. */\nexport type DataTableView = 'table' | 'cards';\n\n/** Opciones de \"filas por página\" estándar del portal — 10 como default\n * cubre bien tanto un dataset chico (ej. Beneficios) como uno con volumen\n * real (ej. 30+ cuotas en Billing), sin sentirse vacío ni insuficiente; 25\n * y 50 escalan ~2.5x cada paso, evitando un salto brusco donde la opción\n * del medio no aporta nada. Cualquier consumidor puede pisar este default\n * con su propio `pageSizeOptions` si su caso lo justifica — pasar `[]`\n * explícitamente desactiva el selector aunque `pageSize` esté activo. */\nexport const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50];\n\n/** Densidad de fila: `comfortable` (default, el padding actual) o\n * `compact` (menos padding vertical, para tablas con muchas filas donde\n * priorizar cantidad visible sobre aire entre filas). */\nexport type DataTableDensity = 'comfortable' | 'compact';\n\n/** `key:direction` — mismo formato que `sort` de `kf-quote-picker`, para\n * que un consumidor que ya conoce ese patrón no aprenda uno nuevo acá. */\nexport type DataTableSort = `${string}:${'asc' | 'desc'}`;\n\n/**\n * Tabla estandarizada con soporte opcional de toggle tabla/cards.\n *\n * El \"render\" custom por columna de la spec original (una función que\n * devuelve JSX) se resuelve acá de dos formas, de la más simple a la más\n * flexible:\n * - `render`: función `(row) => string` para el caso típico de mostrar un\n * valor derivado/formateado de la fila como texto plano.\n * - `cellTemplates`: mapa `key -> TemplateRef` para cuando un consumidor\n * necesita marcado real dentro de una celda (badges, links, botones). Se\n * proyecta con `ngTemplateOutlet` y recibe `{ $implicit: row, index }`.\n * Se eligió esta combinación en vez de content-projection por columna\n * (ng-content con selector) porque las columnas son dinámicas (vienen de\n * `columns()`), y `ngTemplateOutlet` es el mecanismo estándar de Angular\n * para \"insertar esta plantilla por cada fila de este array\".\n *\n * En la vista de cards, `cardRole` por columna reparte el contenido en zonas\n * — encabezado (thumbnail + título + estado), cuerpo (pares label/valor) y\n * pie separado por una línea para las acciones. Sin `cardRole`, todas las\n * columnas caen en el cuerpo, igual que antes.\n *\n * El toggle tabla/cards es `kf-view-toggle`, componente standalone propio.\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" (rowClick)=\"onRowClick($event)\">\n * <kf-empty-state empty>No hay resultados para mostrar.</kf-empty-state>\n * </kf-data-table>\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [cardable]=\"true\" defaultView=\"cards\" />\n *\n * Loading nativo: con `loading` en `true`, la tabla se reemplaza por un\n * placeholder (`kf-skeleton` por celda/card) — `skeletonRows` filas si se\n * pasa; si no, las de `pageSize`, o 5 si no hay paginación activa. Nunca más\n * de 12 (`DATA_TABLE_MAX_SKELETON_ROWS`): con una página de 50 no se pintan\n * 50 placeholders. Ignora `rows()`/el slot\n * `[empty]` mientras dura (no sabemos aún si el resultado real estará\n * vacío), y respeta la vista activa (tabla o cards) para no cambiar el\n * layout de golpe cuando los datos reales lleguen. El toggle tabla/cards y\n * el header de columnas siguen visibles — solo el cuerpo se reemplaza.\n *\n * El placeholder respeta la columna: en la tabla cada celda conserva su\n * `align`, `width`, `minWidth` y `maxWidth` (una columna numérica lleva una\n * barra corta alineada al final, una de acciones un cuadrado chico, el resto\n * barras de anchos distintos) y la fila reserva el alto de una línea de texto.\n * En tarjetas reproduce la estructura según `cardRole`: encabezado (miniatura,\n * título y estado), campos con su rótulo, fila de `meta` y pie de acciones:\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows()\" [loading]=\"isLoading()\">\n * <kf-empty-state empty>No hay resultados para mostrar.</kf-empty-state>\n * </kf-data-table>\n *\n * El slot `[footer]` (página 15: \"slot de pie para paginación\") va siempre\n * al final, en ambas vistas, separado por una línea — pensado para proyectar\n * `<kf-pagination>`, que sigue siendo un componente independiente.\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\">\n * <kf-pagination footer [page]=\"page()\" [total]=\"total()\" (pageChange)=\"page.set($event)\" />\n * </kf-data-table>\n *\n * Paginación interna opcional: con `pageSize`, la tabla pagina sola y\n * agrega su propio `kf-pagination` en el footer nativo (el slot\n * `[footer]` proyectado sigue disponible en paralelo). El selector de \"N\n * por página\" viene activo por defecto con `DEFAULT_PAGE_SIZE_OPTIONS`\n * ([10, 25, 50], estándar del portal) — pasar `pageSizeOptions` propio lo\n * pisa, y pasar `[]` lo desactiva (paginación sin selector). `itemLabel`\n * completa el texto informativo (\"1–10 de 42 beneficios\").\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [pageSize]=\"25\" itemLabel=\"beneficios\" />\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [pageSize]=\"25\" [pageSizeOptions]=\"[]\" />\n *\n * La página es `[(page)]` (el consumidor puede llevarla a la URL) y se\n * corrige sola si queda fuera de rango. Por defecto un cambio de `rows` la\n * devuelve a 1; con `keepPageOnRowsChange` la conserva (el consumidor decide\n * cuándo volver a 1). Un `pageSize` nuevo del consumidor pisa el elegido en\n * el selector, y `pageSizeChange` avisa cuando el usuario lo cambia.\n *\n * Ordenamiento por columna: cada `DataTableColumn` con `sortable: true`\n * vuelve su header un botón (Tab, Enter y Espacio) que expone el estado con\n * `aria-sort` (`ascending`/`descending`/`none`), con el mismo formato `key:direction` que\n * usa `sort` de `kf-quote-picker` (two-way manual, no `model()` — el\n * consumidor decide si persiste el valor o lo descarta al desmontar):\n *\n * <kf-data-table [columns]=\"columns\" [rows]=\"rows\" [sort]=\"sort()\" (sortChange)=\"sort.set($event)\" />\n *\n * Columnas fijas: `sticky: 'left' | 'right'` en la columna ancla esa\n * columna a un borde del scroll horizontal — típicamente el identificador\n * (izquierda) y/o las acciones (derecha) en una tabla con muchas columnas.\n *\n * Densidad: `density=\"compact\"` reduce el padding vertical de cada fila,\n * para priorizar cantidad de filas visibles sobre aire entre ellas.\n *\n * Listados largos con textos largos (ej. cotizaciones con el modelo del\n * vehículo): la columna de texto largo lleva `truncate` (elipsis + `title`),\n * las de dato corto `width`/`align: 'end'`, y la de acciones solo ícono\n * `width` angosto + `hideLabel` + `sticky: 'right'`. Así la acción queda\n * siempre a la vista sin scroll horizontal:\n *\n * columns = [\n * { key: 'id', label: 'Cotización', width: '9rem' },\n * { key: 'model', label: 'Vehículo', truncate: true, minWidth: '10rem' },\n * { key: 'amount', label: 'Monto', align: 'end', width: '8rem' },\n * { key: 'open', label: 'Abrir', hideLabel: true, width: '56px', sticky: 'right' },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"quotes\" [rowClickable]=\"true\"\n * (rowClick)=\"open($event.row)\" [cellTemplates]=\"{ open: openCell }\" />\n *\n * Reparto de anchos: con `grow` en alguna columna, esa(s) se reparten TODO el\n * espacio sobrante según su peso, las de `width` lo mantienen y las que no\n * traen `width` ni `grow` se ajustan a su contenido (con `maxWidth` como\n * techo). Así una columna de dato corto (estado, precio, fecha) no acapara\n * espacio y el texto largo (el vehículo) lo aprovecha:\n *\n * columns = [\n * { key: 'id', label: 'Cotización', width: '8.5rem', mono: true },\n * { key: 'model', label: 'Vehículo', grow: 1, truncate: true },\n * { key: 'issuedAt', label: 'Emisión' },\n * { key: 'price', label: 'Precio', align: 'end', emphasis: true },\n * { key: 'status', label: 'Estado', truncate: true, maxWidth: '14rem' },\n * ];\n *\n * Listado completo con vista tarjetas (ej. cotizaciones): la vista es\n * two-way (`[(view)]`) y el toggle interno se oculta con\n * `[showViewToggle]=\"false\"` cuando el consumidor lo pone en su barra. En\n * tarjetas: título (`mono`) y estado en una fila, el campo principal a\n * ancho completo en 2 líneas (`cardClamp: 2`), y fecha/monto en una fila\n * inferior (`cardRole: 'meta'`, el monto con `emphasis`). Las tarjetas de\n * una fila miden lo mismo; `cardMinWidth` fija el ancho mínimo. Con\n * `rowClickable` la tarjeta entera es un botón (Enter/Espacio):\n *\n * columns = [\n * { key: 'id', label: 'Cotización', cardRole: 'title', mono: true },\n * { key: 'status', label: 'Estado', cardRole: 'status' },\n * { key: 'model', label: 'Vehículo', truncate: true, cardClamp: 2 },\n * { key: 'date', label: 'Fecha', cardRole: 'meta', width: '7rem' },\n * { key: 'amount', label: 'Monto', cardRole: 'meta', align: 'end', emphasis: true },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"quotes\" cardable [(view)]=\"view\"\n * [showViewToggle]=\"false\" cardMinWidth=\"300px\" [rowClickable]=\"true\"\n * (rowClick)=\"open($event.row)\" />\n *\n * Celdas interactivas (modo aditivo, ej. una matriz unidad × etapa donde cada\n * celda de etapa es un indicador de estado): una columna con\n * `interactive: true` renderiza su contenido dentro de un `<button>` real\n * —focusable, con foco visible y activación con Enter o Espacio— en la vista\n * de tabla y en la de tarjetas, y emite `cellClick` con `{ row, column, index }`.\n * `cellAriaLabel` da el nombre accesible de cada celda cuando el contenido no\n * lo aporta por sí solo (un indicador sin texto); en tarjetas conviene incluir\n * el contexto de la fila, porque no hay encabezado de columna que lo dé:\n *\n * columns = [\n * { key: 'unit', label: 'Unidad', cardRole: 'title', sticky: 'left' },\n * { key: 'stage1', label: 'Recepción', interactive: true, align: 'center' },\n * { key: 'stage2', label: 'Entrega', interactive: true, align: 'center' },\n * ];\n * <kf-data-table [columns]=\"columns\" [rows]=\"units\" cardable [rowKey]=\"unitId\"\n * [cellTemplates]=\"{ stage1: stageCell, stage2: stageCell }\"\n * [cellAriaLabel]=\"stageLabel\" (cellClick)=\"openStage($event.row, $event.column)\" />\n *\n * Convive con `rowClick`: la fila sigue emitiéndolo desde cualquier punto que\n * no sea una celda interactiva. En tarjetas, la tarjeta deja de ser un botón\n * (un botón dentro de un `role=\"button\"` es inválido) salvo que se fuerce con\n * `[rowClickable]=\"true\"`. `sticky`, `cellTemplates`, `currentRowKey`, la\n * ordenación y la paginación no cambian.\n */\n@Component({\n selector: 'kf-data-table',\n imports: [Icon, NgTemplateOutlet, Pagination, Skeleton, ViewToggle],\n templateUrl: './DataTable.html',\n styleUrl: './DataTable.css',\n})\nexport class DataTable<T = unknown> {\n readonly columns = input.required<DataTableColumn[]>();\n readonly rows = input.required<T[]>();\n /** Placeholder nativo (`kf-skeleton`) mientras los datos reales cargan —\n * ver el doc-comment de la clase para el detalle. */\n readonly loading = input(false);\n /** Filas (o tarjetas) esqueleto mientras `loading` es `true`. Sin valor: el\n * `pageSize` con paginación activa, o 5. Máximo\n * {@link DATA_TABLE_MAX_SKELETON_ROWS}. */\n readonly skeletonRows = input<number | undefined>(undefined);\n private readonly scrollEl = viewChild<ElementRef<HTMLElement>>('scroll');\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * `.kf-data-table__scroll` tiene `overflow-x: auto` sin ningún indicador\n * visual — con varias columnas y poco ancho disponible, la tabla se corta\n * en el borde y nada le avisa al usuario que hay más contenido\n * scrolleando. `canScrollLeft`/`canScrollRight` alimentan un fade en cada\n * borde — visible solo cuando de verdad hay algo que revelar de ese lado,\n * así una tabla que entra completa no muestra fades falsos.\n */\n protected readonly canScrollLeft = signal(false);\n protected readonly canScrollRight = signal(false);\n /**\n * Hay contenido oculto por scroll horizontal. Solo entonces el contenedor\n * es una región nombrada y enfocable (`tabindex=\"0\"`, `role=\"region\"`):\n * sin foco, quien navega con teclado no puede desplazarlo (WCAG 2.1.1).\n * Una tabla que entra completa no suma una parada de Tab vacía.\n */\n protected readonly hasOverflow = signal(false);\n\n constructor() {\n afterNextRender(() => {\n const el = this.scrollEl()?.nativeElement;\n if (!el) {\n return;\n }\n const update = () => this.updateScrollState(el);\n update();\n\n el.addEventListener('scroll', update, { passive: true });\n const observer = new ResizeObserver(update);\n observer.observe(el);\n\n this.destroyRef.onDestroy(() => {\n el.removeEventListener('scroll', update);\n observer.disconnect();\n });\n });\n\n // El ancho de una columna `sticky` depende de su contenido — re-medir\n // cada vez que cambian las columnas o las filas mostradas (no solo una\n // vez, a diferencia del fade de scroll que solo depende del contenedor).\n afterRenderEffect(() => {\n this.columns();\n this.displayedRows();\n this.measureStickyOffsets();\n });\n\n // `rows()` cambia de identidad cuando el consumidor filtra el dataset\n // base (ej. cambiar de tab): la página vuelve a 1, salvo con\n // `keepPageOnRowsChange`, donde el consumidor lleva la página (ej. en la\n // URL) y solo se corrige si queda fuera de rango (ver abajo). La primera\n // ejecución no cuenta: respeta la página inicial de `[(page)]`. Reacciona\n // solo a `rows()` y a la bandera, no a `page()`/`sort()`.\n let firstRowsRun = true;\n effect(() => {\n this.rows();\n const keep = this.keepPageOnRowsChange();\n if (firstRowsRun) {\n firstRowsRun = false;\n return;\n }\n if (!keep) {\n this.page.set(1);\n }\n });\n\n // Una página fuera de rango (ej. `?page=9` con 3 páginas, o un filtro que\n // deja menos filas) se corrige a la más cercana válida y se notifica por\n // `pageChange`. Sin filas o cargando no se corrige: el total aún no es\n // real y se perdería la página pedida.\n effect(() => {\n if (this.loading() || this.rows().length === 0 || !this.effectivePageSize()) {\n return;\n }\n const total = this.totalPages();\n const current = this.page();\n if (current > total) {\n this.page.set(total);\n } else if (current < 1) {\n this.page.set(1);\n }\n });\n\n // Un `pageSize` nuevo desde el consumidor (ej. leído de la URL) manda\n // sobre el tamaño que el usuario eligió antes en el selector.\n effect(() => {\n this.pageSize();\n untracked(() => this.internalPageSize.set(null));\n });\n }\n\n private updateScrollState(el: HTMLElement): void {\n // 1px de margen: scrollWidth/scrollLeft pueden traer subpíxeles que\n // dejarían el fade \"prendido\" en una tabla que en los hechos ya llegó\n // al final (o nunca tuvo overflow real).\n this.canScrollLeft.set(el.scrollLeft > 1);\n this.canScrollRight.set(el.scrollWidth - el.clientWidth - el.scrollLeft > 1);\n this.hasOverflow.set(el.scrollWidth - el.clientWidth > 1);\n }\n /** Default: índice de la fila dentro de `rows`. */\n readonly rowKey = input<(row: T, index: number) => string | number>();\n /** Sin borde/sombra de card — para tablas anidadas dentro de otra card. */\n readonly flush = input(false);\n /** Habilita el toggle de vista tabla/cards. */\n readonly cardable = input(false, { transform: booleanAttribute });\n readonly defaultView = input<DataTableView>('table');\n /** Muestra el toggle tabla/tarjetas interno (con `cardable`). En `false`,\n * el consumidor controla la vista con `[(view)]` desde su propio control. */\n readonly showViewToggle = input(true, { transform: booleanAttribute });\n /** Ancho mínimo de cada tarjeta en la grilla (default `220px`, histórico).\n * Nunca supera el ancho disponible: en pantallas angostas, una columna. */\n readonly cardMinWidth = input('220px');\n /**\n * Formateo simple de celda como texto: `(row) => string`. Para marcado\n * real (badges, links, botones) usar `cellTemplates`.\n */\n readonly render = input<(row: T) => string>();\n /** Mapa `columnKey -> TemplateRef` para celdas con contenido custom. El\n * contexto trae `$implicit` (la fila), `index` y `column` (la columna), así\n * que un mismo template puede servir a varias columnas. */\n readonly cellTemplates = input<\n | Record<string, TemplateRef<{ $implicit: T; index: number; column?: DataTableColumn }>>\n | undefined\n >();\n\n /** Densidad de fila — ver `DataTableDensity`. */\n readonly density = input<DataTableDensity>('comfortable');\n\n /** Fuerza si la fila entera dispara `rowClick` en la vista de tabla —\n * ver `rowInteractive` para el cálculo automático cuando no se define. */\n readonly rowClickable = input<boolean | null>(null);\n\n /**\n * Con `false`, las filas interactivas de la vista de tabla dejan de ser\n * paradas de Tab (sin `tabindex`): útil cuando la fila es clickeable con el\n * mouse pero la acción accesible por teclado es un enlace o botón real\n * dentro de una celda — así una página de N filas no suma N paradas de Tab\n * sin rol. El clic con mouse sigue emitiendo `rowClick`. Default `true`\n * (comportamiento histórico). No afecta a las tarjetas, que son\n * `role=\"button\"`.\n */\n readonly rowFocusable = input(true);\n\n readonly rowClick = output<{ row: T; index: number }>();\n\n /**\n * Se emite al activar (clic, Enter o Espacio) una celda de una columna\n * `interactive`. `index` es el de la fila dentro de las filas mostradas\n * (misma convención que `rowClick`). No emite `rowClick`.\n */\n readonly cellClick = output<DataTableCellClick<T>>();\n\n /**\n * Nombre accesible (`aria-label`) del botón de cada celda interactiva:\n * `(row, column, index) => string`. Sin esta función, el botón se nombra\n * por su contenido. Se usa solo en columnas `interactive`.\n */\n readonly cellAriaLabel = input<\n ((row: T, column: DataTableColumn, index: number) => string) | undefined\n >();\n\n /** Nombre accesible del contenedor con scroll horizontal (solo se aplica cuando hay overflow). */\n readonly ariaLabel = input('Tabla de datos');\n /**\n * Clave (la misma que devuelve `rowKey`, o el índice sin él) de la fila\n * \"actual\" — ej. el registro que se está viendo en un selector. Esa fila\n * o card lleva `aria-current=\"true\"` y la clase `--current` (fondo\n * `primary-soft`). `null` (default): ninguna.\n */\n readonly currentRowKey = input<string | number | null>(null);\n\n /**\n * Paginación interna opcional — sin `pageSize`, cero cambio de\n * comportamiento (el consumidor sigue paginando afuera si quiere, vía el\n * slot `[footer]` con su propio `kf-pagination`, como ya hace Billing).\n * Con `pageSize`, la tabla pagina `rows()` sola y agrega su propio\n * `kf-pagination` en el footer nativo — el slot `[footer]` proyectado\n * sigue disponible para cualquier otra cosa que el consumidor quiera\n * agregar ahí (no son mutuamente excluyentes).\n */\n readonly pageSize = input<number | null>(null);\n /** Default `DEFAULT_PAGE_SIZE_OPTIONS` ([10, 25, 50], estándar del\n * portal) — pasar `[]` explícitamente desactiva el selector de tamaño\n * aunque `pageSize` esté activo (paginación sin selector). */\n readonly pageSizeOptions = input<number[]>(DEFAULT_PAGE_SIZE_OPTIONS);\n /** Página actual (desde 1), bidireccional: `[(page)]=\"page\"`. El consumidor\n * puede llevarla fuera de la tabla (ej. en la URL) y la tabla la corrige\n * si queda fuera de rango. `pageChange` emite en cada cambio, también los\n * automáticos (volver a 1 al cambiar de tamaño de página). */\n readonly page = model(1);\n /** Con `true`, un cambio de `rows` NO devuelve la página a 1: el\n * consumidor decide cuándo (ej. al filtrar) y la tabla solo la corrige si\n * queda fuera de rango. Default `false`: vuelve a 1, como siempre. */\n readonly keepPageOnRowsChange = input(false, { transform: booleanAttribute });\n /** Emite el tamaño elegido en el selector de la paginación interna. */\n readonly pageSizeChange = output<number>();\n\n /** Nombre de la entidad listada (ej. \"beneficios\", \"facturas\"), en\n * plural — se agrega al final del texto informativo de la paginación\n * interna (\"1–5 de 7 beneficios\"). Sin esto, el texto queda solo con\n * números (\"1–5 de 7\"): la librería no impone un idioma ni un nombre\n * fijo, cada consumidor decide el suyo. */\n readonly itemLabel = input<string>('');\n\n private readonly internalPageSize = signal<number | null>(null);\n\n /** Tamaño de página efectivo: el que el usuario elija en el selector\n * (si `pageSizeOptions` está activo), o el `pageSize` del consumidor. */\n protected readonly effectivePageSize = computed(() => this.internalPageSize() ?? this.pageSize());\n\n /** Cantidad de filas/cards placeholder mientras `loading` es true — el\n * `skeletonRows` explícito; si no hay, el `pageSize` efectivo con\n * paginación activa (así el placeholder ya \"adivina\" cuántas filas reales\n * van a aparecer, sin salto de layout) o 5 sin paginación. Siempre entre 1 y\n * {@link DATA_TABLE_MAX_SKELETON_ROWS}: con una página de 50 filas no se\n * pintan 50 placeholders. */\n protected readonly skeletonRowIndexes = computed(() => {\n const wanted = this.skeletonRows() ?? this.effectivePageSize() ?? 5;\n const total = Math.min(Math.max(Math.floor(wanted) || 0, 1), DATA_TABLE_MAX_SKELETON_ROWS);\n return Array.from({ length: total }, (_, i) => i);\n });\n\n /** Las tarjetas esqueleto llevan encabezado cuando la real lo tendría. */\n protected readonly skeletonCardHeader = computed(\n () =>\n !!this.cardMediaColumn() || !!this.cardTitleColumn() || this.cardStatusColumns().length > 0,\n );\n\n /**\n * Ancho (%) de la barra de una celda esqueleto: no todas iguales — una\n * columna numérica (alineada al final) es corta, un identificador\n * (`mono`) mediano, una de acciones (`hideLabel`) un cuadrado chico, y el\n * resto alterna entre tres anchos según su posición para que la tabla no\n * parezca un patrón repetido.\n */\n protected skeletonBarWidth(column: DataTableColumn, row: number, index: number): string {\n if (column.hideLabel) {\n return '2rem';\n }\n if (this.isEndAligned(column)) {\n return ['55%', '45%', '60%'][(row + index) % 3];\n }\n if (column.mono) {\n return '70%';\n }\n if (column.truncate) {\n return '90%';\n }\n return ['85%', '65%', '75%'][(row + index) % 3];\n }\n\n protected readonly totalPages = computed(() => {\n const size = this.effectivePageSize();\n if (!size) {\n return 1;\n }\n return Math.max(Math.ceil(this.sortedRows().length / size), 1);\n });\n\n /** Texto informativo del footer de paginación interna (\"1–5 de 7\n * beneficios\") — se recalcula con cada cambio de página/tamaño/dataset,\n * nunca queda desactualizado tras filtrar o pasar de página. */\n protected readonly paginationSummary = computed(() => {\n const size = this.effectivePageSize();\n const total = this.sortedRows().length;\n if (!size || total === 0) {\n return '';\n }\n const start = (this.page() - 1) * size + 1;\n const end = Math.min(start + size - 1, total);\n const label = this.itemLabel();\n return label ? `${start}–${end} de ${total} ${label}` : `${start}–${end} de ${total}`;\n });\n\n /**\n * Ordenamiento por columna — mismo formato `key:direction` que `sort` de\n * `kf-quote-picker`, para que un consumidor que ya conoce ese patrón no\n * aprenda uno nuevo. Un click en un header `sortable` avanza el ciclo\n * asc → desc → sin orden; clickear otra columna reinicia el ciclo en esa\n * columna nueva.\n */\n readonly sort = input<DataTableSort | null>(null);\n readonly sortChange = output<DataTableSort | null>();\n\n protected readonly sortedRows = computed<T[]>(() => {\n const sortValue = this.sort();\n const rows = this.rows();\n if (!sortValue) {\n return rows;\n }\n const [key, direction] = sortValue.split(':') as [string, 'asc' | 'desc'];\n const sorted = [...rows].sort((a, b) => {\n const va = (a as Record<string, unknown>)[key];\n const vb = (b as Record<string, unknown>)[key];\n if (va === vb) {\n return 0;\n }\n if (va === null || va === undefined) {\n return 1;\n }\n if (vb === null || vb === undefined) {\n return -1;\n }\n return va > vb ? 1 : -1;\n });\n return direction === 'desc' ? sorted.reverse() : sorted;\n });\n\n /** Filas realmente renderizadas: ordenadas y, si `pageSize` está activo,\n * recortadas a la página actual. */\n protected readonly displayedRows = computed<T[]>(() => {\n const sorted = this.sortedRows();\n const size = this.effectivePageSize();\n if (!size) {\n return sorted;\n }\n const start = (this.page() - 1) * size;\n return sorted.slice(start, start + size);\n });\n\n protected sortDirectionFor(column: DataTableColumn): 'asc' | 'desc' | null {\n const sortValue = this.sort();\n if (!sortValue) {\n return null;\n }\n const [key, direction] = sortValue.split(':') as [string, 'asc' | 'desc'];\n return key === column.key ? direction : null;\n }\n\n /** Valor de `aria-sort` del header de una columna ordenable. */\n protected ariaSortFor(column: DataTableColumn): 'ascending' | 'descending' | 'none' {\n const direction = this.sortDirectionFor(column);\n return direction === 'asc' ? 'ascending' : direction === 'desc' ? 'descending' : 'none';\n }\n\n /** Ciclo asc → desc → sin orden, disparado al clickear un header `sortable`. */\n protected toggleSort(column: DataTableColumn): void {\n if (!column.sortable) {\n return;\n }\n const current = this.sortDirectionFor(column);\n const next: DataTableSort | null =\n current === 'asc' ? `${column.key}:desc` : current === 'desc' ? null : `${column.key}:asc`;\n this.sortChange.emit(next);\n }\n\n protected goToPage(target: number): void {\n const clamped = Math.min(Math.max(target, 1), this.totalPages());\n if (clamped === this.page()) {\n return;\n }\n this.page.set(clamped);\n }\n\n protected setPageSize(size: number | null): void {\n if (size === null) {\n return;\n }\n this.internalPageSize.set(size);\n // Primero el tamaño y después la página: un consumidor que lleva ambos en\n // la URL los escribe en una sola navegación.\n this.pageSizeChange.emit(size);\n this.page.set(1);\n }\n\n /**\n * Reparto de anchos activo: hay al menos una columna `grow`. Sin ella, los\n * anchos son los de siempre (`width`/`minWidth`/`maxWidth` tal cual).\n */\n protected readonly weighted = computed(() =>\n this.columns().some((column) => this.growWeight(column) > 0),\n );\n\n /** Porción (%) del espacio sobrante de cada columna `grow`, según su peso. */\n private readonly growShares = computed(() => {\n const weights = this.columns()\n .map((column) => [column.key, this.growWeight(column)] as const)\n .filter(([, weight]) => weight > 0);\n const total = weights.reduce((sum, [, weight]) => sum + weight, 0);\n return new Map(\n weights.map(([key, weight]) => [key, Math.round((weight / total) * 10000) / 100]),\n );\n });\n\n private growWeight(column: DataTableColumn): number {\n const weight = column.grow ?? 0;\n return Number.isFinite(weight) && weight > 0 ? weight : 0;\n }\n\n /**\n * `width` de la celda. En reparto de anchos: la columna `grow` toma su\n * porción en porcentaje (las porciones suman 100% y el navegador las escala\n * al espacio que dejan las demás), la de `width` conserva su ancho y la que\n * no trae ni `width` ni `grow` pide 1% — con `nowrap` queda en el ancho de\n * su contenido.\n */\n protected widthFor(column: DataTableColumn): string | null {\n if (!this.weighted()) {\n return column.width ?? null;\n }\n const share = this.growShares().get(column.key);\n if (share !== undefined) {\n return `${share}%`;\n }\n return column.width ?? '1%';\n }\n\n /**\n * `min-width` de la celda. En reparto de anchos, el `width` de una columna\n * (también de una `grow`) funciona como piso: ni las porciones en\n * porcentaje ni el contenido de las demás pueden comprimirla.\n */\n protected minWidthFor(column: DataTableColumn): string | null {\n if (!this.weighted()) {\n return column.minWidth ?? null;\n }\n // Una columna `grow` sin piso propio nunca baja de `GROW_MIN_WIDTH`: con\n // poco espacio la tabla desplaza en horizontal en vez de dejar sin ancho\n // a la columna principal.\n const fallback = this.growShares().has(column.key) ? GROW_MIN_WIDTH : null;\n return column.minWidth ?? column.width ?? fallback;\n }\n\n /**\n * `max-width` de la celda. En reparto de anchos, una columna que se ajusta\n * a su contenido y es `truncate` SIN `maxWidth` no debe heredar el techo de\n * 0 de `truncate` (quedaría sin ancho): se libera con `none`.\n */\n protected maxWidthFor(column: DataTableColumn): string | null {\n if (\n this.weighted() &&\n column.truncate &&\n !column.maxWidth &&\n !column.width &&\n !this.growShares().has(column.key)\n ) {\n return 'none';\n }\n return column.maxWidth ?? null;\n }\n\n /** Columnas fijas del lado izquierdo/derecho, con el offset acumulado\n * (medido en runtime, ver `measureStickyOffsets`) para `position: sticky`. */\n protected readonly stickyLeftColumns = computed(() =>\n this.columns().filter((c) => c.sticky === 'left'),\n );\n protected readonly stickyRightColumns = computed(() =>\n this.columns().filter((c) => c.sticky === 'right'),\n );\n protected readonly stickyOffsets = signal<Map<string, number>>(new Map());\n\n protected stickyStyle(column: DataTableColumn): Record<string, string> | null {\n if (!column.sticky) {\n return null;\n }\n const offset = this.stickyOffsets().get(column.key) ?? 0;\n return {\n position: 'sticky',\n [column.sticky]: `${offset}px`,\n zIndex: '1',\n };\n }\n\n /**\n * Vista elegida, two-way: `[(view)]=\"view\"`. Sin valor (default) manda\n * `defaultView`; el toggle interno la escribe. Para controlarla desde\n * afuera (ej. con el toggle en `kf-list-toolbar` y el estado en la URL),\n * enlazar `[(view)]` y ocultar el interno con `[showViewToggle]=\"false\"`.\n * La vista efectivamente renderizada es `activeView()`.\n */\n readonly view = model<DataTableView | undefined>(undefined);\n\n /** Vista activa: `view` si está definida, si no `defaultView`. */\n readonly activeView = computed<DataTableView>(() => this.view() ?? this.defaultView());\n\n /** Primera columna de cada rol único; el resto se ignora en el encabezado. */\n readonly cardMediaColumn = computed(() => this.columns().find((c) => c.cardRole === 'media'));\n readonly cardTitleColumn = computed(() => this.columns().find((c) => c.cardRole === 'title'));\n readonly cardStatusColumns = computed(() =>\n this.columns().filter((c) => c.cardRole === 'status'),\n );\n readonly cardActionColumns = computed(() =>\n this.columns().filter((c) => c.cardRole === 'action'),\n );\n readonly cardFieldColumns = computed(() =>\n this.columns().filter((c) => (!c.cardRole || c.cardRole === 'field') && !c.cardClamp),\n );\n /** Campos a ancho completo y recortados (`cardClamp`), antes del resto. */\n readonly cardLeadColumns = computed(() =>\n this.columns().filter((c) => (!c.cardRole || c.cardRole === 'field') && !!c.cardClamp),\n );\n /** Fila inferior de datos secundarios (`cardRole: 'meta'`). */\n readonly cardMetaColumns = computed(() => this.columns().filter((c) => c.cardRole === 'meta'));\n\n /**\n * La card entera es clickeable solo si no tiene acciones propias: un\n * `role=\"button\"` con botones adentro es inválido y deja el foco ambiguo.\n * Con columnas `action`, la interacción la manejan esos botones.\n */\n readonly cardInteractive = computed(\n () =>\n this.rowClickable() ??\n (this.cardActionColumns().length === 0 && !this.hasInteractiveColumns()),\n );\n\n /** Hay al menos una columna `interactive` (celdas con botón propio). */\n protected readonly hasInteractiveColumns = computed(() =>\n this.columns().some((column) => column.interactive),\n );\n\n /**\n * Mismo criterio que `cardInteractive`, para la vista de tabla: la fila\n * entera dispara `rowClick` solo si no hay una columna `action` que ya\n * resuelva la interacción con su propio botón — sin esto, un click en\n * \"Ver detalle\" dispararía TAMBIÉN el click de la fila por burbujeo.\n * `rowClickable` fuerza el comportamiento en cualquier sentido si el\n * consumidor lo necesita.\n */\n readonly rowInteractive = computed(\n () => this.rowClickable() ?? this.cardActionColumns().length === 0,\n );\n\n /**\n * La fila de la vista de tabla es parada de Tab solo si es interactiva,\n * `rowFocusable` lo permite y NO hay columnas `interactive`: con botones\n * propios por celda, la fila además de ellos duplicaría las paradas de Tab\n * (el clic de la fila sigue emitiendo `rowClick` con el mouse).\n */\n protected readonly rowTabStop = computed(\n () => this.rowInteractive() && this.rowFocusable() && !this.hasInteractiveColumns(),\n );\n\n setView(next: DataTableView): void {\n this.view.set(next);\n }\n\n trackRow(row: T, index: number): string | number {\n const keyFn = this.rowKey();\n return keyFn ? keyFn(row, index) : index;\n }\n\n /** Alineada al final: `align: 'end'` o el histórico `right: true`. */\n protected isEndAligned(column: DataTableColumn): boolean {\n return column.align === 'end' || !!column.right;\n }\n\n /** `title` de una celda `truncate`: el valor completo como texto. */\n protected truncateTitle(row: T, column: DataTableColumn): string | null {\n if (!column.truncate) {\n return null;\n }\n return this.cellValue(row, column) || null;\n }\n\n cellValue(row: T, column: DataTableColumn): string {\n const renderFn = this.render();\n if (renderFn) {\n return renderFn(row);\n }\n const value = (row as Record<string, unknown>)[column.key];\n return value === null || value === undefined ? '' : String(value);\n }\n\n protected isCurrentRow(row: T, index: number): boolean {\n const current = this.currentRowKey();\n return current !== null && this.trackRow(row, index) === current;\n }\n\n /**\n * Espacio activa la fila/card igual que Enter, como un botón. Solo si el\n * foco está en la fila misma (no en un control dentro de ella): ahí\n * `preventDefault` evita el scroll de página; en cualquier otro caso\n * Espacio conserva su comportamiento nativo.\n */\n protected onRowSpace(event: Event, row: T, index: number): void {\n if (event.target !== event.currentTarget || !this.rowInteractive()) {\n return;\n }\n event.preventDefault();\n this.onRowClick(row, index);\n }\n\n /**\n * Emite `rowClick` salvo que el evento nazca dentro de un control\n * interactivo de la celda (enlace, botón, campo…): ese control ya resuelve\n * su propia acción. Así una celda con un `<a href>` real (clic derecho →\n * \"abrir en nueva pestaña\", Ctrl/Cmd+clic) no navega dos veces. El parámetro\n * `event` es opcional para no romper llamadas programáticas existentes.\n */\n onRowClick(row: T, index: number, event?: Event): void {\n if (!this.rowInteractive() || this.originatesInInteractiveControl(event)) {\n return;\n }\n this.rowClick.emit({ row, index });\n }\n\n /** Activación de una celda interactiva (clic, o Enter/Espacio sobre su botón). */\n protected onCellClick(row: T, column: DataTableColumn, index: number): void {\n this.cellClick.emit({ row, column, index });\n }\n\n /** `aria-label` del botón de una celda interactiva, o `null` si lo da su contenido. */\n protected cellLabel(row: T, column: DataTableColumn, index: number): string | null {\n return this.cellAriaLabel()?.(row, column, index) || null;\n }\n\n private originatesInInteractiveControl(event?: Event): boolean {\n const target = event?.target;\n const host = event?.currentTarget;\n if (!(target instanceof Element) || !(host instanceof Element) || target === host) {\n return false;\n }\n const control = target.closest(INTERACTIVE_CONTROL_SELECTOR);\n return control !== null && control !== host && host.contains(control);\n }\n\n /**\n * Ancho real de cada columna `sticky` — se mide después de cada render\n * porque el ancho de una columna depende de su contenido, no hay forma\n * de conocerlo de antemano. Cada columna fija toma como offset la suma\n * de anchos de las columnas fijas del MISMO lado que ya quedaron antes\n * que ella (así \"left\" apila de izquierda a derecha, \"right\" de derecha\n * a izquierda).\n */\n protected measureStickyOffsets(): void {\n const table = this.scrollEl()?.nativeElement.querySelector('table');\n if (!table) {\n return;\n }\n const offsets = new Map<string, number>();\n let leftAcc = 0;\n for (const column of this.stickyLeftColumns()) {\n offsets.set(column.key, leftAcc);\n const cell = table.querySelector<HTMLElement>(`[data-column-key=\"${column.key}\"]`);\n leftAcc += cell?.offsetWidth ?? 0;\n }\n let rightAcc = 0;\n for (const column of [...this.stickyRightColumns()].reverse()) {\n offsets.set(column.key, rightAcc);\n const cell = table.querySelector<HTMLElement>(`[data-column-key=\"${column.key}\"]`);\n rightAcc += cell?.offsetWidth ?? 0;\n }\n this.stickyOffsets.set(offsets);\n }\n}\n","<div\n class=\"kf-data-table\"\n [class.kf-data-table--flush]=\"flush()\"\n [class.kf-data-table--compact]=\"density() === 'compact'\"\n>\n @if (cardable() && showViewToggle()) {\n <div class=\"kf-data-table__toolbar\">\n <kf-view-toggle [view]=\"activeView()\" (viewChange)=\"setView($event)\" />\n </div>\n }\n\n @if (loading()) {\n @if (cardable() && activeView() === 'cards') {\n <div\n class=\"kf-data-table__cards\"\n aria-busy=\"true\"\n [style.--kf-data-table-card-min]=\"cardMinWidth()\"\n >\n @for (i of skeletonRowIndexes(); track i) {\n <div class=\"kf-data-table__card\" aria-hidden=\"true\">\n @if (cardMediaColumn() || cardTitleColumn() || cardStatusColumns().length) {\n <div class=\"kf-data-table__card-header\">\n @if (cardMediaColumn()) {\n <div class=\"kf-data-table__card-media\">\n <span class=\"kf-data-table__sk-media kf-bone-fill\"></span>\n </div>\n }\n <div class=\"kf-data-table__card-heading\">\n <span\n class=\"kf-data-table__card-title kf-bone\"\n [class.kf-data-table__card-title--mono]=\"cardTitleColumn()?.mono\"\n style=\"--kf-bone-width: 8rem\"\n >COT-2026-0000</span\n >\n @if (cardStatusColumns().length) {\n <span class=\"kf-data-table__card-statuses\">\n <span class=\"kf-data-table__sk-pill kf-bone-fill\"></span>\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardLeadColumns().length || cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\n @for (column of cardLeadColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-lead\"\n [style.--kf-data-table-card-clamp]=\"column.cardClamp\"\n >\n <span class=\"kf-data-table__sk-lead kf-bone\" style=\"--kf-bone-width: 90%\"\n >Texto</span\n >\n </div>\n }\n @for (column of cardFieldColumns(); track column.key; let first = $first) {\n <div class=\"kf-data-table__card-field\">\n <span\n class=\"kf-data-table__card-label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 5rem\"\n >{{ column.label }}</span\n >\n @if (first && !skeletonCardHeader()) {\n <kf-skeleton class=\"kf-data-table__sk-value\" width=\"100%\" />\n } @else {\n <span class=\"kf-data-table__sk-value kf-bone\" style=\"--kf-bone-width: 40%\"\n >Valor</span\n >\n }\n </div>\n }\n </div>\n }\n\n @if (cardMetaColumns().length) {\n <div class=\"kf-data-table__card-meta\">\n @for (column of cardMetaColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-meta-item\"\n [class.kf-data-table__card-meta-item--end]=\"\n isEndAligned(column) || column.emphasis\n \"\n [class.kf-data-table__card-meta-item--emphasis]=\"column.emphasis\"\n [style.flex-basis]=\"column.width\"\n >\n <span\n class=\"kf-data-table__card-label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 4rem\"\n >{{ column.label }}</span\n >\n <span\n class=\"kf-data-table__card-meta-value kf-bone\"\n style=\"--kf-bone-width: 5rem\"\n >Valor</span\n >\n </div>\n }\n </div>\n }\n\n @if (cardActionColumns().length) {\n <div class=\"kf-data-table__card-actions\">\n <span class=\"kf-data-table__sk-action kf-bone-fill\"></span>\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <div\n class=\"kf-data-table__scroll\"\n [class.kf-data-table__scroll--weighted]=\"weighted()\"\n aria-busy=\"true\"\n >\n <table class=\"kf-data-table__table\" [class.kf-data-table__table--weighted]=\"weighted()\">\n <thead>\n <tr>\n @for (column of columns(); track column.key) {\n <th\n class=\"kf-overline-text\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n @if (column.hideLabel) {\n <span class=\"kf-data-table__sr-only\">{{ column.label }}</span>\n } @else {\n {{ column.label }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (i of skeletonRowIndexes(); track i) {\n <tr class=\"kf-data-table__row\">\n @for (column of columns(); track column.key; let c = $index) {\n <td\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n <div\n class=\"kf-data-table__sk-cell\"\n [class.kf-data-table__sk-cell--end]=\"isEndAligned(column)\"\n [class.kf-data-table__sk-cell--center]=\"column.align === 'center'\"\n >\n <kf-skeleton\n class=\"kf-data-table__sk-bar\"\n [style.width]=\"skeletonBarWidth(column, i, c)\"\n />\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n } @else if (rows().length === 0) {\n <div class=\"kf-data-table__empty\">\n <ng-content select=\"[empty]\" />\n </div>\n } @else if (activeView() === 'table') {\n <div\n #scroll\n class=\"kf-data-table__scroll\"\n [class.kf-data-table__scroll--fade-left]=\"canScrollLeft()\"\n [class.kf-data-table__scroll--fade-right]=\"canScrollRight()\"\n [class.kf-data-table__scroll--weighted]=\"weighted()\"\n [attr.tabindex]=\"hasOverflow() ? 0 : null\"\n [attr.role]=\"hasOverflow() ? 'region' : null\"\n [attr.aria-label]=\"hasOverflow() ? ariaLabel() : null\"\n >\n <table class=\"kf-data-table__table\" [class.kf-data-table__table--weighted]=\"weighted()\">\n <thead>\n <tr>\n @for (column of columns(); track column.key) {\n <th\n class=\"kf-overline-text\"\n [attr.data-column-key]=\"column.key\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [class.kf-data-table__cell--truncate]=\"column.truncate\"\n [class.kf-data-table__cell--sortable]=\"column.sortable\"\n [class.kf-data-table__cell--sticky]=\"column.sticky\"\n [class.kf-data-table__cell--sort-active]=\"sortDirectionFor(column) !== null\"\n [style]=\"stickyStyle(column)\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n [attr.aria-sort]=\"column.sortable ? ariaSortFor(column) : null\"\n (click)=\"toggleSort(column)\"\n >\n @if (column.sortable) {\n <!-- El clic del botón burbujea al `th`, que ya ordena: un solo manejador para mouse y teclado. -->\n <button type=\"button\" class=\"kf-data-table__sort-button\">\n <span class=\"kf-data-table__th-content\">\n <ng-container\n [ngTemplateOutlet]=\"headerLabel\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\"\n />\n <kf-icon\n name=\"chevron-down\"\n size=\"sm\"\n [rotate]=\"sortDirectionFor(column) === 'asc' ? 180 : 0\"\n class=\"kf-data-table__sort-icon\"\n [class.kf-data-table__sort-icon--active]=\"sortDirectionFor(column) !== null\"\n />\n </span>\n </button>\n } @else {\n <span class=\"kf-data-table__th-content\">\n <ng-container\n [ngTemplateOutlet]=\"headerLabel\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\"\n />\n </span>\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of displayedRows(); track trackRow(row, $index); let i = $index) {\n <tr\n class=\"kf-data-table__row\"\n [class.kf-data-table__row--interactive]=\"rowInteractive()\"\n [class.kf-data-table__row--current]=\"isCurrentRow(row, i)\"\n [attr.aria-current]=\"isCurrentRow(row, i) ? 'true' : null\"\n [attr.tabindex]=\"rowTabStop() ? 0 : null\"\n (click)=\"onRowClick(row, i, $event)\"\n (keydown.enter)=\"onRowClick(row, i, $event)\"\n (keydown.space)=\"onRowSpace($event, row, i)\"\n >\n @for (column of columns(); track column.key) {\n <td\n [attr.data-column-key]=\"column.key\"\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"isEndAligned(column)\"\n [class.kf-data-table__cell--center]=\"column.align === 'center'\"\n [class.kf-data-table__cell--truncate]=\"column.truncate\"\n [class.kf-data-table__cell--mono]=\"column.mono\"\n [class.kf-data-table__cell--emphasis]=\"column.emphasis\"\n [class.kf-data-table__cell--sticky]=\"column.sticky\"\n [style]=\"stickyStyle(column)\"\n [style.min-width]=\"minWidthFor(column)\"\n [style.width]=\"widthFor(column)\"\n [style.max-width]=\"maxWidthFor(column)\"\n >\n @if (column.truncate) {\n <span class=\"kf-data-table__truncate\" [attr.title]=\"truncateTitle(row, column)\">\n <ng-container\n [ngTemplateOutlet]=\"tableCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"tableCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"kf-data-table__cards\" [style.--kf-data-table-card-min]=\"cardMinWidth()\">\n @for (row of displayedRows(); track trackRow(row, $index); let i = $index) {\n <div\n class=\"kf-data-table__card\"\n [class.kf-data-table__card--interactive]=\"cardInteractive()\"\n [class.kf-data-table__card--current]=\"isCurrentRow(row, i)\"\n [attr.aria-current]=\"isCurrentRow(row, i) ? 'true' : null\"\n [attr.role]=\"cardInteractive() ? 'button' : null\"\n [attr.tabindex]=\"cardInteractive() ? 0 : null\"\n (click)=\"cardInteractive() ? onRowClick(row, i, $event) : undefined\"\n (keydown.enter)=\"cardInteractive() ? onRowClick(row, i, $event) : undefined\"\n (keydown.space)=\"cardInteractive() ? onRowSpace($event, row, i) : undefined\"\n >\n @if (cardMediaColumn() || cardTitleColumn() || cardStatusColumns().length) {\n <div class=\"kf-data-table__card-header\">\n @if (cardMediaColumn(); as media) {\n <div class=\"kf-data-table__card-media\">\n @if (cellTemplates()?.[media.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: media }\"\n />\n } @else {\n <img [src]=\"cellValue(row, media)\" alt=\"\" />\n }\n </div>\n }\n <div class=\"kf-data-table__card-heading\">\n @if (cardTitleColumn(); as title) {\n <span\n class=\"kf-data-table__card-title\"\n [class.kf-data-table__card-title--mono]=\"title.mono\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: title, index: i }\"\n />\n </span>\n }\n @if (cardStatusColumns().length) {\n <span class=\"kf-data-table__card-statuses\">\n @for (column of cardStatusColumns(); track column.key) {\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardLeadColumns().length || cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\n @for (column of cardLeadColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-lead\"\n [style.--kf-data-table-card-clamp]=\"column.cardClamp\"\n [attr.title]=\"cellValue(row, column) || null\"\n >\n <span class=\"kf-data-table__sr-only\">{{ column.label }}: </span>\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </div>\n }\n @for (column of cardFieldColumns(); track column.key) {\n <div class=\"kf-data-table__card-field\">\n <span class=\"kf-data-table__card-label kf-overline-text\">{{ column.label }}</span>\n <span\n class=\"kf-data-table__card-value\"\n [class.kf-data-table__card-value--emphasis]=\"column.emphasis\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n </div>\n }\n </div>\n }\n\n @if (cardMetaColumns().length) {\n <div class=\"kf-data-table__card-meta\">\n @for (column of cardMetaColumns(); track column.key) {\n <div\n class=\"kf-data-table__card-meta-item\"\n [class.kf-data-table__card-meta-item--end]=\"\n isEndAligned(column) || column.emphasis\n \"\n [class.kf-data-table__card-meta-item--emphasis]=\"column.emphasis\"\n [style.flex-basis]=\"column.width\"\n >\n <span class=\"kf-data-table__card-label kf-overline-text\">{{ column.label }}</span>\n <span class=\"kf-data-table__card-meta-value\">\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </span>\n </div>\n }\n </div>\n }\n\n @if (cardActionColumns().length) {\n <div class=\"kf-data-table__card-actions\">\n @for (column of cardActionColumns(); track column.key) {\n <ng-container\n [ngTemplateOutlet]=\"cardCell\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n @if (!loading() && rows().length > 0) {\n <div class=\"kf-data-table__footer\">\n @if (effectivePageSize()) {\n <kf-pagination\n [page]=\"page()\"\n [pages]=\"totalPages()\"\n [pageSizeOptions]=\"pageSizeOptions()\"\n [pageSize]=\"effectivePageSize()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"setPageSize($event)\"\n >\n {{ paginationSummary() }}\n </kf-pagination>\n }\n <ng-content select=\"[footer]\" />\n </div>\n }\n</div>\n\n<!-- Rótulo de una columna: texto visible o solo para lectores con `hideLabel`. -->\n<ng-template #headerLabel let-column>\n @if (column.hideLabel) {\n <span class=\"kf-data-table__sr-only\">{{ column.label }}</span>\n } @else {\n {{ column.label }}\n }\n</ng-template>\n\n<!-- Celda de la vista tabla — compartida por la celda normal y la `truncate`.\n Una columna `interactive` envuelve su contenido en un botón real. -->\n<ng-template #tableCell let-row let-column=\"column\" let-i=\"index\">\n @if (column.interactive) {\n <button\n type=\"button\"\n class=\"kf-data-table__cell-button\"\n [attr.aria-label]=\"cellLabel(row, column, i)\"\n (click)=\"onCellClick(row, column, i)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"tableCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </button>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"tableCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n</ng-template>\n\n<!-- Contenido de una celda de la vista tabla (template del consumidor,\n thumbnail o texto). -->\n<ng-template #tableCellContent let-row let-column=\"column\" let-i=\"index\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: column }\"\n />\n } @else if (column.cardRole === 'media') {\n <img class=\"kf-data-table__thumb\" [src]=\"cellValue(row, column)\" alt=\"\" />\n } @else {\n {{ cellValue(row, column) }}\n }\n</ng-template>\n\n<!-- Zona de la tarjeta: igual que la celda de tabla, con botón si la columna es `interactive`. -->\n<ng-template #cardCell let-row let-column=\"column\" let-i=\"index\">\n @if (column.interactive) {\n <button\n type=\"button\"\n class=\"kf-data-table__cell-button\"\n [attr.aria-label]=\"cellLabel(row, column, i)\"\n (click)=\"onCellClick(row, column, i)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"cardCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n </button>\n } @else {\n <ng-container\n [ngTemplateOutlet]=\"cardCellContent\"\n [ngTemplateOutletContext]=\"{ $implicit: row, column: column, index: i }\"\n />\n }\n</ng-template>\n\n<!-- Contenido de una zona de la tarjeta: template del consumidor o el valor como texto. -->\n<ng-template #cardCellContent let-row let-column=\"column\" let-i=\"index\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i, column: column }\"\n />\n } @else {\n {{ cellValue(row, column) }}\n }\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\nexport type LinkVariant = 'default' | 'muted';\n\n/**\n * Acción de bajo énfasis con apariencia de texto — \"¿Olvidaste tu\n * contraseña?\", \"Volver a iniciar sesión\", o un link real de navegación\n * como \"Ir a pagos →\".\n *\n * Sin `href` (default) es un `<button type=\"button\">`: dispara una acción\n * en la misma pantalla, vía `(click)`. Con `href`, es un `<a>` real: navega\n * a otra URL. `showArrow` agrega un ícono `chevron-right` al final — para\n * el patrón \"texto + flecha\" de un link que lleva a otro lado.\n *\n * `variant=\"default\"` (color primario, subrayado en hover) es para la\n * acción de mayor jerarquía relativa de la pantalla; `variant=\"muted\"`\n * (gris que pasa a primario en hover) es para acciones de retroceso/salida.\n *\n * <kf-link (click)=\"onForgotPassword()\">¿Olvidaste tu contraseña?</kf-link>\n * <kf-link variant=\"muted\" (click)=\"onBack()\">← Volver a iniciar sesión</kf-link>\n * <kf-link href=\"/pagos\" showArrow>Ir a pagos</kf-link>\n */\n@Component({\n selector: 'kf-link',\n imports: [Icon, NgTemplateOutlet],\n templateUrl: './Link.html',\n styleUrl: './Link.css',\n})\nexport class Link {\n readonly variant = input<LinkVariant>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Si se pasa, renderiza un `<a>` real en vez de `<button>` — navega en vez de disparar `(click)`. */\n readonly href = input<string>();\n /** Ícono `chevron-right` al final — para el patrón \"texto + flecha\" de un link que lleva a otro lado. */\n readonly showArrow = input(false, { transform: booleanAttribute });\n}\n","<!--\n Una sola proyección compartida (ng-template + ngTemplateOutlet), no un\n <ng-content> por rama: Angular solo conecta la proyección real del\n consumidor a la PRIMERA instancia de <ng-content> que encuentra en el\n árbol de compilación — con un <ng-content> en cada rama del @if, la\n que no se activa en runtime igual \"roba\" la proyección (mismo bug ya\n resuelto en Text.ts).\n-->\n<ng-template #content>\n <ng-content />\n @if (showArrow()) {\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n }\n</ng-template>\n@if (href(); as url) {\n <a class=\"kf-link\" [class.kf-link--muted]=\"variant() === 'muted'\" [href]=\"url\">\n <ng-container [ngTemplateOutlet]=\"content\" />\n </a>\n} @else {\n <button\n type=\"button\"\n class=\"kf-link\"\n [class.kf-link--muted]=\"variant() === 'muted'\"\n [disabled]=\"disabled()\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </button>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport { Link } from '../link/Link';\n\n/** Color del chip de ícono. Identifica la CLASE de documento de un vistazo\n * en una lista de nombres de archivo parecidos entre sí. */\nexport type DocumentRowTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Fila de un documento descargable: chip de ícono coloreado por tipo,\n * título, metadata y la acción de descarga al final. Sin `href` rinde\n * `pendingLabel` en vez de un link roto. El contenido proyectado cae entre\n * la metadata y la acción, como slot para un `kf-badge` de estado.\n *\n * `loading` (default `false`): dibuja el esqueleto de la fila — chip, título,\n * metadata y acción como bloques del alto real de cada texto — con el mismo\n * cascarón, así que al llegar los datos no hay salto de layout. Pasa los\n * mismos inputs que usarás cargada (`meta` incluido, para reservar su línea).\n * Marca el host con `aria-busy=\"true\"` y oculta el contenido proyectado.\n *\n * <kf-document-row title=\"Factura\" meta=\"PDF · 120 KB\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-document-row',\n imports: [Icon, Link],\n templateUrl: './DocumentRow.html',\n styleUrl: './DocumentRow.css',\n host: {\n '[class]': '\"kf-document-row--\" + tone()',\n '[class.kf-document-row--loading]': 'loading()',\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class DocumentRow {\n readonly icon = input<IconName>('file');\n readonly tone = input<DocumentRowTone>('neutral');\n\n /** Qué documento es. El nombre humano del tipo, no el del archivo. */\n readonly title = input.required<string>();\n\n /** Línea secundaria — archivo, fecha, tamaño. El consumidor la arma ya\n * formateada: la librería no decide en qué unidad se lee un tamaño ni en\n * qué formato una fecha. */\n readonly meta = input<string>();\n\n /** Ausente rinde `pendingLabel` en vez del link de descarga. */\n readonly href = input<string>();\n\n readonly downloadLabel = input('Descargar');\n\n /** Qué se dice cuando no hay `href`. */\n readonly pendingLabel = input('En generación');\n\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","@if (loading()) {\n <span class=\"kf-document-row__icon kf-bone-fill\" aria-hidden=\"true\"></span>\n\n <span class=\"kf-document-row__body\" aria-hidden=\"true\">\n <span class=\"kf-document-row__title kf-bone\" style=\"--kf-bone-width: 55%\">{{ title() }}</span>\n @if (meta(); as line) {\n <span class=\"kf-document-row__meta kf-caption-text kf-bone\" style=\"--kf-bone-width: 35%\">{{\n line\n }}</span>\n }\n </span>\n\n <span class=\"kf-document-row__actions kf-document-row__actions--loading\" aria-hidden=\"true\">\n <ng-content />\n <span class=\"kf-document-row__pending kf-caption-text kf-bone\" style=\"--kf-bone-width: 5rem\">{{\n href() ? downloadLabel() : pendingLabel()\n }}</span>\n </span>\n} @else {\n <span class=\"kf-document-row__icon\" aria-hidden=\"true\">\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n </span>\n\n <span class=\"kf-document-row__body\">\n <span class=\"kf-document-row__title\">{{ title() }}</span>\n @if (meta(); as line) {\n <span class=\"kf-document-row__meta kf-caption-text\">{{ line }}</span>\n }\n </span>\n\n <span class=\"kf-document-row__actions\">\n <ng-content />\n @if (href(); as url) {\n <kf-link [href]=\"url\">{{ downloadLabel() }}</kf-link>\n } @else {\n <span class=\"kf-document-row__pending kf-caption-text\">{{ pendingLabel() }}</span>\n }\n </span>\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Mismo vocabulario que `Badge.tone`/`TextTone` (menos `info`/`service`,\n * que no aplican a un valor de progreso): `neutral` es el color de marca\n * por defecto (sin implicar buen/mal estado), `primary` es el color\n * primario para un avance de proceso (ej. una carga), y `ok`/`warn`/`error`\n * sí comunican severidad. `purple` es el acento morado de marca, igual al tono\n * `purple` de `kf-stat-card`. La librería no conoce el dominio que produce ese\n * valor (SLA, storage, lo que sea) — el consumidor decide qué tone usar. */\nexport type ProgressTone = 'neutral' | 'primary' | 'ok' | 'warn' | 'error' | 'purple';\n\n/** Grosor de la pista: `sm` 4px (el histórico), `md` 8px, `lg` 12px. */\nexport type ProgressSize = 'sm' | 'md' | 'lg';\n\n/**\n * Barra de progreso de un solo valor (0-100%) con color por severidad —\n * para un porcentaje simple, a diferencia de `kf-bucket-progress`, que\n * dibuja varias categorías proporcionales en la misma barra.\n *\n * <kf-progress [value]=\"80\" tone=\"ok\" label=\"80%\" />\n * <kf-progress [value]=\"ratio()\" [tone]=\"severityTone()\" />\n *\n * `value` se clampea a [0, 100] — un consumidor que calcule un ratio fuera\n * de rango (ej. tiempo transcurrido sobre un SLA ya vencido) no rompe el\n * ancho de la barra. `size` cambia el grosor de la pista (`sm` 4px, `md` 8px,\n * `lg` 12px; sin él, 4px como siempre); el `role=\"progressbar\"` y sus valores\n * accesibles no cambian. `label` es texto libre opcional sobre la barra (ej.\n * \"80%\"); sin él, no se renderiza ningún texto, solo la barra.\n */\n@Component({\n selector: 'kf-progress',\n templateUrl: './Progress.html',\n styleUrl: './Progress.css',\n})\nexport class Progress {\n readonly value = input.required<number>();\n readonly tone = input<ProgressTone>('neutral');\n /** Grosor de la pista. Default `sm` (4px). */\n readonly size = input<ProgressSize>('sm');\n readonly label = input<string>();\n /** Nombre accesible de la barra (`aria-label`). Sin él, el `progressbar`\n * queda sin nombre: dalo siempre que el contexto no lo nombre ya (por\n * ejemplo con un `label` visible asociado). */\n readonly ariaLabel = input<string>();\n\n protected readonly clampedValue = computed(() => Math.min(Math.max(this.value(), 0), 100));\n}\n","<div class=\"kf-progress\">\n @if (label(); as text) {\n <div class=\"kf-progress__top\">\n <span class=\"kf-progress__label kf-progress--{{ tone() }}\">{{ text }}</span>\n </div>\n }\n <div\n class=\"kf-progress__track kf-progress__track--{{ size() }}\"\n role=\"progressbar\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-valuenow]=\"clampedValue()\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n >\n <div class=\"kf-progress__fill kf-progress--{{ tone() }}\" [style.width.%]=\"clampedValue()\"></div>\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport { Progress, type ProgressTone } from '../progress/Progress';\n\nexport type StatCardTone = 'primary' | 'success' | 'error' | 'purple' | 'warn' | 'info' | 'neutral';\n\n/** Densidad de la card: `'compact'` reduce el padding, el ícono y el valor. */\nexport type StatCardDensity = 'default' | 'compact';\n\n/** Tono de `kf-progress` que acompaña a cada tono de la card. */\nconst BAR_TONE: Record<StatCardTone, ProgressTone> = {\n primary: 'primary',\n success: 'ok',\n error: 'error',\n warn: 'warn',\n purple: 'primary',\n info: 'primary',\n neutral: 'primary',\n};\n\n/**\n * Card de estadística horizontal: ícono circular grande a la izquierda,\n * valor + label + nota apilados al centro, chevron opcional al final si es\n * clickeable. Distinta de `kf-metric-card` (layout vertical, label arriba +\n * ícono a la derecha) — este es el patrón real del dashboard de OTD (\"Bonos\n * otorgados\", \"Cortesías otorgadas\"), no una variante de la misma card.\n *\n * <kf-stat-card icon=\"gift\" tone=\"purple\" value=\"4\" label=\"Bonos otorgados\" note=\"$15,000.00 en beneficios\" (cardClick)=\"onNavigate('beneficios')\" />\n *\n * Extensiones opcionales (la card sin ellas se ve y se comporta como siempre):\n * - `tone`: además de `primary|success|error|purple`, `warn`, `info` y `neutral`.\n * - `bar` (0-100): barra de progreso accesible (`kf-progress`, `role=\"progressbar\"`\n * con `aria-valuenow`/`min`/`max` y el `label` como nombre) bajo la nota. Se\n * acota a [0, 100]; `null`/`undefined` no la dibuja. Es un refuerzo visual:\n * el valor exacto conviene darlo también en texto (`hint`), porque el relleno\n * de algunos tonos de `kf-progress` tiene poco contraste con su pista.\n * - `hint`: texto secundario bajo la barra (ej. \"12 de 20 completadas\").\n * - `pressed` (`boolean | null`): con `clickable`, la card es un botón de\n * alternancia (`aria-pressed`), útil como filtro. `null` (default) = no\n * aplica y no emite el atributo. Sin `clickable` no tiene efecto.\n *\n * <kf-stat-card icon=\"clock\" tone=\"warn\" value=\"7\" label=\"Por vencer\" [bar]=\"35\" hint=\"7 de 20\"\n * clickable [pressed]=\"filter() === 'due'\" (cardClick)=\"toggle('due')\" />\n *\n * `density` (`'default'` | `'compact'`): `'compact'` es la variante para\n * pantallas angostas — padding de `--kf-space-md`, ícono de 40px y valor de\n * `--kf-font-size-title-sm`, con el mismo contenido. Si la card mide 210px de\n * ancho o menos (ej. una grilla 2x2 en teléfono), pasa además a dos filas:\n * ícono y valor en la primera, y label, nota, barra y `hint` debajo a todo el\n * ancho; el chevron se oculta. Solo la variante compacta convierte el host en\n * contenedor de tamaño (`container-type: inline-size`), así que debe tener un\n * ancho que no dependa de su contenido (celda de grilla, `width` explícito o\n * hijo de un contenedor en bloque). `'default'` no cambia nada.\n *\n * <kf-stat-card density=\"compact\" icon=\"clock\" value=\"7\" label=\"Por vencer\" />\n *\n * `loading` (default `false`): mientras es `true` la card dibuja su esqueleto\n * en vez del contenido, con el MISMO cascarón (borde, padding, ícono de 50px)\n * y líneas del alto real de cada texto — valor, etiqueta y, si se pasaron,\n * nota, barra y `hint` —, así que al llegar los datos no hay salto de\n * layout. Pasa los mismos inputs que usarás cargada para que el esqueleto\n * reserve las mismas líneas. Marca la card con `aria-busy=\"true\"`, no es\n * clicable ni expone su texto a lectores de pantalla mientras carga.\n *\n * <kf-stat-card icon=\"clock\" value=\"7\" label=\"Por vencer\" note=\"Esta semana\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-stat-card',\n imports: [Icon, NgTemplateOutlet, Progress],\n templateUrl: './StatCard.html',\n styleUrl: './StatCard.css',\n host: {\n '[class.kf-stat-card-host--compact]': \"density() === 'compact'\",\n },\n})\nexport class StatCard {\n readonly icon = input.required<IconName>();\n readonly tone = input<StatCardTone>('primary');\n readonly value = input.required<string | number>();\n readonly label = input.required<string>();\n readonly note = input<string>();\n /** Avance 0-100 (barra de progreso accesible); `null`/`undefined` = sin barra. */\n readonly bar = input<number | null | undefined>(undefined);\n /** Texto secundario bajo la barra (o bajo la nota si no hay barra). */\n readonly hint = input<string>();\n /**\n * Estado de alternancia (`aria-pressed`) cuando la card es `clickable`.\n * `null` (default) = no aplica: el atributo no se emite.\n */\n readonly pressed = input<boolean | null>(null);\n /** `'compact'`: variante para pantallas angostas; `'default'` no cambia la card. */\n readonly density = input<StatCardDensity>('default');\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** Si se escucha `cardClick`, la card se renderiza como botón clickeable con chevron. */\n readonly clickable = input(false, { transform: booleanAttribute });\n readonly cardClick = output<void>();\n\n protected readonly barTone = computed(() => BAR_TONE[this.tone()]);\n protected readonly hasBar = computed(() => {\n const value = this.bar();\n return value !== null && value !== undefined && Number.isFinite(value);\n });\n}\n","@if (loading()) {\n <div\n class=\"kf-stat-card\"\n [class.kf-stat-card--compact]=\"density() === 'compact'\"\n aria-busy=\"true\"\n >\n <span\n class=\"kf-stat-card__icon kf-stat-card__icon--bone kf-bone-fill\"\n aria-hidden=\"true\"\n ></span>\n <span class=\"kf-stat-card__body\" aria-hidden=\"true\">\n <span class=\"kf-stat-card__value kf-bone\" style=\"--kf-bone-width: 40%\">{{ value() }}</span>\n <span class=\"kf-stat-card__label kf-bone\" style=\"--kf-bone-width: 70%\">{{ label() }}</span>\n @if (note()) {\n <span class=\"kf-stat-card__note kf-bone\" style=\"--kf-bone-width: 55%\">{{ note() }}</span>\n }\n @if (hasBar()) {\n <span class=\"kf-stat-card__bar\">\n <span class=\"kf-stat-card__bar-bone kf-bone-fill\"></span>\n </span>\n }\n @if (hint()) {\n <span class=\"kf-stat-card__hint kf-bone\" style=\"--kf-bone-width: 45%\">{{ hint() }}</span>\n }\n </span>\n </div>\n} @else if (clickable()) {\n <button\n type=\"button\"\n class=\"kf-stat-card kf-stat-card--clickable\"\n [class.kf-stat-card--compact]=\"density() === 'compact'\"\n [class.kf-stat-card--pressed]=\"pressed() === true\"\n [attr.aria-pressed]=\"pressed()\"\n (click)=\"cardClick.emit()\"\n >\n <ng-container *ngTemplateOutlet=\"content\" />\n <kf-icon class=\"kf-stat-card__chevron\" name=\"chevron-right\" size=\"sm\" />\n </button>\n} @else {\n <div class=\"kf-stat-card\" [class.kf-stat-card--compact]=\"density() === 'compact'\">\n <ng-container *ngTemplateOutlet=\"content\" />\n </div>\n}\n\n<ng-template #content>\n <span class=\"kf-stat-card__icon\" [class]=\"'kf-stat-card__icon--' + tone()\">\n <kf-icon [name]=\"icon()\" size=\"md\" />\n </span>\n <span class=\"kf-stat-card__body\">\n <span class=\"kf-stat-card__value\">{{ value() }}</span>\n <span class=\"kf-stat-card__label\">{{ label() }}</span>\n @if (note()) {\n <span class=\"kf-stat-card__note\">{{ note() }}</span>\n }\n @if (hasBar()) {\n <kf-progress\n class=\"kf-stat-card__bar\"\n [value]=\"bar()!\"\n [tone]=\"barTone()\"\n [ariaLabel]=\"label()\"\n />\n }\n @if (hint()) {\n <span class=\"kf-stat-card__hint\">{{ hint() }}</span>\n }\n </span>\n</ng-template>\n","import { Component, computed, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { DataTable, type DataTableColumn } from '../data-table/DataTable';\nimport { DocumentRow } from '../document-row/DocumentRow';\nimport { StatCard } from '../stat-card/StatCard';\nimport { Skeleton } from './Skeleton';\n\n/** Forma de contenido que reproduce el preset. */\nexport type SkeletonPresetVariant =\n 'kpi-grid' | 'card-grid' | 'form' | 'list' | 'table' | 'timeline' | 'detail-header';\n\n/** Cantidad de elementos por defecto de cada variante (`count` sin valor). */\nconst DEFAULT_COUNT: Record<SkeletonPresetVariant, number> = {\n 'kpi-grid': 4,\n 'card-grid': 6,\n form: 4,\n list: 4,\n table: 5,\n timeline: 4,\n 'detail-header': 1,\n};\n\n/** Tope de elementos: un `count` mayor se acota, no tiene sentido pintar más. */\nexport const SKELETON_PRESET_MAX_COUNT = 12;\n\n/**\n * Esqueletos listos para usar que reproducen la FORMA del contenido real, para\n * que al llegar los datos nada se mueva. Cada variante se arma con la misma\n * geometría que su equivalente cargado (mismos cascarones, alturas, radios y\n * gaps, todo por tokens):\n *\n * | `variant` | Equivalente cargado | `count` | `columns` |\n * | ---------------- | ---------------------------- | -------------- | ------------------ |\n * | `kpi-grid` | `kf-stat-card` | tarjetas (4) | columnas de la grilla |\n * | `card-grid` | `kf-card` | tarjetas (6) | columnas de la grilla |\n * | `form` | `kf-input` con label | campos (4) | `1` o `2` |\n * | `list` | `kf-document-row` | filas (4) | — |\n * | `table` | `kf-data-table` | filas (5) | columnas (4) |\n * | `timeline` | `kf-milestone-timeline` | etapas (4) | — |\n * | `detail-header` | `kf-page-header` con ícono | — | — |\n *\n * Sin `columns`, las grillas (`kpi-grid`, `card-grid`) se reparten solas con un\n * ancho mínimo por tarjeta. `count` se acota a 12.\n *\n * El preset es decorativo (`aria-hidden` por dentro) y marca su contenedor con\n * `aria-busy=\"true\"`. Con `label` agrega un texto visualmente oculto con\n * `role=\"status\"` que lo anuncia a lectores de pantalla; dentro de\n * `kf-content-state` no hace falta (ya lo anuncia él).\n *\n * <kf-skeleton-preset variant=\"kpi-grid\" [count]=\"4\" />\n * <kf-skeleton-preset variant=\"form\" [count]=\"3\" [columns]=\"2\" label=\"Cargando formulario\" />\n * <kf-content-state [state]=\"state()\" loadingPreset=\"table\">…</kf-content-state>\n */\n@Component({\n selector: 'kf-skeleton-preset',\n imports: [Card, DataTable, DocumentRow, Skeleton, StatCard],\n templateUrl: './SkeletonPreset.html',\n styleUrl: './SkeletonPreset.css',\n})\nexport class SkeletonPreset {\n readonly variant = input<SkeletonPresetVariant>('list');\n /** Cantidad de elementos. Sin valor, el de la variante. Máximo 12. */\n readonly count = input<number | undefined>(undefined);\n /** Columnas: de la grilla (`kpi-grid`, `card-grid`), del formulario (`1`|`2`) o de la tabla. */\n readonly columns = input<number | undefined>(undefined);\n /** Texto accesible (visualmente oculto, `role=\"status\"`). Vacío, no se emite. */\n readonly label = input('');\n\n protected readonly total = computed(() => {\n const requested = this.count() ?? DEFAULT_COUNT[this.variant()];\n return Math.min(Math.max(Math.floor(requested) || 0, 1), SKELETON_PRESET_MAX_COUNT);\n });\n protected readonly items = computed(() => Array.from({ length: this.total() }, (_, i) => i));\n\n /** Columnas de la tabla sintética (encabezados en blanco: lo real aún no llegó). */\n protected readonly tableColumns = computed<DataTableColumn[]>(() =>\n Array.from({ length: Math.min(Math.max(this.columns() ?? 4, 1), 8) }, (_, i) => ({\n key: `c${i}`,\n label: ' ',\n })),\n );\n protected readonly formColumns = computed(() => (this.columns() === 2 ? 2 : 1));\n}\n","<div\n [class]=\"'kf-skeleton-preset kf-skeleton-preset--' + variant()\"\n aria-busy=\"true\"\n [style.--kf-skeleton-preset-columns]=\"columns() ?? null\"\n>\n @if (label()) {\n <span class=\"kf-sr-only\" role=\"status\">{{ label() }}</span>\n }\n @switch (variant()) {\n @case ('kpi-grid') {\n <div class=\"kf-skeleton-preset__grid\" [class.kf-skeleton-preset__grid--fixed]=\"!!columns()\">\n @for (i of items(); track i) {\n <kf-stat-card [loading]=\"true\" icon=\"bell\" value=\"0\" label=\"Etiqueta\" note=\"Nota\" />\n }\n </div>\n }\n @case ('card-grid') {\n <div class=\"kf-skeleton-preset__grid\" [class.kf-skeleton-preset__grid--fixed]=\"!!columns()\">\n @for (i of items(); track i) {\n <kf-card gap=\"sm\" aria-hidden=\"true\">\n <kf-skeleton variant=\"rect\" height=\"7.5rem\" />\n <kf-skeleton width=\"60%\" height=\"1.25rem\" />\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n </kf-card>\n }\n </div>\n }\n @case ('form') {\n <div\n class=\"kf-skeleton-preset__form\"\n [class.kf-skeleton-preset__form--two]=\"formColumns() === 2\"\n aria-hidden=\"true\"\n >\n @for (i of items(); track i) {\n <div class=\"kf-skeleton-preset__field\">\n <span\n class=\"kf-skeleton-preset__label kf-overline-text kf-bone\"\n style=\"--kf-bone-width: 30%\"\n >\n Etiqueta\n </span>\n <span class=\"kf-skeleton-preset__control\">\n <span class=\"kf-skeleton-preset__value kf-bone\" style=\"--kf-bone-width: 55%\"\n >Valor</span\n >\n </span>\n </div>\n }\n </div>\n }\n @case ('list') {\n <div class=\"kf-skeleton-preset__stack\">\n @for (i of items(); track i) {\n <kf-document-row [loading]=\"true\" title=\"Documento\" meta=\"Archivo · 120 KB\" />\n }\n </div>\n }\n @case ('table') {\n <kf-data-table\n [columns]=\"tableColumns()\"\n [rows]=\"[]\"\n [loading]=\"true\"\n [skeletonRows]=\"total()\"\n />\n }\n @case ('timeline') {\n <div class=\"kf-skeleton-preset__timeline\" aria-hidden=\"true\">\n <div class=\"kf-skeleton-preset__timeline-toolbar\">\n <span class=\"kf-skeleton-preset__timeline-heading kf-bone\" style=\"--kf-bone-width: 30%\">\n Etapas\n </span>\n <span class=\"kf-skeleton-preset__timeline-toggle kf-bone\" style=\"--kf-bone-width: 7rem\">\n Expandir todo\n </span>\n </div>\n <ol class=\"kf-skeleton-preset__timeline-list\">\n @for (i of items(); track i) {\n <li class=\"kf-skeleton-preset__timeline-group\">\n <span class=\"kf-skeleton-preset__timeline-node kf-bone-fill\"></span>\n <span class=\"kf-skeleton-preset__timeline-text\">\n <span\n class=\"kf-skeleton-preset__timeline-title kf-bone\"\n style=\"--kf-bone-width: 45%\"\n >\n Etapa\n </span>\n <span\n class=\"kf-skeleton-preset__timeline-meta kf-bone\"\n style=\"--kf-bone-width: 30%\"\n >\n Detalle\n </span>\n </span>\n </li>\n }\n </ol>\n </div>\n }\n @case ('detail-header') {\n <div class=\"kf-skeleton-preset__header\" aria-hidden=\"true\">\n <span class=\"kf-skeleton-preset__header-icon kf-bone-fill\"></span>\n <span class=\"kf-skeleton-preset__header-heading\">\n <span class=\"kf-skeleton-preset__header-title kf-bone\" style=\"--kf-bone-width: 40%\">\n Título\n </span>\n <span class=\"kf-skeleton-preset__header-subtitle kf-bone\" style=\"--kf-bone-width: 60%\">\n Subtítulo\n </span>\n </span>\n </div>\n }\n }\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { EmptyState } from '../empty-state/EmptyState';\nimport type { IconName } from '../icon/icon-name';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { SkeletonPreset, type SkeletonPresetVariant } from '../skeleton/SkeletonPreset';\nimport { Spinner } from '../spinner/Spinner';\n\n/** En qué estado está la sección. */\nexport type ContentStateKind = 'ready' | 'loading' | 'empty' | 'error';\n\n/** Cómo se dibuja `loading`. Default `'skeleton'`. */\nexport type ContentStateLoad = 'skeleton' | 'spinner';\n\n/**\n * Marca el `ng-template` que reemplaza el esqueleto genérico de\n * `kf-content-state` mientras carga (`state=\"loading\"`, `load=\"skeleton\"`).\n *\n * <kf-content-state [state]=\"state()\">\n * <ng-template kfContentStateLoading><kf-skeleton-preset variant=\"kpi-grid\" /></ng-template>\n * …\n * </kf-content-state>\n */\n@Directive({ selector: 'ng-template[kfContentStateLoading]' })\nexport class ContentStateLoading {}\n\n/**\n * Wrapper de los cuatro estados que toda sección tiene: cargando, con datos,\n * vacía y con error. Un componente en vez de tres `@if` sueltos, porque es\n * siempre el mismo slot el que va rotando entre los cuatro.\n *\n * Con `state=\"ready\"` proyecta el contenido real y desaparece; en los otros\n * tres dibuja el placeholder correspondiente y el contenido no se instancia.\n * No inventa visuales propios: `loading` usa `kf-skeleton` (o `kf-spinner` con\n * `load=\"spinner\"`), y `empty`/`error` usan `kf-empty-state`.\n *\n * Las acciones (reintentar, crear) van en el slot `actions` — se ignoran\n * mientras carga, porque no hay nada que reintentar todavía.\n *\n * Anuncios para lectores de pantalla: al cargar con silueta, `loadingLabel`\n * se anuncia en una región `status` (con `load=\"spinner\"` ya lo anuncia el\n * propio `kf-spinner`); un error entra como `role=\"alert\"` (interrumpe) y el\n * estado vacío como `role=\"status\"` (cortés). `icon` dibuja el glifo de\n * `kf-empty-state` en esos dos estados.\n *\n * <kf-content-state [state]=\"state()\" title=\"No pudimos cargar tus vehículos\"\n * subtitle=\"Revisá tu conexión e intentá de nuevo.\">\n * <kf-button actions (click)=\"retry()\">Reintentar</kf-button>\n * <kf-data-table [columns]=\"cols\" [rows]=\"rows()\" />\n * </kf-content-state>\n *\n * Esqueleto de carga: por defecto son tres líneas genéricas. Para que la\n * carga se parezca a lo que va a aparecer, hay tres vías (de la más corta a la\n * más libre): `loadingPreset` (una variante de `kf-skeleton-preset`), el input\n * `loadingTemplate` (un `TemplateRef`) o un `ng-template` marcado con\n * `kfContentStateLoading` dentro del contenido. Si hay más de una, gana la\n * plantilla proyectada, luego `loadingTemplate` y por último `loadingPreset`.\n *\n * <kf-content-state [state]=\"state()\" loadingPreset=\"kpi-grid\">…</kf-content-state>\n *\n * Accesibilidad: en modo skeleton el contenedor lleva `aria-busy=\"true\"` y un\n * texto visualmente oculto con `role=\"status\"` (`loadingLabel`, \"Cargando…\" por\n * defecto) que anuncia el estado una vez. Con `load=\"spinner\"` el texto es el\n * del propio `kf-spinner`. El contenedor reserva un ancho mínimo, así que el\n * esqueleto no colapsa a 0 dentro de un padre que se ajusta a su contenido.\n */\n@Component({\n selector: 'kf-content-state',\n imports: [EmptyState, NgTemplateOutlet, Skeleton, SkeletonPreset, Spinner],\n templateUrl: './ContentState.html',\n styleUrl: './ContentState.css',\n})\nexport class ContentState {\n readonly state = input.required<ContentStateKind>();\n /** Forma del estado de carga: silueta (default) o spinner. */\n readonly load = input<ContentStateLoad>('skeleton');\n /** Título de `empty`/`error`. Ignorado mientras carga. */\n readonly title = input('');\n readonly subtitle = input('');\n /** Glifo de `empty`/`error` (el mismo input de `kf-empty-state`). Sin valor, no se dibuja ícono. */\n readonly icon = input<IconName>();\n /** Texto de carga: visible al lado del spinner con `load=\"spinner\"` y, en modo\n * skeleton, texto visualmente oculto con `role=\"status\"` para lectores de pantalla. */\n readonly loadingLabel = input('Cargando…');\n /** Plantilla propia del esqueleto (reemplaza las tres líneas genéricas). */\n readonly loadingTemplate = input<TemplateRef<unknown> | null>(null);\n /** Variante de `kf-skeleton-preset` como esqueleto de carga. */\n readonly loadingPreset = input<SkeletonPresetVariant | null>(null);\n\n /** `ng-template[kfContentStateLoading]` proyectado como contenido. */\n protected readonly projectedLoading = contentChild(ContentStateLoading, {\n read: TemplateRef,\n });\n protected readonly customLoading = computed(\n () => this.projectedLoading() ?? this.loadingTemplate(),\n );\n}\n","@switch (state()) {\n @case ('ready') {\n <ng-content />\n }\n @case ('loading') {\n @if (load() === 'skeleton') {\n <!-- Fuera del contenedor `aria-busy`: una región viva ocupada no anuncia nada. -->\n <span class=\"kf-sr-only\" role=\"status\">{{ loadingLabel() }}</span>\n }\n <div class=\"kf-content-state__loading\" aria-busy=\"true\">\n @if (load() === 'spinner') {\n <kf-spinner [label]=\"loadingLabel()\" />\n } @else {\n @if (customLoading(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" />\n } @else if (loadingPreset(); as preset) {\n <kf-skeleton-preset [variant]=\"preset\" />\n } @else {\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n <kf-skeleton width=\"60%\" />\n }\n }\n </div>\n }\n @default {\n <kf-empty-state\n [tone]=\"state() === 'error' ? 'error' : 'neutral'\"\n [icon]=\"icon()\"\n [attr.role]=\"state() === 'error' ? 'alert' : 'status'\"\n >\n @if (title()) {\n <p class=\"kf-content-state__title\">{{ title() }}</p>\n }\n @if (subtitle()) {\n <p class=\"kf-content-state__subtitle\">{{ subtitle() }}</p>\n }\n <div class=\"kf-content-state__actions\"><ng-content select=\"[actions]\" /></div>\n </kf-empty-state>\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { Icon } from '../icon/Icon';\n\nexport type ContentViewerType = 'image' | 'video' | 'pdf';\n\nconst RAW_BASE64_MIME: Record<ContentViewerType, string> = {\n image: 'image/jpeg',\n video: 'video/mp4',\n pdf: 'application/pdf',\n};\n\n/** Solo contenido ya en memoria: un `<iframe>` con una URL remota arbitraria podría cargar cualquier página. */\nconst LOCAL_PDF_SRC = /^(blob:|data:application\\/pdf[;,])/i;\n\nlet contentViewerId = 0;\n\n/**\n * Visor a pantalla completa para ampliar una pieza de contenido: imagen,\n * video o PDF (`type=\"pdf\"`, renderizado por el visor nativo del navegador).\n * Mismo mecanismo que `kf-modal` (el `<dialog>` nativo resuelve backdrop,\n * atrapado de foco, top-layer y `Escape`), pero sin panel/título/footer:\n * el contenido ocupa toda la pantalla sobre un backdrop oscuro.\n *\n * `src` acepta lo que venga del backend sin que el consumidor tenga que\n * normalizarlo primero: una URL (`http(s)://`), un data URI ya armado\n * (`data:...`), o base64 crudo (se le antepone el prefijo `data:` según\n * `type`, asumiendo JPEG para imagen, MP4 para video y PDF para pdf). Un PDF\n * solo acepta contenido local (`blob:`, data URI o base64), nunca una URL remota.\n *\n * Lo proyectado con el atributo `actions` (p. ej. un botón de descarga) va en\n * la barra superior, junto al título.\n *\n * <kf-content-viewer [(open)]=\"viewerOpen\" [src]=\"viewerSrc()\" alt=\"Foto del vehículo\" />\n * <kf-content-viewer [(open)]=\"viewerOpen\" type=\"video\" [src]=\"viewerSrc()\" title=\"Inspección\" />\n * <kf-content-viewer [(open)]=\"viewerOpen\" type=\"pdf\" [src]=\"blobUrl()\" title=\"Contrato\">\n * <kf-button actions variant=\"surface\" icon=\"download\" (click)=\"save()\">Descargar</kf-button>\n * </kf-content-viewer>\n */\n@Component({\n selector: 'kf-content-viewer',\n imports: [Icon],\n templateUrl: './ContentViewer.html',\n styleUrl: './ContentViewer.css',\n})\nexport class ContentViewer {\n readonly type = input<ContentViewerType>('image');\n /** URL, data URI, o base64 crudo — ver JSDoc de la clase. */\n readonly src = input<string | null>(null);\n /** Texto alternativo cuando `type=\"image\"`. */\n readonly alt = input('');\n readonly title = input('');\n /** Visibilidad, two-way: `[(open)]=\"viewerOpen\"`. */\n readonly open = model(false);\n /** Permite cerrar con el botón, `Escape` o clic en el backdrop. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n\n protected readonly titleId = `kf-content-viewer-title-${contentViewerId++}`;\n\n /** Detecta si `src` ya es una URL o un data URI armado; si no, asume\n * base64 crudo y le antepone el prefijo `data:` correspondiente a `type`\n * — el backend a veces manda una cosa, a veces la otra. */\n protected readonly resolvedSrc = computed(() => {\n const raw = this.src();\n if (!raw) return null;\n if (/^(https?:|data:|blob:)/i.test(raw)) return raw;\n return `data:${RAW_BASE64_MIME[this.type()]};base64,${raw}`;\n });\n\n protected readonly pdfSrc = computed<SafeResourceUrl | null>(() => {\n const src = this.resolvedSrc();\n if (this.type() !== 'pdf' || !src || !LOCAL_PDF_SRC.test(src)) return null;\n return this.sanitizer.bypassSecurityTrustResourceUrl(src);\n });\n\n protected readonly fallbackLabel = computed(\n () =>\n ({ image: 'Visor de imagen', video: 'Visor de video', pdf: 'Visor de documento' })[\n this.type()\n ],\n );\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly document = inject(DOCUMENT);\n private readonly sanitizer = inject(DomSanitizer);\n\n constructor() {\n afterRenderEffect(() => {\n const el = this.dialog()?.nativeElement;\n if (!el) {\n return;\n }\n if (this.open() && !el.open) {\n // `showModal` no existe en jsdom (tests) ni en entornos sin\n // top-layer; el atributo `open` lo deja visible, aunque no modal.\n if (typeof el.showModal === 'function') {\n el.showModal();\n } else {\n el.open = true;\n }\n } else if (!this.open() && el.open) {\n if (typeof el.close === 'function') {\n el.close();\n } else {\n el.open = false;\n }\n }\n // `<dialog>` inertiza el resto de la página pero no frena su scroll.\n this.document.body.style.overflow = this.open() ? 'hidden' : '';\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n });\n }\n\n /** `Escape` dispara `cancel`; cancelarlo lo deja abierto. */\n protected onCancel(event: Event): void {\n if (!this.dismissible()) {\n event.preventDefault();\n }\n }\n\n /**\n * Clic en el backdrop. Un clic en la zona del backdrop tiene como `target` al\n * propio `<dialog>` (el contenido vive en el panel de adentro), así que basta\n * comparar contra él — no hace falta cortar la propagación en el panel.\n */\n @HostListener('click', ['$event'])\n protected onHostClick(event: MouseEvent): void {\n if (this.dismissible() && event.target === this.dialog()?.nativeElement) {\n this.open.set(false);\n }\n }\n}\n","<dialog\n #dialog\n class=\"kf-content-viewer\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n [attr.aria-label]=\"title() ? null : fallbackLabel()\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n>\n @if (open()) {\n <div class=\"kf-content-viewer__panel\">\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-content-viewer__close\"\n aria-label=\"Cerrar visor\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"md\" />\n </button>\n }\n <div class=\"kf-content-viewer__bar\">\n @if (title()) {\n <span class=\"kf-content-viewer__title\" [id]=\"titleId\">{{ title() }}</span>\n }\n <div class=\"kf-content-viewer__actions\"><ng-content select=\"[actions]\" /></div>\n </div>\n <div class=\"kf-content-viewer__stage\">\n @if (type() === 'pdf') {\n @if (pdfSrc(); as src) {\n <iframe\n class=\"kf-content-viewer__document\"\n [src]=\"src\"\n [title]=\"title() || fallbackLabel()\"\n ></iframe>\n }\n } @else if (resolvedSrc(); as src) {\n @if (type() === 'video') {\n <video class=\"kf-content-viewer__media\" [src]=\"src\" controls autoplay></video>\n } @else {\n <img class=\"kf-content-viewer__media\" [src]=\"src\" [alt]=\"alt()\" />\n }\n }\n </div>\n </div>\n }\n</dialog>\n","import { Component, computed, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { Select } from '../select/Select';\n\n/**\n * Paginador «Anterior / Siguiente» para listas con cursor: no conoce el\n * número de página, solo si hay una anterior o una siguiente y un resumen ya\n * armado. Complementa a `kf-pagination`, que exige número de página y total.\n *\n * `summary` (\"Mostrando 25 de 96\") se anuncia en una región `status`. Los\n * botones usan `aria-disabled` y no `disabled`, para que el foco no se pierda\n * al llegar a un extremo (un botón `disabled` deja de ser enfocable y el foco\n * cae al `body`); pulsarlos en ese estado no emite nada.\n *\n * Con `pageSizeOptions` agrega el selector \"Filas por página\"; vacío lo oculta.\n *\n * <kf-cursor-pager summary=\"Mostrando 25 de 96\" [hasPrevious]=\"!!prev()\" [hasNext]=\"!!next()\"\n * [pageSizeOptions]=\"[25, 50, 100]\" [pageSize]=\"size()\"\n * (previous)=\"load(prev())\" (next)=\"load(next())\" (pageSizeChange)=\"size.set($event)\" />\n */\n@Component({\n selector: 'kf-cursor-pager',\n imports: [Icon, Select],\n templateUrl: './CursorPager.html',\n styleUrl: './CursorPager.css',\n})\nexport class CursorPager {\n /** Texto anunciado y mostrado a la izquierda, p. ej. «Mostrando 25 de 96». */\n readonly summary = input('');\n readonly hasPrevious = input(false);\n readonly hasNext = input(false);\n /** Opciones del selector de filas por página. Vacío oculta el selector. */\n readonly pageSizeOptions = input<readonly number[]>([]);\n readonly pageSize = input<number | undefined>();\n /** Nombre accesible de la navegación. */\n readonly ariaLabel = input('Paginación');\n\n readonly previous = output<void>();\n readonly next = output<void>();\n readonly pageSizeChange = output<number>();\n\n protected readonly sizeOptions = computed(() =>\n this.pageSizeOptions().map((size) => ({ value: String(size), label: String(size) })),\n );\n protected readonly sizeValue = computed(() => String(this.pageSize() ?? ''));\n\n protected onPrevious(): void {\n if (this.hasPrevious()) {\n this.previous.emit();\n }\n }\n\n protected onNext(): void {\n if (this.hasNext()) {\n this.next.emit();\n }\n }\n\n protected onPageSize(value: string): void {\n const size = Number(value);\n if (Number.isFinite(size) && size !== this.pageSize()) {\n this.pageSizeChange.emit(size);\n }\n }\n}\n","<div class=\"kf-cursor-pager\">\n <div class=\"kf-cursor-pager__summary\" role=\"status\" aria-live=\"polite\">{{ summary() }}</div>\n\n <div class=\"kf-cursor-pager__controls\">\n @if (sizeOptions().length > 0) {\n <div class=\"kf-cursor-pager__size\">\n <span class=\"kf-cursor-pager__size-label\" aria-hidden=\"true\">Filas</span>\n <kf-select\n variant=\"compact\"\n label=\"Filas por página\"\n hideLabel\n [options]=\"sizeOptions()\"\n [value]=\"sizeValue()\"\n (valueChange)=\"onPageSize($event)\"\n />\n </div>\n <span class=\"kf-cursor-pager__divider\" aria-hidden=\"true\"></span>\n }\n\n <nav class=\"kf-cursor-pager__nav\" [attr.aria-label]=\"ariaLabel()\">\n <button\n type=\"button\"\n class=\"kf-cursor-pager__button\"\n [attr.aria-disabled]=\"!hasPrevious()\"\n (click)=\"onPrevious()\"\n >\n <kf-icon name=\"chevron-left\" size=\"sm\" />\n Anterior\n </button>\n <button\n type=\"button\"\n class=\"kf-cursor-pager__button kf-cursor-pager__button--next\"\n [attr.aria-disabled]=\"!hasNext()\"\n (click)=\"onNext()\"\n >\n Siguiente\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </button>\n </nav>\n </div>\n</div>\n","import { computed, Signal } from '@angular/core';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport type { DataTableView } from './DataTable';\n\n/**\n * Signal con la vista de `kf-data-table` ('table' | 'cards') derivada de un\n * breakpoint — mismo criterio que cualquier tabla con muchas columnas: bajo\n * el ancho dado, la vista de tabla no entra sin scroll horizontal, así que\n * se fuerza `cards`. Centraliza el patrón `matchMediaSignal` +\n * `computed<DataTableView>` que cada tabla del portal repetía igual.\n *\n * protected readonly tableView = dataTableViewSignal();\n * // con un breakpoint distinto al default de 900px:\n * protected readonly tableView = dataTableViewSignal('(max-width: 768px)');\n */\nexport function dataTableViewSignal(query = '(max-width: 900px)'): Signal<DataTableView> {\n const isMobile = matchMediaSignal(query);\n return computed(() => (isMobile() ? 'cards' : 'table'));\n}\n","import { Component, input } from '@angular/core';\n\nexport type DividerOrientation = 'horizontal' | 'vertical';\n\n/**\n * Separador visual simple entre bloques de contenido. `orientation`\n * controla si es una línea horizontal (para separar secciones apiladas) o\n * vertical (para separar elementos en una fila, ej. acciones en una toolbar,\n * o las columnas de metadata en `kf-company-selector`).\n *\n * En `vertical`, el divisor necesita una altura del contexto donde vive —\n * `:host { align-self: stretch }` lo hace ocupar la altura del contenedor\n * flex/grid padre sin que el consumidor tenga que fijarla a mano. `flex:\n * none` evita que el propio divisor se achique a 0 dentro de ese contenedor\n * flex cuando hay contenido hermano compitiendo por espacio.\n *\n * <kf-divider />\n * <kf-divider orientation=\"vertical\" />\n */\n@Component({\n selector: 'kf-divider',\n template: '',\n styleUrl: './Divider.css',\n host: {\n role: 'separator',\n '[attr.orientation]': 'orientation()',\n '[attr.aria-orientation]': 'orientation()',\n },\n})\nexport class Divider {\n readonly orientation = input<DividerOrientation>('horizontal');\n}\n","import type { OverlayContainer } from '@angular/cdk/overlay';\n\n/**\n * Forma mínima que necesita este módulo — angosta el parámetro al único\n * miembro que usa en vez de exigir la clase concreta completa. Además de\n * desacoplar del CDK, evita que los specs necesiten un `as unknown as\n * OverlayContainer` para pasar un mock: un objeto literal con solo este\n * método ya satisface el tipo por estructura.\n */\nexport type OverlayContainerLike = Pick<OverlayContainer, 'getContainerElement'>;\n\n/**\n * Contenedores modales abiertos actualmente: un `<dialog>` abierto vía\n * `showModal()` (`kf-modal`) o el panel de un `kf-drawer` con\n * `role=\"dialog\"` (`aria-modal=\"true\"`), en orden de apertura. Con diálogos\n * anidados el navegador apila el top layer: el más reciente queda arriba e\n * inertiza a los anteriores (incluidos otros `<dialog>` ya abiertos), así\n * que el ÚLTIMO de esta lista es el único candidato válido para recibir el\n * overlay container — nunca \"cualquier `dialog[open]` de la página\", que\n * rompería con dos `kf-modal` anidados o con dos independientes donde solo\n * uno está abierto.\n */\nconst openModalDialogs: HTMLElement[] = [];\n\n/**\n * Reubicadores de los `OverlayContainer` parchados. Cada cambio en el\n * registro los ejecuta, así el contenedor vuelve a `<body>` (o pasa al\n * siguiente contenedor modal) al cerrar, sin esperar a que otro overlay\n * llame a `getContainerElement()`: un panel con el `overlayRef` ya creado\n * que se vuelve a abrir no pasa por esa llamada, y si el contenedor seguía\n * dentro de un diálogo cerrado quedaba invisible.\n */\nconst relocators = new Set<() => boolean>();\n\nfunction relocateContainers(): void {\n for (const relocate of [...relocators]) {\n if (!relocate()) {\n relocators.delete(relocate);\n }\n }\n}\n\n/** Llamado por `Modal` cuando su `<dialog>` pasa a estar abierto, y por `Drawer` (`role=\"dialog\"`) con su panel. */\nexport function registerOpenModalDialog(dialog: HTMLElement): void {\n if (!openModalDialogs.includes(dialog)) {\n openModalDialogs.push(dialog);\n relocateContainers();\n }\n}\n\n/** Llamado por `Modal`/`Drawer` cuando su contenedor se cierra o el componente se destruye. */\nexport function unregisterOpenModalDialog(dialog: HTMLElement): void {\n const index = openModalDialogs.indexOf(dialog);\n if (index !== -1) {\n openModalDialogs.splice(index, 1);\n relocateContainers();\n }\n}\n\nfunction topmostOpenModalDialog(): HTMLElement | undefined {\n return openModalDialogs.at(-1);\n}\n\n/**\n * Instancias de `OverlayContainer` ya parchadas — evita parchar dos veces\n * el mismo objeto (varios `kf-modal` en el árbol llaman a esta función) y,\n * a la vez, no interfiere con instancias nuevas que arma un `TestBed` fresco\n * en cada spec (root providers se recrean por test).\n */\nconst patchedContainers = new WeakSet<OverlayContainerLike>();\n\n/**\n * `showModal()` promueve el `<dialog>` al top layer del navegador y vuelve\n * `inert` todo lo que quede fuera de su subárbol — pero Angular CDK\n * (`Overlay`/`OverlayContainer`, usado por `kf-select`, `kf-multi-select`,\n * `kf-dropdown`, `kf-tooltip` y el selector de tamaño de `kf-pagination`)\n * siempre appendea `.cdk-overlay-container` como hijo de `<body>`, que\n * queda fuera del `<dialog>` y por lo tanto inerte: el overlay se ve pero\n * no recibe clicks.\n *\n * No existe una forma de reemplazar, sin que el consumidor configure nada,\n * QUÉ IMPLEMENTACIÓN resuelve Angular DI para el token `OverlayContainer`:\n * es `providedIn: 'root'`, y la instancia se crea una sola vez contra el\n * inyector RAÍZ de la app la primera vez que algo la necesita — incluida\n * la propia `Overlay`, que la inyecta puertas adentro de SU construcción,\n * no en el inyector del componente que gatilló esa construcción. Un\n * `providers` a nivel de componente (`kf-modal`, o incluso `kf-select`)\n * nunca llega a interceptar esa creación; solo un `providers` explícito en\n * el bootstrap de cada app lo haría, y eso es justo la configuración manual\n * que se quiere evitar.\n *\n * Por eso el fix no reemplaza la clase vía DI: parcha, una sola vez, el\n * MISMO objeto singleton que ya usa toda la app (la instancia real que\n * `Modal` recibe con un `inject(OverlayContainer)` normal — automático\n * apenas se usa `kf-modal`, sin tocar ningún `providers`). `getContainerElement`\n * sigue delegando en el original para crear/cachear el div la primera vez;\n * lo único que se agrega es reubicarlo, en cada llamada, dentro del\n * `<dialog>` abierto más reciente (o de vuelta en `<body>` si no hay\n * ninguno) antes de devolverlo — mover el div se lleva puestos a sus hijos,\n * así que overlays ya adjuntos antes de abrir el modal quedan igual de\n * bien ubicados que los que se abren después.\n *\n * Un `kf-drawer` con `role=\"dialog\"` no usa el top layer, pero declara\n * `aria-modal=\"true\"`: un overlay fuera de su subárbol queda, para un lector\n * de pantalla, fuera del diálogo. Por eso también registra su panel acá y\n * el contenedor se reubica dentro de él mientras está abierto.\n */\nexport function installModalAwareOverlayContainer(container: OverlayContainerLike): void {\n if (patchedContainers.has(container)) {\n return;\n }\n patchedContainers.add(container);\n\n const originalGetContainerElement = container.getContainerElement.bind(container);\n let knownElement: HTMLElement | null = null;\n\n container.getContainerElement = (): HTMLElement => {\n const element = originalGetContainerElement();\n knownElement = element;\n const targetParent = topmostOpenModalDialog() ?? element.ownerDocument.body;\n if (element.parentElement !== targetParent) {\n targetParent.appendChild(element);\n }\n return element;\n };\n\n // Devuelve `false` cuando el contenedor ya no existe (la app se destruyó):\n // se descarta del conjunto en vez de recrearlo. Mientras nadie lo haya\n // pedido todavía no hay nada que reubicar.\n relocators.add(() => {\n if (!knownElement) {\n return true;\n }\n if (!knownElement.isConnected) {\n return false;\n }\n container.getContainerElement();\n return true;\n });\n}\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { OverlayContainer } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n computed,\n effect,\n inject,\n isDevMode,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { Button } from '../button/button';\nimport {\n installModalAwareOverlayContainer,\n registerOpenModalDialog,\n unregisterOpenModalDialog,\n} from '../modal/modal-overlay-container';\n\n/** Borde de anclaje del panel. `bottom` es una hoja inferior (bottom sheet). */\nexport type DrawerSide = 'left' | 'right' | 'bottom';\n\n/**\n * Rol del panel. `navigation` (default) es el menú lateral histórico;\n * `dialog` es un panel modal de tarea (filtros, resumen) con\n * `aria-modal=\"true\"`.\n */\nexport type DrawerRole = 'navigation' | 'dialog';\n\nlet nextId = 0;\n\n/**\n * Panel lateral genérico, agnóstico de contenido — no sabe qué es navegación\n * ni qué es sesión, solo da tres lugares para proyectar contenido\n * (`[kf-drawer-header]`, default, `[kf-drawer-footer]`) y resuelve lo que\n * cualquier drawer necesita resolver igual sin importar qué haya adentro:\n * overlay con blur que cierra al click, `Escape`, atrapado de foco real y\n * devolución de foco al cerrar.\n *\n * `open` es two-way, mismo patrón que `Dropdown`/`Modal`: el consumidor\n * decide qué dispara la apertura (un botón de hamburguesa, por ejemplo) y\n * qué hace con el cierre.\n *\n * Foco: al abrir, se crea un `FocusTrap` del CDK sobre el panel (la misma\n * pieza que usa Angular Material para `mat-sidenav`/`mat-dialog`) — Tab y\n * Shift+Tab ciclan solo entre los elementos focuseables del drawer, sin\n * escapar al contenido de fondo. Al cerrar, el foco vuelve al elemento que\n * tenía el foco antes de abrir (guardado en `document.activeElement`), no\n * se pierde en el `<body>`.\n *\n * `[kf-drawer-header]` tiene fondo oscuro propio (`--kf-color-tertiary-deep`),\n * distinto del body (`--kf-color-white`) — pensado para contener\n * `kf-drawer-session`, que asume ese fondo y no lo trae él mismo (ver\n * `DrawerSession.ts`). Si el slot queda vacío, el contenedor colapsa\n * (`display: none`) y no deja una franja oscura sin contenido.\n *\n * <kf-drawer [(open)]=\"menuOpen\" ariaLabel=\"Menú de navegación\">\n * <div kf-drawer-header>\n * <kf-drawer-session name=\"Tomás Soto\" email=\"tomas@kaufmann.com\" (logoutClick)=\"onLogout()\" />\n * </div>\n * <a href=\"/\">Home</a>\n * <a href=\"/vehiculos\">Vehículos</a>\n * </kf-drawer>\n *\n * ## Panel de tarea (`role=\"dialog\"`)\n *\n * Para un panel modal que no es navegación (filtros de un listado, resumen\n * de un registro): `role=\"dialog\"` expone `role=\"dialog\"` + `aria-modal`,\n * `title` dibuja una barra clara con el título (que nombra el diálogo vía\n * `aria-labelledby`) y un botón de cierre con `closeLabel`. En pantallas de\n * hasta 640px el panel ocupa el ancho completo; arriba de eso mide\n * `--kf-drawer-width` (default 480px). El pie (`[kf-drawer-footer]`) queda\n * fijo abajo mientras el cuerpo hace scroll.\n *\n * <kf-drawer [(open)]=\"filtersOpen\" role=\"dialog\" side=\"right\"\n * title=\"Filtros\" closeLabel=\"Cerrar filtros\">\n * <kf-option-list label=\"Estado\" ... />\n * <div kf-drawer-footer> ...Limpiar / Ver 12 resultados... </div>\n * </kf-drawer>\n *\n * `side=\"bottom\"` lo convierte en hoja inferior (grip, esquinas superiores\n * redondeadas, alto máximo 80vh) — pensado para un resumen en mobile.\n *\n * Escape cierra el panel salvo que un control interno ya haya consumido la\n * tecla (`event.defaultPrevented`): un `kf-select`, `kf-multi-select` o\n * `kf-dropdown` abierto dentro del drawer cierra primero su propio panel y\n * un segundo Escape cierra el drawer.\n *\n * Nombres por defecto: con `role=\"navigation\"` el panel se llama \"Menú\" y\n * el cierre \"Cerrar menú\" (comportamiento histórico). Con `role=\"dialog\"`\n * los defaults son neutros (\"Diálogo\" / \"Cerrar\") y en modo desarrollo se\n * avisa por consola si no hay `title` ni `ariaLabel`: un diálogo sin nombre\n * propio no le dice nada al lector de pantalla.\n *\n * ## Selectores y otros paneles flotantes dentro del drawer\n *\n * `kf-select`, `kf-multi-select` y `kf-dropdown` funcionan\n * dentro de un drawer (incluido el pie `[kf-drawer-footer]`): sus paneles\n * quedan por encima del drawer, se abren hacia arriba si abajo no hay lugar\n * y no se cortan con el borde del panel ni con el scroll del cuerpo. Con\n * `role=\"dialog\"` el contenedor de overlays de CDK se reubica dentro del\n * panel mientras está abierto: el listbox queda dentro del diálogo\n * `aria-modal`, no fuera de él, y el atrapado de foco lo incluye. Al cerrar\n * el drawer vuelve a `<body>`. Escape cierra primero el panel flotante\n * (devolviendo el foco a su disparador) y el siguiente cierra el drawer.\n *\n * <kf-drawer [(open)]=\"open\" role=\"dialog\" side=\"right\" title=\"Unidad VIN-1003\">\n * ...\n * <div kf-drawer-footer>\n * <kf-select label=\"Saltar a otra unidad\" width=\"full\"\n * [options]=\"units\" [value]=\"unit()\" (valueChange)=\"unit.set($event)\" />\n * </div>\n * </kf-drawer>\n *\n * Al cerrar, el foco vuelve al elemento que lo tenía al abrir solo si sigue\n * en el documento (`isConnected`); si fue desmontado mientras el drawer\n * estaba abierto, no se fuerza ningún destino.\n */\n@Component({\n selector: 'kf-drawer',\n imports: [Button],\n templateUrl: './Drawer.html',\n styleUrl: './Drawer.css',\n host: {\n // `role` y `title` son inputs con nombre de atributo nativo: escritos\n // como atributo estático (`role=\"dialog\"`, `title=\"Filtros\"`) Angular\n // también los deja en el host, lo que anidaría dos diálogos y mostraría\n // un tooltip nativo sobre todo el panel. El rol real vive en el panel.\n '[attr.role]': 'null',\n '[attr.title]': 'null',\n },\n})\nexport class Drawer {\n /** Visibilidad del panel, two-way: `[(open)]=\"menuOpen\"`. */\n readonly open = model(false);\n /** Borde de anclaje del panel. `left` (default) es la convención dominante\n * (Material/iOS/Android): el botón que abre el drawer y el propio panel\n * quedan del mismo lado. `bottom` lo convierte en hoja inferior. */\n readonly side = input<DrawerSide>('left');\n /** `navigation` (default, menú) o `dialog` (panel modal de tarea). Ver JSDoc de la clase. */\n readonly role = input<DrawerRole>('navigation');\n /** `aria-label` del panel — describe su propósito para lectores de\n * pantalla (ej. \"Menú de navegación\"). Ignorado cuando hay `title`, que\n * nombra el panel con su texto visible. Default: \"Menú\" (`navigation`) o\n * \"Diálogo\" (`dialog`). */\n readonly ariaLabel = input<string>();\n /** Título visible en una barra clara arriba del panel, con botón de cierre. Sin él no hay barra (comportamiento histórico). */\n readonly title = input<string>();\n /** Nombre accesible del botón de cierre de la barra de título y del\n * overlay. Default: \"Cerrar menú\" (`navigation`) o \"Cerrar\" (`dialog`). */\n readonly closeLabel = input<string>();\n\n /** `ariaLabel` o, sin él, el default según el rol. */\n protected readonly resolvedAriaLabel = computed(\n () => this.ariaLabel() ?? (this.role() === 'dialog' ? 'Diálogo' : 'Menú'),\n );\n /** `closeLabel` o, sin él, el default según el rol. */\n protected readonly resolvedCloseLabel = computed(\n () => this.closeLabel() ?? (this.role() === 'dialog' ? 'Cerrar' : 'Cerrar menú'),\n );\n\n protected readonly titleId = `kf-drawer-title-${nextId++}`;\n\n private readonly panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly document = inject(DOCUMENT);\n private readonly overlayContainer = inject(OverlayContainer);\n\n private registeredPanel: HTMLElement | null = null;\n private focusTrap: FocusTrap | null = null;\n private lastFocusedElement: HTMLElement | null = null;\n\n constructor() {\n // Ver `modal-overlay-container.ts`: con `role=\"dialog\"` los paneles\n // flotantes (select, dropdown) deben vivir dentro del diálogo.\n installModalAwareOverlayContainer(this.overlayContainer);\n\n afterRenderEffect(() => {\n const panel = this.panelRef().nativeElement;\n this.registeredPanel = panel;\n if (this.open() && this.role() === 'dialog') {\n registerOpenModalDialog(panel);\n } else {\n unregisterOpenModalDialog(panel);\n }\n });\n\n afterRenderEffect(() => {\n if (this.open()) {\n this.lastFocusedElement = this.document.activeElement as HTMLElement | null;\n const trap = this.getOrCreateFocusTrap();\n void trap.focusInitialElement();\n } else {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n if (this.lastFocusedElement?.isConnected) {\n this.lastFocusedElement.focus();\n }\n this.lastFocusedElement = null;\n }\n });\n\n if (isDevMode()) {\n effect(() => {\n if (this.role() === 'dialog' && !this.title() && !this.ariaLabel()) {\n console.warn(\n '[kf-drawer] role=\"dialog\" sin `title` ni `ariaLabel`: el diálogo se anuncia con el nombre genérico \"Diálogo\".',\n );\n }\n });\n }\n\n inject(DestroyRef).onDestroy(() => {\n if (this.registeredPanel) {\n unregisterOpenModalDialog(this.registeredPanel);\n }\n this.focusTrap?.destroy();\n });\n }\n\n /** Cierra el drawer con Escape — mismo patrón que `Dropdown`/`Modal`. */\n @HostListener('document:keydown.escape', ['$event'])\n protected onEscape(event: Event): void {\n if (!this.open() || event.defaultPrevented) {\n return;\n }\n this.open.set(false);\n }\n\n private getOrCreateFocusTrap(): FocusTrap {\n if (!this.focusTrap) {\n this.focusTrap = this.focusTrapFactory.create(this.panelRef().nativeElement);\n }\n return this.focusTrap;\n }\n}\n","@if (open()) {\n <button\n type=\"button\"\n class=\"kf-drawer__overlay\"\n [attr.aria-label]=\"resolvedCloseLabel()\"\n [attr.tabindex]=\"role() === 'dialog' ? -1 : null\"\n (click)=\"open.set(false)\"\n ></button>\n}\n\n<!-- Un <div> con rol explícito (no <nav>): un mismo panel puede ser\n navegación o diálogo, y <nav> no admite role=\"dialog\". -->\n<div\n #panel\n class=\"kf-drawer__panel\"\n [class.kf-drawer__panel--open]=\"open()\"\n [class.kf-drawer__panel--right]=\"side() === 'right'\"\n [class.kf-drawer__panel--bottom]=\"side() === 'bottom'\"\n [class.kf-drawer__panel--dialog]=\"role() === 'dialog'\"\n [attr.role]=\"role()\"\n [attr.aria-modal]=\"role() === 'dialog' ? 'true' : null\"\n [attr.aria-label]=\"title() ? null : resolvedAriaLabel()\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n [attr.aria-hidden]=\"!open()\"\n>\n @if (side() === 'bottom') {\n <div class=\"kf-drawer__grip\" aria-hidden=\"true\"></div>\n }\n @if (title(); as titleText) {\n <div class=\"kf-drawer__titlebar\">\n <h2 class=\"kf-drawer__title\" [id]=\"titleId\">{{ titleText }}</h2>\n <kf-button\n class=\"kf-drawer__close\"\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n icon=\"x\"\n [ariaLabel]=\"resolvedCloseLabel()\"\n (click)=\"open.set(false)\"\n />\n </div>\n }\n <div class=\"kf-drawer__header\"><ng-content select=\"[kf-drawer-header]\" /></div>\n <div class=\"kf-drawer__body\"><ng-content /></div>\n <div class=\"kf-drawer__footer\"><ng-content select=\"[kf-drawer-footer]\" /></div>\n</div>\n","import { Component, booleanAttribute, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\n\nexport type DropdownItemTone = 'neutral' | 'error';\n\n/**\n * Ítem de acción dentro de un `kf-dropdown-panel`. Es un `<button>` nativo\n * (no un `<a>`): dispara comportamiento en la pantalla actual, no navega.\n *\n * `icon` es opcional — sin él, el ítem es solo texto.\n *\n * <kf-dropdown-item icon=\"log-out\" (click)=\"onLogout()\" tone=\"error\">Cerrar sesión</kf-dropdown-item>\n */\n@Component({\n selector: 'kf-dropdown-item',\n imports: [Icon],\n templateUrl: './DropdownItem.html',\n styleUrl: './DropdownItem.css',\n})\nexport class DropdownItem {\n readonly tone = input<DropdownItemTone>('neutral');\n /** Ícono opcional al inicio de la fila. */\n readonly icon = input<IconName>();\n /**\n * Deshabilita el ítem (ej. una acción cuyo endpoint todavía no existe,\n * caso real de \"Factura\" en `kf-row-actions` de Taller). Default `false`\n * a propósito — ningún consumidor existente (ej. el menú de sesión del\n * Shell) pasa esta prop hoy, así que no cambia su comportamiento.\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<button\n type=\"button\"\n class=\"kf-dropdown-item\"\n [class.kf-dropdown-item--error]=\"tone() === 'error'\"\n [disabled]=\"disabled()\"\n role=\"menuitem\"\n>\n @if (icon()) {\n <kf-icon [name]=\"icon()!\" size=\"sm\" />\n }\n <span class=\"kf-dropdown-item__label\"><ng-content /></span>\n</button>\n","import { Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\n/** Color del marcador. Distingue la CLASE de evento de un vistazo en un log\n * largo — no es un estado de progreso. */\nexport type EventTimelineTone = 'neutral' | 'primary' | 'ok' | 'warn' | 'error' | 'info';\n\n/** Un evento ya ocurrido. Los tres campos de texto son los tres niveles de\n * lectura: qué pasó, por qué, y cuándo/quién. */\nexport interface EventTimelineItem {\n /** Clave de `track`. */\n readonly id: string;\n readonly title: string;\n readonly detail?: string | null;\n /** Hora y autor, ya formateados por el consumidor. */\n readonly meta?: string | null;\n readonly icon?: IconName;\n readonly tone?: EventTimelineTone;\n}\n\n/**\n * Línea de tiempo de AUDITORÍA: eventos ya ocurridos, en orden, cada uno con\n * marcador coloreado por CLASE y tres niveles de texto (titular, detalle,\n * hora + autor). Distinto de `kf-journey-stepper` (de PROGRESO, con pasos\n * futuros conocidos de antemano): acá todo ya pasó.\n */\n@Component({\n selector: 'kf-event-timeline',\n imports: [Icon],\n templateUrl: './EventTimeline.html',\n styleUrl: './EventTimeline.css',\n})\nexport class EventTimeline {\n readonly items = input.required<readonly EventTimelineItem[]>();\n}\n","<ol class=\"kf-event-timeline\">\n @for (item of items(); track item.id) {\n <li\n class=\"kf-event-timeline__event\"\n [class]=\"'kf-event-timeline__event--' + (item.tone ?? 'neutral')\"\n >\n <span class=\"kf-event-timeline__marker\" aria-hidden=\"true\">\n <kf-icon [name]=\"item.icon ?? 'activity'\" size=\"sm\" />\n </span>\n\n <span class=\"kf-event-timeline__body\">\n <span class=\"kf-event-timeline__title\">{{ item.title }}</span>\n @if (item.detail) {\n <span class=\"kf-event-timeline__detail\">{{ item.detail }}</span>\n }\n @if (item.meta) {\n <span class=\"kf-event-timeline__meta kf-caption-text\">{{ item.meta }}</span>\n }\n </span>\n </li>\n }\n</ol>\n","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Bloque promocional sobre fondo oscuro de marca (página 37) — campañas,\n * accesos directos o el portal de autoatención. Usa `--kf-color-tertiary-deep`\n * como base del degradado, el mismo azul profundo que el slide destacado de\n * `kf-carousel` y la barra de `kf-portal-header`.\n *\n * <kf-feature-card badge=\"Autoatención\" badgeIcon=\"tool\" title=\"Portal de Autoatención\"\n * description=\"Con tu patente o VIN accede a soluciones para tu vehículo: mantenciones, repuestos y conectividad en un solo lugar.\"\n * actionLabel=\"Ir al portal\" actionHref=\"/autoatencion\" />\n */\n@Component({\n selector: 'kf-feature-card',\n imports: [Icon, Text],\n templateUrl: './FeatureCard.html',\n styleUrl: './FeatureCard.css',\n})\nexport class FeatureCard {\n readonly badge = input<string>();\n readonly badgeIcon = input<IconName>();\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n}\n","@if (badge()) {\n <span class=\"kf-feature-card__badge\">\n @if (badgeIcon(); as iconName) {\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n }\n <kf-text as=\"span\" variant=\"overline-strong\" class=\"kf-feature-card__badge-text\">{{\n badge()\n }}</kf-text>\n </span>\n}\n<span class=\"kf-feature-card__title\">{{ title() }}</span>\n@if (description()) {\n <p class=\"kf-feature-card__description\">{{ description() }}</p>\n}\n@if (actionLabel()) {\n <a class=\"kf-feature-card__action\" [href]=\"actionHref() || '#'\">\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n {{ actionLabel() }}\n </a>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Chip de solo-lectura inline (label/valor) dentro de una caja bordeada.\n * Se usa en barras de filtro y filas de resumen para mostrar información,\n * NO para entrada de datos — para eso existe `Input`.\n *\n * El valor admite dos formas, igual que en el design system de referencia:\n * - `value` (string): caso simple, ej. `[value]=\"'Jul 2026'\"`.\n * - contenido proyectado (`<ng-content>`): cuando se necesita algo más rico\n * que un string (un badge, texto con formato, etc.).\n * `value` tiene prioridad cuando está definido; si no se pasa `value`, se\n * renderiza el contenido proyectado y, si tampoco hay contenido, `placeholder`.\n *\n * <kf-field icon=\"calendar\" label=\"Periodo\" value=\"Jul 2026\" [select]=\"true\" />\n * <kf-field label=\"Sucursal\"><strong>Casa Central</strong></kf-field>\n */\n@Component({\n selector: 'kf-field',\n imports: [Icon],\n templateUrl: './Field.html',\n styleUrl: './Field.css',\n host: {\n '[class.kf-field--select]': 'select()',\n '[attr.style]': 'style() || null',\n },\n})\nexport class Field {\n readonly label = input<string>();\n readonly value = input<string>();\n readonly icon = input<IconName>();\n readonly placeholder = input<string>();\n readonly select = input(false, { transform: booleanAttribute });\n /** Estilos inline opcionales aplicados directamente al host. */\n readonly style = input<string>();\n\n /**\n * El placeholder solo tiene sentido cuando no hay `value` ni contenido\n * proyectado. Angular no expone de forma simple si `<ng-content>` recibió\n * hijos reales, así que la regla adoptada es puramente declarativa: se\n * muestra el placeholder cuando hay texto de placeholder y no hay `value`\n * (ver comentario de clase sobre la prioridad value > proyectado > placeholder).\n */\n protected isPlaceholderVisible(): boolean {\n return !this.value() && !!this.placeholder();\n }\n}\n","@if (icon(); as iconName) {\n <kf-icon class=\"kf-field__icon\" [name]=\"iconName\" size=\"sm\" />\n}\n@if (label()) {\n <span class=\"kf-field__label\">{{ label() }}</span>\n}\n<span class=\"kf-field__value\">\n @if (value()) {\n {{ value() }}\n } @else {\n <ng-content></ng-content>\n @if (isPlaceholderVisible()) {\n <span class=\"kf-field__placeholder\">{{ placeholder() }}</span>\n }\n }\n</span>\n@if (select()) {\n <kf-icon class=\"kf-field__chevron\" name=\"chevron-down\" size=\"sm\" />\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon } from '../icon/Icon';\n\n/** Por qué se descartó un archivo: formato fuera de `accept` o más grande que `maxSize`. */\nexport type FileRejectionReason = 'type' | 'size';\n\n/** Un archivo descartado y el motivo. */\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nlet nextId = 0;\n\n/** Nombre legible de un token de `accept`: `.pdf` → `PDF`, `image/png` → `PNG`, `image/*` → `Imágenes`. */\nfunction describeAcceptToken(token: string): string {\n const generic: Record<string, string> = {\n 'image/*': 'Imágenes',\n 'video/*': 'Videos',\n 'audio/*': 'Audio',\n 'text/*': 'Texto',\n };\n if (generic[token]) {\n return generic[token];\n }\n if (token.startsWith('.')) {\n return token.slice(1).toUpperCase();\n }\n return (token.split('/')[1] ?? token).toUpperCase();\n}\n\n/** Tamaño en bytes como texto (`5 MB`, `120 KB`), base 1024. */\nexport function formatFileSize(bytes: number): string {\n if (bytes >= 1024 * 1024) {\n return `${Number((bytes / (1024 * 1024)).toFixed(1))} MB`;\n }\n if (bytes >= 1024) {\n return `${Math.round(bytes / 1024)} KB`;\n }\n return `${bytes} B`;\n}\n\n/**\n * Selector de archivo accesible, con la misma apariencia y contrato de campo\n * que `kf-input`: label arriba, ayuda y error debajo, `invalid`.\n *\n * El control real es un `<input type=\"file\">` nativo, visualmente oculto pero\n * enfocable: se llega con Tab, se abre con Enter o Espacio y el anillo de foco\n * se dibuja sobre el botón visible. Su nombre accesible es el `label` (o\n * `ariaLabel`); la ayuda, el archivo elegido y el error lo describen\n * (`aria-describedby`).\n *\n * **Ayuda antes de elegir.** `hint` es texto libre; si no se pasa, se arma sola\n * con los formatos de `accept` y el tamaño de `maxSize` (`PDF, JPG · máx. 5 MB`),\n * para que el usuario sepa qué sirve ANTES de abrir el selector.\n *\n * **Validación.** Cada archivo se revisa contra `accept` (extensiones `.pdf`,\n * tipos `image/png` o comodines `image/*`) y `maxSize` (bytes). Los válidos\n * quedan elegidos y se emiten en `fileChange` (siempre `File[]`, vacío al\n * quitar); los descartados se emiten uno a uno en `fileRejected` con su\n * motivo (`'type'` o `'size'`) y se muestran como error bajo el campo\n * (`rejectedTypeText` / `rejectedSizeText`); la ayuda sigue visible bajo ese\n * mensaje, para que se vea qué sí sirve. Un `error` del consumidor tiene\n * prioridad sobre ese mensaje y reemplaza a la ayuda, igual que `errorMessage`\n * sobre `hint` en `kf-input`. La validación del navegador no reemplaza la del servidor.\n *\n * **Archivo elegido.** Su nombre y tamaño aparecen UNA vez, con un botón para\n * quitarlo (`removeLabel`, con el nombre del archivo en su `aria-label`); el\n * nombre del `<input>` nativo queda oculto. Con `multiple` se listan todos y\n * cada uno se quita por separado. Elegir de nuevo reemplaza la selección.\n *\n * `dropzone` agrega arrastrar y soltar sobre el área; el botón y el teclado\n * siguen siendo la vía principal.\n *\n * Es un `ControlValueAccessor`: con `[(ngModel)]`/`formControl` el valor es\n * `File | null` (o `File[]` con `multiple`); `writeValue(null)` limpia.\n *\n * <kf-file-input label=\"Comprobante\" accept=\".pdf,.jpg,.png\" [maxSize]=\"5242880\"\n * (fileChange)=\"onFiles($event)\" (fileRejected)=\"onRejected($event)\" />\n * <kf-file-input label=\"Fotos\" accept=\"image/*\" multiple dropzone formControlName=\"photos\" />\n * <kf-file-input label=\"Contrato\" error=\"Adjunta el contrato firmado.\" formControlName=\"contract\" />\n */\n@Component({\n selector: 'kf-file-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FieldLabel, Icon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileInput),\n multi: true,\n },\n ],\n templateUrl: './FileInput.html',\n styleUrl: './FileInput.css',\n})\nexport class FileInput implements ControlValueAccessor {\n private readonly nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n\n readonly label = input<string>();\n readonly required = input(false, { transform: booleanAttribute });\n /** Texto de ayuda. Sin valor, se arma con `accept` y `maxSize`. */\n readonly hint = input<string>();\n /** Formatos admitidos, como el `accept` nativo: `.pdf,.jpg`, `image/png`, `image/*`. */\n readonly accept = input<string>();\n /** Tamaño máximo por archivo, en bytes. Sin valor, sin límite. */\n readonly maxSize = input<number | undefined>(undefined);\n readonly multiple = input(false, { transform: booleanAttribute });\n /** Agrega arrastrar y soltar sobre el área del control. */\n readonly dropzone = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Borde rojo y `aria-invalid`. Se activa solo con `error`; úsalo para marcar un error sin mensaje. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error del consumidor (`role=\"alert\"`); reemplaza a la ayuda y al motivo de rechazo, como `errorMessage` en `kf-input`. */\n readonly error = input<string>();\n /** Nombre accesible cuando no hay `label` visible. */\n readonly ariaLabel = input<string>();\n /** Texto del botón cuando no hay archivo elegido. */\n readonly buttonLabel = input('Elegir archivo');\n /** Texto del botón con `multiple` o cuando ya hay un archivo (cambiar). */\n readonly changeLabel = input('Cambiar archivo');\n /** Nombre accesible del botón de quitar; se le agrega el nombre del archivo. */\n readonly removeLabel = input('Quitar');\n /** Texto de arrastrar y soltar (solo con `dropzone`). */\n readonly dropzoneText = input('o arrástralo aquí');\n readonly rejectedTypeText = input('Formato no permitido.');\n readonly rejectedSizeText = input('El archivo supera el tamaño máximo.');\n\n /** Selección vigente (`File[]`, vacío al quitar todo). */\n readonly fileChange = output<File[]>();\n /** Un archivo descartado y su motivo. */\n readonly fileRejected = output<FileRejection>();\n\n protected readonly inputId = `kf-file-input-${nextId++}`;\n protected readonly hintId = `${this.inputId}-hint`;\n protected readonly errorId = `${this.inputId}-error`;\n protected readonly filesId = `${this.inputId}-files`;\n\n protected readonly files = signal<File[]>([]);\n protected readonly rejection = signal<FileRejectionReason | null>(null);\n protected readonly dragging = signal(false);\n private readonly disabledByForm = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n private onChange: (value: File | File[] | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n /** Mensaje visible: el del consumidor, o el motivo del último rechazo. */\n protected readonly message = computed(() => {\n const own = this.error();\n if (own) {\n return own;\n }\n const reason = this.rejection();\n if (reason === 'type') {\n return this.rejectedTypeText();\n }\n return reason === 'size' ? this.rejectedSizeText() : null;\n });\n\n /** Ayuda efectiva: la del consumidor o la armada con formatos y tamaño. */\n protected readonly effectiveHint = computed(() => {\n const own = this.hint();\n if (own) {\n return own;\n }\n const parts: string[] = [];\n const tokens = (this.accept() ?? '')\n .split(',')\n .map((token) => token.trim())\n .filter(Boolean);\n if (tokens.length) {\n parts.push([...new Set(tokens.map(describeAcceptToken))].join(', '));\n }\n const max = this.maxSize();\n if (max) {\n parts.push(`máx. ${formatFileSize(max)}`);\n }\n return parts.join(' · ');\n });\n\n protected readonly isInvalid = computed(() => this.invalid() || !!this.message());\n protected readonly describedBy = computed(() => {\n const ids: string[] = [];\n if (this.message()) {\n ids.push(this.errorId);\n }\n if (this.effectiveHint() && !this.error()) {\n ids.push(this.hintId);\n }\n if (this.files().length) {\n ids.push(this.filesId);\n }\n return ids.join(' ') || null;\n });\n\n protected readonly triggerText = computed(() =>\n this.files().length && !this.multiple() ? this.changeLabel() : this.buttonLabel(),\n );\n\n /** Enfoca el `<input>` nativo. */\n focus(options?: FocusOptions): void {\n this.nativeInput().nativeElement.focus(options);\n }\n\n writeValue(value: File | File[] | null): void {\n const list = Array.isArray(value) ? value : value ? [value] : [];\n this.files.set(list);\n this.rejection.set(null);\n }\n\n registerOnChange(fn: (value: File | File[] | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByForm.set(isDisabled);\n }\n\n protected onPick(event: Event): void {\n const native = event.target as HTMLInputElement;\n const picked = Array.from(native.files ?? []);\n // Se limpia el valor nativo: el nombre ya se muestra en la lista y así se\n // puede volver a elegir el mismo archivo después de quitarlo.\n native.value = '';\n this.receive(picked);\n }\n\n protected onDragOver(event: DragEvent): void {\n if (this.isDisabled()) {\n return;\n }\n event.preventDefault();\n this.dragging.set(true);\n }\n\n protected onDragLeave(): void {\n this.dragging.set(false);\n }\n\n protected onDrop(event: DragEvent): void {\n event.preventDefault();\n this.dragging.set(false);\n if (this.isDisabled()) {\n return;\n }\n this.receive(Array.from(event.dataTransfer?.files ?? []));\n }\n\n protected remove(index: number): void {\n const next = this.files().filter((_, i) => i !== index);\n this.rejection.set(null);\n this.commit(next);\n this.nativeInput().nativeElement.focus();\n }\n\n protected formatSize(file: File): string {\n return formatFileSize(file.size);\n }\n\n /** Valida lo recibido, emite los rechazos y reemplaza la selección si hay algo válido. */\n private receive(incoming: File[]): void {\n if (!incoming.length) {\n return;\n }\n const candidates = this.multiple() ? incoming : incoming.slice(0, 1);\n const accepted: File[] = [];\n let lastReason: FileRejectionReason | null = null;\n for (const file of candidates) {\n const reason = this.reject(file);\n if (reason) {\n lastReason = reason;\n this.fileRejected.emit({ file, reason });\n } else {\n accepted.push(file);\n }\n }\n this.rejection.set(lastReason);\n if (accepted.length) {\n this.commit(accepted);\n }\n this.onTouched();\n }\n\n private reject(file: File): FileRejectionReason | null {\n if (!this.matchesAccept(file)) {\n return 'type';\n }\n const max = this.maxSize();\n return max !== undefined && file.size > max ? 'size' : null;\n }\n\n private matchesAccept(file: File): boolean {\n const tokens = (this.accept() ?? '')\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter(Boolean);\n if (!tokens.length) {\n return true;\n }\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n return type === token;\n });\n }\n\n private commit(files: File[]): void {\n this.files.set(files);\n this.fileChange.emit(files);\n this.onChange(this.multiple() ? files : (files[0] ?? null));\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"inputId\" [required]=\"required()\">{{ label() }}</kf-field-label>\n}\n<div\n class=\"kf-file-input__area\"\n [class.kf-file-input__area--dropzone]=\"dropzone()\"\n [class.kf-file-input__area--dragging]=\"dragging()\"\n [class.kf-file-input__area--invalid]=\"isInvalid()\"\n [class.kf-file-input__area--disabled]=\"isDisabled()\"\n (dragover)=\"dropzone() ? onDragOver($event) : null\"\n (dragleave)=\"dropzone() ? onDragLeave() : null\"\n (drop)=\"dropzone() ? onDrop($event) : null\"\n>\n <input\n #nativeInput\n type=\"file\"\n class=\"kf-file-input__native\"\n [id]=\"inputId\"\n [attr.accept]=\"accept() || null\"\n [multiple]=\"multiple()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required() && !files().length\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"isInvalid() ? true : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n (change)=\"onPick($event)\"\n />\n <label class=\"kf-file-input__button\" [for]=\"inputId\" aria-hidden=\"true\">\n <kf-icon name=\"upload-cloud\" size=\"sm\" />\n {{ triggerText() }}\n </label>\n @if (dropzone()) {\n <span class=\"kf-file-input__drop-text\" aria-hidden=\"true\">{{ dropzoneText() }}</span>\n }\n</div>\n@if (files().length) {\n <ul class=\"kf-file-input__files\" [id]=\"filesId\">\n @for (file of files(); track $index) {\n <li class=\"kf-file-input__file\">\n <kf-icon class=\"kf-file-input__file-icon\" name=\"file\" size=\"sm\" />\n <span class=\"kf-file-input__file-name\">{{ file.name }}</span>\n <span class=\"kf-file-input__file-size\">{{ formatSize(file) }}</span>\n <button\n type=\"button\"\n class=\"kf-file-input__remove\"\n [attr.aria-label]=\"removeLabel() + ' ' + file.name\"\n [disabled]=\"isDisabled()\"\n (click)=\"remove($index)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n </li>\n }\n </ul>\n}\n@if (message(); as text) {\n <span class=\"kf-file-input__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ text }}</span>\n}\n@if (effectiveHint() && !error()) {\n <span class=\"kf-file-input__hint kf-field-hint\" [id]=\"hintId\">{{ effectiveHint() }}</span>\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { Icon, IconName } from '../icon/Icon';\n\n/** Valor de `min`/`max`/`step`: número, o texto cuando el tipo lo pide (una fecha `'2026-01-31'`, un mes, una hora). */\nexport type InputBound = string | number | null | undefined;\n\n/** Vacío o `undefined` no emiten el atributo; `0` sí es un límite válido. */\nfunction normalizeBound(value: InputBound): string | number | null {\n return value === undefined || value === '' ? null : value;\n}\n\n/** `maxlength` como entero positivo; cualquier otra cosa (vacío, NaN, 0, negativo) no se emite. */\nfunction toMaxLength(value: number | string | null | undefined): number | null {\n const parsed = typeof value === 'string' ? Number.parseInt(value, 10) : value;\n return typeof parsed === 'number' && Number.isInteger(parsed) && parsed > 0 ? parsed : null;\n}\n\n/**\n * Input de formulario apilado: label arriba (en mayúsculas vía CSS), campo con\n * fondo gris que pasa a blanco con anillo de foco azul al enfocar.\n *\n * Implementa ControlValueAccessor, así que funciona con [(ngModel)] y con\n * Reactive Forms (formControl / formControlName), no es solo un wrapper visual.\n *\n * <kf-input label=\"Placa\" icon=\"car\" placeholder=\"ABC-123\" hint=\"Formato: 3 letras + 3 números\" />\n * <input kf-input formControlName=\"email\" type=\"email\" />\n *\n * `invalid` + `errorMessage` cubren el estado de error: con `invalid` el\n * borde pasa a rojo (`--kf-color-error`) y se setea `aria-invalid=\"true\"` en\n * el `<input>` nativo; `errorMessage` reemplaza el `hint` neutro por un\n * mensaje en rojo con `role=\"alert\"`, para que un lector de pantalla lo\n * anuncie apenas aparece (a diferencia de `hint`, que es solo informativo y\n * nunca interrumpe). Si se pasan ambos, `errorMessage` tiene prioridad\n * visual sobre `hint` — no tiene sentido mostrar los dos a la vez.\n *\n * <kf-input label=\"Correo\" formControlName=\"email\"\n * [invalid]=\"email.invalid && email.touched\"\n * [errorMessage]=\"email.touched && email.hasError('required') ? 'Ingresa tu correo.' : undefined\" />\n *\n * `toggleable` solo tiene efecto cuando `type=\"password\"`: agrega un botón\n * de ojo al final del campo que alterna la visibilidad del valor tipeado\n * (cambia el `type` real del `<input>` nativo entre `password` y `text`,\n * nunca expone el valor en el DOM de otra forma). El botón es `type=\"button\"`\n * — nunca dispara submit del form contenedor — y anuncia su acción con\n * `aria-label` dinámico y `aria-pressed`, ya que es un toggle, no un botón\n * de una sola acción.\n *\n * <kf-input type=\"password\" label=\"Contraseña\" toggleable formControlName=\"password\" />\n *\n * `readonly` es distinto de `disabled`: un campo `disabled` no recibe foco\n * por teclado ni se puede seleccionar/copiar su texto (y se lee como\n * \"deshabilitado\" en un lector de pantalla); un campo `readonly` sí — el\n * valor se puede ver, enfocar y copiar, solo no se puede editar. Usar\n * `readonly` para mostrar un dato existente que el usuario puede querer\n * copiar (ej. un documento de identidad en un formulario de perfil), y\n * `disabled` para un campo genuinamente inactivo (ej. mientras un guardado\n * está en vuelo).\n *\n * <kf-input label=\"DNI\" readonly formControlName=\"documentId\" />\n *\n * Buscador sin label visible: `ariaLabel` da el nombre accesible del\n * `<input>` (el placeholder no lo reemplaza: desaparece al escribir) y\n * `clearable` agrega un botón \"×\" mientras haya texto. Borrar limpia el\n * valor, notifica al formulario (`ngModel`/`formControl`), dispara un\n * evento `input` nativo (para quien escucha `(input)`), emite `cleared` y\n * devuelve el foco al campo.\n *\n * <kf-input type=\"search\" icon=\"search\" ariaLabel=\"Buscar cotizaciones\"\n * placeholder=\"Buscar cotización\" clearable [(ngModel)]=\"query\" />\n *\n * `focus()` enfoca el `<input>` nativo, sin que el consumidor busque el\n * control interno con `querySelector`.\n *\n * `autocomplete`, `name` e `inputmode` se reenvían al `<input>` nativo (un\n * atributo en el host no llega adentro) para que el navegador y los gestores\n * de contraseñas identifiquen el campo; sin valor no se renderiza ningún\n * atributo. Funcionan igual con `type=\"password\"` y `toggleable`.\n *\n * <kf-input label=\"RUT\" autocomplete=\"username\" name=\"rut\" inputmode=\"text\" formControlName=\"rut\" />\n * <kf-input type=\"password\" label=\"Contraseña\" toggleable autocomplete=\"current-password\" name=\"password\" formControlName=\"password\" />\n *\n * `min`, `max`, `step` y `maxlength` se reenvían al `<input>` nativo (mismo\n * motivo: un atributo en el host no llega adentro) y sin valor no se\n * renderiza ningún atributo. `min`/`max`/`step` aceptan número o texto según\n * el `type` (`number`, `range`, `date`, `time`, `month`…): con `type=\"date\"` el\n * límite es una fecha ISO. `maxlength` es un entero positivo y aplica a los\n * tipos de texto (`text`, `search`, `email`, `tel`, `url`, `password`). El\n * navegador usa los límites para la validación nativa (`:invalid`,\n * `validity.rangeUnderflow`) y para el selector de fechas; no reemplazan la\n * validación del formulario ni el `errorMessage`.\n *\n * <kf-input type=\"date\" label=\"Fecha de entrega\" min=\"2026-01-01\" max=\"2026-12-31\" />\n * <kf-input type=\"number\" label=\"Cantidad\" [min]=\"1\" [max]=\"20\" [step]=\"1\" />\n * <kf-input label=\"Placa\" [maxlength]=\"7\" />\n */\n@Component({\n selector: 'kf-input',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, FieldLabel, Icon],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Input),\n multi: true,\n },\n ],\n templateUrl: './Input.html',\n styleUrl: './Input.css',\n})\nexport class Input implements ControlValueAccessor, AfterViewInit {\n private static nextId = 0;\n\n private readonly nativeInput = viewChild.required<ElementRef<HTMLInputElement>>('nativeInput');\n\n readonly label = input<string>();\n /** Oculta el `label` a la vista y lo deja como nombre accesible (`<label for>`), sin ocultarlo con CSS desde afuera. */\n readonly hideLabel = input(false, { transform: booleanAttribute });\n /** Marca el label con un asterisco visual y aplica `required` al `<input>`\n * nativo — el atributo HTML ya expone el estado obligatorio a lectores de\n * pantalla (mapeo implícito a `aria-required`), sin necesidad de un\n * `aria-required` explícito redundante. */\n readonly required = input(false, { transform: booleanAttribute });\n /** Ícono líder, renderizado vía `kf-icon`. */\n readonly icon = input<IconName>();\n readonly suffix = input<string>();\n readonly hint = input<string>();\n /** Borde y aria-invalid en rojo. Ver `errorMessage` para el mensaje asociado. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"` — reemplaza a `hint` mientras esté presente. */\n readonly errorMessage = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Ver JSDoc de la clase para la diferencia con `disabled`. No pasa por\n * Reactive Forms (a diferencia de `disabled`, que también puede llegar\n * vía `FormControl.disable()`) — es siempre una decisión explícita del\n * consumidor del componente. */\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly type = input<string>('text');\n readonly placeholder = input<string>('');\n /** Token de autocompletado HTML (`username`, `email`, `current-password`,\n * `new-password`, `off`, etc.) que se reenvía al `<input>` nativo para que\n * el navegador y los gestores de contraseñas identifiquen el propósito del\n * campo (WCAG 1.3.5 y 3.3.8). Sin valor, el atributo no se renderiza. */\n readonly autocomplete = input<string | null>();\n /** `name` del `<input>` nativo; los gestores de contraseñas y el envío\n * nativo de formularios lo usan para identificar el campo. Sin valor, el\n * atributo no se renderiza. */\n readonly name = input<string | null>();\n /** Sugiere el teclado virtual (`numeric`, `email`, `tel`, etc.) sin cambiar\n * el `type`. Sin valor, el atributo no se renderiza. */\n readonly inputmode = input<string | null>();\n /** Límite inferior del control (`min` nativo): número, o texto para fechas/horas (`'2026-01-01'`). */\n readonly min = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Límite superior del control (`max` nativo). Ver `min`. */\n readonly max = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Paso del control (`step` nativo): número o `'any'`. */\n readonly step = input<string | number | null, InputBound>(null, { transform: normalizeBound });\n /** Largo máximo del texto (`maxlength` nativo), entero positivo. Solo aplica a tipos de texto. */\n readonly maxlength = input<number | null, number | string | null | undefined>(null, {\n transform: toMaxLength,\n });\n /** Agrega el botón de mostrar/ocultar — sin efecto si `type` no es `\"password\"`. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n /** Nombre accesible del `<input>` cuando no hay `label` visible. Ignorado\n * si hay `label`: un `aria-label` pisaría al `<label for>` visible. */\n readonly ariaLabel = input<string>();\n /** Agrega un botón \"×\" para borrar el valor mientras haya texto (sin efecto con `disabled`/`readonly`). */\n readonly clearable = input(false, { transform: booleanAttribute });\n /** Nombre accesible del botón de borrar. */\n readonly clearLabel = input('Borrar texto');\n\n /** Emitido después de borrar el valor con el botón \"×\". */\n readonly cleared = output<void>();\n\n protected readonly inputId = `kf-input-${Input.nextId++}`;\n protected readonly hintId = `${this.inputId}-hint`;\n protected readonly errorId = `${this.inputId}-error`;\n\n protected readonly value = signal('');\n protected readonly focused = signal(false);\n /** Deshabilitado por Reactive Forms (formControl.disable()). */\n private readonly disabledByForm = signal(false);\n /** Disabled real: por input() directo o por el FormControl asociado. */\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n /** Estado interno del toggle — irrelevante si `showPasswordToggle()` es false. */\n protected readonly passwordVisible = signal(false);\n /** El botón solo tiene sentido si el campo realmente es de contraseña. */\n protected readonly showPasswordToggle = computed(\n () => this.toggleable() && this.type() === 'password',\n );\n /** El botón de borrar solo aparece con texto y con el campo editable. */\n protected readonly showClear = computed(\n () => this.clearable() && !!this.value() && !this.isDisabled() && !this.readonly(),\n );\n /**\n * `type` real que recibe el `<input>` nativo: igual a `type()` salvo\n * cuando el toggle está activo y visible, donde pasa a `text` para\n * mostrar el valor en claro sin cambiar `type()` en sí (evita que un\n * consumidor que lee `type()` desde afuera vea un valor inconsistente).\n */\n protected readonly effectiveType = computed(() =>\n this.showPasswordToggle() && this.passwordVisible() ? 'text' : this.type(),\n );\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n // El binding declarativo [value]=\"value()\" no siempre re-sincroniza la\n // propiedad DOM del <input> cuando el valor llega por writeValue() antes\n // de que la vista termine de inicializarse — se refuerza escribiendo la\n // propiedad DOM directamente para que el primer valor de un formulario\n // ya cargado (ngModel/formControl con valor inicial) se refleje siempre.\n this.nativeInput().nativeElement.value = this.value();\n }\n\n /** Enfoca el `<input>` nativo (mismas opciones que `HTMLElement.focus`). */\n focus(options?: FocusOptions): void {\n this.nativeInput().nativeElement.focus(options);\n }\n\n writeValue(value: string): void {\n const nextValue = value ?? '';\n this.value.set(nextValue);\n // Mismo motivo que en ngAfterViewInit: escritura directa a la propiedad\n // DOM además del binding declarativo, para que cambios de valor\n // posteriores (ej. patchValue de un FormControl) siempre lleguen al\n // input nativo sin depender del timing de detección de cambios.\n const el = this.nativeInput?.();\n if (el) {\n el.nativeElement.value = nextValue;\n }\n }\n\n registerOnChange(fn: (value: 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 protected onInput(rawValue: string): void {\n this.value.set(rawValue);\n this.onChange(rawValue);\n }\n\n protected onBlur(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n /**\n * Borra el valor reutilizando el mismo camino que el tipeo: un evento\n * `input` nativo pasa por `onInput` (notifica al formulario) y además\n * llega a cualquier `(input)` del consumidor. Con el mouse no hay blur:\n * el `mousedown` del botón hace `preventDefault` (ver Input.html), así el\n * campo no se marca `touched` por usar su propio \"×\".\n */\n protected onClear(): void {\n const native = this.nativeInput().nativeElement;\n native.value = '';\n native.dispatchEvent(new Event('input', { bubbles: true }));\n native.focus();\n this.cleared.emit();\n }\n\n /**\n * Alterna la visibilidad del valor. No dispara `onBlur`/pierde el foco:\n * el botón vive dentro del mismo `.kf-input__field`, así que un click acá\n * no debe tratarse como si el usuario hubiese abandonado el campo.\n */\n protected onTogglePasswordVisibility(): void {\n this.passwordVisible.update((visible) => !visible);\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"inputId\" [required]=\"required()\" [visuallyHidden]=\"hideLabel()\">{{\n label()\n }}</kf-field-label>\n}\n<div\n class=\"kf-input__field\"\n [class.kf-input__field--disabled]=\"isDisabled()\"\n [class.kf-input__field--readonly]=\"readonly()\"\n [class.kf-input__field--focused]=\"focused()\"\n [class.kf-input__field--invalid]=\"invalid()\"\n>\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-input__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <input\n #nativeInput\n [id]=\"inputId\"\n class=\"kf-input__control\"\n [type]=\"effectiveType()\"\n [placeholder]=\"placeholder()\"\n [attr.autocomplete]=\"autocomplete() || null\"\n [attr.name]=\"name() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"step()\"\n [attr.maxlength]=\"maxlength()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [attr.readonly]=\"readonly() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : hint() ? hintId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n [value]=\"value()\"\n (input)=\"onInput(nativeInput.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\n />\n @if (showClear()) {\n <button\n type=\"button\"\n class=\"kf-input__clear\"\n [attr.aria-label]=\"clearLabel()\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onClear()\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n @if (showPasswordToggle()) {\n <button\n type=\"button\"\n class=\"kf-input__toggle\"\n [attr.aria-label]=\"passwordVisible() ? 'Ocultar contraseña' : 'Mostrar contraseña'\"\n [attr.aria-pressed]=\"passwordVisible()\"\n (click)=\"onTogglePasswordVisibility()\"\n >\n <kf-icon [name]=\"passwordVisible() ? 'eye-off' : 'eye'\" size=\"sm\" />\n </button>\n } @else if (suffix()) {\n <span class=\"kf-input__suffix\">{{ suffix() }}</span>\n }\n</div>\n@if (errorMessage(); as message) {\n <span class=\"kf-input__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n} @else if (hint()) {\n <span class=\"kf-input__hint kf-field-hint\" [id]=\"hintId\">{{ hint() }}</span>\n}\n","import { Overlay } from '@angular/cdk/overlay';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { normalizeForSearch } from '@kaufmann-lab/ui/shared';\nimport { FieldLabel } from '../field-label/FieldLabel';\nimport { listenEscapeCapture } from '../shared/escape-capture';\nimport { SelectOverlay } from '../shared/select-overlay';\n\nexport interface MultiSelectOption {\n value: string;\n label: string;\n}\n\nlet nextId = 0;\n\n/**\n * Dropdown de selección múltiple con checkboxes internos. El panel flotante\n * se conecta al trigger vía `@angular/cdk/overlay` — el mismo mecanismo que\n * `Select` (ver `../select/Select.ts`) y `Dropdown` (`../dropdown/Dropdown.ts`).\n *\n * A diferencia de `Select`, el disparador no muestra un único valor sino los\n * nombres seleccionados junto a un badge circular con el conteo, y cada\n * opción del panel se marca/desmarca con un checkbox sin cerrar el panel.\n * Incluye una opción \"Todas\" al inicio de la lista, con estado\n * `indeterminate` cuando hay selección parcial — el mismo patrón de\n * \"seleccionar todos\" de `Checkbox`. \"Todas\" nunca se filtra por el buscador:\n * queda siempre visible y sigue actuando sobre el universo COMPLETO de\n * `options()`, no sobre el subconjunto filtrado (ver JSDoc de `toggleAll()`).\n *\n * <kf-multi-select\n * label=\"Sucursales\"\n * [options]=\"branches\"\n * [values]=\"selectedBranches()\"\n * (valuesChange)=\"selectedBranches.set($event)\"\n * />\n *\n * `width=\"full\"` ocupa el 100% del contenedor — para multi-selects dentro\n * de layouts flex/grid donde el ancho fijo de `md` no encaja.\n *\n * <kf-multi-select width=\"full\" [options]=\"branches\" [values]=\"selectedBranches()\" (valuesChange)=\"...\" />\n */\n@Component({\n selector: 'kf-multi-select',\n imports: [FieldLabel],\n templateUrl: './MultiSelect.html',\n styleUrl: './MultiSelect.css',\n host: {\n '[class.kf-multi-select--width-sm]': \"width() === 'sm'\",\n '[class.kf-multi-select--width-lg]': \"width() === 'lg'\",\n '[class.kf-multi-select--width-full]': \"width() === 'full'\",\n },\n})\nexport class MultiSelect {\n readonly label = input<string>();\n readonly options = input<MultiSelectOption[]>([]);\n readonly values = input<string[]>([]);\n readonly placeholder = input<string>('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Ancho del control. 'md' (240px) es el default histórico y preserva el\n * comportamiento actual sin cambios para consumidores existentes.\n * 'full' ocupa el 100% del contenedor — para multi-selects dentro de\n * layouts flex/grid donde el ancho fijo no encaja (ej. un footer de\n * sidebar).\n */\n readonly width = input<'sm' | 'md' | 'lg' | 'full'>('md');\n /**\n * Tri-state: si el consumidor no lo especifica (`undefined`), el buscador\n * se activa solo cuando `options().length` supera `searchThreshold()`. Si\n * el consumidor define `true`/`false` explícitamente, ese valor manda por\n * sobre el umbral automático. Mismo criterio que `Select`.\n */\n readonly searchable = input<boolean | undefined>(undefined);\n readonly searchThreshold = input<number>(7);\n\n readonly valuesChange = output<string[]>();\n\n private readonly instanceId = `kf-multi-select-${nextId++}`;\n readonly triggerId = `${this.instanceId}-trigger`;\n readonly listboxId = `${this.instanceId}-listbox`;\n\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeIndex = signal(0);\n\n readonly selectedCount = computed(() => this.values().length);\n\n readonly allSelected = computed(\n () => this.options().length > 0 && this.values().length === this.options().length,\n );\n\n readonly isPartiallySelected = computed(() => this.values().length > 0 && !this.allSelected());\n\n readonly showSearch = computed(\n () => this.searchable() ?? this.options().length > this.searchThreshold(),\n );\n\n /** Opciones visibles tras aplicar el filtro de búsqueda (\"Todas\" nunca se filtra). */\n readonly filteredOptions = computed<MultiSelectOption[]>(() => {\n const query = normalizeForSearch(this.searchQuery().trim());\n if (!query) {\n return this.options();\n }\n return this.options().filter((option) => normalizeForSearch(option.label).includes(query));\n });\n\n /**\n * Texto del disparador: placeholder si no hay selección, o los nombres\n * seleccionados unidos por coma (el conteo va aparte, en el badge). Con\n * muchas opciones el `text-overflow: ellipsis` del `.kf-multi-select__value`\n * corta el texto — el badge de conteo siempre queda visible al lado.\n */\n readonly summaryText = computed(() => {\n const count = this.selectedCount();\n if (count === 0) {\n return this.placeholder();\n }\n const selectedLabels = this.values()\n .map((value) => this.options().find((option) => option.value === value)?.label)\n .filter((label): label is string => Boolean(label));\n return selectedLabels.join(', ');\n });\n\n private readonly triggerRef = viewChild.required<ElementRef<HTMLButtonElement>>('trigger');\n private readonly panelTemplate = viewChild.required<TemplateRef<unknown>>('panelTemplate');\n private readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n private readonly overlay = new SelectOverlay(inject(Overlay), inject(ViewContainerRef), () =>\n this.triggerRef(),\n );\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.overlay.attach(this.panelTemplate(), () => this.isOpen.set(false));\n } else {\n this.overlay.detach();\n this.searchQuery.set('');\n this.activeIndex.set(0);\n }\n });\n\n // Autofocus del buscador al abrir — mismo patrón que Select. afterNextRender()\n // no puede invocarse dentro de un effect() (NG0203); afterRenderEffect() sí\n // es reactivo a signals y corre tras la actualización del DOM del panel.\n afterRenderEffect(() => {\n if (this.isOpen() && this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n }\n });\n\n const stopEscape = listenEscapeCapture(inject(DOCUMENT), () => this.onEscape());\n inject(DestroyRef).onDestroy(() => {\n stopEscape();\n this.overlay.dispose();\n });\n }\n\n isSelected(value: string): boolean {\n return this.values().includes(value);\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n this.isOpen.update((open) => !open);\n }\n\n toggleOption(value: string): void {\n const current = this.values();\n const next = current.includes(value)\n ? current.filter((selectedValue) => selectedValue !== value)\n : [...current, value];\n this.valuesChange.emit(next);\n }\n\n /**\n * Alterna entre \"todas seleccionadas\" y \"ninguna seleccionada\". Actúa\n * siempre sobre el universo COMPLETO de `options()`, no sobre\n * `filteredOptions()` — con un buscador activo, \"Todas\" no se filtra ni\n * cambia de significado: seguir marcando/desmarcando únicamente lo visible\n * sería sorprendente para quien ya tenía otras opciones (no visibles en el\n * filtro actual) seleccionadas de antes.\n */\n toggleAll(): void {\n this.valuesChange.emit(this.allSelected() ? [] : this.options().map((option) => option.value));\n }\n\n onSearchInput(event: Event): void {\n this.searchQuery.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n /** Mueve `activeIndex` sobre las opciones YA FILTRADAS visibles. Clamp simple, sin wraparound. */\n moveActive(delta: number): void {\n const count = this.filteredOptions().length;\n if (count === 0) {\n return;\n }\n this.activeIndex.update((current) => Math.min(Math.max(current + delta, 0), count - 1));\n }\n\n toggleActive(): void {\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.toggleOption(option.value);\n }\n }\n\n /**\n * Escape con el panel abierto, en fase de captura sobre `document` (ver\n * `listenEscapeCapture`): consume la tecla solo si había un panel que\n * cerrar, así un `kf-drawer`/`kf-modal` contenedor no se cierra con el\n * mismo Escape. Devuelve si cerró algo.\n */\n onEscape(): boolean {\n if (!this.isOpen()) {\n return false;\n }\n this.isOpen.set(false);\n return true;\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"triggerId\">{{ label() }}</kf-field-label>\n}\n<button\n #trigger\n type=\"button\"\n [id]=\"triggerId\"\n class=\"kf-multi-select__trigger\"\n [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? listboxId : null\"\n (click)=\"toggle()\"\n>\n <span\n class=\"kf-multi-select__value\"\n [class.kf-multi-select__value--placeholder]=\"selectedCount() === 0\"\n >\n {{ summaryText() }}\n </span>\n @if (selectedCount() > 0) {\n <span class=\"kf-multi-select__count\">{{ selectedCount() }}</span>\n }\n <span\n class=\"kf-multi-select__caret kf-caret\"\n [class.kf-multi-select__caret--open]=\"isOpen()\"\n [class.kf-caret--open]=\"isOpen()\"\n aria-hidden=\"true\"\n ></span>\n</button>\n<ng-template #panelTemplate>\n <div class=\"kf-multi-select__panel\">\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-multi-select__search\"\n placeholder=\"Buscar…\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n (keydown.enter)=\"$event.preventDefault(); toggleActive()\"\n />\n }\n <ul\n class=\"kf-multi-select__list\"\n [id]=\"listboxId\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-labelledby]=\"triggerId\"\n >\n @if (options().length > 0) {\n <li\n class=\"kf-multi-select__option\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"allSelected()\"\n (click)=\"toggleAll()\"\n (keydown.enter)=\"toggleAll()\"\n (keydown.space)=\"$event.preventDefault(); toggleAll()\"\n >\n <span\n class=\"kf-multi-select__checkbox kf-checkbox-box\"\n [class.kf-multi-select__checkbox--checked]=\"allSelected()\"\n [class.kf-multi-select__checkbox--indeterminate]=\"isPartiallySelected()\"\n ></span>\n <span class=\"kf-multi-select__option-label\">Todas</span>\n </li>\n }\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-multi-select__option\"\n [class.kf-multi-select__option--selected]=\"isSelected(option.value)\"\n [class.kf-multi-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isSelected(option.value)\"\n (click)=\"toggleOption(option.value)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown.enter)=\"toggleOption(option.value)\"\n (keydown.space)=\"$event.preventDefault(); toggleOption(option.value)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n >\n <span\n class=\"kf-multi-select__checkbox kf-checkbox-box\"\n [class.kf-multi-select__checkbox--checked]=\"isSelected(option.value)\"\n ></span>\n <span class=\"kf-multi-select__option-label\">{{ option.label }}</span>\n </li>\n } @empty {\n @if (options().length > 0) {\n <li class=\"kf-multi-select__empty\">Sin resultados</li>\n } @else {\n <li class=\"kf-multi-select__empty\">Sin opciones disponibles</li>\n }\n }\n </ul>\n </div>\n</ng-template>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Collapsible } from '../collapsible/Collapsible';\nimport { Divider } from '../divider/Divider';\nimport type { IconName } from '../icon/icon-name';\nimport { Input } from '../input/Input';\nimport { MultiSelect, type MultiSelectOption } from '../multi-select/MultiSelect';\nimport { Select } from '../select/Select';\n\nexport type FilterFieldType = 'select' | 'multi-select' | 'search';\n\nexport interface FilterFieldConfig {\n key: string;\n type: FilterFieldType;\n label?: string;\n placeholder?: string;\n width?: string;\n icon?: IconName;\n showDivider?: boolean;\n}\n\nconst DEFAULT_FIELD_WIDTH = '240px';\n\nexport type FilterValue = string | string[];\n\nexport interface FilterFieldChange {\n key: string;\n value: FilterValue;\n}\n\n/**\n * Fila de filtros config-driven (select / multi-select / búsqueda) para el\n * header de una tabla, compuesta con piezas YA existentes de la librería\n * (`kf-select`, `kf-multi-select`, `kf-input`, `kf-divider`, `kf-collapsible`).\n *\n * No tiene lógica de filtrado propia: solo renderiza los controles descritos\n * por `fields()` y emite `fieldChange` cuando alguno cambia — filtrar filas\n * sigue siendo responsabilidad de quien lo consume.\n *\n * En escritorio los campos se muestran en una fila; en mobile/tablet\n * (≤768px, mismo breakpoint que `kf-portal-header`) se colapsan dentro de un\n * `kf-collapsible`.\n *\n * <kf-filter\n * [fields]=\"[\n * { key: 'model', type: 'multi-select', label: 'Modelo', placeholder: 'Todos los modelos', showDivider: true },\n * { key: 'search', type: 'search', label: 'Buscar vehículo', placeholder: 'Ingresa N° de orden o placa', width: '280px' },\n * ]\"\n * [values]=\"{ model: selectedModels(), search: searchTerm() }\"\n * [options]=\"{ model: modelOptions() }\"\n * (fieldChange)=\"onFieldChange($event)\"\n * />\n */\n@Component({\n selector: 'kf-filter',\n imports: [Collapsible, Divider, FormsModule, Input, MultiSelect, NgTemplateOutlet, Select],\n templateUrl: './Filter.html',\n styleUrl: './Filter.scss',\n})\nexport class Filter {\n readonly fields = input.required<FilterFieldConfig[]>();\n readonly values = input<Record<string, FilterValue>>({});\n readonly options = input<Record<string, string[]>>({});\n readonly mobileTitle = input('Filtros');\n\n readonly fieldChange = output<FilterFieldChange>();\n\n protected readonly multiOptionsByKey = computed<Record<string, MultiSelectOption[]>>(() => {\n const options = this.options();\n return Object.fromEntries(\n Object.keys(options).map((key) => [\n key,\n options[key].map((value) => ({ value, label: value })),\n ]),\n );\n });\n\n protected singleValueFor(key: string): string {\n const value = this.values()[key];\n return typeof value === 'string' ? value : '';\n }\n\n protected multiValueFor(key: string): string[] {\n const value = this.values()[key];\n return Array.isArray(value) ? value : [];\n }\n\n protected fieldWidth(field: FilterFieldConfig): string {\n return field.width ?? DEFAULT_FIELD_WIDTH;\n }\n\n protected optionsFor(key: string): string[] {\n return this.options()[key] ?? [];\n }\n\n protected multiOptionsFor(key: string): MultiSelectOption[] {\n return this.multiOptionsByKey()[key] ?? [];\n }\n\n protected onFieldChange(key: string, value: FilterValue): void {\n this.fieldChange.emit({ key, value });\n }\n}\n","<ng-template #fieldsTpl let-stacked=\"stacked\">\n @for (field of fields(); track field.key) {\n @switch (field.type) {\n @case ('select') {\n <kf-select\n [label]=\"field.label ?? ''\"\n [options]=\"optionsFor(field.key)\"\n [value]=\"singleValueFor(field.key)\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n (valueChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n @case ('multi-select') {\n <kf-multi-select\n [label]=\"field.label ?? ''\"\n [options]=\"multiOptionsFor(field.key)\"\n [values]=\"multiValueFor(field.key)\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n (valuesChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n @case ('search') {\n <kf-input\n [label]=\"field.label ?? ''\"\n [icon]=\"field.icon ?? 'search'\"\n [placeholder]=\"field.placeholder ?? ''\"\n [style.width]=\"stacked ? '100%' : fieldWidth(field)\"\n [ngModel]=\"singleValueFor(field.key)\"\n (ngModelChange)=\"onFieldChange(field.key, $event)\"\n />\n }\n }\n @if (!stacked && field.showDivider) {\n <kf-divider orientation=\"vertical\" />\n }\n }\n</ng-template>\n\n<div class=\"kf-filter kf-filter--row\">\n <ng-container [ngTemplateOutlet]=\"fieldsTpl\" [ngTemplateOutletContext]=\"{ stacked: false }\" />\n</div>\n\n<kf-collapsible class=\"kf-filter__collapsible\" [title]=\"mobileTitle()\">\n <div class=\"kf-filter kf-filter--stack\">\n <ng-container [ngTemplateOutlet]=\"fieldsTpl\" [ngTemplateOutletContext]=\"{ stacked: true }\" />\n </div>\n</kf-collapsible>\n","import { booleanAttribute, Component, computed, input, output } from '@angular/core';\n\n/**\n * Opción en forma de objeto. `count` es opcional: cuando está presente se\n * muestra a la derecha del label (ej. \"Pendientes 3\"), con cifras tabulares\n * para que el ancho del chip no salte al cambiar el número.\n */\nexport interface FilterChipOption {\n value: string;\n label: string;\n count?: number;\n}\n\n/**\n * Fila de chips tipo \"pill\" para filtros de una sola selección.\n *\n * Cada opción puede pasarse como string simple (se usa como value y label\n * a la vez) o como objeto `{ value, label, count? }` cuando el texto\n * mostrado difiere del valor interno o cuando cada chip lleva un contador.\n *\n * El chip activo se resalta con `--kf-color-primary` — mismo color de marca\n * que `kf-tabs`/`kf-select` para su propio estado activo, así el filtro\n * seleccionado se lee con el color del tema activo, no un negro fijo que\n * no cambia entre marcas.\n *\n * Densidad: el padding horizontal de cada chip sale de\n * `--kf-filter-chips-padding-inline` (default `--kf-space-md`). Un\n * contenedor puede reducirlo sin tocar este componente — `kf-list-toolbar`\n * lo baja a 12px en su modo compacto.\n *\n * <kf-filter-chips [options]=\"['Todos', 'Activos', 'Archivados']\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n *\n * `layout=\"scroll\"` deja todos los chips en UNA línea con desplazamiento\n * horizontal (para mobile: los filtros no ocupan más alto que una fila); el\n * default `wrap` los reparte en varias líneas. `deselectable` permite\n * quitar el filtro volviendo a tocar el chip activo (emite `''`), para el\n * caso \"ningún chip = sin filtro\".\n *\n * <kf-filter-chips ariaLabel=\"Filtrar por estado\"\n * [options]=\"[{ value: '', label: 'Todas', count: 12 }]\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n */\n@Component({\n selector: 'kf-filter-chips',\n templateUrl: './FilterChips.html',\n styleUrl: './FilterChips.css',\n})\nexport class FilterChips {\n readonly options = input.required<(string | FilterChipOption)[]>();\n readonly value = input<string>('');\n /** Nombre accesible del grupo (ej. \"Filtrar por estado\"). Sin él, el grupo se anuncia sin nombre. */\n readonly ariaLabel = input<string>();\n /** `wrap` (default): varias líneas. `scroll`: una sola línea con desplazamiento horizontal. */\n readonly layout = input<'wrap' | 'scroll'>('wrap');\n /** Tocar el chip activo lo desactiva y emite `''`. Default `false` (comportamiento histórico). */\n readonly deselectable = input(false, { transform: booleanAttribute });\n\n readonly valueChange = output<string>();\n\n /** Normaliza cada opción string/objeto a la forma `{ value, label, count? }`. */\n readonly normalizedOptions = computed<FilterChipOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n select(value: string): void {\n if (value === this.value()) {\n if (this.deselectable() && value !== '') {\n this.valueChange.emit('');\n }\n return;\n }\n this.valueChange.emit(value);\n }\n}\n","<div\n class=\"kf-filter-chips\"\n [class.kf-filter-chips--scroll]=\"layout() === 'scroll'\"\n role=\"group\"\n [attr.aria-label]=\"ariaLabel() || null\"\n>\n @for (option of normalizedOptions(); track option.value) {\n <button\n type=\"button\"\n class=\"kf-filter-chips__chip\"\n [class.kf-filter-chips__chip--active]=\"option.value === value()\"\n [attr.aria-pressed]=\"option.value === value()\"\n (click)=\"select(option.value)\"\n >\n {{ option.label }}\n @if (option.count !== undefined) {\n <span class=\"kf-filter-chips__count\">{{ option.count }}</span>\n }\n </button>\n }\n</div>\n","import { Component, input } from '@angular/core';\n\n/** Un link del pie — legales, contacto, soporte. */\nexport interface FooterLink {\n label: string;\n href?: string;\n}\n\n/**\n * Pie de página general del portal (página 38): logo + copyright a la\n * izquierda, links legales/soporte empujados a la derecha. Logo y copyright\n * son inputs (cada portal del ecosistema — LATAM, OTD, Star — trae su\n * propia marca y texto legal); `links` es la lista de accesos, típicamente\n * placeholders hasta que existan destinos reales.\n *\n * <kf-footer\n * logoSrc=\"images/logo-kaufmann-dark.png\"\n * logoAlt=\"Grupo Kaufmann\"\n * copyright=\"© 2026 Kaufmann LATAM · Todos los derechos reservados\"\n * [links]=\"[\n * { label: 'Políticas de privacidad' },\n * { label: 'Contacto' },\n * { label: 'Sugerencias y reclamos' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-footer',\n templateUrl: './Footer.html',\n styleUrl: './Footer.css',\n})\nexport class Footer {\n readonly logoSrc = input<string>();\n readonly logoAlt = input('');\n readonly copyright = input.required<string>();\n readonly links = input<FooterLink[]>([]);\n}\n","<div class=\"kf-footer__wrap\">\n @if (logoSrc()) {\n <img class=\"kf-footer__logo\" [src]=\"logoSrc()\" [alt]=\"logoAlt()\" />\n }\n <span class=\"kf-footer__copyright\">{{ copyright() }}</span>\n @if (links().length) {\n <nav class=\"kf-footer__links\">\n @for (link of links(); track link.label) {\n <a [href]=\"link.href || '#'\">{{ link.label }}</a>\n }\n </nav>\n }\n</div>\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\ntype ResolvedJourneyStep = JourneyStep & {\n status: JourneyStepStatus;\n progressValue: number | null;\n};\n\n/** Ancho por defecto desde el cual `orientation=\"auto\"` elige horizontal. */\nconst AUTO_BREAKPOINT_PX = 820;\n\nexport type JourneyStepStatus = 'done' | 'current' | 'delayed' | 'pending';\n\nexport type JourneyStepperSurface = 'dark' | 'card';\n\n/**\n * Paleta de color de los estados, independiente de `orientation`:\n *\n * - `'brand'` (default): azul de marca para completado/actual, sin\n * semántica de semáforo. Para cuando horizontal y vertical representan\n * el mismo journey en distintos tamaños de pantalla.\n * - `'semantic'`: verde/amarillo/rojo real por paso (solo con\n * `orientation=\"vertical\"`, la única con 4 estados incluido `delayed`).\n * Para cuando cada paso comunica su propio estado puntual.\n */\nexport type JourneyStepperColorScheme = 'brand' | 'semantic';\n\n/** `'auto'` elige horizontal o vertical según el ancho del propio componente. */\nexport type JourneyStepperOrientation = 'horizontal' | 'vertical' | 'auto';\n\nexport interface JourneyStep {\n key: string;\n label: string;\n icon: IconName;\n /**\n * Estado explícito del paso. Si AL MENOS un paso lo define, todos los\n * estados salen de acá (un paso sin `status` queda `pending`), también en\n * horizontal y permitiendo varios pasos `current` o estados no\n * consecutivos. Si ningún paso lo define, horizontal lo deriva de\n * `currentStep`. Con `orientation=\"vertical\"` siempre se usa el explícito.\n */\n status?: JourneyStepStatus;\n /** Texto bajo el label, junto al label en horizontal sin `caption` (compatibilidad). */\n date?: string;\n /**\n * Texto secundario del paso, distinto de `date` (ej. «16 de 18 completaron»).\n * Se muestra bajo el label en ambas orientaciones.\n */\n caption?: string;\n /**\n * Avance 0-100 del paso, como barra fina bajo el texto. Se acota a [0, 100];\n * un valor no finito no dibuja la barra. Si el paso tiene `caption`, la\n * barra es decorativa (`aria-hidden`) y el `caption` debe comunicar el avance;\n * sin `caption` expone `role=\"progressbar\"` con el `label` como nombre.\n */\n progress?: number;\n /**\n * Texto visible del estado (ej. «Completado», «En curso», «Pendiente»), para\n * que el estado no dependa solo del color y la forma del punto.\n */\n statusLabel?: string;\n}\n\n/**\n * Progreso de un flujo de N pasos.\n *\n * - `orientation` (`'horizontal'` default | `'vertical'` | `'auto'`): horizontal\n * deriva done/current/pending de `currentStep` (salvo que algún paso defina\n * `status`); vertical usa `steps[].status` explícito, con `delayed` como\n * cuarto estado. `'auto'` es horizontal cuando el propio componente mide al\n * menos `autoBreakpoint` px (820 por defecto) y vertical si no; en vertical,\n * con `caption`/`progress`/`statusLabel` y desde 520 px de ancho, el texto de\n * cada paso pasa a filas «etiqueta | estado y conteo | barra». En `'auto'`\n * los puntos son clickeables solo mientras el layout es horizontal.\n * - `surface` (`'dark'` default | `'card'`): fondo sólido oscuro de marca,\n * o superficie clara con borde+sombra.\n * - `colorScheme` (`'brand'` default | `'semantic'`): ver `JourneyStepperColorScheme`.\n * - `ariaLabel`: nombre de la lista de pasos (lectores de pantalla).\n *\n * Los pasos se exponen como lista (`role=\"list\"`/`listitem`) y el paso con\n * `status === 'current'` lleva `aria-current=\"step\"`.\n *\n * <kf-journey-stepper surface=\"card\" [steps]=\"steps\" [currentStep]=\"4\" (stepClick)=\"onNavigate($event)\" />\n * <kf-journey-stepper orientation=\"vertical\" [steps]=\"unitSteps\" />\n * <kf-journey-stepper orientation=\"vertical\" colorScheme=\"semantic\" [steps]=\"unitStepsWithDelays\" />\n * <kf-journey-stepper orientation=\"auto\" surface=\"card\" ariaLabel=\"Avance por etapa\" [steps]=\"stages\" />\n */\n@Component({\n selector: 'kf-journey-stepper',\n imports: [Icon],\n templateUrl: './JourneyStepper.html',\n styleUrl: './JourneyStepper.css',\n})\nexport class JourneyStepper {\n readonly steps = input.required<JourneyStep[]>();\n readonly orientation = input<JourneyStepperOrientation>('horizontal');\n /** Ancho mínimo (px) del componente para ser horizontal con `orientation=\"auto\"`. */\n readonly autoBreakpoint = input<number>(AUTO_BREAKPOINT_PX);\n /** Nombre accesible de la lista de pasos. */\n readonly ariaLabel = input<string>();\n readonly surface = input<JourneyStepperSurface>('dark');\n readonly colorScheme = input<JourneyStepperColorScheme>('brand');\n\n /** Índice del paso actual — solo con `orientation=\"horizontal\"`. */\n readonly currentStep = input<number>(0);\n\n /** Se emite con `step.key` al clickear un paso — solo activo con `orientation=\"horizontal\"`. */\n readonly stepClick = output<string>();\n\n private readonly track = viewChild.required<ElementRef<HTMLElement>>('track');\n private readonly destroyRef = inject(DestroyRef);\n\n /** `true` cuando el contenido desborda el ancho visible — controla el fade de los bordes. */\n protected readonly hasOverflow = signal(false);\n\n /** Ancho medido del componente; `null` hasta la primera medición. */\n private readonly trackWidth = signal<number | null>(null);\n\n /**\n * Orientación efectiva: la de `orientation`, o —con `'auto'`— horizontal si el\n * componente mide al menos `autoBreakpoint` px. Antes de medir (o con ancho\n * 0) es vertical, que siempre cabe.\n */\n protected readonly effectiveOrientation = computed<'horizontal' | 'vertical'>(() => {\n const orientation = this.orientation();\n if (orientation !== 'auto') {\n return orientation;\n }\n const width = this.trackWidth();\n return width !== null && width >= this.autoBreakpoint() ? 'horizontal' : 'vertical';\n });\n\n protected readonly vertical = computed(() => this.effectiveOrientation() === 'vertical');\n protected readonly clickable = computed(() => this.effectiveOrientation() === 'horizontal');\n\n /** `true` si algún paso usa `caption`, `progress` o `statusLabel` (layout enriquecido). */\n protected readonly rich = computed(() =>\n this.steps().some(\n (step) =>\n !!step.caption || !!step.statusLabel || JourneyStepper.progressOf(step.progress) !== null,\n ),\n );\n\n constructor() {\n afterRenderEffect(() => {\n this.steps();\n this.effectiveOrientation();\n this.measureOverflow();\n });\n\n afterNextRender(() => {\n const observer = new ResizeObserver(() => this.measureOverflow());\n observer.observe(this.track().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n private measureOverflow(): void {\n const el = this.track().nativeElement;\n this.hasOverflow.set(el.scrollWidth > el.clientWidth);\n this.trackWidth.set(el.clientWidth);\n }\n\n /** Progreso acotado a [0, 100]; `null` si no hay valor finito. */\n private static progressOf(value: number | undefined): number | null {\n return value === undefined || !Number.isFinite(value)\n ? null\n : Math.min(100, Math.max(0, value));\n }\n\n protected readonly resolvedSteps = computed<ResolvedJourneyStep[]>(() => {\n const steps = this.steps();\n const explicit = this.orientation() === 'vertical' || steps.some((step) => step.status);\n const current = this.currentStep();\n\n return steps.map((step, index) => ({\n ...step,\n status: explicit\n ? (step.status ?? 'pending')\n : index < current\n ? 'done'\n : index === current\n ? 'current'\n : 'pending',\n progressValue: JourneyStepper.progressOf(step.progress),\n }));\n });\n\n protected dotIcon(status: JourneyStepStatus, stepIcon: IconName): IconName {\n if (status === 'done') {\n return 'check';\n }\n if (status === 'delayed') {\n return 'alert-circle';\n }\n return stepIcon;\n }\n}\n","<div\n #track\n class=\"kf-journey-stepper\"\n role=\"list\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [class.kf-journey-stepper--vertical]=\"vertical()\"\n [class.kf-journey-stepper--auto]=\"orientation() === 'auto'\"\n [class.kf-journey-stepper--rich]=\"rich()\"\n [class.kf-journey-stepper--card]=\"surface() === 'card'\"\n [class.kf-journey-stepper--semantic]=\"colorScheme() === 'semantic'\"\n [class.kf-journey-stepper--overflowing]=\"hasOverflow()\"\n>\n @for (step of resolvedSteps(); track step.key; let last = $last) {\n <div\n class=\"kf-journey-stepper__step\"\n role=\"listitem\"\n [class]=\"'kf-journey-stepper__step--' + step.status\"\n [attr.aria-current]=\"step.status === 'current' ? 'step' : null\"\n >\n @if (clickable()) {\n <button\n type=\"button\"\n class=\"kf-journey-stepper__dot\"\n [attr.aria-label]=\"step.label\"\n (click)=\"stepClick.emit(step.key)\"\n >\n <kf-icon [name]=\"dotIcon(step.status, step.icon)\" size=\"sm\" />\n </button>\n } @else {\n <span class=\"kf-journey-stepper__dot\">\n <kf-icon [name]=\"dotIcon(step.status, step.icon)\" size=\"sm\" />\n </span>\n }\n\n <div class=\"kf-journey-stepper__text\">\n <span class=\"kf-journey-stepper__label\">{{ step.label }}</span>\n @if (step.date) {\n <span class=\"kf-journey-stepper__date\">{{ step.date }}</span>\n }\n @if (step.statusLabel || step.caption) {\n <span class=\"kf-journey-stepper__meta\">\n @if (step.statusLabel) {\n <span class=\"kf-journey-stepper__status\">{{ step.statusLabel }}</span>\n }\n @if (step.statusLabel && step.caption) {\n <span class=\"kf-journey-stepper__sep\" aria-hidden=\"true\">·</span>\n }\n @if (step.caption) {\n <span class=\"kf-journey-stepper__caption\">{{ step.caption }}</span>\n }\n </span>\n }\n @if (step.progressValue !== null) {\n @if (step.caption) {\n <span class=\"kf-journey-stepper__progress\" aria-hidden=\"true\">\n <span [style.width.%]=\"step.progressValue\"></span>\n </span>\n } @else {\n <span\n class=\"kf-journey-stepper__progress\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-valuenow]=\"step.progressValue\"\n [attr.aria-label]=\"step.label\"\n >\n <span [style.width.%]=\"step.progressValue\"></span>\n </span>\n }\n }\n </div>\n </div>\n\n @if (!last && !vertical()) {\n <span\n class=\"kf-journey-stepper__line\"\n aria-hidden=\"true\"\n [class.kf-journey-stepper__line--done]=\"step.status === 'done'\"\n ></span>\n }\n }\n</div>\n","/**\n * Modo de `kf-list-toolbar` según el ancho REAL disponible:\n * - `full`: todo en una fila con la densidad normal.\n * - `compact`: todo en una fila, con los chips más angostos (`data-density=\"compact\"`).\n * - `panel`: solo el buscador y un botón \"Filtros\"; filtros y acciones finales se ocultan.\n */\nexport type ListToolbarMode = 'full' | 'compact' | 'panel';\n\n/** Anchos medidos (px): disponible en la barra y requerido por cada densidad. */\nexport interface ListToolbarWidths {\n available: number;\n full: number;\n compact: number;\n}\n\n/**\n * Margen de histéresis (px) para SUBIR de modo. Bajar es inmediato (si no\n * cabe, no cabe); subir exige este margen extra, así un ancho que oscila\n * justo en el umbral (scrollbar que aparece y desaparece, un contador que\n * pasa de 9 a 10) no hace parpadear la barra entre dos modos.\n */\nexport const LIST_TOOLBAR_HYSTERESIS = 24;\n\n/**\n * Decide el modo a partir del modo actual y los anchos medidos. Función pura\n * para poder probar la histéresis sin layout real.\n */\nexport function resolveListToolbarMode(\n widths: ListToolbarWidths,\n current: ListToolbarMode,\n hysteresis = LIST_TOOLBAR_HYSTERESIS,\n): ListToolbarMode {\n const { available, full, compact } = widths;\n const fullThreshold = current === 'full' ? full : full + hysteresis;\n if (available >= fullThreshold) {\n return 'full';\n }\n const compactThreshold = current === 'panel' ? compact + hysteresis : compact;\n if (available >= compactThreshold) {\n return 'compact';\n }\n return 'panel';\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { Badge } from '../badge/Badge';\nimport { Button } from '../button/button';\nimport { ListToolbarMode, resolveListToolbarMode } from './list-toolbar-mode';\n\nexport type { ListToolbarMode } from './list-toolbar-mode';\nexport { resolveListToolbarMode, LIST_TOOLBAR_HYSTERESIS } from './list-toolbar-mode';\n\n/** Selector de elementos que pueden recibir foco por teclado dentro de un slot. */\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Barra de herramientas de un listado: buscador, filtros y acciones finales\n * (orden, cambio de vista) en UNA fila, que se adapta al ancho REAL que\n * tiene disponible — no al del viewport. El mismo listado puede renderizarse\n * con el menú lateral abierto o cerrado, dentro de un panel o a pantalla\n * completa, y una `@media` no distingue esos casos; la barra mide su propio\n * ancho con `ResizeObserver`.\n *\n * ## Cuándo usarla y cuándo `kf-filter`\n * - `kf-list-toolbar`: chips con contador (`kf-filter-chips`) + orden + cambio\n * de vista + panel de filtros en modo estrecho, fija al hacer scroll y\n * guiada por el ancho del contenedor.\n * - `kf-filter`: selects, multi-select y buscador de texto en una fila de\n * formulario, que se pliega en un `kf-collapsible` a ≤768px de viewport.\n * Si el listado se filtra con campos, usar `kf-filter`; no se combinan ni\n * se reimplementan entre sí.\n *\n * ## Slots\n * - `[kf-toolbar-search]`: el buscador (ej. `kf-input icon=\"search\"`). Siempre visible; ocupa el espacio libre.\n * - `[kf-toolbar-filters]`: filtros rápidos (ej. `kf-filter-chips`).\n * - `[kf-toolbar-end]`: acciones al final de la fila (ej. `kf-select` de orden, `kf-view-toggle`).\n *\n * Cada slot acepta VARIOS elementos con el mismo atributo y los ubica en\n * fila con `gap`; marcar cada control (no un `<div>` envoltorio sin\n * `display: flex`, que apilaría sus hijos en bloque).\n *\n * La barra ocupa el ancho de su contenedor (`display: block`). Dentro de un\n * contenedor flex que ajusta su ancho al contenido, darle un ancho\n * explícito: si el contenedor mide lo que la barra pide, la barra mide lo\n * que el contenedor le da y el modo nunca puede subir de `panel`.\n * - default: contenido no visual que debe quedar SIEMPRE presente, como una\n * región `aria-live` con el conteo de resultados (nunca dentro de un slot\n * que se oculta).\n *\n * ## Modos (`mode`, `modeChange`, atributo `data-mode`)\n * - `full`: todo cabe en una fila.\n * - `compact`: cabe en una fila solo con chips más angostos. El host expone\n * `data-density=\"compact\"` y redefine `--kf-filter-chips-padding-inline`\n * (12px), que `kf-filter-chips` adopta sin configuración extra.\n * - `panel`: no cabe. Se ocultan `filters` y `end` y aparece, junto al\n * buscador, un botón \"Filtros\" (`filtersLabel`) con un badge de\n * `activeCount` (filtros/orden distintos del valor por defecto) que emite\n * `filtersClick` — el consumidor abre su propio panel (típicamente\n * `kf-drawer role=\"dialog\"` con `kf-option-list`).\n *\n * Contrato con el panel de filtros: el consumidor DEBE pasar\n * `[filtersExpanded]` con el estado de su panel y DEBE cerrarlo al recibir\n * un `modeChange` distinto de `'panel'`. Al salir de `panel` con el panel\n * abierto, la barra mueve el foco al primer filtro visible (el botón\n * \"Filtros\" ya no existe para recibirlo); si el panel modal siguiera\n * abierto, ese foco quedaría fuera del diálogo.\n *\n * El modo sale de comparar el ancho disponible con el ancho natural de los\n * slots en cada densidad (más `searchMinWidth` para el buscador), con\n * histéresis al subir de modo (`LIST_TOOLBAR_HYSTERESIS`) para que no\n * parpadee en el umbral. Los slots ocultos en modo `panel` se siguen\n * midiendo (quedan fuera de vista con `visibility: hidden`, sin foco ni\n * árbol de accesibilidad), así un contador que crece se refleja igual.\n *\n * ## Fija (`sticky`)\n * Con `sticky`, la barra queda pegada arriba al hacer scroll (`stickyTop`\n * compensa una cabecera fija del shell). Cuando efectivamente queda pegada,\n * el host recibe la clase `kf-list-toolbar--stuck`: sombra más marcada y\n * menos alto. \"Pegada\" = el contenedor con scroll (el ancestro más cercano\n * con `overflow-y: auto|scroll`, o la ventana) ya se desplazó Y la barra\n * está en su posición fija. Sin centinela: un centinela por encima de la\n * barra quedaría recortado cuando la barra es el primer elemento del\n * contenedor, y la marcaría pegada en reposo. El fondo alrededor de\n * la barra fija sale de `--kf-list-toolbar-backdrop` (default\n * `--kf-color-surface`, el fondo habitual del área de contenido).\n *\n * Foco tapado (WCAG 2.4.11): una barra fija puede quedar encima del control\n * que recibe el foco al tabular hacia arriba. El consumidor debe aplicar\n * `scroll-padding-top` = `stickyTop` + alto de la barra al contenedor que\n * hace scroll (o a `html` si es la ventana), así el navegador deja ese\n * margen al llevar un elemento enfocado a la vista. El alto vigente se\n * publica como señal `height` (px), output `heightChange` y variable CSS\n * `--kf-list-toolbar-height` en el host (esta última solo la heredan los\n * descendientes; un ancestro debe usar la señal):\n *\n * <main class=\"content\" [style.scroll-padding-top.px]=\"56 + toolbar.height()\">\n * <kf-list-toolbar #toolbar sticky [stickyTop]=\"56\" ... />\n * </main>\n *\n * <kf-list-toolbar sticky ariaLabel=\"Filtrar cotizaciones\" [activeCount]=\"activeFilters()\"\n * (filtersClick)=\"filtersOpen.set(true)\" (modeChange)=\"mode.set($event)\">\n * <span class=\"sr-only\" aria-live=\"polite\">{{ resultsLabel() }}</span>\n * <kf-input kf-toolbar-search icon=\"search\" ... />\n * <kf-filter-chips kf-toolbar-filters ... />\n * <kf-select kf-toolbar-end variant=\"compact\" icon=\"sort\" ariaLabel=\"Ordenar por\" ... />\n * <kf-view-toggle kf-toolbar-end ... />\n * </kf-list-toolbar>\n */\n@Component({\n selector: 'kf-list-toolbar',\n imports: [Badge, Button],\n templateUrl: './ListToolbar.html',\n styleUrl: './ListToolbar.css',\n host: {\n '[attr.data-mode]': 'mode()',\n '[attr.data-density]': \"mode() === 'full' ? 'full' : 'compact'\",\n '[class.kf-list-toolbar--sticky]': 'sticky()',\n '[class.kf-list-toolbar--stuck]': 'sticky() && stuck()',\n '[style.--kf-list-toolbar-top]': 'stickyTopCss()',\n '[style.--kf-list-toolbar-search-min]': \"searchMinWidth() + 'px'\",\n '[style.--kf-list-toolbar-height]': \"height() + 'px'\",\n },\n})\nexport class ListToolbar {\n /** Nombre accesible del landmark de búsqueda (`role=\"search\"`). */\n readonly ariaLabel = input('Filtrar resultados');\n /** Fija la barra arriba al hacer scroll. */\n readonly sticky = input(false, { transform: booleanAttribute });\n /** Offset superior de la barra fija: número (px) o longitud CSS (ej. `'var(--shell-header-height)'`). */\n readonly stickyTop = input<number | string>(0);\n /** Ancho mínimo útil del buscador (px) — entra en el cálculo de si todo cabe en una fila. */\n readonly searchMinWidth = input(200);\n /** Texto del botón del modo `panel`. */\n readonly filtersLabel = input('Filtros');\n /** Cantidad de filtros/orden distintos del valor por defecto; se muestra como badge en el botón del modo `panel`. */\n readonly activeCount = input(0);\n /**\n * `aria-expanded` del botón del modo `panel`: el estado del panel que abre\n * el consumidor. Además, si es `true` al salir de `panel`, el foco pasa al\n * primer filtro visible — por eso el consumidor DEBE cerrar su panel en\n * ese mismo `modeChange` (ver \"Contrato con el panel de filtros\").\n */\n readonly filtersExpanded = input<boolean>();\n\n readonly filtersClick = output<void>();\n /**\n * Nuevo modo. Al recibir un valor distinto de `'panel'`, el consumidor\n * DEBE cerrar su panel de filtros (ver \"Contrato con el panel de filtros\").\n */\n readonly modeChange = output<ListToolbarMode>();\n /** Alto del host (px) cada vez que cambia — ver \"Foco tapado\" en el JSDoc de la clase. */\n readonly heightChange = output<number>();\n\n private readonly modeState = signal<ListToolbarMode>('full');\n /** Modo vigente (también disponible como `data-mode` en el host). */\n readonly mode = this.modeState.asReadonly();\n\n private readonly stuckState = signal(false);\n /** `true` mientras la barra fija está efectivamente pegada arriba. */\n readonly stuck = this.stuckState.asReadonly();\n\n private readonly heightState = signal(0);\n /** Alto vigente del host en px (barra + padding de la variante fija). */\n readonly height = this.heightState.asReadonly();\n\n protected readonly stickyTopCss = computed(() => {\n const top = this.stickyTop();\n return typeof top === 'number' ? `${top}px` : top;\n });\n\n protected readonly filtersAriaLabel = computed(() => {\n const count = this.activeCount();\n if (count <= 0) {\n return undefined;\n }\n return `${this.filtersLabel()}, ${count} ${count === 1 ? 'activo' : 'activos'}`;\n });\n\n private readonly hostRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly barRef = viewChild.required<ElementRef<HTMLElement>>('bar');\n private readonly filtersRef = viewChild.required<ElementRef<HTMLElement>>('filters');\n private readonly endRef = viewChild.required<ElementRef<HTMLElement>>('end');\n private readonly filtersButtonRef = viewChild<string, ElementRef<HTMLElement>>('filtersButton', {\n read: ElementRef,\n });\n\n /** A dónde mover el foco tras un cambio de modo que desmonta/oculta el elemento enfocado. */\n private pendingFocus: 'filters-button' | 'slots' | null = null;\n /** `requestAnimationFrame` pendiente de `measure()` (coalesce de notificaciones). */\n private measureFrame: number | null = null;\n private stuckFrame: number | null = null;\n private removeScrollListener: (() => void) | null = null;\n\n constructor() {\n afterNextRender(() => {\n // Primera medición síncrona: sin parpadeo del modo inicial.\n this.measure();\n this.observeSize();\n });\n\n // `stuck` solo se calcula con `sticky`; se (des)engancha si cambia en runtime.\n afterRenderEffect(() => {\n const sticky = this.sticky();\n untracked(() => this.watchScroll(sticky));\n });\n\n // Conserva el foco cuando el cambio de modo oculta lo que lo tenía.\n afterRenderEffect(() => {\n this.mode();\n untracked(() => this.restorePendingFocus());\n });\n\n this.destroyRef.onDestroy(() => {\n this.removeScrollListener?.();\n if (this.measureFrame !== null) {\n cancelFrame(this.measureFrame);\n }\n if (this.stuckFrame !== null) {\n cancelFrame(this.stuckFrame);\n }\n });\n }\n\n protected onFiltersClick(): void {\n this.filtersClick.emit();\n }\n\n /**\n * Mide el ancho disponible y el natural de cada slot en ambas\n * densidades, y actualiza el modo. La densidad de medición se fuerza con\n * `data-measure` (que gana sobre `data-density` en el CSS) y se retira en\n * el mismo frame: el navegador nunca pinta ese estado intermedio.\n */\n private measure(): void {\n const host = this.hostRef.nativeElement;\n this.updateHeight(host);\n const bar = this.barRef().nativeElement;\n const style = getComputedStyle(bar);\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n const available = bar.clientWidth - padding;\n if (available <= 0) {\n return;\n }\n const gap = parseFloat(style.columnGap) || 0;\n\n const required = (density: 'full' | 'compact'): number => {\n host.setAttribute('data-measure', density);\n const slots = [this.filtersRef(), this.endRef()].map(\n (ref) => ref.nativeElement.getBoundingClientRect().width,\n );\n return slots.reduce(\n (total, width) => (width > 0 ? total + gap + width : total),\n this.searchMinWidth(),\n );\n };\n const full = required('full');\n const compact = required('compact');\n host.removeAttribute('data-measure');\n\n this.applyMode(resolveListToolbarMode({ available, full, compact }, this.modeState()));\n }\n\n private updateHeight(host: HTMLElement): void {\n const height = Math.round(host.getBoundingClientRect().height);\n if (height !== this.heightState()) {\n this.heightState.set(height);\n this.heightChange.emit(height);\n }\n }\n\n private applyMode(next: ListToolbarMode): void {\n const current = this.modeState();\n if (next === current) {\n return;\n }\n const active = this.document.activeElement;\n if (next === 'panel' && this.slotsContain(active)) {\n this.pendingFocus = 'filters-button';\n } else if (\n current === 'panel' &&\n // El botón \"Filtros\" se desmonta al salir de `panel`. Si tenía el foco,\n // o si el panel que abrió sigue abierto (el drawer devolvería el foco\n // a ese botón ya desmontado y caería en <body>), el foco pasa al\n // primer filtro visible.\n ((active && this.filtersButtonRef()?.nativeElement.contains(active)) ||\n this.filtersExpanded() === true)\n ) {\n this.pendingFocus = 'slots';\n }\n this.modeState.set(next);\n this.modeChange.emit(next);\n }\n\n private slotsContain(element: Element | null): boolean {\n return (\n !!element &&\n (this.filtersRef().nativeElement.contains(element) ||\n this.endRef().nativeElement.contains(element))\n );\n }\n\n private restorePendingFocus(): void {\n const target = this.pendingFocus;\n this.pendingFocus = null;\n if (target === 'filters-button') {\n this.filtersButtonRef()?.nativeElement.querySelector<HTMLElement>('button')?.focus();\n } else if (target === 'slots') {\n const first =\n this.filtersRef().nativeElement.querySelector<HTMLElement>(FOCUSABLE) ??\n this.endRef().nativeElement.querySelector<HTMLElement>(FOCUSABLE);\n first?.focus();\n }\n }\n\n private observeSize(): void {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n // Varias notificaciones en el mismo frame (barra, slots, host durante la\n // transición de padding de `stuck`) se resuelven en UNA medición por\n // frame: `heightChange` no se emite en cada paso intermedio.\n const observer = new ResizeObserver(() => this.scheduleMeasure());\n // El host también: su alto cambia con `sticky` (padding) sin que cambie la barra.\n observer.observe(this.hostRef.nativeElement);\n observer.observe(this.barRef().nativeElement);\n observer.observe(this.filtersRef().nativeElement);\n observer.observe(this.endRef().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n private scheduleMeasure(): void {\n if (this.measureFrame !== null) {\n return;\n }\n this.measureFrame = requestFrame(() => {\n this.measureFrame = null;\n this.measure();\n });\n }\n\n /** Engancha (o suelta) el cálculo de `stuck` al scroll del contenedor. */\n private watchScroll(sticky: boolean): void {\n this.removeScrollListener?.();\n this.removeScrollListener = null;\n if (!sticky) {\n this.stuckState.set(false);\n return;\n }\n const container = scrollParent(this.hostRef.nativeElement);\n const target: HTMLElement | Window = container ?? this.document.defaultView ?? window;\n const onScroll = () => {\n if (this.stuckFrame === null) {\n this.stuckFrame = requestFrame(() => {\n this.stuckFrame = null;\n this.updateStuck(container);\n });\n }\n };\n target.addEventListener('scroll', onScroll, { passive: true });\n this.removeScrollListener = () => target.removeEventListener('scroll', onScroll);\n this.updateStuck(container);\n }\n\n /**\n * Pegada = el contenedor ya se desplazó Y la barra está en su posición\n * fija (`top` resuelto, con medio píxel de tolerancia por subpíxeles).\n * Sin la primera condición, una barra que es el primer elemento del\n * contenedor se leería pegada en reposo.\n */\n private updateStuck(container: HTMLElement | null): void {\n const host = this.hostRef.nativeElement;\n const view = this.document.defaultView;\n const scrolled = container ? container.scrollTop > 0 : (view?.scrollY ?? 0) > 0;\n const containerTop = container\n ? container.getBoundingClientRect().top + container.clientTop\n : 0;\n const stickyTop = parseFloat(getComputedStyle(host).top) || 0;\n const offset = host.getBoundingClientRect().top - containerTop;\n this.stuckState.set(scrolled && offset <= stickyTop + 0.5);\n }\n}\n\n/** Ancestro más cercano que hace scroll vertical, o `null` si es la ventana. */\nfunction scrollParent(element: HTMLElement): HTMLElement | null {\n let parent = element.parentElement;\n while (parent && parent !== element.ownerDocument.documentElement) {\n const overflowY = getComputedStyle(parent).overflowY;\n if (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') {\n return parent;\n }\n parent = parent.parentElement;\n }\n return null;\n}\n\n/** `requestAnimationFrame` con respaldo para entornos sin él (SSR, algunos runners de test). */\nfunction requestFrame(callback: () => void): number {\n return typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame(callback)\n : (setTimeout(callback, 16) as unknown as number);\n}\n\nfunction cancelFrame(handle: number): void {\n if (typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(handle);\n } else {\n clearTimeout(handle);\n }\n}\n","<div #bar class=\"kf-list-toolbar__bar\" role=\"search\" [attr.aria-label]=\"ariaLabel()\">\n <ng-content />\n <div class=\"kf-list-toolbar__search\"><ng-content select=\"[kf-toolbar-search]\" /></div>\n @if (mode() === 'panel') {\n <kf-button\n #filtersButton\n class=\"kf-list-toolbar__filters-button\"\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n icon=\"filter\"\n ariaHaspopup=\"dialog\"\n [ariaExpanded]=\"filtersExpanded()\"\n [ariaLabel]=\"filtersAriaLabel()\"\n (click)=\"onFiltersClick()\"\n >\n {{ filtersLabel() }}\n @if (activeCount() > 0) {\n <kf-badge class=\"kf-list-toolbar__filters-count\" aria-hidden=\"true\">{{\n activeCount()\n }}</kf-badge>\n }\n </kf-button>\n }\n <!-- `display: contents` en full/compact (los slots son ítems de la fila);\n en panel, caja de 0x0 que recorta: los slots se siguen midiendo sin\n ensanchar la página ni ser alcanzables. -->\n <div class=\"kf-list-toolbar__collapsible\">\n <div #filters class=\"kf-list-toolbar__filters kf-list-toolbar__slot\">\n <ng-content select=\"[kf-toolbar-filters]\" />\n </div>\n <div #end class=\"kf-list-toolbar__end kf-list-toolbar__slot\">\n <ng-content select=\"[kf-toolbar-end]\" />\n </div>\n </div>\n</div>\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Card de estadística/KPI: label, valor grande, ícono opcional en la esquina\n * superior derecha, badge de esquina opcional (pegado al valor) y una nota\n * al pie. Pensada para tableros de resumen (ej. \"11 Tickets abiertos\").\n *\n * Compone sobre `kf-card` en vez de duplicar su estilo de contenedor — así\n * el look de \"card\" (radio, sombra, borde) tiene una única fuente de verdad\n * en toda la librería, tal como pide el design system (página 14: \"Card...\n * es la base de paneles, tarjetas de métrica, tablas...\").\n *\n * Slot `[actions]` opcional (proyectado al pie, después de `foot`) para un\n * CTA dentro de la card — ej. \"Saldo Pendiente\" con botón \"Pagar Ahora\" en\n * Fase 6 de OTD. Mismo mecanismo de proyección por selector que `[footer]`\n * en `kf-modal`, no un `<ng-content>` default: así una card sin acciones no\n * paga ningún espacio extra.\n *\n * <kf-metric-card label=\"Tickets abiertos\" value=\"11\" icon=\"ticket\" foot=\"+2 hoy\" />\n * <kf-metric-card label=\"Tasa de resolución\" value=\"94%\" badge=\"+2%\" value-color=\"var(--kf-color-success)\" />\n * <kf-metric-card label=\"Saldo Pendiente\" value=\"$45,000\">\n * <kf-button actions variant=\"primary\" size=\"sm\">Pagar Ahora</kf-button>\n * </kf-metric-card>\n *\n * `loading` (default `false`): dibuja el esqueleto de la card — etiqueta,\n * ícono, valor y `foot` como bloques del alto real de cada línea — dentro del\n * mismo `kf-card`, y reserva (sin mostrar) el espacio de las acciones, así que\n * al llegar los datos no hay salto de layout. Pasa los mismos inputs que\n * usarás cargada. Marca el host con `aria-busy=\"true\"`.\n *\n * <kf-metric-card label=\"Tickets abiertos\" value=\"11\" foot=\"+2 hoy\" [loading]=\"isLoading()\" />\n */\n@Component({\n selector: 'kf-metric-card',\n imports: [Card, Icon, Text],\n templateUrl: './MetricCard.html',\n styleUrl: './MetricCard.css',\n host: {\n '[attr.aria-busy]': \"loading() ? 'true' : null\",\n },\n})\nexport class MetricCard {\n readonly label = input.required<string>();\n readonly value = input.required<string | number>();\n readonly unit = input<string>();\n /** Ícono en la esquina superior derecha, renderizado vía `kf-icon`. */\n readonly icon = input<IconName>();\n readonly foot = input<string>();\n /** Tinte opcional para el valor grande (ej. un color semántico de estado). */\n readonly valueColor = input<string>();\n /** Badge de esquina opcional, pegado al valor (ej. \"+2%\"). */\n readonly badge = input<string>();\n /** Dibuja el esqueleto en lugar del contenido, conservando las dimensiones. */\n readonly loading = input(false, { transform: booleanAttribute });\n}\n","<kf-card>\n <div class=\"kf-metric-card__head\">\n @if (loading()) {\n <span\n class=\"kf-metric-card__label-bone kf-bone\"\n style=\"--kf-bone-width: 45%\"\n aria-hidden=\"true\"\n >\n <kf-text as=\"span\" variant=\"overline-strong\">{{ label() }}</kf-text>\n </span>\n @if (icon()) {\n <span class=\"kf-metric-card__icon kf-bone-fill\" aria-hidden=\"true\"></span>\n }\n } @else {\n <kf-text as=\"span\" variant=\"overline-strong\">{{ label() }}</kf-text>\n @if (icon(); as iconName) {\n <span class=\"kf-metric-card__icon\">\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n </span>\n }\n }\n </div>\n <div class=\"kf-metric-card__value-row\">\n @if (loading()) {\n <div class=\"kf-metric-card__value kf-bone\" style=\"--kf-bone-width: 50%\" aria-hidden=\"true\">\n {{ value() }}\n </div>\n } @else {\n <div class=\"kf-metric-card__value\" [style.color]=\"valueColor()\">\n {{ value() }}\n @if (unit()) {\n <span class=\"kf-metric-card__unit\">{{ unit() }}</span>\n }\n </div>\n @if (badge()) {\n <span class=\"kf-metric-card__badge\">\n <kf-text as=\"span\" variant=\"overline-strong\" tone=\"ok\">{{ badge() }}</kf-text>\n </span>\n }\n }\n </div>\n @if (foot()) {\n @if (loading()) {\n <div class=\"kf-metric-card__foot kf-bone\" style=\"--kf-bone-width: 60%\" aria-hidden=\"true\">\n {{ foot() }}\n </div>\n } @else {\n <div class=\"kf-metric-card__foot\">{{ foot() }}</div>\n }\n }\n <div class=\"kf-metric-card__actions\" [class.kf-metric-card__actions--loading]=\"loading()\">\n <ng-content select=\"[actions]\" />\n </div>\n</kf-card>\n","/** Estado de avance de una etapa o hito; nunca se comunica solo con color. */\nexport type ProgressStatus = 'done' | 'current' | 'pending';\n\nexport const PROGRESS_STATUS = {\n DONE: 'done',\n CURRENT: 'current',\n PENDING: 'pending',\n} as const satisfies Record<string, ProgressStatus>;\n\n/**\n * Texto por defecto (español) de cada estado: el estado nunca se comunica solo\n * con color. Los componentes que lo muestran aceptan sus propios textos.\n */\nexport const PROGRESS_STATUS_LABEL = {\n [PROGRESS_STATUS.DONE]: 'Completado',\n [PROGRESS_STATUS.CURRENT]: 'En curso',\n [PROGRESS_STATUS.PENDING]: 'Pendiente',\n} as const satisfies Record<ProgressStatus, string>;\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { ProgressStatus } from './ProgressStatus';\n\n/**\n * Marca pequeña de estado para leyendas y listas de hitos: círculo relleno\n * con check (completado), anillo con punto (en curso) o anillo vacío\n * (pendiente). La forma comunica el estado y el color solo lo refuerza.\n * `exception` la pinta con borde discontinuo y tono de aviso.\n *\n * Es decorativa por defecto (`aria-hidden`): el texto del estado va en el\n * contexto que la usa. Para usarla suelta (ej. una leyenda sin texto al lado),\n * `label` la expone como imagen con ese nombre.\n *\n * <kf-status-mark status=\"done\" small />\n * <kf-status-mark status=\"current\" label=\"En curso\" />\n *\n * Tamaño: variables CSS `--kf-status-mark-size` y `--kf-status-mark-size-sm`.\n */\n@Component({\n selector: 'kf-status-mark',\n template: `<span\n class=\"kf-status-mark\"\n [class]=\"'kf-status-mark--' + status()\"\n [class.kf-status-mark--exception]=\"exception()\"\n [attr.role]=\"label() ? 'img' : null\"\n [attr.aria-label]=\"label() || null\"\n [attr.aria-hidden]=\"label() ? null : 'true'\"\n ></span>`,\n styleUrl: './StatusMark.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.kf-status-mark-host--sm]': 'small()' },\n})\nexport class StatusMark {\n readonly status = input.required<ProgressStatus>();\n /** Versión reducida, para listas de hitos. */\n readonly small = input(false);\n /** Hito de excepción: borde discontinuo y tono de aviso. */\n readonly exception = input(false);\n /** Nombre accesible; sin él la marca es decorativa. */\n readonly label = input<string | null>(null);\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\nimport type { ProgressStatus } from './ProgressStatus';\n\n/**\n * Nodo circular de una etapa: ícono de la etapa más una insignia de estado.\n * La forma comunica el estado (relleno con check, anillo con punto, anillo\n * vacío) y el color solo lo refuerza.\n *\n * Es decorativo por defecto (`aria-hidden`): el texto del estado debe estar en\n * el contexto que lo usa. Para usarlo suelto, `label` lo expone como imagen\n * con ese nombre.\n *\n * <kf-status-node status=\"current\" icon=\"truck\" />\n * <kf-status-node status=\"done\" icon=\"check\" size=\"sm\" label=\"Entrega completada\" />\n *\n * Tamaño: variables CSS `--kf-status-node-size` y `--kf-status-node-size-sm`.\n */\n@Component({\n selector: 'kf-status-node',\n imports: [Icon],\n template: `\n <span\n class=\"kf-status-node\"\n [class]=\"'kf-status-node--' + status()\"\n [attr.role]=\"label() ? 'img' : null\"\n [attr.aria-label]=\"label() || null\"\n [attr.aria-hidden]=\"label() ? null : 'true'\"\n >\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n <span class=\"kf-status-node__badge\"></span>\n </span>\n `,\n styleUrl: './StatusNode.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { '[class.kf-status-node-host--sm]': \"size() === 'sm'\" },\n})\nexport class StatusNode {\n readonly status = input.required<ProgressStatus>();\n readonly icon = input.required<IconName>();\n readonly size = input<'md' | 'sm'>('md');\n /** Nombre accesible; sin él el nodo es decorativo. */\n readonly label = input<string | null>(null);\n}\n","import type { IconName } from '../icon/Icon';\nimport {\n PROGRESS_STATUS,\n PROGRESS_STATUS_LABEL,\n type ProgressStatus,\n} from '../status-indicators/ProgressStatus';\n\n/**\n * Hito de una etapa. `date` llega ya formateada; `exception` excluye el hito\n * del avance (se muestra en un bloque aparte y solo si ocurrió).\n */\nexport interface MilestoneItem {\n id: string;\n label: string;\n done: boolean;\n date?: string;\n exception?: boolean;\n}\n\n/**\n * Etapa expandible de la línea de tiempo. `date` llega ya formateada y solo\n * aplica si la etapa está completada. Una etapa sin `items` no es expandible.\n */\nexport interface MilestoneGroup {\n id: string;\n label: string;\n status: ProgressStatus;\n icon: IconName;\n date?: string;\n items: readonly MilestoneItem[];\n}\n\n/** Textos de `kf-milestone-timeline`; todos tienen valor por defecto en español. */\nexport interface MilestoneTimelineLabels {\n heading: string;\n expandAll: string;\n collapseAll: string;\n statusDone: string;\n statusPending: string;\n /** Texto de una etapa en curso; recibe los hitos completados y el total que cuenta en el avance. */\n currentMeta: (done: number, total: number) => string;\n /** Insignia del hito destacado como el siguiente a completar. */\n next: string;\n exceptionsTitle: string;\n noExceptions: string;\n /** Texto solo para lectores de pantalla tras un hito completado. */\n itemDone: string;\n /** Texto solo para lectores de pantalla tras un hito pendiente. */\n itemPending: string;\n}\n\nexport const DEFAULT_MILESTONE_TIMELINE_LABELS: MilestoneTimelineLabels = {\n heading: 'Avance por etapa',\n expandAll: 'Expandir todo',\n collapseAll: 'Contraer todo',\n statusDone: PROGRESS_STATUS_LABEL[PROGRESS_STATUS.DONE],\n statusPending: PROGRESS_STATUS_LABEL[PROGRESS_STATUS.PENDING],\n currentMeta: (done, total) =>\n `${PROGRESS_STATUS_LABEL[PROGRESS_STATUS.CURRENT]} · ${done} de ${total}`,\n next: 'Siguiente',\n exceptionsTitle: 'Observaciones · no cuentan en el avance',\n noExceptions: 'Sin observaciones registradas.',\n itemDone: 'completado',\n itemPending: 'pendiente',\n};\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { Badge } from '../badge/Badge';\nimport { Button } from '../button/button';\nimport { Icon } from '../icon/Icon';\nimport { PROGRESS_STATUS } from '../status-indicators/ProgressStatus';\nimport { StatusMark } from '../status-indicators/StatusMark';\nimport { StatusNode } from '../status-indicators/StatusNode';\nimport {\n DEFAULT_MILESTONE_TIMELINE_LABELS,\n type MilestoneGroup,\n type MilestoneItem,\n type MilestoneTimelineLabels,\n} from './MilestoneTimeline.types';\n\nlet nextInstanceId = 0;\n\n/**\n * Línea de tiempo de etapas con hitos. Cada etapa es un encabezado expandible\n * (`aria-expanded`/`aria-controls`) con un panel de hitos y, si la etapa tiene\n * hitos de excepción, un bloque aparte que no cuenta en el avance. Una etapa\n * sin hitos es solo informativa (no es un botón).\n *\n * El estado nunca se comunica solo con color: cada etapa y cada hito llevan su\n * estado en texto (visible o solo para lectores de pantalla) y los nodos y\n * marcas lo dibujan también con la forma. Todos los textos salen de `labels`\n * (español por defecto) y las fechas llegan ya formateadas.\n *\n * El conector entre etapas se deriva del tamaño del nodo\n * (`--kf-status-node-size`, default `2.125rem`) y de la separación del\n * encabezado: cambiar el tamaño del nodo mueve la línea con él.\n *\n * <kf-milestone-timeline\n * [groups]=\"stages()\"\n * [(expandedIds)]=\"expanded\"\n * nextItemId=\"stage2-docs\"\n * ariaLabel=\"Avance de la entrega\"\n * [labels]=\"{ heading: 'Progress', expandAll: 'Expand all' }\"\n * />\n */\n@Component({\n selector: 'kf-milestone-timeline',\n imports: [Badge, Button, Icon, NgTemplateOutlet, StatusMark, StatusNode],\n templateUrl: './MilestoneTimeline.html',\n styleUrl: './MilestoneTimeline.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MilestoneTimeline {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly instanceId = `kf-milestone-timeline-${nextInstanceId++}`;\n\n readonly groups = input.required<readonly MilestoneGroup[]>();\n /** Ids de las etapas expandidas, two-way: `[(expandedIds)]`. El padre controla el estado inicial. */\n readonly expandedIds = model<readonly string[]>([]);\n /** Id del hito que se destaca como el siguiente a completar. */\n readonly nextItemId = input<string | undefined>(undefined);\n /** Textos; los que no se pasen usan el español por defecto. */\n readonly labels = input<Partial<MilestoneTimelineLabels>>({});\n /** Nombre accesible de la lista de etapas. */\n readonly ariaLabel = input<string | undefined>(undefined);\n /** Nivel (2-6) del título \"Avance por etapa\", para respetar el esquema de títulos de la página. */\n readonly headingLevel = input<2 | 3 | 4 | 5 | 6>(3);\n\n protected readonly text = computed<MilestoneTimelineLabels>(() => ({\n ...DEFAULT_MILESTONE_TIMELINE_LABELS,\n ...this.labels(),\n }));\n\n protected readonly rows = computed(() =>\n this.groups().map((group) => {\n const main = group.items.filter((item) => !item.exception);\n const doneCount = main.filter((item) => item.done).length;\n const exceptions = group.items.filter((item) => item.exception);\n return {\n group,\n main,\n exceptions,\n happened: exceptions.filter((item) => item.done),\n expandable: group.items.length > 0,\n meta: this.metaOf(group, doneCount, main.length),\n };\n }),\n );\n\n private readonly expandableIds = computed(() =>\n this.groups()\n .filter((group) => group.items.length > 0)\n .map((group) => group.id),\n );\n\n protected readonly hasExpandable = computed(() => this.expandableIds().length > 0);\n protected readonly allExpanded = computed(\n () => this.hasExpandable() && this.expandableIds().every((id) => this.isExpanded(id)),\n );\n\n protected isExpanded(groupId: string): boolean {\n return this.expandedIds().includes(groupId);\n }\n\n protected headId(groupId: string): string {\n return `${this.instanceId}-head-${groupId}`;\n }\n\n protected panelId(groupId: string): string {\n return `${this.instanceId}-panel-${groupId}`;\n }\n\n protected itemStatus(item: MilestoneItem): 'done' | 'pending' {\n return item.done ? PROGRESS_STATUS.DONE : PROGRESS_STATUS.PENDING;\n }\n\n protected toggle(groupId: string): void {\n this.expandedIds.update((ids) =>\n ids.includes(groupId) ? ids.filter((id) => id !== groupId) : [...ids, groupId],\n );\n }\n\n protected toggleAll(): void {\n this.expandedIds.set(this.allExpanded() ? [] : this.expandableIds());\n }\n\n /** Lleva el foco al encabezado de una etapa expandible; devuelve el elemento, o `null` si no existe o no es expandible. */\n focusGroup(groupId: string): HTMLElement | null {\n // Solo las etapas expandibles tienen un encabezado enfocable (un botón).\n const head = this.host.nativeElement.querySelector<HTMLElement>(\n `button#${this.headId(groupId)}`,\n );\n head?.focus({ preventScroll: true });\n return head;\n }\n\n private metaOf(group: MilestoneGroup, done: number, total: number): string {\n const text = this.text();\n if (group.status === PROGRESS_STATUS.DONE) return group.date ?? text.statusDone;\n if (group.status === PROGRESS_STATUS.CURRENT) return text.currentMeta(done, total);\n return text.statusPending;\n }\n}\n","<div class=\"kf-milestone-timeline\">\n <div class=\"kf-milestone-timeline__toolbar\">\n <p class=\"kf-milestone-timeline__heading\" role=\"heading\" [attr.aria-level]=\"headingLevel()\">\n {{ text().heading }}\n </p>\n @if (hasExpandable()) {\n <kf-button\n class=\"kf-milestone-timeline__toggle-all\"\n variant=\"ghost\"\n size=\"sm\"\n (click)=\"toggleAll()\"\n >\n {{ allExpanded() ? text().collapseAll : text().expandAll }}\n </kf-button>\n }\n </div>\n\n <ol class=\"kf-milestone-timeline__list\" [attr.aria-label]=\"ariaLabel() ?? null\">\n @for (row of rows(); track row.group.id) {\n <li\n class=\"kf-milestone-timeline__group\"\n [class]=\"'kf-milestone-timeline__group--' + row.group.status\"\n >\n @if (row.expandable) {\n <button\n type=\"button\"\n class=\"kf-milestone-timeline__head\"\n [id]=\"headId(row.group.id)\"\n [attr.aria-expanded]=\"isExpanded(row.group.id)\"\n [attr.aria-controls]=\"panelId(row.group.id)\"\n (click)=\"toggle(row.group.id)\"\n >\n <ng-container *ngTemplateOutlet=\"headContent; context: { $implicit: row }\" />\n <kf-icon class=\"kf-milestone-timeline__chevron\" name=\"chevron-down\" size=\"sm\" />\n </button>\n\n <div\n class=\"kf-milestone-timeline__panel\"\n role=\"group\"\n [id]=\"panelId(row.group.id)\"\n [attr.aria-labelledby]=\"headId(row.group.id)\"\n [hidden]=\"!isExpanded(row.group.id)\"\n >\n <ul class=\"kf-milestone-timeline__items\">\n @for (item of row.main; track item.id) {\n <li\n class=\"kf-milestone-timeline__item\"\n [class.kf-milestone-timeline__item--done]=\"item.done\"\n [class.kf-milestone-timeline__item--next]=\"item.id === nextItemId()\"\n >\n <kf-status-mark [status]=\"itemStatus(item)\" [small]=\"true\" />\n <span class=\"kf-milestone-timeline__item-body\">\n <span\n >{{ item.label\n }}<span class=\"kf-sr-only\"\n >: {{ item.done ? text().itemDone : text().itemPending }}</span\n ></span\n >\n @if (item.date) {\n <span class=\"kf-milestone-timeline__item-date\">{{ item.date }}</span>\n }\n </span>\n @if (item.id === nextItemId()) {\n <kf-badge tone=\"info\">{{ text().next }}</kf-badge>\n }\n </li>\n }\n </ul>\n\n @if (row.exceptions.length > 0) {\n <div class=\"kf-milestone-timeline__exceptions\">\n <p class=\"kf-milestone-timeline__exceptions-title\">{{ text().exceptionsTitle }}</p>\n @if (row.happened.length > 0) {\n <ul class=\"kf-milestone-timeline__items\">\n @for (item of row.happened; track item.id) {\n <li class=\"kf-milestone-timeline__item kf-milestone-timeline__item--done\">\n <kf-status-mark status=\"done\" [small]=\"true\" [exception]=\"true\" />\n <span class=\"kf-milestone-timeline__item-body\">\n <span\n >{{ item.label\n }}<span class=\"kf-sr-only\">: {{ text().itemDone }}</span></span\n >\n @if (item.date) {\n <span class=\"kf-milestone-timeline__item-date\">{{ item.date }}</span>\n }\n </span>\n </li>\n }\n </ul>\n } @else {\n <p class=\"kf-milestone-timeline__exceptions-empty\">{{ text().noExceptions }}</p>\n }\n </div>\n }\n </div>\n } @else {\n <div\n class=\"kf-milestone-timeline__head kf-milestone-timeline__head--static\"\n [id]=\"headId(row.group.id)\"\n >\n <ng-container *ngTemplateOutlet=\"headContent; context: { $implicit: row }\" />\n </div>\n }\n </li>\n }\n </ol>\n</div>\n\n<!-- Nodo + título + estado de una etapa, compartido por el encabezado botón y el estático. -->\n<ng-template #headContent let-row>\n <kf-status-node [status]=\"row.group.status\" [icon]=\"row.group.icon\" />\n <span class=\"kf-milestone-timeline__text\">\n <span class=\"kf-milestone-timeline__title\">{{ row.group.label }}</span>\n <span class=\"kf-milestone-timeline__meta\">\n @if (row.group.status === 'done') {\n <span class=\"kf-sr-only\">{{ text().statusDone }}. </span>\n }\n {{ row.meta }}\n </span>\n </span>\n</ng-template>\n","import { DOCUMENT } from '@angular/common';\nimport { OverlayContainer } from '@angular/cdk/overlay';\nimport {\n booleanAttribute,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport {\n installModalAwareOverlayContainer,\n registerOpenModalDialog,\n unregisterOpenModalDialog,\n} from './modal-overlay-container';\n\n/** Anchos con nombre de `size`: 480 / 640 / 880 / 1120 px. */\nexport type ModalSize = 'sm' | 'md' | 'lg' | 'xl';\n\nlet modalId = 0;\n\n/** Controles que pueden recibir el foco inicial. */\nconst FOCUSABLE =\n 'input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Diálogo centrado sobre un backdrop: confirmaciones destructivas, formularios\n * cortos, decisiones que bloquean el flujo.\n *\n * Se apoya en el `<dialog>` nativo (`showModal()`), así que el atrapado de\n * foco, el backdrop, el orden en el top-layer y el cierre con `Escape` los\n * resuelve el navegador — no hay trampa de foco escrita a mano acá. Lo único\n * que se agrega es el lock de scroll del body, que `<dialog>` no hace.\n *\n * `open` es two-way. Con `dismissible` en `false` (ej. mientras una acción\n * destructiva está en vuelo) se cancelan `Escape` y el clic en el backdrop:\n * solo cierra el consumidor poniendo `open` en `false`.\n *\n * Las acciones van en el slot `footer` — el atributo `footer` se pone\n * DIRECTO en cada `kf-button`, sin envolverlos en un `<div footer>`:\n * `.kf-modal__footer` ya es `display:flex` con `gap` propio entre sus\n * hijos DIRECTOS. Envolver los botones en un `<div>` intermedio dejaría\n * ese `<div>` como único hijo del footer — el gap nunca llegaría a\n * separar los botones entre sí (bug real encontrado en `web-otd-frontend`:\n * los 2 botones quedaban pegados, con 0px de separación medida, pese a que\n * el CSS del footer declaraba `gap: var(--kf-space-md)`).\n *\n * <kf-modal [(open)]=\"confirmOpen\" title=\"Eliminar unidad\">\n * <p>Esta acción no se puede deshacer.</p>\n * <kf-button footer variant=\"ghost\" (click)=\"confirmOpen.set(false)\">Cancelar</kf-button>\n * <kf-button footer (click)=\"remove()\">Eliminar</kf-button>\n * </kf-modal>\n *\n * El footer agrupa todo a la derecha por defecto (`justify-content:\n * flex-end`) — para una acción secundaria/informativa que debe quedar\n * separada a la izquierda (ej. un link \"Ver documento\" junto a un botón\n * \"Cerrar\"), agregar la clase `kf-modal__footer-start` AL MISMO elemento\n * que ya lleva `footer`, no a un wrapper (mismo motivo que el `footer`\n * directo: un `<div>` intermedio rompe el `gap`):\n *\n * <kf-link footer class=\"kf-modal__footer-start\" disabled>Ver documento</kf-link>\n * <kf-button footer (click)=\"open.set(false)\">Cerrar</kf-button>\n *\n * ## Ancho: `size` y `width`\n * `size` (`'sm'` 480px, `'md'` 640px, `'lg'` 880px, `'xl'` 1120px) elige un\n * ancho con nombre; sin `size` ni `width` el ancho es el histórico de 480px.\n * `width` sigue aceptando cualquier valor CSS y, si se pasa, manda sobre\n * `size`. En pantallas angostas el panel nunca supera el ancho del viewport.\n *\n * <kf-modal [(open)]=\"open\" title=\"Nuevo ticket\" size=\"xl\">…</kf-modal>\n *\n * ## Separadores: `dividers`\n * Con `dividers` el encabezado y el footer quedan separados del cuerpo por\n * una línea (`--kf-color-border`); el del footer solo aparece si hay\n * acciones. Sirve cuando el cuerpo se desplaza (`maxHeight`) y su contenido\n * no debe cortarse contra los botones. Sin `dividers` no cambia nada.\n *\n * <kf-modal [(open)]=\"open\" title=\"Nuevo ticket\" size=\"lg\" dividers maxHeight=\"85vh\">…</kf-modal>\n *\n * ## Modal de listado (alto acotado, filtros fijos)\n * Para un diálogo con mucho contenido (ej. elegir un ítem entre cientos):\n * - `maxHeight` (ej. `\"85vh\"`) acota el panel; solo `.kf-modal__body` se\n * desplaza, el encabezado, la zona `[kf-modal-toolbar]` y el footer\n * quedan fijos.\n * - `[kf-modal-toolbar]`: zona FIJA entre el encabezado y el cuerpo, para\n * buscador y filtros.\n * - `[kf-modal-meta]`: dato corto junto al título (ej. \"12 de 86\").\n * - `fullscreenOnMobile`: hasta 640px de viewport ocupa toda la pantalla\n * (`100dvh`, sin radio).\n * - `initialFocus`: selector CSS del elemento que recibe el foco al abrir\n * (si apunta a un contenedor, se enfoca su primer control). Sin él, el\n * `<dialog>` nativo decide (`autofocus` o el primer control).\n *\n * <kf-modal [(open)]=\"open\" title=\"Cambiar cotización\" width=\"1040px\"\n * maxHeight=\"85vh\" fullscreenOnMobile initialFocus=\".search\">\n * <span kf-modal-meta aria-live=\"polite\">12 de 86</span>\n * <div kf-modal-toolbar><kf-input class=\"search\" … /></div>\n * <ul>…</ul>\n * </kf-modal>\n */\n@Component({\n selector: 'kf-modal',\n imports: [Icon],\n templateUrl: './Modal.html',\n styleUrl: './Modal.css',\n})\nexport class Modal {\n readonly title = input('');\n /** Visibilidad, two-way: `[(open)]=\"confirmOpen\"`. */\n readonly open = model(false);\n /** Permite cerrar con el botón, `Escape` o clic en el backdrop. */\n readonly dismissible = input(true, { transform: booleanAttribute });\n /** Ancho por defecto: `480px` (sin pasar nada). Un modal con contenido\n * tabular/ancho (ej. una lista de varios campos por fila) puede pedir\n * más, ej. `width=\"720px\"` — sigue topeado por `100vw` en pantallas\n * angostas, mismo `min()` de siempre. */\n readonly width = input<string | null>(null);\n /** Ancho con nombre sobre `--kf-modal-width`; `width` lo pisa si ambos están. */\n readonly size = input<ModalSize | null>(null);\n /** Línea bajo el encabezado y sobre el footer (si tiene acciones). */\n readonly dividers = input(false, { transform: booleanAttribute });\n /** Alto máximo del panel (ej. `\"85vh\"`); con valor, solo el cuerpo se\n * desplaza. Sin valor (default) el panel crece con su contenido. */\n readonly maxHeight = input<string | null>(null);\n /** Hasta 640px de viewport, ocupa toda la pantalla (100dvh, sin radio). */\n readonly fullscreenOnMobile = input(false, { transform: booleanAttribute });\n /** Selector CSS (dentro del panel) del elemento a enfocar al abrir. */\n readonly initialFocus = input<string | null>(null);\n\n protected readonly titleId = `kf-modal-title-${modalId++}`;\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly panel = viewChild<ElementRef<HTMLElement>>('panel');\n private readonly document = inject(DOCUMENT);\n private readonly overlayContainer = inject(OverlayContainer);\n\n constructor() {\n // Ver `modal-overlay-container.ts`: sin esto, cualquier overlay de CDK\n // (kf-select, kf-multi-select, kf-dropdown, tooltips, el selector de\n // kf-pagination) queda visible pero no clickeable dentro de este modal,\n // porque `showModal()` deja `.cdk-overlay-container` (siempre hijo de\n // `<body>`) fuera del top layer e inerte.\n installModalAwareOverlayContainer(this.overlayContainer);\n\n afterRenderEffect(() => {\n const el = this.dialog()?.nativeElement;\n if (!el) {\n return;\n }\n if (this.open() && !el.open) {\n // `showModal` no existe en jsdom (tests) ni en entornos sin\n // top-layer; el atributo `open` lo deja visible, aunque no modal.\n if (typeof el.showModal === 'function') {\n el.showModal();\n } else {\n el.open = true;\n }\n this.focusInitial();\n } else if (!this.open() && el.open) {\n if (typeof el.close === 'function') {\n el.close();\n } else {\n el.open = false;\n }\n }\n // Se reconcilia contra `el.open` (no contra la rama recién tomada)\n // porque el cierre puede venir del propio navegador — Escape sin\n // `event.preventDefault()` en `onCancel` cierra el `<dialog>` nativo\n // sin pasar por la rama de arriba — y el registro tiene que reflejar\n // el estado real para que el overlay container elija bien el destino.\n if (el.open) {\n registerOpenModalDialog(el);\n } else {\n unregisterOpenModalDialog(el);\n }\n // `<dialog>` inertiza el resto de la página pero no frena su scroll.\n this.document.body.style.overflow = this.open() ? 'hidden' : '';\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.document.body.style.overflow = '';\n const el = this.dialog()?.nativeElement;\n if (el) {\n unregisterOpenModalDialog(el);\n }\n });\n }\n\n /**\n * Enfoca `initialFocus` DESPUÉS de `showModal()` (que ya movió el foco al\n * primer control): un elemento dentro de un `<dialog>` cerrado no se puede\n * enfocar. Si el selector apunta a un host (ej. `kf-input`), se enfoca su\n * primer control interno.\n */\n private focusInitial(): void {\n const selector = this.initialFocus();\n const panel = this.panel()?.nativeElement;\n if (!selector || !panel) {\n return;\n }\n const target = panel.querySelector<HTMLElement>(selector);\n const focusable = target?.matches(FOCUSABLE)\n ? target\n : target?.querySelector<HTMLElement>(FOCUSABLE);\n focusable?.focus();\n }\n\n /** `Escape` dispara `cancel`; cancelarlo lo deja abierto. */\n protected onCancel(event: Event): void {\n if (!this.dismissible()) {\n event.preventDefault();\n }\n }\n\n /**\n * Clic en el backdrop. Un clic en la zona del backdrop tiene como `target` al\n * propio `<dialog>` (el contenido vive en el panel de adentro), así que basta\n * comparar contra él — no hace falta cortar la propagación en el panel.\n *\n * Va como HostListener y no como binding en el template porque un `(click)`\n * sobre el `<dialog>` dispara las reglas a11y de click-sin-teclado; acá el\n * equivalente de teclado es `Escape`, que el `<dialog>` nativo ya maneja.\n */\n @HostListener('click', ['$event'])\n protected onHostClick(event: MouseEvent): void {\n if (this.dismissible() && event.target === this.dialog()?.nativeElement) {\n this.open.set(false);\n }\n }\n}\n","<dialog\n #dialog\n class=\"kf-modal\"\n [class.kf-modal--bounded]=\"!!maxHeight()\"\n [class.kf-modal--fullscreen-mobile]=\"fullscreenOnMobile()\"\n [class.kf-modal--dividers]=\"dividers()\"\n [attr.data-size]=\"size()\"\n [style.--kf-modal-width]=\"width()\"\n [style.--kf-modal-max-height]=\"maxHeight()\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n>\n @if (open()) {\n <div #panel class=\"kf-modal__panel\">\n <div class=\"kf-modal__head\">\n <div class=\"kf-modal__heading\">\n @if (title()) {\n <h2 class=\"kf-modal__title\" [id]=\"titleId\">{{ title() }}</h2>\n }\n <ng-content select=\"[kf-modal-meta]\" />\n </div>\n @if (dismissible()) {\n <button\n type=\"button\"\n class=\"kf-modal__close\"\n aria-label=\"Cerrar diálogo\"\n (click)=\"open.set(false)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n }\n </div>\n <div class=\"kf-modal__toolbar\"><ng-content select=\"[kf-modal-toolbar]\" /></div>\n <div class=\"kf-modal__body\"><ng-content /></div>\n <div class=\"kf-modal__footer\"><ng-content select=\"[footer]\" /></div>\n </div>\n }\n</dialog>\n","import { Component, input } from '@angular/core';\n\n/** Color de la franja izquierda y del fondo. */\nexport type NoteBlockTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\n/**\n * Bloque de texto atribuido a una PERSONA: encabezado, prosa y firma al pie,\n * con fondo suave y franja de color — la anatomía de una cita, distinta de\n * `kf-alert` (que interrumpe el flujo con `role=\"alert\"`). El texto va como\n * contenido proyectado y respeta los saltos de línea del autor.\n */\n@Component({\n selector: 'kf-note-block',\n templateUrl: './NoteBlock.html',\n styleUrl: './NoteBlock.css',\n host: {\n '[class]': '\"kf-note-block--\" + tone()',\n },\n})\nexport class NoteBlock {\n readonly title = input<string>();\n\n /** Segunda pieza del encabezado, en la misma línea del `title`. */\n readonly subtitle = input<string>();\n\n /** Pie de atribución — quién escribió y cuándo, ya formateado. */\n readonly signature = input<string>();\n\n readonly tone = input<NoteBlockTone>('info');\n}\n","@if (title() || subtitle()) {\n <span class=\"kf-note-block__head\">\n @if (title(); as heading) {\n <span class=\"kf-note-block__title kf-overline-text\">{{ heading }}</span>\n }\n @if (subtitle(); as sub) {\n <span class=\"kf-note-block__subtitle kf-caption-text\">{{ sub }}</span>\n }\n </span>\n}\n\n<span class=\"kf-note-block__text\"><ng-content /></span>\n\n@if (signature(); as author) {\n <span class=\"kf-note-block__signature kf-caption-text\">{{ author }}</span>\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\nimport { Icon } from '../icon/Icon';\n\n/** Opción de `kf-option-list`. `count` se muestra alineado a la derecha. */\nexport interface OptionListOption {\n value: string;\n label: string;\n count?: number;\n}\n\nlet nextId = 0;\n\n/**\n * Lista vertical de opciones de UNA sola selección para paneles (ej. las\n * secciones \"Estado\", \"Ordenar por\" y \"Vista\" de un panel de filtros): una\n * fila de al menos 44px por opción, contador opcional a la derecha y la\n * opción elegida resaltada con `--kf-color-primary-soft`.\n *\n * Es la contraparte en panel de `kf-filter-chips`: misma función (filtrar u\n * ordenar lo que se muestra) cuando no hay ancho para una fila de chips. No\n * es `kf-selectable-card-group`: aquel responde una pregunta de un flujo\n * (\"¿con qué método pagas?\") con affordance de radio y cards grandes; esta\n * lista ajusta una vista, con filas densas y contador.\n *\n * Semántica: `role=\"radiogroup\"` + `role=\"radio\"` con `aria-checked`, no\n * botones con `aria-pressed`. Las opciones son mutuamente excluyentes (eso\n * es un radio; `aria-pressed` describe toggles independientes), el lector\n * de pantalla anuncia la posición (\"2 de 4\") y cada grupo es UNA sola\n * parada de Tab: un panel con tres secciones se recorre con 3 Tabs en vez\n * de uno por opción. Dentro del grupo, flechas arriba/abajo y Home/End\n * mueven el foco y seleccionan (`handleArrowKeyNavigation`, mismo helper que\n * `kf-tabs`/`kf-selectable-card-group`).\n *\n * La opción elegida lleva además un check (no solo color), para que el\n * estado no dependa de distinguir el tinte `primary-soft` (WCAG 1.4.1).\n *\n * El `@for` hace `track` por índice: cuando el padre re-renderiza (ej. los\n * contadores cambian al elegir), los botones existentes se reutilizan y el\n * foco no se pierde. Por índice y no por `value` para no fallar (NG0955)\n * si dos opciones repiten `value`; aun así los values deben ser únicos:\n * con repetidos, ambas filas se marcan elegidas.\n *\n * `label` dibuja el título de la sección (chico, en mayúsculas) y nombra el\n * grupo vía `aria-labelledby`; sin título visible, pasar `ariaLabel`.\n *\n * <kf-option-list label=\"Estado\"\n * [options]=\"[{ value: '', label: 'Todas', count: 12 },\n * { value: 'pending', label: 'Pendientes', count: 3 }]\"\n * [value]=\"status()\"\n * (valueChange)=\"status.set($event)\" />\n */\n@Component({\n selector: 'kf-option-list',\n imports: [Icon],\n templateUrl: './OptionList.html',\n styleUrl: './OptionList.css',\n})\nexport class OptionList {\n readonly options = input.required<(string | OptionListOption)[]>();\n readonly value = input<string>('');\n /** Título visible de la sección; nombra el grupo. */\n readonly label = input<string>();\n /** Nombre accesible del grupo cuando no hay `label` visible. */\n readonly ariaLabel = input<string>();\n\n readonly valueChange = output<string>();\n\n private readonly instanceId = `kf-option-list-${nextId++}`;\n protected readonly labelId = `${this.instanceId}-label`;\n /**\n * Prefijo de id de cada opción — único por instancia (dos listas con los\n * mismos values no colisionan). El id termina en el ÍNDICE, no en el\n * value: un value con espacios u otros caracteres daría un id inválido.\n */\n protected readonly optionIdPrefix = `${this.instanceId}-option-`;\n\n readonly normalizedOptions = computed<OptionListOption[]>(() =>\n this.options().map((option) =>\n typeof option === 'string' ? { value: option, label: option } : option,\n ),\n );\n\n /**\n * Opción que recibe `tabindex=\"0\"`: la seleccionada o, si ninguna lo\n * está, la primera — el grupo siempre debe ser alcanzable con Tab.\n */\n protected readonly tabStopValue = computed(() => {\n const options = this.normalizedOptions();\n const selected = options.find((option) => option.value === this.value());\n return (selected ?? options[0])?.value;\n });\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n /**\n * `handleArrowKeyNavigation` ubica el botón destino por `idPrefix + value`;\n * como los ids usan el índice, se le pasa la lista con el índice como\n * value y se traduce de vuelta al value real al seleccionar.\n */\n protected onKeydown(event: KeyboardEvent, index: number): void {\n const options = this.normalizedOptions();\n handleArrowKeyNavigation(\n event,\n options.map((_, i) => ({ value: String(i) })),\n String(index),\n this.optionIdPrefix,\n (next) => this.select(options[Number(next)].value),\n 'vertical',\n );\n }\n}\n","@if (label(); as labelText) {\n <span class=\"kf-option-list__title kf-overline-text\" [id]=\"labelId\">{{ labelText }}</span>\n}\n<div\n class=\"kf-option-list\"\n role=\"radiogroup\"\n [attr.aria-labelledby]=\"label() ? labelId : null\"\n [attr.aria-label]=\"label() ? null : ariaLabel() || null\"\n>\n @for (option of normalizedOptions(); track $index; let i = $index) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-option-list__option\"\n [id]=\"optionIdPrefix + i\"\n [class.kf-option-list__option--selected]=\"option.value === value()\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === tabStopValue() ? 0 : -1\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, i)\"\n >\n <span class=\"kf-option-list__label\">{{ option.label }}</span>\n <span class=\"kf-option-list__end\">\n @if (option.count !== undefined) {\n <span class=\"kf-option-list__count\"> {{ option.count }}</span>\n }\n <span class=\"kf-option-list__check\">\n @if (option.value === value()) {\n <kf-icon name=\"check\" size=\"sm\" />\n }\n </span>\n </span>\n </button>\n }\n</div>\n","import { Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport { Text, TextVariant } from '../text/Text';\n\n/**\n * Tamaño del título. Cada valor mapea 1:1 a una variante `title-*` de\n * `kf-text`; `xl`/`xxl` son para títulos protagonistas (ej. bienvenida del\n * home). Bajo los 900px, el tamaño efectivo baja un escalón (ver\n * `MOBILE_STEP_DOWN`).\n */\nexport type PageHeaderTitleSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\n\nconst MOBILE_STEP_DOWN: Record<PageHeaderTitleSize, PageHeaderTitleSize> = {\n xxl: 'xl',\n xl: 'lg',\n lg: 'md',\n md: 'sm',\n sm: 'sm',\n};\n\n/**\n * Bloque de título al tope de una página: chip de ícono opcional, título (h1),\n * subtítulo opcional y un área de acciones opcional proyectada vía\n * `<ng-content select=\"[actions]\">`.\n *\n * <kf-page-header title=\"Vehículos\" subtitle=\"Gestión de la flota activa\">\n * <button actions>Nuevo vehículo</button>\n * </kf-page-header>\n *\n * <kf-page-header icon=\"settings\" title=\"Configuración\" />\n *\n * <kf-page-header size=\"xl\" title=\"Bienvenido de nuevo\" />\n */\n@Component({\n selector: 'kf-page-header',\n imports: [Icon, Text],\n templateUrl: './PageHeader.html',\n styleUrl: './PageHeader.scss',\n})\nexport class PageHeader {\n readonly icon = input<IconName | undefined>(undefined);\n readonly title = input.required<string>();\n readonly subtitle = input<string | undefined>(undefined);\n readonly size = input<PageHeaderTitleSize>('md');\n\n private readonly isMobile = matchMediaSignal('(max-width: 900px)');\n\n protected readonly resolvedTitleVariant = computed<TextVariant>(() => {\n const size = this.isMobile() ? MOBILE_STEP_DOWN[this.size()] : this.size();\n return `title-${size}`;\n });\n}\n","<div class=\"kf-page-header__row\">\n @if (icon(); as iconName) {\n <span class=\"kf-page-header__icon\">\n <kf-icon [name]=\"iconName\" size=\"lg\" />\n </span>\n }\n\n <div class=\"kf-page-header__heading\">\n <kf-text as=\"h1\" class=\"kf-page-header__title\" [variant]=\"resolvedTitleVariant()\">\n {{ title() }}\n </kf-text>\n @if (subtitle()) {\n <p class=\"kf-page-header__subtitle\">{{ subtitle() }}</p>\n }\n </div>\n\n <div class=\"kf-page-header__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n</div>\n","import { Component, input, output } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Divider } from '../divider/Divider';\nimport { Link } from '../link/Link';\n\n/**\n * Tarjeta contenedora con título, enlace de acción opcional a la derecha, y\n * cuerpo con contenido libre — página 33: \"Base de la mayoría de bloques del\n * portal\". Compone sobre `kf-card` para compartir la misma superficie\n * (radio, sombra, borde) que el resto de la librería.\n *\n * <kf-panel title=\"Mis documentos por pagar\" actionLabel=\"Ir a pagos\" actionHref=\"/pagos\">\n * <kf-action-tile-row icon=\"download\" title=\"Pagos\" description=\"Revisa tu estado de cuenta y realiza pagos.\" />\n * </kf-panel>\n *\n * Para apps con router: escuchar `actionClick` y llamar\n * `event.preventDefault()` antes de `router.navigateByUrl(...)`. El\n * `actionHref` se mantiene igual para que click-medio, \"abrir en pestaña\n * nueva\" y el hover de la barra de estado sigan funcionando.\n *\n * <kf-panel title=\"Mis documentos por pagar\" actionLabel=\"Ir a pagos\" actionHref=\"/pagos\"\n * (actionClick)=\"$event.preventDefault(); router.navigateByUrl('/pagos')\">\n * …\n * </kf-panel>\n *\n * El host y el `kf-card` interno son flex column con `flex:1` de punta a\n * punta — si un grid/flex externo estira `kf-panel` a la altura de un\n * hermano más alto, el contenido proyectado hereda esa altura en vez de\n * dejar un hueco vacío bajo el `kf-card`. Sin esa presión externa (altura\n * \"auto\" del contenedor), `flex:1` no tiene espacio extra que repartir y el\n * panel se comporta igual que antes.\n */\n@Component({\n selector: 'kf-panel',\n imports: [Card, Divider, Link],\n templateUrl: './Panel.html',\n styleUrl: './Panel.css',\n})\nexport class Panel {\n readonly title = input.required<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n\n /**\n * Click en el link de acción. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa — mismo patrón\n * que `itemClick` de `kf-breadcrumb`, sin depender de `@angular/router`.\n */\n readonly actionClick = output<MouseEvent>();\n}\n","<kf-card>\n <div class=\"kf-panel__head\">\n <span class=\"kf-panel__title\">{{ title() }}</span>\n @if (actionLabel()) {\n <kf-link\n class=\"kf-panel__action\"\n [href]=\"actionHref() || '#'\"\n showArrow\n (click)=\"actionClick.emit($event)\"\n >\n {{ actionLabel() }}\n </kf-link>\n }\n </div>\n <kf-divider />\n <div class=\"kf-panel__body\">\n <ng-content />\n </div>\n</kf-card>\n","import { DOCUMENT, NgTemplateOutlet } from '@angular/common';\nimport { Overlay, type ConnectedPosition, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n signal,\n untracked,\n} from '@angular/core';\n\nexport type PopoverPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextPopoverId = 0;\n\n/** Separación (px) entre el anfitrión y el panel. */\nconst POPOVER_GAP = 8;\n/** Margen (px) mínimo entre el panel y el borde del viewport. */\nconst POPOVER_VIEWPORT_MARGIN = 8;\n/**\n * Ventana (ms) tras abrir en la que un `scroll` no cierra el panel: enfocar el\n * anfitrión puede desplazar su contenedor para dejarlo a la vista, y ese\n * `scroll` llega después del `focusin` que abrió el panel.\n */\nconst SCROLL_GRACE_MS = 150;\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Panel visual del popover — componente interno, no exportado en\n * `public-api.ts`. `PopoverDirective` es la única forma pública de usarlo.\n *\n * `role=\"tooltip\"` cuando es solo informativo (el patrón WAI-ARIA para\n * contenido que el lector anuncia vía `aria-describedby` del anfitrión) y\n * `role=\"dialog\"` no modal cuando es `interactive` (puede tener enlaces o\n * botones adentro, que un `tooltip` no admite).\n */\n@Component({\n selector: 'kf-popover-panel',\n imports: [NgTemplateOutlet],\n template: `<ng-container [ngTemplateOutlet]=\"template()\" />`,\n styleUrl: './Popover.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.role]': \"interactive() ? 'dialog' : 'tooltip'\",\n '[attr.aria-label]': 'label()',\n '[class.kf-popover-panel--interactive]': 'interactive()',\n '(pointerenter)': 'onPointerEnter($event)',\n '(pointerleave)': 'onPointerLeave($event)',\n '(focusin)': 'focusEntered.emit()',\n '(focusout)': 'focusLeft.emit($event)',\n },\n})\nclass PopoverPanel {\n readonly template = input.required<TemplateRef<unknown> | null>();\n readonly interactive = input(false);\n readonly label = input<string | null>(null);\n\n readonly pointerEntered = output<void>();\n readonly pointerLeft = output<void>();\n readonly focusEntered = output<void>();\n readonly focusLeft = output<FocusEvent>();\n\n protected onPointerEnter(event: PointerEvent): void {\n if (event.pointerType !== 'touch') {\n this.pointerEntered.emit();\n }\n }\n\n protected onPointerLeave(event: PointerEvent): void {\n if (event.pointerType !== 'touch') {\n this.pointerLeft.emit();\n }\n }\n}\n\n/**\n * Popover de contenido enriquecido anclado a un elemento — la contraparte de\n * `kfTooltip` para cuando el texto plano no alcanza (varias líneas, énfasis,\n * un desglose, enlaces). Mismo mecanismo de `@angular/cdk/overlay`. El host\n * sigue siendo el elemento que recibe el foco: la directiva no lo hace\n * focusable, así que va sobre un `<button>`, un `<a>` o un elemento con\n * `tabindex=\"0\"`.\n *\n * <button [kfPopover]=\"detail\" kfPopoverPlacement=\"top\">Etapa</button>\n * <ng-template #detail><strong>Recepción</strong><p>Completada el 12/05.</p></ng-template>\n *\n * Apertura: puntero (hover, tras `kfPopoverShowDelay` ms; NO se abre con puntero\n * táctil) y foco de teclado (al instante, solo si el foco es visible: un\n * clic con el mouse no lo abre). Cierre: Escape (descarta el panel hasta que\n * el puntero y el foco salgan y vuelvan), salida del puntero tras\n * `kfPopoverHideDelay` ms, pérdida de foco, scroll de cualquier contenedor y\n * redimensionado de la ventana. El panel se reposiciona dentro del viewport\n * (invierte el lado si no cabe).\n *\n * Con `kfPopoverInteractive`, el puntero puede entrar al panel sin cerrarlo y\n * el panel es un `dialog` no modal: Tab desde el anfitrión entra al primer\n * control del panel y Mayús+Tab desde ese control vuelve al anfitrión. Sin\n * `kfPopoverInteractive` (default), el panel es un `tooltip` que no captura\n * el puntero y no debe contener controles.\n *\n * Si el anfitrión no es interactivo pero vive dentro de un control (un botón,\n * un enlace, un elemento con `tabindex`), los eventos de puntero, foco y\n * teclado se escuchan en ese control y el panel se ancla al anfitrión. Es el\n * caso de un indicador dentro de una celda interactiva de `kf-data-table`:\n *\n * <ng-template #stageCell let-row>\n * <span [kfPopover]=\"detail\"><kf-status-mark [status]=\"row.status\" /></span>\n * </ng-template>\n *\n * Accesibilidad: mientras está abierto, el elemento que recibe el foco\n * referencia el panel con `aria-describedby` (se conserva cualquier valor\n * previo).\n */\n@Directive({\n selector: '[kfPopover]',\n exportAs: 'kfPopover',\n})\nexport class PopoverDirective implements OnDestroy {\n /** Contenido del popover (un `ng-template`). `null`/`undefined` = no se abre. */\n readonly kfPopover = input.required<TemplateRef<unknown> | null | undefined>();\n /** Lado preferido; si no cabe en el viewport, se invierte. Default `bottom`. */\n readonly kfPopoverPlacement = input<PopoverPlacement>('bottom');\n /** Retardo (ms) antes de abrir con el puntero. El foco de teclado abre sin retardo. */\n readonly kfPopoverShowDelay = input(150, { transform: numberAttribute });\n /** Retardo (ms) antes de cerrar al salir el puntero. */\n readonly kfPopoverHideDelay = input(150, { transform: numberAttribute });\n /** Desactiva el popover (y lo cierra si estaba abierto). */\n readonly kfPopoverDisabled = input(false, { transform: booleanAttribute });\n /** Permite que el puntero entre al panel sin cerrarlo y que el teclado llegue a sus controles. */\n readonly kfPopoverInteractive = input(false, { transform: booleanAttribute });\n /** Nombre accesible del panel cuando es `interactive` (rol `dialog`). */\n readonly kfPopoverLabel = input<string | null>(null);\n\n /** Emite `true` al abrirse y `false` al cerrarse. */\n readonly kfPopoverOpenChange = output<boolean>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly panelId = `kf-popover-${nextPopoverId++}`;\n private readonly openState = signal(false);\n /** `true` mientras el panel está abierto. */\n readonly isOpen = this.openState.asReadonly();\n\n /**\n * Elemento que recibe los eventos de puntero, foco y teclado: el propio\n * anfitrión o, si este no es interactivo pero vive dentro de un control\n * (botón, enlace, `tabindex`), ese control. `aria-describedby` va en él.\n */\n private trigger: HTMLElement = this.host.nativeElement;\n private overlayRef: OverlayRef | null = null;\n private panelElement: HTMLElement | null = null;\n private showTimer: ReturnType<typeof setTimeout> | null = null;\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\n private openedAt = 0;\n private teardownGlobalListeners: (() => void) | null = null;\n private destroyed = false;\n\n private pointerOnHost = false;\n private pointerOnPanel = false;\n private focusOnHost = false;\n private focusOnPanel = false;\n /** Escape lo descartó: no reabre hasta que puntero y foco hayan salido. */\n private dismissed = false;\n\n constructor() {\n effect(() => {\n if (this.kfPopoverDisabled()) {\n untracked(() => this.close());\n }\n });\n\n // El elemento que recibe los eventos se resuelve tras el primer render: en\n // una vista embebida (ej. dentro de la celda de un `kf-data-table`) el\n // anfitrión aún no tiene a su ancestro interactivo en el DOM al construirse.\n afterNextRender(() => {\n if (this.destroyed) {\n return;\n }\n const target = this.resolveTrigger();\n this.trigger = target;\n const listeners: [string, (event: never) => void][] = [\n ['pointerenter', this.onHostPointerEnter],\n ['pointerleave', this.onHostPointerLeave],\n ['focusin', this.onHostFocusIn],\n ['focusout', this.onHostFocusOut],\n ['keydown', this.onHostKeydown],\n ];\n for (const [type, listener] of listeners) {\n target.addEventListener(type, listener as EventListener);\n }\n this.destroyRef.onDestroy(() => {\n for (const [type, listener] of listeners) {\n target.removeEventListener(type, listener as EventListener);\n }\n });\n });\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n this.clearTimers();\n this.dispose();\n }\n\n /** Cierra el panel de inmediato, sin retardo. */\n close(): void {\n this.clearTimers();\n this.dispose();\n }\n\n private readonly onHostPointerEnter = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n return;\n }\n this.pointerOnHost = true;\n this.reevaluate(this.kfPopoverShowDelay());\n };\n\n private readonly onHostPointerLeave = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n return;\n }\n this.pointerOnHost = false;\n this.reevaluate(this.kfPopoverHideDelay());\n };\n\n private readonly onHostFocusIn = (event: FocusEvent): void => {\n // Solo foco de teclado: un clic o un toque enfocan el botón pero no\n // deben abrir el panel (el clic tiene su propia acción).\n if (!this.isKeyboardFocus(event.target)) {\n return;\n }\n this.focusOnHost = true;\n this.reevaluate(0);\n };\n\n private readonly onHostFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Node | null;\n if (next && this.trigger.contains(next)) {\n return;\n }\n this.focusOnHost = false;\n if (next && this.kfPopoverInteractive() && this.panelElement?.contains(next)) {\n // El foco pasa al panel: su propio `focusin` lo registra.\n return;\n }\n this.reevaluate(0);\n };\n\n private readonly onHostKeydown = (event: KeyboardEvent): void => {\n if (\n event.key !== 'Tab' ||\n event.shiftKey ||\n event.defaultPrevented ||\n !this.panelElement ||\n !this.kfPopoverInteractive()\n ) {\n return;\n }\n const first = this.panelElement.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n if (first) {\n event.preventDefault();\n first.focus();\n }\n };\n\n private get wanted(): boolean {\n if (this.kfPopoverDisabled()) {\n return false;\n }\n const interactive = this.kfPopoverInteractive();\n return (\n this.pointerOnHost ||\n this.focusOnHost ||\n (interactive && (this.pointerOnPanel || this.focusOnPanel))\n );\n }\n\n /** Abre o cierra según los cuatro orígenes (puntero/foco × anfitrión/panel). */\n private reevaluate(delay: number): void {\n if (this.wanted) {\n this.clearHideTimer();\n if (!this.dismissed) {\n this.scheduleOpen(delay);\n }\n return;\n }\n this.dismissed = false;\n this.clearShowTimer();\n this.scheduleClose(delay);\n }\n\n private scheduleOpen(delay: number): void {\n if (this.overlayRef || this.showTimer !== null) {\n return;\n }\n if (delay <= 0) {\n this.open();\n return;\n }\n this.showTimer = setTimeout(() => {\n this.showTimer = null;\n if (this.wanted && !this.dismissed) {\n this.open();\n }\n }, delay);\n }\n\n private scheduleClose(delay: number): void {\n if (!this.overlayRef || this.hideTimer !== null) {\n return;\n }\n if (delay <= 0) {\n this.dispose();\n return;\n }\n this.hideTimer = setTimeout(() => {\n this.hideTimer = null;\n if (!this.wanted) {\n this.dispose();\n }\n }, delay);\n }\n\n private open(): void {\n const template = this.kfPopover();\n if (this.overlayRef || !template || this.kfPopoverDisabled()) {\n return;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(this.positionsFor(this.kfPopoverPlacement()))\n .withViewportMargin(POPOVER_VIEWPORT_MARGIN)\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const overlayRef = this.overlayService.create({\n positionStrategy,\n // El cierre por scroll lo resuelve `listenGlobal`: el scroll strategy de\n // CDK solo ve ancestros registrados como `cdkScrollable`.\n scrollStrategy: this.overlayService.scrollStrategies.noop(),\n });\n const portal = new ComponentPortal(PopoverPanel, this.viewContainerRef, this.injector);\n const panelRef = overlayRef.attach(portal);\n panelRef.setInput('template', template);\n panelRef.setInput('interactive', this.kfPopoverInteractive());\n panelRef.setInput('label', this.kfPopoverInteractive() ? this.kfPopoverLabel() : null);\n this.panelElement = panelRef.location.nativeElement as HTMLElement;\n this.panelElement.id = this.panelId;\n\n panelRef.instance.pointerEntered.subscribe(() => {\n this.pointerOnPanel = true;\n this.reevaluate(0);\n });\n panelRef.instance.pointerLeft.subscribe(() => {\n this.pointerOnPanel = false;\n this.reevaluate(this.kfPopoverHideDelay());\n });\n panelRef.instance.focusEntered.subscribe(() => {\n this.focusOnPanel = true;\n this.reevaluate(0);\n });\n panelRef.instance.focusLeft.subscribe((event) => this.onPanelFocusOut(event));\n this.panelElement.addEventListener('keydown', this.onPanelKeydown);\n\n // Renderiza el contenido antes de medir, para posicionar con el tamaño real.\n panelRef.changeDetectorRef.detectChanges();\n overlayRef.updatePosition();\n\n this.overlayRef = overlayRef;\n this.addDescribedBy();\n this.listenGlobal();\n this.openedAt = Date.now();\n this.openState.set(true);\n this.kfPopoverOpenChange.emit(true);\n }\n\n private dispose(): void {\n const overlayRef = this.overlayRef;\n const wasOpen = overlayRef !== null;\n // Primero se suelta el estado y después se destruye el panel: quitar del DOM\n // un elemento con foco dispara `focusout` de forma síncrona, y ese manejador\n // no debe volver a entrar a `dispose()` con el panel a medio destruir.\n this.overlayRef = null;\n this.teardownGlobalListeners?.();\n this.teardownGlobalListeners = null;\n this.panelElement?.removeEventListener('keydown', this.onPanelKeydown);\n this.panelElement = null;\n this.pointerOnPanel = false;\n this.focusOnPanel = false;\n overlayRef?.dispose();\n this.removeDescribedBy();\n if (wasOpen && !this.destroyed) {\n this.openState.set(false);\n this.kfPopoverOpenChange.emit(false);\n }\n }\n\n private onPanelFocusOut(event: FocusEvent): void {\n if (!this.overlayRef) {\n // `focusout` por quitar del DOM el panel que se está cerrando.\n return;\n }\n this.focusOnPanel = false;\n const next = event.relatedTarget as Node | null;\n if (next && (this.panelElement?.contains(next) || this.trigger.contains(next))) {\n return;\n }\n this.reevaluate(0);\n }\n\n /** Mayús+Tab desde el primer control del panel devuelve el foco al anfitrión. */\n private readonly onPanelKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab' || !event.shiftKey || !this.panelElement) {\n return;\n }\n const first = this.panelElement.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n if (first && this.document.activeElement === first) {\n event.preventDefault();\n this.focusHost();\n }\n };\n\n private focusHost(): void {\n const host = this.trigger;\n const focusable = host.matches(FOCUSABLE_SELECTOR)\n ? host\n : host.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n focusable?.focus({ preventScroll: true });\n }\n\n /**\n * Escape, scroll y resize mientras el panel está abierto. En fase de captura\n * y sobre `document`: `scroll` no burbujea (hay que capturarlo para ver el\n * de cualquier contenedor) y Escape debe cerrar primero el popover sin\n * llegar al modal o drawer que lo contenga.\n */\n private listenGlobal(): void {\n const view = this.document.defaultView;\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') {\n return;\n }\n event.stopPropagation();\n const focusInPanel = this.panelElement?.contains(this.document.activeElement) ?? false;\n this.dismissed = true;\n this.close();\n if (focusInPanel) {\n this.focusHost();\n }\n };\n const onScroll = (event: Event): void => {\n const target = event.target as Node | null;\n if (Date.now() - this.openedAt < SCROLL_GRACE_MS) {\n return;\n }\n if (target && this.panelElement?.contains(target)) {\n return;\n }\n this.close();\n };\n const onResize = (): void => this.close();\n\n this.document.addEventListener('keydown', onKeydown, true);\n this.document.addEventListener('scroll', onScroll, true);\n view?.addEventListener('resize', onResize);\n this.teardownGlobalListeners = () => {\n this.document.removeEventListener('keydown', onKeydown, true);\n this.document.removeEventListener('scroll', onScroll, true);\n view?.removeEventListener('resize', onResize);\n };\n }\n\n private resolveTrigger(): HTMLElement {\n const host = this.host.nativeElement;\n return host.closest<HTMLElement>(FOCUSABLE_SELECTOR) ?? host;\n }\n\n /** Foco de teclado (`:focus-visible`); sin soporte del selector, se asume teclado. */\n private isKeyboardFocus(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) {\n return true;\n }\n try {\n return target.matches(':focus-visible');\n } catch {\n return true;\n }\n }\n\n private addDescribedBy(): void {\n const tokens = this.describedByTokens();\n if (!tokens.includes(this.panelId)) {\n tokens.push(this.panelId);\n this.trigger.setAttribute('aria-describedby', tokens.join(' '));\n }\n }\n\n private removeDescribedBy(): void {\n const remaining = this.describedByTokens().filter((token) => token !== this.panelId);\n if (remaining.length > 0) {\n this.trigger.setAttribute('aria-describedby', remaining.join(' '));\n } else {\n this.trigger.removeAttribute('aria-describedby');\n }\n }\n\n private describedByTokens(): string[] {\n return (this.trigger.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\n }\n\n private clearShowTimer(): void {\n if (this.showTimer !== null) {\n clearTimeout(this.showTimer);\n this.showTimer = null;\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = null;\n }\n }\n\n private clearTimers(): void {\n this.clearShowTimer();\n this.clearHideTimer();\n }\n\n /**\n * Posiciones en orden de preferencia: el lado pedido (centrado, luego\n * alineado al inicio y al final del anfitrión), el lado opuesto con las\n * mismas tres alineaciones y, por último, los dos lados perpendiculares.\n * Así un anfitrión pegado a una esquina encuentra una posición que cabe\n * entera en vez de depender solo del empuje al viewport.\n */\n private positionsFor(placement: PopoverPlacement): ConnectedPosition[] {\n const opposite: Record<PopoverPlacement, PopoverPlacement> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n };\n const perpendicular: PopoverPlacement[] =\n placement === 'top' || placement === 'bottom' ? ['right', 'left'] : ['bottom', 'top'];\n return [placement, opposite[placement], ...perpendicular].flatMap((side) =>\n (['center', 'start', 'end'] as const).map((align) => this.positionFor(side, align)),\n );\n }\n\n private positionFor(\n side: PopoverPlacement,\n align: 'center' | 'start' | 'end',\n ): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n return {\n originX: align,\n originY: side === 'top' ? 'top' : 'bottom',\n overlayX: align,\n overlayY: side === 'top' ? 'bottom' : 'top',\n offsetY: side === 'top' ? -POPOVER_GAP : POPOVER_GAP,\n };\n }\n const vertical = align === 'center' ? 'center' : align === 'start' ? 'top' : 'bottom';\n return {\n originX: side === 'left' ? 'start' : 'end',\n originY: vertical,\n overlayX: side === 'left' ? 'end' : 'start',\n overlayY: vertical,\n offsetX: side === 'left' ? -POPOVER_GAP : POPOVER_GAP,\n };\n }\n}\n","import {\n Component,\n ElementRef,\n HostListener,\n booleanAttribute,\n computed,\n input,\n numberAttribute,\n output,\n signal,\n viewChild,\n viewChildren,\n} from '@angular/core';\nimport { AdminBadge } from '../admin-badge/AdminBadge';\nimport { Avatar } from '../avatar/Avatar';\nimport { Drawer } from '../drawer/Drawer';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\n\n/** Un ítem de navegación de la barra de marca. `icon` es opcional y solo se\n * usa en el drawer mobile (columna, ver template) — el `<nav>` horizontal de\n * escritorio se mantiene solo texto, sin ícono ni chevron. */\nexport interface PortalHeaderNavItem {\n label: string;\n href: string;\n active?: boolean;\n icon?: IconName;\n}\n\n/** Una acción de la franja de administrador (ej. \"Consultar deuda clientes\"). */\nexport interface PortalHeaderAdminAction {\n label: string;\n href: string;\n}\n\n/**\n * Cabecera completa del portal (página 31) — franja de administrador\n * (acento ámbar, solo admins), barra de marca con logo, navegación y\n * pastilla de sesión. Compone `kf-admin-badge` para la franja y `kf-avatar\n * pill` para la sesión, en vez de reimplementar ambos.\n *\n * Es distinto de `kf-page-header`/`kf-page-head` (título de una vista\n * interna) — este es el chrome global del portal, se monta una sola vez.\n *\n * `:host` es `position: sticky; top: 0` — el header queda pegado arriba al\n * hacer scroll. No es `fixed`: como no se superpone al contenido en el\n * primer render, no hace falta que el consumidor compense con\n * `padding-top`.\n *\n * Bajo los 768px, el `<nav>` deja de mostrarse en línea junto al logo y\n * colapsa detrás de un botón de menú (ícono `menu`/`x`) que despliega un\n * `kf-drawer` (panel lateral genérico, ver `Drawer.ts`) anclado al borde\n * IZQUIERDO — mismo lado que el botón que lo abre, convención dominante\n * Material/iOS/Android — con los mismos `navItems` en columna dentro del\n * body (fondo claro) de ese drawer.\n *\n * `PortalHeader` expone dos slots propios pensados para que el consumidor\n * proyecte contenido que en escritorio vive en otro lugar:\n * - `<ng-content select=\"[kf-portal-header-extra]\">`: identidad de sesión\n * (ej. `kf-drawer-session`). Cae en `[kf-drawer-header]` de `kf-drawer` —\n * el único contenedor con fondo oscuro (`--kf-color-tertiary-deep`, ver\n * `Drawer.ts`) que `kf-drawer-session` espera como fondo (no trae uno\n * propio, ver `DrawerSession.ts`).\n * - `<ng-content select=\"[kf-portal-header-footer]\">`: acciones separadas del\n * resto (ej. `kf-drawer-logout`). Cae en `[kf-drawer-footer]` de `kf-drawer`.\n *\n * `PortalHeader` no sabe qué es ninguno de los dos contenidos, solo les da\n * el lugar correcto dentro del drawer ya desplegado (ver `Drawer.ts`).\n *\n * <kf-portal-header\n * [isAdmin]=\"true\"\n * [adminActions]=\"[{ label: 'Consultar deuda clientes', href: '/deuda' }, { label: 'Cambiar DNI', href: '/dni' }]\"\n * [navItems]=\"[{ label: 'Home', href: '/', active: true, icon: 'grid' }, { label: 'Vehículos', href: '/vehiculos', icon: 'truck' }]\"\n * tagline=\"Portal privado\"\n * userInitials=\"TS\"\n * userName=\"Tomás Soto\"\n * [showCart]=\"true\"\n * [cartCount]=\"3\"\n * (cartClick)=\"onCartClick()\"\n * >\n * <kf-drawer-session\n * kf-portal-header-extra\n * brand=\"Portal Kaufmann LATAM\"\n * name=\"Tomás Soto\"\n * email=\"tomas.soto@kaufmann.com\"\n * />\n * <kf-drawer-logout kf-portal-header-footer (logoutClick)=\"onLogout()\" />\n * </kf-portal-header>\n */\n@Component({\n selector: 'kf-portal-header',\n imports: [AdminBadge, Avatar, Icon, Drawer],\n templateUrl: './PortalHeader.html',\n styleUrl: './PortalHeader.css',\n})\nexport class PortalHeader {\n readonly brand = input('DIVEMOTOR');\n /** URL del logo como imagen. Sin ella (default), se mantiene el texto de `brand`. */\n readonly logoSrc = input<string>();\n /** `alt` del logo cuando se usa `logoSrc`. Sin ella, cae en `brand()`. */\n readonly logoAlt = input<string>();\n readonly isAdmin = input(false, { transform: booleanAttribute });\n readonly adminActions = input<PortalHeaderAdminAction[]>([]);\n readonly navItems = input<PortalHeaderNavItem[]>([]);\n readonly userInitials = input.required<string>();\n /** Texto junto al logo (ej. \"Portal privado\"), con separador vertical. Sin\n * separador ni texto si queda vacío. */\n readonly tagline = input('');\n /** Nombre completo para el bloque \"HOLA / {nombre}\" dentro de la pastilla\n * de sesión. Vacío (default) mantiene la pastilla como hoy: solo avatar,\n * sin bloque de texto ni chevron — retrocompatible con cualquier\n * consumidor que no pase este input. */\n readonly userName = input('');\n readonly showCart = input(false, { transform: booleanAttribute });\n /** Cantidad de ítems en el carrito. Con 0 (default) no se muestra el\n * contador; sobre 99 se muestra \"99+\". */\n readonly cartCount = input(0, { transform: numberAttribute });\n\n readonly sessionClick = output<void>();\n readonly cartClick = output<void>();\n\n protected readonly cartCountLabel = computed(() => {\n const count = this.cartCount();\n return count > 99 ? '99+' : String(count);\n });\n\n protected readonly cartAriaLabel = computed(() => {\n const count = this.cartCount();\n if (count <= 0) return 'Carrito de compras';\n return `Carrito de compras, ${count} ${count === 1 ? 'elemento' : 'elementos'}`;\n });\n\n /** Visibilidad del drawer de navegación mobile (bajo los 768px). Se pasa a\n * `kf-drawer` como `[(open)]` — `PortalHeader` ya no implementa overlay,\n * `Escape` ni atrapado de foco por su cuenta, eso vive en `Drawer`. */\n protected readonly mobileMenuOpen = signal(false);\n\n /**\n * `ElementRef` real del botón de sesión (el avatar en la esquina\n * derecha), no de todo el header. Pensado para anclar un `kf-dropdown`\n * externo — sin esto, el único `ElementRef` disponible desde afuera es el\n * del host de `PortalHeader`, que ocupa el ancho completo de la pantalla\n * (logo + nav + sesión), y el overlay del CDK termina \"pegado\" a la\n * esquina del header entero en vez de al botón que el usuario clickeó.\n *\n * <kf-dropdown [(open)]=\"menuOpen\" [anchor]=\"header().sessionButtonRef()\">\n */\n readonly sessionButtonRef = viewChild.required('sessionButton', { read: ElementRef });\n\n /**\n * Ancla real de cada `<a>` del `<nav>` horizontal (una por `navItems()`,\n * mismo orden — `@for` trackea por `item.label`, así que la lista no se\n * recrea en cada cambio de ruta, solo cambia qué índice trae\n * `active: true`). Sirve para medir dónde poner la cápsula deslizante\n * (`thumbStyle`, ver abajo) sin duplicar el layout del nav en JS.\n */\n private readonly navItemAnchors = viewChildren<ElementRef<HTMLAnchorElement>>('navItemAnchor');\n\n /** Fuerza recalcular `thumbStyle` en un resize — un resize de ventana no\n * cambia ningún signal de los que `thumbStyle` ya lee (`navItems`,\n * `navItemAnchors`), pero sí puede correr el layout de los `<a>` bajo un\n * ancho de columna distinto (texto largo pasando a otra línea, etc.). */\n private readonly resizeTick = signal(0);\n\n @HostListener('window:resize')\n protected onWindowResize(): void {\n this.resizeTick.update((tick) => tick + 1);\n }\n\n /**\n * Posición/ancho de la cápsula blanca del ítem activo del `<nav>`, como\n * un elemento propio (`.kf-portal-header__nav-thumb`) que se desliza con\n * `transition` en vez de que cada `<a>` traiga su propio fondo blanco\n * (eso hacía que el fondo \"saltara\" de un ítem a otro sin animación,\n * porque son elementos DOM distintos — no hay nada que Angular pueda\n * animar entre ellos).\n */\n protected readonly thumbStyle = computed<Record<string, string>>(() => {\n this.resizeTick();\n const items = this.navItems();\n const anchors = this.navItemAnchors();\n const activeIndex = items.findIndex((item) => item.active);\n const anchorEl = activeIndex >= 0 ? anchors[activeIndex]?.nativeElement : undefined;\n\n if (!anchorEl) {\n return { opacity: '0', transform: 'translateX(0)', width: '0px' };\n }\n\n return {\n opacity: '1',\n transform: `translateX(${anchorEl.offsetLeft}px)`,\n width: `${anchorEl.offsetWidth}px`,\n };\n });\n}\n","@if (isAdmin()) {\n <div class=\"kf-portal-header__admin-bar\">\n <div class=\"kf-portal-header__admin-inner\">\n <kf-admin-badge inline />\n <div class=\"kf-portal-header__admin-actions\">\n @for (action of adminActions(); track action.label) {\n <a class=\"kf-portal-header__admin-action\" [href]=\"action.href\">{{ action.label }}</a>\n }\n </div>\n </div>\n </div>\n}\n<div class=\"kf-portal-header__brand-bar\">\n <div class=\"kf-portal-header__brand-inner\">\n <div class=\"kf-portal-header__top-row\">\n <div class=\"kf-portal-header__logo-group\">\n @if (logoSrc()) {\n <img class=\"kf-portal-header__logo-img\" [src]=\"logoSrc()\" [alt]=\"logoAlt() || brand()\" />\n } @else {\n <span class=\"kf-portal-header__logo\">{{ brand() }}</span>\n }\n @if (tagline()) {\n <span class=\"kf-portal-header__logo-sep\" aria-hidden=\"true\"></span>\n <span class=\"kf-portal-header__logo-tag\">{{ tagline() }}</span>\n }\n </div>\n\n <div class=\"kf-portal-header__actions\">\n @if (showCart()) {\n <button\n type=\"button\"\n class=\"kf-portal-header__cart\"\n [attr.aria-label]=\"cartAriaLabel()\"\n (click)=\"cartClick.emit()\"\n >\n <kf-icon name=\"cart\" size=\"md\" />\n @if (cartCount() > 0) {\n <span class=\"kf-portal-header__cart-count\" aria-hidden=\"true\">{{\n cartCountLabel()\n }}</span>\n }\n </button>\n }\n\n <button\n #sessionButton\n type=\"button\"\n class=\"kf-portal-header__session\"\n [class.kf-portal-header__session--expanded]=\"userName()\"\n (click)=\"sessionClick.emit()\"\n >\n @if (userName()) {\n <kf-avatar [initials]=\"userInitials()\" />\n <span class=\"kf-portal-header__session-who\">\n <span class=\"kf-portal-header__session-greeting\">Hola</span>\n <span class=\"kf-portal-header__session-name\">{{ userName() }}</span>\n </span>\n <kf-icon name=\"chevron-down\" size=\"sm\" class=\"kf-portal-header__session-chevron\" />\n } @else {\n <kf-avatar [initials]=\"userInitials()\" pill />\n }\n </button>\n\n <button\n type=\"button\"\n class=\"kf-portal-header__menu-toggle\"\n [attr.aria-expanded]=\"mobileMenuOpen()\"\n aria-label=\"Abrir menú de navegación\"\n (click)=\"mobileMenuOpen.set(!mobileMenuOpen())\"\n >\n <kf-icon [name]=\"mobileMenuOpen() ? 'x' : 'menu'\" size=\"md\" />\n </button>\n </div>\n </div>\n\n <nav class=\"kf-portal-header__nav\">\n <span class=\"kf-portal-header__nav-thumb\" [style]=\"thumbStyle()\" aria-hidden=\"true\"></span>\n @for (item of navItems(); track item.label) {\n <a\n #navItemAnchor\n class=\"kf-portal-header__nav-item\"\n [class.kf-portal-header__nav-item--active]=\"item.active\"\n [href]=\"item.href\"\n >\n {{ item.label }}\n </a>\n }\n </nav>\n </div>\n</div>\n\n<kf-drawer [(open)]=\"mobileMenuOpen\" ariaLabel=\"Menú de navegación\">\n <div kf-drawer-header>\n <ng-content select=\"[kf-portal-header-extra]\" />\n </div>\n @for (item of navItems(); track item.label) {\n <a\n class=\"kf-portal-header__mobile-nav-item\"\n [class.kf-portal-header__mobile-nav-item--active]=\"item.active\"\n [href]=\"item.href\"\n (click)=\"mobileMenuOpen.set(false)\"\n >\n @if (item.icon) {\n <kf-icon [name]=\"item.icon\" size=\"sm\" />\n }\n <span class=\"kf-portal-header__mobile-nav-item-label\">{{ item.label }}</span>\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </a>\n }\n <div kf-drawer-footer>\n <ng-content select=\"[kf-portal-header-footer]\" />\n </div>\n</kf-drawer>\n","import { Component, input } from '@angular/core';\n\n/**\n * Punto que emite ondas concéntricas en bucle, para marcar un dato que\n * necesita atención inmediata sin depender de que el operador lo vea por\n * casualidad — el mismo rol que un punto rojo estático ya cumple en varios\n * lugares del producto (ver `.now__d`/`.board-alerts__dot` en\n * `operations-final.html`), llevado a movimiento porque el color solo\n * compite por atención con todo lo demás en pantalla; el movimiento no.\n *\n * Es una primitiva de énfasis, no un indicador de estado — para eso está\n * `kf-status-pill` (punto estático + texto). Este componente no tiene\n * texto ni tono semántico de \"ok/warn/error\": una sola apariencia (rojo,\n * el color reservado para lo urgente en el design system), porque emitir\n * ondas por algo que no es urgente banalizaría la señal la próxima vez que\n * sí lo sea.\n *\n * <kf-pulse-dot />\n * <kf-pulse-dot size=\"lg\" />\n *\n * Respeta `prefers-reduced-motion` (ver PulseDot.css): la onda deja de\n * animarse y el punto queda como un punto estático, sin perder la\n * información de \"esto es urgente\" que da el color.\n */\n@Component({\n selector: 'kf-pulse-dot',\n templateUrl: './PulseDot.html',\n styleUrl: './PulseDot.css',\n})\nexport class PulseDot {\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n}\n","<span class=\"kf-pulse-dot\" [class]=\"'kf-pulse-dot--' + size()\" aria-hidden=\"true\">\n <span class=\"kf-pulse-dot__core\"></span>\n <span class=\"kf-pulse-dot__ring\"></span>\n</span>\n","import { Overlay, type ConnectedPosition, type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {\n Component,\n Directive,\n ElementRef,\n HostListener,\n Injector,\n Input,\n Type,\n ViewContainerRef,\n inject,\n} from '@angular/core';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nlet nextTooltipId = 0;\n\n/**\n * Contenido visual del tooltip — componente interno, no exportado en\n * `public-api.ts`. `TooltipDirective` es la única forma pública de usarlo.\n *\n * `role=\"tooltip\"` en el host: `TooltipDirective` asocia este elemento al\n * disparador vía `aria-describedby` (ver `show()`), el patrón WAI-ARIA\n * estándar para que un lector de pantalla anuncie el texto al enfocar el\n * disparador — sin esto, el tooltip es puramente visual, invisible para\n * quien no puede ver el hover.\n */\n@Component({\n selector: 'kf-tooltip-content',\n template: `{{ text }}`,\n styleUrl: './TooltipContent.css',\n host: { role: 'tooltip' },\n})\nclass TooltipContent {\n text = '';\n}\n\n/**\n * Tooltip de hover/focus — reemplaza el atributo `title` nativo del\n * navegador (lento en aparecer, sin estilo, inconsistente entre\n * navegadores/SO) por un panel propio, mismo mecanismo de\n * `@angular/cdk/overlay` que ya usa `Dropdown`.\n *\n * Pensado para el caso \"ícono sin label visible necesita comunicar qué\n * es\" (ej. `kf-sidebar-nav-item` colapsado). No es two-way: a diferencia\n * de `Dropdown`, esto se abre/cierra solo con hover/focus, nunca por click.\n *\n * <a [kfTooltip]=\"label()\" kfTooltipPosition=\"right\">…</a>\n */\n@Directive({\n selector: '[kfTooltip]',\n})\nexport class TooltipDirective {\n @Input('kfTooltip') text = '';\n @Input() kfTooltipPosition: TooltipPosition = 'right';\n\n private readonly host = inject(ElementRef<HTMLElement>);\n private readonly overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n\n private readonly contentId = `kf-tooltip-${nextTooltipId++}`;\n private overlayRef: OverlayRef | null = null;\n\n /**\n * `focusin` (no `focus`) a propósito: `focus` no burbujea, así que un\n * disparador que ENVUELVE al elemento realmente enfocable (ej.\n * `<kf-button>`, cuyo `<button>` nativo vive en el template del hijo, fuera\n * de alcance de este host) nunca vería el evento — el tooltip quedaría\n * mudo por teclado justo en el caso de uso que más lo necesita (un botón\n * solo-ícono). `focusin` SÍ burbujea y sigue disparando igual para el caso\n * ya cubierto (un `<a>`/`<button>` nativo que es él mismo el host, ver\n * `Tooltip.spec.ts`) — sin regresión ahí.\n */\n @HostListener('mouseenter')\n @HostListener('focusin')\n protected show(): void {\n if (!this.text || this.overlayRef?.hasAttached()) {\n return;\n }\n\n const positionStrategy = this.overlayService\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions(this.positionsFor(this.kfTooltipPosition))\n .withViewportMargin(8)\n .withPush(true);\n\n const overlayRef = this.overlayService.create({\n positionStrategy,\n scrollStrategy: this.overlayService.scrollStrategies.reposition(),\n });\n\n const portal = new ComponentPortal(\n TooltipContent as Type<TooltipContent>,\n this.viewContainerRef,\n this.injector,\n );\n const componentRef = overlayRef.attach(portal);\n componentRef.instance.text = this.text;\n componentRef.location.nativeElement.id = this.contentId;\n\n // Asocia el disparador con el contenido — sin esto, un lector de\n // pantalla no anuncia el texto al enfocar/hacer hover, solo lo ve quien\n // puede leer el overlay flotante a simple vista.\n this.host.nativeElement.setAttribute('aria-describedby', this.contentId);\n\n this.overlayRef = overlayRef;\n }\n\n @HostListener('mouseleave')\n @HostListener('document:keydown.escape')\n protected hide(): void {\n this.host.nativeElement.removeAttribute('aria-describedby');\n this.overlayRef?.dispose();\n this.overlayRef = null;\n }\n\n /**\n * `focusout` (no `blur`, mismo motivo que `show()` usa `focusin`): además,\n * a diferencia de `mouseleave`/Escape, acá SÍ hace falta revisar\n * `relatedTarget` — si el host envuelve más de un elemento enfocable, un\n * foco que se mueve de uno a otro DENTRO del mismo host no debería cerrar\n * el tooltip (no \"salió\" del disparador). `Node` en vez de `EventTarget`:\n * `Node.contains()` es lo que existe para chequear pertenencia al árbol.\n */\n @HostListener('focusout', ['$event'])\n protected onFocusOut(event: FocusEvent): void {\n const nextFocusTarget = event.relatedTarget as Node | null;\n if (nextFocusTarget && this.host.nativeElement.contains(nextFocusTarget)) {\n return;\n }\n this.hide();\n }\n\n private positionsFor(placement: TooltipPosition): ConnectedPosition[] {\n const gap = 12;\n switch (placement) {\n case 'right':\n return [\n {\n originX: 'end',\n originY: 'center',\n overlayX: 'start',\n overlayY: 'center',\n offsetX: gap,\n },\n ];\n case 'left':\n return [\n {\n originX: 'start',\n originY: 'center',\n overlayX: 'end',\n overlayY: 'center',\n offsetX: -gap,\n },\n ];\n case 'top':\n return [\n {\n originX: 'center',\n originY: 'top',\n overlayX: 'center',\n overlayY: 'bottom',\n offsetY: -gap,\n },\n ];\n case 'bottom':\n default:\n return [\n {\n originX: 'center',\n originY: 'bottom',\n overlayX: 'center',\n overlayY: 'top',\n offsetY: gap,\n },\n ];\n }\n }\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { Dropdown } from '../dropdown/Dropdown';\nimport { DropdownItem } from '../dropdown/DropdownItem';\nimport { DropdownPanel } from '../dropdown/DropdownPanel';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\nexport type RowActionKind = 'link' | 'button';\n\n/**\n * Una acción de fila — mismo shape que ya usaba `WorkshopRowAction` en\n * `web-portal-latam-frontend` antes de este componente (Taller, tab\n * \"Trabajos terminados\"), ahora compartido: `kind: 'link'` navega (necesita\n * `href`, `onClick` se ignora), `kind: 'button'` dispara `onClick` en la\n * pantalla actual. `disabled` aplica a ambos — un link sin `href` (o\n * explícitamente `disabled`) se renderiza inerte en vez de clickeable, en\n * vez de omitirse del todo: el consumidor decide que la acción EXISTE pero\n * no está disponible todavía (ej. \"Factura\" mientras no exista el endpoint\n * de descarga).\n */\nexport interface RowAction {\n readonly kind: RowActionKind;\n readonly icon: IconName;\n readonly label: string;\n readonly href?: string | null;\n readonly disabled?: boolean;\n readonly onClick?: () => void;\n}\n\nexport type RowActionsMode = 'auto' | 'inline' | 'menu';\n\n/**\n * Columna \"Acciones\" de cualquier tabla del ecosistema. Decide su propia\n * forma según cuántas acciones recibe — no hace falta que cada tabla elija\n * a mano entre \"botones sueltos\" y \"menú\":\n *\n * - `inline` (`actions().length <= inlineLimit()`, default 2): un\n * ícono-botón de 32px por acción, sin texto — el `label` vive en un\n * `kfTooltip`. Todas las acciones quedan visibles sin clic extra.\n * - `menu` (más de `inlineLimit()`): un único botón \"kebab\" que abre un\n * `kf-dropdown-panel` con una fila por acción.\n *\n * `mode` fuerza uno de los dos modos sin importar cuántas acciones haya\n * (ej. una tabla que prefiere el kebab siempre, aunque tenga una sola\n * acción, por consistencia visual con otra columna).\n *\n * <kf-row-actions [actions]=\"rowActions(row)\" />\n * <kf-row-actions [actions]=\"rowActions(row)\" mode=\"menu\" />\n */\n@Component({\n selector: 'kf-row-actions',\n imports: [Dropdown, DropdownPanel, DropdownItem, Icon, TooltipDirective],\n templateUrl: './RowActions.html',\n styleUrl: './RowActions.css',\n})\nexport class RowActions {\n readonly actions = input.required<readonly RowAction[]>();\n readonly mode = input<RowActionsMode>('auto');\n /** Desde cuántas acciones el modo `auto` pasa de `inline` a `menu`. */\n readonly inlineLimit = input(2);\n\n protected readonly menuOpen = signal(false);\n\n protected readonly effectiveMode = computed<'inline' | 'menu'>(() => {\n const explicit = this.mode();\n if (explicit !== 'auto') {\n return explicit;\n }\n return this.actions().length <= this.inlineLimit() ? 'inline' : 'menu';\n });\n\n protected onToggleMenu(): void {\n this.menuOpen.update((open) => !open);\n }\n\n protected onButtonAction(action: RowAction): void {\n action.onClick?.();\n this.menuOpen.set(false);\n }\n\n protected onMenuLinkClick(): void {\n this.menuOpen.set(false);\n }\n}\n","@if (effectiveMode() === 'inline') {\n <div class=\"kf-row-actions kf-row-actions--inline\">\n @for (action of actions(); track action.label) {\n @if (action.kind === 'link') {\n @if (action.href && !action.disabled) {\n <a\n class=\"kf-row-actions__icon-btn\"\n [href]=\"action.href\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </a>\n } @else {\n <span\n class=\"kf-row-actions__icon-btn kf-row-actions__icon-btn--disabled\"\n role=\"link\"\n aria-disabled=\"true\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </span>\n }\n } @else {\n <button\n type=\"button\"\n class=\"kf-row-actions__icon-btn\"\n [disabled]=\"action.disabled ?? false\"\n [attr.aria-label]=\"action.label\"\n [kfTooltip]=\"action.label\"\n kfTooltipPosition=\"top\"\n (click)=\"action.onClick?.()\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n </button>\n }\n }\n </div>\n} @else {\n <kf-dropdown class=\"kf-row-actions\" [(open)]=\"menuOpen\">\n <button\n type=\"button\"\n class=\"kf-row-actions__trigger\"\n [class.kf-row-actions__trigger--open]=\"menuOpen()\"\n [attr.aria-expanded]=\"menuOpen()\"\n aria-label=\"Más acciones\"\n (click)=\"onToggleMenu()\"\n >\n <kf-icon name=\"more-vertical\" size=\"md\" />\n </button>\n <kf-dropdown-panel>\n @for (action of actions(); track action.label) {\n @if (action.kind === 'link') {\n @if (action.href && !action.disabled) {\n <a\n class=\"kf-row-actions__menu-link\"\n role=\"menuitem\"\n [href]=\"action.href\"\n (click)=\"onMenuLinkClick()\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n <span class=\"kf-row-actions__menu-link-label\">{{ action.label }}</span>\n </a>\n } @else {\n <span\n class=\"kf-row-actions__menu-link kf-row-actions__menu-link--disabled\"\n role=\"menuitem\"\n aria-disabled=\"true\"\n >\n <kf-icon [name]=\"action.icon\" size=\"sm\" />\n <span class=\"kf-row-actions__menu-link-label\">{{ action.label }}</span>\n </span>\n }\n } @else {\n <kf-dropdown-item\n [icon]=\"action.icon\"\n [disabled]=\"action.disabled ?? false\"\n (click)=\"onButtonAction(action)\"\n >\n {{ action.label }}\n </kf-dropdown-item>\n }\n }\n </kf-dropdown-panel>\n </kf-dropdown>\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Título de sub-sección con chip de ícono, pensado para anidarse dentro de\n * cards o paneles (a diferencia de `PageHeader`, que encabeza una página\n * completa). Un área de acciones opcional se proyecta vía\n * `<ng-content select=\"[actions]\">` para no acoplar el componente a un set\n * fijo de botones.\n *\n * `size` sigue la misma escala `'sm'|'md'|'lg'` que `Button`/`Icon`/`Spinner`\n * (`md` es el default): `sm` reduce tipografía y espaciado para usarse\n * dentro de cards ya compactas, `lg` los agranda para encabezar un bloque\n * más prominente. `solid` rellena el chip de ícono con el color primario\n * sólido en vez del tratamiento \"soft\" (fondo tenue) — pensado para\n * superficies que ya tienen un tinte de color propio, donde el chip \"soft\"\n * perdería contraste.\n *\n * <kf-section-header icon=\"settings\" title=\"Preferencias\"\n * subtitle=\"Configuración general de la cuenta\">\n * <button actions>Editar</button>\n * </kf-section-header>\n *\n * <kf-section-header title=\"Detalle\" size=\"sm\" [solid]=\"true\" />\n * <kf-section-header title=\"Resumen de flota\" size=\"lg\" />\n */\n@Component({\n selector: 'kf-section-header',\n imports: [Icon],\n templateUrl: './SectionHeader.html',\n styleUrl: './SectionHeader.css',\n host: {\n '[class.kf-section-header--sm]': \"size() === 'sm'\",\n '[class.kf-section-header--lg]': \"size() === 'lg'\",\n },\n})\nexport class SectionHeader {\n readonly icon = input<IconName>();\n readonly title = input.required<string>();\n readonly subtitle = input<string>();\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly solid = input(false, { transform: booleanAttribute });\n\n protected readonly iconSize = computed(() => {\n if (this.size() === 'sm') {\n return 'sm';\n }\n if (this.size() === 'lg') {\n return 'lg';\n }\n return 'md';\n });\n}\n","@if (icon(); as iconName) {\n <span class=\"kf-section-header__icon\" [class.kf-section-header__icon--solid]=\"solid()\">\n <kf-icon [name]=\"iconName\" [size]=\"iconSize()\" />\n </span>\n}\n\n<span class=\"kf-section-header__text\">\n <span class=\"kf-section-header__title\">{{ title() }}</span>\n @if (subtitle()) {\n <span class=\"kf-section-header__subtitle\">{{ subtitle() }}</span>\n }\n</span>\n\n<span class=\"kf-section-header__actions\">\n <ng-content select=\"[actions]\" />\n</span>\n","import { Component } from '@angular/core';\n\n/**\n * Contenedor de navegación por secciones dentro de una misma pantalla —\n * agrupa `kf-section-nav-item` y resuelve su layout fusionado según\n * viewport, con un breakpoint PROPIO de 1024px (no el $mobile:900px\n * compartido del resto de la librería — ver el comentario en\n * `SectionNav.scss`):\n *\n * - Desktop (≥1024px): columna de botones a la izquierda + panel de\n * contenido separado a la derecha, mostrando el contenido del ítem (o\n * sub-ítem) activo.\n * - Mobile y tablet (<1024px): acordeón — el contenido del ítem activo se\n * despliega inline, justo debajo de su propio botón.\n *\n * El cambio entre ambos layouts es solo CSS (`SectionNav.scss` +\n * `SectionNavItem.scss`, ver comentarios ahí): cada `kf-section-nav-item`\n * proyecta su contenido una única vez y es la grilla la que lo reposiciona\n * visualmente, sin recrearlo ni duplicarlo en el DOM.\n *\n * A diferencia de `kf-tabs` (selector de vista plano, sin contenido propio)\n * y de `kf-sidebar-shell` (rail persistente ENTRE rutas, colapsable, fondo\n * oscuro): esto es navegación DENTRO de una sola pantalla, con paneles de\n * contenido rico por sección.\n *\n * La exclusividad entre ítems (y entre sub-ítems, dentro de cada uno) la\n * decide quien consume el componente, igual que cada `kf-section-nav-item`\n * por separado — `kf-section-nav` no guarda ningún estado de selección.\n *\n * <kf-section-nav>\n * <kf-section-nav-item label=\"Mis datos personales\" icon=\"user\"\n * [active]=\"openSection() === 'datos'\" (toggled)=\"openSection.set('datos')\">\n * <app-personal-data />\n * </kf-section-nav-item>\n * <kf-section-nav-item label=\"Mis empresas\" icon=\"layers\"\n * [active]=\"openSection() === 'empresas'\" (toggled)=\"openSection.set('empresas')\">\n * <app-my-companies />\n * </kf-section-nav-item>\n * </kf-section-nav>\n */\n@Component({\n selector: 'kf-section-nav',\n templateUrl: './SectionNav.html',\n styleUrl: './SectionNav.scss',\n})\nexport class SectionNav {}\n","<div class=\"kf-section-nav\">\n <ng-content />\n</div>\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon } from '../../icon/Icon';\nimport type { IconName } from '../../icon/icon-name';\n\nexport interface SectionNavSubsectionData {\n key: string;\n label: string;\n icon: IconName;\n disabled?: boolean;\n}\n\n/**\n * Ítem de nivel superior de `kf-section-nav`: header clickeable (ícono\n * identificador opcional + label + chevron) que expande/colapsa contenido\n * proyectado. La exclusividad entre ítems la decide quien consume el\n * componente — cada click solo emite `toggled` y el padre resuelve qué\n * ítem queda `active`, igual que `kf-folder-tabs` con `value`.\n *\n * `subsections` agrega un segundo nivel de navegación DENTRO del ítem\n * (solo visible cuando el ítem está `active`), cada uno con su propio\n * estado activo (`activeSubsection`) independiente del padre. El contenido\n * de cada sub-ítem se proyecta envolviéndolo en `<kf-section-nav-subsection\n * key=\"...\">` dentro del mismo slot por defecto — ver esa clase.\n *\n * El contenido proyectado usa `[hidden]`, no `@if`: un ítem puede envolver\n * un formulario con estado que el usuario ya completó, y colapsar/expandir\n * (o cruzar el breakpoint propio de 1024px, ver `SectionNav.scss`) no debe\n * destruir ese subárbol.\n *\n * <kf-section-nav-item\n * label=\"Mis datos personales\"\n * icon=\"user\"\n * [active]=\"openSection() === 'datos'\"\n * (toggled)=\"openSection.set('datos')\"\n * >\n * ...\n * </kf-section-nav-item>\n */\n@Component({\n selector: 'kf-section-nav-item',\n imports: [Icon],\n templateUrl: './SectionNavItem.html',\n styleUrl: './SectionNavItem.scss',\n})\nexport class SectionNavItem {\n readonly label = input.required<string>();\n readonly icon = input<IconName>();\n readonly active = input(false, { transform: booleanAttribute });\n readonly toggled = output<void>();\n\n /** Sub-ítems navegables de este ítem, visibles solo mientras `active()`. */\n readonly subsections = input<SectionNavSubsectionData[]>([]);\n /** `key` del sub-ítem actualmente activo — ver `SectionNavSubsectionData`. */\n readonly activeSubsection = input<string>();\n readonly subsectionSelected = output<string>();\n\n protected readonly showSubsections = computed(\n () => this.subsections().length > 0 && this.active(),\n );\n\n protected onSubsectionClick(key: string, disabled: boolean | undefined, event: MouseEvent): void {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n this.subsectionSelected.emit(key);\n }\n}\n","<button\n type=\"button\"\n class=\"kf-section-nav-item__header\"\n [class.kf-section-nav-item__header--active]=\"active()\"\n [attr.aria-expanded]=\"active()\"\n (click)=\"toggled.emit()\"\n>\n <kf-icon\n class=\"kf-section-nav-item__chevron kf-section-nav-item__chevron--desktop\"\n name=\"chevron-right\"\n size=\"sm\"\n />\n @if (icon(); as iconName) {\n <kf-icon class=\"kf-section-nav-item__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-section-nav-item__label\">{{ label() }}</span>\n <kf-icon\n class=\"kf-section-nav-item__chevron kf-section-nav-item__chevron--mobile\"\n name=\"chevron-down\"\n size=\"sm\"\n />\n</button>\n\n@if (showSubsections()) {\n <div class=\"kf-section-nav-item__subsections\" role=\"group\" [attr.aria-label]=\"label()\">\n @for (sub of subsections(); track sub.key) {\n <button\n type=\"button\"\n class=\"kf-section-nav-item__subsection\"\n [class.kf-section-nav-item__subsection--active]=\"activeSubsection() === sub.key\"\n [disabled]=\"!!sub.disabled\"\n [attr.aria-current]=\"activeSubsection() === sub.key ? 'true' : null\"\n (click)=\"onSubsectionClick(sub.key, sub.disabled, $event)\"\n >\n <kf-icon [name]=\"sub.icon\" size=\"sm\" />\n <span>{{ sub.label }}</span>\n </button>\n }\n </div>\n}\n\n<div class=\"kf-section-nav-item__content\" [hidden]=\"!active()\">\n <ng-content />\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { SectionNavItem } from './SectionNavItem';\n\n/**\n * Envoltorio de contenido para UN sub-ítem de `kf-section-nav-item`. Varios\n * pueden proyectarse juntos, uno por `key` de `subsections()` del padre —\n * cada uno queda montado siempre (mismo criterio `[hidden]` que el propio\n * `kf-section-nav-item`), y solo se muestra el que coincide con\n * `activeSubsection()` del padre.\n *\n * <kf-section-nav-item [subsections]=\"subs\" [activeSubsection]=\"active()\" ...>\n * <kf-section-nav-subsection key=\"general\"><app-general /></kf-section-nav-subsection>\n * <kf-section-nav-subsection key=\"seguridad\"><app-seguridad /></kf-section-nav-subsection>\n * </kf-section-nav-item>\n */\n@Component({\n selector: 'kf-section-nav-subsection',\n template: `<ng-content />`,\n host: {\n '[hidden]': '!isActive()',\n },\n})\nexport class SectionNavSubsection {\n readonly key = input.required<string>();\n\n private readonly parent = inject(SectionNavItem);\n\n protected readonly isActive = computed(() => this.parent.activeSubsection() === this.key());\n}\n","import { Component, computed, input, output } from '@angular/core';\n\nexport interface SegmentedOption {\n value: string;\n label: string;\n}\n\n/**\n * Control de segmentos relleno, tipo \"iOS segmented control\": 2-3 opciones\n * con un thumb que se desliza detrás de la opción activa.\n *\n * La posición del thumb se resuelve con una variable CSS (--kf-segmented-index)\n * y `transform: translateX()`, así la transición queda a cargo de CSS puro\n * (mismo criterio que Tabs), sin medir el DOM desde TypeScript.\n *\n * <kf-segmented [options]=\"options\" [value]=\"value\" (valueChange)=\"onChange($event)\" />\n */\n@Component({\n selector: 'kf-segmented',\n templateUrl: './Segmented.html',\n styleUrl: './Segmented.css',\n})\nexport class Segmented {\n readonly options = input.required<SegmentedOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n /** Índice de la opción activa; -1 si `value` no matchea ninguna opción. */\n readonly selectedIndex = computed(() =>\n this.options().findIndex((option) => option.value === this.value()),\n );\n\n select(nextValue: string): void {\n if (nextValue === this.value()) {\n return;\n }\n this.valueChange.emit(nextValue);\n }\n}\n","<div class=\"kf-segmented__track\" [style.--kf-segmented-count]=\"options().length\">\n <div\n class=\"kf-segmented__thumb\"\n [style.--kf-segmented-index]=\"selectedIndex()\"\n [style.visibility]=\"selectedIndex() === -1 ? 'hidden' : 'visible'\"\n ></div>\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n class=\"kf-segmented__option\"\n [class.kf-segmented__option--active]=\"option.value === value()\"\n [attr.aria-pressed]=\"option.value === value()\"\n (click)=\"select(option.value)\"\n >\n {{ option.label }}\n </button>\n }\n</div>\n","import { Component, input, output } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface SelectableCardOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Radio group real (`role=\"radiogroup\"` + `role=\"radio\"` + `aria-checked`),\n * con apariencia de cards apiladas verticalmente — para una decisión ÚNICA Y\n * EXCLUYENTE dentro de un flujo (ej. método de pago, tipo de documento a\n * subir), no para filtrar una lista.\n *\n * Distinto de `kf-filter-chips` a propósito: `FilterChips` es semántica y\n * visualmente un FILTRO (chips horizontales, se resaltan con `--kf-color-ink`\n * — pensado para \"Todos/Activos/Archivados\" sobre una lista, donde elegir\n * una opción cambia qué se MUESTRA). Acá la elección es la respuesta misma\n * a una pregunta del flujo (\"¿con qué método pagás?\"), no un filtro — por\n * eso necesita affordance de radio (círculo con punto, más peso visual por\n * opción) en vez de un pill de filtro reciclado.\n *\n * Réplica fiel del patrón ya resuelto en el Design System de referencia\n * (`otd-pagos.jsx` / `otd.css`: `.otd-pay-method` + `.radio`) — apilado\n * vertical con gap 10px, radio de 18px con punto interno vía `::after`,\n * borde+fondo+ícono cambian de color al seleccionar. Se agrega manejo de\n * teclado (flechas arriba/abajo, Home/End) y `:focus-visible` real, ninguno\n * de los dos presentes en el mockup original — mínimos de accesibilidad que\n * no dependen de fidelidad visual al mockup.\n *\n * <kf-selectable-card-group\n * [options]=\"[{ value: 'card', label: 'Tarjeta', icon: 'credit-card' }]\"\n * [value]=\"method()\"\n * (valueChange)=\"method.set($event)\"\n * />\n */\n@Component({\n selector: 'kf-selectable-card-group',\n imports: [Icon],\n templateUrl: './SelectableCardGroup.html',\n styleUrl: './SelectableCardGroup.css',\n})\nexport class SelectableCardGroup {\n readonly options = input.required<SelectableCardOption[]>();\n readonly value = input<string>('');\n /** Accesible: describe qué está eligiendo el usuario (ej. \"Método de pago\"). */\n readonly ariaLabel = input.required<string>();\n\n readonly valueChange = output<string>();\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(\n event,\n this.options(),\n currentValue,\n 'kf-selectable-card-',\n (value) => this.select(value),\n 'vertical',\n );\n }\n}\n","<div class=\"kf-selectable-card-group\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-selectable-card-group__option\"\n [class.kf-selectable-card-group__option--selected]=\"option.value === value()\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-selectable-card-' + option.value\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n <span class=\"kf-selectable-card-group__radio\" aria-hidden=\"true\"></span>\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-selectable-card-group__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-selectable-card-group__label\">{{ option.label }}</span>\n </button>\n }\n</div>\n","import { Component, booleanAttribute, input } from '@angular/core';\nimport { Icon } from '../../icon/Icon';\nimport type { IconName } from '../../icon/icon-name';\nimport { TooltipDirective } from '../../tooltip/Tooltip';\n\n/** Contrato de datos de `kf-sidebar-shell.navItems`. `icon` es requerido:\n * en el sidebar persistente el ícono es parte permanente del diseño.\n * `groupLabel` opcional agrupa ítems consecutivos bajo un separador con\n * título (ej. \"Beneficios\", \"Documentos\") — ver `SidebarShell` para cómo\n * decide cuándo pintar el separador. Ausente en items sin agrupar (el\n * caso de siempre, retrocompatible con cualquier consumidor existente). */\nexport interface SidebarNavItemData {\n icon: IconName;\n label: string;\n href: string;\n active?: boolean;\n groupLabel?: string;\n}\n\n/**\n * Ítem de navegación interno de `kf-sidebar-shell` — ícono + label en fila,\n * estado activo. `collapsed` oculta el label y centra el ícono, controlado\n * por el propio shell. No sabe nada de routing: emite `href` como\n * cualquier link, el consumidor intercepta el click.\n *\n * Colapsado, el link solo muestra el ícono: su nombre accesible sale de\n * `aria-label` = `label` (el tooltip es solo visual y no nombra el link).\n */\n@Component({\n selector: 'kf-sidebar-nav-item',\n imports: [Icon, TooltipDirective],\n templateUrl: './SidebarNavItem.html',\n styleUrl: './SidebarNavItem.css',\n})\nexport class SidebarNavItem {\n readonly icon = input.required<IconName>();\n readonly label = input.required<string>();\n readonly href = input.required<string>();\n readonly active = input(false, { transform: booleanAttribute });\n readonly collapsed = input(false, { transform: booleanAttribute });\n}\n","<a\n class=\"kf-sidebar-nav-item\"\n [class.kf-sidebar-nav-item--active]=\"active()\"\n [class.kf-sidebar-nav-item--collapsed]=\"collapsed()\"\n [href]=\"href()\"\n [attr.aria-current]=\"active() ? 'page' : null\"\n [attr.aria-label]=\"collapsed() ? label() : null\"\n [kfTooltip]=\"collapsed() ? label() : ''\"\n>\n <kf-icon [name]=\"icon()\" size=\"md\" />\n @if (!collapsed()) {\n <span class=\"kf-sidebar-nav-item__label\">{{ label() }}</span>\n }\n</a>\n","import { Component, HostListener, computed, input, model, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { matchMediaSignal } from '@kaufmann-lab/ui/shared';\nimport { SidebarNavItem } from './sidebar-nav-item/SidebarNavItem';\nimport type { SidebarNavItemData } from './sidebar-nav-item/SidebarNavItem';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\nconst MOBILE_BREAKPOINT_QUERY = '(max-width: 900px)';\n\n/**\n * Shell de layout con navegación lateral persistente — el complemento\n * vertical de `kf-portal-header` (navbar horizontal). Pensado para\n * portales tipo \"aplicación interna\" (Portal OTD, Servicio Star).\n *\n * `navItems` se recibe como array de datos (no como contenido proyectado):\n * el componente no sabe nada de routing, emite `navItemClick` con el ítem\n * clickeado y deja que el consumidor decida cómo navegar.\n *\n * Slots: `[kf-sidebar-brand]` (logo del rail expandido, visible en desktop\n * y en el panel mobile — es el MISMO rail), `[kf-sidebar-brand-collapsed]`\n * (reemplazo opcional cuando el rail está colapsado en desktop),\n * `[kf-sidebar-brand-mobile]` (logo de la topbar angosta de mobile, fondo\n * claro) y `[kf-sidebar-footer]` (tarjeta de usuario / acciones al pie).\n *\n * Botón de colapso: vive como último ítem de la propia lista de\n * navegación, no flotando en el borde del rail — mismo criterio de\n * tap-target grande y predecible que el resto de los ítems.\n *\n * Responsive: bajo los 900px el sidebar NO se reemplaza por un panel\n * distinto — es el MISMO rail el que pasa a `position: fixed` fuera de la\n * pantalla (`translateX(-100%)`) y se desliza a la vista (`translateX(0)`)\n * sobre un backdrop cuando `mobileOpen` es `true`. Una topbar angosta con\n * botón de hamburguesa reemplaza al rail en el flujo del documento\n * mientras el panel está cerrado.\n *\n * A propósito NO reutiliza `kf-drawer` (el panel lateral genérico de la\n * librería): `kf-drawer` tiene su propio fondo claro fijo, incompatible\n * con el texto claro de `kf-sidebar-nav-item` (pensado para el gradiente\n * oscuro), y duplicaría el árbol de navegación en un segundo lugar del\n * DOM. Acá hay un solo rail, un solo árbol de nav, que cambia de posición\n * según el viewport.\n */\n@Component({\n selector: 'kf-sidebar-shell',\n imports: [Icon, SidebarNavItem, TooltipDirective],\n templateUrl: './SidebarShell.html',\n styleUrl: './SidebarShell.scss',\n})\nexport class SidebarShell {\n /** Ítems del menú del rail. */\n readonly navItems = input<SidebarNavItemData[]>([]);\n\n /**\n * `navItems()` con el separador de grupo resuelto: solo el PRIMER ítem\n * de cada tramo consecutivo con el mismo `groupLabel` lo pinta — así el\n * consumidor no tiene que calcular a mano \"es el primero de su grupo\"\n * ni repetir el label en cada ítem. Un ítem sin `groupLabel` nunca pinta\n * separador (retrocompatible: un `navItems` sin la propiedad se\n * comporta exactamente igual que antes).\n */\n protected readonly itemsWithGroupHeader = computed(() => {\n let previousGroupLabel: string | undefined;\n return this.navItems().map((item) => {\n const showGroupLabel = !!item.groupLabel && item.groupLabel !== previousGroupLabel;\n previousGroupLabel = item.groupLabel;\n return { item, showGroupLabel };\n });\n });\n\n /** Estado de colapso del rail en desktop, two-way. Sin efecto bajo los 900px (ver estilos). */\n readonly collapsed = model(false);\n\n /** Visibilidad del rail deslizado como panel en mobile, two-way. */\n readonly mobileOpen = model(false);\n\n /** Se emite al clickear un ítem — el consumidor decide cómo navegar (ej. `router.navigateByUrl`). */\n readonly navItemClick = output<SidebarNavItemData>();\n\n /** `true` bajo los 900px. */\n private readonly isMobileViewport = matchMediaSignal(MOBILE_BREAKPOINT_QUERY);\n\n /**\n * Estado de colapso EFECTIVO — el que ya considera el viewport, no el\n * `collapsed` crudo. Es lo que usa el propio rail para sus nav-items y\n * el botón de colapso; se expone público para que el consumidor le\n * pase el mismo valor a lo que proyecte en `[kf-sidebar-footer]` (ej.\n * `kf-drawer-session`) — así un footer proyectado no queda colapsado\n * dentro del panel deslizado de mobile mientras el resto del rail ya\n * muestra todo expandido.\n */\n readonly itemsCollapsed = computed(() => this.collapsed() && !this.isMobileViewport());\n\n /** Cierra el panel mobile con Escape — mismo criterio que `Dropdown`/`Modal`/`Drawer`. */\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n this.mobileOpen.set(false);\n }\n\n protected onNavItemClick(event: Event, item: SidebarNavItemData): void {\n event.preventDefault();\n this.mobileOpen.set(false);\n this.navItemClick.emit(item);\n }\n}\n","@if (mobileOpen()) {\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__backdrop\"\n aria-label=\"Cerrar menú\"\n (click)=\"mobileOpen.set(false)\"\n ></button>\n}\n\n<aside\n class=\"kf-sidebar-shell__rail\"\n [class.kf-sidebar-shell__rail--collapsed]=\"itemsCollapsed()\"\n [class.kf-sidebar-shell__rail--mobile-open]=\"mobileOpen()\"\n>\n <div class=\"kf-sidebar-shell__brand\">\n <div class=\"kf-sidebar-shell__brand-full\">\n <ng-content select=\"[kf-sidebar-brand]\" />\n </div>\n <div class=\"kf-sidebar-shell__brand-collapsed\">\n <ng-content select=\"[kf-sidebar-brand-collapsed]\" />\n </div>\n\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__mobile-close\"\n aria-label=\"Cerrar menú\"\n (click)=\"mobileOpen.set(false)\"\n >\n <kf-icon name=\"x\" size=\"md\" />\n </button>\n </div>\n\n <nav class=\"kf-sidebar-shell__nav\">\n @for (entry of itemsWithGroupHeader(); track entry.item.href) {\n @if (entry.showGroupLabel && !itemsCollapsed()) {\n <div class=\"kf-sidebar-shell__group-label\">{{ entry.item.groupLabel }}</div>\n }\n <kf-sidebar-nav-item\n [icon]=\"entry.item.icon\"\n [label]=\"entry.item.label\"\n [href]=\"entry.item.href\"\n [active]=\"!!entry.item.active\"\n [collapsed]=\"itemsCollapsed()\"\n (click)=\"onNavItemClick($event, entry.item)\"\n />\n }\n </nav>\n\n <div class=\"kf-sidebar-shell__bottom\">\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__collapse-toggle\"\n [class.kf-sidebar-shell__collapse-toggle--collapsed]=\"itemsCollapsed()\"\n [attr.aria-expanded]=\"!collapsed()\"\n [attr.aria-label]=\"collapsed() ? 'Expandir menú' : 'Colapsar menú'\"\n [kfTooltip]=\"itemsCollapsed() ? (collapsed() ? 'Expandir menú' : 'Colapsar menú') : ''\"\n (click)=\"collapsed.set(!collapsed())\"\n >\n <kf-icon [name]=\"collapsed() ? 'chevron-right' : 'chevron-left'\" size=\"sm\" />\n @if (!itemsCollapsed()) {\n <span class=\"kf-sidebar-shell__collapse-toggle-label\">\n {{ collapsed() ? 'Expandir menú' : 'Colapsar menú' }}\n </span>\n }\n </button>\n\n <div class=\"kf-sidebar-shell__footer\">\n <ng-content select=\"[kf-sidebar-footer]\" />\n </div>\n </div>\n</aside>\n\n<div class=\"kf-sidebar-shell__topbar\">\n <button\n type=\"button\"\n class=\"kf-sidebar-shell__menu-toggle\"\n aria-label=\"Abrir menú de navegación\"\n (click)=\"mobileOpen.set(true)\"\n >\n <kf-icon name=\"menu\" size=\"md\" />\n </button>\n <div class=\"kf-sidebar-shell__topbar-brand\">\n <ng-content select=\"[kf-sidebar-brand-mobile]\" />\n </div>\n</div>\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Link } from '../link/Link';\n\n/** Vocabulario semántico único de tono, compartido con `TextTone`. */\nexport type StatTileTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\nexport type StatTileVariant = 'inline' | 'card';\n\nconst INTERACTIVE_CONTENT =\n 'a, button, input, select, textarea, label, [tabindex], ' +\n '[role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"]';\n\n/**\n * Indicador numérico compacto: label + valor grande con ícono, para grillas\n * densas de KPIs. Con `cta` en vez de `value` se convierte en un bloque de\n * llamada a la acción (título, descripción y link, sin tono ni número).\n * `variant=\"inline\"` quita fondo/borde para una fila horizontal donde el\n * consumidor pone sus propios separadores.\n *\n * `hasProjectedValue` reemplaza el valor de texto por contenido proyectado\n * (`[valueContent]`) cuando el dato no es un número/string medido — el\n * caso típico es un estado con su propio `kf-badge`, que necesita su\n * tono/dot propios en vez del tono del tile:\n *\n * <kf-stat-tile label=\"Estado\" hasProjectedValue>\n * <kf-badge valueContent [tone]=\"stateTone()\">{{ stateLabel() }}</kf-badge>\n * </kf-stat-tile>\n *\n * `interactive` convierte el tile en un botón (`role=\"button\"`, enfocable,\n * Enter y Espacio) que emite `tileClick`: para un KPI que filtra o despliega\n * algo. El click sobre un control proyectado dentro del tile (link, botón,\n * campo) no emite `tileClick`; el de texto común sí. `pressed`\n * (`aria-pressed`) lo vuelve un botón de alternancia, útil como filtro; `expanded` (`aria-expanded`) indica que controla un panel\n * desplegable. Ambos son `boolean | null`: `null` (default) no emite el\n * atributo. El estado `pressed` se marca con un borde y el anillo\n * `--kf-stat-tile-ring`; el foco de teclado usa `--kf-shadow-focus`. Sin\n * `interactive` el tile se comporta exactamente como antes (los demás inputs\n * se ignoran), y con `cta` tampoco aplica: ya contiene su propio link.\n *\n * Distinto de `kf-stat-card` (`clickable` + `pressed`): esa card tiene el\n * ícono circular a la izquierda y un chevron; el tile conserva label arriba,\n * ícono a la derecha, valor y nota, y suma `expanded`.\n *\n * <kf-stat-tile interactive label=\"En ruta\" value=\"12\" icon=\"truck\"\n * [pressed]=\"filter() === 'route'\" (tileClick)=\"toggleFilter('route')\" />\n */\n@Component({\n selector: 'kf-stat-tile',\n imports: [Icon, Link],\n templateUrl: './StatTile.html',\n styleUrl: './StatTile.css',\n host: {\n '[class.kf-stat-tile--cta]': 'cta()',\n '[class.kf-stat-tile--inline]': '!cta() && variant() === \"inline\"',\n '[class.kf-stat-tile--interactive]': 'isInteractive()',\n '[attr.role]': 'isInteractive() ? \"button\" : null',\n '[attr.tabindex]': 'isInteractive() ? 0 : null',\n '[attr.aria-pressed]': 'isInteractive() ? pressed() : null',\n '[attr.aria-expanded]': 'isInteractive() ? expanded() : null',\n '(click)': 'onActivate($event)',\n '(keydown)': 'onKeydown($event)',\n '(keyup)': 'onKeyup($event)',\n },\n})\nexport class StatTile {\n readonly cta = input(false, { transform: booleanAttribute });\n // Variante numérica\n readonly label = input<string>();\n readonly value = input<string | number>();\n readonly icon = input<IconName>();\n readonly variant = input<StatTileVariant>('card');\n readonly tone = input<StatTileTone>('neutral');\n\n /** Tercera línea bajo el valor. Vacía cae en `notePlaceholder`. */\n readonly note = input<string | null>();\n\n /** Qué dice la tercera línea cuando no hay nota. Cada consumidor debería\n * pasar el motivo real de SU dato ausente, no un texto genérico. */\n readonly notePlaceholder = input<string>();\n\n /** Rinde el valor como ausencia, no como dato medido. */\n readonly valueMissing = input(false, { transform: booleanAttribute });\n\n /** El valor es contenido proyectado (`<ng-content select=\"[valueContent]\">`,\n * ej. un `kf-badge` de estado) en vez del texto de `value()` — para un\n * dato cuya representación natural no es un número/string medido. */\n readonly hasProjectedValue = input(false, { transform: booleanAttribute });\n\n // Variante CTA\n readonly title = input<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n\n /**\n * Click en el link de la variante CTA. Incluye el `MouseEvent` para que un\n * consumidor con router pueda cortar la navegación nativa — mismo patrón\n * que `actionClick` de `kf-panel`, sin depender de `@angular/router`.\n */\n readonly actionClick = output<MouseEvent>();\n\n /** Convierte el tile en un botón; ver la descripción de la clase. */\n readonly interactive = input(false, { transform: booleanAttribute });\n /** Estado de alternancia (`aria-pressed`); `null` = no aplica. */\n readonly pressed = input<boolean | null>(null);\n /** El tile controla un panel (`aria-expanded`); `null` = no aplica. */\n readonly expanded = input<boolean | null>(null);\n /** Activación del tile interactivo: click, Enter o Espacio. */\n readonly tileClick = output<void>();\n\n /** La variante CTA ya tiene su propio link: no puede ser además un botón. */\n protected readonly isInteractive = computed(() => this.interactive() && !this.cta());\n\n /** Texto real de la nota. `null` significa \"no reservar la línea\": pasa\n * solo cuando el consumidor no declaró ni nota ni placeholder. */\n protected readonly noteText = computed(() => this.note() || this.notePlaceholder() || null);\n\n protected onActivate(event: MouseEvent): void {\n if (this.isInteractive() && !this.isFromProjectedControl(event)) {\n this.tileClick.emit();\n }\n }\n\n /**\n * Un control proyectado dentro del tile (link, botón, campo…) tiene su\n * propia acción: su click no debe contar como activar el tile. El texto o\n * los spans comunes sí activan, por eso se busca el control con `closest`\n * y no se compara `target` con `currentTarget`.\n */\n private isFromProjectedControl(event: MouseEvent): boolean {\n const host = event.currentTarget as HTMLElement;\n const target = event.target;\n if (!(target instanceof Element)) {\n return false;\n }\n const control = target.closest(INTERACTIVE_CONTENT);\n return !!control && control !== host && host.contains(control);\n }\n\n /**\n * Teclado de un botón nativo: Enter activa al presionar y Espacio al soltar\n * (en `keydown` solo se frena el scroll de la página). Solo cuenta cuando el\n * foco está en el propio tile, no en contenido proyectado dentro de él.\n */\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.isInteractive() || event.target !== event.currentTarget) {\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n this.tileClick.emit();\n } else if (event.key === ' ') {\n event.preventDefault();\n }\n }\n\n protected onKeyup(event: KeyboardEvent): void {\n if (this.isInteractive() && event.target === event.currentTarget && event.key === ' ') {\n this.tileClick.emit();\n }\n }\n\n protected readonly noteIsPlaceholder = computed(() => !this.note() && !!this.notePlaceholder());\n}\n","@if (cta()) {\n <span class=\"kf-stat-tile__cta-title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-stat-tile__cta-description\">{{ description() }}</span>\n }\n @if (actionLabel()) {\n <kf-link\n class=\"kf-stat-tile__cta-action\"\n [href]=\"actionHref() || '#'\"\n showArrow\n (click)=\"actionClick.emit($event)\"\n >\n {{ actionLabel() }}\n </kf-link>\n }\n} @else {\n <div class=\"kf-stat-tile__head\">\n <!-- El label recibe la clase de tone además del value: juntos forman\n una sola unidad de lectura, y pintar solo el número la rompería. -->\n <span\n class=\"kf-stat-tile__label\"\n [class.kf-stat-tile__label--ok]=\"tone() === 'ok'\"\n [class.kf-stat-tile__label--warn]=\"tone() === 'warn'\"\n [class.kf-stat-tile__label--error]=\"tone() === 'error'\"\n [class.kf-stat-tile__label--info]=\"tone() === 'info'\"\n >{{ label() }}</span\n >\n @if (icon(); as iconName) {\n <span class=\"kf-stat-tile__icon\">\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n </span>\n }\n </div>\n @if (hasProjectedValue()) {\n <!-- Slot para un valor que no es texto medido (ej. un `kf-badge` de\n estado) — mismo bloque `__value`, sin las clases de tono, que en ese\n caso las resuelve el propio contenido proyectado (el badge trae su\n tono). -->\n <span class=\"kf-stat-tile__value kf-stat-tile__value--projected\">\n <ng-content select=\"[valueContent]\" />\n </span>\n } @else {\n <span\n class=\"kf-stat-tile__value\"\n [class.kf-stat-tile__value--ok]=\"tone() === 'ok'\"\n [class.kf-stat-tile__value--warn]=\"tone() === 'warn'\"\n [class.kf-stat-tile__value--error]=\"tone() === 'error'\"\n [class.kf-stat-tile__value--info]=\"tone() === 'info'\"\n [class.kf-stat-tile__value--missing]=\"valueMissing()\"\n >{{ value() }}</span\n >\n }\n\n <!-- La línea se reserva con o sin nota: un tile más corto desalinea la\n fila. El `title` deja disponible el texto completo, recortado a 2 líneas. -->\n @if (noteText(); as note) {\n <span\n class=\"kf-stat-tile__note\"\n [class.kf-stat-tile__note--empty]=\"noteIsPlaceholder()\"\n [title]=\"note\"\n >{{ note }}</span\n >\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Pill con borde, en mayúsculas y con letter-spacing, pensada para indicadores\n * de estado únicos y prominentes (ej. \"ESTADO TÉCNICO\"). El fondo es siempre\n * transparente; el color de borde/texto/punto depende de `tone`.\n *\n * <kf-status-pill tone=\"ok\">Operativo</kf-status-pill>\n * <kf-status-pill tone=\"error\" dot>Fuera de servicio</kf-status-pill>\n */\n@Component({\n selector: 'kf-status-pill',\n templateUrl: './StatusPill.html',\n styleUrl: './StatusPill.css',\n})\nexport class StatusPill {\n readonly tone = input<'blue' | 'ok' | 'warn' | 'error'>('blue');\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","<span class=\"kf-status-pill\" [class]=\"'kf-status-pill--' + tone()\">\n @if (dot()) {\n <span class=\"kf-status-pill__dot\"></span>\n }\n <ng-content />\n</span>\n","import {\n Component,\n booleanAttribute,\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 SwitchSize = 'sm' | 'md';\n\n/**\n * Interruptor de activar/desactivar con efecto inmediato (preferencias,\n * ajustes). Para elegir opciones dentro de un formulario que se envía al\n * final, usar `kf-checkbox`.\n *\n * Es un `<button role=\"switch\" aria-checked>`: el lector de pantalla anuncia\n * el estado con el propio rol, por eso no hay texto extra de \"activado\". Enter\n * y Espacio lo alternan como en cualquier botón.\n *\n * `label` es obligatorio: da el nombre accesible aunque no se vea. Con\n * `hideLabel` se oculta el texto y pasa a `aria-label`, para un interruptor\n * cuyo contexto ya lo explica la fila que lo contiene.\n *\n * `checked` es two-way (`model`). Implementa `ControlValueAccessor`, así que\n * también funciona con `formControlName`/`ngModel`; en ese modo `writeValue`\n * escribe en el mismo `checked`. `disabled` del input y el del formulario se\n * combinan: basta con que uno esté activo.\n *\n * `writeValue` (el formulario escribiendo el valor por código, ej.\n * `setValue`/`reset`) también emite `checkedChange`, porque escribe en el\n * `model`. Combinar `[(checked)]` con `formControlName`/`ngModel` en el mismo\n * switch hace que el valor llegue dos veces al consumidor: usar una sola de\n * las dos vías, o ignorar en el handler el eco que no cambia el valor.\n *\n * El color sale de roles (`--kf-color-primary` encendido,\n * `--kf-color-border-control` apagado) y el foco de `--kf-shadow-focus`; no\n * recibe colores.\n *\n * <kf-switch label=\"Fijar indicadores\" [(checked)]=\"pinned\" />\n * <kf-switch label=\"Mapa junto a la tabla\" hideLabel size=\"sm\" formControlName=\"splitMap\" />\n */\n@Component({\n selector: 'kf-switch',\n templateUrl: './Switch.html',\n styleUrl: './Switch.css',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Switch),\n multi: true,\n },\n ],\n})\nexport class Switch implements ControlValueAccessor {\n /** Nombre accesible y texto visible (salvo con `hideLabel`). */\n readonly label = input.required<string>();\n /** Oculta el texto y lo deja como `aria-label`. */\n readonly hideLabel = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly size = input<SwitchSize>('md');\n /** Estado encendido, two-way: `[(checked)]=\"pinned\"`. */\n readonly checked = model(false);\n\n private readonly disabledByForm = signal(false);\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n private onChangeFn: (value: boolean) => void = () => {};\n private onTouchedFn: () => void = () => {};\n\n protected toggle(): void {\n if (this.isDisabled()) {\n return;\n }\n const next = !this.checked();\n this.checked.set(next);\n this.onChangeFn(next);\n }\n\n protected onBlur(): void {\n this.onTouchedFn();\n }\n\n writeValue(value: boolean | null): void {\n this.checked.set(!!value);\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this.onChangeFn = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouchedFn = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledByForm.set(isDisabled);\n }\n}\n","<button\n type=\"button\"\n role=\"switch\"\n class=\"kf-switch\"\n [class.kf-switch--sm]=\"size() === 'sm'\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-label]=\"hideLabel() ? label() : null\"\n [disabled]=\"isDisabled()\"\n (click)=\"toggle()\"\n (blur)=\"onBlur()\"\n>\n <span class=\"kf-switch__track\" aria-hidden=\"true\">\n <span class=\"kf-switch__thumb\"></span>\n </span>\n @if (!hideLabel()) {\n <span class=\"kf-switch__label\">{{ label() }}</span>\n }\n</button>\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface TabOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Barra de tabs subrayada: un indicador se desliza hasta la pestaña activa.\n * La posición se mide (`offsetLeft`/`offsetWidth`) después de cada render,\n * ya que las pestañas tienen ancho de contenido variable.\n *\n * <kf-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-tabs',\n imports: [Icon],\n templateUrl: './Tabs.html',\n styleUrl: './Tabs.css',\n})\nexport class Tabs {\n readonly options = input.required<TabOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n private readonly track = viewChild.required<ElementRef<HTMLElement>>('track');\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly activeRect = signal<{ x: number; width: number } | null>(null);\n\n protected readonly indicatorTransform = computed(\n () => `translateX(${this.activeRect()?.x ?? 0}px)`,\n );\n protected readonly indicatorWidth = computed(() => this.activeRect()?.width ?? 0);\n\n constructor() {\n afterRenderEffect(() => {\n this.value();\n this.options();\n this.measure();\n });\n\n afterNextRender(() => {\n const observer = new ResizeObserver(() => this.measure());\n observer.observe(this.track().nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n private measure(): void {\n const active = this.track().nativeElement.querySelector<HTMLElement>('.kf-tabs__tab--active');\n this.activeRect.set(active ? { x: active.offsetLeft, width: active.offsetWidth } : null);\n }\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(event, this.options(), currentValue, 'kf-tab-', (value) =>\n this.select(value),\n );\n }\n}\n","<!--\n Sin aria-controls: a diferencia de kf-folder-tabs, este componente no\n renderiza ningún panel (ni propio ni proyectado) — es solo el selector\n visual, el WAI-ARIA Tabs Pattern exige que aria-controls apunte a un\n tabpanel real que exista en el DOM (ver la spec de tabs), y acá no hay\n ninguno que prometer.\n-->\n<div class=\"kf-tabs\" role=\"tablist\" #track>\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-tabs__tab\"\n [class.kf-tabs__tab--active]=\"option.value === value()\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-tab-' + option.value\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-tabs__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-tabs__label\">{{ option.label }}</span>\n </button>\n }\n <span\n class=\"kf-tabs__indicator\"\n aria-hidden=\"true\"\n [style.transform]=\"indicatorTransform()\"\n [style.width.px]=\"indicatorWidth()\"\n [style.opacity]=\"indicatorWidth() ? 1 : 0\"\n ></span>\n</div>\n","import { Component, Directive, computed, contentChild, input, output } from '@angular/core';\nimport { Icon, IconName } from '../../icon/Icon';\nimport { handleArrowKeyNavigation } from '@kaufmann-lab/ui/shared';\n\nexport interface FolderTabOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Marca el contenido que `kf-folder-tabs` debe proyectar dentro de su panel.\n *\n * <div kfFolderTabsPanel>...</div>\n */\n@Directive({ selector: '[kfFolderTabsPanel]' })\nexport class FolderTabsPanel {}\n\nlet nextFolderTabsId = 0;\n\n/**\n * Tabs con forma de \"carpeta\": borde superior redondeado, la pestaña activa\n * se funde visualmente con el panel de contenido de abajo. El panel\n * (`kfFolderTabsPanel`) es opcional — sin él, se renderiza solo la fila de\n * pestañas.\n *\n * <kf-folder-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\">\n * <div kfFolderTabsPanel>contenido de la pestaña activa</div>\n * </kf-folder-tabs>\n *\n * <!-- o, sin contenido: -->\n * <kf-folder-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-folder-tabs',\n imports: [Icon],\n templateUrl: './FolderTabs.html',\n styleUrl: './FolderTabs.css',\n})\nexport class FolderTabs {\n readonly options = input.required<FolderTabOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n /** Id del panel único — todos los tabs lo referencian vía `aria-controls`. */\n protected readonly panelId = `kf-folder-tabs-panel-${nextFolderTabsId++}`;\n\n private readonly projectedPanel = contentChild(FolderTabsPanel);\n protected readonly hasPanel = computed(() => this.projectedPanel() !== undefined);\n\n select(value: string): void {\n if (value === this.value()) {\n return;\n }\n this.valueChange.emit(value);\n }\n\n protected onKeydown(event: KeyboardEvent, currentValue: string): void {\n handleArrowKeyNavigation(event, this.options(), currentValue, 'kf-folder-tab-', (value) =>\n this.select(value),\n );\n }\n}\n","<div class=\"kf-folder-tabs\" role=\"tablist\">\n @for (option of options(); track option.value) {\n <button\n type=\"button\"\n role=\"tab\"\n class=\"kf-folder-tabs__tab\"\n [class.kf-folder-tabs__tab--active]=\"option.value === value()\"\n [attr.aria-selected]=\"option.value === value()\"\n [attr.tabindex]=\"option.value === value() ? 0 : -1\"\n [id]=\"'kf-folder-tab-' + option.value\"\n [attr.aria-controls]=\"panelId\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event, option.value)\"\n >\n @if (option.icon; as iconName) {\n <kf-icon class=\"kf-folder-tabs__icon\" [name]=\"iconName\" size=\"sm\" />\n }\n <span class=\"kf-folder-tabs__label\">{{ option.label }}</span>\n </button>\n }\n</div>\n\n<!--\n Panel único que cambia de contenido según el tab activo (no un panel por\n tab) — WAI-ARIA Tabs Pattern: todos los tabs apuntan a este mismo id vía\n aria-controls, y el panel apunta de vuelta al tab activo (no a todos) vía\n aria-labelledby, ya que solo ese tab describe el contenido visible ahora.\n-->\n<div\n class=\"kf-folder-tabs__panel\"\n [class.kf-folder-tabs__panel--empty]=\"!hasPanel()\"\n role=\"tabpanel\"\n [id]=\"panelId\"\n [attr.aria-labelledby]=\"'kf-folder-tab-' + value()\"\n>\n <ng-content select=\"[kfFolderTabsPanel]\" />\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { FieldLabel } from '../field-label/FieldLabel';\n\n/**\n * Textarea de formulario apilado: mismo patrón visual y de integración que\n * `kf-input` (label arriba, `ControlValueAccessor`, funciona con\n * `[(ngModel)]` y con Reactive Forms) para el caso de texto libre\n * multilínea (notas, comentarios, descripciones).\n *\n * <kf-textarea label=\"Notas\" formControlName=\"notes\" />\n * <kf-textarea label=\"Comentario\" [(ngModel)]=\"comment\" [minRows]=\"2\" [maxRows]=\"10\" />\n *\n * `minRows`/`maxRows` (3 y 6 por defecto) acotan el crecimiento: el campo\n * crece con el contenido pero nunca pasa de `maxRows` — superado ese tope el\n * contenido hace scroll interno (`overflow-y: auto`) en vez de seguir\n * empujando el layout. Reemplaza el `resize: vertical` nativo (deshabilitado\n * a propósito) porque un resize manual sin tope es exactamente el problema\n * que motivó este componente: un `<textarea>` a mano podía crecer hasta\n * tapar los botones del footer de un modal.\n *\n * <kf-textarea label=\"Detalle\" formControlName=\"detail\" [maxRows]=\"12\" />\n *\n * `invalid` + `errorMessage` y `readonly`/`disabled` siguen el mismo\n * contrato que `kf-input` — ver su JSDoc para la diferencia entre ambos\n * estados.\n */\n@Component({\n selector: 'kf-textarea',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, FieldLabel],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Textarea),\n multi: true,\n },\n ],\n templateUrl: './Textarea.html',\n styleUrl: './Textarea.css',\n})\nexport class Textarea implements ControlValueAccessor, AfterViewInit {\n private static nextId = 0;\n\n private readonly nativeTextarea =\n viewChild.required<ElementRef<HTMLTextAreaElement>>('nativeTextarea');\n\n readonly label = input<string>();\n /** Marca el label con un asterisco visual y aplica `required` al\n * `<textarea>` nativo — el atributo HTML ya expone el estado obligatorio a\n * lectores de pantalla (mapeo implícito a `aria-required`), sin necesidad\n * de un `aria-required` explícito redundante. */\n readonly required = input(false, { transform: booleanAttribute });\n readonly hint = input<string>();\n /** Borde y aria-invalid en rojo. Ver `errorMessage` para el mensaje asociado. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Mensaje de error con `role=\"alert\"` — reemplaza a `hint` mientras esté presente. */\n readonly errorMessage = input<string>();\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Ver JSDoc de `kf-input` para la diferencia con `disabled`. */\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly placeholder = input<string>('');\n /** Filas mínimas visibles en reposo — define la altura de arranque del campo. */\n readonly minRows = input(3);\n /** Filas máximas antes de que el contenido pase a scroll interno en vez de seguir creciendo. */\n readonly maxRows = input(6);\n\n protected readonly textareaId = `kf-textarea-${Textarea.nextId++}`;\n protected readonly hintId = `${this.textareaId}-hint`;\n protected readonly errorId = `${this.textareaId}-error`;\n\n protected readonly value = signal('');\n protected readonly focused = signal(false);\n /** Deshabilitado por Reactive Forms (formControl.disable()). */\n private readonly disabledByForm = signal(false);\n /** Disabled real: por input() directo o por el FormControl asociado. */\n protected readonly isDisabled = computed(() => this.disabled() || this.disabledByForm());\n\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngAfterViewInit(): void {\n // Mismo motivo que Input: el binding declarativo no siempre re-sincroniza\n // la propiedad DOM cuando el valor llega por writeValue() antes de que la\n // vista termine de inicializarse.\n this.nativeTextarea().nativeElement.value = this.value();\n this.adjustHeight();\n }\n\n writeValue(value: string): void {\n const nextValue = value ?? '';\n this.value.set(nextValue);\n const el = this.nativeTextarea?.();\n if (el) {\n el.nativeElement.value = nextValue;\n this.adjustHeight();\n }\n }\n\n registerOnChange(fn: (value: 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 protected onInput(rawValue: string): void {\n this.value.set(rawValue);\n this.onChange(rawValue);\n this.adjustHeight();\n }\n\n protected onBlur(): void {\n this.focused.set(false);\n this.onTouched();\n }\n\n /**\n * Recalcula la altura según el contenido real (`scrollHeight`), acotada\n * entre `minRows` y `maxRows` medidos con el line-height ya calculado del\n * propio elemento — así el tope se mantiene correcto sin importar qué\n * font-size/line-height termine aplicando cada tema. Superado `maxRows`\n * el resto del contenido hace scroll interno en vez de seguir creciendo.\n */\n private adjustHeight(): void {\n const el = this.nativeTextarea?.()?.nativeElement;\n if (!el) {\n return;\n }\n const styles = getComputedStyle(el);\n const lineHeight = parseFloat(styles.lineHeight) || 20;\n const verticalExtra =\n (parseFloat(styles.paddingTop) || 0) +\n (parseFloat(styles.paddingBottom) || 0) +\n (parseFloat(styles.borderTopWidth) || 0) +\n (parseFloat(styles.borderBottomWidth) || 0);\n const minHeight = lineHeight * this.minRows() + verticalExtra;\n const maxHeight = lineHeight * this.maxRows() + verticalExtra;\n\n el.style.height = 'auto';\n const nextHeight = Math.min(Math.max(el.scrollHeight, minHeight), maxHeight);\n el.style.height = `${nextHeight}px`;\n el.style.overflowY = el.scrollHeight > maxHeight ? 'auto' : 'hidden';\n }\n}\n","@if (label()) {\n <kf-field-label [for]=\"textareaId\" [required]=\"required()\">{{ label() }}</kf-field-label>\n}\n<textarea\n #nativeTextarea\n [id]=\"textareaId\"\n class=\"kf-textarea__control\"\n [class.kf-textarea__control--focused]=\"focused()\"\n [class.kf-textarea__control--invalid]=\"invalid()\"\n [class.kf-textarea__control--readonly]=\"readonly()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [attr.readonly]=\"readonly() ? true : null\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : hint() ? hintId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [value]=\"value()\"\n (input)=\"onInput(nativeTextarea.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\n></textarea>\n@if (errorMessage(); as message) {\n <span class=\"kf-textarea__error kf-field-error\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n} @else if (hint()) {\n <span class=\"kf-textarea__hint kf-field-hint\" [id]=\"hintId\">{{ hint() }}</span>\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\nimport { NgControl } from '@angular/forms';\n\n/**\n * Da forma al valor de un campo MIENTRAS el usuario escribe — ej.\n * inserta el guion de un RUT chileno automáticamente, sin que el\n * usuario tenga que tipearlo — reposicionando el cursor para que\n * seguir escribiendo se sienta natural (sin esto, cualquier inserción\n * de caracteres empuja el cursor al final del campo en cada tecla).\n *\n * Se aplica junto a `formControlName`/`[formControl]`/`[(ngModel)]`\n * sobre cualquier input que implemente `ControlValueAccessor` (incluye\n * `kf-input`, pero no depende de él — funciona igual sobre un\n * `<input>` nativo):\n *\n * <kf-input formControlName=\"documentId\" [kfFormatInput]=\"formatChileanRut\" />\n *\n * La función de formateo recibe el valor crudo tecleado y devuelve el\n * valor con forma — debe ser determinística e idempotente (aplicarla\n * dos veces seguidas da el mismo resultado), como `formatChileanRut`\n * en este mismo archivo (`./format.ts`).\n */\n@Directive({\n selector: '[kfFormatInput]',\n})\nexport class FormatInputDirective {\n private readonly ngControl = inject(NgControl, { self: true });\n\n /** La función de formateo a aplicar — sin valor, el directive no\n * hace nada (permite pasar `undefined` condicionalmente sin tener\n * que quitar el directive del template entero). */\n readonly kfFormatInput = input<((value: string) => string) | undefined>();\n\n @HostListener('input', ['$event'])\n protected onInput(event: Event): void {\n const format = this.kfFormatInput();\n if (!format) {\n return;\n }\n\n const target = event.target as HTMLInputElement | null;\n if (!target) {\n return;\n }\n\n const rawValue = target.value;\n const formatted = format(rawValue);\n if (formatted === rawValue) {\n return;\n }\n\n // Cuántos caracteres había ANTES del cursor en el valor crudo —\n // referencia para calcular dónde debería quedar el cursor después\n // de que el formateo cambie la longitud del string (ej. al\n // insertar el guion del RUT).\n const cursorFromStart = target.selectionStart ?? rawValue.length;\n const insertedLength = formatted.length - rawValue.length;\n const nextCursor = Math.max(0, cursorFromStart + insertedLength);\n\n this.ngControl.control?.setValue(formatted);\n target.value = formatted;\n target.setSelectionRange(nextCursor, nextCursor);\n }\n}\n","import { Component, input, numberAttribute } from '@angular/core';\n\n/**\n * Grilla de tiles que escalona columnas solo entre DIVISORES de `columns`\n * (4 → 2 → 1, nunca 3), para que ninguna fila quede huérfana. Mide el\n * contenedor (`container-type: inline-size`), no el viewport, porque el\n * mismo bloque se rinde tanto en un drawer angosto como en una página\n * completa bajo el mismo viewport.\n */\n@Component({\n selector: 'kf-tile-grid',\n templateUrl: './TileGrid.html',\n styleUrl: './TileGrid.css',\n host: {\n '[class]': '\"kf-tile-grid--\" + columns()',\n },\n})\nexport class TileGrid {\n /** Columnas en el ancho máximo. Se acota a 1-6: por encima de 6 un tile\n * deja de tener ancho para su propio label. */\n readonly columns = input(4, {\n transform: (value: unknown) => Math.min(6, Math.max(1, numberAttribute(value, 4))),\n });\n}\n","<!--\n El grid vive en un div interno y no en el `:host`: el host es el CONTENEDOR\n de consulta (`container-type: inline-size`), y una `@container` dentro de\n su propia hoja mediría el contenedor de más arriba, no a él mismo.\n-->\n<div class=\"kf-tile-grid\">\n <ng-content />\n</div>\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n} from '@angular/core';\nimport { Skeleton } from '../skeleton/Skeleton';\nimport { Text } from '../text/Text';\n\nexport interface TimeSlot {\n value: string;\n /** Texto visible; por defecto, `value`. */\n label?: string;\n disabled?: boolean;\n /** Los horarios con el mismo `group` se rinden juntos bajo esa etiqueta, en orden de aparición. */\n group?: string;\n}\n\nconst SKELETON_COUNT = 8;\n\n/**\n * Grilla de horarios seleccionables con semántica de radiogroup: un solo tab\n * stop, las flechas mueven y seleccionan (saltando los deshabilitados) y\n * Home/End van al primer/último horario habilitado.\n *\n * Si algún horario declara `group`, se rinde un subgrupo con etiqueta por\n * cada grupo distinto; si no, una sola grilla plana.\n *\n * <kf-time-slot-picker\n * ariaLabel=\"Horario\"\n * [slots]=\"[{ value: '09:00', group: 'Mañana' }, { value: '15:30', group: 'Tarde', disabled: true }]\"\n * [(value)]=\"time\"\n * [loading]=\"loadingSlots()\"\n * />\n */\n@Component({\n selector: 'kf-time-slot-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Skeleton, Text],\n templateUrl: './TimeSlotPicker.html',\n styleUrl: './TimeSlotPicker.css',\n})\nexport class TimeSlotPicker {\n private static nextId = 0;\n\n readonly slots = input.required<readonly TimeSlot[]>();\n readonly value = model<string | null>(null);\n readonly ariaLabel = input.required<string>();\n /** Muestra chips de carga en lugar de los horarios. */\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyLabel = input<string>('No hay horarios disponibles');\n\n private readonly host: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly idPrefix = `kf-time-slot-picker-${TimeSlotPicker.nextId++}`;\n\n protected readonly skeletons = Array.from({ length: SKELETON_COUNT }, (_, index) => index);\n\n protected readonly groups = computed(() => {\n const slots = this.slots();\n if (!slots.some((slot) => slot.group)) {\n return [{ id: `${this.idPrefix}-group-0`, label: null, slots }];\n }\n const byGroup = new Map<string, TimeSlot[]>();\n for (const slot of slots) {\n const key = slot.group ?? '';\n byGroup.set(key, [...(byGroup.get(key) ?? []), slot]);\n }\n return [...byGroup].map(([label, groupSlots], index) => ({\n id: `${this.idPrefix}-group-${index}`,\n label: label || null,\n slots: groupSlots as readonly TimeSlot[],\n }));\n });\n\n /** Valores habilitados en orden visual — la secuencia de navegación por teclado. */\n private readonly enabledValues = computed(() =>\n this.groups()\n .flatMap((group) => group.slots)\n .filter((slot) => !slot.disabled)\n .map((slot) => slot.value),\n );\n\n /** El único chip con `tabindex=\"0\"` (roving tabindex). */\n protected readonly tabStop = computed(() => {\n const values = this.enabledValues();\n const value = this.value();\n return value !== null && values.includes(value) ? value : (values[0] ?? null);\n });\n\n protected select(slot: TimeSlot): void {\n if (slot.disabled || this.loading() || slot.value === this.value()) {\n return;\n }\n this.value.set(slot.value);\n }\n\n protected onKeydown(event: KeyboardEvent, current: string): void {\n const values = this.enabledValues();\n const index = values.indexOf(current);\n if (index === -1) {\n return;\n }\n\n let nextIndex: number;\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n nextIndex = (index + 1) % values.length;\n break;\n case 'ArrowLeft':\n case 'ArrowUp':\n nextIndex = (index - 1 + values.length) % values.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = values.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n\n const next = values[nextIndex];\n this.value.set(next);\n // Se busca por dataset, no por id ni selector: los valores de horario son strings arbitrarios.\n Array.from(this.host.nativeElement.querySelectorAll<HTMLElement>('[data-value]'))\n .find((element) => element.dataset['value'] === next)\n ?.focus();\n }\n}\n","<div class=\"kf-time-slot-picker\" [attr.aria-busy]=\"loading() || null\">\n @if (loading()) {\n <div class=\"kf-time-slot-picker__grid\" aria-hidden=\"true\">\n @for (item of skeletons; track item) {\n <kf-skeleton variant=\"rect\" height=\"44px\" />\n }\n </div>\n } @else if (slots().length === 0) {\n <kf-text as=\"p\" variant=\"body-muted\">{{ emptyLabel() }}</kf-text>\n } @else {\n <div class=\"kf-time-slot-picker__groups\" role=\"radiogroup\" [attr.aria-label]=\"ariaLabel()\">\n @for (group of groups(); track group.id) {\n <div\n class=\"kf-time-slot-picker__group\"\n [attr.role]=\"group.label ? 'group' : null\"\n [attr.aria-labelledby]=\"group.label ? group.id : null\"\n >\n @if (group.label) {\n <span class=\"kf-time-slot-picker__group-label kf-overline-text\" [id]=\"group.id\">{{\n group.label\n }}</span>\n }\n <div class=\"kf-time-slot-picker__grid\">\n @for (slot of group.slots; track slot.value) {\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-time-slot-picker__slot\"\n [class.kf-time-slot-picker__slot--selected]=\"slot.value === value()\"\n [disabled]=\"slot.disabled\"\n [attr.aria-checked]=\"slot.value === value()\"\n [attr.tabindex]=\"slot.value === tabStop() ? 0 : -1\"\n [attr.data-value]=\"slot.value\"\n (click)=\"select(slot)\"\n (keydown)=\"onKeydown($event, slot.value)\"\n >\n {{ slot.label ?? slot.value }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n Injectable,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Visual tone of a toast. Maps to the state tokens in\n * projects/ui/src/tokens/base.css. `loading` has no auto-dismiss and shows an\n * indeterminate bar instead of a countdown — pair it with\n * {@link ToastService.promise}. It reuses the `info` tokens, the closest\n * semantic role to \"work in progress\".\n */\nexport type ToastTone = 'success' | 'error' | 'warning' | 'info' | 'loading';\n\n/** Fixed icon per tone (page 20 of the design system) — not configurable per call. */\nconst TOAST_ICON: Record<ToastTone, IconName> = {\n success: 'check-circle',\n error: 'alert-circle',\n warning: 'alert-triangle',\n info: 'bell',\n loading: 'bell',\n};\n\n/** Acción opcional (call-to-action) renderizada dentro del toast, junto al botón de cerrar. */\nexport interface ToastAction {\n /** Label corto, ej. \"Ver ticket\" — 1-3 palabras, el toast mide solo 360px de ancho. */\n label: string;\n /** Se invoca al hacer click; el toast se cierra solo después, sin que el llamador tenga que llamar `dismiss()`. */\n onClick: () => void;\n}\n\n/** Options for {@link ToastService.show}. */\nexport interface ToastOptions {\n /** Color tone. Defaults to `'info'`. */\n tone?: ToastTone;\n /**\n * Milliseconds before auto-dismiss. Ignored when `tone` is `'loading'`. When\n * omitted it depends on the tone (see {@link TOAST_DEFAULT_DURATION_MS}):\n * `2800` for `success`/`info`, `5000` for `warning`, `8000` for `error`. An\n * explicit value always wins over the per-tone default.\n */\n duration?: number;\n /** Botón de acción opcional, ej. ir al registro sobre el que avisa el toast. */\n action?: ToastAction;\n}\n\n/** Messages for each leg of {@link ToastService.promise}. */\nexport interface ToastPromiseMessages<T = unknown> {\n loading?: string;\n success?: string | ((value: T) => string);\n error?: string | ((error: unknown) => string);\n}\n\n/** The single active toast, as rendered by `kf-toast-host`. */\nexport interface ToastState {\n id: number;\n message: string;\n tone: ToastTone;\n duration: number;\n leaving: boolean;\n action?: ToastAction;\n}\n\nconst DEFAULT_DURATION_MS = 2800;\n\n/**\n * Auto-dismiss time per tone when the caller doesn't pass `duration`. Errors and\n * warnings stay longer than confirmations: they carry something to read and\n * act on, while a success only has to be noticed. `success`/`info` keep the\n * historical 2800ms. `loading` never auto-dismisses.\n */\nexport const TOAST_DEFAULT_DURATION_MS: Readonly<Record<Exclude<ToastTone, 'loading'>, number>> = {\n success: DEFAULT_DURATION_MS,\n info: DEFAULT_DURATION_MS,\n warning: 5000,\n error: 8000,\n};\nconst EXIT_ANIMATION_MS = 200;\n\n/** What's currently holding the auto-dismiss timer paused. Tracked as a set so hover and\n * focus can overlap (e.g. mouse leaves while focus is still on the action button) without\n * resuming the timer early. */\ntype ToastPauseSource = 'hover' | 'focus';\n\n/**\n * Shows one toast at a time — a new `show()` call replaces whatever is\n * currently up (this mirrors a global status line, not a notification stack).\n *\n * Duration by tone (when `duration` isn't passed): `success`/`info` 2800ms,\n * `warning` 5000ms, `error` 8000ms (`TOAST_DEFAULT_DURATION_MS`); an explicit\n * `duration` always wins. The countdown pauses while the pointer or focus is\n * on the toast. Error toasts also get a larger, always-opaque close button.\n *\n * Angular has no global function that can mount UI on its own, so the\n * imperative `showToast(...)` of the reference design system becomes a\n * root-provided service holding signal state: `ToastService.show(...)` sets\n * the active toast and `ToastHost` (standalone, mounted once in the app\n * shell) renders it.\n *\n * @example\n * ```ts\n * // app.ts\n * imports: [ToastHost]\n * template: `<kf-toast-host />`\n *\n * // anywhere else\n * private readonly toast = inject(ToastService);\n * this.toast.show('Vehículo guardado', { tone: 'success' });\n *\n * // chains a `loading` toast into the promise's outcome:\n * this.toast.promise(this.api.save(vehicle), {\n * loading: 'Guardando…',\n * success: 'Vehículo guardado',\n * error: 'No se pudo guardar',\n * });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ToastService {\n private readonly _current = signal<ToastState | null>(null);\n private nextId = 0;\n private dismissTimer?: ReturnType<typeof setTimeout>;\n private removeTimer?: ReturnType<typeof setTimeout>;\n /** Wall-clock time the running `dismissTimer` is due to fire; used to compute how much\n * time is left when {@link pause} interrupts it. */\n private dismissDueAt?: number;\n /** Time left on the auto-dismiss countdown while paused. `undefined` when no countdown\n * is currently paused. */\n private remainingMs?: number;\n private readonly pauseSources = new Set<ToastPauseSource>();\n\n /** The single active toast, or `null`. */\n readonly current = this._current.asReadonly();\n\n /** Shows a toast, replacing whatever is currently shown. Returns its id. */\n show(message: string, options: ToastOptions = {}): number {\n const id = this.nextId++;\n const tone = options.tone ?? 'info';\n const duration =\n options.duration ??\n (tone === 'loading' ? DEFAULT_DURATION_MS : TOAST_DEFAULT_DURATION_MS[tone]);\n clearTimeout(this.dismissTimer);\n clearTimeout(this.removeTimer);\n this.dismissTimer = undefined;\n this.remainingMs = undefined;\n this.pauseSources.clear();\n this._current.set({ id, message, tone, duration, leaving: false, action: options.action });\n if (tone !== 'loading') {\n this.scheduleDismiss(id, duration);\n }\n return id;\n }\n\n private scheduleDismiss(id: number, ms: number): void {\n this.dismissDueAt = Date.now() + ms;\n this.dismissTimer = setTimeout(() => this.dismiss(id), ms);\n }\n\n /**\n * Pauses the auto-dismiss countdown for `id` while `source` (pointer hover or focus) is\n * active on it, so a user reaching for the action/dismiss button never loses the toast\n * mid-interaction (WCAG 2.2.1). No-op when `id` isn't the active toast, it's leaving, or\n * it has no running countdown (persistent or `loading` toasts, or already paused by\n * another source).\n */\n pause(id: number, source: ToastPauseSource): void {\n const toast = this._current();\n if (!toast || toast.id !== id || toast.leaving) return;\n this.pauseSources.add(source);\n if (this.dismissTimer === undefined) return;\n clearTimeout(this.dismissTimer);\n this.dismissTimer = undefined;\n this.remainingMs = Math.max(0, (this.dismissDueAt ?? Date.now()) - Date.now());\n }\n\n /**\n * Resumes a countdown paused by {@link pause}, honoring the time already elapsed before\n * the pause. No-op while another pause `source` is still active, or nothing is paused.\n */\n resume(id: number, source: ToastPauseSource): void {\n const toast = this._current();\n if (!toast || toast.id !== id || toast.leaving) return;\n this.pauseSources.delete(source);\n if (this.pauseSources.size > 0 || this.remainingMs === undefined) return;\n const ms = this.remainingMs;\n this.remainingMs = undefined;\n this.scheduleDismiss(id, ms);\n }\n\n /**\n * Starts the exit animation, then removes the toast. No-op when `id` is no\n * longer the active toast, so a stale timer never kills a newer toast.\n */\n dismiss(id?: number): void {\n const toast = this._current();\n if (!toast || toast.leaving || (id !== undefined && toast.id !== id)) return;\n clearTimeout(this.dismissTimer);\n this._current.set({ ...toast, leaving: true });\n this.removeTimer = setTimeout(() => {\n if (this._current()?.id === toast.id) this._current.set(null);\n }, EXIT_ANIMATION_MS);\n }\n\n /**\n * Shows a `loading` toast, then swaps it for a `success`/`error` toast once\n * `work` settles. Re-throws `work`'s rejection so callers can still react to\n * the failure.\n */\n promise<T>(work: Promise<T>, messages: ToastPromiseMessages<T> = {}): Promise<T> {\n this.show(messages.loading ?? 'Procesando…', { tone: 'loading' });\n return work.then(\n (value) => {\n const msg = messages.success ?? 'Listo';\n this.show(typeof msg === 'function' ? msg(value) : msg, { tone: 'success' });\n return value;\n },\n (error) => {\n const msg = messages.error ?? 'Ocurrió un error';\n this.show(typeof msg === 'function' ? msg(error) : msg, { tone: 'error' });\n throw error;\n },\n );\n }\n}\n\n/**\n * Renders whatever `ToastService` currently holds, fixed bottom-right. Mount\n * one instance in the app shell (e.g. next to the router outlet); it takes no\n * inputs and re-renders itself from the service state.\n *\n * <kf-toast-host />\n */\n@Component({\n selector: 'kf-toast-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [Icon],\n templateUrl: './ToastHost.html',\n styleUrl: './ToastHost.css',\n})\nexport class ToastHost {\n private readonly toastService = inject(ToastService);\n\n /** 0-or-1 wrapper so `@for track t.id` remounts the node on every new toast, restarting its animations. */\n protected readonly toastList = computed<ToastState[]>(() => {\n const toast = this.toastService.current();\n return toast ? [toast] : [];\n });\n\n protected toastIcon(tone: ToastTone): IconName {\n return TOAST_ICON[tone];\n }\n\n protected dismiss(id: number): void {\n this.toastService.dismiss(id);\n }\n\n /** Pauses the toast's auto-dismiss timer while the pointer or keyboard focus is on it. */\n protected pause(t: ToastState, source: ToastPauseSource): void {\n this.toastService.pause(t.id, source);\n }\n\n /** Resumes the toast's auto-dismiss timer once neither the pointer nor focus is on it. */\n protected resume(t: ToastState, source: ToastPauseSource): void {\n this.toastService.resume(t.id, source);\n }\n\n /** Ejecuta la acción del toast (ej. \"Ver ticket\") y lo cierra — el\n * llamador no tiene que acordarse de descartarlo desde su propio handler. */\n protected runAction(t: ToastState): void {\n t.action?.onClick();\n this.dismiss(t.id);\n }\n}\n","@for (t of toastList(); track t.id) {\n <div\n class=\"kf-toast kf-toast--{{ t.tone }}\"\n [class.kf-toast--leaving]=\"t.leaving\"\n role=\"status\"\n [attr.aria-live]=\"t.tone === 'error' ? 'assertive' : 'polite'\"\n (mouseenter)=\"pause(t, 'hover')\"\n (mouseleave)=\"resume(t, 'hover')\"\n (focusin)=\"pause(t, 'focus')\"\n (focusout)=\"resume(t, 'focus')\"\n >\n <kf-icon class=\"kf-toast__icon\" [name]=\"toastIcon(t.tone)\" size=\"sm\" />\n <span class=\"kf-toast__message\">{{ t.message }}</span>\n @if (t.action; as action) {\n <button type=\"button\" class=\"kf-toast__action\" (click)=\"runAction(t)\">\n {{ action.label }}\n </button>\n }\n <button\n type=\"button\"\n class=\"kf-toast__dismiss\"\n [class.kf-toast__dismiss--prominent]=\"t.tone === 'error'\"\n [attr.aria-label]=\"t.tone === 'error' ? 'Cerrar mensaje de error' : 'Cerrar'\"\n (click)=\"dismiss(t.id)\"\n >\n <kf-icon name=\"x\" size=\"sm\" />\n </button>\n <span class=\"kf-toast__bar\" [style.--kf-toast-dur]=\"t.duration + 'ms'\"></span>\n </div>\n}\n","/*\n * Public API Surface of ui/core — entry point secundario, `@kaufmann-lab/ui/core`.\n *\n * Primitivas de design system sin dueño temático ni dependencia pesada (ver\n * `ENTRY-POINTS.md` en la raíz del repo para el criterio de qué vive acá y\n * qué sale a otro entry point). Los demás entry points de la librería\n * (`/auth`, `/business`, `/mobile`, `/map`) importan sus piezas base desde\n * `'@kaufmann-lab/ui/core'`, nunca desde la raíz `'@kaufmann-lab/ui'` — la\n * raíz es un agregador que reexporta a todos, así que importarla desde uno\n * de ellos cerraría un ciclo que ng-packagr rechaza en build.\n *\n * Este entry point no importa nada de `/auth`, `/business`, `/mobile` ni\n * `/map`: solo depende de `/shared` (ver `ENTRY-POINTS.md`). Dentro de este\n * entry point los componentes se importan entre sí con rutas relativas\n * (`../icon/Icon`), igual que siempre — comparten `rootDir`.\n */\n\nexport * from './lib/action-tile/ActionTile';\n// `AdminBadge` vive acá y no en `/auth` aunque temáticamente encajaría:\n// `PortalHeader` (`/core`) lo compone, y un `AdminBadge` en `/auth` cerraría\n// el ciclo `/core` -> `/auth` -> `/core`, que ng-packagr rechaza en build.\nexport * from './lib/admin-badge/AdminBadge';\nexport * from './lib/button/button';\nexport * from './lib/alert/Alert';\nexport * from './lib/alert-row/AlertRow';\nexport * from './lib/avatar/Avatar';\nexport * from './lib/badge/Badge';\nexport * from './lib/breadcrumb/Breadcrumb';\nexport * from './lib/bucket-progress/BucketProgress';\nexport * from './lib/calendar/Calendar';\nexport * from './lib/card/Card';\nexport * from './lib/carousel/Carousel';\nexport * from './lib/carousel/CarouselSlide';\nexport * from './lib/checkbox/Checkbox';\nexport * from './lib/chip/Chip';\nexport * from './lib/collapsible/Collapsible';\nexport * from './lib/contact-popover/ContactPopover';\nexport * from './lib/content-slot/ContentSlot';\nexport * from './lib/content-state/ContentState';\nexport * from './lib/content-viewer/ContentViewer';\nexport * from './lib/cursor-pager/CursorPager';\nexport * from './lib/data-table/DataTable';\nexport * from './lib/data-table/responsive-view';\nexport * from './lib/divider/Divider';\nexport * from './lib/document-row/DocumentRow';\nexport * from './lib/drawer/Drawer';\nexport * from './lib/dropdown/Dropdown';\nexport * from './lib/dropdown/DropdownItem';\nexport * from './lib/dropdown/DropdownPanel';\nexport * from './lib/empty-state/EmptyState';\nexport * from './lib/event-timeline/EventTimeline';\nexport * from './lib/feature-card/FeatureCard';\nexport * from './lib/field/Field';\nexport * from './lib/field-label/FieldLabel';\nexport * from './lib/file-input/FileInput';\nexport * from './lib/filter/Filter';\nexport * from './lib/filter-chips/FilterChips';\nexport * from './lib/footer/Footer';\nexport * from './lib/icon/Icon';\nexport * from './lib/input/Input';\nexport * from './lib/journey-stepper/JourneyStepper';\nexport * from './lib/link/Link';\nexport * from './lib/list-toolbar/ListToolbar';\nexport * from './lib/metric-card/MetricCard';\nexport * from './lib/milestone-timeline/MilestoneTimeline';\nexport * from './lib/milestone-timeline/MilestoneTimeline.types';\nexport * from './lib/modal/Modal';\nexport * from './lib/multi-select/MultiSelect';\nexport * from './lib/note-block/NoteBlock';\nexport * from './lib/option-list/OptionList';\nexport * from './lib/page-header/PageHeader';\nexport * from './lib/pagination/Pagination';\nexport * from './lib/panel/Panel';\nexport * from './lib/popover/Popover';\nexport * from './lib/portal-header/PortalHeader';\nexport * from './lib/progress/Progress';\nexport * from './lib/pulse-dot/PulseDot';\nexport * from './lib/row-actions/RowActions';\nexport * from './lib/section-header/SectionHeader';\nexport * from './lib/section-nav/SectionNav';\nexport * from './lib/section-nav/section-nav-item/SectionNavItem';\nexport * from './lib/section-nav/section-nav-item/SectionNavSubsection';\nexport * from './lib/segmented/Segmented';\nexport * from './lib/select/Select';\nexport * from './lib/selectable-card-group/SelectableCardGroup';\n// SidebarNavItem y TooltipDirective son piezas internas de SidebarShell,\n// no componentes de catálogo — solo se exporta el contrato de datos que\n// sí es parte de la API pública (`kf-sidebar-shell.navItems`).\nexport type { SidebarNavItemData } from './lib/sidebar-shell/sidebar-nav-item/SidebarNavItem';\nexport * from './lib/sidebar-shell/SidebarShell';\nexport * from './lib/skeleton/Skeleton';\nexport * from './lib/skeleton/SkeletonPreset';\nexport * from './lib/spinner/Spinner';\nexport * from './lib/stat-card/StatCard';\nexport * from './lib/stat-tile/StatTile';\nexport * from './lib/status-indicators/ProgressStatus';\nexport * from './lib/status-indicators/StatusMark';\nexport * from './lib/status-indicators/StatusNode';\nexport * from './lib/status-pill/StatusPill';\nexport * from './lib/switch/Switch';\nexport * from './lib/tabs/Tabs';\nexport * from './lib/tabs/folder-tabs/FolderTabs';\nexport * from './lib/text/Text';\nexport * from './lib/textarea/Textarea';\nexport * from './lib/shared/format-input.directive';\nexport * from './lib/tile-grid/TileGrid';\nexport * from './lib/time-slot-picker/TimeSlotPicker';\nexport * from './lib/toast/Toast';\nexport * from './lib/tooltip/Tooltip';\nexport * from './lib/view-toggle/ViewToggle';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId","FOCUSABLE_SELECTOR","FOCUSABLE","Input"],"mappings":"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"}
|