@kaufmann-lab/ui 0.1.11 → 0.1.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"kaufmann-lab-ui.mjs","sources":["../../../projects/ui/src/lib/icon/icons/activity.ts","../../../projects/ui/src/lib/icon/icons/alert-circle.ts","../../../projects/ui/src/lib/icon/icons/alert-octagon.ts","../../../projects/ui/src/lib/icon/icons/alert-triangle.ts","../../../projects/ui/src/lib/icon/icons/award.ts","../../../projects/ui/src/lib/icon/icons/bar-chart.ts","../../../projects/ui/src/lib/icon/icons/bell.ts","../../../projects/ui/src/lib/icon/icons/bus.ts","../../../projects/ui/src/lib/icon/icons/calculator.ts","../../../projects/ui/src/lib/icon/icons/calendar.ts","../../../projects/ui/src/lib/icon/icons/car.ts","../../../projects/ui/src/lib/icon/icons/cart.ts","../../../projects/ui/src/lib/icon/icons/check.ts","../../../projects/ui/src/lib/icon/icons/check-circle.ts","../../../projects/ui/src/lib/icon/icons/check-square.ts","../../../projects/ui/src/lib/icon/icons/chevron-down.ts","../../../projects/ui/src/lib/icon/icons/chevron-left.ts","../../../projects/ui/src/lib/icon/icons/chevron-left-bar.ts","../../../projects/ui/src/lib/icon/icons/chevron-right.ts","../../../projects/ui/src/lib/icon/icons/clipboard.ts","../../../projects/ui/src/lib/icon/icons/clock.ts","../../../projects/ui/src/lib/icon/icons/credit-card.ts","../../../projects/ui/src/lib/icon/icons/download.ts","../../../projects/ui/src/lib/icon/icons/edit.ts","../../../projects/ui/src/lib/icon/icons/external-link.ts","../../../projects/ui/src/lib/icon/icons/eye.ts","../../../projects/ui/src/lib/icon/icons/eye-off.ts","../../../projects/ui/src/lib/icon/icons/file.ts","../../../projects/ui/src/lib/icon/icons/filter.ts","../../../projects/ui/src/lib/icon/icons/gauge.ts","../../../projects/ui/src/lib/icon/icons/gift.ts","../../../projects/ui/src/lib/icon/icons/grid.ts","../../../projects/ui/src/lib/icon/icons/history.ts","../../../projects/ui/src/lib/icon/icons/home.ts","../../../projects/ui/src/lib/icon/icons/inbox.ts","../../../projects/ui/src/lib/icon/icons/layers.ts","../../../projects/ui/src/lib/icon/icons/list.ts","../../../projects/ui/src/lib/icon/icons/log-out.ts","../../../projects/ui/src/lib/icon/icons/map.ts","../../../projects/ui/src/lib/icon/icons/map-pin.ts","../../../projects/ui/src/lib/icon/icons/menu.ts","../../../projects/ui/src/lib/icon/icons/mic.ts","../../../projects/ui/src/lib/icon/icons/mic-off.ts","../../../projects/ui/src/lib/icon/icons/more-vertical.ts","../../../projects/ui/src/lib/icon/icons/pause.ts","../../../projects/ui/src/lib/icon/icons/phone.ts","../../../projects/ui/src/lib/icon/icons/play.ts","../../../projects/ui/src/lib/icon/icons/plus.ts","../../../projects/ui/src/lib/icon/icons/search.ts","../../../projects/ui/src/lib/icon/icons/settings.ts","../../../projects/ui/src/lib/icon/icons/shield-check.ts","../../../projects/ui/src/lib/icon/icons/sort.ts","../../../projects/ui/src/lib/icon/icons/star.ts","../../../projects/ui/src/lib/icon/icons/ticket.ts","../../../projects/ui/src/lib/icon/icons/tool.ts","../../../projects/ui/src/lib/icon/icons/trash.ts","../../../projects/ui/src/lib/icon/icons/truck.ts","../../../projects/ui/src/lib/icon/icons/upload-cloud.ts","../../../projects/ui/src/lib/icon/icons/user.ts","../../../projects/ui/src/lib/icon/icons/user-search.ts","../../../projects/ui/src/lib/icon/icons/video.ts","../../../projects/ui/src/lib/icon/icons/x.ts","../../../projects/ui/src/lib/icon/icons/index.ts","../../../projects/ui/src/lib/icon/icon-sprite.ts","../../../projects/ui/src/lib/icon/Icon.ts","../../../projects/ui/src/lib/action-tile/ActionTile.ts","../../../projects/ui/src/lib/admin-badge/AdminBadge.ts","../../../projects/ui/src/lib/spinner/Spinner.ts","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/alert/Alert.ts","../../../projects/ui/src/lib/auth-layout/AuthLayout.ts","../../../projects/ui/src/lib/avatar/Avatar.ts","../../../projects/ui/src/lib/badge/Badge.ts","../../../projects/ui/src/lib/breadcrumb/Breadcrumb.ts","../../../projects/ui/src/lib/card/Card.ts","../../../projects/ui/src/lib/carousel/Carousel.ts","../../../projects/ui/src/lib/checkbox/Checkbox.ts","../../../projects/ui/src/lib/chip/Chip.ts","../../../projects/ui/src/lib/divider/Divider.ts","../../../projects/ui/src/lib/field-label/FieldLabel.ts","../../../projects/ui/src/lib/shared/search-text.ts","../../../projects/ui/src/lib/select/Select.ts","../../../projects/ui/src/lib/company-selector/CompanySelector.ts","../../../projects/ui/src/lib/content-slot/ContentSlot.ts","../../../projects/ui/src/lib/empty-state/EmptyState.ts","../../../projects/ui/src/lib/skeleton/Skeleton.ts","../../../projects/ui/src/lib/content-state/ContentState.ts","../../../projects/ui/src/lib/data-table/DataTable.ts","../../../projects/ui/src/lib/drawer/Drawer.ts","../../../projects/ui/src/lib/drawer-logout/DrawerLogout.ts","../../../projects/ui/src/lib/drawer-session/DrawerSession.ts","../../../projects/ui/src/lib/dropdown/Dropdown.ts","../../../projects/ui/src/lib/feature-card/FeatureCard.ts","../../../projects/ui/src/lib/field/Field.ts","../../../projects/ui/src/lib/filter-chips/FilterChips.ts","../../../projects/ui/src/lib/folder-tabs/FolderTabs.ts","../../../projects/ui/src/lib/footer/Footer.ts","../../../projects/ui/src/lib/input/Input.ts","../../../projects/ui/src/lib/link/Link.ts","../../../projects/ui/src/lib/metric-card/MetricCard.ts","../../../projects/ui/src/lib/modal/Modal.ts","../../../projects/ui/src/lib/multi-select/MultiSelect.ts","../../../projects/ui/src/lib/text/Text.ts","../../../projects/ui/src/lib/page-header/PageHeader.ts","../../../projects/ui/src/lib/pagination/Pagination.ts","../../../projects/ui/src/lib/panel/Panel.ts","../../../projects/ui/src/lib/portal-header/PortalHeader.ts","../../../projects/ui/src/lib/reserve-block/ReserveBlock.ts","../../../projects/ui/src/lib/section-header/SectionHeader.ts","../../../projects/ui/src/lib/segmented/Segmented.ts","../../../projects/ui/src/lib/tooltip/Tooltip.ts","../../../projects/ui/src/lib/sidebar-nav-item/SidebarNavItem.ts","../../../projects/ui/src/lib/shared/media-query.ts","../../../projects/ui/src/lib/sidebar-shell/SidebarShell.ts","../../../projects/ui/src/lib/stat-tile/StatTile.ts","../../../projects/ui/src/lib/status-pill/StatusPill.ts","../../../projects/ui/src/lib/tabs/Tabs.ts","../../../projects/ui/src/lib/toast/Toast.ts","../../../projects/ui/src/lib/vehicle-header/VehicleHeader.ts","../../../projects/ui/src/lib/view-toggle/ViewToggle.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/kaufmann-lab-ui.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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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 \"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';\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 { 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 { layers } from './layers';\nimport { list } from './list';\nimport { logOut } from './log-out';\nimport { map } from './map';\nimport { mapPin } from './map-pin';\nimport { menu } from './menu';\nimport { mic } from './mic';\nimport { micOff } from './mic-off';\nimport { moreVertical } from './more-vertical';\nimport { pause } from './pause';\nimport { phone } from './phone';\nimport { play } from './play';\nimport { plus } from './plus';\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';\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 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 layers: layers,\n list: list,\n 'log-out': logOut,\n map: map,\n 'map-pin': mapPin,\n menu: menu,\n mic: mic,\n 'mic-off': micOff,\n 'more-vertical': moreVertical,\n pause: pause,\n phone: phone,\n play: play,\n plus: plus,\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};\n","import { ICON_DEFINITIONS } from './icons';\n\n/**\n * Sprite SVG con los 60 íconos de trazo del design system (página 5:\n * \"Set de 59 iconos de trazo (1.9px, grilla 24×24)\", más `eye-off` como\n * extensión propia). Cada ícono es un `<symbol>` con su nombre real de la\n * spec como id (`kf-icon-check`, `kf-icon-alert-triangle`, etc.) — `Icon`\n * lo referencia 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, 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/** 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 — 61 glyphs (59 de la página 5 + `eye-off` y `log-out`), 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 * <kf-icon name=\"alert-triangle\" size=\"sm\" />\n * <kf-button icon=\"calendar\">Reservar hora</kf-button> <!-- ver Button -->\n */\n@Component({\n selector: 'kf-icon',\n template: `\n <svg [attr.aria-hidden]=\"true\" focusable=\"false\">\n <use [attr.href]=\"'#kf-icon-' + name()\" />\n </svg>\n `,\n styles: `\n :host {\n display: inline-flex;\n flex: none;\n line-height: 0;\n }\n svg {\n width: var(--kf-icon-size, 20px);\n height: var(--kf-icon-size, 20px);\n fill: none;\n stroke: currentColor;\n stroke-width: 1.9;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n `,\n host: {\n '[style.--kf-icon-size]': 'pixelSize()',\n },\n})\nexport class Icon {\n readonly name = input.required<IconName>();\n readonly size = input<IconSize>('md');\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","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 template: `\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 `,\n styles: `\n :host {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-white);\n cursor: pointer;\n transition:\n border-color 0.14s,\n box-shadow 0.14s;\n }\n :host(:hover) {\n border-color: var(--kf-color-border-strong);\n box-shadow: var(--kf-shadow-xs);\n }\n :host(.kf-action-tile--tile) {\n flex-direction: column;\n text-align: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-lg);\n }\n .kf-action-tile__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-primary-soft);\n color: var(--kf-color-primary);\n }\n :host(.kf-action-tile--row) .kf-action-tile__icon {\n width: 2.25rem;\n height: 2.25rem;\n background: var(--kf-color-secondary-soft);\n color: var(--kf-color-secondary);\n }\n :host(.kf-action-tile--tile) .kf-action-tile__icon {\n width: 2.75rem;\n height: 2.75rem;\n }\n .kf-action-tile__text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .kf-action-tile__title {\n font-family: var(--kf-font-title);\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-action-tile__description {\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n `,\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","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\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],\n template: `\n <kf-icon name=\"shield-check\" size=\"sm\" />\n <span>Vista administrador</span>\n `,\n styles: `\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-warning-soft);\n border: 1px solid var(--kf-color-warning);\n color: var(--kf-color-warning-strong);\n font-size: 0.75rem;\n font-weight: 700;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n line-height: 1;\n }\n :host(.kf-admin-badge--inline) {\n background: transparent;\n border-color: rgba(226, 185, 59, 0.5);\n color: var(--kf-color-warning);\n }\n `,\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","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 template: `\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 `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-spinner {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-sm);\n font-family: var(--kf-font-body);\n }\n .kf-spinner__ring {\n display: inline-block;\n flex: none;\n border-radius: var(--kf-radius-pill);\n border: 2px solid var(--kf-color-border);\n border-top-color: var(--kf-color-primary);\n animation: kf-spinner-turn 0.7s linear infinite;\n }\n .kf-spinner__ring--sm {\n width: 16px;\n height: 16px;\n }\n .kf-spinner__ring--md {\n width: 24px;\n height: 24px;\n border-width: 3px;\n }\n .kf-spinner__ring--lg {\n width: 32px;\n height: 32px;\n border-width: 3px;\n }\n .kf-spinner__label {\n font-size: 0.875rem;\n color: var(--kf-color-text-muted);\n }\n /* Sobre superficies oscuras (carousel, feature card, barra de admin). */\n .kf-spinner--on-dark .kf-spinner__ring {\n border-color: rgba(255, 255, 255, 0.28);\n border-top-color: var(--kf-color-white);\n }\n .kf-spinner--on-dark .kf-spinner__label {\n color: var(--kf-color-white);\n }\n @keyframes kf-spinner-turn {\n to {\n transform: rotate(360deg);\n }\n }\n .kf-spinner__sr {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n }\n @media (prefers-reduced-motion: reduce) {\n .kf-spinner__ring {\n animation-duration: 2s;\n }\n }\n `,\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","import { booleanAttribute, Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Spinner } from '../spinner/Spinner';\n\n/**\n * Wraps a native `<button>`, so keyboard handling, focus and form submission\n * keep working. The cost of the wrapper is forwarding `disabled` and `type` by\n * hand: as attributes on a custom element they have no native effect.\n *\n * Five variants (page 9 of the design system): `primary` (main action, blue),\n * `secondary` (service actions, orange), `ghost` (low-emphasis, no fill),\n * `outline` (medium-emphasis, bordered) and `danger` (destructive\n * confirmations — red, see the Confirmation Modal pattern on page 30). Three\n * sizes (`sm`/`md`/`lg`). `icon` renders a leading glyph (`kf-icon`) before\n * the projected label; `block` stretches the button to the full width of its\n * container.\n *\n * `(click)` is not forwarded — it bubbles from the inner button to the host.\n *\n * `loading` replaces the projected content with `kf-spinner` and forces\n * `disabled` — for the common \"Ingresando…\"/\"Enviando…\" submit pattern,\n * which before this prop existed as plain text swaps with no visual\n * indicator (see `web-portal-latam-frontend`'s login submit buttons).\n *\n * <kf-button (click)=\"save()\">Save</kf-button>\n * <kf-button variant=\"ghost\" disabled>Cancel</kf-button>\n * <kf-button variant=\"danger\" (click)=\"remove()\">Delete</kf-button>\n * <kf-button size=\"sm\" icon=\"calendar\" block>Reservar hora</kf-button>\n * <kf-button type=\"submit\" [loading]=\"submitting()\">Ingresar</kf-button>\n */\n@Component({\n selector: 'kf-button',\n imports: [Icon, Spinner],\n template: `\n <button\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\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--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 />\n }\n <ng-content />\n }\n </button>\n `,\n styles: `\n :host {\n display: inline-block;\n }\n :host([block]) {\n display: block;\n }\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--kf-space-xs);\n width: 100%;\n font: inherit;\n font-weight: 600;\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: 1px solid var(--kf-color-primary);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-primary);\n color: var(--kf-color-white);\n cursor: pointer;\n transition:\n background 0.14s,\n border-color 0.14s,\n color 0.14s;\n }\n button:hover:not(:disabled) {\n background: var(--kf-color-primary-hover);\n border-color: var(--kf-color-primary-hover);\n }\n button:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Secondary — naranja, para acciones de servicio (agendar, mantención). */\n button.kf-button--secondary {\n border-color: var(--kf-color-secondary);\n background: var(--kf-color-secondary);\n }\n button.kf-button--secondary:hover:not(:disabled) {\n background: var(--kf-color-secondary-hover);\n border-color: var(--kf-color-secondary-hover);\n }\n\n /* Ghost — sin relleno, para acciones secundarias junto a un primary. */\n button.kf-button--ghost {\n background: transparent;\n border-color: transparent;\n color: var(--kf-color-primary);\n }\n button.kf-button--ghost:hover:not(:disabled) {\n background: var(--kf-color-primary-soft);\n }\n\n /* Outline — énfasis medio: borde visible, sin relleno (ej. \"Llamar\" en Vehicle Header). */\n button.kf-button--outline {\n background: transparent;\n border-color: var(--kf-color-border-strong);\n color: var(--kf-color-text);\n }\n button.kf-button--outline:hover:not(:disabled) {\n background: var(--kf-color-surface);\n border-color: var(--kf-color-text-muted);\n }\n\n /* Danger — rojo, para confirmaciones destructivas (cancelar, eliminar). */\n button.kf-button--danger {\n border-color: var(--kf-color-error);\n background: var(--kf-color-error);\n }\n button.kf-button--danger:hover:not(:disabled) {\n background: var(--kf-color-error-hover);\n border-color: var(--kf-color-error-hover);\n }\n\n /* Tamaños — el tamaño por defecto (md) usa el padding base de arriba. */\n button.kf-button--sm {\n padding: 6px var(--kf-space-sm);\n font-size: 0.85rem;\n }\n button.kf-button--lg {\n padding: var(--kf-space-sm) var(--kf-space-lg);\n font-size: 1.05rem;\n }\n `,\n host: {\n '[attr.block]': \"block() ? '' : null\",\n },\n})\nexport class Button {\n readonly variant = input<'primary' | 'secondary' | 'ghost' | 'outline' | 'danger'>('primary');\n readonly size = input<'sm' | 'md' | 'lg'>('md');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Matches the native default: submits when inside a `<form>`. */\n readonly type = input<'button' | 'submit' | 'reset'>('submit');\n /** Leading icon, rendered via `kf-icon` before the projected label. */\n readonly icon = input<IconName>();\n /** Stretches the button to the full width of its container. */\n readonly block = input(false, { transform: booleanAttribute });\n /** Replaces the projected content with `kf-spinner` and forces `disabled`. */\n readonly loading = input(false, { transform: booleanAttribute });\n\n /** `ghost`/`outline` have no solid background — the default spinner ring already reads fine there. */\n protected readonly hasSolidFill = computed(() => {\n const variant = this.variant();\n return variant !== 'ghost' && variant !== 'outline';\n });\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nexport type AlertTone = 'info' | 'ok' | 'warn' | 'error';\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 * ponytail: los glifos van inline en vez de venir de un componente Icon —\n * son 4 paths fijos, uno por tono, y no existe todavía `kf-icon` en la\n * librería. Cuando exista, se reemplaza este `@switch` por `<kf-icon>`.\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@Component({\n selector: 'kf-alert',\n template: `\n @if (open()) {\n <div class=\"kf-alert\" [class]=\"'kf-alert--' + tone()\" [attr.role]=\"ariaRole()\">\n <svg class=\"kf-alert__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n @switch (tone()) {\n @case ('ok') {\n <path d=\"M21 12a9 9 0 1 1-4.2-7.6\" />\n <path d=\"M9 11.5l3 3 8.5-8.5\" />\n }\n @case ('warn') {\n <path d=\"M12 4l9 16H3z\" />\n <path d=\"M12 10v4\" />\n <path d=\"M12 17.5h.01\" />\n }\n @case ('error') {\n <path d=\"M8 3h8l5 5v8l-5 5H8l-5-5V8z\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n }\n @default {\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n }\n }\n </svg>\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 <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-alert {\n display: flex;\n align-items: flex-start;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: 1px solid transparent;\n border-radius: var(--kf-radius-sm);\n font-size: 0.9rem;\n }\n .kf-alert--info {\n background: var(--kf-color-info-soft);\n border-color: var(--kf-color-info);\n color: var(--kf-color-info-strong);\n }\n .kf-alert--ok {\n background: var(--kf-color-success-soft);\n border-color: var(--kf-color-success);\n color: var(--kf-color-success-strong);\n }\n .kf-alert--warn {\n background: var(--kf-color-warning-soft);\n border-color: var(--kf-color-warning);\n color: var(--kf-color-warning-strong);\n }\n .kf-alert--error {\n background: var(--kf-color-error-soft);\n border-color: var(--kf-color-error);\n color: var(--kf-color-error-strong);\n }\n .kf-alert__icon,\n .kf-alert__close svg {\n flex: none;\n width: 1.15em;\n height: 1.15em;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.9;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n .kf-alert__body {\n flex: 1;\n min-width: 0;\n }\n .kf-alert__title {\n margin: 0;\n font-family: var(--kf-font-title);\n font-weight: 700;\n }\n .kf-alert__message {\n color: inherit;\n }\n .kf-alert__close {\n flex: none;\n display: inline-flex;\n padding: 2px;\n border: none;\n background: transparent;\n color: inherit;\n border-radius: var(--kf-radius-xs);\n cursor: pointer;\n opacity: 0.7;\n }\n .kf-alert__close:hover {\n opacity: 1;\n }\n .kf-alert__close:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n `,\n})\nexport class Alert {\n readonly tone = input<AlertTone>('info');\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","import { Component, input } from '@angular/core';\n\n/**\n * Layout a pantalla completa para cualquier pantalla de autenticación\n * (login, recuperar contraseña, confirmación de envío) — split marca a la\n * izquierda / contenido libre a la derecha en desktop, formulario a\n * pantalla completa en mobile (el panel de marca completo se oculta, no se\n * apila arriba: en una pantalla angosta el usuario vino a loguearse, no a\n * leer la tagline). Un logo compacto (o wordmark de respaldo) sí se\n * mantiene visible arriba del formulario en mobile — el usuario nunca\n * pierde de vista qué portal está usando, mismo criterio que ya sigue el\n * resto del ecosistema (ver la topbar mobile de `css/otd.css`, que muestra\n * el logo aunque el sidebar completo se oculte).\n *\n * Este componente resuelve el \"cascarón\" — nunca el formulario en sí. Cada\n * portal arma su propio `<form>` con los componentes de la librería\n * (`kf-input`, `kf-checkbox`, `kf-button`, `kf-alert`) y lo proyecta en el\n * slot por defecto. Es la misma separación de responsabilidad que ya usa\n * `kf-card`: un componente da la estructura visual, el consumidor decide\n * qué va adentro.\n *\n * Antes de este componente, cada portal (LATAM primero, ahora OTD) hubiera\n * tenido que reimplementar este mismo split desde cero — la librería\n * había pospuesto esta abstracción a propósito hasta tener un segundo\n * consumidor real que confirmara qué parte es realmente compartida (el\n * cascarón) y qué parte es de cada portal (el formulario). OTD es ese\n * segundo consumidor.\n *\n * Ningún input tiene valor por defecto propio de ningún portal — `brand`\n * es obligatorio (`input.required`) y el resto de props de marca son\n * opcionales sin fallback hardcodeado, precisamente para que cada\n * consumidor (LATAM, OTD, Star, o el ERP de Asistencia en Ruta con sus\n * propios temas) traiga su propio logo/tagline sin que la librería asuma\n * cuál.\n *\n * <kf-auth-layout\n * brand=\"Mi Portal\"\n * brandLogoSrc=\"images/mi-portal-logo-white.png\"\n * brandLogoMobileSrc=\"images/mi-portal-logo-black.png\"\n * brandTagline=\"Frase corta de marca, propia de cada portal.\"\n * >\n * <form (ngSubmit)=\"onSubmit()\">\n * <kf-input label=\"Correo\" type=\"email\" />\n * <kf-input label=\"Contraseña\" type=\"password\" toggleable />\n * <kf-button type=\"submit\">Ingresar</kf-button>\n * </form>\n * </kf-auth-layout>\n */\n@Component({\n selector: 'kf-auth-layout',\n template: `\n <aside class=\"kf-auth-layout__brand\">\n @if (brandLogoSrc()) {\n <img class=\"kf-auth-layout__logo\" [src]=\"brandLogoSrc()\" [alt]=\"brand()\" />\n } @else {\n <span class=\"kf-auth-layout__wordmark\">{{ brand() }}</span>\n }\n @if (brandTagline()) {\n <p class=\"kf-auth-layout__tagline\">{{ brandTagline() }}</p>\n }\n </aside>\n\n <main class=\"kf-auth-layout__content\">\n <div class=\"kf-auth-layout__panel\">\n <div class=\"kf-auth-layout__mobile-brand\">\n @if (brandLogoMobileSrc() || brandLogoSrc()) {\n <img\n class=\"kf-auth-layout__logo kf-auth-layout__logo--mobile\"\n [src]=\"brandLogoMobileSrc() || brandLogoSrc()\"\n [alt]=\"brand()\"\n />\n } @else {\n <span class=\"kf-auth-layout__wordmark kf-auth-layout__wordmark--mobile\">{{\n brand()\n }}</span>\n }\n </div>\n <ng-content />\n </div>\n </main>\n `,\n styles: `\n :host {\n display: grid;\n grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);\n min-height: 100dvh;\n background: var(--kf-color-surface);\n }\n\n .kf-auth-layout__brand {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: var(--kf-space-md);\n padding: var(--kf-space-xl);\n background: linear-gradient(\n 190deg,\n var(--kf-color-primary-active) 0%,\n var(--kf-color-tertiary-deep) 100%\n );\n color: var(--kf-color-white);\n }\n\n .kf-auth-layout__logo {\n height: 1.75rem;\n width: fit-content;\n }\n\n .kf-auth-layout__wordmark {\n font-family: var(--kf-font-title);\n font-weight: var(--kf-font-weight-title);\n font-size: var(--kf-font-size-title-lg);\n letter-spacing: -0.01em;\n }\n\n .kf-auth-layout__tagline {\n max-width: 34ch;\n margin: 0;\n font-family: var(--kf-font-body);\n font-size: var(--kf-font-size-body);\n color: rgba(255, 255, 255, 0.72);\n }\n\n .kf-auth-layout__content {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--kf-space-xl);\n }\n\n .kf-auth-layout__panel {\n width: 100%;\n max-width: 360px;\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-lg);\n }\n\n /* Oculto por default — el logo \"grande\" de .kf-auth-layout__brand ya\n cumple ese rol en desktop. Solo se muestra bajo el breakpoint donde\n ese panel se oculta (ver abajo). */\n .kf-auth-layout__mobile-brand {\n display: none;\n }\n\n .kf-auth-layout__logo--mobile {\n height: 1.5rem;\n }\n\n .kf-auth-layout__wordmark--mobile {\n color: var(--kf-color-ink);\n }\n\n /* Punto donde el sidebar del resto del ecosistema pasa a drawer\n off-canvas (ver css/otd.css del design system) — acá el panel de\n marca completo se oculta (no se apila arriba: en una pantalla de\n este ancho el usuario vino a loguearse, no a leer la tagline), pero\n un logo compacto se mantiene visible arriba del formulario. */\n @media (max-width: 900px) {\n :host {\n grid-template-columns: 1fr;\n }\n\n .kf-auth-layout__brand {\n display: none;\n }\n\n .kf-auth-layout__content {\n padding: var(--kf-space-lg);\n }\n\n .kf-auth-layout__mobile-brand {\n display: block;\n margin-bottom: var(--kf-space-md);\n }\n }\n\n @media (max-width: 480px) {\n .kf-auth-layout__panel {\n max-width: none;\n }\n }\n `,\n})\nexport class AuthLayout {\n /** Nombre de marca/portal, usado como wordmark de respaldo si no hay ningún logo, y como `alt` de ambos logos. */\n readonly brand = input.required<string>();\n\n /** Logo en blanco para el panel oscuro de desktop — si no se pasa, se muestra `brand()` como wordmark tipográfico. */\n readonly brandLogoSrc = input<string>();\n\n /** Frase corta bajo el logo — opcional, cada portal decide su propio texto de marca. */\n readonly brandTagline = input<string>();\n\n /**\n * Logo compacto para mobile, sobre el fondo claro del panel de contenido\n * — normalmente la variante oscura/negra del mismo logo, ya que\n * `brandLogoSrc` suele ser la variante blanca pensada para el gradiente\n * oscuro. Si no se pasa, reutiliza `brandLogoSrc`; si tampoco hay logo en\n * absoluto, cae al wordmark tipográfico igual que en desktop.\n */\n readonly brandLogoMobileSrc = input<string>();\n}\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 * Pendiente: si en el futuro se agrega un ícono de fallback (persona\n * genérica) para cuando no hay ni `src` ni `initials`, depende del\n * componente Icon / sprite SVG que todavía no existe en esta librería.\n */\n@Component({\n selector: 'kf-avatar',\n imports: [NgTemplateOutlet],\n template: `\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 `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: 40px;\n block-size: 40px;\n overflow: hidden;\n border-radius: var(--kf-radius-pill);\n background: linear-gradient(135deg, var(--kf-color-primary), var(--kf-color-primary-active));\n color: var(--kf-color-white);\n font: inherit;\n font-size: 0.875rem;\n font-weight: 600;\n line-height: 1;\n user-select: none;\n flex: none;\n }\n .kf-avatar--square {\n border-radius: var(--kf-radius-sm);\n }\n .kf-avatar__image {\n inline-size: 100%;\n block-size: 100%;\n object-fit: cover;\n }\n .kf-avatar__initials {\n text-transform: uppercase;\n }\n\n /* Pill de usuario (header) — envuelve el avatar en una pastilla azul con chevron. */\n .kf-avatar-pill {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: 4px var(--kf-space-sm) 4px 4px;\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-primary);\n cursor: pointer;\n }\n .kf-avatar-pill .kf-avatar {\n inline-size: 32px;\n block-size: 32px;\n background: rgba(255, 255, 255, 0.18);\n }\n .kf-avatar-pill__caret {\n flex: none;\n width: 8px;\n height: 8px;\n border-right: 2px solid var(--kf-color-white);\n border-bottom: 2px solid var(--kf-color-white);\n transform: rotate(45deg);\n margin-top: -4px;\n }\n `,\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","import { booleanAttribute, Component, input } from '@angular/core';\n\n/**\n * Pill chica de fondo suave (soft) para un conteo, tag o estado liviano\n * puntual (no un proceso en vivo — para eso existe `kf-status-pill`, que usa\n * borde en vez de relleno). El color de fondo/texto/punto depende de `tone`.\n *\n * El PDF (página 10) fija seis tonos con fondo soft y texto del tono fuerte\n * — nunca fondo saturado con texto blanco, que es más apto para un botón\n * que para una etiqueta de lectura rápida en una lista densa.\n *\n * <kf-badge tone=\"ok\" dot>Al día</kf-badge>\n * <kf-badge tone=\"error\">3</kf-badge>\n *\n * Mapeo de `tone` a los seis conceptos de la página 10 y sus tokens\n * semánticos en projects/ui/src/tokens/base.css:\n * neutral -> Neutral (border/text-muted), info -> Información (info-soft/-strong),\n * ok -> Activo (success-soft/-strong), warn -> Pendiente (warning-soft/-strong),\n * error -> Vencido (error-soft/-strong), service -> Servicio (secondary-soft,\n * no existe un `-strong` para secondary todavía — usa el color base).\n */\n@Component({\n selector: 'kf-badge',\n template: `\n <span class=\"kf-badge\" [class]=\"'kf-badge--' + tone()\">\n @if (dot()) {\n <span class=\"kf-badge__dot\"></span>\n }\n <ng-content />\n </span>\n `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-badge {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n font: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n background: var(--kf-color-border);\n color: var(--kf-color-text-muted);\n }\n .kf-badge__dot {\n inline-size: 6px;\n block-size: 6px;\n border-radius: var(--kf-radius-pill);\n flex: none;\n background: currentColor;\n }\n .kf-badge--neutral {\n background: var(--kf-color-border);\n color: var(--kf-color-text-muted);\n }\n .kf-badge--ok {\n background: var(--kf-color-success-soft);\n color: var(--kf-color-success-strong);\n }\n .kf-badge--warn {\n background: var(--kf-color-warning-soft);\n color: var(--kf-color-warning-strong);\n }\n .kf-badge--error {\n background: var(--kf-color-error-soft);\n color: var(--kf-color-error-strong);\n }\n .kf-badge--info {\n background: var(--kf-color-info-soft);\n color: var(--kf-color-info-strong);\n }\n .kf-badge--service {\n background: var(--kf-color-secondary-soft);\n color: var(--kf-color-secondary-strong);\n }\n `,\n})\nexport class Badge {\n readonly tone = input<'neutral' | 'ok' | 'warn' | 'error' | 'info' | 'service'>('neutral');\n readonly dot = input(false, { transform: booleanAttribute });\n}\n","import { Component, computed, input, output } from '@angular/core';\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 template: `\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 <svg\n class=\"kf-breadcrumb__separator\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M9 6l6 6-6 6\" />\n </svg>\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 `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n font-size: 0.875rem;\n }\n .kf-breadcrumb__list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--kf-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .kf-breadcrumb__item {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n min-width: 0;\n }\n .kf-breadcrumb__separator {\n flex: none;\n width: 1em;\n height: 1em;\n fill: none;\n stroke: var(--kf-color-border-strong);\n stroke-width: 1.9;\n stroke-linecap: round;\n stroke-linejoin: round;\n }\n .kf-breadcrumb__link {\n color: var(--kf-color-primary);\n text-decoration: none;\n border-radius: var(--kf-radius-xs);\n transition: color 0.14s;\n }\n .kf-breadcrumb__link:hover {\n text-decoration: underline;\n }\n .kf-breadcrumb__link:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-breadcrumb__current {\n color: var(--kf-color-text-muted);\n overflow-wrap: anywhere;\n }\n `,\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.\n *\n * ponytail: no dependemos de `@angular/router` acá — sería un peer dep\n * nuevo en la librería para 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","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 * <kf-card>Contenido simple</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@Component({\n selector: 'kf-card',\n template: `\n <ng-content select=\"[kf-card-media]\" />\n <div class=\"kf-card__body\">\n <ng-content />\n </div>\n <ng-content select=\"[kf-card-actions]\" />\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n box-shadow: var(--kf-shadow-xs);\n overflow: hidden;\n }\n :host.kf-card--flush {\n box-shadow: none;\n }\n .kf-card__body {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-md);\n flex: 1 1 auto;\n }\n ::ng-deep [kf-card-media] {\n display: block;\n inline-size: 100%;\n block-size: auto;\n object-fit: cover;\n }\n ::ng-deep [kf-card-actions] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-top: 1px solid var(--kf-color-border);\n }\n `,\n host: {\n '[class.kf-card--flush]': 'flush()',\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}\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';\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 styles: `\n :host {\n display: block;\n flex: 0 0 100%;\n width: 100%;\n height: 100%;\n min-height: 0;\n }\n `,\n})\nexport class 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 template: `\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\n class=\"kf-carousel__track\"\n [style.transform]=\"'translateX(-' + activeIndex() * 100 + '%)'\"\n >\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 `,\n styles: `\n :host {\n display: block;\n height: 100%;\n font-family: var(--kf-font-body);\n }\n .kf-carousel {\n position: relative;\n height: 100%;\n }\n .kf-carousel__viewport {\n height: 100%;\n overflow: hidden;\n border-radius: var(--kf-radius-md);\n }\n .kf-carousel__track {\n display: flex;\n height: 100%;\n transition: transform 0.32s ease;\n }\n .kf-carousel__controls {\n position: absolute;\n z-index: 2;\n right: var(--kf-space-sm);\n bottom: var(--kf-space-sm);\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n }\n .kf-carousel__arrow {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n border: 1px solid rgb(255 255 255 / 22%);\n border-radius: var(--kf-radius-pill);\n background: rgb(255 255 255 / 12%);\n /* kf-icon usa currentColor — el SVG hereda este blanco sin más CSS. */\n color: #fff;\n cursor: pointer;\n transition: background 0.14s;\n }\n .kf-carousel__arrow:hover {\n background: rgb(255 255 255 / 24%);\n }\n .kf-carousel__arrow:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px rgb(255 255 255 / 60%);\n }\n .kf-carousel__dots {\n display: flex;\n gap: var(--kf-space-xs);\n }\n .kf-carousel__dot {\n width: 7px;\n height: 7px;\n padding: 0;\n border: none;\n border-radius: var(--kf-radius-pill);\n background: rgb(255 255 255 / 35%);\n cursor: pointer;\n transition:\n background 0.14s,\n width 0.14s;\n }\n .kf-carousel__dot:focus-visible {\n outline: none;\n box-shadow: 0 0 0 2px rgb(255 255 255 / 60%);\n }\n .kf-carousel__dot--active {\n width: 1.125rem;\n border-radius: var(--kf-radius-xs);\n background: #fff;\n }\n `,\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","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 template: `\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 class=\"kf-checkbox__box\" [class.kf-checkbox__box--invalid]=\"invalid()\"></span>\n @if (label()) {\n <span class=\"kf-checkbox__label\">{{ label() }}</span>\n }\n </label>\n `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-checkbox {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-sm);\n cursor: pointer;\n font: inherit;\n font-family: var(--kf-font-body);\n color: var(--kf-color-text);\n }\n .kf-checkbox--disabled {\n cursor: not-allowed;\n color: var(--kf-color-text-muted);\n }\n .kf-checkbox input {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n .kf-checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--kf-space-md);\n height: var(--kf-space-md);\n border: 1px solid var(--kf-color-border-strong);\n border-radius: var(--kf-radius-xs);\n background: var(--kf-color-white);\n transition:\n background 0.14s,\n border-color 0.14s;\n }\n .kf-checkbox input:checked + .kf-checkbox__box,\n .kf-checkbox input:indeterminate + .kf-checkbox__box {\n background: var(--kf-color-primary);\n border-color: var(--kf-color-primary);\n }\n .kf-checkbox input:checked + .kf-checkbox__box::after {\n content: '';\n width: 4px;\n height: 8px;\n border: solid var(--kf-color-white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg) translate(-1px, -1px);\n }\n .kf-checkbox input:indeterminate + .kf-checkbox__box::after {\n content: '';\n width: 8px;\n height: 2px;\n background: var(--kf-color-white);\n border-radius: var(--kf-radius-xs);\n }\n .kf-checkbox input:focus-visible + .kf-checkbox__box {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-checkbox__box--invalid {\n border-color: var(--kf-color-error);\n }\n .kf-checkbox--disabled .kf-checkbox__box {\n opacity: 0.5;\n }\n .kf-checkbox__label {\n user-select: none;\n }\n `,\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","import { 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 *\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 template: `\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 <span class=\"kf-chip__label\"><ng-content /></span>\n `,\n styles: `\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n border: 1px solid transparent;\n font: inherit;\n font-size: 0.875em;\n line-height: 1;\n color: var(--kf-color-text);\n background: var(--kf-color-surface);\n border-color: var(--kf-color-border);\n white-space: nowrap;\n }\n :host(.kf-chip--ok) {\n background: var(--kf-color-success-soft);\n border-color: var(--kf-color-success-soft);\n color: var(--kf-color-text);\n }\n :host(.kf-chip--warn) {\n background: var(--kf-color-warning-soft);\n border-color: var(--kf-color-warning-soft);\n color: var(--kf-color-text);\n }\n :host(.kf-chip--error) {\n background: var(--kf-color-error-soft);\n border-color: var(--kf-color-error-soft);\n color: var(--kf-color-text);\n }\n :host(.kf-chip--neutral) {\n background: var(--kf-color-surface);\n border-color: var(--kf-color-border);\n color: var(--kf-color-text);\n }\n .kf-chip__dot {\n inline-size: 0.5em;\n block-size: 0.5em;\n border-radius: var(--kf-radius-pill);\n flex: none;\n background: var(--kf-color-text-muted);\n }\n .kf-chip__label {\n display: inline-block;\n }\n .kf-chip__dot--ok {\n background: var(--kf-color-success);\n }\n .kf-chip__dot--warn {\n background: var(--kf-color-warning);\n }\n .kf-chip__dot--error {\n background: var(--kf-color-error);\n }\n .kf-chip__dot--neutral {\n background: var(--kf-color-text-muted);\n }\n `,\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}\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 styles: `\n :host {\n display: block;\n flex: none;\n border: none;\n background: var(--kf-color-border);\n }\n :host,\n :host([orientation='horizontal']) {\n width: 100%;\n height: 1px;\n }\n :host([orientation='vertical']) {\n align-self: stretch;\n width: 1px;\n height: auto;\n }\n `,\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 { 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@Component({\n selector: 'kf-field-label',\n template: `\n <label class=\"kf-field-label\" [for]=\"for()\">\n <ng-content />\n @if (required()) {\n <span class=\"kf-field-label__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n `,\n styles: `\n :host {\n display: contents;\n }\n .kf-field-label {\n font-family: var(--kf-font-title);\n font-size: 0.75rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--kf-color-text-muted);\n }\n .kf-field-label__required {\n color: var(--kf-color-error);\n margin-inline-start: 2px;\n }\n `,\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}\n","/**\n * Normaliza texto para comparación de búsqueda insensible a mayúsculas y\n * diacríticos — así \"cor\" encuentre \"Córdoba\" sin necesidad de tildes.\n *\n * Compartida entre `Select` y `MultiSelect` (los dos componentes con\n * buscador interno auto-activado por `searchThreshold`): antes vivía\n * duplicada letra por letra en ambos archivos.\n */\nexport function normalizeForSearch(text: string): string {\n return text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n}\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\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 { FieldLabel } from '../field-label/FieldLabel';\nimport { normalizeForSearch } from '../shared/search-text';\n\n/** Normalized shape used internally once `options` (string[] or object[]) is resolved. */\ninterface SelectOption {\n value: string;\n label: string;\n}\n\nlet nextId = 0;\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 * Hasta la `0.1.5` existía además `kf-select-menu`, un segundo componente\n * prácticamente idéntico (mismo trigger, mismo panel, mismo CSS) que solo\n * se diferenciaba en aceptar `options` únicamente como `{ value, label }[]`\n * (sin el atajo `string[]` que `Select` ya tenía). Se fusionaron en este\n * componente en la `0.2.0` — mantener dos componentes con la misma\n * interacción y el mismo aspecto visual, cuya única diferencia real era la\n * forma de un input, no se sostenía como dos piezas separadas del catálogo.\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 *\n * Pendiente: el prop `icon` de otros componentes del design system requiere\n * un componente Icon / sprite SVG que esta librería todavía no tiene — este\n * componente no usa iconos, así que no aplica acá.\n */\n@Component({\n selector: 'kf-select',\n imports: [FieldLabel],\n template: `\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-select__trigger\"\n [class.kf-select__trigger--disabled]=\"disabled()\"\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 class=\"kf-select__value\" [class.kf-select__value--placeholder]=\"!selectedOption()\">\n {{ selectedOption()?.label ?? placeholder() }}\n </span>\n <span\n class=\"kf-select__caret\"\n [class.kf-select__caret--open]=\"isOpen()\"\n aria-hidden=\"true\"\n ></span>\n </button>\n <ng-template #panelTemplate>\n <div class=\"kf-select__panel\">\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-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(); selectActive()\"\n />\n }\n <ul\n class=\"kf-select__list\"\n [id]=\"listboxId\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"triggerId\"\n >\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-select__option\"\n [class.kf-select__option--selected]=\"option.value === value()\"\n [class.kf-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"option.value === value()\"\n (click)=\"select(option)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown.enter)=\"select(option)\"\n (keydown.space)=\"$event.preventDefault(); select(option)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n >\n {{ option.label }}\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 `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n /*\n * Ancho FIJO, no min-width: un :host en flex sin ancho propio se\n * ajusta al contenido de su hijo en cada render — con min-width sí se\n * evita que se achique con una opción de label corto, pero seguía\n * pudiendo CRECER de más con una opción de label largo, desalineando\n * varios kf-select en fila dentro del mismo formulario (ej. \"Sede\" /\n * \"País\" / \"Divisiones\" ya no miden lo mismo entre sí). El texto que\n * no entra se corta con el text-overflow: ellipsis que\n * .kf-select__value ya tenía preparado — antes nunca se activaba\n * porque el host crecía en vez de cortar el texto.\n */\n width: 240px;\n font-family: var(--kf-font-body);\n }\n .kf-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-sm);\n width: 100%;\n font: inherit;\n color: var(--kf-color-text);\n padding: var(--kf-space-sm) var(--kf-space-md);\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n cursor: pointer;\n transition:\n border-color 0.14s,\n box-shadow 0.14s;\n }\n .kf-select__trigger:hover:not(:disabled) {\n border-color: var(--kf-color-border-strong);\n }\n .kf-select__trigger:focus-visible {\n outline: none;\n border-color: var(--kf-color-primary);\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-select__trigger--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .kf-select__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .kf-select__value--placeholder {\n color: var(--kf-color-text-muted);\n }\n .kf-select__caret {\n flex-shrink: 0;\n width: 8px;\n height: 8px;\n border-right: 2px solid var(--kf-color-text-muted);\n border-bottom: 2px solid var(--kf-color-text-muted);\n transform: rotate(45deg);\n transition: transform 0.14s;\n margin-top: -4px;\n }\n .kf-select__caret--open {\n transform: rotate(-135deg);\n margin-top: 4px;\n }\n .kf-select__panel {\n box-sizing: border-box;\n width: 100%;\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n box-shadow: var(--kf-shadow-md);\n overflow: hidden;\n }\n .kf-select__search {\n box-sizing: border-box;\n width: 100%;\n font: inherit;\n font-family: var(--kf-font-body);\n color: var(--kf-color-text);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: none;\n border-bottom: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm) var(--kf-radius-sm) 0 0;\n outline: none;\n }\n .kf-select__search:focus-visible {\n box-shadow: inset 0 0 0 2px var(--kf-color-primary);\n }\n .kf-select__list {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: var(--kf-space-xs) 0;\n list-style: none;\n max-height: 240px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--kf-color-gray-400) transparent;\n }\n .kf-select__list::-webkit-scrollbar {\n width: 6px;\n }\n .kf-select__list::-webkit-scrollbar-track {\n background: transparent;\n }\n .kf-select__list::-webkit-scrollbar-thumb {\n background-color: var(--kf-color-gray-400);\n border-radius: var(--kf-radius-pill);\n }\n .kf-select__list::-webkit-scrollbar-thumb:hover {\n background-color: var(--kf-color-gray-500);\n }\n .kf-select__option {\n padding: var(--kf-space-sm) var(--kf-space-md);\n color: var(--kf-color-text);\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .kf-select__option:hover {\n background: var(--kf-color-primary-soft);\n }\n .kf-select__option--selected {\n background: var(--kf-color-primary-soft);\n color: var(--kf-color-primary);\n font-weight: 600;\n }\n /* Opción con foco de teclado — distinta del hover, comparte el mismo tinte de fondo. */\n .kf-select__option--active {\n background: var(--kf-color-primary-soft);\n }\n .kf-select__empty {\n text-align: center;\n padding: var(--kf-space-sm) var(--kf-space-md);\n color: var(--kf-color-text-muted);\n }\n `,\n})\nexport class Select {\n readonly label = input<string>();\n readonly options = input.required<string[] | SelectOption[]>();\n readonly value = input<string>();\n readonly placeholder = input<string>('Seleccionar');\n readonly disabled = input(false, { transform: booleanAttribute });\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 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\n readonly isOpen = signal(false);\n readonly searchQuery = signal('');\n readonly activeIndex = signal(0);\n\n /** Resolves the union (`string[] | { value; label }[]`) 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 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 normalizeForSearch(option.label).includes(query),\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\n private readonly overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n\n private overlayRef: OverlayRef | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.attach();\n } else {\n this.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 afterRenderEffect(() => {\n if (this.isOpen() && this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n }\n });\n\n this.destroyRef.onDestroy(() => this.overlayRef?.dispose());\n }\n\n /**\n * Respaldo de `overlayRef.keydownEvents()`: ese observable del CDK solo ve\n * teclas presionadas con el foco DENTRO del pane del overlay. Si el foco\n * sigue en el trigger (o en cualquier otro lado de la página) mientras el\n * panel está abierto, `keydownEvents()` nunca dispara.\n */\n @HostListener('document:keydown.escape')\n onDocumentEscape(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n this.isOpen.update((open) => !open);\n }\n\n select(option: SelectOption): void {\n this.isOpen.set(false);\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 }\n\n selectActive(): void {\n const option = this.filteredOptions()[this.activeIndex()];\n if (option) {\n this.select(option);\n }\n }\n\n private attach(): void {\n if (this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreateOverlayRef();\n // Se remide el ancho del trigger en cada apertura, no solo la primera —\n // ver la misma nota en SelectMenu: cachear el ancho en la creación del\n // overlay lo deja desincronizado si el trigger cambia de tamaño entre\n // una apertura y la siguiente.\n overlayRef.updateSize({ width: this.triggerRef().nativeElement.getBoundingClientRect().width });\n\n const portal = new TemplatePortal(this.panelTemplate(), this.viewContainerRef);\n overlayRef.attach(portal);\n\n // outsidePointerEvents() dispara en la fase de CAPTURA de `click` sobre\n // `body` (ver OverlayOutsideClickDispatcher en @angular/cdk), es decir\n // ANTES de que el evento llegue al trigger y corra (click)=\"toggle()\".\n // Sin este filtro, un click en el trigger para CERRAR el panel ya abierto\n // hacía: 1) este subscribe lo cierra primero (el trigger no es parte del\n // overlay, cuenta como \"afuera\"), 2) toggle() corre después y lo vuelve a\n // abrir porque ve isOpen ya en false — un solo click quedaba en no-op y\n // solo cerraba de verdad un click fuera del trigger.\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 this.isOpen.set(false);\n });\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.isOpen.set(false);\n }\n });\n }\n\n private detach(): void {\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.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 width: this.triggerRef().nativeElement.getBoundingClientRect().width,\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { Divider } from '../divider/Divider';\nimport { Select } from '../select/Select';\n\n/** Metadato clave mostrado junto al selector (RUC, identificación, sucursal). */\nexport interface CompanySelectorMeta {\n label: string;\n value: string;\n}\n\n/**\n * Conmutador de empresa activa con metadatos clave (página 32) — encabeza\n * la pantalla de inicio del portal. Compone `kf-select` para el propio\n * selector (mismo panel propio, sin `<select>` nativo) y proyecta hasta 3\n * pares label/valor (RUC, Identificación, Sucursal en el ejemplo del PDF).\n *\n * <kf-company-selector\n * label=\"Selecciona empresa\"\n * [companies]=\"['TRANSPORTES DEL SUR S.A.C.', 'ANDES MAQ LTDA.']\"\n * [value]=\"activeCompany()\"\n * (valueChange)=\"activeCompany.set($event)\"\n * [meta]=\"[\n * { label: 'RUC', value: '20448712359' },\n * { label: 'Identificación', value: '0004002232' },\n * { label: 'Sucursal', value: 'Sucursal Norte' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-company-selector',\n imports: [Divider, Select],\n template: `\n <kf-select\n class=\"kf-company-selector__select\"\n [label]=\"label()\"\n [options]=\"companies()\"\n [value]=\"value()\"\n (valueChange)=\"valueChange.emit($event)\"\n />\n @if (meta().length) {\n <div class=\"kf-company-selector__meta\">\n @for (item of meta(); track item.label; let last = $last) {\n <div class=\"kf-company-selector__meta-item\">\n <span class=\"kf-company-selector__meta-label\">{{ item.label }}</span>\n <span class=\"kf-company-selector__meta-value\">{{ item.value }}</span>\n </div>\n @if (!last) {\n <kf-divider orientation=\"vertical\" />\n }\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: flex;\n align-items: center;\n gap: var(--kf-space-lg);\n flex-wrap: wrap;\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n background: var(--kf-color-white);\n font-family: var(--kf-font-body);\n }\n .kf-company-selector__select {\n flex: 1 1 260px;\n min-width: 0;\n }\n .kf-company-selector__meta {\n display: flex;\n gap: var(--kf-space-lg);\n flex-wrap: wrap;\n }\n .kf-company-selector__meta-item {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .kf-company-selector__meta-label {\n font-family: var(--kf-font-title);\n font-size: 0.72rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--kf-color-text-muted);\n }\n .kf-company-selector__meta-value {\n font-family: var(--kf-font-mono);\n font-size: 0.875rem;\n color: var(--kf-color-ink);\n }\n `,\n})\nexport class CompanySelector {\n readonly label = input('Selecciona empresa');\n readonly companies = input.required<string[]>();\n readonly value = input<string>();\n readonly meta = input<CompanySelectorMeta[]>([]);\n\n readonly valueChange = output<string>();\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\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],\n template: `\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\">Contenido disponible para uso</span>\n }\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-white);\n font-family: var(--kf-font-body);\n }\n .kf-content-slot__media {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 96px;\n margin-bottom: var(--kf-space-xs);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-surface);\n color: var(--kf-color-border-strong);\n }\n :host(.kf-content-slot--compact) .kf-content-slot__media {\n height: 56px;\n }\n .kf-content-slot__title {\n font-family: var(--kf-font-title);\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-content-slot__description {\n margin: 0;\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n .kf-content-slot__footer {\n align-self: flex-start;\n margin-top: var(--kf-space-xs);\n padding: 2px var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-surface);\n color: var(--kf-color-text-muted);\n font-size: 0.72rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n `,\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","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\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@Component({\n selector: 'kf-empty-state',\n imports: [Icon],\n template: `\n @if (icon(); as iconName) {\n <span class=\"kf-empty-state__icon\">\n <kf-icon [name]=\"iconName\" [size]=\"tone() === 'error' ? 'lg' : 'md'\" />\n </span>\n }\n <div class=\"kf-empty-state__content\">\n <ng-content />\n </div>\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-xl);\n border: 1px dashed var(--kf-color-border-strong);\n border-radius: var(--kf-radius-md);\n background: var(--kf-color-surface);\n color: var(--kf-color-text-muted);\n font: inherit;\n text-align: center;\n }\n :host(.kf-empty-state--error) {\n border: none;\n background: var(--kf-color-error-soft);\n }\n .kf-empty-state__content {\n color: var(--kf-color-text-muted);\n font-family: var(--kf-font-body);\n }\n :host(.kf-empty-state--error) .kf-empty-state__content {\n color: var(--kf-color-error-strong);\n }\n `,\n host: {\n '[class.kf-empty-state--error]': \"tone() === 'error'\",\n },\n})\nexport class EmptyState {\n readonly icon = input<IconName | undefined>(undefined);\n /** `neutral` (default): cero resultados. `error`: fallo real de carga. */\n readonly tone = input<'neutral' | 'error'>('neutral');\n}\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 template: `\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 `,\n styles: `\n :host {\n display: block;\n }\n .kf-skeleton {\n display: block;\n background: linear-gradient(\n 90deg,\n var(--kf-color-border) 25%,\n var(--kf-color-surface) 37%,\n var(--kf-color-border) 63%\n );\n background-size: 400% 100%;\n animation: kf-skeleton-shimmer 1.4s ease infinite;\n }\n .kf-skeleton--text {\n height: 14px;\n border-radius: var(--kf-radius-xs);\n }\n .kf-skeleton--rect {\n height: 80px;\n border-radius: var(--kf-radius-sm);\n }\n .kf-skeleton--circle {\n aspect-ratio: 1 / 1;\n border-radius: var(--kf-radius-pill);\n }\n @keyframes kf-skeleton-shimmer {\n from {\n background-position: 100% 0;\n }\n to {\n background-position: 0 0;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .kf-skeleton {\n animation: none;\n background: var(--kf-color-border);\n }\n }\n `,\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","import { Component, input } from '@angular/core';\nimport { EmptyState } from '../empty-state/EmptyState';\nimport { Skeleton } from '../skeleton/Skeleton';\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 * 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 * <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@Component({\n selector: 'kf-content-state',\n imports: [EmptyState, Skeleton, Spinner],\n template: `\n @switch (state()) {\n @case ('ready') {\n <ng-content />\n }\n @case ('loading') {\n <div class=\"kf-content-state__loading\" aria-busy=\"true\">\n @if (load() === 'spinner') {\n <kf-spinner [label]=\"loadingLabel()\" />\n } @else {\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n <kf-skeleton width=\"60%\" />\n }\n </div>\n }\n @default {\n <kf-empty-state [tone]=\"state() === 'error' ? 'error' : 'neutral'\">\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 `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-content-state__loading {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-sm);\n }\n .kf-content-state__title {\n margin: 0;\n font-family: var(--kf-font-title);\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-content-state__subtitle {\n margin: 0;\n color: var(--kf-color-text-muted);\n }\n .kf-content-state__actions:empty {\n display: none;\n }\n .kf-content-state__actions {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--kf-space-sm);\n margin-top: var(--kf-space-sm);\n }\n `,\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 /** Texto al lado del spinner cuando `load=\"spinner\"`. */\n readonly loadingLabel = input('Cargando…');\n}\n","import { Component, computed, input, output, signal, TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\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.\n * - `action`: va al pie, separado del cuerpo por una línea.\n */\nexport type DataTableCardRole = 'media' | 'title' | 'status' | 'field' | 'action';\n\nexport interface DataTableColumn {\n key: string;\n label: string;\n right?: boolean;\n className?: string;\n cardRole?: DataTableCardRole;\n}\n\n/** Vistas disponibles cuando `cardable` está activo. */\nexport type DataTableView = 'table' | 'cards';\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 modo `cards` no depende de un componente ViewToggle separado: expone\n * un control de segmentos mínimo inline (mismo patrón visual que\n * kf-segmented) para no acoplarse a un componente que otro agente puede\n * estar construyendo en paralelo — ver nota en el resumen de la tarea.\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 * 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@Component({\n selector: 'kf-data-table',\n imports: [NgTemplateOutlet],\n template: `\n <div class=\"kf-data-table\" [class.kf-data-table--flush]=\"flush()\">\n @if (cardable()) {\n <div class=\"kf-data-table__toolbar\">\n <div class=\"kf-data-table__view-toggle\" role=\"group\" aria-label=\"Cambiar vista\">\n <button\n type=\"button\"\n class=\"kf-data-table__view-option\"\n [class.kf-data-table__view-option--active]=\"view() === 'table'\"\n [attr.aria-pressed]=\"view() === 'table'\"\n (click)=\"setView('table')\"\n >\n Tabla\n </button>\n <button\n type=\"button\"\n class=\"kf-data-table__view-option\"\n [class.kf-data-table__view-option--active]=\"view() === 'cards'\"\n [attr.aria-pressed]=\"view() === 'cards'\"\n (click)=\"setView('cards')\"\n >\n Tarjetas\n </button>\n </div>\n </div>\n }\n\n @if (rows().length === 0) {\n <div class=\"kf-data-table__empty\">\n <ng-content select=\"[empty]\" />\n </div>\n } @else if (view() === 'table') {\n <div class=\"kf-data-table__scroll\">\n <table class=\"kf-data-table__table\">\n <thead>\n <tr>\n @for (column of columns(); track column.key) {\n <th [class]=\"column.className\" [class.kf-data-table__cell--right]=\"column.right\">\n {{ column.label }}\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track trackRow(row, $index); let i = $index) {\n <tr\n class=\"kf-data-table__row\"\n tabindex=\"0\"\n (click)=\"onRowClick(row, i)\"\n (keydown.enter)=\"onRowClick(row, i)\"\n >\n @for (column of columns(); track column.key) {\n <td\n [class]=\"column.className\"\n [class.kf-data-table__cell--right]=\"column.right\"\n >\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\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 </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"kf-data-table__cards\">\n @for (row of rows(); track trackRow(row, $index); let i = $index) {\n <div\n class=\"kf-data-table__card\"\n [class.kf-data-table__card--interactive]=\"cardInteractive()\"\n [attr.role]=\"cardInteractive() ? 'button' : null\"\n [attr.tabindex]=\"cardInteractive() ? 0 : null\"\n (click)=\"cardInteractive() && onRowClick(row, i)\"\n (keydown.enter)=\"cardInteractive() && onRowClick(row, i)\"\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 }\"\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 class=\"kf-data-table__card-title\">\n @if (cellTemplates()?.[title.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, title) }}\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 @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\n }\n }\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\n @for (column of cardFieldColumns(); track column.key) {\n <div class=\"kf-data-table__card-field\">\n <span class=\"kf-data-table__card-label\">{{ column.label }}</span>\n <span class=\"kf-data-table__card-value\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\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 @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\n }\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n @if (rows().length > 0) {\n <div class=\"kf-data-table__footer\">\n <ng-content select=\"[footer]\" />\n </div>\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-data-table {\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n box-shadow: var(--kf-shadow-sm);\n overflow: hidden;\n }\n .kf-data-table--flush {\n border: none;\n box-shadow: none;\n border-radius: 0;\n }\n .kf-data-table__toolbar {\n display: flex;\n justify-content: flex-end;\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-bottom: 1px solid var(--kf-color-border);\n }\n .kf-data-table__view-toggle {\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n background: var(--kf-color-surface);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n }\n .kf-data-table__view-option {\n font: inherit;\n font-size: 0.875em;\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border: none;\n background: transparent;\n color: var(--kf-color-text-muted);\n border-radius: var(--kf-radius-xs);\n cursor: pointer;\n transition:\n background 0.14s,\n color 0.14s;\n }\n .kf-data-table__view-option:hover:not(.kf-data-table__view-option--active) {\n color: var(--kf-color-text);\n }\n .kf-data-table__view-option--active {\n background: var(--kf-color-white);\n color: var(--kf-color-ink);\n box-shadow: var(--kf-shadow-xs);\n }\n .kf-data-table__view-option:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n\n .kf-data-table__scroll {\n overflow-x: auto;\n }\n .kf-data-table__table {\n width: 100%;\n border-collapse: collapse;\n text-align: left;\n }\n .kf-data-table__table th,\n .kf-data-table__table td {\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-bottom: 1px solid var(--kf-color-border);\n white-space: nowrap;\n }\n .kf-data-table__table th {\n font-family: var(--kf-font-title);\n font-size: 0.8125em;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n color: var(--kf-color-text-muted);\n background: var(--kf-color-surface);\n }\n .kf-data-table__table td {\n color: var(--kf-color-text);\n }\n .kf-data-table__table tbody tr:last-child td {\n border-bottom: none;\n }\n .kf-data-table__row {\n cursor: pointer;\n transition: background 0.14s;\n }\n .kf-data-table__row:hover {\n background: var(--kf-color-primary-soft);\n }\n .kf-data-table__cell--right {\n text-align: right;\n }\n\n .kf-data-table__empty {\n padding: var(--kf-space-md);\n }\n\n .kf-data-table__footer {\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-top: 1px solid var(--kf-color-border);\n }\n .kf-data-table__footer:empty {\n display: none;\n }\n\n .kf-data-table__cards {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: var(--kf-space-md);\n padding: var(--kf-space-md);\n }\n .kf-data-table__card {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n overflow: hidden;\n transition:\n border-color 0.14s,\n box-shadow 0.14s;\n }\n .kf-data-table__card--interactive {\n cursor: pointer;\n }\n .kf-data-table__card:hover {\n border-color: var(--kf-color-border-strong);\n box-shadow: var(--kf-shadow-xs);\n }\n .kf-data-table__card--interactive:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n\n .kf-data-table__card-header {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-md);\n }\n .kf-data-table__card-media {\n flex: none;\n }\n .kf-data-table__card-media img,\n .kf-data-table__thumb {\n display: block;\n width: 48px;\n height: 48px;\n border-radius: var(--kf-radius-xs);\n object-fit: cover;\n background: var(--kf-color-surface);\n }\n .kf-data-table__card-heading {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n min-width: 0;\n }\n .kf-data-table__card-title {\n font-family: var(--kf-font-title);\n font-weight: 600;\n color: var(--kf-color-ink);\n overflow-wrap: anywhere;\n }\n .kf-data-table__card-statuses,\n .kf-data-table__card-actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kf-space-xs);\n }\n\n .kf-data-table__card-fields {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-md);\n }\n /* El encabezado ya aportó el padding de arriba. */\n .kf-data-table__card-header + .kf-data-table__card-fields {\n padding-top: 0;\n }\n .kf-data-table__card-field {\n display: flex;\n justify-content: space-between;\n gap: var(--kf-space-sm);\n }\n .kf-data-table__card-actions {\n justify-content: flex-end;\n margin-top: auto;\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-top: 1px solid var(--kf-color-border);\n background: var(--kf-color-surface);\n }\n\n .kf-data-table__thumb {\n width: 32px;\n height: 32px;\n }\n .kf-data-table__card-label {\n font-family: var(--kf-font-title);\n font-size: 0.8125em;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n color: var(--kf-color-text-muted);\n }\n .kf-data-table__card-value {\n color: var(--kf-color-text);\n text-align: right;\n }\n `,\n})\nexport class DataTable<T = unknown> {\n readonly columns = input.required<DataTableColumn[]>();\n readonly rows = input.required<T[]>();\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);\n readonly defaultView = input<DataTableView>('table');\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. */\n readonly cellTemplates = input<\n Record<string, TemplateRef<{ $implicit: T; index: number }>> | undefined\n >();\n\n readonly rowClick = output<{ row: T; index: number }>();\n\n private readonly internalView = signal<DataTableView | null>(null);\n\n /** Vista activa: la elegida por el usuario, o `defaultView` si no tocó el toggle. */\n readonly view = computed<DataTableView>(() => this.internalView() ?? 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'),\n );\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(() => this.cardActionColumns().length === 0);\n\n setView(next: DataTableView): void {\n this.internalView.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 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 onRowClick(row: T, index: number): void {\n this.rowClick.emit({ row, index });\n }\n}\n","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\n\nexport type DrawerSide = 'left' | 'right';\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 * Extraído de `PortalHeader`, que hasta acá reimplementaba su propio drawer\n * embebido (navegación hardcodeada + slot único al final). Cualquier\n * consumidor que necesite un panel lateral — no solo `PortalHeader` — puede\n * usar este componente directamente.\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@Component({\n selector: 'kf-drawer',\n template: `\n @if (open()) {\n <button\n type=\"button\"\n class=\"kf-drawer__overlay\"\n aria-label=\"Cerrar menú\"\n (click)=\"open.set(false)\"\n ></button>\n }\n\n <nav\n #panel\n class=\"kf-drawer__panel\"\n [class.kf-drawer__panel--open]=\"open()\"\n [class.kf-drawer__panel--right]=\"side() === 'right'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-hidden]=\"!open()\"\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 </nav>\n `,\n styles: `\n /*\n * Overlay: capa semitransparente con blur sutil detrás del panel, cubre\n * toda la pantalla. Es un <button> nativo (no un <div> con (click) a\n * mano) para ser focuseable y responder a teclado sin reimplementar\n * nada — de ahí el reset de sus estilos por defecto más abajo.\n */\n .kf-drawer__overlay {\n position: fixed;\n inset: 0;\n border: none;\n padding: 0;\n cursor: pointer;\n background: rgba(23, 29, 37, 0.4);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n z-index: 39;\n }\n /*\n * Panel: fijo a toda la altura de la pantalla, anclado al borde que\n * indique \\`side\\`, oculto por defecto corriéndolo fuera de la pantalla\n * (translateX) en vez de con display:none — así la transición de\n * entrada/salida es un slide real, no un aparecer/desaparecer abrupto.\n * visibility: hidden en el estado cerrado evita que sea\n * focuseable/clickeable mientras está fuera de vista (translateX por sí\n * solo no saca el elemento del árbol de tabulación).\n */\n .kf-drawer__panel {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 40;\n display: flex;\n flex-direction: column;\n width: 82%;\n max-width: 320px;\n background: var(--kf-color-white);\n box-shadow: 8px 0 24px -8px rgba(16, 24, 40, 0.3);\n transform: translateX(-100%);\n visibility: hidden;\n transition:\n transform 0.24s cubic-bezier(0.32, 0.72, 0, 1),\n visibility 0s linear 0.24s;\n }\n .kf-drawer__panel--right {\n left: auto;\n right: 0;\n box-shadow: -8px 0 24px -8px rgba(16, 24, 40, 0.3);\n transform: translateX(100%);\n }\n .kf-drawer__panel--open {\n transform: translateX(0);\n visibility: visible;\n transition:\n transform 0.24s cubic-bezier(0.32, 0.72, 0, 1),\n visibility 0s linear 0s;\n }\n .kf-drawer__header:empty,\n .kf-drawer__footer:empty {\n display: none;\n }\n /*\n * Fondo oscuro del header: vive acá y no en el contenido proyectado\n * porque \\`kf-drawer-session\\` (el caso de uso real de este slot) documenta\n * que asume que el contenedor padre ya se lo da — no tiene \\`background\\`\n * en su propio \\`:host\\`. Cualquier consumidor de \\`[kf-drawer-header]\\`\n * hereda este mismo fondo sin tener que reimplementarlo.\n *\n * Mismo criterio para el padding: \\`.kf-drawer__body\\` ya lo trae propio\n * (\\`--kf-space-lg\\`) en vez de esperar que cada nav-item se lo ponga —\n * \\`.kf-drawer__header\\` sigue esa misma convención, así \\`kf-drawer-session\\`\n * (o cualquier otro contenido de header) no queda pegado al borde del\n * panel ni al borde superior.\n */\n .kf-drawer__header {\n padding: var(--kf-space-lg);\n background: var(--kf-color-tertiary-deep);\n }\n .kf-drawer__body {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-lg);\n overflow-y: auto;\n }\n /*\n * Mismo criterio de padding que \\`.kf-drawer__header\\` (ver comentario\n * arriba): el footer no espera que su contenido proyectado (ej.\n * \\`kf-drawer-logout\\`) traiga su propio espaciado. A diferencia del\n * header, el footer vive sobre el fondo claro del panel (no tiene\n * \\`background\\` propio) — el \\`border-top\\` es lo único que lo separa\n * visualmente del body, reemplazando el borde que antes traía el propio\n * botón de logout cuando vivía dentro de \\`kf-drawer-session\\`.\n */\n .kf-drawer__footer {\n padding: var(--kf-space-lg);\n border-top: 1px solid var(--kf-color-border);\n }\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. */\n readonly side = input<DrawerSide>('left');\n /** `aria-label` del `<nav>` interno — describe el propósito del panel para\n * lectores de pantalla (ej. \"Menú de navegación\"). */\n readonly ariaLabel = input('Menú');\n\n private readonly panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly document = inject(DOCUMENT);\n\n private focusTrap: FocusTrap | null = null;\n private lastFocusedElement: HTMLElement | null = null;\n\n constructor() {\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 this.lastFocusedElement?.focus();\n this.lastFocusedElement = null;\n }\n });\n\n inject(DestroyRef).onDestroy(() => this.focusTrap?.destroy());\n }\n\n /** Cierra el drawer con Escape — mismo patrón que `Dropdown`/`Modal`. */\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\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","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Botón de cerrar sesión, pensado para proyectarse dentro de\n * `[kf-drawer-footer]` de `kf-drawer`, o junto a `kf-drawer-session` dentro\n * de `[kf-sidebar-footer]` de `kf-sidebar-shell` — separado de\n * `kf-drawer-session` (que solo muestra identidad: brand, avatar, nombre,\n * email), no anidado dentro de ella.\n *\n * Reproduce el mismo botón que antes vivía embebido en `DrawerSession`:\n * ícono `log-out` + label, color `--kf-color-error` con hover en\n * `--kf-color-error-soft` y foco visible con `--kf-shadow-focus`. Se separó\n * en un componente propio porque identidad y logout son responsabilidades\n * distintas — `kf-drawer-session` no debería saber que existe un botón de\n * cerrar sesión, y el footer del drawer ya tiene su propio padding/borde\n * superior (ver `Drawer.ts`) que reemplaza el borde que antes traía el botón\n * mismo.\n *\n * No sabe nada de autenticación real — solo emite `logoutClick` cuando el\n * consumidor debe cerrar la sesión real.\n *\n * `collapsed` oculta el label y centra el ícono, exponiéndolo vía `title`\n * — mismo criterio que `SidebarNavItem.collapsed` y\n * `DrawerSession.collapsed`, para cuando este botón vive dentro de un\n * `kf-sidebar-shell` colapsado.\n *\n * <kf-drawer-logout kf-portal-header-footer (logoutClick)=\"onLogout()\" />\n */\n@Component({\n selector: 'kf-drawer-logout',\n imports: [Icon],\n template: `\n <button\n type=\"button\"\n class=\"kf-drawer-logout__button\"\n [class.kf-drawer-logout__button--collapsed]=\"collapsed()\"\n [attr.title]=\"collapsed() ? label() : null\"\n (click)=\"logoutClick.emit()\"\n >\n <kf-icon name=\"log-out\" size=\"sm\" />\n @if (!collapsed()) {\n {{ label() }}\n }\n </button>\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-drawer-logout__button {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n width: 100%;\n border: none;\n background: transparent;\n padding: 0;\n font: inherit;\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--kf-color-error);\n cursor: pointer;\n }\n .kf-drawer-logout__button--collapsed {\n justify-content: center;\n }\n .kf-drawer-logout__button:hover {\n color: var(--kf-color-error-strong);\n background: var(--kf-color-error-soft);\n }\n .kf-drawer-logout__button:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n `,\n})\nexport class DrawerLogout {\n /** Label del botón, en español neutro por defecto. Input opcional por si\n * algún consumidor futuro necesita otro texto. */\n readonly label = input('Cerrar sesión');\n\n /** Oculta el label y centra el ícono — ver comentario de la clase. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n readonly logoutClick = output<void>();\n}\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Avatar } from '../avatar/Avatar';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Bloque de identidad para `[kf-drawer-header]` de `kf-drawer` o\n * `[kf-sidebar-footer]` de `kf-sidebar-shell`: avatar + nombre + email,\n * brand opcional arriba. Solo identidad — el logout vive aparte, en\n * `kf-drawer-logout`.\n *\n * `collapsed` oculta brand/nombre/email y deja solo el avatar (para un\n * `kf-sidebar-shell` colapsado). `interactive` convierte la tarjeta en un\n * botón real que emite `cardClick`, para cuando la identidad es el\n * disparador de un menú de acciones (ej. envuelta en `kf-dropdown`).\n *\n * <kf-dropdown [(open)]=\"menuOpen\">\n * <kf-drawer-session interactive name=\"Juan Pérez\" email=\"juan@empresa.com\" (cardClick)=\"menuOpen.set(!menuOpen())\" />\n * <kf-dropdown-panel variant=\"dark\">\n * <kf-dropdown-item icon=\"log-out\" tone=\"error\" (click)=\"onLogout()\">Cerrar sesión</kf-dropdown-item>\n * </kf-dropdown-panel>\n * </kf-dropdown>\n */\n@Component({\n selector: 'kf-drawer-session',\n imports: [Avatar, Icon],\n template: `\n @if (brand() && !collapsed()) {\n <span class=\"kf-drawer-session__brand\">{{ brand() }}</span>\n }\n\n @if (interactive()) {\n <button\n type=\"button\"\n class=\"kf-drawer-session__card kf-drawer-session__card--interactive\"\n [class.kf-drawer-session__card--collapsed]=\"collapsed()\"\n (click)=\"cardClick.emit()\"\n >\n <kf-avatar [initials]=\"displayInitials()\" [src]=\"avatarUrl()\" />\n @if (!collapsed()) {\n <div class=\"kf-drawer-session__identity\">\n <span class=\"kf-drawer-session__name\">{{ name() }}</span>\n @if (email()) {\n <span class=\"kf-drawer-session__email\">{{ email() }}</span>\n }\n </div>\n <kf-icon name=\"more-vertical\" size=\"sm\" />\n }\n </button>\n } @else {\n <div class=\"kf-drawer-session__card\" [class.kf-drawer-session__card--collapsed]=\"collapsed()\">\n <kf-avatar [initials]=\"displayInitials()\" [src]=\"avatarUrl()\" />\n @if (!collapsed()) {\n <div class=\"kf-drawer-session__identity\">\n <span class=\"kf-drawer-session__name\">{{ name() }}</span>\n @if (email()) {\n <span class=\"kf-drawer-session__email\">{{ email() }}</span>\n }\n </div>\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-drawer-session__brand {\n display: block;\n margin-bottom: var(--kf-space-sm);\n font-family: var(--kf-font-mono);\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: rgba(255, 255, 255, 0.65);\n }\n .kf-drawer-session__card {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n width: 100%;\n padding: var(--kf-space-sm);\n border: 1px solid rgba(255, 255, 255, 0.14);\n border-radius: var(--kf-radius-md);\n background: rgba(255, 255, 255, 0.04);\n }\n .kf-drawer-session__card--interactive {\n font: inherit;\n color: inherit;\n cursor: pointer;\n text-align: left;\n transition: background 0.14s;\n }\n .kf-drawer-session__card--interactive:hover {\n background: rgba(255, 255, 255, 0.09);\n }\n .kf-drawer-session__card--interactive:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-drawer-session__card--interactive kf-icon {\n flex: none;\n color: rgba(255, 255, 255, 0.45);\n }\n /*\n * Colapsada: solo el círculo del avatar, sin chrome de card (sin\n * borde, sin fondo, sin padding) — pedido explícito del usuario tras\n * ver el rail colapsado (simplificar a solo el círculo con iniciales).\n * Mismo cuadrado 40x40 que cada ítem de navegación y el botón de\n * colapso en ese estado — la tarjeta ya no aporta nada visualmente\n * distinguible del propio avatar cuando no hay texto que mostrar\n * dentro.\n */\n .kf-drawer-session__card--collapsed {\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n border-color: transparent;\n background: transparent;\n }\n .kf-drawer-session__card--collapsed:hover {\n background: rgba(255, 255, 255, 0.09);\n }\n .kf-drawer-session__identity {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n flex: 1 1 auto;\n }\n .kf-drawer-session__name {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--kf-color-white);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .kf-drawer-session__email {\n font-size: 0.8125rem;\n color: rgba(255, 255, 255, 0.65);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `,\n})\nexport class DrawerSession {\n readonly name = input.required<string>();\n readonly email = input<string>('');\n readonly initials = input<string>('');\n readonly avatarUrl = input<string>('');\n /** Label superior opcional, ej. \"Portal Kaufmann LATAM\". */\n readonly brand = input<string>('');\n\n /** Oculta brand/nombre/email y centra el avatar — ver comentario de la clase. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n /** Convierte la tarjeta en un botón real con ícono de kebab — ver comentario de la clase. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Se emite al clickear la tarjeta, solo cuando `interactive` es `true`. */\n readonly cardClick = output<void>();\n\n /** Si no se pasa `initials`, se derivan de `name`: primera letra de cada\n * una de las primeras 2 palabras, en mayúscula. */\n protected readonly displayInitials = computed(() => {\n const explicit = this.initials();\n if (explicit) {\n return explicit;\n }\n return this.name()\n .trim()\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word.charAt(0).toUpperCase())\n .join('');\n });\n}\n","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n TemplateRef,\n ViewContainerRef,\n contentChild,\n effect,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\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 template: `\n <button\n type=\"button\"\n class=\"kf-dropdown-item\"\n [class.kf-dropdown-item--error]=\"tone() === 'error'\"\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 `,\n styles: `\n :host {\n display: block;\n }\n .kf-dropdown-item {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n width: 100%;\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: none;\n background: transparent;\n font: inherit;\n text-align: left;\n color: var(--kf-color-text);\n cursor: pointer;\n }\n .kf-dropdown-item kf-icon {\n flex: none;\n color: var(--kf-color-text-muted);\n }\n .kf-dropdown-item__label {\n flex: 1 1 auto;\n }\n .kf-dropdown-item:hover {\n background: var(--kf-color-surface);\n }\n .kf-dropdown-item:focus-visible {\n outline: none;\n box-shadow: inset var(--kf-shadow-focus);\n }\n .kf-dropdown-item--error {\n color: var(--kf-color-error-strong);\n }\n .kf-dropdown-item--error kf-icon {\n color: var(--kf-color-error-strong);\n }\n .kf-dropdown-item--error:hover {\n background: var(--kf-color-error-soft);\n }\n\n /* Contraste para cuando este ítem vive dentro de un panel\n variant=\"dark\" (ver DropdownPanel). */\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item {\n color: rgba(255, 255, 255, 0.85);\n }\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item kf-icon {\n color: rgba(255, 255, 255, 0.55);\n }\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item:hover {\n background: rgba(255, 255, 255, 0.08);\n }\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item--error {\n color: var(--kf-color-error);\n }\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item--error kf-icon {\n color: var(--kf-color-error);\n }\n :host-context(.kf-dropdown-panel--dark) .kf-dropdown-item--error:hover {\n background: rgba(188, 69, 69, 0.16);\n }\n `,\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\nexport type DropdownPanelVariant = 'solid' | 'dark';\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@Component({\n selector: 'kf-dropdown-panel',\n template: `\n <ng-template>\n <div class=\"kf-dropdown-panel\" [class.kf-dropdown-panel--dark]=\"variant() === 'dark'\">\n <div class=\"kf-dropdown-panel__inner\" role=\"menu\">\n <ng-content />\n </div>\n </div>\n </ng-template>\n `,\n styles: `\n /* Dos capas a propósito: \\`overflow: hidden\\` y \\`box-shadow\\` en el MISMO\n elemento recortarían la propia sombra en las esquinas redondeadas.\n Borde/radio/sombra viven acá (sin overflow); el recorte de contenido\n vive en \\`.kf-dropdown-panel__inner\\`. */\n .kf-dropdown-panel {\n min-width: 220px;\n max-width: min(280px, 90vw);\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n box-shadow: var(--kf-shadow-lg);\n font-family: var(--kf-font-body);\n animation: kf-dropdown-panel-enter 0.14s ease-out;\n }\n /* Mismo tono que ya usa [kf-drawer-header]. */\n .kf-dropdown-panel--dark {\n background: var(--kf-color-tertiary-deep);\n border-color: rgba(255, 255, 255, 0.14);\n }\n .kf-dropdown-panel__inner {\n padding: var(--kf-space-xs) 0;\n overflow: hidden;\n border-radius: inherit;\n }\n @media (prefers-reduced-motion: reduce) {\n .kf-dropdown-panel {\n animation: none;\n }\n }\n @keyframes kf-dropdown-panel-enter {\n from {\n opacity: 0;\n transform: translateY(-4px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n }\n `,\n})\nexport class DropdownPanel {\n readonly variant = input<DropdownPanelVariant>('solid');\n readonly templateRef = viewChild.required(TemplateRef);\n}\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`.\n *\n * Se apoya en el CDK en vez de un `position: absolute` casero (a diferencia\n * de `SelectMenu`, que puede permitírselo porque su trigger vive siempre\n * dentro del propio componente) porque acá el disparador real puede vivir\n * en OTRO componente por completo — ej. el avatar dentro de\n * `kf-portal-header` — y el panel tiene que aparecer pegado a ESE elemento\n * sin importar dónde el consumidor 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@Component({\n selector: 'kf-dropdown',\n template: `<ng-content />`,\n styles: `\n :host {\n display: inline-block;\n }\n `,\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 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\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) — sin esto,\n * `attach()` se resuscribía a esos observables en cada apertura sin\n * cancelar la suscripción de la vez anterior, acumulando N suscripciones\n * activas sobre el mismo overlay persistente. Eso causaba el bug real de\n * \"clicks seguidos\": al abrir de nuevo, el propio pointerdown que originó\n * la apertura llegaba a más de una suscripción acumulada, disparando\n * `open.set(false)` de forma errática en el mismo tick (patrón observado:\n * abre cada 2 clicks, cierra cada 1). Se cancelan explícitamente en\n * `detach()`, antes de la siguiente `attach()`.\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 this.destroyRef.onDestroy(() => {\n this.overlaySubscription?.unsubscribe();\n this.overlayRef?.dispose();\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.\n */\n @HostListener('document:keydown.escape')\n onDocumentEscape(): void {\n this.open.set(false);\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 }\n }),\n );\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 * (el trigger no es hijo del overlay) también llega a\n * `outsidePointerEvents()`, cerrando el panel en el mismo gesto que lo\n * abrió — bug real reproducido con Playwright: \"abre y cierra\" en\n * clicks consecutivos rápidos sobre la tarjeta de sesión del sidebar.\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 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, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\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],\n template: `\n @if (badge()) {\n <span class=\"kf-feature-card__badge\">\n @if (badgeIcon(); as iconName) {\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n }\n {{ badge() }}\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 `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-lg);\n border-radius: var(--kf-radius-md);\n background: linear-gradient(\n 135deg,\n var(--kf-color-primary-active) 0%,\n var(--kf-color-tertiary-deep) 100%\n );\n color: var(--kf-color-white);\n font-family: var(--kf-font-body);\n }\n .kf-feature-card__badge {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n background: rgba(255, 255, 255, 0.12);\n border: 1px solid rgba(255, 255, 255, 0.24);\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n }\n .kf-feature-card__title {\n font-family: var(--kf-font-title);\n font-size: 1.375rem;\n font-weight: 700;\n line-height: 1.2;\n }\n .kf-feature-card__description {\n margin: 0;\n max-width: 48ch;\n color: rgba(255, 255, 255, 0.8);\n font-size: 0.9375rem;\n }\n .kf-feature-card__action {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n margin-top: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-md);\n border-radius: var(--kf-radius-sm);\n background: rgba(255, 255, 255, 0.14);\n color: var(--kf-color-white);\n font-size: 0.875rem;\n font-weight: 600;\n text-decoration: none;\n transition: background 0.14s;\n }\n .kf-feature-card__action:hover {\n background: rgba(255, 255, 255, 0.22);\n }\n `,\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","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 template: `\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 `,\n styles: `\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-surface);\n font: inherit;\n font-family: var(--kf-font-body);\n color: var(--kf-color-text);\n line-height: 1.2;\n }\n :host(.kf-field--select) {\n cursor: pointer;\n }\n :host(.kf-field--select:hover) {\n border-color: var(--kf-color-border-strong);\n }\n .kf-field__icon {\n color: var(--kf-color-text-muted);\n }\n .kf-field__label {\n color: var(--kf-color-text-muted);\n white-space: nowrap;\n }\n .kf-field__value {\n font-weight: 500;\n color: var(--kf-color-ink);\n white-space: nowrap;\n }\n .kf-field__placeholder {\n color: var(--kf-color-text-muted);\n font-weight: 400;\n }\n .kf-field__chevron {\n color: var(--kf-color-text-muted);\n }\n `,\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","import { Component, computed, input, output } from '@angular/core';\n\n/** Forma normalizada interna de cada opción, ya resuelta a value/label. */\ninterface FilterChipOption {\n value: string;\n label: string;\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 } cuando el texto mostrado difiere\n * del valor interno.\n *\n * El chip activo se resalta con el color \"ink\" oscuro (--kf-color-ink), no\n * con el color primario de marca: así lo define el sistema de diseño de\n * referencia para este componente en particular.\n *\n * <kf-filter-chips [options]=\"['Todos', 'Activos', 'Archivados']\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n *\n * <kf-filter-chips [options]=\"[{ value: 'all', label: 'Todos' }]\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n */\n@Component({\n selector: 'kf-filter-chips',\n template: `\n <div class=\"kf-filter-chips\" role=\"group\">\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 </button>\n }\n </div>\n `,\n styles: `\n :host {\n display: block;\n }\n .kf-filter-chips {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kf-space-xs);\n }\n .kf-filter-chips__chip {\n font: inherit;\n padding: var(--kf-space-xs) var(--kf-space-md);\n border-radius: var(--kf-radius-pill);\n border: 1px solid var(--kf-color-border);\n background: var(--kf-color-surface);\n color: var(--kf-color-text);\n cursor: pointer;\n transition:\n background 0.14s,\n border-color 0.14s,\n color 0.14s;\n }\n .kf-filter-chips__chip:hover:not(.kf-filter-chips__chip--active) {\n border-color: var(--kf-color-border-strong);\n }\n .kf-filter-chips__chip:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-filter-chips__chip--active {\n background: var(--kf-color-ink);\n border-color: var(--kf-color-ink);\n color: var(--kf-color-white);\n }\n `,\n})\nexport class FilterChips {\n readonly options = input.required<(string | { value: string; label: string })[]>();\n readonly value = input<string>('');\n\n readonly valueChange = output<string>();\n\n /** Normaliza cada opción string/objeto a la forma { value, label }. */\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 return;\n }\n this.valueChange.emit(value);\n }\n}\n","import { Component, Directive, computed, contentChild, input, output } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\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\n * panel. Sin lógica propia — existe solo como token de tipo para que\n * `contentChild(FolderTabsPanel)` pueda detectar si el consumidor proyectó\n * algo (mismo mecanismo que `kf-dropdown` usa con `contentChild(DropdownPanel)`;\n * acá no hace falta un componente completo, alcanza con una directiva de\n * atributo porque el panel no necesita comportamiento propio, solo marcar\n * su presencia).\n *\n * <div kfFolderTabsPanel>...</div>\n */\n@Directive({ selector: '[kfFolderTabsPanel]' })\nexport class FolderTabsPanel {}\n\n/**\n * Tabs con forma de \"carpeta\": el borde superior queda redondeado y el borde\n * inferior de la pestaña activa se funde visualmente con el panel de\n * contenido que va debajo (misma superficie, sin línea divisoria).\n *\n * Al cambiar de pestaña, la que se activa se \"abre\": gira sobre su borde\n * inferior (hinge 3D) y sube con un pequeño rebote. Es CSS solo: la clase\n * `--active` se mueve de un botón a otro, y eso vuelve a disparar el keyframe\n * sin tocar JS.\n *\n * El panel de contenido es un `<ng-content>` OPCIONAL — si el consumidor no\n * proyecta nada, `kf-folder-tabs` renderiza solo la fila de pestañas (mismo\n * comportamiento que antes de que existiera este slot, detectado con\n * `contentChild()` sin `.required`, igual patrón que usa `kf-dropdown` para\n * saber si hay un `kf-dropdown-panel` proyectado). Si SÍ proyecta contenido,\n * se envuelve en un panel con la esquina superior-izquierda recta (nace ahí\n * la primera pestaña, siempre pegada al borde izquierdo de la fila — un\n * radio ahí competiría visualmente con el propio borde redondeado de esa\n * pestaña) y las otras tres redondeadas. El `border-bottom` de 2px de la\n * pestaña activa (ver `.kf-folder-tabs__tab--active` más abajo) es la señal\n * visual de conexión con el panel para CUALQUIER pestaña activa, sin\n * necesitar mover ni medir nada.\n *\n * El borde izquierdo de toda la fila (y por lo tanto de la esquina recta\n * del panel) depende de que ninguna pestaña se corra al cambiar de estado\n * — ver `transform-origin: bottom left` en `.kf-folder-tabs__tab`: con el\n * origen centrado (como estaba antes), el `scale()` de la pestaña inactiva\n * encogía el borde izquierdo unos px, y ese corrimiento sub-pixel es lo que\n * hacía que este mismo diseño (esquina fija) se viera \"roto\" cuando la\n * pestaña activa no era la primera. Con el origen anclado a la izquierda,\n * el corrimiento desaparece y la esquina fija vuelve a ser una solución\n * válida y simple — sin necesitar medir la pestaña activa por JS.\n *\n * Antes de este slot, el patrón era que el consumidor pusiera su propia\n * card como HERMANO de `kf-folder-tabs` y anulara a mano el radio superior\n * completo (`border-top-left-radius: 0`, `border-top-right-radius: 0` — ver\n * el caso original de `web-portal-latam-frontend`). Encapsular esto acá\n * evita que cada consumidor repita esas reglas a mano.\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, como antes: -->\n * <kf-folder-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-folder-tabs',\n imports: [Icon],\n template: `\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]=\"'kf-folder-panel-' + 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-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 <div class=\"kf-folder-tabs__panel\" [class.kf-folder-tabs__panel--empty]=\"!hasPanel()\">\n <ng-content select=\"[kfFolderTabsPanel]\" />\n </div>\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-folder-tabs {\n display: flex;\n align-items: flex-end;\n gap: var(--kf-space-xs);\n /* Da profundidad al hinge: las pestañas giran sobre su borde inferior. */\n perspective: 900px;\n }\n .kf-folder-tabs__tab {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n font: inherit;\n font-size: 0.9rem;\n color: var(--kf-color-text-muted);\n background: var(--kf-color-surface);\n border: 1px solid var(--kf-color-border);\n border-bottom-color: var(--kf-color-border-strong);\n border-radius: var(--kf-radius-sm) var(--kf-radius-sm) 0 0;\n padding: var(--kf-space-sm) var(--kf-space-md);\n cursor: pointer;\n /* bottom left, no bottom center: con el origen centrado, el\n scale() de abajo encoge/agranda la pestaña desde su centro\n horizontal — el borde IZQUIERDO se corre unos px cada vez que\n una pestaña cambia de activa a inactiva (o viceversa), lo que\n desalinea la fila entera contra el panel de abajo (se percibe\n como si la tab \"se rompiera\"). Con el origen a la izquierda, el\n crecimiento/encogimiento siempre pasa hacia la derecha: el borde\n izquierdo de cada pestaña — y por lo tanto el de toda la fila —\n nunca se mueve. */\n transform-origin: bottom left;\n /* Inactiva: hundida en la pila, un pelo más chica. */\n transform: translateY(5px) scale(0.985);\n transition:\n background 0.14s,\n color 0.14s,\n border-color 0.14s,\n transform 0.22s cubic-bezier(0.32, 0.72, 0, 1);\n }\n .kf-folder-tabs__tab:hover:not(.kf-folder-tabs__tab--active) {\n color: var(--kf-color-text);\n background: var(--kf-color-white);\n transform: translateY(2px) scale(0.99);\n }\n .kf-folder-tabs__tab:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n z-index: 1;\n }\n .kf-folder-tabs__tab--active {\n z-index: 1;\n color: var(--kf-color-primary);\n font-weight: 700;\n background: var(--kf-color-white);\n border-color: var(--kf-color-border);\n /* Marca el color del tema abajo (página 19 del design system) — no se\n funde con el panel: el borde queda visible y grueso, mismo trato\n que el subrayado de kf-tabs. */\n border-bottom: 2px solid var(--kf-color-primary);\n /* Sombra hacia arriba: la pestaña quedó por delante del resto. */\n box-shadow: 0 -6px 14px -10px rgba(16, 24, 40, 0.4);\n transform: translateY(1px);\n animation: kf-folder-tabs-pull 0.34s cubic-bezier(0.22, 1.2, 0.36, 1) both;\n }\n @keyframes kf-folder-tabs-pull {\n /*\n * Rotación y rebote reducidos a propósito: la versión original\n * (rotateX(-24deg), overshoot a scale(1.02)) se sentía excesiva en\n * un patrón de uso frecuente como cambiar de tab — la gente lo hace\n * seguido y rápido, así que un exceso de movimiento cansa más que\n * \"da personalidad\". Se mantiene el espíritu de \"carpeta que se\n * abre\" (rotateX + lift), con menos intensidad.\n */\n 0% {\n transform: translateY(7px) rotateX(-10deg) scale(0.97);\n }\n /*\n * El rebote (overshoot) se resuelve DENTRO del rango final, no por\n * encima: antes este paso intermedio llegaba a translateY(-2px) —\n * más arriba que la posición de reposo (translateY(1px)) — y esos\n * 3px de más dejaban un hueco visible contra el panel de abajo (que\n * no se mueve) durante la fracción de segundo del rebote. Ahora el\n * mínimo del rebote es translateY(1px), igual que el reposo: la\n * pestaña nunca sube más allá de donde termina.\n */\n 60% {\n transform: translateY(1px) rotateX(2deg) scale(1.01);\n }\n 100% {\n transform: translateY(1px) rotateX(0) scale(1);\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .kf-folder-tabs__tab,\n .kf-folder-tabs__tab--active {\n animation: none;\n transition:\n background 0.14s,\n color 0.14s,\n border-color 0.14s;\n }\n }\n\n /*\n * Panel opcional (kfFolderTabsPanel proyectado). Vacío cuando el\n * consumidor no proyecta nada — display: contents para que no ocupe\n * espacio ni imponga su propio box en ese caso, dejando a\n * kf-folder-tabs comportarse exactamente como antes de este slot\n * (solo la fila de pestañas).\n */\n .kf-folder-tabs__panel--empty {\n display: contents;\n }\n .kf-folder-tabs__panel:not(.kf-folder-tabs__panel--empty) {\n background: var(--kf-color-white);\n /*\n * Bordes declarados por lado (en vez de la shorthand border) — dos\n * shorthands consecutivos que tocan la misma propiedad terminaban\n * pisándose mal al compilarse (el border quedaba vacío en el CSS\n * final). Declarar cada lado explícito evita el conflicto.\n */\n border-right: 1px solid var(--kf-color-border);\n border-bottom: 1px solid var(--kf-color-border);\n border-left: 1px solid var(--kf-color-border);\n border-top: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n /*\n * Solo la esquina superior-izquierda queda recta: es donde nace la\n * primera pestaña, y un radio ahí competiría visualmente con el\n * propio borde redondeado de esa pestaña. Va DESPUÉS del shorthand\n * de arriba a propósito — el shorthand fija las 4 esquinas, y esta\n * declaración más específica pisa solo la superior-izquierda.\n */\n border-top-left-radius: 0;\n /* Sin box-shadow a propósito: el borde de 1px solo es el mismo que\n usa cualquier kf-card sin sombra propia — consistente con el\n resto de la librería. */\n /* El contenido proyectado (ej. una kf-card rectangular, sin su\n propio border-radius) se desbordaba por encima de las esquinas\n redondeadas del panel — mismo motivo por el que Card usa\n overflow: hidden en su propio :host. */\n overflow: hidden;\n }\n `,\n})\nexport class FolderTabs {\n readonly options = input.required<FolderTabOption[]>();\n readonly value = input.required<string>();\n readonly valueChange = output<string>();\n\n /**\n * Detecta si el consumidor proyectó contenido marcado con\n * `kfFolderTabsPanel` — sin `.required`, así que es `undefined`\n * cuando no hay nada proyectado (mismo patrón que usa `kf-dropdown` con\n * `contentChild(DropdownPanel)` para saber si hay un panel que\n * attachear). `hasPanel()` decide si el wrapper del panel participa del\n * layout (`display: contents` si no).\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 /** Navegación estándar de ARIA tabs: flechas mueven el foco y activan la pestaña. */\n onKeydown(event: KeyboardEvent, currentValue: string): void {\n const items = this.options();\n const currentIndex = items.findIndex((option) => option.value === currentValue);\n\n let nextIndex: number;\n switch (event.key) {\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % items.length;\n break;\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + items.length) % items.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = items.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const nextOption = items[nextIndex];\n this.select(nextOption.value);\n\n const host = (event.currentTarget as HTMLElement).parentElement;\n const nextId = `kf-folder-tab-${nextOption.value}`;\n const nextButton = Array.from(host?.querySelectorAll<HTMLButtonElement>('button') ?? []).find(\n (button) => button.id === nextId,\n );\n nextButton?.focus();\n }\n}\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 template: `\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 `,\n styles: `\n :host {\n display: block;\n margin-top: auto;\n background: var(--kf-color-tertiary-deep);\n }\n .kf-footer__wrap {\n max-width: var(--kf-footer-max-width, none);\n margin: 0 auto;\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--kf-space-lg);\n min-height: 4.5rem;\n padding: var(--kf-space-md) var(--kf-space-lg);\n }\n .kf-footer__logo {\n height: 1.375rem;\n opacity: 0.9;\n }\n .kf-footer__copyright {\n font-size: 0.8125rem;\n color: rgba(255, 255, 255, 0.55);\n font-family: var(--kf-font-body);\n }\n .kf-footer__links {\n margin-left: auto;\n display: flex;\n flex-wrap: wrap;\n gap: var(--kf-space-lg);\n }\n .kf-footer__links a {\n font-size: 0.8125rem;\n color: rgba(255, 255, 255, 0.66);\n text-decoration: none;\n font-family: var(--kf-font-body);\n }\n .kf-footer__links a:hover {\n color: #fff;\n }\n @media (max-width: 640px) {\n .kf-footer__wrap {\n flex-direction: column;\n align-items: flex-start;\n }\n .kf-footer__links {\n margin-left: 0;\n }\n }\n `,\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","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';\nimport { Icon, IconName } from '../icon/Icon';\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@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 template: `\n @if (label()) {\n <kf-field-label [for]=\"inputId\" [required]=\"required()\">{{ label() }}</kf-field-label>\n }\n <div\n class=\"kf-input__field\"\n [class.kf-input__field--disabled]=\"isDisabled()\"\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 [disabled]=\"isDisabled()\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : hint() ? hintId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n [value]=\"value()\"\n (input)=\"onInput(nativeInput.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\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\" [id]=\"errorId\" role=\"alert\">{{ message }}</span>\n } @else if (hint()) {\n <span class=\"kf-input__hint\" [id]=\"hintId\">{{ hint() }}</span>\n }\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n font-family: var(--kf-font-body);\n }\n .kf-input__field {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: 0 var(--kf-space-sm);\n background: var(--kf-color-surface);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n transition:\n background 0.14s,\n border-color 0.14s,\n box-shadow 0.14s;\n }\n .kf-input__field--focused {\n background: var(--kf-color-white);\n border-color: var(--kf-color-primary);\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-input__field--invalid {\n border-color: var(--kf-color-error);\n }\n .kf-input__field--invalid.kf-input__field--focused {\n box-shadow: 0 0 0 3px rgba(235, 87, 87, 0.22);\n }\n .kf-input__field--disabled {\n opacity: 0.5;\n }\n .kf-input__icon {\n color: var(--kf-color-text-muted);\n }\n .kf-input__field--invalid .kf-input__icon {\n color: var(--kf-color-error);\n }\n .kf-input__control {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n font: inherit;\n color: var(--kf-color-text);\n padding: var(--kf-space-sm) 0;\n }\n .kf-input__control::placeholder {\n color: var(--kf-color-text-muted);\n }\n .kf-input__control:disabled {\n cursor: not-allowed;\n }\n .kf-input__suffix {\n flex: none;\n color: var(--kf-color-text-muted);\n font-size: 0.875rem;\n }\n .kf-input__toggle {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n padding: var(--kf-space-xs);\n margin: 0 calc(var(--kf-space-xs) * -1);\n color: var(--kf-color-text-muted);\n cursor: pointer;\n border-radius: var(--kf-radius-xs);\n transition: color 0.14s;\n }\n .kf-input__toggle:hover {\n color: var(--kf-color-text);\n }\n .kf-input__toggle:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-input__hint {\n font-size: 0.75rem;\n color: var(--kf-color-text-muted);\n }\n .kf-input__error {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--kf-color-error-strong);\n }\n `,\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 /** Marca el label con un asterisco visual — no aplica `required` al `<input>` nativo por sí solo. */\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 readonly type = input<string>('text');\n readonly placeholder = input<string>('');\n /** Agrega el botón de mostrar/ocultar — sin efecto si `type` no es `\"password\"`. */\n readonly toggleable = input(false, { transform: booleanAttribute });\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 /**\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 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 * 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","import { booleanAttribute, Component, input } from '@angular/core';\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\". Antes de este componente,\n * `web-portal-latam-frontend` reimplementaba esto dos veces (`.login__forgot`\n * como `<a href=\"#\">` con `preventDefault()`, `.login__back` como\n * `<button>`), cada una con su propio `:focus-visible` copiado literal.\n *\n * Es siempre un `<button type=\"button\">` por dentro, nunca un `<a>`: ninguno\n * de los dos casos reales navega a otra URL, ambos disparan una acción en la\n * misma pantalla (cambiar de vista, someter un flujo). Si en el futuro un\n * consumidor necesita navegación real con href, esa es una discusión de API\n * distinta (`kf-link` con `[routerLink]`/`href`), no se fuerza acá sin caso\n * de uso confirmado.\n *\n * `variant=\"default\"` (color primario, subrayado en hover) es para la\n * acción de mayor jerarquía relativa de la pantalla (ej. \"¿Olvidaste tu\n * contraseña?\"); `variant=\"muted\"` (gris que pasa a primario en hover) es\n * para acciones de retroceso/salida (ej. \"← Volver a iniciar sesión\").\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 */\n@Component({\n selector: 'kf-link',\n template: `\n <button\n type=\"button\"\n class=\"kf-link\"\n [class.kf-link--muted]=\"variant() === 'muted'\"\n [disabled]=\"disabled()\"\n >\n <ng-content />\n </button>\n `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-link {\n padding: 0;\n border: none;\n background: transparent;\n font: inherit;\n font-weight: 500;\n color: var(--kf-color-primary);\n text-decoration: none;\n cursor: pointer;\n }\n .kf-link:hover:not(:disabled) {\n text-decoration: underline;\n }\n .kf-link:focus-visible {\n outline: 2px solid var(--kf-color-primary);\n outline-offset: 2px;\n border-radius: var(--kf-radius-xs);\n }\n .kf-link:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .kf-link--muted {\n color: var(--kf-color-text-muted);\n }\n .kf-link--muted:hover:not(:disabled) {\n color: var(--kf-color-primary);\n text-decoration: none;\n }\n `,\n})\nexport class Link {\n readonly variant = input<LinkVariant>('default');\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","import { Component, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Icon, IconName } from '../icon/Icon';\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 * <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 */\n@Component({\n selector: 'kf-metric-card',\n imports: [Card, Icon],\n template: `\n <kf-card>\n <div class=\"kf-metric-card__head\">\n <span class=\"kf-metric-card__label\">{{ label() }}</span>\n @if (icon(); as iconName) {\n <span class=\"kf-metric-card__icon\">\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n </span>\n }\n </div>\n <div class=\"kf-metric-card__value-row\">\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\">{{ badge() }}</span>\n }\n </div>\n @if (foot()) {\n <div class=\"kf-metric-card__foot\">{{ foot() }}</div>\n }\n </kf-card>\n `,\n styles: `\n :host {\n display: block;\n }\n .kf-metric-card__head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--kf-space-xs);\n }\n .kf-metric-card__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1.75rem;\n height: 1.75rem;\n flex: none;\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-primary-soft);\n color: var(--kf-color-primary);\n }\n .kf-metric-card__label {\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n color: var(--kf-color-text-muted);\n }\n .kf-metric-card__value-row {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n }\n .kf-metric-card__value {\n font-family: var(--kf-font-title);\n font-weight: 700;\n font-size: 1.6rem;\n line-height: 1.1;\n color: var(--kf-color-ink);\n }\n .kf-metric-card__unit {\n font-size: 0.85rem;\n font-weight: 500;\n color: var(--kf-color-text-muted);\n margin-left: var(--kf-space-xs);\n }\n .kf-metric-card__badge {\n font-size: 0.72rem;\n font-weight: 700;\n padding: 2px var(--kf-space-xs);\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-success-soft);\n color: var(--kf-color-success-strong);\n }\n .kf-metric-card__foot {\n font-size: 0.78rem;\n color: var(--kf-color-text-muted);\n }\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}\n","import { DOCUMENT } from '@angular/common';\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';\n\nlet modalId = 0;\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`.\n *\n * <kf-modal [(open)]=\"confirmOpen\" title=\"Eliminar unidad\">\n * <p>Esta acción no se puede deshacer.</p>\n * <div footer>\n * <kf-button variant=\"ghost\" (click)=\"confirmOpen.set(false)\">Cancelar</kf-button>\n * <kf-button (click)=\"remove()\">Eliminar</kf-button>\n * </div>\n * </kf-modal>\n */\n@Component({\n selector: 'kf-modal',\n template: `\n <dialog\n #dialog\n class=\"kf-modal\"\n [attr.aria-labelledby]=\"title() ? titleId : null\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n >\n @if (open()) {\n <div class=\"kf-modal__panel\">\n <div class=\"kf-modal__head\">\n @if (title()) {\n <h2 class=\"kf-modal__title\" [id]=\"titleId\">{{ title() }}</h2>\n }\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 <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </button>\n }\n </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 `,\n styles: `\n .kf-modal {\n width: min(480px, calc(100vw - 2 * var(--kf-space-md)));\n max-height: calc(100vh - 2 * var(--kf-space-xl));\n padding: 0;\n border: none;\n background: transparent;\n overflow: visible;\n font-family: var(--kf-font-body);\n }\n .kf-modal::backdrop {\n background: rgba(23, 29, 37, 0.45);\n }\n .kf-modal__panel {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-md);\n padding: var(--kf-space-lg);\n background: var(--kf-color-white);\n border-radius: var(--kf-radius-md);\n box-shadow: var(--kf-shadow-lg);\n }\n .kf-modal__head {\n display: flex;\n align-items: flex-start;\n gap: var(--kf-space-sm);\n }\n .kf-modal__title {\n flex: 1;\n margin: 0;\n font-family: var(--kf-font-title);\n font-size: 1.375rem;\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-modal__close {\n flex: none;\n display: inline-flex;\n padding: 2px;\n border: none;\n background: transparent;\n color: var(--kf-color-text-muted);\n border-radius: var(--kf-radius-xs);\n cursor: pointer;\n }\n .kf-modal__close svg {\n width: 1.25em;\n height: 1.25em;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.9;\n stroke-linecap: round;\n }\n .kf-modal__close:hover {\n color: var(--kf-color-ink);\n }\n .kf-modal__close:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-modal__body {\n color: var(--kf-color-text);\n overflow-y: auto;\n }\n .kf-modal__footer:empty {\n display: none;\n }\n .kf-modal__footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--kf-space-sm);\n }\n `,\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\n protected readonly titleId = `kf-modal-title-${modalId++}`;\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly document = inject(DOCUMENT);\n\n constructor() {\n afterRenderEffect(() => {\n const el = this.dialog()?.nativeElement;\n if (!el) {\n return;\n }\n if (this.open() && !el.open) {\n // ponytail: `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 * 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","import { Overlay, type OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\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 { FieldLabel } from '../field-label/FieldLabel';\nimport { normalizeForSearch } from '../shared/search-text';\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 * Hasta la `0.1.9` este panel vivía con `position: absolute` manual sobre el\n * propio host, sin depender del CDK Overlay. Se migró para unificar el\n * mecanismo de posicionamiento/cierre con el resto de los dropdowns flotantes\n * de la librería (4 posiciones de fallback, `withViewportMargin`, `withPush`,\n * cierre por `outsidePointerEvents()`/`keydownEvents()` en vez de un\n * `@HostListener('document:click')` manual).\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 * Pendiente: el prop `icon` de otros componentes del design system requiere\n * un componente Icon / sprite SVG que esta librería todavía no tiene — este\n * componente no usa iconos, así que no aplica acá.\n */\n@Component({\n selector: 'kf-multi-select',\n imports: [FieldLabel],\n template: `\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\"\n [class.kf-multi-select__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\"\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\"\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 `,\n styles: `\n :host {\n display: inline-flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n font: inherit;\n /*\n * Ancho FIJO, no min-width: con solo un piso, el host podía seguir\n * creciendo sin límite a medida que summaryText() sumaba más labels\n * seleccionados — un multiselect con 3-4 opciones largas terminaba\n * ocupando el doble o el triple que el resto de los campos del mismo\n * formulario. El texto que no entra se corta con el\n * text-overflow: ellipsis que .kf-multi-select__value ya tenía, el\n * badge de conteo (.kf-multi-select__count) sigue siempre visible al\n * lado para comunicar cuántas opciones hay seleccionadas aunque el\n * texto se trunque.\n */\n width: 240px;\n }\n .kf-multi-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-sm);\n width: 100%;\n font: inherit;\n font-family: var(--kf-font-body);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-white);\n color: var(--kf-color-text);\n cursor: pointer;\n transition:\n border-color 0.14s,\n box-shadow 0.14s;\n }\n .kf-multi-select__trigger:hover:not(:disabled) {\n border-color: var(--kf-color-border-strong);\n }\n .kf-multi-select__trigger:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-multi-select__trigger:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .kf-multi-select__value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n text-align: left;\n }\n .kf-multi-select__value--placeholder {\n color: var(--kf-color-text-muted);\n }\n .kf-multi-select__count {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 5px;\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-primary);\n color: var(--kf-color-white);\n font-size: 0.72rem;\n font-weight: 700;\n }\n .kf-multi-select__caret {\n flex-shrink: 0;\n width: 8px;\n height: 8px;\n border-right: 2px solid var(--kf-color-text-muted);\n border-bottom: 2px solid var(--kf-color-text-muted);\n transform: rotate(45deg);\n transition: transform 0.14s;\n margin-top: -4px;\n }\n .kf-multi-select__caret--open {\n transform: rotate(-135deg);\n margin-top: 4px;\n }\n .kf-multi-select__panel {\n box-sizing: border-box;\n width: 100%;\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n box-shadow: var(--kf-shadow-md);\n overflow: hidden;\n }\n .kf-multi-select__search {\n box-sizing: border-box;\n width: 100%;\n font: inherit;\n font-family: var(--kf-font-body);\n color: var(--kf-color-text);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: none;\n border-bottom: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm) var(--kf-radius-sm) 0 0;\n outline: none;\n }\n .kf-multi-select__search:focus-visible {\n box-shadow: inset 0 0 0 2px var(--kf-color-primary);\n }\n .kf-multi-select__list {\n box-sizing: border-box;\n width: 100%;\n margin: 0;\n padding: var(--kf-space-xs) 0;\n list-style: none;\n max-height: 240px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--kf-color-gray-400) transparent;\n }\n .kf-multi-select__list::-webkit-scrollbar {\n width: 6px;\n }\n .kf-multi-select__list::-webkit-scrollbar-track {\n background: transparent;\n }\n .kf-multi-select__list::-webkit-scrollbar-thumb {\n background-color: var(--kf-color-gray-400);\n border-radius: var(--kf-radius-pill);\n }\n .kf-multi-select__list::-webkit-scrollbar-thumb:hover {\n background-color: var(--kf-color-gray-500);\n }\n .kf-multi-select__option {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm) var(--kf-space-md);\n color: var(--kf-color-text);\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .kf-multi-select__option:hover {\n background: var(--kf-color-primary-soft);\n }\n .kf-multi-select__option--selected {\n color: var(--kf-color-primary);\n font-weight: 600;\n }\n /* Opción con foco de teclado — distinta del hover, comparte el mismo tinte de fondo. */\n .kf-multi-select__option--active {\n background: var(--kf-color-primary-soft);\n }\n .kf-multi-select__checkbox {\n display: inline-flex;\n flex-shrink: 0;\n width: var(--kf-space-md);\n height: var(--kf-space-md);\n border: 1px solid var(--kf-color-border-strong);\n border-radius: var(--kf-radius-xs);\n background: var(--kf-color-white);\n transition:\n background 0.14s,\n border-color 0.14s;\n position: relative;\n }\n .kf-multi-select__checkbox--checked {\n background: var(--kf-color-primary);\n border-color: var(--kf-color-primary);\n }\n .kf-multi-select__checkbox--checked::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 4px;\n height: 8px;\n border: solid var(--kf-color-white);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n /* \"Todas\" con selección parcial: barra horizontal, mismo patrón que Checkbox. */\n .kf-multi-select__checkbox--indeterminate {\n background: var(--kf-color-primary);\n border-color: var(--kf-color-primary);\n }\n .kf-multi-select__checkbox--indeterminate::after {\n content: '';\n position: absolute;\n left: 3px;\n top: 6px;\n width: 8px;\n height: 2px;\n background: var(--kf-color-white);\n border: none;\n transform: none;\n }\n .kf-multi-select__option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .kf-multi-select__empty {\n text-align: center;\n padding: var(--kf-space-sm) var(--kf-space-md);\n color: var(--kf-color-text-muted);\n }\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 * 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 overlayService = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly destroyRef = inject(DestroyRef);\n\n private overlayRef: OverlayRef | null = null;\n\n constructor() {\n effect(() => {\n if (this.isOpen()) {\n this.attach();\n } else {\n this.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 this.destroyRef.onDestroy(() => this.overlayRef?.dispose());\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 @HostListener('document:keydown.escape')\n onEscape(): void {\n this.isOpen.set(false);\n }\n\n private attach(): void {\n if (this.overlayRef?.hasAttached()) {\n return;\n }\n\n const overlayRef = this.getOrCreateOverlayRef();\n // Se remide el ancho del trigger en cada apertura, no solo la primera —\n // ver la misma nota en Select: cachear el ancho en la creación del\n // overlay lo deja desincronizado si el trigger cambia de tamaño entre\n // una apertura y la siguiente.\n overlayRef.updateSize({ width: this.triggerRef().nativeElement.getBoundingClientRect().width });\n\n const portal = new TemplatePortal(this.panelTemplate(), this.viewContainerRef);\n overlayRef.attach(portal);\n\n // outsidePointerEvents() dispara en la fase de CAPTURA de `click` sobre\n // `body` (ver OverlayOutsideClickDispatcher en @angular/cdk), ANTES de\n // que el evento llegue al trigger y corra (click)=\"toggle()\". Sin este\n // filtro, un click en el trigger para CERRAR el panel ya abierto hacía:\n // 1) este subscribe lo cierra primero (el trigger no es parte del\n // overlay, cuenta como \"afuera\"), 2) toggle() corre después y lo vuelve a\n // abrir porque ve isOpen ya en false — un solo click quedaba en no-op y\n // solo cerraba de verdad un click fuera del trigger. Mismo fix que Select\n // y Dropdown (ver notas ahí).\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 this.isOpen.set(false);\n });\n overlayRef.keydownEvents().subscribe((event) => {\n if (event.key === 'Escape') {\n this.isOpen.set(false);\n }\n });\n }\n\n private detach(): void {\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.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 width: this.triggerRef().nativeElement.getBoundingClientRect().width,\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\n }\n}\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';\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 * <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 */\n@Component({\n selector: 'kf-text',\n imports: [NgTemplateOutlet],\n template: `\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 `,\n styles: `\n :host {\n display: contents;\n }\n h1,\n h2,\n h3,\n p,\n span {\n margin: 0;\n font-family: var(--kf-font-body);\n color: var(--kf-color-text);\n }\n\n /* Variant — tamaño y peso, independiente de la etiqueta semántica. */\n .kf-text--title-xxl {\n font-family: var(--kf-font-title);\n font-size: var(--kf-font-size-title-xxl);\n font-weight: var(--kf-font-weight-title);\n color: var(--kf-color-ink);\n }\n .kf-text--title-xl {\n font-family: var(--kf-font-title);\n font-size: var(--kf-font-size-title-xl);\n font-weight: var(--kf-font-weight-title);\n color: var(--kf-color-ink);\n }\n .kf-text--title-lg {\n font-family: var(--kf-font-title);\n font-size: var(--kf-font-size-title-lg);\n font-weight: var(--kf-font-weight-title);\n color: var(--kf-color-ink);\n }\n .kf-text--title-md {\n font-family: var(--kf-font-title);\n font-size: var(--kf-font-size-title-md);\n font-weight: var(--kf-font-weight-title);\n color: var(--kf-color-ink);\n }\n .kf-text--title-sm {\n font-family: var(--kf-font-title);\n font-size: var(--kf-font-size-title-sm);\n font-weight: var(--kf-font-weight-title);\n color: var(--kf-color-ink);\n }\n .kf-text--body {\n font-size: var(--kf-font-size-body);\n font-weight: var(--kf-font-weight-body);\n }\n .kf-text--body-muted {\n font-size: var(--kf-font-size-body);\n font-weight: var(--kf-font-weight-body);\n color: var(--kf-color-text-muted);\n }\n .kf-text--caption {\n font-size: var(--kf-font-size-caption);\n font-weight: var(--kf-font-weight-body);\n color: var(--kf-color-text-muted);\n }\n\n /* Tone — semántica de color, se superpone al color del variant. */\n .kf-text--ok {\n color: var(--kf-color-success-strong);\n }\n .kf-text--warn {\n color: var(--kf-color-warning-strong);\n }\n .kf-text--error {\n color: var(--kf-color-error-strong);\n }\n .kf-text--info {\n color: var(--kf-color-info-strong);\n }\n `,\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 if (this.tone() !== 'neutral') {\n classes.push(`kf-text--${this.tone()}`);\n }\n return classes.join(' ');\n }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text, TextVariant } from '../text/Text';\n\n/**\n * Tamaño del título — `md` es el tamaño de siempre (no rompe a nadie que no\n * lo especifique). Cada valor mapea 1:1 a una variante `title-*` de\n * `kf-text` (ver `Text.ts`); `xl`/`xxl` son el tier \"hero\" de esa escala,\n * pensado para casos de un título más protagonista (ej. bienvenida del home).\n */\nexport type PageHeaderTitleSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\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]\">`, para no acoplar el componente a un set\n * fijo de botones.\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 template: `\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]=\"titleVariant()\">\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 `,\n styles: `\n :host {\n display: flex;\n align-items: center;\n gap: var(--kf-space-md);\n font-family: var(--kf-font-body);\n }\n .kf-page-header__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /* El chip necesita bastante más aire que el ícono (24px \"lg\") que\n contiene — con --kf-space-xl (32px) quedaban casi pegados. */\n width: 48px;\n height: 48px;\n border-radius: var(--kf-radius-md);\n background: var(--kf-color-primary-soft);\n color: var(--kf-color-primary);\n }\n .kf-page-header__heading {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n flex: 1 1 auto;\n min-width: 0;\n }\n /* Familia, peso, tamaño y color de fuente vienen de la variante title-*\n de kf-text (ver titleVariant()) — acá solo el line-height, que kf-text\n no fija por variant. */\n .kf-page-header__title {\n line-height: 1.2;\n }\n .kf-page-header__subtitle {\n margin: 0;\n font-size: 0.9375rem;\n color: var(--kf-color-text-muted);\n }\n .kf-page-header__actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n }\n `,\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 protected readonly titleVariant = computed<TextVariant>(() => `title-${this.size()}`);\n}\n","import { Component, computed, input, output } from '@angular/core';\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@Component({\n selector: 'kf-pagination',\n template: `\n <div class=\"kf-pagination\">\n <div class=\"kf-pagination__info\">\n <ng-content />\n </div>\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 </div>\n `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-md);\n flex-wrap: wrap;\n }\n .kf-pagination__info {\n font-size: 0.85rem;\n color: var(--kf-color-text-muted);\n }\n .kf-pagination__info:empty {\n display: none;\n }\n .kf-pagination__nav {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n }\n .kf-pagination__control,\n .kf-pagination__page {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n padding: 0 var(--kf-space-xs);\n font: inherit;\n font-size: 0.85rem;\n color: var(--kf-color-text);\n background: var(--kf-color-white);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n cursor: pointer;\n transition:\n background 0.14s,\n border-color 0.14s,\n color 0.14s;\n }\n .kf-pagination__control:hover:not(:disabled),\n .kf-pagination__page:hover:not(.kf-pagination__page--active) {\n background: var(--kf-color-surface);\n border-color: var(--kf-color-border-strong);\n }\n .kf-pagination__control:focus-visible,\n .kf-pagination__page:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-pagination__control:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .kf-pagination__page--active {\n color: var(--kf-color-white);\n background: var(--kf-color-primary);\n border-color: var(--kf-color-primary);\n cursor: default;\n }\n .kf-pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n color: var(--kf-color-text-muted);\n }\n `,\n})\nexport class Pagination {\n readonly page = input(1);\n readonly pages = input(1);\n readonly pageChange = output<number>();\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 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","import { Component, input } from '@angular/core';\nimport { Card } from '../card/Card';\nimport { Divider } from '../divider/Divider';\nimport { Icon } from '../icon/Icon';\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 * 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, Icon],\n template: `\n <kf-card>\n <div class=\"kf-panel__head\">\n <span class=\"kf-panel__title\">{{ title() }}</span>\n @if (actionLabel()) {\n <a class=\"kf-panel__action\" [href]=\"actionHref() || '#'\">\n {{ actionLabel() }}\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </a>\n }\n </div>\n <kf-divider />\n <div class=\"kf-panel__body\">\n <ng-content />\n </div>\n </kf-card>\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n }\n kf-card {\n flex: 1;\n }\n .kf-panel__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-sm);\n margin-bottom: var(--kf-space-sm);\n }\n .kf-panel__title {\n font-family: var(--kf-font-title);\n font-size: 1.05rem;\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-panel__action {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n flex: none;\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--kf-color-primary);\n text-decoration: none;\n }\n .kf-panel__action:hover {\n text-decoration: underline;\n }\n .kf-panel__body {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--kf-space-sm);\n margin-top: var(--kf-space-sm);\n }\n `,\n})\nexport class Panel {\n readonly title = input.required<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n}\n","import {\n Component,\n ElementRef,\n booleanAttribute,\n input,\n output,\n signal,\n viewChild,\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\n * `kf-drawer`, mismo criterio de \"no reimplementar nada del drawer\": el\n * footer ya trae su propio padding/separador (ver `Drawer.ts`).\n *\n * `PortalHeader` no sabe qué es ninguno de los dos contenidos ni cómo se\n * abren, solo les da el lugar correcto dentro del drawer ya desplegado.\n * `kf-drawer` resuelve overlay con blur, cierre con click-afuera/`Escape`,\n * atrapado de foco real y devolución de foco al cerrar — `PortalHeader` no\n * reimplementa nada de eso, solo controla su `open` desde el botón de\n * hamburguesa.\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 * userInitials=\"TS\"\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 template: `\n @if (isAdmin()) {\n <div class=\"kf-portal-header__admin-bar\">\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 }\n <div class=\"kf-portal-header__brand-bar\">\n <span class=\"kf-portal-header__logo\">{{ brand() }}</span>\n\n <nav class=\"kf-portal-header__nav\">\n @for (item of navItems(); track item.label) {\n <a\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\n <button\n #sessionButton\n type=\"button\"\n class=\"kf-portal-header__session\"\n (click)=\"sessionClick.emit()\"\n >\n <kf-avatar [initials]=\"userInitials()\" pill />\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\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 `,\n styles: `\n :host {\n display: block;\n position: sticky;\n top: 0;\n z-index: 30;\n font-family: var(--kf-font-body);\n }\n .kf-portal-header__admin-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-md);\n padding: var(--kf-space-xs) var(--kf-space-lg);\n background: var(--kf-color-tertiary-deep);\n }\n .kf-portal-header__admin-actions {\n display: flex;\n gap: var(--kf-space-md);\n }\n .kf-portal-header__admin-action {\n font-size: 0.8125rem;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.85);\n text-decoration: none;\n }\n .kf-portal-header__admin-action:hover {\n color: var(--kf-color-white);\n }\n .kf-portal-header__brand-bar {\n display: flex;\n align-items: center;\n gap: var(--kf-space-lg);\n padding: var(--kf-space-sm) var(--kf-space-lg);\n background: var(--kf-color-tertiary-deep);\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n }\n .kf-portal-header__logo {\n font-family: var(--kf-font-title);\n font-size: 1.25rem;\n font-weight: 700;\n letter-spacing: 0.02em;\n color: var(--kf-color-white);\n text-transform: uppercase;\n /* En mobile, el logo no se abrevia — se lo deja partir en varias\n líneas antes que truncarlo, pero sin dejar que un logo largo se\n coma todo el ancho: el nav/sesión de escritorio ya están ocultos\n acá abajo de 768px, así que el logo tiene toda la fila para él y\n el botón de menú. */\n flex: 1 1 auto;\n min-width: 0;\n }\n .kf-portal-header__nav {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n flex: 1 1 auto;\n }\n .kf-portal-header__nav-item {\n padding: var(--kf-space-xs) var(--kf-space-md);\n border-radius: var(--kf-radius-sm);\n color: rgba(255, 255, 255, 0.75);\n font-size: 0.875rem;\n font-weight: 600;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background 0.14s,\n color 0.14s;\n }\n /*\n * :not(--active) es necesario: sin él, este :hover pisa el color del\n * item activo (fondo blanco, texto --kf-color-ink) con blanco también,\n * dejando texto blanco sobre fondo blanco al pasar el mouse por encima\n * del item ya activo.\n */\n .kf-portal-header__nav-item:hover:not(.kf-portal-header__nav-item--active) {\n color: var(--kf-color-white);\n }\n .kf-portal-header__nav-item--active {\n background: var(--kf-color-white);\n color: var(--kf-color-ink);\n }\n .kf-portal-header__session {\n flex: none;\n border: none;\n background: transparent;\n padding: 0;\n cursor: pointer;\n }\n .kf-portal-header__menu-toggle {\n display: none;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--kf-radius-sm);\n background: transparent;\n color: var(--kf-color-white);\n cursor: pointer;\n }\n .kf-portal-header__menu-toggle:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n /*\n * Ítems de navegación dentro del kf-drawer: el drawer tiene fondo\n * sólido claro (--kf-color-white), a diferencia del viejo drawer\n * embebido que compartía el fondo oscuro (--kf-color-tertiary-deep) de\n * la brand-bar — de ahí que estos colores sean oscuros sobre claro y no\n * al revés, como antes.\n */\n .kf-portal-header__mobile-nav-item {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm) var(--kf-space-xs);\n color: var(--kf-color-text);\n font-size: 0.9375rem;\n font-weight: 600;\n text-decoration: none;\n border-radius: var(--kf-radius-sm);\n }\n .kf-portal-header__mobile-nav-item:hover {\n background: var(--kf-color-surface);\n }\n .kf-portal-header__mobile-nav-item--active {\n color: var(--kf-color-primary-active);\n background: var(--kf-color-primary-soft);\n }\n /* Label ocupa el espacio disponible entre el ícono opcional y el chevron,\n * así el chevron queda siempre pegado al borde derecho del drawer sin\n * importar el largo de cada label. */\n .kf-portal-header__mobile-nav-item-label {\n flex: 1 1 auto;\n }\n /* El chevron es puramente decorativo (mismo color del texto vía\n * currentColor) — no repite información ya dada por el propio link. */\n .kf-portal-header__mobile-nav-item kf-icon:last-child {\n color: rgba(23, 29, 37, 0.35);\n }\n\n /*\n * Único breakpoint real de la librería hasta ahora: por debajo de\n * 768px el <nav> horizontal deja lugar al botón de menú + drawer\n * lateral. El resto de los componentes de la librería no maneja\n * responsive todavía — este es el primer caso.\n */\n @media (max-width: 768px) {\n .kf-portal-header__nav {\n display: none;\n }\n /*\n * El botón de sesión (avatar) también se oculta: en mobile la única\n * forma de llegar a sesión/logout es a través del drawer (ver el\n * slot kf-portal-header-extra), no un segundo camino en paralelo\n * vía este botón + el overlay de dropdown que el consumidor arma\n * para escritorio — ese overlay no está pensado para posicionarse\n * bien en una pantalla angosta.\n */\n .kf-portal-header__session {\n display: none;\n }\n .kf-portal-header__menu-toggle {\n display: inline-flex;\n }\n }\n `,\n})\nexport class PortalHeader {\n readonly brand = input('DIVEMOTOR');\n readonly isAdmin = input(false, { transform: booleanAttribute });\n readonly adminActions = input<PortalHeaderAdminAction[]>([]);\n readonly navItems = input<PortalHeaderNavItem[]>([]);\n readonly userInitials = input.required<string>();\n\n readonly sessionClick = 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","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Estado vacío de reservas en taller con llamada a agendar (página 36):\n * barra de estado vacío arriba (\"No tienes reservas de taller\"), panel de\n * invitación al medio (ícono en círculo azul, título, descripción, link) y\n * una fila de dos acciones al pie — un slot `[actions]` proyectado, para no\n * acoplar el componente a botones fijos.\n *\n * Distinto de `kf-empty-state` genérico: este combina la barra + la\n * invitación + las acciones como un bloque compuesto propio del dominio\n * \"taller\", no un placeholder de una sola pieza.\n *\n * `grow` estira el panel de invitación para llenar el espacio vertical\n * disponible — solo cuando el consumidor comparte fila con una tarjeta más\n * alta (ej. junto a \"Total de vehículos\"); en un lugar sin esa presión\n * (home, debajo del carousel) se deja en su alto natural.\n *\n * <kf-reserve-block emptyLabel=\"No tienes reservas de taller\" grow\n * title=\"¿Necesitas mantención?\" description=\"Tenemos la mejor red de talleres.\"\n * actionLabel=\"Agenda tu reserva aquí\" actionHref=\"/taller/agendar\">\n * <kf-button actions icon=\"calendar\">Reservar hora</kf-button>\n * <kf-button actions variant=\"outline\" icon=\"list\">Ver agenda</kf-button>\n * </kf-reserve-block>\n */\n@Component({\n selector: 'kf-reserve-block',\n imports: [Icon],\n template: `\n <div class=\"kf-reserve-block__empty\">\n <kf-icon name=\"calendar\" size=\"sm\" />\n <span>{{ emptyLabel() }}</span>\n </div>\n <div class=\"kf-reserve-block__invite\" [class.kf-reserve-block__invite--grow]=\"grow()\">\n <span class=\"kf-reserve-block__invite-icon\">\n <kf-icon name=\"tool\" size=\"md\" />\n </span>\n <div class=\"kf-reserve-block__invite-text\">\n <span class=\"kf-reserve-block__invite-title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-reserve-block__invite-description\">{{ description() }}</span>\n }\n @if (actionLabel()) {\n <a class=\"kf-reserve-block__invite-action\" [href]=\"actionHref() || '#'\">\n {{ actionLabel() }}\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </a>\n }\n </div>\n </div>\n <div class=\"kf-reserve-block__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n background: var(--kf-color-white);\n font-family: var(--kf-font-body);\n }\n .kf-reserve-block__empty {\n display: flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding-bottom: var(--kf-space-sm);\n border-bottom: 1px solid var(--kf-color-border);\n color: var(--kf-color-text-muted);\n font-size: 0.875rem;\n }\n .kf-reserve-block__invite {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-primary-soft);\n }\n .kf-reserve-block__invite--grow {\n flex: 1;\n }\n .kf-reserve-block__invite-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: 2.25rem;\n height: 2.25rem;\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-primary);\n color: var(--kf-color-white);\n }\n .kf-reserve-block__invite-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n }\n .kf-reserve-block__invite-title {\n font-family: var(--kf-font-title);\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-reserve-block__invite-description {\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n .kf-reserve-block__invite-action {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n margin-top: var(--kf-space-xs);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--kf-color-primary);\n text-decoration: none;\n }\n .kf-reserve-block__invite-action:hover {\n text-decoration: underline;\n }\n .kf-reserve-block__actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--kf-space-sm);\n }\n `,\n})\nexport class ReserveBlock {\n readonly emptyLabel = input('No tienes reservas de taller');\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n /** La invitación se estira para llenar la tarjeta (ej. junto a \"Total de vehículos\"). */\n readonly grow = input(false, { transform: booleanAttribute });\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. Antes de la `0.2.0`, `size` solo aceptaba `'sm'` —\n * placeholder incompleto de esta misma escala; los valores de `lg` son una\n * extrapolación proporcional de la escala existente (sin un caso de uso\n * real todavía que los valide, a diferencia de `sm`, que sí viene de un\n * patrón real de uso dentro de cards). `solid` rellena el chip de ícono con\n * el color primario sólido en vez del tratamiento \"soft\" (fondo tenue) —\n * pensado para superficies que ya tienen un tinte de color propio, donde el\n * chip \"soft\" 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 template: `\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 `,\n styles: `\n :host {\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n font-family: var(--kf-font-body);\n }\n :host(.kf-section-header--sm) {\n gap: var(--kf-space-xs);\n }\n :host(.kf-section-header--lg) {\n gap: var(--kf-space-md);\n }\n .kf-section-header__icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n inline-size: 2.5rem;\n block-size: 2.5rem;\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-primary-soft);\n color: var(--kf-color-primary);\n }\n :host(.kf-section-header--sm) .kf-section-header__icon {\n inline-size: 1.75rem;\n block-size: 1.75rem;\n border-radius: var(--kf-radius-xs);\n }\n :host(.kf-section-header--lg) .kf-section-header__icon {\n inline-size: 3.25rem;\n block-size: 3.25rem;\n border-radius: var(--kf-radius-md);\n }\n .kf-section-header__icon--solid {\n background: var(--kf-color-primary);\n color: var(--kf-color-white);\n }\n .kf-section-header__text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n flex: 1 1 auto;\n }\n .kf-section-header__title {\n font-family: var(--kf-font-title);\n font-size: 1rem;\n font-weight: 700;\n color: var(--kf-color-ink);\n line-height: 1.3;\n }\n :host(.kf-section-header--sm) .kf-section-header__title {\n font-size: 0.875rem;\n }\n :host(.kf-section-header--lg) .kf-section-header__title {\n font-size: 1.25rem;\n }\n .kf-section-header__subtitle {\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n line-height: 1.3;\n }\n :host(.kf-section-header--sm) .kf-section-header__subtitle {\n font-size: 0.75rem;\n }\n :host(.kf-section-header--lg) .kf-section-header__subtitle {\n font-size: 0.9375rem;\n }\n .kf-section-header__actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n }\n `,\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","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 template: `\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 `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-segmented__track {\n position: relative;\n display: grid;\n grid-template-columns: repeat(var(--kf-segmented-count), 1fr);\n gap: 2px;\n padding: 2px;\n background: var(--kf-color-surface);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n }\n .kf-segmented__thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: calc((100% - 4px) / var(--kf-segmented-count));\n height: calc(100% - 4px);\n background: var(--kf-color-white);\n border-radius: var(--kf-radius-sm);\n box-shadow: var(--kf-shadow-xs);\n transform: translateX(calc(var(--kf-segmented-index, 0) * 100%));\n transition: transform 0.2s ease;\n }\n .kf-segmented__option {\n position: relative;\n z-index: 1;\n font: inherit;\n padding: var(--kf-space-xs) var(--kf-space-md);\n border: none;\n background: transparent;\n color: var(--kf-color-text-muted);\n border-radius: var(--kf-radius-sm);\n cursor: pointer;\n transition: color 0.14s;\n }\n .kf-segmented__option:hover:not(.kf-segmented__option--active) {\n color: var(--kf-color-text);\n }\n .kf-segmented__option--active {\n color: var(--kf-color-ink);\n }\n .kf-segmented__option:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n `,\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","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\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@Component({\n selector: 'kf-tooltip-content',\n template: `{{ text }}`,\n styles: `\n :host {\n display: block;\n max-width: 220px;\n padding: 4px var(--kf-space-sm);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-tertiary-deep);\n color: var(--kf-color-white);\n font-family: var(--kf-font-body);\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1.4;\n white-space: nowrap;\n box-shadow: var(--kf-shadow-lg);\n animation: kf-tooltip-enter 0.1s ease-out;\n pointer-events: none;\n }\n @media (prefers-reduced-motion: reduce) {\n :host {\n animation: none;\n }\n }\n @keyframes kf-tooltip-enter {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n `,\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 overlayRef: OverlayRef | null = null;\n\n @HostListener('mouseenter')\n @HostListener('focus')\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\n this.overlayRef = overlayRef;\n }\n\n @HostListener('mouseleave')\n @HostListener('blur')\n @HostListener('document:keydown.escape')\n protected hide(): void {\n this.overlayRef?.dispose();\n this.overlayRef = null;\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, booleanAttribute, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport type { IconName } from '../icon/icon-name';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\n/** Tipo que consume `kf-sidebar-shell.navItems`. `icon` es requerido: en el\n * sidebar persistente el ícono es parte permanente del diseño. */\nexport interface SidebarNavItemData {\n icon: IconName;\n label: string;\n href: string;\n active?: boolean;\n}\n\n/**\n * Ítem de navegación de `kf-sidebar-shell` — ícono + label en fila, estado\n * activo, sin agrupación. Es el equivalente vertical/persistente del `<a>`\n * que arma `kf-portal-header` para su `<nav>` horizontal.\n *\n * `collapsed` se recibe como input explícito (no vía `:host-context`): el\n * componente no necesita saber cómo funciona el estado de colapso del\n * shell, solo qué hacer cuando `collapsed` es `true`.\n *\n * No sabe nada de routing — emite `href` como cualquier link y deja que el\n * consumidor intercepte el click para integrarlo con el Router.\n */\n@Component({\n selector: 'kf-sidebar-nav-item',\n imports: [Icon, TooltipDirective],\n template: `\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 [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 `,\n styles: `\n .kf-sidebar-nav-item {\n box-sizing: border-box;\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n padding: var(--kf-space-sm) var(--kf-space-md);\n border-radius: var(--kf-radius-sm);\n color: rgba(255, 255, 255, 0.7);\n font-family: var(--kf-font-body);\n font-size: 0.875rem;\n font-weight: 600;\n text-decoration: none;\n white-space: nowrap;\n transition:\n background 0.14s,\n color 0.14s;\n }\n .kf-sidebar-nav-item:hover:not(.kf-sidebar-nav-item--active) {\n background: rgba(255, 255, 255, 0.06);\n color: var(--kf-color-white);\n }\n .kf-sidebar-nav-item--collapsed:hover:not(.kf-sidebar-nav-item--active) {\n background: rgba(255, 255, 255, 0.12);\n }\n .kf-sidebar-nav-item--active {\n background: rgba(255, 255, 255, 0.12);\n color: var(--kf-color-white);\n }\n /* Barra lateral de selección — refuerza el contraste de fondo con una\n franja de acento sólido, detectable sin depender de leer el label. */\n .kf-sidebar-nav-item--active::before {\n content: '';\n position: absolute;\n left: calc(-1 * var(--kf-space-xs));\n top: 20%;\n bottom: 20%;\n width: 3px;\n border-radius: var(--kf-radius-pill);\n background: var(--kf-color-primary-hover);\n }\n /* Ancho y alto fijos a 40px para que el fondo de hover/activo lea como\n un cuadrado 1:1, sin depender del padding implícito del contenido. */\n .kf-sidebar-nav-item--collapsed {\n justify-content: center;\n width: 40px;\n height: 40px;\n padding-inline: 0;\n }\n .kf-sidebar-nav-item--collapsed.kf-sidebar-nav-item--active::before {\n left: calc(-1 * var(--kf-space-sm));\n }\n `,\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\n /** Oculta el label y centra el ícono — lo controla `kf-sidebar-shell` según su propio estado de colapso. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n}\n","import { DestroyRef, Signal, inject, signal } from '@angular/core';\n\n/**\n * Signal reactivo con el estado actual de un media query — para cuando un\n * componente necesita SABER en qué lado de un breakpoint está (no solo\n * mostrar/ocultar con CSS). Un `@media` en `styles` no alcanza cuando la\n * decisión no es puramente visual: por ejemplo, un componente hijo que\n * recibe un input booleano (`[collapsed]`) no puede \"leer\" un breakpoint\n * CSS del padre — necesita que alguien en TypeScript se lo diga.\n *\n * Encontrado al construir `SidebarShell`: el estado `collapsed` (colapso\n * del rail en desktop) se pasaba tal cual a cada `kf-sidebar-nav-item`, sin\n * importar el viewport. En mobile, donde el rail deslizado siempre muestra\n * etiquetas completas (ver estilos de `SidebarShell`), los ítems seguían\n * ocultando su label si el usuario había dejado el rail colapsado en\n * desktop antes de achicar la ventana — un CSS que dice \"en mobile se ve\n * ancho\" no cambia el valor del input que ya llegó al hijo.\n *\n * Debe llamarse dentro de un contexto de inyección (el `constructor` de un\n * componente, o un campo de clase inicializado ahí — mismo requisito que\n * cualquier función que use `inject()`).\n *\n * protected readonly isMobile = matchMediaSignal('(max-width: 900px)');\n * // ...\n * [collapsed]=\"collapsed() && !isMobile()\"\n */\nexport function matchMediaSignal(query: string): Signal<boolean> {\n const mediaQueryList = matchMedia(query);\n const state = signal(mediaQueryList.matches);\n\n const onChange = (event: MediaQueryListEvent) => state.set(event.matches);\n mediaQueryList.addEventListener('change', onChange);\n\n inject(DestroyRef).onDestroy(() => mediaQueryList.removeEventListener('change', onChange));\n\n return state.asReadonly();\n}\n","import { Component, HostListener, computed, input, model, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { matchMediaSignal } from '../shared/media-query';\nimport { SidebarNavItem } from '../sidebar-nav-item/SidebarNavItem';\nimport type { SidebarNavItemData } from '../sidebar-nav-item/SidebarNavItem';\nimport { TooltipDirective } from '../tooltip/Tooltip';\n\n/** Mismo breakpoint que el `@media` de este componente — ver estilos. */\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 y duplicaría el\n * árbol de navegación en un segundo lugar del DOM. Bug de contraste ya\n * corregido en el historial: los `kf-sidebar-nav-item`, con texto claro\n * pensado para el gradiente oscuro, quedaban invisibles sobre el fondo\n * blanco de `kf-drawer`. Acá hay un solo rail, un solo árbol de nav, que\n * cambia de posición según el viewport.\n */\n@Component({\n selector: 'kf-sidebar-shell',\n imports: [Icon, SidebarNavItem, TooltipDirective],\n template: `\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]=\"collapsed()\"\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 (item of navItems(); track item.href) {\n <kf-sidebar-nav-item\n [icon]=\"item.icon\"\n [label]=\"item.label\"\n [href]=\"item.href\"\n [active]=\"!!item.active\"\n [collapsed]=\"itemsCollapsed()\"\n (click)=\"onNavItemClick($event, 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 `,\n styles: `\n :host {\n display: contents;\n }\n\n .kf-sidebar-shell__backdrop {\n display: none;\n }\n\n .kf-sidebar-shell__rail {\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n position: relative;\n width: 268px;\n flex: none;\n padding: var(--kf-space-lg) var(--kf-space-md);\n background: linear-gradient(\n 190deg,\n var(--kf-color-sidebar-gradient-from) 0%,\n var(--kf-color-sidebar-gradient-to) 60%\n );\n transition:\n width 0.18s ease,\n padding-inline 0.18s ease;\n }\n /* 56px = padding-inline del rail (8px) por lado + el cuadrado de 40px\n de cada ítem de navegación colapsado. */\n .kf-sidebar-shell__rail--collapsed {\n width: 56px;\n padding-inline: var(--kf-space-sm);\n }\n\n .kf-sidebar-shell__brand {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: var(--kf-space-xl);\n }\n .kf-sidebar-shell__brand-full {\n display: flex;\n justify-content: center;\n width: 100%;\n }\n .kf-sidebar-shell__brand-full ::ng-deep img {\n display: block;\n height: 1.5rem;\n }\n .kf-sidebar-shell__brand-collapsed {\n display: none;\n }\n .kf-sidebar-shell__brand-collapsed ::ng-deep img {\n display: block;\n height: 1.75rem;\n }\n .kf-sidebar-shell__rail--collapsed .kf-sidebar-shell__brand-full {\n display: none;\n }\n .kf-sidebar-shell__rail--collapsed .kf-sidebar-shell__brand-collapsed {\n display: block;\n }\n\n .kf-sidebar-shell__mobile-close {\n display: none;\n margin-left: auto;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: none;\n border-radius: var(--kf-radius-sm);\n background: rgba(255, 255, 255, 0.08);\n color: rgba(255, 255, 255, 0.8);\n cursor: pointer;\n }\n .kf-sidebar-shell__mobile-close:hover {\n background: rgba(255, 255, 255, 0.16);\n color: var(--kf-color-white);\n }\n\n .kf-sidebar-shell__nav {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n overflow-y: auto;\n }\n\n /* Agrupa toggle de colapso + footer (card de sesión) al pie del rail,\n en ese orden: navegación primero, identidad de usuario al final. */\n .kf-sidebar-shell__bottom {\n display: flex;\n flex-direction: column;\n margin-top: var(--kf-space-sm);\n padding-top: var(--kf-space-sm);\n border-top: 1px solid rgba(255, 255, 255, 0.12);\n }\n\n .kf-sidebar-shell__footer {\n margin-top: var(--kf-space-sm);\n }\n .kf-sidebar-shell__footer:empty {\n display: none;\n }\n\n /* Mismo ancho/alto que un ítem de navegación (ver comentario de la\n clase sobre por qué no flota en el borde del rail). */\n .kf-sidebar-shell__collapse-toggle {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n width: 100%;\n padding: var(--kf-space-sm) var(--kf-space-md);\n border: none;\n border-radius: var(--kf-radius-sm);\n background: rgba(255, 255, 255, 0.06);\n color: rgba(255, 255, 255, 0.7);\n font-family: var(--kf-font-body);\n font-size: 0.8125rem;\n font-weight: 600;\n cursor: pointer;\n transition:\n background 0.14s,\n color 0.14s;\n }\n .kf-sidebar-shell__collapse-toggle:hover {\n background: rgba(255, 255, 255, 0.12);\n color: var(--kf-color-white);\n }\n /* Mismo cuadrado 40×40 que cada ítem de navegación colapsado. */\n .kf-sidebar-shell__collapse-toggle--collapsed {\n justify-content: center;\n width: 40px;\n height: 40px;\n padding-inline: 0;\n }\n .kf-sidebar-shell__collapse-toggle-label {\n flex: 1 1 auto;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Oculto en desktop — solo existe para dar lugar al botón de menú +\n logo cuando el rail sale del flujo del documento en mobile. */\n .kf-sidebar-shell__topbar {\n display: none;\n }\n\n @media (max-width: 900px) {\n .kf-sidebar-shell__rail {\n position: fixed;\n inset: 0 auto 0 0;\n z-index: 100;\n width: 284px;\n max-width: 86vw;\n transform: translateX(-100%);\n transition: transform 0.26s cubic-bezier(0.4, 0, 0.2, 1);\n box-shadow: var(--kf-shadow-lg);\n }\n .kf-sidebar-shell__rail--mobile-open {\n transform: translateX(0);\n }\n /* En el panel deslizado se ven siempre las etiquetas completas,\n ignorando el \"collapsed\" de escritorio. El botón de colapso no\n tiene sentido acá: en mobile se cierra con backdrop, Escape o X. */\n .kf-sidebar-shell__rail--collapsed {\n width: 284px;\n max-width: 86vw;\n }\n .kf-sidebar-shell__rail--collapsed .kf-sidebar-shell__brand-full {\n display: block;\n }\n .kf-sidebar-shell__rail--collapsed .kf-sidebar-shell__brand-collapsed {\n display: none;\n }\n .kf-sidebar-shell__collapse-toggle {\n display: none;\n }\n .kf-sidebar-shell__mobile-close {\n display: flex;\n }\n\n .kf-sidebar-shell__backdrop {\n display: block;\n position: fixed;\n inset: 0;\n z-index: 90;\n border: none;\n padding: 0;\n cursor: pointer;\n background: rgba(10, 14, 20, 0.5);\n }\n\n .kf-sidebar-shell__topbar {\n display: flex;\n align-items: center;\n gap: var(--kf-space-md);\n padding: var(--kf-space-sm) var(--kf-space-lg);\n background: var(--kf-color-white);\n border-bottom: 1px solid var(--kf-color-border);\n }\n\n .kf-sidebar-shell__menu-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--kf-radius-sm);\n background: transparent;\n color: var(--kf-color-ink);\n cursor: pointer;\n flex: none;\n }\n .kf-sidebar-shell__menu-toggle:hover {\n background: var(--kf-color-surface);\n }\n\n .kf-sidebar-shell__topbar-brand ::ng-deep img {\n display: block;\n height: 1.25rem;\n }\n }\n `,\n})\nexport class SidebarShell {\n /** Ítems del menú del rail. */\n readonly navItems = input<SidebarNavItemData[]>([]);\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 — sin esto, un rail dejado colapsado en desktop\n * seguía ocultando el label de cada ítem al abrir el panel en mobile. */\n private readonly isMobileViewport = matchMediaSignal(MOBILE_BREAKPOINT_QUERY);\n\n /** Estado de colapso que efectivamente se le pasa a cada `kf-sidebar-nav-item`\n * y al propio botón de colapso. */\n protected 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","import { Component, booleanAttribute, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Indicador numérico compacto (página 34): label + valor grande, con un\n * ícono a la derecha del label — más chico y sin badge de esquina que\n * `kf-metric-card`, pensado para grillas densas de KPIs simples (\"Total\n * vehículos: 4\", \"En taller: 1\"), no para dashboards con tendencia.\n *\n * Con `cta` en vez de `value`, se convierte en la variante de llamada a la\n * acción: un bloque de fondo suave con título, descripción y un link — sin\n * número, para promover el siguiente paso (ej. \"¿Necesitas mantención?\").\n *\n * <kf-stat-tile label=\"Total vehículos\" value=\"4\" icon=\"car\" />\n * <kf-stat-tile cta title=\"¿Necesitas mantención?\"\n * description=\"Tenemos la mejor red de talleres.\"\n * actionLabel=\"Agenda aquí\" actionHref=\"/taller/agendar\" />\n */\n@Component({\n selector: 'kf-stat-tile',\n imports: [Icon],\n template: `\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 <a class=\"kf-stat-tile__cta-action\" [href]=\"actionHref() || '#'\">\n {{ actionLabel() }}\n <kf-icon name=\"chevron-right\" size=\"sm\" />\n </a>\n }\n } @else {\n <div class=\"kf-stat-tile__head\">\n <span class=\"kf-stat-tile__label\">{{ label() }}</span>\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 <span class=\"kf-stat-tile__value\">{{ value() }}</span>\n }\n `,\n styles: `\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n background: var(--kf-color-white);\n }\n :host(.kf-stat-tile--cta) {\n background: var(--kf-color-surface);\n gap: 2px;\n }\n .kf-stat-tile__head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--kf-space-xs);\n }\n .kf-stat-tile__label {\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n .kf-stat-tile__icon {\n display: inline-flex;\n color: var(--kf-color-primary);\n }\n .kf-stat-tile__value {\n font-family: var(--kf-font-title);\n font-size: 1.5rem;\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-stat-tile__cta-title {\n font-family: var(--kf-font-title);\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-stat-tile__cta-description {\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n .kf-stat-tile__cta-action {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n margin-top: var(--kf-space-xs);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--kf-color-primary);\n text-decoration: none;\n }\n .kf-stat-tile__cta-action:hover {\n text-decoration: underline;\n }\n `,\n host: {\n '[class.kf-stat-tile--cta]': 'cta()',\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 // Variante CTA\n readonly title = input<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\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 template: `\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 `,\n styles: `\n :host {\n display: inline-block;\n }\n .kf-status-pill {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border: 1px solid currentColor;\n border-radius: var(--kf-radius-pill);\n background: transparent;\n font: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n white-space: nowrap;\n }\n .kf-status-pill__dot {\n width: 6px;\n height: 6px;\n border-radius: var(--kf-radius-pill);\n background: currentColor;\n flex-shrink: 0;\n }\n .kf-status-pill--blue {\n color: var(--kf-color-info);\n }\n .kf-status-pill--ok {\n color: var(--kf-color-success);\n }\n .kf-status-pill--warn {\n color: var(--kf-color-warning);\n }\n .kf-status-pill--error {\n color: var(--kf-color-error);\n }\n `,\n})\nexport class StatusPill {\n readonly tone = input<'blue' | 'ok' | 'warn' | 'error'>('blue');\n readonly dot = input(false, { transform: booleanAttribute });\n}\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';\n\nexport interface TabOption {\n value: string;\n label: string;\n icon?: IconName;\n}\n\n/**\n * Barra de tabs subrayada: un único indicador se desliza horizontalmente hasta\n * la pestaña activa. Como las pestañas tienen ancho de contenido (labels de\n * largo distinto), la posición no se puede resolver con CSS puro: se mide el\n * `offsetLeft`/`offsetWidth` de la pestaña activa después de cada render y la\n * transición del `transform`/`width` queda a cargo de CSS.\n *\n * <kf-tabs [options]=\"tabs\" [value]=\"active\" (valueChange)=\"active = $event\" />\n */\n@Component({\n selector: 'kf-tabs',\n imports: [Icon],\n template: `\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 [attr.aria-controls]=\"'kf-tabpanel-' + 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 `,\n styles: `\n :host {\n display: block;\n font-family: var(--kf-font-body);\n }\n .kf-tabs {\n position: relative;\n display: flex;\n align-items: stretch;\n gap: var(--kf-space-md);\n border-bottom: 1px solid var(--kf-color-border);\n }\n .kf-tabs__tab {\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n font: inherit;\n font-size: 0.9rem;\n color: var(--kf-color-text-muted);\n background: transparent;\n border: none;\n /* Sin padding horizontal propio: el espaciado entre tabs lo da el\n gap del contenedor — con ambos sumando (como antes) el conjunto\n quedaba más separado que en el PDF, que muestra las pestañas casi\n pegadas entre sí. El padding vertical se mantiene por área de click. */\n padding: var(--kf-space-sm) 0;\n cursor: pointer;\n transition: color 0.14s;\n }\n .kf-tabs__tab:hover:not(.kf-tabs__tab--active) {\n color: var(--kf-color-text);\n }\n .kf-tabs__tab:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n border-radius: var(--kf-radius-xs);\n }\n .kf-tabs__tab--active {\n color: var(--kf-color-primary);\n font-size: 1rem;\n font-weight: 700;\n }\n .kf-tabs__indicator {\n position: absolute;\n bottom: -1px;\n left: 0;\n height: 2px;\n background: var(--kf-color-primary);\n border-radius: 2px 2px 0 0;\n pointer-events: none;\n transition:\n transform 0.28s cubic-bezier(0.32, 0.72, 0, 1),\n width 0.28s cubic-bezier(0.32, 0.72, 0, 1),\n opacity 0.14s;\n }\n @media (prefers-reduced-motion: reduce) {\n .kf-tabs__indicator {\n transition: opacity 0.14s;\n }\n }\n `,\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 /** Geometría de la pestaña activa; `null` mientras no haya una medición válida. */\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 // Cada cambio de `value`/`options` re-mide después de que el DOM ya se actualizó.\n afterRenderEffect(() => {\n this.value();\n this.options();\n this.measure();\n });\n\n afterNextRender(() => {\n // El ancho de la pestaña activa cambia con el layout (resize, fuentes que\n // cargan tarde), y sin esto el indicador queda desfasado del texto.\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 /** Navegación estándar de ARIA tabs: flechas mueven el foco y activan la pestaña. */\n onKeydown(event: KeyboardEvent, currentValue: string): void {\n const items = this.options();\n const currentIndex = items.findIndex((option) => option.value === currentValue);\n\n let nextIndex: number;\n switch (event.key) {\n case 'ArrowRight':\n nextIndex = (currentIndex + 1) % items.length;\n break;\n case 'ArrowLeft':\n nextIndex = (currentIndex - 1 + items.length) % items.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = items.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const nextOption = items[nextIndex];\n this.select(nextOption.value);\n\n const host = (event.currentTarget as HTMLElement).parentElement;\n const nextId = `kf-tab-${nextOption.value}`;\n const nextButton = Array.from(host?.querySelectorAll<HTMLButtonElement>('button') ?? []).find(\n (button) => button.id === nextId,\n );\n nextButton?.focus();\n }\n}\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/** Options for {@link ToastService.show}. */\nexport interface ToastOptions {\n /** Color tone. Defaults to `'info'`. */\n tone?: ToastTone;\n /** Milliseconds before auto-dismiss. Ignored when `tone` is `'loading'`. Defaults to `2800`. */\n duration?: number;\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}\n\nconst DEFAULT_DURATION_MS = 2800;\nconst EXIT_ANIMATION_MS = 200;\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 * 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\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 = options.duration ?? DEFAULT_DURATION_MS;\n clearTimeout(this.dismissTimer);\n clearTimeout(this.removeTimer);\n this._current.set({ id, message, tone, duration, leaving: false });\n if (tone !== 'loading') {\n this.dismissTimer = setTimeout(() => this.dismiss(id), duration);\n }\n return id;\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 template: `\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 >\n <kf-icon class=\"kf-toast__icon\" [name]=\"toastIcon(t.tone)\" size=\"sm\" />\n <span class=\"kf-toast__message\">{{ t.message }}</span>\n <button type=\"button\" class=\"kf-toast__dismiss\" aria-label=\"Cerrar\" (click)=\"dismiss(t.id)\">\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 styles: `\n @keyframes kf-toast-in {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n }\n @keyframes kf-toast-bar {\n from {\n transform: scaleX(1);\n }\n to {\n transform: scaleX(0);\n }\n }\n @keyframes kf-toast-indeterminate {\n 0% {\n left: -40%;\n width: 40%;\n }\n 50% {\n left: 30%;\n width: 55%;\n }\n 100% {\n left: 100%;\n width: 40%;\n }\n }\n\n .kf-toast {\n /* Per-tone accent, overridden by the tone classes below. */\n --kf-toast-accent: var(--kf-color-info);\n\n position: fixed;\n inset-block-end: var(--kf-space-lg);\n inset-inline-end: var(--kf-space-lg);\n z-index: 1100;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n max-inline-size: 360px;\n padding: var(--kf-space-sm) var(--kf-space-sm) var(--kf-space-sm) var(--kf-space-md);\n border-radius: var(--kf-radius-md);\n border-left: 4px solid var(--kf-toast-accent);\n background: var(--kf-color-ink);\n color: var(--kf-color-white);\n box-shadow: var(--kf-shadow-lg);\n font-family: var(--kf-font-body);\n font-size: 0.875rem;\n font-weight: 600;\n line-height: 1.4;\n overflow: hidden;\n animation: kf-toast-in 0.25s ease forwards;\n transition:\n transform 0.2s ease,\n opacity 0.2s ease;\n }\n .kf-toast--leaving {\n transform: translateY(20px);\n opacity: 0;\n }\n .kf-toast--success {\n --kf-toast-accent: var(--kf-color-success);\n }\n .kf-toast--error {\n --kf-toast-accent: var(--kf-color-error);\n }\n .kf-toast--warning {\n --kf-toast-accent: var(--kf-color-warning);\n }\n .kf-toast--info,\n .kf-toast--loading {\n --kf-toast-accent: var(--kf-color-info);\n }\n\n .kf-toast__icon {\n flex: none;\n color: var(--kf-toast-accent);\n }\n .kf-toast__message {\n flex: 1;\n }\n .kf-toast__dismiss {\n flex: none;\n display: grid;\n place-items: center;\n inline-size: 24px;\n block-size: 24px;\n padding: 0;\n border: none;\n border-radius: var(--kf-radius-xs);\n background: transparent;\n color: inherit;\n font: inherit;\n line-height: 1;\n cursor: pointer;\n opacity: 0.6;\n }\n .kf-toast__dismiss:hover {\n opacity: 1;\n }\n\n .kf-toast__bar {\n position: absolute;\n inset-block-end: 0;\n left: 0;\n block-size: 3px;\n inline-size: 100%;\n background: var(--kf-toast-accent);\n opacity: 0.7;\n transform-origin: left;\n animation: kf-toast-bar var(--kf-toast-dur, 2800ms) linear forwards;\n }\n .kf-toast--loading .kf-toast__bar {\n left: -40%;\n inline-size: 40%;\n opacity: 0.6;\n animation: kf-toast-indeterminate 1.4s ease-in-out infinite;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .kf-toast,\n .kf-toast__bar,\n .kf-toast--loading .kf-toast__bar {\n animation: none;\n }\n .kf-toast {\n transition: none;\n }\n }\n `,\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","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\n\n/**\n * Estado puntual mostrado junto a la identidad del vehículo (ej. \"En ruta\",\n * \"Mantenimiento\", \"Fuera de servicio\"). `tone` define el color semántico:\n * \"crit\" no tiene token propio en base.css, se mapea a var(--kf-color-error).\n */\nexport interface VehicleHeaderStatus {\n label: string;\n tone?: 'ok' | 'warn' | 'crit';\n icon?: IconName;\n}\n\n/**\n * Header de identidad de un vehículo de flota: unidad (patente/id), modelo\n * (como badge, no texto plano — página 24: \"ABC-123\" junto a un badge\n * \"TITAN 4X2\"), VIN en fuente mono y un estado opcional. Un área de acciones\n * opcional se proyecta vía `<ng-content select=\"[actions]\">` para no acoplar\n * el componente a un set fijo de botones — el patrón real de la spec es\n * `kf-button variant=\"outline\"` (ej. \"Llamar\", con ícono) + un `primary`\n * (ej. \"Crear Ticket\", con ícono \"+\"):\n *\n * <kf-vehicle-header unit=\"AB123CD\" model=\"Sprinter 415\" vin=\"9BW...\"\n * [status]=\"{ label: 'En ruta', tone: 'ok' }\">\n * <kf-button actions variant=\"outline\" icon=\"phone\">Llamar</kf-button>\n * <kf-button actions icon=\"plus\">Crear Ticket</kf-button>\n * </kf-vehicle-header>\n */\n@Component({\n selector: 'kf-vehicle-header',\n imports: [Icon],\n template: `\n <div class=\"kf-vehicle-header__identity\">\n <span class=\"kf-vehicle-header__unit\">{{ unit() }}</span>\n @if (model()) {\n <span class=\"kf-vehicle-header__model\">{{ model() }}</span>\n }\n @if (vin()) {\n <span class=\"kf-vehicle-header__vin\">VIN: {{ vin() }}</span>\n }\n </div>\n\n @if (status(); as currentStatus) {\n <span\n class=\"kf-vehicle-header__status\"\n [class]=\"'kf-vehicle-header__status--' + (currentStatus.tone ?? 'ok')\"\n >\n @if (currentStatus.icon; as iconName) {\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n }\n {{ currentStatus.label }}\n </span>\n }\n\n <div class=\"kf-vehicle-header__actions\">\n <ng-content select=\"[actions]\" />\n </div>\n `,\n styles: `\n :host {\n display: flex;\n align-items: center;\n gap: var(--kf-space-md);\n padding: var(--kf-space-md);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-md);\n background: var(--kf-color-surface);\n font-family: var(--kf-font-body);\n }\n .kf-vehicle-header__identity {\n display: flex;\n align-items: baseline;\n flex-wrap: wrap;\n gap: var(--kf-space-sm);\n flex: 1 1 auto;\n min-width: 0;\n }\n .kf-vehicle-header__unit {\n font-family: var(--kf-font-title);\n font-size: 1.125rem;\n font-weight: 700;\n color: var(--kf-color-ink);\n }\n .kf-vehicle-header__model {\n padding: 2px var(--kf-space-sm);\n border-radius: var(--kf-radius-xs);\n background: var(--kf-color-border);\n color: var(--kf-color-text-muted);\n font-size: 0.75rem;\n font-weight: 700;\n letter-spacing: 0.02em;\n text-transform: uppercase;\n }\n .kf-vehicle-header__vin {\n font-family: var(--kf-font-mono);\n font-size: 0.8125rem;\n color: var(--kf-color-text-muted);\n }\n .kf-vehicle-header__status {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--kf-space-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n border-radius: var(--kf-radius-pill);\n font-size: 0.75rem;\n font-weight: 600;\n line-height: 1;\n white-space: nowrap;\n }\n .kf-vehicle-header__status--ok {\n background: var(--kf-color-success-soft);\n color: var(--kf-color-success);\n }\n .kf-vehicle-header__status--warn {\n background: var(--kf-color-warning-soft);\n color: var(--kf-color-warning);\n }\n .kf-vehicle-header__status--crit {\n background: var(--kf-color-error-soft);\n color: var(--kf-color-error);\n }\n .kf-vehicle-header__actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: var(--kf-space-sm);\n }\n `,\n})\nexport class VehicleHeader {\n readonly unit = input.required<string>();\n readonly model = input<string>();\n readonly vin = input<string>();\n readonly status = input<VehicleHeaderStatus>();\n}\n","import { Component, input, output } from '@angular/core';\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 * <kf-view-toggle [view]=\"view\" (viewChange)=\"view = $event\" />\n */\n@Component({\n selector: 'kf-view-toggle',\n template: `\n <div class=\"kf-view-toggle\" role=\"radiogroup\" aria-label=\"Alternar tipo de vista\">\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--active]=\"view() === 'table'\"\n [attr.aria-checked]=\"view() === 'table'\"\n [attr.tabindex]=\"view() === 'table' ? 0 : -1\"\n (click)=\"select('table')\"\n (keydown)=\"onKeydown($event)\"\n >\n Tabla\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--active]=\"view() === 'cards'\"\n [attr.aria-checked]=\"view() === 'cards'\"\n [attr.tabindex]=\"view() === 'cards' ? 0 : -1\"\n (click)=\"select('cards')\"\n (keydown)=\"onKeydown($event)\"\n >\n Tarjetas\n </button>\n </div>\n `,\n styles: `\n :host {\n display: inline-block;\n font-family: var(--kf-font-body);\n }\n .kf-view-toggle {\n display: inline-flex;\n align-items: stretch;\n gap: 2px;\n padding: 2px;\n background: var(--kf-color-surface);\n border: 1px solid var(--kf-color-border);\n border-radius: var(--kf-radius-sm);\n }\n .kf-view-toggle__option {\n font: inherit;\n font-size: 0.85rem;\n line-height: 1;\n color: var(--kf-color-text-muted);\n background: transparent;\n border: none;\n border-radius: var(--kf-radius-xs);\n padding: var(--kf-space-xs) var(--kf-space-sm);\n cursor: pointer;\n transition:\n background 0.14s,\n color 0.14s,\n box-shadow 0.14s;\n }\n .kf-view-toggle__option:hover:not(.kf-view-toggle__option--active) {\n color: var(--kf-color-text);\n }\n .kf-view-toggle__option:focus-visible {\n outline: none;\n box-shadow: var(--kf-shadow-focus);\n }\n .kf-view-toggle__option--active {\n color: var(--kf-color-ink);\n background: var(--kf-color-white);\n box-shadow: var(--kf-shadow-xs);\n }\n `,\n})\nexport class ViewToggle {\n readonly view = input.required<ViewToggleOption>();\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","/*\n * Public API Surface of ui\n */\n\nexport * from './lib/action-tile/ActionTile';\nexport * from './lib/admin-badge/AdminBadge';\nexport * from './lib/button/button';\nexport * from './lib/alert/Alert';\nexport * from './lib/auth-layout/AuthLayout';\nexport * from './lib/avatar/Avatar';\nexport * from './lib/badge/Badge';\nexport * from './lib/breadcrumb/Breadcrumb';\nexport * from './lib/card/Card';\nexport * from './lib/carousel/Carousel';\nexport * from './lib/checkbox/Checkbox';\nexport * from './lib/chip/Chip';\nexport * from './lib/company-selector/CompanySelector';\nexport * from './lib/content-slot/ContentSlot';\nexport * from './lib/content-state/ContentState';\nexport * from './lib/data-table/DataTable';\nexport * from './lib/divider/Divider';\nexport * from './lib/drawer/Drawer';\nexport * from './lib/drawer-logout/DrawerLogout';\nexport * from './lib/drawer-session/DrawerSession';\nexport * from './lib/dropdown/Dropdown';\nexport * from './lib/empty-state/EmptyState';\nexport * from './lib/feature-card/FeatureCard';\nexport * from './lib/field/Field';\nexport * from './lib/field-label/FieldLabel';\nexport * from './lib/filter-chips/FilterChips';\nexport * from './lib/folder-tabs/FolderTabs';\nexport * from './lib/footer/Footer';\nexport * from './lib/icon/Icon';\nexport * from './lib/input/Input';\nexport * from './lib/link/Link';\nexport * from './lib/metric-card/MetricCard';\nexport * from './lib/modal/Modal';\nexport * from './lib/multi-select/MultiSelect';\nexport * from './lib/page-header/PageHeader';\nexport * from './lib/pagination/Pagination';\nexport * from './lib/panel/Panel';\nexport * from './lib/portal-header/PortalHeader';\nexport * from './lib/reserve-block/ReserveBlock';\nexport * from './lib/section-header/SectionHeader';\nexport * from './lib/segmented/Segmented';\nexport * from './lib/select/Select';\nexport * from './lib/sidebar-nav-item/SidebarNavItem';\nexport * from './lib/sidebar-shell/SidebarShell';\nexport * from './lib/skeleton/Skeleton';\nexport * from './lib/spinner/Spinner';\nexport * from './lib/stat-tile/StatTile';\nexport * from './lib/status-pill/StatusPill';\nexport * from './lib/tabs/Tabs';\nexport * from './lib/text/Text';\nexport * from './lib/toast/Toast';\nexport * from './lib/tooltip/Tooltip';\nexport * from './lib/vehicle-header/VehicleHeader';\nexport * from './lib/view-toggle/ViewToggle';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId","Input"],"mappings":"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"}
1
+ {"version":3,"file":"kaufmann-lab-ui.mjs","sources":["../../../projects/ui/src/lib/icon/icons/activity.ts","../../../projects/ui/src/lib/icon/icons/alert-circle.ts","../../../projects/ui/src/lib/icon/icons/alert-octagon.ts","../../../projects/ui/src/lib/icon/icons/alert-triangle.ts","../../../projects/ui/src/lib/icon/icons/award.ts","../../../projects/ui/src/lib/icon/icons/bar-chart.ts","../../../projects/ui/src/lib/icon/icons/bell.ts","../../../projects/ui/src/lib/icon/icons/bus.ts","../../../projects/ui/src/lib/icon/icons/calculator.ts","../../../projects/ui/src/lib/icon/icons/calendar.ts","../../../projects/ui/src/lib/icon/icons/car.ts","../../../projects/ui/src/lib/icon/icons/cart.ts","../../../projects/ui/src/lib/icon/icons/check.ts","../../../projects/ui/src/lib/icon/icons/check-circle.ts","../../../projects/ui/src/lib/icon/icons/check-square.ts","../../../projects/ui/src/lib/icon/icons/chevron-down.ts","../../../projects/ui/src/lib/icon/icons/chevron-left.ts","../../../projects/ui/src/lib/icon/icons/chevron-left-bar.ts","../../../projects/ui/src/lib/icon/icons/chevron-right.ts","../../../projects/ui/src/lib/icon/icons/clipboard.ts","../../../projects/ui/src/lib/icon/icons/clock.ts","../../../projects/ui/src/lib/icon/icons/credit-card.ts","../../../projects/ui/src/lib/icon/icons/crosshair.ts","../../../projects/ui/src/lib/icon/icons/download.ts","../../../projects/ui/src/lib/icon/icons/edit.ts","../../../projects/ui/src/lib/icon/icons/external-link.ts","../../../projects/ui/src/lib/icon/icons/eye.ts","../../../projects/ui/src/lib/icon/icons/eye-off.ts","../../../projects/ui/src/lib/icon/icons/file.ts","../../../projects/ui/src/lib/icon/icons/filter.ts","../../../projects/ui/src/lib/icon/icons/gauge.ts","../../../projects/ui/src/lib/icon/icons/gift.ts","../../../projects/ui/src/lib/icon/icons/grid.ts","../../../projects/ui/src/lib/icon/icons/history.ts","../../../projects/ui/src/lib/icon/icons/home.ts","../../../projects/ui/src/lib/icon/icons/inbox.ts","../../../projects/ui/src/lib/icon/icons/layers.ts","../../../projects/ui/src/lib/icon/icons/list.ts","../../../projects/ui/src/lib/icon/icons/log-out.ts","../../../projects/ui/src/lib/icon/icons/map.ts","../../../projects/ui/src/lib/icon/icons/map-pin.ts","../../../projects/ui/src/lib/icon/icons/maximize.ts","../../../projects/ui/src/lib/icon/icons/menu.ts","../../../projects/ui/src/lib/icon/icons/message-circle.ts","../../../projects/ui/src/lib/icon/icons/mic.ts","../../../projects/ui/src/lib/icon/icons/mic-off.ts","../../../projects/ui/src/lib/icon/icons/minimize.ts","../../../projects/ui/src/lib/icon/icons/minus.ts","../../../projects/ui/src/lib/icon/icons/monitor.ts","../../../projects/ui/src/lib/icon/icons/more-vertical.ts","../../../projects/ui/src/lib/icon/icons/navigation.ts","../../../projects/ui/src/lib/icon/icons/pause.ts","../../../projects/ui/src/lib/icon/icons/phone.ts","../../../projects/ui/src/lib/icon/icons/pin.ts","../../../projects/ui/src/lib/icon/icons/play.ts","../../../projects/ui/src/lib/icon/icons/plus.ts","../../../projects/ui/src/lib/icon/icons/search.ts","../../../projects/ui/src/lib/icon/icons/settings.ts","../../../projects/ui/src/lib/icon/icons/shield-check.ts","../../../projects/ui/src/lib/icon/icons/sort.ts","../../../projects/ui/src/lib/icon/icons/star.ts","../../../projects/ui/src/lib/icon/icons/ticket.ts","../../../projects/ui/src/lib/icon/icons/tool.ts","../../../projects/ui/src/lib/icon/icons/trash.ts","../../../projects/ui/src/lib/icon/icons/truck.ts","../../../projects/ui/src/lib/icon/icons/upload-cloud.ts","../../../projects/ui/src/lib/icon/icons/user.ts","../../../projects/ui/src/lib/icon/icons/user-search.ts","../../../projects/ui/src/lib/icon/icons/video.ts","../../../projects/ui/src/lib/icon/icons/x.ts","../../../projects/ui/src/lib/icon/icons/zap.ts","../../../projects/ui/src/lib/icon/icons/index.ts","../../../projects/ui/src/lib/icon/icon-sprite.ts","../../../projects/ui/src/lib/icon/Icon.ts","../../../projects/ui/src/lib/icon/Icon.html","../../../projects/ui/src/lib/action-tile/ActionTile.ts","../../../projects/ui/src/lib/action-tile/ActionTile.html","../../../projects/ui/src/lib/text/Text.ts","../../../projects/ui/src/lib/text/Text.html","../../../projects/ui/src/lib/admin-badge/AdminBadge.ts","../../../projects/ui/src/lib/admin-badge/AdminBadge.html","../../../projects/ui/src/lib/spinner/Spinner.ts","../../../projects/ui/src/lib/spinner/Spinner.html","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/button/button.html","../../../projects/ui/src/lib/alert/Alert.ts","../../../projects/ui/src/lib/alert/Alert.html","../../../projects/ui/src/lib/alert-row/AlertRow.ts","../../../projects/ui/src/lib/alert-row/AlertRow.html","../../../projects/ui/src/lib/divider/Divider.ts","../../../projects/ui/src/lib/auth-layout/AuthLayoutSso.ts","../../../projects/ui/src/lib/auth-layout/AuthLayout.ts","../../../projects/ui/src/lib/auth-layout/AuthLayout.html","../../../projects/ui/src/lib/avatar/Avatar.ts","../../../projects/ui/src/lib/avatar/Avatar.html","../../../projects/ui/src/lib/badge/Badge.ts","../../../projects/ui/src/lib/badge/Badge.html","../../../projects/ui/src/lib/breadcrumb/Breadcrumb.ts","../../../projects/ui/src/lib/breadcrumb/Breadcrumb.html","../../../projects/ui/src/lib/bucket-progress/BucketProgress.ts","../../../projects/ui/src/lib/bucket-progress/BucketProgress.html","../../../projects/ui/src/lib/card/Card.ts","../../../projects/ui/src/lib/card/Card.html","../../../projects/ui/src/lib/carousel/CarouselSlide.ts","../../../projects/ui/src/lib/carousel/Carousel.ts","../../../projects/ui/src/lib/carousel/Carousel.html","../../../projects/ui/src/lib/checkbox/Checkbox.ts","../../../projects/ui/src/lib/checkbox/Checkbox.html","../../../projects/ui/src/lib/chip/Chip.ts","../../../projects/ui/src/lib/chip/Chip.html","../../../projects/ui/src/lib/collapsible/Collapsible.ts","../../../projects/ui/src/lib/collapsible/Collapsible.html","../../../projects/ui/src/lib/field-label/FieldLabel.ts","../../../projects/ui/src/lib/field-label/FieldLabel.html","../../../projects/ui/src/lib/shared/search-text.ts","../../../projects/ui/src/lib/shared/select-overlay.ts","../../../projects/ui/src/lib/select/Select.ts","../../../projects/ui/src/lib/select/Select.html","../../../projects/ui/src/lib/company-selector/CompanySelector.ts","../../../projects/ui/src/lib/company-selector/CompanySelector.html","../../../projects/ui/src/lib/content-slot/ContentSlot.ts","../../../projects/ui/src/lib/content-slot/ContentSlot.html","../../../projects/ui/src/lib/empty-state/EmptyState.ts","../../../projects/ui/src/lib/empty-state/EmptyState.html","../../../projects/ui/src/lib/skeleton/Skeleton.ts","../../../projects/ui/src/lib/skeleton/Skeleton.html","../../../projects/ui/src/lib/content-state/ContentState.ts","../../../projects/ui/src/lib/content-state/ContentState.html","../../../projects/ui/src/lib/content-viewer/ContentViewer.ts","../../../projects/ui/src/lib/content-viewer/ContentViewer.html","../../../projects/ui/src/lib/pagination/Pagination.ts","../../../projects/ui/src/lib/pagination/Pagination.html","../../../projects/ui/src/lib/view-toggle/ViewToggle.ts","../../../projects/ui/src/lib/view-toggle/ViewToggle.html","../../../projects/ui/src/lib/data-table/DataTable.ts","../../../projects/ui/src/lib/data-table/DataTable.html","../../../projects/ui/src/lib/shared/media-query.ts","../../../projects/ui/src/lib/data-table/responsive-view.ts","../../../projects/ui/src/lib/link/Link.ts","../../../projects/ui/src/lib/link/Link.html","../../../projects/ui/src/lib/document-row/DocumentRow.ts","../../../projects/ui/src/lib/document-row/DocumentRow.html","../../../projects/ui/src/lib/drawer/Drawer.ts","../../../projects/ui/src/lib/drawer/Drawer.html","../../../projects/ui/src/lib/drawer-logout/DrawerLogout.ts","../../../projects/ui/src/lib/drawer-logout/DrawerLogout.html","../../../projects/ui/src/lib/drawer-session/DrawerSession.ts","../../../projects/ui/src/lib/drawer-session/DrawerSession.html","../../../projects/ui/src/lib/dropdown/DropdownPanel.ts","../../../projects/ui/src/lib/dropdown/DropdownPanel.html","../../../projects/ui/src/lib/dropdown/Dropdown.ts","../../../projects/ui/src/lib/dropdown/DropdownItem.ts","../../../projects/ui/src/lib/dropdown/DropdownItem.html","../../../projects/ui/src/lib/event-timeline/EventTimeline.ts","../../../projects/ui/src/lib/event-timeline/EventTimeline.html","../../../projects/ui/src/lib/feature-card/FeatureCard.ts","../../../projects/ui/src/lib/feature-card/FeatureCard.html","../../../projects/ui/src/lib/field/Field.ts","../../../projects/ui/src/lib/field/Field.html","../../../projects/ui/src/lib/input/Input.ts","../../../projects/ui/src/lib/input/Input.html","../../../projects/ui/src/lib/multi-select/MultiSelect.ts","../../../projects/ui/src/lib/multi-select/MultiSelect.html","../../../projects/ui/src/lib/filter/Filter.ts","../../../projects/ui/src/lib/filter/Filter.html","../../../projects/ui/src/lib/filter-chips/FilterChips.ts","../../../projects/ui/src/lib/filter-chips/FilterChips.html","../../../projects/ui/src/lib/footer/Footer.ts","../../../projects/ui/src/lib/footer/Footer.html","../../../projects/ui/src/lib/shared/format.ts","../../../projects/ui/src/lib/journey-stepper/JourneyStepper.ts","../../../projects/ui/src/lib/journey-stepper/JourneyStepper.html","../../../projects/ui/src/lib/map/map-config.ts","../../../projects/ui/src/lib/map/map-theme.ts","../../../projects/ui/src/lib/tooltip/Tooltip.ts","../../../projects/ui/src/lib/shared/arrow-key-navigation.ts","../../../projects/ui/src/lib/map/MapThemePicker.ts","../../../projects/ui/src/lib/map/MapThemePicker.html","../../../projects/ui/src/lib/map/MapControls.ts","../../../projects/ui/src/lib/map/MapControls.html","../../../projects/ui/src/lib/map/MapView.ts","../../../projects/ui/src/lib/map/MapView.html","../../../projects/ui/src/lib/metric-card/MetricCard.ts","../../../projects/ui/src/lib/metric-card/MetricCard.html","../../../projects/ui/src/lib/mobile-footer/MobileFooter.ts","../../../projects/ui/src/lib/mobile-footer/MobileFooter.html","../../../projects/ui/src/lib/mobile-header/MobileHeader.ts","../../../projects/ui/src/lib/mobile-header/MobileHeader.html","../../../projects/ui/src/lib/modal/modal-overlay-container.ts","../../../projects/ui/src/lib/modal/Modal.ts","../../../projects/ui/src/lib/modal/Modal.html","../../../projects/ui/src/lib/note-block/NoteBlock.ts","../../../projects/ui/src/lib/note-block/NoteBlock.html","../../../projects/ui/src/lib/page-header/PageHeader.ts","../../../projects/ui/src/lib/page-header/PageHeader.html","../../../projects/ui/src/lib/panel/Panel.ts","../../../projects/ui/src/lib/panel/Panel.html","../../../projects/ui/src/lib/portal-header/PortalHeader.ts","../../../projects/ui/src/lib/portal-header/PortalHeader.html","../../../projects/ui/src/lib/progress/Progress.ts","../../../projects/ui/src/lib/progress/Progress.html","../../../projects/ui/src/lib/pulse-dot/PulseDot.ts","../../../projects/ui/src/lib/pulse-dot/PulseDot.html","../../../projects/ui/src/lib/quote-picker/QuotePicker.ts","../../../projects/ui/src/lib/quote-picker/QuotePicker.html","../../../projects/ui/src/lib/reserve-block/ReserveBlock.ts","../../../projects/ui/src/lib/reserve-block/ReserveBlock.html","../../../projects/ui/src/lib/section-header/SectionHeader.ts","../../../projects/ui/src/lib/section-header/SectionHeader.html","../../../projects/ui/src/lib/section-nav/SectionNav.ts","../../../projects/ui/src/lib/section-nav/SectionNav.html","../../../projects/ui/src/lib/section-nav/section-nav-item/SectionNavItem.ts","../../../projects/ui/src/lib/section-nav/section-nav-item/SectionNavItem.html","../../../projects/ui/src/lib/section-nav/section-nav-item/SectionNavSubsection.ts","../../../projects/ui/src/lib/segmented/Segmented.ts","../../../projects/ui/src/lib/segmented/Segmented.html","../../../projects/ui/src/lib/selectable-card-group/SelectableCardGroup.ts","../../../projects/ui/src/lib/selectable-card-group/SelectableCardGroup.html","../../../projects/ui/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.ts","../../../projects/ui/src/lib/sidebar-shell/sidebar-nav-item/SidebarNavItem.html","../../../projects/ui/src/lib/sidebar-shell/SidebarShell.ts","../../../projects/ui/src/lib/sidebar-shell/SidebarShell.html","../../../projects/ui/src/lib/sso-button/SsoButton.ts","../../../projects/ui/src/lib/sso-button/SsoButton.html","../../../projects/ui/src/lib/stat-card/StatCard.ts","../../../projects/ui/src/lib/stat-card/StatCard.html","../../../projects/ui/src/lib/stat-tile/StatTile.ts","../../../projects/ui/src/lib/stat-tile/StatTile.html","../../../projects/ui/src/lib/status-pill/StatusPill.ts","../../../projects/ui/src/lib/status-pill/StatusPill.html","../../../projects/ui/src/lib/tabs/Tabs.ts","../../../projects/ui/src/lib/tabs/Tabs.html","../../../projects/ui/src/lib/tabs/folder-tabs/FolderTabs.ts","../../../projects/ui/src/lib/tabs/folder-tabs/FolderTabs.html","../../../projects/ui/src/lib/textarea/Textarea.ts","../../../projects/ui/src/lib/textarea/Textarea.html","../../../projects/ui/src/lib/shared/format-input.directive.ts","../../../projects/ui/src/lib/tile-grid/TileGrid.ts","../../../projects/ui/src/lib/tile-grid/TileGrid.html","../../../projects/ui/src/lib/toast/Toast.ts","../../../projects/ui/src/lib/toast/ToastHost.html","../../../projects/ui/src/lib/vehicle-header/VehicleHeader.ts","../../../projects/ui/src/lib/vehicle-header/VehicleHeader.html","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/kaufmann-lab-ui.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 \"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 \"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 \"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 \"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 { layers } from './layers';\nimport { list } from './list';\nimport { logOut } from './log-out';\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 { 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 layers: layers,\n list: list,\n 'log-out': logOut,\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 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 71 í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, input } 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` y `ariaPressed` 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 * `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\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 [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 [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\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@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 /** 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 class=\"kf-alert\" [class]=\"'kf-alert--' + tone()\" [attr.role]=\"ariaRole()\">\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 { Component, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type AlertRowTone = 'warn' | 'error';\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@Component({\n selector: 'kf-alert-row',\n imports: [Icon],\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 readonly rowClick = output<void>();\n}\n","<button type=\"button\" class=\"kf-alert-row\" (click)=\"rowClick.emit()\">\n <span class=\"kf-alert-row__icon\" [class]=\"'kf-alert-row__icon--' + tone()\">\n <kf-icon [name]=\"icon()\" size=\"sm\" />\n </span>\n <span class=\"kf-alert-row__text\">{{ text() }}</span>\n <kf-icon class=\"kf-alert-row__chevron\" name=\"chevron-right\" size=\"sm\" />\n</button>\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 { Directive } from '@angular/core';\n\n/**\n * Marca el contenido que va en el slot de SSO de `kf-auth-layout` (típico:\n * un `kf-sso-button`, o varios si el ecosistema suma más de un proveedor).\n * `AuthLayout` la detecta vía `contentChild` para decidir si renderiza el\n * separador \"o\" entre el bloque de SSO y el formulario tradicional\n * proyectado en el slot por defecto — sin este marcador, `AuthLayout`\n * tendría que adivinar si hubo proyección leyendo el DOM a mano.\n *\n * <kf-auth-layout brand=\"Mi Portal\">\n * <div kfAuthLayoutSso>\n * <kf-sso-button provider=\"microsoft\" (click)=\"loginWithMicrosoft()\" />\n * </div>\n * <form ...>...</form>\n * </kf-auth-layout>\n */\n@Directive({\n selector: '[kfAuthLayoutSso]',\n})\nexport class AuthLayoutSso {}\n","import { booleanAttribute, Component, contentChild, input } from '@angular/core';\nimport { Divider } from '../divider/Divider';\nimport { Text } from '../text/Text';\nimport { AuthLayoutSso } from './AuthLayoutSso';\n\nexport type AuthLayoutBackground = 'plain' | 'gradient' | 'pattern';\n\n/**\n * Layout a pantalla completa para pantallas de autenticación (login,\n * recuperar contraseña, confirmación de envío) — panel de marca a la\n * izquierda, contenido libre a la derecha en desktop; en mobile el panel de\n * marca se oculta y un logo compacto queda visible arriba del formulario.\n *\n * Resuelve solo el \"cascarón\": cada portal arma su propio `<form>` con los\n * componentes de la librería y lo proyecta en el slot por defecto.\n *\n * <kf-auth-layout\n * brand=\"Mi Portal\"\n * brandLogoSrc=\"images/mi-portal-logo-white.png\"\n * brandLogoMobileSrc=\"images/mi-portal-logo-black.png\"\n * brandTagline=\"Frase corta de marca, propia de cada portal.\"\n * >\n * <form (ngSubmit)=\"onSubmit()\">\n * <kf-input label=\"Correo\" type=\"email\" />\n * <kf-input label=\"Contraseña\" type=\"password\" toggleable />\n * <kf-button type=\"submit\">Ingresar</kf-button>\n * </form>\n * </kf-auth-layout>\n *\n * `backgroundVariant` controla la superficie del panel derecho:\n * `'plain'` (fondo liso, comportamiento histórico), `'gradient'` (default —\n * degradé sutil derivado de `--kf-color-primary`/`--kf-color-surface` vía\n * `color-mix()`, ningún color hardcodeado) o `'pattern'` (el mismo degradé\n * más una textura de puntos, también resuelta con tokens). Los tres se\n * resuelven contra los tokens de tema ACTIVOS — cambiar de tema\n * (`andes-maq`, `divemotor-star`, `kaufmann-ar`, futuros) no requiere tocar\n * este componente ni pasarle un color a mano.\n *\n * `card`, en `false` por defecto (comportamiento histórico: el contenido\n * proyectado flota sin superficie propia), envuelve el slot por defecto con\n * la misma superficie de `kf-card` (fondo, borde, sombra, radio) para que\n * el formulario deje de verse suelto sobre el fondo del panel.\n *\n * `title`/`subtitle` renderizan un encabezado de bienvenida DENTRO de la\n * card, antes que cualquier otro contenido (jerarquía ya resuelta:\n * `title-lg` + `body-muted`, ver `Text.ts`) — así ningún consumidor tiene\n * que adivinar la variante de `kf-text` correcta ni terminar con un\n * \"Iniciar sesión\" repetido y suelto dentro de su propio `<form>`. Sin\n * `title`, no se renderiza ningún encabezado (comportamiento histórico).\n *\n * El slot `[kfAuthLayoutSso]` (ver `AuthLayoutSso`) es para el patrón\n * \"SSO primero, credenciales como alternativa secundaria\" — típicamente un\n * `kf-sso-button`. Cuando hay contenido ahí, `AuthLayout` resuelve el\n * separador \"o\" automáticamente entre ese bloque y el contenido por\n * defecto; sin ese slot, nada cambia frente al comportamiento actual.\n *\n * <kf-auth-layout\n * brand=\"Mi Portal\"\n * backgroundVariant=\"pattern\"\n * card\n * title=\"Iniciar sesión\"\n * subtitle=\"Usa tu cuenta corporativa o ingresa con contraseña\"\n * >\n * <div kfAuthLayoutSso>\n * <kf-sso-button provider=\"microsoft\" (click)=\"loginWithMicrosoft()\" />\n * </div>\n * <form (ngSubmit)=\"onSubmit()\">\n * <kf-input label=\"Correo\" type=\"email\" />\n * <kf-input label=\"Contraseña\" type=\"password\" toggleable />\n * <kf-button type=\"submit\">Ingresar</kf-button>\n * </form>\n * </kf-auth-layout>\n */\n@Component({\n selector: 'kf-auth-layout',\n imports: [Divider, Text],\n templateUrl: './AuthLayout.html',\n styleUrl: './AuthLayout.scss',\n host: {\n '[attr.data-background]': 'backgroundVariant()',\n },\n})\nexport class AuthLayout {\n /** Nombre de marca/portal — wordmark de respaldo si no hay logo, y `alt` de ambos logos. */\n readonly brand = input.required<string>();\n\n /** Logo en blanco para el panel oscuro de desktop. Sin esto, se muestra `brand()` como wordmark. */\n readonly brandLogoSrc = input<string>();\n\n /** Frase corta bajo el logo. */\n readonly brandTagline = input<string>();\n\n /** Logo compacto para mobile, sobre fondo claro. Sin esto, reutiliza `brandLogoSrc`. */\n readonly brandLogoMobileSrc = input<string>();\n\n /** Superficie del panel derecho. Default `'gradient'`; `'plain'` preserva el fondo liso histórico. */\n readonly backgroundVariant = input<AuthLayoutBackground>('gradient');\n\n /** Envuelve el contenido proyectado con la superficie de `kf-card` (fondo, borde, sombra). Default `false` — preserva el comportamiento histórico. */\n readonly card = input(false, { transform: booleanAttribute });\n\n /** Título del encabezado dentro de la card (`title-lg`). Sin este input, no se renderiza ningún encabezado. */\n readonly title = input<string>();\n\n /** Subtítulo del encabezado (`body-muted`), debajo de `title`. Sin efecto si `title` no está presente. */\n readonly subtitle = input<string>();\n\n /** Presencia de contenido en el slot `[kfAuthLayoutSso]` — controla si se renderiza el separador \"o\". */\n protected readonly ssoContent = contentChild(AuthLayoutSso);\n}\n","<aside class=\"kf-auth-layout__brand\">\n @if (brandLogoSrc()) {\n <img class=\"kf-auth-layout__logo\" [src]=\"brandLogoSrc()\" [alt]=\"brand()\" />\n } @else {\n <span class=\"kf-auth-layout__wordmark\">{{ brand() }}</span>\n }\n @if (brandTagline()) {\n <p class=\"kf-auth-layout__tagline\">{{ brandTagline() }}</p>\n }\n</aside>\n\n<main class=\"kf-auth-layout__content\">\n <div class=\"kf-auth-layout__panel\" [class.kf-auth-layout__panel--card]=\"card()\">\n <div class=\"kf-auth-layout__mobile-brand\">\n @if (brandLogoMobileSrc() || brandLogoSrc()) {\n <img\n class=\"kf-auth-layout__logo kf-auth-layout__logo--mobile\"\n [src]=\"brandLogoMobileSrc() || brandLogoSrc()\"\n [alt]=\"brand()\"\n />\n } @else {\n <span class=\"kf-auth-layout__wordmark kf-auth-layout__wordmark--mobile\">{{ brand() }}</span>\n }\n </div>\n\n @if (title(); as headerTitle) {\n <div class=\"kf-auth-layout__header\">\n <kf-text as=\"h1\" variant=\"title-lg\">{{ headerTitle }}</kf-text>\n @if (subtitle(); as headerSubtitle) {\n <kf-text as=\"p\" variant=\"body-muted\">{{ headerSubtitle }}</kf-text>\n }\n </div>\n }\n\n <div class=\"kf-auth-layout__sso\">\n <ng-content select=\"[kfAuthLayoutSso]\" />\n </div>\n\n @if (ssoContent()) {\n <div class=\"kf-auth-layout__divider\">\n <kf-divider />\n <kf-text as=\"span\" variant=\"caption\" class=\"kf-auth-layout__divider-label\">o</kf-text>\n <kf-divider />\n </div>\n }\n\n <div class=\"kf-auth-layout__body\">\n <ng-content />\n </div>\n </div>\n</main>\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@Component({\n selector: 'kf-badge',\n templateUrl: './Badge.html',\n styleUrl: './Badge.css',\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}\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 <ng-content />\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 { 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@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--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}\n","<ng-content select=\"[kf-card-media]\" />\n<div class=\"kf-card__body\">\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","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@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}\n","<label class=\"kf-field-label\" [for]=\"for()\">\n <ng-content />\n @if (required()) {\n <span class=\"kf-field-label__required\" aria-hidden=\"true\">*</span>\n }\n</label>\n","/**\n * Normaliza texto para comparación de búsqueda insensible a mayúsculas y\n * diacríticos — así \"cor\" encuentre \"Córdoba\" sin necesidad de tildes.\n *\n * Compartida entre `Select` y `MultiSelect` (los dos componentes con\n * buscador interno auto-activado por `searchThreshold`): antes vivía\n * duplicada letra por letra en ambos archivos.\n */\nexport function normalizeForSearch(text: string): string {\n return text.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n}\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\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({ width: this.resolveWidth() });\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 width: this.resolveWidth(),\n maxWidth: '90vw',\n });\n\n return this.overlayRef;\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 {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\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 { FieldLabel } from '../field-label/FieldLabel';\nimport { normalizeForSearch } from '../shared/search-text';\nimport { SelectOverlay } from '../shared/select-overlay';\n\n/** Normalized shape used internally once `options` (string[] or object[]) is resolved. */\ninterface SelectOption {\n value: string;\n label: 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/**\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 *\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@Component({\n selector: 'kf-select',\n imports: [FieldLabel],\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 readonly options = input.required<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 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 the union (`string[] | { value; label }[]`) 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 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 normalizeForSearch(option.label).includes(query),\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\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 );\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. 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 afterRenderEffect(() => {\n if (this.isOpen() && this.showSearch()) {\n this.searchInputRef()?.nativeElement.focus();\n }\n });\n\n inject(DestroyRef).onDestroy(() => this.overlay.dispose());\n }\n\n /**\n * Respaldo de `overlayRef.keydownEvents()`: ese observable del CDK solo ve\n * teclas presionadas con el foco DENTRO del pane del overlay. Si el foco\n * sigue en el trigger (o en cualquier otro lado de la página) mientras el\n * panel está abierto, `keydownEvents()` nunca dispara.\n */\n @HostListener('document:keydown.escape')\n onDocumentEscape(): void {\n this.isOpen.set(false);\n }\n\n toggle(): void {\n if (this.disabled()) {\n return;\n }\n this.isOpen.update((open) => !open);\n }\n\n select(option: SelectOption): void {\n this.isOpen.set(false);\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 }\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\">{{ 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 [disabled]=\"disabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"isOpen() ? listboxId : null\"\n [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n [attr.aria-invalid]=\"invalid() ? true : null\"\n (click)=\"toggle()\"\n>\n <span class=\"kf-select__value\" [class.kf-select__value--placeholder]=\"!selectedOption()\">\n {{ selectedOption()?.label ?? placeholder() }}\n </span>\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 class=\"kf-select__panel\" [class.kf-select__panel--compact]=\"variant() === 'compact'\">\n @if (showSearch()) {\n <input\n #searchInput\n type=\"text\"\n class=\"kf-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(); selectActive()\"\n />\n }\n <ul class=\"kf-select__list\" [id]=\"listboxId\" role=\"listbox\" [attr.aria-labelledby]=\"triggerId\">\n @for (option of filteredOptions(); track option.value; let i = $index) {\n <li\n class=\"kf-select__option\"\n [class.kf-select__option--selected]=\"option.value === value()\"\n [class.kf-select__option--active]=\"i === activeIndex()\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"option.value === value()\"\n (click)=\"select(option)\"\n (mouseenter)=\"activeIndex.set(i)\"\n (keydown.enter)=\"select(option)\"\n (keydown.space)=\"$event.preventDefault(); select(option)\"\n (keydown.arrowdown)=\"$event.preventDefault(); moveActive(1)\"\n (keydown.arrowup)=\"$event.preventDefault(); moveActive(-1)\"\n >\n {{ option.label }}\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, input, output } from '@angular/core';\nimport { Divider } from '../divider/Divider';\nimport { Select } from '../select/Select';\nimport { Text } from '../text/Text';\n\n/** Metadato clave mostrado junto al selector (RUC, identificación, sucursal). */\nexport interface CompanySelectorMeta {\n label: string;\n value: string;\n}\n\n/**\n * Conmutador de empresa activa con metadatos clave (página 32) — encabeza\n * la pantalla de inicio del portal. Compone `kf-select` para el propio\n * selector (mismo panel propio, sin `<select>` nativo) y proyecta hasta 3\n * pares label/valor (RUC, Identificación, Sucursal en el ejemplo del PDF).\n *\n * <kf-company-selector\n * label=\"Selecciona empresa\"\n * [companies]=\"['TRANSPORTES DEL SUR S.A.C.', 'ANDES MAQ LTDA.']\"\n * [value]=\"activeCompany()\"\n * (valueChange)=\"activeCompany.set($event)\"\n * [meta]=\"[\n * { label: 'RUC', value: '20448712359' },\n * { label: 'Identificación', value: '0004002232' },\n * { label: 'Sucursal', value: 'Sucursal Norte' },\n * ]\"\n * />\n */\n@Component({\n selector: 'kf-company-selector',\n imports: [Divider, Select, Text],\n templateUrl: './CompanySelector.html',\n styleUrl: './CompanySelector.css',\n})\nexport class CompanySelector {\n readonly label = input('Selecciona empresa');\n readonly companies = input.required<string[]>();\n readonly value = input<string>();\n readonly meta = input<CompanySelectorMeta[]>([]);\n\n readonly valueChange = output<string>();\n}\n","<kf-select\n class=\"kf-company-selector__select\"\n [label]=\"label()\"\n [options]=\"companies()\"\n [value]=\"value()\"\n (valueChange)=\"valueChange.emit($event)\"\n/>\n@if (meta().length) {\n <div class=\"kf-company-selector__meta\">\n @for (item of meta(); track item.label; let last = $last) {\n <div class=\"kf-company-selector__meta-item\">\n <kf-text as=\"span\" variant=\"overline\">{{ item.label }}</kf-text>\n <span class=\"kf-company-selector__meta-value\">{{ item.value }}</span>\n </div>\n @if (!last) {\n <kf-divider orientation=\"vertical\" />\n }\n }\n </div>\n}\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, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\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@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 },\n})\nexport class EmptyState {\n readonly icon = input<IconName | undefined>(undefined);\n /** `neutral` (default): cero resultados. `error`: fallo real de carga. */\n readonly tone = input<'neutral' | 'error'>('neutral');\n}\n","@if (icon(); as iconName) {\n <span class=\"kf-empty-state__icon\">\n <kf-icon [name]=\"iconName\" [size]=\"tone() === 'error' ? 'lg' : 'md'\" />\n </span>\n}\n<div class=\"kf-empty-state__content\">\n <ng-content />\n</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 { Component, input } from '@angular/core';\nimport { EmptyState } from '../empty-state/EmptyState';\nimport { Skeleton } from '../skeleton/Skeleton';\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 * 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 * <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@Component({\n selector: 'kf-content-state',\n imports: [EmptyState, Skeleton, 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 /** Texto al lado del spinner cuando `load=\"spinner\"`. */\n readonly loadingLabel = input('Cargando…');\n}\n","@switch (state()) {\n @case ('ready') {\n <ng-content />\n }\n @case ('loading') {\n <div class=\"kf-content-state__loading\" aria-busy=\"true\">\n @if (load() === 'spinner') {\n <kf-spinner [label]=\"loadingLabel()\" />\n } @else {\n <kf-skeleton />\n <kf-skeleton width=\"80%\" />\n <kf-skeleton width=\"60%\" />\n }\n </div>\n }\n @default {\n <kf-empty-state [tone]=\"state() === 'error' ? 'error' : 'neutral'\">\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 { Icon } from '../icon/Icon';\n\nexport type ContentViewerType = 'image' | 'video';\n\nlet contentViewerId = 0;\n\n/**\n * Visor a pantalla completa para ampliar una pieza de contenido — hoy\n * imagen, con `video` ya soportado para cuando haya contenido de ese tipo.\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 y MP4 para video).\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 */\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 const mime = this.type() === 'video' ? 'video/mp4' : 'image/jpeg';\n return `data:${mime};base64,${raw}`;\n });\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\n private readonly document = inject(DOCUMENT);\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 : type() === 'video' ? 'Visor de video' : 'Visor de imagen'\"\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 @if (title()) {\n <span class=\"kf-content-viewer__title\" [id]=\"titleId\">{{ title() }}</span>\n }\n <div class=\"kf-content-viewer__stage\">\n @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, 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\">\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 [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, input, output } from '@angular/core';\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 * <kf-view-toggle [view]=\"view\" (viewChange)=\"view = $event\" />\n */\n@Component({\n selector: 'kf-view-toggle',\n templateUrl: './ViewToggle.html',\n styleUrl: './ViewToggle.css',\n})\nexport class ViewToggle {\n readonly view = input.required<ViewToggleOption>();\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\" aria-label=\"Alternar tipo de vista\">\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--active]=\"view() === 'table'\"\n [attr.aria-checked]=\"view() === 'table'\"\n [attr.tabindex]=\"view() === 'table' ? 0 : -1\"\n (click)=\"select('table')\"\n (keydown)=\"onKeydown($event)\"\n >\n Tabla\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n class=\"kf-view-toggle__option\"\n [class.kf-view-toggle__option--active]=\"view() === 'cards'\"\n [attr.aria-checked]=\"view() === 'cards'\"\n [attr.tabindex]=\"view() === 'cards' ? 0 : -1\"\n (click)=\"select('cards')\"\n (keydown)=\"onKeydown($event)\"\n >\n Tarjetas\n </button>\n</div>\n","import {\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\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.\n * - `action`: va al pie, separado del cuerpo por una línea.\n */\nexport type DataTableCardRole = 'media' | 'title' | 'status' | 'field' | '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}\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) — mismo número de filas que\n * `pageSize`, o 5 si no hay paginación activa. 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 * <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 * Ordenamiento por columna: cada `DataTableColumn` con `sortable: true`\n * vuelve su header clickeable, 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@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 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 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) — sin esto, `page` queda en un número que\n // puede no existir más para el nuevo conjunto (ej. estar en la página 2\n // de \"Todos\" y pasar a \"Bonos\", que solo tiene 1 página), dejando la\n // tabla en blanco porque `displayedRows` corta un rango vacío. Reacciona\n // solo a `rows()`, no a `page()`/`sort()`: cambiar de página o de orden\n // NUNCA debe resetear la página por sí mismo.\n effect(() => {\n this.rows();\n this.page.set(1);\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 }\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);\n readonly defaultView = input<DataTableView>('table');\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. */\n readonly cellTemplates = input<\n Record<string, TemplateRef<{ $implicit: T; index: number }>> | 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 readonly rowClick = output<{ row: T; index: number }>();\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 readonly pageChange = output<number>();\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 protected readonly page = signal(1);\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 * `pageSize` efectivo si hay paginación activa (así el placeholder ya\n * \"adivina\" cuántas filas reales van a aparecer, sin salto de layout),\n * o 5 si no hay paginación. */\n protected readonly skeletonRowIndexes = computed(() =>\n Array.from({ length: this.effectivePageSize() ?? 5 }, (_, i) => i),\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 /** 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 this.pageChange.emit(clamped);\n }\n\n protected setPageSize(size: number | null): void {\n if (size === null) {\n return;\n }\n this.internalPageSize.set(size);\n this.page.set(1);\n this.pageSizeChange.emit(size);\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 private readonly internalView = signal<DataTableView | null>(null);\n\n /** Vista activa: la elegida por el usuario, o `defaultView` si no tocó el toggle. */\n readonly view = computed<DataTableView>(() => this.internalView() ?? 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'),\n );\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(() => this.cardActionColumns().length === 0);\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 setView(next: DataTableView): void {\n this.internalView.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 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 onRowClick(row: T, index: number): void {\n if (!this.rowInteractive()) {\n return;\n }\n this.rowClick.emit({ row, index });\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()) {\n <div class=\"kf-data-table__toolbar\">\n <kf-view-toggle [view]=\"view()\" (viewChange)=\"setView($event)\" />\n </div>\n }\n\n @if (loading()) {\n @if (cardable() && view() === 'cards') {\n <div class=\"kf-data-table__cards\" aria-busy=\"true\">\n @for (i of skeletonRowIndexes(); track i) {\n <div class=\"kf-data-table__card\">\n <kf-skeleton variant=\"rect\" height=\"120px\" />\n </div>\n }\n </div>\n } @else {\n <div class=\"kf-data-table__scroll\" aria-busy=\"true\">\n <table class=\"kf-data-table__table\">\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]=\"column.right\"\n >\n {{ column.label }}\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) {\n <td [class]=\"column.className\" [class.kf-data-table__cell--right]=\"column.right\">\n <kf-skeleton />\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 (view() === '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 >\n <table class=\"kf-data-table__table\">\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]=\"column.right\"\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]=\"column.minWidth\"\n (click)=\"toggleSort(column)\"\n >\n <span class=\"kf-data-table__th-content\">\n {{ column.label }}\n @if (column.sortable) {\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 }\n </span>\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 [attr.tabindex]=\"rowInteractive() ? 0 : null\"\n (click)=\"onRowClick(row, i)\"\n (keydown.enter)=\"onRowClick(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]=\"column.right\"\n [class.kf-data-table__cell--sticky]=\"column.sticky\"\n [style]=\"stickyStyle(column)\"\n [style.min-width]=\"column.minWidth\"\n >\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\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 </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n } @else {\n <div class=\"kf-data-table__cards\">\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 [attr.role]=\"cardInteractive() ? 'button' : null\"\n [attr.tabindex]=\"cardInteractive() ? 0 : null\"\n (click)=\"cardInteractive() && onRowClick(row, i)\"\n (keydown.enter)=\"cardInteractive() && onRowClick(row, i)\"\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 }\"\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 class=\"kf-data-table__card-title\">\n @if (cellTemplates()?.[title.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, title) }}\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 @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\n }\n }\n </span>\n }\n </div>\n </div>\n }\n\n @if (cardFieldColumns().length) {\n <div class=\"kf-data-table__card-fields\">\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 class=\"kf-data-table__card-value\">\n @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\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 @if (cellTemplates()?.[column.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, index: i }\"\n />\n } @else {\n {{ cellValue(row, column) }}\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","import { DestroyRef, Signal, inject, signal } from '@angular/core';\n\n/**\n * Signal reactivo con el estado actual de un media query — para cuando un\n * componente necesita SABER en qué lado de un breakpoint está (no solo\n * mostrar/ocultar con CSS). Un `@media` en `styles` no alcanza cuando la\n * decisión no es puramente visual: por ejemplo, un componente hijo que\n * recibe un input booleano (`[collapsed]`) no puede \"leer\" un breakpoint\n * CSS del padre — necesita que alguien en TypeScript se lo diga.\n *\n * Encontrado al construir `SidebarShell`: el estado `collapsed` (colapso\n * del rail en desktop) se pasaba tal cual a cada `kf-sidebar-nav-item`, sin\n * importar el viewport. En mobile, donde el rail deslizado siempre muestra\n * etiquetas completas (ver estilos de `SidebarShell`), los ítems seguían\n * ocultando su label si el usuario había dejado el rail colapsado en\n * desktop antes de achicar la ventana — un CSS que dice \"en mobile se ve\n * ancho\" no cambia el valor del input que ya llegó al hijo.\n *\n * Debe llamarse dentro de un contexto de inyección (el `constructor` de un\n * componente, o un campo de clase inicializado ahí — mismo requisito que\n * cualquier función que use `inject()`).\n *\n * protected readonly isMobile = matchMediaSignal('(max-width: 900px)');\n * // ...\n * [collapsed]=\"collapsed() && !isMobile()\"\n */\nexport function matchMediaSignal(query: string): Signal<boolean> {\n const mediaQueryList = matchMedia(query);\n const state = signal(mediaQueryList.matches);\n\n const onChange = (event: MediaQueryListEvent) => state.set(event.matches);\n mediaQueryList.addEventListener('change', onChange);\n\n inject(DestroyRef).onDestroy(() => mediaQueryList.removeEventListener('change', onChange));\n\n return state.asReadonly();\n}\n","import { computed, Signal } from '@angular/core';\nimport { matchMediaSignal } from '../shared/media-query';\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 { 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 { 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@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 },\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","<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","import { FocusTrap, FocusTrapFactory } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n afterRenderEffect,\n inject,\n input,\n model,\n viewChild,\n} from '@angular/core';\n\nexport type DrawerSide = 'left' | 'right';\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@Component({\n selector: 'kf-drawer',\n templateUrl: './Drawer.html',\n styleUrl: './Drawer.css',\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. */\n readonly side = input<DrawerSide>('left');\n /** `aria-label` del `<nav>` interno — describe el propósito del panel para\n * lectores de pantalla (ej. \"Menú de navegación\"). */\n readonly ariaLabel = input('Menú');\n\n private readonly panelRef = viewChild.required<ElementRef<HTMLElement>>('panel');\n private readonly focusTrapFactory = inject(FocusTrapFactory);\n private readonly document = inject(DOCUMENT);\n\n private focusTrap: FocusTrap | null = null;\n private lastFocusedElement: HTMLElement | null = null;\n\n constructor() {\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 this.lastFocusedElement?.focus();\n this.lastFocusedElement = null;\n }\n });\n\n inject(DestroyRef).onDestroy(() => this.focusTrap?.destroy());\n }\n\n /** Cierra el drawer con Escape — mismo patrón que `Dropdown`/`Modal`. */\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\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 aria-label=\"Cerrar menú\"\n (click)=\"open.set(false)\"\n ></button>\n}\n\n<nav\n #panel\n class=\"kf-drawer__panel\"\n [class.kf-drawer__panel--open]=\"open()\"\n [class.kf-drawer__panel--right]=\"side() === 'right'\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-hidden]=\"!open()\"\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</nav>\n","import { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Botón de cerrar sesión, pensado para proyectarse dentro de\n * `[kf-drawer-footer]` de `kf-drawer`, o junto a `kf-drawer-session` dentro\n * de `[kf-sidebar-footer]` de `kf-sidebar-shell` — separado de\n * `kf-drawer-session` (que solo muestra identidad: brand, avatar, nombre,\n * email), no anidado dentro de ella.\n *\n * Ícono `log-out` + label, color `--kf-color-error` con hover en\n * `--kf-color-error-soft` y foco visible con `--kf-shadow-focus`. Separado\n * de `kf-drawer-session` (solo identidad) por responsabilidad única.\n *\n * No sabe nada de autenticación real — solo emite `logoutClick` cuando el\n * consumidor debe cerrar la sesión real.\n *\n * `collapsed` oculta el label y centra el ícono, exponiéndolo vía `title`\n * — mismo criterio que `SidebarNavItem.collapsed` y\n * `DrawerSession.collapsed`, para cuando este botón vive dentro de un\n * `kf-sidebar-shell` colapsado.\n *\n * <kf-drawer-logout kf-portal-header-footer (logoutClick)=\"onLogout()\" />\n */\n@Component({\n selector: 'kf-drawer-logout',\n imports: [Icon],\n templateUrl: './DrawerLogout.html',\n styleUrl: './DrawerLogout.css',\n})\nexport class DrawerLogout {\n /** Label del botón, en español neutro por defecto. Input opcional por si\n * algún consumidor futuro necesita otro texto. */\n readonly label = input('Cerrar sesión');\n\n /** Oculta el label y centra el ícono — ver comentario de la clase. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n readonly logoutClick = output<void>();\n}\n","<button\n type=\"button\"\n class=\"kf-drawer-logout__button\"\n [class.kf-drawer-logout__button--collapsed]=\"collapsed()\"\n [attr.title]=\"collapsed() ? label() : null\"\n (click)=\"logoutClick.emit()\"\n>\n <kf-icon name=\"log-out\" size=\"sm\" />\n @if (!collapsed()) {\n {{ label() }}\n }\n</button>\n","import { Component, booleanAttribute, computed, input, output } from '@angular/core';\nimport { Avatar } from '../avatar/Avatar';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Bloque de identidad para `[kf-drawer-header]` de `kf-drawer` o\n * `[kf-sidebar-footer]` de `kf-sidebar-shell`: avatar + nombre + email,\n * brand opcional arriba. Solo identidad — el logout vive aparte, en\n * `kf-drawer-logout`.\n *\n * `collapsed` oculta brand/nombre/email y deja solo el avatar (para un\n * `kf-sidebar-shell` colapsado). `interactive` convierte la tarjeta en un\n * botón real que emite `cardClick`, para cuando la identidad es el\n * disparador de un menú de acciones (ej. envuelta en `kf-dropdown`).\n *\n * <kf-dropdown [(open)]=\"menuOpen\">\n * <kf-drawer-session interactive name=\"Juan Pérez\" email=\"juan@empresa.com\" (cardClick)=\"menuOpen.set(!menuOpen())\" />\n * <kf-dropdown-panel variant=\"dark\">\n * <kf-dropdown-item icon=\"log-out\" tone=\"error\" (click)=\"onLogout()\">Cerrar sesión</kf-dropdown-item>\n * </kf-dropdown-panel>\n * </kf-dropdown>\n */\n@Component({\n selector: 'kf-drawer-session',\n imports: [Avatar, Icon],\n templateUrl: './DrawerSession.html',\n styleUrl: './DrawerSession.css',\n})\nexport class DrawerSession {\n readonly name = input.required<string>();\n readonly email = input<string>('');\n /**\n * Etiqueta de rol o función del usuario dentro de la sesión (ej.\n * \"Coordinador\", \"Supervisor\"). Se muestra como badge dentro de la\n * identidad, debajo del email — distinto de `brand`, que es la marca o\n * cliente mostrada como encabezado de todo el bloque, no un atributo de\n * la persona.\n */\n readonly role = input<string>('');\n readonly initials = input<string>('');\n readonly avatarUrl = input<string>('');\n /** Label superior opcional, ej. \"Portal Kaufmann LATAM\". */\n readonly brand = input<string>('');\n\n /** Oculta brand/nombre/email y centra el avatar — ver comentario de la clase. */\n readonly collapsed = input(false, { transform: booleanAttribute });\n\n /** Convierte la tarjeta en un botón real con ícono de kebab — ver comentario de la clase. */\n readonly interactive = input(false, { transform: booleanAttribute });\n\n /** Se emite al clickear la tarjeta, solo cuando `interactive` es `true`. */\n readonly cardClick = output<void>();\n\n /** Si no se pasa `initials`, se derivan de `name`: primera letra de cada\n * una de las primeras 2 palabras, en mayúscula. */\n protected readonly displayInitials = computed(() => {\n const explicit = this.initials();\n if (explicit) {\n return explicit;\n }\n return this.name()\n .trim()\n .split(/\\s+/)\n .slice(0, 2)\n .map((word) => word.charAt(0).toUpperCase())\n .join('');\n });\n}\n","@if (brand() && !collapsed()) {\n <span class=\"kf-drawer-session__brand\">{{ brand() }}</span>\n}\n\n@if (interactive()) {\n <button\n type=\"button\"\n class=\"kf-drawer-session__card kf-drawer-session__card--interactive\"\n [class.kf-drawer-session__card--collapsed]=\"collapsed()\"\n (click)=\"cardClick.emit()\"\n >\n <kf-avatar [initials]=\"displayInitials()\" [src]=\"avatarUrl()\" />\n @if (!collapsed()) {\n <div class=\"kf-drawer-session__identity\">\n <span class=\"kf-drawer-session__name\">{{ name() }}</span>\n @if (email()) {\n <span class=\"kf-drawer-session__email\">{{ email() }}</span>\n }\n @if (role()) {\n <span class=\"kf-drawer-session__role\">{{ role() }}</span>\n }\n </div>\n <kf-icon name=\"more-vertical\" size=\"sm\" />\n }\n </button>\n} @else {\n <div class=\"kf-drawer-session__card\" [class.kf-drawer-session__card--collapsed]=\"collapsed()\">\n <kf-avatar [initials]=\"displayInitials()\" [src]=\"avatarUrl()\" />\n @if (!collapsed()) {\n <div class=\"kf-drawer-session__identity\">\n <span class=\"kf-drawer-session__name\">{{ name() }}</span>\n @if (email()) {\n <span class=\"kf-drawer-session__email\">{{ email() }}</span>\n }\n @if (role()) {\n <span class=\"kf-drawer-session__role\">{{ role() }}</span>\n }\n </div>\n }\n </div>\n}\n","import { Component, TemplateRef, input, viewChild } from '@angular/core';\n\nexport type DropdownPanelVariant = 'solid' | 'dark';\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@Component({\n selector: 'kf-dropdown-panel',\n templateUrl: './DropdownPanel.html',\n styleUrl: './DropdownPanel.css',\n})\nexport class DropdownPanel {\n readonly variant = input<DropdownPanelVariant>('solid');\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 class=\"kf-dropdown-panel__inner\" role=\"menu\">\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 {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n contentChild,\n effect,\n inject,\n input,\n model,\n ViewContainerRef,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { DropdownPanel } from './DropdownPanel';\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@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 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\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 this.destroyRef.onDestroy(() => {\n this.overlaySubscription?.unsubscribe();\n this.overlayRef?.dispose();\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.\n */\n @HostListener('document:keydown.escape')\n onDocumentEscape(): void {\n this.open.set(false);\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 }\n }),\n );\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 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, 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","<button\n type=\"button\"\n class=\"kf-dropdown-item\"\n [class.kf-dropdown-item--error]=\"tone() === 'error'\"\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 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';\nimport { Icon, IconName } from '../icon/Icon';\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@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 /** 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 /** Agrega el botón de mostrar/ocultar — sin efecto si `type` no es `\"password\"`. */\n readonly toggleable = input(false, { transform: booleanAttribute });\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 /**\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 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 * 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()\">{{ label() }}</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 [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(nativeInput.value)\"\n (blur)=\"onBlur()\"\n (focus)=\"focused.set(true)\"\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 {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\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 { FieldLabel } from '../field-label/FieldLabel';\nimport { normalizeForSearch } from '../shared/search-text';\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 inject(DestroyRef).onDestroy(() => this.overlay.dispose());\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 @HostListener('document:keydown.escape')\n onEscape(): void {\n this.isOpen.set(false);\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 { Component, computed, input, output } from '@angular/core';\n\n/** Forma normalizada interna de cada opción, ya resuelta a value/label. */\ninterface FilterChipOption {\n value: string;\n label: string;\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 } cuando el texto mostrado difiere\n * del valor interno.\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 * <kf-filter-chips [options]=\"['Todos', 'Activos', 'Archivados']\"\n * [value]=\"filtro\"\n * (valueChange)=\"filtro = $event\" />\n *\n * <kf-filter-chips [options]=\"[{ value: 'all', label: 'Todos' }]\"\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 | { value: string; label: string })[]>();\n readonly value = input<string>('');\n\n readonly valueChange = output<string>();\n\n /** Normaliza cada opción string/objeto a la forma { value, label }. */\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 return;\n }\n this.valueChange.emit(value);\n }\n}\n","<div class=\"kf-filter-chips\" role=\"group\">\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 </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","/** Opciones de `formatNumber` — todas opcionales. */\nexport interface FormatNumberOptions {\n /** Cantidad de decimales a mostrar. Default `0`. */\n decimals?: number;\n /** Locale de `Intl`/`toLocaleString` — decide separador de miles y de\n * decimales. Default `'es'` (punto de miles, coma decimal). */\n locale?: string;\n}\n\n/**\n * Separador de miles genérico — sin signo, sin asumir que el valor es\n * dinero. Cubre casos como kilometraje/horómetro (`formatNumber(45231,\n * { locale: 'en-US' })` → `'45,231'`), no solo moneda.\n *\n * formatNumber(16800); // '16.800'\n * formatNumber(16800.5, { decimals: 2 }); // '16.800,50'\n * formatNumber(45231, { locale: 'en-US' }); // '45,231'\n */\nexport function formatNumber(value: number, options: FormatNumberOptions = {}): string {\n const { decimals = 0, locale = 'es' } = options;\n return value.toLocaleString(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n}\n\n/** Opciones de `formatCurrency` — extiende `FormatNumberOptions` con el\n * signo/prefijo de moneda. */\nexport interface FormatCurrencyOptions extends FormatNumberOptions {\n /** Símbolo o prefijo antepuesto al monto. Default `'$'`. */\n sign?: string;\n}\n\n/**\n * Formatea un monto de dinero — compone sobre `formatNumber` agregando el\n * signo. Mismos defaults que la convención de OTD (punto de miles, sin\n * decimales, prefijo `$`), overrideables para otra moneda/país/formato:\n *\n * formatCurrency(16800); // '$16.800'\n * formatCurrency(16800.5, { decimals: 2 }); // '$16.800,50'\n * formatCurrency(16800, { sign: '' }); // '16.800'\n * formatCurrency(16800, { sign: 'US$', locale: 'en-US' }); // 'US$16,800'\n */\nexport function formatCurrency(amount: number, options: FormatCurrencyOptions = {}): string {\n const { sign = '$', ...numberOptions } = options;\n return `${sign}${formatNumber(amount, numberOptions)}`;\n}\n\n/**\n * Inverso de `formatNumber` — recupera el número crudo de un valor ya\n * formateado con el mismo `locale`. Solo soporta `locale` cuyo separador de\n * miles y decimal sean `'.'`/`','` (`es`) o `','`/`'.'` (`en-US`) — son los\n * 2 casos reales del ecosistema hoy; si aparece un tercer locale con otros\n * separadores, extender acá antes de usarlo.\n */\nexport function parseNumber(formatted: string, locale = 'es'): number {\n const [thousands, decimal] = locale === 'en-US' ? [',', '.'] : ['.', ','];\n const withoutThousands = formatted.split(thousands).join('');\n const withDecimalPoint = withoutThousands.replace(decimal, '.');\n return Number(withDecimalPoint.replace(/[^0-9.-]/g, ''));\n}\n\n/**\n * Inverso de `formatCurrency` — recupera el número crudo de un monto ya\n * formateado, descartando cualquier signo/prefijo de moneda.\n *\n * parseCurrency('$16.800'); // 16800\n */\nexport function parseCurrency(formatted: string, locale = 'es'): number {\n return parseNumber(formatted, locale);\n}\n\nconst CLOCK_FORMAT = new Intl.DateTimeFormat('es-CL', {\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n});\n\n/** \"12:40\" — hora en formato de 24 horas. */\nexport function formatClockTime(date: Date): string {\n return CLOCK_FORMAT.format(date);\n}\n\n/**\n * Quita espacios (incluido cualquier espacio en blanco intermedio, no solo\n * al principio/final) y puntos de un identificador de documento — un\n * espacio invisible (ej. pegado por accidente desde otra fuente) es un\n * motivo de rechazo silencioso real que un usuario no sabe explicarse.\n * Genérico: sirve tanto para RUT (`formatChileanRut` ya lo usa por\n * dentro) como para cualquier otro identificador con el mismo problema.\n *\n * sanitizeDocumentId(' 51 00004-8 '); // '5100004-8'\n * sanitizeDocumentId('12.345.678-9'); // '12345678-9'\n */\nexport function sanitizeDocumentId(raw: string): string {\n return raw.replace(/[\\s.]/g, '');\n}\n\n/**\n * Formatea un RUT chileno insertando el guion automáticamente a medida\n * que se escribe — igual que un input de tarjeta de crédito, el usuario\n * solo tipea dígitos (y opcionalmente `k`/`K` como dígito verificador) y\n * el guion aparece solo antes del último carácter. Solo da forma al\n * string — no valida si el dígito verificador es matemáticamente\n * correcto (ver `isValidChileanRut` para eso) ni si la cuenta existe\n * (eso lo confirma GAM del lado servidor al autenticar).\n *\n * formatChileanRut('123456789'); // '12345678-9'\n * formatChileanRut('5100004-8'); // '5100004-8' (ya formateado, idempotente)\n * formatChileanRut('5100004k'); // '5100004-k'\n * formatChileanRut('510000 4-8 '); // '5100004-8' (espacios ignorados)\n */\nexport function formatChileanRut(raw: string): string {\n const clean = sanitizeDocumentId(raw).replace(/-/g, '').toUpperCase();\n if (clean.length <= 1) {\n return clean;\n }\n const body = clean.slice(0, -1).replace(/[^0-9]/g, '');\n const checkDigit = clean.slice(-1);\n return `${body}-${checkDigit}`;\n}\n\n/**\n * Calcula el dígito verificador real de un RUT chileno con el\n * algoritmo estándar módulo 11 — devuelve `'0'`-`'9'` o `'K'`.\n * `body` debe ser solo dígitos, sin guion ni dígito verificador (ej.\n * `'20236276'`, no `'20236276-1'`).\n */\nfunction computeChileanRutCheckDigit(body: string): string {\n let sum = 0;\n let multiplier = 2;\n for (let i = body.length - 1; i >= 0; i--) {\n sum += Number(body[i]) * multiplier;\n multiplier = multiplier < 7 ? multiplier + 1 : 2;\n }\n const remainder = 11 - (sum % 11);\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return String(remainder);\n}\n\n/**\n * Valida un RUT chileno YA formateado (`cuerpo-DV`, ej. `'12345678-9'`)\n * contra el algoritmo módulo 11 real — a diferencia del `pattern` de\n * `document-id.config.ts` en cada portal consumidor (que solo exige la\n * FORMA: dígitos + guion + dígito verificador), esta función confirma\n * que el dígito verificador sea matemáticamente correcto para ese\n * cuerpo. Sigue sin confirmar que la cuenta exista — eso solo lo sabe\n * GAM al autenticar — pero atrapa el error tipográfico más común\n * (invertir/cambiar un dígito) antes de intentar el login.\n *\n * isValidChileanRut('20236276-1'); // true (DV real de ese cuerpo)\n * isValidChileanRut('20236276-8'); // false (DV real es '1', no '8')\n * isValidChileanRut('no-es-rut'); // false (ni siquiera tiene la forma)\n */\nexport function isValidChileanRut(rut: string): boolean {\n const match = /^(\\d{7,8})-([\\dkK])$/.exec(sanitizeDocumentId(rut));\n if (!match) {\n return false;\n }\n const [, body, checkDigit] = match;\n return computeChileanRutCheckDigit(body).toUpperCase() === checkDigit.toUpperCase();\n}\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\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\nexport interface JourneyStep {\n key: string;\n label: string;\n icon: IconName;\n /** Solo con `orientation=\"vertical\"` — en horizontal el status se calcula desde `currentStep`. */\n status?: JourneyStepStatus;\n /** Texto bajo el label — solo con `orientation=\"vertical\"`. */\n date?: string;\n}\n\n/**\n * Progreso de un flujo de N pasos.\n *\n * - `orientation` (`'horizontal'` default | `'vertical'`): horizontal\n * deriva done/current/pending de `currentStep`; vertical usa\n * `steps[].status` explícito, con `delayed` como cuarto estado.\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 *\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 */\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<'horizontal' | 'vertical'>('horizontal');\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 protected readonly clickable = computed(() => this.orientation() === 'horizontal');\n\n constructor() {\n afterRenderEffect(() => {\n this.steps();\n this.orientation();\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 }\n\n protected readonly resolvedSteps = computed<(JourneyStep & { status: JourneyStepStatus })[]>(\n () => {\n if (this.orientation() === 'vertical') {\n return this.steps().map((step) => ({ ...step, status: step.status ?? 'pending' }));\n }\n\n const current = this.currentStep();\n return this.steps().map((step, index) => ({\n ...step,\n status: index < current ? 'done' : index === current ? 'current' : 'pending',\n }));\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 [class.kf-journey-stepper--vertical]=\"orientation() === 'vertical'\"\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 class=\"kf-journey-stepper__step\" [class]=\"'kf-journey-stepper__step--' + step.status\">\n @if (clickable()) {\n <button type=\"button\" class=\"kf-journey-stepper__dot\" (click)=\"stepClick.emit(step.key)\">\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 </div>\n </div>\n\n @if (!last && orientation() === 'horizontal') {\n <span\n class=\"kf-journey-stepper__line\"\n [class.kf-journey-stepper__line--done]=\"step.status === 'done'\"\n ></span>\n }\n }\n</div>\n","import { InjectionToken, Provider } from '@angular/core';\n\n/**\n * Motor de mapas configurado a nivel app, no por uso — mismo criterio que\n * `API_CONFIG` en `packages/api-client` de `route-assistance-monorepo`: el\n * access token de Mapbox es un dato de despliegue (cada app/entorno tiene\n * el propio), no algo que cada `<kf-map>` deba repetir.\n */\nexport interface MapConfig {\n /** Access token público de Mapbox (`pk.*`) de la cuenta del proyecto que consume la librería. */\n accessToken: string;\n /**\n * Estilo de Mapbox Studio propio del cliente, si lo tiene. Cuando se\n * define, gana siempre sobre `theme()` del componente — un estilo de\n * marca custom no tiene una variante \"light\"/\"dark\" que elegir, ya viene\n * resuelto. Sin esto, `kf-map` usa el estilo `light-v11`/`dark-v11` de\n * Mapbox según `theme()`.\n */\n styleUrl?: string;\n}\n\nexport const MAP_CONFIG = new InjectionToken<MapConfig>('MAP_CONFIG');\n\n/**\n * `provide*` idiomático (mismo patrón que `provideHttpClient`/`provideRouter`)\n * para inyectar una sola vez en `app.config.ts` de cada app consumidora:\n *\n * providers: [provideMapConfig({ accessToken: 'pk.xxx' })]\n */\nexport function provideMapConfig(config: MapConfig): Provider {\n return { provide: MAP_CONFIG, useValue: config };\n}\n","/**\n * Vocabulario de temas de `kf-map`, separado de `MapView.ts` para que\n * `MapThemePicker` (el panel flotante del control `mapStyle`) pueda\n * importarlo sin crear un ciclo `MapView → MapControls → MapThemePicker →\n * MapView`.\n *\n * `streets`/`satellite`/`outdoors` se suman a los `light`/`dark`\n * originales — los 3 IDs de estilo (`streets-v12`, `satellite-streets-v12`,\n * `outdoors-v12`) están confirmados contra la cuenta/token real del\n * ecosistema: la API de estilos de Mapbox es por cuenta, no por versión de\n * `mapbox-gl`, así que cualquier duda se resuelve probando contra el token\n * real, no leyendo el número de versión instalado.\n */\nexport type MapTheme = 'light' | 'dark' | 'streets' | 'satellite' | 'outdoors';\n\nexport const STYLE_BY_THEME: Record<MapTheme, string> = {\n light: 'mapbox://styles/mapbox/light-v11',\n dark: 'mapbox://styles/mapbox/dark-v11',\n streets: 'mapbox://styles/mapbox/streets-v12',\n satellite: 'mapbox://styles/mapbox/satellite-streets-v12',\n outdoors: 'mapbox://styles/mapbox/outdoors-v12',\n};\n\n/** Orden fijo en que `MapThemePicker` lista las 5 opciones — predecible\n * (siempre el mismo orden en toda pantalla que use el picker), no importa\n * cuál esté activa. */\nexport const THEME_ORDER: MapTheme[] = ['light', 'dark', 'streets', 'satellite', 'outdoors'];\n\n/** Nombre en español de cada tema, para el `aria-label`/label del control\n * `mapStyle` y las opciones del picker — anuncia qué tema rige HOY o qué\n * tema se está por elegir, no solo \"otro tema distinto\". */\nexport const THEME_LABEL: Record<MapTheme, string> = {\n light: 'Claro',\n dark: 'Oscuro',\n streets: 'Calles',\n satellite: 'Satélite',\n outdoors: 'Relieve',\n};\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","/**\n * Navegación estándar de ARIA tabs/listbox/radiogroup: flechas mueven el\n * foco entre opciones y activan la seleccionada. Usado por `kf-tabs`,\n * `kf-folder-tabs` (orientación horizontal) y `kf-selectable-card-group`\n * (vertical) — todos comparten la misma forma (lista de opciones con\n * `value`, botones identificados por `idPrefix + value`).\n *\n * `orientation` decide qué par de flechas avanza/retrocede — mismo patrón\n * que exige el WAI-ARIA Authoring Practices para radiogroup vertical\n * (ArrowDown/ArrowUp) vs. tablist horizontal (ArrowRight/ArrowLeft). Home/End\n * funcionan igual en ambas orientaciones.\n *\n * `select` es responsabilidad del consumidor: esta función solo calcula\n * cuál es la siguiente opción y mueve el foco al botón correspondiente.\n */\nexport function handleArrowKeyNavigation<T extends { value: string }>(\n event: KeyboardEvent,\n options: T[],\n currentValue: string,\n idPrefix: string,\n select: (value: string) => void,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): void {\n const currentIndex = options.findIndex((option) => option.value === currentValue);\n const nextKey = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown';\n const prevKey = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp';\n\n let nextIndex: number;\n switch (event.key) {\n case nextKey:\n nextIndex = (currentIndex + 1) % options.length;\n break;\n case prevKey:\n nextIndex = (currentIndex - 1 + options.length) % options.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = options.length - 1;\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const nextOption = options[nextIndex];\n select(nextOption.value);\n\n const host = (event.currentTarget as HTMLElement).parentElement;\n const nextId = `${idPrefix}${nextOption.value}`;\n const nextButton = Array.from(host?.querySelectorAll<HTMLButtonElement>('button') ?? []).find(\n (button) => button.id === nextId,\n );\n nextButton?.focus();\n}\n","import { Component, input, linkedSignal, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { handleArrowKeyNavigation } from '../shared/arrow-key-navigation';\nimport { THEME_LABEL, THEME_ORDER, type MapTheme } from './map-theme';\n\n/**\n * Contenido del panel flotante que abre el control `mapStyle` de\n * `kf-map-controls` — vive dentro de un `kf-dropdown-panel` (reusa el\n * overlay/posicionamiento/click-afuera/Escape de `kf-dropdown`, no\n * construye ninguno propio). Lista las 5 opciones de `MapTheme` con un\n * swatch de preview y marca cuál está activa — reemplaza el ciclado de un\n * solo click que tenía el botón `mapStyle` antes: elegir a la vista es más\n * predecible que ir adivinando cuántos clicks faltan para el tema que se\n * quiere.\n *\n * Presentacional puro (sin estado propio de NEGOCIO): `MapControls` decide\n * cuándo mostrarlo y qué hacer con la selección.\n *\n * <kf-map-theme-picker [active]=\"activeTheme()\" (themeSelect)=\"onSelect($event)\" />\n */\n@Component({\n selector: 'kf-map-theme-picker',\n imports: [Icon],\n templateUrl: './MapThemePicker.html',\n styleUrl: './MapThemePicker.css',\n})\nexport class MapThemePicker {\n readonly active = input.required<MapTheme>();\n /** No `select` a secas: colisiona con el evento DOM nativo del mismo\n * nombre (`@angular-eslint/no-output-native`). */\n readonly themeSelect = output<MapTheme>();\n\n protected readonly themes = THEME_ORDER;\n protected readonly themeLabel = THEME_LABEL;\n private readonly themeOptions = this.themes.map((theme) => ({ value: theme }));\n\n /**\n * Tema con foco de teclado ROVING (punto 4, a11y) — distinto de `active`\n * (el tema realmente APLICADO). Arranca en `active()` (mismo criterio de\n * cualquier roving-tabindex real: el foco inicial cae sobre la opción ya\n * seleccionada, no siempre la primera) pero navegar con flechas SOLO mueve\n * este puntero, nunca aplica el tema.\n *\n * Por qué no alcanza con pasarle `themeSelect.emit` directo a\n * `handleArrowKeyNavigation` (como sí hace `kf-tabs`, ver su JSDoc): ahí\n * \"seleccionar\" y \"mover el foco\" son lo mismo (WAI-ARIA Tabs Pattern,\n * selection-follows-focus). Acá NO — este panel es un menú\n * (`role=\"menu\"`/`\"menuitemradio\"`) dentro de un `kf-dropdown` que SE\n * CIERRA al elegir (ver `onThemeSelect()` en `MapControls`): si cada\n * flecha emitiera `themeSelect`, la primera flecha cerraría el panel de un\n * solo golpe y sería imposible recorrer más de una opción por teclado.\n * Activar sigue siendo Enter/Space/click sobre el `<button>` — nativo del\n * propio elemento, no necesita wiring propio acá.\n *\n * `linkedSignal` (no `signal` a secas): un `input.required()` no tiene\n * valor todavía en el initializer de un campo de clase — `linkedSignal`\n * es la forma real de arrancar un signal escribible en el valor de OTRO\n * signal (acá, `active()`) y a la vez poder pisarlo después a mano (acá,\n * desde `onKeydown()`) sin que ese valor inicial se pierda ni haga falta\n * un `effect()` aparte.\n */\n protected readonly focusedTheme = linkedSignal<MapTheme>(() => this.active());\n\n protected onKeydown(event: KeyboardEvent): void {\n handleArrowKeyNavigation(\n event,\n this.themeOptions,\n this.focusedTheme(),\n 'kf-map-theme-picker-item-',\n (value) => this.focusedTheme.set(value as MapTheme),\n 'vertical',\n );\n }\n}\n","<div class=\"kf-map-theme-picker\" role=\"menu\" aria-label=\"Tema del mapa\">\n @for (theme of themes; track theme) {\n <button\n type=\"button\"\n class=\"kf-map-theme-picker__item\"\n [class.kf-map-theme-picker__item--active]=\"theme === active()\"\n role=\"menuitemradio\"\n [attr.aria-checked]=\"theme === active()\"\n [id]=\"'kf-map-theme-picker-item-' + theme\"\n [attr.tabindex]=\"theme === focusedTheme() ? 0 : -1\"\n (click)=\"themeSelect.emit(theme)\"\n (keydown)=\"onKeydown($event)\"\n >\n <span class=\"kf-map-theme-picker__swatch\" [class]=\"'kf-map-theme-picker__swatch--' + theme\">\n @if (theme === active()) {\n <span class=\"kf-map-theme-picker__check\">\n <kf-icon name=\"check\" size=\"sm\" />\n </span>\n }\n </span>\n <span class=\"kf-map-theme-picker__label\">{{ themeLabel[theme] }}</span>\n </button>\n }\n</div>\n","import { Component, computed, input, output, signal } from '@angular/core';\nimport { Button } from '../button/button';\nimport { Dropdown } from '../dropdown/Dropdown';\nimport { DropdownPanel } from '../dropdown/DropdownPanel';\nimport { TooltipDirective } from '../tooltip/Tooltip';\nimport type { MapTheme } from './map-theme';\nimport { MapThemePicker } from './MapThemePicker';\n\n/**\n * Cada pieza es independiente entre sí — agregar/sacar un `MapControlKind`\n * de `controls` en `kf-map` no reacomoda ni afecta a los demás. Array vacío\n * (default de `kf-map`) es \"ningún control\": opt-in explícito del\n * consumidor, nunca activado por default (ver JSDoc de `controls` en\n * `MapView.ts`).\n *\n * zoom — botones +/- reales (`map.zoomIn()`/`zoomOut()`).\n * fullscreen — expandir/contraer el mapa (Fullscreen API nativa).\n * mapStyle — ciclar entre los temas de `MapTheme`.\n * recenter — re-ejecuta el encuadre a markers/route bajo demanda.\n * cluster — togglear agrupamiento nativo de markers cercanos.\n * follow — la cámara sigue al marker `live` mientras se mueve.\n */\nexport type MapControlKind = 'zoom' | 'fullscreen' | 'mapStyle' | 'recenter' | 'cluster' | 'follow';\n\n/**\n * Barra de controles flotantes de `kf-map` — pieza puramente presentacional,\n * sin estado propio: todo lo que sabe se lo pasa `MapView` por input, todo\n * lo que hace lo reporta por output para que `MapView` (única dueña del\n * `Map` de Mapbox) decida qué hacer. Vive en la misma carpeta que `MapView`\n * a propósito (mismo criterio que `DropdownItem`/`DropdownPanel` con\n * `Dropdown`): el acoplamiento es real, no de nombre — no tiene sentido\n * fuera de un `kf-map` que la controle.\n *\n * Un solo stack vertical, siempre en la esquina superior derecha del mapa\n * (fijado por `MapView.css`, no acá): es donde ya vivía el `NavigationControl`\n * de Mapbox que este componente reemplaza, y la atribución obligatoria de\n * Mapbox (`AttributionControl`, nunca oculta) vive abajo-derecha — un solo\n * stack evita que dos grupos floten en esquinas distintas y compitan por\n * espacio en un mapa `size=\"sm\"` de 200px de alto.\n *\n * El stack no es una lista continua de botones idénticos: cada grupo lógico\n * es su propia \"card\" flotante (`kf-radius-md`+`kf-shadow-md`+fondo blanco,\n * ver `.kf-map-controls__group` en `MapControls.css`), separadas entre sí\n * por el `gap` del `:host` — mismo lenguaje ya verificado visualmente en\n * `route-assistance-monorepo/design/mockups/operations-final.html`\n * (`.map__ctrl-group`). Orden fijo de arriba a abajo, independiente del\n * orden en el array `controls` del consumidor (para que dos pantallas que\n * piden los mismos controles en distinto orden se vean IGUAL):\n *\n * 1. zoom — magnificación (par +/-, unido por un divisor, sin gap entre sí).\n * 2. cámara — recenter + follow (posición de la cámara).\n * 3. datos — cluster (densidad de los markers, eje distinto de cámara).\n * 4. chrome — mapStyle + fullscreen (nada del mapa en sí).\n *\n * Cada grupo usa `@if` sobre AL MENOS UNO de sus controles (ej. el grupo de\n * cámara aparece con solo `recenter`, solo `follow`, o ambos) — agregar o\n * sacar un control nunca reacomoda ni depende de los demás grupos.\n *\n * Todos los botones siguen siendo `kf-button[variant=surface][shape=circle]`\n * — sin tocar `Button.ts`: el fondo/sombra propios de `surface` se anulan\n * SOLO dentro de un `.kf-map-controls__group` vía una custom property CSS\n * (ver el comentario junto a esa clase en `MapControls.css` sobre por qué\n * eso sí atraviesa la encapsulación de Angular y un selector normal no).\n */\n@Component({\n selector: 'kf-map-controls',\n imports: [Button, Dropdown, DropdownPanel, MapThemePicker, TooltipDirective],\n templateUrl: './MapControls.html',\n styleUrl: './MapControls.css',\n})\nexport class MapControls {\n readonly controls = input<MapControlKind[]>([]);\n readonly clusterActive = input(false);\n readonly followActive = input(false);\n /** Sin ningún marker `live`, togglear \"seguir\" no tendría ningún efecto\n * visible — se deshabilita en vez de dejar un botón que parece no hacer nada. */\n readonly canFollow = input(false);\n readonly isFullscreen = input(false);\n /** Nombre en español del tema actualmente resuelto (ej. \"Calles\"), para\n * anunciar en el `aria-label` del botón de estilo qué se está por perder,\n * no solo que \"algo\" va a cambiar. */\n readonly styleLabel = input('');\n /** Tema resuelto HOY (`light|dark|...`) — a diferencia de `styleLabel`\n * (ya traducido a texto), esto es lo que `MapThemePicker` necesita para\n * marcar la opción activa. */\n readonly activeTheme = input<MapTheme>('dark');\n\n readonly zoomIn = output<void>();\n readonly zoomOut = output<void>();\n readonly recenter = output<void>();\n readonly followToggle = output<void>();\n readonly clusterToggle = output<void>();\n /** Reemplaza al viejo `styleCycle` (ciclado de un click): ahora el botón\n * `mapStyle` abre `MapThemePicker` y este output reporta la elección real\n * hecha ahí. */\n readonly themeSelect = output<MapTheme>();\n readonly fullscreenToggle = output<void>();\n\n /** Visibilidad del panel de temas — estado puramente de UI (abierto o no),\n * no de negocio: `MapView` no necesita saberlo, así que vive acá y no\n * rompe el criterio de \"sin estado propio\" del resto de la clase (ver\n * JSDoc). Se cierra solo (click afuera/Escape) vía `kf-dropdown`, y acá\n * además al elegir un tema. */\n protected readonly mapStyleOpen = signal(false);\n\n protected onThemeSelect(theme: MapTheme): void {\n this.themeSelect.emit(theme);\n this.mapStyleOpen.set(false);\n }\n\n protected readonly hasZoom = computed(() => this.controls().includes('zoom'));\n protected readonly hasRecenter = computed(() => this.controls().includes('recenter'));\n protected readonly hasFollow = computed(() => this.controls().includes('follow'));\n protected readonly hasCluster = computed(() => this.controls().includes('cluster'));\n protected readonly hasMapStyle = computed(() => this.controls().includes('mapStyle'));\n protected readonly hasFullscreen = computed(() => this.controls().includes('fullscreen'));\n /** El grupo \"cámara\" (card) aparece con solo `recenter`, solo `follow`, o\n * ambos — ver JSDoc de la clase sobre por qué cada `@if` de grupo cubre\n * \"al menos uno de sus controles\" en vez de un control puntual. */\n protected readonly hasCamera = computed(() => this.hasRecenter() || this.hasFollow());\n protected readonly hasChrome = computed(() => this.hasMapStyle() || this.hasFullscreen());\n\n /**\n * Texto corto que revela cada botón en hover/foco vía `[kfTooltip]` (ver\n * `MapControls.html` — la librería ya resuelve este patrón con\n * `TooltipDirective`, no con CSS a mano) — la misma acción que ya describe\n * `ariaLabel`, condensada para caber en una píldora en vez de leerse como\n * oración completa. No reemplaza `ariaLabel` (que sigue siendo la fuente\n * real para lectores de pantalla): esto es SOLO visual, para quien puede\n * ver el mapa pero no sabe qué hace un ícono suelto.\n */\n protected readonly followLabel = computed(() =>\n this.followActive() ? 'Dejar de seguir' : 'Seguir',\n );\n protected readonly clusterLabel = computed(() =>\n this.clusterActive() ? 'Desagrupar' : 'Agrupar',\n );\n protected readonly mapStyleLabel = computed(() => `Tema: ${this.styleLabel()}`);\n protected readonly fullscreenLabel = computed(() =>\n this.isFullscreen() ? 'Salir de pantalla completa' : 'Pantalla completa',\n );\n}\n","@if (hasZoom()) {\n <div class=\"kf-map-controls__group kf-map-controls__group--zoom\">\n <div class=\"kf-map-controls__item\" kfTooltip=\"Acercar\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"plus\"\n ariaLabel=\"Acercar\"\n (click)=\"zoomIn.emit()\"\n />\n </div>\n <div class=\"kf-map-controls__item\" kfTooltip=\"Alejar\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"minus\"\n ariaLabel=\"Alejar\"\n (click)=\"zoomOut.emit()\"\n />\n </div>\n </div>\n}\n@if (hasCamera()) {\n <div class=\"kf-map-controls__group\">\n @if (hasRecenter()) {\n <div class=\"kf-map-controls__item\" kfTooltip=\"Centrar mapa\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"crosshair\"\n ariaLabel=\"Volver a encuadrar el mapa\"\n (click)=\"recenter.emit()\"\n />\n </div>\n }\n @if (hasFollow()) {\n <div class=\"kf-map-controls__item\" [kfTooltip]=\"followLabel()\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"navigation\"\n [ariaLabel]=\"followActive() ? 'Dejar de seguir' : 'Seguir posición'\"\n [ariaPressed]=\"followActive()\"\n [disabled]=\"!canFollow()\"\n (click)=\"followToggle.emit()\"\n />\n </div>\n }\n </div>\n}\n@if (hasCluster()) {\n <div class=\"kf-map-controls__group\">\n <div class=\"kf-map-controls__item\" [kfTooltip]=\"clusterLabel()\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"grid\"\n [ariaLabel]=\"clusterActive() ? 'Desagrupar marcadores' : 'Agrupar marcadores cercanos'\"\n [ariaPressed]=\"clusterActive()\"\n (click)=\"clusterToggle.emit()\"\n />\n </div>\n </div>\n}\n@if (hasChrome()) {\n <div class=\"kf-map-controls__group\">\n @if (hasMapStyle()) {\n <kf-dropdown\n class=\"kf-map-controls__item\"\n [kfTooltip]=\"mapStyleLabel()\"\n kfTooltipPosition=\"left\"\n [(open)]=\"mapStyleOpen\"\n >\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n icon=\"layers\"\n [ariaLabel]=\"'Cambiar estilo de mapa (actual: ' + styleLabel() + ')'\"\n [ariaExpanded]=\"mapStyleOpen()\"\n (click)=\"mapStyleOpen.set(!mapStyleOpen())\"\n />\n <kf-dropdown-panel>\n <kf-map-theme-picker [active]=\"activeTheme()\" (themeSelect)=\"onThemeSelect($event)\" />\n </kf-dropdown-panel>\n </kf-dropdown>\n }\n @if (hasFullscreen()) {\n <div class=\"kf-map-controls__item\" [kfTooltip]=\"fullscreenLabel()\" kfTooltipPosition=\"left\">\n <kf-button\n variant=\"surface\"\n shape=\"circle\"\n size=\"sm\"\n [icon]=\"isFullscreen() ? 'minimize' : 'maximize'\"\n [ariaLabel]=\"isFullscreen() ? 'Salir de pantalla completa' : 'Pantalla completa'\"\n [ariaPressed]=\"isFullscreen()\"\n (click)=\"fullscreenToggle.emit()\"\n />\n </div>\n }\n </div>\n}\n","/// <reference types=\"geojson\" />\n// `tsconfig.lib.json` fija `types: []` a propósito (no filtrar globals\n// ambientales a la librería publicada) — esta referencia explícita es la\n// única forma de resolver el namespace `GeoJSON` que usan los tipos de\n// `mapbox-gl` (`addSource({ type: 'geojson', data: ... })`) sin relajar esa\n// restricción para el resto del archivo.\nimport { DOCUMENT } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n DestroyRef,\n ElementRef,\n EnvironmentInjector,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n createComponent,\n inject,\n input,\n output,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport mapboxgl, {\n AttributionControl,\n LngLatBounds,\n Map as MapboxMap,\n Marker as MapboxMarker,\n type GeoJSONSource,\n} from 'mapbox-gl';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Spinner } from '../spinner/Spinner';\nimport { Text } from '../text/Text';\nimport { MAP_CONFIG } from './map-config';\nimport { STYLE_BY_THEME, THEME_LABEL, type MapTheme } from './map-theme';\nimport { MapControls } from './MapControls';\nimport type { MapControlKind } from './MapControls';\n\n// Fix del worker de `mapbox-gl` con bundlers ESM-nativos — ver el JSDoc\n// completo junto a `assignWorkerClass()`, más abajo. `workerClassAssigned`\n// evita reasignar la clase en cada instancia de `<kf-map>`: es una\n// propiedad de la librería `mapbox-gl` completa, no de un mapa particular.\nlet workerClassAssigned = false;\n\nexport type MapSize = 'sm' | 'md' | 'lg' | 'full';\nexport type MapVariant = 'interactive' | 'preview';\n\n/** Vocabulario semántico único de tono, compartido con `TextTone`/`StatTileTone`. */\nexport type MapMarkerTone = 'neutral' | 'ok' | 'warn' | 'error' | 'info';\n\nexport interface MapLatLng {\n lat: number;\n lng: number;\n}\n\n/**\n * Botón de acción real dentro de `MapMarker.popup` — cada click emite\n * `markerAction` con su `key` (nunca el `label`, ver JSDoc de `popup` más\n * abajo). `icon` es OPCIONAL a propósito: no romper a los consumidores que\n * ya usaban `actions` sin él (era el único campo hasta esta ronda).\n *\n * La jerarquía visual entre acciones NO es un campo aparte (`variant`) sino\n * la POSICIÓN en el array: la primera acción se renderiza con estilo\n * prominente (fill, mismo peso que `kf-button[variant=primary]`, el\n * default del botón); el resto con estilo discreto (mismo peso que\n * `kf-button[variant=ghost]` — ver el ejemplo de `Modal` con\n * `variant=\"ghost\"` para \"Cancelar\" junto a un primary implícito). Un\n * consumidor con una sola acción no necesita pensar en esto: esa acción ya\n * es \"la primera\".\n */\nexport interface MapPopupAction {\n key: string;\n label: string;\n /** Ícono líder del catálogo de `kf-icon` — sin esto, la acción se ve solo\n * con texto (compatibilidad con `actions` ya declarado sin `icon`). */\n icon?: IconName;\n}\n\nexport interface MapMarker {\n position: MapLatLng;\n /** Sin `icon`, cae en `map-pin` — el pin genérico del catálogo. Se\n * ignora cuando el control `cluster` está activo (ver JSDoc de\n * `controls` — el clustering nativo resuelve por capas WebGL, no por\n * DOM, y ahí no hay dónde montar un `kf-icon`). */\n icon?: IconName;\n tone?: MapMarkerTone;\n /** Nombre accesible del marker (`aria-label`/`title`) — no abre un popup. */\n label?: string;\n /**\n * Identificador propio del consumidor (ej. el id del ticket/vehículo que\n * representa) — sin esto el marker no es clickeable: `kf-map` no tiene\n * forma de reportar \"se hizo click en ESTE marker\" sin algo que\n * identificarlo de vuelta hacia `markerSelect`. Opcional a propósito: un\n * mapa puramente decorativo (ej. la vista previa de `variant=\"preview\"`)\n * no necesita que sus markers respondan a nada.\n */\n id?: string;\n /**\n * Marca este marker como el punto que sigue la cámara cuando el control\n * `follow` está activo — ej. la posición en tiempo real de un vehículo o\n * técnico. Genérico a propósito (no `isVehicle` ni ningún nombre atado al\n * dominio de un portal): `@kaufmann-lab/ui` no sabe qué es un \"vehículo\",\n * solo que ALGÚN marker es el que se sigue. Si más de un marker lo marca,\n * se sigue el primero en `markers()`. Distinto de la geolocalización del\n * propio dispositivo (`navigator.geolocation`, fuera de alcance): esto\n * sigue un dato que el consumidor ya tiene, no ubica al usuario.\n */\n live?: boolean;\n /**\n * Mini-card que aparece al hover/foco de este marker — solo si el marker\n * tiene `id` (ver JSDoc de arriba): sin `id` el marker no es clickeable ni\n * enfocable, así que no habría forma de revelarla por teclado.\n *\n * `actions` son botones REALES (no el viejo `ctaLabel` de texto plano sin\n * acción): cada click emite `markerAction` con su `key` — nunca el\n * `label`, que es solo texto de UI y puede repetirse con significados\n * distintos entre consumidores — y detiene la propagación del click para\n * no disparar además `markerSelect` sobre el marker completo (ver\n * `buildMarkerPopup()`).\n *\n * Vocabulario genérico a propósito (`title`/`description`/`details`/\n * `actions`, no `folio`/`cliente`/`verTicket`): esta librería no sabe qué\n * es un \"ticket\" — el caso de uso real (folio+cliente+estado+SLA+acciones)\n * es responsabilidad de quien arma cada `MapMarker`.\n */\n popup?: {\n title: string;\n description?: string;\n /** Pares clave/valor extra (ej. estado + SLA) — se listan debajo de `description`. */\n details?: { label: string; value: string }[];\n /** Botones de acción reales — ver JSDoc de `MapPopupAction`. */\n actions?: MapPopupAction[];\n };\n}\n\n/**\n * Properties que viajan en cada feature GeoJSON de la fuente de clustering\n * (ver `markersToFeatureCollection()`) — `string` en vez de `undefined`\n * porque una `Feature` de GeoJSON no serializa bien un campo ausente; `''`\n * es \"sin dato\" en los 3 campos de texto. `index` es lo que permite\n * recuperar el `MapMarker` original completo (icon/label/live/etc., que no\n * tendría sentido duplicar acá) a partir de una feature \"suelta\" que\n * devuelve `querySourceFeatures()` — ver `syncClusterMarkers()`.\n */\ninterface MapMarkerFeatureProperties {\n index: number;\n tone: MapMarkerTone;\n title: string;\n description: string;\n markerId: string;\n}\n\nconst DEFAULT_CENTER: MapLatLng = { lat: 0, lng: 0 };\nconst DEFAULT_ZOOM = 2;\nconst FIT_BOUNDS_PADDING_PX = 48;\nconst FIT_BOUNDS_MAX_ZOOM = 16;\nconst ROUTE_SOURCE_ID = 'kf-map-route';\nconst ROUTE_LAYER_ID = 'kf-map-route-line';\n\n/**\n * Duraciones de cámara — todas pasan por `cameraDuration()`, que las\n * colapsa a 0 si el usuario pidió `prefers-reduced-motion: reduce` (ver\n * ese método). `INITIAL_FIT` es más larga que `RECENTER`: la entrada\n * inicial es la primera impresión del mapa (vale la pena un momento\n * \"cinematográfico\"); un recentrado manual es una corrección puntual que\n * el usuario ya pidió a propósito, no hace falta hacerlo esperar de más.\n */\nconst CAMERA_DURATION_MS = {\n initialFit: 900,\n recenter: 700,\n zoomStep: 250,\n} as const;\n\n/**\n * Umbral de \"caja degenerada\" para `fitBounds()`, en grados — no en metros,\n * para no necesitar trigonometría (la longitud de un grado de longitud\n * varía con la latitud; la de un grado de latitud no). 0.0005° equivale a\n * ~55 m en el ecuador de lado a lado, más chico en longitud a medida que la\n * latitud crece. Se eligió para cubrir el caso real que rompía el encuadre\n * (un solo marker, o vehículo+destino en el mismo sitio con dos fixes de\n * GPS ligeramente distintos) sin tragarse una ruta corta real: cualquier\n * separación de más de ~50 m entre los puntos sigue entrando a `fitBounds`\n * normal.\n */\nconst DEGENERATE_BOUNDS_THRESHOLD_DEG = 0.0005;\n/** Zoom que reemplaza a `fitBounds()` en el caso degenerado — suficiente\n * para ver contexto real de calle alrededor de un único punto. */\nconst SINGLE_POINT_ZOOM = 15;\n\nconst MARKER_CLUSTER_SOURCE_ID = 'kf-map-markers-cluster';\nconst CLUSTER_CIRCLE_LAYER_ID = 'kf-map-cluster-circle';\nconst CLUSTER_COUNT_LAYER_ID = 'kf-map-cluster-count';\n\n/**\n * Radio (px) del marker DOM de cluster (ver `addClusterMarkerToMap()`) —\n * MISMOS umbrales que el `'circle-radius'` de `CLUSTER_CIRCLE_LAYER_ID`\n * (`step(point_count, 14, 10, 18, 50, 22)`): el marker DOM tiene que cubrir\n * exactamente el mismo área que la capa WebGL que pinta debajo, para que el\n * hit target de mouse/teclado calce con lo que el usuario ve.\n */\nfunction clusterMarkerRadiusPx(pointCount: number): number {\n if (pointCount >= 50) {\n return 22;\n }\n if (pointCount >= 10) {\n return 18;\n }\n return 14;\n}\n\n/** Margen mínimo (px) contra el borde del contenedor del mapa antes de\n * recortar/voltear un popup (marker o cluster) — ver `positionFloatingPopup()`. */\nconst POPUP_EDGE_MARGIN_PX = 8;\n/** Separación (px) entre el punto de pantalla de un cluster y su popup\n * resumen — equivalente al `calc(100% + 12px)` que ya usa el popup de\n * marker individual vía CSS, pero acá en JS porque el popup de cluster no\n * es hijo de ningún elemento posicionado por CSS (ver `renderClusterPopup()`). */\nconst CLUSTER_POPUP_GAP_PX = 16;\n\n/** Duración de la corrección de cámara en modo `follow` — bastante corta\n * para sentirse \"pegada\" al marker, sin el salto seco de `jumpTo`. */\nconst FOLLOW_EASE_DURATION_MS = 400;\n\n/** Ver el comentario junto a `markReady` en `initializeMap()` — respaldo\n * para no depender exclusivamente de `'load'`, que en al menos una cadena\n * real verificada nunca llega a disparar pese a que el mapa carga bien. */\nconst MAP_READY_FALLBACK_TIMEOUT_MS = 4000;\n\n/**\n * Mapa con motor real de Mapbox GL JS — decisión de producto ya cerrada\n * (comparación de 6 proveedores). El access token vive a nivel app, no por\n * uso: ver `provideMapConfig` en `map-config.ts` (mismo criterio que\n * `API_CONFIG` de `packages/api-client`), inyectado una vez en\n * `app.config.ts` de cada app consumidora.\n *\n * `size` (`sm|md|lg` alturas fijas, `full` llena el contenedor padre) NO\n * hace step-down por viewport como `kf-page-header`: ese mecanismo existe\n * ahí porque un tamaño de FUENTE fijo se corta en pantallas chicas; una\n * caja de mapa no tiene ese problema — el canvas de Mapbox ya es\n * responsive dentro de cualquier tamaño de contenedor. Lo que sí hace\n * falta (y que el header no necesita) es un `ResizeObserver` real: Mapbox\n * no se entera solo de que su contenedor cambió de tamaño (un layout que\n * colapsa un sidebar, un cambio de orientación) — hay que llamar\n * `map.resize()` a mano cuando el contenedor cambia (mismo motivo por el\n * que `fullscreenchange` también llama `resize()`, ver `onFullscreenChange`).\n *\n * `variant` es un eje ortogonal a `size` (mismo criterio que `variant` +\n * `tone` en `kf-badge`): `interactive` trae la posibilidad de controles\n * flotantes reales (ver `controls`); `preview` (`interactive: false` de\n * Mapbox GL) es para una card de lista, sin chrome y sin foco por teclado —\n * no hace nada al recibir foco, así que no debe formar parte del tab order,\n * y por eso NUNCA renderiza `controls` aunque el consumidor los pida:\n * togglear \"seguir\" o abrir pantalla completa no tiene sentido en un mapa\n * que no acepta interacción. Ninguna de las dos variantes oculta la\n * atribución: es requisito de licencia de Mapbox, no cosmético.\n *\n * `theme` (`light|dark|streets|satellite|outdoors`) resuelve el estilo real\n * de Mapbox — eje totalmente distinto del `[data-theme]` de\n * `tokens/themes/*` (paleta de marca de la librería): ninguno de los 5\n * temas de `tokens/` es oscuro todavía, así que no hay ninguna señal real\n * de la que derivar un default \"según el tema de marca activo\" — construir\n * esa detección ahora sería simular una señal que no existe.\n *\n * `controls` (`MapControlKind[]`, default `[]`) es siempre opt-in: un mapa\n * sin `controls` no dibuja ningún botón flotante, ni siquiera en\n * `interactive` (antes de esta versión, `interactive` agregaba el\n * `NavigationControl` default de Mapbox gratis — se sacó a propósito: era\n * el look genérico de Mapbox, no el de esta librería, exactamente la queja\n * que motivó este rediseño. Un consumidor que quería esos botones de zoom\n * ahora los pide con `[controls]=\"['zoom']\"`). Cada kind es una pieza\n * independiente entre sí (ver `MapControls.ts` para el detalle de cada\n * una) — agregar una no reacomoda ni depende de las demás.\n *\n * <kf-map label=\"Ubicación del vehículo y del destino\" [markers]=\"markers()\" />\n * <kf-map size=\"sm\" variant=\"preview\" label=\"Vista previa de la ruta\" [route]=\"route()\" />\n * <kf-map label=\"Flota completa\" [markers]=\"fleet()\" [controls]=\"['zoom', 'recenter', 'cluster', 'follow']\" />\n */\n@Component({\n selector: 'kf-map',\n imports: [MapControls, Spinner, Icon, Text],\n templateUrl: './MapView.html',\n styleUrl: './MapView.css',\n // `Emulated` (el default) le agrega un atributo de scoping a cada\n // selector de `MapView.css` Y a cada elemento que el TEMPLATE de este\n // componente renderiza — pero los markers (`.kf-map__marker`) son `<div>`\n // creados a mano vía `document.createElement()` en `syncMarkers()`, fuera\n // del template, así que NUNCA reciben ese atributo. Con `Emulated`, el\n // selector compilado queda `.kf-map__marker[_ngcontent-xyz]` y no\n // matchea nunca esos `<div>` — el bug real detrás de \"el marker se ve\n // negro y diminuto\" (verificado con captura real: la regla ni siquiera\n // aplicaba, el marker rendería del tamaño/forma del ícono SVG suelto).\n // `None` es la salida estándar para un componente que dibuja DOM propio\n // fuera de Angular — todas las clases ya son BEM (`kf-map__*`,\n // `kf-map-controls__*`), así que el riesgo real de colisión global es\n // bajo.\n encapsulation: ViewEncapsulation.None,\n host: {\n '[class.kf-map--sm]': \"size() === 'sm'\",\n '[class.kf-map--md]': \"size() === 'md'\",\n '[class.kf-map--lg]': \"size() === 'lg'\",\n '[class.kf-map--full]': \"size() === 'full'\",\n },\n})\nexport class MapView {\n readonly size = input<MapSize>('md');\n readonly variant = input<MapVariant>('interactive');\n readonly markers = input<MapMarker[]>([]);\n readonly route = input<MapLatLng[]>();\n readonly fitToMarkers = input(true, { transform: booleanAttribute });\n readonly center = input<MapLatLng>();\n readonly zoom = input<number>();\n /**\n * Default `'streets'`, no `'light'` ni `'dark'`. `'dark'` se probó\n * primero por coherencia con la paleta navy de marca, pero una\n * verificación visual real sobre una ubicación de servicio típica (una\n * faena/zona rural, no un centro urbano denso) mostró el problema real:\n * `dark-v11` casi no tiene datos que pintar fuera de ciudades grandes —\n * el mapa se ve prácticamente todo negro, ilegible, exactamente donde\n * más importa que se lea bien (ubicaciones de terreno, no de oficina).\n * `'streets'` SIEMPRE tiene cartografía base visible (calles, nombres,\n * uso de suelo) sin importar la densidad del lugar — es el único de los\n * 5 estilos sin ese riesgo. Sigue siendo overrideable por el consumidor. */\n readonly theme = input<MapTheme>('streets');\n /** Controles flotantes a mostrar — ver JSDoc de la clase y `MapControls.ts`. */\n readonly controls = input<MapControlKind[]>([]);\n\n /**\n * Descripción accesible real del mapa — el `<div>` donde Mapbox renderiza\n * su canvas queda vacío de semántica para un lector de pantalla. Requerido\n * a propósito: un default genérico (\"Mapa\") no dice qué está mostrando\n * ESTE mapa; cada consumidor conoce su propio caso real (ej. \"Ubicación\n * del vehículo y del destino\").\n */\n readonly label = input.required<string>();\n\n /** Se emite al hacer click sobre un marker que declaró `id` (ver JSDoc de\n * `MapMarker.id`) — un marker SIN `id` no es clickeable, no emite nada.\n * No dispara en modo `cluster` (los markers pasan a ser capas WebGL sin\n * DOM propio donde colgar un listener) ni en `variant=\"preview\"` (el\n * mapa entero no es interactivo ahí). */\n readonly markerSelect = output<string>();\n\n /** Se emite al clickear un botón de `MapMarker.popup.actions` — ver el\n * JSDoc de `popup` para por qué reporta `actionKey` (nunca el `label`) y\n * por qué el click no dispara además `markerSelect`. */\n readonly markerAction = output<{ markerId: string; actionKey: string }>();\n\n private readonly mapConfig = inject(MAP_CONFIG);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly hostElementRef = inject(ElementRef<HTMLElement>);\n private readonly containerRef = viewChild.required<ElementRef<HTMLDivElement>>('mapContainer');\n\n /** `preview` no es foco-navegable ni se anuncia como región interactiva. */\n protected readonly isPreview = computed(() => this.variant() === 'preview');\n protected readonly containerRole = computed(() => (this.isPreview() ? 'img' : 'region'));\n\n /** Ver estado de carga/error real, más abajo (`status`). */\n protected readonly status = signal<'loading' | 'ready' | 'error'>('loading');\n\n /** Elección manual del consumidor final vía el control `mapStyle` — pisa\n * `theme()` de forma sostenida (no vuelve a `theme()` sola) hasta que se\n * destruya este `kf-map`; ver `resolvedTheme()`. */\n private readonly userTheme = signal<MapTheme | null>(null);\n protected readonly styleLabel = computed(() => THEME_LABEL[this.resolvedTheme()]);\n /** Igual que `resolvedTheme()` pero público para el template — lo necesita\n * `MapThemePicker` (vía `MapControls`) para marcar la opción activa. */\n protected readonly activeTheme = computed(() => this.resolvedTheme());\n\n protected readonly clusterActive = signal(false);\n protected readonly followActive = signal(false);\n protected readonly hasLiveMarker = computed(() => this.markers().some((marker) => marker.live));\n\n protected readonly isFullscreen = signal(false);\n\n /** Sin estilo de marca propio (Mapbox Studio) no hay nada que ciclar con\n * `mapStyle` — se filtra en vez de dejar un botón que no cambiaría nada. */\n protected readonly effectiveControls = computed<MapControlKind[]>(() => {\n const requested = this.controls();\n return this.mapConfig.styleUrl ? requested.filter((kind) => kind !== 'mapStyle') : requested;\n });\n protected readonly showControls = computed(\n () => this.variant() === 'interactive' && this.effectiveControls().length > 0,\n );\n\n private map: MapboxMap | null = null;\n /** `extraIconRefs`: íconos de las acciones del popup (ver `buildMarkerPopup()`)\n * — se crean con `createComponent()` igual que `iconRef` (el pin), así que\n * necesitan el mismo `.destroy()` en `clearMarkers()`. */\n private markerHandles: {\n marker: MapboxMarker;\n iconRef: ComponentRef<Icon>;\n extraIconRefs: ComponentRef<Icon>[];\n }[] = [];\n /** Markers DOM reales sobre cada cluster real (punto 1, a11y) — separados\n * de `markerHandles` porque se reconstruyen en su propio ciclo (ver\n * `syncClusterMarkers()`) y no tienen `iconRef` propio (sin `kf-icon`\n * adentro, ver JSDoc de `addClusterMarkerToMap()`). */\n private clusterMarkerHandles: MapboxMarker[] = [];\n private resizeObserver: ResizeObserver | null = null;\n private currentStyle = '';\n private mapReady = false;\n\n /** Popup resumen de un cluster real (ver `renderClusterPopup()`) — a\n * diferencia del popup de marker individual (siempre en el DOM, mostrado\n * por CSS `:hover`/`:focus-within`), este se crea/destruye a demanda: no\n * cuelga de ningún elemento con estado hover propio, lo abre un click\n * sobre una capa WebGL sin DOM. */\n private clusterPopupElement: HTMLElement | null = null;\n private clusterPopupIconRefs: ComponentRef<Icon>[] = [];\n /** Coordenadas del cluster abierto — necesarias para volver a proyectar\n * contra pantalla en cada `'move'` (ver `repositionClusterPopup()`); el\n * cluster en sí no se mueve, pero su posición EN PANTALLA sí cuando se\n * hace pan. */\n private clusterPopupCoordinates: [number, number] | null = null;\n\n private readonly onFullscreenChange = (): void => {\n this.isFullscreen.set(this.document.fullscreenElement === this.hostElementRef.nativeElement);\n // El propio contenedor cambia de tamaño al entrar/salir de pantalla\n // completa — mismo motivo que el `ResizeObserver` de más abajo, pero\n // ESTE cambio de tamaño no pasa por él (la Fullscreen API no dispara\n // un resize de layout normal en todos los navegadores).\n this.map?.resize();\n };\n\n constructor() {\n afterNextRender(() => this.initializeMap());\n\n this.document.addEventListener('fullscreenchange', this.onFullscreenChange);\n\n // Reactivo a `markers`/`route`/`fitToMarkers`/`center`/`zoom`/`theme`/\n // `controls`/`clusterActive`/`followActive` — el primer sync real ya lo\n // hace `initializeMap()` (ver comentario ahí sobre por qué la ruta NO se\n // sincroniza en esa primera pasada), así que este effect solo necesita\n // reaccionar a cambios posteriores.\n afterRenderEffect(() => {\n const style = this.resolvedStyle();\n if (!this.map) {\n return;\n }\n if (this.mapReady && style !== this.currentStyle) {\n this.currentStyle = style;\n this.map.setStyle(style);\n }\n this.syncMarkers();\n // `setStyle()` recién dispara `'style.load'` de forma asíncrona (ver\n // el listener en `initializeMap`), que es quien repone la ruta (y el\n // cluster, si está activo) en ese caso. Este llamado cubre el resto:\n // un cambio de `route()`/`markers()` sin cambio de `theme()` no\n // dispara ningún evento de Mapbox por sí solo — sin esto, la cámara\n // se reencuadraría pero los datos dibujados quedarían viejos.\n // `syncRoute()` ya revisa `isStyleLoaded()`, así que no hace nada si\n // el estilo está a mitad de cargar.\n this.syncRoute();\n this.syncCamera();\n });\n\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('fullscreenchange', this.onFullscreenChange);\n this.resizeObserver?.disconnect();\n this.clearMarkers();\n this.clearClusterMarkers();\n this.closeClusterPopup();\n this.map?.remove();\n this.map = null;\n });\n }\n\n /**\n * El bundle default de `mapbox-gl` arma su Web Worker serializando el\n * código del worker como string y cargándolo por Blob URL — un bundler\n * ESM-nativo (esbuild, el builder `application` de Angular) minifica ESE\n * string también, sin saber que corre verbatim en otro contexto, y el\n * worker termina con un identificador roto en runtime\n * (`ReferenceError: <letra> is not defined`, ver mapbox/mapbox-gl-js#13700\n * y angular/angular-cli#27378). `workerClass` reemplaza ese mecanismo por\n * un `Worker` real armado con el patrón literal\n * `new Worker(new URL(..., import.meta.url), { type: 'module' })` — el\n * único que esbuild reconoce de forma ESTÁTICA y separa en su propio\n * chunk (esbuild lo detecta por análisis sintáctico puro, dondequiera que\n * el literal aparezca en el archivo — no hace falta que esté a nivel de\n * módulo). `mapbox-gl-csp.worker.js` es un asset copiado tal cual, nunca\n * TypeScript compilado, así que `import.meta.url` sigue apuntando a un\n * archivo real en cualquiera de los dos contextos donde esbuild procesa\n * este literal: en `ng test` (bundlea el `.ts` fuente tal cual, el asset\n * está al lado en `src/lib/map/`) y en el build real de un consumidor\n * (bundlea el FESM publicado — `ng-package.json` copia este mismo asset a\n * `dist/ui/fesm2022/`, junto al bundle aplanado, con esa carpeta EXACTA a\n * propósito). Ambos casos comparten la misma ruta relativa\n * (`./mapbox-gl-csp.worker.js`) porque el asset se coloca deliberadamente\n * al lado del consumidor en los dos. Si un cambio de Angular Package\n * Format renombra `fesm2022`, hay que actualizar el `output` en\n * `ng-package.json` a la par.\n *\n * A propósito NO es un side-effect de módulo (no corre con solo\n * `import`ar este archivo): un `<kf-map>` real en jsdom construye un\n * `Worker` real vía esta misma expresión, y jsdom no lo soporta — revienta\n * el proceso de Vitest entero, no solo el test, y se lleva puesto\n * CUALQUIER spec que solo importe algo del barrel de la librería (nada\n * que ver con mapas). Por eso vive acá, dentro de `initializeMap()`, que\n * únicamente corre cuando alguien de verdad instancia y renderiza este\n * componente — `MapView.spec.ts` mockea `mapbox-gl` entero, así que ahí\n * la asignación cae sobre el mock, no sobre el `mapboxgl` real.\n */\n private assignWorkerClass(): void {\n if (workerClassAssigned || typeof Worker === 'undefined') {\n return;\n }\n workerClassAssigned = true;\n mapboxgl.workerClass = class {\n constructor() {\n return new Worker(new URL('./mapbox-gl-csp.worker.js', import.meta.url), {\n type: 'module',\n });\n }\n } as unknown as new () => Worker;\n }\n\n private initializeMap(): void {\n this.assignWorkerClass();\n const container = this.containerRef().nativeElement;\n const style = this.resolvedStyle();\n\n this.map = new MapboxMap({\n container,\n accessToken: this.mapConfig.accessToken,\n style,\n interactive: this.variant() === 'interactive',\n // Se agrega a mano más abajo, con `compact: false`: la atribución de\n // Mapbox tiene que quedar SIEMPRE visible (requisito de licencia, no\n // cosmético) — el default `compact` la colapsa detrás de un ícono en\n // contenedores angostos, exactamente lo que no puede pasar acá.\n attributionControl: false,\n center: this.toLngLat(this.center() ?? DEFAULT_CENTER),\n zoom: this.zoom() ?? DEFAULT_ZOOM,\n // Mapbox GL JS v3 elige la proyección \"globe\" (esfera 3D con atmósfera)\n // sola a partir de cierto zoom bajo, incluso con estilos clásicos como\n // `streets-v12` — no hace falta el estilo \"Standard\" para que pase. El\n // constructor arranca siempre en `DEFAULT_ZOOM` (2) ANTES de que\n // `fitBounds()` corra (recién en `markReady()`), así que sin esto el\n // primer frame real que ve el usuario es ese globo, con los markers\n // amontonados cerca de un borde — el bug real reportado (\"se ve como un\n // globo terráqueo\"). `'mercator'` fija la proyección clásica sin\n // importar el zoom en ningún momento del ciclo de vida del mapa.\n projection: 'mercator',\n });\n this.currentStyle = style;\n this.mapReady = true;\n\n this.map.addControl(new AttributionControl({ compact: false }));\n // Ya no se agrega `NavigationControl` (ni ningún otro control default de\n // Mapbox): ver JSDoc de `controls` en la clase — el chrome flotante de\n // esta librería es siempre `kf-map-controls`, opt-in, nunca el look\n // genérico de Mapbox.\n\n // `load` marca el mapa como visualmente listo (primer frame con todas\n // sus fuentes cargadas) — DISTINTO de `mapReady` de arriba, que solo\n // significa \"el objeto `Map` ya existe\" y gatea `setStyle()`. Mientras\n // no llega, el overlay de `status()` cubre el canvas a medio pintar.\n //\n // `markReady` se cablea a `load` PERO también a un timeout de respaldo:\n // en una verificación real (Chromium headless vía Playwright, mismo\n // navegador que corre cualquier E2E de los consumidores) se comprobó\n // que `render`/`data`/`sourcedata`/`styledata` disparan con normalidad\n // — las tiles llegan y el mapa pinta de verdad — pero `load` (y `idle`)\n // no llegan a disparar nunca en esa cadena concreta. No se pudo aislar\n // la causa raíz con certeza (sospecha: alguna interacción puntual con\n // el `workerClass` custom de `assignWorkerClass()`, que no toca la\n // ruta de decodificado/pintado de tiles pero sí podría afectar el\n // conteo interno que Mapbox usa para decidir \"todo cargó\"). Depender\n // SOLO de `load` deja al usuario con un spinner infinito sobre un mapa\n // que en los hechos ya funciona — un fallback acotado es la salida\n // segura sin importar cuál termine siendo la causa real.\n const markReady = (): void => {\n if (this.status() === 'loading') {\n this.status.set('ready');\n // `fitBounds()` (dentro de `syncCamera()`) calcula el zoom de\n // encuadre en base al tamaño ACTUAL del canvas de Mapbox — pero ese\n // canvas se creó con el contenedor todavía detrás del overlay de\n // carga (`display` normal, sin `hidden`, pero en layouts flex/grid\n // que recién terminan de asentarse el tamaño real puede no estar\n // listo todavía en este punto del ciclo). Un tamaño transitorio le\n // da a Mapbox un ancho/alto de referencia equivocado y el zoom\n // resultante queda mal. `resize()` SÍNCRONO justo antes de encuadrar\n // fuerza a Mapbox a releer el tamaño real del contenedor primero —\n // mismo mecanismo que ya usa el `ResizeObserver` de más abajo para\n // cambios posteriores, aplicado acá una vez, a mano, en el momento\n // exacto que más importa: el primer encuadre real.\n this.map?.resize();\n // Recién ACÁ el canvas queda visible detrás del overlay — es el\n // único momento en que animar la cámara tiene sentido. Antes este\n // fit corría en `initializeMap()`, sincrónico, ANTES de que el\n // mapa se pintara — la animación entera pasaba oculta detrás del\n // spinner y lo único que el usuario veía era el resultado final de\n // golpe (el bug real: \"no veo el efecto, aparece centrado de\n // golpe\"). Ver `CAMERA_DURATION_MS.initialFit`.\n this.syncCamera(CAMERA_DURATION_MS.initialFit);\n }\n };\n this.map.on('load', markReady);\n const readyFallbackTimer = setTimeout(markReady, MAP_READY_FALLBACK_TIMEOUT_MS);\n this.destroyRef.onDestroy(() => clearTimeout(readyFallbackTimer));\n\n // Cualquier error ANTES de llegar a `ready` es grave (token inválido,\n // sin red, estilo inexistente): no hay mapa usable que mostrar debajo\n // del overlay. Un error DESPUÉS de `ready` (ej. una tile puntual que no\n // cargó) no debería tapar retroactivamente un mapa que en general\n // funciona — por eso se ignora ahí, en vez de andar adivinando el\n // mensaje exacto de cada causa posible.\n this.map.on('error', () => {\n if (this.status() !== 'ready') {\n this.status.set('error');\n }\n });\n\n // `addSource`/`addLayer` fallan si el estilo todavía no cargó — por eso\n // la ruta (y el cluster, si está activo) no se sincronizan en la pasada\n // inicial de más abajo, solo acá. `.on` (no `.once`): cada `setStyle()`\n // posterior (cambio de `theme`) vuelve a disparar este evento y hay que\n // reponerlos, porque `setStyle` descarta cualquier source/layer custom\n // del estilo anterior. Los markers en DOM (`syncMarkers()` sin\n // clustering) no dependen del estilo y por eso no se repiten acá.\n this.map.on('style.load', () => {\n this.syncRoute();\n if (this.clusterActive()) {\n this.syncClusterSource();\n }\n });\n\n // El click/foco sobre un cluster real NO se cablea contra la capa WebGL\n // (`CLUSTER_CIRCLE_LAYER_ID` es puro pintado, sin nodo DOM — inalcanzable\n // por teclado, WCAG 2.1.1). La interacción real vive en el marker DOM que\n // `syncClusterMarkers()` crea por cada cluster vía `addClusterMarkerToMap()`\n // (mismo patrón que `addMarkerToMap()`: `role=\"button\"`, `tabindex=\"0\"`,\n // `click`+`keydown` de Enter/Space), así que acá no hace falta ningún\n // listener de `click`/`mouseenter`/`mouseleave` sobre la capa.\n\n // Qué puntos quedan \"sueltos\" (sin agrupar) depende del zoom actual —\n // Mapbox reclusteriza sola en cada cambio, esto solo reacciona.\n // `'data'` cubre la primera vez que la fuente termina de cargar (antes\n // de eso `querySourceFeatures()` no tiene nada que devolver);\n // `'moveend'` cubre cualquier pan/zoom posterior. No se usa `'render'`\n // (dispara ~60/s) ni `'move'` continuo para esto: reconstruir markers\n // en cada frame de una animación de cámara sería puro parpadeo sin\n // ganar nada, `'moveend'` (una vez que la interacción termina) alcanza.\n this.map.on('data', (event) => {\n // `'data'` cubre tanto datos de `source` como de `style` — solo el\n // primero trae `sourceId`/`isSourceLoaded`, de ahí el chequeo de\n // `dataType` antes de leerlos (si no, TypeScript no puede angostar la\n // unión `MapSourceDataEvent | MapStyleDataEvent`).\n if (\n event.dataType === 'source' &&\n this.clusterActive() &&\n event.sourceId === MARKER_CLUSTER_SOURCE_ID &&\n event.isSourceLoaded\n ) {\n this.syncClusterMarkers();\n }\n });\n this.map.on('moveend', () => {\n if (this.clusterActive()) {\n this.syncClusterMarkers();\n }\n });\n\n // El popup resumen de cluster (ver `renderClusterPopup()`) no es hijo de\n // ningún elemento que Mapbox reposicione solo — sigue al punto de\n // pantalla a mano en cada pan (`'move'`, sí continuo acá: reproyectar\n // 2 números es barato, nada que ver con reconstruir markers arriba). Se\n // cierra apenas empieza un zoom: el `cluster_id` que abrió el popup deja\n // de tener sentido en cuanto la agrupación cambia, y esperar a que\n // termine el zoom para recién ahí darse cuenta sería mostrar datos ya\n // viejos un rato.\n this.map.on('move', () => this.repositionClusterPopup());\n this.map.on('zoomstart', () => this.closeClusterPopup());\n\n this.resizeObserver = new ResizeObserver(() => this.map?.resize());\n this.resizeObserver.observe(container);\n\n this.syncMarkers();\n // El fit animado inicial NO corre acá — ver `markReady()` más arriba:\n // recién cuando el overlay de carga se saca tiene sentido animar algo\n // que el usuario pueda ver. Mientras carga, la cámara se queda donde el\n // constructor de `MapboxMap` la dejó (arriba) — invisible de todos\n // modos detrás del overlay.\n }\n\n private resolvedTheme(): MapTheme {\n return this.userTheme() ?? this.theme();\n }\n\n private resolvedStyle(): string {\n // Un estilo de marca custom (Mapbox Studio) no tiene un tema que elegir\n // — si el config de la app lo define, gana siempre sobre `theme()`/`userTheme()`.\n return this.mapConfig.styleUrl ?? STYLE_BY_THEME[this.resolvedTheme()];\n }\n\n private toLngLat(point: MapLatLng): [number, number] {\n return [point.lng, point.lat];\n }\n\n /**\n * `matchMedia` (no una media query CSS): esta preferencia decide la\n * `duration` que se le pasa a la API de cámara de Mapbox, que corre en\n * JS/WebGL — CSS no tiene nada que animar acá. `document.defaultView` (no\n * el `window` global) para que quede mockeable en test igual que el resto\n * de la clase usa `DOCUMENT` inyectado.\n */\n private prefersReducedMotion(): boolean {\n return (\n this.document.defaultView?.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false\n );\n }\n\n /** Colapsa cualquier duración a 0 (instantáneo, sin animar) si el usuario\n * pidió `prefers-reduced-motion: reduce` — un único punto de verdad para\n * que ningún movimiento de cámara se salga de esa preferencia. */\n private cameraDuration(baseMs: number): number {\n return this.prefersReducedMotion() ? 0 : baseMs;\n }\n\n private syncCamera(duration: number = CAMERA_DURATION_MS.recenter): void {\n if (!this.map) {\n return;\n }\n const followTarget = this.followActive()\n ? this.markers().find((marker) => marker.live)\n : undefined;\n if (followTarget) {\n // `easeTo`, no `jumpTo`: en modo \"seguir\" la cámara se corrige de a\n // poco detrás del marker en movimiento, no salta en seco cada vez que\n // llega una posición nueva.\n this.map.easeTo({\n center: this.toLngLat(followTarget.position),\n duration: this.cameraDuration(FOLLOW_EASE_DURATION_MS),\n });\n return;\n }\n if (this.fitToMarkers()) {\n const bounds = this.computeBounds();\n if (bounds) {\n this.frameBounds(bounds, duration);\n return;\n }\n }\n // `easeTo` con la duración calculada — no `jumpTo`: con\n // `prefers-reduced-motion` la duración cae a 0 y el efecto es idéntico a\n // un salto instantáneo, sin necesitar una rama de código aparte.\n this.map.easeTo({\n center: this.toLngLat(this.center() ?? DEFAULT_CENTER),\n zoom: this.zoom() ?? DEFAULT_ZOOM,\n duration: this.cameraDuration(duration),\n });\n }\n\n /**\n * Encuadra `bounds` con `fitBounds()`, salvo que sea una caja degenerada\n * (ver `DEGENERATE_BOUNDS_THRESHOLD_DEG`) — un solo punto total (un único\n * marker sin ruta, o vehículo+destino prácticamente en el mismo sitio) le\n * da a `fitBounds()` un ancho y alto ~cero, que Mapbox resuelve con un\n * `padding`/zoom que en la práctica deja el mapa mayormente en blanco\n * (\"se ve todo blanco\", el bug real que esto corrige). Un `easeTo` con\n * zoom fijo sensato muestra contexto real de calle en ese caso, animado\n * igual que el resto (antes era un `jumpTo` seco).\n */\n private frameBounds(bounds: LngLatBounds, duration: number = CAMERA_DURATION_MS.recenter): void {\n if (!this.map) {\n return;\n }\n if (this.isDegenerateBounds(bounds)) {\n this.map.easeTo({\n center: bounds.getCenter(),\n zoom: SINGLE_POINT_ZOOM,\n duration: this.cameraDuration(duration),\n });\n return;\n }\n this.map.fitBounds(bounds, {\n padding: FIT_BOUNDS_PADDING_PX,\n maxZoom: FIT_BOUNDS_MAX_ZOOM,\n duration: this.cameraDuration(duration),\n });\n }\n\n private isDegenerateBounds(bounds: LngLatBounds): boolean {\n const ne = bounds.getNorthEast();\n const sw = bounds.getSouthWest();\n return (\n Math.abs(ne.lat - sw.lat) < DEGENERATE_BOUNDS_THRESHOLD_DEG &&\n Math.abs(ne.lng - sw.lng) < DEGENERATE_BOUNDS_THRESHOLD_DEG\n );\n }\n\n /**\n * Extiende sobre markers Y route: el nombre del input sigue el caso de\n * uso principal (encuadrar los markers), pero un mapa con solo `route` y\n * sin `markers` tampoco debería quedar en el encuadre default inútil.\n */\n private computeBounds(): LngLatBounds | null {\n const points = [...this.markers().map((marker) => marker.position), ...(this.route() ?? [])];\n if (points.length === 0) {\n return null;\n }\n const bounds = new LngLatBounds();\n for (const point of points) {\n bounds.extend(this.toLngLat(point));\n }\n return bounds;\n }\n\n private syncMarkers(): void {\n if (!this.map) {\n return;\n }\n if (this.clusterActive()) {\n // El clustering nativo resuelve por fuente+capas GeoJSON los clusters\n // REALES (2+ puntos agrupados) — pero un punto que Mapbox deja suelto\n // (sin `point_count`) sigue siendo un marker DOM normal, con su\n // `kf-icon`/tono/popup de siempre (ver JSDoc de `syncClusterMarkers()`\n // sobre por qué). Por eso acá NO se limpian los markers incondicional-\n // mente: `syncClusterMarkers()` decide cuáles siguen sueltos y\n // reconstruye solo esos; este método solo se asegura de que la fuente\n // de clusters exista/esté al día.\n this.syncClusterSource();\n this.syncClusterMarkers();\n return;\n }\n this.clearClusterLayers();\n this.clearClusterMarkers();\n this.closeClusterPopup();\n this.clearMarkers();\n\n for (const markerData of this.markers()) {\n this.addMarkerToMap(markerData);\n }\n }\n\n /**\n * Crea el marker de Mapbox (DOM + `kf-icon` + wiring de click/teclado/\n * popup) para UN `MapMarker` y lo agrega a `markerHandles` — compartido\n * entre el modo normal (`syncMarkers()`, todos los markers) y el modo\n * cluster (`syncClusterMarkers()`, solo los que quedan sueltos): un punto\n * suelto en modo cluster tiene que verse y comportarse EXACTAMENTE igual\n * que en modo normal, así que no puede haber dos implementaciones.\n */\n private addMarkerToMap(markerData: MapMarker): void {\n if (!this.map) {\n return;\n }\n // `kf-icon` real (no un `<svg>` a mano): reusa el sprite compartido y\n // se destruye igual que cualquier otro componente Angular al sacar el\n // marker del mapa.\n const iconRef = createComponent(Icon, { environmentInjector: this.environmentInjector });\n iconRef.setInput('name', markerData.icon ?? 'map-pin');\n iconRef.setInput('size', 'sm');\n iconRef.changeDetectorRef.detectChanges();\n\n const element = this.document.createElement('div');\n element.className = [\n 'kf-map__marker',\n `kf-map__marker--${markerData.tone ?? 'neutral'}`,\n markerData.live ? 'kf-map__marker--live' : '',\n ]\n .filter(Boolean)\n .join(' ');\n if (markerData.label) {\n // Solo nombre accesible + tooltip nativo — `label` no abre un popup.\n element.setAttribute('aria-label', markerData.label);\n element.setAttribute('title', markerData.label);\n }\n const extraIconRefs: ComponentRef<Icon>[] = [];\n if (markerData.id) {\n // `id` (ver JSDoc de `MapMarker.id`) es lo único que hace a un\n // marker clickeable — sin él, no hay con qué identificar de vuelta\n // la selección en `markerSelect`.\n const markerId = markerData.id;\n element.classList.add('kf-map__marker--clickable');\n element.setAttribute('role', 'button');\n element.setAttribute('tabindex', '0');\n element.addEventListener('click', () => this.markerSelect.emit(markerId));\n element.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.markerSelect.emit(markerId);\n }\n });\n // Solo con `id` el marker es clickeable/enfocable — sin eso, hover\n // ni foco por teclado tendrían de qué revelar esta mini-card, así\n // que `popup` sin `id` se ignora en silencio en vez de agregar un\n // elemento que nunca se vería.\n if (markerData.popup) {\n const { element: popupElement, iconRefs: popupIconRefs } = this.buildMarkerPopup(\n markerData.popup,\n markerId,\n markerData.tone ?? 'neutral',\n );\n extraIconRefs.push(...popupIconRefs);\n // Reposiciona (recorte de borde, ver `positionMarkerPopup()`) en\n // el evento que dispara la aparición — el mecanismo de mostrar/\n // ocultar sigue siendo 100% CSS (`:hover`/`:focus-within`), esto\n // solo decide DÓNDE queda el popup antes de que se vuelva visible.\n const reposition = (): void => this.positionMarkerPopup(element, popupElement);\n element.addEventListener('mouseenter', reposition);\n element.addEventListener('focusin', reposition);\n element.appendChild(popupElement);\n }\n }\n element.appendChild(iconRef.location.nativeElement);\n\n const marker = new MapboxMarker({ element })\n .setLngLat(this.toLngLat(markerData.position))\n .addTo(this.map);\n\n this.markerHandles.push({ marker, iconRef, extraIconRefs });\n }\n\n /**\n * Mini-card hija del `<div>` del marker — mismo patrón que\n * `.kf-map-controls__label` (ver `MapControls.css`): un elemento SIEMPRE\n * presente en el DOM, oculto por defecto vía `opacity`/`pointer-events` en\n * `MapView.css` y revelado por CSS puro en `:hover`/`:focus-within` del\n * marker padre — sin JS de show/hide, y sin `mapboxgl.Popup` (evita una\n * segunda gestión de overlay/posicionamiento cuando el CSS ya alcanza acá,\n * igual que ya decidió `.kf-map-controls__label`).\n *\n * Todo el subárbol (título, descripción, `details`, `actions`) se arma con\n * `document.createElement` puro, nunca `kf-text`/`kf-button`: este marker\n * entero vive fuera del template de Angular (ver el comentario grande de\n * `ViewEncapsulation.None` más arriba) — meter un componente real acá\n * significaría un `createComponent()` propio por cada línea de texto, el\n * mismo costo que ya paga `kf-icon` en `syncMarkers()` pero sin ninguna\n * necesidad real (no hay nada dinámico que un componente resuelva mejor\n * que texto plano estilado por clase). Es la MISMA decisión que ya regía\n * para `title`/`description` antes de esta ronda — se extiende acá para no\n * mezclar dos convenciones distintas dentro del mismo fragmento de DOM.\n *\n * `actions` sí necesita wiring propio (a diferencia del resto de la card,\n * que burbujea su click al listener ya cableado sobre `element` en\n * `syncMarkers()`): cada botón corta esa burbuja con `stopPropagation()`\n * para reportar `markerAction` en vez de (además) `markerSelect`.\n *\n * Jerarquía visual de `actions` (ver JSDoc de `MapPopupAction`): la\n * PRIMERA acción del array es la principal (`--primary`, fill); el resto\n * es secundaria (`--ghost`, transparente) — mismo peso que ya usan\n * `kf-button[variant=primary]`/`[variant=ghost]` en el resto de la\n * librería, sin inventar un esquema de color nuevo acá.\n *\n * El punto de color junto al título (`kf-map__marker-popup-tone`) reusa\n * el `tone` del propio marker — no el de cada `details` (que son pares\n * label/value genéricos, sin un campo \"cuál de estos es el estado\"): es\n * la misma señal que YA pinta el círculo del marker en el mapa, mostrada\n * de nuevo acá para que el popup se lea sin tener que mirar el marker.\n */\n private buildMarkerPopup(\n popup: NonNullable<MapMarker['popup']>,\n markerId: string,\n tone: MapMarkerTone,\n ): { element: HTMLElement; iconRefs: ComponentRef<Icon>[] } {\n const iconRefs: ComponentRef<Icon>[] = [];\n const card = this.document.createElement('div');\n card.className = 'kf-map__marker-popup';\n\n const heading = this.document.createElement('div');\n heading.className = 'kf-map__marker-popup-heading';\n const toneDot = this.document.createElement('span');\n toneDot.className = `kf-map__marker-popup-tone kf-map__marker-popup-tone--${tone}`;\n toneDot.setAttribute('aria-hidden', 'true');\n const title = this.document.createElement('span');\n title.className = 'kf-map__marker-popup-title';\n title.textContent = popup.title;\n heading.append(toneDot, title);\n card.appendChild(heading);\n\n if (popup.description) {\n const description = this.document.createElement('span');\n description.className = 'kf-map__marker-popup-description';\n description.textContent = popup.description;\n card.appendChild(description);\n }\n\n if (popup.details?.length) {\n const list = this.document.createElement('dl');\n list.className = 'kf-map__marker-popup-details';\n for (const detail of popup.details) {\n const row = this.document.createElement('div');\n row.className = 'kf-map__marker-popup-detail';\n const label = this.document.createElement('dt');\n label.className = 'kf-map__marker-popup-detail-label';\n label.textContent = detail.label;\n const value = this.document.createElement('dd');\n value.className = 'kf-map__marker-popup-detail-value';\n value.textContent = detail.value;\n row.append(label, value);\n list.appendChild(row);\n }\n card.appendChild(list);\n }\n\n if (popup.actions?.length) {\n const actions = this.document.createElement('div');\n actions.className = 'kf-map__marker-popup-actions';\n popup.actions.forEach((action, index) => {\n const button = this.document.createElement('button');\n button.type = 'button';\n // Primera acción = principal (fill), resto = secundaria (ghost) —\n // ver JSDoc de este método y de `MapPopupAction`.\n button.className = `kf-map__marker-popup-action kf-map__marker-popup-action--${index === 0 ? 'primary' : 'ghost'}`;\n // `title` nativo como respaldo: el label puede truncar con ellipsis\n // si dos acciones no entran completas en el ancho mínimo del popup\n // (ver `.kf-map__marker-popup-action-label`) — con esto, el texto\n // completo sigue disponible al pasar el mouse por encima.\n button.title = action.label;\n if (action.icon) {\n const iconRef = createComponent(Icon, { environmentInjector: this.environmentInjector });\n iconRef.setInput('name', action.icon);\n iconRef.setInput('size', 'sm');\n iconRef.changeDetectorRef.detectChanges();\n iconRefs.push(iconRef);\n button.appendChild(iconRef.location.nativeElement);\n }\n // Clase propia para poder truncar SOLO el texto (con ellipsis) sin\n // afectar al ícono — ver `.kf-map__marker-popup-action-label` en\n // MapView.css: con `flex:1` en el botón pero sin esto, dos acciones\n // de largo de texto distinto no se reparten el ancho parejo (el\n // `white-space:nowrap` fija un min-content propio que `flex:1` no\n // puede pisar sin `min-width:0` — mismo bug que en cualquier grid\n // con `1fr` a secas).\n const label = this.document.createElement('span');\n label.className = 'kf-map__marker-popup-action-label';\n label.textContent = action.label;\n button.appendChild(label);\n button.addEventListener('click', (domEvent) => {\n // Sin esto, el click también burbujearía hasta el listener de\n // `element` en `syncMarkers()` y dispararía `markerSelect` además\n // de `markerAction` — dos outputs por un solo click real.\n domEvent.stopPropagation();\n this.markerAction.emit({ markerId, actionKey: action.key });\n });\n actions.appendChild(button);\n });\n card.appendChild(actions);\n }\n\n return { element: card, iconRefs };\n }\n\n private clearMarkers(): void {\n for (const { marker, iconRef, extraIconRefs } of this.markerHandles) {\n marker.remove();\n iconRef.destroy();\n for (const extraIconRef of extraIconRefs) {\n extraIconRef.destroy();\n }\n }\n this.markerHandles = [];\n }\n\n /**\n * Recorte de borde para el popup de marker individual (punto 2) —\n * `getBoundingClientRect()` del marker y del propio contenedor del mapa,\n * recalculado en el evento que dispara la apertura (`mouseenter`/\n * `focusin`, ver `addMarkerToMap()`). El mecanismo de mostrar/ocultar\n * sigue siendo 100% CSS; esto solo decide 3 clases modificadoras que\n * `MapView.css` traduce en alineación horizontal/vertical:\n *\n * `--align-start` — el popup se desborda por la izquierda del\n * contenedor si se centra sobre el marker: se alinea su borde\n * izquierdo con el del marker en vez de centrarlo.\n * `--align-end` — mismo caso, contra el borde derecho.\n * `--below` — no entra arriba del marker (cerca del borde superior del\n * contenedor): se muestra debajo en vez de arriba.\n *\n * El popup YA está en el DOM en este punto (oculto por `opacity`, no por\n * `display:none` — ver `MapView.css`), así que `getBoundingClientRect()`\n * devuelve su tamaño real aunque todavía no sea visible.\n */\n private positionMarkerPopup(markerElement: HTMLElement, popupElement: HTMLElement): void {\n const containerRect = this.containerRef().nativeElement.getBoundingClientRect();\n const markerRect = markerElement.getBoundingClientRect();\n const popupRect = popupElement.getBoundingClientRect();\n\n const markerCenterX = markerRect.left + markerRect.width / 2;\n const overflowsLeft =\n markerCenterX - popupRect.width / 2 < containerRect.left + POPUP_EDGE_MARGIN_PX;\n const overflowsRight =\n markerCenterX + popupRect.width / 2 > containerRect.right - POPUP_EDGE_MARGIN_PX;\n popupElement.classList.toggle('kf-map__marker-popup--align-start', overflowsLeft);\n popupElement.classList.toggle(\n 'kf-map__marker-popup--align-end',\n !overflowsLeft && overflowsRight,\n );\n\n const overflowsTop =\n markerRect.top - popupRect.height - POPUP_EDGE_MARGIN_PX < containerRect.top;\n popupElement.classList.toggle('kf-map__marker-popup--below', overflowsTop);\n }\n\n /**\n * Clustering nativo de Mapbox (`cluster: true` en la fuente GeoJSON, no un\n * algoritmo armado a mano) — 2 capas, solo para clusters REALES (2+\n * puntos agrupados, `has: point_count`): círculo agregado y su label de\n * cantidad. Un punto que Mapbox deja suelto (sin `point_count`) YA NO\n * tiene capa WebGL propia — ver `syncClusterMarkers()`, que lo renderiza\n * como el mismo marker DOM de siempre (con ícono/tono/popup reales, cosa\n * que una capa `circle` no puede mostrar).\n */\n private syncClusterSource(): void {\n if (!this.map || !this.map.isStyleLoaded()) {\n return;\n }\n const data = this.markersToFeatureCollection();\n const existing = this.map.getSource(MARKER_CLUSTER_SOURCE_ID) as GeoJSONSource | undefined;\n if (existing) {\n existing.setData(data);\n return;\n }\n\n this.map.addSource(MARKER_CLUSTER_SOURCE_ID, {\n type: 'geojson',\n data,\n cluster: true,\n clusterMaxZoom: 14,\n clusterRadius: 50,\n });\n\n this.map.addLayer({\n id: CLUSTER_CIRCLE_LAYER_ID,\n type: 'circle',\n source: MARKER_CLUSTER_SOURCE_ID,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': this.resolveColorToken('--kf-color-gray-700'),\n 'circle-radius': ['step', ['get', 'point_count'], 14, 10, 18, 50, 22],\n 'circle-stroke-width': 2,\n 'circle-stroke-color': this.resolveColorToken('--kf-color-white'),\n },\n });\n\n this.map.addLayer({\n id: CLUSTER_COUNT_LAYER_ID,\n type: 'symbol',\n source: MARKER_CLUSTER_SOURCE_ID,\n filter: ['has', 'point_count'],\n layout: {\n 'text-field': ['get', 'point_count_abbreviated'],\n 'text-size': 12,\n },\n paint: {\n 'text-color': this.resolveColorToken('--kf-color-white'),\n },\n });\n }\n\n /**\n * Contraparte en DOM de la capa WebGL: mientras esa capa solo dibuja\n * clusters reales, ESTE método decide qué puntos quedan sueltos al zoom\n * ACTUAL (`querySourceFeatures` con el mismo filtro `!has(point_count)`\n * que ya usa Mapbox para separar cluster de leaf) y les arma el mismo\n * marker DOM que tendrían sin clustering — vía `addMarkerToMap()`, la\n * MISMA función que usa el modo normal, no una copia.\n *\n * `querySourceFeatures` puede devolver una feature repetida si cae cerca\n * de un borde interno de tile — de ahí el `Set` sobre `index` (la\n * property que identifica al `MapMarker` de origen, ver\n * `markersToFeatureCollection()`), no una lista con posibles duplicados.\n * Mismo motivo (y mismo `Set`, esta vez sobre `cluster_id`) para los\n * clusters reales que se resuelven acá abajo.\n *\n * Se llama solo cuando `clusterActive()` — ver los listeners `'data'`/\n * `'moveend'` en `initializeMap()` sobre CUÁNDO se llama esto.\n */\n private syncClusterMarkers(): void {\n if (!this.map) {\n return;\n }\n const source = this.map.getSource(MARKER_CLUSTER_SOURCE_ID);\n if (!source) {\n return;\n }\n const singletonFeatures = this.map.querySourceFeatures(MARKER_CLUSTER_SOURCE_ID, {\n filter: ['!', ['has', 'point_count']],\n });\n const singletonIndexes = new Set<number>();\n for (const feature of singletonFeatures) {\n const index = feature.properties?.['index'];\n if (typeof index === 'number') {\n singletonIndexes.add(index);\n }\n }\n\n this.clearMarkers();\n const markers = this.markers();\n for (const index of singletonIndexes) {\n const markerData = markers[index];\n if (markerData) {\n this.addMarkerToMap(markerData);\n }\n }\n\n // Clusters reales (punto 1, a11y): además del círculo WebGL que pinta\n // `CLUSTER_CIRCLE_LAYER_ID`, cada uno recibe acá un marker DOM real —\n // ver `addClusterMarkerToMap()` sobre por qué la capa WebGL sola no\n // alcanza (WCAG 2.1.1, sin nodo DOM no hay foco de teclado posible).\n const clusterFeatures = this.map.querySourceFeatures(MARKER_CLUSTER_SOURCE_ID, {\n filter: ['has', 'point_count'],\n });\n const seenClusterIds = new Set<number>();\n this.clearClusterMarkers();\n for (const feature of clusterFeatures) {\n const clusterId = feature.properties?.['cluster_id'];\n const pointCount = feature.properties?.['point_count'];\n const geometry = feature.geometry;\n if (\n typeof clusterId !== 'number' ||\n typeof pointCount !== 'number' ||\n geometry?.type !== 'Point'\n ) {\n continue;\n }\n if (seenClusterIds.has(clusterId)) {\n continue;\n }\n seenClusterIds.add(clusterId);\n this.addClusterMarkerToMap(clusterId, geometry.coordinates as [number, number], pointCount);\n }\n }\n\n /**\n * Marker DOM real sobre un cluster (punto 1, a11y) — MISMO patrón de\n * wiring que `addMarkerToMap()` (`role=\"button\"`, `tabindex=\"0\"`,\n * `click`+`keydown` de Enter/Space), aplicado acá porque el círculo que\n * pinta `CLUSTER_CIRCLE_LAYER_ID` es una capa WebGL sin nodo DOM propio\n * —inalcanzable por teclado (WCAG SC 2.1.1 Keyboard). `mapboxgl.Marker`\n * posiciona y reproyecta este `<div>` solo en cada pan/zoom, igual que ya\n * hace con cualquier marker individual — no hace falta reposicionarlo a\n * mano como sí necesita el popup resumen (ver `repositionClusterPopup()`).\n *\n * Sin `kf-icon`/texto propio adentro a propósito: el círculo+conteo que ya\n * pinta la capa WebGL sigue siendo la representación visual (mismo\n * `'circle-radius'`, ver `clusterMarkerRadiusPx()`); este `<div>` es\n * transparente y se superpone exacto encima, aportando SOLO la\n * interactividad real que la capa WebGL no puede tener.\n */\n private addClusterMarkerToMap(\n clusterId: number,\n coordinates: [number, number],\n pointCount: number,\n ): void {\n if (!this.map) {\n return;\n }\n const diameter = clusterMarkerRadiusPx(pointCount) * 2;\n const element = this.document.createElement('div');\n element.className = 'kf-map__cluster-marker';\n element.style.width = `${diameter}px`;\n element.style.height = `${diameter}px`;\n element.setAttribute('role', 'button');\n element.setAttribute('tabindex', '0');\n element.setAttribute('aria-label', `${pointCount} puntos agrupados`);\n const activate = (): void => this.activateCluster(clusterId, coordinates, pointCount);\n element.addEventListener('click', activate);\n element.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n activate();\n }\n });\n\n const marker = new MapboxMarker({ element }).setLngLat(coordinates).addTo(this.map);\n this.clusterMarkerHandles.push(marker);\n }\n\n private clearClusterMarkers(): void {\n for (const marker of this.clusterMarkerHandles) {\n marker.remove();\n }\n this.clusterMarkerHandles = [];\n }\n\n /**\n * Activación de un cluster real (click O Enter/Space sobre su marker DOM,\n * ver `addClusterMarkerToMap()`): ANTES hacía zoom directo\n * (`getClusterExpansionZoom()` + `easeTo`) — ahora abre el popup resumen\n * (`renderClusterPopup()`) con la lista de tickets agrupados, y ESE zoom\n * pasa a ser la acción explícita \"Acercar para separar\" dentro del popup\n * (ver `expandCluster()`).\n */\n private activateCluster(\n clusterId: number,\n coordinates: [number, number],\n pointCount: number,\n ): void {\n const map = this.map;\n if (!map) {\n return;\n }\n const source = map.getSource(MARKER_CLUSTER_SOURCE_ID) as GeoJSONSource | undefined;\n // `pointCount` como `limit`: trae TODOS los leaves del cluster, nunca\n // los corta en silencio (ver JSDoc de `renderClusterPopup()` sobre el\n // scroll interno para cuando son muchos) — mismo patrón que documenta\n // el propio Mapbox GL JS para este método.\n source?.getClusterLeaves(clusterId, pointCount, 0, (error, leaves) => {\n if (error || !leaves) {\n return;\n }\n this.renderClusterPopup(clusterId, coordinates, leaves);\n });\n }\n\n /** Dispara el zoom que antes hacía el click directo sobre el círculo —\n * ahora vive detrás del botón \"Acercar para separar\" del popup resumen. */\n private expandCluster(clusterId: number, coordinates: [number, number]): void {\n const map = this.map;\n if (!map) {\n return;\n }\n const source = map.getSource(MARKER_CLUSTER_SOURCE_ID) as GeoJSONSource | undefined;\n source?.getClusterExpansionZoom(clusterId, (error, zoom) => {\n if (error || typeof zoom !== 'number') {\n return;\n }\n map.easeTo({\n center: coordinates,\n zoom,\n duration: this.cameraDuration(CAMERA_DURATION_MS.recenter),\n });\n });\n }\n\n /**\n * `index` identifica de vuelta al `MapMarker` de origen (ver\n * `syncClusterMarkers()`); `title`/`description`/`markerId` son las\n * mismas properties que ya arma `buildMarkerPopup()` (folio/cliente/id\n * del caso real) — se serializan acá TAMBIÉN para que\n * `getClusterLeaves()` pueda listarlas en el popup resumen sin tener que\n * ir a buscar cada `MapMarker` original por separado. Los campos son\n * `string` (no `undefined`): las properties de una `Feature` de GeoJSON\n * no viajan bien como `undefined` — `''` significa \"sin dato\" en los 3.\n */\n private markersToFeatureCollection(): GeoJSON.FeatureCollection<\n GeoJSON.Point,\n MapMarkerFeatureProperties\n > {\n return {\n type: 'FeatureCollection',\n features: this.markers().map((marker, index) => ({\n type: 'Feature',\n properties: {\n index,\n tone: marker.tone ?? 'neutral',\n title: marker.popup?.title ?? '',\n description: marker.popup?.description ?? '',\n markerId: marker.id ?? '',\n },\n geometry: { type: 'Point', coordinates: this.toLngLat(marker.position) },\n })),\n };\n }\n\n private clearClusterLayers(): void {\n if (!this.map) {\n return;\n }\n // Las 2 capas antes que la fuente: Mapbox no deja sacar una fuente\n // mientras alguna capa todavía la referencia.\n for (const layerId of [CLUSTER_CIRCLE_LAYER_ID, CLUSTER_COUNT_LAYER_ID]) {\n if (this.map.getLayer(layerId)) {\n this.map.removeLayer(layerId);\n }\n }\n if (this.map.getSource(MARKER_CLUSTER_SOURCE_ID)) {\n this.map.removeSource(MARKER_CLUSTER_SOURCE_ID);\n }\n }\n\n /**\n * Popup resumen de un cluster real (punto 4) — a diferencia del popup de\n * marker individual (siempre en el DOM, `:hover`/`:focus-within` puro),\n * este no cuelga de ningún elemento con estado hover propio: lo abre un\n * click sobre una capa WebGL sin DOM, así que se crea/destruye a demanda\n * y su visibilidad la maneja JS, no CSS. Se agrega como hijo del HOST\n * (`kf-map`, no `.kf-map__container`): ambos comparten exactamente la\n * misma caja (`.kf-map__container` es `width/height:100%` sin padding/\n * borde dentro de un host `position:relative`), así que las coordenadas\n * de `map.project()` (relativas al contenedor) valen también acá — mismo\n * ancestro posicionado que ya usa `.kf-map__overlay`.\n *\n * `title`/`description` de cada leaf son `popup.title`/`popup.description`\n * del `MapMarker` original (folio/cliente en el caso real) — ver\n * `markersToFeatureCollection()`. El punto de color reusa `tone`, MISMO\n * criterio que el punto de color del popup individual (ver JSDoc de\n * `buildMarkerPopup()`): no se inventa un texto de \"estado\" que la\n * librería no tiene, se reusa la señal de color que sí existe.\n */\n private renderClusterPopup(\n clusterId: number,\n coordinates: [number, number],\n leaves: GeoJSON.Feature[],\n ): void {\n this.closeClusterPopup();\n if (!this.map) {\n return;\n }\n\n const card = this.document.createElement('div');\n card.className = 'kf-map__cluster-popup';\n\n const header = this.document.createElement('div');\n header.className = 'kf-map__cluster-popup-header';\n const title = this.document.createElement('span');\n title.className = 'kf-map__cluster-popup-title';\n title.textContent = `${leaves.length} puntos agrupados`;\n const closeButton = this.document.createElement('button');\n closeButton.type = 'button';\n closeButton.className = 'kf-map__cluster-popup-close';\n closeButton.setAttribute('aria-label', 'Cerrar');\n const closeIconRef = createComponent(Icon, { environmentInjector: this.environmentInjector });\n closeIconRef.setInput('name', 'x');\n closeIconRef.setInput('size', 'sm');\n closeIconRef.changeDetectorRef.detectChanges();\n this.clusterPopupIconRefs.push(closeIconRef);\n closeButton.appendChild(closeIconRef.location.nativeElement);\n closeButton.addEventListener('click', () => this.closeClusterPopup());\n header.append(title, closeButton);\n card.appendChild(header);\n\n // `<ul>`/`<li>`: es una lista real de tickets, no párrafos sueltos —\n // `max-height`+`overflow-y:auto` en `MapView.css` resuelve el scroll\n // interno cuando hay más leaves de los que entran cómodos, en vez de\n // cortar la lista en silencio (ver JSDoc de `handleClusterClick()`\n // sobre por qué `getClusterLeaves` ya trae TODOS los leaves).\n const list = this.document.createElement('ul');\n list.className = 'kf-map__cluster-popup-list';\n for (const leaf of leaves) {\n const properties = leaf.properties as Partial<MapMarkerFeatureProperties> | null;\n const markerId = properties?.markerId;\n const tone = properties?.tone ?? 'neutral';\n\n const item = this.document.createElement('li');\n item.className = 'kf-map__cluster-popup-item';\n const dot = this.document.createElement('span');\n dot.className = `kf-map__cluster-popup-dot kf-map__cluster-popup-dot--${tone}`;\n dot.setAttribute('aria-hidden', 'true');\n const text = this.document.createElement('span');\n text.className = 'kf-map__cluster-popup-text';\n const itemTitle = this.document.createElement('span');\n itemTitle.className = 'kf-map__cluster-popup-item-title';\n itemTitle.textContent = properties?.title || 'Sin título';\n text.appendChild(itemTitle);\n if (properties?.description) {\n const itemDescription = this.document.createElement('span');\n itemDescription.className = 'kf-map__cluster-popup-item-description';\n itemDescription.textContent = properties.description;\n text.appendChild(itemDescription);\n }\n item.append(dot, text);\n\n // Mismo criterio que el marker individual (ver JSDoc de `MapMarker.id`):\n // sin `markerId` esta fila no tiene con qué identificar de vuelta la\n // selección en `markerSelect`, así que se queda sin ser clickeable.\n if (markerId) {\n item.classList.add('kf-map__cluster-popup-item--clickable');\n item.setAttribute('role', 'button');\n item.setAttribute('tabindex', '0');\n const select = (): void => {\n this.markerSelect.emit(markerId);\n this.closeClusterPopup();\n };\n item.addEventListener('click', select);\n item.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n select();\n }\n });\n }\n list.appendChild(item);\n }\n card.appendChild(list);\n\n const footer = this.document.createElement('div');\n footer.className = 'kf-map__cluster-popup-footer';\n const expandButton = this.document.createElement('button');\n expandButton.type = 'button';\n expandButton.className = 'kf-map__cluster-popup-expand';\n const expandIconRef = createComponent(Icon, { environmentInjector: this.environmentInjector });\n expandIconRef.setInput('name', 'plus');\n expandIconRef.setInput('size', 'sm');\n expandIconRef.changeDetectorRef.detectChanges();\n this.clusterPopupIconRefs.push(expandIconRef);\n const expandLabel = this.document.createElement('span');\n expandLabel.textContent = 'Acercar para separar';\n expandButton.append(expandIconRef.location.nativeElement, expandLabel);\n expandButton.addEventListener('click', () => {\n this.expandCluster(clusterId, coordinates);\n this.closeClusterPopup();\n });\n footer.appendChild(expandButton);\n card.appendChild(footer);\n\n this.hostElementRef.nativeElement.appendChild(card);\n this.clusterPopupElement = card;\n this.clusterPopupCoordinates = coordinates;\n this.repositionClusterPopup();\n }\n\n /** Reproyecta el popup de cluster contra pantalla — se llama en cada\n * `'move'` (ver `initializeMap()`): el punto geográfico no se mueve, pero\n * su posición EN PANTALLA sí cuando se hace pan. Mismo criterio de\n * recorte de borde que `positionMarkerPopup()` (punto 2), pero en\n * píxeles calculados a mano en vez de clases CSS: este popup no cuelga\n * de un ancestro posicionado por CSS relativo al marker, su posición\n * ENTERA viene de `map.project()`. */\n private repositionClusterPopup(): void {\n if (!this.map || !this.clusterPopupElement || !this.clusterPopupCoordinates) {\n return;\n }\n const point = this.map.project(this.clusterPopupCoordinates);\n const containerRect = this.containerRef().nativeElement.getBoundingClientRect();\n const popupRect = this.clusterPopupElement.getBoundingClientRect();\n\n const maxLeft = Math.max(\n containerRect.width - popupRect.width - POPUP_EDGE_MARGIN_PX,\n POPUP_EDGE_MARGIN_PX,\n );\n const left = Math.min(Math.max(point.x - popupRect.width / 2, POPUP_EDGE_MARGIN_PX), maxLeft);\n\n const fitsAbove = point.y - popupRect.height - CLUSTER_POPUP_GAP_PX >= POPUP_EDGE_MARGIN_PX;\n const top = fitsAbove\n ? point.y - popupRect.height - CLUSTER_POPUP_GAP_PX\n : point.y + CLUSTER_POPUP_GAP_PX;\n\n this.clusterPopupElement.style.left = `${left}px`;\n this.clusterPopupElement.style.top = `${Math.max(top, POPUP_EDGE_MARGIN_PX)}px`;\n }\n\n private closeClusterPopup(): void {\n this.clusterPopupElement?.remove();\n this.clusterPopupElement = null;\n this.clusterPopupCoordinates = null;\n for (const iconRef of this.clusterPopupIconRefs) {\n iconRef.destroy();\n }\n this.clusterPopupIconRefs = [];\n }\n\n private syncRoute(): void {\n if (!this.map || !this.map.isStyleLoaded()) {\n return;\n }\n\n if (this.map.getLayer(ROUTE_LAYER_ID)) {\n this.map.removeLayer(ROUTE_LAYER_ID);\n }\n if (this.map.getSource(ROUTE_SOURCE_ID)) {\n this.map.removeSource(ROUTE_SOURCE_ID);\n }\n\n const points = this.route();\n if (!points || points.length < 2) {\n return;\n }\n\n this.map.addSource(ROUTE_SOURCE_ID, {\n type: 'geojson',\n data: {\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'LineString',\n coordinates: points.map((point) => this.toLngLat(point)),\n },\n },\n });\n\n this.map.addLayer({\n id: ROUTE_LAYER_ID,\n type: 'line',\n source: ROUTE_SOURCE_ID,\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: {\n // El paint de Mapbox corre en WebGL, fuera del árbol CSS — no\n // puede resolver `var(--kf-color-primary)` directo, así que el\n // valor YA COMPUTADO se lee del DOM en tiempo de ejecución. Sigue\n // siendo el token quien decide el color: nunca se hardcodea un hex.\n 'line-color': this.resolveColorToken('--kf-color-primary'),\n 'line-width': 3,\n },\n });\n }\n\n private resolveColorToken(name: string): string {\n return getComputedStyle(this.document.documentElement).getPropertyValue(name).trim();\n }\n\n // ---------- Wiring de `kf-map-controls` — ver `MapControls.ts` ----------\n // Cada handler es la única pieza que sabe CÓMO se resuelve una acción\n // sobre el `Map` real; `MapControls` solo reporta QUÉ se pidió.\n\n protected handleZoomIn(): void {\n this.map?.zoomIn({ duration: this.cameraDuration(CAMERA_DURATION_MS.zoomStep) });\n }\n\n protected handleZoomOut(): void {\n this.map?.zoomOut({ duration: this.cameraDuration(CAMERA_DURATION_MS.zoomStep) });\n }\n\n /** Reencuadra a demanda, ignorando `fitToMarkers()` (tiene sentido pedirlo\n * justo cuando `fitToMarkers` está en `false`) y sin apagar `follow`: si\n * está activo, la próxima posición nueva vuelve a pegar la cámara al\n * marker `live` — este reencuadre es una corrección puntual, no un modo. */\n protected handleRecenter(): void {\n if (!this.map) {\n return;\n }\n const bounds = this.computeBounds();\n if (bounds) {\n this.frameBounds(bounds, CAMERA_DURATION_MS.recenter);\n return;\n }\n this.map.easeTo({\n center: this.toLngLat(this.center() ?? DEFAULT_CENTER),\n zoom: this.zoom() ?? DEFAULT_ZOOM,\n duration: this.cameraDuration(CAMERA_DURATION_MS.recenter),\n });\n }\n\n protected handleFollowToggle(): void {\n this.followActive.update((value) => !value);\n this.syncCamera();\n }\n\n protected handleClusterToggle(): void {\n this.clusterActive.update((value) => !value);\n this.syncMarkers();\n }\n\n /** Reemplaza al viejo ciclado de un click (`handleStyleCycle`): la\n * elección real llega desde `MapThemePicker`, vía `MapControls`. */\n protected handleThemeSelect(theme: MapTheme): void {\n this.userTheme.set(theme);\n }\n\n protected handleFullscreenToggle(): void {\n const host = this.hostElementRef.nativeElement;\n if (typeof host.requestFullscreen !== 'function') {\n return;\n }\n if (this.document.fullscreenElement === host) {\n void this.document.exitFullscreen();\n } else {\n void host.requestFullscreen();\n }\n }\n}\n","<div\n #mapContainer\n class=\"kf-map__container\"\n [attr.role]=\"containerRole()\"\n [attr.aria-label]=\"label()\"\n [attr.tabindex]=\"isPreview() ? -1 : null\"\n></div>\n\n@if (status() === 'loading') {\n <div class=\"kf-map__overlay\" aria-live=\"polite\">\n <kf-spinner label=\"Cargando mapa…\" />\n </div>\n} @else if (status() === 'error') {\n <div class=\"kf-map__overlay kf-map__overlay--error\" role=\"alert\">\n <kf-icon name=\"alert-triangle\" size=\"lg\" />\n <kf-text as=\"p\" variant=\"body\" tone=\"error\">No pudimos cargar el mapa</kf-text>\n </div>\n}\n\n@if (showControls()) {\n <kf-map-controls\n class=\"kf-map__controls\"\n [controls]=\"effectiveControls()\"\n [clusterActive]=\"clusterActive()\"\n [followActive]=\"followActive()\"\n [canFollow]=\"hasLiveMarker()\"\n [isFullscreen]=\"isFullscreen()\"\n [styleLabel]=\"styleLabel()\"\n [activeTheme]=\"activeTheme()\"\n (zoomIn)=\"handleZoomIn()\"\n (zoomOut)=\"handleZoomOut()\"\n (recenter)=\"handleRecenter()\"\n (followToggle)=\"handleFollowToggle()\"\n (clusterToggle)=\"handleClusterToggle()\"\n (themeSelect)=\"handleThemeSelect($event)\"\n (fullscreenToggle)=\"handleFullscreenToggle()\"\n />\n}\n","import { 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@Component({\n selector: 'kf-metric-card',\n imports: [Card, Icon, Text],\n templateUrl: './MetricCard.html',\n styleUrl: './MetricCard.css',\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}\n","<kf-card>\n <div class=\"kf-metric-card__head\">\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 </div>\n <div class=\"kf-metric-card__value-row\">\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 </div>\n @if (foot()) {\n <div class=\"kf-metric-card__foot\">{{ foot() }}</div>\n }\n <div class=\"kf-metric-card__actions\"><ng-content select=\"[actions]\" /></div>\n</kf-card>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/**\n * Franja fija en la base de una pantalla completa para apps mobile del\n * ecosistema: encapsula el padding con `safe-area-inset-bottom` (para no\n * invadir la zona del home indicator), el borde superior y el fondo —\n * cualquier acción, chip de estado o hint que necesite vivir pegado al\n * borde inferior del dispositivo se proyecta acá vía `<ng-content>`.\n *\n * <kf-mobile-footer>\n * <kf-button>Cerrar orden</kf-button>\n * </kf-mobile-footer>\n */\n@Component({\n selector: 'kf-mobile-footer',\n templateUrl: './MobileFooter.html',\n styleUrl: './MobileFooter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MobileFooter {}\n","<footer class=\"kf-mobile-footer\">\n <ng-content />\n</footer>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { Icon } from '../icon/Icon';\n\n/**\n * Encabezado de pantalla completa (fondo navy) para apps mobile del\n * ecosistema — cubre tanto la raíz de un tab (sin volver) como el detalle\n * de un flujo (con volver).\n *\n * <kf-mobile-header title=\"Mis asignaciones\" />\n *\n * <kf-mobile-header title=\"STAR-20841\" subtitle=\"Cerrado hoy · 15:18\" [showBack]=\"true\" (back)=\"onBack()\" />\n *\n * Sin `kf-text` para `eyebrow`/`title`/`subtitle`: su `tone` es un set\n * cerrado sin blanco/inverso, y sus variantes fijan `color` explícito sobre\n * el elemento interno — un `color: white` heredado desde afuera nunca le\n * gana a esa declaración directa. Markup propio con los tokens reales.\n *\n * El botón \"volver\" tampoco es `kf-button`: su `variant=\"ghost\"` fija el\n * mismo token de color que este fondo navy (el ícono quedaría invisible).\n */\n@Component({\n selector: 'kf-mobile-header',\n imports: [Icon],\n templateUrl: './MobileHeader.html',\n styleUrl: './MobileHeader.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MobileHeader {\n readonly title = input.required<string>();\n\n /** Línea chica y translúcida ARRIBA del título — ej. un folio o un saludo. */\n readonly eyebrow = input<string>();\n\n /** `true` cuando `eyebrow` es un código (folio) — usa tipografía monoespaciada. */\n readonly eyebrowMono = input(false);\n\n /** Línea chica y translúcida DEBAJO del título — ej. \"Cerrado hoy · 15:18\". */\n readonly subtitle = input<string>();\n\n readonly showBack = input(false);\n\n /** El componente no navega por sí solo: cada pantalla decide qué significa\n * \"volver\" (`Location.back()`, retroceder un paso del flujo, etc.). */\n readonly back = output<void>();\n\n protected onBackClick(): void {\n this.back.emit();\n }\n}\n","<header class=\"kf-mobile-header\">\n <div class=\"kf-mobile-header__leading\">\n @if (showBack()) {\n <button\n type=\"button\"\n class=\"kf-mobile-header__back\"\n aria-label=\"Volver\"\n (click)=\"onBackClick()\"\n >\n <kf-icon name=\"chevron-left\" size=\"md\" />\n </button>\n }\n <div class=\"kf-mobile-header__text\">\n <div class=\"kf-mobile-header__meta-row\">\n @if (eyebrow()) {\n <span\n class=\"kf-mobile-header__eyebrow\"\n [class.kf-mobile-header__eyebrow--mono]=\"eyebrowMono()\"\n >{{ eyebrow() }}</span\n >\n }\n <div class=\"kf-mobile-header__trailing\">\n <ng-content select=\"[kf-mobile-header-trailing]\" />\n </div>\n </div>\n <h1 class=\"kf-mobile-header__title\">{{ title() }}</h1>\n @if (subtitle()) {\n <span class=\"kf-mobile-header__subtitle\">{{ subtitle() }}</span>\n }\n </div>\n </div>\n</header>\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 * `<dialog>` abiertos vía `showModal()` actualmente activos, en orden de\n * apertura. Con diálogos anidados el navegador apila el top layer: el más\n * reciente queda arriba e inertiza a los anteriores (incluidos otros\n * `<dialog>` ya abiertos), así que el ÚLTIMO de esta lista es el único\n * candidato válido para recibir el overlay container — nunca \"cualquier\n * `dialog[open]` de la página\", que rompería con dos `kf-modal` anidados o\n * con dos independientes donde solo uno está abierto.\n */\nconst openModalDialogs: HTMLDialogElement[] = [];\n\n/** Llamado por `Modal` cuando su `<dialog>` pasa a estar abierto. */\nexport function registerOpenModalDialog(dialog: HTMLDialogElement): void {\n if (!openModalDialogs.includes(dialog)) {\n openModalDialogs.push(dialog);\n }\n}\n\n/** Llamado por `Modal` cuando su `<dialog>` se cierra o el componente se destruye. */\nexport function unregisterOpenModalDialog(dialog: HTMLDialogElement): void {\n const index = openModalDialogs.indexOf(dialog);\n if (index !== -1) {\n openModalDialogs.splice(index, 1);\n }\n}\n\nfunction topmostOpenModalDialog(): HTMLDialogElement | 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 */\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\n container.getContainerElement = (): HTMLElement => {\n const element = originalGetContainerElement();\n const targetParent = topmostOpenModalDialog() ?? element.ownerDocument.body;\n if (element.parentElement !== targetParent) {\n targetParent.appendChild(element);\n }\n return element;\n };\n}\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/**\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@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\n protected readonly titleId = `kf-modal-title-${modalId++}`;\n\n private readonly dialog = viewChild<ElementRef<HTMLDialogElement>>('dialog');\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 } 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 /** `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 [attr.aria-labelledby]=\"title() ? titleId : null\"\n (cancel)=\"onCancel($event)\"\n (close)=\"open.set(false)\"\n>\n @if (open()) {\n <div class=\"kf-modal__panel\">\n <div class=\"kf-modal__head\">\n @if (title()) {\n <h2 class=\"kf-modal__title\" [id]=\"titleId\">{{ title() }}</h2>\n }\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__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 } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { matchMediaSignal } from '../shared/media-query';\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 } 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 * 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","<kf-card>\n <div class=\"kf-panel__head\">\n <span class=\"kf-panel__title\">{{ title() }}</span>\n @if (actionLabel()) {\n <kf-link class=\"kf-panel__action\" [href]=\"actionHref() || '#'\" showArrow>\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 {\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, 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), `ok`/`warn`/`error` sí\n * comunican severidad. 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' | 'ok' | 'warn' | 'error';\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. `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 readonly label = 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\"\n role=\"progressbar\"\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 { 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 { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n afterNextRender,\n computed,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { DataTable, DataTableColumn } from '../data-table/DataTable';\nimport { EmptyState } from '../empty-state/EmptyState';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Modal } from '../modal/Modal';\nimport { Pagination } from '../pagination/Pagination';\nimport { matchMediaSignal } from '../shared/media-query';\nimport { normalizeForSearch } from '../shared/search-text';\n\n/** Reexportado tal cual — el picker no inventa un concepto de columna propio,\n * usa el mismo `DataTableColumn` que ya consume `kf-data-table`. */\nexport type { DataTableColumn };\n\n/** Chip de filtro genérico con contador — nunca hardcodeado a un dominio\n * concreto (ej. estado de una cotización); el consumidor decide qué\n * representa cada `value` y cómo mapea sus items contra él vía `predicate`.\n *\n * Bug real corregido: la primera versión leía `item.status`/`item.chip` por\n * nombre de campo mágico en vez de un `predicate` — colisionaba con\n * dominios donde `status` ya significa otra cosa (ej. `Quote.status` en\n * `web-otd-frontend` es 'ok'|'error'|'warn' de aprobación, no \"tiene saldo\n * pendiente\"). Un chip \"Con saldo pendiente\" sobre cotizaciones terminaba\n * filtrando por un campo que no tenía nada que ver, mostrando 0 resultados\n * siempre. `predicate` es explícito y no depende de convenciones de nombre. */\nexport interface QuotePickerChip<T = unknown> {\n value: string;\n label: string;\n count: number;\n predicate: (item: T) => boolean;\n}\n\n/** Una opción del dropdown \"Ordenar por\", visible solo en `variant=\"modal\"`. */\nexport interface QuotePickerSortOption {\n value: string;\n label: string;\n}\n\n/** Filas visibles en el preview acotado (modo `inline`, volumen alto) antes del fade + CTA. */\nconst PREVIEW_ROWS = 5;\n/** Filas por página en la tabla del modo `modal`. */\nconst PAGE_SIZE = 10;\n\n/**\n * Selector de un ítem \"rico\" de una lista buscable/filtrable — generalización\n * del patrón \"elegir una cotización\" de Pagos y Facturas de OTD, pero sin\n * ningún acoplamiento a `Quote`: todo el contenido de cada fila/card llega\n * por `columns` (mismo `DataTableColumn` de `kf-data-table`, reexportado acá\n * en vez de duplicar el concepto) + `cellTemplates` para contenido custom\n * (thumbnail, monto formateado, etc. — mismo mecanismo `TemplateRef` +\n * `ngTemplateOutlet` que ya usa `kf-data-table`).\n *\n * Un solo componente, dos contenedores (`variant: 'inline' | 'modal'`), UNA\n * sola lógica de búsqueda/filtro/orden interna. Nunca dos implementaciones\n * paralelas: el riesgo real de eso es que un fix de filtro se aplique en un\n * modo y se olvide en el otro. Los `computed()` de más abajo\n * (`filteredItems`, `sortedItems`) son la ÚNICA fuente de verdad para ambos\n * `variant`; lo que cambia entre inline y modal es solo qué contenedor\n * envuelve esos datos ya resueltos.\n *\n * ## Modo `inline` (default)\n * Trigger a ANCHO COMPLETO (nunca una caja angosta de ancho fijo) que\n * muestra el ítem activo colapsado — thumbnail, id + modelo, unidades +\n * fecha + monto, CTA \"Cambiar cotización\" con chevron-down. Al click, el\n * panel se expande INLINE (empuja el contenido de abajo, nunca flota\n * encima) con buscador propio + chips de filtro + un grid de 2 columnas (1\n * en mobile, breakpoint `max-width: 900px` vía `matchMediaSignal` — mismo\n * mecanismo que ya usa el resto de la librería para decisiones de layout en\n * TypeScript, no solo CSS). Por encima de `expandThreshold` resultados\n * visibles, el panel recorta a un preview de `PREVIEW_ROWS` filas con un\n * fade inferior y un botón dashed \"Ver las N en pantalla completa\" que\n * emite `expandToModal` — el picker no decide qué pasa después (típicamente\n * el consumidor pone `variant` en `'modal'` y `open` en `true`).\n *\n * ## Modo `modal`\n * Mismo buscador, mismos chips, misma lógica de filtrado — compone\n * `kf-modal` (proyectando el contenido) en vez de reimplementar un\n * `<dialog>` a mano: la API de `Modal` (`[(open)]`, cierre con\n * Escape/backdrop/botón vía `<dialog>` nativo) ya cubre exactamente lo que\n * este modo necesita. Compone también `kf-data-table` para la tabla\n * completa (columnas configurables, fade de overflow horizontal ya\n * resuelto ahí) y `kf-pagination` para paginar — ninguno de los tres se\n * reimplementa. Agrega un dropdown propio de \"Ordenar por\" (calibrado\n * visualmente contra el trigger de `kf-select`, pero compacto: `kf-select`\n * fuerza un ancho fijo de 240px pensado para formularios, no para una\n * barra de herramientas de tabla — ver JSDoc de `sortOpen` más abajo).\n *\n * En mobile, `kf-data-table[cardable]` con `defaultView` forzado a\n * `'cards'` decide la vista (mismo criterio que `matchMediaSignal` ya\n * resolvió en otros consumidores): dentro de un modal a pantalla completa\n * no tiene sentido ofrecer un toggle tabla/cards que en mobile daría una\n * tabla angosta con scroll horizontal.\n *\n * DEUDA TÉCNICA CONOCIDA (confirmada con el usuario, ver CHANGELOG.md): el\n * diseño validado con mockups pedía que en mobile el modal ocupe el 100%\n * de la pantalla (botón \"atrás\", sin overlay centrado) — `kf-modal` no\n * tiene ese modo, así que hoy en mobile se ve como un diálogo centrado\n * angosto (`width: min(480px, ...)`). Es funcional (cards legibles,\n * búsqueda, chips, paginación), solo visualmente distinto del mockup.\n *\n * <kf-quote-picker\n * [items]=\"quotes()\"\n * [columns]=\"columns\"\n * [selectedId]=\"selectedQuoteId()\"\n * [idKey]=\"(q) => q.id\"\n * [chips]=\"statusChips()\"\n * [cellTemplates]=\"{ photo: photoCell(), amount: amountCell() }\"\n * (selectedIdChange)=\"selectedQuoteId.set($event)\"\n * (expandToModal)=\"variant.set('modal'); open.set(true)\"\n * />\n */\n@Component({\n selector: 'kf-quote-picker',\n imports: [NgTemplateOutlet, Icon, Modal, DataTable, EmptyState, Pagination],\n templateUrl: './QuotePicker.html',\n styleUrl: './QuotePicker.css',\n})\nexport class QuotePicker<T = unknown> {\n readonly items = input.required<T[]>();\n readonly columns = input.required<DataTableColumn[]>();\n readonly selectedId = input<string | null>(null);\n readonly idKey = input.required<(item: T) => string>();\n\n /**\n * Mapa `columnKey -> TemplateRef`, mismo mecanismo que `kf-data-table`\n * (`ngTemplateOutlet` + contexto `{ $implicit: item, index }`) — se\n * reenvía tal cual a la tabla interna del modo `modal`, y se usa\n * directamente en el grid de cards del modo `inline`. Un solo mapa para\n * ambos modos, consistente con la regla de \"una sola lógica interna\".\n */\n readonly cellTemplates = input<\n Record<string, TemplateRef<{ $implicit: T; index: number }>> | undefined\n >();\n\n readonly chips = input<QuotePickerChip<T>[]>([]);\n readonly sortOptions = input<QuotePickerSortOption[]>([]);\n readonly sort = model<string | null>(null);\n\n /**\n * Umbral de volumen alto — el consumidor decide el número exacto, nunca\n * hardcodeado a \"cotizaciones\" ni a ningún caso de uso puntual. Default\n * 15 según el diseño validado con mockups.\n */\n readonly expandThreshold = input(15);\n\n readonly variant = input<'inline' | 'modal'>('inline');\n /** Visibilidad del modo `modal`, two-way — mismo patrón que `[(open)]` de `kf-modal`. */\n readonly open = model(false);\n\n readonly title = input('Cambiar cotización');\n readonly searchPlaceholder = input('Buscar…');\n /** Ícono de placeholder cuando ninguna columna `cardRole: 'media'` resuelve\n * un thumbnail real vía `cellTemplates` — el picker no asume qué dominio\n * consume (cotización, vehículo, cliente...), así que no hardcodea un\n * ícono fijo. Default `'file'` solo por no dejar el input sin valor. */\n readonly placeholderIcon = input<IconName>('file');\n\n readonly selectedIdChange = output<string>();\n /** Disparado al superar `expandThreshold` en modo inline; el consumidor decide pasar a `modal`. */\n readonly expandToModal = output<void>();\n\n protected readonly searchQuery = signal('');\n protected readonly activeChip = signal<string | null>(null);\n protected readonly expanded = signal(false);\n protected readonly page = signal(1);\n protected readonly sortOpen = signal(false);\n\n /**\n * Mismo breakpoint (`max-width: 900px`) que el resto de la librería usa\n * para decisiones de layout en TypeScript (no solo CSS) — ver\n * `matchMediaSignal`. Decide 1 vs. 2 columnas en el grid inline, y tabla\n * vs. cards apiladas dentro del modal.\n */\n protected readonly isMobile = matchMediaSignal('(max-width: 900px)');\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly previewScrollEl = viewChild<ElementRef<HTMLElement>>('previewScroll');\n\n /** Mismo mecanismo de fade que `kf-data-table` — ver comentario en QuotePicker.css. */\n protected readonly canFadeBottom = signal(false);\n\n readonly selectedItem = computed(() =>\n this.items().find((item) => this.idKey()(item) === this.selectedId()),\n );\n\n /** Filtro por texto (buscador propio) + filtro por chip activo, en ese orden. */\n protected readonly filteredItems = computed<T[]>(() => {\n const query = normalizeForSearch(this.searchQuery().trim());\n const chipValue = this.activeChip();\n const chip = chipValue ? this.chips().find((c) => c.value === chipValue) : undefined;\n const idKeyFn = this.idKey();\n const cols = this.columns();\n\n return this.items().filter((item) => {\n if (chip && !chip.predicate(item)) {\n return false;\n }\n if (!query) {\n return true;\n }\n const haystack = cols\n .map((column) => this.cellText(item, column))\n .concat(idKeyFn(item))\n .join(' ');\n return normalizeForSearch(haystack).includes(query);\n });\n });\n\n /**\n * Orden solo tiene efecto visible en modo `modal` (el diseño validado no\n * pide dropdown de orden en inline) — se calcula igual en ambos casos\n * porque es la MISMA lógica interna; en inline `sort()` simplemente se\n * queda en `null` salvo que el consumidor lo setee explícitamente.\n */\n protected readonly sortedItems = computed<T[]>(() => {\n const sortValue = this.sort();\n const items = this.filteredItems();\n if (!sortValue) {\n return items;\n }\n const [key, direction] = sortValue.split(':') as [string, 'asc' | 'desc' | undefined];\n const sorted = [...items].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 return (va as string | number) > (vb as string | number) ? 1 : -1;\n });\n return direction === 'desc' ? sorted.reverse() : sorted;\n });\n\n /** Por encima del umbral, el preview inline se recorta salvo que el usuario ya haya expandido. */\n protected readonly isHighVolume = computed(\n () => this.sortedItems().length > this.expandThreshold(),\n );\n\n protected readonly previewItems = computed<T[]>(() => {\n const all = this.sortedItems();\n if (!this.isHighVolume() || this.expanded()) {\n return all;\n }\n return all.slice(0, PREVIEW_ROWS);\n });\n\n protected readonly pages = computed(() =>\n Math.max(Math.ceil(this.sortedItems().length / PAGE_SIZE), 1),\n );\n\n protected readonly pagedItems = computed<T[]>(() => {\n const start = (this.page() - 1) * PAGE_SIZE;\n return this.sortedItems().slice(start, start + PAGE_SIZE);\n });\n\n protected readonly sortLabel = computed(() => {\n const current = this.sortOptions().find((option) => option.value === this.sort());\n return current?.label ?? 'Ordenar por';\n });\n\n constructor() {\n afterNextRender(() => {\n const el = this.previewScrollEl()?.nativeElement;\n if (!el) {\n return;\n }\n const update = () => this.updateFadeState(el);\n update();\n el.addEventListener('scroll', update, { passive: true });\n const observer = new ResizeObserver(update);\n observer.observe(el);\n this.destroyRef.onDestroy(() => {\n el.removeEventListener('scroll', update);\n observer.disconnect();\n });\n });\n }\n\n private updateFadeState(el: HTMLElement): void {\n // 1px de margen por el mismo motivo que en DataTable: subpíxeles de\n // scroll dejarían el fade \"prendido\" en un preview que ya llegó al final.\n this.canFadeBottom.set(el.scrollHeight - el.clientHeight - el.scrollTop > 1);\n }\n\n private cellText(item: T, column: DataTableColumn): string {\n const value = (item as Record<string, unknown>)[column.key];\n return value === null || value === undefined ? '' : String(value);\n }\n\n toggleExpandedPanel(): void {\n this.expanded.set(!this.expanded());\n }\n\n onSearchInput(event: Event): void {\n this.searchQuery.set((event.target as HTMLInputElement).value);\n this.page.set(1);\n }\n\n selectChip(value: string): void {\n this.activeChip.set(this.activeChip() === value ? null : value);\n this.page.set(1);\n }\n\n select(item: T): void {\n const id = this.idKey()(item);\n // El panel se cierra siempre al elegir (haya cambiado el id o no) —\n // mismo comportamiento esperado de cualquier selector, ej. `kf-select`\n // cierra su panel al elegir opción; dejarle esa responsabilidad al\n // consumidor sería una carga que ningún otro componente de la\n // librería le pide.\n this.expanded.set(false);\n if (id === this.selectedId()) {\n return;\n }\n this.selectedIdChange.emit(id);\n }\n\n onItemKeydown(event: KeyboardEvent, item: T): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.select(item);\n }\n }\n\n onSeeAll(): void {\n this.expandToModal.emit();\n }\n\n onTableRowClick(event: { row: T; index: number }): void {\n this.select(event.row);\n }\n\n toggleSort(): void {\n this.sortOpen.update((open) => !open);\n }\n\n setSort(value: string): void {\n this.sort.set(this.sort() === value ? null : value);\n this.sortOpen.set(false);\n }\n\n trackItem(item: T, index: number): string | number {\n const idKeyFn = this.idKey();\n return idKeyFn ? idKeyFn(item) : index;\n }\n\n /** Arrow function como campo (no un método) para que `[rowKey]` reciba\n * una referencia ESTABLE entre change detections — `trackItem.bind(this)`\n * en el template recrearía una función nueva en cada ciclo, invalidando\n * cualquier optimización de `kf-data-table` que dependa de identidad. */\n protected readonly rowKeyFn = (item: T, index: number): string | number =>\n this.trackItem(item, index);\n\n protected cellValue(item: T, column: DataTableColumn): string {\n return this.cellText(item, column);\n }\n\n protected readonly mediaColumn = computed(() =>\n this.columns().find((c) => c.cardRole === 'media'),\n );\n protected readonly titleColumn = computed(() =>\n this.columns().find((c) => c.cardRole === 'title'),\n );\n protected readonly fieldColumns = computed(() =>\n this.columns().filter((c) => !c.cardRole || c.cardRole === 'field'),\n );\n}\n","@if (variant() === 'inline') {\n <div class=\"kf-quote-picker__inline\">\n <!-- Trigger colapsado (default): ancho completo, nunca una caja angosta. -->\n <button\n type=\"button\"\n class=\"kf-quote-picker__trigger\"\n [attr.aria-expanded]=\"expanded()\"\n (click)=\"toggleExpandedPanel()\"\n >\n <span class=\"kf-quote-picker__thumb\">\n @if (mediaColumn(); as media) {\n @if (cellTemplates()?.[media.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedItem(), index: 0 }\"\n />\n }\n } @else {\n <kf-icon [name]=\"placeholderIcon()\" size=\"md\" />\n }\n </span>\n @if (selectedItem(); as item) {\n <span class=\"kf-quote-picker__trigger-summary\">\n @if (titleColumn(); as title) {\n <span class=\"kf-quote-picker__trigger-field kf-quote-picker__trigger-field--title\">{{\n cellValue(item, title)\n }}</span>\n }\n <!--\n En mobile solo se muestra el título (ID) — mostrar los 5 campos\n en una sola línea de ~90px de ancho real corta el texto sin\n elipsis a mitad del segundo campo (bug real medido:\n scrollWidth=519 vs. clientWidth=87 en 390px). El resto de los\n campos siguen disponibles en el panel expandido y en el modal,\n donde sí hay espacio horizontal.\n -->\n @if (!isMobile()) {\n @for (col of fieldColumns(); track col.key) {\n <span class=\"kf-quote-picker__trigger-sep\" aria-hidden=\"true\">·</span>\n <span class=\"kf-quote-picker__trigger-field\">{{ cellValue(item, col) }}</span>\n }\n }\n </span>\n } @else {\n <span class=\"kf-quote-picker__trigger-summary kf-quote-picker__trigger-summary--empty\"\n >Sin selección</span\n >\n }\n <span class=\"kf-quote-picker__trigger-action\">\n {{ expanded() ? 'Cerrar' : title() }}\n <kf-icon\n name=\"chevron-down\"\n size=\"sm\"\n class=\"kf-quote-picker__chevron\"\n [class.kf-quote-picker__chevron--open]=\"expanded()\"\n />\n </span>\n </button>\n\n @if (expanded()) {\n <div class=\"kf-quote-picker__panel\">\n <div class=\"kf-quote-picker__toolbar\">\n <div class=\"kf-quote-picker__search\">\n <kf-icon name=\"search\" size=\"sm\" />\n <input\n type=\"text\"\n class=\"kf-quote-picker__search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n />\n </div>\n @for (chip of chips(); track chip.value) {\n <button\n type=\"button\"\n class=\"kf-quote-picker__chip\"\n [class.kf-quote-picker__chip--active]=\"activeChip() === chip.value\"\n (click)=\"selectChip(chip.value)\"\n >\n {{ chip.label }} ({{ chip.count }})\n </button>\n }\n </div>\n\n <div class=\"kf-quote-picker__results-wrap\">\n <div #previewScroll class=\"kf-quote-picker__results\" role=\"listbox\">\n @for (item of previewItems(); track trackItem(item, $index)) {\n <button\n type=\"button\"\n class=\"kf-quote-picker__result\"\n [class.kf-quote-picker__result--active]=\"idKey()(item) === selectedId()\"\n role=\"option\"\n [attr.aria-selected]=\"idKey()(item) === selectedId()\"\n (click)=\"select(item)\"\n (keydown)=\"onItemKeydown($event, item)\"\n >\n <span class=\"kf-quote-picker__thumb kf-quote-picker__thumb--sm\">\n @if (mediaColumn(); as media) {\n @if (cellTemplates()?.[media.key]; as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: $index }\"\n />\n }\n } @else {\n <kf-icon [name]=\"placeholderIcon()\" size=\"sm\" />\n }\n </span>\n @if (titleColumn(); as title) {\n <span\n class=\"kf-quote-picker__result-field kf-quote-picker__result-field--title\"\n >{{ cellValue(item, title) }}</span\n >\n }\n <!--\n Wrapper propio (no los spans sueltos) para los campos\n secundarios: en mobile necesita saltar de línea COMPLETO\n (mismo criterio que \"unidades\" no debe competir con\n \"modelo\" en la primera línea) — `flex-basis: 100%` en un\n solo elemento fuerza ese salto sin tener que asumir cuál\n de los N campos genéricos es el más corto o el más largo.\n -->\n <span class=\"kf-quote-picker__result-fields\">\n @for (col of fieldColumns(); track col.key; let first = $first) {\n <span\n class=\"kf-quote-picker__result-field\"\n [class.kf-quote-picker__result-field--primary]=\"first\"\n >{{ cellValue(item, col) }}</span\n >\n }\n </span>\n </button>\n } @empty {\n <p class=\"kf-quote-picker__empty\">Sin resultados para esta búsqueda.</p>\n }\n </div>\n @if (canFadeBottom()) {\n <div class=\"kf-quote-picker__fade\" aria-hidden=\"true\"></div>\n }\n </div>\n\n @if (isHighVolume()) {\n <button type=\"button\" class=\"kf-quote-picker__see-all\" (click)=\"onSeeAll()\">\n Ver las {{ sortedItems().length }} en pantalla completa\n </button>\n }\n </div>\n }\n </div>\n} @else {\n <kf-modal [(open)]=\"open\" [title]=\"title()\" [dismissible]=\"true\">\n <div class=\"kf-quote-picker__modal-toolbar\">\n <div class=\"kf-quote-picker__search\">\n <kf-icon name=\"search\" size=\"sm\" />\n <input\n type=\"text\"\n class=\"kf-quote-picker__search-input\"\n [placeholder]=\"searchPlaceholder()\"\n [value]=\"searchQuery()\"\n (input)=\"onSearchInput($event)\"\n />\n </div>\n <div class=\"kf-quote-picker__modal-filters\">\n <div class=\"kf-quote-picker__modal-chips\">\n @for (chip of chips(); track chip.value) {\n <button\n type=\"button\"\n class=\"kf-quote-picker__chip\"\n [class.kf-quote-picker__chip--active]=\"activeChip() === chip.value\"\n (click)=\"selectChip(chip.value)\"\n >\n {{ chip.label }} ({{ chip.count }})\n </button>\n }\n </div>\n @if (sortOptions().length > 0) {\n <div class=\"kf-quote-picker__sort\">\n <button\n type=\"button\"\n class=\"kf-quote-picker__sort-trigger\"\n [attr.aria-expanded]=\"sortOpen()\"\n (click)=\"toggleSort()\"\n >\n <kf-icon name=\"sort\" size=\"sm\" />\n {{ sortLabel() }}\n <kf-icon name=\"chevron-down\" size=\"sm\" />\n </button>\n @if (sortOpen()) {\n <div class=\"kf-quote-picker__sort-panel\">\n @for (option of sortOptions(); track option.value) {\n <button\n type=\"button\"\n class=\"kf-quote-picker__sort-option\"\n [class.kf-quote-picker__sort-option--active]=\"sort() === option.value\"\n (click)=\"setSort(option.value)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <kf-data-table\n [columns]=\"columns()\"\n [rows]=\"pagedItems()\"\n [cardable]=\"true\"\n [defaultView]=\"isMobile() ? 'cards' : 'table'\"\n [cellTemplates]=\"cellTemplates()\"\n [rowKey]=\"rowKeyFn\"\n (rowClick)=\"onTableRowClick($event)\"\n >\n <kf-empty-state empty icon=\"file\">Sin resultados para esta búsqueda.</kf-empty-state>\n @if (sortedItems().length > 0) {\n <kf-pagination footer [page]=\"page()\" [pages]=\"pages()\" (pageChange)=\"page.set($event)\">\n {{ sortedItems().length }} resultados\n </kf-pagination>\n }\n </kf-data-table>\n </kf-modal>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\nimport { Icon } from '../icon/Icon';\nimport { Link } from '../link/Link';\n\n/**\n * Estado vacío de reservas en taller con llamada a agendar (página 36):\n * barra de estado vacío arriba (\"No tienes reservas de taller\"), panel de\n * invitación al medio (ícono en círculo azul, título, descripción, link) y\n * una fila de dos acciones al pie — un slot `[actions]` proyectado, para no\n * acoplar el componente a botones fijos.\n *\n * Distinto de `kf-empty-state` genérico: este combina la barra + la\n * invitación + las acciones como un bloque compuesto propio del dominio\n * \"taller\", no un placeholder de una sola pieza.\n *\n * `grow` estira el panel de invitación para llenar el espacio vertical\n * disponible — solo cuando el consumidor comparte fila con una tarjeta más\n * alta (ej. junto a \"Total de vehículos\"); en un lugar sin esa presión\n * (home, debajo del carousel) se deja en su alto natural.\n *\n * <kf-reserve-block emptyLabel=\"No tienes reservas de taller\" grow\n * title=\"¿Necesitas mantención?\" description=\"Tenemos la mejor red de talleres.\"\n * actionLabel=\"Agenda tu reserva aquí\" actionHref=\"/taller/agendar\">\n * <kf-button actions icon=\"calendar\">Reservar hora</kf-button>\n * <kf-button actions variant=\"outline\" icon=\"list\">Ver agenda</kf-button>\n * </kf-reserve-block>\n */\n@Component({\n selector: 'kf-reserve-block',\n imports: [Icon, Link],\n templateUrl: './ReserveBlock.html',\n styleUrl: './ReserveBlock.css',\n})\nexport class ReserveBlock {\n readonly emptyLabel = input('No tienes reservas de taller');\n readonly title = input.required<string>();\n readonly description = input<string>();\n readonly actionLabel = input<string>();\n readonly actionHref = input<string>();\n /** La invitación se estira para llenar la tarjeta (ej. junto a \"Total de vehículos\"). */\n readonly grow = input(false, { transform: booleanAttribute });\n}\n","<div class=\"kf-reserve-block__empty\">\n <kf-icon name=\"calendar\" size=\"sm\" />\n <span>{{ emptyLabel() }}</span>\n</div>\n<div class=\"kf-reserve-block__invite\" [class.kf-reserve-block__invite--grow]=\"grow()\">\n <span class=\"kf-reserve-block__invite-icon\">\n <kf-icon name=\"tool\" size=\"md\" />\n </span>\n <div class=\"kf-reserve-block__invite-text\">\n <span class=\"kf-reserve-block__invite-title\">{{ title() }}</span>\n @if (description()) {\n <span class=\"kf-reserve-block__invite-description\">{{ description() }}</span>\n }\n @if (actionLabel()) {\n <kf-link class=\"kf-reserve-block__invite-action\" [href]=\"actionHref() || '#'\" showArrow>\n {{ actionLabel() }}\n </kf-link>\n }\n </div>\n</div>\n<div class=\"kf-reserve-block__actions\">\n <ng-content select=\"[actions]\" />\n</div>\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 '../shared/arrow-key-navigation';\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. */\nexport interface SidebarNavItemData {\n icon: IconName;\n label: string;\n href: string;\n active?: boolean;\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@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 [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 '../shared/media-query';\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 /** 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 (item of navItems(); track item.href) {\n <kf-sidebar-nav-item\n [icon]=\"item.icon\"\n [label]=\"item.label\"\n [href]=\"item.href\"\n [active]=\"!!item.active\"\n [collapsed]=\"itemsCollapsed()\"\n (click)=\"onNavItemClick($event, 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 { booleanAttribute, Component, computed, input } from '@angular/core';\nimport { Spinner } from '../spinner/Spinner';\n\nexport type SsoProvider = 'microsoft';\n\n/** Copy y glyph por proveedor — agregar una entrada acá es todo lo que hace\n * falta para soportar un proveedor nuevo (ej. `google`), sin tocar el\n * template ni los estilos del componente. */\ninterface SsoProviderConfig {\n readonly label: string;\n}\n\nconst PROVIDER_CONFIG: Record<SsoProvider, SsoProviderConfig> = {\n microsoft: { label: 'Continuar con Microsoft' },\n};\n\n/**\n * Botón de inicio de sesión vía SSO corporativo — pensado como pieza suelta,\n * no acoplada a `kf-auth-layout`: cualquier consumidor puede usarlo solo,\n * dentro o fuera del slot `[sso]` de `AuthLayout`.\n *\n * `provider` resuelve copy y glyph — hoy solo `'microsoft'` (el método\n * principal de acceso del ecosistema, cuenta corporativa de Grupo Kaufmann),\n * con la puerta abierta a sumar otros a futuro sin romper la API existente.\n *\n * El glyph es el ícono GENÉRICO de 4 cuadrados de colores que Microsoft\n * publica en sus propias guías de marca para botones de terceros (\"Sign in\n * with Microsoft\") — nunca el logotipo/wordmark oficial completo. No vive en\n * el sprite de `kf-icon` (`icon-sprite.ts`) a propósito: ese catálogo es\n * monocromático (`currentColor`, ver `Icon.ts`), pensado para trazos de un\n * solo color — este glyph necesita sus 4 colores fijos tal como los define\n * la guía de marca, así que un SVG inline propio es la opción correcta, no\n * un glyph nuevo forzado al sprite compartido.\n *\n * El label por defecto viene de `provider` — pasar contenido propio via\n * `<ng-content>` lo reemplaza (ej. un texto más corto en un lugar angosto).\n *\n * <kf-sso-button provider=\"microsoft\" (ssoClick)=\"loginWithMicrosoft()\" />\n * <kf-sso-button provider=\"microsoft\" [loading]=\"loggingIn()\">\n * Ingresar con cuenta corporativa\n * </kf-sso-button>\n */\n@Component({\n selector: 'kf-sso-button',\n imports: [Spinner],\n templateUrl: './SsoButton.html',\n styleUrl: './SsoButton.css',\n})\nexport class SsoButton {\n readonly provider = input<SsoProvider>('microsoft');\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Reemplaza el glyph + label por `kf-spinner` y fuerza `disabled` — mismo\n * patrón que `kf-button[loading]`. */\n readonly loading = input(false, { transform: booleanAttribute });\n /** Igual que `kf-button`: por defecto `submit` dentro de un `<form>`, pero\n * este botón normalmente vive fuera de cualquier form (dispara un\n * redirect a Microsoft Entra ID), así que casi siempre conviene `button`. */\n readonly type = input<'button' | 'submit'>('button');\n\n protected readonly config = computed(() => PROVIDER_CONFIG[this.provider()]);\n}\n","<button\n class=\"kf-sso-button\"\n [type]=\"type()\"\n [disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"config().label\"\n>\n @if (loading()) {\n <kf-spinner size=\"sm\" />\n } @else {\n <!--\n Ícono genérico \"Sign in with Microsoft\" de 4 cuadrados de colores\n (rojo, verde, azul, amarillo) — no el logotipo/wordmark oficial.\n Ver justificación completa en el JSDoc de SsoButton.ts.\n -->\n <svg\n class=\"kf-sso-button__glyph\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect x=\"0\" y=\"0\" width=\"8.5\" height=\"8.5\" fill=\"#f25022\" />\n <rect x=\"9.5\" y=\"0\" width=\"8.5\" height=\"8.5\" fill=\"#7fba00\" />\n <rect x=\"0\" y=\"9.5\" width=\"8.5\" height=\"8.5\" fill=\"#00a4ef\" />\n <rect x=\"9.5\" y=\"9.5\" width=\"8.5\" height=\"8.5\" fill=\"#ffb900\" />\n </svg>\n }\n <span class=\"kf-sso-button__label\">\n <ng-content>{{ config().label }}</ng-content>\n </span>\n</button>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, booleanAttribute, input, output } from '@angular/core';\nimport { Icon, type IconName } from '../icon/Icon';\n\nexport type StatCardTone = 'primary' | 'success' | 'error' | 'purple';\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@Component({\n selector: 'kf-stat-card',\n imports: [Icon, NgTemplateOutlet],\n templateUrl: './StatCard.html',\n styleUrl: './StatCard.css',\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\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","@if (clickable()) {\n <button type=\"button\" class=\"kf-stat-card kf-stat-card--clickable\" (click)=\"cardClick.emit()\">\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\">\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 </span>\n</ng-template>\n","import { Component, booleanAttribute, computed, input } 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 /** 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 class=\"kf-stat-tile__cta-action\" [href]=\"actionHref() || '#'\" showArrow>\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 '../shared/arrow-key-navigation';\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 '../../shared/arrow-key-navigation';\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 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 /** Milliseconds before auto-dismiss. Ignored when `tone` is `'loading'`. Defaults to `2800`. */\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;\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 * 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 = options.duration ?? DEFAULT_DURATION_MS;\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 type=\"button\" class=\"kf-toast__dismiss\" aria-label=\"Cerrar\" (click)=\"dismiss(t.id)\">\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","import { Component, input } from '@angular/core';\nimport { Icon, IconName } from '../icon/Icon';\nimport { Text } from '../text/Text';\n\n/**\n * Estado puntual mostrado junto a la identidad del vehículo (ej. \"En ruta\",\n * \"Mantenimiento\", \"Fuera de servicio\"). `tone` define el color semántico:\n * \"crit\" no tiene token propio en base.css, se mapea a var(--kf-color-error).\n */\nexport interface VehicleHeaderStatus {\n label: string;\n tone?: 'ok' | 'warn' | 'crit';\n icon?: IconName;\n}\n\n/**\n * Header de identidad de un vehículo de flota: unidad (patente/id), modelo\n * (como badge, no texto plano — página 24: \"ABC-123\" junto a un badge\n * \"TITAN 4X2\"), VIN en fuente mono y un estado opcional. Un área de acciones\n * opcional se proyecta vía `<ng-content select=\"[actions]\">` para no acoplar\n * el componente a un set fijo de botones — el patrón real de la spec es\n * `kf-button variant=\"outline\"` (ej. \"Llamar\", con ícono) + un `primary`\n * (ej. \"Crear Ticket\", con ícono \"+\"):\n *\n * <kf-vehicle-header unit=\"AB123CD\" model=\"Sprinter 415\" vin=\"9BW...\"\n * [status]=\"{ label: 'En ruta', tone: 'ok' }\">\n * <kf-button actions variant=\"outline\" icon=\"phone\">Llamar</kf-button>\n * <kf-button actions icon=\"plus\">Crear Ticket</kf-button>\n * </kf-vehicle-header>\n */\n@Component({\n selector: 'kf-vehicle-header',\n imports: [Icon, Text],\n templateUrl: './VehicleHeader.html',\n styleUrl: './VehicleHeader.css',\n})\nexport class VehicleHeader {\n readonly unit = input.required<string>();\n readonly model = input<string>();\n readonly vin = input<string>();\n readonly status = input<VehicleHeaderStatus>();\n}\n","<div class=\"kf-vehicle-header__identity\">\n <span class=\"kf-vehicle-header__unit\">{{ unit() }}</span>\n @if (model()) {\n <span class=\"kf-vehicle-header__model\">\n <kf-text as=\"span\" variant=\"overline-strong\">{{ model() }}</kf-text>\n </span>\n }\n @if (vin()) {\n <span class=\"kf-vehicle-header__vin\">VIN: {{ vin() }}</span>\n }\n</div>\n\n@if (status(); as currentStatus) {\n <span\n class=\"kf-vehicle-header__status\"\n [class]=\"'kf-vehicle-header__status--' + (currentStatus.tone ?? 'ok')\"\n >\n @if (currentStatus.icon; as iconName) {\n <kf-icon [name]=\"iconName\" size=\"sm\" />\n }\n {{ currentStatus.label }}\n </span>\n}\n\n<div class=\"kf-vehicle-header__actions\">\n <ng-content select=\"[actions]\" />\n</div>\n","/*\n * Public API Surface of ui\n */\n\nexport * from './lib/action-tile/ActionTile';\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/auth-layout/AuthLayout';\nexport * from './lib/auth-layout/AuthLayoutSso';\nexport * from './lib/avatar/Avatar';\nexport * from './lib/badge/Badge';\nexport * from './lib/breadcrumb/Breadcrumb';\nexport * from './lib/bucket-progress/BucketProgress';\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/company-selector/CompanySelector';\nexport * from './lib/content-slot/ContentSlot';\nexport * from './lib/content-state/ContentState';\nexport * from './lib/content-viewer/ContentViewer';\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/drawer-logout/DrawerLogout';\nexport * from './lib/drawer-session/DrawerSession';\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/filter/Filter';\nexport * from './lib/filter-chips/FilterChips';\nexport * from './lib/footer/Footer';\n// Segundo helper de shared/ hecho público (después de matchMediaSignal) —\n// formateo de número/moneda con locale/signo/decimales explícitos, usado\n// por cualquier portal que muestre montos de dinero o medidas numéricas\n// con separador de miles.\nexport * from './lib/shared/format';\nexport * from './lib/icon/Icon';\nexport * from './lib/input/Input';\nexport * from './lib/journey-stepper/JourneyStepper';\nexport * from './lib/link/Link';\nexport * from './lib/map/map-config';\nexport * from './lib/map/map-theme';\n// `MapControls` se exporta por `MapControlKind` (tipo público real que\n// `MapView.controls` necesita) — `MapThemePicker` NO se exporta acá a\n// propósito: es una pieza interna del panel de `mapStyle`, sin ningún\n// consumidor externo real que la use suelta fuera de `kf-map-controls`.\nexport * from './lib/map/MapControls';\nexport * from './lib/map/MapView';\n// Primer helper de shared/ que se hace público: resuelve \"necesito SABER en\n// TS en qué lado de un breakpoint está el viewport\", no solo mostrar/ocultar\n// con CSS — mismo problema que ya resolvió SidebarShell, ahora reutilizable\n// por cualquier portal consumidor (ver kf-data-table + defaultView en\n// web-otd-frontend, Fase 6 del plan de OTD).\nexport * from './lib/shared/media-query';\nexport * from './lib/metric-card/MetricCard';\nexport * from './lib/mobile-footer/MobileFooter';\nexport * from './lib/mobile-header/MobileHeader';\nexport * from './lib/modal/Modal';\nexport * from './lib/multi-select/MultiSelect';\nexport * from './lib/note-block/NoteBlock';\nexport * from './lib/page-header/PageHeader';\nexport * from './lib/pagination/Pagination';\nexport * from './lib/panel/Panel';\nexport * from './lib/portal-header/PortalHeader';\nexport * from './lib/progress/Progress';\nexport * from './lib/pulse-dot/PulseDot';\nexport * from './lib/quote-picker/QuotePicker';\nexport * from './lib/reserve-block/ReserveBlock';\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/spinner/Spinner';\nexport * from './lib/sso-button/SsoButton';\nexport * from './lib/stat-card/StatCard';\nexport * from './lib/stat-tile/StatTile';\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/toast/Toast';\nexport * from './lib/tooltip/Tooltip';\nexport * from './lib/vehicle-header/VehicleHeader';\nexport * from './lib/view-toggle/ViewToggle';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId","Input","MapboxMap","MapboxMarker"],"mappings":"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"}